Annotation of researchv9/X11/src/X.V11R1/server/dix/window.c, revision 1.1.1.1

1.1       root        1: /***********************************************************
                      2: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
                      3: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
                      4: 
                      5:                         All Rights Reserved
                      6: 
                      7: Permission to use, copy, modify, and distribute this software and its 
                      8: documentation for any purpose and without fee is hereby granted, 
                      9: provided that the above copyright notice appear in all copies and that
                     10: both that copyright notice and this permission notice appear in 
                     11: supporting documentation, and that the names of Digital or MIT not be
                     12: used in advertising or publicity pertaining to distribution of the
                     13: software without specific, written prior permission.  
                     14: 
                     15: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     16: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     17: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     18: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     19: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     20: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     21: SOFTWARE.
                     22: 
                     23: ******************************************************************/
                     24: 
                     25: /* $Header: window.c,v 1.170 87/09/07 18:56:00 rws Exp $ */
                     26: 
                     27: #include "X.h"
                     28: #define NEED_REPLIES
                     29: #define NEED_EVENTS
                     30: #include "Xproto.h"
                     31: #include "misc.h"
                     32: #include "scrnintstr.h"
                     33: #include "os.h"
                     34: #include "regionstr.h"
                     35: #include "windowstr.h"
                     36: #include "input.h"
                     37: #include "resource.h"
                     38: #include "colormapst.h"
                     39: #include "cursorstr.h"
                     40: #include "dixstruct.h"
                     41: #include "gcstruct.h"
                     42: #include "servermd.h"
                     43: 
                     44: /******
                     45:  * Window stuff for server 
                     46:  *
                     47:  *    CreateRootWindow, CreateWindow, ChangeWindowAttributes,
                     48:  *    GetWindowAttributes, DeleteWindow, DestroySubWindows,
                     49:  *    HandleSaveSet, ReparentWindow, MapWindow, MapSubWindows,
                     50:  *    UnmapWindow, UnmapSubWindows, ConfigureWindow, CirculateWindow,
                     51:  *
                     52:  ******/
                     53: 
                     54: static long _back[16] = {0x88888888, 0x22222222, 0x44444444, 0x11111111,
                     55:                         0x88888888, 0x22222222, 0x44444444, 0x11111111,
                     56:                         0x88888888, 0x22222222, 0x44444444, 0x11111111,
                     57:                         0x88888888, 0x22222222, 0x44444444, 0x11111111};
                     58: 
                     59: typedef struct _ScreenSaverStuff {
                     60:     WindowPtr pWindow;
                     61:     XID       wid;
                     62:     XID       cid;
                     63:     BYTE      blanked;
                     64: } ScreenSaverStuffRec;
                     65: 
                     66: #define SCREEN_IS_BLANKED   0
                     67: #define SCREEN_IS_TILED     1
                     68: #define SCREEN_ISNT_SAVED   2
                     69: 
                     70: #define DONT_USE_GRAVITY 0
                     71: #define USE_GRAVITY   1
                     72: 
                     73: extern int ScreenSaverBlanking, ScreenSaverAllowExposures;
                     74: int screenIsSaved = FALSE;
                     75: 
                     76: static ScreenSaverStuffRec savedScreenInfo[MAXSCREENS];
                     77: 
                     78: extern WindowRec WindowTable[];
                     79: extern void (* ReplySwapVector[256]) ();
                     80: 
                     81: static void ResizeChildrenWinSize();
                     82: 
                     83: #define INPUTONLY_LEGAL_MASK (CWWinGravity | CWEventMask | \
                     84:                              CWDontPropagate | CWOverrideRedirect | CWCursor )
                     85: 
                     86: /******
                     87:  * PrintWindowTree
                     88:  *    For debugging only
                     89:  ******/
                     90: 
                     91: int
                     92: PrintChildren(p1, indent)
                     93:     WindowPtr p1;
                     94:     int indent;
                     95: {
                     96:     WindowPtr p2;
                     97:     int i;
                     98:  
                     99:     while (p1) 
                    100:     {
                    101:         p2 = p1->firstChild;
                    102:         for (i=0; i<indent; i++) ErrorF( " ");
                    103:        ErrorF( "%x\n", p1->wid);
                    104:         miprintRects(p1->clipList); 
                    105:        PrintChildren(p2, indent+4);
                    106:        p1 = p1->nextSib;
                    107:     }
                    108: }
                    109: 
                    110: PrintWindowTree()          
                    111: {
                    112:     int i;
                    113:     WindowPtr pWin, p1;
                    114: 
                    115:     for (i=0; i<screenInfo.numScreens; i++)
                    116:     {
                    117:        ErrorF( "WINDOW %d\n", i);
                    118:        pWin = &WindowTable[i];
                    119:         miprintRects(pWin->clipList); 
                    120:        p1 = pWin->firstChild;
                    121:        PrintChildren(p1, 4);
                    122:     }
                    123: }
                    124: 
                    125: 
                    126: /*****
                    127:  * WalkTree
                    128:  *   Walk the window tree, for SCREEN, preforming FUNC(pWin, data) on
                    129:  *   each window.  If FUNC returns WT_WALKCHILDREN, traverse the children,
                    130:  *   if it returns WT_DONTWALKCHILDREN, dont.  If it returns WT_STOPWALKING
                    131:  *   exit WalkTree.  Does depth-first traverse.
                    132:  *****/
                    133: 
                    134: int
                    135: TraverseTree(pWin, func, data)
                    136:     WindowPtr pWin;
                    137:     int (*func)();
                    138:     pointer data;
                    139: {
                    140:     int result;
                    141:     WindowPtr pChild;
                    142: 
                    143:     if (pWin == 0) 
                    144:        return(WT_NOMATCH);
                    145:     result = (* func)(pWin, data);
                    146: 
                    147:     if (result == WT_STOPWALKING) 
                    148:         return(WT_STOPWALKING);
                    149: 
                    150:     if (result == WT_WALKCHILDREN) 
                    151:         for (pChild = pWin->firstChild; pChild; pChild = pChild->nextSib)
                    152:             if (TraverseTree(pChild, func,data) ==  WT_STOPWALKING) 
                    153:                 return(WT_STOPWALKING);
                    154: 
                    155:     return(WT_NOMATCH);
                    156: }
                    157: 
                    158: int
                    159: WalkTree(pScreen, func, data)
                    160:     ScreenPtr pScreen;
                    161:     int (* func)();
                    162:     char *data;
                    163: {
                    164:     WindowPtr pWin;
                    165:     
                    166:     pWin = &WindowTable[pScreen->myNum];
                    167:     return(TraverseTree(pWin, func, data));
                    168: }
                    169: 
                    170: /*****
                    171:  *  DoObscures(pWin)
                    172:  *    
                    173:  *****/
                    174: 
                    175: static void
                    176: DoObscures(pWin)
                    177:     WindowPtr pWin;
                    178: {
                    179:     WindowPtr pSib;
                    180: 
                    181:     if (pWin->backStorage  == 0 || (pWin->backingStore == NotUseful))
                    182:         return ;
                    183:     if ((* pWin->drawable.pScreen->RegionNotEmpty)(pWin->backStorage->obscured))
                    184:     {
                    185:         (*pWin->backStorage->SaveDoomedAreas)( pWin );
                    186:         (* pWin->drawable.pScreen->RegionEmpty)(pWin->backStorage->obscured);
                    187:     }
                    188:     pSib = pWin->firstChild;
                    189:     while (pSib)
                    190:     {
                    191:         DoObscures(pSib);
                    192:        pSib = pSib->nextSib;
                    193:     }
                    194: }
                    195: 
                    196: /*****
                    197:  *  HandleExposures(pWin)
                    198:  *    starting at pWin, draw background in any windows that have exposure
                    199:  *    regions, translate the regions, restore any backing store,
                    200:  *    and then send any regions stille xposed to the client
                    201:  *****/
                    202: 
                    203: /* NOTE
                    204:    the order of painting and restoration needs to be different,
                    205: to avoid an extra repaint of the background. --rgd
                    206: */
                    207: 
                    208: void
                    209: HandleExposures(pWin)
                    210:     WindowPtr pWin;
                    211: {
                    212:     WindowPtr pSib;
                    213: 
                    214:     if ((* pWin->drawable.pScreen->RegionNotEmpty)(pWin->borderExposed))
                    215:     {
                    216:        (*pWin->PaintWindowBorder)(pWin, pWin->borderExposed, PW_BORDER);
                    217:        (* pWin->drawable.pScreen->RegionEmpty)(pWin->borderExposed);
                    218:     }
                    219:     (* pWin->drawable.pScreen->WindowExposures)(pWin);
                    220:     pSib = pWin->firstChild;
                    221:     while (pSib)
                    222:     {
                    223:         HandleExposures(pSib);
                    224:        pSib = pSib->nextSib;
                    225:     }
                    226: }
                    227: 
                    228: extern int NotImplemented();
                    229: 
                    230: static void
                    231: InitProcedures(pWin)
                    232:     WindowPtr pWin;
                    233: {
                    234: #ifdef DEBUG
                    235:     void (**j) ();
                    236:     for (j = &pWin->PaintWindowBackground;
                    237:          j < &pWin->ClearToBackground; j++ )
                    238:         *j = (void (*) ())NotImplemented;
                    239: #endif /* DEBUG */
                    240: 
                    241: }
                    242: 
                    243: static void
                    244: SetWindowToDefaults(pWin, pScreen)
                    245:     WindowPtr pWin;
                    246:     ScreenPtr pScreen;
                    247: {
                    248:     pWin->prevSib = NullWindow;
                    249:     pWin->firstChild = NullWindow;
                    250:     pWin->lastChild = NullWindow;
                    251: 
                    252:     pWin->userProps = (PropertyPtr)NULL;
                    253: 
                    254:     pWin->backingStore = NotUseful;
                    255:     pWin->backStorage = (BackingStorePtr) NULL;
                    256: 
                    257:     pWin->mapped = 0;           /* off */
                    258:     pWin->realized = 0;         /* off */
                    259:     pWin->viewable = 0;
                    260:     pWin->overrideRedirect = FALSE;
                    261:     pWin->saveUnder = FALSE;
                    262: 
                    263:     pWin->bitGravity = ForgetGravity; 
                    264:     pWin->winGravity = NorthWestGravity;
                    265:     pWin->backingBitPlanes = -1;
                    266:     pWin->backingPixel = 0;
                    267: 
                    268:     pWin->eventMask = 0;
                    269:     pWin->dontPropagateMask = 0;
                    270:     pWin->allEventMasks = 0;
                    271:     pWin->deliverableEvents = 0;
                    272: 
                    273:     pWin->otherClients = (pointer)NULL;
                    274:     pWin->passiveGrabs = (pointer)NULL;
                    275:     pWin->colormap = (Colormap)CopyFromParent;
                    276: 
                    277:     pWin->exposed = (* pScreen->RegionCreate)(NULL, 1);
                    278:     pWin->borderExposed = (* pScreen->RegionCreate)(NULL, 1);
                    279: 
                    280: }
                    281: 
                    282: static void
                    283: MakeRootCursor(pWin)
                    284:     WindowPtr pWin;
                    285: {
                    286:     unsigned char *srcbits, *mskbits;
                    287:     int i;
                    288:     if (rootCursor)
                    289:     {
                    290:        pWin->cursor = rootCursor;
                    291:        rootCursor->refcnt++;
                    292:     }
                    293:     else
                    294:     {
                    295:        CursorMetricRec cm;
                    296:        cm.width=32;
                    297:        cm.height=16;
                    298:        cm.xhot=8;
                    299:        cm.yhot=8;
                    300: 
                    301:         srcbits = (unsigned char *)Xalloc( PixmapBytePad(32, 1)*16); 
                    302:         mskbits = (unsigned char *)Xalloc( PixmapBytePad(32, 1)*16); 
                    303:         for (i=0; i<PixmapBytePad(32, 1)*16; i++)
                    304:        {
                    305:            srcbits[i] = mskbits[i] = 0xff;
                    306:        }
                    307:        pWin->cursor = AllocCursor( srcbits, mskbits,   &cm,
                    308:                    ~0, ~0, ~0, 0, 0, 0);
                    309:     }
                    310: }
                    311: 
                    312: static void
                    313: MakeRootTile(pWin)
                    314:     WindowPtr pWin;
                    315: {
                    316:     ScreenPtr pScreen = pWin->drawable.pScreen;
                    317:     GCPtr pGC;
                    318: 
                    319:     pWin->backgroundTile = (*pScreen->CreatePixmap)(pScreen, 16, 16, 
                    320:                                pScreen->rootDepth);
                    321: 
                    322:     pGC = GetScratchGC(pScreen->rootDepth, pScreen);
                    323: 
                    324:     {
                    325:        CARD32 attributes[3];
                    326: 
                    327:        attributes[0] = pScreen->whitePixel;
                    328:        attributes[1] = pScreen->blackPixel;
                    329:        attributes[2] = FALSE;
                    330: 
                    331:        ChangeGC(pGC, GCForeground | GCBackground | GCGraphicsExposures,
                    332:             attributes, 3);
                    333:    }
                    334: 
                    335:    ValidateGC(pWin->backgroundTile, pGC);
                    336: 
                    337:    (*pGC->PutImage)(pWin->backgroundTile, pGC, 1,
                    338:                    0, 0, 16, 16, 0, XYBitmap, _back);
                    339: 
                    340:    FreeScratchGC(pGC);
                    341: 
                    342: }
                    343: 
                    344: /*****
                    345:  * CreateRootWindow
                    346:  *    Makes a window at initialization time for specified screen
                    347:  *****/
                    348: 
                    349: int
                    350: CreateRootWindow(screen)
                    351:     int                screen;
                    352: {
                    353:     WindowPtr  pWin;
                    354:     BoxRec     box;
                    355:     ScreenPtr  pScreen;
                    356: 
                    357:     savedScreenInfo[screen].pWindow = NULL;
                    358:     savedScreenInfo[screen].wid = FakeClientID(0);
                    359:     savedScreenInfo[screen].cid = FakeClientID(0);
                    360:     screenIsSaved = SCREEN_SAVER_OFF;
                    361:     
                    362:     pWin = &WindowTable[screen];
                    363:     pScreen = &screenInfo.screen[screen];
                    364:     InitProcedures(pWin);
                    365: 
                    366:     pWin->drawable.pScreen = pScreen;
                    367:     pWin->drawable.type = DRAWABLE_WINDOW;
                    368: 
                    369:     pWin->drawable.depth = pScreen->rootDepth;
                    370: 
                    371:     pWin->parent = NullWindow;
                    372:     SetWindowToDefaults(pWin, pScreen);
                    373: 
                    374:     pWin->colormap = pScreen->defColormap;    
                    375: 
                    376:     pWin->nextSib = NullWindow;
                    377: 
                    378:     MakeRootCursor(pWin);
                    379: 
                    380:     pWin->client = serverClient;        /* since belongs to server */
                    381:     pWin->wid = FakeClientID(0);
                    382: 
                    383:     pWin->clientWinSize.x = pWin->clientWinSize.y = 0;
                    384:     pWin->clientWinSize.height = screenInfo.screen[screen].height;
                    385:     pWin->clientWinSize.width = screenInfo.screen[screen].width;
                    386:     pWin->absCorner.x = pWin->absCorner.y = 0;
                    387:     pWin->oldAbsCorner.x = pWin->oldAbsCorner.y = 0;
                    388: 
                    389:     box.x1 = 0;
                    390:     box.y1 = 0;
                    391:     box.x2 = screenInfo.screen[screen].width ;
                    392:     box.y2 = screenInfo.screen[screen].height;
                    393:     pWin->clipList = (* pScreen->RegionCreate)(&box, 1); 
                    394:     pWin->winSize = (* pScreen->RegionCreate)(&box, 1);
                    395:     pWin->borderSize = (* pScreen->RegionCreate)(&box, 1);
                    396:     pWin->borderClip = (* pScreen->RegionCreate)(&box, 1); 
                    397: 
                    398:     pWin->class = InputOutput;
                    399:     pWin->visual = pScreen->rootVisual;
                    400: 
                    401:     pWin->backgroundPixel = pScreen->whitePixel;
                    402: 
                    403:     pWin->borderPixel = pScreen->blackPixel;
                    404:     pWin->borderWidth = 0;
                    405: 
                    406:     AddResource(pWin->wid, RT_WINDOW, pWin, DeleteWindow, RC_CORE);
                    407: 
                    408:     MakeRootTile(pWin);
                    409:     pWin->borderTile = (PixmapPtr)USE_BORDER_PIXEL;
                    410: 
                    411:     /* re-validate GC for use with root Window */
                    412: 
                    413:     (*pScreen->CreateWindow)(pWin);
                    414:     MapWindow(pWin, DONT_HANDLE_EXPOSURES, BITS_DISCARDED, 
                    415:              DONT_SEND_NOTIFICATION, serverClient);
                    416: 
                    417:     /* We SHOULD check for an error value here XXX */
                    418:     (*pScreen->ChangeWindowAttributes)(pWin, CWBackPixmap | CWBorderPixel);
                    419: 
                    420:     (*pWin->PaintWindowBackground)(pWin, pWin->clipList, PW_BACKGROUND);
                    421:     EventSelectForWindow(pWin, serverClient, 0);
                    422:     return(Success);
                    423: }
                    424: 
                    425: /*****
                    426:  * CreateWindow
                    427:  *    Makes a window in response to client request 
                    428:  *    XXX  What about depth of inputonly windows -- should be 0
                    429:  *****/
                    430: 
                    431: WindowPtr
                    432: CreateWindow(wid, pParent, x, y, w, h, bw, class, vmask, vlist, 
                    433:             depth, client, visual, error)
                    434:     Window wid;
                    435:     WindowPtr pParent;    /* already looked up in table to do error checking*/
                    436:     short x,y;
                    437:     unsigned short w, h, bw;
                    438:     int class;
                    439:     int vmask;
                    440:     long *vlist;
                    441:     int depth;
                    442:     ClientPtr client;
                    443:     VisualID visual;
                    444:     int *error;
                    445: {
                    446:     WindowPtr pWin;
                    447:     ScreenPtr pScreen;
                    448:     BoxRec box;
                    449:     xEvent event;
                    450:     int idepth, ivisual;
                    451:     Bool fOK;
                    452:     DepthPtr pDepth;
                    453: 
                    454:     if ((class != InputOnly) && (pParent->class == InputOnly))
                    455:     {
                    456:         *error = BadMatch;
                    457:        return (WindowPtr)NULL;
                    458:     }
                    459: 
                    460:     if ((class == InputOnly) && ((bw != 0) || (depth != 0)))
                    461:     {
                    462:         *error = BadMatch;
                    463:        return (WindowPtr)NULL;
                    464:     }
                    465: 
                    466:     pScreen = pParent->drawable.pScreen;
                    467:     /* Find out if the depth and visual are acceptable for this Screen */
                    468:     fOK = FALSE;
                    469:     if ((class == InputOutput && depth == 0) || 
                    470:        (class == InputOnly) || (class == CopyFromParent))
                    471:         depth = pParent->drawable.depth;
                    472: 
                    473:     if (visual == CopyFromParent)
                    474:         visual = pParent->visual;
                    475:     else
                    476:     {
                    477:         for(idepth = 0; idepth < pScreen->numDepths; idepth++)
                    478:         {
                    479:            pDepth = (DepthPtr) &pScreen->allowedDepths[idepth];
                    480:            if (depth == pDepth->depth)
                    481:            {
                    482:                for (ivisual = 0; ivisual < pDepth->numVids; ivisual++)
                    483:                {
                    484:                    if (visual == pDepth->vids[ivisual])
                    485:                        fOK = TRUE;
                    486:                }
                    487:            }
                    488:         }
                    489:         if (fOK == 0)
                    490:         {
                    491:             *error = BadMatch;
                    492:            return (WindowPtr)NULL;
                    493:         }
                    494:     }
                    495: 
                    496:     pWin = (WindowPtr ) Xalloc( sizeof(WindowRec) );
                    497:     if (pWin == (WindowPtr) NULL) 
                    498:     {
                    499:        *error = BadAlloc;
                    500:        return (WindowPtr)NULL;
                    501:     }
                    502:     InitProcedures(pWin);
                    503:     pWin->drawable = pParent->drawable;
                    504:     if (class == InputOutput)
                    505:        pWin->drawable.depth = depth;
                    506:     else if (class == InputOnly)
                    507:         pWin->drawable.type = (short) UNDRAWABLE_WINDOW;
                    508: 
                    509:     pWin->wid = wid;
                    510:     pWin->client = client;
                    511:     pWin->visual = visual;
                    512: 
                    513:     SetWindowToDefaults(pWin, pScreen);
                    514: 
                    515:     pWin->cursor = (CursorPtr)None;
                    516: 
                    517:     if (class == CopyFromParent)
                    518:        pWin->class = pParent->class;
                    519:     else
                    520:        pWin->class = class;
                    521: 
                    522:     pWin->borderWidth = (int) bw;
                    523:     pWin->backgroundTile = (PixmapPtr)None;
                    524:     pWin->backgroundPixel = pScreen->whitePixel;
                    525: 
                    526:     if ((pWin->drawable.depth != pParent->drawable.depth) &&
                    527:        (((vmask & (CWBorderPixmap | CWBorderPixel)) == 0 )))
                    528:     {
                    529:         Xfree(pWin);
                    530:         *error = BadMatch;
                    531:         return (WindowPtr)NULL;
                    532:     }
                    533:     if ((vmask & (CWBorderPixmap | CWBorderPixel)) != 0)
                    534:                /* it will just get fixed in ChangeWindowAttributes */
                    535:         pWin->borderTile = (PixmapPtr)NULL;
                    536:     else
                    537:     {                              /* this is WRONG!!         XXX */
                    538:                                   /* should be actually copied */
                    539:         pWin->borderTile = pParent->borderTile;   
                    540:         if (IS_VALID_PIXMAP(pParent->borderTile))
                    541:             pParent->borderTile->refcnt++;
                    542:     }
                    543:     pWin->borderPixel = pParent->borderPixel;
                    544:     pWin->visibility = VisibilityFullyObscured;
                    545:                
                    546:     pWin->clientWinSize.x = x + bw;
                    547:     pWin->clientWinSize.y = y + bw;
                    548:     pWin->clientWinSize.height = h;
                    549:     pWin->clientWinSize.width = w;
                    550:     pWin->absCorner.x = pWin->oldAbsCorner.x = pParent->absCorner.x + x + bw;
                    551:     pWin->absCorner.y = pWin->oldAbsCorner.y = pParent->absCorner.y + y + bw;
                    552: 
                    553:         /* set up clip list correctly for unobscured WindowPtr */
                    554:     pWin->clipList = (* pScreen->RegionCreate)(NULL, 1);
                    555:     pWin->borderClip = (* pScreen->RegionCreate)(NULL, 1);
                    556:     box.x1 = pWin->absCorner.x;
                    557:     box.y1 = pWin->absCorner.y;
                    558:     box.x2 = box.x1 + w;
                    559:     box.y2 = box.y1 + h;
                    560:     pWin->winSize = (* pScreen->RegionCreate)(&box, 1);
                    561:     (* pScreen->Intersect)(pWin->winSize, pWin->winSize,  pParent->winSize);
                    562:     if (bw)
                    563:     {
                    564:        box.x1 -= bw;
                    565:        box.y1 -= bw;
                    566:        box.x2 += bw;
                    567:        box.y2 += bw;
                    568:         pWin->borderSize = (* pScreen->RegionCreate)(&box, 1);
                    569:         (* pScreen->Intersect)(pWin->borderSize, pWin->borderSize, 
                    570:                               pParent->winSize);
                    571:     }
                    572:     else
                    573:     {
                    574:         pWin->borderSize = (* pScreen->RegionCreate)(NULL, 1);
                    575:        (* pScreen->RegionCopy)(pWin->borderSize, pWin->winSize);
                    576:     }  
                    577: 
                    578:     pWin->parent = pParent;    
                    579:     if ((screenIsSaved == SCREEN_SAVER_ON)
                    580:        && (pParent == &WindowTable[pScreen->myNum])
                    581:        && (pParent->firstChild)
                    582:        && (savedScreenInfo[pScreen->myNum].blanked == SCREEN_IS_TILED))
                    583:     {
                    584:        WindowPtr pFirst = pParent->firstChild;
                    585:        pWin->nextSib = pFirst->nextSib;
                    586:         if (pFirst->nextSib)
                    587:            pFirst->nextSib->prevSib = pWin;
                    588:        else
                    589:            pParent->lastChild = pWin;
                    590:         pFirst->nextSib = pWin;
                    591:        pWin->prevSib = pFirst;
                    592:     }
                    593:     else
                    594:     {
                    595:         pWin->nextSib = pParent->firstChild;
                    596:         if (pParent->firstChild) 
                    597:            pParent->firstChild->prevSib = pWin;
                    598:         else
                    599:             pParent->lastChild = pWin;
                    600:        pParent->firstChild = pWin;
                    601:     }
                    602: 
                    603:     /* We SHOULD check for an error value here XXX */
                    604:     (*pScreen->CreateWindow)(pWin);
                    605:     /* We SHOULD check for an error value here XXX */
                    606:     (*pScreen->PositionWindow)(pWin, pWin->absCorner.x, pWin->absCorner.y);
                    607:     if ((vmask & CWEventMask) == 0)
                    608:         EventSelectForWindow(pWin, client, 0);
                    609: 
                    610:     if (vmask)
                    611:         *error = ChangeWindowAttributes(pWin, vmask, vlist, pWin->client);
                    612:     else
                    613:         *error = Success;
                    614: 
                    615:     WindowHasNewCursor( pWin);
                    616: 
                    617:     event.u.u.type = CreateNotify;
                    618:     event.u.createNotify.window = wid;
                    619:     event.u.createNotify.parent = pParent->wid;
                    620:     event.u.createNotify.x = x;
                    621:     event.u.createNotify.y = y;
                    622:     event.u.createNotify.width = w;
                    623:     event.u.createNotify.height = h;
                    624:     event.u.createNotify.borderWidth = bw;
                    625:     event.u.createNotify.override = pWin->overrideRedirect;
                    626:     DeliverEvents(pWin->parent, &event, 1, NullWindow);                
                    627: 
                    628:     return pWin;
                    629: }
                    630: 
                    631: static void
                    632: FreeWindowResources(pWin)
                    633:     WindowPtr pWin;
                    634: {
                    635:     ScreenPtr pScreen;
                    636:     void (* proc)();
                    637: 
                    638:     pScreen = pWin->drawable.pScreen;
                    639: 
                    640:     DeleteWindowFromAnySaveSet(pWin);
                    641:     DeleteWindowFromAnySelections(pWin);
                    642:     DeleteWindowFromAnyEvents(pWin, TRUE);
                    643:     proc = pScreen->RegionDestroy;
                    644:     (* proc)(pWin->clipList);
                    645:     (* proc)(pWin->winSize);
                    646:     (* proc)(pWin->borderClip);
                    647:     (* proc)(pWin->borderSize);
                    648:     (* proc)(pWin->exposed);
                    649:     (* proc)(pWin->borderExposed);
                    650:     if (pWin->backStorage)
                    651:     {
                    652:         (* proc)(pWin->backStorage->obscured);
                    653:        Xfree(pWin->backStorage);
                    654:     }
                    655:     (* pScreen->DestroyPixmap)(pWin->borderTile);
                    656:     (* pScreen->DestroyPixmap)(pWin->backgroundTile);
                    657: 
                    658:     if (pWin->cursor != (CursorPtr)None)
                    659:         FreeCursor( pWin->cursor, 0);
                    660: 
                    661:     DeleteAllWindowProperties(pWin);
                    662:     /* We SHOULD check for an error value here XXX */
                    663:     (* pScreen->DestroyWindow)(pWin);
                    664: }
                    665: 
                    666: static void
                    667: CrushTree(pWin)
                    668:     WindowPtr pWin;
                    669: {
                    670:     WindowPtr pSib;
                    671:     xEvent event;
                    672: 
                    673:     if (pWin == (WindowPtr) NULL) 
                    674:         return;
                    675:     while (pWin) 
                    676:     {
                    677:        CrushTree(pWin->firstChild);
                    678: 
                    679:        event.u.u.type = DestroyNotify;
                    680:                event.u.destroyNotify.window = pWin->wid;
                    681:        DeliverEvents(pWin, &event, 1, NullWindow);             
                    682: 
                    683:        FreeResource(pWin->wid, RC_CORE);
                    684:        pSib = pWin->nextSib;
                    685:        pWin->realized = FALSE;
                    686:        pWin->viewable = FALSE;
                    687:        (* pWin->drawable.pScreen->UnrealizeWindow)(pWin);
                    688:        FreeWindowResources(pWin);
                    689:        Xfree(pWin);
                    690:        pWin = pSib;
                    691:     }
                    692: }
                    693:        
                    694: /*****
                    695:  *  DeleteWindow
                    696:  *       Deletes child of window then window itself
                    697:  *****/
                    698: 
                    699: DeleteWindow(pWin, wid)
                    700:     WindowPtr pWin;
                    701:     int wid;
                    702: {
                    703:     WindowPtr pParent;
                    704:     xEvent event;
                    705: 
                    706:     UnmapWindow(pWin, HANDLE_EXPOSURES, SEND_NOTIFICATION, FALSE);
                    707: 
                    708:     CrushTree(pWin->firstChild);
                    709: 
                    710:     event.u.u.type = DestroyNotify;
                    711:     event.u.destroyNotify.window = pWin->wid;
                    712:     DeliverEvents(pWin, &event, 1, NullWindow);                
                    713: 
                    714:     pParent = pWin->parent;
                    715:     FreeWindowResources(pWin);
                    716:     if (pParent)
                    717:     {
                    718:        if (pParent->firstChild == pWin)
                    719:             pParent->firstChild = pWin->nextSib;
                    720:        if (pParent->lastChild == pWin)
                    721:             pParent->lastChild = pWin->prevSib;
                    722:         if (pWin->nextSib) 
                    723:             pWin->nextSib->prevSib = pWin->prevSib;
                    724:         if (pWin->prevSib) 
                    725:             pWin->prevSib->nextSib = pWin->nextSib;
                    726:        Xfree(pWin);
                    727:     }
                    728: }
                    729: 
                    730: DestroySubwindows(pWin, client)
                    731:     WindowPtr pWin;
                    732:     ClientPtr client;
                    733: {
                    734:     WindowPtr pChild, pSib;
                    735:     xEvent event;
                    736: 
                    737:     if ((pChild = pWin->lastChild) == (WindowPtr) NULL)
                    738:         return;
                    739:     while (pChild) 
                    740:     {
                    741:        pSib = pChild->prevSib;
                    742:        /* a little lazy evaluation, don't send exposes until all deleted */
                    743:        if (pSib != (WindowPtr) NULL)
                    744:        {
                    745:            event.u.u.type = UnmapNotify;
                    746:            event.u.unmapNotify.window = pWin->wid;
                    747:            event.u.unmapNotify.fromConfigure = xFalse;
                    748:            DeliverEvents(pWin, &event, 1, NullWindow);
                    749:        }
                    750:         else
                    751:         {
                    752:            pChild->nextSib = (WindowPtr)NULL;
                    753:            UnmapWindow(pChild, HANDLE_EXPOSURES, SEND_NOTIFICATION, FALSE);
                    754:        }
                    755:        CrushTree(pChild->firstChild);
                    756: 
                    757:        event.u.u.type = DestroyNotify;
                    758:        event.u.destroyNotify.window = pChild->wid;
                    759:        DeliverEvents(pChild, &event, 1, NullWindow);           
                    760:     
                    761:        FreeResource(pChild->wid, RC_CORE);
                    762:        FreeWindowResources(pChild);
                    763:        Xfree(pChild);
                    764:        pChild = pSib;
                    765:     }
                    766:     pWin->firstChild = (WindowPtr )NULL;
                    767: }
                    768: 
                    769: 
                    770: /*****
                    771:  *  ChangeWindowAttributes
                    772:  *   
                    773:  *  The value-mask specifies which attributes are to be changed; the
                    774:  *  value-list contains one value for each one bit in the mask, from least
                    775:  *  to most significant bit in the mask.  
                    776:  *****/
                    777:  
                    778: int 
                    779: ChangeWindowAttributes(pWin, vmask, vlist, client)
                    780:     WindowPtr pWin;
                    781:     unsigned int vmask;
                    782:     long *vlist;
                    783:     ClientPtr client;
                    784: {
                    785:     int index;
                    786:     long *pVlist;
                    787:     PixmapPtr pPixmap;
                    788:     Pixmap pixID;
                    789:     CursorPtr pCursor;
                    790:     Cursor cursorID;
                    791:     int result;
                    792:     ScreenPtr pScreen;
                    793:     unsigned int vmaskCopy = 0;
                    794:     int error;
                    795: 
                    796:     if ((pWin->class == InputOnly) && (vmask & (~INPUTONLY_LEGAL_MASK)))
                    797:         return BadMatch;
                    798: 
                    799:     error = Success;
                    800:     pScreen = pWin->drawable.pScreen;
                    801:     pVlist = vlist;
                    802:     while (vmask) 
                    803:     {
                    804:        index = ffs(vmask) - 1;
                    805:        vmask &= ~(index = (1 << index));
                    806:        switch (index) 
                    807:         {
                    808:          case CWBackPixmap: 
                    809:            pixID = (Pixmap )*pVlist;
                    810:            pVlist++;
                    811:            if (pixID == None)
                    812:            {
                    813:                (* pScreen->DestroyPixmap)(pWin->backgroundTile);
                    814:                if (pWin->parent == (WindowPtr) NULL)
                    815:                     MakeRootTile(pWin);
                    816:                 else
                    817:                     pWin->backgroundTile = (PixmapPtr)NULL;
                    818:            }
                    819:            else if (pixID == ParentRelative)
                    820:            {
                    821:                (* pScreen->DestroyPixmap)(pWin->backgroundTile);
                    822:                if (pWin->parent == (WindowPtr) NULL)
                    823:                    MakeRootTile(pWin);
                    824:                else
                    825:                    pWin->backgroundTile = (PixmapPtr)ParentRelative;
                    826:                /* Note that the parent's backgroundTile's refcnt is NOT
                    827:                 * incremented. */
                    828:            }
                    829:             else
                    830:            {   
                    831:                 pPixmap = (PixmapPtr)LookupID(pixID, RT_PIXMAP, RC_CORE);
                    832:                 if (pPixmap != (PixmapPtr) NULL)
                    833:                {
                    834:                     if  ((pPixmap->drawable.depth != pWin->drawable.depth) ||
                    835:                         (pPixmap->drawable.pScreen != pScreen))
                    836:                    {
                    837:                         error = BadMatch;
                    838:                        goto PatchUp;
                    839:                    }
                    840:                    (* pScreen->DestroyPixmap)(pWin->backgroundTile); 
                    841:                    pWin->backgroundTile = pPixmap;
                    842:                    pPixmap->refcnt++;
                    843:                }
                    844:                else 
                    845:                {
                    846:                    error = BadPixmap;
                    847:                    goto PatchUp;
                    848:                }
                    849:            }
                    850:            break;
                    851:          case CWBackPixel: 
                    852:            pWin->backgroundPixel = (CARD32 ) *pVlist;
                    853:            (* pScreen->DestroyPixmap)(pWin->backgroundTile);
                    854:            pWin->backgroundTile = (PixmapPtr)USE_BACKGROUND_PIXEL;
                    855:                   /* background pixel overrides background pixmap,
                    856:                      so don't let the ddx layer see both bits */
                    857:             vmaskCopy &= ~CWBackPixmap;
                    858:            pVlist++;
                    859:            break;
                    860:          case CWBorderPixmap:
                    861:            pixID = (Pixmap ) *pVlist;
                    862:            pVlist++;
                    863:            if (pixID == CopyFromParent)
                    864:            {
                    865:                GCPtr pGC;
                    866:                PixmapPtr parentPixmap;
                    867:                if ((pWin->parent == (WindowPtr) NULL) || (pWin->parent && 
                    868:                                       (pWin->drawable.depth != 
                    869:                                        pWin->parent->drawable.depth)))
                    870:                {
                    871:                    error = BadMatch;
                    872:                    goto PatchUp;
                    873:                }
                    874:                (* pScreen->DestroyPixmap)(pWin->borderTile);
                    875:                parentPixmap = pWin->parent->borderTile;
                    876:                if (parentPixmap == (PixmapPtr)USE_BORDER_PIXEL)
                    877:                {
                    878:                    pWin->borderTile = (PixmapPtr)USE_BORDER_PIXEL;
                    879:                    pWin->borderPixel = pWin->parent->borderPixel;
                    880:                }
                    881:                 else
                    882:                {
                    883:                    CARD32 attribute;
                    884: 
                    885:                    pPixmap = (* pWin->drawable.pScreen->CreatePixmap)
                    886:                                (pWin->drawable.pScreen, parentPixmap->width,
                    887:                                 parentPixmap->height, pWin->drawable.depth);
                    888:                    pGC = GetScratchGC(pWin->drawable.depth, 
                    889:                                   pWin->drawable.pScreen);
                    890:                        
                    891:                    attribute = GXcopy;
                    892:                    ChangeGC(pGC, GCFunction, &attribute, 1);
                    893:                    ValidateGC(pPixmap, pGC);
                    894: 
                    895:                    (* pGC->CopyArea)(parentPixmap, pPixmap, pGC, 0, 0,
                    896:                                       parentPixmap->width,
                    897:                                       parentPixmap->height, 
                    898:                                       pWin->drawable.depth,
                    899:                                       0, 0);
                    900:                    pWin->borderTile = pPixmap;
                    901:                    FreeScratchGC(pGC);
                    902:                }
                    903:            }
                    904:            else
                    905:            {   
                    906:                pPixmap = (PixmapPtr)LookupID(pixID, RT_PIXMAP, RC_CORE);
                    907:                if (pPixmap) 
                    908:                {
                    909:                     if  ((pPixmap->drawable.depth != pWin->drawable.depth) ||
                    910:                         (pPixmap->drawable.pScreen != pScreen))
                    911:                    {
                    912:                        error = BadMatch;
                    913:                        goto PatchUp;
                    914:                    }
                    915:                    (* pScreen->DestroyPixmap)(pWin->borderTile);
                    916:                    pWin->borderTile = pPixmap;
                    917:                    pPixmap->refcnt++;
                    918:                }
                    919:                else
                    920:                {
                    921:                    error = BadPixmap;
                    922:                    goto PatchUp;
                    923:                }
                    924:            }
                    925:            break;
                    926:          case CWBorderPixel: 
                    927:             pWin->borderPixel = (CARD32) *pVlist;
                    928:            (* pScreen->DestroyPixmap)(pWin->borderTile);           
                    929:            pWin->borderTile = (PixmapPtr)USE_BORDER_PIXEL;
                    930:                    /* border pixel overrides border pixmap,
                    931:                       so don't let the ddx layer see both bits */
                    932:            vmaskCopy &= ~CWBorderPixmap;
                    933:            pVlist++;
                    934:             break;
                    935:          case CWBitGravity: 
                    936:             pWin->bitGravity = (CARD8 )*pVlist;
                    937:            pVlist++;
                    938:            break;
                    939:          case CWWinGravity: 
                    940:             pWin->winGravity = (CARD8 )*pVlist;
                    941:            pVlist++;
                    942:            break;
                    943:          case CWBackingStore: 
                    944:             pWin->backingStore = (CARD8 )*pVlist;
                    945:            pVlist++;
                    946:            break;
                    947:          case CWBackingPlanes: 
                    948:            pWin->backingBitPlanes = (CARD32) *pVlist;
                    949:            pVlist++;
                    950:            break;
                    951:          case CWBackingPixel: 
                    952:             pWin->backingPixel = (CARD32)*pVlist;
                    953:            pVlist++;
                    954:            break;
                    955:          case CWSaveUnder:
                    956:             pWin->saveUnder = (Bool) *pVlist;
                    957:            pVlist++;
                    958:            break;
                    959:          case CWEventMask:
                    960:            result = EventSelectForWindow(pWin, client, (long )*pVlist);
                    961:            if (result)
                    962:            {
                    963:                error = result;
                    964:                goto PatchUp;
                    965:            }
                    966:            pVlist++;
                    967:            break;
                    968:          case CWDontPropagate:
                    969:            result =  EventSuppressForWindow(pWin, client, (long )*pVlist);
                    970:            if (result)
                    971:            {
                    972:                error = result;
                    973:                goto PatchUp;
                    974:            }
                    975:            pVlist++;
                    976:            break;
                    977:          case CWOverrideRedirect:
                    978:             pWin->overrideRedirect = (Bool ) *pVlist;
                    979:            pVlist++;
                    980:            break;
                    981:          case CWColormap:
                    982:            {
                    983:             Colormap   cmap;
                    984:            ColormapPtr pCmap;
                    985:            xEvent      xE;
                    986:            WindowPtr   pWinT;
                    987: 
                    988:            cmap = (Colormap ) *pVlist;
                    989:            pWinT = pWin;
                    990:            while(cmap == CopyFromParent)
                    991:            {
                    992:                if(pWinT->parent)
                    993:                {
                    994:                    if (pWinT->parent->colormap != CopyFromParent)
                    995:                    {
                    996:                        cmap = pWinT->parent->colormap;
                    997:                    }
                    998:                    else
                    999:                        pWinT = pWinT->parent;
                   1000:                }
                   1001:                else
                   1002:                {
                   1003:                    error = BadMatch;
                   1004:                    goto PatchUp;
                   1005:                }
                   1006:            }
                   1007:            pCmap = (ColormapPtr)LookupID(cmap, RT_COLORMAP, RC_CORE);
                   1008:            if (pCmap)
                   1009:            {
                   1010:                if (pCmap->pVisual->vid == pWin->visual)
                   1011:                { 
                   1012:                    pWin->colormap = (Colormap ) cmap;
                   1013:                    xE.u.u.type = ColormapNotify;
                   1014:                    xE.u.colormap.new = TRUE;
                   1015:                    xE.u.colormap.state = IsMapInstalled(cmap, pWin);
                   1016:                    TraverseTree(pWin, TellNewMap, &xE);
                   1017:                }
                   1018:                 else
                   1019:                {
                   1020:                    error = BadMatch;
                   1021:                    goto PatchUp;
                   1022:                }
                   1023:            }
                   1024:             else
                   1025:            {
                   1026:                error = BadColor;
                   1027:                goto PatchUp;
                   1028:            }
                   1029:            pVlist++;
                   1030:            break;
                   1031:            }
                   1032:          case CWCursor:
                   1033:            cursorID = (Cursor ) *pVlist;
                   1034:            pVlist++;
                   1035:            /*
                   1036:             * install the new
                   1037:             */
                   1038:            if ( cursorID == None)
                   1039:            {
                   1040:                if ( pWin->cursor != None)
                   1041:                    FreeCursor( pWin->cursor);
                   1042:                 if (pWin == &WindowTable[pWin->drawable.pScreen->myNum])
                   1043:                   MakeRootCursor( pWin);
                   1044:                 else            
                   1045:                     pWin->cursor = (CursorPtr)None;
                   1046:            }
                   1047:             else
                   1048:            {
                   1049:                pCursor = (CursorPtr)LookupID(cursorID, RT_CURSOR, RC_CORE);
                   1050:                 if (pCursor) 
                   1051:                {
                   1052:                    if ( pWin->cursor != None)
                   1053:                        FreeCursor( pWin->cursor);
                   1054:                     pWin->cursor = pCursor;
                   1055:                     pWin->cursor->refcnt++;
                   1056:                }
                   1057:                else
                   1058:                {
                   1059:                    error = BadCursor;
                   1060:                    goto PatchUp;
                   1061:                }
                   1062:            }
                   1063:            WindowHasNewCursor( pWin);
                   1064:            break;
                   1065:         default: break;
                   1066:       }
                   1067:       vmaskCopy |= index;
                   1068:     }
                   1069: PatchUp:
                   1070:        /* We SHOULD check for an error value here XXX */
                   1071:     (*pScreen->ChangeWindowAttributes)(pWin, vmaskCopy);
                   1072: 
                   1073:     /* 
                   1074:         If the border pixel changed, redraw the border. 
                   1075:        Note that this has to be done AFTER pScreen->ChangeWindowAttributes
                   1076:         for the tile to be rotated, and the correct function selected.
                   1077:     */
                   1078:     if ((vmaskCopy & (CWBorderPixel | CWBorderPixmap)) 
                   1079:        && pWin->viewable && pWin->borderWidth)
                   1080:     {
                   1081:         (* pScreen->Subtract)(pWin->borderExposed, pWin->borderClip, 
                   1082:                              pWin->winSize);
                   1083:        (*pWin->PaintWindowBorder)(pWin, pWin->borderExposed, PW_BORDER);
                   1084:         (* pScreen->RegionEmpty)(pWin->borderExposed);
                   1085:     }
                   1086:     return error;
                   1087: }
                   1088: 
                   1089: 
                   1090: /*****
                   1091:  * GetWindowAttributes
                   1092:  *    Notice that this is different than ChangeWindowAttributes
                   1093:  *****/
                   1094: 
                   1095: GetWindowAttributes(pWin, client)
                   1096:     WindowPtr pWin;
                   1097:     ClientPtr client;
                   1098: {
                   1099:     xGetWindowAttributesReply wa;
                   1100:     WindowPtr pWinT;
                   1101: 
                   1102:     wa.type = X_Reply;
                   1103:     wa.bitGravity = pWin->bitGravity;
                   1104:     wa.winGravity = pWin->winGravity;
                   1105:     wa.backingStore  = pWin->backingStore;
                   1106:     wa.length = (sizeof(xGetWindowAttributesReply) - 
                   1107:                 sizeof(xGenericReply)) >> 2;
                   1108:     wa.sequenceNumber = client->sequence;
                   1109:     wa.backingBitPlanes =  pWin->backingBitPlanes;
                   1110:     wa.backingPixel =  pWin->backingPixel;
                   1111:     wa.saveUnder = (BOOL)pWin->saveUnder;
                   1112:     wa.override = pWin->overrideRedirect;
                   1113:     if (!pWin->mapped)
                   1114:         wa.mapState = IsUnmapped;
                   1115:     else if (pWin->realized)
                   1116:         wa.mapState = IsViewable;
                   1117:     else
                   1118:         wa.mapState = IsUnviewable;
                   1119: 
                   1120:     pWinT = pWin;
                   1121:     while (pWinT->colormap == (Colormap)CopyFromParent)
                   1122:         pWinT = pWinT->parent; 
                   1123:     wa.colormap =  pWinT->colormap;
                   1124:     wa.mapInstalled = IsMapInstalled(wa.colormap, pWin);
                   1125: 
                   1126:     wa.yourEventMask = EventMaskForClient(pWin, client, &wa.allEventMasks);
                   1127:     wa.doNotPropagateMask = pWin->dontPropagateMask ;
                   1128:     wa.class = pWin->class;
                   1129:     wa.visualID = pWin->visual;
                   1130: 
                   1131:     WriteReplyToClient(client, sizeof(xGetWindowAttributesReply), &wa);
                   1132: }
                   1133: 
                   1134: 
                   1135: static WindowPtr
                   1136: MoveWindowInStack(pWin, pNextSib)
                   1137:     WindowPtr pWin, pNextSib;
                   1138: {
                   1139:     WindowPtr pParent = pWin->parent;
                   1140:     WindowPtr pFirstChange = pWin; /* highest window where list changes */
                   1141: 
                   1142:     if (pWin->nextSib != pNextSib)
                   1143:     {
                   1144:         if (!pNextSib)        /* move to bottom */
                   1145:        {
                   1146:             if (pParent->firstChild == pWin)
                   1147:                 pParent->firstChild = pWin->nextSib;
                   1148:            /* if (pWin->nextSib) */     /* is always True: pNextSib == NULL
                   1149:                                          * and pWin->nextSib != pNextSib
                   1150:                                          * therefore pWin->nextSib != NULL */
                   1151:                pFirstChange = pWin->nextSib;
                   1152:                pWin->nextSib->prevSib = pWin->prevSib;
                   1153:            /* else pFirstChange = pWin; */     
                   1154:            if (pWin->prevSib) 
                   1155:                 pWin->prevSib->nextSib = pWin->nextSib;
                   1156:             pParent->lastChild->nextSib = pWin;
                   1157:             pWin->prevSib = pParent->lastChild;
                   1158:             pWin->nextSib = (WindowPtr )NULL;
                   1159:             pParent->lastChild = pWin;
                   1160:        }
                   1161:         else if (pParent->firstChild == pNextSib) /* move to top */
                   1162:         {        
                   1163:            pFirstChange = pWin;
                   1164:            if (pParent->lastChild == pWin)
                   1165:               pParent->lastChild = pWin->prevSib;
                   1166:            if (pWin->nextSib) 
                   1167:                pWin->nextSib->prevSib = pWin->prevSib;
                   1168:            if (pWin->prevSib) 
                   1169:                 pWin->prevSib->nextSib = pWin->nextSib;
                   1170:            pWin->nextSib = pParent->firstChild;
                   1171:            pWin->prevSib = (WindowPtr ) NULL;
                   1172:            pNextSib->prevSib = pWin;
                   1173:            pParent->firstChild = pWin;
                   1174:        }
                   1175:         else                   /* move in middle of list */
                   1176:         {
                   1177:            WindowPtr pOldNext = pWin->nextSib;
                   1178: 
                   1179:            pFirstChange = (WindowPtr )NULL;
                   1180:             if (pParent->firstChild == pWin)
                   1181:                 pFirstChange = pParent->firstChild = pWin->nextSib;
                   1182:            if (pParent->lastChild == pWin) {
                   1183:               pFirstChange = pWin;
                   1184:               pParent->lastChild = pWin->prevSib;
                   1185:            }
                   1186:            if (pWin->nextSib) 
                   1187:                pWin->nextSib->prevSib = pWin->prevSib;
                   1188:            if (pWin->prevSib) 
                   1189:                 pWin->prevSib->nextSib = pWin->nextSib;
                   1190:             pWin->nextSib = pNextSib;
                   1191:             pWin->prevSib = pNextSib->prevSib;
                   1192:            if (pNextSib->prevSib)
                   1193:                 pNextSib->prevSib->nextSib = pWin;
                   1194:             pNextSib->prevSib = pWin;
                   1195:            if (!pFirstChange) {                     /* do we know it yet? */
                   1196:                pFirstChange = pParent->firstChild;  /* no, search from top */
                   1197:                while ((pFirstChange != pWin) && (pFirstChange != pOldNext))
                   1198:                     pFirstChange = pFirstChange->nextSib;
                   1199:            }
                   1200:        }
                   1201:     }
                   1202: 
                   1203:     return( pFirstChange );
                   1204: }
                   1205: 
                   1206: static void
                   1207: MoveWindow(pWin, x, y, pNextSib)
                   1208:     WindowPtr pWin;
                   1209:     short x,y;
                   1210:     WindowPtr pNextSib;
                   1211: {
                   1212:     WindowPtr pParent;
                   1213:     Bool WasMapped = (Bool)(pWin->realized);
                   1214:     BoxRec box;
                   1215:     short oldx, oldy, bw;
                   1216:     RegionPtr oldRegion;
                   1217:     DDXPointRec oldpt;
                   1218:     Bool anyMarked;
                   1219:     register ScreenPtr pScreen;
                   1220:     BoxPtr pBox;
                   1221:     WindowPtr windowToValidate = pWin;
                   1222: 
                   1223:     /* if this is a root window, can't be moved */
                   1224:     if (!(pParent = pWin->parent)) 
                   1225:        return ;
                   1226:     pScreen = pWin->drawable.pScreen;
                   1227:     bw = pWin->borderWidth;
                   1228: 
                   1229:     oldx = pWin->absCorner.x;
                   1230:     oldy = pWin->absCorner.y;
                   1231:     oldpt.x = oldx;
                   1232:     oldpt.y = oldy;
                   1233:     if (WasMapped) 
                   1234:     {
                   1235:         oldRegion = (* pScreen->RegionCreate)(NULL, 1);
                   1236:         (* pScreen->RegionCopy)(oldRegion, pWin->borderClip);
                   1237:         pBox = (* pScreen->RegionExtents)(pWin->borderSize);
                   1238:        anyMarked = MarkSiblingsBelowMe(pWin, pBox);
                   1239:     }
                   1240:     pWin->clientWinSize.x = x + bw;
                   1241:     pWin->clientWinSize.y = y + bw;
                   1242:     pWin->oldAbsCorner.x = oldx;
                   1243:     pWin->oldAbsCorner.y = oldy;
                   1244:     pWin->absCorner.x = pParent->absCorner.x + x +bw;
                   1245:     pWin->absCorner.y = pParent->absCorner.y + y + bw;
                   1246: 
                   1247:     box.x1 = pWin->absCorner.x;
                   1248:     box.y1 = pWin->absCorner.y;
                   1249:     box.x2 = box.x1 + pWin->clientWinSize.width;
                   1250:     box.y2 = box.y1+ pWin->clientWinSize.height;
                   1251:     (* pScreen->RegionReset)(pWin->winSize, &box);
                   1252:     (* pScreen->Intersect)(pWin->winSize, pWin->winSize, pParent->winSize); 
                   1253: 
                   1254:     if (bw)
                   1255:     {
                   1256:        box.x1 -= bw;
                   1257:        box.y1 -= bw;
                   1258:        box.x2 += bw;
                   1259:        box.y2 += bw;
                   1260:        (* pScreen->RegionReset)(pWin->borderSize, &box);
                   1261:         (* pScreen->Intersect)(pWin->borderSize, pWin->borderSize, 
                   1262:                               pParent->winSize);
                   1263:     }
                   1264:     else
                   1265:         (* pScreen->RegionCopy)(pWin->borderSize, pWin->winSize);
                   1266: 
                   1267:     (* pScreen->PositionWindow)(pWin,pWin->absCorner.x, pWin->absCorner.y);
                   1268: 
                   1269:     windowToValidate = MoveWindowInStack(pWin, pNextSib);
                   1270: 
                   1271:     ResizeChildrenWinSize(pWin, FALSE, 0, 0, DONT_USE_GRAVITY);
                   1272:     if (WasMapped) 
                   1273:     {
                   1274: 
                   1275:         anyMarked = MarkSiblingsBelowMe(windowToValidate, pBox) || anyMarked;
                   1276:             
                   1277:         (* pScreen->ValidateTree)(pParent, (WindowPtr)NULL, TRUE, anyMarked);
                   1278:        
                   1279:        DoObscures(pParent); 
                   1280:         if (pWin->backgroundTile == (PixmapPtr)ParentRelative)
                   1281:             (* pScreen->RegionCopy)(pWin->exposed, pWin->clipList);
                   1282:         else
                   1283:         {
                   1284:            /*
                   1285:             * Why subtract borderSize from parent's exposures? parent
                   1286:             * exposures aren't supposed to extend into children!
                   1287:             */
                   1288:                    (* pWin->CopyWindow)(pWin, oldpt, oldRegion);
                   1289:             (* pScreen->Subtract)(pParent->exposed, pParent->exposed,
                   1290:                                   pWin->borderSize);
                   1291:  
                   1292:        }
                   1293:        (* pScreen->RegionDestroy)(oldRegion);
                   1294:        HandleExposures(pParent); 
                   1295:     }    
                   1296: }
                   1297: 
                   1298: static void
                   1299: ResizeChildrenWinSize(pWin, XYSame, dw, dh, useGravity)
                   1300:     WindowPtr pWin;
                   1301:     Bool XYSame;
                   1302:     int dw, dh;
                   1303:     Bool useGravity;
                   1304: {
                   1305:     WindowPtr pSib;
                   1306:     RegionPtr parentReg;
                   1307:     BoxRec box;
                   1308:     register short x, y, cwsx, cwsy;
                   1309:     Bool unmap = FALSE;
                   1310:     register ScreenPtr pScreen;
                   1311:     xEvent event;
                   1312: 
                   1313:     pScreen = pWin->drawable.pScreen;
                   1314:     parentReg = pWin->winSize;
                   1315:     pSib = pWin->firstChild;
                   1316:     x = pWin->absCorner.x;
                   1317:     y = pWin->absCorner.y;
                   1318: 
                   1319:     while (pSib) 
                   1320:     {
                   1321:        cwsx = pSib->clientWinSize.x;
                   1322:        cwsy = pSib->clientWinSize.y;
                   1323:         if (useGravity == USE_GRAVITY)
                   1324:         {
                   1325:            switch (pSib->winGravity)
                   1326:            {
                   1327:               case UnmapGravity: 
                   1328:                     unmap = TRUE;
                   1329:               case NorthWestGravity: 
                   1330:                    break;
                   1331:                case NorthGravity:  
                   1332:                    cwsx += dw/2;
                   1333:                   break;
                   1334:                case NorthEastGravity:    
                   1335:                   cwsx += dw;       
                   1336:                   break;
                   1337:                case WestGravity:         
                   1338:                    cwsy += dh/2;
                   1339:                    break;
                   1340:                case CenterGravity:    
                   1341:                    cwsx += dw/2;
                   1342:                   cwsy += dh/2;
                   1343:                    break;
                   1344:                case EastGravity:         
                   1345:                    cwsx += dw;
                   1346:                   cwsy += dh/2;
                   1347:                    break;
                   1348:                case SouthWestGravity:    
                   1349:                   cwsy += dh;
                   1350:                    break;
                   1351:                case SouthGravity:        
                   1352:                    cwsx += dw/2;
                   1353:                   cwsy += dh;
                   1354:                    break;
                   1355:                case SouthEastGravity:    
                   1356:                    cwsx += dw;
                   1357:                   cwsy += dh;
                   1358:                   break;
                   1359:                case StaticGravity:           /* XXX */
                   1360:                   break;
                   1361:               default:
                   1362:                    break;
                   1363:            }
                   1364:        }
                   1365: 
                   1366:        event.u.u.type = GravityNotify;
                   1367:        event.u.gravity.window = pSib->wid;
                   1368:        event.u.gravity.x = cwsx;
                   1369:        event.u.gravity.y = cwsy;
                   1370:        DeliverEvents (pSib, &event, 1, NullWindow);
                   1371:  
                   1372:        box.x1 = x + cwsx;
                   1373:        box.y1 = y + cwsy;
                   1374:        box.x2 = box.x1 + pSib->clientWinSize.width;
                   1375:        box.y2 = box.y1 + pSib->clientWinSize.height;
                   1376: 
                   1377:        pSib->oldAbsCorner.x = pSib->absCorner.x;
                   1378:        pSib->oldAbsCorner.y = pSib->absCorner.y;
                   1379:        pSib->absCorner.x = x + cwsx;
                   1380:        pSib->absCorner.y = y + cwsy;
                   1381: 
                   1382:        (* pScreen->RegionReset)(pSib->winSize, &box);
                   1383:        (* pScreen->Intersect)(pSib->winSize, pSib->winSize, 
                   1384:                                              parentReg);
                   1385: 
                   1386:        if (pSib->borderWidth)
                   1387:        {
                   1388:            box.x1 -= pSib->borderWidth;
                   1389:            box.y1 -= pSib->borderWidth;
                   1390:            box.x2 += pSib->borderWidth;
                   1391:            box.y2 += pSib->borderWidth;
                   1392:            (* pScreen->RegionReset)(pSib->borderSize, &box);
                   1393:            (* pScreen->Intersect)(pSib->borderSize, 
                   1394:                                         pSib->borderSize, parentReg);
                   1395:        }
                   1396:        else
                   1397:            (* pScreen->RegionCopy)(pSib->borderSize, pSib->winSize);
                   1398:        (* pScreen->PositionWindow)(pSib, pSib->absCorner.x, pSib->absCorner.y);
                   1399:        pSib->marked = 1;
                   1400:        if (pSib->firstChild) 
                   1401:             ResizeChildrenWinSize(pSib, XYSame, 0, 0, DONT_USE_GRAVITY);
                   1402:         if (unmap)
                   1403:        {
                   1404:             UnmapWindow(pSib, DONT_HANDLE_EXPOSURES, SEND_NOTIFICATION,        TRUE);
                   1405:            unmap = FALSE;
                   1406:        }
                   1407:         pSib = pSib->nextSib;
                   1408:     }
                   1409: }
                   1410: 
                   1411: static int
                   1412: ExposeAll(pWin, pScreen)
                   1413:     WindowPtr pWin;
                   1414:     ScreenPtr pScreen;
                   1415: {
                   1416:     if (!pWin)
                   1417:         return(WT_NOMATCH);
                   1418:     if (pWin->mapped)
                   1419:     {
                   1420:         (* pScreen->RegionCopy)(pWin->exposed, pWin->clipList);
                   1421:         return (WT_WALKCHILDREN);
                   1422:     }
                   1423:     else
                   1424:         return(WT_NOMATCH);
                   1425: }
                   1426: 
                   1427: 
                   1428: 
                   1429: static void
                   1430: SlideAndSizeWindow(pWin, x, y, w, h, pSib)
                   1431:     WindowPtr pWin;
                   1432:     short x,y;
                   1433:     unsigned short w, h;
                   1434:     WindowPtr pSib;
                   1435: {
                   1436:     WindowPtr pParent;
                   1437:     Bool WasMapped = (Bool)(pWin->realized);
                   1438:     BoxRec box;
                   1439:     unsigned short width = pWin->clientWinSize.width,
                   1440:                    height = pWin->clientWinSize.height;    
                   1441:     short oldx = pWin->absCorner.x,
                   1442:           oldy = pWin->absCorner.y,
                   1443:           bw = pWin->borderWidth;
                   1444:     short dw, dh;
                   1445:     Bool XYSame = FALSE;
                   1446:     DDXPointRec oldpt;
                   1447:     RegionPtr oldRegion;
                   1448:     Bool anyMarked;
                   1449:     register ScreenPtr pScreen;
                   1450:     BoxPtr pBox;
                   1451:     WindowPtr pFirstChange;
                   1452: 
                   1453:     /* if this is a root window, can't be resized */
                   1454:     if (!(pParent = pWin->parent)) 
                   1455:         return ;
                   1456: 
                   1457:     pScreen = pWin->drawable.pScreen;
                   1458:     if (WasMapped) 
                   1459:     {
                   1460:         if ((pWin->bitGravity != ForgetGravity) ||
                   1461:             (pWin->backgroundTile == (PixmapPtr)ParentRelative))
                   1462:             oldRegion = NotClippedByChildren(pWin);
                   1463:         pBox = (* pScreen->RegionExtents)(pWin->borderSize);
                   1464:        anyMarked = MarkSiblingsBelowMe(pWin, pBox);
                   1465:     }
                   1466:     pWin->clientWinSize.x = x + bw;
                   1467:     pWin->clientWinSize.y = y + bw;
                   1468:     pWin->clientWinSize.height = h;
                   1469:     pWin->clientWinSize.width = w;
                   1470:     XYSame = ((pParent->absCorner.x + x == pWin->absCorner.x) 
                   1471:              && (pParent->absCorner.y + y == pWin->absCorner.y));
                   1472:     pWin->oldAbsCorner.x = oldx;
                   1473:     pWin->oldAbsCorner.y = oldy;
                   1474:     oldpt.x = oldx;
                   1475:     oldpt.y = oldy;
                   1476: 
                   1477:     pWin->absCorner.x = pParent->absCorner.x + x + bw;
                   1478:     pWin->absCorner.y = pParent->absCorner.y + y + bw;
                   1479: 
                   1480:     box.x1 = pWin->absCorner.x;
                   1481:     box.y1 = pWin->absCorner.y;
                   1482:     box.x2 = pWin->absCorner.x + w;
                   1483:     box.y2 = pWin->absCorner.y + h;
                   1484:     (* pScreen->RegionReset)(pWin->winSize, &box);
                   1485:     (* pScreen->Intersect)(pWin->winSize, pWin->winSize, pParent->winSize);
                   1486: 
                   1487:     if (pWin->borderWidth)
                   1488:     {
                   1489:        box.x1 -= bw;
                   1490:        box.y1 -= bw;
                   1491:        box.x2 += bw;
                   1492:        box.y2 += bw;
                   1493:        (* pScreen->RegionReset)(pWin->borderSize, &box);
                   1494:         (* pScreen->Intersect)(pWin->borderSize, pWin->borderSize, 
                   1495:                                     pParent->winSize);
                   1496:     }
                   1497:     else
                   1498:         (* pScreen->RegionCopy)(pWin->borderSize, pWin->winSize);
                   1499: 
                   1500:     dw = w - width;
                   1501:     dh = h - height;
                   1502:     ResizeChildrenWinSize(pWin, XYSame, dw, dh, USE_GRAVITY);
                   1503: 
                   1504:     /* let the hardware adjust background and border pixmaps, if any */
                   1505:     (* pScreen->PositionWindow)(pWin, pWin->absCorner.x, pWin->absCorner.y);
                   1506: 
                   1507:     pFirstChange = MoveWindowInStack(pWin, pSib);
                   1508: 
                   1509:     if (WasMapped) 
                   1510:     {
                   1511:         RegionPtr pRegion;
                   1512: 
                   1513:        anyMarked = MarkSiblingsBelowMe(pFirstChange, pBox) || anyMarked;
                   1514: 
                   1515:         if ((pWin->bitGravity == ForgetGravity) ||
                   1516:             (pWin->backgroundTile == (PixmapPtr)ParentRelative))
                   1517:        {
                   1518:            (* pScreen->ValidateTree)(pParent, pFirstChange, TRUE, anyMarked);
                   1519:            /* CopyWindow will step on borders, so re-paint them */
                   1520:            (* pScreen->Subtract)(pWin->borderExposed, 
                   1521:                         pWin->borderClip, pWin->winSize);
                   1522:            TraverseTree(pWin, ExposeAll, pScreen); 
                   1523:            DoObscures(pParent); 
                   1524:            HandleExposures(pParent);
                   1525:        }
                   1526:        else
                   1527:        {
                   1528:            pRegion = (* pScreen->RegionCreate)(NULL, 1);
                   1529:            (* pScreen->RegionCopy)(pRegion, pWin->clipList);
                   1530: 
                   1531:            x = pWin->absCorner.x;
                   1532:            y = pWin->absCorner.y;
                   1533:            switch (pWin->bitGravity)
                   1534:            {
                   1535:              case NorthWestGravity: 
                   1536:                    break;
                   1537:               case NorthGravity:  
                   1538:                    x += dw/2;
                   1539:                   break;
                   1540:               case NorthEastGravity:    
                   1541:                   x += dw;          
                   1542:                   break;
                   1543:               case WestGravity:         
                   1544:                    y += dh/2;
                   1545:                    break;
                   1546:               case CenterGravity:    
                   1547:                    x += dw/2;
                   1548:                   y += dh/2;
                   1549:                    break;
                   1550:               case EastGravity:         
                   1551:                    x += dw;
                   1552:                   y += dh/2;
                   1553:                    break;
                   1554:               case SouthWestGravity:    
                   1555:                   y += dh;
                   1556:                    break;
                   1557:               case SouthGravity:        
                   1558:                    x += dw/2;
                   1559:                   y += dh;
                   1560:                    break;
                   1561:               case SouthEastGravity:    
                   1562:                    x += dw;
                   1563:                   y += dh;
                   1564:                   break;
                   1565:              case StaticGravity:
                   1566:                   x = oldx;
                   1567:                   y = oldy;
                   1568:                   break;
                   1569:              default:
                   1570:                    break;
                   1571:            }
                   1572: 
                   1573:            (* pScreen->ValidateTree)(pParent, pFirstChange, TRUE, anyMarked);
                   1574:            DoObscures(pParent);
                   1575:            if (pWin->backStorage && (pWin->backingStore != NotUseful))
                   1576:            {
                   1577:                ErrorF("Going to translate backing store %d %d\n",
                   1578:                       oldx - x, oldy - y);
                   1579:                 (* pWin->backStorage->TranslateBackingStore) (pWin, 
                   1580:                                                              oldx - x, oldy - y);
                   1581:            }
                   1582:             oldpt.x = oldx - x + pWin->absCorner.x;
                   1583:            oldpt.y = oldy - y + pWin->absCorner.y;
                   1584:            (* pWin->CopyWindow)(pWin, oldpt, oldRegion);
                   1585: 
                   1586: 
                   1587:            /* Note that oldRegion is *translated* by CopyWindow */
                   1588: 
                   1589:            /*
                   1590:             * We've taken care of those spots in oldRegion so they needn't
                   1591:             * be re-exposed...
                   1592:             */
                   1593:            (* pScreen->Subtract)(pWin->exposed, pWin->clipList, oldRegion);
                   1594:            (* pScreen->RegionDestroy)(pRegion);
                   1595: 
                   1596:            /* CopyWindow will step on borders, so repaint them */
                   1597:            (* pScreen->Subtract)(pWin->borderExposed, 
                   1598:                                  pWin->borderClip, pWin->winSize);
                   1599: 
                   1600:            HandleExposures(pParent);
                   1601:            (* pScreen->RegionDestroy)(oldRegion);
                   1602:        }
                   1603:     }
                   1604: }
                   1605: 
                   1606: static void
                   1607: ChangeBorderWidth(pWin, width)
                   1608:     WindowPtr pWin;
                   1609:     int width;
                   1610: {
                   1611:     WindowPtr pParent;
                   1612:     BoxRec box;
                   1613:     BoxPtr pBox;
                   1614:     int oldwidth;
                   1615:     Bool anyMarked;
                   1616:     register ScreenPtr pScreen;
                   1617:     RegionPtr oldRegion;
                   1618:     DDXPointRec oldpt;
                   1619:     Bool WasMapped = (Bool)(pWin->realized);
                   1620: 
                   1621:     oldwidth = pWin->borderWidth;
                   1622:     if (oldwidth == width) 
                   1623:         return ;
                   1624:     pScreen = pWin->drawable.pScreen;
                   1625:     pParent = pWin->parent;
                   1626:     pWin->borderWidth = width;
                   1627: 
                   1628:     oldpt.x = pWin->absCorner.x;
                   1629:     oldpt.y = pWin->absCorner.y;
                   1630:     pWin->oldAbsCorner.x = oldpt.x;
                   1631:     pWin->oldAbsCorner.y = oldpt.y;
                   1632: 
                   1633:     pWin->clientWinSize.x += width - oldwidth;
                   1634:     pWin->clientWinSize.y += width - oldwidth;
                   1635:     pWin->absCorner.x += width - oldwidth;
                   1636:     pWin->absCorner.y += width - oldwidth;
                   1637: 
                   1638:     if (WasMapped)
                   1639:     {
                   1640:         oldRegion = (* pScreen->RegionCreate)(NULL, 1);
                   1641:         (* pScreen->RegionCopy)(oldRegion, pWin->borderClip);
                   1642:     }
                   1643: 
                   1644: 
                   1645:     box.x1 = pWin->absCorner.x;
                   1646:     box.y1 = pWin->absCorner.y;
                   1647:     box.x2 = box.x1 + pWin->clientWinSize.width;
                   1648:     box.y2 = box.y1 + pWin->clientWinSize.height;
                   1649:     (* pScreen->RegionReset)(pWin->winSize, &box);
                   1650:     (* pScreen->Intersect)(pWin->winSize, pWin->winSize, pParent->winSize);
                   1651: 
                   1652:     if (width)
                   1653:     {
                   1654:        box.x1 -= width;
                   1655:        box.y1 -= width;
                   1656:        box.x2 += width;
                   1657:        box.y2 += width;
                   1658:        (* pScreen->RegionReset)(pWin->borderSize, &box);
                   1659:         (* pScreen->Intersect)(pWin->borderSize, pWin->borderSize, 
                   1660:                               pParent->winSize);
                   1661:     }
                   1662:     else
                   1663:         (* pScreen->RegionCopy)(pWin->borderSize, pWin->winSize);
                   1664: 
                   1665:     if (WasMapped)
                   1666:     {
                   1667:         if (width < oldwidth)
                   1668:             pBox = (* pScreen->RegionExtents)(oldRegion);
                   1669:         else        
                   1670:             pBox = (* pScreen->RegionExtents)(pWin->borderSize);
                   1671:         anyMarked = MarkSiblingsBelowMe(pWin, pBox);
                   1672: 
                   1673:         (* pScreen->ValidateTree)(pParent,(anyMarked ? pWin : (WindowPtr)NULL),
                   1674:                                             TRUE, anyMarked );  
                   1675: 
                   1676:         (* pWin->CopyWindow)(pWin, oldpt, oldRegion);
                   1677: 
                   1678:         if (width > oldwidth)
                   1679:        {
                   1680:             DoObscures(pParent);
                   1681:            (* pScreen->Subtract)(pWin->borderExposed,
                   1682:                                  pWin->borderClip, pWin->winSize);
                   1683:            (* pWin->PaintWindowBorder)(pWin, pWin->borderExposed, PW_BORDER);
                   1684:            (* pScreen->RegionEmpty)(pWin->borderExposed);
                   1685:        }
                   1686:        else if (oldwidth > width)
                   1687:             HandleExposures(pParent);
                   1688: 
                   1689:        (* pScreen->RegionDestroy)(oldRegion);
                   1690: 
                   1691:     }
                   1692: }
                   1693: 
                   1694: 
                   1695: #define GET_INT16(m, f) \
                   1696:        if (m & mask) \
                   1697:           { \
                   1698:              f = (short) *pVlist;\
                   1699:            pVlist++; \
                   1700:          }
                   1701: #define GET_CARD16(m, f) \
                   1702:        if (m & mask) \
                   1703:          { \
                   1704:             f = (CARD16) *pVlist;\
                   1705:            pVlist++;\
                   1706:          }
                   1707: 
                   1708: #define GET_CARD8(m, f) \
                   1709:        if (m & mask) \
                   1710:          { \
                   1711:             f = (CARD8) *pVlist;\
                   1712:            pVlist++;\
                   1713:          }
                   1714: 
                   1715: #define ChangeMask (CWX | CWY | CWWidth | CWHeight)
                   1716: 
                   1717: #define IllegalInputOnlyConfigureMask (CWBorderWidth)
                   1718: 
                   1719: /*
                   1720:  * IsSiblingAboveMe
                   1721:  *     returns Above if pSib above pMe in stack or Below otherwise 
                   1722:  */
                   1723: 
                   1724: static int
                   1725: IsSiblingAboveMe(pMe, pSib)
                   1726:     WindowPtr pMe, pSib;
                   1727: {
                   1728:     WindowPtr pWin;
                   1729: 
                   1730:     pWin = pMe->parent->firstChild;
                   1731:     while (pWin)
                   1732:     {
                   1733:         if (pWin == pSib)
                   1734:             return(Above);
                   1735:         else if (pWin == pMe)
                   1736:             return(Below);
                   1737:         pWin = pWin->nextSib;
                   1738:     }
                   1739:     return(Below);
                   1740: }
                   1741: 
                   1742: static Bool
                   1743: AnyWindowOverlapsMe(pWin, box)
                   1744:     WindowPtr pWin;
                   1745:     BoxPtr box;
                   1746: {
                   1747:     WindowPtr pSib;
                   1748:     register ScreenPtr pScreen;
                   1749: 
                   1750:     pSib = pWin->parent->firstChild;
                   1751:     pScreen = pWin->drawable.pScreen;
                   1752:     while (pSib)
                   1753:     {
                   1754:         if (pSib == pWin)
                   1755:             return(FALSE);
                   1756:         else if ((pSib->mapped) && 
                   1757:                 ((* pScreen->RectIn)(pSib->borderSize, box) != rgnOUT))
                   1758:             return(TRUE);
                   1759:         pSib = pSib->nextSib;
                   1760:     }
                   1761:     return(FALSE);
                   1762: }
                   1763: 
                   1764: static WindowPtr
                   1765: IOverlapAnyWindow(pWin, box)
                   1766:     WindowPtr pWin;
                   1767:     BoxPtr box;
                   1768: {
                   1769:     WindowPtr pSib;
                   1770:     register ScreenPtr pScreen;
                   1771: 
                   1772:     pScreen = pWin->drawable.pScreen;
                   1773:     pSib = pWin->nextSib;
                   1774:     while (pSib)
                   1775:     {
                   1776:         if ((pSib->mapped) &&
                   1777:            ((* pScreen->RectIn)(pSib->borderSize, box) != rgnOUT))
                   1778:             return(pSib);
                   1779:         pSib = pSib->nextSib;
                   1780:     }
                   1781:     return((WindowPtr )NULL);
                   1782: }
                   1783: 
                   1784: /*
                   1785:  *   WhereDoIGoInTheStack() 
                   1786:  *        Given pWin and pSib and the relationshipe smode, return
                   1787:  *        the window that pWin should go ABOVE.
                   1788:  *        If a pSib is specified:
                   1789:  *            Above:  pWin is placed just above pSib
                   1790:  *            Below:  pWin is placed just below pSib
                   1791:  *            TopIf:  if pSib occludes pWin, then pWin is placed
                   1792:  *                    at the top of the stack
                   1793:  *            BottomIf:  if pWin occludes pSib, then pWin is 
                   1794:  *                       placed at the bottom of the stack
                   1795:  *            Opposite: if pSib occludes pWin, then pWin is placed at the
                   1796:  *                      top of the stack, else if pWin occludes pSib, then
                   1797:  *                      pWin is placed at the bottom of the stack
                   1798:  *
                   1799:  *        If pSib is NULL:
                   1800:  *            Above:  pWin is placed at the top of the stack
                   1801:  *            Below:  pWin is placed at the bottom of the stack
                   1802:  *            TopIf:  if any sibling occludes pWin, then pWin is placed at
                   1803:  *                    the top of the stack
                   1804:  *            BottomIf: if pWin occludes any sibline, then pWin is placed at
                   1805:  *                      the bottom of the stack
                   1806:  *            Opposite: if any sibling occludes pWin, then pWin is placed at
                   1807:  *                      the top of the stack, else if pWin occludes any
                   1808:  *                      sibling, then pWin is placed at the bottom of the stack
                   1809:  *
                   1810:  */
                   1811: 
                   1812: static WindowPtr 
                   1813: WhereDoIGoInTheStack(pWin, pSib, x, y, w, h, smode)
                   1814:     WindowPtr pWin, pSib;
                   1815:     short x, y, w, h;
                   1816:     int smode;
                   1817: {
                   1818:     BoxRec box;
                   1819:     register ScreenPtr pScreen;
                   1820: 
                   1821:     if ((pWin == pWin->parent->firstChild) && 
                   1822:        (pWin == pWin->parent->lastChild))
                   1823:         return((WindowPtr ) NULL);
                   1824:     pScreen = pWin->drawable.pScreen;
                   1825:     box.x1 = x;
                   1826:     box.y1 = y;
                   1827:     box.x2= x + w;
                   1828:     box.y2 = y + h;
                   1829:     switch (smode)
                   1830:     {
                   1831:       case Above:
                   1832:         if (pSib)
                   1833:            return(pSib);
                   1834:         else if (pWin == pWin->parent->firstChild)
                   1835:             return(pWin->nextSib);
                   1836:         else
                   1837:             return(pWin->parent->firstChild);
                   1838:       case Below:
                   1839:         if (pSib)
                   1840:            if (pSib->nextSib != pWin)
                   1841:                return(pSib->nextSib);
                   1842:            else
                   1843:                return(pWin->nextSib);
                   1844:         else
                   1845:             return((WindowPtr )NULL);
                   1846:       case TopIf:
                   1847:         if (pSib)
                   1848:        {
                   1849:             if ((IsSiblingAboveMe(pWin, pSib) == Above) &&
                   1850:                 ((* pScreen->RectIn)(pSib->borderSize, &box) != rgnOUT))
                   1851:                 return(pWin->parent->firstChild);
                   1852:             else
                   1853:                 return(pWin->nextSib);
                   1854:        }
                   1855:         else if (AnyWindowOverlapsMe(pWin, &box))
                   1856:             return(pWin->parent->firstChild);
                   1857:         else
                   1858:             return(pWin->nextSib);
                   1859:       case BottomIf:
                   1860:         if (pSib)
                   1861:        {
                   1862:             if ((IsSiblingAboveMe(pWin, pSib) == Below) &&
                   1863:                 ((* pScreen->RectIn)(pSib->borderSize, &box) != rgnOUT))
                   1864:                 return(WindowPtr)NULL;
                   1865:             else
                   1866:                 return(pWin->nextSib);
                   1867:        }
                   1868:         else if (IOverlapAnyWindow(pWin, &box))
                   1869:             return((WindowPtr)NULL);
                   1870:         else
                   1871:             return(pWin->nextSib);
                   1872:       case Opposite:
                   1873:         if (pSib)
                   1874:        {
                   1875:            if ((* pScreen->RectIn)(pSib->borderSize, &box) != rgnOUT)
                   1876:             {
                   1877:                 if (IsSiblingAboveMe(pWin, pSib) == Above)
                   1878:                     return(pWin->parent->firstChild);
                   1879:                 else 
                   1880:                     return((WindowPtr)NULL);
                   1881:             }
                   1882:             else
                   1883:                 return(pWin->nextSib);
                   1884:        }
                   1885:         else if (AnyWindowOverlapsMe(pWin, &box))
                   1886:        {
                   1887:            /* If I'm occluded, I can't possibly be the first child
                   1888:              * if (pWin == pWin->parent->firstChild)
                   1889:              *    return pWin->nextSib;
                   1890:             */
                   1891:             return(pWin->parent->firstChild);
                   1892:        }
                   1893:         else if (IOverlapAnyWindow(pWin, &box))
                   1894:             return((WindowPtr)NULL);
                   1895:         else
                   1896:             return pWin->nextSib;
                   1897:       default:
                   1898:       {
                   1899:         ErrorF("Internal error in ConfigureWindow, smode == %d\n",smode );
                   1900:         return((WindowPtr)pWin->nextSib);
                   1901:       }
                   1902:     }
                   1903: }
                   1904: 
                   1905: static void
                   1906: ReflectStackChange(pWin, pSib)
                   1907:     WindowPtr pWin, pSib;
                   1908: {
                   1909: /* Note that pSib might be NULL */
                   1910: 
                   1911:     Bool doValidation = (Bool)pWin->realized;
                   1912:     WindowPtr pParent;
                   1913:     int anyMarked;
                   1914:     BoxPtr box;
                   1915:     WindowPtr pFirstChange;
                   1916: 
                   1917:     /* if this is a root window, can't be restacked */
                   1918:     if (!(pParent = pWin->parent))
                   1919:         return ;
                   1920: 
                   1921:     pFirstChange = MoveWindowInStack(pWin, pSib);
                   1922: 
                   1923:     if (doValidation)
                   1924:     {
                   1925:         box = (* pWin->drawable.pScreen->RegionExtents)(pWin->borderSize);
                   1926:         anyMarked = MarkSiblingsBelowMe(pFirstChange, box);
                   1927:         (* pWin->drawable.pScreen->ValidateTree)(pParent, pFirstChange,
                   1928:                                         TRUE, anyMarked);
                   1929:        DoObscures(pParent);
                   1930:        HandleExposures(pParent);
                   1931:     }
                   1932: }
                   1933: 
                   1934: /*****
                   1935:  * ConfigureWindow
                   1936:  *****/
                   1937: 
                   1938: 
                   1939: int 
                   1940: ConfigureWindow(pWin, mask, vlist, client)
                   1941:     WindowPtr pWin;
                   1942:     unsigned long mask;
                   1943:     long *vlist;
                   1944:     ClientPtr client;
                   1945: {
                   1946: #define RESTACK_WIN    0
                   1947: #define MOVE_WIN       1
                   1948: #define RESIZE_WIN     2
                   1949:     WindowPtr pSib = (WindowPtr )NULL;
                   1950:     Window sibwid;
                   1951:     int index, tmask;
                   1952:     long *pVlist;
                   1953:     short x,   y, beforeX, beforeY;
                   1954:     unsigned short w = pWin->clientWinSize.width,
                   1955:                    h = pWin->clientWinSize.height,
                   1956:                   bw = pWin->borderWidth;
                   1957:     int action, 
                   1958:         smode = Above;
                   1959:     xEvent event;
                   1960: 
                   1961:     if ((pWin->class == InputOnly) && (mask & IllegalInputOnlyConfigureMask))
                   1962:         return(BadMatch);
                   1963: 
                   1964:     if ((mask & CWSibling) && !(mask & CWStackMode))
                   1965:         return(BadMatch);
                   1966: 
                   1967:     pVlist = vlist;
                   1968: 
                   1969:     if (pWin->parent)
                   1970:     {
                   1971:         x = pWin->absCorner.x - pWin->parent->absCorner.x - bw;
                   1972:         y = pWin->absCorner.y - pWin->parent->absCorner.y - bw;
                   1973:     }
                   1974:     else
                   1975:     {
                   1976:         x = pWin->absCorner.x;
                   1977:         y = pWin->absCorner.y;
                   1978:     }
                   1979:     beforeX = x;
                   1980:     beforeY = y;
                   1981:     action = RESTACK_WIN;      
                   1982:     if ((mask & (CWX | CWY)) && (!(mask & (CWHeight | CWWidth))))
                   1983:     {
                   1984:        GET_INT16(CWX, x);
                   1985:        GET_INT16(CWY, y);
                   1986:        action = MOVE_WIN;
                   1987:     }
                   1988:        /* or should be resized */
                   1989:     else if (mask & (CWX |  CWY | CWWidth | CWHeight))
                   1990:     {
                   1991:        GET_INT16(CWX, x);
                   1992:        GET_INT16(CWY, y);
                   1993:        GET_CARD16(CWWidth, w);
                   1994:        GET_CARD16 (CWHeight, h);
                   1995:        if (!w || !h)
                   1996:             return BadValue;
                   1997:         action = RESIZE_WIN;
                   1998:     }
                   1999:     tmask = mask & ~ChangeMask;
                   2000:     while (tmask) 
                   2001:     {
                   2002:        index = ffs(tmask) - 1;
                   2003:        tmask &= ~(index = (1 << index));
                   2004:        switch (index) 
                   2005:         {
                   2006:           case CWBorderWidth:   
                   2007:            GET_CARD16(CWBorderWidth, bw);
                   2008:            break;
                   2009:           case CWSibling: 
                   2010:            sibwid = (Window ) *pVlist;
                   2011:            pVlist++;
                   2012:             pSib = (WindowPtr )LookupID(sibwid, RT_WINDOW, RC_CORE);
                   2013:             if (!pSib)
                   2014:                 return(BadWindow);
                   2015:             if (pSib->parent != pWin->parent)
                   2016:                return(BadMatch);
                   2017:            if (pSib == pWin)
                   2018:                return(BadMatch);
                   2019:            break;
                   2020:           case CWStackMode:
                   2021:            GET_CARD8(CWStackMode, smode);
                   2022:            if ((smode != TopIf) && (smode != BottomIf) &&
                   2023:                (smode != Opposite) && (smode != Above) && (smode != Below))
                   2024:                    return(BadMatch);
                   2025:            break;
                   2026:          default: 
                   2027:            return(BadMatch);
                   2028:        }
                   2029:     }
                   2030:        /* root really can't be reconfigured, so just return */
                   2031:     if (!pWin->parent)    
                   2032:        return Success;
                   2033: 
                   2034:         /* Figure out if the window should be moved.  Doesnt
                   2035:            make the changes to the window if event sent */
                   2036: 
                   2037:     if (mask & CWStackMode)
                   2038:         pSib = WhereDoIGoInTheStack(pWin, pSib, x, y, w, h, smode);
                   2039:     else
                   2040:         pSib = pWin->nextSib;
                   2041: 
                   2042:     if ((!pWin->overrideRedirect) && 
                   2043:         (pWin->parent->allEventMasks & SubstructureRedirectMask))
                   2044:     {
                   2045:        event.u.u.type = ConfigureRequest;
                   2046:        event.u.configureRequest.window = pWin->wid;
                   2047:        event.u.configureRequest.parent = pWin->parent->wid;
                   2048:         if (mask & CWSibling)
                   2049:           event.u.configureRequest.sibling = sibwid;
                   2050:         else
                   2051:                    event.u.configureRequest.sibling = None;
                   2052:         if (mask & CWStackMode)
                   2053:           event.u.u.detail = smode;
                   2054:         else
                   2055:                    event.u.u.detail = Above;
                   2056:        event.u.configureRequest.x = x;
                   2057:        event.u.configureRequest.y = y;
                   2058:        event.u.configureRequest.width = w;
                   2059:        event.u.configureRequest.height = h;
                   2060:        event.u.configureRequest.borderWidth = bw; 
                   2061:        event.u.configureRequest.valueMask = mask;
                   2062:        if (MaybeDeliverEventsToClient(pWin->parent, &event, 1, 
                   2063:                SubstructureRedirectMask, client) == 1)
                   2064:            return(Success);            
                   2065:     }
                   2066:     if (action == RESIZE_WIN) {
                   2067:         Bool size_change = (w != pWin->clientWinSize.width)
                   2068:                         || (h != pWin->clientWinSize.height);
                   2069:        if (size_change && (pWin->allEventMasks & ResizeRedirectMask)) {
                   2070:            xEvent eventT;
                   2071:            eventT.u.u.type = ResizeRequest;
                   2072:            eventT.u.resizeRequest.window = pWin->wid;
                   2073:            eventT.u.resizeRequest.width = w;
                   2074:            eventT.u.resizeRequest.height = h;
                   2075:            if (MaybeDeliverEventsToClient(pWin, &eventT, 1, 
                   2076:                                       ResizeRedirectMask, client) == 1) {
                   2077:                 /* if event is delivered, leave the actual size alone. */
                   2078:                w = pWin->clientWinSize.width;
                   2079:                h = pWin->clientWinSize.height;
                   2080:                 size_change = FALSE;
                   2081:                }
                   2082:            }
                   2083:         if (!size_change) {
                   2084:            if (mask & (CWX | CWY))
                   2085:                action = MOVE_WIN;
                   2086:            else if (mask & (CWStackMode | CWSibling | CWBorderWidth))
                   2087:                action = RESTACK_WIN;
                   2088:             else   /* really nothing to do */
                   2089:                 return(Success) ;        
                   2090:            }
                   2091:         }
                   2092: 
                   2093:     if (action == RESIZE_WIN)
                   2094:             /* we've already checked whether there's really a size change */
                   2095:             goto ActuallyDoSomething;
                   2096:     if ((mask & CWX) && (x != beforeX))
                   2097:             goto ActuallyDoSomething;
                   2098:     if ((mask & CWY) && (y != beforeY))
                   2099:             goto ActuallyDoSomething;
                   2100:     if ((mask & CWBorderWidth) && (bw != pWin->borderWidth))
                   2101:             goto ActuallyDoSomething;
                   2102:     if (mask & CWStackMode) 
                   2103:     {
                   2104:         if (pWin->nextSib != pSib)
                   2105:             goto ActuallyDoSomething;
                   2106:     }
                   2107:     return(Success);
                   2108: 
                   2109: ActuallyDoSomething:
                   2110:     event.u.u.type = ConfigureNotify;
                   2111:     event.u.configureNotify.window = pWin->wid;
                   2112:     if (pSib)
                   2113:         event.u.configureNotify.aboveSibling = pSib->wid;
                   2114:     else
                   2115:         event.u.configureNotify.aboveSibling = None;
                   2116:     event.u.configureNotify.x = x;
                   2117:     event.u.configureNotify.y = y;
                   2118:     event.u.configureNotify.width = w;
                   2119:     event.u.configureNotify.height = h;
                   2120:     event.u.configureNotify.borderWidth = bw;
                   2121:     event.u.configureNotify.override = pWin->overrideRedirect;
                   2122:     DeliverEvents(pWin, &event, 1, NullWindow);
                   2123: 
                   2124:     if (mask & CWBorderWidth) 
                   2125:     {
                   2126:         if (action == RESTACK_WIN)
                   2127:             ChangeBorderWidth(pWin, bw);
                   2128:         else
                   2129:             pWin->borderWidth = bw;
                   2130:     }
                   2131:     if (action == MOVE_WIN)
                   2132:         MoveWindow(pWin, x, y, pSib);
                   2133:     else if (action == RESIZE_WIN)
                   2134:         SlideAndSizeWindow(pWin, x, y, w, h, pSib);
                   2135:     else if (mask & CWStackMode)
                   2136:         ReflectStackChange(pWin, pSib);
                   2137: 
                   2138:     return(Success);
                   2139: #undef RESTACK_WIN    
                   2140: #undef MOVE_WIN   
                   2141: #undef RESIZE_WIN  
                   2142: }
                   2143: 
                   2144: 
                   2145: /******
                   2146:  *
                   2147:  * CirculateWindow
                   2148:  *    For RaiseLowest, raises the lowest mapped child (if any) that is
                   2149:  *    obscured by another child to the top of the stack.  For LowerHighest,
                   2150:  *    lowers the highest mapped child (if any) that is obscuring another
                   2151:  *    child to the bottom of the stack.  Exposure processing is performed 
                   2152:  *
                   2153:  ******/
                   2154: 
                   2155: /* XXX shouldn't this be a case for the stack mode stuff?? */
                   2156: 
                   2157: int
                   2158: CirculateWindow(pParent, direction, client)
                   2159:     WindowPtr pParent;
                   2160:     int direction;
                   2161:     ClientPtr client;
                   2162: {
                   2163:     WindowPtr pChild, pSib;
                   2164:     xEvent event;
                   2165:     register ScreenPtr pScreen;
                   2166: 
                   2167:     if (pParent->firstChild == pParent->lastChild) 
                   2168:         return(Success) ;
                   2169: 
                   2170:     pScreen = pParent->drawable.pScreen;
                   2171:     if (direction == RaiseLowest)
                   2172:     {
                   2173:         pChild = pParent->lastChild;
                   2174:        while (pChild)
                   2175:        {
                   2176:            if (pChild->mapped && (pChild->visibility != VisibilityUnobscured))
                   2177:            {
                   2178:                 if (pParent->firstChild != pChild)
                   2179:                 {        
                   2180:                    if (pParent->lastChild == pChild)
                   2181:                        pParent->lastChild = pChild->prevSib;
                   2182:                     if (pChild->nextSib) 
                   2183:                         pChild->nextSib->prevSib = pChild->prevSib;
                   2184:                     if (pChild->prevSib) 
                   2185:                         pChild->prevSib->nextSib = pChild->nextSib;
                   2186:                     pChild->nextSib = pParent->firstChild;
                   2187:                     pChild->prevSib = (WindowPtr ) NULL;
                   2188:                    pParent->firstChild->prevSib = pChild;
                   2189:                     pParent->firstChild = pChild;
                   2190:                    pChild->mapped = 0;   /* to fool MapWindow */
                   2191:                    pSib = pChild;
                   2192:                    break;
                   2193:                }
                   2194:                return Success;
                   2195:            }
                   2196:            pChild = pChild->prevSib;
                   2197:        }
                   2198:     }
                   2199:     else if (direction == LowerHighest)
                   2200:     {
                   2201:         BoxPtr pBox;
                   2202: 
                   2203:         pChild = pParent->firstChild;
                   2204:        while (pChild)
                   2205:        {
                   2206:            if (pChild->mapped && (pChild->visibility == VisibilityUnobscured))
                   2207:            {
                   2208:                int result;
                   2209: 
                   2210:                    /* HACK -- this search is n squared */
                   2211: 
                   2212:                pSib = pChild->nextSib;
                   2213: 
                   2214:                    /* find a sibling that pChild overlaps */
                   2215: 
                   2216:                 pBox = (* pScreen->RegionExtents)(pChild->borderSize);
                   2217:                while (pSib)
                   2218:                {
                   2219:                    if (pSib->realized && (pSib->visibility != VisibilityUnobscured))
                   2220:                    {
                   2221:                        result = (* pScreen->RectIn)(pSib->borderSize, 
                   2222:                                        &pBox);
                   2223:                        if (result != rgnOUT) 
                   2224:                            break;
                   2225:                    }
                   2226:                    pSib = pSib->nextSib;
                   2227:                }
                   2228:                 if (pSib)
                   2229:                {
                   2230:                    WindowPtr pNext;
                   2231:                    pNext = pChild->nextSib;
                   2232:                    if (pParent->firstChild == pChild)
                   2233:                        pParent->firstChild = pNext;
                   2234:                     pNext->prevSib = pChild->prevSib;
                   2235:                     if (pChild->prevSib) 
                   2236:                         pChild->prevSib->nextSib = pNext;
                   2237:                     pChild->nextSib = (WindowPtr ) NULL;
                   2238:                     pChild->prevSib = pParent->lastChild;
                   2239:                    pParent->lastChild->nextSib = pChild;
                   2240:                     pParent->lastChild = pChild;
                   2241:                    pSib->mapped = 0;  /* to fool mapWindow */
                   2242:                    break;
                   2243:                }
                   2244:            }
                   2245:            pChild = pChild->nextSib;
                   2246:        }
                   2247:     }
                   2248:     if (!pChild)
                   2249:         return(Success) ;
                   2250:     event.u.circulate.window = pChild->wid;
                   2251:     event.u.circulate.parent = pParent->wid;
                   2252:     event.u.circulate.event = pParent->wid;
                   2253:     if (direction == RaiseLowest)
                   2254:        event.u.circulate.place = PlaceOnTop;
                   2255:     else
                   2256:         event.u.circulate.place = PlaceOnBottom;
                   2257: 
                   2258:     if (pParent->allEventMasks & SubstructureRedirectMask)
                   2259:     {
                   2260:        event.u.u.type = CirculateRequest;
                   2261:        if (MaybeDeliverEventsToClient(pParent, &event, 1, 
                   2262:                SubstructureRedirectMask, client) == 1)
                   2263:            return(Success);            
                   2264:     }
                   2265:     if (pParent->realized)
                   2266:         MapWindow(pSib, HANDLE_EXPOSURES, BITS_DISCARDED,
                   2267:              DONT_SEND_NOTIFICATION, client);
                   2268:     event.u.u.type = CirculateNotify;
                   2269:     DeliverEvents(pParent, &event, 1, NullWindow);
                   2270:     return(Success);
                   2271: }
                   2272: 
                   2273: /*****
                   2274:  *  ReparentWindow
                   2275:  *****/
                   2276: 
                   2277: static int
                   2278: CompareWIDs(pWin, wid)
                   2279:     WindowPtr pWin;
                   2280:     int *wid;
                   2281: {
                   2282:     if (pWin->wid == *wid) 
                   2283:        return(WT_STOPWALKING);
                   2284:     else
                   2285:        return(WT_WALKCHILDREN);
                   2286: }
                   2287: 
                   2288: int 
                   2289: ReparentWindow(pWin, pParent, x, y, client)
                   2290:     WindowPtr pWin, pParent;
                   2291:     short x,y;
                   2292:     ClientPtr client;
                   2293: {
                   2294:     WindowPtr pPrev;
                   2295:     Bool WasMapped = (Bool)(pWin->realized);
                   2296:     BoxRec box;
                   2297:     xEvent event;
                   2298:     short oldx, oldy;
                   2299:     int bw;
                   2300:     register ScreenPtr pScreen;
                   2301:     
                   2302:     if (pWin == pParent)
                   2303:         return(BadWindow);
                   2304:     if (TraverseTree(pWin, CompareWIDs, &pParent->wid) == WT_STOPWALKING)
                   2305:         return(BadWindow);             
                   2306: 
                   2307:     pScreen = pWin->drawable.pScreen;
                   2308:     event.u.u.type = ReparentNotify;
                   2309:     event.u.reparent.window = pWin->wid;
                   2310:     event.u.reparent.parent = pParent->wid;
                   2311:     event.u.reparent.x = x;
                   2312:     event.u.reparent.y = y;
                   2313:     event.u.reparent.override = pWin->overrideRedirect;
                   2314:     DeliverEvents(pWin, &event, 1, pParent);
                   2315: 
                   2316:     oldx = pWin->absCorner.x;
                   2317:     oldy = pWin->absCorner.y;
                   2318:     if (WasMapped) 
                   2319:        UnmapWindow(pWin, HANDLE_EXPOSURES, SEND_NOTIFICATION, FALSE);
                   2320: 
                   2321:     /* take out of sibling chain */
                   2322: 
                   2323:     pPrev = pWin->parent;
                   2324:     if (pPrev->firstChild == pWin)
                   2325:         pPrev->firstChild = pWin->nextSib;
                   2326:     if (pPrev->lastChild == pWin)
                   2327:         pPrev->lastChild = pWin->prevSib;
                   2328: 
                   2329:     if (pWin->nextSib) 
                   2330:         pWin->nextSib->prevSib = pWin->prevSib;
                   2331:     if (pWin->prevSib) 
                   2332:         pWin->prevSib->nextSib = pWin->nextSib;
                   2333: 
                   2334:     /* insert at begining of pParent */
                   2335:     pWin->parent = pParent;
                   2336:     pWin->nextSib = pParent->firstChild;
                   2337:     pWin->prevSib = (WindowPtr )NULL;
                   2338:     if (pParent->firstChild) 
                   2339:        pParent->firstChild->prevSib = pWin;
                   2340:     else
                   2341:         pParent->lastChild = pWin;
                   2342:     pParent->firstChild = pWin;
                   2343: 
                   2344:     /* clip to parent */
                   2345:     box.x1 = x + pParent->absCorner.x;
                   2346:     box.y1 = y + pParent->absCorner.y;
                   2347:     box.x2 = box.x1 + pWin->clientWinSize.width;
                   2348:     box.y2 = box.y1+ pWin->clientWinSize.height;
                   2349:     (* pScreen->RegionReset)(pWin->winSize, &box);
                   2350:     (* pScreen->Intersect)(pWin->winSize, pWin->winSize, 
                   2351:                                          pParent->winSize); 
                   2352: 
                   2353:     pWin->clientWinSize.x = x;
                   2354:     pWin->clientWinSize.y = y;
                   2355:     pWin->oldAbsCorner.x = oldx;
                   2356:     pWin->oldAbsCorner.y = oldy;
                   2357:     pWin->absCorner.x = box.x1;
                   2358:     pWin->absCorner.y = box.y1;
                   2359: 
                   2360:     if (bw = pWin->borderWidth)
                   2361:     {
                   2362:        box.x1 -= bw;
                   2363:        box.y1 -= bw;
                   2364:        box.x2 += bw;
                   2365:        box.y2 += bw;
                   2366:        (* pScreen->RegionReset)(pWin->borderSize, &box);
                   2367:         (* pScreen->Intersect)(pWin->borderSize, pWin->borderSize, 
                   2368:                               pParent->winSize);
                   2369:     }
                   2370:     else
                   2371:         (* pScreen->RegionCopy)(pWin->borderSize, pWin->winSize);
                   2372: 
                   2373:     (* pScreen->PositionWindow)(pWin, pWin->absCorner.x, pWin->absCorner.y);
                   2374:     ResizeChildrenWinSize(pWin, FALSE, 0, 0, DONT_USE_GRAVITY);
                   2375: 
                   2376:     if (WasMapped)    
                   2377:     {
                   2378:         MapWindow(pWin, HANDLE_EXPOSURES, BITS_DISCARDED, SEND_NOTIFICATION,
                   2379:                                            client);
                   2380:     }
                   2381:     RecalculateDeliverableEvents(pParent);
                   2382:     return(Success);
                   2383: }
                   2384: 
                   2385: static int
                   2386: MarkChildren(pWin, box)
                   2387:     WindowPtr pWin;
                   2388:     BoxPtr box;
                   2389: {
                   2390:     WindowPtr pChild;
                   2391:     int anyMarked=0;
                   2392:     register ScreenPtr pScreen;
                   2393: 
                   2394:     pScreen = pWin->drawable.pScreen;
                   2395:     pChild = pWin->firstChild;
                   2396:     while (pChild) 
                   2397:     {
                   2398:         if (pChild->mapped && ((* pScreen->RectIn)(pChild->borderSize, box)))
                   2399:         {
                   2400:             anyMarked++;
                   2401:            pChild->marked = 1;
                   2402:            anyMarked += MarkChildren(pChild, box);
                   2403:        }
                   2404:        pChild = pChild->nextSib;
                   2405:     }
                   2406:     return(anyMarked);
                   2407: }
                   2408: 
                   2409: static int
                   2410: MarkSiblingsBelowMe(pWin, box)
                   2411:     WindowPtr pWin;
                   2412:     BoxPtr box;
                   2413: {
                   2414:     WindowPtr pSib;
                   2415:     int anyMarked = 0;
                   2416:     register ScreenPtr pScreen;
                   2417: 
                   2418:     pScreen = pWin->drawable.pScreen;
                   2419: 
                   2420:     pSib = pWin;
                   2421:     while (pSib) 
                   2422:     {
                   2423:         if (pSib->mapped && ((* pScreen->RectIn)(pSib->borderSize, box)))
                   2424:         {
                   2425:            pSib->marked = 1;
                   2426:            anyMarked++;
                   2427:             if (pSib->firstChild)
                   2428:                anyMarked += MarkChildren(pSib, box);
                   2429:        }
                   2430:        pSib = pSib->nextSib;
                   2431:     }
                   2432:     return(anyMarked);
                   2433: }    
                   2434: 
                   2435: 
                   2436: /*****
                   2437:  * MapWindow
                   2438:  *    If some other client has selected SubStructureReDirect on the parent
                   2439:  *    and override-redirect is xFalse, then a MapRequest event is generated,
                   2440:  *    but the window remains unmapped.  Otherwise, the window is mapped and a
                   2441:  *    MapNotify event is generated.
                   2442:  *****/
                   2443: 
                   2444: static void
                   2445: RealizeChildren(pWin, client)
                   2446:     WindowPtr pWin;
                   2447:     ClientPtr client;
                   2448: {
                   2449:     WindowPtr pSib;
                   2450:     Bool (* Realize)();
                   2451: 
                   2452:     pSib = pWin;
                   2453:     if (pWin)
                   2454:        Realize = pSib->drawable.pScreen->RealizeWindow;
                   2455:     while (pSib)
                   2456:     {
                   2457:         if (pSib->mapped)
                   2458:        {
                   2459:            pSib->realized = TRUE;
                   2460:             pSib->viewable = pSib->class == InputOutput;
                   2461:             (* Realize)(pSib);
                   2462:            FlushClientCaches(pSib->wid);
                   2463:             if (pSib->firstChild) 
                   2464:                 RealizeChildren(pSib->firstChild, client);
                   2465:        }
                   2466:         pSib = pSib->nextSib;
                   2467:     }
                   2468: }
                   2469: 
                   2470: int
                   2471: MapWindow(pWin, SendExposures, BitsAvailable, SendNotification, client)
                   2472: 
                   2473:     WindowPtr pWin;
                   2474:     Bool SendExposures;
                   2475:     Bool BitsAvailable;
                   2476:     ClientPtr client;
                   2477: {
                   2478:     register ScreenPtr pScreen;
                   2479: 
                   2480:     WindowPtr pParent;
                   2481:     Bool anyMarked;
                   2482: 
                   2483:     if (pWin->mapped) 
                   2484:         return(Success);
                   2485:     pScreen = pWin->drawable.pScreen;
                   2486:     if (pParent = pWin->parent)
                   2487:     {
                   2488:         xEvent event;
                   2489:         BoxPtr box;
                   2490: 
                   2491:         if (SendNotification && (!pWin->overrideRedirect) && 
                   2492:            (pParent->allEventMasks & SubstructureRedirectMask))
                   2493:        {
                   2494:            event.u.u.type = MapRequest;
                   2495:            event.u.mapRequest.window = pWin->wid;
                   2496:            event.u.mapRequest.parent = pParent->wid;
                   2497: 
                   2498:            if (MaybeDeliverEventsToClient(pParent, &event, 1, 
                   2499:                SubstructureRedirectMask, client) == 1)
                   2500:                return(Success);            
                   2501:        }
                   2502: 
                   2503:        pWin->mapped = 1;          
                   2504:         if (SendNotification)
                   2505:        {
                   2506:            event.u.u.type = MapNotify;
                   2507:            event.u.mapNotify.window = pWin->wid;
                   2508:            event.u.mapNotify.override = pWin->overrideRedirect;
                   2509:            DeliverEvents(pWin, &event, 1, NullWindow);
                   2510:        }
                   2511: 
                   2512:        pWin->marked = 0;         /* so siblings get mapped correctly */
                   2513:         if (!pParent->realized)
                   2514:             return(Success);
                   2515:         pWin->realized = TRUE;
                   2516:         pWin->viewable = pWin->class == InputOutput;
                   2517:        /* We SHOULD check for an error value here XXX */
                   2518:         (* pScreen->RealizeWindow)(pWin);
                   2519:         if (pWin->firstChild)
                   2520:             RealizeChildren(pWin->firstChild, client);    
                   2521:         box = (* pScreen->RegionExtents)(pWin->borderSize);
                   2522:         anyMarked = MarkSiblingsBelowMe(pWin, box);
                   2523: 
                   2524:        /* kludge; remove when miregion works! */
                   2525:         if (!pParent->parent && 
                   2526:            (box->x1 == pParent->winSize->extents.x1) &&
                   2527:            (box->y1 == pParent->winSize->extents.y1) &&
                   2528:            (box->x2 == pParent->winSize->extents.x2) &&
                   2529:            (box->y2 == pParent->winSize->extents.y2) &&
                   2530:            (pParent->firstChild == pWin)) {
                   2531:          (*pWin->drawable.pScreen->RegionCopy)(pParent->clipList,
                   2532:                                                pParent->winSize);
                   2533:        }
                   2534:        /* end of kludge */
                   2535: 
                   2536:        (* pScreen->ValidateTree)(pParent, pWin, TRUE, anyMarked);
                   2537:         if (SendExposures) 
                   2538:         {
                   2539:            if (!BitsAvailable)
                   2540:            {
                   2541:                (* pScreen->RegionCopy)(pWin->exposed, pWin->clipList);  
                   2542:                DoObscures(pParent);
                   2543:                HandleExposures(pWin);
                   2544:            }
                   2545:            else
                   2546:            {
                   2547:                /*
                   2548:                 * Children shouldn't be in the parent's exposed region...
                   2549:                 (* pScreen->Subtract)(pParent->exposed, pParent->exposed, 
                   2550:                                      pWin->borderSize);
                   2551:                 */
                   2552:                 (* pScreen->RegionEmpty)(pWin->exposed);
                   2553:                DoObscures(pParent);
                   2554:                HandleExposures(pWin);
                   2555:            }
                   2556:        }
                   2557:     }
                   2558:     else
                   2559:     {
                   2560:        pWin->mapped = 1;
                   2561:         pWin->realized = TRUE;     /* for roots */
                   2562:         pWin->viewable = pWin->class == InputOutput;
                   2563:        /* We SHOULD check for an error value here XXX */
                   2564:         (* pScreen->RealizeWindow)(pWin);
                   2565:     }
                   2566:     
                   2567:     return(Success);
                   2568: }
                   2569: 
                   2570:  
                   2571: /*****
                   2572:  * MapSubwindows
                   2573:  *    Performs a MapWindow all unmapped children of the window, in top
                   2574:  *    to bottom stacking order.
                   2575:  *****/
                   2576: 
                   2577: MapSubwindows(pWin, SendExposures, client)
                   2578:     WindowPtr pWin;
                   2579:     Bool SendExposures;
                   2580:     ClientPtr client;
                   2581: {
                   2582:     WindowPtr pChild;
                   2583: 
                   2584:     pChild = pWin->firstChild;
                   2585:     while (pChild) 
                   2586:     {
                   2587:        if (!pChild->mapped) 
                   2588:            /* What about backing store? */
                   2589:             MapWindow(pChild, SendExposures, BITS_DISCARDED, 
                   2590:                      SEND_NOTIFICATION, client);
                   2591:         pChild = pChild->nextSib;
                   2592:     }
                   2593: }
                   2594: 
                   2595: /*****
                   2596:  * UnmapWindow
                   2597:  *    If the window is already unmapped, this request has no effect.
                   2598:  *    Otherwise, the window is unmapped and an UnMapNotify event is
                   2599:  *    generated.  Cannot unmap a root window.
                   2600:  *****/
                   2601:  
                   2602: static void
                   2603: UnrealizeChildren(pWin)
                   2604:     WindowPtr pWin;
                   2605: {
                   2606:     WindowPtr pSib;
                   2607:     void (*RegionEmpty)();
                   2608:     Bool (*Unrealize)();
                   2609:     
                   2610:     pSib = pWin;
                   2611:     if (pWin)
                   2612:     {
                   2613:         RegionEmpty = pWin->drawable.pScreen->RegionEmpty;
                   2614:         Unrealize = pWin->drawable.pScreen->UnrealizeWindow;
                   2615:     }
                   2616:     while (pSib)
                   2617:     {
                   2618:        pSib->realized = pSib->viewable = FALSE;
                   2619:         (* Unrealize)(pSib);
                   2620:                /* to force exposures later */
                   2621:         (* RegionEmpty)(pSib->clipList);    
                   2622:         (* RegionEmpty)(pSib->borderClip);
                   2623:        (* RegionEmpty)(pSib->exposed);
                   2624:        pWin->drawable.serialNumber = NEXT_SERIAL_NUMBER;
                   2625:         DeleteWindowFromAnyEvents(pSib, FALSE);
                   2626:         if (pSib->firstChild) 
                   2627:             UnrealizeChildren(pSib->firstChild);
                   2628:         pSib = pSib->nextSib;
                   2629:     }
                   2630: }
                   2631: 
                   2632: UnmapWindow(pWin, SendExposures, SendNotification, fromConfigure)
                   2633:     WindowPtr pWin;
                   2634:     Bool SendExposures, fromConfigure;
                   2635: {
                   2636:     WindowPtr pParent;
                   2637:     xEvent event;
                   2638:     Bool anyMarked;
                   2639:     Bool wasMapped = (Bool)pWin->realized;
                   2640:     BoxPtr box;
                   2641: 
                   2642:     if ((!pWin->mapped) || (!(pParent = pWin->parent))) 
                   2643:         return(Success);
                   2644:     if (SendNotification)
                   2645:     {
                   2646:        event.u.u.type = UnmapNotify;
                   2647:        event.u.unmapNotify.window = pWin->wid;
                   2648:        event.u.unmapNotify.fromConfigure = fromConfigure;
                   2649:        DeliverEvents(pWin, &event, 1, NullWindow);
                   2650:     }
                   2651:     if (wasMapped)
                   2652:     {
                   2653:         box = (* pWin->drawable.pScreen->RegionExtents)(pWin->borderSize);
                   2654:         anyMarked = MarkSiblingsBelowMe(pWin, box);
                   2655:     }
                   2656:     pWin->mapped = 0;
                   2657:     pWin->realized = pWin->viewable = FALSE;
                   2658:     if (wasMapped)
                   2659:     {
                   2660:        /* We SHOULD check for an error value here XXX */
                   2661:         (* pWin->drawable.pScreen->UnrealizeWindow)(pWin);
                   2662:         DeleteWindowFromAnyEvents(pWin, FALSE);
                   2663:         if (pWin->firstChild)
                   2664:             UnrealizeChildren(pWin->firstChild);
                   2665:         (* pWin->drawable.pScreen->ValidateTree)(pParent, pWin, 
                   2666:                                                 TRUE, anyMarked);
                   2667:         if (SendExposures)
                   2668:         {
                   2669:            HandleExposures(pParent);
                   2670:        }
                   2671:     }        
                   2672:     return(Success);
                   2673: }
                   2674: 
                   2675: /*****
                   2676:  * UnmapSubwindows
                   2677:  *    Performs an UnMapWindow request with the specified mode on all mapped
                   2678:  *    children of the window, in bottom to top stacking order.
                   2679:  *
                   2680:  *    XXX: Should use the validation function, not mess with the clip lists
                   2681:  *    directly, though this way is faster.
                   2682:  *****/
                   2683: 
                   2684: UnmapSubwindows(pWin, sendExposures)
                   2685:     WindowPtr pWin;
                   2686:     Bool sendExposures;
                   2687: {
                   2688:     WindowPtr pChild;
                   2689:     xEvent event;
                   2690:     void (*RegionEmpty)();
                   2691:     Bool (*UnrealizeWindow)();
                   2692:     Bool wasMapped = (Bool)pWin->realized;
                   2693: 
                   2694:     pChild = pWin->lastChild;
                   2695:     event.u.u.type = UnmapNotify;
                   2696:     event.u.unmapNotify.fromConfigure = xFalse;
                   2697:     RegionEmpty = pWin->drawable.pScreen->RegionEmpty;
                   2698:     UnrealizeWindow = pWin->drawable.pScreen->UnrealizeWindow;    
                   2699:     while (pChild) 
                   2700:     {
                   2701:        if (pChild->mapped) 
                   2702:         {
                   2703:            event.u.unmapNotify.window = pChild->wid;
                   2704:            event.u.unmapNotify.fromConfigure = xFalse;
                   2705:            DeliverEvents(pWin, &event, 1, NullWindow);
                   2706:            pChild->mapped = 0;
                   2707:             if (wasMapped)
                   2708:            {
                   2709:                pChild->realized = pChild->viewable = FALSE;
                   2710:                /* We SHOULD check for an error value here XXX */
                   2711:                 (* UnrealizeWindow)(pChild);
                   2712:                if (pChild->firstChild)
                   2713:                     UnrealizeChildren(pChild->firstChild);
                   2714:                 DeleteWindowFromAnyEvents(pChild, FALSE);
                   2715:                (* RegionEmpty)(pChild->clipList);/* to force expsoures later*/
                   2716:                (* RegionEmpty)(pChild->borderClip);
                   2717:                (* RegionEmpty)(pChild->borderExposed);
                   2718:                (* RegionEmpty)(pChild->exposed);      
                   2719:                pChild->drawable.serialNumber = NEXT_SERIAL_NUMBER;
                   2720:            }
                   2721:        }
                   2722:         pChild = pChild->prevSib;
                   2723:     }
                   2724:     if ((pWin->lastChild) && wasMapped)
                   2725:     {
                   2726:         (* pWin->drawable.pScreen->Intersect)(pWin->clipList,
                   2727:                                      pWin->winSize, pWin->borderClip);
                   2728:         (* pWin->drawable.pScreen->RegionCopy)(pWin->exposed, pWin->clipList);
                   2729:         HandleExposures(pWin);                 
                   2730:     }
                   2731: }
                   2732: 
                   2733: 
                   2734: void
                   2735: HandleSaveSet(client)
                   2736:     ClientPtr client;
                   2737: {
                   2738:     WindowPtr pParent, pWin;
                   2739:     int j;
                   2740: 
                   2741:     for (j=0; j<client->numSaved; j++)
                   2742:     {
                   2743:         pWin = (WindowPtr)client->saveSet[j]; 
                   2744:         pParent = pWin->parent;
                   2745:         while (pParent && (pParent->client == client))
                   2746:             pParent = pParent->parent;
                   2747:         if (pParent)
                   2748:        {
                   2749:             ReparentWindow(pWin, pParent, pWin->absCorner.x, 
                   2750:                           pWin->absCorner.y, client);
                   2751:            if(!pWin->realized && pWin->mapped)
                   2752:                pWin->mapped = FALSE;
                   2753:             MapWindow(pWin, HANDLE_EXPOSURES, BITS_DISCARDED,
                   2754:                            SEND_NOTIFICATION, client);
                   2755:        }
                   2756:     }
                   2757: }
                   2758:     
                   2759: Bool
                   2760: VisibleBoundingBoxFromPoint(pWin, x, y, box)
                   2761:     WindowPtr pWin;
                   2762:     int x, y;   /* in root */
                   2763:     BoxPtr box;   /* "return" value */
                   2764: {
                   2765:     if (!pWin->realized)
                   2766:        return (FALSE);
                   2767:     if ((* pWin->drawable.pScreen->PointInRegion)(pWin->clipList, x, y, box))
                   2768:         return(TRUE);
                   2769:     return(FALSE);
                   2770: }
                   2771: 
                   2772: Bool
                   2773: PointInWindowIsVisible(pWin, x, y)
                   2774:     WindowPtr pWin;
                   2775:     int x, y;  /* in root */
                   2776: {
                   2777:     BoxRec box;
                   2778: 
                   2779:     if (!pWin->realized)
                   2780:        return (FALSE);
                   2781:     if ((* pWin->drawable.pScreen->PointInRegion)(pWin->clipList, x, y, &box))
                   2782:         return(TRUE);
                   2783:     return(FALSE);
                   2784: }
                   2785: 
                   2786: 
                   2787: RegionPtr 
                   2788: NotClippedByChildren(pWin)
                   2789:     WindowPtr pWin;
                   2790: {
                   2791:     register ScreenPtr pScreen;
                   2792:     RegionPtr pReg;
                   2793: 
                   2794:     pScreen = pWin->drawable.pScreen;
                   2795:     pReg = (* pScreen->RegionCreate)(NULL, 1);
                   2796:     (* pScreen->Intersect) (pReg, pWin->borderClip, pWin->winSize);
                   2797:     return(pReg);
                   2798: }
                   2799: 
                   2800: 
                   2801: void
                   2802: SendVisibilityNotify(pWin)
                   2803:     WindowPtr pWin;
                   2804: {
                   2805:     xEvent event;
                   2806:     event.u.u.type = VisibilityNotify;
                   2807:     event.u.visibility.window = pWin->wid;
                   2808:     event.u.visibility.state = pWin->visibility;
                   2809:     DeliverEvents(pWin, &event, 1, NullWindow);
                   2810: }
                   2811: 
                   2812: 
                   2813: #define RANDOM_WIDTH 32
                   2814: 
                   2815: void
                   2816: SaveScreens(on, mode)
                   2817:     int on;
                   2818:     int mode;
                   2819: {
                   2820:     int i, j;
                   2821:     int what;
                   2822:     unsigned char *srcbits, *mskbits;
                   2823: 
                   2824:     if (on == SCREEN_SAVER_FORCER)
                   2825:     {
                   2826:         if (mode == ScreenSaverReset)
                   2827:             what = SCREEN_SAVER_OFF;
                   2828:         else               
                   2829:            what = SCREEN_SAVER_ON;
                   2830:        if (what == screenIsSaved)
                   2831:             return ;
                   2832:     }
                   2833:     else
                   2834:         what = on;
                   2835:     for (i = 0; i < screenInfo.numScreens; i++)
                   2836:     {
                   2837:         if (on == SCREEN_SAVER_FORCER)
                   2838:         {
                   2839:            (* screenInfo.screen[i].SaveScreen) (&screenInfo.screen[i], on);
                   2840:         }
                   2841:         if (what == SCREEN_SAVER_OFF)
                   2842:         {
                   2843:            if (savedScreenInfo[i].blanked == SCREEN_IS_BLANKED)
                   2844:            {
                   2845:               (* screenInfo.screen[i].SaveScreen) (&screenInfo.screen[i], on);
                   2846:            }
                   2847:             else if (savedScreenInfo[i].blanked == SCREEN_IS_TILED)
                   2848:            {
                   2849:                FreeResource(savedScreenInfo[i].wid, RC_NONE);
                   2850:                 savedScreenInfo[i].pWindow = (WindowPtr)NULL;
                   2851:                FreeResource(savedScreenInfo[i].cid, RC_NONE);
                   2852:            }
                   2853:            continue;
                   2854:         }
                   2855:         else if (what == SCREEN_SAVER_ON) 
                   2856:         {
                   2857:             if (screenIsSaved == SCREEN_SAVER_ON)  /* rotate pattern */
                   2858:             {
                   2859:                int new_x, new_y;
                   2860: 
                   2861:                if (savedScreenInfo[i].blanked == SCREEN_IS_TILED)
                   2862:                {
                   2863:                    new_x = random() % RANDOM_WIDTH;
                   2864:                    new_y = random() % RANDOM_WIDTH;
                   2865:                    MoveWindow(savedScreenInfo[i].pWindow, -new_x, -new_y, 
                   2866:                               savedScreenInfo[i].pWindow->nextSib);
                   2867:                }
                   2868:                continue;
                   2869:            }
                   2870:             if (ScreenSaverBlanking != DontPreferBlanking) 
                   2871:            {
                   2872:               if ((* screenInfo.screen[i].SaveScreen)
                   2873:                   (&screenInfo.screen[i], what))
                   2874:               {
                   2875:                   savedScreenInfo[i].blanked = SCREEN_IS_BLANKED;
                   2876:                    continue;
                   2877:               }
                   2878:            }
                   2879:             if (ScreenSaverAllowExposures != DontAllowExposures)
                   2880:             {
                   2881:                 int result;
                   2882:                 long attributes[1];
                   2883:                int mask = CWBackPixmap;
                   2884:                 WindowPtr pWin;                
                   2885:                CursorMetricRec cm;
                   2886:                 
                   2887:                 if (WindowTable[i].backgroundTile == 
                   2888:                    (PixmapPtr)USE_BACKGROUND_PIXEL)
                   2889:                {
                   2890:                     attributes[0] = WindowTable[i].backgroundPixel;
                   2891:                    mask = CWBackPixel;
                   2892:                }
                   2893:                 else
                   2894:                     attributes[0] = None;
                   2895: 
                   2896:                 pWin = savedScreenInfo[i].pWindow = 
                   2897:                        /* We SHOULD check for an error value here XXX */
                   2898:                     CreateWindow(savedScreenInfo[i].wid,
                   2899:                     &WindowTable[i], 
                   2900:                     -RANDOM_WIDTH, -RANDOM_WIDTH,
                   2901:                     screenInfo.screen[i].width + RANDOM_WIDTH, 
                   2902:                     screenInfo.screen[i].height + RANDOM_WIDTH,
                   2903:                     0, InputOutput, mask, attributes, 0, 0, 
                   2904:                     WindowTable[i].visual, &result);
                   2905:                 if (attributes[0] == None)
                   2906:                {
                   2907:                    
                   2908:                    pWin->backgroundTile = pWin->parent->backgroundTile;
                   2909:                    pWin->backgroundTile->refcnt++;
                   2910:                    (* screenInfo.screen[i].ChangeWindowAttributes)
                   2911:                                (pWin, CWBackPixmap);
                   2912:                }
                   2913:                AddResource(pWin->wid, RT_WINDOW, 
                   2914:                        savedScreenInfo[i].pWindow,
                   2915:                        DeleteWindow, RC_CORE);
                   2916:                cm.width=32;
                   2917:                cm.height=16;
                   2918:                cm.xhot=8;
                   2919:                cm.yhot=8;
                   2920:                 srcbits = (unsigned char *)Xalloc( PixmapBytePad(32, 1)*16); 
                   2921:                mskbits = (unsigned char *)Xalloc( PixmapBytePad(32, 1)*16); 
                   2922:                 for (j=0; j<PixmapBytePad(32, 1)*16; j++)
                   2923:                    srcbits[j] = mskbits[j] = 0x0;
                   2924:                pWin->cursor = AllocCursor( srcbits, mskbits, &cm,
                   2925:                    ~0, ~0, ~0, 0, 0, 0);
                   2926:                AddResource(savedScreenInfo[i].cid, RT_CURSOR,
                   2927:                        pWin->cursor,
                   2928:                        FreeCursor, RC_CORE);   
                   2929:                pWin->cursor->refcnt++; 
                   2930:                pWin->overrideRedirect = TRUE;
                   2931:                 MapWindow(pWin, TRUE, FALSE, FALSE, 0);
                   2932:                savedScreenInfo[i].blanked = SCREEN_IS_TILED;
                   2933:            }
                   2934:             else
                   2935:                savedScreenInfo[i].blanked = SCREEN_ISNT_SAVED;
                   2936:        }
                   2937:     }
                   2938:     screenIsSaved = what; 
                   2939: }
                   2940: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.