diff --git a/configure.in b/configure.in index e8e41c68e..17c571be3 100644 --- a/configure.in +++ b/configure.in @@ -7,7 +7,7 @@ m4_define([mutter_micro_version], [90]) m4_define([mutter_version], [mutter_major_version.mutter_minor_version.mutter_micro_version]) -m4_define([mutter_plugin_api_version], [3]) +m4_define([mutter_plugin_api_version], [4]) AC_INIT([mutter], [mutter_version], [http://bugzilla.gnome.org/enter_bug.cgi?product=mutter]) diff --git a/src/compositor/meta-plugin-manager.c b/src/compositor/meta-plugin-manager.c index 15d340b88..eee5ffad2 100644 --- a/src/compositor/meta-plugin-manager.c +++ b/src/compositor/meta-plugin-manager.c @@ -55,6 +55,8 @@ struct MetaPluginManager { MetaScreen *screen; + gboolean plugin_load_attempted; + GList /* MetaPlugin */ *plugins; /* TODO -- maybe use hash table */ GList *unload; /* Plugins that are disabled and pending unload */ @@ -181,6 +183,8 @@ meta_plugin_manager_unload (MetaPluginManager *plugin_mgr) g_list_free (plugin_mgr->plugins); plugin_mgr->plugins = NULL; + + plugin_mgr->plugin_load_attempted = FALSE; } static void @@ -218,6 +222,10 @@ meta_plugin_manager_load (MetaPluginManager *plugin_mgr) const gchar *dpath = MUTTER_PLUGIN_DIR "/"; GSList *plugins, *fallback = NULL; + if (plugin_mgr->plugin_load_attempted) + return TRUE; + plugin_mgr->plugin_load_attempted = TRUE; + plugins = meta_prefs_get_clutter_plugins (); if (!plugins) @@ -312,6 +320,34 @@ meta_plugin_manager_load (MetaPluginManager *plugin_mgr) return FALSE; } +/** + * meta_plugin_manager_initialize_early: + * @plugin_mgr: a #MetaPluginManager + * + * This function invokes any plugin handling code that needs to be run + * effectively immediately after we know which plugins are going to be + * used. This means before the process has an X connection, or + * talks to the session manager, for example. + * + * An example intended use is claiming DBus names. + */ +gboolean +meta_plugin_manager_initialize_early (MetaPluginManager *plugin_mgr) +{ + GList *iter; + + for (iter = plugin_mgr->plugins; iter; iter = iter->next) + { + MetaPlugin *plugin = (MetaPlugin*) iter->data; + MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); + + if (klass->early_initialize) + klass->early_initialize (plugin); + } + + return TRUE; +} + gboolean meta_plugin_manager_initialize (MetaPluginManager *plugin_mgr) { diff --git a/src/compositor/meta-plugin-manager.h b/src/compositor/meta-plugin-manager.h index c438a346c..5aa8efe15 100644 --- a/src/compositor/meta-plugin-manager.h +++ b/src/compositor/meta-plugin-manager.h @@ -46,10 +46,11 @@ */ typedef struct MetaPluginManager MetaPluginManager; -MetaPluginManager * meta_plugin_manager_get (MetaScreen *screen); +MetaPluginManager * meta_plugin_manager_get (MetaScreen *screen); MetaPluginManager * meta_plugin_manager_get_default (void); gboolean meta_plugin_manager_load (MetaPluginManager *mgr); +gboolean meta_plugin_manager_initialize_early (MetaPluginManager *plugin_mgr); gboolean meta_plugin_manager_initialize (MetaPluginManager *plugin_mgr); gboolean meta_plugin_manager_event_simple (MetaPluginManager *mgr, MetaWindowActor *actor, diff --git a/src/core/main.c b/src/core/main.c index c517b5c95..7d90ba715 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -539,6 +539,9 @@ main (int argc, char **argv) /* Parse command line arguments.*/ ctx = meta_parse_options (&argc, &argv, &meta_args); + if (meta_args.print_version) + version (); + /* This must come before the introspect below, so we load all the plugins * in order to get their get_type functions. */ @@ -587,10 +590,18 @@ main (int argc, char **argv) } #endif - meta_set_syncing (meta_args.sync || (g_getenv ("MUTTER_SYNC") != NULL)); + /* Early initialization for plugins comes before almost anything + else here */ + { + MetaPluginManager *mgr = meta_plugin_manager_get_default (); - if (meta_args.print_version) - version (); + if (!meta_plugin_manager_load (mgr)) + g_error ("failed to load plugins"); + + meta_plugin_manager_initialize_early (mgr); + } + + meta_set_syncing (meta_args.sync || (g_getenv ("MUTTER_SYNC") != NULL)); meta_select_display (meta_args.display_name); diff --git a/src/include/meta-plugin.h b/src/include/meta-plugin.h index 36b7fbfd2..b5ac3ca94 100644 --- a/src/include/meta-plugin.h +++ b/src/include/meta-plugin.h @@ -64,6 +64,8 @@ struct _MetaPluginClass { GObjectClass parent_class; + void (*early_initialize) (MetaPlugin *plugin); + void (*start) (MetaPlugin *plugin); void (*minimize) (MetaPlugin *plugin,