From 3688ebc981037f6aabea06298aa28dd7c9163894 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Mon, 22 Jul 2019 22:39:36 +0200
Subject: Allowed plugins to extend the current theme.

---
 plugins/pychrysalide/plugin.c |  5 ++--
 src/gui/core/theme.c          | 54 ++++---------------------------------------
 src/gui/theme.c               | 32 +++++++++++++++++++++++++
 src/plugins/pglist.h          |  4 ++--
 src/plugins/plugin-int.h      |  2 +-
 src/plugins/plugin.c          |  5 ++--
 src/plugins/plugin.h          |  2 +-
 7 files changed, 46 insertions(+), 58 deletions(-)

diff --git a/plugins/pychrysalide/plugin.c b/plugins/pychrysalide/plugin.c
index 9352924..ad77c34 100644
--- a/plugins/pychrysalide/plugin.c
+++ b/plugins/pychrysalide/plugin.c
@@ -61,7 +61,7 @@ static bool py_plugin_module_check_interface(PyObject *);
 static void py_plugin_module_notify_native_loaded_wrapper(GPluginModule *, PluginAction);
 
 /* Complète une liste de resources pour thème. */
-static void py_plugin_module_include_theme_wrapper(const GPluginModule *, PluginAction, char ***, size_t *);
+static void py_plugin_module_include_theme_wrapper(const GPluginModule *, PluginAction, gboolean, char ***, size_t *);
 
 /* Procède à une opération liée à un contenu binaire. */
 static void py_plugin_module_handle_binary_content_wrapper(const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *);
@@ -490,6 +490,7 @@ static void py_plugin_module_notify_native_loaded_wrapper(GPluginModule *plugin,
 *                                                                             *
 *  Paramètres  : plugin    = greffon à manipuler.                             *
 *                action    = type d'action attendue.                          *
+*                dark      = indique une préférence pour la variante foncée.  *
 *                resources = liste de ressources à constituer. [OUT]          *
 *                count     = taille de cette liste. [OUT]                     *
 *                                                                             *
@@ -501,7 +502,7 @@ static void py_plugin_module_notify_native_loaded_wrapper(GPluginModule *plugin,
 *                                                                             *
 ******************************************************************************/
 
-static void py_plugin_module_include_theme_wrapper(const GPluginModule *plugin, PluginAction action, char ***resources, size_t *count)
+static void py_plugin_module_include_theme_wrapper(const GPluginModule *plugin, PluginAction action, gboolean dark, char ***resources, size_t *count)
 {
 
 }
diff --git a/src/gui/core/theme.c b/src/gui/core/theme.c
index 83bcf4e..1c3ad12 100644
--- a/src/gui/core/theme.c
+++ b/src/gui/core/theme.c
@@ -43,16 +43,12 @@
 #include "../../common/extstr.h"
 #include "../../common/xdg.h"
 #include "../../core/logs.h"
-#include "../../plugins/pglist.h"
 
 
 
 /* Parcourt un répertoire donné à la recherche de thèmes. */
 static void look_for_editor_themes(const char *);
 
-/* Parcourt tous les greffons à la recherche de définitions CSS. */
-static bool extend_with_plugins_themes(GdkScreen *, gboolean);
-
 
 /* Répertoires de recherche */
 static const char *_themes_directories[] = {
@@ -239,7 +235,10 @@ bool apply_gtk_theme(const char *name)
             break;
         }
 
-    if (result)
+    if (!result)
+        log_variadic_message(LMT_ERROR, _("Theme '%s' not found!"), name);
+
+    else
     {
         screen = gdk_screen_get_default();
 
@@ -321,48 +320,3 @@ GtkCssProvider *load_css_content(GdkScreen *screen, const char *path)
     return result;
 
 }
-
-
-/******************************************************************************
-*                                                                             *
-*  Paramètres  : screen = écran visé par le chargement d'un thème.            *
-*                dark   = indique une préférence pour la variante foncée.     *
-*                                                                             *
-*  Description : Parcourt tous les greffons à la recherche de définitions CSS.*
-*                                                                             *
-*  Retour      : Bilan de l'opération.                                        *
-*                                                                             *
-*  Remarques   : -                                                            *
-*                                                                             *
-******************************************************************************/
-
-static bool extend_with_plugins_themes(GdkScreen *screen, gboolean dark)
-{
-    bool result;                            /* Bilan à renvoyer            */
-    char **resources;                       /* Fichiers supplémentaires    */
-    size_t count;                           /* Nombre de ces fichiers      */
-    size_t i;                               /* Boucle de parcours          */
-    GtkCssProvider *provider;               /* Nouveau fournisseur CSS     */
-
-    result = true;
-
-    resources = NULL;
-    count = 0;
-
-    include_plugin_theme(&resources, &count);
-
-    for (i = 0; i < count && result; i++)
-    {
-        provider = load_css_content(screen, resources[i]);
-        g_clear_object(&provider);
-
-        free(resources[i]);
-
-    }
-
-    if (resources != NULL)
-        free(resources);
-
-    return result;
-
-}
diff --git a/src/gui/theme.c b/src/gui/theme.c
index dc3d1bb..3ed294a 100644
--- a/src/gui/theme.c
+++ b/src/gui/theme.c
@@ -33,6 +33,7 @@
 
 #include "core/theme.h"
 #include "../common/xml.h"
+#include "../plugins/pglist.h"
 
 
 
@@ -393,6 +394,13 @@ static void g_editor_theme_load_section(GEditorTheme *theme, GdkScreen *screen,
 
 void g_editor_theme_load(GEditorTheme *theme, GdkScreen *screen, gboolean dark)
 {
+    char **resources;                       /* Fichiers supplémentaires    */
+    size_t count;                           /* Nombre de ces fichiers      */
+    size_t i;                               /* Boucle de parcours          */
+    GtkCssProvider *provider;               /* Nouveau fournisseur CSS     */
+
+    /* Chargement du thème global courant */
+
     g_editor_theme_load_section(theme, screen, dark, "common");
 
     if (dark)
@@ -400,4 +408,28 @@ void g_editor_theme_load(GEditorTheme *theme, GdkScreen *screen, gboolean dark)
     else
         g_editor_theme_load_section(theme, screen, dark, "light");
 
+    /* Chargement des thèmes des greffons */
+
+    resources = NULL;
+    count = 0;
+
+    include_plugin_theme(dark, &resources, &count);
+
+    for (i = 0; i < count; i++)
+    {
+        provider = load_css_content(screen, resources[i]);
+
+        if (provider != NULL)
+        {
+            theme->providers = realloc(theme->providers, ++theme->count * sizeof(GtkCssProvider *));
+            theme->providers[theme->count - 1] = provider;
+        }
+
+        free(resources[i]);
+
+    }
+
+    if (resources != NULL)
+        free(resources);
+
 }
diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h
index c55c6da..76f3180 100644
--- a/src/plugins/pglist.h
+++ b/src/plugins/pglist.h
@@ -92,8 +92,8 @@ GPluginModule **get_all_plugins_for_action(PluginAction, size_t *);
 
 /* DPS_SETUP */
 
-#define include_plugin_theme(r, c) \
-    process_all_plugins_for(PGA_GUI_THEME, g_plugin_module_include_theme, r, c)
+#define include_plugin_theme(d, r, c) \
+    process_all_plugins_for(PGA_GUI_THEME, g_plugin_module_include_theme, d, r, c)
 
 /* DPS_CONTENT */
 
diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h
index 4746867..99c6080 100644
--- a/src/plugins/plugin-int.h
+++ b/src/plugins/plugin-int.h
@@ -51,7 +51,7 @@ typedef void (* pg_handle_content_fc) (const GPluginModule *, PluginAction, GBin
 typedef void (* pg_handle_loaded_fc) (const GPluginModule *, PluginAction, GLoadedContent *, wgroup_id_t, GtkStatusStack *);
 
 /* Complète une liste de resources pour thème. */
-typedef void (* pg_include_theme_fc) (const GPluginModule *, PluginAction, char ***, size_t *);
+typedef void (* pg_include_theme_fc) (const GPluginModule *, PluginAction, gboolean, char ***, size_t *);
 
 /* Assure l'interprétation d'un format en différé. */
 typedef bool (* pg_handle_format_analysis_fc) (const GPluginModule *, PluginAction, GBinFormat *, wgroup_id_t, GtkStatusStack *);
diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c
index 7423148..f7a52dd 100644
--- a/src/plugins/plugin.c
+++ b/src/plugins/plugin.c
@@ -1047,6 +1047,7 @@ void g_plugin_module_notify_native_loaded(GPluginModule *plugin, PluginAction ac
 *                                                                             *
 *  Paramètres  : plugin    = greffon à manipuler.                             *
 *                action    = type d'action attendue.                          *
+*                dark      = indique une préférence pour la variante foncée.  *
 *                resources = liste de ressources à constituer. [OUT]          *
 *                count     = taille de cette liste. [OUT]                     *
 *                                                                             *
@@ -1058,13 +1059,13 @@ void g_plugin_module_notify_native_loaded(GPluginModule *plugin, PluginAction ac
 *                                                                             *
 ******************************************************************************/
 
-void g_plugin_module_include_theme(const GPluginModule *plugin, PluginAction action, char ***resources, size_t *count)
+void g_plugin_module_include_theme(const GPluginModule *plugin, PluginAction action, gboolean dark, char ***resources, size_t *count)
 {
     GPluginModuleClass *class;              /* Classe de l'instance active */
 
     class = G_PLUGIN_MODULE_GET_CLASS(plugin);
 
-    class->include_theme(plugin, action, resources, count);
+    class->include_theme(plugin, action, dark, resources, count);
 
 }
 
diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h
index 9b8d294..f6f0644 100644
--- a/src/plugins/plugin.h
+++ b/src/plugins/plugin.h
@@ -96,7 +96,7 @@ bool g_plugin_module_load(GPluginModule *, GPluginModule **, size_t);
 void g_plugin_module_notify_native_loaded(GPluginModule *, PluginAction, void *);
 
 /* Complète une liste de resources pour thème. */
-void g_plugin_module_include_theme(const GPluginModule *, PluginAction, char ***, size_t *);
+void g_plugin_module_include_theme(const GPluginModule *, PluginAction, gboolean, char ***, size_t *);
 
 /* Procède à une opération liée à un contenu binaire. */
 void g_plugin_module_handle_binary_content(const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *);
-- 
cgit v0.11.2-87-g4458