From e1b8a12194e46be5412b007812dfdb0f3e108e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michel=20D=C3=A4nzer?= Date: Mon, 17 Jun 2024 17:35:53 +0200 Subject: [PATCH] xwayland: Only ignore manual redirection by clients for surface window If the manual redirection was done by xwl_present_maybe_redirect_window, we are in control. This allows xwl_present_maybe_redirect_window to work as intended again. Previously, xwl_window_update_surface_window would ignore the window redirected by xwl_present_maybe_redirect_window, which would result in xwl_present_maybe_redirect_window undoing the redirection and bailing. Part-of: --- hw/xwayland/xwayland-present.c | 12 +++++++++++- hw/xwayland/xwayland-present.h | 1 + hw/xwayland/xwayland-window.c | 3 ++- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c index 1e66f586c..b52c6896a 100644 --- a/hw/xwayland/xwayland-present.c +++ b/hw/xwayland/xwayland-present.c @@ -1297,9 +1297,12 @@ xwl_present_maybe_redirect_window(WindowPtr window) return FALSE; } + xwl_present_window->redirected = TRUE; + xwl_window_update_surface_window(xwl_window); if (xwl_window->surface_window != window) { compUnredirectWindow(serverClient, window, CompositeRedirectManual); + xwl_present_window->redirected = FALSE; xwl_present_window->redirect_failed = TRUE; return FALSE; } @@ -1307,7 +1310,6 @@ xwl_present_maybe_redirect_window(WindowPtr window) if (!xwl_window->surface_window_damage) xwl_window->surface_window_damage = RegionCreate(NullBox, 1); - xwl_present_window->redirected = TRUE; return TRUE; } @@ -1344,6 +1346,14 @@ xwl_present_maybe_unredirect_window(WindowPtr window) return TRUE; } +Bool +xwl_present_window_redirected(WindowPtr window) +{ + struct xwl_present_window *xwl_present_window = xwl_present_window_get_priv(window); + + return xwl_present_window->redirected; +} + Bool xwl_present_init(ScreenPtr screen) { diff --git a/hw/xwayland/xwayland-present.h b/hw/xwayland/xwayland-present.h index d399914d9..527233910 100644 --- a/hw/xwayland/xwayland-present.h +++ b/hw/xwayland/xwayland-present.h @@ -83,5 +83,6 @@ void xwl_present_cleanup(WindowPtr window); void xwl_present_unrealize_window(struct xwl_present_window *xwl_present_window); Bool xwl_present_maybe_redirect_window(WindowPtr window); Bool xwl_present_maybe_unredirect_window(WindowPtr window); +Bool xwl_present_window_redirected(WindowPtr window); #endif /* XWAYLAND_PRESENT_H */ diff --git a/hw/xwayland/xwayland-window.c b/hw/xwayland/xwayland-window.c index 05fdd5b4e..12bb3009c 100644 --- a/hw/xwayland/xwayland-window.c +++ b/hw/xwayland/xwayland-window.c @@ -1370,7 +1370,8 @@ xwl_window_update_surface_window(struct xwl_window *xwl_window) if (window->drawable.depth == 32) continue; - if (window->redirectDraw == RedirectDrawManual) + if (window->redirectDraw == RedirectDrawManual && + !xwl_present_window_redirected(window)) break; surface_window = window;