summaryrefslogtreecommitdiff
path: root/src/gui/core
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2017-08-26 22:15:05 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2017-08-26 22:15:05 (GMT)
commit8ca477e012b11a19363542d171b8e973d637641c (patch)
tree94a4fcde1779f031946eff7a36075f41a17cd73b /src/gui/core
parent4fb2ac107092671fe27fc3ebf9fc86dff7c3ec19 (diff)
Removed most of the functions using the editor items as global access to active items.
Diffstat (limited to 'src/gui/core')
-rwxr-xr-xsrc/gui/core/Makefile.am1
-rw-r--r--src/gui/core/global.c185
-rw-r--r--src/gui/core/global.h20
-rw-r--r--src/gui/core/items.c374
-rw-r--r--src/gui/core/items.h55
-rw-r--r--src/gui/core/panels.c1
6 files changed, 635 insertions, 1 deletions
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 <http://www.gnu.org/licenses/>.
+ */
+
+
+#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 <http://www.gnu.org/licenses/>.
+ */
+
+
+#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"