[Xfce4-commits] [apps/xfdashboard] 01/01: Let plugins use signal action handlers instead of overriding virtual class functions
noreply at xfce.org
noreply at xfce.org
Sun Jan 31 19:53:56 CET 2016
This is an automated email from the git hooks/post-receive script.
nomad pushed a commit to branch master
in repository apps/xfdashboard.
commit 4eb77d9704980d95bd9f5431401bd027364308bb
Author: Stephan Haller <nomad at froevel.de>
Date: Sun Jan 31 19:53:34 2016 +0100
Let plugins use signal action handlers instead of overriding virtual class functions
---
plugins/clock-view/plugin.c | 50 ++++----
plugins/gnome-shell-search-provider/plugin.c | 56 +++++----
xfdashboard/plugin.c | 172 +++++++++++++++++---------
xfdashboard/plugin.h | 11 ++
4 files changed, 186 insertions(+), 103 deletions(-)
diff --git a/plugins/clock-view/plugin.c b/plugins/clock-view/plugin.c
index 6849f7d..bd3f8f6 100644
--- a/plugins/clock-view/plugin.c
+++ b/plugins/clock-view/plugin.c
@@ -37,29 +37,9 @@
/* Forward declarations */
G_MODULE_EXPORT void plugin_init(XfdashboardPlugin *self);
-G_MODULE_EXPORT void plugin_enable(XfdashboardPlugin *self);
-G_MODULE_EXPORT void plugin_disable(XfdashboardPlugin *self);
-
-/* Plugin initialization function */
-G_MODULE_EXPORT void plugin_init(XfdashboardPlugin *self)
-{
- /* Set up localization */
- xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
-
- /* Set plugin info */
- xfdashboard_plugin_set_info(self,
- "id", "clock-view",
- "name", _("Clock"),
- "description", _("Adds new a view showing a clock"),
- "author", "Stephan Haller <nomad at froevel.de>",
- NULL);
-
- /* Register GObject types of this plugin */
- XFDASHBOARD_REGISTER_PLUGIN_TYPE(self, xfdashboard_clock_view);
-}
/* Plugin enable function */
-G_MODULE_EXPORT void plugin_enable(XfdashboardPlugin *self)
+static gboolean plugin_enable(XfdashboardPlugin *self, gpointer inUserData)
{
XfdashboardViewManager *viewManager;
@@ -69,10 +49,12 @@ G_MODULE_EXPORT void plugin_enable(XfdashboardPlugin *self)
xfdashboard_view_manager_register(viewManager, "clock", XFDASHBOARD_TYPE_CLOCK_VIEW);
g_object_unref(viewManager);
+
+ return(XFDASHBOARD_PLUGIN_ACTION_HANDLED);
}
/* Plugin disable function */
-G_MODULE_EXPORT void plugin_disable(XfdashboardPlugin *self)
+static gboolean plugin_disable(XfdashboardPlugin *self, gpointer inUserData)
{
XfdashboardViewManager *viewManager;
@@ -82,4 +64,28 @@ G_MODULE_EXPORT void plugin_disable(XfdashboardPlugin *self)
xfdashboard_view_manager_unregister(viewManager, "clock");
g_object_unref(viewManager);
+
+ return(XFDASHBOARD_PLUGIN_ACTION_HANDLED);
+}
+
+/* Plugin initialization function */
+G_MODULE_EXPORT void plugin_init(XfdashboardPlugin *self)
+{
+ /* Set up localization */
+ xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
+
+ /* Set plugin info */
+ xfdashboard_plugin_set_info(self,
+ "id", "clock-view",
+ "name", _("Clock"),
+ "description", _("Adds new a view showing a clock"),
+ "author", "Stephan Haller <nomad at froevel.de>",
+ NULL);
+
+ /* Register GObject types of this plugin */
+ XFDASHBOARD_REGISTER_PLUGIN_TYPE(self, xfdashboard_clock_view);
+
+ /* Connect plugin action handlers */
+ g_signal_connect(self, "enable", G_CALLBACK(plugin_enable), NULL);
+ g_signal_connect(self, "disable", G_CALLBACK(plugin_disable), NULL);
}
diff --git a/plugins/gnome-shell-search-provider/plugin.c b/plugins/gnome-shell-search-provider/plugin.c
index 9169dd4..f7d0cf4 100644
--- a/plugins/gnome-shell-search-provider/plugin.c
+++ b/plugins/gnome-shell-search-provider/plugin.c
@@ -41,29 +41,9 @@ static GList *xfdashboard_gnome_shell_search_provider_registered_providers=NULL
/* Forward declarations */
G_MODULE_EXPORT void plugin_init(XfdashboardPlugin *self);
-G_MODULE_EXPORT void plugin_enable(XfdashboardPlugin *self);
-G_MODULE_EXPORT void plugin_disable(XfdashboardPlugin *self);
-
-/* Plugin initialization function */
-G_MODULE_EXPORT void plugin_init(XfdashboardPlugin *self)
-{
- /* Set up localization */
- xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
-
- /* Set plugin info */
- xfdashboard_plugin_set_info(self,
- "id", "gnome-shell-search-provider",
- "name", _("Gnome-Shell search provider"),
- "description", _("Uses Gnome-Shell search providers as source for searches"),
- "author", "Stephan Haller <nomad at froevel.de>",
- NULL);
-
- /* Register GObject types of this plugin */
- XFDASHBOARD_REGISTER_PLUGIN_TYPE(self, xfdashboard_gnome_shell_search_provider);
-}
/* Plugin enable function */
-G_MODULE_EXPORT void plugin_enable(XfdashboardPlugin *self)
+static gboolean plugin_enable(XfdashboardPlugin *self, gpointer inUserData)
{
XfdashboardSearchManager *searchManager;
GFile *gnomeShellSearchProvidersPath;
@@ -107,7 +87,7 @@ G_MODULE_EXPORT void plugin_enable(XfdashboardPlugin *self)
if(searchManager) g_object_unref(searchManager);
if(gnomeShellSearchProvidersPath) g_object_unref(gnomeShellSearchProvidersPath);
- return;
+ return(XFDASHBOARD_PLUGIN_ACTION_HANDLED);
}
/* Iterate through files in search providers path and for each
@@ -171,7 +151,7 @@ G_MODULE_EXPORT void plugin_enable(XfdashboardPlugin *self)
if(searchManager) g_object_unref(searchManager);
if(gnomeShellSearchProvidersPath) g_object_unref(gnomeShellSearchProvidersPath);
- return;
+ return(XFDASHBOARD_PLUGIN_ACTION_HANDLED);
}
/* Create monitor to get notified about new, changed and removed search providers */
@@ -186,10 +166,13 @@ G_MODULE_EXPORT void plugin_enable(XfdashboardPlugin *self)
if(enumerator) g_object_unref(enumerator);
if(searchManager) g_object_unref(searchManager);
if(gnomeShellSearchProvidersPath) g_object_unref(gnomeShellSearchProvidersPath);
+
+ /* All done */
+ return(XFDASHBOARD_PLUGIN_ACTION_HANDLED);
}
/* Plugin disable function */
-G_MODULE_EXPORT void plugin_disable(XfdashboardPlugin *self)
+static gboolean plugin_disable(XfdashboardPlugin *self, gpointer inUserData)
{
XfdashboardSearchManager *searchManager;
GList *iter;
@@ -236,4 +219,29 @@ G_MODULE_EXPORT void plugin_disable(XfdashboardPlugin *self)
g_list_free_full(xfdashboard_gnome_shell_search_provider_registered_providers, g_free);
xfdashboard_gnome_shell_search_provider_registered_providers=NULL;
}
+
+ /* All done */
+ return(XFDASHBOARD_PLUGIN_ACTION_HANDLED);
+}
+
+/* Plugin initialization function */
+G_MODULE_EXPORT void plugin_init(XfdashboardPlugin *self)
+{
+ /* Set up localization */
+ xfce_textdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR, "UTF-8");
+
+ /* Set plugin info */
+ xfdashboard_plugin_set_info(self,
+ "id", "gnome-shell-search-provider",
+ "name", _("Gnome-Shell search provider"),
+ "description", _("Uses Gnome-Shell search providers as source for searches"),
+ "author", "Stephan Haller <nomad at froevel.de>",
+ NULL);
+
+ /* Register GObject types of this plugin */
+ XFDASHBOARD_REGISTER_PLUGIN_TYPE(self, xfdashboard_gnome_shell_search_provider);
+
+ /* Connect plugin action handlers */
+ g_signal_connect(self, "enable", G_CALLBACK(plugin_enable), NULL);
+ g_signal_connect(self, "disable", G_CALLBACK(plugin_disable), NULL);
}
diff --git a/xfdashboard/plugin.c b/xfdashboard/plugin.c
index 9e72f79..1ae2f21 100644
--- a/xfdashboard/plugin.c
+++ b/xfdashboard/plugin.c
@@ -30,6 +30,8 @@
#include <glib/gi18n-lib.h>
+#include "marshal.h"
+
/* Forward declaration */
typedef enum /*< skip,prefix=XFDASHBOARD_PLUGIN_STATE >*/
@@ -66,15 +68,10 @@ struct _XfdashboardPluginPrivate
/* Instance related */
gchar *filename;
GModule *module;
+ void (*initialize)(XfdashboardPlugin *self);
XfdashboardPluginState state;
gchar *lastLoadingError;
- void (*initialize)(XfdashboardPlugin *self);
-
- void (*enable)(XfdashboardPlugin *self);
- void (*disable)(XfdashboardPlugin *self);
-
- void (*configure)(XfdashboardPlugin *self);
};
/* Properties */
@@ -100,17 +97,30 @@ enum
static GParamSpec* XfdashboardPluginProperties[PROP_LAST]={ 0, };
+/* Signals */
+enum
+{
+ /* Actions */
+ ACTION_ENABLE,
+ ACTION_DISABLE,
+ ACTION_CONFIGURE,
+
+ SIGNAL_LAST
+};
+
+static guint XfdashboardPluginSignals[SIGNAL_LAST]={ 0, };
+
/* IMPLEMENTATION: Private variables and methods */
-#define XFDASHBOARD_PLUGIN_CRITICAL_NOT_IMPLEMENTED(self, vfunc, action) \
- g_critical(_("Plugin at path '%s' does not implement required virtual function %s to %s"), \
+#define XFDASHBOARD_PLUGIN_CRITICAL_NOT_IMPLEMENTED(self, action) \
+ g_critical(_("Plugin at path '%s' does not implement required signal handler %s::%s"), \
self->priv->filename ? self->priv->filename : _("unknown filename"), \
- vfunc, \
+ G_OBJECT_TYPE_NAME(self), \
action);
#define XFDASHBOARD_PLUGIN_FUNCTION_NAME_INITIALIZE "plugin_init"
-#define XFDASHBOARD_PLUGIN_FUNCTION_NAME_ENABLE "plugin_enable"
-#define XFDASHBOARD_PLUGIN_FUNCTION_NAME_DISABLE "plugin_disable"
+// TODO: #define XFDASHBOARD_PLUGIN_FUNCTION_NAME_ENABLE "plugin_enable"
+// TODO: #define XFDASHBOARD_PLUGIN_FUNCTION_NAME_DISABLE "plugin_disable"
/* Get display name for XFDASHBOARD_PLUGIN_STATE_* enum values */
static const gchar* _xfdashboard_plugin_get_plugin_state_value_name(XfdashboardPluginState inState)
@@ -389,6 +399,42 @@ static void _xfdashboard_plugin_set_license(XfdashboardPlugin *self, const gchar
}
}
+/* Default implementation of signal handler "enable" */
+static gboolean _xfdashboard_plugin_enable(XfdashboardPlugin *self)
+{
+ g_return_val_if_fail(XFDASHBOARD_IS_PLUGIN(self), XFDASHBOARD_PLUGIN_ACTION_HANDLED);
+
+ /* We should never reach this code because each plugin must connect a signal handler
+ * for this action and return TRUE to indicate that this action was handled.
+ */
+ XFDASHBOARD_PLUGIN_CRITICAL_NOT_IMPLEMENTED(self, "enable");
+ return(XFDASHBOARD_PLUGIN_ACTION_HANDLED);
+}
+
+/* Default implementation of signal handler "disable" */
+static gboolean _xfdashboard_plugin_disable(XfdashboardPlugin *self)
+{
+ g_return_val_if_fail(XFDASHBOARD_IS_PLUGIN(self), XFDASHBOARD_PLUGIN_ACTION_HANDLED);
+
+ /* We should never reach this code because each plugin must connect a signal handler
+ * for this action and return TRUE to indicate that this action was handled.
+ */
+ XFDASHBOARD_PLUGIN_CRITICAL_NOT_IMPLEMENTED(self, "disable");
+ return(XFDASHBOARD_PLUGIN_ACTION_HANDLED);
+}
+
+/* Default implementation of signal handler "configure" */
+static gboolean _xfdashboard_plugin_configure(XfdashboardPlugin *self)
+{
+ g_return_val_if_fail(XFDASHBOARD_IS_PLUGIN(self), XFDASHBOARD_PLUGIN_ACTION_HANDLED);
+
+ /* We should never reach this code because each plugin must connect a signal handler
+ * for this action and return TRUE to indicate that this action was handled.
+ */
+ XFDASHBOARD_PLUGIN_CRITICAL_NOT_IMPLEMENTED(self, "configure");
+ return(XFDASHBOARD_PLUGIN_ACTION_HANDLED);
+}
+
/* IMPLEMENTATION: GTypeModule */
/* Load and initialize plugin */
@@ -450,9 +496,7 @@ static gboolean _xfdashboard_plugin_load(GTypeModule *inModule)
/* Check that plugin provides all necessary functions and get the address
* to these functions.
*/
- if(!g_module_symbol(priv->module, XFDASHBOARD_PLUGIN_FUNCTION_NAME_INITIALIZE, (gpointer*)&priv->initialize) ||
- !g_module_symbol(priv->module, XFDASHBOARD_PLUGIN_FUNCTION_NAME_ENABLE, (gpointer*)&priv->enable) ||
- !g_module_symbol(priv->module, XFDASHBOARD_PLUGIN_FUNCTION_NAME_DISABLE, (gpointer*)&priv->disable))
+ if(!g_module_symbol(priv->module, XFDASHBOARD_PLUGIN_FUNCTION_NAME_INITIALIZE, (gpointer*)&priv->initialize))
{
priv->lastLoadingError=g_strdup(g_module_error());
return(FALSE);
@@ -466,9 +510,8 @@ static gboolean _xfdashboard_plugin_load(GTypeModule *inModule)
else
{
/* If we get here the virtual function was not overridden */
- priv->lastLoadingError=g_strdup(_("Plugin does not implement required virtual function XfdashboardPlugin::initialize"));
-
- XFDASHBOARD_PLUGIN_CRITICAL_NOT_IMPLEMENTED(self, XFDASHBOARD_PLUGIN_FUNCTION_NAME_INITIALIZE, "initialize");
+ priv->lastLoadingError=g_strdup_printf(_("Plugin does not implement required function %s"), XFDASHBOARD_PLUGIN_FUNCTION_NAME_INITIALIZE);
+ g_critical("Loading plugin at '%s' failed: %s", priv->filename, priv->lastLoadingError);
return(FALSE);
}
@@ -528,8 +571,6 @@ static void _xfdashboard_plugin_unload(GTypeModule *inModule)
/* Unset module and function pointers from plugin module */
priv->initialize=NULL;
- priv->enable=NULL;
- priv->disable=NULL;
priv->module=NULL;
}
@@ -614,9 +655,6 @@ static void _xfdashboard_plugin_dispose(GObject *inObject)
/* Sanity checks that module was unloaded - at least by us */
g_assert(priv->initialize==NULL);
- g_assert(priv->enable==NULL);
- g_assert(priv->disable==NULL);
- g_assert(priv->configure==NULL);
/* Call parent's class dispose method */
G_OBJECT_CLASS(xfdashboard_plugin_parent_class)->dispose(inObject);
@@ -732,6 +770,10 @@ static void xfdashboard_plugin_class_init(XfdashboardPluginClass *klass)
GObjectClass *gobjectClass=G_OBJECT_CLASS(klass);
/* Override functions */
+ klass->enable=_xfdashboard_plugin_enable;
+ klass->disable=_xfdashboard_plugin_disable;
+ klass->configure=_xfdashboard_plugin_configure;
+
moduleClass->load=_xfdashboard_plugin_load;
moduleClass->unload=_xfdashboard_plugin_unload;
@@ -814,6 +856,43 @@ static void xfdashboard_plugin_class_init(XfdashboardPluginClass *klass)
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties(gobjectClass, PROP_LAST, XfdashboardPluginProperties);
+
+ /* Define signals */
+ XfdashboardPluginSignals[ACTION_ENABLE]=
+ g_signal_new("enable",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET(XfdashboardPluginClass, enable),
+ g_signal_accumulator_true_handled,
+ NULL,
+ _xfdashboard_marshal_BOOLEAN__OBJECT,
+ G_TYPE_BOOLEAN,
+ 1,
+ XFDASHBOARD_TYPE_PLUGIN);
+
+ XfdashboardPluginSignals[ACTION_DISABLE]=
+ g_signal_new("disable",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET(XfdashboardPluginClass, disable),
+ g_signal_accumulator_true_handled,
+ NULL,
+ _xfdashboard_marshal_BOOLEAN__OBJECT,
+ G_TYPE_BOOLEAN,
+ 1,
+ XFDASHBOARD_TYPE_PLUGIN);
+
+ XfdashboardPluginSignals[ACTION_CONFIGURE]=
+ g_signal_new("configure",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+ G_STRUCT_OFFSET(XfdashboardPluginClass, configure),
+ g_signal_accumulator_true_handled,
+ NULL,
+ _xfdashboard_marshal_BOOLEAN__OBJECT,
+ G_TYPE_BOOLEAN,
+ 1,
+ XFDASHBOARD_TYPE_PLUGIN);
}
/* Object initialization
@@ -828,14 +907,10 @@ static void xfdashboard_plugin_init(XfdashboardPlugin *self)
/* Set up default values */
priv->filename=NULL;
priv->module=NULL;
+ priv->initialize=NULL;
priv->state=XFDASHBOARD_PLUGIN_STATE_NONE;
priv->lastLoadingError=NULL;
- priv->initialize=NULL;
- priv->enable=NULL;
- priv->disable=NULL;
- priv->configure=NULL;
-
priv->id=NULL;
priv->name=NULL;
priv->description=NULL;
@@ -937,10 +1012,12 @@ void xfdashboard_plugin_set_info(XfdashboardPlugin *self,
void xfdashboard_plugin_enable(XfdashboardPlugin *self)
{
XfdashboardPluginPrivate *priv;
+ gboolean result;
g_return_if_fail(XFDASHBOARD_IS_PLUGIN(self));
priv=self->priv;
+ result=FALSE;
/* Do nothing and return immediately if plugin is enabled already */
if(priv->state==XFDASHBOARD_PLUGIN_STATE_ENABLED)
@@ -959,28 +1036,19 @@ void xfdashboard_plugin_enable(XfdashboardPlugin *self)
return;
}
- /* Call enable function of plugin */
- if(priv->enable)
- {
- /* Enable plugin */
- priv->enable(self);
- g_debug("Plugin '%s' enabled", priv->id);
-
- /* Set disabled state, i.e. revert to initialized state */
- priv->state=XFDASHBOARD_PLUGIN_STATE_ENABLED;
+ /* Emit signal action 'enable' to enable plugin */
+ g_signal_emit(self, XfdashboardPluginSignals[ACTION_ENABLE], 0, self, &result);
+ g_debug("Plugin '%s' enabled", priv->id);
- return;
- }
-
- /* If we get here the virtual function was not overridden */
- XFDASHBOARD_PLUGIN_CRITICAL_NOT_IMPLEMENTED(self, XFDASHBOARD_PLUGIN_FUNCTION_NAME_ENABLE, "enable");
- return;
+ /* Set enabled state */
+ priv->state=XFDASHBOARD_PLUGIN_STATE_ENABLED;
}
/* Disable plugin */
void xfdashboard_plugin_disable(XfdashboardPlugin *self)
{
XfdashboardPluginPrivate *priv;
+ gboolean result;
g_return_if_fail(XFDASHBOARD_IS_PLUGIN(self));
@@ -993,22 +1061,12 @@ void xfdashboard_plugin_disable(XfdashboardPlugin *self)
return;
}
- /* Call overriden disable function of plugin */
- if(priv->disable)
- {
- /* Disable plugin */
- priv->disable(self);
- g_debug("Plugin '%s' disabled", priv->id);
-
- /* Set disabled state, i.e. revert to initialized state */
- priv->state=XFDASHBOARD_PLUGIN_STATE_INITIALIZED;
+ /* Emit signal action 'disable' to disable plugin */
+ g_signal_emit(self, XfdashboardPluginSignals[ACTION_DISABLE], 0, self, &result);
+ g_debug("Plugin '%s' disabled", priv->id);
- return;
- }
-
- /* If we get here the virtual function was not overridden */
- XFDASHBOARD_PLUGIN_CRITICAL_NOT_IMPLEMENTED(self, XFDASHBOARD_PLUGIN_FUNCTION_NAME_DISABLE, "disable");
- return;
+ /* Set disabled state, i.e. revert to initialized state */
+ priv->state=XFDASHBOARD_PLUGIN_STATE_INITIALIZED;
}
/* Get base path to configuration files of this plugin */
diff --git a/xfdashboard/plugin.h b/xfdashboard/plugin.h
index 67f5585..7640efa 100644
--- a/xfdashboard/plugin.h
+++ b/xfdashboard/plugin.h
@@ -44,6 +44,10 @@ G_BEGIN_DECLS
inFunctionNamePrefix##_register_plugin_type(XFDASHBOARD_PLUGIN(self));
+/* Definitions */
+#define XFDASHBOARD_PLUGIN_ACTION_HANDLED (TRUE)
+
+
/* Object declaration */
#define XFDASHBOARD_TYPE_PLUGIN (xfdashboard_plugin_get_type())
#define XFDASHBOARD_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), XFDASHBOARD_TYPE_PLUGIN, XfdashboardPlugin))
@@ -70,6 +74,13 @@ struct _XfdashboardPluginClass
/*< private >*/
/* Parent class */
GTypeModuleClass parent_class;
+
+ /*< public >*/
+ /* Virtual functions */
+ gboolean (*enable)(XfdashboardPlugin *self);
+ gboolean (*disable)(XfdashboardPlugin *self);
+
+ gboolean (*configure)(XfdashboardPlugin *self);
};
/* Error */
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list