From d1874bdcaf52717ebf6f808010d275ca1f1693f3 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 22 Jul 2024 01:04:53 +0200
Subject: Separate the GTK application and the GTK main window.

---
 src/Makefile.am                                 |  25 +-
 src/app.c                                       | 253 ++++++++++++++++-
 src/app.h                                       |  26 +-
 src/framework.c                                 | 356 ------------------------
 src/framework.h                                 |  66 -----
 src/gui/Makefile.am                             |   7 +-
 src/gui/gresource.xml                           |   1 +
 src/gui/window-int.h                            |  57 ++++
 src/gui/window.c                                | 235 ++++++++++++++++
 src/gui/window.h                                |  51 ++++
 src/gui/window.ui                               |  19 ++
 src/schemas/re.chrysalide.framework.gschema.xml |   4 +-
 12 files changed, 655 insertions(+), 445 deletions(-)
 delete mode 100644 src/framework.c
 delete mode 100644 src/framework.h
 create mode 100644 src/gui/window-int.h
 create mode 100644 src/gui/window.c
 create mode 100644 src/gui/window.h
 create mode 100644 src/gui/window.ui

diff --git a/src/Makefile.am b/src/Makefile.am
index 66dcbdd..9355d4c 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,7 @@
 
 lib_LTLIBRARIES = libchrysacore4.la libchrysacoreui.la # libchrysacore.la
 
-bin_PROGRAMS = framework # chrysalide chrysalide-hub rost
+bin_PROGRAMS = chrysalide # chrysalide-hub rost
 
 
 AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/intl
@@ -111,34 +111,33 @@ libchrysacoreui_la_LDFLAGS =				\
 # Programme principal
 ############################################################
 
-EXTRA_chrysalide_DEPENDENCIES = libchrysacore.la
+EXTRA_chrysalide0_DEPENDENCIES = libchrysacore.la
 
-chrysalide_SOURCES = 					\
+chrysalide0_SOURCES = 					\
 	$(GOBJECT_LEAKS_SOURCES)			\
 	main.c
 
 
-chrysalide_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS)
+chrysalide0_CFLAGS = $(TOOLKIT_CFLAGS) $(LIBXML_CFLAGS) $(LIBPYTHON_CFLAGS)
 
-chrysalide_LDFLAGS = $(TOOLKIT_LIBS) -L/usr/X11R6/lib -ldl -lm $(LIBXML_LIBS) $(LIBPYTHON_LIBS) $(LIBARCHIVE_LIBS) $(LIBSQLITE_LIBS) \
+chrysalide0_LDFLAGS = $(TOOLKIT_LIBS) -L/usr/X11R6/lib -ldl -lm $(LIBXML_LIBS) $(LIBPYTHON_LIBS) $(LIBARCHIVE_LIBS) $(LIBSQLITE_LIBS) \
 	-L.libs -lchrysacore
 
-chrysalide_LDADD = $(LIBINTL)
+chrysalide0_LDADD = $(LIBINTL)
 
 
 
-EXTRA_framework_DEPENDENCIES = libchrysacore4.la libchrysacoreui.la
+EXTRA_chrysalide_DEPENDENCIES = libchrysacore4.la libchrysacoreui.la
 
-framework_SOURCES = 						\
-	app.h app.c								\
-	framework.h framework.c
+chrysalide_SOURCES = 						\
+	app.h app.c
 
-framework_CFLAGS = $(TOOLKIT4_CFLAGS) $(LIBGIOUNIX_CFLAGS)
+chrysalide_CFLAGS = $(TOOLKIT4_CFLAGS) $(LIBGIOUNIX_CFLAGS)
 
-framework_LDFLAGS = $(TOOLKIT4_LIBS) $(LIBGIOUNIX_LIBS) \
+chrysalide_LDFLAGS = $(TOOLKIT4_LIBS) $(LIBGIOUNIX_LIBS) \
 	-L.libs -lchrysacore4 -lchrysacoreui
 
-framework_LDADD =
+chrysalide_LDADD =
 
 
 
diff --git a/src/app.c b/src/app.c
index bb0fa8a..a3a2080 100644
--- a/src/app.c
+++ b/src/app.c
@@ -33,13 +33,222 @@
 #include "common/io.h"
 #include "common/xdg.h"
 #include "core/logs.h"
-#include "glibext/helpers.h"
+#include "gui/core/core.h"
+#include "gui/window.h"
 
 
 
-#define CHRYSALIDE_APP_ID "re.chrysalide.framework.gui" // REMME
+/* --------------------- DEFINITION D'APPLICATION PERSONNALISEE --------------------- */
 
 
+/* Définition de l'application principale graphique (instance) */
+struct _GtkChrysalideFramework
+{
+    GtkApplication parent;                  /* A laisser en premier        */
+
+    GtkApplicationWindow *main_window;      /* Fenêtre principale          */
+
+};
+
+/* Définition de l'application principale graphique (classe) */
+struct _GtkChrysalideFrameworkClass
+{
+    GtkApplicationClass parent;             /* A laisser en premier        */
+
+};
+
+
+/* Initialise la classe des applications majeures de Chrysalide. */
+static void gtk_chrysalide_framework_class_init(GtkChrysalideFrameworkClass *);
+
+/* Initialise une application principale pour Chrysalide. */
+static void gtk_chrysalide_framework_init(GtkChrysalideFramework *);
+
+/* Supprime toutes les références externes. */
+static void gtk_chrysalide_framework_dispose(GtkChrysalideFramework *);
+
+/* Procède à la libération totale de la mémoire. */
+static void gtk_chrysalide_framework_finalize(GtkChrysalideFramework *);
+
+
+
+/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */
+
+
+/* Réagit à l'activation de l'application. */
+static void gtk_chrysalide_framework_activate(GApplication *);
+
+
+
+/* ---------------------- POINT D'ENTREE PRINCIPAL D'EXECUTION ---------------------- */
+
+
+/* Installe au besoin une définition locale pour le système. */
+static void ensure_wm_icon_and_name(void);
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/*                       DEFINITION D'APPLICATION PERSONNALISEE                       */
+/* ---------------------------------------------------------------------------------- */
+
+
+/* Indique le type défini pour une application principale graphique de Chrysalide. */
+G_DEFINE_TYPE(GtkChrysalideFramework, gtk_chrysalide_framework, GTK_TYPE_APPLICATION);
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : klass = classe à initialiser.                                *
+*                                                                             *
+*  Description : Initialise la classe des applications majeures de Chrysalide.*
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_chrysalide_framework_class_init(GtkChrysalideFrameworkClass *klass)
+{
+    GObjectClass *object;                   /* Autre version de la classe  */
+    GApplicationClass *app;                 /* Version parente de la classe*/
+
+    object = G_OBJECT_CLASS(klass);
+
+    object->dispose = (GObjectFinalizeFunc/* ! */)gtk_chrysalide_framework_dispose;
+    object->finalize = (GObjectFinalizeFunc)gtk_chrysalide_framework_finalize;
+
+    app = G_APPLICATION_CLASS(klass);
+
+    app->activate = gtk_chrysalide_framework_activate;
+
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : app = instance à initialiser.                                *
+*                                                                             *
+*  Description : Initialise une application principale pour Chrysalide.       *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_chrysalide_framework_init(GtkChrysalideFramework *app)
+{
+    app->main_window = NULL;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : app = instance d'objet GLib à traiter.                       *
+*                                                                             *
+*  Description : Supprime toutes les références externes.                     *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_chrysalide_framework_dispose(GtkChrysalideFramework *app)
+{
+    g_clear_object(&app->main_window);
+
+    G_OBJECT_CLASS(gtk_chrysalide_framework_parent_class)->dispose(G_OBJECT(app));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : app = instance d'objet GLib à traiter.                       *
+*                                                                             *
+*  Description : Procède à la libération totale de la mémoire.                *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_chrysalide_framework_finalize(GtkChrysalideFramework *app)
+{
+    G_OBJECT_CLASS(gtk_chrysalide_framework_parent_class)->finalize(G_OBJECT(app));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : -                                                            *
+*                                                                             *
+*  Description : Crée une nouvelle application principale pour Chrysalide.    *
+*                                                                             *
+*  Retour      : Mécanismes mis en place.                                     *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GtkChrysalideFramework *gtk_chrysalide_framework_new(void)
+{
+    GtkChrysalideFramework *result;         /* Instance à retourner        */
+
+    result = g_object_new(GTK_TYPE_CHRYSALIDE_FRAMEWORK,
+                          "application-id", FRAMEWORK_WINDOW_ID,
+                          "flags", G_APPLICATION_DEFAULT_FLAGS,
+                          NULL);
+
+    return result;
+
+}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/*                       IMPLEMENTATION DES FONCTIONS DE CLASSE                       */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : app = application concernée par l'événement.                 *
+*                                                                             *
+*  Description : Réagit à l'activation de l'application.                      *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_chrysalide_framework_activate(GApplication *app)
+{
+    GtkChrysalideFramework *real_app;       /* Version réelle de l'instance*/
+
+    real_app = GTK_CHRYSALIDE_FRAMEWORK(app);
+
+    real_app->main_window = gtk_framework_window_new(GTK_APPLICATION(app));
+    g_object_ref(G_OBJECT(real_app->main_window));
+
+    gtk_window_present(GTK_WINDOW(real_app->main_window));
+
+}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/*                        POINT D'ENTREE PRINCIPAL D'EXECUTION                        */
+/* ---------------------------------------------------------------------------------- */
+
 
 /******************************************************************************
 *                                                                             *
@@ -53,7 +262,7 @@
 *                                                                             *
 ******************************************************************************/
 
-void ensure_wm_icon_and_name(void)
+static void ensure_wm_icon_and_name(void)
 {
     GDesktopAppInfo *info;                  /* Information du système      */
     GKeyFile *kfile;                        /* Définition d'application    */
@@ -66,7 +275,7 @@ void ensure_wm_icon_and_name(void)
 
     /* Evaluation du besoin */
 
-    info = g_desktop_app_info_new(CHRYSALIDE_APP_ID ".desktop");
+    info = g_desktop_app_info_new(FRAMEWORK_WINDOW_ID ".desktop");
 
     /**
      * Si l'exécutable n'est pas valide (inconnu de $PATH),
@@ -135,3 +344,39 @@ void ensure_wm_icon_and_name(void)
     ;
 
 }
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : argc = nombre d'arguments dans la ligne de commande.         *
+*                argv = arguments de la ligne de commande.                    *
+*                                                                             *
+*  Description : Point d'entrée du programme.                                 *
+*                                                                             *
+*  Retour      : EXIT_SUCCESS si le prgm s'est déroulé sans encombres.        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+int main(int argc, char **argv)
+{
+    int result;                             /* Bilan de l'exécution        */
+    GtkChrysalideFramework *app;            /* Gestion d'application GTK   */
+
+    if (!load_gui_components(AGC_BUFFER_FEATURES | AGC_PANELS))
+        return EXIT_FAILURE;
+
+    ensure_wm_icon_and_name();
+
+    app = gtk_chrysalide_framework_new();
+
+    result = g_application_run(G_APPLICATION(app), argc, argv);
+
+    g_object_unref(G_OBJECT(app));
+
+    unload_gui_components(AGC_BUFFER_FEATURES | AGC_PANELS);
+
+    return result;
+
+}
diff --git a/src/app.h b/src/app.h
index 7696df5..645fa6b 100644
--- a/src/app.h
+++ b/src/app.h
@@ -25,9 +25,31 @@
 #define _APP_H
 
 
+#include <gtk/gtk.h>
 
-/* Installe au besoin une définition locale pour le système. */
-void ensure_wm_icon_and_name(void);
+
+#include "glibext/helpers.h"
+
+
+
+/* --------------------- DEFINITION D'APPLICATION PERSONNALISEE --------------------- */
+
+
+#define GTK_TYPE_CHRYSALIDE_FRAMEWORK (gtk_chrysalide_framework_get_type())
+
+DECLARE_GTYPE(GtkChrysalideFramework, gtk_chrysalide_framework, GTK, CHRYSALIDE_FRAMEWORK);
+
+
+/* Crée une nouvelle application principale pour Chrysalide. */
+GtkChrysalideFramework *gtk_chrysalide_framework_new(void);
+
+
+
+/* ---------------------- POINT D'ENTREE PRINCIPAL D'EXECUTION ---------------------- */
+
+
+/* Point d'entrée du programme. */
+int main(int, char **);
 
 
 
diff --git a/src/framework.c b/src/framework.c
deleted file mode 100644
index 1c90fda..0000000
--- a/src/framework.c
+++ /dev/null
@@ -1,356 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * framework.c - fichier d'entrée du programme
- *
- * Copyright (C) 2024 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 <gtk/gtk.h>
-
-
-#include "app.h" // REMME
-#include "framework.h"
-#include "glibext/helpers.h"
-#include "gui/core/core.h"
-#include "gui/core/panels.h" // REMME
-#include "gui/panels/welcome.h" // REMME
-
-
-
-/* --------------------- DEFINITION D'APPLICATION PERSONNALISEE --------------------- */
-
-
-#define CHRYSALIDE_APP_ID "re.chrysalide.framework.gui"
-
-
-/* Définition de l'application principale graphique (instance) */
-struct _GtkChrysalideFramework
-{
-    GtkApplication parent;                  /* A laisser en premier        */
-
-    GSettings *settings;                    /* Paramètres globaux          */
-
-    GtkApplicationWindow *main_window;      /* Fenêtre principale          */
-
-};
-
-/* Définition de l'application principale graphique (classe) */
-struct _GtkChrysalideFrameworkClass
-{
-    GtkApplicationClass parent;             /* A laisser en premier        */
-
-};
-
-
-/* Initialise la classe des applications majeures de Chrysalide. */
-static void gtk_chrysalide_framework_class_init(GtkChrysalideFrameworkClass *);
-
-/* Initialise une application principale pour Chrysalide. */
-static void gtk_chrysalide_framework_init(GtkChrysalideFramework *);
-
-/* Supprime toutes les références externes. */
-static void gtk_chrysalide_framework_dispose(GtkChrysalideFramework *);
-
-/* Procède à la libération totale de la mémoire. */
-static void gtk_chrysalide_framework_finalize(GtkChrysalideFramework *);
-
-
-
-/* --------------------- IMPLEMENTATION DES FONCTIONS DE CLASSE --------------------- */
-
-
-/* Réagit à l'activation de l'application. */
-static void gtk_chrysalide_framework_activate(GApplication *);
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/*                       DEFINITION D'APPLICATION PERSONNALISEE                       */
-/* ---------------------------------------------------------------------------------- */
-
-
-/* Indique le type défini pour une application principale graphique de Chrysalide. */
-G_DEFINE_TYPE(GtkChrysalideFramework, gtk_chrysalide_framework, GTK_TYPE_APPLICATION);
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : klass = classe à initialiser.                                *
-*                                                                             *
-*  Description : Initialise la classe des applications majeures de Chrysalide.*
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void gtk_chrysalide_framework_class_init(GtkChrysalideFrameworkClass *klass)
-{
-    GObjectClass *object;                   /* Autre version de la classe  */
-    GApplicationClass *app;                 /* Version parente de la classe*/
-
-    object = G_OBJECT_CLASS(klass);
-
-    object->dispose = (GObjectFinalizeFunc/* ! */)gtk_chrysalide_framework_dispose;
-    object->finalize = (GObjectFinalizeFunc)gtk_chrysalide_framework_finalize;
-
-    app = G_APPLICATION_CLASS(klass);
-
-    app->activate = gtk_chrysalide_framework_activate;
-
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : app = instance à initialiser.                                *
-*                                                                             *
-*  Description : Initialise une application principale pour Chrysalide.       *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void gtk_chrysalide_framework_init(GtkChrysalideFramework *app)
-{
-    app->settings = NULL;
-
-    app->main_window = NULL;
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : app = instance d'objet GLib à traiter.                       *
-*                                                                             *
-*  Description : Supprime toutes les références externes.                     *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void gtk_chrysalide_framework_dispose(GtkChrysalideFramework *app)
-{
-    g_clear_object(&app->settings);
-
-    g_clear_object(&app->main_window);
-
-    G_OBJECT_CLASS(gtk_chrysalide_framework_parent_class)->dispose(G_OBJECT(app));
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : app = instance d'objet GLib à traiter.                       *
-*                                                                             *
-*  Description : Procède à la libération totale de la mémoire.                *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void gtk_chrysalide_framework_finalize(GtkChrysalideFramework *app)
-{
-    G_OBJECT_CLASS(gtk_chrysalide_framework_parent_class)->finalize(G_OBJECT(app));
-
-}
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : -                                                            *
-*                                                                             *
-*  Description : Crée une nouvelle application principale pour Chrysalide.    *
-*                                                                             *
-*  Retour      : Mécanismes mis en place.                                     *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-GtkChrysalideFramework *gtk_chrysalide_framework_new(void)
-{
-    GtkChrysalideFramework *result;         /* Instance à retourner        */
-
-    result = g_object_new(GTK_TYPE_CHRYSALIDE_FRAMEWORK,
-                          "application-id", CHRYSALIDE_APP_ID,
-                          "flags", G_APPLICATION_DEFAULT_FLAGS,
-                          NULL);
-
-    return result;
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/*                       IMPLEMENTATION DES FONCTIONS DE CLASSE                       */
-/* ---------------------------------------------------------------------------------- */
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : app = application concernée par l'événement.                 *
-*                                                                             *
-*  Description : Réagit à l'activation de l'application.                      *
-*                                                                             *
-*  Retour      : -                                                            *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static void gtk_chrysalide_framework_activate(GApplication *app)
-{
-    GtkChrysalideFramework *real_app;       /* Version réelle de l'instance*/
-    GSettings *settings;                    /* Paramètres globaux          */
-    GtkWindow *window;                      /* Fenêtre mise en place       */
-    GtkCssProvider *css;                    /* Feuille de style maison     */
-
-    real_app = GTK_CHRYSALIDE_FRAMEWORK(app);
-
-    /* Paramètres globaux */
-
-    settings = g_settings_new("re.chrysalide.framework.mainapp");
-    real_app->settings = settings;
-
-    /* Fenêtre principale */
-
-    window = GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(app)));
-
-    real_app->main_window = GTK_APPLICATION_WINDOW(window);
-    g_object_ref(G_OBJECT(window));
-
-    g_settings_bind(settings, "window-width", G_OBJECT(window), "default-width", G_SETTINGS_BIND_DEFAULT);
-    g_settings_bind(settings, "window-height", G_OBJECT(window), "default-height", G_SETTINGS_BIND_DEFAULT);
-    g_settings_bind(settings, "window-maximized", G_OBJECT(window), "maximized", G_SETTINGS_BIND_DEFAULT);
-
-    gtk_window_set_title(window, "Chrysalide");
-    gtk_window_present(window);
-
-
-
-    do
-    {
-        GPanelItem *item;
-        GtkTiledPanel *panel;
-
-        item = find_item_panel_by_type(G_TYPE_WELCOME_PANEL);
-
-        panel = g_panel_item_get_panel(item);
-        gtk_window_set_child(window, GTK_WIDGET(panel));
-
-        unref_object(item);
-
-    }
-    while (0);
-
-
-
-    /* Chargement des extensions de thème */
-
-    /*
-    css = gtk_css_provider_new();
-
-    gtk_css_provider_load_from_resource(css, "/re/chrysalide/framework/glibext/linestyle.css");
-
-    gtk_style_context_add_provider_for_display(gtk_widget_get_display(GTK_WIDGET(window)),
-                                               GTK_STYLE_PROVIDER(css), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
-
-    unref_object(css);
-    */
-
-    css = gtk_css_provider_new();
-
-    gtk_css_provider_load_from_resource(css, "/re/chrysalide/framework/gtkext/hexview.css");
-
-    gtk_style_context_add_provider_for_display(gtk_widget_get_display(GTK_WIDGET(window)),
-                                               GTK_STYLE_PROVIDER(css), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
-
-    unref_object(css);
-
-
-
-
-
-    css = gtk_css_provider_new();
-
-    gtk_css_provider_load_from_resource(css, "/re/chrysalide/framework/gui/style.css");
-
-    gtk_style_context_add_provider_for_display(gtk_widget_get_display(GTK_WIDGET(window)),
-                                               GTK_STYLE_PROVIDER(css), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
-
-    unref_object(css);
-
-
-}
-
-
-
-/* ---------------------------------------------------------------------------------- */
-/*                        POINT D'ENTREE PRINCIPAL D'EXECUTION                        */
-/* ---------------------------------------------------------------------------------- */
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : argc = nombre d'arguments dans la ligne de commande.         *
-*                argv = arguments de la ligne de commande.                    *
-*                                                                             *
-*  Description : Point d'entrée du programme.                                 *
-*                                                                             *
-*  Retour      : EXIT_SUCCESS si le prgm s'est déroulé sans encombres.        *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-int main(int argc, char **argv)
-{
-    int result;                             /* Bilan de l'exécution        */
-    GtkChrysalideFramework *app;            /* Gestion d'application GTK   */
-
-    if (!load_gui_components(AGC_BUFFER_FEATURES | AGC_PANELS))
-        return EXIT_FAILURE;
-
-    ensure_wm_icon_and_name();
-
-    app = gtk_chrysalide_framework_new();
-
-    result = g_application_run(G_APPLICATION(app), argc, argv);
-
-    g_object_unref(G_OBJECT(app));
-
-    unload_gui_components(AGC_BUFFER_FEATURES | AGC_PANELS);
-
-    return result;
-
-}
diff --git a/src/framework.h b/src/framework.h
deleted file mode 100644
index e8e88fe..0000000
--- a/src/framework.h
+++ /dev/null
@@ -1,66 +0,0 @@
-
-/* Chrysalide - Outil d'analyse de fichiers binaires
- * framework.h - prototypes pour le fichier d'entrée du programme
- *
- * Copyright (C) 2024 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 Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-
-#ifndef _FRAMEWORK_H
-#define _FRAMEWORK_H
-
-
-#include <glib-object.h>
-
-
-
-/* --------------------- DEFINITION D'APPLICATION PERSONNALISEE --------------------- */
-
-
-#define GTK_TYPE_CHRYSALIDE_FRAMEWORK            gtk_chrysalide_framework_get_type()
-#define GTK_CHRYSALIDE_FRAMEWORK(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), GTK_TYPE_CHRYSALIDE_FRAMEWORK, GtkChrysalideFramework))
-#define GTK_IS_CHRYSALIDE_FRAMEWORK(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), GTK_TYPE_CHRYSALIDE_FRAMEWORK))
-#define GTK_CHRYSALIDE_FRAMEWORK_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), GTK_TYPE_CHRYSALIDE_FRAMEWORK, GtkChrysalideFrameworkClass))
-#define GTK_IS_CHRYSALIDE_FRAMEWORK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), GTK_TYPE_CHRYSALIDE_FRAMEWORK))
-#define GTK_CHRYSALIDE_FRAMEWORK_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_TYPE_CHRYSALIDE_FRAMEWORK, GtkChrysalideFrameworkClass))
-
-
-/* Définition de l'application principale graphique (instance) */
-typedef struct _GtkChrysalideFramework GtkChrysalideFramework;
-
-/* Définition de l'application principale graphique (classe) */
-typedef struct _GtkChrysalideFrameworkClass GtkChrysalideFrameworkClass;
-
-
-/* Indique le type défini pour une application principale graphique de Chrysalide. */
-GType gtk_chrysalide_framework_get_type(void);
-
-/* Crée une nouvelle application principale pour Chrysalide. */
-GtkChrysalideFramework *gtk_chrysalide_framework_new(void);
-
-
-
-/* ---------------------- POINT D'ENTREE PRINCIPAL D'EXECUTION ---------------------- */
-
-
-/* Point d'entrée du programme. */
-int main(int, char **);
-
-
-
-#endif  /* _FRAMEWORK_H */
diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am
index 4197989..5ec43d2 100644
--- a/src/gui/Makefile.am
+++ b/src/gui/Makefile.am
@@ -29,7 +29,9 @@ libgui_la_CFLAGS = $(LIBGTK_CFLAGS) $(LIBXML_CFLAGS)
 libgui4_la_SOURCES =						\
 	panel-int.h								\
 	panel.h panel.c							\
-	resources.h resources.c
+	resources.h resources.c					\
+	window-int.h							\
+	window.h window.c
 
 libgui4_la_LIBADD =							\
 	core/libguicore4.la						\
@@ -47,7 +49,8 @@ SUBDIRS = core panels # dialogs menus panels tb
 
 
 RES_FILES = 								\
-	style.css
+	style.css								\
+	window.ui
 
 resources.c: gresource.xml $(RES_FILES)
 	glib-compile-resources --target=$@ --sourcedir=$(srcdir) --generate-source --c-name gui gresource.xml
diff --git a/src/gui/gresource.xml b/src/gui/gresource.xml
index 437ec51..91d9bc9 100644
--- a/src/gui/gresource.xml
+++ b/src/gui/gresource.xml
@@ -2,6 +2,7 @@
 <gresources>
     <gresource prefix="/re/chrysalide/framework/gui">
         <file compressed="true">style.css</file>
+        <file compressed="true">window.ui</file>
     </gresource>
     <gresource prefix="/re/chrysalide/framework/images">
         <file compressed="true" alias="chrysalide-logo.svg">../../pixmaps/chrysalide-logo.svg</file>
diff --git a/src/gui/window-int.h b/src/gui/window-int.h
new file mode 100644
index 0000000..d79e189
--- /dev/null
+++ b/src/gui/window-int.h
@@ -0,0 +1,57 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * window.h - prototypes internes pour la construction d'une fenêtre graphique principale
+ *
+ * Copyright (C) 2024 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 Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _GUI_WINDOW_INT_H
+#define _GUI_WINDOW_INT_H
+
+
+#include "window.h"
+#include "../gtkext/grid.h"
+
+
+
+/* Définition de l'application principale graphique (instance) */
+struct _GtkFrameworkWindow
+{
+    GtkApplicationWindow parent;            /* A laisser en premier        */
+
+    GSettings *settings;                    /* Paramètres globaux          */
+
+    GtkStack *grid;                         /* Réceptacle de panneaux      */
+
+};
+
+/* Définition de l'application principale graphique (classe) */
+struct _GtkFrameworkWindowClass
+{
+    GtkApplicationWindowClass parent;       /* A laisser en premier        */
+
+};
+
+
+/* Met en place une fenêtre principale pour Chrysalide. */
+bool gtk_framework_window_create(GtkFrameworkWindow *, GtkApplication *);
+
+
+
+#endif  /* _GUI_WINDOW_INT_H */
diff --git a/src/gui/window.c b/src/gui/window.c
new file mode 100644
index 0000000..dcdd4d1
--- /dev/null
+++ b/src/gui/window.c
@@ -0,0 +1,235 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * window.c - construction d'une fenêtre graphique principale
+ *
+ * Copyright (C) 2024 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 "window.h"
+
+
+#include "window-int.h"
+#include "core/panels.h"
+#include "panels/welcome.h"
+
+
+
+/* Initialise la classe des applications majeures de Chrysalide. */
+static void gtk_framework_window_class_init(GtkFrameworkWindowClass *);
+
+/* Initialise une application principale pour Chrysalide. */
+static void gtk_framework_window_init(GtkFrameworkWindow *);
+
+/* Supprime toutes les références externes. */
+static void gtk_framework_window_dispose(GtkFrameworkWindow *);
+
+/* Procède à la libération totale de la mémoire. */
+static void gtk_framework_window_finalize(GtkFrameworkWindow *);
+
+
+
+/* Indique le type défini pour une fenêtre graphique principale de Chrysalide. */
+G_DEFINE_TYPE(GtkFrameworkWindow, gtk_framework_window, GTK_TYPE_APPLICATION_WINDOW);
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : class = classe à initialiser.                                *
+*                                                                             *
+*  Description : Initialise la classe des applications majeures de Chrysalide.*
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_framework_window_class_init(GtkFrameworkWindowClass *class)
+{
+    GObjectClass *object;                   /* Plus haut niveau équivalent */
+    GtkWidgetClass *widget;                 /* Classe de haut niveau       */
+
+    object = G_OBJECT_CLASS(class);
+
+    object->dispose = (GObjectFinalizeFunc/* ! */)gtk_framework_window_dispose;
+    object->finalize = (GObjectFinalizeFunc)gtk_framework_window_finalize;
+
+    widget = GTK_WIDGET_CLASS(class);
+
+    //g_type_ensure(GTK_TYPE_TILING_GRID);
+
+    gtk_widget_class_set_template_from_resource(widget, "/re/chrysalide/framework/gui/window.ui");
+
+    gtk_widget_class_bind_template_child(widget, GtkFrameworkWindow, grid);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : window = instance à initialiser.                             *
+*                                                                             *
+*  Description : Initialise une application principale pour Chrysalide.       *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_framework_window_init(GtkFrameworkWindow *window)
+{
+    gtk_widget_init_template(GTK_WIDGET(window));
+
+    window->settings = g_settings_new(FRAMEWORK_WINDOW_ID);
+
+    g_settings_bind(window->settings, "window-width", G_OBJECT(window), "default-width", G_SETTINGS_BIND_DEFAULT);
+    g_settings_bind(window->settings, "window-height", G_OBJECT(window), "default-height", G_SETTINGS_BIND_DEFAULT);
+    g_settings_bind(window->settings, "window-maximized", G_OBJECT(window), "maximized", G_SETTINGS_BIND_DEFAULT);
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : window = instance d'objet GLib à traiter.                    *
+*                                                                             *
+*  Description : Supprime toutes les références externes.                     *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_framework_window_dispose(GtkFrameworkWindow *window)
+{
+    gtk_widget_dispose_template(GTK_WIDGET(window), GTK_TYPE_FRAMEWORK_WINDOW);
+
+    g_clear_object(&window->settings);
+
+    G_OBJECT_CLASS(gtk_framework_window_parent_class)->dispose(G_OBJECT(window));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : window = instance d'objet GLib à traiter.                    *
+*                                                                             *
+*  Description : Procède à la libération totale de la mémoire.                *
+*                                                                             *
+*  Retour      : -                                                            *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+static void gtk_framework_window_finalize(GtkFrameworkWindow *window)
+{
+    G_OBJECT_CLASS(gtk_framework_window_parent_class)->finalize(G_OBJECT(window));
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : app = application GTK de rattachement.                       *
+*                                                                             *
+*  Description : Crée une nouvelle application principale pour Chrysalide.    *
+*                                                                             *
+*  Retour      : Mécanismes mis en place.                                     *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+GtkApplicationWindow *gtk_framework_window_new(GtkApplication *app)
+{
+    GtkApplicationWindow *result;           /* Instance à retourner        */
+
+    result = g_object_new(GTK_TYPE_FRAMEWORK_WINDOW, NULL);
+
+    if (!gtk_framework_window_create(GTK_FRAMEWORK_WINDOW(result), app))
+        g_clear_object(&result);
+
+    return result;
+
+}
+
+
+/******************************************************************************
+*                                                                             *
+*  Paramètres  : window = instance de fenêtre principale à remplir.           *
+*                app    = application GTK de rattachement.                    *
+*                                                                             *
+*  Description : Met en place une fenêtre principale pour Chrysalide.         *
+*                                                                             *
+*  Retour      : Bilan de l'opération.                                        *
+*                                                                             *
+*  Remarques   : -                                                            *
+*                                                                             *
+******************************************************************************/
+
+bool gtk_framework_window_create(GtkFrameworkWindow *window, GtkApplication *app)
+{
+    bool result;                            /* Bilan à retourner           */
+    GPanelItem *item;                       /* Définition de panneau       */
+    GtkTiledPanel *panel;                   /* Panneau d'affichage         */
+    GtkCssProvider *css;                    /* Feuille de style maison     */
+
+    result = true;
+
+    gtk_window_set_application(GTK_WINDOW(window), app);
+
+    /* Inclusion d'un écran d'accueil */
+
+    item = find_item_panel_by_type(G_TYPE_WELCOME_PANEL);
+
+    panel = g_panel_item_get_panel(item);
+    gtk_stack_add_child(window->grid, GTK_WIDGET(panel));
+
+    unref_object(item);
+
+    /* Chargement des extensions de thème */
+
+    css = gtk_css_provider_new();
+
+    gtk_css_provider_load_from_resource(css, "/re/chrysalide/framework/gtkext/hexview.css");
+
+    gtk_style_context_add_provider_for_display(gtk_widget_get_display(GTK_WIDGET(window)),
+                                               GTK_STYLE_PROVIDER(css), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
+    unref_object(css);
+
+    css = gtk_css_provider_new();
+
+    gtk_css_provider_load_from_resource(css, "/re/chrysalide/framework/gui/style.css");
+
+    gtk_style_context_add_provider_for_display(gtk_widget_get_display(GTK_WIDGET(window)),
+                                               GTK_STYLE_PROVIDER(css), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+
+    unref_object(css);
+
+    /* Fin des chargements */
+
+    return result;
+
+}
diff --git a/src/gui/window.h b/src/gui/window.h
new file mode 100644
index 0000000..4e73a76
--- /dev/null
+++ b/src/gui/window.h
@@ -0,0 +1,51 @@
+
+/* Chrysalide - Outil d'analyse de fichiers binaires
+ * window.h - prototypes pour la construction d'une fenêtre graphique principale
+ *
+ * Copyright (C) 2024 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 Chrysalide.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+
+#ifndef _GUI_WINDOW_H
+#define _GUI_WINDOW_H
+
+
+#include <gtk/gtk.h>
+
+
+#include "../glibext/helpers.h"
+
+
+
+/* Définition d'un identifiant unique */
+#define FRAMEWORK_WINDOW_ID "re.chrysalide.framework.gui"
+
+
+
+#define GTK_TYPE_FRAMEWORK_WINDOW (gtk_framework_window_get_type())
+
+DECLARE_GTYPE(GtkFrameworkWindow, gtk_framework_window, GTK, FRAMEWORK_WINDOW);
+
+
+
+/* Crée une nouvelle application principale pour Chrysalide. */
+GtkApplicationWindow *gtk_framework_window_new(GtkApplication *);
+
+
+
+#endif  /* _GUI_WINDOW_H */
diff --git a/src/gui/window.ui b/src/gui/window.ui
new file mode 100644
index 0000000..d9ca32c
--- /dev/null
+++ b/src/gui/window.ui
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+    <template class="GtkFrameworkWindow" parent="GtkApplicationWindow">
+        <property name="title" translatable="no">Chrysalide</property>
+        <property name="default-width">800</property>
+        <property name="default-height">600</property>
+        <property name="icon-name">chrysalide-logo</property>
+        <child>
+            <object class="GtkBox">
+                <property name="orientation">vertical</property>
+                <child>
+                    <object class="GtkStack" id="grid">
+                        <property name="vexpand">TRUE</property>
+                    </object>
+                </child>
+            </object>
+        </child>
+    </template>
+</interface>
diff --git a/src/schemas/re.chrysalide.framework.gschema.xml b/src/schemas/re.chrysalide.framework.gschema.xml
index 4a16f12..e8331ff 100644
--- a/src/schemas/re.chrysalide.framework.gschema.xml
+++ b/src/schemas/re.chrysalide.framework.gschema.xml
@@ -1,10 +1,10 @@
 <schemalist gettext-domain="chrysalide">
 
   <schema id="re.chrysalide.framework" path="/re/chrysalide/framework/">
-    <child schema="re.chrysalide.framework.mainapp" name="mainapp"/>
+    <child schema="re.chrysalide.framework.gui" name="gui"/>
   </schema>
 
-  <schema id="re.chrysalide.framework.mainapp" path="/re/chrysalide/framework/mainapp/">
+  <schema id="re.chrysalide.framework.gui" path="/re/chrysalide/framework/gui/">
     <key name="window-width" type="i">
       <default>600</default>
     </key>
-- 
cgit v0.11.2-87-g4458