diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/editem.c | 23 | ||||
-rw-r--r-- | src/gui/editem.h | 5 | ||||
-rw-r--r-- | src/gui/menus/menubar.c | 47 | ||||
-rw-r--r-- | src/gui/menus/view.c | 89 | ||||
-rw-r--r-- | src/gui/menus/view.h | 8 | ||||
-rw-r--r-- | src/gui/panels/panel.c | 20 | ||||
-rw-r--r-- | src/gui/panels/panel.h | 2 |
7 files changed, 151 insertions, 43 deletions
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 <gtk/gtk.h> +#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); |