[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.orgDate: Tue Nov 21 19:03:06 EET 2006
- Previous message: [maemo-commits] r8240 - projects/haf/trunk/maemo-theme-default
- Next message: [maemo-commits] r8242 - in projects/haf/trunk/python-dbus: . dbus
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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; +}
- Previous message: [maemo-commits] r8240 - projects/haf/trunk/maemo-theme-default
- Next message: [maemo-commits] r8242 - in projects/haf/trunk/python-dbus: . dbus
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]