From adddee10e395524778c026bf577e885cd8f5947d Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 26 Mar 2019 23:05:49 +0100 Subject: Given the priority to string.h from system includes. --- configure.ac | 1 - plugins/elf/Makefile.am | 2 + plugins/pychrysalide/gui/Makefile.am | 8 +- plugins/pychrysalide/gui/core/panels.c | 2 +- plugins/pychrysalide/gui/module.c | 5 +- plugins/pychrysalide/gui/panel.c | 433 +++++++++++++ plugins/pychrysalide/gui/panel.h | 45 ++ plugins/pychrysalide/gui/panels/Makefile.am | 19 - plugins/pychrysalide/gui/panels/module.c | 97 --- plugins/pychrysalide/gui/panels/module.h | 42 -- plugins/pychrysalide/gui/panels/panel.c | 433 ------------- plugins/pychrysalide/gui/panels/panel.h | 45 -- src/gtkext/tiledgrid.h | 2 +- src/gui/Makefile.am | 2 + src/gui/core/panels.c | 2 +- src/gui/core/panels.h | 2 +- src/gui/panel-int.h | 144 +++++ src/gui/panel.c | 963 ++++++++++++++++++++++++++++ src/gui/panel.h | 104 +++ src/gui/panels/Makefile.am | 4 +- src/gui/panels/bintree.c | 2 +- src/gui/panels/bintree.h | 2 +- src/gui/panels/bookmarks.c | 2 +- src/gui/panels/bookmarks.h | 2 +- src/gui/panels/errors.c | 2 +- src/gui/panels/errors.h | 2 +- src/gui/panels/glance.c | 2 +- src/gui/panels/glance.h | 2 +- src/gui/panels/history.c | 2 +- src/gui/panels/history.h | 2 +- src/gui/panels/log.c | 2 +- src/gui/panels/log.h | 2 +- src/gui/panels/panel-int.h | 144 ----- src/gui/panels/panel.c | 963 ---------------------------- src/gui/panels/panel.h | 104 --- src/gui/panels/regedit.c | 2 +- src/gui/panels/regedit.h | 2 +- src/gui/panels/strings.c | 2 +- src/gui/panels/strings.h | 2 +- src/gui/panels/symbols.c | 2 +- src/gui/panels/symbols.h | 2 +- src/gui/panels/welcome.c | 2 +- src/gui/panels/welcome.h | 2 +- 43 files changed, 1725 insertions(+), 1881 deletions(-) create mode 100644 plugins/pychrysalide/gui/panel.c create mode 100644 plugins/pychrysalide/gui/panel.h delete mode 100644 plugins/pychrysalide/gui/panels/Makefile.am delete mode 100644 plugins/pychrysalide/gui/panels/module.c delete mode 100644 plugins/pychrysalide/gui/panels/module.h delete mode 100644 plugins/pychrysalide/gui/panels/panel.c delete mode 100644 plugins/pychrysalide/gui/panels/panel.h create mode 100644 src/gui/panel-int.h create mode 100644 src/gui/panel.c create mode 100644 src/gui/panel.h delete mode 100644 src/gui/panels/panel-int.h delete mode 100644 src/gui/panels/panel.c delete mode 100644 src/gui/panels/panel.h diff --git a/configure.ac b/configure.ac index d1a14a2..39ec70d 100644 --- a/configure.ac +++ b/configure.ac @@ -444,7 +444,6 @@ AC_CONFIG_FILES([Makefile plugins/pychrysalide/gtkext/graph/Makefile plugins/pychrysalide/gui/Makefile plugins/pychrysalide/gui/core/Makefile - plugins/pychrysalide/gui/panels/Makefile plugins/pychrysalide/mangling/Makefile plugins/python/Makefile plugins/python/apkfiles/Makefile diff --git a/plugins/elf/Makefile.am b/plugins/elf/Makefile.am index 7b243db..35ab3fe 100644 --- a/plugins/elf/Makefile.am +++ b/plugins/elf/Makefile.am @@ -1,4 +1,6 @@ +DEFAULT_INCLUDES = -idirafter. -I$(top_builddir) + lib_LTLIBRARIES = libelf.la libdir = $(pluginslibdir) diff --git a/plugins/pychrysalide/gui/Makefile.am b/plugins/pychrysalide/gui/Makefile.am index 2579887..f471a60 100644 --- a/plugins/pychrysalide/gui/Makefile.am +++ b/plugins/pychrysalide/gui/Makefile.am @@ -3,11 +3,11 @@ noinst_LTLIBRARIES = libpychrysagui.la libpychrysagui_la_SOURCES = \ editem.h editem.c \ - module.h module.c + module.h module.c \ + panel.h panel.c libpychrysagui_la_LIBADD = \ - core/libpychrysaguicore.la \ - panels/libpychrysaguipanels.la + core/libpychrysaguicore.la libpychrysagui_la_LDFLAGS = @@ -22,4 +22,4 @@ AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJE AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) -SUBDIRS = core panels +SUBDIRS = core diff --git a/plugins/pychrysalide/gui/core/panels.c b/plugins/pychrysalide/gui/core/panels.c index 3b88b18..3a3001c 100644 --- a/plugins/pychrysalide/gui/core/panels.c +++ b/plugins/pychrysalide/gui/core/panels.c @@ -32,9 +32,9 @@ #include +#include "../panel.h" #include "../../access.h" #include "../../helpers.h" -#include "../panels/panel.h" diff --git a/plugins/pychrysalide/gui/module.c b/plugins/pychrysalide/gui/module.c index abd9c0a..59fb39f 100644 --- a/plugins/pychrysalide/gui/module.c +++ b/plugins/pychrysalide/gui/module.c @@ -30,8 +30,8 @@ #include "editem.h" +#include "panel.h" #include "core/module.h" -#include "panels/module.h" #include "../helpers.h" @@ -69,7 +69,6 @@ bool add_gui_module(PyObject *super) result = (module != NULL); if (result) result = add_gui_core_module(module); - if (result) result = add_gui_panels_module(module); if (!result) Py_XDECREF(module); @@ -98,9 +97,9 @@ bool populate_gui_module(void) result = true; if (result) result = ensure_python_editor_item_is_registered(); + if (result) result = ensure_python_panel_item_is_registered(); if (result) result = populate_gui_core_module(); - if (result) result = populate_gui_panels_module(); assert(result); diff --git a/plugins/pychrysalide/gui/panel.c b/plugins/pychrysalide/gui/panel.c new file mode 100644 index 0000000..ccc4dc5 --- /dev/null +++ b/plugins/pychrysalide/gui/panel.c @@ -0,0 +1,433 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * panel.c - équivalent Python du fichier "gui/panels/panel.c" + * + * Copyright (C) 2012-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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "panel.h" + + +#include + + +#include +#include +#include +#include +#include + + +#include "editem.h" +#include "../access.h" +#include "../helpers.h" +#include "../gtkext/dockable.h" + + + +/* ------------------------ GLUE POUR CREATION DEPUIS PYTHON ------------------------ */ + + +/* Accompagne la création d'une instance dérivée en Python. */ +static PyObject *py_panel_item_new(PyTypeObject *, PyObject *, PyObject *); + +/* Initialise la classe des panneaux pour l'interface graphique. */ +static void py_panel_item_init_gclass(GPanelItemClass *, gpointer); + +/* Initialise une instance sur la base du dérivé de GObject. */ +static int py_panel_item_init(PyObject *self, PyObject *args, PyObject *kwds); + + + +/* -------------------------- FONCTIONNALITES D'UN PANNEAU -------------------------- */ + + +/* Place un panneau dans l'ensemble affiché. */ +static PyObject *py_panel_item_dock(PyObject *, PyObject *); + +/* Définit les constantes pour les panneaux. */ +static bool py_panel_item_define_constants(PyTypeObject *); + + + +/* ---------------------------------------------------------------------------------- */ +/* GLUE POUR CREATION DEPUIS PYTHON */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : type = type du nouvel objet à mettre en place. * +* args = éventuelle liste d'arguments. * +* kwds = éventuel dictionnaire de valeurs mises à disposition. * +* * +* Description : Accompagne la création d'une instance dérivée en Python. * +* * +* Retour : Nouvel objet Python mis en place ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_panel_item_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyObject *result; /* Objet à retourner */ + PyTypeObject *base; /* Type de base à dériver */ + bool first_time; /* Evite les multiples passages*/ + GType gtype; /* Nouveau type de processeur */ + bool status; /* Bilan d'un enregistrement */ + + /* Validations diverses */ + + base = get_python_panel_item_type(); + + if (type == base) + { + result = NULL; + PyErr_Format(PyExc_RuntimeError, _("%s is an abstract class"), type->tp_name); + goto exit; + } + + /* Mise en place d'un type dédié */ + + first_time = (g_type_from_name(type->tp_name) == 0); + + gtype = build_dynamic_type(G_TYPE_PANEL_ITEM, type->tp_name, + (GClassInitFunc)py_panel_item_init_gclass, NULL, NULL); + + if (first_time) + { + status = register_class_for_dynamic_pygobject(gtype, type, base); + + if (!status) + { + result = NULL; + goto exit; + } + + } + + /* On crée, et on laisse ensuite la main à PyGObject_Type.tp_init() */ + + result = PyType_GenericNew(type, args, kwds); + + exit: + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : class = classe à initialiser. * +* unused = données non utilisées ici. * +* * +* Description : Initialise la classe des panneaux pour l'interface graphique.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void py_panel_item_init_gclass(GPanelItemClass *class, gpointer unused) +{ + py_editor_item_init_gclass(G_EDITOR_ITEM_CLASS(class), NULL); + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet à initialiser (théoriquement). * +* args = arguments fournis à l'appel. * +* kwds = arguments de type key=val fournis. * +* * +* Description : Initialise une instance sur la base du dérivé de GObject. * +* * +* Retour : 0. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static int py_panel_item_init(PyObject *self, PyObject *args, PyObject *kwds) +{ + unsigned long personality; /* Nature du panneau */ + const char *name; /* Désignation humaine */ + const char *lname; /* Nom version longue */ + PyGObject *widget; /* Composant visuel du panneau */ + int startup; /* Recommandation au démarrage */ + const char *path; /* Placement à l'affichage */ + int ret; /* Bilan de lecture des args. */ + PyObject *new_kwds; /* Nouveau dictionnaire épuré */ + GPanelItem *panel; /* Panneau à manipuler */ + GEditorItem *item; /* Version basique d'instance */ + + static char *kwlist[] = { "name", "widget", "personality", "lname", "dock", "path", NULL }; + + /* Récupération des paramètres */ + + ret = PyArg_ParseTupleAndKeywords(args, kwds, "sOksps", kwlist, + &name, &widget, &personality, &lname, &startup, &path); + if (!ret) return -1; + + /* Initialisation d'un objet GLib */ + + new_kwds = PyDict_New(); + + ret = PyGObject_Type.tp_init(self, args, new_kwds); + + Py_DECREF(new_kwds); + + if (ret == -1) return -1; + + /* Eléments de base */ + + panel = G_PANEL_ITEM(pygobject_get(self)); + + item = G_EDITOR_ITEM(panel); + + item->name = strdup(name);; + item->widget = GTK_WIDGET(pygobject_get(widget)); + + panel->personality = personality; + panel->lname = strdup(lname); + panel->dock_at_startup = startup; + panel->path = strdup(path); + + /** + * Si Python ne voit plus la variable représentant le panneau utilisée, + * il va la supprimer, ce qui va supprimer le composant GTK. + * + * On sera donc en situation de Use-After-Free, dont les conséquences + * arrivent très vite. + */ + g_object_ref(G_OBJECT(item->widget)); + + return 0; + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* FONCTIONNALITES D'UN PANNEAU */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : self = classe représentant un binaire. * +* args = arguments fournis à l'appel. * +* * +* Description : Place un panneau dans l'ensemble affiché. * +* * +* Retour : Py_None. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_panel_item_dock(PyObject *self, PyObject *args) +{ + GPanelItem *item; /* Panneau à manipuler */ + + item = G_PANEL_ITEM(pygobject_get(self)); + + g_panel_item_dock(item); + + Py_RETURN_NONE; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Fournit un accès à une définition de type à diffuser. * +* * +* Retour : Définition d'objet pour Python. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PyTypeObject *get_python_panel_item_type(void) +{ + static PyMethodDef py_panel_item_methods[] = { + { + "dock", py_panel_item_dock, + METH_NOARGS, + "dock($self, /)\n--\n\nDisplay the panel item in the right place." + }, + { NULL } + }; + + static PyGetSetDef py_panel_item_getseters[] = { + { NULL } + }; + + static PyTypeObject py_panel_item_type = { + + PyVarObject_HEAD_INIT(NULL, 0) + + .tp_name = "pychrysalide.gui.PanelItem", + .tp_basicsize = sizeof(PyGObject), + + .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, + + .tp_doc = "PyChrysalide panel item.", + + .tp_methods = py_panel_item_methods, + .tp_getset = py_panel_item_getseters, + + .tp_init = py_panel_item_init, + .tp_new = py_panel_item_new, + + }; + + return &py_panel_item_type; + +} + + +/****************************************************************************** +* * +* Paramètres : obj_type = type dont le dictionnaire est à compléter. * +* * +* Description : Définit les constantes pour les panneaux. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool py_panel_item_define_constants(PyTypeObject *obj_type) +{ + bool result; /* Bilan à retourner */ + + result = true; + + result &= PyDict_AddULongMacro(obj_type, PIP_INVALID); + + result &= PyDict_AddULongMacro(obj_type, PIP_SINGLETON); + result &= PyDict_AddULongMacro(obj_type, PIP_BINARY_VIEW); + result &= PyDict_AddULongMacro(obj_type, PIP_OTHER); + + result &= PyDict_AddULongMacro(obj_type, PIP_COUNT); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : module = module dont la définition est à compléter. * +* * +* Description : Prend en charge l'objet 'pychrysalide.gui.panels.PanelItem'. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool ensure_python_panel_item_is_registered(void) +{ + PyTypeObject *type; /* Type Python 'LoadedBinary' */ + PyObject *module; /* Module à recompléter */ + PyObject *dict; /* Dictionnaire du module */ + + type = get_python_panel_item_type(); + + if (!PyType_HasFeature(type, Py_TPFLAGS_READY)) + { + module = get_access_to_python_module("pychrysalide.gui"); + + dict = PyModule_GetDict(module); + + if (!ensure_python_editor_item_is_registered()) + return false; + + if (!ensure_python_gtk_dockable_is_registered()) + return false; + + if (!_register_class_for_pygobject(dict, G_TYPE_PANEL_ITEM, type, + get_python_editor_item_type(), get_python_gtk_dockable_type(), NULL)) + return false; + + if (!py_panel_item_define_constants(type)) + return false; + + } + + return true; + +} + + +/****************************************************************************** +* * +* Paramètres : arg = argument quelconque à tenter de convertir. * +* dst = destination des valeurs récupérées en cas de succès. * +* * +* Description : Tente de convertir en panneau pour GUI. * +* * +* Retour : Bilan de l'opération, voire indications supplémentaires. * +* * +* Remarques : - * +* * +******************************************************************************/ + +int convert_to_panel_item(PyObject *arg, void *dst) +{ + int result; /* Bilan à retourner */ + + result = PyObject_IsInstance(arg, (PyObject *)get_python_panel_item_type()); + + switch (result) + { + case -1: + /* L'exception est déjà fixée par Python */ + result = 0; + break; + + case 0: + PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to executable format"); + break; + + case 1: + *((GPanelItem **)dst) = G_PANEL_ITEM(pygobject_get(arg)); + break; + + default: + assert(false); + break; + + } + + return result; + +} diff --git a/plugins/pychrysalide/gui/panel.h b/plugins/pychrysalide/gui/panel.h new file mode 100644 index 0000000..9cd73eb --- /dev/null +++ b/plugins/pychrysalide/gui/panel.h @@ -0,0 +1,45 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * panel.h - prototypes pour l'équivalent Python du fichier "gui/panel.h" + * + * Copyright (C) 2012-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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef _PLUGINS_PYCHRYSALIDE_GUI_PANEL_H +#define _PLUGINS_PYCHRYSALIDE_GUI_PANEL_H + + +#include +#include + + + +/* Fournit un accès à une définition de type à diffuser. */ +PyTypeObject *get_python_panel_item_type(void); + +/* Prend en charge l'objet 'pychrysalide.gui.PanelItem'. */ +bool ensure_python_panel_item_is_registered(void); + +/* Tente de convertir en panneau pour GUI. */ +int convert_to_panel_item(PyObject *, void *); + + + +#endif /* _PLUGINS_PYCHRYSALIDE_GUI_PANEL_H */ diff --git a/plugins/pychrysalide/gui/panels/Makefile.am b/plugins/pychrysalide/gui/panels/Makefile.am deleted file mode 100644 index ec5522f..0000000 --- a/plugins/pychrysalide/gui/panels/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ - -noinst_LTLIBRARIES = libpychrysaguipanels.la - -libpychrysaguipanels_la_SOURCES = \ - module.h module.c \ - panel.h panel.c - -libpychrysaguipanels_la_LDFLAGS = - - -devdir = $(includedir)/chrysalide-$(subdir) - -dev_HEADERS = $(libpychrysaguipanels_la_SOURCES:%c=) - - -AM_CPPFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS) $(LIBPYGOBJECT_CFLAGS) \ - -I$(top_srcdir)/src - -AM_CFLAGS = $(DEBUG_CFLAGS) $(WARNING_FLAGS) $(COMPLIANCE_FLAGS) diff --git a/plugins/pychrysalide/gui/panels/module.c b/plugins/pychrysalide/gui/panels/module.c deleted file mode 100644 index dd6b91e..0000000 --- a/plugins/pychrysalide/gui/panels/module.c +++ /dev/null @@ -1,97 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * module.c - intégration du répertoire panels en tant que module - * - * Copyright (C) 2012-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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "module.h" - - -#include - - -#include "panel.h" -#include "../../helpers.h" - - - -/****************************************************************************** -* * -* Paramètres : super = module dont la définition est à compléter. * -* * -* Description : Ajoute le module 'gui.panels' à un module Python. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool add_gui_panels_module(PyObject *super) -{ - bool result; /* Bilan à retourner */ - PyObject *module; /* Sous-module mis en place */ - - static PyModuleDef py_chrysalide_gui_panels_module = { - - .m_base = PyModuleDef_HEAD_INIT, - - .m_name = "pychrysalide.gui.panels", - .m_doc = "Python module for Chrysalide.gui.panels", - - .m_size = -1, - - }; - - module = build_python_module(super, &py_chrysalide_gui_panels_module); - - result = (module != NULL); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Intègre les objets du module 'gui.panels'. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool populate_gui_panels_module(void) -{ - bool result; /* Bilan à retourner */ - - result = true; - - if (result) result = ensure_python_panel_item_is_registered(); - - assert(result); - - return result; - -} diff --git a/plugins/pychrysalide/gui/panels/module.h b/plugins/pychrysalide/gui/panels/module.h deleted file mode 100644 index 559a8c4..0000000 --- a/plugins/pychrysalide/gui/panels/module.h +++ /dev/null @@ -1,42 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * module.h - prototypes pour l'intégration du répertoire panels en tant que module - * - * Copyright (C) 2012-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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef _PLUGINS_PYCHRYSALIDE_GUI_PANELS_MODULE_H -#define _PLUGINS_PYCHRYSALIDE_GUI_PANELS_MODULE_H - - -#include -#include - - - -/* Ajoute le module 'gui.panels' à un module Python. */ -bool add_gui_panels_module(PyObject *); - -/* Intègre les objets du module 'gui.panels'. */ -bool populate_gui_panels_module(void); - - - -#endif /* _PLUGINS_PYCHRYSALIDE_GUI_PANELS_MODULE_H */ diff --git a/plugins/pychrysalide/gui/panels/panel.c b/plugins/pychrysalide/gui/panels/panel.c deleted file mode 100644 index 2d0b562..0000000 --- a/plugins/pychrysalide/gui/panels/panel.c +++ /dev/null @@ -1,433 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * panel.c - équivalent Python du fichier "gui/panels/panel.c" - * - * Copyright (C) 2012-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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "panel.h" - - -#include - - -#include -#include -#include -#include -#include - - -#include "../editem.h" -#include "../../access.h" -#include "../../helpers.h" -#include "../../gtkext/dockable.h" - - - -/* ------------------------ GLUE POUR CREATION DEPUIS PYTHON ------------------------ */ - - -/* Accompagne la création d'une instance dérivée en Python. */ -static PyObject *py_panel_item_new(PyTypeObject *, PyObject *, PyObject *); - -/* Initialise la classe des panneaux pour l'interface graphique. */ -static void py_panel_item_init_gclass(GPanelItemClass *, gpointer); - -/* Initialise une instance sur la base du dérivé de GObject. */ -static int py_panel_item_init(PyObject *self, PyObject *args, PyObject *kwds); - - - -/* -------------------------- FONCTIONNALITES D'UN PANNEAU -------------------------- */ - - -/* Place un panneau dans l'ensemble affiché. */ -static PyObject *py_panel_item_dock(PyObject *, PyObject *); - -/* Définit les constantes pour les panneaux. */ -static bool py_panel_item_define_constants(PyTypeObject *); - - - -/* ---------------------------------------------------------------------------------- */ -/* GLUE POUR CREATION DEPUIS PYTHON */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : type = type du nouvel objet à mettre en place. * -* args = éventuelle liste d'arguments. * -* kwds = éventuel dictionnaire de valeurs mises à disposition. * -* * -* Description : Accompagne la création d'une instance dérivée en Python. * -* * -* Retour : Nouvel objet Python mis en place ou NULL en cas d'échec. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_panel_item_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - PyObject *result; /* Objet à retourner */ - PyTypeObject *base; /* Type de base à dériver */ - bool first_time; /* Evite les multiples passages*/ - GType gtype; /* Nouveau type de processeur */ - bool status; /* Bilan d'un enregistrement */ - - /* Validations diverses */ - - base = get_python_panel_item_type(); - - if (type == base) - { - result = NULL; - PyErr_Format(PyExc_RuntimeError, _("%s is an abstract class"), type->tp_name); - goto exit; - } - - /* Mise en place d'un type dédié */ - - first_time = (g_type_from_name(type->tp_name) == 0); - - gtype = build_dynamic_type(G_TYPE_PANEL_ITEM, type->tp_name, - (GClassInitFunc)py_panel_item_init_gclass, NULL, NULL); - - if (first_time) - { - status = register_class_for_dynamic_pygobject(gtype, type, base); - - if (!status) - { - result = NULL; - goto exit; - } - - } - - /* On crée, et on laisse ensuite la main à PyGObject_Type.tp_init() */ - - result = PyType_GenericNew(type, args, kwds); - - exit: - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : class = classe à initialiser. * -* unused = données non utilisées ici. * -* * -* Description : Initialise la classe des panneaux pour l'interface graphique.* -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void py_panel_item_init_gclass(GPanelItemClass *class, gpointer unused) -{ - py_editor_item_init_gclass(G_EDITOR_ITEM_CLASS(class), NULL); - -} - - -/****************************************************************************** -* * -* Paramètres : self = objet à initialiser (théoriquement). * -* args = arguments fournis à l'appel. * -* kwds = arguments de type key=val fournis. * -* * -* Description : Initialise une instance sur la base du dérivé de GObject. * -* * -* Retour : 0. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static int py_panel_item_init(PyObject *self, PyObject *args, PyObject *kwds) -{ - unsigned long personality; /* Nature du panneau */ - const char *name; /* Désignation humaine */ - const char *lname; /* Nom version longue */ - PyGObject *widget; /* Composant visuel du panneau */ - int startup; /* Recommandation au démarrage */ - const char *path; /* Placement à l'affichage */ - int ret; /* Bilan de lecture des args. */ - PyObject *new_kwds; /* Nouveau dictionnaire épuré */ - GPanelItem *panel; /* Panneau à manipuler */ - GEditorItem *item; /* Version basique d'instance */ - - static char *kwlist[] = { "name", "widget", "personality", "lname", "dock", "path", NULL }; - - /* Récupération des paramètres */ - - ret = PyArg_ParseTupleAndKeywords(args, kwds, "sOksps", kwlist, - &name, &widget, &personality, &lname, &startup, &path); - if (!ret) return -1; - - /* Initialisation d'un objet GLib */ - - new_kwds = PyDict_New(); - - ret = PyGObject_Type.tp_init(self, args, new_kwds); - - Py_DECREF(new_kwds); - - if (ret == -1) return -1; - - /* Eléments de base */ - - panel = G_PANEL_ITEM(pygobject_get(self)); - - item = G_EDITOR_ITEM(panel); - - item->name = strdup(name);; - item->widget = GTK_WIDGET(pygobject_get(widget)); - - panel->personality = personality; - panel->lname = strdup(lname); - panel->dock_at_startup = startup; - panel->path = strdup(path); - - /** - * Si Python ne voit plus la variable représentant le panneau utilisée, - * il va la supprimer, ce qui va supprimer le composant GTK. - * - * On sera donc en situation de Use-After-Free, dont les conséquences - * arrivent très vite. - */ - g_object_ref(G_OBJECT(item->widget)); - - return 0; - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* FONCTIONNALITES D'UN PANNEAU */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : self = classe représentant un binaire. * -* args = arguments fournis à l'appel. * -* * -* Description : Place un panneau dans l'ensemble affiché. * -* * -* Retour : Py_None. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static PyObject *py_panel_item_dock(PyObject *self, PyObject *args) -{ - GPanelItem *item; /* Panneau à manipuler */ - - item = G_PANEL_ITEM(pygobject_get(self)); - - g_panel_item_dock(item); - - Py_RETURN_NONE; - -} - - -/****************************************************************************** -* * -* Paramètres : - * -* * -* Description : Fournit un accès à une définition de type à diffuser. * -* * -* Retour : Définition d'objet pour Python. * -* * -* Remarques : - * -* * -******************************************************************************/ - -PyTypeObject *get_python_panel_item_type(void) -{ - static PyMethodDef py_panel_item_methods[] = { - { - "dock", py_panel_item_dock, - METH_NOARGS, - "dock($self, /)\n--\n\nDisplay the panel item in the right place." - }, - { NULL } - }; - - static PyGetSetDef py_panel_item_getseters[] = { - { NULL } - }; - - static PyTypeObject py_panel_item_type = { - - PyVarObject_HEAD_INIT(NULL, 0) - - .tp_name = "pychrysalide.gui.panels.PanelItem", - .tp_basicsize = sizeof(PyGObject), - - .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - - .tp_doc = "PyChrysalide panel item.", - - .tp_methods = py_panel_item_methods, - .tp_getset = py_panel_item_getseters, - - .tp_init = py_panel_item_init, - .tp_new = py_panel_item_new, - - }; - - return &py_panel_item_type; - -} - - -/****************************************************************************** -* * -* Paramètres : obj_type = type dont le dictionnaire est à compléter. * -* * -* Description : Définit les constantes pour les panneaux. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool py_panel_item_define_constants(PyTypeObject *obj_type) -{ - bool result; /* Bilan à retourner */ - - result = true; - - result &= PyDict_AddULongMacro(obj_type, PIP_INVALID); - - result &= PyDict_AddULongMacro(obj_type, PIP_SINGLETON); - result &= PyDict_AddULongMacro(obj_type, PIP_BINARY_VIEW); - result &= PyDict_AddULongMacro(obj_type, PIP_OTHER); - - result &= PyDict_AddULongMacro(obj_type, PIP_COUNT); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : module = module dont la définition est à compléter. * -* * -* Description : Prend en charge l'objet 'pychrysalide.gui.panels.PanelItem'. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool ensure_python_panel_item_is_registered(void) -{ - PyTypeObject *type; /* Type Python 'LoadedBinary' */ - PyObject *module; /* Module à recompléter */ - PyObject *dict; /* Dictionnaire du module */ - - type = get_python_panel_item_type(); - - if (!PyType_HasFeature(type, Py_TPFLAGS_READY)) - { - module = get_access_to_python_module("pychrysalide.gui.panels"); - - dict = PyModule_GetDict(module); - - if (!ensure_python_editor_item_is_registered()) - return false; - - if (!ensure_python_gtk_dockable_is_registered()) - return false; - - if (!_register_class_for_pygobject(dict, G_TYPE_PANEL_ITEM, type, - get_python_editor_item_type(), get_python_gtk_dockable_type(), NULL)) - return false; - - if (!py_panel_item_define_constants(type)) - return false; - - } - - return true; - -} - - -/****************************************************************************** -* * -* Paramètres : arg = argument quelconque à tenter de convertir. * -* dst = destination des valeurs récupérées en cas de succès. * -* * -* Description : Tente de convertir en panneau pour GUI. * -* * -* Retour : Bilan de l'opération, voire indications supplémentaires. * -* * -* Remarques : - * -* * -******************************************************************************/ - -int convert_to_panel_item(PyObject *arg, void *dst) -{ - int result; /* Bilan à retourner */ - - result = PyObject_IsInstance(arg, (PyObject *)get_python_panel_item_type()); - - switch (result) - { - case -1: - /* L'exception est déjà fixée par Python */ - result = 0; - break; - - case 0: - PyErr_SetString(PyExc_TypeError, "unable to convert the provided argument to executable format"); - break; - - case 1: - *((GPanelItem **)dst) = G_PANEL_ITEM(pygobject_get(arg)); - break; - - default: - assert(false); - break; - - } - - return result; - -} diff --git a/plugins/pychrysalide/gui/panels/panel.h b/plugins/pychrysalide/gui/panels/panel.h deleted file mode 100644 index 907c650..0000000 --- a/plugins/pychrysalide/gui/panels/panel.h +++ /dev/null @@ -1,45 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * panel.h - prototypes pour l'équivalent Python du fichier "gui/panels/panel.h" - * - * Copyright (C) 2012-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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef _PLUGINS_PYCHRYSALIDE_GUI_PANELS_PANEL_H -#define _PLUGINS_PYCHRYSALIDE_GUI_PANELS_PANEL_H - - -#include -#include - - - -/* Fournit un accès à une définition de type à diffuser. */ -PyTypeObject *get_python_panel_item_type(void); - -/* Prend en charge l'objet 'pychrysalide.gui.panels.PanelItem'. */ -bool ensure_python_panel_item_is_registered(void); - -/* Tente de convertir en panneau pour GUI. */ -int convert_to_panel_item(PyObject *, void *); - - - -#endif /* _PLUGINS_PYCHRYSALIDE_GUI_PANELS_PANEL_H */ diff --git a/src/gtkext/tiledgrid.h b/src/gtkext/tiledgrid.h index 70429e5..a31f200 100644 --- a/src/gtkext/tiledgrid.h +++ b/src/gtkext/tiledgrid.h @@ -30,7 +30,7 @@ #include "gtkdockstation.h" #include "../glibext/configuration.h" -#include "../gui/panels/panel.h" +#include "../gui/panel.h" diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 5adc0f9..879b42d 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -6,6 +6,8 @@ libgui_la_SOURCES = \ editem-int.h \ editem.h editem.c \ editor.h editor.c \ + panel-int.h \ + panel.h panel.c \ status.h status.c libgui_la_LIBADD = \ diff --git a/src/gui/core/panels.c b/src/gui/core/panels.c index 71aee86..3fe8a86 100644 --- a/src/gui/core/panels.c +++ b/src/gui/core/panels.c @@ -27,13 +27,13 @@ #include "global.h" #include "items.h" +#include "../panel-int.h" #include "../panels/bintree.h" #include "../panels/bookmarks.h" #include "../panels/errors.h" #include "../panels/glance.h" #include "../panels/history.h" #include "../panels/log.h" -#include "../panels/panel-int.h" #include "../panels/regedit.h" #include "../panels/strings.h" #include "../panels/symbols.h" diff --git a/src/gui/core/panels.h b/src/gui/core/panels.h index 5344f3d..ee61d14 100644 --- a/src/gui/core/panels.h +++ b/src/gui/core/panels.h @@ -29,7 +29,7 @@ #include -#include "../panels/panel.h" +#include "../panel.h" #include "../../glibext/configuration.h" diff --git a/src/gui/panel-int.h b/src/gui/panel-int.h new file mode 100644 index 0000000..a301fac --- /dev/null +++ b/src/gui/panel-int.h @@ -0,0 +1,144 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * panel-int.h - prototypes pour les définitions internes liées aux panneaux d'affichage + * + * Copyright (C) 2012-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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef _GUI_PANELS_PANEL_INT_H +#define _GUI_PANELS_PANEL_INT_H + + +#include "panel.h" + + +#include + + +#include "editem-int.h" +#include "../common/dllist.h" +#include "../glibext/delayed.h" + + + +/* ------------------------- COEUR DES PANNEAUX D'AFFICHAGE ------------------------- */ + + +/* Place un panneau dans l'ensemble affiché. */ +typedef void (* ack_dock_process_fc) (GPanelItem *); + +/* Supprime un panneau de l'ensemble affiché. */ +typedef void (* ack_undock_process_fc) (GPanelItem *); + +/* Démarre l'actualisation du filtrage du contenu. */ +typedef void (* update_filtered_fc) (GPanelItem *); + + +/* Elément réactif pour panneaux de l'éditeur (instance) */ +struct _GPanelItem +{ + GEditorItem parent; /* A laisser en premier */ + + DL_LIST_ITEM(link); /* Maillon de liste chaînée */ + + PanelItemPersonality personality; /* Nature de l'élément */ + + const char *lname; /* Description longue */ + + bool dock_at_startup; /* Recommandation au démarrage */ + char *path; /* Chemin vers la place idéale */ + + bool docked; /* Panneau inscrusté ? */ + + char *filter; /* Eventuel filtre textuel */ + + /** + * La gestion générique du constructeur repose sur quelques + * prérequis quant à l'enregistrement de composants : + * + * - "box" doit être le support de panneau à intégrer. + * + * - pour les contenus actualisables, une pile de composants + * "stack" doit contenir un support "content" pour le + * contenu principal et un support "mask" qui prend le + * relais pendant les opérations de mise à jour. + */ + + GtkBuilder *builder; /* Constructeur utilisé */ + + cairo_surface_t *surface; /* Copie d'écran préalable */ + gdouble hadj_value; /* Sauvegarde de défilement #1 */ + gdouble vadj_value; /* Sauvegarde de défilement #2 */ + gint switched; /* Mémorise l'état de bascule */ + +}; + +/* Elément réactif pour panneaux de l'éditeur (classe) */ +struct _GPanelItemClass +{ + GEditorItemClass parent; /* A laisser en premier */ + + bool unique; /* Panneau instanciable ? */ + const char *bindings; /* Raccourci clavier éventuel */ + + bool can_search; /* Contenu fouillable ? */ + + ack_dock_process_fc ack_dock; /* Prise en compte d'accroche */ + ack_undock_process_fc ack_undock; /* Prise en compte de décroche */ + + update_filtered_fc update_filtered; /* Lancement du filtrage */ + + wgroup_id_t gid; /* Groupe de travail dédié */ + + /* Signaux */ + + void (* dock_request) (GPanelItem); + void (* undock_request) (GPanelItem); + +}; + + +#define panels_list_add_tail(new, head) dl_list_add_tail(new, head, GPanelItem, link) +#define panels_list_for_each(pos, head) dl_list_for_each(pos, head, GPanelItem, link) + + +/* Charge les éléments graphiques du panneau via les ressources. */ +GtkBuilder *g_panel_item_build(GPanelItem *, const char *); + +/* Charge les éléments graphiques du panneau via les ressources. */ +GtkBuilder *g_panel_item_build_full(GPanelItem *, const char *); + + + +/* ---------------------- MECANISMES DE MISE A JOUR DE PANNEAU ---------------------- */ + + +/* Obtient le groupe de travail dédié à une mise à jour. */ +wgroup_id_t g_panel_item_get_group(const GPanelItem *); + +/* Bascule l'affichage d'un panneau avant sa mise à jour. */ +void g_panel_item_switch_to_updating_mask(GPanelItem *); + +/* Bascule l'affichage d'un panneau après sa mise à jour. */ +void g_panel_item_switch_to_updated_content(GPanelItem *); + + + +#endif /* _GUI_PANELS_PANEL_INT_H */ diff --git a/src/gui/panel.c b/src/gui/panel.c new file mode 100644 index 0000000..843018e --- /dev/null +++ b/src/gui/panel.c @@ -0,0 +1,963 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * panel.c - gestion des éléments réactifs spécifiques aux panneaux + * + * Copyright (C) 2012-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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#include "panel.h" + + +#include +#include + + +#include "panel-int.h" +#include "../common/extstr.h" +#include "../core/params.h" +#include "../gtkext/gtkdockable-int.h" + + + +/* ------------------------- COEUR DES PANNEAUX D'AFFICHAGE ------------------------- */ + + +/* Initialise la classe des éléments réactifs de l'éditeur. */ +static void g_panel_item_class_init(GPanelItemClass *); + +/* Initialise une instance d'élément réactif pour l'éditeur. */ +static void g_panel_item_init(GPanelItem *); + +/* Procède à l'initialisation de l'interface de rassemblement. */ +static void g_panel_item_dockable_interface_init(GtkDockableInterface *); + +/* Supprime toutes les références externes. */ +static void g_panel_item_dispose(GPanelItem *); + +/* Procède à la libération totale de la mémoire. */ +static void g_panel_item_finalize(GPanelItem *); + +/* Détermine si un panneau peut être filtré. */ +static bool gtk_panel_item_can_search(const GPanelItem *); + +/* Fournit le nom court du composant encapsulable. */ +static const char *gtk_panel_item_get_name(const GPanelItem *); + +/* Fournit le nom long du composant encapsulable. */ +static const char *gtk_panel_item_get_desc(const GPanelItem *); + +/* Fournit le composant graphique intégrable dans un ensemble. */ +static GtkWidget *gtk_panel_item_get_widget(GPanelItem *); + +/* Démarre l'actualisation du filtrage du contenu. */ +static void gtk_panel_item_update_filtered(GPanelItem *, char *); + +/* Construit la chaîne d'accès à un élément de configuration. */ +static char *gtk_panel_item_build_configuration_key(const GPanelItem *, const char *); + + + +/* ---------------------- MECANISMES DE MISE A JOUR DE PANNEAU ---------------------- */ + + +/* Présente une copie de l'affichage du composant rafraîchi. */ +static gboolean g_panel_item_draw_mask(GtkWidget *, cairo_t *, GPanelItem *); + + + +/* ---------------------------------------------------------------------------------- */ +/* COEUR DES PANNEAUX D'AFFICHAGE */ +/* ---------------------------------------------------------------------------------- */ + + +/* Indique le type défini pour un élément destiné à un panneau. */ +G_DEFINE_TYPE_WITH_CODE(GPanelItem, g_panel_item, G_TYPE_EDITOR_ITEM, + G_IMPLEMENT_INTERFACE(GTK_TYPE_DOCKABLE, g_panel_item_dockable_interface_init)); + + +/****************************************************************************** +* * +* Paramètres : klass = classe à initialiser. * +* * +* Description : Initialise la classe des éléments réactifs de l'éditeur. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_panel_item_class_init(GPanelItemClass *klass) +{ + GObjectClass *object; /* Autre version de la classe */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_panel_item_dispose; + object->finalize = (GObjectFinalizeFunc)g_panel_item_finalize; + + g_signal_new("dock-request", + G_TYPE_PANEL_ITEM, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GPanelItemClass, dock_request), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + g_signal_new("undock-request", + G_TYPE_PANEL_ITEM, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GPanelItemClass, undock_request), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + + klass->can_search = false; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance à initialiser. * +* * +* Description : Initialise une instance d'élément réactif pour l'éditeur. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_panel_item_init(GPanelItem *item) +{ + DL_LIST_ITEM_INIT(&item->link); + + item->personality = PIP_INVALID; + + item->filter = NULL; + + g_atomic_int_set(&item->switched, 0); + +} + + +/****************************************************************************** +* * +* Paramètres : iface = interface GTK à initialiser. * +* * +* Description : Procède à l'initialisation de l'interface de rassemblement. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_panel_item_dockable_interface_init(GtkDockableInterface *iface) +{ + iface->can_search = (can_dockable_search_fc)gtk_panel_item_can_search; + iface->get_name = (get_dockable_name_fc)gtk_panel_item_get_name; + iface->get_desc = (get_dockable_desc_fc)gtk_panel_item_get_desc; + iface->get_widget = (get_dockable_widget_fc)gtk_panel_item_get_widget; + iface->update_filtered = (update_filtered_data_fc)gtk_panel_item_update_filtered; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_panel_item_dispose(GPanelItem *item) +{ + g_clear_object(&item->builder); + + G_OBJECT_CLASS(g_panel_item_parent_class)->dispose(G_OBJECT(item)); + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_panel_item_finalize(GPanelItem *item) +{ + free(item->path); + + if (item->filter != NULL) + free(item->filter); + + if (item->surface != NULL) + cairo_surface_destroy(item->surface); + + G_OBJECT_CLASS(g_panel_item_parent_class)->finalize(G_OBJECT(item)); + +} + + +/****************************************************************************** +* * +* Paramètres : personality = nature du panneau à mettre en place. * +* name = nom associé à l'élément. * +* lname = description longue du panneau. * +* widget = composant à présenter à l'affichage. * +* startup = chargement au démarrage ? * +* path = chemin vers la place idéale pour le futur panneau. * +* * +* Description : Crée un élément de panneau réactif. * +* * +* Retour : Adresse de la structure mise en place. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GPanelItem *g_panel_item_new(PanelItemPersonality personality, const char *name, const char *lname, GtkWidget *widget, bool startup, const char *path) +{ + GPanelItem *result; /* Structure à retourner */ + GEditorItem *parent; /* Autre version de l'élément */ + + result = g_object_new(G_TYPE_PANEL_ITEM, NULL); + + parent = G_EDITOR_ITEM(result); + + parent->name = name; + parent->widget = widget; + + assert(personality > PIP_INVALID && personality < PIP_COUNT); + result->personality = personality; + + result->lname = lname; + + result->dock_at_startup = startup; + result->path = strdup(path); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : item = panneau dont la construction est à poursuivre. * +* name = nom associé à l'élément dans les ressources globales. * +* * +* Description : Charge les éléments graphiques du panneau via les ressources.* +* * +* Retour : Constructeur mis en place, afin de faciliter son usage. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkBuilder *g_panel_item_build(GPanelItem *item, const char *name) +{ + GtkBuilder *result; /* Constructeur à retourner */ + char *path; /* Chemin d'accès à constituer */ + + asprintf(&path, "/org/chrysalide/gui/panels/%s.ui", name); + + result = g_panel_item_build_full(item, path); + + free(path); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : item = panneau dont la construction est à poursuivre. * +* path = chemin d'accès complet à la ressource à charger. * +* * +* Description : Charge les éléments graphiques du panneau via les ressources.* +* * +* Retour : Constructeur mis en place, afin de faciliter son usage. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GtkBuilder *g_panel_item_build_full(GPanelItem *item, const char *path) +{ + GtkBuilder *result; /* Constructeur à retourner */ + GEditorItem *base; /* Version basique d'instance */ + + result = gtk_builder_new_from_resource(path); + + item->builder = result; + + base = G_EDITOR_ITEM(item); + + base->widget = GTK_WIDGET(gtk_builder_get_object(result, "box")); + + g_object_ref(G_OBJECT(base->widget)); + + gtk_widget_unparent(base->widget); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK dont l'interface est à consulter. * +* * +* Description : Détermine si un panneau peut être filtré. * +* * +* Retour : Bilan de la consultation. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static bool gtk_panel_item_can_search(const GPanelItem *item) +{ + bool result; /* Indication à retourner */ + GPanelItemClass *class; /* Classe de l'élément visé */ + + class = G_PANEL_ITEM_GET_CLASS(item); + + result = class->can_search; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK dont l'interface est à consulter. * +* * +* Description : Fournit le nom court du composant encapsulable. * +* * +* Retour : Désignation humaine pour titre d'onglet ou de fenêtre. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static const char *gtk_panel_item_get_name(const GPanelItem *item) +{ + return G_EDITOR_ITEM(item)->name; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK dont l'interface est à consulter. * +* * +* Description : Fournit le nom long du composant encapsulable. * +* * +* Retour : Désignation humaine pour titre d'onglet ou de fenêtre. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static const char *gtk_panel_item_get_desc(const GPanelItem *item) +{ + return item->lname; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK dont l'interface est à consulter. * +* * +* Description : Fournit le composant graphique intégrable dans un ensemble. * +* * +* Retour : Composant graphique prêt à emploi. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GtkWidget *gtk_panel_item_get_widget(GPanelItem *item) +{ + return G_EDITOR_ITEM(item)->widget; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK dont l'interface est à sollicitée. * +* * +* Description : Démarre l'actualisation du filtrage du contenu. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void gtk_panel_item_update_filtered(GPanelItem *item, char *filter) +{ + assert(gtk_panel_item_can_search(item)); + + if (item->filter != NULL) + free(item->filter); + + item->filter = filter; + + G_PANEL_ITEM_GET_CLASS(item)->update_filtered(item); + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK à consulter. * +* attrib = élément de configuration à inclure dans le résultat.* +* * +* Description : Construit la chaîne d'accès à un élément de configuration. * +* * +* Retour : Chaîne de caractères à libérer après usage. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static char *gtk_panel_item_build_configuration_key(const GPanelItem *item, const char *attrib) +{ + char *result; /* Construction à renvoyer */ + const char *name; /* Nom court du panneau */ + + name = g_editor_item_get_name(G_EDITOR_ITEM(item)); + + asprintf(&result, "gui.panels.%s.%s", attrib, name); + + result = strrpl(result, " ", "_"); + + result = strlower(result); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK à consulter. * +* config = configuration à compléter. * +* * +* Description : Met en place les bases de la configuration du panneau. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool gtk_panel_item_setup_configuration(const GPanelItem *item, GGenConfig *config) +{ + bool result; /* Bilan à retourner */ + char *key; /* Clef d'accès à un paramètre */ + GCfgParam *param; /* Paramètre chargé */ + + result = true; + + key = gtk_panel_item_build_configuration_key(item, "dock_at_startup"); + + param = g_generic_config_create_param(config, key, CPT_BOOLEAN, item->dock_at_startup); + + if (param == NULL) + { + result = false; + goto gpisc_exit; + } + + free(key); + + key = gtk_panel_item_build_configuration_key(item, "path"); + + param = g_generic_config_create_param(config, key, CPT_STRING, item->path); + if (param == NULL) + result = false; + + gpisc_exit: + + free(key); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK à consulter. * +* config = configuration à charger. * +* * +* Description : Charge un panneau sur les bases de la configuration fournie. * +* * +* Retour : true, par conformité avec browse_all_item_panels(). * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool gtk_panel_item_apply_configuration(GPanelItem *item, GGenConfig *config) +{ + char *key; /* Clef d'accès à un paramètre */ + const char *new_path; /* Nouveau chemin de placement */ + bool status; /* Statut de l'encapsulation */ + + key = gtk_panel_item_build_configuration_key(item, "path"); + + if (g_generic_config_get_value(config, key, &new_path)) + { + free(item->path); + + item->path = strdup(new_path); + + } + + free(key); + + key = gtk_panel_item_build_configuration_key(item, "dock_at_startup"); + + if (g_generic_config_get_value(config, key, &status)) + { + item->dock_at_startup = status; + + if (item->dock_at_startup) + g_signal_emit_by_name(item, "dock-request"); + + } + + free(key); + + return true; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK à consulter. * +* * +* Description : Fournit une indication sur la personnalité du panneau. * +* * +* Retour : Identifiant lié à la nature du panneau. * +* * +* Remarques : - * +* * +******************************************************************************/ + +PanelItemPersonality gtk_panel_item_get_personality(const GPanelItem *item) +{ + return item->personality; + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK à consulter. * +* * +* Description : Fournit le chemin d'accès à utiliser pour les encapsulations.* +* * +* Retour : Chemin d'accès défini. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *gtk_panel_item_get_path(const GPanelItem *item) +{ + return item->path; + +} + +/****************************************************************************** +* * +* Paramètres : item = instance GTK à consulter. * +* path = nouvelle emplacement d'inclusion. * +* * +* Description : Définit le chemin d'accès à utiliser pour les encapsulations.* +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void gtk_panel_item_set_path(GPanelItem *item, const char *path) +{ + char *key; /* Clef d'accès à un paramètre */ + + free(item->path); + + item->path = strdup(path); + + key = gtk_panel_item_build_configuration_key(item, "path"); + + g_generic_config_set_value(get_main_configuration(), key, item->path); + + free(key); + +} + + +/****************************************************************************** +* * +* Paramètres : item = instance GTK dont l'interface est à consulter. * +* * +* Description : Indique la définition d'un éventuel raccourci clavier. * +* * +* Retour : Description d'un raccourci ou NULL si aucun de défini. * +* * +* Remarques : - * +* * +******************************************************************************/ + +const char *gtk_panel_item_get_key_bindings(const GPanelItem *item) +{ + return G_PANEL_ITEM_GET_CLASS(item)->bindings; + +} + + +/****************************************************************************** +* * +* Paramètres : item = composant à présenter à l'affichage. * +* * +* Description : Place un panneau dans l'ensemble affiché. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_panel_item_dock(GPanelItem *item) +{ + assert(!item->docked); + + g_signal_emit_by_name(item, "dock-request"); + + if (G_PANEL_ITEM_GET_CLASS(item)->ack_dock != NULL) + G_PANEL_ITEM_GET_CLASS(item)->ack_dock(item); + +} + + +/****************************************************************************** +* * +* Paramètres : item = composant d'affichage à mettre à jour. * +* status = nouvel état d'encapsulation. * +* * +* Description : Définit si le composant repose sur un support de l'éditeur. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_panel_item_set_dock_status(GPanelItem *item, bool status) +{ + char *key; /* Clef d'accès à un paramètre */ + + item->docked = status; + item->dock_at_startup = status; + + key = gtk_panel_item_build_configuration_key(item, "dock_at_startup"); + + g_generic_config_set_value(get_main_configuration(), key, item->dock_at_startup); + + free(key); + +} + + +/****************************************************************************** +* * +* Paramètres : item = composant d'affichage à consulter. * +* * +* Description : Indique si le composant repose sur un support de l'éditeur. * +* * +* Retour : true si le composant est bien incrusté quelque part. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_panel_item_is_docked(const GPanelItem *item) +{ + return item->docked; + +} + + +/****************************************************************************** +* * +* Paramètres : item = composant à retirer de l'affichage. * +* * +* Description : Supprime un panneau de l'ensemble affiché. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_panel_item_undock(GPanelItem *item) +{ + assert(item->docked); + + g_signal_emit_by_name(item, "undock-request"); + + if (G_PANEL_ITEM_GET_CLASS(item)->ack_undock != NULL) + G_PANEL_ITEM_GET_CLASS(item)->ack_undock(item); + +} + + + +/* ---------------------------------------------------------------------------------- */ +/* MECANISMES DE MISE A JOUR DE PANNEAU */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : item = panneau ciblé par une mise à jour. * +* * +* Description : Obtient le groupe de travail dédié à une mise à jour. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +wgroup_id_t g_panel_item_get_group(const GPanelItem *item) +{ + wgroup_id_t result; /* Identifiant à retourner */ + + result = G_PANEL_ITEM_GET_CLASS(item)->gid; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : widget = composant graphique sur lequel dessiner. * +* cr = contexte graphique pour le dessin. * +* panel = panneau ciblé par une mise à jour. * +* * +* Description : Présente une copie de l'affichage du composant rafraîchi. * +* * +* Retour : FALSE afin de poursuivre les traitements. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gboolean g_panel_item_draw_mask(GtkWidget *widget, cairo_t *cr, GPanelItem *item) +{ + int width; /* Largeur du composant actuel */ + int height; /* Hauteur du composant actuel */ + + width = gtk_widget_get_allocated_width(widget); + height = gtk_widget_get_allocated_height(widget); + + cairo_save(cr); + + cairo_set_source_surface(cr, item->surface, 0, 0); + cairo_rectangle(cr, 0, 0, width, height); + + cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); + cairo_fill(cr); + + cairo_restore(cr); + + return FALSE; + +} + + +/****************************************************************************** +* * +* Paramètres : panel = panneau ciblé par une mise à jour. * +* * +* Description : Bascule l'affichage d'un panneau avant sa mise à jour. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_panel_item_switch_to_updating_mask(GPanelItem *item) +{ + GtkWidget *content; /* Composant à faire évoluer */ + GdkWindow *window; /* Fenêtre au contenu à copier */ + int width; /* Largeur du composant actuel */ + int height; /* Hauteur du composant actuel */ + cairo_t *cr; /* Pinceau pour les dessins */ + GtkAdjustment *adj; /* Défilement éventuel */ + GtkStack *stack; /* Pile de composants GTK */ + GtkWidget *mask; /* Masque des travaux */ + + if (g_atomic_int_add(&item->switched, 1) > 0) + return; + + /* Copie de l'affichage courant */ + + assert(item->surface == NULL); + + content = GTK_WIDGET(gtk_builder_get_object(item->builder, "content")); + + window = gtk_widget_get_window(content); + + if (window != NULL) + { + width = gtk_widget_get_allocated_width(content); + height = gtk_widget_get_allocated_height(content); + + item->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + + cr = cairo_create(item->surface); + + gdk_cairo_set_source_window(cr, window, 0, 0); + + cairo_paint(cr); + + cairo_destroy(cr); + + } + + /* Sauvegarde de l'éventuelle position */ + + if (GTK_IS_SCROLLED_WINDOW(content)) + { + adj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(content)); + item->hadj_value = gtk_adjustment_get_value(adj); + + adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(content)); + item->vadj_value = gtk_adjustment_get_value(adj); + + } + + /* Opération de basculement effectif */ + + stack = GTK_STACK(gtk_builder_get_object(item->builder, "stack")); + + mask = GTK_WIDGET(gtk_builder_get_object(item->builder, "mask")); + + gtk_spinner_start(GTK_SPINNER(mask)); + + if (item->surface != NULL) + g_signal_connect(mask, "draw", G_CALLBACK(g_panel_item_draw_mask), item); + + gtk_stack_set_visible_child(stack, mask); + +} + + +/****************************************************************************** +* * +* Paramètres : panel = panneau ciblé par une mise à jour. * +* * +* Description : Bascule l'affichage d'un panneau après sa mise à jour. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_panel_item_switch_to_updated_content(GPanelItem *item) +{ + GtkWidget *content; /* Composant à faire évoluer */ + GtkAdjustment *adj; /* Défilement éventuel */ + GtkStack *stack; /* Pile de composants GTK */ + GtkWidget *mask; /* Masque des travaux */ + + if (g_atomic_int_get(&item->switched) > 1) + goto skip; + + /* Restauration d'une éventuelle position */ + + content = GTK_WIDGET(gtk_builder_get_object(item->builder, "content")); + + if (GTK_IS_SCROLLED_WINDOW(content)) + { + adj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(content)); + gtk_adjustment_set_value(adj, item->hadj_value); + + adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(content)); + gtk_adjustment_set_value(adj, item->vadj_value); + + } + + /* Opération de basculement effectif */ + + stack = GTK_STACK(gtk_builder_get_object(item->builder, "stack")); + + gtk_stack_set_visible_child(stack, content); + + mask = GTK_WIDGET(gtk_builder_get_object(item->builder, "mask")); + + g_signal_handlers_disconnect_by_func(mask, G_CALLBACK(g_panel_item_draw_mask), item); + + gtk_spinner_stop(GTK_SPINNER(mask)); + + /* Supression de la copie d'affichage */ + + if (item->surface != NULL) + { + cairo_surface_destroy(item->surface); + item->surface = NULL; + } + + skip: + + g_atomic_int_dec_and_test(&item->switched); + +} diff --git a/src/gui/panel.h b/src/gui/panel.h new file mode 100644 index 0000000..5614728 --- /dev/null +++ b/src/gui/panel.h @@ -0,0 +1,104 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * panel.h - prototypes pour la gestion des éléments réactifs spécifiques aux panneaux + * + * Copyright (C) 2012-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 this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + +#ifndef _GUI_PANELS_PANEL_H +#define _GUI_PANELS_PANEL_H + + +#include + + +#include "editem.h" +#include "../glibext/configuration.h" + + + +#define G_TYPE_PANEL_ITEM g_panel_item_get_type() +#define G_PANEL_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_PANEL_ITEM, GPanelItem)) +#define G_IS_PANEL_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_PANEL_ITEM)) +#define G_PANEL_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_PANEL_ITEM, GPanelItemClass)) +#define G_IS_PANEL_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_PANEL_ITEM)) +#define G_PANEL_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_PANEL_ITEM, GPanelItemClass)) + + +/* Elément réactif pour panneaux de l'éditeur (instance) */ +typedef struct _GPanelItem GPanelItem; + +/* Elément réactif pour panneaux de l'éditeur (classe) */ +typedef struct _GPanelItemClass GPanelItemClass; + + +/* Types de panneaux pour éditeur */ +typedef enum _PanelItemPersonality +{ + PIP_INVALID, /* Information non initialisée */ + + PIP_SINGLETON, /* Instance unique */ + PIP_BINARY_VIEW, /* Affichage d'un binaire */ + PIP_OTHER, /* Reste du monde */ + + PIP_COUNT + +} PanelItemPersonality; + + +/* Indique le type défini pour un élément destiné à un panneau. */ +GType g_panel_item_get_type(void); + +/* Crée un élément de panneau réactif. */ +GPanelItem *g_panel_item_new(PanelItemPersonality, const char *, const char *, GtkWidget *, bool, const char *); + +/* Met en place les bases de la configuration du panneau. */ +bool gtk_panel_item_setup_configuration(const GPanelItem *, GGenConfig *); + +/* Charge un panneau sur les bases de la configuration fournie. */ +bool gtk_panel_item_apply_configuration(GPanelItem *, GGenConfig *); + +/* Fournit une indication sur la personnalité du panneau. */ +PanelItemPersonality gtk_panel_item_get_personality(const GPanelItem *); + +/* Fournit le chemin d'accès à utiliser pour les encapsulations. */ +const char *gtk_panel_item_get_path(const GPanelItem *); + +/* Définit le chemin d'accès à utiliser pour les encapsulations. */ +void gtk_panel_item_set_path(GPanelItem *, const char *); + +/* Indique la définition d'un éventuel raccourci clavier. */ +const char *gtk_panel_item_get_key_bindings(const GPanelItem *); + +/* Place un panneau dans l'ensemble affiché. */ +void g_panel_item_dock(GPanelItem *); + +/* Définit si le composant repose sur un support de l'éditeur. */ +void g_panel_item_set_dock_status(GPanelItem *, bool); + +/* Indique si le composant repose sur un support de l'éditeur. */ +bool g_panel_item_is_docked(const GPanelItem *); + +/* Supprime un panneau de l'ensemble affiché. */ +void g_panel_item_undock(GPanelItem *); + + + +#endif /* _GUI_PANELS_PANEL_H */ diff --git a/src/gui/panels/Makefile.am b/src/gui/panels/Makefile.am index 8b63b24..457e507 100644 --- a/src/gui/panels/Makefile.am +++ b/src/gui/panels/Makefile.am @@ -1,4 +1,6 @@ +DEFAULT_INCLUDES = -idirafter. -I$(top_builddir) + BUILT_SOURCES = resources.h resources.c noinst_LTLIBRARIES = libguipanels.la @@ -22,8 +24,6 @@ libguipanels_la_SOURCES = \ glance.h glance.c \ history.h history.c \ log.h log.c \ - panel-int.h \ - panel.h panel.c \ regedit.h regedit.c \ resources.h resources.c \ strings.h strings.c \ diff --git a/src/gui/panels/bintree.c b/src/gui/panels/bintree.c index ffecd6e..434aa94 100644 --- a/src/gui/panels/bintree.c +++ b/src/gui/panels/bintree.c @@ -33,9 +33,9 @@ #include -#include "panel-int.h" #include "updating-int.h" #include "../agroup.h" +#include "../panel-int.h" #include "../core/global.h" #include "../../core/queue.h" #include "../../gtkext/gtkdisplaypanel.h" diff --git a/src/gui/panels/bintree.h b/src/gui/panels/bintree.h index 8168481..dd8e8fd 100644 --- a/src/gui/panels/bintree.h +++ b/src/gui/panels/bintree.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" diff --git a/src/gui/panels/bookmarks.c b/src/gui/panels/bookmarks.c index c141ff3..112afe9 100644 --- a/src/gui/panels/bookmarks.c +++ b/src/gui/panels/bookmarks.c @@ -35,7 +35,7 @@ #include -#include "panel-int.h" +#include "../panel-int.h" #include "../core/global.h" #include "../../analysis/db/items/bookmark.h" #include "../../common/cpp.h" diff --git a/src/gui/panels/bookmarks.h b/src/gui/panels/bookmarks.h index 311868c..eb0c354 100644 --- a/src/gui/panels/bookmarks.h +++ b/src/gui/panels/bookmarks.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" diff --git a/src/gui/panels/errors.c b/src/gui/panels/errors.c index b258ecf..67551e2 100644 --- a/src/gui/panels/errors.c +++ b/src/gui/panels/errors.c @@ -33,8 +33,8 @@ #include -#include "panel-int.h" #include "updating-int.h" +#include "../panel-int.h" #include "../core/global.h" #include "../../core/global.h" #include "../../core/paths.h" diff --git a/src/gui/panels/errors.h b/src/gui/panels/errors.h index 02451ee..b1dfe8b 100644 --- a/src/gui/panels/errors.h +++ b/src/gui/panels/errors.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" diff --git a/src/gui/panels/glance.c b/src/gui/panels/glance.c index 9b2c088..fa4df51 100644 --- a/src/gui/panels/glance.c +++ b/src/gui/panels/glance.c @@ -29,7 +29,7 @@ #include -#include "panel-int.h" +#include "../panel-int.h" diff --git a/src/gui/panels/glance.h b/src/gui/panels/glance.h index a7deee6..2e42f21 100644 --- a/src/gui/panels/glance.h +++ b/src/gui/panels/glance.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" diff --git a/src/gui/panels/history.c b/src/gui/panels/history.c index 9edd32e..4b694c7 100644 --- a/src/gui/panels/history.c +++ b/src/gui/panels/history.c @@ -32,7 +32,7 @@ #include -#include "panel-int.h" +#include "../panel-int.h" #include "../../analysis/binary.h" #include "../../glibext/chrysamarshal.h" #include "../../glibext/signal.h" diff --git a/src/gui/panels/history.h b/src/gui/panels/history.h index 61934cd..68261db 100644 --- a/src/gui/panels/history.h +++ b/src/gui/panels/history.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" diff --git a/src/gui/panels/log.c b/src/gui/panels/log.c index ffe8b42..213a726 100644 --- a/src/gui/panels/log.c +++ b/src/gui/panels/log.c @@ -32,7 +32,7 @@ #include -#include "panel-int.h" +#include "../panel-int.h" #include "../core/panels.h" #include "../../gtkext/easygtk.h" diff --git a/src/gui/panels/log.h b/src/gui/panels/log.h index 67b7160..724f263 100644 --- a/src/gui/panels/log.h +++ b/src/gui/panels/log.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" #include "../../core/logs.h" diff --git a/src/gui/panels/panel-int.h b/src/gui/panels/panel-int.h deleted file mode 100644 index 07aafc1..0000000 --- a/src/gui/panels/panel-int.h +++ /dev/null @@ -1,144 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * panel-int.h - prototypes pour les définitions internes liées aux panneaux d'affichage - * - * Copyright (C) 2012-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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef _GUI_PANELS_PANEL_INT_H -#define _GUI_PANELS_PANEL_INT_H - - -#include "panel.h" - - -#include - - -#include "../editem-int.h" -#include "../../common/dllist.h" -#include "../../glibext/delayed.h" - - - -/* ------------------------- COEUR DES PANNEAUX D'AFFICHAGE ------------------------- */ - - -/* Place un panneau dans l'ensemble affiché. */ -typedef void (* ack_dock_process_fc) (GPanelItem *); - -/* Supprime un panneau de l'ensemble affiché. */ -typedef void (* ack_undock_process_fc) (GPanelItem *); - -/* Démarre l'actualisation du filtrage du contenu. */ -typedef void (* update_filtered_fc) (GPanelItem *); - - -/* Elément réactif pour panneaux de l'éditeur (instance) */ -struct _GPanelItem -{ - GEditorItem parent; /* A laisser en premier */ - - DL_LIST_ITEM(link); /* Maillon de liste chaînée */ - - PanelItemPersonality personality; /* Nature de l'élément */ - - const char *lname; /* Description longue */ - - bool dock_at_startup; /* Recommandation au démarrage */ - char *path; /* Chemin vers la place idéale */ - - bool docked; /* Panneau inscrusté ? */ - - char *filter; /* Eventuel filtre textuel */ - - /** - * La gestion générique du constructeur repose sur quelques - * prérequis quant à l'enregistrement de composants : - * - * - "box" doit être le support de panneau à intégrer. - * - * - pour les contenus actualisables, une pile de composants - * "stack" doit contenir un support "content" pour le - * contenu principal et un support "mask" qui prend le - * relais pendant les opérations de mise à jour. - */ - - GtkBuilder *builder; /* Constructeur utilisé */ - - cairo_surface_t *surface; /* Copie d'écran préalable */ - gdouble hadj_value; /* Sauvegarde de défilement #1 */ - gdouble vadj_value; /* Sauvegarde de défilement #2 */ - gint switched; /* Mémorise l'état de bascule */ - -}; - -/* Elément réactif pour panneaux de l'éditeur (classe) */ -struct _GPanelItemClass -{ - GEditorItemClass parent; /* A laisser en premier */ - - bool unique; /* Panneau instanciable ? */ - const char *bindings; /* Raccourci clavier éventuel */ - - bool can_search; /* Contenu fouillable ? */ - - ack_dock_process_fc ack_dock; /* Prise en compte d'accroche */ - ack_undock_process_fc ack_undock; /* Prise en compte de décroche */ - - update_filtered_fc update_filtered; /* Lancement du filtrage */ - - wgroup_id_t gid; /* Groupe de travail dédié */ - - /* Signaux */ - - void (* dock_request) (GPanelItem); - void (* undock_request) (GPanelItem); - -}; - - -#define panels_list_add_tail(new, head) dl_list_add_tail(new, head, GPanelItem, link) -#define panels_list_for_each(pos, head) dl_list_for_each(pos, head, GPanelItem, link) - - -/* Charge les éléments graphiques du panneau via les ressources. */ -GtkBuilder *g_panel_item_build(GPanelItem *, const char *); - -/* Charge les éléments graphiques du panneau via les ressources. */ -GtkBuilder *g_panel_item_build_full(GPanelItem *, const char *); - - - -/* ---------------------- MECANISMES DE MISE A JOUR DE PANNEAU ---------------------- */ - - -/* Obtient le groupe de travail dédié à une mise à jour. */ -wgroup_id_t g_panel_item_get_group(const GPanelItem *); - -/* Bascule l'affichage d'un panneau avant sa mise à jour. */ -void g_panel_item_switch_to_updating_mask(GPanelItem *); - -/* Bascule l'affichage d'un panneau après sa mise à jour. */ -void g_panel_item_switch_to_updated_content(GPanelItem *); - - - -#endif /* _GUI_PANELS_PANEL_INT_H */ diff --git a/src/gui/panels/panel.c b/src/gui/panels/panel.c deleted file mode 100644 index a0965f1..0000000 --- a/src/gui/panels/panel.c +++ /dev/null @@ -1,963 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * panel.c - gestion des éléments réactifs spécifiques aux panneaux - * - * Copyright (C) 2012-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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#include "panel.h" - - -#include -#include - - -#include "panel-int.h" -#include "../../common/extstr.h" -#include "../../core/params.h" -#include "../../gtkext/gtkdockable-int.h" - - - -/* ------------------------- COEUR DES PANNEAUX D'AFFICHAGE ------------------------- */ - - -/* Initialise la classe des éléments réactifs de l'éditeur. */ -static void g_panel_item_class_init(GPanelItemClass *); - -/* Initialise une instance d'élément réactif pour l'éditeur. */ -static void g_panel_item_init(GPanelItem *); - -/* Procède à l'initialisation de l'interface de rassemblement. */ -static void g_panel_item_dockable_interface_init(GtkDockableInterface *); - -/* Supprime toutes les références externes. */ -static void g_panel_item_dispose(GPanelItem *); - -/* Procède à la libération totale de la mémoire. */ -static void g_panel_item_finalize(GPanelItem *); - -/* Détermine si un panneau peut être filtré. */ -static bool gtk_panel_item_can_search(const GPanelItem *); - -/* Fournit le nom court du composant encapsulable. */ -static const char *gtk_panel_item_get_name(const GPanelItem *); - -/* Fournit le nom long du composant encapsulable. */ -static const char *gtk_panel_item_get_desc(const GPanelItem *); - -/* Fournit le composant graphique intégrable dans un ensemble. */ -static GtkWidget *gtk_panel_item_get_widget(GPanelItem *); - -/* Démarre l'actualisation du filtrage du contenu. */ -static void gtk_panel_item_update_filtered(GPanelItem *, char *); - -/* Construit la chaîne d'accès à un élément de configuration. */ -static char *gtk_panel_item_build_configuration_key(const GPanelItem *, const char *); - - - -/* ---------------------- MECANISMES DE MISE A JOUR DE PANNEAU ---------------------- */ - - -/* Présente une copie de l'affichage du composant rafraîchi. */ -static gboolean g_panel_item_draw_mask(GtkWidget *, cairo_t *, GPanelItem *); - - - -/* ---------------------------------------------------------------------------------- */ -/* COEUR DES PANNEAUX D'AFFICHAGE */ -/* ---------------------------------------------------------------------------------- */ - - -/* Indique le type défini pour un élément destiné à un panneau. */ -G_DEFINE_TYPE_WITH_CODE(GPanelItem, g_panel_item, G_TYPE_EDITOR_ITEM, - G_IMPLEMENT_INTERFACE(GTK_TYPE_DOCKABLE, g_panel_item_dockable_interface_init)); - - -/****************************************************************************** -* * -* Paramètres : klass = classe à initialiser. * -* * -* Description : Initialise la classe des éléments réactifs de l'éditeur. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_panel_item_class_init(GPanelItemClass *klass) -{ - GObjectClass *object; /* Autre version de la classe */ - - object = G_OBJECT_CLASS(klass); - - object->dispose = (GObjectFinalizeFunc/* ! */)g_panel_item_dispose; - object->finalize = (GObjectFinalizeFunc)g_panel_item_finalize; - - g_signal_new("dock-request", - G_TYPE_PANEL_ITEM, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GPanelItemClass, dock_request), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - g_signal_new("undock-request", - G_TYPE_PANEL_ITEM, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET(GPanelItemClass, undock_request), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - - klass->can_search = false; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance à initialiser. * -* * -* Description : Initialise une instance d'élément réactif pour l'éditeur. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_panel_item_init(GPanelItem *item) -{ - DL_LIST_ITEM_INIT(&item->link); - - item->personality = PIP_INVALID; - - item->filter = NULL; - - g_atomic_int_set(&item->switched, 0); - -} - - -/****************************************************************************** -* * -* Paramètres : iface = interface GTK à initialiser. * -* * -* Description : Procède à l'initialisation de l'interface de rassemblement. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_panel_item_dockable_interface_init(GtkDockableInterface *iface) -{ - iface->can_search = (can_dockable_search_fc)gtk_panel_item_can_search; - iface->get_name = (get_dockable_name_fc)gtk_panel_item_get_name; - iface->get_desc = (get_dockable_desc_fc)gtk_panel_item_get_desc; - iface->get_widget = (get_dockable_widget_fc)gtk_panel_item_get_widget; - iface->update_filtered = (update_filtered_data_fc)gtk_panel_item_update_filtered; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance d'objet GLib à traiter. * -* * -* Description : Supprime toutes les références externes. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_panel_item_dispose(GPanelItem *item) -{ - g_clear_object(&item->builder); - - G_OBJECT_CLASS(g_panel_item_parent_class)->dispose(G_OBJECT(item)); - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance d'objet GLib à traiter. * -* * -* Description : Procède à la libération totale de la mémoire. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void g_panel_item_finalize(GPanelItem *item) -{ - free(item->path); - - if (item->filter != NULL) - free(item->filter); - - if (item->surface != NULL) - cairo_surface_destroy(item->surface); - - G_OBJECT_CLASS(g_panel_item_parent_class)->finalize(G_OBJECT(item)); - -} - - -/****************************************************************************** -* * -* Paramètres : personality = nature du panneau à mettre en place. * -* name = nom associé à l'élément. * -* lname = description longue du panneau. * -* widget = composant à présenter à l'affichage. * -* startup = chargement au démarrage ? * -* path = chemin vers la place idéale pour le futur panneau. * -* * -* Description : Crée un élément de panneau réactif. * -* * -* Retour : Adresse de la structure mise en place. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GPanelItem *g_panel_item_new(PanelItemPersonality personality, const char *name, const char *lname, GtkWidget *widget, bool startup, const char *path) -{ - GPanelItem *result; /* Structure à retourner */ - GEditorItem *parent; /* Autre version de l'élément */ - - result = g_object_new(G_TYPE_PANEL_ITEM, NULL); - - parent = G_EDITOR_ITEM(result); - - parent->name = name; - parent->widget = widget; - - assert(personality > PIP_INVALID && personality < PIP_COUNT); - result->personality = personality; - - result->lname = lname; - - result->dock_at_startup = startup; - result->path = strdup(path); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : item = panneau dont la construction est à poursuivre. * -* name = nom associé à l'élément dans les ressources globales. * -* * -* Description : Charge les éléments graphiques du panneau via les ressources.* -* * -* Retour : Constructeur mis en place, afin de faciliter son usage. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkBuilder *g_panel_item_build(GPanelItem *item, const char *name) -{ - GtkBuilder *result; /* Constructeur à retourner */ - char *path; /* Chemin d'accès à constituer */ - - asprintf(&path, "/org/chrysalide/gui/panels/%s.ui", name); - - result = g_panel_item_build_full(item, path); - - free(path); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : item = panneau dont la construction est à poursuivre. * -* path = chemin d'accès complet à la ressource à charger. * -* * -* Description : Charge les éléments graphiques du panneau via les ressources.* -* * -* Retour : Constructeur mis en place, afin de faciliter son usage. * -* * -* Remarques : - * -* * -******************************************************************************/ - -GtkBuilder *g_panel_item_build_full(GPanelItem *item, const char *path) -{ - GtkBuilder *result; /* Constructeur à retourner */ - GEditorItem *base; /* Version basique d'instance */ - - result = gtk_builder_new_from_resource(path); - - item->builder = result; - - base = G_EDITOR_ITEM(item); - - base->widget = GTK_WIDGET(gtk_builder_get_object(result, "box")); - - g_object_ref(G_OBJECT(base->widget)); - - gtk_widget_unparent(base->widget); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK dont l'interface est à consulter. * -* * -* Description : Détermine si un panneau peut être filtré. * -* * -* Retour : Bilan de la consultation. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static bool gtk_panel_item_can_search(const GPanelItem *item) -{ - bool result; /* Indication à retourner */ - GPanelItemClass *class; /* Classe de l'élément visé */ - - class = G_PANEL_ITEM_GET_CLASS(item); - - result = class->can_search; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK dont l'interface est à consulter. * -* * -* Description : Fournit le nom court du composant encapsulable. * -* * -* Retour : Désignation humaine pour titre d'onglet ou de fenêtre. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static const char *gtk_panel_item_get_name(const GPanelItem *item) -{ - return G_EDITOR_ITEM(item)->name; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK dont l'interface est à consulter. * -* * -* Description : Fournit le nom long du composant encapsulable. * -* * -* Retour : Désignation humaine pour titre d'onglet ou de fenêtre. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static const char *gtk_panel_item_get_desc(const GPanelItem *item) -{ - return item->lname; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK dont l'interface est à consulter. * -* * -* Description : Fournit le composant graphique intégrable dans un ensemble. * -* * -* Retour : Composant graphique prêt à emploi. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static GtkWidget *gtk_panel_item_get_widget(GPanelItem *item) -{ - return G_EDITOR_ITEM(item)->widget; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK dont l'interface est à sollicitée. * -* * -* Description : Démarre l'actualisation du filtrage du contenu. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -static void gtk_panel_item_update_filtered(GPanelItem *item, char *filter) -{ - assert(gtk_panel_item_can_search(item)); - - if (item->filter != NULL) - free(item->filter); - - item->filter = filter; - - G_PANEL_ITEM_GET_CLASS(item)->update_filtered(item); - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK à consulter. * -* attrib = élément de configuration à inclure dans le résultat.* -* * -* Description : Construit la chaîne d'accès à un élément de configuration. * -* * -* Retour : Chaîne de caractères à libérer après usage. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static char *gtk_panel_item_build_configuration_key(const GPanelItem *item, const char *attrib) -{ - char *result; /* Construction à renvoyer */ - const char *name; /* Nom court du panneau */ - - name = g_editor_item_get_name(G_EDITOR_ITEM(item)); - - asprintf(&result, "gui.panels.%s.%s", attrib, name); - - result = strrpl(result, " ", "_"); - - result = strlower(result); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK à consulter. * -* config = configuration à compléter. * -* * -* Description : Met en place les bases de la configuration du panneau. * -* * -* Retour : Bilan de l'opération. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool gtk_panel_item_setup_configuration(const GPanelItem *item, GGenConfig *config) -{ - bool result; /* Bilan à retourner */ - char *key; /* Clef d'accès à un paramètre */ - GCfgParam *param; /* Paramètre chargé */ - - result = true; - - key = gtk_panel_item_build_configuration_key(item, "dock_at_startup"); - - param = g_generic_config_create_param(config, key, CPT_BOOLEAN, item->dock_at_startup); - - if (param == NULL) - { - result = false; - goto gpisc_exit; - } - - free(key); - - key = gtk_panel_item_build_configuration_key(item, "path"); - - param = g_generic_config_create_param(config, key, CPT_STRING, item->path); - if (param == NULL) - result = false; - - gpisc_exit: - - free(key); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK à consulter. * -* config = configuration à charger. * -* * -* Description : Charge un panneau sur les bases de la configuration fournie. * -* * -* Retour : true, par conformité avec browse_all_item_panels(). * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool gtk_panel_item_apply_configuration(GPanelItem *item, GGenConfig *config) -{ - char *key; /* Clef d'accès à un paramètre */ - const char *new_path; /* Nouveau chemin de placement */ - bool status; /* Statut de l'encapsulation */ - - key = gtk_panel_item_build_configuration_key(item, "path"); - - if (g_generic_config_get_value(config, key, &new_path)) - { - free(item->path); - - item->path = strdup(new_path); - - } - - free(key); - - key = gtk_panel_item_build_configuration_key(item, "dock_at_startup"); - - if (g_generic_config_get_value(config, key, &status)) - { - item->dock_at_startup = status; - - if (item->dock_at_startup) - g_signal_emit_by_name(item, "dock-request"); - - } - - free(key); - - return true; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK à consulter. * -* * -* Description : Fournit une indication sur la personnalité du panneau. * -* * -* Retour : Identifiant lié à la nature du panneau. * -* * -* Remarques : - * -* * -******************************************************************************/ - -PanelItemPersonality gtk_panel_item_get_personality(const GPanelItem *item) -{ - return item->personality; - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK à consulter. * -* * -* Description : Fournit le chemin d'accès à utiliser pour les encapsulations.* -* * -* Retour : Chemin d'accès défini. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const char *gtk_panel_item_get_path(const GPanelItem *item) -{ - return item->path; - -} - -/****************************************************************************** -* * -* Paramètres : item = instance GTK à consulter. * -* path = nouvelle emplacement d'inclusion. * -* * -* Description : Définit le chemin d'accès à utiliser pour les encapsulations.* -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void gtk_panel_item_set_path(GPanelItem *item, const char *path) -{ - char *key; /* Clef d'accès à un paramètre */ - - free(item->path); - - item->path = strdup(path); - - key = gtk_panel_item_build_configuration_key(item, "path"); - - g_generic_config_set_value(get_main_configuration(), key, item->path); - - free(key); - -} - - -/****************************************************************************** -* * -* Paramètres : item = instance GTK dont l'interface est à consulter. * -* * -* Description : Indique la définition d'un éventuel raccourci clavier. * -* * -* Retour : Description d'un raccourci ou NULL si aucun de défini. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const char *gtk_panel_item_get_key_bindings(const GPanelItem *item) -{ - return G_PANEL_ITEM_GET_CLASS(item)->bindings; - -} - - -/****************************************************************************** -* * -* Paramètres : item = composant à présenter à l'affichage. * -* * -* Description : Place un panneau dans l'ensemble affiché. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_panel_item_dock(GPanelItem *item) -{ - assert(!item->docked); - - g_signal_emit_by_name(item, "dock-request"); - - if (G_PANEL_ITEM_GET_CLASS(item)->ack_dock != NULL) - G_PANEL_ITEM_GET_CLASS(item)->ack_dock(item); - -} - - -/****************************************************************************** -* * -* Paramètres : item = composant d'affichage à mettre à jour. * -* status = nouvel état d'encapsulation. * -* * -* Description : Définit si le composant repose sur un support de l'éditeur. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_panel_item_set_dock_status(GPanelItem *item, bool status) -{ - char *key; /* Clef d'accès à un paramètre */ - - item->docked = status; - item->dock_at_startup = status; - - key = gtk_panel_item_build_configuration_key(item, "dock_at_startup"); - - g_generic_config_set_value(get_main_configuration(), key, item->dock_at_startup); - - free(key); - -} - - -/****************************************************************************** -* * -* Paramètres : item = composant d'affichage à consulter. * -* * -* Description : Indique si le composant repose sur un support de l'éditeur. * -* * -* Retour : true si le composant est bien incrusté quelque part. * -* * -* Remarques : - * -* * -******************************************************************************/ - -bool g_panel_item_is_docked(const GPanelItem *item) -{ - return item->docked; - -} - - -/****************************************************************************** -* * -* Paramètres : item = composant à retirer de l'affichage. * -* * -* Description : Supprime un panneau de l'ensemble affiché. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_panel_item_undock(GPanelItem *item) -{ - assert(item->docked); - - g_signal_emit_by_name(item, "undock-request"); - - if (G_PANEL_ITEM_GET_CLASS(item)->ack_undock != NULL) - G_PANEL_ITEM_GET_CLASS(item)->ack_undock(item); - -} - - - -/* ---------------------------------------------------------------------------------- */ -/* MECANISMES DE MISE A JOUR DE PANNEAU */ -/* ---------------------------------------------------------------------------------- */ - - -/****************************************************************************** -* * -* Paramètres : item = panneau ciblé par une mise à jour. * -* * -* Description : Obtient le groupe de travail dédié à une mise à jour. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -wgroup_id_t g_panel_item_get_group(const GPanelItem *item) -{ - wgroup_id_t result; /* Identifiant à retourner */ - - result = G_PANEL_ITEM_GET_CLASS(item)->gid; - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : widget = composant graphique sur lequel dessiner. * -* cr = contexte graphique pour le dessin. * -* panel = panneau ciblé par une mise à jour. * -* * -* Description : Présente une copie de l'affichage du composant rafraîchi. * -* * -* Retour : FALSE afin de poursuivre les traitements. * -* * -* Remarques : - * -* * -******************************************************************************/ - -static gboolean g_panel_item_draw_mask(GtkWidget *widget, cairo_t *cr, GPanelItem *item) -{ - int width; /* Largeur du composant actuel */ - int height; /* Hauteur du composant actuel */ - - width = gtk_widget_get_allocated_width(widget); - height = gtk_widget_get_allocated_height(widget); - - cairo_save(cr); - - cairo_set_source_surface(cr, item->surface, 0, 0); - cairo_rectangle(cr, 0, 0, width, height); - - cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); - cairo_fill(cr); - - cairo_restore(cr); - - return FALSE; - -} - - -/****************************************************************************** -* * -* Paramètres : panel = panneau ciblé par une mise à jour. * -* * -* Description : Bascule l'affichage d'un panneau avant sa mise à jour. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_panel_item_switch_to_updating_mask(GPanelItem *item) -{ - GtkWidget *content; /* Composant à faire évoluer */ - GdkWindow *window; /* Fenêtre au contenu à copier */ - int width; /* Largeur du composant actuel */ - int height; /* Hauteur du composant actuel */ - cairo_t *cr; /* Pinceau pour les dessins */ - GtkAdjustment *adj; /* Défilement éventuel */ - GtkStack *stack; /* Pile de composants GTK */ - GtkWidget *mask; /* Masque des travaux */ - - if (g_atomic_int_add(&item->switched, 1) > 0) - return; - - /* Copie de l'affichage courant */ - - assert(item->surface == NULL); - - content = GTK_WIDGET(gtk_builder_get_object(item->builder, "content")); - - window = gtk_widget_get_window(content); - - if (window != NULL) - { - width = gtk_widget_get_allocated_width(content); - height = gtk_widget_get_allocated_height(content); - - item->surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); - - cr = cairo_create(item->surface); - - gdk_cairo_set_source_window(cr, window, 0, 0); - - cairo_paint(cr); - - cairo_destroy(cr); - - } - - /* Sauvegarde de l'éventuelle position */ - - if (GTK_IS_SCROLLED_WINDOW(content)) - { - adj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(content)); - item->hadj_value = gtk_adjustment_get_value(adj); - - adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(content)); - item->vadj_value = gtk_adjustment_get_value(adj); - - } - - /* Opération de basculement effectif */ - - stack = GTK_STACK(gtk_builder_get_object(item->builder, "stack")); - - mask = GTK_WIDGET(gtk_builder_get_object(item->builder, "mask")); - - gtk_spinner_start(GTK_SPINNER(mask)); - - if (item->surface != NULL) - g_signal_connect(mask, "draw", G_CALLBACK(g_panel_item_draw_mask), item); - - gtk_stack_set_visible_child(stack, mask); - -} - - -/****************************************************************************** -* * -* Paramètres : panel = panneau ciblé par une mise à jour. * -* * -* Description : Bascule l'affichage d'un panneau après sa mise à jour. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ - -void g_panel_item_switch_to_updated_content(GPanelItem *item) -{ - GtkWidget *content; /* Composant à faire évoluer */ - GtkAdjustment *adj; /* Défilement éventuel */ - GtkStack *stack; /* Pile de composants GTK */ - GtkWidget *mask; /* Masque des travaux */ - - if (g_atomic_int_get(&item->switched) > 1) - goto skip; - - /* Restauration d'une éventuelle position */ - - content = GTK_WIDGET(gtk_builder_get_object(item->builder, "content")); - - if (GTK_IS_SCROLLED_WINDOW(content)) - { - adj = gtk_scrolled_window_get_hadjustment(GTK_SCROLLED_WINDOW(content)); - gtk_adjustment_set_value(adj, item->hadj_value); - - adj = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(content)); - gtk_adjustment_set_value(adj, item->vadj_value); - - } - - /* Opération de basculement effectif */ - - stack = GTK_STACK(gtk_builder_get_object(item->builder, "stack")); - - gtk_stack_set_visible_child(stack, content); - - mask = GTK_WIDGET(gtk_builder_get_object(item->builder, "mask")); - - g_signal_handlers_disconnect_by_func(mask, G_CALLBACK(g_panel_item_draw_mask), item); - - gtk_spinner_stop(GTK_SPINNER(mask)); - - /* Supression de la copie d'affichage */ - - if (item->surface != NULL) - { - cairo_surface_destroy(item->surface); - item->surface = NULL; - } - - skip: - - g_atomic_int_dec_and_test(&item->switched); - -} diff --git a/src/gui/panels/panel.h b/src/gui/panels/panel.h deleted file mode 100644 index 4a92409..0000000 --- a/src/gui/panels/panel.h +++ /dev/null @@ -1,104 +0,0 @@ - -/* Chrysalide - Outil d'analyse de fichiers binaires - * panel.h - prototypes pour la gestion des éléments réactifs spécifiques aux panneaux - * - * Copyright (C) 2012-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 this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - -#ifndef _GUI_PANELS_PANEL_H -#define _GUI_PANELS_PANEL_H - - -#include - - -#include "../editem.h" -#include "../../glibext/configuration.h" - - - -#define G_TYPE_PANEL_ITEM g_panel_item_get_type() -#define G_PANEL_ITEM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), G_TYPE_PANEL_ITEM, GPanelItem)) -#define G_IS_PANEL_ITEM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), G_TYPE_PANEL_ITEM)) -#define G_PANEL_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), G_TYPE_PANEL_ITEM, GPanelItemClass)) -#define G_IS_PANEL_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), G_TYPE_PANEL_ITEM)) -#define G_PANEL_ITEM_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), G_TYPE_PANEL_ITEM, GPanelItemClass)) - - -/* Elément réactif pour panneaux de l'éditeur (instance) */ -typedef struct _GPanelItem GPanelItem; - -/* Elément réactif pour panneaux de l'éditeur (classe) */ -typedef struct _GPanelItemClass GPanelItemClass; - - -/* Types de panneaux pour éditeur */ -typedef enum _PanelItemPersonality -{ - PIP_INVALID, /* Information non initialisée */ - - PIP_SINGLETON, /* Instance unique */ - PIP_BINARY_VIEW, /* Affichage d'un binaire */ - PIP_OTHER, /* Reste du monde */ - - PIP_COUNT - -} PanelItemPersonality; - - -/* Indique le type défini pour un élément destiné à un panneau. */ -GType g_panel_item_get_type(void); - -/* Crée un élément de panneau réactif. */ -GPanelItem *g_panel_item_new(PanelItemPersonality, const char *, const char *, GtkWidget *, bool, const char *); - -/* Met en place les bases de la configuration du panneau. */ -bool gtk_panel_item_setup_configuration(const GPanelItem *, GGenConfig *); - -/* Charge un panneau sur les bases de la configuration fournie. */ -bool gtk_panel_item_apply_configuration(GPanelItem *, GGenConfig *); - -/* Fournit une indication sur la personnalité du panneau. */ -PanelItemPersonality gtk_panel_item_get_personality(const GPanelItem *); - -/* Fournit le chemin d'accès à utiliser pour les encapsulations. */ -const char *gtk_panel_item_get_path(const GPanelItem *); - -/* Définit le chemin d'accès à utiliser pour les encapsulations. */ -void gtk_panel_item_set_path(GPanelItem *, const char *); - -/* Indique la définition d'un éventuel raccourci clavier. */ -const char *gtk_panel_item_get_key_bindings(const GPanelItem *); - -/* Place un panneau dans l'ensemble affiché. */ -void g_panel_item_dock(GPanelItem *); - -/* Définit si le composant repose sur un support de l'éditeur. */ -void g_panel_item_set_dock_status(GPanelItem *, bool); - -/* Indique si le composant repose sur un support de l'éditeur. */ -bool g_panel_item_is_docked(const GPanelItem *); - -/* Supprime un panneau de l'ensemble affiché. */ -void g_panel_item_undock(GPanelItem *); - - - -#endif /* _GUI_PANELS_PANEL_H */ diff --git a/src/gui/panels/regedit.c b/src/gui/panels/regedit.c index db98f28..aa749f9 100644 --- a/src/gui/panels/regedit.c +++ b/src/gui/panels/regedit.c @@ -35,8 +35,8 @@ #include -#include "panel-int.h" #include "../agroup.h" +#include "../panel-int.h" #include "../../core/params.h" #include "../../common/cpp.h" #include "../../common/extstr.h" diff --git a/src/gui/panels/regedit.h b/src/gui/panels/regedit.h index 1ce4290..636e6cf 100644 --- a/src/gui/panels/regedit.h +++ b/src/gui/panels/regedit.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c index 8248c08..7fd0ffc 100644 --- a/src/gui/panels/strings.c +++ b/src/gui/panels/strings.c @@ -31,8 +31,8 @@ #include -#include "panel-int.h" #include "updating-int.h" +#include "../panel-int.h" #include "../core/global.h" #include "../dialogs/gotox.h" #include "../../common/extstr.h" diff --git a/src/gui/panels/strings.h b/src/gui/panels/strings.h index c2e2332..1856d12 100644 --- a/src/gui/panels/strings.h +++ b/src/gui/panels/strings.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" diff --git a/src/gui/panels/symbols.c b/src/gui/panels/symbols.c index e0a5857..6ea7a72 100644 --- a/src/gui/panels/symbols.c +++ b/src/gui/panels/symbols.c @@ -36,9 +36,9 @@ #include -#include "panel-int.h" #include "updating-int.h" #include "../agroup.h" +#include "../panel-int.h" #include "../core/global.h" #include "../../common/extstr.h" #include "../../core/paths.h" diff --git a/src/gui/panels/symbols.h b/src/gui/panels/symbols.h index b7e12fc..942aa6c 100644 --- a/src/gui/panels/symbols.h +++ b/src/gui/panels/symbols.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" diff --git a/src/gui/panels/welcome.c b/src/gui/panels/welcome.c index 8b74f78..6812125 100644 --- a/src/gui/panels/welcome.c +++ b/src/gui/panels/welcome.c @@ -36,7 +36,7 @@ #include -#include "panel-int.h" +#include "../panel-int.h" #include "../core/global.h" #include "../../common/cpp.h" #include "../../common/io.h" diff --git a/src/gui/panels/welcome.h b/src/gui/panels/welcome.h index aa018f5..45f465b 100644 --- a/src/gui/panels/welcome.h +++ b/src/gui/panels/welcome.h @@ -29,7 +29,7 @@ #include -#include "panel.h" +#include "../panel.h" -- cgit v0.11.2-87-g4458