summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2020-12-05 00:39:57 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2020-12-05 00:39:57 (GMT)
commit1e3fa9b79ebe55698e2aa7d5484baec7e8400a8f (patch)
treec3581ceb7f8586f2f6822de563927a1246dd33a5 /src/plugins
parent6122bb7f34b178d4c07285adae16afcc55294b1f (diff)
Rewritten the whole API dealing with panels.
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/dt.c34
-rw-r--r--src/plugins/dt.h3
-rw-r--r--src/plugins/pglist.h23
-rw-r--r--src/plugins/plugin-def.h3
-rw-r--r--src/plugins/plugin-int.h4
-rw-r--r--src/plugins/plugin.c37
-rw-r--r--src/plugins/plugin.h3
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 *);