summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2018-07-16 20:11:21 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2018-07-16 20:11:21 (GMT)
commitf6e56cebfa878dd32a2405fd0c916a40140a1ff0 (patch)
tree3e364d2e2b2de19b85ab6d14f856d4b8db11737a /src/gui
parente0d03e3eddb9d240cc21ac1b7a7ade915fd17942 (diff)
Applied a new GUI update with the new loaded panels features.
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/core/global.c103
-rw-r--r--src/gui/core/global.h22
-rw-r--r--src/gui/core/items.c158
-rw-r--r--src/gui/core/items.h10
-rw-r--r--src/gui/editem-int.h28
-rw-r--r--src/gui/editem.c116
-rw-r--r--src/gui/editem.h29
-rw-r--r--src/gui/editor.c25
-rw-r--r--src/gui/menus/binary.c32
-rw-r--r--src/gui/menus/binary.h6
-rw-r--r--src/gui/menus/edition.c289
-rw-r--r--src/gui/menus/edition.h7
-rw-r--r--src/gui/menus/menubar.c69
-rw-r--r--src/gui/menus/view.c14
-rw-r--r--src/gui/menus/view.h6
-rw-r--r--src/gui/panels/bintree.c18
-rw-r--r--src/gui/panels/bookmarks.c35
-rw-r--r--src/gui/panels/errors.c18
-rw-r--r--src/gui/panels/glance.c50
-rw-r--r--src/gui/panels/history.c19
-rw-r--r--src/gui/panels/panel-int.h1
-rw-r--r--src/gui/panels/strings.c25
-rw-r--r--src/gui/panels/symbols.c38
-rw-r--r--src/gui/status.c52
-rw-r--r--src/gui/tb/portions.c33
25 files changed, 669 insertions, 534 deletions
diff --git a/src/gui/core/global.c b/src/gui/core/global.c
index 89a2d90..30dc174 100644
--- a/src/gui/core/global.c
+++ b/src/gui/core/global.c
@@ -31,21 +31,16 @@ static GtkWindow *_editor = NULL;
/* Barre de statut principale */
static GtkStatusStack *_status = NULL;
-/* Binaire en cours d'étude ou NULL */
-static GLoadedBinary *_current_binary = NULL;
+/* Contenu en cours d'étude ou NULL */
+static GLoadedContent *_current_content = NULL;
-G_LOCK_DEFINE_STATIC(_cb_mutex);
+G_LOCK_DEFINE_STATIC(_cc_mutex);
/* Suivi du panneau d'affichage courant ou NULL */
static GLoadedPanel *_current_view = NULL;
G_LOCK_DEFINE_STATIC(_cv_mutex);
-/* Suivi des changements de position ou NULL */
-static GObject *_caret_instance = NULL;
-
-G_LOCK_DEFINE_STATIC(_ci_mutex);
-
/******************************************************************************
@@ -145,9 +140,9 @@ GtkStatusStack *get_global_status(void)
/******************************************************************************
* *
-* Paramètres : binary = instance de binaire chargé. *
+* Paramètres : content = instance de contenu chargé. *
* *
-* Description : Définit le binaire actif en cours d'étude. *
+* Description : Définit le contenu actif en cours d'étude. *
* *
* Retour : - *
* *
@@ -155,16 +150,16 @@ GtkStatusStack *get_global_status(void)
* *
******************************************************************************/
-void set_current_binary(GLoadedBinary *binary)
+void set_current_content(GLoadedContent *content)
{
- G_LOCK(_cb_mutex);
+ G_LOCK(_cc_mutex);
- if (_current_binary != NULL)
- g_object_unref(G_OBJECT(_current_binary));
+ if (_current_content != NULL)
+ g_object_unref(G_OBJECT(_current_content));
- _current_binary = binary;
+ _current_content = content;
- G_UNLOCK(_cb_mutex);
+ G_UNLOCK(_cc_mutex);
}
@@ -173,26 +168,26 @@ void set_current_binary(GLoadedBinary *binary)
* *
* Paramètres : - *
* *
-* Description : Fournit le binaire actif en cours d'étude. *
+* Description : Fournit le contenu actif en cours d'étude. *
* *
-* Retour : Instance courante de binaire étudié ou NULL. *
+* Retour : Instance courante de contenu étudié ou NULL. *
* *
* Remarques : - *
* *
******************************************************************************/
-GLoadedBinary *get_current_binary(void)
+GLoadedContent *get_current_content(void)
{
- GLoadedBinary *result; /* Instance à retourner */
+ GLoadedContent *result; /* Instance à retourner */
- G_LOCK(_cb_mutex);
+ G_LOCK(_cc_mutex);
- result = _current_binary;
+ result = _current_content;
if (result != NULL)
g_object_ref(G_OBJECT(result));
- G_UNLOCK(_cb_mutex);
+ G_UNLOCK(_cc_mutex);
return result;
@@ -201,9 +196,9 @@ GLoadedBinary *get_current_binary(void)
/******************************************************************************
* *
-* Paramètres : view = représentation courante de binaire. *
+* Paramètres : view = représentation courante de contenu. *
* *
-* Description : Définit l'affichage de binaire courant. *
+* Description : Définit l'affichage de contenu courant. *
* *
* Retour : - *
* *
@@ -229,7 +224,7 @@ void set_current_view(GLoadedPanel *view)
* *
* Paramètres : - *
* *
-* Description : Fournit l'affichage de binaire courant. *
+* Description : Fournit l'affichage de contenu courant. *
* *
* Retour : Instance en place ou NULL si aucune. *
* *
@@ -253,59 +248,3 @@ GLoadedPanel *get_current_view(void)
return result;
}
-
-
-/******************************************************************************
-* *
-* Paramètres : caret = instance graphique à mémoriser. *
-* *
-* Description : Définit le support contenant la position active. *
-* *
-* Retour : - *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-void set_caret_instance(GObject *caret)
-{
- G_LOCK(_ci_mutex);
-
- if (_caret_instance != NULL)
- g_object_unref(_caret_instance);
-
- _caret_instance = caret;
-
- G_UNLOCK(_ci_mutex);
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : - *
-* *
-* Description : Fournit le support contenant la position active. *
-* *
-* Retour : Instance en place ou NULL si aucune. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-GObject *get_caret_instance(void)
-{
- GObject *result; /* Instance à retourner */
-
- G_LOCK(_ci_mutex);
-
- result = _caret_instance;
-
- if (result != NULL)
- g_object_ref(result);
-
- G_UNLOCK(_ci_mutex);
-
- return result;
-
-}
diff --git a/src/gui/core/global.h b/src/gui/core/global.h
index 5e9d902..ee66399 100644
--- a/src/gui/core/global.h
+++ b/src/gui/core/global.h
@@ -1,5 +1,5 @@
-/* Chrysalide - Outil d'analyse de fichiers binaires
+/* Chrysalide - Outil d'analyse de fichiers contenus
* global.h - prototypes pour la conservation de variables globales à vocation graphique
*
* Copyright (C) 2016-2017 Cyrille Bagard
@@ -25,7 +25,7 @@
#define _GUI_CORE_GLOBAL_H
-#include "../../analysis/binary.h"
+#include "../../analysis/loaded.h"
#include "../../glibext/gloadedpanel.h"
#include "../../gtkext/gtkstatusstack.h"
@@ -46,24 +46,18 @@ void set_global_status(GtkStatusStack *);
/* Fournit l'adresse de la barre de statut principale. */
GtkStatusStack *get_global_status(void);
-/* Définit le binaire actif en cours d'étude. */
-void set_current_binary(GLoadedBinary *);
+/* Définit le contenu actif en cours d'étude. */
+void set_current_content(GLoadedContent *);
-/* Fournit le binaire actif en cours d'étude. */
-GLoadedBinary *get_current_binary(void);
+/* Fournit le contenu actif en cours d'étude. */
+GLoadedContent *get_current_content(void);
-/* Définit l'affichage de binaire courant. */
+/* Définit l'affichage de contenu courant. */
void set_current_view(GLoadedPanel *);
-/* Fournit l'affichage de binaire courant. */
+/* Fournit l'affichage de contenu courant. */
GLoadedPanel *get_current_view(void);
-/* Définit le support contenant la position active. */
-void set_caret_instance(GObject *);
-
-/* Fournit le support contenant la position active. */
-GObject *get_caret_instance(void);
-
#endif /* _GUI_CORE_GLOBAL_H */
diff --git a/src/gui/core/items.c b/src/gui/core/items.c
index a25d1b9..ad2de2c 100644
--- a/src/gui/core/items.c
+++ b/src/gui/core/items.c
@@ -34,14 +34,11 @@
static GEditorItem *_editem_list = NULL;
-/* Suit les changements de focus des panneaux d'affichage. */
-static gboolean notify_view_panel_focus_change(GLoadedPanel *, GdkEventFocus *, gpointer);
-
/* Lance une procédure de déplacement de la position courante. */
static void start_moving_to_cursor_in_loaded_panel(GLoadedPanel *, const GLineCursor *, gboolean, gpointer);
/* Suit les changements de position dans du code d'assembleur. */
-static void track_caret_address_on_view_panel(GtkDisplayPanel *, const vmpa2t *, gpointer);
+static void track_cursor_on_view_panel(GLoadedPanel *, const GLineCursor *, gpointer);
@@ -66,9 +63,9 @@ void register_editor_item(GEditorItem *item)
/******************************************************************************
* *
-* Paramètres : binary = nouvelle instance de binaire analysé. *
+* Paramètres : content = nouvelle instance de contenu analysé. *
* *
-* Description : Lance une actualisation du fait d'un changement de binaire. *
+* Description : Lance une actualisation du fait d'un changement de contenu. *
* *
* Retour : - *
* *
@@ -76,49 +73,26 @@ void register_editor_item(GEditorItem *item)
* *
******************************************************************************/
-void change_editor_items_current_binary(GLoadedBinary *binary)
+void change_editor_items_current_content(GLoadedContent *content)
{
+ GLoadedContent *old; /* Ancien contenu */
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
- set_current_binary(binary);
+ old = get_current_content();
- editem_list_for_each(iter, _editem_list)
+ if (content != old)
{
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->update_binary != NULL)
- klass->update_binary(iter, binary);
-
- }
-
-}
-
-
-/******************************************************************************
-* *
-* Paramètres : panel = composant d'affichage concerné par l'opération. *
-* event = informations liées à l'événement. *
-* unused = adresse non utilisée ici. *
-* *
-* Description : Suit les changements de focus des panneaux d'affichage. *
-* *
-* Retour : FALSE pour continuer la propagation. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
+ set_current_content(content);
-static gboolean notify_view_panel_focus_change(GLoadedPanel *panel, GdkEventFocus *event, gpointer unused)
-{
- GEditorItem *iter; /* Boucle de parcours */
+ editem_list_for_each(iter, _editem_list)
+ {
+ g_editor_item_change_content(iter, old, content);
+ }
- editem_list_for_each(iter, _editem_list)
- {
- notify_focus_change_for_editor_item(iter, event->in ? panel : NULL);
}
- return FALSE;
+ if (old != NULL)
+ g_object_unref(G_OBJECT(old));
}
@@ -157,7 +131,7 @@ static void start_moving_to_cursor_in_loaded_panel(GLoadedPanel *panel, const GL
}
else
- gtk_display_panel_scroll_to_cursor(panel, cursor, SPT_CENTER);
+ g_loaded_panel_scroll_to_cursor(panel, cursor, SPT_CENTER, true);
if (src != NULL)
g_object_unref(G_OBJECT(src));
@@ -168,7 +142,7 @@ static void start_moving_to_cursor_in_loaded_panel(GLoadedPanel *panel, const GL
/******************************************************************************
* *
* Paramètres : panel = composant d'affichage parcouru. *
-* addr = nouvelle adresse du curseur courant. *
+* cursor = nouvel emplacement du curseur courant. *
* unused = adresse non utilisée ici. *
* *
* Description : Suit les changements de position dans du code d'assembleur. *
@@ -179,18 +153,13 @@ static void start_moving_to_cursor_in_loaded_panel(GLoadedPanel *panel, const GL
* *
******************************************************************************/
-static void track_caret_address_on_view_panel(GtkDisplayPanel *panel, const vmpa2t *addr, gpointer unused)
+static void track_cursor_on_view_panel(GLoadedPanel *panel, const GLineCursor *cursor, gpointer unused)
{
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
editem_list_for_each(iter, _editem_list)
{
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->track_caret != NULL)
- klass->track_caret(iter, panel, addr);
-
+ g_editor_item_track_cursor(iter, panel, cursor);
}
}
@@ -210,59 +179,32 @@ static void track_caret_address_on_view_panel(GtkDisplayPanel *panel, const vmpa
void change_editor_items_current_view(GLoadedPanel *panel)
{
- GLoadedPanel *view; /* Affichage actif */
+ GLoadedPanel *old; /* Ancien affichage */
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
- GObject *caret; /* Support du curseur actif */
/* Suivi des affichages */
- view = get_current_view();
+ old = get_current_view();
- if (view != NULL)
+ if (panel != old)
{
- g_signal_handlers_disconnect_by_func(view, G_CALLBACK(notify_view_panel_focus_change), NULL);
- g_signal_handlers_disconnect_by_func(view, G_CALLBACK(notify_view_panel_focus_change), NULL);
+ set_current_view(panel);
- g_object_unref(view);
-
- }
-
- set_current_view(panel);
-
- editem_list_for_each(iter, _editem_list)
- {
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->update_view != NULL)
- klass->update_view(iter, panel);
-
- }
-
- if (panel != NULL)
- {
- g_signal_connect(panel, "focus-in-event", G_CALLBACK(notify_view_panel_focus_change), NULL);
- g_signal_connect(panel, "focus-out-event", G_CALLBACK(notify_view_panel_focus_change), NULL);
- }
+ editem_list_for_each(iter, _editem_list)
+ {
+ g_editor_item_change_view(iter, old, panel);
+ }
- /* Suivi du curseur */
+ /* Suivi du curseur */
- if (GTK_IS_DISPLAY_PANEL(panel))
- {
- caret = get_caret_instance();
-
- if (caret != NULL)
+ if (old != NULL)
{
- g_signal_handlers_disconnect_by_func(caret,
+ g_signal_handlers_disconnect_by_func(old,
G_CALLBACK(start_moving_to_cursor_in_loaded_panel),
NULL);
- g_signal_handlers_disconnect_by_func(caret,
- G_CALLBACK(track_caret_address_on_view_panel),
+ g_signal_handlers_disconnect_by_func(old,
+ G_CALLBACK(track_cursor_on_view_panel),
NULL);
-
- set_caret_instance(NULL);
- g_object_unref(caret);
-
}
if (panel != NULL)
@@ -271,19 +213,16 @@ void change_editor_items_current_view(GLoadedPanel *panel)
G_CALLBACK(start_moving_to_cursor_in_loaded_panel),
NULL);
- g_signal_connect(panel, "caret-moved",
- G_CALLBACK(track_caret_address_on_view_panel),
+ g_signal_connect(panel, "cursor-moved",
+ G_CALLBACK(track_cursor_on_view_panel),
NULL);
-
- caret = G_OBJECT(panel);
-
- g_object_ref(caret);
- set_caret_instance(caret);
-
}
}
+ if (old != NULL)
+ g_object_unref(G_OBJECT(old));
+
}
@@ -299,18 +238,13 @@ void change_editor_items_current_view(GLoadedPanel *panel)
* *
******************************************************************************/
-void change_editor_items_current_view_content(GLoadedPanel *panel)
+void update_editor_items_current_view(GLoadedPanel *panel)
{
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
editem_list_for_each(iter, _editem_list)
{
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->update_content != NULL)
- klass->update_content(iter, panel);
-
+ g_editor_item_update_view(iter, panel);
}
}
@@ -318,9 +252,9 @@ void change_editor_items_current_view_content(GLoadedPanel *panel)
/******************************************************************************
* *
-* Paramètres : binary = binaire contenant l'adresse à représenter. *
-* addr = adresse mémoire à mettre en avant. *
-* source = composant à l'origine du changement. *
+* Paramètres : content = contenu contenant le curseur à représenter. *
+* cursor = nouvel emplacement du curseur courant. *
+* source = composant à l'origine du changement. *
* *
* Description : Concentre l'attention de l'ensemble sur une adresse donnée. *
* *
@@ -330,18 +264,14 @@ void change_editor_items_current_view_content(GLoadedPanel *panel)
* *
******************************************************************************/
-void focus_address_in_editor_items(GLoadedBinary *binary, const vmpa2t *addr, GEditorItem *source)
+void focus_cursor_in_editor_items(GLoadedContent *content, const GLineCursor *cursor, GEditorItem *source)
{
GEditorItem *iter; /* Boucle de parcours */
- GEditorItemClass *klass; /* Classe correspondante */
editem_list_for_each(iter, _editem_list)
{
- klass = G_EDITOR_ITEM_GET_CLASS(iter);
-
- if (klass->focus_addr != NULL && iter != source)
- klass->focus_addr(iter, binary, addr);
-
+ if (iter != source)
+ g_editor_item_focus_cursor(iter, content, cursor);
}
}
diff --git a/src/gui/core/items.h b/src/gui/core/items.h
index a738ac9..86350c7 100644
--- a/src/gui/core/items.h
+++ b/src/gui/core/items.h
@@ -26,7 +26,7 @@
#include "../editem.h"
-#include "../../analysis/binary.h"
+#include "../../analysis/loaded.h"
#include "../../analysis/project.h"
#include "../../glibext/gloadedpanel.h"
@@ -35,17 +35,17 @@
/* Procède à l'enregistrement d'un élément reactif de l'éditeur. */
void register_editor_item(GEditorItem *);
-/* Lance une actualisation du fait d'un changement de binaire. */
-void change_editor_items_current_binary(GLoadedBinary *);
+/* Lance une actualisation du fait d'un changement de contenu. */
+void change_editor_items_current_content(GLoadedContent *);
/* Lance une actualisation du fait d'un changement de vue. */
void change_editor_items_current_view(GLoadedPanel *);
/* Lance une actualisation du fait d'un changement de contenu. */
-void change_editor_items_current_view_content(GLoadedPanel *);
+void update_editor_items_current_view(GLoadedPanel *);
/* Concentre l'attention de l'ensemble sur une adresse donnée. */
-void focus_address_in_editor_items(GLoadedBinary *, const vmpa2t *, GEditorItem *);
+void focus_cursor_in_editor_items(GLoadedContent *, const GLineCursor *, GEditorItem *);
/* Lance une actualisation relative à l'étendue du projet. */
void update_project_area(GStudyProject *);
diff --git a/src/gui/editem-int.h b/src/gui/editem-int.h
index 801e54c..744a55f 100644
--- a/src/gui/editem-int.h
+++ b/src/gui/editem-int.h
@@ -34,24 +34,23 @@
#include "../analysis/project.h"
#include "../common/dllist.h"
-#include "../gtkext/gtkdisplaypanel.h"
-/* Réagit à un changement du binaire courant. */
-typedef void (* update_item_binary_fc) (GEditorItem *, GLoadedBinary *);
+/* Réagit à un changement de contenu chargé en cours d'analyse. */
+typedef void (* change_item_content_fc) (GEditorItem *, GLoadedContent *, GLoadedContent *);
-/* Réagit à un changement d'affichage principal de contenu. */
-typedef void (* update_item_view_fc) (GEditorItem *, GLoadedPanel *);
+/* Réagit à un changement de vue du contenu en cours d'analyse. */
+typedef void (* change_item_view_fc) (GEditorItem *, GLoadedPanel *, GLoadedPanel *);
-/* Réagit à un changement de focus des panneaux d'affichage. */
-typedef void (* notify_focus_change_fc) (GEditorItem *, GLoadedPanel *);
+/* Réagit à une modification de la vue du contenu analysé. */
+typedef void (* update_item_view_fc) (GEditorItem *, GLoadedPanel *);
/* Suit les changements de position dans du code d'assembleur. */
-typedef void (* track_caret_in_view_fc) (GEditorItem *, GtkDisplayPanel *, const vmpa2t *);
+typedef void (* track_cursor_in_view_fc) (GEditorItem *, GLoadedPanel *, const GLineCursor *);
/* Concentre l'attention de l'ensemble sur une adresse donnée. */
-typedef void (* focus_addr_fc) (GEditorItem *, GLoadedBinary *, const vmpa2t *);
+typedef void (* focus_cursor_fc) (GEditorItem *, GLoadedContent *, const GLineCursor *);
/* Lance une actualisation relative à l'étendue du projet. */
typedef void (* update_project_fc) (GEditorItem *, GStudyProject *);
@@ -77,12 +76,11 @@ struct _GEditorItemClass
{
GObjectClass parent; /* A laisser en premier */
- update_item_binary_fc update_binary; /* Changement de binaire */
- update_item_view_fc update_view; /* Rechargement dû à une vue */
- update_item_view_fc update_content; /* Rechargement dû à un contenu*/
- notify_focus_change_fc notify_focus; /* Gain ou perte de focus */
- track_caret_in_view_fc track_caret; /* Suivi des positions */
- focus_addr_fc focus_addr; /* Prête attention à une addr. */
+ change_item_content_fc change_content; /* Changement de contenu */
+ change_item_view_fc change_view; /* Rechargement dû à une vue */
+ update_item_view_fc update_view; /* Rechargement dû à évolutions*/
+ track_cursor_in_view_fc track_cursor; /* Suivi des positions */
+ focus_cursor_fc focus_cursor; /* Prête attention à une addr. */
update_project_fc update_project; /* Actualisation des binaires */
};
diff --git a/src/gui/editem.c b/src/gui/editem.c
index bf3dfa6..ef7cb30 100644
--- a/src/gui/editem.c
+++ b/src/gui/editem.c
@@ -136,10 +136,114 @@ GtkWidget *g_editor_item_get_widget(const GEditorItem *item)
/******************************************************************************
* *
-* Paramètres : bar = instance à actualiser. *
-* panel = composant d'affichage concerné par l'opération. *
+* Paramètres : item = instance à consulter. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
+* *
+* Description : Réagit à un changement de contenu chargé en cours d'analyse. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_editor_item_change_content(GEditorItem *item, GLoadedContent *old, GLoadedContent *new)
+{
+ GEditorItemClass *klass; /* Classe correspondante */
+
+ klass = G_EDITOR_ITEM_GET_CLASS(item);
+
+ if (klass->change_content != NULL)
+ klass->change_content(item, old, new);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = instance à consulter. *
+* old = ancienne vue du contenu chargé analysé. *
+* new = nouvelle vue du contenu chargé analysé. *
+* *
+* Description : Réagit à un changement de vue du contenu en cours d'analyse. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_editor_item_change_view(GEditorItem *item, GLoadedPanel *old, GLoadedPanel *new)
+{
+ GEditorItemClass *klass; /* Classe correspondante */
+
+ klass = G_EDITOR_ITEM_GET_CLASS(item);
+
+ if (klass->change_view != NULL)
+ klass->change_view(item, old, new);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = instance à consulter. *
+* panel = vue du contenu chargé analysé modifiée. *
+* *
+* Description : Réagit à une modification de la vue du contenu analysé. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_editor_item_update_view(GEditorItem *item, GLoadedPanel *panel)
+{
+ GEditorItemClass *klass; /* Classe correspondante */
+
+ klass = G_EDITOR_ITEM_GET_CLASS(item);
+
+ if (klass->update_view != NULL)
+ klass->update_view(item, panel);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = instance à consulter. *
+* panel = composant d'affichage parcouru. *
+* cursor = nouvel emplacement du curseur courant. *
+* *
+* Description : Réagit à une modification de la vue du contenu analysé. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_editor_item_track_cursor(GEditorItem *item, GLoadedPanel *panel, const GLineCursor *cursor)
+{
+ GEditorItemClass *klass; /* Classe correspondante */
+
+ klass = G_EDITOR_ITEM_GET_CLASS(item);
+
+ if (klass->track_cursor != NULL)
+ klass->track_cursor(item, panel, cursor);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : item = instance à consulter. *
+* content = contenu contenant le curseur à représenter. *
+* cursor = nouvel emplacement du curseur courant. *
* *
-* Description : Réagit à un changement de focus des panneaux d'affichage. *
+* Description : Réagit à une modification de la vue du contenu analysé. *
* *
* Retour : - *
* *
@@ -147,13 +251,13 @@ GtkWidget *g_editor_item_get_widget(const GEditorItem *item)
* *
******************************************************************************/
-void notify_focus_change_for_editor_item(GEditorItem *item, GLoadedPanel *panel)
+void g_editor_item_focus_cursor(GEditorItem *item, GLoadedContent *content, const GLineCursor *cursor)
{
GEditorItemClass *klass; /* Classe correspondante */
klass = G_EDITOR_ITEM_GET_CLASS(item);
- if (klass->notify_focus != NULL)
- klass->notify_focus(item, panel);
+ if (klass->focus_cursor != NULL)
+ klass->focus_cursor(item, content, cursor);
}
diff --git a/src/gui/editem.h b/src/gui/editem.h
index f102d5c..5adc288 100644
--- a/src/gui/editem.h
+++ b/src/gui/editem.h
@@ -30,16 +30,17 @@
#include <gtk/gtk.h>
+#include "../analysis/loaded.h"
#include "../glibext/gloadedpanel.h"
-#define G_TYPE_EDITOR_ITEM g_editor_item_get_type()
-#define G_EDITOR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_editor_item_get_type(), GEditorItem))
-#define G_IS_EDITOR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_editor_item_get_type()))
-#define G_EDITOR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_EDITOR_ITEM, GEditorItemClass))
-#define G_IS_EDITOR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_EDITOR_ITEM))
-#define G_EDITOR_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_EDITOR_ITEM, GEditorItemClass))
+#define G_TYPE_EDITOR_ITEM g_editor_item_get_type()
+#define G_EDITOR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), g_editor_item_get_type(), GEditorItem))
+#define G_IS_EDITOR_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), g_editor_item_get_type()))
+#define G_EDITOR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), g_editor_item_get_type(), GEditorItemClass))
+#define G_IS_EDITOR_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), g_editor_item_get_type()))
+#define G_EDITOR_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), g_editor_item_get_type(), GEditorItemClass))
/* Elément réactif quelconque de l'éditeur (instance) */
@@ -61,8 +62,20 @@ const char *g_editor_item_get_name(const GEditorItem *);
/* Fournit le composant GTK associé à l'élément réactif. */
GtkWidget *g_editor_item_get_widget(const GEditorItem *);
-/* Réagit à un changement de focus des panneaux d'affichage. */
-void notify_focus_change_for_editor_item(GEditorItem *, GLoadedPanel *);
+/* Réagit à un changement de contenu chargé en cours d'analyse. */
+void g_editor_item_change_content(GEditorItem *, GLoadedContent *, GLoadedContent *);
+
+/* Réagit à un changement de vue du contenu en cours d'analyse. */
+void g_editor_item_change_view(GEditorItem *, GLoadedPanel *, GLoadedPanel *);
+
+/* Réagit à une modification de la vue du contenu analysé. */
+void g_editor_item_update_view(GEditorItem *, GLoadedPanel *);
+
+/* Réagit à une modification de la vue du contenu analysé. */
+void g_editor_item_track_cursor(GEditorItem *, GLoadedPanel *, const GLineCursor *);
+
+/* Réagit à une modification de la vue du contenu analysé. */
+void g_editor_item_focus_cursor(GEditorItem *, GLoadedContent *, const GLineCursor *);
diff --git a/src/gui/editor.c b/src/gui/editor.c
index d63b3a9..3b8497c 100644
--- a/src/gui/editor.c
+++ b/src/gui/editor.c
@@ -389,7 +389,8 @@ GtkWidget *create_editor(void)
register_project_change_notification(notify_editor_project_change);
- change_editor_items_current_binary(NULL);
+ change_editor_items_current_content(NULL);
+ change_editor_items_current_view(NULL);
@@ -1374,8 +1375,8 @@ void on_panel_item_undock_request(GPanelItem *panel, gpointer unused)
static void on_dock_item_switch(GtkDockStation *station, GtkWidget *widget, gpointer unused)
{
- GLoadedBinary *old_binary; /* Ancien binaire édité */
- GLoadedBinary *binary; /* Binaire en cours d'édition */
+ GLoadedPanel *panel; /* Vue du contenu chargé */
+ GLoadedContent *content; /* Contenu en cours d'édition */
if (GTK_IS_SCROLLED_WINDOW(widget))
widget = gtk_bin_get_child(GTK_BIN(widget));
@@ -1383,23 +1384,17 @@ static void on_dock_item_switch(GtkDockStation *station, GtkWidget *widget, gpoi
if (GTK_IS_VIEWPORT(widget))
widget = gtk_bin_get_child(GTK_BIN(widget));
- if (GTK_IS_DISPLAY_PANEL(widget))
+ if (G_IS_LOADED_PANEL(widget))
{
- /* Changement de binaire ? */
+ panel = G_LOADED_PANEL(widget);
- old_binary = get_current_binary();
- binary = gtk_display_panel_get_binary(GTK_DISPLAY_PANEL(widget));
+ content = g_loaded_panel_get_content(panel);
- if (old_binary != binary)
- change_editor_items_current_binary(binary);
- else
- g_object_unref(G_OBJECT(binary));
+ change_editor_items_current_content(content);
- if (old_binary != NULL)
- g_object_unref(G_OBJECT(old_binary));
+ g_object_unref(G_OBJECT(content));
- g_object_ref(G_OBJECT(widget));
- change_editor_items_current_view(G_LOADED_PANEL(widget));
+ change_editor_items_current_view(panel);
}
diff --git a/src/gui/menus/binary.c b/src/gui/menus/binary.c
index b7be1b9..1360011 100644
--- a/src/gui/menus/binary.c
+++ b/src/gui/menus/binary.c
@@ -34,6 +34,7 @@
#include "../dialogs/gotox.h"
#include "../dialogs/storage.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdisplaypanel.h"
@@ -106,10 +107,9 @@ GtkWidget *build_menu_binary(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *ba
/******************************************************************************
* *
-* Paramètres : ref = espace de référencements à consulter. *
-* panel = panneau d'affichage actif ou NULL si aucun. *
+* Paramètres : new = nouveau contenu chargé à analyser. *
* *
-* Description : Met à jour les accès du menu "Binaire" selon le contenu. *
+* Description : Réagit à un changement d'affichage principal de contenu. *
* *
* Retour : - *
* *
@@ -117,14 +117,17 @@ GtkWidget *build_menu_binary(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *ba
* *
******************************************************************************/
-void update_access_in_menu_binary(GObject *ref, GtkDisplayPanel *panel)
+void update_access_for_content_in_menu_binary(GLoadedContent *new)
{
+ GObject *ref; /* Espace de référencements */
gboolean access; /* Accès à déterminer */
GtkWidget *item; /* Elément de menu à traiter */
/* Préliminaire */
- access = (panel != NULL);
+ ref = get_global_ref();
+
+ access = G_IS_LOADED_BINARY(new);
/* Menus */
@@ -155,19 +158,14 @@ void update_access_in_menu_binary(GObject *ref, GtkDisplayPanel *panel)
static void mcb_binary_entry_points(GtkMenuItem *menuitem, GMenuBar *bar)
{
- GEditorItem *item; /* Elément d'éditeur graphique */
- GObject *ref; /* Espace de référencements */
GLoadedBinary *binary; /* Binaire présenté à l'écran */
GtkWidget *dialog; /* Boîte de dialogue à montrer */
vmpa2t *addr; /* Adresse de destination */
GLoadedPanel *panel; /* Afficheur effectif de code */
- item = G_EDITOR_ITEM(bar);
+ binary = G_LOADED_BINARY(get_current_content());
- ref = g_editor_item_get_global_ref(item);
- binary = get_current_binary();
-
- dialog = create_gotox_dialog_for_entry_points(GTK_WINDOW(ref), binary);
+ dialog = create_gotox_dialog_for_entry_points(get_editor_window(), binary);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
{
@@ -226,14 +224,12 @@ static void mcb_binary_attach_debugger(GtkMenuItem *menuitem, GMenuBar *bar)
static void mcb_binary_storage(GtkMenuItem *menuitem, GMenuBar *bar)
{
GLoadedBinary *binary; /* Edition courante */
- GObject *ref; /* Espace de référencements */
GtkBuilder *builder; /* Constructeur utilisé */
GtkWidget *dialog; /* Boîte de dialogue à montrer */
- binary = get_current_binary();
- ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar));
+ binary = G_LOADED_BINARY(get_current_content());
- dialog = create_storage_dialog(binary, GTK_WINDOW(ref), &builder);
+ dialog = create_storage_dialog(binary, get_editor_window(), &builder);
gtk_dialog_run(GTK_DIALOG(dialog));
@@ -263,9 +259,9 @@ static void mcb_binary_export(GtkMenuItem *menuitem, GMenuBar *bar)
{
GLoadedBinary *binary; /* Edition courante */
- binary = get_current_binary();
+ binary = G_LOADED_BINARY(get_current_content());
- run_export_assistant(binary, GTK_WINDOW(G_EDITOR_ITEM(bar)->ref));
+ run_export_assistant(binary, get_editor_window());
g_object_unref(G_OBJECT(binary));
diff --git a/src/gui/menus/binary.h b/src/gui/menus/binary.h
index a66fe26..45140b6 100644
--- a/src/gui/menus/binary.h
+++ b/src/gui/menus/binary.h
@@ -30,15 +30,15 @@
#include "menubar.h"
-#include "../../gtkext/gtkdisplaypanel.h"
+#include "../../analysis/loaded.h"
/* Construit le menu "Binaire". */
GtkWidget *build_menu_binary(GObject *, GtkAccelGroup *, GMenuBar *);
-/* Met à jour les accès du menu "Binaire" selon le contenu. */
-void update_access_in_menu_binary(GObject *, GtkDisplayPanel *);
+/* Réagit à un changement d'affichage principal de contenu. */
+void update_access_for_content_in_menu_binary(GLoadedContent *);
diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c
index 08745b6..4a24d33 100644
--- a/src/gui/menus/edition.c
+++ b/src/gui/menus/edition.c
@@ -37,7 +37,11 @@
#include "../dialogs/gotox.h"
#include "../../analysis/db/items/switcher.h"
#include "../../arch/target.h"
+#include "../../glibext/gbinarycursor.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkblockdisplay.h"
+#include "../../gtkext/gtkdisplaypanel.h"
+#include "../../gtkext/gtkgraphdisplay.h"
@@ -103,14 +107,20 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
menubar = qck_create_menu(GTK_MENU_ITEM(result));
- submenuitem = qck_create_menu_item(NULL, NULL, _("Go to address..."),
+ /* Déplacements ciblés */
+
+ submenuitem = qck_create_menu_item(ref, "mnu_edit_goto", _("Go to address..."),
G_CALLBACK(mcb_edition_goto), bar);
add_accelerator_to_menu_item(submenuitem, "<Ctrl>G", accgroup);
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+ /* Séparation */
+
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
+ /* Bascule des opérandes numériques */
+
submenuitem = qck_create_menu_item(NULL, NULL, _("Numeric operand"), NULL, NULL);
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -153,7 +163,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
- /* Déplacements */
+ /* Suivi de cibles */
submenuitem = qck_create_menu_item(ref, "mnu_edit_go_back", _("Go back"),
G_CALLBACK(mcb_edition_go_back), bar);
@@ -182,12 +192,12 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Toggle at current location"),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_toggle_bmark", _("Toggle at current location"),
G_CALLBACK(mcb_edition_bookmarks_toggle), bar);
add_accelerator_to_menu_item(deepmenuitem, "<Ctrl>D", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Delete all bookmarks"),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_delete_bmarks", _("Delete all bookmarks"),
G_CALLBACK(mcb_edition_bookmarks_delete_all), bar);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
@@ -198,22 +208,22 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem));
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment..."),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_comment", _("Enter a comment..."),
G_CALLBACK(mcb_edition_comment_enter), bar);
add_accelerator_to_menu_item(deepmenuitem, "semicolon", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a repeatable comment..."),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_rep_comment", _("Enter a repeatable comment..."),
G_CALLBACK(mcb_edition_comment_enter_repeatable), bar);
add_accelerator_to_menu_item(deepmenuitem, "colon", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment in the previous line..."),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_prev", _("Enter a comment in the previous line..."),
G_CALLBACK(mcb_edition_comment_enter_previous), bar);
add_accelerator_to_menu_item(deepmenuitem, "Insert", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
- deepmenuitem = qck_create_menu_item(NULL, NULL, _("Enter a comment in the next line..."),
+ deepmenuitem = qck_create_menu_item(ref, "mnu_edit_enter_next", _("Enter a comment in the next line..."),
G_CALLBACK(mcb_edition_comment_enter_next), bar);
add_accelerator_to_menu_item(deepmenuitem, "<Shift>Insert", accgroup);
gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem);
@@ -225,9 +235,96 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
/******************************************************************************
* *
-* Paramètres : ref = espace de référencements à consulter. *
-* panel = panneau d'affichage actif ou NULL si aucun. *
-* addr = nouvelle adresse du curseur courant. *
+* Paramètres : new = nouvelle vue du contenu chargé analysé. *
+* *
+* Description : Lance une actualisation du fait d'un changement de support. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void update_access_for_view_in_menu_edition(GLoadedPanel *new)
+{
+ GObject *ref; /* Espace de référencements */
+ gboolean access; /* Accès à déterminer */
+ GtkWidget *item; /* Elément de menu à traiter */
+
+ ref = get_global_ref();
+
+ /* Déplacements ciblés */
+
+ access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_goto"));
+ gtk_widget_set_sensitive(item, access);
+
+ /* Bascule des opérandes numériques */
+
+ access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ 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 = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_go_back"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_list_xrefs"));
+ gtk_widget_set_sensitive(item, access);
+
+ /* Signets */
+
+ access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_toggle_bmark"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_delete_bmarks"));
+ gtk_widget_set_sensitive(item, access);
+
+ /* Commentaires */
+
+ access = GTK_IS_BLOCK_DISPLAY(new) || GTK_IS_GRAPH_DISPLAY(new);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_comment"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_rep_comment"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_prev"));
+ gtk_widget_set_sensitive(item, access);
+
+ item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_enter_next"));
+ gtk_widget_set_sensitive(item, access);
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : panel = vue d'affichage active ou NULL si aucune. *
+* cursor = suivi des positions à consulter. *
* *
* Description : Met à jour les accès du menu "Edition" selon une position. *
* *
@@ -237,19 +334,35 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b
* *
******************************************************************************/
-void update_access_in_menu_edition(GObject *ref, GtkDisplayPanel *panel, const vmpa2t *addr)
+void update_access_for_cursor_in_menu_edition(GLoadedPanel *panel, const GLineCursor *cursor)
{
+ GObject *ref; /* Espace de référencements */
GObject *creator; /* Créateur à l'orgine du seg. */
gboolean access; /* Accès à déterminer */
GtkWidget *item; /* Elément de menu à traiter */
+ ref = get_global_ref();
+
/* Préliminaire */
- if (panel == NULL || addr == NULL)
- creator = NULL;
+ /**
+ * Seuls les affichages de blocs (en graphique ou non) distribuent ce
+ * genre de curseur. Donc on valide dans le même temps la nature de la vue.
+ */
+
+ if (G_IS_BINARY_CURSOR(cursor))
+ {
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
+
+ if (g_line_cursor_is_valid(cursor))
+ creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
+ else
+ cursor = NULL;
+
+ }
else
- creator = gtk_display_panel_get_active_object(panel);
+ creator = NULL;
/* Bascule des opérandes numériques */
@@ -277,14 +390,15 @@ void update_access_in_menu_edition(GObject *ref, GtkDisplayPanel *panel, const v
item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_follow_ref"));
gtk_widget_set_sensitive(item, access);
- access = (addr != NULL);;
+ access = g_line_cursor_is_valid(cursor);
item = GTK_WIDGET(g_object_get_data(ref, "mnu_edit_list_xrefs"));
gtk_widget_set_sensitive(item, access);
/* Nettoyage et sortie finale */
- if (creator != NULL) g_object_unref(G_OBJECT(creator));
+ if (creator != NULL)
+ g_object_unref(G_OBJECT(creator));
}
@@ -317,9 +431,9 @@ static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar)
addr = get_address_from_goto_dialog(dialog);
panel = get_current_view();
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
- if (GTK_IS_DISPLAY_PANEL(panel))
- gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), addr);
+ gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), addr);
g_object_unref(G_OBJECT(panel));
@@ -359,32 +473,29 @@ static void mcb_edition_switch_numeric_operand(GtkMenuItem *menuitem, gpointer u
display = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuitem), "kind_of_switch"));
panel = get_current_view();
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
- if (GTK_IS_DISPLAY_PANEL(panel))
- {
- creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
- assert(G_IS_IMM_OPERAND(creator));
+ creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
+ assert(G_IS_IMM_OPERAND(creator));
- addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
+ addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
- binary = get_current_binary();
- proc = g_loaded_binary_get_processor(binary);
+ binary = G_LOADED_BINARY(get_current_content());
+ proc = g_loaded_binary_get_processor(binary);
- instr = g_arch_processor_find_instr_by_address(proc, addr);
- assert(instr != NULL);
+ instr = g_arch_processor_find_instr_by_address(proc, addr);
+ assert(instr != NULL);
- switcher = g_db_switcher_new(instr, G_IMM_OPERAND(creator), display);
+ switcher = g_db_switcher_new(instr, G_IMM_OPERAND(creator), display);
- g_object_unref(G_OBJECT(instr));
+ g_object_unref(G_OBJECT(instr));
- g_loaded_binary_add_to_collection(binary, G_DB_ITEM(switcher));
+ g_loaded_binary_add_to_collection(binary, G_DB_ITEM(switcher));
- g_object_unref(G_OBJECT(proc));
- g_object_unref(G_OBJECT(binary));
-
- g_object_unref(creator);
+ g_object_unref(G_OBJECT(proc));
+ g_object_unref(G_OBJECT(binary));
- }
+ g_object_unref(creator);
g_object_unref(G_OBJECT(panel));
@@ -432,35 +543,32 @@ static void mcb_edition_follow_ref(GtkMenuItem *menuitem, gpointer unused)
virt_t virt; /* Adresse virtuelle */
panel = get_current_view();
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
- if (GTK_IS_DISPLAY_PANEL(panel))
- {
- creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
- assert(creator != NULL);
+ creator = gtk_display_panel_get_active_object(GTK_DISPLAY_PANEL(panel));
+ assert(creator != NULL);
- defined = false;
+ defined = false;
- if (G_IS_TARGET_OPERAND(creator))
- {
- g_target_operand_get_addr(G_TARGET_OPERAND(creator), &addr);
- defined = true;
- }
+ if (G_IS_TARGET_OPERAND(creator))
+ {
+ g_target_operand_get_addr(G_TARGET_OPERAND(creator), &addr);
+ defined = true;
+ }
- else if (G_IS_IMM_OPERAND(creator))
+ else if (G_IS_IMM_OPERAND(creator))
+ {
+ if (g_imm_operand_to_virt_t(G_IMM_OPERAND(creator), &virt))
{
- if (g_imm_operand_to_virt_t(G_IMM_OPERAND(creator), &virt))
- {
- init_vmpa(&addr, VMPA_NO_PHYSICAL, virt);
- defined = true;
- }
+ init_vmpa(&addr, VMPA_NO_PHYSICAL, virt);
+ defined = true;
}
+ }
- if (defined)
- gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), &addr);
+ if (defined)
+ gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), &addr);
- g_object_unref(creator);
-
- }
+ g_object_unref(creator);
g_object_unref(G_OBJECT(panel));
@@ -492,51 +600,48 @@ static void mcb_edition_list_xrefs(GtkMenuItem *menuitem, GMenuBar *bar)
vmpa2t *dest; /* Adresse de destination */
panel = get_current_view();
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
- if (GTK_IS_DISPLAY_PANEL(panel))
- {
- addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
-
- binary = get_current_binary();
- proc = g_loaded_binary_get_processor(binary);
-
- /**
- * On ne peut pas se reposer sur l'espace couvert par une ligne, car il peut
- * être de taille nulle (cas d'une étiquette, par exemple), à la différence
- * de la taille d'une instruction.
- *
- * Il faut ainsi être plus souple, et se baser sur l'espace couvert par
- * une ligne mais sur l'adresse uniquement.
- */
- instr = g_arch_processor_find_instr_by_address(proc, addr);
-
- if (instr != NULL)
- {
- ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar));
+ addr = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
- dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), binary, instr, true);
+ binary = G_LOADED_BINARY(get_current_content());
+ proc = g_loaded_binary_get_processor(binary);
- if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
- {
- dest = get_address_from_gotox_dialog(dialog);
+ /**
+ * On ne peut pas se reposer sur l'espace couvert par une ligne, car il peut
+ * être de taille nulle (cas d'une étiquette, par exemple), à la différence
+ * de la taille d'une instruction.
+ *
+ * Il faut ainsi être plus souple, et se baser sur l'espace couvert par
+ * une ligne mais sur l'adresse uniquement.
+ */
+ instr = g_arch_processor_find_instr_by_address(proc, addr);
- gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), dest);
+ if (instr != NULL)
+ {
+ ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar));
- delete_vmpa(dest);
+ dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), binary, instr, true);
- }
+ if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
+ {
+ dest = get_address_from_gotox_dialog(dialog);
- gtk_widget_destroy(dialog);
+ gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), dest);
- g_object_unref(G_OBJECT(instr));
+ delete_vmpa(dest);
}
- g_object_unref(G_OBJECT(proc));
- g_object_unref(G_OBJECT(binary));
+ gtk_widget_destroy(dialog);
+
+ g_object_unref(G_OBJECT(instr));
}
+ g_object_unref(G_OBJECT(proc));
+ g_object_unref(G_OBJECT(binary));
+
g_object_unref(G_OBJECT(panel));
}
@@ -570,15 +675,13 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar)
/* Détermination de l'adresse visée */
panel = get_current_view();
-
- if (!GTK_IS_DISPLAY_PANEL(panel))
- goto done_with_panel;
+ assert(GTK_IS_BLOCK_DISPLAY(panel) || GTK_IS_GRAPH_DISPLAY(panel));
curloc = gtk_display_panel_get_caret_location(GTK_DISPLAY_PANEL(panel));
/* Accès à la collection */
- binary = get_current_binary();
+ binary = G_LOADED_BINARY(get_current_content());
collec = g_loaded_binary_find_collection(binary, DBF_BOOKMARKS);
/**
@@ -636,8 +739,6 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar)
g_object_unref(G_OBJECT(collec));
g_object_unref(G_OBJECT(binary));
- done_with_panel:
-
g_object_unref(G_OBJECT(panel));
}
diff --git a/src/gui/menus/edition.h b/src/gui/menus/edition.h
index f863568..a49e320 100644
--- a/src/gui/menus/edition.h
+++ b/src/gui/menus/edition.h
@@ -30,15 +30,18 @@
#include "menubar.h"
-#include "../../gtkext/gtkdisplaypanel.h"
+#include "../../glibext/gloadedpanel.h"
/* Construit le menu "Edition". */
GtkWidget *build_menu_edition(GObject *, GtkAccelGroup *, GMenuBar *);
+/* Lance une actualisation du fait d'un changement de support. */
+void update_access_for_view_in_menu_edition(GLoadedPanel *);
+
/* Met à jour les accès du menu "Edition" selon une position. */
-void update_access_in_menu_edition(GObject *, GtkDisplayPanel *, const vmpa2t *);
+void update_access_for_cursor_in_menu_edition(GLoadedPanel *, const GLineCursor *);
diff --git a/src/gui/menus/menubar.c b/src/gui/menus/menubar.c
index 989d964..7bc7e85 100644
--- a/src/gui/menus/menubar.c
+++ b/src/gui/menus/menubar.c
@@ -76,14 +76,14 @@ static void g_menu_bar_dispose(GMenuBar *);
/* Procède à la libération totale de la mémoire. */
static void g_menu_bar_finalize(GMenuBar *);
-/* Lance une actualisation du fait d'un changement de vue. */
-static void update_menu_bar_for_view(GMenuBar *, GtkDisplayPanel *);
+/* Réagit à un changement d'affichage principal de contenu. */
+static void change_menubar_current_content(GMenuBar *, GLoadedContent *, GLoadedContent *);
-/* Réagit à un changement de focus des panneaux d'affichage. */
-static void notify_focus_change_for_menu_bar(GMenuBar *, GtkDisplayPanel *);
+/* Lance une actualisation du fait d'un changement de support. */
+static void change_menubar_current_view(GMenuBar *, GLoadedPanel *, GLoadedPanel *);
/* Met à jour les accès aux menus en fonction de la position. */
-static void track_caret_address_for_menu_bar(GMenuBar *, GtkDisplayPanel *, const vmpa2t *);
+static void track_caret_address_for_menu_bar(GMenuBar *, GLoadedPanel *, const GLineCursor *);
/* Lance une actualisation relative à l'étendue du projet. */
static void update_menu_bar_for_project(GMenuBar *, GStudyProject *);
@@ -118,9 +118,9 @@ static void g_menu_bar_class_init(GMenuBarClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_view = (update_item_view_fc)update_menu_bar_for_view;
- editem->notify_focus = (notify_focus_change_fc)notify_focus_change_for_menu_bar;
- editem->track_caret = (track_caret_in_view_fc)track_caret_address_for_menu_bar;
+ editem->change_content = (change_item_content_fc)change_menubar_current_content;
+ editem->change_view = (change_item_view_fc)change_menubar_current_view;
+ editem->track_cursor = (track_cursor_in_view_fc)track_caret_address_for_menu_bar;
editem->update_project = (update_project_fc)update_menu_bar_for_project;
}
@@ -264,10 +264,6 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)
result->help = build_menu_help(ref, accgroup);
gtk_container_add(GTK_CONTAINER(item->widget), result->help);
- /* Finalisation générique */
-
- notify_focus_change_for_menu_bar(result, NULL);
-
return G_EDITOR_ITEM(result);
}
@@ -275,10 +271,11 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)
/******************************************************************************
* *
-* Paramètres : bar = barre de menus à actualiser. *
-* panel = nouveau panneau d'affichage actif. *
+* Paramètres : bar = barre de menus à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
-* Description : Lance une actualisation du fait d'un changement de vue. *
+* Description : Réagit à un changement d'affichage principal de contenu. *
* *
* Retour : - *
* *
@@ -286,19 +283,20 @@ GEditorItem *g_menu_bar_new(GObject *ref, GtkAccelGroup *accgroup)
* *
******************************************************************************/
-static void update_menu_bar_for_view(GMenuBar *bar, GtkDisplayPanel *panel)
+static void change_menubar_current_content(GMenuBar *bar, GLoadedContent *old, GLoadedContent *new)
{
- update_menu_view_for_view(bar->view, panel, bar);
+ update_access_for_content_in_menu_binary(new);
}
/******************************************************************************
* *
-* Paramètres : bar = barre de menus à actualiser. *
-* panel = composant d'affichage concerné par l'opération. *
+* Paramètres : bar = barre de menus à mettre à jour. *
+* old = ancienne vue du contenu chargé analysé. *
+* new = nouvelle vue du contenu chargé analysé. *
* *
-* Description : Réagit à un changement de focus des panneaux d'affichage. *
+* Description : Lance une actualisation du fait d'un changement de support. *
* *
* Retour : - *
* *
@@ -306,23 +304,12 @@ static void update_menu_bar_for_view(GMenuBar *bar, GtkDisplayPanel *panel)
* *
******************************************************************************/
-static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *panel)
+static void change_menubar_current_view(GMenuBar *bar, GLoadedPanel *old, GLoadedPanel *new)
{
- const vmpa2t *addr; /* Position courante */
- GEditorItem *item; /* Autre version de l'élément */
-
- if (panel != NULL)
- addr = gtk_display_panel_get_caret_location(panel);
- else
- addr = NULL;
-
- item = G_EDITOR_ITEM(bar);
-
- update_access_in_menu_edition(item->ref, panel, addr);
+ update_access_for_view_in_menu_edition(new);
- update_access_in_menu_view(item->ref, panel);
-
- update_access_in_menu_binary(item->ref, panel);
+ rebuild_menu_view(bar->view, new, bar);
+ update_access_for_view_in_menu_view(G_EDITOR_ITEM(bar)->ref, new);
}
@@ -330,8 +317,8 @@ static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *pan
/******************************************************************************
* *
* Paramètres : bar = barre de menus à actualiser. *
-* panel = panneau d'affichage actif ou NULL si aucun. *
-* addr = nouvelle adresse du curseur courant. *
+* panel = composant d'affichage parcouru. *
+* cursor = nouvel emplacement du curseur courant. *
* *
* Description : Met à jour les accès aux menus en fonction de la position. *
* *
@@ -341,13 +328,9 @@ static void notify_focus_change_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *pan
* *
******************************************************************************/
-static void track_caret_address_for_menu_bar(GMenuBar *bar, GtkDisplayPanel *panel, const vmpa2t *addr)
+static void track_caret_address_for_menu_bar(GMenuBar *bar, GLoadedPanel *panel, const GLineCursor *cursor)
{
- GEditorItem *item; /* Autre version de l'élément */
-
- item = G_EDITOR_ITEM(bar);
-
- update_access_in_menu_edition(item->ref, panel, addr);
+ update_access_for_cursor_in_menu_edition(panel, cursor);
}
diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c
index dfbf152..f0e7450 100644
--- a/src/gui/menus/view.c
+++ b/src/gui/menus/view.c
@@ -105,7 +105,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
qck_create_menu(GTK_MENU_ITEM(submenuitem));
- /* - */
+ /* Séparation */
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -138,7 +138,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
add_accelerator_to_menu_item(submenuitem, "<Shift>Tab", accgroup);
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
- /* - */
+ /* Séparation */
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -160,7 +160,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
g_object_set_data(G_OBJECT(submenuitem), "kind_of_opt", GUINT_TO_POINTER(BLC_BINARY));
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
- /* - */
+ /* Séparation */
submenuitem = qck_create_menu_separator();
gtk_container_add(GTK_CONTAINER(menubar), submenuitem);
@@ -191,7 +191,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar)
* *
******************************************************************************/
-void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuBar *bar)
+void rebuild_menu_view(GtkWidget *widget, GLoadedPanel *panel, GMenuBar *bar)
{
GObject *ref; /* Espace de référencements */
GtkRadioMenuItem *item; /* Elément de menu arbitraire */
@@ -246,9 +246,9 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB
g_slist_foreach(radios, (GFunc)reconnect_display_radio, NULL);
- /* - */
+ /* Séparation */
- content = g_loaded_panel_get_content(G_LOADED_PANEL(panel));
+ content = g_loaded_panel_get_content(panel);
view_index = g_loaded_content_get_view_index(content, GTK_WIDGET(panel));
@@ -305,7 +305,7 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB
* *
******************************************************************************/
-void update_access_in_menu_view(GObject *ref, GtkDisplayPanel *panel)
+void update_access_for_view_in_menu_view(GObject *ref, GLoadedPanel *panel)
{
gboolean access; /* Accès à déterminer */
GtkWidget *item; /* Elément de menu à traiter */
diff --git a/src/gui/menus/view.h b/src/gui/menus/view.h
index d42bbc6..5216bcb 100644
--- a/src/gui/menus/view.h
+++ b/src/gui/menus/view.h
@@ -30,7 +30,7 @@
#include "menubar.h"
-#include "../../gtkext/gtkdisplaypanel.h"
+#include "../../glibext/gloadedpanel.h"
@@ -38,10 +38,10 @@
GtkWidget *build_menu_view(GObject *, GtkAccelGroup *, GMenuBar *);
/* Lance une actualisation du fait d'un changement de vue. */
-void update_menu_view_for_view(GtkWidget *, GtkDisplayPanel *, GMenuBar *);
+void rebuild_menu_view(GtkWidget *, GLoadedPanel *, GMenuBar *);
/* Met à jour les accès du menu "Affichage" selon le contenu. */
-void update_access_in_menu_view(GObject *, GtkDisplayPanel *);
+void update_access_for_view_in_menu_view(GObject *, GLoadedPanel *);
diff --git a/src/gui/panels/bintree.c b/src/gui/panels/bintree.c
index ecb18fe..5c8a19e 100644
--- a/src/gui/panels/bintree.c
+++ b/src/gui/panels/bintree.c
@@ -37,6 +37,7 @@
#include "updating-int.h"
#include "../core/global.h"
#include "../../core/queue.h"
+#include "../../gtkext/gtkdisplaypanel.h"
#include "../../gtkext/tmgt.h"
@@ -118,7 +119,7 @@ static void on_depth_spin_value_changed(GtkSpinButton *, const GBintreePanel *);
static void on_bintree_selection_changed(GtkTreeSelection *, gpointer);
/* Réagit à un changement d'affichage principal de contenu. */
-static void change_bintree_panel_current_binary(GBintreePanel *, GLoadedBinary *);
+static void change_bintree_panel_current_content(GBintreePanel *, GLoadedContent *, GLoadedContent *);
@@ -230,7 +231,7 @@ static void g_bintree_panel_class_init(GBintreePanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)change_bintree_panel_current_binary;
+ editem->change_content = (change_item_content_fc)change_bintree_panel_current_content;
panel = G_PANEL_ITEM_CLASS(klass);
@@ -520,8 +521,9 @@ static void on_bintree_selection_changed(GtkTreeSelection *selection, gpointer u
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -531,11 +533,17 @@ static void on_bintree_selection_changed(GtkTreeSelection *selection, gpointer u
* *
******************************************************************************/
-static void change_bintree_panel_current_binary(GBintreePanel *panel, GLoadedBinary *binary)
+static void change_bintree_panel_current_content(GBintreePanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBuilder *builder; /* Constructeur utilisé */
GtkTreeStore *store; /* Modèle de gestion */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Basculement du binaire utilisé */
if (panel->binary != NULL)
diff --git a/src/gui/panels/bookmarks.c b/src/gui/panels/bookmarks.c
index fd8af25..3c1e719 100644
--- a/src/gui/panels/bookmarks.c
+++ b/src/gui/panels/bookmarks.c
@@ -46,6 +46,7 @@
#include "../../glibext/chrysamarshal.h"
#include "../../glibext/signal.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdisplaypanel.h"
#include "../../gtkext/gtkdockable-int.h"
@@ -106,6 +107,8 @@ static void g_bookmarks_panel_dispose(GBookmarksPanel *);
/* Procède à la libération totale de la mémoire. */
static void g_bookmarks_panel_finalize(GBookmarksPanel *);
+/* Réagit à un changement d'affichage principal de contenu. */
+static void change_bookmarks_panel_current_content(GBookmarksPanel *, GLoadedContent *, GLoadedContent *);
/* ------------------------- AFFICHAGE A L'AIDE D'UNE LISTE ------------------------- */
@@ -208,7 +211,7 @@ static void g_bookmarks_panel_class_init(GBookmarksPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)reload_bookmarks_into_treeview;
+ editem->change_content = (change_item_content_fc)change_bookmarks_panel_current_content;
panel = G_PANEL_ITEM_CLASS(klass);
@@ -426,6 +429,34 @@ GPanelItem *g_bookmarks_panel_new(void)
}
+/******************************************************************************
+* *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
+* *
+* Description : Réagit à un changement d'affichage principal de contenu. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void change_bookmarks_panel_current_content(GBookmarksPanel *panel, GLoadedContent *old, GLoadedContent *new)
+{
+ GLoadedBinary *binary; /* Autre version de l'instance */
+
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
+ reload_bookmarks_into_treeview(panel, binary);
+
+}
+
+
/* ---------------------------------------------------------------------------------- */
/* AFFICHAGE A L'AIDE D'UNE LISTE */
@@ -955,7 +986,7 @@ static void on_param_value_edited(GtkCellRendererText *renderer, gchar *path, gc
static void update_filtered_bookmarks(GBookmarksPanel *panel)
{
- //reload_bookmarks_into_treeview(panel, panel->binary);
+ reload_bookmarks_into_treeview(panel, panel->binary);
}
diff --git a/src/gui/panels/errors.c b/src/gui/panels/errors.c
index 5873ad5..fa86a84 100644
--- a/src/gui/panels/errors.c
+++ b/src/gui/panels/errors.c
@@ -41,6 +41,7 @@
#include "../../core/queue.h"
#include "../../format/format.h"
#include "../../glibext/signal.h"
+#include "../../gtkext/gtkdisplaypanel.h"
@@ -137,7 +138,7 @@ static void g_error_panel_finalize(GErrorPanel *);
static gint sort_errors_in_panel(GtkTreeModel *, GtkTreeIter *, GtkTreeIter *, gpointer);
/* Réagit à un changement d'affichage principal de contenu. */
-static void update_panel_with_binary_errors(GErrorPanel *, GLoadedBinary *);
+static void change_error_panel_current_content(GErrorPanel *, GLoadedContent *, GLoadedContent *);
/* Effectue la mise à jour du contenu du panneau d'erreurs. */
static void update_error_panel(const GErrorPanel *, GtkStatusStack *, activity_id_t, error_update_data *);
@@ -218,7 +219,7 @@ static void g_error_panel_class_init(GErrorPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)update_panel_with_binary_errors;
+ editem->change_content = (change_item_content_fc)change_error_panel_current_content;
filename = find_pixmap_file("error_file.png");
assert(filename != NULL);
@@ -465,8 +466,9 @@ static gint sort_errors_in_panel(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIte
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -476,11 +478,17 @@ static gint sort_errors_in_panel(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIte
* *
******************************************************************************/
-static void update_panel_with_binary_errors(GErrorPanel *panel, GLoadedBinary *binary)
+static void change_error_panel_current_content(GErrorPanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBuilder *builder; /* Constructeur utilisé */
GtkListStore *store; /* Modèle de gestion */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Réinitialisation */
if (panel->binary != NULL)
diff --git a/src/gui/panels/glance.c b/src/gui/panels/glance.c
index c58f3b6..0fb8f43 100644
--- a/src/gui/panels/glance.c
+++ b/src/gui/panels/glance.c
@@ -87,7 +87,7 @@ static void g_glance_panel_dispose(GGlancePanel *);
static void g_glance_panel_finalize(GGlancePanel *);
/* Lance une actualisation du fait d'un changement de support. */
-static void update_glance_panel_for_view(GGlancePanel *, GLoadedPanel *);
+static void change_glance_panel_current_view(GGlancePanel *, GLoadedPanel *, GLoadedPanel *);
/* Réagit à la préparation du défilement du support original. */
static void on_view_scroll_setup(GtkAdjustment *, GGlancePanel *);
@@ -102,7 +102,7 @@ static void on_glance_resize(GtkWidget *, GdkRectangle *, GGlancePanel *);
static void compute_glance_scale(GGlancePanel *);
/* Lance une actualisation du fait d'un changement de vue. */
-static void update_glance_panel_for_view_content(GGlancePanel *, GLoadedPanel *);
+static void update_glance_panel_view(GGlancePanel *, GLoadedPanel *);
/* Met à jour l'affichage de l'aperçu rapide à présenter. */
static gboolean redraw_glance_area(GtkWidget *, cairo_t *, GGlancePanel *);
@@ -147,8 +147,8 @@ static void g_glance_panel_class_init(GGlancePanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_view = (update_item_view_fc)update_glance_panel_for_view;
- editem->update_content = (update_item_view_fc)update_glance_panel_for_view_content;
+ editem->change_view = (change_item_view_fc)change_glance_panel_current_view;
+ editem->update_view = (update_item_view_fc)update_glance_panel_view;
theme = gtk_icon_theme_get_default();
@@ -282,7 +282,8 @@ GPanelItem *g_glance_panel_new(void)
/******************************************************************************
* *
* Paramètres : panel = panneau à actualiser. *
-* view = nouveau panneau d'affichage actif. *
+* old = ancienne vue du contenu chargé analysé. *
+* new = nouvelle vue du contenu chargé analysé. *
* *
* Description : Lance une actualisation du fait d'un changement de support. *
* *
@@ -292,17 +293,17 @@ GPanelItem *g_glance_panel_new(void)
* *
******************************************************************************/
-static void update_glance_panel_for_view(GGlancePanel *panel, GLoadedPanel *view)
+static void change_glance_panel_current_view(GGlancePanel *panel, GLoadedPanel *old, GLoadedPanel *new)
{
GtkWidget *parent; /* Support défilant de la vue */
GtkAdjustment *adj; /* Gestionnaire du défilement */
if (panel->view != NULL)
{
- g_object_unref(panel->view);
+ g_object_unref(G_OBJECT(panel->view));
panel->view = NULL;
- g_object_unref(panel->support);
+ g_object_unref(G_OBJECT(panel->support));
panel->support = NULL;
if (panel->cache != NULL)
@@ -318,22 +319,27 @@ static void update_glance_panel_for_view(GGlancePanel *panel, GLoadedPanel *view
* de la fonction mcb_view_change_support().
*/
- parent = gtk_widget_get_parent(GTK_WIDGET(view));
+ parent = gtk_widget_get_parent(GTK_WIDGET(new));
if (!GTK_IS_SCROLLED_WINDOW(parent)) return;
- panel->view = view;
- g_object_ref(panel->view);
+ panel->view = new;
+
+ if (panel->view != NULL)
+ {
+ g_object_ref(G_OBJECT(panel->view));
+
+ panel->support = GTK_SCROLLED_WINDOW(parent);
+ g_object_ref(G_OBJECT(panel->support));
- panel->support = GTK_SCROLLED_WINDOW(parent);
- g_object_ref(panel->support);
+ adj = gtk_scrolled_window_get_hadjustment(panel->support);
+ g_signal_connect(G_OBJECT(adj), "changed", G_CALLBACK(on_view_scroll_setup), panel);
+ g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(on_view_scrolled), panel);
- adj = gtk_scrolled_window_get_hadjustment(panel->support);
- g_signal_connect(G_OBJECT(adj), "changed", G_CALLBACK(on_view_scroll_setup), panel);
- g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(on_view_scrolled), panel);
+ adj = gtk_scrolled_window_get_vadjustment(panel->support);
+ g_signal_connect(G_OBJECT(adj), "changed", G_CALLBACK(on_view_scroll_setup), panel);
+ g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(on_view_scrolled), panel);
- adj = gtk_scrolled_window_get_vadjustment(panel->support);
- g_signal_connect(G_OBJECT(adj), "changed", G_CALLBACK(on_view_scroll_setup), panel);
- g_signal_connect(G_OBJECT(adj), "value-changed", G_CALLBACK(on_view_scrolled), panel);
+ }
}
@@ -368,7 +374,7 @@ static void on_view_scroll_setup(GtkAdjustment *adj, GGlancePanel *panel)
on_view_scrolled(adj, panel);
- update_glance_panel_for_view_content(panel, panel->view);
+ update_glance_panel_view(panel, panel->view);
}
@@ -426,7 +432,7 @@ static void on_glance_resize(GtkWidget *widget, GdkRectangle *allocation, GGlanc
if (panel->view != NULL)
{
on_view_scroll_setup(NULL, panel);
- update_glance_panel_for_view_content(panel, panel->view);
+ update_glance_panel_view(panel, panel->view);
}
}
@@ -519,7 +525,7 @@ static void compute_glance_scale(GGlancePanel *panel)
* *
******************************************************************************/
-static void update_glance_panel_for_view_content(GGlancePanel *panel, GLoadedPanel *view)
+static void update_glance_panel_view(GGlancePanel *panel, GLoadedPanel *view)
{
cairo_t *cairo; /* Assistant pour le dessin */
GtkAllocation area; /* Dimension de la surface */
diff --git a/src/gui/panels/history.c b/src/gui/panels/history.c
index c43534b..50e72da 100644
--- a/src/gui/panels/history.c
+++ b/src/gui/panels/history.c
@@ -33,7 +33,7 @@
#include "panel-int.h"
-#include "../../analysis/db/collection.h"
+#include "../../analysis/binary.h"
#include "../../glibext/chrysamarshal.h"
#include "../../glibext/signal.h"
#include "../../gtkext/easygtk.h"
@@ -87,7 +87,7 @@ static void g_history_panel_dispose(GHistoryPanel *);
static void g_history_panel_finalize(GHistoryPanel *);
/* Réagit à un changement d'affichage principal de contenu. */
-static void change_history_panel_current_binary(GHistoryPanel *, GLoadedBinary *);
+static void change_history_panel_current_content(GHistoryPanel *, GLoadedContent *, GLoadedContent *);
/* Réagit à une modification au sein d'une collection donnée. */
static void on_history_changed(GDbCollection *, DBAction, GDbItem *, GHistoryPanel *);
@@ -137,7 +137,7 @@ static void g_history_panel_class_init(GHistoryPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)change_history_panel_current_binary;
+ editem->change_content = (change_item_content_fc)change_history_panel_current_content;
}
@@ -326,8 +326,9 @@ GPanelItem *g_history_panel_new(void)
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -337,8 +338,9 @@ GPanelItem *g_history_panel_new(void)
* *
******************************************************************************/
-static void change_history_panel_current_binary(GHistoryPanel *panel, GLoadedBinary *binary)
+static void change_history_panel_current_content(GHistoryPanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GList *collections; /* Ensemble de collections */
GList *c; /* Boucle de parcours #1 */
GDbCollection *collec; /* Collection visée manipulée */
@@ -348,6 +350,11 @@ static void change_history_panel_current_binary(GHistoryPanel *panel, GLoadedBin
GDbItem *item; /* Elément à intégrer */
GtkTreeIter iter; /* Point d'insertion */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Basculement du binaire utilisé */
if (panel->binary != NULL)
diff --git a/src/gui/panels/panel-int.h b/src/gui/panels/panel-int.h
index 3f5213d..4ea9182 100644
--- a/src/gui/panels/panel-int.h
+++ b/src/gui/panels/panel-int.h
@@ -34,6 +34,7 @@
#include "../editem-int.h"
#include "../../common/dllist.h"
+#include "../../glibext/delayed.h"
diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c
index dacd14c..6e9324f 100644
--- a/src/gui/panels/strings.c
+++ b/src/gui/panels/strings.c
@@ -41,6 +41,7 @@
#include "../../format/format.h"
#include "../../format/symiter.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdisplaypanel.h"
#include "../../gtkext/gtkdockable-int.h"
#include "../../gtkext/tmgt.h"
@@ -121,7 +122,7 @@ static gboolean on_key_pressed_over_strings(GtkTreeView *, GdkEventKey *, GStrin
static void on_string_name_edited(GtkCellRendererText *, gchar *, gchar *, GtkTreeModel *);
/* Réagit à un changement d'affichage principal de contenu. */
-static void change_strings_panel_current_binary(GStringsPanel *, GLoadedBinary *);
+static void change_strings_panel_current_content(GStringsPanel *, GLoadedContent *, GLoadedContent *);
@@ -249,7 +250,7 @@ static void g_strings_panel_class_init(GStringsPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)change_strings_panel_current_binary;
+ editem->change_content = (change_item_content_fc)change_strings_panel_current_content;
panel = G_PANEL_ITEM_CLASS(klass);
@@ -641,8 +642,9 @@ static void on_string_name_edited(GtkCellRendererText *renderer, gchar *path, gc
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -652,14 +654,20 @@ static void on_string_name_edited(GtkCellRendererText *renderer, gchar *path, gc
* *
******************************************************************************/
-static void change_strings_panel_current_binary(GStringsPanel *panel, GLoadedBinary *binary)
+static void change_strings_panel_current_content(GStringsPanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBuilder *builder; /* Constructeur utilisé */
GtkListStore *store; /* Modèle de gestion */
GtkTreeView *treeview; /* Affichage de la liste */
GtkTreeViewColumn *column; /* Colonne de la liste */
GArchProcessor *proc; /* Architecture du binaire */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Basculement du binaire utilisé */
if (panel->binary != NULL)
@@ -1266,7 +1274,6 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa
{
GBinSymbol *symbol; /* Symbole sélectionné */
const mrange_t *range; /* Couverture en mémoire */
- GLoadedBinary *binary; /* Représentation binaire */
GArchProcessor *proc; /* Processeur de l'architecture*/
GArchInstruction *instr; /* Point de croisements */
GObject *ref; /* Espace de référencements */
@@ -1279,8 +1286,7 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa
range = g_binary_symbol_get_range(symbol);
- binary = get_current_binary();
- proc = g_loaded_binary_get_processor(binary);
+ proc = g_loaded_binary_get_processor(panel->binary);
/**
* Se rapporter aux commentaires de mcb_edition_list_xrefs() pour les questions
@@ -1290,7 +1296,7 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa
ref = G_OBJECT(get_editor_window());//g_editor_item_get_global_ref(G_EDITOR_ITEM(panel));
- dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), binary, instr, true);
+ dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), panel->binary, instr, true);
if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK)
{
@@ -1313,7 +1319,6 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa
g_object_unref(G_OBJECT(instr));
g_object_unref(G_OBJECT(proc));
- g_object_unref(G_OBJECT(binary));
g_object_unref(G_OBJECT(symbol));
diff --git a/src/gui/panels/symbols.c b/src/gui/panels/symbols.c
index 0c88bce..414c4c7 100644
--- a/src/gui/panels/symbols.c
+++ b/src/gui/panels/symbols.c
@@ -45,6 +45,7 @@
#include "../../format/format.h"
#include "../../format/symiter.h"
#include "../../gtkext/easygtk.h"
+#include "../../gtkext/gtkdisplaypanel.h"
#include "../../gtkext/tmgt.h"
@@ -126,7 +127,7 @@ static void on_symbols_tree_display_toggle(GtkToggleToolButton *, GSymbolsPanel
static void on_symbols_selection_change(GtkTreeSelection *, gpointer);
/* Réagit à un changement d'affichage principal de contenu. */
-static void change_symbols_panel_current_binary(GSymbolsPanel *, GLoadedBinary *);
+static void change_symbols_panel_current_content(GSymbolsPanel *, GLoadedContent *, GLoadedContent *);
/* Réagit à un changement d'affichage principal de contenu. */
static void reload_symbols_panel_content(const GSymbolsPanel *, GtkStatusStack *, activity_id_t, symbols_update_data *);
@@ -256,7 +257,7 @@ static void g_symbols_panel_class_init(GSymbolsPanelClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->update_binary = (update_item_binary_fc)change_symbols_panel_current_binary;
+ editem->change_content = (change_item_content_fc)change_symbols_panel_current_content;
panel = G_PANEL_ITEM_CLASS(klass);
@@ -490,6 +491,7 @@ static void on_symbols_list_display_toggle(GtkToggleToolButton *button, GSymbols
{
GtkBuilder *builder; /* Constructeur utilisé */
GtkWidget *other; /* Autre bouton de la barre */
+ GLoadedContent *content; /* Autre version du binaire */
if (gtk_toggle_tool_button_get_active(button))
{
@@ -510,9 +512,12 @@ static void on_symbols_list_display_toggle(GtkToggleToolButton *button, GSymbols
if (panel->binary != NULL)
{
- g_object_ref(G_OBJECT(panel->binary));
- change_symbols_panel_current_binary(panel, panel->binary);
- g_object_unref(G_OBJECT(panel->binary));
+ content = G_LOADED_CONTENT(panel->binary);
+
+ g_object_ref(G_OBJECT(content));
+ change_symbols_panel_current_content(panel, content, content);
+ g_object_unref(G_OBJECT(content));
+
}
}
@@ -537,6 +542,7 @@ static void on_symbols_tree_display_toggle(GtkToggleToolButton *button, GSymbols
{
GtkBuilder *builder; /* Constructeur utilisé */
GtkWidget *other; /* Autre bouton de la barre */
+ GLoadedContent *content; /* Autre version du binaire */
if (gtk_toggle_tool_button_get_active(button))
{
@@ -557,9 +563,12 @@ static void on_symbols_tree_display_toggle(GtkToggleToolButton *button, GSymbols
if (panel->binary != NULL)
{
- g_object_ref(G_OBJECT(panel->binary));
- change_symbols_panel_current_binary(panel, panel->binary);
- g_object_unref(G_OBJECT(panel->binary));
+ content = G_LOADED_CONTENT(panel->binary);
+
+ g_object_ref(G_OBJECT(content));
+ change_symbols_panel_current_content(panel, content, content);
+ g_object_unref(G_OBJECT(content));
+
}
}
@@ -614,8 +623,9 @@ static void on_symbols_selection_change(GtkTreeSelection *selection, gpointer un
/******************************************************************************
* *
-* Paramètres : panel = panneau à mettre à jour. *
-* binary = nouvelle instance de binaire analysé. *
+* Paramètres : panel = panneau à mettre à jour. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement d'affichage principal de contenu. *
* *
@@ -625,11 +635,17 @@ static void on_symbols_selection_change(GtkTreeSelection *selection, gpointer un
* *
******************************************************************************/
-static void change_symbols_panel_current_binary(GSymbolsPanel *panel, GLoadedBinary *binary)
+static void change_symbols_panel_current_content(GSymbolsPanel *panel, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBuilder *builder; /* Constructeur utilisé */
GtkTreeStore *store; /* Modèle de gestion */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
/* Basculement du binaire utilisé */
if (panel->binary != NULL)
diff --git a/src/gui/status.c b/src/gui/status.c
index bd52310..645028e 100644
--- a/src/gui/status.c
+++ b/src/gui/status.c
@@ -70,10 +70,10 @@ static void g_status_info_dispose(GStatusInfo *);
static void g_status_info_finalize(GStatusInfo *);
/* Imprime la position du parcours courant dans le statut. */
-static void track_caret_address_for_status_info(GStatusInfo *, GtkBufferDisplay *, const vmpa2t *);
+static void track_cursor_for_status_info(GStatusInfo *, GLoadedPanel *, const GLineCursor *);
/* Concentre l'attention de l'ensemble sur une adresse donnée. */
-static void focus_address_in_status_info(GStatusInfo *, GLoadedBinary *, const vmpa2t *);
+static void focus_cursor_in_status_info(GStatusInfo *, GLoadedContent *, const GLineCursor *);
@@ -105,8 +105,8 @@ static void g_status_info_class_init(GStatusInfoClass *klass)
editem = G_EDITOR_ITEM_CLASS(klass);
- editem->track_caret = (track_caret_in_view_fc)track_caret_address_for_status_info;
- editem->focus_addr = (focus_addr_fc)focus_address_in_status_info;
+ editem->track_cursor = (track_cursor_in_view_fc)track_cursor_for_status_info;
+ editem->focus_cursor = (focus_cursor_fc)focus_cursor_in_status_info;
}
@@ -208,9 +208,9 @@ GEditorItem *g_status_info_new(GObject *ref)
/******************************************************************************
* *
-* Paramètres : info = barre de statut présentant les informations. *
-* display = composant d'affichage parcouru. *
-* addr = nouvelle adresse du curseur courant. *
+* Paramètres : info = barre de statut présentant les informations. *
+* panel = composant d'affichage parcouru. *
+* cursor = nouvel emplacement du curseur courant. *
* *
* Description : Imprime la position du parcours courant dans le statut. *
* *
@@ -220,24 +220,24 @@ GEditorItem *g_status_info_new(GObject *ref)
* *
******************************************************************************/
-static void track_caret_address_for_status_info(GStatusInfo *info, GtkBufferDisplay *display, const vmpa2t *addr)
+static void track_cursor_for_status_info(GStatusInfo *info, GLoadedPanel *panel, const GLineCursor *cursor)
{
- GLoadedBinary *binary; /* Binaire courant */
+ GLoadedContent *content; /* Contenu courant */
- binary = get_current_binary();
+ content = g_loaded_panel_get_content(panel);
- focus_address_in_status_info(info, binary, addr);
+ focus_cursor_in_status_info(info, content, cursor);
- g_object_unref(G_OBJECT(binary));
+ g_object_unref(G_OBJECT(content));
}
/******************************************************************************
* *
-* Paramètres : info = composant réactif à mettre à jour. *
-* binary = binaire contenant l'adresse à représenter. *
-* addr = adresse mémoire à mettre en avant. *
+* Paramètres : info = composant réactif à mettre à jour. *
+* content = contenu contenant le curseur à représenter. *
+* cursor = nouvel emplacement du curseur courant. *
* *
* Description : Concentre l'attention de l'ensemble sur une adresse donnée. *
* *
@@ -247,30 +247,12 @@ static void track_caret_address_for_status_info(GStatusInfo *info, GtkBufferDisp
* *
******************************************************************************/
-static void focus_address_in_status_info(GStatusInfo *info, GLoadedBinary *binary, const vmpa2t *addr)
+static void focus_cursor_in_status_info(GStatusInfo *info, GLoadedContent *content, const GLineCursor *cursor)
{
GEditorItem *item; /* Autre version de l'élément */
- GArchProcessor *proc; /* Architecture du binaire */
- GArchInstruction *instr; /* Instruction présente */
item = G_EDITOR_ITEM(info);
- if (is_invalid_vmpa(addr))
- gtk_status_stack_reset_current_instruction(GTK_STATUS_STACK(item->widget));
-
- else
- {
- proc = g_loaded_binary_get_processor(binary);
-
- instr = _g_arch_processor_find_instr_by_address(proc, addr, true);
- assert(instr != NULL);
-
- gtk_status_stack_update_current_instruction(GTK_STATUS_STACK(item->widget), binary, instr);
-
- g_object_unref(G_OBJECT(instr));
-
- g_object_unref(G_OBJECT(proc));
-
- }
+ g_line_cursor_show_status(cursor, GTK_STATUS_STACK(item->widget), content);
}
diff --git a/src/gui/tb/portions.c b/src/gui/tb/portions.c
index f60f83c..202cd43 100644
--- a/src/gui/tb/portions.c
+++ b/src/gui/tb/portions.c
@@ -32,7 +32,9 @@
#include "../core/global.h"
#include "../core/items.h"
#include "../../format/format.h"
+#include "../../glibext/gbinarycursor.h"
#include "../../gtkext/gtkbinarystrip.h"
+#include "../../gtkext/gtkdisplaypanel.h"
@@ -66,7 +68,7 @@ static void g_portions_tbitem_dispose(GPortionsTbItem *);
static void g_portions_tbitem_finalize(GPortionsTbItem *);
/* Réagit à un changement du binaire courant. */
-static void update_portions_item_binary(GEditorItem *, GLoadedBinary *);
+static void change_portions_tbitem_current_content(GEditorItem *, GLoadedContent *, GLoadedContent *);
/* Fait suivre un changement d'adresse dans la barre. */
static void track_address_on_binary_strip(GtkBinaryStrip *, GEditorItem *);
@@ -100,7 +102,7 @@ static void g_portions_tbitem_class_init(GPortionsTbItemClass *klass)
object->dispose = (GObjectFinalizeFunc/* ! */)g_portions_tbitem_dispose;
object->finalize = (GObjectFinalizeFunc)g_portions_tbitem_finalize;
- item->update_binary = update_portions_item_binary;
+ item->change_content = change_portions_tbitem_current_content;
}
@@ -204,8 +206,9 @@ GEditorItem *create_portions_tb_item(GObject *ref)
/******************************************************************************
* *
-* Paramètres : item = élément réactif sollicité. *
-* binary = binaire chargé nouvellement affiché. *
+* Paramètres : item = élément réactif sollicité. *
+* old = ancien contenu chargé analysé. *
+* new = nouveau contenu chargé à analyser. *
* *
* Description : Réagit à un changement du binaire courant. *
* *
@@ -215,10 +218,16 @@ GEditorItem *create_portions_tb_item(GObject *ref)
* *
******************************************************************************/
-static void update_portions_item_binary(GEditorItem *item, GLoadedBinary *binary)
+static void change_portions_tbitem_current_content(GEditorItem *item, GLoadedContent *old, GLoadedContent *new)
{
+ GLoadedBinary *binary; /* Autre version de l'instance */
GtkBinaryStrip *strip; /* Bande pour binaire */
+ if (G_IS_LOADED_BINARY(new))
+ binary = G_LOADED_BINARY(new);
+ else
+ binary = NULL;
+
strip = GTK_BINARY_STRIP(g_object_get_data(G_OBJECT(item->widget), "strip"));
gtk_binary_strip_attach(strip, binary);
@@ -244,19 +253,25 @@ static void track_address_on_binary_strip(GtkBinaryStrip *strip, GEditorItem *it
{
const vmpa2t *addr; /* Nouvelle destination */
GLoadedPanel *panel; /* Afficheur effectif de code */
- GLoadedBinary *binary; /* Binaire chargé et actif */
+ GLoadedContent *content; /* Contenu chargé et actif */
+ GLineCursor *cursor; /* Emplacement à afficher */
addr = gtk_binary_strip_get_location(strip);
panel = get_current_view();
- binary = get_current_binary();
+ content = get_current_content();
if (GTK_IS_DISPLAY_PANEL(panel))
gtk_display_panel_request_move(GTK_DISPLAY_PANEL(panel), addr);
- focus_address_in_editor_items(binary, addr, item);
+ cursor = g_binary_cursor_new();
+ g_binary_cursor_update(G_BINARY_CURSOR(cursor), addr);
+
+ focus_cursor_in_editor_items(content, cursor, item);
+
+ g_object_unref(G_OBJECT(cursor));
- g_object_unref(G_OBJECT(binary));
+ g_object_unref(G_OBJECT(content));
g_object_unref(G_OBJECT(panel));
}