Commit 63346c74 authored by Carlos Garnacho's avatar Carlos Garnacho Committed by Olivier Fourdan
Browse files

xwayland: Handle the case of windows being realized before redirection

If Xwayland gets to realize a window meant for composition before the
compositor redirected windows (i.e. redirect mode is not RedirectDrawManual
yet), the window would stay "invisible" as we wouldn't create a
wl_surface/wl_shell_surface for it at any later point.

This scenario may happen if the wayland compositor sets up a X11 socket
upfront, but waits to raise Xwayland until there are X11 clients. In this
case the first data on the socket is the client's, the compositor can hardly
beat that in order to redirect subwindows before the client realizes a

In order to jump across this hurdle, allow the late creation of a matching
(shell) surface for the WindowPtr on SetWindowPixmapProc, so it is ensured
to be created after the compositor set up redirection.
Signed-off-by: Carlos Garnacho's avatarCarlos Garnacho <>
Reviewed-by: Michel Dänzer's avatarMichel Dänzer <>
Reviewed-by: default avatarOlivier Fourdan <>
(cherry picked from commit 78cc8b6f)
parent 12db645c
...@@ -699,6 +699,26 @@ xwl_save_screen(ScreenPtr pScreen, int on) ...@@ -699,6 +699,26 @@ xwl_save_screen(ScreenPtr pScreen, int on)
return TRUE; return TRUE;
} }
static void
xwl_set_window_pixmap(WindowPtr window,
PixmapPtr pixmap)
ScreenPtr screen = window->drawable.pScreen;
struct xwl_screen *xwl_screen;
xwl_screen = xwl_screen_get(screen);
screen->SetWindowPixmap = xwl_screen->SetWindowPixmap;
(*screen->SetWindowPixmap) (window, pixmap);
xwl_screen->SetWindowPixmap = screen->SetWindowPixmap;
screen->SetWindowPixmap = xwl_set_window_pixmap;
if (!RegionNotEmpty(&window->winSize))
static void static void
frame_callback(void *data, frame_callback(void *data,
struct wl_callback *callback, struct wl_callback *callback,
...@@ -1185,6 +1205,11 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) ...@@ -1185,6 +1205,11 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
xwl_screen->CloseScreen = pScreen->CloseScreen; xwl_screen->CloseScreen = pScreen->CloseScreen;
pScreen->CloseScreen = xwl_close_screen; pScreen->CloseScreen = xwl_close_screen;
if (xwl_screen->rootless) {
xwl_screen->SetWindowPixmap = pScreen->SetWindowPixmap;
pScreen->SetWindowPixmap = xwl_set_window_pixmap;
pScreen->CursorWarpedTo = xwl_cursor_warped_to; pScreen->CursorWarpedTo = xwl_cursor_warped_to;
pScreen->CursorConfinedTo = xwl_cursor_confined_to; pScreen->CursorConfinedTo = xwl_cursor_confined_to;
...@@ -133,6 +133,7 @@ struct xwl_screen { ...@@ -133,6 +133,7 @@ struct xwl_screen {
UnrealizeWindowProcPtr UnrealizeWindow; UnrealizeWindowProcPtr UnrealizeWindow;
DestroyWindowProcPtr DestroyWindow; DestroyWindowProcPtr DestroyWindow;
XYToWindowProcPtr XYToWindow; XYToWindowProcPtr XYToWindow;
SetWindowPixmapProcPtr SetWindowPixmap;
struct xorg_list output_list; struct xorg_list output_list;
struct xorg_list seat_list; struct xorg_list seat_list;
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment