Changes to the root background pixmap would previously cause the new image to flicker into visibility briefy before windows were redrawn over it. This was apparently caused by calling XClearWindow when the _XROOTPMAP_ID property on the root window changed.
This patch fixes this by dropping the XClearWindow call and providing
a new function ("damage_screen") to force a redraw of the entire screen.
Most programs that change the root window pixmap will call XClearWindow,
anyway, so xcompmgr doing the same is redundant. However, dropping
the call makes it possible to use the _XROOTPMAP_ID property of the root
window to pass new pixmaps to xcompmgr from another process. The other
process can then neglect to call XClearWindow, resulting in a
flicker-free change to the new background image.
Signed-off-by: Forest Bond <[email protected]>
---
xcompmgr.c | 27 +++++++++++++++++++++++----
1 files changed, 23 insertions(+), 4 deletions(-)
diff --git a/xcompmgr.c b/xcompmgr.c
index bd731f0..a345bbe 100644
--- a/xcompmgr.c
+++ b/xcompmgr.c
@@ -129,6 +129,7 @@ static int composite_event, composite_error;
static int render_event, render_error;
static Bool synchronize;
static int composite_opcode;
+static Bool screen_damaged = False;
/* find these once and be done with it */
static Atom opacityAtom;
@@ -945,7 +946,7 @@ paint_all (Display *dpy, XserverRegion region)
continue;
#endif
/* never painted, ignore it */
- if (!w->damaged)
+ if ((!screen_damaged) && (!w->damaged))
{
#if DEBUG_REPAINT
printf (" [not damaged: 0x%x]", w->id);
@@ -1128,6 +1129,7 @@ paint_all (Display *dpy, XserverRegion region)
XRenderComposite (dpy, PictOpSrc, rootBuffer, None, rootPicture,
0, 0, 0, 0, 0, 0, root_width, root_height);
}
+ screen_damaged = False;
}
static void
@@ -1776,6 +1778,22 @@ damage_win (Display *dpy, XDamageNotifyEvent *de)
repair_win (dpy, w);
}
+static void
+damage_screen (Display *dpy)
+{
+ XserverRegion region;
+ XRectangle r;
+
+ r.x = 0;
+ r.y = 0;
+ r.width = root_width;
+ r.height = root_height;
+
+ region = XFixesCreateRegion (dpy, &r, 1);
+ add_damage (dpy, region);
+ screen_damaged = True;
+}
+
static int
error (Display *dpy, XErrorEvent *ev)
{
@@ -2263,9 +2281,9 @@ main (int argc, char **argv)
{
if (rootTile)
{
- XClearArea (dpy, root, 0, 0, 0, 0, True);
XRenderFreePicture (dpy, rootTile);
rootTile = None;
+ damage_screen (dpy);
break;
}
}
@@ -2302,12 +2320,13 @@ main (int argc, char **argv)
} while (QLength (dpy));
if (allDamage && !autoRedirect)
{
- static int paint;
paint_all (dpy, allDamage);
- paint++;
XSync (dpy, False);
allDamage = None;
clipChanged = False;
}
}
+
+ XClearArea (dpy, root, 0, 0, 0, 0, True);
+ XSync (dpy, False);
}
--
1.7.0.4
signature.asc
Description: Digital signature
_______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
