From 8ca477e012b11a19363542d171b8e973d637641c Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sun, 27 Aug 2017 00:15:05 +0200 Subject: Removed most of the functions using the editor items as global access to active items. --- ChangeLog | 44 +++++ plugins/pychrysa/arch/vmpa.c | 2 +- plugins/pychrysa/gui/editem.c | 83 --------- src/analysis/db/items/move.c | 5 +- src/analysis/project.c | 3 + src/gtkext/gtkgraphdisplay.c | 2 +- src/gui/core/Makefile.am | 1 + src/gui/core/global.c | 185 ++++++++++++++++++- src/gui/core/global.h | 20 +++ src/gui/core/items.c | 374 ++++++++++++++++++++++++++++++++++++++ src/gui/core/items.h | 55 ++++++ src/gui/core/panels.c | 1 + src/gui/editem.c | 404 ------------------------------------------ src/gui/editem.h | 38 +--- src/gui/editor.c | 54 +++--- src/gui/menus/binary.c | 16 +- src/gui/menus/binary.h | 1 + src/gui/menus/edition.c | 59 +++--- src/gui/menus/view.c | 66 ++++--- src/gui/menus/view.h | 1 + src/gui/panels/bintree.c | 10 +- src/gui/panels/bookmarks.c | 15 +- src/gui/panels/errors.c | 10 +- src/gui/panels/strings.c | 21 ++- src/gui/panels/symbols.c | 12 +- src/gui/panels/welcome.c | 1 + src/gui/status.c | 7 +- src/gui/tb/portions.c | 14 +- 28 files changed, 854 insertions(+), 650 deletions(-) create mode 100644 src/gui/core/items.c create mode 100644 src/gui/core/items.h diff --git a/ChangeLog b/ChangeLog index d88cfe6..3fda9b4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,47 @@ +17-08-27 Cyrille Bagard + + * plugins/pychrysa/arch/vmpa.c: + * plugins/pychrysa/gui/editem.c: + * src/analysis/db/items/move.c: + * src/analysis/project.c: + * src/gtkext/gtkgraphdisplay.c: + Update code. + + * src/gui/core/Makefile.am: + Add the 'items.[ch]' files to libguicore_la_SOURCES. + + * src/gui/core/global.c: + * src/gui/core/global.h: + Extend the list of global variables. + + * src/gui/core/items.c: + * src/gui/core/items.h: + New entries: handle all changes relative to the editor items. + + * src/gui/core/panels.c: + Update code. + + * src/gui/editem.c: + * src/gui/editem.h: + Remove most of the functions using the editor items as global access + to active items. + + * src/gui/editor.c: + * src/gui/menus/binary.c: + * src/gui/menus/binary.h: + * src/gui/menus/edition.c: + * src/gui/menus/view.c: + * src/gui/menus/view.h: + * src/gui/panels/bintree.c: + * src/gui/panels/bookmarks.c: + * src/gui/panels/errors.c: + * src/gui/panels/strings.c: + * src/gui/panels/symbols.c: + * src/gui/panels/welcome.c: + * src/gui/status.c: + * src/gui/tb/portions.c: + Update code. + 17-08-22 Cyrille Bagard * plugins/pychrysa/pychrysa.c: diff --git a/plugins/pychrysa/arch/vmpa.c b/plugins/pychrysa/arch/vmpa.c index 03434d7..8d42a78 100644 --- a/plugins/pychrysa/arch/vmpa.c +++ b/plugins/pychrysa/arch/vmpa.c @@ -504,7 +504,7 @@ void log_variadic_message(/*LogMessageType*/ int type, const char *fmt, ...) void change_editor_items_current_view_content(void/*GtkDisplayPanel*/ *view) { - + /* FIXME */ } diff --git a/plugins/pychrysa/gui/editem.c b/plugins/pychrysa/gui/editem.c index 69b135d..a7e9206 100644 --- a/plugins/pychrysa/gui/editem.c +++ b/plugins/pychrysa/gui/editem.c @@ -58,9 +58,6 @@ static PyObject *py_editor_item_update_for_view(PyObject *, PyObject *); /* Réagit à un changement d'affichage principal de contenu. */ static PyObject *py_editor_item_update_for_content(PyObject *, PyObject *); -/* Fournit l'affichage de binaire courant. */ -static PyObject *py_editor_item_get_current_view(PyObject *, PyObject *); - /* Procède à l'enregistrement d'un élément reactif de l'éditeur. */ static PyObject *py_editor_item_register(PyObject *, PyObject *); @@ -257,76 +254,6 @@ static PyObject *py_editor_item_update_for_content(PyObject *self, PyObject *arg * Paramètres : self = classe représentant un binaire. * * args = arguments fournis à l'appel. * * * -* Description : Fournit le gestionnaire du binaire courant. * -* * -* Retour : Instance en place ou Py_None si aucune. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_editor_item_get_current_binary(PyObject *self, PyObject *args) -{ - PyObject *result; /* Résultat à retourner */ - GEditorItem *item; /* Elément à manipuler */ - GLoadedBinary *binary; /* Instance à convertir */ - - item = G_EDITOR_ITEM(pygobject_get(self)); - binary = g_editor_item_get_current_binary(item); - - if (binary == NULL) - { - Py_INCREF(Py_None); - result = Py_None; - } - else - result = pygobject_new(G_OBJECT(binary)); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = classe représentant un binaire. * -* args = arguments fournis à l'appel. * -* * -* Description : Fournit l'affichage de binaire courant. * -* * -* Retour : Instance en place ou Py_None si aucune. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_editor_item_get_current_view(PyObject *self, PyObject *args) -{ - PyObject *result; /* Résultat à retourner */ - GEditorItem *item; /* Elément à manipuler */ - GtkDisplayPanel *panel; /* Instance à convertir */ - - item = G_EDITOR_ITEM(pygobject_get(self)); - panel = g_editor_item_get_current_view(item); - - if (panel == NULL) - { - Py_INCREF(Py_None); - result = Py_None; - } - else - result = pygobject_new(G_OBJECT(panel)); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : self = classe représentant un binaire. * -* args = arguments fournis à l'appel. * -* * * Description : Procède à l'enregistrement d'un élément reactif de l'éditeur.* * * * Retour : - * @@ -384,16 +311,6 @@ PyTypeObject *get_python_editor_item_type(void) "Called by Chrysalide on each view content change, if the item is registered." }, { - "get_current_binary()", (PyCFunction)py_editor_item_get_current_binary, - METH_NOARGS, - "get_current_binary($self, /)\n--\n\nProvide the current binary." - }, - { - "get_current_view", (PyCFunction)py_editor_item_get_current_view, - METH_NOARGS, - "get_current_view($self, /)\n--\n\nProvide the current binary view." - }, - { "register", (PyCFunction)py_editor_item_register, METH_NOARGS, "register($self, /)\n--\n\nRegister the item as editor item." diff --git a/src/analysis/db/items/move.c b/src/analysis/db/items/move.c index 4fd1667..562d749 100644 --- a/src/analysis/db/items/move.c +++ b/src/analysis/db/items/move.c @@ -35,7 +35,7 @@ #include "../collection-int.h" #include "../item-int.h" -#include "../../../gui/editem.h" +#include "../../../gui/core/global.h" #include "../../../gtkext/gtkdisplaypanel.h" @@ -445,14 +445,13 @@ static bool g_db_move_run(const GDbMove *move, const vmpa2t *addr) /* Lancement de l'opération */ - panel = g_editor_item_get_current_view(NULL); + panel = get_current_view(); if (panel != NULL) { params = (move_params *)calloc(1, sizeof(move_params)); params->panel = panel; - g_object_ref(G_OBJECT(panel)); copy_vmpa(¶ms->addr, addr); diff --git a/src/analysis/project.c b/src/analysis/project.c index 83b1ee4..9377247 100644 --- a/src/analysis/project.c +++ b/src/analysis/project.c @@ -1029,6 +1029,9 @@ GtkDisplayPanel *get_alt_view_for_view_panel(GtkDisplayPanel *panel, BinaryView break; } + if (result != NULL) + g_object_ref(G_OBJECT(result)); + return result; } diff --git a/src/gtkext/gtkgraphdisplay.c b/src/gtkext/gtkgraphdisplay.c index 1d88e42..4d11050 100644 --- a/src/gtkext/gtkgraphdisplay.c +++ b/src/gtkext/gtkgraphdisplay.c @@ -33,7 +33,7 @@ #include "graph/cluster.h" #include "../analysis/routine.h" #include "../format/format.h" -#include "../gui/editem.h" +#include "../gui/core/items.h" diff --git a/src/gui/core/Makefile.am b/src/gui/core/Makefile.am index 85aaacf..3f73c6c 100755 --- a/src/gui/core/Makefile.am +++ b/src/gui/core/Makefile.am @@ -4,6 +4,7 @@ noinst_LTLIBRARIES = libguicore.la libguicore_la_SOURCES = \ core.h core.c \ global.h global.c \ + items.h items.c \ panels.h panels.c \ theme.h theme.c diff --git a/src/gui/core/global.c b/src/gui/core/global.c index c030623..1eb8672 100644 --- a/src/gui/core/global.c +++ b/src/gui/core/global.c @@ -28,6 +28,21 @@ /* Barre de statut principale */ static GtkStatusStack *_status = NULL; +/* Binaire en cours d'étude ou NULL */ +static GLoadedBinary *_current_binary = NULL; + +G_LOCK_DEFINE_STATIC(_cb_mutex); + +/* Suivi du panneau d'affichage courant ou NULL */ +static GtkDisplayPanel *_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); + /****************************************************************************** @@ -55,7 +70,7 @@ void set_global_status(GtkStatusStack *status) * * * Description : Fournit l'adresse de la barre de statut principale. * * * -* Retour : barre de statut à tenir informée. * +* Retour : Barre de statut à tenir informée. * * * * Remarques : - * * * @@ -66,3 +81,171 @@ GtkStatusStack *get_global_status(void) return _status; } + + +/****************************************************************************** +* * +* Paramètres : binary = instance de binaire chargé. * +* * +* Description : Définit le binaire actif en cours d'étude. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void set_current_binary(GLoadedBinary *binary) +{ + G_LOCK(_cb_mutex); + + if (_current_binary != NULL) + g_object_unref(G_OBJECT(_current_binary)); + + _current_binary = binary; + + G_UNLOCK(_cb_mutex); + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Fournit le binaire actif en cours d'étude. * +* * +* Retour : Instance courante de binaire étudié ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GLoadedBinary *get_current_binary(void) +{ + GLoadedBinary *result; /* Instance à retourner */ + + G_LOCK(_cb_mutex); + + result = _current_binary; + + if (result != NULL) + g_object_ref(G_OBJECT(result)); + + G_UNLOCK(_cb_mutex); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : view = représentation courante de binaire. * +* * +* Description : Définit l'affichage de binaire courant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void set_current_view(GtkDisplayPanel *view) +{ + G_LOCK(_cv_mutex); + + if (_current_view != NULL) + g_object_unref(G_OBJECT(_current_view)); + + _current_view = view; + + G_UNLOCK(_cv_mutex); + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Fournit l'affichage de binaire courant. * +* * +* Retour : Instance en place ou NULL si aucune. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkDisplayPanel *get_current_view(void) +{ + GtkDisplayPanel *result; /* Instance à retourner */ + + G_LOCK(_cv_mutex); + + result = _current_view; + + if (result != NULL) + g_object_ref(G_OBJECT(result)); + + G_UNLOCK(_cv_mutex); + + 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 2306438..33225e3 100644 --- a/src/gui/core/global.h +++ b/src/gui/core/global.h @@ -25,6 +25,8 @@ #define _GUI_CORE_GLOBAL_H +#include "../../analysis/binary.h" +#include "../../gtkext/gtkdisplaypanel.h" #include "../../gtkext/gtkstatusstack.h" @@ -35,6 +37,24 @@ 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 *); + +/* Fournit le binaire actif en cours d'étude. */ +GLoadedBinary *get_current_binary(void); + +/* Définit l'affichage de binaire courant. */ +void set_current_view(GtkDisplayPanel *); + +/* Fournit l'affichage de binaire courant. */ +GtkDisplayPanel *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 new file mode 100644 index 0000000..923a565 --- /dev/null +++ b/src/gui/core/items.c @@ -0,0 +1,374 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * items.c - manipulation de l'ensemble des composants graphiques actifs + * + * Copyright (C) 2017 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + */ + + +#include "items.h" + + +#include "global.h" +#include "../editem-int.h" +#include "../../analysis/db/items/move.h" + + + +/* Liste des éléments enregistrés */ +static GEditorItem *_editem_list = NULL; + + +/* Suit les changements de focus des panneaux d'affichage. */ +static gboolean notify_view_panel_focus_change(GtkDisplayPanel *, GdkEventFocus *, gpointer); + +/* Lance une procédure de déplacement de la position courante. */ +static void start_moving_to_address_in_view_panel(GtkDisplayPanel *, const vmpa2t *, gpointer); + +/* Suit les changements de position dans du code d'assembleur. */ +static void track_caret_address_on_view_panel(GtkDisplayPanel *, const vmpa2t *, gpointer); + + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Procède à l'enregistrement d'un élément reactif de l'éditeur.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void register_editor_item(GEditorItem *item) +{ + editem_list_add_tail(item, &_editem_list); + +} + + +/****************************************************************************** +* * +* Paramètres : binary = nouvelle instance de binaire analysé. * +* * +* Description : Lance une actualisation du fait d'un changement de binaire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void change_editor_items_current_binary(GLoadedBinary *binary) +{ + GEditorItem *iter; /* Boucle de parcours */ + GEditorItemClass *klass; /* Classe correspondante */ + + set_current_binary(binary); + + editem_list_for_each(iter, _editem_list) + { + 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 : - * +* * +******************************************************************************/ + +static gboolean notify_view_panel_focus_change(GtkDisplayPanel *panel, GdkEventFocus *event, 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->notify_focus != NULL) + klass->notify_focus(iter, event->in ? panel : NULL); + + } + + return FALSE; + +} + + +/****************************************************************************** +* * +* Paramètres : panel = composant d'affichage parcouru. * +* addr = adresse de destination du curseur souhaitée. * +* unused = adresse non utilisée ici. * +* * +* Description : Lance une procédure de déplacement de la position courante. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void start_moving_to_address_in_view_panel(GtkDisplayPanel *panel, const vmpa2t *addr, gpointer unused) +{ + const vmpa2t *src; /* Position courante de curseur*/ + GDbMove *move; /* Déplacement à organiser */ + GLoadedBinary *binary; /* Binaire en cours d'étude */ + + src = gtk_display_panel_get_caret_location(panel); + + /* S'il n'y a pas de passif, pas besoin d'historique */ + if (src == NULL) + gtk_display_panel_scroll_to_address(panel, addr, SPT_CENTER); + + else + { + move = g_db_move_new(src, addr); + + binary = gtk_display_panel_get_binary(panel); + g_loaded_binary_add_to_collection(binary, G_DB_ITEM(move)); + g_object_unref(G_OBJECT(binary)); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : panel = composant d'affichage parcouru. * +* addr = nouvelle adresse du curseur courant. * +* unused = adresse non utilisée ici. * +* * +* Description : Suit les changements de position dans du code d'assembleur. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void track_caret_address_on_view_panel(GtkDisplayPanel *panel, const vmpa2t *addr, 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); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : panel = nouveau panneau d'affichage actif. * +* * +* Description : Lance une actualisation du fait d'un changement de vue. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void change_editor_items_current_view(GtkDisplayPanel *panel) +{ + GtkDisplayPanel *view; /* Affichage actif */ + GEditorItem *iter; /* Boucle de parcours */ + GEditorItemClass *klass; /* Classe correspondante */ + GObject *caret; /* Support du curseur actif */ + + /* Suivi des affichages */ + + view = get_current_view(); + + if (view != NULL) + { + 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); + + 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); + } + + /* Suivi du curseur */ + + caret = get_caret_instance(); + + if (caret != NULL) + { + g_signal_handlers_disconnect_by_func(caret, + G_CALLBACK(start_moving_to_address_in_view_panel), + NULL); + g_signal_handlers_disconnect_by_func(caret, + G_CALLBACK(track_caret_address_on_view_panel), + NULL); + + set_caret_instance(NULL); + g_object_unref(caret); + + } + + if (panel != NULL) + { + g_signal_connect(panel, "move-request", + G_CALLBACK(start_moving_to_address_in_view_panel), + NULL); + + g_signal_connect(panel, "caret-moved", + G_CALLBACK(track_caret_address_on_view_panel), + NULL); + + caret = G_OBJECT(panel); + + g_object_ref(caret); + set_caret_instance(caret); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : panel = nouveau panneau d'affichage actif. * +* * +* Description : Lance une actualisation du fait d'un changement de contenu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void change_editor_items_current_view_content(GtkDisplayPanel *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); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : binary = binaire contenant l'adresse à représenter. * +* addr = adresse mémoire à mettre en avant. * +* source = composant à l'origine du changement. * +* * +* Description : Concentre l'attention de l'ensemble sur une adresse donnée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void focus_address_in_editor_items(GLoadedBinary *binary, const vmpa2t *addr, 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); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : project = projet concerné par l'évolution. * +* * +* Description : Lance une actualisation relative à l'étendue du projet. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void update_project_area(GStudyProject *project) +{ + 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_project != NULL) + klass->update_project(iter, project); + + } + +} diff --git a/src/gui/core/items.h b/src/gui/core/items.h new file mode 100644 index 0000000..fc73b5e --- /dev/null +++ b/src/gui/core/items.h @@ -0,0 +1,55 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * items.h - prototypes pour la manipulation de l'ensemble des composants graphiques actifs + * + * Copyright (C) 2017 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + */ + + +#ifndef _GUI_CORE_ITEMS_H +#define _GUI_CORE_ITEMS_H + + +#include "../editem.h" +#include "../../analysis/binary.h" +#include "../../analysis/project.h" +#include "../../gtkext/gtkdisplaypanel.h" + + + +/* 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 vue. */ +void change_editor_items_current_view(GtkDisplayPanel *); + +/* Lance une actualisation du fait d'un changement de contenu. */ +void change_editor_items_current_view_content(GtkDisplayPanel *); + +/* Concentre l'attention de l'ensemble sur une adresse donnée. */ +void focus_address_in_editor_items(GLoadedBinary *, const vmpa2t *, GEditorItem *); + +/* Lance une actualisation relative à l'étendue du projet. */ +void update_project_area(GStudyProject *); + + + +#endif /* _GUI_CORE_ITEMS_H */ diff --git a/src/gui/core/panels.c b/src/gui/core/panels.c index 38a2c43..5a1beb1 100644 --- a/src/gui/core/panels.c +++ b/src/gui/core/panels.c @@ -25,6 +25,7 @@ #include "panels.h" +#include "items.h" #include "../panels/bintree.h" #include "../panels/bookmarks.h" #include "../panels/errors.h" diff --git a/src/gui/editem.c b/src/gui/editem.c index 0eead32..4848cc9 100644 --- a/src/gui/editem.c +++ b/src/gui/editem.c @@ -26,13 +26,9 @@ #include "editem-int.h" -#include "../analysis/db/items/move.h" -/* ------------------------- ELEMENT INDIVIDUEL D'INTERFACE ------------------------- */ - - /* Initialise la classe des éléments réactifs de l'éditeur. */ static void g_editor_item_class_init(GEditorItemClass *); @@ -40,36 +36,6 @@ static void g_editor_item_class_init(GEditorItemClass *); static void g_editor_item_init(GEditorItem *); - -/* ---------------------------- MANIPULATION D'ENSEMBLES ---------------------------- */ - - -/* Liste des éléments enregistrés */ -static GEditorItem *_editem_list = NULL; - -/* Suivi du panneau d'affichage courant */ -static GtkDisplayPanel *_current_view = NULL; - -/* Suivi des changements de position */ -static GObject *_caret_instance = NULL; - - -/* Suit les changements de focus des panneaux d'affichage. */ -static gboolean notify_view_panel_focus_change(GtkDisplayPanel *, GdkEventFocus *, void *); - -/* Lance une procédure de déplacement de la position courante. */ -static void start_moving_to_address_in_view_panel(GtkDisplayPanel *, const vmpa2t *, void *); - -/* Suit les changements de position dans du code d'assembleur. */ -static void track_caret_address_on_view_panel(GtkDisplayPanel *, const vmpa2t *, void *); - - - -/* ---------------------------------------------------------------------------------- */ -/* ELEMENT INDIVIDUEL D'INTERFACE */ -/* ---------------------------------------------------------------------------------- */ - - /* Indique le type défini pour un élément réactif d'éditeur. */ G_DEFINE_TYPE(GEditorItem, g_editor_item, G_TYPE_OBJECT); @@ -166,373 +132,3 @@ GtkWidget *g_editor_item_get_widget(const GEditorItem *item) return item->widget; } - - -/****************************************************************************** -* * -* Paramètres : item = instance à consulter. * -* * -* Description : Fournit le gestionnaire du binaire courant. * -* * -* Retour : Instance en place ou NULL si aucune. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GLoadedBinary *g_editor_item_get_current_binary(const GEditorItem *item) -{ - return g_object_get_data(item->ref, "current_binary"); - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance à consulter. * -* * -* Description : Fournit l'affichage de binaire courant. * -* * -* Retour : Instance en place ou NULL si aucune. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkDisplayPanel *g_editor_item_get_current_view(const GEditorItem *item) -{ - return _current_view; - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* MANIPULATION D'ENSEMBLES */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Procède à l'enregistrement d'un élément reactif de l'éditeur.* -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void register_editor_item(GEditorItem *item) -{ - editem_list_add_tail(item, &_editem_list); - -} - - -/****************************************************************************** -* * -* Paramètres : ref = espace de référencement global. * -* binary = nouvelle instance de binaire analysé. * -* * -* Description : Lance une actualisation du fait d'un changement de binaire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void change_editor_items_current_binary(GObject *ref, GLoadedBinary *binary) -{ - GEditorItem *iter; /* Boucle de parcours */ - GEditorItemClass *klass; /* Classe correspondante */ - - if (binary == NULL) - g_object_set_data(ref, "current_binary", NULL); - - else - { - g_object_ref(G_OBJECT(binary)); - g_object_set_data_full(ref, "current_binary", binary, g_object_unref); - } - - editem_list_for_each(iter, _editem_list) - { - 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. * -* data = adresse non utilisée ici. * -* * -* Description : Suit les changements de focus des panneaux d'affichage. * -* * -* Retour : FALSE pour continuer la propagation. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static gboolean notify_view_panel_focus_change(GtkDisplayPanel *panel, GdkEventFocus *event, void *data) -{ - 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->notify_focus != NULL) - klass->notify_focus(iter, event->in ? panel : NULL); - - } - - return FALSE; - -} - - -/****************************************************************************** -* * -* Paramètres : panel = composant d'affichage parcouru. * -* addr = adresse de destination du curseur souhaitée. * -* data = adresse non utilisée ici. * -* * -* Description : Lance une procédure de déplacement de la position courante. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void start_moving_to_address_in_view_panel(GtkDisplayPanel *panel, const vmpa2t *addr, void *data) -{ - const vmpa2t *src; /* Position courante de curseur*/ - GDbMove *move; /* Déplacement à organiser */ - GLoadedBinary *binary; /* Binaire en cours d'étude */ - - src = gtk_display_panel_get_caret_location(panel); - - /* S'il n'y a pas de passif, pas besoin d'historique */ - if (src == NULL) - gtk_display_panel_scroll_to_address(panel, addr, SPT_CENTER); - - else - { - move = g_db_move_new(src, addr); - - binary = gtk_display_panel_get_binary(panel); - g_loaded_binary_add_to_collection(binary, G_DB_ITEM(move)); - g_object_unref(G_OBJECT(binary)); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : panel = composant d'affichage parcouru. * -* addr = nouvelle adresse du curseur courant. * -* data = adresse non utilisée ici. * -* * -* Description : Suit les changements de position dans du code d'assembleur. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void track_caret_address_on_view_panel(GtkDisplayPanel *panel, const vmpa2t *addr, void *data) -{ - 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); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : ref = espace de référencement global. * -* panel = nouveau panneau d'affichage actif. * -* * -* Description : Lance une actualisation du fait d'un changement de vue. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void change_editor_items_current_view(GObject *ref, GtkDisplayPanel *panel) -{ - GEditorItem *iter; /* Boucle de parcours */ - GEditorItemClass *klass; /* Classe correspondante */ - - /* Suivi des affichages */ - - if (_current_view != NULL) - { - g_signal_handlers_disconnect_by_func(_current_view, G_CALLBACK(notify_view_panel_focus_change), NULL); - g_signal_handlers_disconnect_by_func(_current_view, G_CALLBACK(notify_view_panel_focus_change), NULL); - } - - _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); - } - - /* Suivi du curseur */ - - if (_caret_instance != NULL) - { - g_signal_handlers_disconnect_by_func(_caret_instance, - G_CALLBACK(start_moving_to_address_in_view_panel), - NULL); - g_signal_handlers_disconnect_by_func(_caret_instance, - G_CALLBACK(track_caret_address_on_view_panel), - NULL); - g_object_unref(_caret_instance); - _caret_instance = NULL; - } - - if (panel != NULL) - { - g_signal_connect(panel, "move-request", - G_CALLBACK(start_moving_to_address_in_view_panel), - NULL); - - g_signal_connect(panel, "caret-moved", - G_CALLBACK(track_caret_address_on_view_panel), - NULL); - - _caret_instance = G_OBJECT(panel); - g_object_ref(_caret_instance); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : ref = espace de référencement global. * -* panel = nouveau panneau d'affichage actif. * -* * -* Description : Lance une actualisation du fait d'un changement de contenu. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void change_editor_items_current_view_content(GtkDisplayPanel *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); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : binary = binaire contenant l'adresse à représenter. * -* addr = adresse mémoire à mettre en avant. * -* source = composant à l'origine du changement. * -* * -* Description : Concentre l'attention de l'ensemble sur une adresse donnée. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void focus_address_in_editor_items(GLoadedBinary *binary, const vmpa2t *addr, 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); - - } - -} - - -/****************************************************************************** -* * -* Paramètres : project = projet concerné par l'évolution. * -* * -* Description : Lance une actualisation relative à l'étendue du projet. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void update_project_area(GStudyProject *project) -{ - 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_project != NULL) - klass->update_project(iter, project); - - } - -} diff --git a/src/gui/editem.h b/src/gui/editem.h index 21de088..476299b 100644 --- a/src/gui/editem.h +++ b/src/gui/editem.h @@ -27,16 +27,9 @@ #include +#include -#include "../analysis/binary.h" -#include "../analysis/project.h" -#include "../gtkext/gtkdisplaypanel.h" - - - -/* ------------------------- ELEMENT INDIVIDUEL D'INTERFACE ------------------------- */ - #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)) @@ -65,35 +58,6 @@ 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 *); -/* Fournit le gestionnaire du binaire courant. */ -GLoadedBinary *g_editor_item_get_current_binary(const GEditorItem *); - -/* Fournit l'affichage de binaire courant. */ -GtkDisplayPanel *g_editor_item_get_current_view(const GEditorItem *); - - - -/* ---------------------------- MANIPULATION D'ENSEMBLES ---------------------------- */ - - -/* 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(GObject *, GLoadedBinary *); - -/* Lance une actualisation du fait d'un changement de vue. */ -void change_editor_items_current_view(GObject *, GtkDisplayPanel *); - -/* Lance une actualisation du fait d'un changement de contenu. */ -void change_editor_items_current_view_content(GtkDisplayPanel *); - -/* Concentre l'attention de l'ensemble sur une adresse donnée. */ -void focus_address_in_editor_items(GLoadedBinary *, const vmpa2t *, GEditorItem *); - -/* Lance une actualisation relative à l'étendue du projet. */ -void update_project_area(GStudyProject *); - #endif /* _GUI_EDITEM_H */ diff --git a/src/gui/editor.c b/src/gui/editor.c index d042acd..a3055c7 100644 --- a/src/gui/editor.c +++ b/src/gui/editor.c @@ -38,6 +38,8 @@ #include "menus/menubar.h" #include "core/core.h" #include "core/panels.h" +#include "core/global.h" +#include "core/items.h" #include "panels/panel.h" #include "panels/welcome.h" #include "tb/portions.h" @@ -147,7 +149,6 @@ typedef struct _panel_node /* Support de fond pour les composants. */ -static GObject *_global_ref = NULL; static GtkWidget *_support = NULL; static panel_node *_nodes = NULL; @@ -185,22 +186,22 @@ static void delete_panel_node(panel_node *); /* Réagit à une demande de placement d'un panneau d'affichage. */ -void on_panel_item_dock_request(GPanelItem *, void *); +void on_panel_item_dock_request(GPanelItem *, gpointer); /* Réagit à une demande de suppression d'un panneau d'affichage. */ -void on_panel_item_undock_request(GPanelItem *, void *); +void on_panel_item_undock_request(GPanelItem *, gpointer); /* Réagit au changement d'onglet d'un panneau quelconque. */ -static void on_dock_item_switch(GtkDockStation *, GtkWidget *, GObject *); +static void on_dock_item_switch(GtkDockStation *, GtkWidget *, gpointer); /* Encastre comme demandé un panneau dans l'éditeur. */ static void dock_panel_into_current_station(GtkCheckMenuItem *, GPanelItem *); /* Réagit à une demande de menu pour rajouter des panneaux. */ -static void on_dock_menu_request(GtkDockStation *, GtkWidget *, GObject *); +static void on_dock_menu_request(GtkDockStation *, GtkWidget *, gpointer); /* Réagit à une demande de fermeture du panneau courant. */ -static void on_dock_close_request(GtkDockStation *, GtkWidget *, GObject *); +static void on_dock_close_request(GtkDockStation *, GtkWidget *, gpointer); /* Réagit à une variation dans une séparation de panneaux. */ static void notify_paned_handle_position_change(GObject *, GParamSpec *, gpointer); @@ -338,7 +339,6 @@ GtkWidget *create_editor(void) do { - _global_ref = ref; _support = gtk_event_box_new(); gtk_widget_show(_support); @@ -370,7 +370,7 @@ GtkWidget *create_editor(void) /* Actualisation des contenus */ - change_editor_items_current_binary(ref, NULL); + change_editor_items_current_binary(NULL); @@ -702,9 +702,9 @@ static panel_node *create_simple_panel_node_for_item(GPanelItem *item, const cha /* Partie graphique */ station = gtk_dock_station_new(); - g_signal_connect(station, "switch-widget", G_CALLBACK(on_dock_item_switch), _global_ref); - g_signal_connect(station, "menu-requested", G_CALLBACK(on_dock_menu_request), _global_ref); - g_signal_connect(station, "close-requested", G_CALLBACK(on_dock_close_request), _global_ref); + g_signal_connect(station, "switch-widget", G_CALLBACK(on_dock_item_switch), NULL); + g_signal_connect(station, "menu-requested", G_CALLBACK(on_dock_menu_request), NULL); + g_signal_connect(station, "close-requested", G_CALLBACK(on_dock_close_request), NULL); gtk_widget_show(station); gtk_dock_station_add_dockable(GTK_DOCK_STATION(station), GTK_DOCKABLE(item)); @@ -1234,7 +1234,7 @@ static void delete_panel_node(panel_node *node) * * ******************************************************************************/ -void on_panel_item_dock_request(GPanelItem *panel, void *unused) +void on_panel_item_dock_request(GPanelItem *panel, gpointer unused) { const char *path; /* Chemin d'accès */ panel_node *node; /* Noeud à supprimer */ @@ -1291,7 +1291,7 @@ void on_panel_item_dock_request(GPanelItem *panel, void *unused) * * ******************************************************************************/ -void on_panel_item_undock_request(GPanelItem *panel, void *unused) +void on_panel_item_undock_request(GPanelItem *panel, gpointer unused) { GtkWidget *station; /* Support courant */ GtkNotebook *notebook; /* Version parente de station */ @@ -1346,7 +1346,7 @@ void on_panel_item_undock_request(GPanelItem *panel, void *unused) * * * Paramètres : station = 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. * +* unused = adresse non utilisée ici. * * * * Description : Réagit au changement d'onglet d'un panneau quelconque. * * * @@ -1356,7 +1356,7 @@ void on_panel_item_undock_request(GPanelItem *panel, void *unused) * * ******************************************************************************/ -static void on_dock_item_switch(GtkDockStation *station, GtkWidget *widget, GObject *ref) +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 */ @@ -1371,20 +1371,18 @@ static void on_dock_item_switch(GtkDockStation *station, GtkWidget *widget, GObj { /* Changement de binaire ? */ - old_binary = G_LOADED_BINARY(g_object_get_data(ref, "current_binary")); + old_binary = get_current_binary(); binary = gtk_display_panel_get_binary(GTK_DISPLAY_PANEL(widget)); if (old_binary != binary) - { - //notify_panels_of_binary_change(binary); - change_editor_items_current_binary(ref, binary); - } - - change_editor_items_current_view(ref, GTK_DISPLAY_PANEL(widget)); + change_editor_items_current_binary(binary); + else + g_object_unref(G_OBJECT(binary)); - //notify_panels_of_view_change(GTK_DISPLAY_PANEL(widget), false); + g_object_unref(G_OBJECT(old_binary)); - g_object_unref(G_OBJECT(binary)); + g_object_ref(G_OBJECT(widget)); + change_editor_items_current_view(GTK_DISPLAY_PANEL(widget)); } @@ -1424,7 +1422,7 @@ static void dock_panel_into_current_station(GtkCheckMenuItem *menuitem, GPanelIt * * * Paramètres : station = panneau de support des éléments concerné. * * button = bouton à l'origine de la procédure. * -* ref = adresse de l'espace de référencement global. * +* unsued = adresse non utilisée ici. * * * * Description : Réagit à une demande de menu pour rajouter des panneaux. * * * @@ -1434,7 +1432,7 @@ static void dock_panel_into_current_station(GtkCheckMenuItem *menuitem, GPanelIt * * ******************************************************************************/ -static void on_dock_menu_request(GtkDockStation *station, GtkWidget *button, GObject *ref) +static void on_dock_menu_request(GtkDockStation *station, GtkWidget *button, gpointer unused) { GtkWidget *active; /* Composant actif modèle */ GPanelItem *model; /* Panneau encapsulé */ @@ -1512,7 +1510,7 @@ static void on_dock_menu_request(GtkDockStation *station, GtkWidget *button, GOb * * * Paramètres : station = panneau de support des éléments concerné. * * button = bouton à l'origine de la procédure. * -* ref = adresse de l'espace de référencement global. * +* unused = adresse non utilisée ici. * * * * Description : Réagit à une demande de fermeture du panneau courant. * * * @@ -1522,7 +1520,7 @@ static void on_dock_menu_request(GtkDockStation *station, GtkWidget *button, GOb * * ******************************************************************************/ -static void on_dock_close_request(GtkDockStation *station, GtkWidget *button, GObject *ref) +static void on_dock_close_request(GtkDockStation *station, GtkWidget *button, gpointer unused) { gint index; /* Indice de la page courante */ GtkWidget *active; /* Composant actif modèle */ diff --git a/src/gui/menus/binary.c b/src/gui/menus/binary.c index 0eb28fe..e67c377 100644 --- a/src/gui/menus/binary.c +++ b/src/gui/menus/binary.c @@ -29,6 +29,7 @@ #include "../editem-int.h" +#include "../core/global.h" #include "../dialogs/export.h" #include "../dialogs/gotox.h" #include "../dialogs/storage.h" @@ -164,7 +165,7 @@ static void mcb_binary_entry_points(GtkMenuItem *menuitem, GMenuBar *bar) item = G_EDITOR_ITEM(bar); ref = g_editor_item_get_global_ref(item); - binary = g_editor_item_get_current_binary(item); + binary = get_current_binary(); dialog = create_gotox_dialog_for_entry_points(GTK_WINDOW(ref), binary); @@ -172,8 +173,9 @@ static void mcb_binary_entry_points(GtkMenuItem *menuitem, GMenuBar *bar) { addr = get_address_from_gotox_dialog(dialog); - panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + panel = get_current_view(); gtk_display_panel_request_move(panel, addr); + g_object_unref(G_OBJECT(panel)); delete_vmpa(addr); @@ -181,6 +183,8 @@ static void mcb_binary_entry_points(GtkMenuItem *menuitem, GMenuBar *bar) gtk_widget_destroy(dialog); + g_object_unref(G_OBJECT(binary)); + } @@ -223,7 +227,7 @@ static void mcb_binary_storage(GtkMenuItem *menuitem, GMenuBar *bar) GtkBuilder *builder; /* Constructeur utilisé */ GtkWidget *dialog; /* Boîte de dialogue à montrer */ - binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar)); + binary = get_current_binary(); ref = g_editor_item_get_global_ref(G_EDITOR_ITEM(bar)); dialog = create_storage_dialog(binary, GTK_WINDOW(ref), &builder); @@ -234,6 +238,8 @@ static void mcb_binary_storage(GtkMenuItem *menuitem, GMenuBar *bar) g_object_unref(G_OBJECT(builder)); + g_object_unref(G_OBJECT(binary)); + } @@ -254,8 +260,10 @@ static void mcb_binary_export(GtkMenuItem *menuitem, GMenuBar *bar) { GLoadedBinary *binary; /* Edition courante */ - binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar)); + binary = get_current_binary(); run_export_assistant(binary, GTK_WINDOW(G_EDITOR_ITEM(bar)->ref)); + g_object_unref(G_OBJECT(binary)); + } diff --git a/src/gui/menus/binary.h b/src/gui/menus/binary.h index 7662293..a66fe26 100644 --- a/src/gui/menus/binary.h +++ b/src/gui/menus/binary.h @@ -30,6 +30,7 @@ #include "menubar.h" +#include "../../gtkext/gtkdisplaypanel.h" diff --git a/src/gui/menus/edition.c b/src/gui/menus/edition.c index f41111d..2491e3d 100644 --- a/src/gui/menus/edition.c +++ b/src/gui/menus/edition.c @@ -31,6 +31,7 @@ #include +#include "../core/global.h" #include "../dialogs/bookmark.h" #include "../dialogs/goto.h" #include "../dialogs/gotox.h" @@ -44,13 +45,13 @@ static void mcb_edition_goto(GtkMenuItem *, GMenuBar *); /* Réagit avec le menu "Edition -> Operande numérique -> ...". */ -static void mcb_edition_switch_numeric_operand(GtkMenuItem *, GMenuBar *); +static void mcb_edition_switch_numeric_operand(GtkMenuItem *, gpointer); /* Réagit avec le menu "Edition -> Revenir en arrière". */ static void mcb_edition_go_back(GtkMenuItem *, GMenuBar *); /* Réagit avec le menu "Edition -> Suivre la référence". */ -static void mcb_edition_follow_ref(GtkMenuItem *, GMenuBar *); +static void mcb_edition_follow_ref(GtkMenuItem *, gpointer); /* Réagit avec le menu "Edition -> Lister toutes les réfs...". */ static void mcb_edition_list_xrefs(GtkMenuItem *, GMenuBar *); @@ -116,25 +117,25 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b deepmenubar = qck_create_menu(GTK_MENU_ITEM(submenuitem)); deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_hex", _("Hexadecimal"), - G_CALLBACK(mcb_edition_switch_numeric_operand), bar); + G_CALLBACK(mcb_edition_switch_numeric_operand), NULL); add_accelerator_to_menu_item(deepmenuitem, "H", accgroup); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_HEX)); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_dec", _("Decimal"), - G_CALLBACK(mcb_edition_switch_numeric_operand), bar); + G_CALLBACK(mcb_edition_switch_numeric_operand), NULL); add_accelerator_to_menu_item(deepmenuitem, "D", accgroup); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_DEC)); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_oct", _("Octal"), - G_CALLBACK(mcb_edition_switch_numeric_operand), bar); + G_CALLBACK(mcb_edition_switch_numeric_operand), NULL); add_accelerator_to_menu_item(deepmenuitem, "O", accgroup); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_OCT)); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_bin", _("Binary"), - G_CALLBACK(mcb_edition_switch_numeric_operand), bar); + G_CALLBACK(mcb_edition_switch_numeric_operand), NULL); add_accelerator_to_menu_item(deepmenuitem, "B", accgroup); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_BIN)); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); @@ -143,7 +144,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); deepmenuitem = qck_create_menu_item(ref, "mnu_edit_switch_def", _("Default"), - G_CALLBACK(mcb_edition_switch_numeric_operand), bar); + G_CALLBACK(mcb_edition_switch_numeric_operand), NULL); g_object_set_data(G_OBJECT(deepmenuitem), "kind_of_switch", GUINT_TO_POINTER(IOD_COUNT)); gtk_container_add(GTK_CONTAINER(deepmenubar), deepmenuitem); @@ -160,7 +161,7 @@ GtkWidget *build_menu_edition(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *b gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_menu_item(ref, "mnu_edit_follow_ref", _("Follow the reference"), - G_CALLBACK(mcb_edition_follow_ref), bar); + G_CALLBACK(mcb_edition_follow_ref), NULL); add_accelerator_to_menu_item(submenuitem, "Return", accgroup); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -321,8 +322,9 @@ static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar) { addr = get_address_from_goto_dialog(dialog); - panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + panel = get_current_view(); gtk_display_panel_request_move(panel, addr); + g_object_unref(G_OBJECT(panel)); delete_vmpa(addr); @@ -336,7 +338,7 @@ static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar) /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * -* bar = barre de menu parente. * +* unused = adresse non utilisée ici. * * * * Description : Réagit avec le menu "Edition -> Operande numérique -> ...". * * * @@ -346,10 +348,9 @@ static void mcb_edition_goto(GtkMenuItem *menuitem, GMenuBar *bar) * * ******************************************************************************/ -static void mcb_edition_switch_numeric_operand(GtkMenuItem *menuitem, GMenuBar *bar) +static void mcb_edition_switch_numeric_operand(GtkMenuItem *menuitem, gpointer unused) { ImmOperandDisplay display; /* Type de basculement */ - GEditorItem *editem; /* Autre version de la barre */ GtkDisplayPanel *panel; /* Afficheur effectif de code */ GBufferLine *line; /* Ligne de position courante */ GObject *creator; /* Créateur à l'orgine du seg. */ @@ -361,9 +362,7 @@ static void mcb_edition_switch_numeric_operand(GtkMenuItem *menuitem, GMenuBar * display = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuitem), "kind_of_switch")); - editem = G_EDITOR_ITEM(bar); - - panel = g_editor_item_get_current_view(editem); + panel = get_current_view(); if (gtk_display_panel_get_position(panel, &line, &creator)) { @@ -371,7 +370,7 @@ static void mcb_edition_switch_numeric_operand(GtkMenuItem *menuitem, GMenuBar * range = g_buffer_line_get_range(line); - binary = g_editor_item_get_current_binary(editem); + binary = get_current_binary(); proc = g_loaded_binary_get_processor(binary); instr = g_arch_processor_find_instr_by_address(proc, get_mrange_addr(range)); @@ -384,12 +383,15 @@ static void mcb_edition_switch_numeric_operand(GtkMenuItem *menuitem, GMenuBar * 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(line)); } + g_object_unref(G_OBJECT(panel)); + } @@ -415,7 +417,7 @@ static void mcb_edition_go_back(GtkMenuItem *menuitem, GMenuBar *bar) /****************************************************************************** * * * Paramètres : menuitem = élément de menu sélectionné. * -* bar = barre de menu parente. * +* unused = adresse non utilisée ici. * * * * Description : Réagit avec le menu "Edition -> Suivre la référence". * * * @@ -425,7 +427,7 @@ static void mcb_edition_go_back(GtkMenuItem *menuitem, GMenuBar *bar) * * ******************************************************************************/ -static void mcb_edition_follow_ref(GtkMenuItem *menuitem, GMenuBar *bar) +static void mcb_edition_follow_ref(GtkMenuItem *menuitem, gpointer unused) { GtkDisplayPanel *panel; /* Afficheur effectif de code */ GBufferLine *line; /* Ligne de position courante */ @@ -434,7 +436,7 @@ static void mcb_edition_follow_ref(GtkMenuItem *menuitem, GMenuBar *bar) vmpa2t addr; /* Adresse de destination */ virt_t virt; /* Adresse virtuelle */ - panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + panel = get_current_view(); if (gtk_display_panel_get_position(panel, &line, &creator)) { @@ -465,6 +467,8 @@ static void mcb_edition_follow_ref(GtkMenuItem *menuitem, GMenuBar *bar) } + g_object_unref(G_OBJECT(panel)); + } @@ -493,13 +497,13 @@ static void mcb_edition_list_xrefs(GtkMenuItem *menuitem, GMenuBar *bar) GtkWidget *dialog; /* Boîte de dialogue à montrer */ vmpa2t *addr; /* Adresse de destination */ - panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + panel = get_current_view(); if (gtk_display_panel_get_position(panel, &line, NULL)) { range = g_buffer_line_get_range(line); - binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar)); + binary = get_current_binary(); proc = g_loaded_binary_get_processor(binary); /** @@ -532,11 +536,14 @@ static void mcb_edition_list_xrefs(GtkMenuItem *menuitem, GMenuBar *bar) g_object_unref(G_OBJECT(instr)); g_object_unref(G_OBJECT(proc)); + g_object_unref(G_OBJECT(binary)); g_object_unref(G_OBJECT(line)); } + g_object_unref(G_OBJECT(panel)); + } @@ -555,7 +562,6 @@ static void mcb_edition_list_xrefs(GtkMenuItem *menuitem, GMenuBar *bar) static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) { - GEditorItem *editem; /* Autre version de la barre */ GtkDisplayPanel *panel; /* Vue offrant l'affichage */ const vmpa2t *curloc; /* Localisation d'un curseur */ GLoadedBinary *binary; /* Binaire en cours d'étude */ @@ -566,17 +572,15 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) GDbItem *bookmark; /* Nouveau signet défini */ gint ret; /* Retour de confirmation */ - editem = G_EDITOR_ITEM(bar); - /* Détermination de l'adresse visée */ - panel = g_editor_item_get_current_view(editem); + panel = get_current_view(); curloc = gtk_display_panel_get_caret_location(panel); /* Accès à la collection */ - binary = g_editor_item_get_current_binary(editem); + binary = get_current_binary(); collec = g_loaded_binary_find_collection(binary, DBF_BOOKMARKS); /** @@ -632,6 +636,9 @@ static void mcb_edition_bookmarks_toggle(GtkMenuItem *menuitem, GMenuBar *bar) } g_object_unref(G_OBJECT(collec)); + g_object_unref(G_OBJECT(binary)); + + g_object_unref(G_OBJECT(panel)); } diff --git a/src/gui/menus/view.c b/src/gui/menus/view.c index a00c614..5298af3 100644 --- a/src/gui/menus/view.c +++ b/src/gui/menus/view.c @@ -32,6 +32,8 @@ #include "../editem-int.h" +#include "../core/global.h" +#include "../core/items.h" #include "../core/panels.h" #include "../../analysis/project.h" #include "../../gtkext/easygtk.h" @@ -47,10 +49,10 @@ static void mcb_view_update_side_panels_list(GtkMenuItem *, GMenuBar *); static void mcb_view_change_panel_docking(GtkCheckMenuItem *, GPanelItem *); /* Réagit avec le menu "Affichage -> Vue xxx". */ -static void mcb_view_change_support(GtkRadioMenuItem *, GMenuBar *); +static void mcb_view_change_support(GtkRadioMenuItem *, gpointer); /* Réagit avec le menu "Affichage -> (colonne xxx)". */ -static void mcb_view_display_column(GtkCheckMenuItem *, GMenuBar *); +static void mcb_view_display_column(GtkCheckMenuItem *, gpointer); /* Réagit avec le menu "Affichage -> Plein écran". */ static void mcb_view_show_full_screen(GtkCheckMenuItem *, GMenuBar *); @@ -99,7 +101,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) /* Types de panneau de code */ submenuitem = qck_create_radio_menu_item(ref, "mnu_view_switch_textview", NULL, _("Text view"), - G_CALLBACK(mcb_view_change_support), bar); + G_CALLBACK(mcb_view_change_support), NULL); add_accelerator_to_menu_item(submenuitem, "F3", accgroup); g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_BLOCK)); g_object_set_data(G_OBJECT(submenuitem), "kind_of_display", GSIZE_TO_POINTER(GTK_TYPE_BLOCK_DISPLAY)); @@ -108,7 +110,7 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) rgroup = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(submenuitem)); submenuitem = qck_create_radio_menu_item(ref, "mnu_view_switch_graphview", rgroup, _("Graph view"), - G_CALLBACK(mcb_view_change_support), bar); + G_CALLBACK(mcb_view_change_support), NULL); add_accelerator_to_menu_item(submenuitem, "F4", accgroup); g_object_set_data(G_OBJECT(submenuitem), "kind_of_view", GUINT_TO_POINTER(BVW_GRAPH)); g_object_set_data(G_OBJECT(submenuitem), "kind_of_display", GSIZE_TO_POINTER(GTK_TYPE_GRAPH_DISPLAY)); @@ -122,17 +124,17 @@ GtkWidget *build_menu_view(GObject *ref, GtkAccelGroup *accgroup, GMenuBar *bar) /* Affichage des données */ submenuitem = qck_create_check_menu_item(ref, "mnu_view_display_off", _("Physical offset"), - G_CALLBACK(mcb_view_display_column), bar); + G_CALLBACK(mcb_view_display_column), NULL); g_object_set_data(G_OBJECT(submenuitem), "kind_of_col", GUINT_TO_POINTER(BLC_PHYSICAL)); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_check_menu_item(ref, "mnu_view_display_addr", _("Virtual address"), - G_CALLBACK(mcb_view_display_column), bar); + G_CALLBACK(mcb_view_display_column), NULL); g_object_set_data(G_OBJECT(submenuitem), "kind_of_col", GUINT_TO_POINTER(BLC_VIRTUAL)); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); submenuitem = qck_create_check_menu_item(ref, "mnu_view_display_code", _("Binary code"), - G_CALLBACK(mcb_view_display_column), bar); + G_CALLBACK(mcb_view_display_column), NULL); g_object_set_data(G_OBJECT(submenuitem), "kind_of_col", GUINT_TO_POINTER(BLC_BINARY)); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); @@ -173,8 +175,8 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB GtkRadioMenuItem *item; /* Elément de menu arbitraire */ GSList *radios; /* Liste des menus d'affichage */ GSList *found; /* Elément de menu à activer */ - GLoadedBinary *binary; /* Binaire courant */ BinaryView content; /* Type de vue active */ + GLoadedBinary *binary; /* Binaire courant */ const bool *display; /* Règles d'affichage courantes*/ GtkWidget *submenuitem; /* Sous-élément de menu */ bool status; /* Consigne d'affichage */ @@ -189,7 +191,7 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB void disconnect_display_radio(GtkWidget *wgt, gpointer unused) { - g_signal_handlers_disconnect_by_func(wgt, G_CALLBACK(mcb_view_change_support), bar); + g_signal_handlers_disconnect_by_func(wgt, G_CALLBACK(mcb_view_change_support), NULL); } @@ -216,7 +218,7 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB void reconnect_display_radio(GtkWidget *wgt, gpointer unused) { - g_signal_connect(wgt, "toggled", G_CALLBACK(mcb_view_change_support), bar); + g_signal_connect(wgt, "toggled", G_CALLBACK(mcb_view_change_support), NULL); } @@ -224,44 +226,46 @@ void update_menu_view_for_view(GtkWidget *widget, GtkDisplayPanel *panel, GMenuB /* - */ - binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar)); - content = gtk_display_panel_describe_content(panel); + binary = get_current_binary(); + display = g_loaded_binary_get_column_display(binary, content); + g_object_unref(G_OBJECT(binary)); + /* Positions physiques */ submenuitem = g_object_get_data(ref, "mnu_view_display_off"); - g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), bar); + g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), NULL); status = display[BLC_PHYSICAL]; gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); - g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), bar); + g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), NULL); /* Adresses virtuelles */ submenuitem = g_object_get_data(ref, "mnu_view_display_addr"); - g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), bar); + g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), NULL); status = display[BLC_VIRTUAL]; gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); - g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), bar); + g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), NULL); /* Code binaire */ submenuitem = g_object_get_data(ref, "mnu_view_display_code"); - g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), bar); + g_signal_handlers_disconnect_by_func(submenuitem, G_CALLBACK(mcb_view_display_column), NULL); status = display[BLC_BINARY]; gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(submenuitem), status); - g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), bar); + g_signal_connect(submenuitem, "toggled", G_CALLBACK(mcb_view_display_column), NULL); } @@ -447,7 +451,7 @@ static void mcb_view_change_panel_docking(GtkCheckMenuItem *menuitem, GPanelItem /****************************************************************************** * * * Paramètres : menuitem = élément de menu ayant basculé. * -* bar = barre de menu parente. * +* unused = adresse non utilisée ici. * * * * Description : Réagit avec le menu "Affichage -> Vue xxx". * * * @@ -457,7 +461,7 @@ static void mcb_view_change_panel_docking(GtkCheckMenuItem *menuitem, GPanelItem * * ******************************************************************************/ -static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar) +static void mcb_view_change_support(GtkRadioMenuItem *menuitem, gpointer unused) { GSList *group; /* Liste de menus radio */ GSList *iter; /* Boucle de parcours */ @@ -465,6 +469,7 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar) GtkDisplayPanel *panel; /* Afficheur effectif de code */ GtkDockStation *station; /* Base du remplacement */ GtkWidget *scroll; /* Nouveau support à utiliser */ + GtkDisplayPanel *new; /* Nouvel afficheur de code */ /* On ne traite qu'une seule fois ! */ if (!gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem))) return; @@ -477,19 +482,21 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar) wanted = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(iter->data), "kind_of_view")); - panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + panel = get_current_view(); station = get_dock_station_for_view_panel(panel); /* En vue du retrait de la station d'accueil... */ scroll = get_scroll_window_for_view_panel(panel); g_object_ref(G_OBJECT(scroll)); - panel = get_alt_view_for_view_panel(panel, wanted); - scroll = get_scroll_window_for_view_panel(panel); + new = get_alt_view_for_view_panel(panel, wanted); + scroll = get_scroll_window_for_view_panel(new); gtk_dock_panel_change_active_widget(station, scroll); - change_editor_items_current_view(G_EDITOR_ITEM(bar)->ref, panel); + change_editor_items_current_view(new); + + g_object_unref(G_OBJECT(panel)); } @@ -499,7 +506,7 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar) /****************************************************************************** * * * Paramètres : menuitem = élément de menu ayant basculé. * -* bar = barre de menu parente. * +* unused = adresse non utilisée ici. * * * * Description : Réagit avec le menu "Affichage -> (colonne xxx)". * * * @@ -509,7 +516,7 @@ static void mcb_view_change_support(GtkRadioMenuItem *menuitem, GMenuBar *bar) * * ******************************************************************************/ -static void mcb_view_display_column(GtkCheckMenuItem *menuitem, GMenuBar *bar) +static void mcb_view_display_column(GtkCheckMenuItem *menuitem, gpointer unused) { BufferLineColumn col; /* Colonne à traiter */ GLoadedBinary *binary; /* Binaire courant */ @@ -519,15 +526,18 @@ static void mcb_view_display_column(GtkCheckMenuItem *menuitem, GMenuBar *bar) col = GPOINTER_TO_UINT(g_object_get_data(G_OBJECT(menuitem), "kind_of_col")); - binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(bar)); + binary = get_current_binary(); - panel = g_editor_item_get_current_view(G_EDITOR_ITEM(bar)); + panel = get_current_view(); view = gtk_display_panel_describe_content(panel); + g_object_unref(G_OBJECT(panel)); active = gtk_check_menu_item_get_active(menuitem); g_loaded_binary_set_column_display(binary, view, col, active); + g_object_unref(G_OBJECT(binary)); + } diff --git a/src/gui/menus/view.h b/src/gui/menus/view.h index 65c57f7..d42bbc6 100644 --- a/src/gui/menus/view.h +++ b/src/gui/menus/view.h @@ -30,6 +30,7 @@ #include "menubar.h" +#include "../../gtkext/gtkdisplaypanel.h" diff --git a/src/gui/panels/bintree.c b/src/gui/panels/bintree.c index 1fa0cfe..b7c31c1 100644 --- a/src/gui/panels/bintree.c +++ b/src/gui/panels/bintree.c @@ -33,6 +33,7 @@ #include "panel-int.h" +#include "../core/global.h" #include "../../gtkext/tmgt.h" @@ -114,7 +115,7 @@ static void on_search_entry_changed(GtkSearchEntry *, GBintreePanel *); static void apply_filter_on_portions(GtkTreeStore *); /* Réagit au changement de sélection des portions. */ -static void on_bintree_selection_changed(GtkTreeSelection *, GBintreePanel *); +static void on_bintree_selection_changed(GtkTreeSelection *, gpointer); @@ -686,7 +687,7 @@ static void apply_filter_on_portions(GtkTreeStore *store) /****************************************************************************** * * * Paramètres : selection = sélection modifiée. * -* panel = structure contenant les informations maîtresses. * +* unused = adresse non utilisée ici. * * * * Description : Réagit au changement de sélection des portions. * * * @@ -696,7 +697,7 @@ static void apply_filter_on_portions(GtkTreeStore *store) * * ******************************************************************************/ -static void on_bintree_selection_changed(GtkTreeSelection *selection, GBintreePanel *panel) +static void on_bintree_selection_changed(GtkTreeSelection *selection, gpointer unused) { GtkTreeIter iter; /* Point de sélection */ GtkTreeModel *model; /* Modèle de gestion */ @@ -712,8 +713,9 @@ static void on_bintree_selection_changed(GtkTreeSelection *selection, GBintreePa { range = g_binary_portion_get_range(portion); - display = g_editor_item_get_current_view(G_EDITOR_ITEM(panel)); + display = get_current_view(); gtk_display_panel_request_move(display, get_mrange_addr(range)); + g_object_unref(G_OBJECT(display)); g_object_unref(G_OBJECT(portion)); diff --git a/src/gui/panels/bookmarks.c b/src/gui/panels/bookmarks.c index 9b360f3..20d2bd0 100644 --- a/src/gui/panels/bookmarks.c +++ b/src/gui/panels/bookmarks.c @@ -36,6 +36,7 @@ #include "panel-int.h" +#include "../core/global.h" #include "../../analysis/db/items/bookmark.h" #include "../../common/cpp.h" #include "../../common/extstr.h" @@ -119,7 +120,7 @@ static void reload_bookmarks_into_treeview(GBookmarksPanel *, GLoadedBinary *); static void on_collection_content_changed(GDbCollection *, DBAction, GDbBookmark *, GBookmarksPanel *); /* Réagit au changement de sélection des signets. */ -static void on_bookmarks_selection_change(GtkTreeSelection *, GBookmarksPanel *); +static void on_bookmarks_selection_change(GtkTreeSelection *, gpointer); @@ -337,7 +338,7 @@ static void g_bookmarks_panel_init(GBookmarksPanel *panel) select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); - g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(on_bookmarks_selection_change), panel); + g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(on_bookmarks_selection_change), NULL); /* Préparation du menu contextuel */ @@ -646,7 +647,7 @@ static void on_collection_content_changed(GDbCollection *collec, DBAction action /****************************************************************************** * * * Paramètres : selection = sélection modifiée. * -* panel = structure contenant les informations maîtresses. * +* unused = adresse non utilisée ici. * * * * Description : Réagit au changement de sélection des signets. * * * @@ -656,7 +657,7 @@ static void on_collection_content_changed(GDbCollection *collec, DBAction action * * ******************************************************************************/ -static void on_bookmarks_selection_change(GtkTreeSelection *selection, GBookmarksPanel *panel) +static void on_bookmarks_selection_change(GtkTreeSelection *selection, gpointer unused) { GtkTreeIter iter; /* Point de sélection */ GtkTreeModel *model; /* Modèle de gestion */ @@ -670,8 +671,9 @@ static void on_bookmarks_selection_change(GtkTreeSelection *selection, GBookmark addr = g_db_bookmark_get_address(bookmark); - display = g_editor_item_get_current_view(G_EDITOR_ITEM(panel)); + display = get_current_view(); gtk_display_panel_request_move(display, addr); + g_object_unref(G_OBJECT(display)); g_object_unref(G_OBJECT(bookmark)); @@ -1061,8 +1063,9 @@ static gboolean on_button_press_over_bookmarks(GtkWidget *widget, GdkEventButton addr = g_db_bookmark_get_address(bookmark); - display = g_editor_item_get_current_view(G_EDITOR_ITEM(panel)); + display = get_current_view(); gtk_display_panel_request_move(display, addr); + g_object_unref(G_OBJECT(display)); g_object_unref(G_OBJECT(bookmark)); diff --git a/src/gui/panels/errors.c b/src/gui/panels/errors.c index 842f0ec..67965b5 100644 --- a/src/gui/panels/errors.c +++ b/src/gui/panels/errors.c @@ -34,6 +34,7 @@ #include "panel-int.h" +#include "../core/global.h" #include "../../core/global.h" #include "../../format/format.h" #include "../../gtkext/support.h" @@ -140,7 +141,7 @@ static void filter_error_panel(GErrorPanel *, GtkStatusStack *, activity_id_t); static void update_error_panel_summary(GPanelUpdate *, GErrorPanel *); /* Réagit au changement de sélection des portions. */ -static void on_error_selection_changed(GtkTreeSelection *, GErrorPanel *); +static void on_error_selection_changed(GtkTreeSelection *, gpointer); @@ -925,7 +926,7 @@ static void update_error_panel_summary(GPanelUpdate *update, GErrorPanel *panel) /****************************************************************************** * * * Paramètres : selection = sélection modifiée. * -* panel = structure contenant les informations maîtresses. * +* unused = adresse non utilisée ici. * * * * Description : Réagit au changement de sélection des portions. * * * @@ -935,7 +936,7 @@ static void update_error_panel_summary(GPanelUpdate *update, GErrorPanel *panel) * * ******************************************************************************/ -static void on_error_selection_changed(GtkTreeSelection *selection, GErrorPanel *panel) +static void on_error_selection_changed(GtkTreeSelection *selection, gpointer unused) { GtkTreeIter iter; /* Point de sélection */ GtkTreeModel *model; /* Modèle de gestion */ @@ -946,8 +947,9 @@ static void on_error_selection_changed(GtkTreeSelection *selection, GErrorPanel { gtk_tree_model_get(model, &iter, ETC_ADDR, &addr, -1); - display = g_editor_item_get_current_view(G_EDITOR_ITEM(panel)); + display = get_current_view(); gtk_display_panel_request_move(display, addr); + g_object_unref(G_OBJECT(display)); delete_vmpa(addr); diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c index 8e7c702..c9d971e 100644 --- a/src/gui/panels/strings.c +++ b/src/gui/panels/strings.c @@ -30,6 +30,7 @@ #include "panel-int.h" +#include "../core/global.h" #include "../dialogs/gotox.h" #include "../../common/extstr.h" #include "../../core/params.h" @@ -105,7 +106,7 @@ static void g_strings_panel_finalize(GStringsPanel *); static void change_strings_panel_current_binary(GStringsPanel *, GLoadedBinary *); /* Réagit au changement de sélection des chaînes textuelles. */ -static void on_strings_selection_change(GtkTreeSelection *, GStringsPanel *); +static void on_strings_selection_change(GtkTreeSelection *, gpointer); /* Etablit une comparaison entre deux chaînes de caractères. */ static gint compare_strings_list_columns(GtkTreeModel *, GtkTreeIter *, GtkTreeIter *, gpointer); @@ -338,7 +339,7 @@ static void g_strings_panel_init(GStringsPanel *panel) g_generic_config_get_value(get_main_configuration(), MPK_DISPLAY_ON_SEL, &display); if (display) - g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(on_strings_selection_change), panel); + g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(on_strings_selection_change), NULL); /* Préparation du menu contextuel */ @@ -572,7 +573,7 @@ static void change_strings_panel_current_binary(GStringsPanel *panel, GLoadedBin /****************************************************************************** * * * Paramètres : selection = sélection modifiée. * -* panel = structure contenant les informations maîtresses. * +* unused = adresse non utilisée ici. * * * * Description : Réagit au changement de sélection des chaînes textuelles. * * * @@ -582,7 +583,7 @@ static void change_strings_panel_current_binary(GStringsPanel *panel, GLoadedBin * * ******************************************************************************/ -static void on_strings_selection_change(GtkTreeSelection *selection, GStringsPanel *panel) +static void on_strings_selection_change(GtkTreeSelection *selection, gpointer unused) { GtkTreeIter iter; /* Point de sélection */ GtkTreeModel *model; /* Modèle de gestion */ @@ -596,8 +597,9 @@ static void on_strings_selection_change(GtkTreeSelection *selection, GStringsPan addr = get_mrange_addr(g_binary_symbol_get_range(symbol)); - display = g_editor_item_get_current_view(G_EDITOR_ITEM(panel)); + display = get_current_view(); gtk_display_panel_request_move(display, addr); + g_object_unref(G_OBJECT(display)); g_object_unref(G_OBJECT(symbol)); @@ -835,8 +837,9 @@ static gboolean on_button_event_over_strings(GtkWidget *widget, GdkEventButton * addr = get_mrange_addr(g_binary_symbol_get_range(symbol)); - display = g_editor_item_get_current_view(G_EDITOR_ITEM(panel)); + display = get_current_view(); gtk_display_panel_request_move(display, addr); + g_object_unref(G_OBJECT(display)); g_object_unref(G_OBJECT(symbol)); @@ -1042,7 +1045,7 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa range = g_binary_symbol_get_range(symbol); - binary = g_editor_item_get_current_binary(G_EDITOR_ITEM(panel)); + binary = get_current_binary(); proc = g_loaded_binary_get_processor(binary); /** @@ -1059,8 +1062,9 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa { addr = get_address_from_gotox_dialog(dialog); - display = g_editor_item_get_current_view(G_EDITOR_ITEM(panel)); + display = get_current_view(); gtk_display_panel_request_move(display, addr); + g_object_unref(G_OBJECT(display)); delete_vmpa(addr); @@ -1072,6 +1076,7 @@ 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 e73a847..5bd4eae 100644 --- a/src/gui/panels/symbols.c +++ b/src/gui/panels/symbols.c @@ -37,6 +37,7 @@ #include "panel-int.h" +#include "../core/global.h" #include "../../format/format.h" #include "../../gtkext/easygtk.h" #include "../../gtkext/support.h" @@ -107,7 +108,7 @@ static void g_symbols_panel_finalize(GSymbolsPanel *); static void on_symbols_display_change(GtkToggleToolButton *, GSymbolsPanel *); /* Réagit au changement de sélection des symboles. */ -static void on_symbols_selection_change(GtkTreeSelection *, 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 *); @@ -387,7 +388,7 @@ static void g_symbols_panel_init(GSymbolsPanel *panel) select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); - g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(on_symbols_selection_change), panel); + g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(on_symbols_selection_change), NULL); } @@ -531,7 +532,7 @@ static void on_symbols_display_change(GtkToggleToolButton *button, GSymbolsPanel /****************************************************************************** * * * Paramètres : selection = sélection modifiée. * -* panel = structure contenant les informations maîtresses. * +* unused = adresse non utilisée ici. * * * * Description : Réagit au changement de sélection des symboles. * * * @@ -541,7 +542,7 @@ static void on_symbols_display_change(GtkToggleToolButton *button, GSymbolsPanel * * ******************************************************************************/ -static void on_symbols_selection_change(GtkTreeSelection *selection, GSymbolsPanel *panel) +static void on_symbols_selection_change(GtkTreeSelection *selection, gpointer unused) { GtkTreeIter iter; /* Point de sélection */ GtkTreeModel *model; /* Modèle de gestion */ @@ -557,8 +558,9 @@ static void on_symbols_selection_change(GtkTreeSelection *selection, GSymbolsPan { range = g_binary_symbol_get_range(symbol); - display = g_editor_item_get_current_view(G_EDITOR_ITEM(panel)); + display = get_current_view(); gtk_display_panel_request_move(display, get_mrange_addr(range)); + g_object_unref(G_OBJECT(display)); g_object_unref(G_OBJECT(symbol)); diff --git a/src/gui/panels/welcome.c b/src/gui/panels/welcome.c index a20810c..44ff517 100644 --- a/src/gui/panels/welcome.c +++ b/src/gui/panels/welcome.c @@ -37,6 +37,7 @@ #include "panel-int.h" +#include "../../analysis/project.h" #include "../../common/cpp.h" #include "../../common/io.h" #include "../../common/net.h" diff --git a/src/gui/status.c b/src/gui/status.c index 5043a9b..bd52310 100644 --- a/src/gui/status.c +++ b/src/gui/status.c @@ -222,15 +222,14 @@ GEditorItem *g_status_info_new(GObject *ref) static void track_caret_address_for_status_info(GStatusInfo *info, GtkBufferDisplay *display, const vmpa2t *addr) { - GEditorItem *item; /* Autre version de l'élément */ GLoadedBinary *binary; /* Binaire courant */ - item = G_EDITOR_ITEM(info); - - binary = g_editor_item_get_current_binary(item); + binary = get_current_binary(); focus_address_in_status_info(info, binary, addr); + g_object_unref(G_OBJECT(binary)); + } diff --git a/src/gui/tb/portions.c b/src/gui/tb/portions.c index f9d400d..685f5ba 100644 --- a/src/gui/tb/portions.c +++ b/src/gui/tb/portions.c @@ -29,6 +29,8 @@ #include "tbitem-int.h" +#include "../core/global.h" +#include "../core/items.h" #include "../../format/format.h" #include "../../gtkext/gtkbinarystrip.h" @@ -228,7 +230,7 @@ static void update_portions_item_binary(GEditorItem *item, GLoadedBinary *binary * * * Paramètres : strip = composant d'affichage parcouru. * * addr = nouvelle adresse du curseur courant. * -* ref = espace de référencement global. * +* item = élément d'éditeur représenté ici. * * * * Description : Fait suivre un changement d'adresse dans la barre. * * * @@ -242,12 +244,18 @@ static void track_address_on_binary_strip(GtkBinaryStrip *strip, GEditorItem *it { const vmpa2t *addr; /* Nouvelle destination */ GtkDisplayPanel *panel; /* Afficheur effectif de code */ + GLoadedBinary *binary; /* Binaire chargé et actif */ addr = gtk_binary_strip_get_location(strip); - panel = g_editor_item_get_current_view(item); + panel = get_current_view(); + binary = get_current_binary(); + gtk_display_panel_request_move(panel, addr); - focus_address_in_editor_items(g_editor_item_get_current_binary(item), addr, item); + focus_address_in_editor_items(binary, addr, item); + + g_object_unref(G_OBJECT(binary)); + g_object_unref(G_OBJECT(panel)); } -- cgit v0.11.2-87-g4458