From 3688ebc981037f6aabea06298aa28dd7c9163894 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard 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