From d614d4b09230411455ed07aac289025a55633da8 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
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 <pygobject.h>
+
+
+#include <gui/core/global.h>
+
+
+#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 <Python.h>
+#include <stdbool.h>
+
+
+
+/* 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 <assert.h>
 
 
+#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