[Xfce4-commits] [apps/xfdashboard] 01/01: Rewrote search manager to use IDs.

noreply at xfce.org noreply at xfce.org
Thu Oct 15 21:05:08 CEST 2015


This is an automated email from the git hooks/post-receive script.

nomad pushed a commit to branch master
in repository apps/xfdashboard.

commit 6ca73cc1e0d3f1508bbf537c2b5dd213e77ff2ec
Author: Stephan Haller <nomad at froevel.de>
Date:   Thu Oct 15 21:00:09 2015 +0200

    Rewrote search manager to use IDs.
    
    Remember: The idea was to also support multi-purpose search providers. This kind of search provider register themselve several times with different IDs. They can determine their purpose by reading the ID and behave different depending on the ID. E.g. a Gnome Shell search provider will be created once for each different search provider installed but with different ID specifying which search provider is meant. They could then enabled and disabled seperately. E.g. "gnome-shell-search-pro [...]
---
 xfdashboard/application.c     |    2 +-
 xfdashboard/search-manager.c  |  221 +++++++++++++++++++++++++++++++++++------
 xfdashboard/search-manager.h  |   10 +-
 xfdashboard/search-provider.c |  149 +++++++++++++++++++++++++++
 xfdashboard/search-provider.h |    6 ++
 xfdashboard/search-view.c     |   40 ++++----
 6 files changed, 375 insertions(+), 53 deletions(-)

diff --git a/xfdashboard/application.c b/xfdashboard/application.c
index 30a828f..98c769f 100644
--- a/xfdashboard/application.c
+++ b/xfdashboard/application.c
@@ -417,7 +417,7 @@ static gboolean _xfdashboard_application_initialize_full(XfdashboardApplication
 	/* Register built-in search providers */
 	priv->searchManager=xfdashboard_search_manager_get_default();
 
-	xfdashboard_search_manager_register(priv->searchManager, XFDASHBOARD_TYPE_APPLICATIONS_SEARCH_PROVIDER);
+	xfdashboard_search_manager_register(priv->searchManager, "applications", XFDASHBOARD_TYPE_APPLICATIONS_SEARCH_PROVIDER);
 
 	/* Create single-instance of focus manager to keep it alive while
 	 * application is running.
diff --git a/xfdashboard/search-manager.c b/xfdashboard/search-manager.c
index a6f7461..4a33d20 100644
--- a/xfdashboard/search-manager.c
+++ b/xfdashboard/search-manager.c
@@ -61,20 +61,108 @@ enum
 static guint XfdashboardSearchManagerSignals[SIGNAL_LAST]={ 0, };
 
 /* IMPLEMENTATION: Private variables and methods */
+typedef struct _XfdashboardSearchManagerData		XfdashboardSearchManagerData;
+struct _XfdashboardSearchManagerData
+{
+	gchar		*ID;
+	GType		gtype;
+};
+
 
 /* Single instance of search manager */
 static XfdashboardSearchManager*			_xfdashboard_search_manager=NULL;
 
 #define DEFAULT_SEARCH_TERMS_DELIMITERS		"\t\n\r "
 
+/* Free an registered view entry */
+static void _xfdashboard_search_manager_entry_free(XfdashboardSearchManagerData *inData)
+{
+	g_return_if_fail(inData);
+
+	/* Release allocated resources */
+	if(inData->ID) g_free(inData->ID);
+	g_free(inData);
+}
+
+/* Create an entry for a registered view */
+static XfdashboardSearchManagerData* _xfdashboard_search_manager_entry_new(const gchar *inID, GType inType)
+{
+	XfdashboardSearchManagerData		*data;
+
+	g_return_val_if_fail(inID && *inID, NULL);
+
+	/* Create new entry */
+	data=g_new0(XfdashboardSearchManagerData, 1);
+	if(!data) return(NULL);
+
+	data->ID=g_strdup(inID);
+	data->gtype=inType;
+
+	/* Return newly created entry */
+	return(data);
+}
+
+/* Find entry for a registered view by ID */
+static GList* _xfdashboard_search_manager_entry_find_list_entry_by_id(XfdashboardSearchManager *self,
+																		const gchar *inID)
+{
+	XfdashboardSearchManagerPrivate		*priv;
+	GList								*iter;
+	XfdashboardSearchManagerData		*data;
+
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_MANAGER(self), NULL);
+	g_return_val_if_fail(inID && *inID, NULL);
+
+	priv=self->priv;
+
+	/* Iterate through list and lookup list entry whose data has requested ID */
+	for(iter=priv->registeredProviders; iter; iter=g_list_next(iter))
+	{
+		/* Get data of currently iterated list entry */
+		data=(XfdashboardSearchManagerData*)(iter->data);
+		if(!data) continue;
+
+		/* Check if ID of data matches requested one and
+		 * return list entry if it does.
+		 */
+		if(g_strcmp0(data->ID, inID)==0) return(iter);
+	}
+
+	/* If we get here we did not find a matching list entry */
+	return(NULL);
+}
+
+static XfdashboardSearchManagerData* _xfdashboard_search_manager_entry_find_data_by_id(XfdashboardSearchManager *self,
+																						const gchar *inID)
+{
+	GList								*iter;
+	XfdashboardSearchManagerData		*data;
+
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_MANAGER(self), NULL);
+	g_return_val_if_fail(inID && *inID, NULL);
+
+	/* Find list entry matching requested ID */
+	iter=_xfdashboard_search_manager_entry_find_list_entry_by_id(self, inID);
+	if(!iter) return(NULL);
+
+	/* We found a matching list entry so return its data */
+	data=(XfdashboardSearchManagerData*)(iter->data);
+
+	/* Return data of matching list entry */
+	return(data);
+}
+
 /* IMPLEMENTATION: GObject */
 
 /* Dispose this object */
 static void _xfdashboard_search_manager_dispose_unregister_search_provider(gpointer inData, gpointer inUserData)
 {
+	XfdashboardSearchManagerData		*data;
+
 	g_return_if_fail(XFDASHBOARD_IS_SEARCH_MANAGER(inUserData));
 
-	xfdashboard_search_manager_unregister(XFDASHBOARD_SEARCH_MANAGER(inUserData), GPOINTER_TO_GTYPE(inData));
+	data=(XfdashboardSearchManagerData*)inData;
+	xfdashboard_search_manager_unregister(XFDASHBOARD_SEARCH_MANAGER(inUserData), data->ID);
 }
 
 static void _xfdashboard_search_manager_dispose(GObject *inObject)
@@ -165,11 +253,13 @@ XfdashboardSearchManager* xfdashboard_search_manager_get_default(void)
 }
 
 /* Register a search provider */
-void xfdashboard_search_manager_register(XfdashboardSearchManager *self, GType inProviderType)
+gboolean xfdashboard_search_manager_register(XfdashboardSearchManager *self, const gchar *inID, GType inProviderType)
 {
 	XfdashboardSearchManagerPrivate		*priv;
+	XfdashboardSearchManagerData		*data;
 
-	g_return_if_fail(XFDASHBOARD_IS_SEARCH_MANAGER(self));
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_MANAGER(self), FALSE);
+	g_return_val_if_fail(inID && *inID, FALSE);
 
 	priv=self->priv;
 
@@ -177,63 +267,132 @@ void xfdashboard_search_manager_register(XfdashboardSearchManager *self, GType i
 	if(inProviderType==XFDASHBOARD_TYPE_SEARCH_PROVIDER ||
 		g_type_is_a(inProviderType, XFDASHBOARD_TYPE_SEARCH_PROVIDER)!=TRUE)
 	{
-		g_warning(_("Search provider %s is not a %s and cannot be registered"),
+		g_warning(_("Search provider %s of type %s is not a %s and cannot be registered"),
+					inID,
 					g_type_name(inProviderType),
 					g_type_name(XFDASHBOARD_TYPE_SEARCH_PROVIDER));
-		return;
+		return(FALSE);
 	}
 
-	/* Register type if not already registered */
-	if(g_list_find(priv->registeredProviders, GTYPE_TO_POINTER(inProviderType))==NULL)
+	/* Check if search provider is registered already */
+	if(_xfdashboard_search_manager_entry_find_list_entry_by_id(self, inID))
 	{
-		g_debug("Registering search provider %s", g_type_name(inProviderType));
-		priv->registeredProviders=g_list_append(priv->registeredProviders, GTYPE_TO_POINTER(inProviderType));
-		g_signal_emit(self, XfdashboardSearchManagerSignals[SIGNAL_REGISTERED], 0, inProviderType);
+		g_warning(_("Search provider %s of type %s is registered already"),
+					inID,
+					g_type_name(inProviderType));
+		return(FALSE);
 	}
+
+	/* Register search provider */
+	g_debug("Registering search provider %s of type %s",
+			inID,
+			g_type_name(inProviderType));
+
+	data=_xfdashboard_search_manager_entry_new(inID, inProviderType);
+	if(!data)
+	{
+		g_warning(_("Failed to register seaarch provider %s of type %s"),
+					inID,
+					g_type_name(inProviderType));
+		return(FALSE);
+	}
+
+	priv->registeredProviders=g_list_append(priv->registeredProviders, data);
+	g_signal_emit(self, XfdashboardSearchManagerSignals[SIGNAL_REGISTERED], 0, data->ID);
+
+	/* Search provider was registered successfully so return TRUE here */
+	return(TRUE);
 }
 
 /* Unregister a search provider */
-void xfdashboard_search_manager_unregister(XfdashboardSearchManager *self, GType inProviderType)
+gboolean xfdashboard_search_manager_unregister(XfdashboardSearchManager *self, const gchar *inID)
 {
 	XfdashboardSearchManagerPrivate		*priv;
+	GList								*iter;
+	XfdashboardSearchManagerData		*data;
 
-	g_return_if_fail(XFDASHBOARD_IS_SEARCH_MANAGER(self));
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_MANAGER(self), FALSE);
+	g_return_val_if_fail(inID && *inID, FALSE);
 
 	priv=self->priv;
 
-	/* Check if given type is not a XfdashboardView but a derived type from it */
-	if(inProviderType==XFDASHBOARD_TYPE_SEARCH_PROVIDER ||
-		g_type_is_a(inProviderType, XFDASHBOARD_TYPE_SEARCH_PROVIDER)!=TRUE)
+	/* Check if search provider is registered  */
+	iter=_xfdashboard_search_manager_entry_find_list_entry_by_id(self, inID);
+	if(!iter)
 	{
-		g_warning(_("Search provider %s is not a %s and cannot be unregistered"),
-					g_type_name(inProviderType),
-					g_type_name(XFDASHBOARD_TYPE_SEARCH_PROVIDER));
-		return;
+		g_warning(_("Search provider %s is not registered and cannot be unregistered"), inID);
+		return(FALSE);
 	}
 
-	/* Unregister type if registered */
-	if(g_list_find(priv->registeredProviders, GTYPE_TO_POINTER(inProviderType))!=NULL)
-	{
-		g_debug("Unregistering search provider %s", g_type_name(inProviderType));
-		priv->registeredProviders=g_list_remove(priv->registeredProviders, GTYPE_TO_POINTER(inProviderType));
-		g_signal_emit(self, XfdashboardSearchManagerSignals[SIGNAL_UNREGISTERED], 0, inProviderType);
-	}
+	/* Get data from found list entry */
+	data=(XfdashboardSearchManagerData*)(iter->data);
+
+	/* Remove from list of registered providers */
+	g_debug("Unregistering search provider %s of type %s",
+			data->ID,
+			g_type_name(data->gtype));
+
+	priv->registeredProviders=g_list_remove(priv->registeredProviders, iter);
+	g_signal_emit(self, XfdashboardSearchManagerSignals[SIGNAL_UNREGISTERED], 0, data->ID);
+
+	/* Free data entry */
+	_xfdashboard_search_manager_entry_free(data);
+
+	/* Search provider was unregistered successfully so return TRUE here */
+	return(TRUE);
 }
 
-/* Get list of registered search provider types.
- * Returned GList must be freed with g_list_free() by caller.
+/* Get list of registered views types.
+ * Returned GList must be freed with g_list_free_full(result, g_free) by caller.
  */
 GList* xfdashboard_search_manager_get_registered(XfdashboardSearchManager *self)
 {
-	GList		*copy;
+	GList							*copy;
+	GList							*iter;
+	XfdashboardSearchManagerData	*data;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_MANAGER(self), NULL);
 
-	/* Return a copy of list of registered view types */
-	copy=g_list_copy(self->priv->registeredProviders);
+	/* Return a copy of all IDs stored in list of registered search provider types */
+	copy=NULL;
+	for(iter=self->priv->registeredProviders; iter; iter=g_list_next(iter))
+	{
+		data=(XfdashboardSearchManagerData*)(iter->data);
+
+		copy=g_list_prepend(copy, g_strdup(data->ID));
+	}
+
+	/* Restore order in copied list to match origin */
+	copy=g_list_reverse(copy);
+
+	/* Return copied list of IDs of registered search providers */
 	return(copy);
 }
 
+/* Create view for requested ID */
+GObject* xfdashboard_search_manager_create_provider(XfdashboardSearchManager *self, const gchar *inID)
+{
+	XfdashboardSearchManagerData	*data;
+	GObject							*provider;
+
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_MANAGER(self), NULL);
+	g_return_val_if_fail(inID && *inID, NULL);
+
+	/* Check if search provider is registered and get its data */
+	data=_xfdashboard_search_manager_entry_find_data_by_id(self, inID);
+	if(!data)
+	{
+		g_warning(_("Cannot create search provider %s because it is not registered"), inID);
+		return(NULL);
+	}
+
+	/* Create search provider */
+	provider=g_object_new(data->gtype, "provider-id", data->ID, NULL);
+
+	/* Return newly created search provider */
+	return(provider);
+}
+
 /* Split a string into a NULL-terminated list of tokens using the delimiters and remove
  * white-spaces at the beginning and end of each token. Empty tokens will not be added.
  * Caller is responsible to free result with g_strfreev() if not NULL.
diff --git a/xfdashboard/search-manager.h b/xfdashboard/search-manager.h
index 8dcf274..d715904 100644
--- a/xfdashboard/search-manager.h
+++ b/xfdashboard/search-manager.h
@@ -60,8 +60,8 @@ struct _XfdashboardSearchManagerClass
 
 	/*< public >*/
 	/* Virtual functions */
-	void (*registered)(XfdashboardSearchManager *self, XfdashboardSearchProvider *inProvider);
-	void (*unregistered)(XfdashboardSearchManager *self, XfdashboardSearchProvider *inProvider);
+	void (*registered)(XfdashboardSearchManager *self, const gchar *inID);
+	void (*unregistered)(XfdashboardSearchManager *self, const gchar *inID);
 };
 
 /* Public API */
@@ -69,10 +69,12 @@ GType xfdashboard_search_manager_get_type(void) G_GNUC_CONST;
 
 XfdashboardSearchManager* xfdashboard_search_manager_get_default(void);
 
-void xfdashboard_search_manager_register(XfdashboardSearchManager *self, GType inProviderType);
-void xfdashboard_search_manager_unregister(XfdashboardSearchManager *self, GType inProviderType);
+gboolean xfdashboard_search_manager_register(XfdashboardSearchManager *self, const gchar *inID, GType inProviderType);
+gboolean xfdashboard_search_manager_unregister(XfdashboardSearchManager *self, const gchar *inID);
 GList* xfdashboard_search_manager_get_registered(XfdashboardSearchManager *self);
 
+GObject* xfdashboard_search_manager_create_provider(XfdashboardSearchManager *self, const gchar *inID);
+
 gchar** xfdashboard_search_manager_get_search_terms_from_string(const gchar *inString, const gchar *inDelimiters);
 
 G_END_DECLS
diff --git a/xfdashboard/search-provider.c b/xfdashboard/search-provider.c
index 8ac7044..6ad549e 100644
--- a/xfdashboard/search-provider.c
+++ b/xfdashboard/search-provider.c
@@ -37,6 +37,28 @@ G_DEFINE_ABSTRACT_TYPE(XfdashboardSearchProvider,
 						xfdashboard_search_provider,
 						G_TYPE_OBJECT)
 
+/* Private structure - access only by public API if needed */
+#define XFDASHBOARD_SEARCH_PROVIDER_GET_PRIVATE(obj) \
+	(G_TYPE_INSTANCE_GET_PRIVATE((obj), XFDASHBOARD_TYPE_SEARCH_PROVIDER, XfdashboardSearchProviderPrivate))
+
+struct _XfdashboardSearchProviderPrivate
+{
+	/* Properties related */
+	gchar					*providerID;
+};
+
+/* Properties */
+enum
+{
+	PROP_0,
+
+	PROP_PROVIDER_ID,
+
+	PROP_LAST
+};
+
+static GParamSpec* XfdashboardSearchProviderProperties[PROP_LAST]={ 0, };
+
 /* IMPLEMENTATION: Private variables and methods */
 #define XFDASHBOARD_SEARCH_PROVIDER_WARN_NOT_IMPLEMENTED(self, vfunc) \
 	g_warning(_("Search provider of type %s does not implement required virtual function XfdashboardSearchProvider::%s"), \
@@ -48,14 +70,110 @@ G_DEFINE_ABSTRACT_TYPE(XfdashboardSearchProvider,
 				G_OBJECT_TYPE_NAME(self), \
 				vfunc);
 
+/* Set search provider ID */
+static void _xfdashboard_search_provider_set_id(XfdashboardSearchProvider *self, const gchar *inID)
+{
+	XfdashboardSearchProviderPrivate	*priv=self->priv;
+
+	g_return_if_fail(XFDASHBOARD_IS_SEARCH_PROVIDER(self));
+	g_return_if_fail(inID && *inID);
+
+	priv=self->priv;
+
+	/* Set value if changed */
+	if(g_strcmp0(priv->providerID, inID)!=0)
+	{
+		if(priv->providerID) g_free(priv->providerID);
+		priv->providerID=g_strdup(inID);
+
+		/* Notify about property change */
+		g_object_notify_by_pspec(G_OBJECT(self), XfdashboardSearchProviderProperties[PROP_PROVIDER_ID]);
+	}
+}
+
 /* IMPLEMENTATION: GObject */
 
+/* Dispose this object */
+static void _xfdashboard_search_provider_dispose(GObject *inObject)
+{
+	XfdashboardSearchProvider			*self=XFDASHBOARD_SEARCH_PROVIDER(inObject);
+	XfdashboardSearchProviderPrivate	*priv=self->priv;
+
+	/* Release allocated resources */
+	if(priv->providerID)
+	{
+		g_free(priv->providerID);
+		priv->providerID=NULL;
+	}
+
+	/* Call parent's class dispose method */
+	G_OBJECT_CLASS(xfdashboard_search_provider_parent_class)->dispose(inObject);
+}
+
+/* Set/get properties */
+static void _xfdashboard_search_provider_set_property(GObject *inObject,
+														guint inPropID,
+														const GValue *inValue,
+														GParamSpec *inSpec)
+{
+	XfdashboardSearchProvider			*self=XFDASHBOARD_SEARCH_PROVIDER(inObject);
+
+	switch(inPropID)
+	{
+		case PROP_PROVIDER_ID:
+			_xfdashboard_search_provider_set_id(self, g_value_get_string(inValue));
+			break;
+
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(inObject, inPropID, inSpec);
+			break;
+	}
+}
+
+static void _xfdashboard_search_provider_get_property(GObject *inObject,
+														guint inPropID,
+														GValue *outValue,
+														GParamSpec *inSpec)
+{
+	XfdashboardSearchProvider			*self=XFDASHBOARD_SEARCH_PROVIDER(inObject);
+
+	switch(inPropID)
+	{
+		case PROP_PROVIDER_ID:
+			g_value_set_string(outValue, self->priv->providerID);
+			break;
+
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID(inObject, inPropID, inSpec);
+			break;
+	}
+}
+
 /* Class initialization
  * Override functions in parent classes and define properties
  * and signals
  */
 static void xfdashboard_search_provider_class_init(XfdashboardSearchProviderClass *klass)
 {
+	GObjectClass			*gobjectClass=G_OBJECT_CLASS(klass);
+
+	/* Override functions */
+	gobjectClass->set_property=_xfdashboard_search_provider_set_property;
+	gobjectClass->get_property=_xfdashboard_search_provider_get_property;
+	gobjectClass->dispose=_xfdashboard_search_provider_dispose;
+
+	/* Set up private structure */
+	g_type_class_add_private(klass, sizeof(XfdashboardSearchProviderPrivate));
+
+	/* Define properties */
+	XfdashboardSearchProviderProperties[PROP_PROVIDER_ID]=
+		g_param_spec_string("provider-id",
+							_("Provider ID"),
+							_("The internal ID used to register this type of search provider"),
+							NULL,
+							G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY);
+
+	g_object_class_install_properties(gobjectClass, PROP_LAST, XfdashboardSearchProviderProperties);
 }
 
 /* Object initialization
@@ -63,10 +181,41 @@ static void xfdashboard_search_provider_class_init(XfdashboardSearchProviderClas
  */
 static void xfdashboard_search_provider_init(XfdashboardSearchProvider *self)
 {
+	XfdashboardSearchProviderPrivate	*priv;
+
+	priv=self->priv=XFDASHBOARD_SEARCH_PROVIDER_GET_PRIVATE(self);
+
+	/* Set up default values */
+	priv->providerID=NULL;
 }
 
 /* IMPLEMENTATION: Public API */
 
+/* Get view ID */
+const gchar* xfdashboard_search_provider_get_id(XfdashboardSearchProvider *self)
+{
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_PROVIDER(self), NULL);
+
+	return(self->priv->providerID);
+}
+
+/* Check if view has requested ID */
+gboolean xfdashboard_search_provider_has_id(XfdashboardSearchProvider *self, const gchar *inID)
+{
+	XfdashboardSearchProviderPrivate	*priv;
+
+	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_PROVIDER(self), FALSE);
+	g_return_val_if_fail(inID && *inID, FALSE);
+
+	priv=self->priv;
+
+	/* Check if requested ID matches the ID of this search provider */
+	if(g_strcmp0(priv->providerID, inID)!=0) return(FALSE);
+
+	/* If we get here the requested ID matches search provider's ID */
+	return(TRUE);
+}
+
 /* Get name of search provider */
 const gchar* xfdashboard_search_provider_get_name(XfdashboardSearchProvider *self)
 {
diff --git a/xfdashboard/search-provider.h b/xfdashboard/search-provider.h
index b871c9c..599e50e 100644
--- a/xfdashboard/search-provider.h
+++ b/xfdashboard/search-provider.h
@@ -45,6 +45,9 @@ struct _XfdashboardSearchProvider
 {
 	/* Parent instance */
 	GObject								parent_instance;
+
+	/* Private structure */
+	XfdashboardSearchProviderPrivate	*priv;
 };
 
 struct _XfdashboardSearchProviderClass
@@ -77,6 +80,9 @@ struct _XfdashboardSearchProviderClass
 /* Public API */
 GType xfdashboard_search_provider_get_type(void) G_GNUC_CONST;
 
+const gchar* xfdashboard_search_provider_get_id(XfdashboardSearchProvider *self);
+gboolean xfdashboard_search_provider_has_id(XfdashboardSearchProvider *self, const gchar *inID);
+
 const gchar* xfdashboard_search_provider_get_name(XfdashboardSearchProvider *self);
 const gchar* xfdashboard_search_provider_get_icon(XfdashboardSearchProvider *self);
 
diff --git a/xfdashboard/search-view.c b/xfdashboard/search-view.c
index fd202ea..500664e 100644
--- a/xfdashboard/search-view.c
+++ b/xfdashboard/search-view.c
@@ -229,16 +229,20 @@ static void _xfdashboard_search_view_search_terms_unref(XfdashboardSearchViewSea
 
 /* Create data for provider */
 static XfdashboardSearchViewProviderData* _xfdashboard_search_view_provider_data_new(XfdashboardSearchView *self,
-																						GType inProviderType)
+																						const gchar *inProviderID)
 {
+	XfdashboardSearchViewPrivate		*priv;
 	XfdashboardSearchViewProviderData	*data;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_VIEW(self), NULL);
-	g_return_val_if_fail(inProviderType!=XFDASHBOARD_TYPE_SEARCH_PROVIDER && g_type_is_a(inProviderType, XFDASHBOARD_TYPE_SEARCH_PROVIDER), NULL);
+	g_return_val_if_fail(*inProviderID && *inProviderID, NULL);
+
+	priv=self->priv;
 
 	/* Create data for provider */
 	data=g_new0(XfdashboardSearchViewProviderData, 1);
 	data->refCount=1;
+	data->provider=XFDASHBOARD_SEARCH_PROVIDER(xfdashboard_search_manager_create_provider(priv->searchManager, inProviderID));
 	data->view=self;
 	data->lastTerms=NULL;
 	data->lastResultSet=NULL;
@@ -247,7 +251,6 @@ static XfdashboardSearchViewProviderData* _xfdashboard_search_view_provider_data
 										g_variant_equal,
 										(GDestroyNotify)g_variant_unref,
 										(GDestroyNotify)g_object_unref);
-	data->provider=XFDASHBOARD_SEARCH_PROVIDER(g_object_new(inProviderType, NULL));
 
 	return(data);
 }
@@ -312,13 +315,14 @@ static void _xfdashboard_search_view_provider_data_unref(XfdashboardSearchViewPr
 
 /* Find data for requested provider type */
 static XfdashboardSearchViewProviderData* _xfdashboard_search_view_get_provider_data(XfdashboardSearchView *self,
-																						GType inProviderType)
+																						const gchar *inProviderID)
 {
 	XfdashboardSearchViewPrivate		*priv;
 	XfdashboardSearchViewProviderData	*data;
 	GList								*iter;
 
 	g_return_val_if_fail(XFDASHBOARD_IS_SEARCH_VIEW(self), NULL);
+	g_return_val_if_fail(inProviderID && *inProviderID, NULL);
 
 	priv=self->priv;
 
@@ -328,7 +332,7 @@ static XfdashboardSearchViewProviderData* _xfdashboard_search_view_get_provider_
 		data=(XfdashboardSearchViewProviderData*)iter->data;
 
 		if(data->provider &&
-			G_OBJECT_TYPE(data->provider)==inProviderType)
+			xfdashboard_search_provider_has_id(data->provider, inProviderID)==0)
 		{
 			return(_xfdashboard_search_view_provider_data_ref(data));
 		}
@@ -388,24 +392,25 @@ static XfdashboardSearchViewProviderData* _xfdashboard_search_view_get_provider_
 
 /* A search provider was registered */
 static void _xfdashboard_search_view_on_search_provider_registered(XfdashboardSearchView *self,
-																	GType inProviderType,
+																	const gchar *inProviderID,
 																	gpointer inUserData)
 {
 	XfdashboardSearchViewPrivate		*priv;
 	XfdashboardSearchViewProviderData	*data;
 
 	g_return_if_fail(XFDASHBOARD_IS_SEARCH_VIEW(self));
+	g_return_if_fail(*inProviderID && *inProviderID);
 
 	priv=self->priv;
 
 	/* Register search provider if not already registered */
-	data=_xfdashboard_search_view_get_provider_data(self, inProviderType);
+	data=_xfdashboard_search_view_get_provider_data(self, inProviderID);
 	if(!data)
 	{
 		/* Create data for new search provider registered
 		 * and add to list of active search providers.
 		 */
-		data=_xfdashboard_search_view_provider_data_new(self, inProviderType);
+		data=_xfdashboard_search_view_provider_data_new(self, inProviderID);
 		priv->providers=g_list_prepend(priv->providers, data);
 
 		g_debug("Created search provider %s of type %s in %s",
@@ -418,7 +423,7 @@ static void _xfdashboard_search_view_on_search_provider_registered(XfdashboardSe
 
 /* A search provider was unregistered */
 static void _xfdashboard_search_view_on_search_provider_unregistered(XfdashboardSearchView *self,
-																		GType inProviderType,
+																		const gchar *inProviderID,
 																		gpointer inUserData)
 {
 	XfdashboardSearchViewPrivate		*priv;
@@ -426,11 +431,12 @@ static void _xfdashboard_search_view_on_search_provider_unregistered(Xfdashboard
 	GList								*iter;
 
 	g_return_if_fail(XFDASHBOARD_IS_SEARCH_VIEW(self));
+	g_return_if_fail(*inProviderID && *inProviderID);
 
 	priv=self->priv;
 
 	/* Unregister search provider if it was registered before */
-	data=_xfdashboard_search_view_get_provider_data(self, inProviderType);
+	data=_xfdashboard_search_view_get_provider_data(self, inProviderID);
 	if(data)
 	{
 		g_debug("Unregistering search provider %s of type %s in %s",
@@ -1706,7 +1712,7 @@ static void xfdashboard_search_view_class_init(XfdashboardSearchViewClass *klass
 static void xfdashboard_search_view_init(XfdashboardSearchView *self)
 {
 	XfdashboardSearchViewPrivate	*priv;
-	GList							*providers, *entry;
+	GList							*providers, *providerEntry;
 	ClutterLayoutManager			*layout;
 
 	self->priv=priv=XFDASHBOARD_SEARCH_VIEW_GET_PRIVATE(self);
@@ -1740,15 +1746,15 @@ static void xfdashboard_search_view_init(XfdashboardSearchView *self)
 	/* Create instance of each registered view type and add it to this actor
 	 * and connect signals
 	 */
-	providers=entry=xfdashboard_search_manager_get_registered(priv->searchManager);
-	for(; entry; entry=g_list_next(entry))
+	providers=providerEntry=xfdashboard_search_manager_get_registered(priv->searchManager);
+	for(; providerEntry; providerEntry=g_list_next(providerEntry))
 	{
-		GType					providerType;
+		const gchar				*providerID;
 
-		providerType=(GType)GPOINTER_TO_GTYPE(entry->data);
-		_xfdashboard_search_view_on_search_provider_registered(self, providerType, priv->searchManager);
+		providerID=(const gchar*)providerEntry->data;
+		_xfdashboard_search_view_on_search_provider_registered(self, providerID, priv->searchManager);
 	}
-	g_list_free(providers);
+	g_list_free_full(providers, g_free);
 
 	g_signal_connect_swapped(priv->searchManager,
 								"registered",

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list