From b7a1159a1ecd08b5e6aa1279fea84accf846b411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= 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(-) Index: mutter-46.3/src/compositor/meta-compositor-x11.c =================================================================== --- mutter-46.3.orig/src/compositor/meta-compositor-x11.c +++ mutter-46.3/src/compositor/meta-compositor-x11.c @@ -188,6 +188,8 @@ meta_compositor_x11_manage (MetaComposit compositor_x11->have_x11_sync_object = meta_sync_ring_init (xdisplay); + meta_x11_display_redirect_windows (x11_display, display); + return TRUE; } Index: mutter-46.3/src/wayland/meta-xwayland.c =================================================================== --- mutter-46.3.orig/src/wayland/meta-xwayland.c +++ mutter-46.3/src/wayland/meta-xwayland.c @@ -1180,6 +1180,7 @@ on_x11_display_setup (MetaDisplay { 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); } Index: mutter-46.3/src/x11/meta-x11-display.c =================================================================== --- mutter-46.3.orig/src/x11/meta-x11-display.c +++ mutter-46.3/src/x11/meta-x11-display.c @@ -306,8 +306,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); - meta_x11_display_redirect_windows (x11_display, 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 Index: mutter-46.3/src/core/display.c =================================================================== --- mutter-46.3.orig/src/core/display.c +++ mutter-46.3/src/core/display.c @@ -908,9 +908,9 @@ meta_display_init_x11 (MetaDisplay } 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; @@ -941,9 +941,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; @@ -1032,7 +1029,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 */ @@ -1059,14 +1056,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); @@ -1087,30 +1076,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); Index: mutter-46.3/src/tests/x11-test.sh =================================================================== --- mutter-46.3.orig/src/tests/x11-test.sh +++ mutter-46.3/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