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;