[PATCH 04/11] mi: Drastically simplify miWindowExposures

Aaron Plattner aplattner at nvidia.com
Fri Sep 19 14:15:58 PDT 2014


On 09/18/2014 10:23 AM, Adam Jackson wrote:
> First, we drop the "spontaneous combustion" path.  In a composited
> environment you're never going to hit that anyway, and even in a classic
> environment it's so rare to hit as to not be worth it.  Second, we

You mean running xeyes over a backing store app isn't something everyone 
does all the time??

> delete the declaration of exposures, replace exposures with prgn
> to match, and then delete all the redundant conditionals.
>
> Suddenly this looks like a function a mortal could understand.
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
>   mi/miexpose.c | 53 +++++------------------------------------------------
>   1 file changed, 5 insertions(+), 48 deletions(-)
>
> diff --git a/mi/miexpose.c b/mi/miexpose.c
> index 23987fa..98112ab 100644
> --- a/mi/miexpose.c
> +++ b/mi/miexpose.c
> @@ -423,55 +423,12 @@ miSendExposures(WindowPtr pWin, RegionPtr pRgn, int dx, int dy)
>   void
>   miWindowExposures(WindowPtr pWin, RegionPtr prgn)
>   {
> -    RegionPtr exposures = prgn;
> -
> -    if ((prgn && !RegionNil(prgn)) || (exposures && !RegionNil(exposures))) {
> -        RegionRec expRec;
> -        int clientInterested;
> -
> -        /*
> -         * Restore from backing-store FIRST.
> -         */
> -        clientInterested =
> -            (pWin->eventMask | wOtherEventMasks(pWin)) & ExposureMask;
> -        if (clientInterested && exposures &&
> -            (RegionNumRects(exposures) > RECTLIMIT)) {
> -            /*
> -             * If we have LOTS of rectangles, we decide to take the extents
> -             * and force an exposure on that.  This should require much less
> -             * work overall, on both client and server.  This is cheating, but
> -             * isn't prohibited by the protocol ("spontaneous combustion" :-).
> -             */
> -            BoxRec box;
> -
> -            box = *RegionExtents(exposures);
> -            if (exposures == prgn) {
> -                exposures = &expRec;
> -                RegionInit(exposures, &box, 1);
> -                RegionReset(prgn, &box);
> -            }
> -            else {
> -                RegionReset(exposures, &box);
> -                RegionUnion(prgn, prgn, exposures);
> -            }
> -            /* miPaintWindow doesn't clip, so we have to */
> -            RegionIntersect(prgn, prgn, &pWin->clipList);
> -        }
> -        if (prgn && !RegionNil(prgn))
> -            miPaintWindow(pWin, prgn, PW_BACKGROUND);
> -        if (clientInterested && exposures && !RegionNil(exposures))
> -            miSendExposures(pWin, exposures,
> -                            pWin->drawable.x, pWin->drawable.y);
> -        if (exposures == &expRec) {
> -            RegionUninit(exposures);
> -        }
> -        else if (exposures && exposures != prgn)
> -            RegionDestroy(exposures);
> -        if (prgn)
> -            RegionEmpty(prgn);
> +    if (prgn && !RegionNil(prgn)) {
> +        miPaintWindow(pWin, prgn, PW_BACKGROUND);
> +        if ((pWin->eventMask | wOtherEventMasks(pWin)) & ExposureMask)
> +            miSendExposures(pWin, prgn, pWin->drawable.x, pWin->drawable.y);
> +        RegionEmpty(prgn);
>       }
> -    else if (exposures && exposures != prgn)
> -        RegionDestroy(exposures);
>   }
>
>   #ifdef ROOTLESS
>

Reviewed-by: Aaron Plattner <aplattner at nvidia.com>

-- 
Aaron


More information about the xorg-devel mailing list