[PATCH xserver] composite: Update borderClip in compAllocPixmap()

Clemens Eisserer linuxhippy at gmail.com
Tue Oct 18 01:07:29 PDT 2011


Thanks a lot for fixing this bug :)

- Clemens

2011/10/9 Ville Syrjala <syrjala at sci.fi>:
> Previously the parent constrained borderClip was copied over
> when compRedirectWindow() is called. That is insufficient eg. in
> case the window was already redirected, but not yet realized. So
> copy the borderClip over in compAllocPixmap() instead.
>
> Example:
> Window 1 is below an automatically redirect window 2. Window 2 is
> unmapped and moved outside the extents of window 1. Window 2 is
> then mapped again, and MarkOverlappedWindows() uses the up to
> date borderSize of window 2 to mark windows, which leaves
> window 1 unmarked. Then exposures are calculated using the stale
> borderClip of window 2, which causes the window below window 2,
> to be exposed through an apparent hole in window 1.
>
> Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=22566
>
> Signed-off-by: Ville Syrjala <syrjala at sci.fi>
> ---
>  composite/compalloc.c |   11 +++++++----
>  1 files changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/composite/compalloc.c b/composite/compalloc.c
> index f00bf4e..9857a92 100644
> --- a/composite/compalloc.c
> +++ b/composite/compalloc.c
> @@ -196,11 +196,7 @@ compRedirectWindow (ClientPtr pClient, WindowPtr pWin, int update)
>
>        anyMarked = compMarkWindows (pWin, &pLayerWin);
>
> -       /* Make sure our borderClip is correct for ValidateTree */
>        RegionNull(&cw->borderClip);
> -       RegionCopy(&cw->borderClip, &pWin->borderClip);
> -       cw->borderClipX = pWin->drawable.x;
> -       cw->borderClipY = pWin->drawable.y;
>        cw->update = CompositeRedirectAutomatic;
>        cw->clients = 0;
>        cw->oldx = COMP_ORIGIN_INVALID;
> @@ -658,6 +654,13 @@ compAllocPixmap (WindowPtr pWin)
>        DamageRegister (&pWin->drawable, cw->damage);
>        cw->damageRegistered = TRUE;
>     }
> +
> +    /* Make sure our borderClip is up to date */
> +    RegionUninit(&cw->borderClip);
> +    RegionCopy(&cw->borderClip, &pWin->borderClip);
> +    cw->borderClipX = pWin->drawable.x;
> +    cw->borderClipY = pWin->drawable.y;
> +
>     return TRUE;
>  }
>
> --
> 1.7.3.4
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>



More information about the xorg mailing list