From ca082856adbb425be1c5ae97b6dea225f225bb60 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Thu, 9 Mar 2023 17:34:22 +0100 Subject: [PATCH] core: Retrieve DESKTOP_STARTUP_ID early on startup With the move away from GTK3, and the indirect dependency on GTK4 grown in the GNOME Shell side, we've indirectly gotten a small sneaky behavioral change: The GTK4 library will, right on dlopen, get DESKTOP_AUTOSTART_ID for itself and delete it from the environment. This happens before our own X11 session management code is initialized, which confuses the hell out of it, into thinking initialization is actually shutdown, gnome-session does not follow along with this request, which leaves GNOME Shell into a confused startup state where it never calls SmcSaveYourselfDone() and grinds startup to a halt until gnome-session decides to move things forward. In order to fix this, get the DESKTOP_AUTOSTART_ID before we lend control to GNOME Shell bits and GTK4 is possibly initialized, and feed it directly to our X11 session manager bits. --- src/core/meta-context-main.c | 11 +++++++++++ src/x11/session.c | 10 ---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/core/meta-context-main.c b/src/core/meta-context-main.c index 8fee10cd57..cc930116e4 100644 --- a/src/core/meta-context-main.c +++ b/src/core/meta-context-main.c @@ -289,6 +289,17 @@ meta_context_main_configure (MetaContext *context, meta_wayland_override_display_name (context_main->options.wayland_display); #endif + if (!context_main->options.sm.client_id) + { + const char *desktop_autostart_id; + + desktop_autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID"); + if (desktop_autostart_id) + context_main->options.sm.client_id = g_strdup (desktop_autostart_id); + } + + g_unsetenv ("DESKTOP_AUTOSTART_ID"); + return TRUE; } diff --git a/src/x11/session.c b/src/x11/session.c index 37dd633cb4..83ec3a94e5 100644 --- a/src/x11/session.c +++ b/src/x11/session.c @@ -280,16 +280,6 @@ meta_session_init (MetaContext *context, SmcCallbacks callbacks; char *saved_client_id; - if (!previous_client_id) - { - const char *desktop_autostart_id; - - desktop_autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID"); - if (desktop_autostart_id) - previous_client_id = desktop_autostart_id; - } - g_unsetenv ("DESKTOP_AUTOSTART_ID"); - meta_topic (META_DEBUG_SM, "Initializing session with save file '%s'", previous_save_file ? previous_save_file : "(none)"); -- GitLab