diff options
Diffstat (limited to 'src/gui/menus/edition.c')
-rw-r--r-- | src/gui/menus/edition.c | 129 |
1 files changed, 97 insertions, 32 deletions
diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index c524891..b77f864 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -100,25 +100,25 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b deepmenubar = gtk_menu_new(); gtk_menu_item_set_submenu(GTK_MENU_ITEM(submenuitem), deepmenubar); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Hexadecimal"), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_hex", _("Hexadecimal"), G_CALLBACK(mcb_edition_switch_numeric_operand), bar); add_accelerator_to_menu_item(deepmenuitem, "H", accgroup); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_HEX)); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Decimal"), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_dec", _("Decimal"), G_CALLBACK(mcb_edition_switch_numeric_operand), bar); add_accelerator_to_menu_item(deepmenuitem, "D", accgroup); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_DEC)); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Octal"), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_oct", _("Octal"), G_CALLBACK(mcb_edition_switch_numeric_operand), bar); add_accelerator_to_menu_item(deepmenuitem, "O", accgroup); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_OCT)); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Binary"), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_bin", _("Binary"), G_CALLBACK(mcb_edition_switch_numeric_operand), bar); add_accelerator_to_menu_item(deepmenuitem, "B", accgroup); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_BIN)); @@ -127,7 +127,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b deepmenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); - deepmenuitem = qck_create_menu_item(NULL, NULL, _("Default"), + deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_def", _("Default"), G_CALLBACK(mcb_edition_switch_numeric_operand), bar); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_COUNT)); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); @@ -166,6 +166,77 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b /****************************************************************************** * * +* Paramètres : bar = barre de menus à actualiser. * +* addr = nouvelle adresse du curseur courant. * +* info = barre de statut présentant les informations. * +* * +* Description : Met à jour les accès du menu "Edition" selon une position. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void update_access_in_menu_edition(GObject *ref, GtkBufferView *view, const vmpa2t *addr) +{ + bool state; /* Etat principal à considérer */ + gboolean access; /* Accès à déterminer */ + GBufferLine *line; /* Ligne de position courante */ + GBufferSegment *segment; /* Segment actif s'il existe */ + GObject *creator; /* Créateur à l'orgine du seg. */ + GtkWidget *item; /* Elément de menu à traiter */ + + /* Préliminaire */ + + if (view == NULL) + state = false; + else + state = gtk_view_panel_get_position(GTK_VIEW_PANEL(view), &line, &segment); + + if (state) + creator = g_buffer_segment_get_creator(segment); + else + creator = NULL; + + /* Bascule des opérandes numériques */ + + access = (state && G_IS_IMM_OPERAND(creator)); + + 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 = (state && (G_IS_TARGET_OPERAND(creator) || G_IS_IMM_OPERAND(creator))); + + item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref")); + gtk_widget_set_sensitive(item, access); + + /* Nettoyage et sortie finale */ + + if (creator != NULL) g_object_unref(G_OBJECT(creator)); + + if (segment != NULL) g_object_unref(G_OBJECT(segment)); + if (line != NULL) g_object_unref(G_OBJECT(line)); + +} + + +/****************************************************************************** +* * * Paramètres : menuitem = élément de menu sélectionné. * * bar = barre de menu parente. * * * @@ -292,40 +363,34 @@ static void mcb_edition_follow_ref(GtkMenuItem *menuitem, GMenuBar *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; + creator = g_buffer_segment_get_creator(segment); + assert(creator != NULL); - if (G_IS_TARGET_OPERAND(creator)) - virt = g_target_operand_get_addr(G_TARGET_OPERAND(creator)); + /** + * On fait le pari de reposer uniquement sur des adresses virtuelles ! + * A changer dans un futur ? + */ - else if (G_IS_IMM_OPERAND(creator)) - { - if (!g_imm_operand_to_virt_t(G_IMM_OPERAND(creator), &virt)) - virt = VMPA_NO_VIRTUAL; - } + 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); - } + if (G_IS_TARGET_OPERAND(creator)) + virt = g_target_operand_get_addr(G_TARGET_OPERAND(creator)); - g_object_unref(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); } - if (segment != NULL) g_object_unref(G_OBJECT(segment)); + g_object_unref(creator); + + g_object_unref(G_OBJECT(segment)); g_object_unref(G_OBJECT(line)); } |