[mutter] plugins: Add early_initialize vfunc



commit f2158218bef0c51ea67c9f52b56227063d74ca62
Author: Colin Walters <walters verbum org>
Date:   Fri Feb 25 14:38:04 2011 -0500

    plugins: Add early_initialize vfunc
    
    For GNOME Shell, we need to grab our DBus names *before* we talk XSMP.
    gnome-session takes our XSMP connection as "I'm ready", and starts
    running all the other random crud that people dropped in as autostart
    files.  But for example, we need to have claimed
    org.freedesktop.Notifications before a lot of said crud starts.
    
    This requires a plugin API version bump.
    
    Misc: Move handling of --version way earlier in main() where
    it should be; no point having it wedged after plugin handling.

 configure.in                         |    2 +-
 src/compositor/meta-plugin-manager.c |   36 ++++++++++++++++++++++++++++++++++
 src/compositor/meta-plugin-manager.h |    3 +-
 src/core/main.c                      |   17 +++++++++++++--
 src/include/meta-plugin.h            |    2 +
 5 files changed, 55 insertions(+), 5 deletions(-)
---
diff --git a/configure.in b/configure.in
index e8e41c6..17c571b 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 15d340b..eee5ffa 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 c438a34..5aa8efe 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 c517b5c..7d90ba7 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 36b7fbf..b5ac3ca 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,



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]