diff options
Diffstat (limited to 'src/gui/menus/edition.c')
-rw-r--r-- | src/gui/menus/edition.c | 289 |
1 files changed, 195 insertions, 94 deletions
diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index 08745b6..4a24d33 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -37,7 +37,11 @@ #include "../dialogs/gotox.h" #include "../../analysis/db/items/switcher.h" #include "../../arch/target.h" +#include "../../glibext/gbinarycursor.h" #include "../../gtkext/easygtk.h" +#include "../../gtkext/gtkblockdisplay.h" +#include "../../gtkext/gtkdisplaypanel.h" +#include "../../gtkext/gtkgraphdisplay.h" @@ -103,14 +107,20 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b menubar = qck_create_menu(GTK_MENU_ITEM(result)); - submenuitem = qck_create_menu_item(NULL, NULL, _("Go to address..."), + /* Déplacements ciblés */ + + submenuitem = qck_create_menu_item(ref, "mnu_edit_goto", _("Go to address..."), G_CALLBACK(mcb_edition_goto), bar); add_accelerator_to_menu_item(submenuitem, "<Ctrl>G", accgroup); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + /* Séparation */ + submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + /* Bascule des opérandes numériques */ + submenuitem = qck_create_menu_item(NULL, NULL, _("Numeric operand"), NULL, NULL); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -153,7 +163,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - /* Déplacements */ + /* Suivi de cibles */ submenuitem = qck_create_menu_item(ref, "mnu_edit_go_back", _("Go back"), G_CALLBACK(mcb_edition_go_back), bar); @@ -182,12 +192,12 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem)); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Toggle at current location"), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_toggle_bmark", _("Toggle at current location"), G_CALLBACK(mcb_edition_bookmarks_toggle), bar); add_accelerator_to_menu_item(deepmenuitem, "<Ctrl>D", accgroup); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Delete all bookmarks"), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_delete_bmarks", _("Delete all bookmarks"), G_CALLBACK(mcb_edition_bookmarks_delete_all), bar); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); @@ -198,22 +208,22 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem)); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment..."), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_comment", _("Enter a comment..."), G_CALLBACK(mcb_edition_comment_enter), bar); add_accelerator_to_menu_item(deepmenuitem, "semicolon", accgroup); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a repeatable comment..."), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_rep_comment", _("Enter a repeatable comment..."), G_CALLBACK(mcb_edition_comment_enter_repeatable), bar); add_accelerator_to_menu_item(deepmenuitem, "colon", accgroup); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment in the previous line..."), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_prev", _("Enter a comment in the previous line..."), G_CALLBACK(mcb_edition_comment_enter_previous), bar); add_accelerator_to_menu_item(deepmenuitem, "Insert", accgroup); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment in the next line..."), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_next", _("Enter a comment in the next line..."), G_CALLBACK(mcb_edition_comment_enter_next), bar); add_accelerator_to_menu_item(deepmenuitem, "<Shift>Insert", accgroup); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); @@ -225,9 +235,96 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b /****************************************************************************** * * -* Paramètres : ref = espace de référencements à consulter. * -* panel = panneau d'affichage actif ou NULL si aucun. * -* addr = nouvelle adresse du curseur courant. * +* Paramètres : new = nouvelle vue du contenu chargé analysé. * +* * +* Description : Lance une actualisation du fait d'un changement de support. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void update_access_for_view_in_menu_edition(GLoadedPanel *new) +{ + GObject *ref; /* Espace de référencements */ + gboolean access; /* Accès à déterminer */ + GtkWidget *item; /* Elément de menu à traiter */ + + ref = get_global_ref(); + + /* Déplacements ciblés */ + + access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_goto")); + gtk_widget_set_sensitive(item, access); + + /* Bascule des opérandes numériques */ + + access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_hex")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_dec")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_oct")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_bin")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_switch_def")); + gtk_widget_set_sensitive(item, access); + + /* Suivi de cibles */ + + access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_go_back")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_list_xrefs")); + gtk_widget_set_sensitive(item, access); + + /* Signets */ + + access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_toggle_bmark")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_delete_bmarks")); + gtk_widget_set_sensitive(item, access); + + /* Commentaires */ + + access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_comment")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_rep_comment")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_prev")); + gtk_widget_set_sensitive(item, access); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_next")); + gtk_widget_set_sensitive(item, access); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = vue d'affichage active ou NULL si aucune. * +* cursor = suivi des positions à consulter. * * * * Description : Met à jour les accès du menu "Edition" selon une position. * * * @@ -237,19 +334,35 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b * * ******************************************************************************/ -void update_access_in_menu_edition(GObject *ref, GtkDisplayPanel *panel, const vmpa2t *addr) +void update_access_for_cursor_in_menu_edition(GLoadedPanel *panel, const GLineCursor *cursor) { + GObject *ref; /* Espace de référencements */ GObject *creator; /* Créateur à l'orgine du seg. */ gboolean access; /* Accès à déterminer */ GtkWidget *item; /* Elément de menu à traiter */ + ref = get_global_ref(); + /* Préliminaire */ - if (panel == NULL || addr == NULL) - creator = NULL; + /** + * Seuls les affichages de blocs (en graphique ou non) distribuent ce + * genre de curseur. Donc on valide dans le même temps la nature de la vue. + */ + + if (G_IS_BINARY_CURSOR(cursor)) + { + assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel)); + + if (g_line_cursor_is_valid(cursor)) + creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel)); + else + cursor = NULL; + + } else - creator = gtk_display_panel_get_active_object(panel); + creator = NULL; /* Bascule des opérandes numériques */ @@ -277,14 +390,15 @@ void update_access_in_menu_edition(GObject *ref, GtkDisplayPanel *panel, const v item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref")); gtk_widget_set_sensitive(item, access); - access = (addr != NULL);; + access = g_line_cursor_is_valid(cursor); item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_list_xrefs")); gtk_widget_set_sensitive(item, access); /* Nettoyage et sortie finale */ - if (creator != NULL) g_object_unref(G_OBJECT(creator)); + if (creator != NULL) + g_object_unref(G_OBJECT(creator)); } @@ -317,9 +431,9 @@ static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar) addr = get_address_from_goto_dialog(dialog); panel = get_current_view(); + assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel)); - if (GTK_IS_DISPLAY_PANEL(panel)) - gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), addr); + gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), addr); g_object_unref(G_OBJECT(panel)); @@ -359,32 +473,29 @@ static void mcb_edition_switch_numeric_operand(GtkMenuItem *menuitem, gpointer u display = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuitem), "kind_of_switch")); panel = get_current_view(); + assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel)); - if (GTK_IS_DISPLAY_PANEL(panel)) - { - creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel)); - assert(G_IS_IMM_OPERAND(creator)); + creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel)); + assert(G_IS_IMM_OPERAND(creator)); - addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel)); + addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel)); - binary = get_current_binary(); - proc = g_loaded_binary_get_processor(binary); + binary = G_LOADED_BINARY(get_current_content()); + proc = g_loaded_binary_get_processor(binary); - instr = g_arch_processor_find_instr_by_address(proc, addr); - assert(instr != NULL); + instr = g_arch_processor_find_instr_by_address(proc, addr); + assert(instr != NULL); - switcher = g_db_switcher_new(instr, G_IMM_OPERAND(creator), display); + switcher = g_db_switcher_new(instr, G_IMM_OPERAND(creator), display); - g_object_unref(G_OBJECT(instr)); + g_object_unref(G_OBJECT(instr)); - g_loaded_binary_add_to_collection(binary, G_DB_ITEM(switcher)); + g_loaded_binary_add_to_collection(binary, G_DB_ITEM(switcher)); - g_object_unref(G_OBJECT(proc)); - g_object_unref(G_OBJECT(binary)); - - g_object_unref(creator); + g_object_unref(G_OBJECT(proc)); + g_object_unref(G_OBJECT(binary)); - } + g_object_unref(creator); g_object_unref(G_OBJECT(panel)); @@ -432,35 +543,32 @@ static void mcb_edition_follow_ref(GtkMenuItem *menuitem, gpointer unused) virt_t virt; /* Adresse virtuelle */ panel = get_current_view(); + assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel)); - if (GTK_IS_DISPLAY_PANEL(panel)) - { - creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel)); - assert(creator != NULL); + creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel)); + assert(creator != NULL); - defined = false; + defined = false; - if (G_IS_TARGET_OPERAND(creator)) - { - g_target_operand_get_addr(G_TARGET_OPERAND(creator), &addr); - defined = true; - } + if (G_IS_TARGET_OPERAND(creator)) + { + g_target_operand_get_addr(G_TARGET_OPERAND(creator), &addr); + defined = true; + } - else if (G_IS_IMM_OPERAND(creator)) + else if (G_IS_IMM_OPERAND(creator)) + { + if (g_imm_operand_to_virt_t(G_IMM_OPERAND(creator), &virt)) { - if (g_imm_operand_to_virt_t(G_IMM_OPERAND(creator), &virt)) - { - init_vmpa(&addr, VMPA_NO_PHYSICAL, virt); - defined = true; - } + init_vmpa(&addr, VMPA_NO_PHYSICAL, virt); + defined = true; } + } - if (defined) - gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), &addr); + if (defined) + gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), &addr); - g_object_unref(creator); - - } + g_object_unref(creator); g_object_unref(G_OBJECT(panel)); @@ -492,51 +600,48 @@ static void mcb_edition_list_xrefs(GtkMenuItem *menuitem, GMenuBar *bar) vmpa2t *dest; /* Adresse de destination */ panel = get_current_view(); + assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel)); - if (GTK_IS_DISPLAY_PANEL(panel)) - { - addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel)); - - binary = get_current_binary(); - proc = g_loaded_binary_get_processor(binary); - - /** - * On ne peut pas se reposer sur l'espace couvert par une ligne, car il peut - * être de taille nulle (cas d'une étiquette, par exemple), à la différence - * de la taille d'une instruction. - * - * Il faut ainsi être plus souple, et se baser sur l'espace couvert par - * une ligne mais sur l'adresse uniquement. - */ - instr = g_arch_processor_find_instr_by_address(proc, addr); - - if (instr != NULL) - { - ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); + addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel)); - dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), binary, instr, true); + binary = G_LOADED_BINARY(get_current_content()); + proc = g_loaded_binary_get_processor(binary); - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) - { - dest = get_address_from_gotox_dialog(dialog); + /** + * On ne peut pas se reposer sur l'espace couvert par une ligne, car il peut + * être de taille nulle (cas d'une étiquette, par exemple), à la différence + * de la taille d'une instruction. + * + * Il faut ainsi être plus souple, et se baser sur l'espace couvert par + * une ligne mais sur l'adresse uniquement. + */ + instr = g_arch_processor_find_instr_by_address(proc, addr); - gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), dest); + if (instr != NULL) + { + ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); - delete_vmpa(dest); + dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), binary, instr, true); - } + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) + { + dest = get_address_from_gotox_dialog(dialog); - gtk_widget_destroy(dialog); + gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), dest); - g_object_unref(G_OBJECT(instr)); + delete_vmpa(dest); } - g_object_unref(G_OBJECT(proc)); - g_object_unref(G_OBJECT(binary)); + gtk_widget_destroy(dialog); + + g_object_unref(G_OBJECT(instr)); } + g_object_unref(G_OBJECT(proc)); + g_object_unref(G_OBJECT(binary)); + g_object_unref(G_OBJECT(panel)); } @@ -570,15 +675,13 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) /* Détermination de l'adresse visée */ panel = get_current_view(); - - if (!GTK_IS_DISPLAY_PANEL(panel)) - goto done_with_panel; + assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel)); curloc = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel)); /* Accès à la collection */ - binary = get_current_binary(); + binary = G_LOADED_BINARY(get_current_content()); collec = g_loaded_binary_find_collection(binary, DBF_BOOKMARKS); /** @@ -636,8 +739,6 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) g_object_unref(G_OBJECT(collec)); g_object_unref(G_OBJECT(binary)); - done_with_panel: - g_object_unref(G_OBJECT(panel)); } |