diff options
Diffstat (limited to 'mi/mivaltree.c')
-rw-r--r-- | mi/mivaltree.c | 124 |
1 files changed, 89 insertions, 35 deletions
diff --git a/mi/mivaltree.c b/mi/mivaltree.c index 26819ee45..eb1e01e60 100644 --- a/mi/mivaltree.c +++ b/mi/mivaltree.c @@ -51,6 +51,30 @@ in this Software without prior written authorization from The Open Group. * ******************************************************************/ +/* The panoramix components contained the following notice */ +/**************************************************************** +* * +* Copyright (c) Digital Equipment Corporation, 1991, 1997 * +* * +* All Rights Reserved. Unpublished rights reserved under * +* the copyright laws of the United States. * +* * +* The software contained on this media is proprietary to * +* and embodies the confidential technology of Digital * +* Equipment Corporation. Possession, use, duplication or * +* dissemination of the software and media is authorized only * +* pursuant to a valid written license from Digital Equipment * +* Corporation. * +* * +* RESTRICTED RIGHTS LEGEND Use, duplication, or disclosure * +* by the U.S. Government is subject to restrictions as set * +* forth in Subparagraph (c)(1)(ii) of DFARS 252.227-7013, * +* or in FAR 52.227-19, as applicable. * +* * +*****************************************************************/ + +/* $XFree86: xc/programs/Xserver/mi/mivaltree.c,v 1.9 2001/12/14 20:00:27 dawes Exp $ */ + /* * Aug '86: Susan Angebranndt -- original code * July '87: Adam de Boor -- substantially modified and commented @@ -60,7 +84,6 @@ in this Software without prior written authorization from The Open Group. * Bob Scheifler -- avoid miComputeClips for unmapped windows, * valdata changes */ - #include "X.h" #include "scrnintstr.h" #include "validate.h" @@ -69,10 +92,13 @@ in this Software without prior written authorization from The Open Group. #include "regionstr.h" #include "mivalidate.h" +#include "globals.h" + #ifdef SHAPE /* * Compute the visibility of a shaped window */ +int miShapedWindowIn (pScreen, universe, bounding, rect, x, y) ScreenPtr pScreen; RegionPtr universe, bounding; @@ -137,7 +163,8 @@ miShapedWindowIn (pScreen, universe, bounding, rect, x, y) HasBorder(w) && \ (w)->backgroundState == ParentRelative) -/*- + +/* *----------------------------------------------------------------------- * miComputeClips -- * Recompute the clipList, borderClip, exposed and borderExposed @@ -153,14 +180,13 @@ miShapedWindowIn (pScreen, universe, bounding, rect, x, y) * *----------------------------------------------------------------------- */ - static void -miComputeClips (pParent, pScreen, universe, kind, exposed) - register WindowPtr pParent; - register ScreenPtr pScreen; - register RegionPtr universe; - VTKind kind; - RegionPtr exposed; /* for intermediate calculations */ +miComputeClips ( + register WindowPtr pParent, + register ScreenPtr pScreen, + register RegionPtr universe, + VTKind kind, + RegionPtr exposed ) /* for intermediate calculations */ { int dx, dy; @@ -172,7 +198,6 @@ miComputeClips (pParent, pScreen, universe, kind, exposed) Bool overlap; RegionPtr borderVisible; Bool resized; - /* * Figure out the new visibility of this window. * The extent of the universe should be the same as the extent of @@ -181,7 +206,6 @@ miComputeClips (pParent, pScreen, universe, kind, exposed) * completely). If the window is completely obscured, none of the * universe will cover the rectangle. */ - borderSize.x1 = pParent->drawable.x - wBorderWidth(pParent); borderSize.y1 = pParent->drawable.y - wBorderWidth(pParent); dx = (int) pParent->drawable.x + (int) pParent->drawable.width + wBorderWidth(pParent); @@ -311,6 +335,10 @@ miComputeClips (pParent, pScreen, universe, kind, exposed) REGION_TRANSLATE( pScreen, &pParent->clipList, dx, dy); } break; + case VTBroken: + REGION_EMPTY (pScreen, &pParent->borderClip); + REGION_EMPTY (pScreen, &pParent->clipList); + break; } borderVisible = pParent->valdata->before.borderVisible; @@ -476,8 +504,8 @@ miComputeClips (pParent, pScreen, universe, kind, exposed) } static void -miTreeObscured(pParent) - register WindowPtr pParent; +miTreeObscured( + register WindowPtr pParent ) { register WindowPtr pChild; register int oldVis; @@ -505,7 +533,7 @@ miTreeObscured(pParent) } } -/*- +/* *----------------------------------------------------------------------- * miValidateTree -- * Recomputes the clip list for pParent and all its inferiors. @@ -572,39 +600,65 @@ miValidateTree (pParent, pChild, kind) */ REGION_INIT(pScreen, &totalClip, NullBox, 0); viewvals = 0; - if ((pChild->drawable.y < pParent->lastChild->drawable.y) || - ((pChild->drawable.y == pParent->lastChild->drawable.y) && - (pChild->drawable.x < pParent->lastChild->drawable.x))) + if (REGION_BROKEN (pScreen, &pParent->clipList) && + !REGION_BROKEN (pScreen, &pParent->borderClip)) { + kind = VTBroken; + /* + * When rebuilding clip lists after out of memory, + * assume everything is busted. + */ forward = TRUE; + REGION_COPY (pScreen, &totalClip, &pParent->borderClip); + REGION_INTERSECT (pScreen, &totalClip, &totalClip, &pParent->winSize); + + for (pWin = pParent->firstChild; pWin != pChild; pWin = pWin->nextSib) + { + if (pWin->viewable) + REGION_SUBTRACT (pScreen, &totalClip, &totalClip, &pWin->borderSize); + } for (pWin = pChild; pWin; pWin = pWin->nextSib) + if (pWin->valdata && pWin->viewable) + viewvals++; + + REGION_EMPTY (pScreen, &pParent->clipList); + } + else + { + if ((pChild->drawable.y < pParent->lastChild->drawable.y) || + ((pChild->drawable.y == pParent->lastChild->drawable.y) && + (pChild->drawable.x < pParent->lastChild->drawable.x))) { - if (pWin->valdata) + forward = TRUE; + for (pWin = pChild; pWin; pWin = pWin->nextSib) { - REGION_APPEND( pScreen, &totalClip, &pWin->borderClip); - if (pWin->viewable) - viewvals++; + if (pWin->valdata) + { + REGION_APPEND( pScreen, &totalClip, &pWin->borderClip); + if (pWin->viewable) + viewvals++; + } } } - } - else - { - forward = FALSE; - pWin = pParent->lastChild; - while (1) + else { - if (pWin->valdata) + forward = FALSE; + pWin = pParent->lastChild; + while (1) { - REGION_APPEND( pScreen, &totalClip, &pWin->borderClip); - if (pWin->viewable) - viewvals++; + if (pWin->valdata) + { + REGION_APPEND( pScreen, &totalClip, &pWin->borderClip); + if (pWin->viewable) + viewvals++; + } + if (pWin == pChild) + break; + pWin = pWin->prevSib; } - if (pWin == pChild) - break; - pWin = pWin->prevSib; } + REGION_VALIDATE( pScreen, &totalClip, &overlap); } - REGION_VALIDATE( pScreen, &totalClip, &overlap); /* * Now go through the children of the root and figure their new |