Package: mutter Version: 45.2-2.1 Severity: normal
restarting gnome-shell x11 when a window is opened fails with: "another compositing window manager is already running on screen" Regression in restaring an x11 session https://gitlab.gnome.org/GNOME/mutter/-/issues/2873 The merge request https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3329 fixes this cras (though as I told in https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3329#note_1948823 Though I believe the initial code change that introduced this bug should be fixed too, code change in https://gitlab.gnome.org/GNOME/mutter/-/commit/761a254e6f8b8643ce6530e85daf041f25edc683 which moved the window redirection in a X11_DISPLAY_OPENED signal handler (signal that is emitted mulitple times including the one that bug on me, that is after plugin init). Though it could be this is already handled by the move of: meta_x11_display_redirect_windows from the meta-x11-display.c on_x11_display_opened to the on_x11_display_setup, leaving only meta_x11_display_redirect_windows in the X11_DISPLAY_OPENED handler introduced in commit 761a254e. Maybe leaving this call late after the plugin init is fine. I attach the MR I applied to test that this MR indeed fixes the restart issue. Cheers, Alban -- System Information: Debian Release: trixie/sid APT prefers testing-debug APT policy: (500, 'testing-debug'), (500, 'stable-debug'), (500, 'oldstable-debug'), (500, 'testing'), (500, 'stable'), (90, 'unstable-debug'), (90, 'unstable'), (1, 'experimental-debug'), (1, 'experimental') Architecture: amd64 (x86_64) Foreign Architectures: i386 Kernel: Linux 6.7.0-rc5+ (SMP w/4 CPU threads; PREEMPT) Locale: LANG=fr_FR.UTF-8, LC_CTYPE=fr_FR.UTF-8 (charmap=UTF-8), LANGUAGE not set Shell: /bin/sh linked to /usr/bin/dash Init: systemd (via /run/systemd/system) LSM: AppArmor: enabled Versions of packages mutter depends on: ii adwaita-icon-theme 45.0-2 ii gnome-settings-daemon-common 45.0-1 ii gsettings-desktop-schemas 45.0-2 ii libc6 2.37-12 ii libgles2 1.7.0-1 ii libglib2.0-0 2.78.3-1 ii libmutter-13-0 45.2-2.1 ii libwayland-client0 1.22.0-2.1 ii mutter-common 45.2-2.1 ii zenity 4.0.0-1 mutter recommends no packages. Versions of packages mutter suggests: ii gnome-control-center 1:45.2-1 ii xdg-user-dirs 0.18-1 -- no debconf information
>From b7a1159a1ecd08b5e6aa1279fea84accf846b411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jad...@gmail.com> Date: Fri, 20 Oct 2023 15:44:29 +0800 Subject: [PATCH 1/4] x11-display: Make subwindow redirection call mode specific This means that for X11 sessions we'll do it before any windows are mapped, and before any plugin implementation is started. Doing it before a plugin is started is important, because things that the plugin does during startup can have consequences on how compositing on Xorg works. For the Xwayland case, we'll do it relatively in the setup phase. It appears to have been harmless to do it later in the post-opened signal, but there is no harm in doing it as one of the earlier steps. Closes: https://gitlab.gnome.org/GNOME/mutter/-/issues/3089 --- src/compositor/meta-compositor-x11.c | 2 ++ src/wayland/meta-xwayland.c | 1 + src/x11/meta-x11-display.c | 1 - 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/compositor/meta-compositor-x11.c b/src/compositor/meta-compositor-x11.c index 1ad3327ddf6..ce7bc1945ce 100644 --- a/src/compositor/meta-compositor-x11.c +++ b/src/compositor/meta-compositor-x11.c @@ -188,6 +188,8 @@ meta_compositor_x11_manage (MetaCompositor *compositor, compositor_x11->have_x11_sync_object = meta_sync_ring_init (xdisplay); + meta_x11_display_redirect_windows (x11_display, display); + return TRUE; } diff --git a/src/wayland/meta-xwayland.c b/src/wayland/meta-xwayland.c index e95ca564010..83f2fcb25d9 100644 --- a/src/wayland/meta-xwayland.c +++ b/src/wayland/meta-xwayland.c @@ -1170,6 +1170,7 @@ on_x11_display_setup (MetaDisplay *display, { MetaX11Display *x11_display = meta_display_get_x11_display (display); + meta_x11_display_redirect_windows (x11_display, display); meta_xwayland_init_dnd (x11_display); meta_xwayland_init_xrandr (manager, x11_display); } diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index 4e98203dd25..c634a71fb2a 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -301,7 +301,6 @@ on_x11_display_opened (MetaX11Display *x11_display, MetaDisplay *display) { meta_display_manage_all_xwindows (display); - meta_x11_display_redirect_windows (x11_display, display); } static void -- GitLab >From 77fc07943c3171a5e7a047ca34af46feeca347c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jad...@gmail.com> Date: Fri, 20 Oct 2023 17:03:31 +0800 Subject: [PATCH 2/4] display: Move X11 initial focus handling to MetaX11Display It's X11 specific, so put it in the X11 display manager object. --- src/core/display.c | 34 ---------------------------------- src/x11/meta-x11-display.c | 25 +++++++++++++++++++++++++ 2 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/core/display.c b/src/core/display.c index 0a191c0fbca..b16e50e21de 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -930,9 +930,6 @@ meta_display_new (MetaContext *context, MetaDisplay *display; MetaDisplayPrivate *priv; guint32 timestamp; -#ifdef HAVE_X11_CLIENT - Window old_active_xwindow = None; -#endif MetaMonitorManager *monitor_manager; MetaSettings *settings; MetaInputCapture *input_capture; @@ -1048,14 +1045,6 @@ meta_display_new (MetaContext *context, display->last_focus_time = timestamp; display->last_user_time = timestamp; -#ifdef HAVE_X11 - if (!meta_is_wayland_compositor ()) - meta_prop_get_window (display->x11_display, - display->x11_display->xroot, - display->x11_display->atom__NET_ACTIVE_WINDOW, - &old_active_xwindow); -#endif - if (!meta_compositor_manage (display->compositor, error)) { g_object_unref (display); @@ -1076,30 +1065,7 @@ meta_display_new (MetaContext *context, g_signal_connect (display->gesture_tracker, "state-changed", G_CALLBACK (gesture_tracker_state_changed), display); - /* We know that if mutter is running as a Wayland compositor, - * we start out with no windows. - */ -#ifdef HAVE_X11_CLIENT - if (!meta_is_wayland_compositor ()) - meta_display_manage_all_xwindows (display); - - if (old_active_xwindow != None) - { - MetaWindow *old_active_window; - old_active_window = meta_x11_display_lookup_x_window (display->x11_display, - old_active_xwindow); - if (old_active_window) - meta_window_focus (old_active_window, timestamp); - else - meta_display_unset_input_focus (display, timestamp); - } - else - { - meta_display_unset_input_focus (display, timestamp); - } -#else meta_display_unset_input_focus (display, timestamp); -#endif g_signal_connect (stage, "notify::is-grabbed", G_CALLBACK (on_is_grabbed_changed), display); diff --git a/src/x11/meta-x11-display.c b/src/x11/meta-x11-display.c index c634a71fb2a..599968a363b 100644 --- a/src/x11/meta-x11-display.c +++ b/src/x11/meta-x11-display.c @@ -300,7 +300,32 @@ static void on_x11_display_opened (MetaX11Display *x11_display, MetaDisplay *display) { + Window old_active_xwindow = None; + + if (!meta_is_wayland_compositor ()) + { + meta_prop_get_window (display->x11_display, + display->x11_display->xroot, + display->x11_display->atom__NET_ACTIVE_WINDOW, + &old_active_xwindow); + } + meta_display_manage_all_xwindows (display); + + if (old_active_xwindow != None) + { + MetaWindow *old_active_window; + + old_active_window = meta_x11_display_lookup_x_window (x11_display, + old_active_xwindow); + if (old_active_window) + { + uint32_t timestamp; + + timestamp = display->x11_display->timestamp; + meta_window_focus (old_active_window, timestamp); + } + } } static void -- GitLab >From 668eb0d198dba58c7833b09926dce2f043889155 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jad...@gmail.com> Date: Tue, 17 Oct 2023 15:46:00 +0800 Subject: [PATCH 3/4] tests/x11: Fix replace test to catch the second instance failing The test never noticed that the second instance never actually managed to load; it was looping a multi second retry session trying to redirect windows, meaning it failed to catch https://gitlab.gnome.org/GNOME/mutter/-/issues/3089. Fix the test so that it always waits for mutter to finish loading successfully, just like it waits fro the first. --- src/tests/x11-test.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tests/x11-test.sh b/src/tests/x11-test.sh index 59e460fc336..d95b2460f6e 100755 --- a/src/tests/x11-test.sh +++ b/src/tests/x11-test.sh @@ -34,6 +34,9 @@ echo \# Launched with pid $MUTTER2_PID MUTTER2_PID=$! wait $MUTTER1_PID +echo \# Waiting for the second mutter to finish loading +gdbus wait --session org.gnome.Mutter.IdleMonitor + sleep 2 echo \# Terminating clients > /dev/stderr -- GitLab >From 8e6f18fcaf63968b0a75bf65da0c00473d71acb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jad...@gmail.com> Date: Mon, 23 Oct 2023 14:47:33 +0800 Subject: [PATCH 4/4] display: Rename mandatory X11 initialization function Simply to make it clear that the renamed function is specific to a particular X11 initialization mode (mandatory Xwayland), put that in the name, so that it's easier to understand when this function is relevant. --- src/core/display.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/display.c b/src/core/display.c index b16e50e21de..f851f1be372 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -897,9 +897,9 @@ meta_display_init_x11 (MetaDisplay *display, } static void -on_x11_initialized (MetaDisplay *display, - GAsyncResult *result, - gpointer user_data) +on_mandatory_x11_initialized (MetaDisplay *display, + GAsyncResult *result, + gpointer user_data) { g_autoptr (GError) error = NULL; @@ -1018,7 +1018,7 @@ meta_display_new (MetaContext *context, if (x11_display_policy == META_X11_DISPLAY_POLICY_MANDATORY) { meta_display_init_x11 (display, NULL, - (GAsyncReadyCallback) on_x11_initialized, + (GAsyncReadyCallback) on_mandatory_x11_initialized, NULL); } #endif /* HAVE_XWAYLAND */ -- GitLab