diff options
Diffstat (limited to 'src/gui/menus')
-rw-r--r-- | src/gui/menus/binary.c | 32 | ||||
-rw-r--r-- | src/gui/menus/binary.h | 6 | ||||
-rw-r--r-- | src/gui/menus/edition.c | 289 | ||||
-rw-r--r-- | src/gui/menus/edition.h | 7 | ||||
-rw-r--r-- | src/gui/menus/menubar.c | 69 | ||||
-rw-r--r-- | src/gui/menus/view.c | 14 | ||||
-rw-r--r-- | src/gui/menus/view.h | 6 |
7 files changed, 253 insertions, 170 deletions
diff --git a/src/gui/menus/binary.c b/src/gui/menus/binary.c index b7be1b9..1360011 100644 --- a/src/gui/menus/binary.c +++ b/src/gui/menus/binary.c @@ -34,6 +34,7 @@ #include "../dialogs/gotox.h" #include "../dialogs/storage.h" #include "../../gtkext/easygtk.h" +#include "../../gtkext/gtkdisplaypanel.h" @@ -106,10 +107,9 @@ GtkWidget *build_menu_binary(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *ba /****************************************************************************** * * -* Paramètres : ref = espace de référencements à consulter. * -* panel = panneau d'affichage actif ou NULL si aucun. * +* Paramètres : new = nouveau contenu chargé à analyser. * * * -* Description : Met à jour les accès du menu "Binaire" selon le contenu. * +* Description : Réagit à un changement d'affichage principal de contenu. * * * * Retour : - * * * @@ -117,14 +117,17 @@ GtkWidget *build_menu_binary(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *ba * * ******************************************************************************/ -void update_access_in_menu_binary(GObject *ref, GtkDisplayPanel *panel) +void update_access_for_content_in_menu_binary(GLoadedContent *new) { + GObject *ref; /* Espace de référencements */ gboolean access; /* Accès à déterminer */ GtkWidget *item; /* Elément de menu à traiter */ /* Préliminaire */ - access = (panel != NULL); + ref = get_global_ref(); + + access = G_IS_LOADED_BINARY(new); /* Menus */ @@ -155,19 +158,14 @@ void update_access_in_menu_binary(GObject *ref, GtkDisplayPanel *panel) static void mcb_binary_entry_points(GtkMenuItem *menuitem, GMenuBar *bar) { - GEditorItem *item; /* Elément d'éditeur graphique */ - GObject *ref; /* Espace de référencements */ GLoadedBinary *binary; /* Binaire présenté à l'écran */ GtkWidget *dialog; /* Boîte de dialogue à montrer */ vmpa2t *addr; /* Adresse de destination */ GLoadedPanel *panel; /* Afficheur effectif de code */ - item = G_EDITOR_ITEM(bar); + binary = G_LOADED_BINARY(get_current_content()); - ref = g_editor_item_get_global_ref(item); - binary = get_current_binary(); - - dialog = create_gotox_dialog_for_entry_points(GTK_WINDOW(ref), binary); + dialog = create_gotox_dialog_for_entry_points(get_editor_window(), binary); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { @@ -226,14 +224,12 @@ static void mcb_binary_attach_debugger(GtkMenuItem *menuitem, GMenuBar *bar) static void mcb_binary_storage(GtkMenuItem *menuitem, GMenuBar *bar) { GLoadedBinary *binary; /* Edition courante */ - GObject *ref; /* Espace de référencements */ GtkBuilder *builder; /* Constructeur utilisé */ GtkWidget *dialog; /* Boîte de dialogue à montrer */ - binary = get_current_binary(); - ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); + binary = G_LOADED_BINARY(get_current_content()); - dialog = create_storage_dialog(binary, GTK_WINDOW(ref), &builder); + dialog = create_storage_dialog(binary, get_editor_window(), &builder); gtk_dialog_run(GTK_DIALOG(dialog)); @@ -263,9 +259,9 @@ static void mcb_binary_export(GtkMenuItem *menuitem, GMenuBar *bar) { GLoadedBinary *binary; /* Edition courante */ - binary = get_current_binary(); + binary = G_LOADED_BINARY(get_current_content()); - run_export_assistant(binary, GTK_WINDOW(G_EDITOR_ITEM(bar)->ref)); + run_export_assistant(binary, get_editor_window()); g_object_unref(G_OBJECT(binary)); diff --git a/src/gui/menus/binary.h b/src/gui/menus/binary.h index a66fe26..45140b6 100644 --- a/src/gui/menus/binary.h +++ b/src/gui/menus/binary.h @@ -30,15 +30,15 @@ #include "menubar.h" -#include "../../gtkext/gtkdisplaypanel.h" +#include "../../analysis/loaded.h" /* Construit le menu "Binaire". */ GtkWidget *build_menu_binary(GObject *, GtkAccelGroup *, GMenuBar *); -/* Met à jour les accès du menu "Binaire" selon le contenu. */ -void update_access_in_menu_binary(GObject *, GtkDisplayPanel *); +/* Réagit à un changement d'affichage principal de contenu. */ +void update_access_for_content_in_menu_binary(GLoadedContent *); 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)); } diff --git a/src/gui/menus/edition.h b/src/gui/menus/edition.h index f863568..a49e320 100644 --- a/src/gui/menus/edition.h +++ b/src/gui/menus/edition.h @@ -30,15 +30,18 @@ #include "menubar.h" -#include "../../gtkext/gtkdisplaypanel.h" +#include "../../glibext/gloadedpanel.h" /* Construit le menu "Edition". */ GtkWidget *build_menu_edition(GObject *, GtkAccelGroup *, GMenuBar *); +/* Lance une actualisation du fait d'un changement de support. */ +void update_access_for_view_in_menu_edition(GLoadedPanel *); + /* Met à jour les accès du menu "Edition" selon une position. */ -void update_access_in_menu_edition(GObject *, GtkDisplayPanel *, const vmpa2t *); +void update_access_for_cursor_in_menu_edition(GLoadedPanel *, const GLineCursor *); diff --git a/src/gui/menus/menubar.c b/src/gui/menus/menubar.c index 989d964..7bc7e85 100644 --- a/src/gui/menus/menubar.c +++ b/src/gui/menus/menubar.c @@ -76,14 +76,14 @@ static void g_menu_bar_dispose(GMenuBar *); /* Procède à la libération totale de la mémoire. */ static void g_menu_bar_finalize(GMenuBar *); -/* Lance une actualisation du fait d'un changement de vue. */ -static void update_menu_bar_for_view(GMenuBar *, GtkDisplayPanel *); +/* Réagit à un changement d'affichage principal de contenu. */ +static void change_menubar_current_content(GMenuBar *, GLoadedContent *, GLoadedContent *); -/* Réagit à un changement de focus des panneaux d'affichage. */ -static void notify_focus_change_for_menu_bar(GMenuBar *, GtkDisplayPanel *); +/* Lance une actualisation du fait d'un changement de support. */ +static void change_menubar_current_view(GMenuBar *, GLoadedPanel *, GLoadedPanel *); /* Met à jour les accès aux menus en fonction de la position. */ -static void track_caret_address_for_menu_bar(GMenuBar *, GtkDisplayPanel *, const vmpa2t *); +static void track_caret_address_for_menu_bar(GMenuBar *, GLoadedPanel *, const GLineCursor *); /* Lance une actualisation relative à l'étendue du projet. */ static void update_menu_bar_for_project(GMenuBar *, GStudyProject *); @@ -118,9 +118,9 @@ static void g_menu_bar_class_init(GMenuBarClass *klass) editem = G_EDITOR_ITEM_CLASS(klass); - editem->update_view = (update_item_view_fc)update_menu_bar_for_view; - editem->notify_focus = (notify_focus_change_fc)notify_focus_change_for_menu_bar; - editem->track_caret = (track_caret_in_view_fc)track_caret_address_for_menu_bar; + editem->change_content = (change_item_content_fc)change_menubar_current_content; + editem->change_view = (change_item_view_fc)change_menubar_current_view; + editem->track_cursor = (track_cursor_in_view_fc)track_caret_address_for_menu_bar; editem->update_project = (update_project_fc)update_menu_bar_for_project; } @@ -264,10 +264,6 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup) result->help = build_menu_help(ref, accgroup); gtk_container_add(GTK_CONTAINER(item->widget), result->help); - /* Finalisation générique */ - - notify_focus_change_for_menu_bar(result, NULL); - return G_EDITOR_ITEM(result); } @@ -275,10 +271,11 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup) /****************************************************************************** * * -* Paramètres : bar = barre de menus à actualiser. * -* panel = nouveau panneau d'affichage actif. * +* Paramètres : bar = barre de menus à mettre à jour. * +* old = ancien contenu chargé analysé. * +* new = nouveau contenu chargé à analyser. * * * -* Description : Lance une actualisation du fait d'un changement de vue. * +* Description : Réagit à un changement d'affichage principal de contenu. * * * * Retour : - * * * @@ -286,19 +283,20 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup) * * ******************************************************************************/ -static void update_menu_bar_for_view(GMenuBar *bar, GtkDisplayPanel *panel) +static void change_menubar_current_content(GMenuBar *bar, GLoadedContent *old, GLoadedContent *new) { - update_menu_view_for_view(bar->view, panel, bar); + update_access_for_content_in_menu_binary(new); } /****************************************************************************** * * -* Paramètres : bar = barre de menus à actualiser. * -* panel = composant d'affichage concerné par l'opération. * +* Paramètres : bar = barre de menus à mettre à jour. * +* old = ancienne vue du contenu chargé analysé. * +* new = nouvelle vue du contenu chargé analysé. * * * -* Description : Réagit à un changement de focus des panneaux d'affichage. * +* Description : Lance une actualisation du fait d'un changement de support. * * * * Retour : - * * * @@ -306,23 +304,12 @@ static void update_menu_bar_for_view(GMenuBar *bar, GtkDisplayPanel *panel) * * ******************************************************************************/ -static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *panel) +static void change_menubar_current_view(GMenuBar *bar, GLoadedPanel *old, GLoadedPanel *new) { - const vmpa2t *addr; /* Position courante */ - GEditorItem *item; /* Autre version de l'élément */ - - if (panel != NULL) - addr = gtk_display_panel_get_caret_location(panel); - else - addr = NULL; - - item = G_EDITOR_ITEM(bar); - - update_access_in_menu_edition(item->ref, panel, addr); + update_access_for_view_in_menu_edition(new); - update_access_in_menu_view(item->ref, panel); - - update_access_in_menu_binary(item->ref, panel); + rebuild_menu_view(bar->view, new, bar); + update_access_for_view_in_menu_view(G_EDITOR_ITEM(bar)->ref, new); } @@ -330,8 +317,8 @@ static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *pan /****************************************************************************** * * * Paramètres : bar = barre de menus à actualiser. * -* panel = panneau d'affichage actif ou NULL si aucun. * -* addr = nouvelle adresse du curseur courant. * +* panel = composant d'affichage parcouru. * +* cursor = nouvel emplacement du curseur courant. * * * * Description : Met à jour les accès aux menus en fonction de la position. * * * @@ -341,13 +328,9 @@ static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *pan * * ******************************************************************************/ -static void track_caret_address_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *panel, const vmpa2t *addr) +static void track_caret_address_for_menu_bar(GMenuBar *bar, GLoadedPanel *panel, const GLineCursor *cursor) { - GEditorItem *item; /* Autre version de l'élément */ - - item = G_EDITOR_ITEM(bar); - - update_access_in_menu_edition(item->ref, panel, addr); + update_access_for_cursor_in_menu_edition(panel, cursor); } diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c index dfbf152..f0e7450 100644 --- a/src/gui/menus/view.c +++ b/src/gui/menus/view.c @@ -105,7 +105,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) qck_create_menu(GTK_MENU_ITEM(submenuitem)); - /* - */ + /* Séparation */ submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -138,7 +138,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) add_accelerator_to_menu_item(submenuitem, "<Shift>Tab", accgroup); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - /* - */ + /* Séparation */ submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -160,7 +160,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) g_object_set_data(G_OBJECT(submenuitem), "kind_of_opt", GUINT_TO_POINTER(BLC_BINARY)); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - /* - */ + /* Séparation */ submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -191,7 +191,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) * * ******************************************************************************/ -void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuBar *bar) +void rebuild_menu_view(GtkWidget *widget, GLoadedPanel *panel, GMenuBar *bar) { GObject *ref; /* Espace de référencements */ GtkRadioMenuItem *item; /* Elément de menu arbitraire */ @@ -246,9 +246,9 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB g_slist_foreach(radios, (GFunc)reconnect_display_radio, NULL); - /* - */ + /* Séparation */ - content = g_loaded_panel_get_content(G_LOADED_PANEL(panel)); + content = g_loaded_panel_get_content(panel); view_index = g_loaded_content_get_view_index(content, GTK_WIDGET(panel)); @@ -305,7 +305,7 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB * * ******************************************************************************/ -void update_access_in_menu_view(GObject *ref, GtkDisplayPanel *panel) +void update_access_for_view_in_menu_view(GObject *ref, GLoadedPanel *panel) { gboolean access; /* Accès à déterminer */ GtkWidget *item; /* Elément de menu à traiter */ diff --git a/src/gui/menus/view.h b/src/gui/menus/view.h index d42bbc6..5216bcb 100644 --- a/src/gui/menus/view.h +++ b/src/gui/menus/view.h @@ -30,7 +30,7 @@ #include "menubar.h" -#include "../../gtkext/gtkdisplaypanel.h" +#include "../../glibext/gloadedpanel.h" @@ -38,10 +38,10 @@ GtkWidget *build_menu_view(GObject *, GtkAccelGroup *, GMenuBar *); /* Lance une actualisation du fait d'un changement de vue. */ -void update_menu_view_for_view(GtkWidget *, GtkDisplayPanel *, GMenuBar *); +void rebuild_menu_view(GtkWidget *, GLoadedPanel *, GMenuBar *); /* Met à jour les accès du menu "Affichage" selon le contenu. */ -void update_access_in_menu_view(GObject *, GtkDisplayPanel *); +void update_access_for_view_in_menu_view(GObject *, GLoadedPanel *); |