From a23d08c754f0de575d3419287d9098d8be7ee64e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Fri, 29 Nov 2024 12:42:11 +0100 Subject: [PATCH] Add way to pass construct time options to plugin This is needed to allow tests to manipulate the behavior of the test shell plugin during startup. Since the plugin is created and started when the MetaDisplay is created, it needs to be handled via MetaContext, by setting the options after creating the context, but before starting. For simplicity reasons, make the options an opaque GVariant, passed via a an `"options"` property when the plugin object is created, if the passed options is non-NULL. Only passing the options when non-NULL allows for backward compatibility. Part-of: --- src/compositor/compositor-private.h | 1 + src/compositor/compositor.c | 3 ++- src/compositor/meta-plugin-manager.c | 16 ++++++++++++++-- src/compositor/meta-plugin-manager.h | 3 ++- src/core/display-private.h | 1 + src/core/display.c | 3 ++- src/core/meta-context-private.h | 4 ++++ src/core/meta-context.c | 15 ++++++++++++++- 8 files changed, 40 insertions(+), 6 deletions(-) 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);