diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2020-12-05 00:39:57 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2020-12-05 00:39:57 (GMT) |
commit | 1e3fa9b79ebe55698e2aa7d5484baec7e8400a8f (patch) | |
tree | c3581ceb7f8586f2f6822de563927a1246dd33a5 /src/plugins | |
parent | 6122bb7f34b178d4c07285adae16afcc55294b1f (diff) |
Rewritten the whole API dealing with panels.
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/dt.c | 34 | ||||
-rw-r--r-- | src/plugins/dt.h | 3 | ||||
-rw-r--r-- | src/plugins/pglist.h | 23 | ||||
-rw-r--r-- | src/plugins/plugin-def.h | 3 | ||||
-rw-r--r-- | src/plugins/plugin-int.h | 4 | ||||
-rw-r--r-- | src/plugins/plugin.c | 37 | ||||
-rw-r--r-- | src/plugins/plugin.h | 3 |
7 files changed, 107 insertions, 0 deletions
diff --git a/src/plugins/dt.c b/src/plugins/dt.c index 69bd5df..c476dde 100644 --- a/src/plugins/dt.c +++ b/src/plugins/dt.c @@ -29,6 +29,9 @@ #include <string.h> +#include "../plugins/pglist.h" + + /* ------------------------- MODULE DE GESTION DES NOUVEAUX ------------------------- */ @@ -482,3 +485,34 @@ GType build_dynamic_type(GType parent, const char *name, GClassInitFunc cinit, g return result; } + + +/****************************************************************************** +* * +* Paramètres : type = type d'instance à créer. * +* * +* Description : Crée un objet à partir d'un type, dynamique ou classique. * +* * +* Retour : Instance d'objet mise en place ou NULL en cas d'erreur. * +* * +* Remarques : - * +* * +******************************************************************************/ + +gpointer create_object_from_type(GType type) +{ + GObject *result; /* Instance à retourner */ + + result = NULL; + + if (g_dynamic_types_find(_chrysalide_dtypes, type) != NULL) + result = build_type_instance(type); + + else + result = g_object_new(type, NULL); + + assert(result != NULL); + + return result; + +} diff --git a/src/plugins/dt.h b/src/plugins/dt.h index 88e17ba..5c92593 100644 --- a/src/plugins/dt.h +++ b/src/plugins/dt.h @@ -42,6 +42,9 @@ void exit_chrysalide_dynamic_types(void); /* Fournit un identifiant GLib pour un nouveau type. */ GType build_dynamic_type(GType, const char *, GClassInitFunc, gconstpointer, GInstanceInitFunc); +/* Crée un objet à partir d'un type, dynamique ou classique. */ +gpointer create_object_from_type(GType); + #endif /* _PLUGINS_PYCHRYSALIDE_DT_H */ diff --git a/src/plugins/pglist.h b/src/plugins/pglist.h index ae71458..fd8e30a 100644 --- a/src/plugins/pglist.h +++ b/src/plugins/pglist.h @@ -69,6 +69,7 @@ GPluginModule **get_all_plugins_for_action(PluginAction, size_t *); */ #define process_all_plugins_for(a, f, ...) \ + do \ { \ size_t __count; \ GPluginModule **__list; \ @@ -84,12 +85,34 @@ GPluginModule **get_all_plugins_for_action(PluginAction, size_t *); } \ while (0) +#define process_plugins_while_null(a, f, ...) \ + ({ \ + void *__result; \ + size_t __count; \ + GPluginModule **__list; \ + size_t __i; \ + __result = NULL; \ + __list = get_all_plugins_for_action(a, &__count); \ + for (__i = 0; __i < __count; __i++) \ + { \ + if (__result == NULL) \ + __result = f(__list[__i], a, __VA_ARGS__); \ + g_object_unref(G_OBJECT(__list[__i])); \ + } \ + if (__list != NULL) \ + free(__list); \ + __result; \ + }) + /* DPS_PG_MANAGEMENT */ #define notify_native_loaded \ process_all_plugins_for(PGA_NATIVE_LOADED, g_plugin_module_notify_native_loaded, NULL) +#define build_type_instance(t) \ + process_plugins_while_null(PGA_TYPE_BUILDING, g_plugin_module_build_type_instance, t) + /* DPS_SETUP */ #define include_plugin_theme(d, r, c) \ diff --git a/src/plugins/plugin-def.h b/src/plugins/plugin-def.h index 7895eeb..5a2dc54 100644 --- a/src/plugins/plugin-def.h +++ b/src/plugins/plugin-def.h @@ -122,6 +122,9 @@ typedef enum _PluginAction /* Fin du chargement des greffons natifs */ PGA_NATIVE_LOADED = DPC_BASIC | DPS_CORE_MANAGEMENT | DEFINE_PLUGIN_ACTION(0), + /* Mise en place de type à partir de code externe */ + PGA_TYPE_BUILDING = DPC_BASIC | DPS_CORE_MANAGEMENT | DEFINE_PLUGIN_ACTION(1), + /** * DPC_GUI | DPS_SETUP */ diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index 876dc99..129e155 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -45,6 +45,9 @@ typedef bool (* pg_management_fc) (GPluginModule *); /* Accompagne la fin du chargement des modules natifs. */ typedef void (* pg_native_loaded_fc) (GPluginModule *, PluginAction); +/* Crée une instance à partir d'un type dynamique externe. */ +typedef gpointer (* pg_build_instance_fc) (GPluginModule *, PluginAction, GType); + /* Fournit le nom brut associé au greffon. */ typedef char * (* pg_get_modname_fc) (const GPluginModule *); @@ -99,6 +102,7 @@ struct _GPluginModuleClass pg_management_fc exit; /* Procédure d'extinction */ pg_native_loaded_fc native_loaded; /* Fin des chargements natifs */ + pg_build_instance_fc build_instance; /* Création d'objets */ pg_get_modname_fc get_modname; /* Fourniture du nom brut */ diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index cc3db70..df593ea 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -328,6 +328,10 @@ GPluginModule *g_plugin_module_new(const gchar *filename) valid = check_plugin_symbol(module, "chrysalide_plugin_on_native_loaded"); break; + case PGA_TYPE_BUILDING: + valid = check_plugin_symbol(module, "chrysalide_plugin_build_type_instance"); + break; + default: log_variadic_message(LMT_WARNING, _("Unknown action '0x%02x' in plugin '%s'..."), @@ -594,6 +598,11 @@ static void g_plugin_module_init_gclass(GPluginModuleClass *class, GModule *modu &class->native_loaded); break; + case PGA_TYPE_BUILDING: + load_plugin_symbol(module, "chrysalide_plugin_build_type_instance", + &class->build_instance); + break; + default: assert(false); break; @@ -1206,6 +1215,34 @@ void g_plugin_module_notify_native_loaded(GPluginModule *plugin, PluginAction ac /****************************************************************************** * * +* Paramètres : plugin = greffon à manipuler. * +* action = type d'action attendue. * +* type = type d'objet à mettre en place. * +* * +* Description : Crée une instance à partir d'un type dynamique externe. * +* * +* Retour : Instance d'objet gérée par l'extension ou NULL. * +* * +* Remarques : - * +* * +******************************************************************************/ + +gpointer g_plugin_module_build_type_instance(GPluginModule *plugin, PluginAction action, GType type) +{ + gpointer result; /* Instance à retourner */ + GPluginModuleClass *class; /* Classe de l'instance active */ + + class = G_PLUGIN_MODULE_GET_CLASS(plugin); + + result = class->build_instance(plugin, action, type); + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : plugin = greffon à manipuler. * * action = type d'action attendue. * * dark = indique une préférence pour la variante foncée. * diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h index 70687fe..f65d0eb 100644 --- a/src/plugins/plugin.h +++ b/src/plugins/plugin.h @@ -108,6 +108,9 @@ void g_plugin_module_log_variadic_message(const GPluginModule *, LogMessageType, /* Accompagne la fin du chargement des modules natifs. */ void g_plugin_module_notify_native_loaded(GPluginModule *, PluginAction, void *); +/* Crée une instance à partir d'un type dynamique externe. */ +gpointer g_plugin_module_build_type_instance(GPluginModule *, PluginAction, GType); + /* Complète une liste de resources pour thème. */ void g_plugin_module_include_theme(const GPluginModule *, PluginAction, gboolean, char ***, size_t *); |