summaryrefslogtreecommitdiff
path: root/src/editor.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2009-09-13 23:11:24 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2009-09-13 23:11:24 (GMT)
commit1c4da24a1d4b96d58fee08e2be21198b22e7eef6 (patch)
treea0723bd1948395413fa5a7a37a9405567e32c015 /src/editor.c
parent18134387d5cb025703af8e1d07e0152784e31efc (diff)
Improved the editor window refreshing when several binaries are loaded.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@114 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/editor.c')
-rw-r--r--src/editor.c129
1 files changed, 117 insertions, 12 deletions
diff --git a/src/editor.c b/src/editor.c
index c026426..942e6f4 100644
--- a/src/editor.c
+++ b/src/editor.c
@@ -45,10 +45,11 @@
#include "gtkext/easygtk.h"
#include "gtkext/gtkextstatusbar.h"
#include "gtkext/gtkbinview.h"
+#include "gtkext/gtkblockview.h"
#include "gtkext/gtkdockpanel.h"
#include "debug/debuggers.h"
-#include "panel/panels.h"
+#include "panels/panel.h"
@@ -135,11 +136,11 @@ void update_debug_menu_items(GObject *, gboolean);
+/* Réagit au changement d'onglet d'un panneau quelconque. */
+static void on_dock_item_switch(GtkDockPanel *, GtkDockItem *, GObject *);
-
-
-
-
+/* Met en concordance les menus avec l'édition courante. */
+static void refresh_editor_menus(GObject *, GOpenidaBinary *, GtkBinView *);
@@ -267,13 +268,13 @@ GtkWidget *create_editor(void)
menubar = gtk_menu_new();
gtk_menu_item_set_submenu(GTK_MENU_ITEM(menuitem), menubar);
- submenuitem = qck_create_radio_menu_item(NULL, NULL, NULL, _("Text view"), G_CALLBACK(mcb_view_change_support), result);
+ submenuitem = qck_create_radio_menu_item(ref, "textview", NULL, _("Text view"), G_CALLBACK(mcb_view_change_support), result);
g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_BLOCK));
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem));
- submenuitem = qck_create_radio_menu_item(NULL, NULL, rgroup, _("Graph view"), G_CALLBACK(mcb_view_change_support), result);
+ submenuitem = qck_create_radio_menu_item(ref, "graphview", rgroup, _("Graph view"), G_CALLBACK(mcb_view_change_support), result);
g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_GRAPH));
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -383,6 +384,12 @@ GtkWidget *create_editor(void)
g_object_set_data(G_OBJECT(result), "binpanel", dpanel);
gtk_widget_show(dpanel);
+
+
+ g_signal_connect(dpanel, "switch-item", G_CALLBACK(on_dock_item_switch), ref);
+
+
+
gtk_paned_pack1(GTK_PANED(hpaned1), dpanel, TRUE, TRUE);
#if 0
@@ -440,11 +447,13 @@ GtkWidget *create_editor(void)
dpanel = gtk_dock_panel_new();
gtk_widget_show(dpanel);
+ g_signal_connect(dpanel, "switch-item", G_CALLBACK(on_dock_item_switch), ref);
+
gtk_paned_pack2(GTK_PANED(hpaned1), dpanel, TRUE, TRUE);
- ditem = gtk_dock_item_new(_("Symbols"), get_panel(PNT_SYMBOLS));
- gtk_dock_panel_add_item(dpanel, ditem);
+ place_all_panels_in_editor(dpanel);
+
ditem = gtk_dock_item_new(_("Registers"), get_panel(PNT_REGISTERS));
gtk_dock_panel_add_item(dpanel, ditem);
@@ -452,8 +461,6 @@ GtkWidget *create_editor(void)
-
-
/* Panneau inférieur */
@@ -785,7 +792,9 @@ void mcb_view_change_support(GtkRadioMenuItem *menuitem, GObject *ref)
title = g_openida_binary_to_string(binary);
ditem = gtk_dock_panel_item_from_name(dpanel, strrchr(title, '/') + 1);
- gtk_dock_panel_replace_item_content(dpanel, ditem, panel);
+ gtk_dock_item_set_panel(ditem, panel);
+
+ notify_panels_of_view_change(binview, true);
}
@@ -1223,3 +1232,99 @@ void update_debug_menu_items(GObject *ref, gboolean stopped)
gtk_widget_set_sensitive(submenuitem, stopped);
}
+
+
+
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : panel = panneau de support des éléments concerné. *
+* item = nouvel élément présenté à l'affichage. *
+* ref = adresse de l'espace de référencement global. *
+* *
+* Description : Réagit au changement d'onglet d'un panneau quelconque. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void on_dock_item_switch(GtkDockPanel *panel, GtkDockItem *item, GObject *ref)
+{
+ GtkWidget *widget; /* Support réel à traiter */
+ GOpenidaBinary *binary; /* Binaire en cours d'édition */
+
+ widget = gtk_dock_item_get_panel(item);
+
+ if (GTK_IS_SCROLLED_WINDOW(widget))
+ widget = gtk_bin_get_child(GTK_BIN(widget));
+
+ if (GTK_IS_VIEWPORT(widget))
+ widget = gtk_bin_get_child(GTK_BIN(widget));
+
+ if (GTK_IS_BIN_VIEW(widget))
+ {
+ binary = gtk_bin_view_get_binary(GTK_BIN_VIEW(widget));
+
+ g_object_set_data(ref, "current_binary", binary);
+ g_object_set_data(ref, "binview", widget);
+
+ refresh_editor_menus(ref, binary, GTK_BIN_VIEW(widget));
+
+ notify_panels_of_view_change(GTK_BIN_VIEW(widget), false);
+
+ }
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ref = adresse de l'espace de référencement global. *
+* binary = représentation de contenu binaire active. *
+* view = type de visualisation courante. *
+* *
+* Description : Met en concordance les menus avec l'édition courante. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void refresh_editor_menus(GObject *ref, GOpenidaBinary *binary, GtkBinView *view)
+{
+ GtkCheckMenuItem *menuitem; /* Menu à coche à traiter */
+
+ /* Affichage : type de vue */
+
+ menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "textview"));
+ g_signal_handlers_disconnect_by_func(menuitem, G_CALLBACK(mcb_view_change_support), ref);
+
+ menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "graphview"));
+ g_signal_handlers_disconnect_by_func(menuitem, G_CALLBACK(mcb_view_change_support), ref);
+
+ if (GTK_IS_BLOCK_VIEW(view))
+ {
+ menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "textview"));
+ gtk_check_menu_item_set_active(menuitem, TRUE);
+ }
+ else
+ {
+ menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "graphview"));
+ gtk_check_menu_item_set_active(menuitem, TRUE);
+ }
+
+ menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "textview"));
+ g_signal_connect(menuitem, "toggled", G_CALLBACK(mcb_view_change_support), ref);
+
+ menuitem = GTK_CHECK_MENU_ITEM(g_object_get_data(ref, "graphview"));
+ g_signal_connect(menuitem, "toggled", G_CALLBACK(mcb_view_change_support), ref);
+
+}