Commit ce9455b5 authored by Olivier Fourdan's avatar Olivier Fourdan 🛠 Committed by Olivier Fourdan
Browse files

xwayland: Update screen pixmap on output resize

Running Xwayland non-rootless and resizing the output would lead to a
crash while trying to update the larger areas of the root window.

Make sure we resize the backing pixmap according to the new output size
to avoid the crash.
Signed-off-by: Olivier Fourdan's avatarOlivier Fourdan <>
Closes: xorg/xserver#834

Reviewed-by: Michel Dänzer's avatarMichel Dänzer <>
parent a530b6e8
......@@ -171,6 +171,40 @@ approximate_mmpd(struct xwl_screen *xwl_screen)
return 25.4 / DEFAULT_DPI;
static int
xwl_set_pixmap_visit_window(WindowPtr window, void *data)
ScreenPtr screen = window->drawable.pScreen;
if (screen->GetWindowPixmap(window) == data) {
screen->SetWindowPixmap(window, screen->GetScreenPixmap(screen));
static void
update_backing_pixmaps(struct xwl_screen *xwl_screen, int width, int height)
ScreenPtr pScreen = xwl_screen->screen;
WindowPtr pRoot = pScreen->root;
PixmapPtr old_pixmap, new_pixmap;
old_pixmap = pScreen->GetScreenPixmap(pScreen);
new_pixmap = pScreen->CreatePixmap(pScreen, width, height,
if (old_pixmap) {
TraverseTree(pRoot, xwl_set_pixmap_visit_window, old_pixmap);
pScreen->ResizeWindow(pRoot, 0, 0, width, height, NULL);
static void
update_screen_size(struct xwl_output *xwl_output, int width, int height)
......@@ -180,6 +214,9 @@ update_screen_size(struct xwl_output *xwl_output, int width, int height)
if (xwl_screen->root_clip_mode == ROOT_CLIP_FULL)
SetRootClip(xwl_screen->screen, ROOT_CLIP_NONE);
if (!xwl_screen->rootless && xwl_screen->screen->root)
update_backing_pixmaps (xwl_screen, width, height);
xwl_screen->width = width;
xwl_screen->height = height;
xwl_screen->screen->width = width;
Supports Markdown
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