Index: shell/main.c =================================================================== --- shell/main.c (revision 37021) +++ shell/main.c (working copy) @@ -397,6 +397,14 @@ bonobo_main_quit (); } + /* This must be done after Bonobo has created all the components. For + * example the mail component makes the global variable `session` which + * is being used by several EPlugins */ + + if (!disable_eplugin) { + e_plugin_load_plugins_with_missing_symbols (); + } + return FALSE; } @@ -675,7 +683,7 @@ e_plugin_hook_register_type(e_plugin_type_hook_get_type()); e_plugin_hook_register_type(e_import_hook_get_type()); e_plugin_hook_register_type(E_TYPE_PLUGIN_UI_HOOK); - e_plugin_load_plugins(); + e_plugin_load_plugins (); } #ifdef DEVELOPMENT Index: ChangeLog =================================================================== --- ChangeLog (revision 37021) +++ ChangeLog (working copy) @@ -1,3 +1,9 @@ +2009-01-09 Philip Van hoof + + * shell/main.c: EPlugins must be loaded after Bonobo init, else variables + like `session` are not available for plugin's initialization functions. + (Fixes Bug #565681) + 2009-01-08 Milan Crha ** Part of fix for bug #565376 Index: e-util/e-plugin.c =================================================================== --- e-util/e-plugin.c (revision 37021) +++ e-util/e-plugin.c (working copy) @@ -608,8 +608,7 @@ } while ( (d = g_dir_read_name(dir)) ) { - if (strlen(d) > 6 - && !strcmp(d + strlen(d) - 6, ".eplug")) { + if (g_str_has_suffix (d, ".eplug")) { char * name = g_build_filename(path, d, NULL); ep_load(name, i); @@ -987,8 +986,10 @@ pages. */ +static GList *missing_symbols = NULL; + static int -epl_loadmodule(EPlugin *ep) +epl_loadmodule(EPlugin *ep, gboolean fatal) { EPluginLib *epl = E_PLUGIN_LIB (ep); EPluginLibEnableFunc enable; @@ -997,7 +998,10 @@ return 0; if ((epl->module = g_module_open(epl->location, 0)) == NULL) { - g_warning("can't load plugin '%s': %s", epl->location, g_module_error()); + if (fatal) + g_warning("can't load plugin '%s': %s", epl->location, g_module_error()); + else + missing_symbols = g_list_prepend (missing_symbols, g_object_ref (ep)); return -1; } @@ -1013,6 +1017,22 @@ return 0; } +void +e_plugin_load_plugins_with_missing_symbols (void) +{ + GList *list = missing_symbols; + + while (list) { + EPlugin *ep = list->data; + epl_loadmodule (ep, TRUE); + g_object_unref (ep); + list = g_list_next (list); + } + + g_list_free (missing_symbols); + missing_symbols = NULL; +} + static void * epl_invoke(EPlugin *ep, const char *name, void *data) { @@ -1024,7 +1044,7 @@ return NULL; } - if (epl_loadmodule(ep) != 0) + if (epl_loadmodule(ep, FALSE) != 0) return NULL; if (!g_module_symbol(epl->module, name, (void *)&cb)) { @@ -1041,7 +1061,7 @@ EPluginLib *epl = E_PLUGIN_LIB (ep); gpointer symbol; - if (epl_loadmodule (ep) != 0) + if (epl_loadmodule (ep, FALSE) != 0) return NULL; if (!g_module_symbol (epl->module, name, &symbol)) @@ -1080,9 +1100,15 @@ tmp = xmlGetProp(root, (const unsigned char *)"load-on-startup"); if (tmp) { + if (strcmp (tmp, "after-ui") == 0) { + missing_symbols = g_list_prepend (missing_symbols, g_object_ref (ep)); + } else { + if (epl_loadmodule(ep, FALSE) != 0) { + xmlFree(tmp); + return -1; + } + } xmlFree(tmp); - if (epl_loadmodule(ep) != 0) - return -1; } } @@ -1097,7 +1123,7 @@ pd (printf ("\n epl_get_configure_widget \n")); - if (epl_loadmodule (ep) != 0) { + if (epl_loadmodule (ep, FALSE) != 0) { pd (printf ("\n epl_loadmodule \n")); return NULL; } @@ -1122,7 +1148,7 @@ return; /* this will noop if we're disabling since we tested it above */ - if (epl_loadmodule(ep) != 0) + if (epl_loadmodule(ep, FALSE) != 0) return; if (g_module_symbol(epl->module, "e_plugin_lib_enable", (void *)&enable)) { Index: e-util/e-plugin.h =================================================================== --- e-util/e-plugin.h (revision 37021) +++ e-util/e-plugin.h (working copy) @@ -134,6 +134,7 @@ int e_plugin_construct(EPlugin *ep, xmlNodePtr root); void e_plugin_add_load_path(const char *); int e_plugin_load_plugins(void); +void e_plugin_load_plugins_with_missing_symbols(void); GSList * e_plugin_list_plugins(void); void e_plugin_register_type(GType type);