[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