summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2012-01-16 01:29:18 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2012-01-16 01:29:18 (GMT)
commitd487ea54850c85ea22df22af3b21b57d9ad0fd2f (patch)
treee84eefa64d8845cb97ca98c95cc9acf713ccfcf8 /src/gui
parent725304423eccf57b8e829542670b5abe7b00eeb4 (diff)
Updated menus on view change.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@227 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/editem.c23
-rw-r--r--src/gui/editem.h5
-rw-r--r--src/gui/menus/menubar.c47
-rw-r--r--src/gui/menus/view.c89
-rw-r--r--src/gui/menus/view.h8
-rw-r--r--src/gui/panels/panel.c20
-rw-r--r--src/gui/panels/panel.h2
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);