static void save_program_settings(void) { const gchar *program_name = *program_executable ? program_executable : program_load_script; if (*program_name) { GtkTreeIter iter; gint id; GKeyFile *config = g_key_file_new(); char *configfile; if (program_find(&iter, program_name)) { scp_tree_store_get(recent_programs, &iter, PROGRAM_ID, &id, -1); scp_tree_store_move(recent_programs, &iter, 0); } else { if (scp_tree_store_iter_nth_child(recent_programs, &iter, NULL, RECENT_COUNT - 1)) { scp_tree_store_get(recent_programs, &iter, PROGRAM_ID, &id, -1); scp_tree_store_remove(recent_programs, &iter); } else { for (id = 1; id < RECENT_COUNT; id++) if ((recent_bitmap & (1 << id)) == 0) break; recent_bitmap |= 1 << id; } scp_tree_store_prepend_with_values(recent_programs, &iter, NULL, PROGRAM_NAME, program_name, PROGRAM_ID, id, -1); } configfile = recent_file_name(id); stash_foreach((GFunc) stash_group_save_to_key_file, config); breaks_save(config); watches_save(config); inspects_save(config); registers_save(config); parse_save(config); utils_key_file_write_to_file(config, configfile); g_free(configfile); g_key_file_free(config); } }
static void register_iter_update(GtkTreeIter *iter, GString *commands[]) { gint id, format; scp_tree_store_get(store, iter, REGISTER_ID, &id, REGISTER_FORMAT, &format, -1); g_string_append_printf(commands[format], " %d", id); }
static gint program_compare(ScpTreeStore *store, GtkTreeIter *iter, const char *name) { const char *name1; scp_tree_store_get(store, iter, PROGRAM_NAME, &name1, -1); return !utils_filenamecmp(name1, name); }
static void on_break_enabled_toggled(G_GNUC_UNUSED GtkCellRendererToggle *renderer, gchar *path_str, G_GNUC_UNUSED gpointer gdata) { GtkTreeIter iter; DebugState state = debug_state(); const char *id; gint scid; gboolean enabled; scp_tree_store_get_iter_from_string(store, &iter, path_str); scp_tree_store_get(store, &iter, BREAK_ID, &id, BREAK_SCID, &scid, BREAK_ENABLED, &enabled, -1); enabled ^= TRUE; if (state == DS_INACTIVE || !id) { break_enable(&iter, enabled); } else if (state & DS_SENDABLE) { debug_send_format(N, "02%d%d-break-%sable %s", enabled, scid, enabled ? "en" : "dis", id); } else plugin_beep(); }
static void on_break_column_edited(G_GNUC_UNUSED GtkCellRendererText *renderer, gchar *path_str, gchar *new_text, gpointer gdata) { gint index = GPOINTER_TO_INT(gdata) - 1; const gchar *set_text = validate_column(new_text, index > 0); GtkTreeIter iter; const char *id; char type; scp_tree_store_get_iter_from_string(store, &iter, path_str); scp_tree_store_get(store, &iter, BREAK_ID, &id, BREAK_TYPE, &type, -1); if (id && (debug_state() & DS_SENDABLE)) { char *locale = utils_get_locale_from_display(new_text, HB_DEFAULT); debug_send_format(F, "022%s-break-%s %s %s", id, break_command(index, type), id, locale ? locale : index ? "" : "0"); g_free(locale); } else if (!id) scp_tree_store_set(store, &iter, index + BREAK_IGNORE, set_text, -1); else plugin_beep(); }
gboolean on_view_query_tooltip(GtkWidget *widget, gint x, gint y, gboolean keyboard_tip, GtkTooltip *tooltip, GtkTreeViewColumn *base_name_column) { GtkTreeView *tree = GTK_TREE_VIEW(widget); GtkTreeIter iter; if (gtk_tree_view_get_tooltip_context(tree, &x, &y, keyboard_tip, NULL, NULL, &iter)) { const char *file; gtk_tree_view_set_tooltip_cell(tree, tooltip, NULL, base_name_column, NULL); scp_tree_store_get((ScpTreeStore *) gtk_tree_view_get_model(tree), &iter, COLUMN_FILE, &file, -1); if (file) { gchar *utf8 = utils_get_utf8_from_locale(file); gtk_tooltip_set_text(tooltip, utf8); g_free(utf8); return TRUE; } } return FALSE; }
static void on_memory_bytes_edited(G_GNUC_UNUSED GtkCellRendererText *renderer, gchar *path_str, gchar *new_text, G_GNUC_UNUSED gpointer gdata) { if (*new_text && (debug_state() & DS_VARIABLE)) { GtkTreeIter iter; const char *addr, *bytes; guint i; scp_tree_store_get_iter_from_string(store, &iter, path_str); scp_tree_store_get(store, &iter, MEMORY_ADDR, &addr, MEMORY_BYTES, &bytes, -1); for (i = 0; bytes[i]; i++) if (!(isxdigit(bytes[i]) ? isxdigit(new_text[i]) : new_text[i] == ' ')) break; if (bytes[i] || new_text[i]) dc_error("memory: invalid format"); else { utils_strchrepl(new_text, ' ', '\0'); debug_send_format(T, "07-data-write-memory-bytes 0x%s%s", addr, new_text); } } else plugin_blink(); }
static gint break_id_compare(ScpTreeStore *store, GtkTreeIter *a, GtkTreeIter *b, G_GNUC_UNUSED gpointer gdata) { const char *s1, *s2; gint result; scp_tree_store_get(store, a, BREAK_ID, &s1, -1); scp_tree_store_get(store, b, BREAK_ID, &s2, -1); result = utils_atoi0(s1) - utils_atoi0(s2); if (result || !s1 || !s2) return result; while (isdigit(*s1)) s1++; while (isdigit(*s2)) s2++; return atoi(s1 + (*s1 == '.')) - atoi(s2 + (*s2 == '.')); }
void menu_inspect(GtkTreeSelection *selection) { ScpTreeStore *store; GtkTreeIter iter; const char *name; scp_tree_selection_get_selected(selection, &store, &iter); scp_tree_store_get(store, &iter, COLUMN_NAME, &name, -1); inspect_add(name); }
static void break_mark(GtkTreeIter *iter, gboolean mark) { const char *file; gint line; gboolean enabled; scp_tree_store_get(store, iter, BREAK_FILE, &file, BREAK_LINE, &line, BREAK_ENABLED, &enabled, -1); utils_mark(file, line, mark, MARKER_BREAKPT + enabled); }
static gboolean recent_program_save(GKeyFile *config, const char *section, GtkTreeIter *iter) { const gchar *name; gint id; scp_tree_store_get(recent_programs, iter, PROGRAM_NAME, &name, PROGRAM_ID, &id, -1); g_key_file_set_string(config, section, "name", name); g_key_file_set_integer(config, section, "id", id); return TRUE; }
static void on_recent_menu_item_activate(G_GNUC_UNUSED GtkMenuItem *menuitem, const gchar *name) { GtkTreeIter iter; if (utils_filenamecmp(name, *program_executable ? program_executable : program_load_script) && program_find(&iter, name)) { gint id; char *configfile; GKeyFile *config = g_key_file_new(); GError *gerror = NULL; gchar *message; scp_tree_store_get(recent_programs, &iter, PROGRAM_ID, &id, -1); configfile = recent_file_name(id); if (g_key_file_load_from_file(config, configfile, G_KEY_FILE_NONE, &gerror)) { scp_tree_store_move(recent_programs, &iter, 0); save_program_settings(); stash_foreach((GFunc) stash_group_load_from_key_file, config); if ((unsigned) option_inspect_expand > EXPAND_MAX) option_inspect_expand = 100; breaks_load(config); watches_load(config); inspects_load(config); registers_load(config); parse_load(config); message = g_strdup_printf(_("Loaded debug settings for %s."), name); program_find(&iter, name); scp_tree_store_move(recent_programs, &iter, 0); recent_menu_create(); program_configure(); } else { message = g_strdup_printf(_("Could not load debug settings file %s: %s."), configfile, gerror->message); g_error_free(gerror); } if (menuitem) ui_set_statusbar(TRUE, "%s", message); else msgwin_status_add("%s", message); g_free(message); g_key_file_free(config); g_free(configfile); } }
static void on_display_editing_started(G_GNUC_UNUSED GtkCellRenderer *cell, GtkCellEditable *editable, const gchar *path_str, ScpTreeStore *store) { GtkTreeIter iter; const char *value; gint hb_mode; g_assert(GTK_IS_EDITABLE(editable)); scp_tree_store_get_iter_from_string(store, &iter, path_str); scp_tree_store_get(store, &iter, COLUMN_VALUE, &value, COLUMN_HB_MODE, &hb_mode, -1); /* scrolling editable to the proper position is left as an exercise for the reader */ g_signal_connect(editable, "map-event", G_CALLBACK(on_display_editable_map_event), parse_get_display_from_7bit(value, hb_mode, MR_EDITVC)); }
void menu_modify(GtkTreeSelection *selection, const MenuItem *menu_item) { ScpTreeStore *store; GtkTreeIter iter; const gchar *name; const char *value; gint hb_mode; scp_tree_selection_get_selected(selection, &store, &iter); scp_tree_store_get(store, &iter, COLUMN_NAME, &name, COLUMN_VALUE, &value, COLUMN_HB_MODE, &hb_mode, -1); menu_evaluate_modify(name, value, _("Modify"), hb_mode, menu_item ? MR_MODIFY : MR_MODSTR, "07"); }
static void recent_menu_item_create(GtkTreeIter *iter, G_GNUC_UNUSED gpointer gdata) { if (recent_menu_count < pref_show_recent_items) { const gchar *name; GtkWidget *item; scp_tree_store_get(recent_programs, iter, PROGRAM_NAME, &name, -1); item = gtk_menu_item_new_with_label(name); gtk_menu_shell_append(GTK_MENU_SHELL(recent_menu), item); g_signal_connect(item, "activate", G_CALLBACK(on_recent_menu_item_activate), (gpointer) name); recent_menu_count++; } }
static void on_break_ignore_editing_started(G_GNUC_UNUSED GtkCellRenderer *cell, GtkCellEditable *editable, const gchar *path_str, G_GNUC_UNUSED gpointer gdata) { GtkTreeIter iter; const gchar *ignore; if (GTK_IS_EDITABLE(editable)) validator_attach(GTK_EDITABLE(editable), VALIDATOR_NUMERIC); if (GTK_IS_ENTRY(editable)) gtk_entry_set_max_length(GTK_ENTRY(editable), 10); scp_tree_store_get_iter_from_string(store, &iter, path_str); scp_tree_store_get(store, &iter, BREAK_IGNORE, &ignore, -1); g_signal_connect(editable, "map", G_CALLBACK(on_view_editable_map), g_strdup(ignore)); }
void view_seek_selected(GtkTreeSelection *selection, gboolean focus, SeekerType seeker) { ScpTreeStore *store; GtkTreeIter iter; if (scp_tree_selection_get_selected(selection, &store, &iter)) { const char *file; gint line; scp_tree_store_get(store, &iter, COLUMN_FILE, &file, COLUMN_LINE, &line, -1); if (file) utils_seek(file, line, focus, seeker); } }
static void on_command_history_changed(GtkComboBox *command_history, G_GNUC_UNUSED gpointer gdata) { GtkTreeIter iter; if (gtk_combo_box_get_active_iter(command_history, &iter)) { const gchar *text; gboolean locale; scp_tree_store_get(command_store, &iter, COMMAND_TEXT, &text, COMMAND_LOCALE, &locale, -1); gtk_text_buffer_set_text(command_text, text, -1); gtk_toggle_button_set_active(command_locale, locale); gtk_widget_grab_focus(command_view); gtk_combo_box_set_active_iter(command_history, NULL); } }
static void menu_mode_update_iter(ScpTreeStore *store, GtkTreeIter *iter, gint new_mode, gboolean hbit) { gint hb_mode, mr_mode; const char *value; gchar *display; scp_tree_store_get(store, iter, COLUMN_VALUE, &value, COLUMN_HB_MODE, &hb_mode, COLUMN_MR_MODE, &mr_mode, -1); if (hbit) hb_mode = new_mode; else mr_mode = new_mode; display = parse_get_display_from_7bit(value, hb_mode, mr_mode); scp_tree_store_set(store, iter, COLUMN_HB_MODE, hb_mode, COLUMN_MR_MODE, mr_mode, value ? COLUMN_DISPLAY : -1, display, -1); g_free(display); }
void menu_mode_update(GtkTreeSelection *selection, gint new_mode, gboolean hbit) { ScpTreeStore *store; GtkTreeIter iter; const char *name; scp_tree_selection_get_selected(selection, &store, &iter); scp_tree_store_get(store, &iter, COLUMN_NAME, &name, -1); menu_mode_update_iter(store, &iter, new_mode, hbit); parse_mode_update(name, hbit ? MODE_HBIT : MODE_MEMBER, new_mode); if (hbit) { char *reverse = parse_mode_reentry(name); if (store_find(store, &iter, COLUMN_NAME, reverse)) menu_mode_update_iter(store, &iter, new_mode, TRUE); g_free(reverse); } }
void menu_copy(GtkTreeSelection *selection, const MenuItem *menu_item) { ScpTreeStore *store; GtkTreeIter iter; const gchar *name, *display; const char *value; GString *string; scp_tree_selection_get_selected(selection, &store, &iter); scp_tree_store_get(store, &iter, COLUMN_NAME, &name, COLUMN_DISPLAY, &display, COLUMN_VALUE, &value, -1); string = g_string_new(name); if (value) g_string_append_printf(string, " = %s", display); gtk_clipboard_set_text(gtk_widget_get_clipboard(menu_item->widget, GDK_SELECTION_CLIPBOARD), string->str, string->len); g_string_free(string, TRUE); }
void view_display_edited(ScpTreeStore *store, gboolean condition, const gchar *path_str, const char *format, gchar *new_text) { if (validate_column(new_text, TRUE)) { if (condition) { GtkTreeIter iter; const char *name; gint hb_mode; char *locale; scp_tree_store_get_iter_from_string(store, &iter, path_str); scp_tree_store_get(store, &iter, COLUMN_NAME, &name, COLUMN_HB_MODE, &hb_mode, -1); locale = utils_get_locale_from_display(new_text, hb_mode); utils_strchrepl(locale, '\n', ' '); debug_send_format(F, format, name, locale); g_free(locale); } else plugin_blink(); } }