From 967d9f32eaadb64961ec6638cc478ca3403b0329 Mon Sep 17 00:00:00 2001 From: Yuxuan Shui Date: Sun, 9 Sep 2018 02:25:47 +0100 Subject: [PATCH] Workaround for what seems to be a race in Xserver There seems to be a race between DamageAdd (what the client uses to report damage to Xserver) and DamageSubtract (what compton uses to clear the reported damage, so it can receive new ones). I am not sure how to confirm this. But this (terrible) workaround seems to solve this problem. --- src/compton.c | 8 ++------ src/win.c | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/compton.c b/src/compton.c index d6e7cd1..61ff40b 100644 --- a/src/compton.c +++ b/src/compton.c @@ -2089,7 +2089,7 @@ paint_all(session_t *ps, XserverRegion region, XserverRegion region_real, win *t } static void -repair_win(session_t *ps, win *w) { +repair_win(session_t *ps, win *w, XDamageNotifyEvent *de) { if (IsViewable != w->a.map_state) return; @@ -2097,12 +2097,8 @@ repair_win(session_t *ps, win *w) { if (!w->ever_damaged) { parts = win_extents(ps, w); - set_ignore_next(ps); - XDamageSubtract(ps->dpy, w->damage, None, None); } else { - parts = XFixesCreateRegion(ps->dpy, 0, 0); - set_ignore_next(ps); - XDamageSubtract(ps->dpy, w->damage, None, parts); + parts = XFixesCreateRegion(ps->dpy, (XRectangle[]){de->area}, 1); XFixesTranslateRegion(ps->dpy, parts, w->a.x + w->a.border_width, w->a.y + w->a.border_width); diff --git a/src/win.c b/src/win.c index 59ebee5..54871e4 100644 --- a/src/win.c +++ b/src/win.c @@ -878,7 +878,7 @@ bool add_win(session_t *ps, Window id, Window prev) { // Create Damage for window set_ignore_next(ps); - new->damage = XDamageCreate(ps->dpy, id, XDamageReportNonEmpty); + new->damage = XDamageCreate(ps->dpy, id, XDamageReportRawRectangles); } calc_win_size(ps, new);