diff options
Diffstat (limited to 'src/gui/menus/edition.c')
-rw-r--r-- | src/gui/menus/edition.c | 246 |
1 files changed, 197 insertions, 49 deletions
diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index 8893ce9..3c1d6ac 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -28,19 +28,27 @@ #include <i18n.h> +#include "../../arch/target.h" #include "../../dialogs/bookmark.h" #include "../../dialogs/goto.h" +#include "../../dialogs/gotox.h" #include "../../gtkext/easygtk.h" #include "../../gtkext/gtkbufferview.h" -/* Réagit avec le menu "Edition -> Signets -> Basculer...". */ -static void mcb_edition_bookmarks_toggle(GtkMenuItem *, GMenuBar *); - /* Réagit avec le menu "Edition -> Aller à l'adresse...". */ static void mcb_edition_goto(GtkMenuItem *, GMenuBar *); +/* Réagit avec le menu "Edition -> Suivre la référence". */ +static void mcb_edition_follow_ref(GtkMenuItem *, GMenuBar *); + +/* Réagit avec le menu "Edition -> Lister toutes les réfs...". */ +static void mcb_edition_list_xrefs(GtkMenuItem *, GMenuBar *); + +/* Réagit avec le menu "Edition -> Signets -> Basculer...". */ +static void mcb_edition_bookmarks_toggle(GtkMenuItem *, GMenuBar *); + /****************************************************************************** @@ -71,6 +79,27 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b menubar = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(result), menubar); + submenuitem = qck_create_menu_item(NULL, NULL, _("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); + + submenuitem = qck_create_menu_separator(); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenuitem = qck_create_menu_item(ref, "mnu_edit_follow_ref", _("Follow the reference"), + G_CALLBACK(mcb_edition_follow_ref), bar); + add_accelerator_to_menu_item(submenuitem, "Return", accgroup); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenuitem = qck_create_menu_item(ref, "mnu_edit_list_xrefs", _("List all references leading to..."), + G_CALLBACK(mcb_edition_list_xrefs), bar); + add_accelerator_to_menu_item(submenuitem, "X", accgroup); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + + submenuitem = qck_create_menu_separator(); + gtk_container_add(GTK_CONTAINER(menubar), submenuitem); + submenuitem = qck_create_menu_item(NULL, NULL, _("Bookmarks"), NULL, NULL); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -82,13 +111,6 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b add_accelerator_to_menu_item(deepmenuitem, "<Ctrl>D", accgroup); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); - submenuitem = qck_create_menu_separator(); - gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - - submenuitem = qck_create_menu_item(NULL, NULL, _("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); return result; @@ -100,6 +122,171 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b * Paramètres : menuitem = élément de menu sélectionné. * * bar = barre de menu parente. * * * +* Description : Réagit avec le menu "Edition -> Aller à l'adresse...". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar) +{ + GObject *ref; /* Espace de référencements */ + GtkWidget *dialog; /* Boîte de dialogue à montrer */ + vmpa2t *addr; /* Adresse de destination */ + GtkViewPanel *vpanel; /* Afficheur effectif de code */ + + ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); + dialog = create_goto_dialog(GTK_WINDOW(ref)); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) + { + addr = get_address_from_goto_dialog(dialog); + + vpanel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + gtk_view_panel_scroll_to_address(vpanel, addr, SPT_CENTER); + + delete_vmpa(addr); + + } + + gtk_widget_destroy(dialog); + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* bar = barre de menu parente. * +* * +* Description : Réagit avec le menu "Edition -> Suivre la référence". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void mcb_edition_follow_ref(GtkMenuItem *menuitem, GMenuBar *bar) +{ + GtkViewPanel *vpanel; /* Afficheur effectif de code */ + GBufferLine *line; /* Ligne de position courante */ + GBufferSegment *segment; /* Segment actif s'il existe */ + GObject *creator; /* Créateur à l'orgine du seg. */ + virt_t virt; /* Adresse virtuelle */ + vmpa2t addr; /* Adresse de destination */ + + vpanel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + + if (gtk_view_panel_get_position(vpanel, &line, &segment)) + { + if (segment != NULL) + creator = g_buffer_segment_get_creator(segment); + else + creator = NULL; + + if (creator != NULL) + { + /** + * On fait le pari de reposer uniquement sur des adresses virtuelles ! + * A changer dans un futur ? + */ + + virt = VMPA_NO_VIRTUAL; + + if (G_IS_TARGET_OPERAND(creator)) + virt = g_target_operand_get_addr(G_TARGET_OPERAND(creator)); + + else if (G_IS_IMM_OPERAND(creator)) + { + if (!g_imm_operand_to_virt_t(G_IMM_OPERAND(creator), &virt)) + virt = VMPA_NO_VIRTUAL; + } + + if (virt != VMPA_NO_VIRTUAL) + { + init_vmpa(&addr, VMPA_NO_PHYSICAL, virt); + gtk_view_panel_scroll_to_address(vpanel, &addr, SPT_CENTER); + } + + g_object_unref(creator); + + } + + if (segment != NULL) g_object_unref(G_OBJECT(segment)); + g_object_unref(G_OBJECT(line)); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* bar = barre de menu parente. * +* * +* Description : Réagit avec le menu "Edition -> Lister toutes les réfs...". * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void mcb_edition_list_xrefs(GtkMenuItem *menuitem, GMenuBar *bar) +{ + GtkViewPanel *vpanel; /* Afficheur effectif de code */ + GBufferLine *line; /* Ligne de position courante */ + const mrange_t *range; /* Couverture en mémoire */ + GLoadedBinary *binary; /* Représentation binaire */ + GArchInstruction *list; /* Ensemble des instructions */ + GArchInstruction *instr; /* Point de croisements */ + GObject *ref; /* Espace de référencements */ + GtkWidget *dialog; /* Boîte de dialogue à montrer */ + vmpa2t *addr; /* Adresse de destination */ + + vpanel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + + if (gtk_view_panel_get_position(vpanel, &line, NULL)) + { + range = g_buffer_line_get_range(line); + + binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar)); + list = g_loaded_binary_get_instructions(binary); + + instr = g_arch_instruction_find_by_range(list, range); + + ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); + + dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), binary, instr, true); + + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) + { + addr = get_address_from_gotox_dialog(dialog); + + gtk_view_panel_scroll_to_address(vpanel, addr, SPT_CENTER); + + delete_vmpa(addr); + + } + + gtk_widget_destroy(dialog); + + g_object_unref(G_OBJECT(line)); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : menuitem = élément de menu sélectionné. * +* bar = barre de menu parente. * +* * * Description : Réagit avec le menu "Edition -> Signets -> Basculer...". * * * * Retour : - * @@ -192,42 +379,3 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) g_object_unref(G_OBJECT(collec)); } - - -/****************************************************************************** -* * -* Paramètres : menuitem = élément de menu sélectionné. * -* bar = barre de menu parente. * -* * -* Description : Réagit avec le menu "Edition -> Aller à l'adresse...". * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar) -{ - GObject *ref; /* Espace de référencements */ - GtkWidget *dialog; /* Boîte de dialogue à montrer */ - vmpa2t *addr; /* Adresse de destination */ - GtkViewPanel *vpanel; /* Afficheur effectif de code */ - - ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); - dialog = create_goto_dialog(GTK_WINDOW(ref)); - - if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) - { - addr = get_address_from_goto_dialog(dialog); - - vpanel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); - gtk_view_panel_scroll_to_address(vpanel, addr, SPT_CENTER); - - delete_vmpa(addr); - - } - - gtk_widget_destroy(dialog); - -} |