summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <fourdan@xfce.org>2020-11-01 21:23:18 +0100
committerOlivier Fourdan <fourdan@xfce.org>2020-11-01 21:23:18 +0100
commit50d34206fd3f01e71a16627821bbecc90c53a95e (patch)
treefaa672483c8fbf0115ad47891548b3add0df4d13
parentce66a699e6cbe670aae1c79a72b9ab14ce020d25 (diff)
downloadxfwm4-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.c25
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