diff options
author | Olivier Fourdan <fourdan@xfce.org> | 2020-11-01 21:23:18 +0100 |
---|---|---|
committer | Olivier Fourdan <fourdan@xfce.org> | 2020-11-01 21:23:18 +0100 |
commit | 50d34206fd3f01e71a16627821bbecc90c53a95e (patch) | |
tree | faa672483c8fbf0115ad47891548b3add0df4d13 | |
parent | ce66a699e6cbe670aae1c79a72b9ab14ce020d25 (diff) | |
download | xfwm4-50d34206fd3f01e71a16627821bbecc90c53a95e.tar.gz |
compositor: Damage opaque region if changed
When using multi buffers (Present, GLX), if the client updates its
opaque region in between (e.g. when resizing the window) we may cull out
regions on screen that won't get updated, leaving trails of unpainted
areas.
To avoid that, make sure we add damage for the delta in opaque region.
Signed-off-by: Olivier Fourdan <fourdan@xfce.org>
-rw-r--r-- | src/compositor.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/compositor.c b/src/compositor.c index 4e5fe5ed1..4c1785078 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -2971,6 +2971,7 @@ update_opaque_region (CWindow *cw, Window id) ScreenInfo *screen_info; XRectangle *rects = NULL; unsigned int nrects; + XserverRegion old_opaque_region; g_return_if_fail (cw != NULL); TRACE ("window 0x%lx", cw->id); @@ -2978,11 +2979,7 @@ update_opaque_region (CWindow *cw, Window id) screen_info = cw->screen_info; display_info = screen_info->display_info; - if (cw->opaque_region) - { - XFixesDestroyRegion (display_info->dpy, cw->opaque_region); - cw->opaque_region = None; - } + old_opaque_region = cw->opaque_region; nrects = getOpaqueRegionRects (display_info, id, &rects); if (nrects) @@ -2990,8 +2987,24 @@ update_opaque_region (CWindow *cw, Window id) cw->opaque_region = XFixesCreateRegion (display_info->dpy, rects, nrects); g_free (rects); } + else + { + cw->opaque_region = None; + } - damage_win (cw); + if (old_opaque_region) + { + if (cw->opaque_region) + { + XFixesSubtractRegion (display_info->dpy, old_opaque_region, + old_opaque_region, cw->opaque_region); + } + XFixesTranslateRegion (display_info->dpy, old_opaque_region, + cw->attr.x + cw->attr.border_width, + cw->attr.y + cw->attr.border_width); + /* old_opaque_region region will be destroyed by add_damage () */ + add_damage (screen_info, old_opaque_region); + } } static void |