summaryrefslogtreecommitdiff
path: root/src/gui/menus/edition.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/menus/edition.c')
-rw-r--r--src/gui/menus/edition.c289
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));
}