[PATCH 2/3] xcompmgr: prevent flicker on root background pixmap change
Forest Bond
forest at alittletooquiet.net
Sat Jun 12 16:28:55 PDT 2010
Hi,
Please disregard this patch. I will resend with adjustments tomorrow. Sorry
for the noise.
Thanks,
Forest
On Sat, Jun 12, 2010 at 06:39:47PM -0400, Forest Bond wrote:
> Changes to the root background pixmap would previously cause the new
> image to flicker into visibility briefy before windows were redrawn
> over it. This patch fixes this by dropping a XClearWindow call and
> providing a new function ("damage_screen") to force a redraw of the
> entire screen.
>
> Signed-off-by: Forest Bond <forest at alittletooquiet.net>
> ---
> xcompmgr.c | 28 ++++++++++++++++++++++++----
> 1 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/xcompmgr.c b/xcompmgr.c
> index 3a01cce..47f5667 100644
> --- a/xcompmgr.c
> +++ b/xcompmgr.c
> @@ -128,6 +128,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;
> @@ -947,7 +948,7 @@ paint_all (Display *dpy, XserverRegion region)
> continue;
> #endif
> /* never painted, ignore it */
> - if (!w->damaged)
> + if ((!screen_damaged) && (!w->damaged))
> continue;
> /* if invisible, ignore it */
> if (w->a.x + w->a.width < 1 || w->a.y + w->a.height < 1
> @@ -1120,6 +1121,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
> @@ -1738,6 +1740,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)
> {
> @@ -2193,9 +2211,10 @@ main (int argc, char **argv)
> {
> if (rootTile)
> {
> - XClearArea (dpy, root, 0, 0, 0, 0, True);
> XRenderFreePicture (dpy, rootTile);
> rootTile = None;
> +
> + damage_screen(dpy);
> break;
> }
> }
> @@ -2232,12 +2251,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
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.x.org/archives/xorg-devel/attachments/20100612/06111fc8/attachment-0001.pgp>
More information about the xorg-devel
mailing list