From d614d4b09230411455ed07aac289025a55633da8 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Mon, 24 Jun 2019 21:16:23 +0200 Subject: Referenced all accesses to the main window. --- plugins/pychrysalide/gui/core/Makefile.am | 1 + plugins/pychrysalide/gui/core/global.c | 116 ++++++++++++++++++++++++++++++ plugins/pychrysalide/gui/core/global.h | 39 ++++++++++ plugins/pychrysalide/gui/core/module.c | 2 + plugins/ropgadgets/plugin.c | 25 +++++-- src/gui/core/global.c | 14 +++- src/gui/editor.c | 4 ++ src/gui/menus/binary.c | 28 ++++++-- src/gui/menus/file.c | 16 ++++- src/gui/panels/strings.c | 8 ++- src/gui/panels/welcome.c | 4 +- src/main.c | 2 +- 12 files changed, 243 insertions(+), 16 deletions(-) create mode 100644 plugins/pychrysalide/gui/core/global.c create mode 100644 plugins/pychrysalide/gui/core/global.h diff --git a/plugins/pychrysalide/gui/core/Makefile.am b/plugins/pychrysalide/gui/core/Makefile.am index 4f7e05b..c1e0153 100644 --- a/plugins/pychrysalide/gui/core/Makefile.am +++ b/plugins/pychrysalide/gui/core/Makefile.am @@ -2,6 +2,7 @@ noinst_LTLIBRARIES = libpychrysaguicore.la libpychrysaguicore_la_SOURCES = \ + global.h global.c \ items.h items.c \ module.h module.c \ panels.h panels.c diff --git a/plugins/pychrysalide/gui/core/global.c b/plugins/pychrysalide/gui/core/global.c new file mode 100644 index 0000000..40f6b6e --- /dev/null +++ b/plugins/pychrysalide/gui/core/global.c @@ -0,0 +1,116 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * global.c - équivalent Python du fichier "gui/core/global.c" + * + * Copyright (C) 2019 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 "global.h" + + +#include + + +#include + + +#include "../../access.h" +#include "../../helpers.h" + + + +/* Fournit l'adresse de la fenêtre principale de l'éditeur. */ +static PyObject *py_global_get_editor_window(PyObject *, PyObject *); + + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* args = non utilisé ici. * +* * +* Description : Fournit l'adresse de la fenêtre principale de l'éditeur. * +* * +* Retour : Fenêtre principale référencée. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_global_get_editor_window(PyObject *self, PyObject *args) +{ + PyObject *result; /* Instance Python à retourner */ + GtkWindow *editor; /* Fenêtre principale récupérée*/ + +#define GLOBAL_GET_EDITOR_WINDOW_METHOD PYTHON_METHOD_DEF \ +( \ + get_editor_window, "", \ + METH_NOARGS, py_global, \ + "Provide access to the Chrysalide main window, referenced as the editor window." \ +) + + editor = get_editor_window(); + + if (editor != NULL) + { + result = pygobject_new(G_OBJECT(editor)); + g_object_unref(G_OBJECT(editor)); + } + else + { + result = Py_None; + Py_INCREF(result); + } + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : - * +* * +* Description : Définit une extension du module 'core' à compléter. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool populate_gui_core_module_with_global(void) +{ + bool result; /* Bilan à retourner */ + PyObject *module; /* Module à recompléter */ + + static PyMethodDef py_global_methods[] = { + GLOBAL_GET_EDITOR_WINDOW_METHOD, + { NULL } + + }; + + module = get_access_to_python_module("pychrysalide.gui.core"); + + result = register_python_module_methods(module, py_global_methods); + + return result; + +} diff --git a/plugins/pychrysalide/gui/core/global.h b/plugins/pychrysalide/gui/core/global.h new file mode 100644 index 0000000..9416573 --- /dev/null +++ b/plugins/pychrysalide/gui/core/global.h @@ -0,0 +1,39 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * global.h - prototypes pour l'équivalent Python du fichier "gui/core/global.h" + * + * Copyright (C) 2019 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_CORE_GUI_GLOBAL_H +#define _PLUGINS_PYCHRYSALIDE_CORE_GUI_GLOBAL_H + + +#include +#include + + + +/* Définit une extension du module 'core' à compléter. */ +bool populate_gui_core_module_with_global(void); + + + +#endif /* _PLUGINS_PYCHRYSALIDE_CORE_GUI_GLOBAL_H */ diff --git a/plugins/pychrysalide/gui/core/module.c b/plugins/pychrysalide/gui/core/module.c index 8a28c08..47c35b1 100644 --- a/plugins/pychrysalide/gui/core/module.c +++ b/plugins/pychrysalide/gui/core/module.c @@ -28,6 +28,7 @@ #include +#include "global.h" #include "items.h" #include "panels.h" #include "../../helpers.h" @@ -90,6 +91,7 @@ bool populate_gui_core_module(void) result = true; if (result) result = ensure_python_items_is_registered(); + if (result) result = populate_gui_core_module_with_global(); if (result) result = populate_gui_core_module_with_panels(); assert(result); diff --git a/plugins/ropgadgets/plugin.c b/plugins/ropgadgets/plugin.c index 1e8aef6..e1d29b0 100644 --- a/plugins/ropgadgets/plugin.c +++ b/plugins/ropgadgets/plugin.c @@ -68,21 +68,32 @@ static void mcb_plugins_list_rop_gadgets(GtkMenuItem *, gpointer); G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin) { + bool result; /* Bilan à retourner */ GObject *ref; /* Espace de référencements */ GtkContainer *menubar; /* Support pour éléments */ GtkWidget *submenuitem; /* Sous-élément de menu */ + result = false; + ref = G_OBJECT(get_editor_window()); - if (ref == NULL) return false; + if (ref == NULL) goto no_editor; menubar = GTK_CONTAINER(g_object_get_data(ref, "menubar_plugins")); - if (menubar == NULL) return false; + if (menubar == NULL) goto no_menubar; submenuitem = qck_create_menu_item(ref, "mnu_plugins_ropgadgets", _("List ROP gadgets"), G_CALLBACK(mcb_plugins_list_rop_gadgets), NULL); gtk_container_add(GTK_CONTAINER(menubar), submenuitem); - return true; + result = true; + + no_menubar: + + g_object_unref(ref); + + no_editor: + + return result; } @@ -102,6 +113,12 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin) static void mcb_plugins_list_rop_gadgets(GtkMenuItem *menuitem, gpointer unused) { - run_rop_finder_assistant(get_editor_window()); + GtkWindow *editor; /* Fenêtre graphique principale*/ + + editor = get_editor_window(); + + run_rop_finder_assistant(editor); + + g_object_unref(G_OBJECT(editor)); } diff --git a/src/gui/core/global.c b/src/gui/core/global.c index bfc2426..7b6afc9 100644 --- a/src/gui/core/global.c +++ b/src/gui/core/global.c @@ -63,8 +63,13 @@ G_LOCK_DEFINE_STATIC(_cv_mutex); void set_editor_window(GtkWindow *editor) { + g_clear_object(&_editor); + _editor = editor; + if (editor != NULL) + g_object_ref(G_OBJECT(editor)); + } @@ -82,7 +87,14 @@ void set_editor_window(GtkWindow *editor) GtkWindow *get_editor_window(void) { - return _editor; + GtkWindow *result; /* Instance à retourner */ + + result = _editor; + + if (result != NULL) + g_object_ref(G_OBJECT(result)); + + return result; } diff --git a/src/gui/editor.c b/src/gui/editor.c index 627df95..f2807bf 100644 --- a/src/gui/editor.c +++ b/src/gui/editor.c @@ -222,6 +222,8 @@ GtkWidget *create_editor(void) gtk_container_set_border_width(GTK_CONTAINER(result), 4); gtk_window_set_title(GTK_WINDOW(result), _("Chrysalide")); + g_object_ref_sink(G_OBJECT(result)); + set_editor_window(GTK_WINDOW(result)); g_generic_config_get_value(get_main_configuration(), MPK_TITLE_BAR, &hide); @@ -411,6 +413,8 @@ static void on_destroy_editor(GtkWidget *widget, GObject *ref) /* On évite de mettre à jour un affichage disparu... */ register_project_change_notification(NULL); + set_editor_window(NULL); + /* Si la boucle principale est bien lancée, on en sort ! */ if (gtk_main_level() > 0) gtk_main_quit(); diff --git a/src/gui/menus/binary.c b/src/gui/menus/binary.c index 3a143da..cb131d7 100644 --- a/src/gui/menus/binary.c +++ b/src/gui/menus/binary.c @@ -212,13 +212,16 @@ void update_access_for_view_in_menu_binary(GLoadedPanel *new) static void mcb_binary_entry_points(GtkMenuItem *menuitem, GMenuBar *bar) { GLoadedBinary *binary; /* Binaire présenté à l'écran */ + GtkWindow *editor; /* Fenêtre graphique principale*/ GtkWidget *dialog; /* Boîte de dialogue à montrer */ vmpa2t *addr; /* Adresse de destination */ GLoadedPanel *panel; /* Afficheur effectif de code */ binary = G_LOADED_BINARY(get_current_content()); - dialog = create_gotox_dialog_for_entry_points(get_editor_window(), binary); + editor = get_editor_window(); + + dialog = create_gotox_dialog_for_entry_points(editor, binary); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { @@ -237,6 +240,8 @@ static void mcb_binary_entry_points(GtkMenuItem *menuitem, GMenuBar *bar) gtk_widget_destroy(dialog); + g_object_unref(G_OBJECT(editor)); + g_object_unref(G_OBJECT(binary)); } @@ -278,12 +283,15 @@ static void mcb_binary_storage(GtkMenuItem *menuitem, GMenuBar *bar) { GLoadedBinary *binary; /* Edition courante */ GtkBuilder *builder; /* Constructeur utilisé */ + GtkWindow *editor; /* Fenêtre graphique principale*/ GtkWidget *dialog; /* Boîte de dialogue à montrer */ gint ret; /* Retour de confirmation */ binary = G_LOADED_BINARY(get_current_content()); - dialog = create_storage_dialog(binary, get_editor_window(), &builder); + editor = get_editor_window(); + + dialog = create_storage_dialog(binary, editor, &builder); ret = gtk_dialog_run(GTK_DIALOG(dialog)); @@ -294,6 +302,8 @@ static void mcb_binary_storage(GtkMenuItem *menuitem, GMenuBar *bar) g_object_unref(G_OBJECT(builder)); + g_object_unref(G_OBJECT(editor)); + g_object_unref(G_OBJECT(binary)); } @@ -315,10 +325,15 @@ static void mcb_binary_storage(GtkMenuItem *menuitem, GMenuBar *bar) static void mcb_binary_export_disass(GtkMenuItem *menuitem, gpointer unused) { GLoadedBinary *binary; /* Edition courante */ + GtkWindow *editor; /* Fenêtre graphique principale*/ binary = G_LOADED_BINARY(get_current_content()); - run_export_assistant(binary, get_editor_window()); + editor = get_editor_window(); + + run_export_assistant(binary, editor); + + g_object_unref(G_OBJECT(editor)); g_object_unref(G_OBJECT(binary)); @@ -342,12 +357,17 @@ static void mcb_binary_export_graph(GtkMenuItem *menuitem, gpointer unused) { GtkGraphDisplay *panel; /* Panneau de code courant */ GLoadedBinary *binary; /* Edition courante */ + GtkWindow *editor; /* Fenêtre graphique principale*/ binary = G_LOADED_BINARY(get_current_content()); panel = GTK_GRAPH_DISPLAY(get_current_view()); - run_graph_export_assistant(binary, panel, get_editor_window()); + editor = get_editor_window(); + + run_graph_export_assistant(binary, panel, editor); + + g_object_unref(G_OBJECT(editor)); g_object_unref(G_OBJECT(panel)); diff --git a/src/gui/menus/file.c b/src/gui/menus/file.c index 469aa41..3008635 100644 --- a/src/gui/menus/file.c +++ b/src/gui/menus/file.c @@ -164,11 +164,14 @@ static void mcb_file_new_project(GtkMenuItem *menuitem, gpointer unused) static void mcb_file_open_project(GtkMenuItem *menuitem, gpointer unused) { + GtkWindow *editor; /* Fenêtre graphique principale*/ GtkWidget *dialog; /* Boîte à afficher */ GStudyProject *project; /* Projet chargé */ gchar *filename; /* Nom du fichier à intégrer */ - dialog = gtk_file_chooser_dialog_new(_("Open a project"), get_editor_window(), + editor = get_editor_window(); + + dialog = gtk_file_chooser_dialog_new(_("Open a project"), editor, GTK_FILE_CHOOSER_ACTION_OPEN, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Open"), GTK_RESPONSE_ACCEPT, @@ -200,6 +203,8 @@ static void mcb_file_open_project(GtkMenuItem *menuitem, gpointer unused) gtk_widget_destroy(dialog); + g_object_unref(G_OBJECT(editor)); + } @@ -251,11 +256,14 @@ void mcb_file_save_project(GtkMenuItem *menuitem, gpointer unused) static void mcb_file_save_project_as(GtkMenuItem *menuitem, gpointer unused) { + GtkWindow *editor; /* Fenêtre graphique principale*/ GtkWidget *dialog; /* Boîte à afficher */ GStudyProject *project; /* Projet courant */ gchar *filename; /* Nom du fichier à intégrer */ - dialog = gtk_file_chooser_dialog_new(_("Save the project as..."), get_editor_window(), + editor = get_editor_window(); + + dialog = gtk_file_chooser_dialog_new(_("Save the project as..."), editor, GTK_FILE_CHOOSER_ACTION_SAVE, _("_Cancel"), GTK_RESPONSE_CANCEL, _("_Save"), GTK_RESPONSE_ACCEPT, @@ -282,6 +290,8 @@ static void mcb_file_save_project_as(GtkMenuItem *menuitem, gpointer unused) gtk_widget_destroy(dialog); + g_object_unref(G_OBJECT(editor)); + } @@ -306,4 +316,6 @@ static void mcb_file_quit(GtkMenuItem *menuitem, gpointer unused) gtk_window_close(editor); + g_object_unref(G_OBJECT(editor)); + } diff --git a/src/gui/panels/strings.c b/src/gui/panels/strings.c index 7fd0ffc..a99b40c 100644 --- a/src/gui/panels/strings.c +++ b/src/gui/panels/strings.c @@ -1269,7 +1269,7 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa const mrange_t *range; /* Couverture en mémoire */ GArchProcessor *proc; /* Processeur de l'architecture*/ GArchInstruction *instr; /* Point de croisements */ - GObject *ref; /* Espace de référencements */ + GtkWindow *editor; /* Fenêtre graphique principale*/ GtkWidget *dialog; /* Boîte de dialogue à montrer */ vmpa2t *addr; /* Adresse de destination */ GLoadedPanel *display; /* Afficheur effectif de code */ @@ -1287,9 +1287,9 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa */ instr = g_arch_processor_find_instr_by_address(proc, get_mrange_addr(range)); - ref = G_OBJECT(get_editor_window());//g_editor_item_get_global_ref(G_EDITOR_ITEM(panel)); + editor = get_editor_window(); - dialog = create_gotox_dialog_for_cross_references(GTK_WINDOW(ref), panel->binary, instr, true); + dialog = create_gotox_dialog_for_cross_references(editor, panel->binary, instr, true); if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_OK) { @@ -1308,6 +1308,8 @@ static void mcb_strings_panel_find_refs(GtkMenuItem *menuitem, GStringsPanel *pa gtk_widget_destroy(dialog); + g_object_unref(G_OBJECT(editor)); + if (instr != NULL) g_object_unref(G_OBJECT(instr)); diff --git a/src/gui/panels/welcome.c b/src/gui/panels/welcome.c index 6812125..63811a9 100644 --- a/src/gui/panels/welcome.c +++ b/src/gui/panels/welcome.c @@ -463,10 +463,12 @@ static void on_new_binary_clicked(GtkButton *button, GWelcomePanel *panel) GObject *ref; /* Espace de référencements */ GtkMenuItem *item; /* Elément de menu simulé */ - ref = G_OBJECT(get_editor_window());//g_editor_item_get_global_ref(G_EDITOR_ITEM(panel)); + ref = G_OBJECT(get_editor_window()); item = GTK_MENU_ITEM(g_object_get_data(ref, "mnu_project_add_binary")); + g_object_unref(ref); + gtk_menu_item_activate(item); } diff --git a/src/main.c b/src/main.c index e5a964e..3b05581 100644 --- a/src/main.c +++ b/src/main.c @@ -411,7 +411,7 @@ int main(int argc, char **argv) exit_all_plugins(); if (!batch_mode) - gtk_widget_destroy(editor); + g_object_unref(G_OBJECT(editor)); failed_to_load_editor: -- cgit v0.11.2-87-g4458