diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h index b1f465c01..a2b540716 100644 --- a/src/compositor/compositor-private.h +++ b/src/compositor/compositor-private.h @@ -91,6 +91,7 @@ void meta_compositor_grab_end (MetaCompositor *compositor); void meta_compositor_destroy (MetaCompositor *compositor); gboolean meta_compositor_manage (MetaCompositor *compositor, + GVariant *plugin_options, GError **error); void meta_compositor_unmanage (MetaCompositor *compositor); diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index e0b44a47e..51b4228bf 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -319,6 +319,7 @@ meta_compositor_create_view (MetaCompositor *compositor, gboolean meta_compositor_manage (MetaCompositor *compositor, + GVariant *plugin_options, GError **error) { MetaCompositorPrivate *priv = @@ -346,7 +347,7 @@ meta_compositor_manage (MetaCompositor *compositor, if (!META_COMPOSITOR_GET_CLASS (compositor)->manage (compositor, error)) return FALSE; - priv->plugin_mgr = meta_plugin_manager_new (compositor); + priv->plugin_mgr = meta_plugin_manager_new (compositor, plugin_options); meta_plugin_manager_start (priv->plugin_mgr); return TRUE; diff --git a/src/compositor/meta-plugin-manager.c b/src/compositor/meta-plugin-manager.c index fb38917b5..65b7fa66c 100644 --- a/src/compositor/meta-plugin-manager.c +++ b/src/compositor/meta-plugin-manager.c @@ -113,7 +113,8 @@ on_prepare_shutdown (MetaContext *context, } MetaPluginManager * -meta_plugin_manager_new (MetaCompositor *compositor) +meta_plugin_manager_new (MetaCompositor *compositor, + GVariant *plugin_options) { MetaBackend *backend = meta_compositor_get_backend (compositor); MetaMonitorManager *monitor_manager = @@ -123,10 +124,21 @@ meta_plugin_manager_new (MetaCompositor *compositor) MetaDisplay *display; MetaContext *context; + if (plugin_options) + { + plugin = g_object_new (plugin_type, + "options", plugin_options, + NULL); + } + else + { + plugin = g_object_new (plugin_type, NULL); + } + plugin_mgr = g_new0 (MetaPluginManager, 1); plugin_mgr->state = PLUGIN_MANAGER_STATE_STARTING; plugin_mgr->compositor = compositor; - plugin_mgr->plugin = plugin = g_object_new (plugin_type, NULL); + plugin_mgr->plugin = plugin; _meta_plugin_set_compositor (plugin, compositor); diff --git a/src/compositor/meta-plugin-manager.h b/src/compositor/meta-plugin-manager.h index f011d6276..8e5251f3f 100644 --- a/src/compositor/meta-plugin-manager.h +++ b/src/compositor/meta-plugin-manager.h @@ -42,7 +42,8 @@ typedef enum */ typedef struct MetaPluginManager MetaPluginManager; -MetaPluginManager * meta_plugin_manager_new (MetaCompositor *compositor); +MetaPluginManager * meta_plugin_manager_new (MetaCompositor *compositor, + GVariant *plugin_options); void meta_plugin_manager_start (MetaPluginManager *plugin_mgr); diff --git a/src/core/display-private.h b/src/core/display-private.h index b60a9587b..15f3e38ee 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -189,6 +189,7 @@ struct _MetaDisplayClass ) MetaDisplay * meta_display_new (MetaContext *context, + GVariant *plugin_options, GError **error); #ifdef HAVE_X11_CLIENT diff --git a/src/core/display.c b/src/core/display.c index 03f3ad0d8..960d071da 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -938,6 +938,7 @@ meta_display_shutdown_x11 (MetaDisplay *display) MetaDisplay * meta_display_new (MetaContext *context, + GVariant *plugin_options, GError **error) { MetaBackend *backend = meta_context_get_backend (context); @@ -1063,7 +1064,7 @@ meta_display_new (MetaContext *context, display->last_focus_time = timestamp; display->last_user_time = timestamp; - if (!meta_compositor_manage (display->compositor, error)) + if (!meta_compositor_manage (display->compositor, plugin_options, error)) { g_object_unref (display); return NULL; diff --git a/src/core/meta-context-private.h b/src/core/meta-context-private.h index 2f46ab994..a53f901fb 100644 --- a/src/core/meta-context-private.h +++ b/src/core/meta-context-private.h @@ -91,3 +91,7 @@ void meta_context_set_trace_file (MetaContext *context, #endif MetaSessionManager * meta_context_get_session_manager (MetaContext *context); + +META_EXPORT_TEST +void meta_context_set_plugin_options (MetaContext *context, + GVariant *plugin_options); diff --git a/src/core/meta-context.c b/src/core/meta-context.c index dd9bd4974..996dcdd07 100644 --- a/src/core/meta-context.c +++ b/src/core/meta-context.c @@ -78,6 +78,7 @@ typedef struct _MetaContextPrivate char *nick; char *plugin_name; GType plugin_gtype; + GVariant *plugin_options; char *gnome_wm_keybindings; gboolean unsafe_mode; @@ -185,6 +186,15 @@ meta_context_set_plugin_name (MetaContext *context, priv->plugin_name = g_strdup (plugin_name); } +void +meta_context_set_plugin_options (MetaContext *context, + GVariant *plugin_options) +{ + MetaContextPrivate *priv = meta_context_get_instance_private (context); + + priv->plugin_options = g_variant_ref (plugin_options); +} + void meta_context_set_gnome_wm_keybindings (MetaContext *context, const char *wm_keybindings) @@ -510,6 +520,7 @@ meta_context_start (MetaContext *context, GError **error) { MetaContextPrivate *priv = meta_context_get_instance_private (context); + g_autoptr (GVariant) plugin_options = NULL; g_return_val_if_fail (META_IS_CONTEXT (context), FALSE); @@ -523,7 +534,8 @@ meta_context_start (MetaContext *context, priv->wayland_compositor = meta_wayland_compositor_new (context); #endif - priv->display = meta_display_new (context, error); + plugin_options = g_steal_pointer (&priv->plugin_options), + priv->display = meta_display_new (context, plugin_options, error); if (!priv->display) { priv->state = META_CONTEXT_STATE_TERMINATED; @@ -882,6 +894,7 @@ meta_context_finalize (GObject *object) g_clear_pointer (&priv->trace_file, g_free); #endif + g_clear_pointer (&priv->plugin_options, g_variant_unref); g_clear_pointer (&priv->gnome_wm_keybindings, g_free); g_clear_pointer (&priv->plugin_name, g_free); g_clear_pointer (&priv->name, g_free);