[Xfce4-commits] <xfce4-panel:devel> Review PanelModuleFactory.
Nick Schermer
noreply at xfce.org
Wed Jan 20 21:08:17 CET 2010
Updating branch refs/heads/devel
to e22e64e81607db7de3fd1cb95f09eda25c895b86 (commit)
from 5f4c41066fc99d238732a207bc011f53a5930f53 (commit)
commit e22e64e81607db7de3fd1cb95f09eda25c895b86
Author: Nick Schermer <nick at xfce.org>
Date: Wed Jan 20 19:45:43 2010 +0100
Review PanelModuleFactory.
panel/panel-module-factory.c | 67 +++++++++++++++++------------------------
1 files changed, 28 insertions(+), 39 deletions(-)
diff --git a/panel/panel-module-factory.c b/panel/panel-module-factory.c
index c69d8f6..9419e11 100644
--- a/panel/panel-module-factory.c
+++ b/panel/panel-module-factory.c
@@ -43,7 +43,8 @@
static void panel_module_factory_finalize (GObject *object);
-static void panel_module_factory_load_modules (PanelModuleFactory *factory);
+static void panel_module_factory_load_modules (PanelModuleFactory *factory,
+ gboolean first_time);
static gboolean panel_module_factory_modules_cleanup (gpointer key,
gpointer value,
gpointer user_data);
@@ -67,10 +68,10 @@ struct _PanelModuleFactory
{
GObject __parent__;
- /* hash table of loaded modules */
+ /* relation for name -> PanelModule */
GHashTable *modules;
- /* a list with all the plugins */
+ /* all plugins in all windows */
GSList *plugins;
/* if the factory contains the launcher plugin */
@@ -113,15 +114,12 @@ panel_module_factory_class_init (PanelModuleFactoryClass *klass)
static void
panel_module_factory_init (PanelModuleFactory *factory)
{
- /* initialize */
factory->has_launcher = FALSE;
-
- /* create hash tables */
factory->modules = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_object_unref);
/* load all the modules */
- panel_module_factory_load_modules (factory);
+ panel_module_factory_load_modules (factory, TRUE);
}
@@ -131,10 +129,7 @@ panel_module_factory_finalize (GObject *object)
{
PanelModuleFactory *factory = PANEL_MODULE_FACTORY (object);
- /* destroy the hash table */
g_hash_table_destroy (factory->modules);
-
- /* free all the plugins */
g_slist_free (factory->plugins);
(*G_OBJECT_CLASS (panel_module_factory_parent_class)->finalize) (object);
@@ -143,7 +138,8 @@ panel_module_factory_finalize (GObject *object)
static void
-panel_module_factory_load_modules (PanelModuleFactory *factory)
+panel_module_factory_load_modules (PanelModuleFactory *factory,
+ gboolean first_time)
{
GDir *dir;
const gchar *name, *p;
@@ -161,13 +157,11 @@ panel_module_factory_load_modules (PanelModuleFactory *factory)
{
/* get name of the next file */
name = g_dir_read_name (dir);
-
- /* break when we reached the last file */
if (G_UNLIKELY (name == NULL))
break;
/* continue if it's not a desktop file */
- if (G_UNLIKELY (g_str_has_suffix (name, ".desktop") == FALSE))
+ if (!g_str_has_suffix (name, ".desktop"))
continue;
/* create the full .desktop filename */
@@ -181,8 +175,16 @@ panel_module_factory_load_modules (PanelModuleFactory *factory)
internal_name = g_strndup (name, p - name);
/* check if the modules name is already loaded */
- if (G_UNLIKELY (g_hash_table_lookup (factory->modules, internal_name) != NULL))
- goto already_loaded;
+ if (g_hash_table_lookup (factory->modules, internal_name) != NULL)
+ {
+ if (first_time)
+ {
+ g_debug ("Another plugin already registered with "
+ "the internal name \"%s\".", internal_name);
+ }
+
+ goto exists;
+ }
/* try to load the module */
module = panel_module_new_from_desktop_file (filename,
@@ -195,23 +197,18 @@ panel_module_factory_load_modules (PanelModuleFactory *factory)
g_hash_table_insert (factory->modules, internal_name, module);
/* check if this is the launcher */
- if (factory->has_launcher == FALSE
- && exo_str_is_equal (LAUNCHER_PLUGIN_NAME, internal_name))
- factory->has_launcher = TRUE;
+ if (!factory->has_launcher)
+ factory->has_launcher = exo_str_is_equal (LAUNCHER_PLUGIN_NAME, internal_name);
}
else
{
- already_loaded:
-
- /* cleanup */
+ exists:
g_free (internal_name);
}
- /* cleanup */
g_free (filename);
}
- /* close directory */
g_dir_close (dir);
}
@@ -229,10 +226,10 @@ panel_module_factory_modules_cleanup (gpointer key,
panel_return_val_if_fail (PANEL_IS_MODULE (module), TRUE);
panel_return_val_if_fail (PANEL_IS_MODULE_FACTORY (factory), TRUE);
- /* get whether the module is valid */
+ /* check if the executable/library still exists */
remove_from_table = !panel_module_is_valid (module);
- /* if we're going to remove this item, check if it's the launcher */
+ /* if we're going to remove this item, check if it is the launcher */
if (remove_from_table
&& exo_str_is_equal (LAUNCHER_PLUGIN_NAME,
panel_module_get_name (module)))
@@ -255,7 +252,7 @@ panel_module_factory_remove_plugin (gpointer user_data,
-static gboolean
+static inline gboolean
panel_module_factory_unique_id_exists (PanelModuleFactory *factory,
gint unique_id)
{
@@ -278,7 +275,6 @@ panel_module_factory_get (void)
if (G_LIKELY (factory))
{
- /* return with an extra reference */
g_object_ref (G_OBJECT (factory));
}
else
@@ -322,13 +318,8 @@ panel_module_factory_emit_unique_changed (PanelModule *module)
panel_return_if_fail (PANEL_IS_MODULE (module));
- /* get the module factory */
factory = panel_module_factory_get ();
-
- /* emit the signal */
g_signal_emit (G_OBJECT (factory), factory_signals[UNIQUE_CHANGED], 0, module);
-
- /* release the factory */
g_object_unref (G_OBJECT (factory));
}
@@ -340,10 +331,10 @@ panel_module_factory_get_modules (PanelModuleFactory *factory)
{
panel_return_val_if_fail (PANEL_IS_MODULE_FACTORY (factory), NULL);
- /* scan the resource directories again */
- panel_module_factory_load_modules (factory);
+ /* add new modules to the hash table */
+ panel_module_factory_load_modules (factory, FALSE);
- /* make sure the hash table is clean */
+ /* remove modules that are not found on the harddisk */
g_hash_table_foreach_remove (factory->modules,
panel_module_factory_modules_cleanup, factory);
@@ -374,7 +365,7 @@ panel_module_factory_get_plugins (PanelModuleFactory *factory,
panel_return_val_if_fail (PANEL_IS_MODULE_FACTORY (factory), NULL);
panel_return_val_if_fail (plugin_name != NULL, NULL);
- /* first assume a global plugin name is provided */
+ /* first assume a global plugin name is provided (ie. no name with id) */
for (li = factory->plugins; li != NULL; li = li->next)
{
panel_return_val_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (li->data), NULL);
@@ -420,9 +411,7 @@ panel_module_factory_new_plugin (PanelModuleFactory *factory,
module = g_hash_table_lookup (factory->modules, name);
if (G_UNLIKELY (module == NULL))
{
- /* show warning */
g_debug ("Module \"%s\" not found in the factory", name);
-
return NULL;
}
More information about the Xfce4-commits
mailing list