From 5b720a157cfa71ae855d8206b4a6eeb3cdf18eec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Tue, 18 Jan 2022 19:25:57 +0100 Subject: [PATCH] compositor/plugin-manager: Split start() from new() In order to support dynamic imports, gjs added an implicit mainloop that can drive the main context independently from other mainloops like the one from GApplication or MetaContext. That means that sources can now get dispatched to the main context from the moment the plugin is started, resulting in a crash as the association between compositor and plugin manager doesn't exist until meta_plugin_manager_new() returns. Make sure this doesn't happen by only starting the plugin after meta_plugin_manager_new() has returned. Part-of: --- src/compositor/compositor.c | 1 + src/compositor/meta-plugin-manager.c | 16 ++++++++++------ src/compositor/meta-plugin-manager.h | 2 ++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index ee6be007b..7d14068fd 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -548,6 +548,7 @@ meta_compositor_do_manage (MetaCompositor *compositor, return FALSE; priv->plugin_mgr = meta_plugin_manager_new (compositor); + 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 ab7fce663..94d62c212 100644 --- a/src/compositor/meta-plugin-manager.c +++ b/src/compositor/meta-plugin-manager.c @@ -97,7 +97,6 @@ MetaPluginManager * meta_plugin_manager_new (MetaCompositor *compositor) { MetaPluginManager *plugin_mgr; - MetaPluginClass *klass; MetaPlugin *plugin; MetaMonitorManager *monitors; @@ -107,11 +106,6 @@ meta_plugin_manager_new (MetaCompositor *compositor) _meta_plugin_set_compositor (plugin, compositor); - klass = META_PLUGIN_GET_CLASS (plugin); - - if (klass->start) - klass->start (plugin); - monitors = meta_monitor_manager_get (); g_signal_connect (monitors, "confirm-display-change", G_CALLBACK (on_confirm_display_change), plugin_mgr); @@ -119,6 +113,16 @@ meta_plugin_manager_new (MetaCompositor *compositor) return plugin_mgr; } +void +meta_plugin_manager_start (MetaPluginManager *plugin_mgr) +{ + MetaPlugin *plugin = plugin_mgr->plugin; + MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); + + if (klass->start) + klass->start (plugin); +} + static void meta_plugin_manager_kill_window_effects (MetaPluginManager *plugin_mgr, MetaWindowActor *actor) diff --git a/src/compositor/meta-plugin-manager.h b/src/compositor/meta-plugin-manager.h index d1c007fa1..a5fe0315a 100644 --- a/src/compositor/meta-plugin-manager.h +++ b/src/compositor/meta-plugin-manager.h @@ -45,6 +45,8 @@ typedef struct MetaPluginManager MetaPluginManager; MetaPluginManager * meta_plugin_manager_new (MetaCompositor *compositor); +void meta_plugin_manager_start (MetaPluginManager *plugin_mgr); + META_EXPORT_TEST void meta_plugin_manager_load (const gchar *plugin_name);