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 <ofourdan@redhat.com>
Closes: https://gitlab.freedesktop.org/xorg/xserver/issues/834
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
(cherry picked from commit ce9455b5ee
)
This commit is contained in:
parent
1804e73271
commit
44c693f45d
|
@ -171,6 +171,40 @@ approximate_mmpd(struct xwl_screen *xwl_screen)
|
||||||
return 25.4 / DEFAULT_DPI;
|
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));
|
||||||
|
return WT_WALKCHILDREN;
|
||||||
|
}
|
||||||
|
|
||||||
|
return WT_DONTWALKCHILDREN;
|
||||||
|
}
|
||||||
|
|
||||||
|
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,
|
||||||
|
pScreen->rootDepth,
|
||||||
|
CREATE_PIXMAP_USAGE_BACKING_PIXMAP);
|
||||||
|
pScreen->SetScreenPixmap(new_pixmap);
|
||||||
|
|
||||||
|
if (old_pixmap) {
|
||||||
|
TraverseTree(pRoot, xwl_set_pixmap_visit_window, old_pixmap);
|
||||||
|
pScreen->DestroyPixmap(old_pixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
pScreen->ResizeWindow(pRoot, 0, 0, width, height, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_screen_size(struct xwl_output *xwl_output, int width, int height)
|
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)
|
if (xwl_screen->root_clip_mode == ROOT_CLIP_FULL)
|
||||||
SetRootClip(xwl_screen->screen, ROOT_CLIP_NONE);
|
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->width = width;
|
||||||
xwl_screen->height = height;
|
xwl_screen->height = height;
|
||||||
xwl_screen->screen->width = width;
|
xwl_screen->screen->width = width;
|
||||||
|
|
Loading…
Reference in New Issue