From d487ea54850c85ea22df22af3b21b57d9ad0fd2f Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Mon, 16 Jan 2012 01:29:18 +0000 Subject: Updated menus on view change. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@227 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 31 +++++++++++++++ src/editor.c | 17 ++++---- src/gtkext/gtkbufferview-int.h | 3 -- src/gtkext/gtkbufferview.c | 10 ++--- src/gtkext/gtkdockstation.c | 13 +++++- src/gtkext/gtkdockstation.h | 4 ++ src/gtkext/gtkviewpanel-int.h | 3 ++ src/gtkext/gtkviewpanel.c | 89 ++++++++++++++++++++++++++++++++++++++++++ src/gtkext/gtkviewpanel.h | 12 ++++++ src/gui/editem.c | 23 ++++++++++- src/gui/editem.h | 5 ++- src/gui/menus/menubar.c | 47 +++++++++++++++++----- src/gui/menus/view.c | 89 ++++++++++++++++++++++++++++++------------ src/gui/menus/view.h | 8 +++- src/gui/panels/panel.c | 20 ++++++++-- src/gui/panels/panel.h | 2 +- 16 files changed, 314 insertions(+), 62 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0c2c5d3..9926314 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,34 @@ +12-01-16 Cyrille Bagard + + * src/editor.c: + Update editor on view change. + + * src/gtkext/gtkbufferview.c: + * src/gtkext/gtkbufferview-int.h: + Move the rendering guidelines in the base view widget. + + * src/gtkext/gtkdockstation.c: + * src/gtkext/gtkdockstation.h: + Add a signal to notify tab changes. + + * src/gtkext/gtkviewpanel.c: + * src/gtkext/gtkviewpanel.h: + * src/gtkext/gtkviewpanel-int.h: + Move the rendering guidelines in the base view widget. + + * src/gui/editem.c: + * src/gui/editem.h: + Fix a tiny bug and provide the current view panel. + + * src/gui/menus/menubar.c: + * src/gui/menus/view.c: + * src/gui/menus/view.h: + Update menus on view change. + + * src/gui/panels/panel.c: + * src/gui/panels/panel.h: + Connect the "switch-widget" signal to each created dock station. + 12-01-14 Cyrille Bagard * src/arch/immediate.c: diff --git a/src/editor.c b/src/editor.c index 284b16c..936b9a1 100644 --- a/src/editor.c +++ b/src/editor.c @@ -143,7 +143,7 @@ void update_debug_menu_items(GObject *, gboolean); /* Réagit au changement d'onglet d'un panneau quelconque. */ -static void on_dock_item_switch(GtkDockPanel *, GDockItem *, GObject *); +static void on_dock_item_switch(GtkDockPanel *, GtkWidget *, GObject *); /* Met en concordance les menus avec l'édition courante. */ static void refresh_editor_menus(GObject *, GOpenidaBinary *, GtkBinView *); @@ -263,6 +263,8 @@ GtkWidget *create_editor(void) /* Intégration des menus */ editem = g_menu_bar_new(ref, accgroup); + register_editor_item(editem); + menuboard = g_editor_item_get_widget(editem); gtk_box_pack_start(GTK_BOX(vbox1), menuboard, FALSE, FALSE, 0); @@ -463,7 +465,7 @@ GtkWidget *create_editor(void) { GtkWidget *support; - support = init_panels2(); + support = init_panels2(G_CALLBACK(on_dock_item_switch), ref); gtk_box_pack_start(GTK_BOX(vbox1), support, TRUE, TRUE, 0); load_main_panels(); @@ -1416,14 +1418,11 @@ void update_debug_menu_items(GObject *ref, gboolean stopped) * * ******************************************************************************/ -static void on_dock_item_switch(GtkDockPanel *panel, GDockItem *item, GObject *ref) +static void on_dock_item_switch(GtkDockPanel *panel, GtkWidget *widget, GObject *ref) { - GtkWidget *widget; /* Support réel à traiter */ GOpenidaBinary *old_binary; /* Ancien binaire édité */ GOpenidaBinary *binary; /* Binaire en cours d'édition */ - widget = g_dock_item_get_panel(item); - if (GTK_IS_SCROLLED_WINDOW(widget)) widget = gtk_bin_get_child(GTK_BIN(widget)); @@ -1439,15 +1438,15 @@ static void on_dock_item_switch(GtkDockPanel *panel, GDockItem *item, GObject *r if (old_binary != binary) { - notify_panels_of_binary_change(binary); + //notify_panels_of_binary_change(binary); change_editor_items_current_binary(ref, binary); } change_editor_items_current_view(ref, GTK_VIEW_PANEL(widget)); - refresh_editor_menus(ref, binary, GTK_BIN_VIEW(widget)); + //refresh_editor_menus(ref, binary, GTK_BIN_VIEW(widget)); - notify_panels_of_view_change(GTK_VIEW_PANEL(widget), false); + //notify_panels_of_view_change(GTK_VIEW_PANEL(widget), false); } diff --git a/src/gtkext/gtkbufferview-int.h b/src/gtkext/gtkbufferview-int.h index 31b911e..db27b9e 100644 --- a/src/gtkext/gtkbufferview-int.h +++ b/src/gtkext/gtkbufferview-int.h @@ -40,9 +40,6 @@ struct _GtkBufferView GCodeBuffer *buffer; /* Code sous forme de texte */ GBufferView *buffer_view; /* Affichage de cette forme */ - bool *display_addr; /* Affichage des adresses ? */ - bool *display_code; /* Affichage du code binaire ? */ - gint line_height; /* Hauteur maximale des lignes */ gint left_margin; /* Marge gauche + espace */ gint left_text; /* Début d'impression du code */ diff --git a/src/gtkext/gtkbufferview.c b/src/gtkext/gtkbufferview.c index 6a2e93d..3e58500 100644 --- a/src/gtkext/gtkbufferview.c +++ b/src/gtkext/gtkbufferview.c @@ -181,7 +181,8 @@ static void gtk_buffer_view_size_request(GtkWidget *widget, GtkRequisition *requ if (view->buffer_view != NULL) g_buffer_view_get_size(view->buffer_view, &requisition->width, &requisition->height, - *view->display_addr, *view->display_code); + *GTK_VIEW_PANEL(view)->display_addr, + *GTK_VIEW_PANEL(view)->display_code); } @@ -225,7 +226,7 @@ static void gtk_buffer_view_size_allocate(GtkWidget *widget, GtkAllocation *allo view = GTK_BUFFER_VIEW(widget); g_buffer_view_get_size(view->buffer_view, &width, &height, - *view->display_addr, *view->display_code); + *panel->display_addr, *panel->display_code); gtk_view_panel_compute_allocation(panel, &valloc); @@ -324,7 +325,7 @@ static gboolean gtk_buffer_view_expose(GtkWidget *widget, GdkEventExpose *event) if (view->buffer_view != NULL) g_buffer_view_draw(view->buffer_view, event, pview->gc, fake_x, fake_y, - *view->display_addr, *view->display_code); + *pview->display_addr, *pview->display_code); gdk_window_end_paint(drawable); @@ -383,9 +384,6 @@ void gtk_buffer_view_attach_buffer(GtkBufferView *view, GCodeBuffer *buffer, boo view->buffer_view = g_buffer_view_new(view->buffer); - view->display_addr = addr; - view->display_code = code; - //gdk_threads_enter(); /* Taille des marges */ diff --git a/src/gtkext/gtkdockstation.c b/src/gtkext/gtkdockstation.c index afea11d..4b837bc 100644 --- a/src/gtkext/gtkdockstation.c +++ b/src/gtkext/gtkdockstation.c @@ -29,6 +29,7 @@ #include "easygtk.h" +#include "iodamarshal.h" @@ -61,6 +62,13 @@ G_DEFINE_TYPE(GtkDockStation, gtk_dock_station, GTK_TYPE_VBOX) static void gtk_dock_station_class_init(GtkDockStationClass *class) { + g_signal_new("switch-widget", + GTK_TYPE_DOCK_STATION, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GtkDockStationClass, switch_widget), + NULL, NULL, + g_cclosure_user_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, GTK_TYPE_WIDGET); } @@ -175,7 +183,7 @@ static gboolean gtk_dock_station_switch_panel(GtkNotebook *notebook, GtkNotebook gtk_dock_panel_update_title(GTK_DOCK_STATION(data), widget, caption); - //g_signal_emit_by_name(GTK_DOCK_PANEL(data), "switch-item", ditem); + g_signal_emit_by_name(GTK_DOCK_STATION(data), "switch-widget", widget); return TRUE; @@ -214,6 +222,9 @@ void gtk_dock_panel_add_widget(GtkDockStation *station, GtkWidget *widget, const gtk_dock_panel_update_title(station, widget, caption); + if (gtk_notebook_get_n_pages(station->notebook) == 1) + g_signal_emit_by_name(station, "switch-widget", widget); + } diff --git a/src/gtkext/gtkdockstation.h b/src/gtkext/gtkdockstation.h index c92f43d..41adacc 100644 --- a/src/gtkext/gtkdockstation.h +++ b/src/gtkext/gtkdockstation.h @@ -59,6 +59,10 @@ struct _GtkDockStationClass { GtkVBoxClass parent_class; /* Présence obligatoire en 1er */ + /* Signaux */ + + void (* switch_widget) (GtkDockStation *, GtkWidget *); + }; diff --git a/src/gtkext/gtkviewpanel-int.h b/src/gtkext/gtkviewpanel-int.h index 6ef3567..79f6f4c 100644 --- a/src/gtkext/gtkviewpanel-int.h +++ b/src/gtkext/gtkviewpanel-int.h @@ -56,6 +56,9 @@ struct _GtkViewPanel attach_binary_fc attach; /* Association avec un binaire */ scroll_fc scroll; /* Défilement du contenu */ + bool *display_addr; /* Affichage des adresses ? */ + bool *display_code; /* Affichage du code binaire ? */ + }; /* Composant d'affichage générique (classe) */ diff --git a/src/gtkext/gtkviewpanel.c b/src/gtkext/gtkviewpanel.c index 7ffeccc..9ccf209 100644 --- a/src/gtkext/gtkviewpanel.c +++ b/src/gtkext/gtkviewpanel.c @@ -339,6 +339,9 @@ void gtk_view_panel_attach_binary(GtkViewPanel *panel, GOpenidaBinary *binary, b g_object_ref(G_OBJECT(binary)); panel->binary = binary; + panel->display_addr = addr; + panel->display_code = code; + panel->attach(panel, binary, addr, code); } @@ -348,6 +351,92 @@ void gtk_view_panel_attach_binary(GtkViewPanel *panel, GOpenidaBinary *binary, b * * * Paramètres : panel = composant GTK à consulter. * * * +* Description : Indique si les adresses doivent apparaître dans le rendu. * +* * +* Retour : Consigne d'affichage. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool gtk_view_panel_get_addresses_display(const GtkViewPanel *panel) +{ + return *panel->display_addr; + +} + + +/****************************************************************************** +* * +* Paramètres : panel = composant GTK à consulter. * +* state = nouvel état à prendre en compte. * +* * +* Description : Définit si les adresses doivent apparaître dans le rendu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_view_panel_set_addresses_display(const GtkViewPanel *panel, bool state) +{ + if (*panel->display_addr != state) + { + *panel->display_addr = state; + gtk_widget_queue_draw(GTK_WIDGET(panel)); + } + +} + + +/****************************************************************************** +* * +* Paramètres : panel = composant GTK à consulter. * +* * +* Description : Indique si le code doit apparaître dans le rendu. * +* * +* Retour : Consigne d'affichage. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool gtk_view_panel_get_code_display(const GtkViewPanel *panel) +{ + return *panel->display_code; + +} + + +/****************************************************************************** +* * +* Paramètres : panel = composant GTK à consulter. * +* state = nouvel état à prendre en compte. * +* * +* Description : Définit si le code doit apparaître dans le rendu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_view_panel_set_code_display(const GtkViewPanel *panel, bool state) +{ + if (*panel->display_code != state) + { + *panel->display_code = state; + gtk_widget_queue_draw(GTK_WIDGET(panel)); + } + +} + + +/****************************************************************************** +* * +* Paramètres : panel = composant GTK à consulter. * +* * * Description : Fournit le binaire associé à la représentation. * * * * Retour : Représentation de contenu binaire. * diff --git a/src/gtkext/gtkviewpanel.h b/src/gtkext/gtkviewpanel.h index d2b69af..6edee69 100644 --- a/src/gtkext/gtkviewpanel.h +++ b/src/gtkext/gtkviewpanel.h @@ -53,6 +53,18 @@ GType gtk_view_panel_get_type(void); /* Associe à un panneau d'affichage un binaire chargé. */ void gtk_view_panel_attach_binary(GtkViewPanel *, GOpenidaBinary *, bool *, bool *); +/* Indique si les adresses doivent apparaître dans le rendu. */ +bool gtk_view_panel_get_addresses_display(const GtkViewPanel *); + +/* Définit si les adresses doivent apparaître dans le rendu. */ +void gtk_view_panel_set_addresses_display(const GtkViewPanel *, bool); + +/* Indique si le code doit apparaître dans le rendu. */ +bool gtk_view_panel_get_code_display(const GtkViewPanel *); + +/* Définit si le code doit apparaître dans le rendu. */ +void gtk_view_panel_set_code_display(const GtkViewPanel *, bool); + /* Fournit le binaire associé à la représentation. */ GOpenidaBinary *gtk_view_panel_get_binary(const GtkViewPanel *); diff --git a/src/gui/editem.c b/src/gui/editem.c index ac3461c..4afd7bd 100644 --- a/src/gui/editem.c +++ b/src/gui/editem.c @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * editem.c - gestion des différents éléments réactifs de l'éditeurs * - * Copyright (C) 2010-2011 Cyrille Bagard + * Copyright (C) 2010-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -113,6 +113,25 @@ GtkWidget *g_editor_item_get_widget(const GEditorItem *item) } +/****************************************************************************** +* * +* Paramètres : item = instance à consulter. * +* * +* Description : Fournit l'affichage de binaire courant. * +* * +* Retour : Instance en place ou NULL si aucune. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkViewPanel *g_editor_item_get_current_view(const GEditorItem *item) +{ + return g_object_get_data(item->ref, "current_view"); + +} + + /* ---------------------------------------------------------------------------------- */ /* MANIPULATION D'ENSEMBLES */ @@ -184,7 +203,7 @@ void change_editor_items_current_view(GObject *ref, GtkViewPanel *view) g_object_set_data(ref, "current_view", view); editem_list_for_each(iter, _editem_list) - if (iter->update_binary != NULL) + if (iter->update_view != NULL) iter->update_view(iter, view); } diff --git a/src/gui/editem.h b/src/gui/editem.h index 267a679..40be0c7 100644 --- a/src/gui/editem.h +++ b/src/gui/editem.h @@ -2,7 +2,7 @@ /* OpenIDA - Outil d'analyse de fichiers binaires * editem.h - prototypes pour la gestion des différents éléments réactifs de l'éditeurs * - * Copyright (C) 2010-2011 Cyrille Bagard + * Copyright (C) 2010-2012 Cyrille Bagard * * This file is part of OpenIDA. * @@ -58,6 +58,9 @@ GType g_editor_item_get_type(void); /* Fournit le composant GTK associé à l'élément réactif. */ GtkWidget *g_editor_item_get_widget(const GEditorItem *); +/* Fournit l'affichage de binaire courant. */ +GtkViewPanel *g_editor_item_get_current_view(const GEditorItem *); + /* ---------------------------- MANIPULATION D'ENSEMBLES ---------------------------- */ diff --git a/src/gui/menus/menubar.c b/src/gui/menus/menubar.c index 62a3cbe..a847d40 100644 --- a/src/gui/menus/menubar.c +++ b/src/gui/menus/menubar.c @@ -38,6 +38,11 @@ struct _GMenuBar { GEditorItem parent; /* A laisser en premier */ + GtkWidget *file; /* Menu "Fichier" */ + GtkWidget *view; /* Menu "Affichage" */ + GtkWidget *debug; /* Menu "Débogage" */ + GtkWidget *help; /* Menu "Aide" */ + }; @@ -55,6 +60,9 @@ static void g_menu_bar_class_init(GMenuBarClass *); /* Initialise une instance de la barre de menus pour l'éditeur. */ static void g_menu_bar_init(GMenuBar *); +/* Lance une actualisation du fait d'un changement de vue. */ +static void update_menu_bar_for_view(GMenuBar *, GtkViewPanel *); + /* Indique le type défini pour la barre de menus de la fenêtre principale. */ @@ -102,6 +110,8 @@ static void g_menu_bar_init(GMenuBar *bar) item->widget = gtk_menu_bar_new(); gtk_widget_show(item->widget); + item->update_view = (update_item_view_fc)update_menu_bar_for_view; + } @@ -122,7 +132,6 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup) { GMenuBar *result; /* Structure à retourner */ GEditorItem *item; /* Autre version de l'élément */ - GtkWidget *menuitem; /* Elément de menu */ result = g_object_new(G_TYPE_MENU_BAR, NULL); @@ -135,24 +144,44 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup) /* Fichier */ - menuitem = build_menu_file(ref, accgroup); - gtk_container_add(GTK_CONTAINER(item->widget), menuitem); + result->file = build_menu_file(ref, accgroup); + gtk_container_add(GTK_CONTAINER(item->widget), result->file); /* Affichage */ - menuitem = build_menu_view(ref, accgroup); - gtk_container_add(GTK_CONTAINER(item->widget), menuitem); + result->view = build_menu_view(ref, accgroup, result); + gtk_container_add(GTK_CONTAINER(item->widget), result->view); /* Débogage */ - menuitem = build_menu_debug(ref, accgroup); - gtk_container_add(GTK_CONTAINER(item->widget), menuitem); + result->debug = build_menu_debug(ref, accgroup); + gtk_container_add(GTK_CONTAINER(item->widget), result->debug); /* Aide */ - menuitem = build_menu_help(ref, accgroup); - gtk_container_add(GTK_CONTAINER(item->widget), menuitem); + result->help = build_menu_help(ref, accgroup); + gtk_container_add(GTK_CONTAINER(item->widget), result->help); return G_EDITOR_ITEM(result); } + + +/****************************************************************************** +* * +* Paramètres : bar = barre de menus à actualiser. * +* view = nouveau panneau d'affichage actif. * +* * +* Description : Lance une actualisation du fait d'un changement de vue. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void update_menu_bar_for_view(GMenuBar *bar, GtkViewPanel *view) +{ + update_menu_view_for_view(bar->view, view, bar); + +} diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c index d68ffa4..85e65f7 100644 --- a/src/gui/menus/view.c +++ b/src/gui/menus/view.c @@ -33,10 +33,10 @@ /* Réagit avec le menu "Affichage -> Adresse virtuelle". */ -void mcb_view_vaddress(GtkCheckMenuItem *, gpointer); +static void mcb_view_addresses(GtkCheckMenuItem *, GMenuBar *); /* Réagit avec le menu "Affichage -> code binaire". */ -void mcb_view_code(GtkCheckMenuItem *, gpointer); +static void mcb_view_code(GtkCheckMenuItem *, GMenuBar *); @@ -44,6 +44,7 @@ void mcb_view_code(GtkCheckMenuItem *, gpointer); * * * Paramètres : ref = espace de référencement global. * * accgroup = groupe d'accélérateurs pour les menus. * +* bar = barre de menu parente. * * * * Description : Construit le menu "Fichier". * * * @@ -53,7 +54,7 @@ void mcb_view_code(GtkCheckMenuItem *, gpointer); * * ******************************************************************************/ -GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup) +GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) { GtkWidget *result; /* Support à retourner */ GtkWidget *menubar; /* Support pour éléments */ @@ -68,10 +69,12 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup) submenuitem = qck_create_menu_separator(); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - submenuitem = qck_create_check_menu_item(NULL, NULL, _("Virtual address"), G_CALLBACK(mcb_view_vaddress), result); + submenuitem = qck_create_check_menu_item(G_OBJECT(result), "addr", _("Virtual address"), + G_CALLBACK(mcb_view_addresses), bar); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - submenuitem = qck_create_check_menu_item(NULL, NULL, _("Binary code"), G_CALLBACK(mcb_view_code), result); + submenuitem = qck_create_check_menu_item(G_OBJECT(result), "code", _("Binary code"), + G_CALLBACK(mcb_view_code), bar); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_menu_separator(); @@ -84,8 +87,52 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup) /****************************************************************************** * * +* Paramètres : widget = menu principal à actualiser. * +* view = nouveau panneau d'affichage actif. * +* bar = barre de menu parente. * +* * +* Description : Lance une actualisation du fait d'un changement de vue. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void update_menu_view_for_view(GtkWidget *widget, GtkViewPanel *view, GMenuBar *bar) +{ + GtkWidget *submenuitem; /* Sous-élément de menu */ + bool status; /* Consigne d'affichage */ + + /* Adresses virtuelles */ + + submenuitem = g_object_get_data(G_OBJECT(widget), "addr"); + + g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_addresses), bar); + + status = gtk_view_panel_get_addresses_display(view); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); + + g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_addresses), bar); + + /* Code binaire */ + + submenuitem = g_object_get_data(G_OBJECT(widget), "code"); + + g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_code), bar); + + status = gtk_view_panel_get_code_display(view); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); + + g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_code), bar); + +} + + +/****************************************************************************** +* * * Paramètres : menuitem = élément de menu ayant basculé. * -* data = adresse de l'espace de référencement global. * +* bar = barre de menu parente. * * * * Description : Réagit avec le menu "Affichage -> Adresse virtuelle". * * * @@ -95,27 +142,23 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup) * * ******************************************************************************/ -void mcb_view_vaddress(GtkCheckMenuItem *menuitem, gpointer data) +static void mcb_view_addresses(GtkCheckMenuItem *menuitem, GMenuBar *bar) { -#if 0 - GtkBinView *binview; /* Zone de code principale */ + GtkViewPanel *panel; /* Affichage courant */ gboolean active; /* Etat de sélection du menu */ - /* FIXME : "binview" -> "current_view" */ - return; - - binview = GTK_BIN_VIEW(g_object_get_data(G_OBJECT(data), "binview")); + panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); active = gtk_check_menu_item_get_active(menuitem); - gtk_binview_show_vaddress(binview, active); -#endif + gtk_view_panel_set_addresses_display(panel, active); + } /****************************************************************************** * * * Paramètres : menuitem = élément de menu ayant basculé. * -* data = adresse de l'espace de référencement global. * +* bar = barre de menu parente. * * * * Description : Réagit avec le menu "Affichage -> code binaire". * * * @@ -125,18 +168,14 @@ void mcb_view_vaddress(GtkCheckMenuItem *menuitem, gpointer data) * * ******************************************************************************/ -void mcb_view_code(GtkCheckMenuItem *menuitem, gpointer data) +static void mcb_view_code(GtkCheckMenuItem *menuitem, GMenuBar *bar) { -#if 0 - GtkBinView *binview; /* Zone de code principale */ + GtkViewPanel *panel; /* Affichage courant */ gboolean active; /* Etat de sélection du menu */ - /* FIXME : "binview" -> "current_view" */ - return; - - binview = GTK_BIN_VIEW(g_object_get_data(G_OBJECT(data), "binview")); + panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); active = gtk_check_menu_item_get_active(menuitem); - gtk_binview_show_code(binview, active); -#endif + gtk_view_panel_set_code_display(panel, active); + } diff --git a/src/gui/menus/view.h b/src/gui/menus/view.h index 4da6a11..2bdc9b6 100644 --- a/src/gui/menus/view.h +++ b/src/gui/menus/view.h @@ -29,9 +29,15 @@ #include +#include "menubar.h" + + /* Construit le menu "Fichier". */ -GtkWidget *build_menu_view(GObject *, GtkAccelGroup *); +GtkWidget *build_menu_view(GObject *, GtkAccelGroup *, GMenuBar *); + +/* Lance une actualisation du fait d'un changement de vue. */ +void update_menu_view_for_view(GtkWidget *, GtkViewPanel *, GMenuBar *); diff --git a/src/gui/panels/panel.c b/src/gui/panels/panel.c index 8cc79ce..584ec09 100644 --- a/src/gui/panels/panel.c +++ b/src/gui/panels/panel.c @@ -37,10 +37,14 @@ -/* Support de fond pour les composants */ +/* Support de fond pour les composants. */ static GtkWidget *_support; -/* Liste des panneaux en place */ +/* Procédure à appeler lors des changements de panneaux. */ +static GCallback _handler; +static gpointer _data; + +/* Liste des panneaux en place. */ static GPanelItem *_panels_list = NULL; @@ -261,6 +265,7 @@ void g_panel_item_dock(GPanelItem *item) gtk_container_add(GTK_CONTAINER(_support), GTK_WIDGET(class->first)); station = gtk_dock_station_new(); + g_signal_connect(station, "switch-widget", _handler, _data); gtk_widget_show(station); gtk_container_add(GTK_CONTAINER(class->first), station); @@ -425,6 +430,8 @@ static void create_panel_division(GtkWidget *parent, GtkWidget *child1, const ch if (!GTK_IS_DOCK_STATION(child1)) { station = gtk_dock_station_new(); + g_signal_connect(station, "switch-widget", _handler, _data); + gtk_widget_show(station); gtk_dock_panel_add_widget(GTK_DOCK_STATION(station), child1, name1); @@ -435,6 +442,8 @@ static void create_panel_division(GtkWidget *parent, GtkWidget *child1, const ch if (!GTK_IS_DOCK_STATION(child2)) { station = gtk_dock_station_new(); + g_signal_connect(station, "switch-widget", _handler, _data); + gtk_widget_show(station); gtk_dock_panel_add_widget(GTK_DOCK_STATION(station), child2, name2); @@ -609,7 +618,8 @@ static void _g_panel_item_dock(GtkWidget *base, GEditorItem *item, const char *p /****************************************************************************** * * -* Paramètres : - * +* Paramètres : handler = procédure à réveiller en cas de changements. * +* data = donnée à faire suivre. * * * * Description : Prépare le terrain pour l'affichage central. * * * @@ -619,7 +629,7 @@ static void _g_panel_item_dock(GtkWidget *base, GEditorItem *item, const char *p * * ******************************************************************************/ -GtkWidget *init_panels2(void) +GtkWidget *init_panels2(GCallback handler, gpointer data) { GtkWidget *result; /* Support à retourner */ @@ -627,6 +637,8 @@ GtkWidget *init_panels2(void) gtk_widget_show(result); _support = result; + _handler = handler; + _data = data; return result; diff --git a/src/gui/panels/panel.h b/src/gui/panels/panel.h index afdce93..dd9ae5e 100644 --- a/src/gui/panels/panel.h +++ b/src/gui/panels/panel.h @@ -63,7 +63,7 @@ void g_panel_item_dock(GPanelItem *); /* Prépare le terrain pour l'affichage central. */ -GtkWidget *init_panels2(void); +GtkWidget *init_panels2(GCallback, gpointer); /* Charge les principaux panneaux de l'éditeur. */ void load_main_panels(void); -- cgit v0.11.2-87-g4458