[maemo-commits] [maemo-commits] r8241 - in projects/haf/branches/maemo-af-desktop/hildon-desktop: . libhildondesktop src

From: jobi at stage.maemo.org jobi at stage.maemo.org
Date: Tue Nov 21 19:03:06 EET 2006
Author: jobi
Date: 2006-11-21 19:03:05 +0200 (Tue, 21 Nov 2006)
New Revision: 8241

Modified:
   projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
   projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/tasknavigator-item.c
   projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-legacy.c
Log:

2006-11-21  Johan Bilien  <johan.bilien at nokia.com>

	* src/hd-plugin-loader-legacy.c:
	- cleanup, factorize as much code as possible among the 3 types
	of legacy plugins
	- use GModule and open the plugin from the loader instead of using
	the tasknavigator-item-wrapper
	* libhildondesktop/tasknavigator-item.c: Made non-abstract



Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2006-11-21 16:16:55 UTC (rev 8240)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/ChangeLog	2006-11-21 17:03:05 UTC (rev 8241)
@@ -1,3 +1,12 @@
+2006-11-21  Johan Bilien  <johan.bilien at nokia.com>
+
+	* src/hd-plugin-loader-legacy.c:
+	- cleanup, factorize as much code as possible among the 3 types
+	of legacy plugins
+	- use GModule and open the plugin from the loader instead of using
+	the tasknavigator-item-wrapper
+	* libhildondesktop/tasknavigator-item.c: Made non-abstract
+
 2006-11-21  Moises Martinez  <moises.martinzes at nokia.com>
 
 	* src/main.c: added locale.h header

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/tasknavigator-item.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/tasknavigator-item.c	2006-11-21 16:16:55 UTC (rev 8240)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/libhildondesktop/tasknavigator-item.c	2006-11-21 17:03:05 UTC (rev 8241)
@@ -65,7 +65,7 @@
         tn_item_type = g_type_register_static (HILDON_DESKTOP_TYPE_PANEL_ITEM,
                                                "TaskNavigatorItem",
                                                &tn_item_info,
-                                               G_TYPE_FLAG_ABSTRACT );
+                                               0);
     }
     
     return tn_item_type;

Modified: projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-legacy.c
===================================================================
--- projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-legacy.c	2006-11-21 16:16:55 UTC (rev 8240)
+++ projects/haf/branches/maemo-af-desktop/hildon-desktop/src/hd-plugin-loader-legacy.c	2006-11-21 17:03:05 UTC (rev 8241)
@@ -44,7 +44,16 @@
   HD_PLUGIN_LOADER_LEGACY_TYPE_NAVIGATOR
 } HDPluginLoaderLegacyType;
 
-/* Properties ID*/
+/* Used to map plugin symbols to object signals */
+typedef struct _SymbolMapping {
+  const gchar *symbol_name;
+  const gchar *signal;
+} SymbolMapping;
+
+typedef GtkWidget * (*HDPluginLoaderLegacyInitFunc) (HDPluginLoaderLegacy *l,
+                                                     GError **error);
+
+/* Property IDs */
 enum {
   HD_PLUGIN_LOADER_LEGACY_PROPERTY_KEYFILE = 1
 };
@@ -52,23 +61,52 @@
 typedef struct _HDPluginLoaderLegacyPrivate
 {
   GKeyFile                     *keyfile;
+  GModule                      *module;
   HDPluginLoaderLegacyType      plugin_type;
+  HDPluginLoaderLegacyInitFunc  init_func;
+  SymbolMapping                *symbol_mapping;
+  gpointer                      module_data;
+  const gchar                  *library_key;
+  const gchar                  *module_dir;
+
 } HDPluginLoaderLegacyPrivate;
 
+static const SymbolMapping home_symbol_mapping[] = 
+        { {"hildon_home_applet_lib_initialize", NULL},
+          {"hildon_home_applet_lib_background", "background"},
+          {"hildon_home_applet_lib_foreground", "foreground"},
+          {"hildon_home_applet_lib_settings", "settings"},
+          {"hildon_home_applet_lib_deinitialize", "destroy"},
+          {NULL, NULL}};
+enum {
+  HD_PLUGIN_LOADER_LEGACY_HOME_SYMBOL_INITIALIZE = 0,
+  HD_PLUGIN_LOADER_LEGACY_HOME_SYMBOL_BACKGROUND,
+  HD_PLUGIN_LOADER_LEGACY_HOME_SYMBOL_FOREGROUND,
+  HD_PLUGIN_LOADER_LEGACY_HOME_SYMBOL_SETTINGS,
+  HD_PLUGIN_LOADER_LEGACY_HOME_SYMBOL_DESTROY,
+  HD_PLUGIN_LOADER_LEGACY_HOME_N_SYMBOLS
+};
+
+static const SymbolMapping navigator_symbol_mapping[] = 
+        { {"hildon_navigator_lib_create", NULL},
+          {"hildon_navigator_lib_initialize_menu", NULL},
+          {"hildon_navigator_lib_get_button_widget", NULL},
+          {"hildon_navigator_lib_destroy", "destroy"},
+          {NULL, NULL}};
+enum {
+  HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_SYMBOL_CREATE = 0,
+  HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_SYMBOL_INITIALIZE_MENU,
+  HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_SYMBOL_GET_BUTTON,
+  HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_SYMBOL_DESTROY,
+  HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_N_SYMBOLS
+};
+
 #define HD_PLUGIN_LOADER_LEGACY_GET_PRIVATE(obj) \
 (G_TYPE_INSTANCE_GET_PRIVATE ((obj), HD_TYPE_PLUGIN_LOADER_LEGACY, HDPluginLoaderLegacyPrivate))
 
 static GtkWidget *
 hd_plugin_loader_legacy_load (HDPluginLoader *loader, GError **error);
 
-static GtkWidget *
-hd_plugin_loader_legacy_load_home_applet (HDPluginLoader *loader,
-                                          GError **error);
-
-static GtkWidget *
-hd_plugin_loader_legacy_load_navigator_item (HDPluginLoader *loader,
-                                             GError **error);
-
 static void
 hd_plugin_loader_legacy_iface_init (HDPluginLoader *iface);
 
@@ -91,6 +129,23 @@
 hd_plugin_loader_legacy_set_key_file (HDPluginLoaderLegacy *loader,
                                       GKeyFile *keyfile);
 
+static GtkWidget *
+hd_plugin_loader_legacy_home_init (HDPluginLoaderLegacy *loader,
+                                   GError **error);
+
+static GtkWidget *
+hd_plugin_loader_legacy_navigator_init (HDPluginLoaderLegacy *loader,
+                                        GError **error);
+  
+static void
+hd_plugin_loader_legacy_connect_signals (HDPluginLoaderLegacy *loader,
+                                         GtkWidget *item,
+                                         GError **error);
+
+static void
+hd_plugin_loader_legacy_open_module (HDPluginLoaderLegacy *loader,
+                                     GError **error);
+
 G_DEFINE_TYPE_EXTENDED (HDPluginLoaderLegacy,
                         hd_plugin_loader_legacy,
                         G_TYPE_OBJECT,
@@ -176,6 +231,8 @@
 hd_plugin_loader_legacy_load (HDPluginLoader *loader, GError **error)
 {
   HDPluginLoaderLegacyPrivate      *priv;
+  GtkWidget                        *item = NULL;
+  GError                           *local_error = NULL;
 
   g_return_val_if_fail (loader, NULL);
  
@@ -195,11 +252,17 @@
   switch (priv->plugin_type)
     {
       case HD_PLUGIN_LOADER_LEGACY_TYPE_HOME:
-          return hd_plugin_loader_legacy_load_home_applet (loader, error);
+          priv->symbol_mapping = (SymbolMapping *)home_symbol_mapping;
+          priv->init_func = hd_plugin_loader_legacy_home_init;
+          priv->library_key = HD_PLUGIN_LOADER_LEGACY_KEY_X_HOME_APPLET;
+          priv->module_dir = HD_PLUGIN_LOADER_LEGACY_HOME_MODULE_PATH;
           break;
       
       case HD_PLUGIN_LOADER_LEGACY_TYPE_NAVIGATOR:
-          return hd_plugin_loader_legacy_load_navigator_item (loader, error);
+          priv->symbol_mapping = (SymbolMapping *)navigator_symbol_mapping;
+          priv->init_func = hd_plugin_loader_legacy_navigator_init;
+          priv->library_key = HD_PLUGIN_LOADER_LEGACY_KEY_X_TN;
+          priv->module_dir = HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_MODULE_PATH;
           break;
       default:
           g_set_error (error,
@@ -209,63 +272,58 @@
           return NULL;
     }
 
+  /* Open the module */
+  hd_plugin_loader_legacy_open_module (HD_PLUGIN_LOADER_LEGACY (loader),
+                                       &local_error);
+  if (local_error) goto error;
+
+  /* Call the correct initialization plugin,
+   * get the DesktomItem back */
+  item = priv->init_func (HD_PLUGIN_LOADER_LEGACY (loader), &local_error);
+  if (local_error) goto error;
+
+  /* Now connect all the callbacks to the proper signals */
+  hd_plugin_loader_legacy_connect_signals (HD_PLUGIN_LOADER_LEGACY (loader),
+                                           item,
+                                           &local_error);
+  if (local_error) goto error;
+
+  return item;
+
+error:
+
+  g_propagate_error (error, local_error);
+  if (item)
+    gtk_widget_destroy (item);
+  if (priv->module)
+    {
+      g_module_close (priv->module);
+      g_object_unref (priv->module);
+      priv->module = NULL;
+    }
   return NULL;
 }
 
-static GtkWidget *
-hd_plugin_loader_legacy_load_home_applet (HDPluginLoader *loader,
-                                          GError **error)
+static void
+hd_plugin_loader_legacy_open_module (HDPluginLoaderLegacy *loader,
+                                     GError **error)
 {
-  enum {
-    SYMBOL_INITIALIZE = 0,
-    SYMBOL_BACKGROUND,
-    SYMBOL_FOREGROUND,
-    SYMBOL_SETTINGS,
-    SYMBOL_DEINITIALIZE,
-    MAX_SYMBOLS
-  };
-
-  static char *
-      SYMBOL_NAME[MAX_SYMBOLS] = {
-        "hildon_home_applet_lib_initialize",
-        "hildon_home_applet_lib_background",
-        "hildon_home_applet_lib_foreground",
-        "hildon_home_applet_lib_settings",
-        "hildon_home_applet_lib_deinitialize"
-      };
-
-  typedef void       *(*HomeInitializeFn)   (void *state_data, 
-                                               int *state_size,
-                                               GtkWidget **widget);
-  typedef void        (*HomeBackgroundFn)   (void *data);
-  typedef void        (*HomeForegroundFn)   (void *data);
-  typedef GtkWidget  *(*HomeSettingsFn)     (void *data, GtkWidget *parent);
-  typedef void        (*HomeDeinitializeFn) (void *data);
-
   HDPluginLoaderLegacyPrivate *priv;
-  GtkWidget    *applet;
-  GtkWidget    *module_widget; 
-  GModule      *module = NULL;
   GError       *keyfile_error = NULL;
   gchar        *module_file = NULL;
   gchar        *module_path = NULL;
-  guint         i;
-  gpointer      symbols[MAX_SYMBOLS];
-  gpointer      module_data;
-  gpointer      state_data;
-  gint          state_data_length = 0;
   
   priv = HD_PLUGIN_LOADER_LEGACY_GET_PRIVATE (loader);
   
   module_file = g_key_file_get_string (priv->keyfile,
                                        HD_PLUGIN_LOADER_LEGACY_GROUP,
-                                       HD_PLUGIN_LOADER_LEGACY_KEY_X_HOME_APPLET,
+                                       priv->library_key,
                                        &keyfile_error);
 
   if (keyfile_error)
     {
       g_propagate_error (error, keyfile_error);
-      return NULL;
+      return;
     }
 
   if (module_file && module_file[0] == G_DIR_SEPARATOR)
@@ -273,213 +331,64 @@
   else
     {
       module_path = g_build_path (G_DIR_SEPARATOR_S,
-                                  HD_PLUGIN_LOADER_LEGACY_HOME_MODULE_PATH,
+                                  priv->module_dir,
                                   module_file,
                                   NULL);
 
       g_free (module_file);
     }
 
-  module = g_module_open (module_path, 0);
+  priv->module = g_module_open (module_path, 0);
   g_free (module_path);
 
-  if (!module)
+  if (!priv->module)
     {
       g_set_error (error,
                    hd_plugin_loader_error_quark (),
                    HD_PLUGIN_LOADER_ERROR_OPEN,
                    g_module_error ());
-      return NULL;
+      return;
     }
 
-  for (i = 0 ; i < MAX_SYMBOLS ; i++)
-    {
-      if (!g_module_symbol (module, SYMBOL_NAME[i], symbols[i]))
-        {
-          g_set_error (error,
-                       hd_plugin_loader_error_quark (),
-                       HD_PLUGIN_LOADER_ERROR_OPEN,
-                       g_module_error ());
-          g_module_close (module);
-          return NULL;
-        }
-    }
-
-  module_data = ((HomeInitializeFn)(symbols[SYMBOL_INITIALIZE]))
-      (&state_data,
-       &state_data_length,
-       &module_widget);
-
-  if (!module_widget || !GTK_IS_WIDGET (module_widget))
-    {
-      g_set_error (error,
-                   hd_plugin_loader_error_quark (),
-                   HD_PLUGIN_LOADER_ERROR_INIT,
-                   "Hildon Home Home Applet did not return a widget");
-
-      g_module_close (module);
-      return NULL;
-    }
-
-  applet = hildon_home_applet_new ();
-
-  gtk_container_add (GTK_CONTAINER (applet), module_widget);
-
-  /* Connect all the signals to the plugin callbacks */
-  g_signal_connect_swapped (applet, "background",
-                            G_CALLBACK (symbols[SYMBOL_BACKGROUND]),
-                            module_data);
-  
-  g_signal_connect_swapped (applet, "foreground",
-                            G_CALLBACK (symbols[SYMBOL_FOREGROUND]),
-                            module_data);
-  
-  g_signal_connect_swapped (applet, "settings",
-                            G_CALLBACK (symbols[SYMBOL_SETTINGS]),
-                            module_data);
-  
-  g_signal_connect_swapped (applet, "destroy",
-                            G_CALLBACK (symbols[SYMBOL_DEINITIALIZE]),
-                            module_data);
-  
-  /* If the applets all supported unloading we should connect a weak ref
-   * to g_module_close */
-
-  return applet;
 }
 
-static GtkWidget *
-hd_plugin_loader_legacy_load_navigator_item (HDPluginLoader *loader,
-                                             GError **error)
+static void
+hd_plugin_loader_legacy_connect_signals (HDPluginLoaderLegacy *loader,
+                                         GtkWidget *item,
+                                         GError **error)
 {
-#if 0
-  enum {
-    SYMBOL_CREATE = 0,
-    SYMBOL_INITIALIZE,
-    SYMBOL_BUTTON,
-    SYMBOL_DESTROY,
-    MAX_SYMBOLS
-  };
-
-  static char *
-      SYMBOL_NAME[MAX_SYMBOLS] = {
-        "hildon_navigator_lib_create",
-        "hildon_navigator_lib_initialize_menu",
-        "hildon_navigator_lib_destroy",
-        "hildon_navigator_lib_get_button_widget",
-      };
-
-
-  typedef void         *(*NavigatorCreateFn)           (void);
-  typedef void          (*NavigatorDestroyFn)          (gpointer data);
-  typedef GtkWidget    *(*NavigatorGetButtonFn)        (gpointer data);
-  typedef void          (*NavigatorInitializeMenuFn)   (gpointer data);
-
-
-  GtkWidget    *module_widget; 
-  GModule      *module = NULL;
-  gpointer      symbols[MAX_SYMBOLS];
-  gpointer      module_data;
-  guint         i;
-
-#endif
-
-
-  HDPluginLoaderLegacyPrivate *priv;
-  GtkWidget    *item;
-  GError       *keyfile_error = NULL;
-  gchar        *module_file = NULL;
-  gchar        *module_path = NULL;
-  
+  HDPluginLoaderLegacyPrivate      *priv;
+  SymbolMapping *mapping;
   priv = HD_PLUGIN_LOADER_LEGACY_GET_PRIVATE (loader);
-  
-  module_file = g_key_file_get_string (priv->keyfile,
-                                       HD_PLUGIN_LOADER_LEGACY_GROUP,
-                                       HD_PLUGIN_LOADER_LEGACY_KEY_X_TN,
-                                       &keyfile_error);
 
-  if (keyfile_error)
-    {
-      g_propagate_error (error, keyfile_error);
-      return NULL;
-    }
+  g_return_if_fail (priv->symbol_mapping);
+  g_return_if_fail (priv->module);
+  mapping = priv->symbol_mapping;
 
-  if (module_file && module_file[0] == G_DIR_SEPARATOR)
-    module_path = module_file;
-  else
+  while (mapping->symbol_name)
     {
-      module_path = g_build_path (G_DIR_SEPARATOR_S,
-                                  HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_MODULE_PATH,
-                                  module_file,
-                                  NULL);
+      gpointer symbol = NULL;
 
-      g_free (module_file);
-    }
-  
-  item = GTK_WIDGET (tasknavigator_item_wrapper_new ("Test", module_path)); 
-  g_free (module_path);
-
-  return item;
-#if 0
-
-  module = g_module_open (module_path, 0);
-  g_free (module_path);
-
-  if (!module)
-    {
-      g_set_error (error,
-                   hd_plugin_loader_error_quark (),
-                   HD_PLUGIN_LOADER_ERROR_OPEN,
-                   g_module_error ());
-      return NULL;
-    }
-
-  for (i = 0 ; i < MAX_SYMBOLS ; i++)
-    {
-      if (!g_module_symbol (module, SYMBOL_NAME[i], symbols[i]))
+      if (!mapping->signal)
         {
-          g_set_error (error,
-                       hd_plugin_loader_error_quark (),
-                       HD_PLUGIN_LOADER_ERROR_OPEN,
-                       g_module_error ());
-          g_module_close (module);
-          return NULL;
+          mapping ++;
+          continue;
         }
-    }
 
-  module_data = ((NavigatorCreateFn)(symbols[SYMBOL_CREATE])) ();
-  
- ((NavigatorInitializeMenuFn)(symbols[SYMBOL_BUTTON])) (module_data);
-  
-  module_widget = ((NavigatorGetButtonFn)(symbols[SYMBOL_BUTTON])) (module_data);
+      g_module_symbol (priv->module, mapping->symbol_name, &symbol);
 
-  if (!module_widget || !GTK_IS_WIDGET (module_widget))
-    {
-      g_set_error (error,
-                   hd_plugin_loader_error_quark (),
-                   HD_PLUGIN_LOADER_ERROR_INIT,
-                   "Hildon Navigator Legacy Item did not return a widget");
+      fprintf (stderr, "Found symbol %s, connecting to %s\n", mapping->symbol_name, mapping->signal );
 
-      g_module_close (module);
-      return NULL;
-    }
+      if (symbol)
+        g_signal_connect_swapped (G_OBJECT (item),
+                                  mapping->signal,
+                                  symbol,
+                                  priv->module_data);
 
-  item = hildon_navigator_item_new ();
+      mapping ++;
 
-  gtk_container_add (GTK_CONTAINER (item), module_widget);
-  
-  g_signal_connect_swapped (applet, "destroy",
-                            G_CALLBACK (symbols[SYMBOL_DESTROY]),
-                            module_data);
-  
-  /* If the applets all supported unloading we should connect a weak ref
-   * to g_module_close */
+    }
 
-  return item;
-
-
-#endif
-
 }
 
 static void
@@ -533,8 +442,138 @@
 
   if (priv->keyfile != keyfile)
     {
+      if (priv->keyfile)
+        g_free (priv->keyfile);
       priv->keyfile = keyfile;
       g_object_notify (G_OBJECT (loader), "keyfile");
     }
 }
 
+static GtkWidget *
+hd_plugin_loader_legacy_home_init (HDPluginLoaderLegacy    *loader,
+                                   GError                 **error)
+{
+  typedef void       *(*HomeInitializeFn)   (void *state_data, 
+                                             int *state_size,
+                                             GtkWidget **widget);
+
+  HDPluginLoaderLegacyPrivate *priv;
+  GtkWidget        *applet = NULL;
+  GtkWidget        *module_widget = NULL;
+  gpointer          state_data = NULL;
+  gint              state_data_length = 0;
+  SymbolMapping    *s;
+  gpointer          symbol;
+
+  priv = HD_PLUGIN_LOADER_LEGACY_GET_PRIVATE (loader);
+
+  s = &priv->symbol_mapping[HD_PLUGIN_LOADER_LEGACY_HOME_SYMBOL_INITIALIZE];
+
+  g_module_symbol (priv->module, s->symbol_name, &symbol);
+
+  if (!symbol)
+    {
+      g_set_error (error,
+                   hd_plugin_loader_error_quark (),
+                   HD_PLUGIN_LOADER_ERROR_SYMBOL,
+                   g_module_error ());
+      return NULL;
+    }
+
+  priv->module_data = ((HomeInitializeFn)symbol) (&state_data,
+                                                  &state_data_length,
+                                                  &module_widget);
+
+  if (!module_widget || !GTK_IS_WIDGET (module_widget))
+    {
+      g_set_error (error,
+                   hd_plugin_loader_error_quark (),
+                   HD_PLUGIN_LOADER_ERROR_INIT,
+                   "Hildon Home Home Applet did not return a widget");
+      return NULL;
+    }
+
+  applet = hildon_home_applet_new ();
+
+  gtk_container_add (GTK_CONTAINER (applet), module_widget);
+
+  return applet;
+}
+
+static GtkWidget *
+hd_plugin_loader_legacy_navigator_init (HDPluginLoaderLegacy    *loader,
+                                        GError                 **error)
+{
+  typedef void         *(*NavigatorCreateFn)           (void);
+  typedef GtkWidget    *(*NavigatorGetButtonFn)        (gpointer data);
+  typedef void         *(*NavigatorInitializeFn)       (gpointer data);
+
+  HDPluginLoaderLegacyPrivate *priv;
+  GtkWidget        *item = NULL;
+  GtkWidget        *module_widget = NULL;
+  SymbolMapping    *s;
+  gpointer          symbol = NULL;
+
+  priv = HD_PLUGIN_LOADER_LEGACY_GET_PRIVATE (loader);
+  
+  s = &priv->symbol_mapping[HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_SYMBOL_CREATE];
+  
+  g_module_symbol (priv->module, s->symbol_name, &symbol);
+
+  if (!symbol)
+    {
+      g_set_error (error,
+                   hd_plugin_loader_error_quark (),
+                   HD_PLUGIN_LOADER_ERROR_SYMBOL,
+                   g_module_error ());
+      return NULL;
+    }
+  
+  priv->module_data = ((NavigatorCreateFn)symbol) ();
+
+  s = &priv->symbol_mapping[HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_SYMBOL_GET_BUTTON];
+  
+  symbol = NULL;
+  g_module_symbol (priv->module, s->symbol_name, &symbol);
+
+  if (!symbol)
+    {
+      g_set_error (error,
+                   hd_plugin_loader_error_quark (),
+                   HD_PLUGIN_LOADER_ERROR_SYMBOL,
+                   g_module_error ());
+      return NULL;
+    }
+
+  module_widget = ((NavigatorGetButtonFn)symbol) (priv->module_data);
+  
+  if (!module_widget || !GTK_IS_WIDGET (module_widget))
+    {
+      g_set_error (error,
+                   hd_plugin_loader_error_quark (),
+                   HD_PLUGIN_LOADER_ERROR_INIT,
+                   "Hildon Navigator Item did not return a widget");
+      return NULL;
+    }
+
+  item = g_object_new (TASKNAVIGATOR_TYPE_ITEM, NULL);
+
+  gtk_container_add (GTK_CONTAINER (item), module_widget);
+  
+  s = &priv->symbol_mapping[HD_PLUGIN_LOADER_LEGACY_NAVIGATOR_SYMBOL_INITIALIZE_MENU];
+  symbol = NULL;
+  g_module_symbol (priv->module, s->symbol_name, &symbol);
+
+  if (!symbol)
+    {
+      g_set_error (error,
+                   hd_plugin_loader_error_quark (),
+                   HD_PLUGIN_LOADER_ERROR_SYMBOL,
+                   g_module_error ());
+      return NULL;
+    }
+
+  ((NavigatorInitializeFn)symbol) (priv->module_data);
+
+  return item;
+}


More information about the maemo-commits mailing list