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: <https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1570>
This commit is contained in:
		
							parent
							
								
									ed575eee81
								
							
						
					
					
						commit
						e1b8a12194
					
				| 
						 | 
					@ -1297,9 +1297,12 @@ xwl_present_maybe_redirect_window(WindowPtr window)
 | 
				
			||||||
        return FALSE;
 | 
					        return FALSE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    xwl_present_window->redirected = TRUE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xwl_window_update_surface_window(xwl_window);
 | 
					    xwl_window_update_surface_window(xwl_window);
 | 
				
			||||||
    if (xwl_window->surface_window != window) {
 | 
					    if (xwl_window->surface_window != window) {
 | 
				
			||||||
        compUnredirectWindow(serverClient, window, CompositeRedirectManual);
 | 
					        compUnredirectWindow(serverClient, window, CompositeRedirectManual);
 | 
				
			||||||
 | 
					        xwl_present_window->redirected = FALSE;
 | 
				
			||||||
        xwl_present_window->redirect_failed = TRUE;
 | 
					        xwl_present_window->redirect_failed = TRUE;
 | 
				
			||||||
        return FALSE;
 | 
					        return FALSE;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -1307,7 +1310,6 @@ xwl_present_maybe_redirect_window(WindowPtr window)
 | 
				
			||||||
    if (!xwl_window->surface_window_damage)
 | 
					    if (!xwl_window->surface_window_damage)
 | 
				
			||||||
        xwl_window->surface_window_damage = RegionCreate(NullBox, 1);
 | 
					        xwl_window->surface_window_damage = RegionCreate(NullBox, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    xwl_present_window->redirected = TRUE;
 | 
					 | 
				
			||||||
    return TRUE;
 | 
					    return TRUE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1344,6 +1346,14 @@ xwl_present_maybe_unredirect_window(WindowPtr window)
 | 
				
			||||||
    return TRUE;
 | 
					    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
 | 
					Bool
 | 
				
			||||||
xwl_present_init(ScreenPtr screen)
 | 
					xwl_present_init(ScreenPtr screen)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -83,5 +83,6 @@ void xwl_present_cleanup(WindowPtr window);
 | 
				
			||||||
void xwl_present_unrealize_window(struct xwl_present_window *xwl_present_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_redirect_window(WindowPtr window);
 | 
				
			||||||
Bool xwl_present_maybe_unredirect_window(WindowPtr window);
 | 
					Bool xwl_present_maybe_unredirect_window(WindowPtr window);
 | 
				
			||||||
 | 
					Bool xwl_present_window_redirected(WindowPtr window);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* XWAYLAND_PRESENT_H */
 | 
					#endif /* XWAYLAND_PRESENT_H */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1370,7 +1370,8 @@ xwl_window_update_surface_window(struct xwl_window *xwl_window)
 | 
				
			||||||
        if (window->drawable.depth == 32)
 | 
					        if (window->drawable.depth == 32)
 | 
				
			||||||
            continue;
 | 
					            continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (window->redirectDraw == RedirectDrawManual)
 | 
					        if (window->redirectDraw == RedirectDrawManual &&
 | 
				
			||||||
 | 
					            !xwl_present_window_redirected(window))
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        surface_window = window;
 | 
					        surface_window = window;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue