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

Reply via email to