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

1.1       root        1: /* $Header: dispatch.c,v 1.16 87/09/12 21:40:28 sun Exp $ */
                      2: /************************************************************
                      3: Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
                      4: and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
                      5: 
                      6:                         All Rights Reserved
                      7: 
                      8: Permission to use, copy, modify, and distribute this software and its 
                      9: documentation for any purpose and without fee is hereby granted, 
                     10: provided that the above copyright notice appear in all copies and that
                     11: both that copyright notice and this permission notice appear in 
                     12: supporting documentation, and that the names of Digital or MIT not be
                     13: used in advertising or publicity pertaining to distribution of the
                     14: software without specific, written prior permission.  
                     15: 
                     16: DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
                     17: ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
                     18: DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
                     19: ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
                     20: WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
                     21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
                     22: SOFTWARE.
                     23: 
                     24: ********************************************************/
                     25: 
                     26: #include "X.h"
                     27: #define NEED_REPLIES
                     28: #define NEED_EVENTS
                     29: #include "Xproto.h"
                     30: #include "windowstr.h"
                     31: #include "fontstruct.h"
                     32: #include "dixfontstr.h"
                     33: #include "gcstruct.h"
                     34: #include "osstruct.h"
                     35: #include "selection.h"
                     36: #include "colormapst.h"
                     37: #include "cursorstr.h"
                     38: #include "scrnintstr.h"
                     39: #include "opaque.h"
                     40: #include "input.h"
                     41: #include "servermd.h"
                     42: 
                     43: extern WindowRec WindowTable[];
                     44: extern xConnSetupPrefix connSetupPrefix;
                     45: extern char *ConnectionInfo;
                     46: extern void ProcessInputEvents();
                     47: extern void ValidateGC();
                     48: 
                     49: Selection *CurrentSelections = (Selection *)NULL;
                     50: int NumCurrentSelections = 0;
                     51: 
                     52: extern long ScreenSaverTime;
                     53: extern long ScreenSaverInterval;
                     54: extern int  ScreenSaverBlanking;
                     55: extern int  ScreenSaverAllowExposures;
                     56: static ClientPtr onlyClient;
                     57: static Bool grabbingClient = FALSE;
                     58: static long *checkForInput[2];
                     59: extern Bool clientsDoomed;
                     60: extern int connBlockScreenStart;
                     61: 
                     62: extern int (* ProcVector[256]) ();
                     63: extern int (* SwappedProcVector[256]) ();
                     64: extern void (* EventSwapVector[128]) ();
                     65: extern void (* ReplySwapVector[256]) ();
                     66: extern void Swap32Write(), SLHostsExtend(), SQColorsExtend(), WriteSConnectionInfo();
                     67: void KillAllClients();
                     68: 
                     69: /* buffers for clients. legal values below */
                     70: static int nextFreeClientID=1;    /* 0 is for the server */
                     71: 
                     72: static int     nClients = 0;   /* number active clients */
                     73: 
                     74: #define SAME_SCREENS(a, b) (\
                     75:     (a.pScreen == b.pScreen))
                     76: 
                     77: #define VALIDATE(pGC, pDraw, rt) {\
                     78:     if (pGC->serialNumber != pDraw->serialNumber)\
                     79:     {\
                     80:        ValidateGC(pDraw, pGC);\
                     81:     } \
                     82: }
                     83: 
                     84: #define LEGAL_NEW_RESOURCE(id)\
                     85:     if ((LookupID(id, RT_ANY, RC_CORE) != 0) || (id & SERVER_BIT) \
                     86:        || (client->clientAsMask != CLIENT_BITS(id)))\
                     87:         return(BadIDChoice)
                     88: 
                     89: 
                     90: #define LOOKUP_DRAWABLE(did, client)\
                     91:     ((client->lastDrawableID == did) ? \
                     92:      (DrawablePtr)client->lastDrawable : (DrawablePtr)LookupDrawable(did, client))
                     93: 
                     94: #define VERIFY_GC(pGC, rid, client)\
                     95:     if (client->lastGCID == rid)\
                     96:     {\
                     97:         pGC = (GC *) client->lastGC;\
                     98:     }\
                     99:     else\
                    100:     {\
                    101:        pGC = (GC *)LookupID(rid, RT_GC, RC_CORE);\
                    102:         if (!pGC)\
                    103:         {\
                    104:            client->errorValue = rid;\
                    105:            return (BadGC);\
                    106:         }\
                    107:     }
                    108: 
                    109: #define VALIDATE_DRAWABLE_AND_GC(drawID, pDraw, pGC, client)\
                    110:     if ((client->lastDrawableID != drawID) || (client->lastGCID != stuff->gc))\
                    111:     {\
                    112:         if (client->lastDrawableID != drawID)\
                    113:        {\
                    114:            pDraw = (DrawablePtr)LookupID(drawID, RT_DRAWABLE, RC_CORE);\
                    115:            if (!pDraw)\
                    116:            {\
                    117:                client->errorValue = drawID; \
                    118:                 return (BadDrawable);\
                    119:            }\
                    120:            if ((pDraw->type == DRAWABLE_WINDOW) || \
                    121:                (pDraw->type == DRAWABLE_PIXMAP))\
                    122:            {\
                    123:                client->lastDrawable = (DrawablePtr)pDraw;\
                    124:                client->lastDrawableID = drawID;\
                    125:            }\
                    126:             else\
                    127:            {\
                    128:                client->errorValue = drawID;\
                    129:                 return (BadDrawable);\
                    130:            }\
                    131:         }\
                    132:         else\
                    133:            pDraw = (DrawablePtr)client->lastDrawable;\
                    134:         if (client->lastGCID != stuff->gc)\
                    135:        {\
                    136:            pGC = (GC *)LookupID(stuff->gc, RT_GC, RC_CORE);\
                    137:             if (!pGC)\
                    138:             {\
                    139:                client->errorValue = stuff->gc;\
                    140:                return (BadGC);\
                    141:             }\
                    142:             client->lastGC = (GCPtr)pGC;\
                    143:             client->lastGCID = stuff->gc;\
                    144:         }\
                    145:         else\
                    146:             pGC = (GC *) client->lastGC;\
                    147:         if ((pGC->depth != pDraw->depth) || (pGC->pScreen != pDraw->pScreen))\
                    148:        {\
                    149:             client->errorValue = stuff->gc;\
                    150:            client->lastGCID = -1;\
                    151:            return (BadMatch);\
                    152:          }\
                    153:     }\
                    154:     else\
                    155:     {\
                    156:         pGC = (GC *) client->lastGC;\
                    157:         pDraw = (DrawablePtr)client->lastDrawable;\
                    158:     }\
                    159:     if (pGC->serialNumber != pDraw->serialNumber)\
                    160:     { \
                    161:        ValidateGC(pDraw, pGC);\
                    162:     }
                    163: 
                    164: void
                    165: SetInputCheck(c0, c1)
                    166:     long *c0, *c1;
                    167: {
                    168:     checkForInput[0] = c0;
                    169:     checkForInput[1] = c1;
                    170: }
                    171: 
                    172: void
                    173: InitSelections()
                    174: {
                    175:     int i;
                    176: 
                    177:     if (NumCurrentSelections == 0)
                    178:     {    
                    179:        CurrentSelections = (Selection *)Xalloc(sizeof(Selection));
                    180:        NumCurrentSelections = 1;
                    181:     }
                    182:     for (i = 0; i< NumCurrentSelections; i++)
                    183:        CurrentSelections[i].window = None;
                    184: }
                    185: 
                    186: void 
                    187: FlushClientCaches(id)
                    188:     int id;
                    189: {
                    190:     int i;
                    191:     register ClientPtr client;
                    192: 
                    193:     client = clients[CLIENT_ID(id)];
                    194:     if (client == NullClient)
                    195:         return ;
                    196:     for (i=0; i<currentMaxClients; i++)
                    197:     {
                    198:         if (client == clients[i])
                    199:        {
                    200:             if (client->lastDrawableID == id)
                    201:                 client->lastDrawableID = INVALID;
                    202:             else if (client->lastGCID == id)
                    203:                 client->lastGCID = -1;
                    204:        }
                    205:     }
                    206: }
                    207: 
                    208: Dispatch()
                    209: {
                    210:     ClientPtr          *clientReady;     /* mask of request ready clients */
                    211:     ClientPtr          *newClients;      /* mask of new clients */ 
                    212:     int                        result;
                    213:     xReq               *request;
                    214:     int                        ErrorStatus;
                    215:     ClientPtr          client;
                    216:     int                        nready, nnew;
                    217: 
                    218:     nextFreeClientID = 1;
                    219:     InitSelections();
                    220:     nClients = 0;
                    221:     clientsDoomed = FALSE;
                    222: 
                    223:     clientReady = (ClientPtr *) ALLOCATE_LOCAL(sizeof(ClientPtr) * MaxClients);
                    224:     newClients = (ClientPtr *)ALLOCATE_LOCAL(sizeof(ClientPtr) * MaxClients);
                    225: 
                    226:     while (1) 
                    227:     {
                    228: StartOver:
                    229:         if (*checkForInput[0] != *checkForInput[1])
                    230:            ProcessInputEvents();
                    231: 
                    232:        WaitForSomething(clientReady, &nready, newClients, &nnew);
                    233: 
                    234:        /*****************
                    235:         *  Establish any new connections
                    236:         *****************/
                    237: 
                    238:        while (nnew--)
                    239:         {
                    240:            client = newClients[nnew];
                    241:            client->requestLogIndex = 0;
                    242:            InitClientResources(client);
                    243:            SendConnectionSetupInfo(client);
                    244:            nClients++;
                    245:        }
                    246: 
                    247:        /***************** 
                    248:        *  Handle events in round robin fashion, doing input between 
                    249:        *  each round 
                    250:        *****************/
                    251: 
                    252:        while ((nready--) > 0)
                    253:        {
                    254:            client = clientReady[nready];
                    255:            if (! client)
                    256:            {
                    257:                ErrorF( "HORRIBLE ERROR, unused client %d\n", nready);
                    258:                continue;
                    259:            }
                    260:            isItTimeToYield = FALSE;
                    261:  
                    262:             requestingClient = client;
                    263:            while (! isItTimeToYield)
                    264:            {
                    265:                if (*checkForInput[0] != *checkForInput[1])
                    266:                    ProcessInputEvents();
                    267:           
                    268:                /* now, finally, deal with client requests */
                    269: 
                    270:                request = (xReq *)ReadRequestFromClient(
                    271:                                      client, &result, request);
                    272:                if (result < 0) 
                    273:                {
                    274:                    CloseDownClient(client);
                    275:                    isItTimeToYield = TRUE;
                    276:                    continue;
                    277:                }
                    278:                else if (result == 0)
                    279:                {
                    280: #ifdef notdef
                    281:                    ErrorF(  "Blocked read in dispatcher\n");
                    282:                    ErrorF(  "reqType %d %d\n", 
                    283:                             (request ? request->reqType : -1),
                    284:                               nready);
                    285: #endif
                    286:                    if (nready > 0)
                    287:                        continue;
                    288:                    else
                    289:                        goto StartOver;
                    290:                }
                    291: 
                    292:                client->sequence++;
                    293:                client->requestBuffer = (pointer)request;
                    294:                if (client->requestLogIndex == MAX_REQUEST_LOG)
                    295:                    client->requestLogIndex = 0;
                    296:                client->requestLog[client->requestLogIndex] = request->reqType;
                    297:                client->requestLogIndex++;
                    298:                ErrorStatus = (* (client->swapped ?
                    299:                    SwappedProcVector : ProcVector)[request->reqType])(client);
                    300:            
                    301:                if (ErrorStatus != Success) 
                    302:                {
                    303:                    if (client->noClientException != Success)
                    304:                         CloseDownClient(client);
                    305:                     else
                    306:                        Oops(client, request->reqType, 0, ErrorStatus);
                    307:                    isItTimeToYield = TRUE;
                    308:                    continue;
                    309:                }
                    310:            }
                    311:        }
                    312:        /* Not an error, we just need to know to restart */
                    313:        if((nClients == -1) || clientsDoomed)
                    314:            break;         /* so that DEALLOCATE_LOCALs happen */
                    315:     }
                    316:     if (clientsDoomed)
                    317:         KillAllClients();
                    318:     DEALLOCATE_LOCAL(newClients);
                    319:     DEALLOCATE_LOCAL(clientReady);
                    320: }
                    321: 
                    322: int
                    323: ProcBadRequest(client)
                    324:     ClientPtr client;
                    325: {
                    326:     return (BadRequest);
                    327: }
                    328: 
                    329: extern int Ones();
                    330: 
                    331: int
                    332: ProcCreateWindow(client)
                    333:     register ClientPtr client;
                    334: {
                    335:     register WindowPtr pParent, pWin;
                    336:     REQUEST(xCreateWindowReq);
                    337:     int result;
                    338:     int len;
                    339: 
                    340:     REQUEST_AT_LEAST_SIZE(xCreateWindowReq);
                    341:     
                    342:     LEGAL_NEW_RESOURCE(stuff->wid); 
                    343:     if (!(pParent = (WindowPtr)LookupWindow(stuff->parent, client)))
                    344:         return BadWindow;
                    345:     len = stuff->length -  (sizeof(xCreateWindowReq) >> 2);
                    346:     if (Ones(stuff->mask) != len)
                    347:         return BadLength;
                    348:     if (!stuff->width || !stuff->height)
                    349:         return BadValue;
                    350:     pWin = CreateWindow(stuff->wid, pParent, stuff->x,
                    351:                              stuff->y, stuff->width, stuff->height, 
                    352:                              stuff->borderWidth, stuff->class,
                    353:                              stuff->mask, (long *) &stuff[1], 
                    354:                              stuff->depth, 
                    355:                              client, stuff->visual, &result);
                    356:     if (pWin)
                    357:         AddResource(stuff->wid, RT_WINDOW, pWin, DeleteWindow, RC_CORE);
                    358:     if (client->noClientException != Success)
                    359:         return(client->noClientException);
                    360:     else
                    361:         return(result);
                    362: }
                    363: 
                    364: int
                    365: ProcChangeWindowAttributes(client)
                    366:     register ClientPtr client;
                    367: {
                    368:     register WindowPtr pWin;
                    369:     REQUEST(xChangeWindowAttributesReq);
                    370:     register int result;
                    371:     int len;
                    372: 
                    373:     REQUEST_AT_LEAST_SIZE(xChangeWindowAttributesReq);
                    374:     pWin = (WindowPtr)LookupWindow(stuff->window, client);
                    375:     if (!pWin)
                    376:         return(BadWindow);
                    377:     len = stuff->length - (sizeof(xChangeWindowAttributesReq) >> 2);
                    378:     if (len != Ones(stuff->valueMask))
                    379:         return BadLength;
                    380:     client->lastDrawableID = INVALID;   
                    381:     result =  ChangeWindowAttributes(pWin, 
                    382:                                  stuff->valueMask, 
                    383:                                  (long *) &stuff[1], 
                    384:                                  client);
                    385:     if (client->noClientException != Success)
                    386:         return(client->noClientException);
                    387:     else
                    388:         return(result);
                    389: }
                    390: 
                    391: int
                    392: ProcGetWindowAttributes(client)
                    393:     register ClientPtr client;
                    394: {
                    395:     register WindowPtr pWin;
                    396:     REQUEST(xResourceReq);
                    397: 
                    398:     REQUEST_SIZE_MATCH(xResourceReq);
                    399:     pWin = (WindowPtr)LookupWindow(stuff->id, client);
                    400:     if (!pWin)
                    401:         return(BadWindow);
                    402:     GetWindowAttributes(pWin, client);
                    403:     return(client->noClientException);
                    404: }
                    405: 
                    406: int
                    407: ProcDestroyWindow(client)
                    408:     register ClientPtr client;
                    409: {
                    410:     register WindowPtr pWin;
                    411:     REQUEST(xResourceReq);
                    412: 
                    413:     REQUEST_SIZE_MATCH(xResourceReq);
                    414:     pWin = (WindowPtr)LookupWindow(stuff->id, client);
                    415:     if (!pWin)
                    416:         return(BadWindow);
                    417:     FreeResource(stuff->id, RC_NONE);
                    418:     return(client->noClientException);
                    419: }
                    420: 
                    421: int
                    422: ProcDestroySubwindows(client)
                    423:     register ClientPtr client;
                    424: {
                    425:     register WindowPtr pWin;
                    426:     REQUEST(xResourceReq);
                    427: 
                    428:     REQUEST_SIZE_MATCH(xResourceReq);
                    429:     pWin = (WindowPtr)LookupWindow(stuff->id, client);
                    430:     if (!pWin)
                    431:         return(BadWindow);
                    432:     DestroySubwindows(pWin, client);
                    433:     return(client->noClientException);
                    434: }
                    435: 
                    436: int
                    437: ProcChangeSaveSet(client)
                    438:     register ClientPtr client;
                    439: {
                    440:     register WindowPtr pWin;
                    441:     REQUEST(xChangeSaveSetReq);
                    442:     register result;
                    443:                  
                    444:     REQUEST_SIZE_MATCH(xChangeSaveSetReq);
                    445:     pWin = (WindowPtr)LookupWindow(stuff->window, client);
                    446:     if (!pWin)
                    447:         return(BadWindow);
                    448:     if (client->clientAsMask == (CLIENT_ID(pWin->wid)))
                    449:         return BadMatch;
                    450:     if ((stuff->mode == SetModeInsert) || (stuff->mode == SetModeDelete))
                    451:     {
                    452:         result = AlterSaveSetForClient(client, pWin, stuff->mode);
                    453:        if (client->noClientException != Success)
                    454:            return(client->noClientException);
                    455:        else
                    456:             return(result);
                    457:     }
                    458:     else
                    459:        return( BadValue );
                    460: }
                    461: 
                    462: int
                    463: ProcReparentWindow(client)
                    464:     register ClientPtr client;
                    465: {
                    466:     register WindowPtr pWin, pParent;
                    467:     REQUEST(xReparentWindowReq);
                    468:     register int result;
                    469: 
                    470:     REQUEST_SIZE_MATCH(xReparentWindowReq);
                    471:     pWin = (WindowPtr)LookupWindow(stuff->window, client);
                    472:     if (!pWin)
                    473:         return(BadWindow);
                    474:     pParent = (WindowPtr)LookupWindow(stuff->parent, client);
                    475:     if (!pParent)
                    476:         return(BadWindow);
                    477:     if (SAME_SCREENS(pWin->drawable, pParent->drawable))
                    478:     {
                    479:         if ((pWin->backgroundTile == (PixmapPtr)ParentRelative) &&
                    480:             (pParent->drawable.depth != pWin->drawable.depth))
                    481:             return BadMatch;
                    482:         result =  ReparentWindow(pWin, pParent, 
                    483:                         (short)stuff->x, (short)stuff->y, client);
                    484:        if (client->noClientException != Success)
                    485:             return(client->noClientException);
                    486:        else
                    487:             return(result);
                    488:     }
                    489:     else 
                    490:         return (BadMatch);
                    491: }
                    492: 
                    493: int
                    494: ProcMapWindow(client)
                    495:     register ClientPtr client;
                    496: {
                    497:     register WindowPtr pWin;
                    498:     REQUEST(xResourceReq);
                    499: 
                    500:     REQUEST_SIZE_MATCH(xResourceReq);
                    501:     pWin = (WindowPtr)LookupWindow(stuff->id, client);
                    502:     if (!pWin)
                    503:         return(BadWindow);
                    504:     MapWindow(pWin, HANDLE_EXPOSURES, BITS_DISCARDED,
                    505:                  SEND_NOTIFICATION, client);
                    506:            /* update cache to say it is mapped */
                    507:     return(client->noClientException);
                    508: }
                    509: 
                    510: int
                    511: ProcMapSubwindows(client)
                    512:     register ClientPtr client;
                    513: {
                    514:     register WindowPtr pWin;
                    515:     REQUEST(xResourceReq);
                    516: 
                    517:     REQUEST_SIZE_MATCH(xResourceReq);
                    518:     pWin = (WindowPtr)LookupWindow( stuff->id, client);
                    519:     if (!pWin)
                    520:         return(BadWindow);
                    521:     MapSubwindows(pWin, HANDLE_EXPOSURES, client);
                    522:            /* update cache to say it is mapped */
                    523:     return(client->noClientException);
                    524: }
                    525: 
                    526: int
                    527: ProcUnmapWindow(client)
                    528:     register ClientPtr client;
                    529: {
                    530:     register WindowPtr pWin;
                    531:     REQUEST(xResourceReq);
                    532: 
                    533:     REQUEST_SIZE_MATCH(xResourceReq);
                    534:     pWin = (WindowPtr)LookupWindow( stuff->id, client);
                    535:     if (!pWin)
                    536:         return(BadWindow);
                    537:     UnmapWindow(pWin, HANDLE_EXPOSURES, SEND_NOTIFICATION, FALSE);
                    538:            /* update cache to say it is mapped */
                    539:     return(client->noClientException);
                    540: }
                    541: 
                    542: int
                    543: ProcUnmapSubwindows(client)
                    544:     register ClientPtr client;
                    545: {
                    546:     register WindowPtr pWin;
                    547:     REQUEST(xResourceReq);
                    548: 
                    549:     REQUEST_SIZE_MATCH(xResourceReq);
                    550:     pWin = (WindowPtr)LookupWindow( stuff->id, client);
                    551:     if (!pWin)
                    552:         return(BadWindow);
                    553:     UnmapSubwindows(pWin, HANDLE_EXPOSURES, FALSE);
                    554:     return(client->noClientException);
                    555: }
                    556: 
                    557: int
                    558: ProcConfigureWindow(client)
                    559:     register ClientPtr client;
                    560: {
                    561:     register WindowPtr pWin;
                    562:     REQUEST(xConfigureWindowReq);
                    563:     register int result;
                    564:     int len;
                    565: 
                    566:     REQUEST_AT_LEAST_SIZE(xConfigureWindowReq);
                    567:     pWin = (WindowPtr)LookupWindow( stuff->window, client);
                    568:     if (!pWin)
                    569:         return(BadWindow);
                    570:     len = stuff->length - (sizeof(xConfigureWindowReq) >> 2);
                    571:     if (Ones(stuff->mask) != len)
                    572:         return BadLength;
                    573:     result =  ConfigureWindow(pWin, stuff->mask, (char *) &stuff[1], 
                    574:                              client);
                    575:     if (client->noClientException != Success)
                    576:         return(client->noClientException);
                    577:     else
                    578:         return(result);
                    579: }
                    580: 
                    581: int
                    582: ProcCirculateWindow(client)
                    583:     register ClientPtr client;
                    584: {
                    585:     register WindowPtr pWin;
                    586:     REQUEST(xCirculateWindowReq);
                    587: 
                    588:     REQUEST_SIZE_MATCH(xCirculateWindowReq);
                    589:     if ((stuff->direction != RaiseLowest) &&
                    590:        (stuff->direction != LowerHighest))
                    591:         return BadValue;
                    592:     pWin = (WindowPtr)LookupWindow(stuff->window, client);
                    593:     if (!pWin)
                    594:         return(BadWindow);
                    595:     CirculateWindow(pWin, stuff->direction, client);
                    596:     return(client->noClientException);
                    597: }
                    598: 
                    599: int
                    600: ProcGetGeometry(client)
                    601:     register ClientPtr client;
                    602: {
                    603:     xGetGeometryReply rep;
                    604:     register DrawablePtr pDraw;
                    605:     REQUEST(xResourceReq);
                    606: 
                    607:     REQUEST_SIZE_MATCH(xResourceReq);
                    608:     if (!(pDraw = LOOKUP_DRAWABLE(stuff->id, client)))
                    609:     {                /* can be inputonly */
                    610:         if (!(pDraw = (DrawablePtr)LookupWindow(stuff->id, client))) 
                    611:             return (BadDrawable);
                    612:     }
                    613:     rep.type = X_Reply;
                    614:     rep.length = 0;
                    615:     rep.sequenceNumber = client->sequence;
                    616:     rep.root = WindowTable[pDraw->pScreen->myNum].wid;
                    617:     rep.depth = pDraw->depth;
                    618: 
                    619:     if (pDraw->type == DRAWABLE_PIXMAP)
                    620:     {
                    621:        PixmapPtr pPixmap = (PixmapPtr)pDraw;
                    622: 
                    623:        rep.x = rep.y = rep.borderWidth = 0;
                    624:        rep.width = pPixmap->width;
                    625:        rep.height = pPixmap->height;
                    626:     }
                    627:     else
                    628:     {
                    629:         register WindowPtr pWin = (WindowPtr)pDraw;
                    630:        rep.x = pWin->clientWinSize.x - pWin->borderWidth;
                    631:        rep.y = pWin->clientWinSize.y - pWin->borderWidth;
                    632:        rep.borderWidth = pWin->borderWidth;
                    633:        rep.width = pWin->clientWinSize.width;
                    634:        rep.height = pWin->clientWinSize.height;
                    635:     }
                    636:     WriteReplyToClient(client, sizeof(xGetGeometryReply), &rep);
                    637:     return(client->noClientException);
                    638: }
                    639: 
                    640: int
                    641: ProcQueryTree(client)
                    642:     register ClientPtr client;
                    643: {
                    644: 
                    645:     xQueryTreeReply reply;
                    646:     int numChildren = 0;
                    647:     register WindowPtr pChild, pWin;
                    648:     Window  *childIDs = (Window *)NULL;
                    649:     REQUEST(xResourceReq);
                    650: 
                    651:     REQUEST_SIZE_MATCH(xResourceReq);
                    652:     pWin = (WindowPtr)LookupWindow(stuff->id, client);
                    653:     if (!pWin)
                    654:         return(BadWindow);
                    655:     reply.type = X_Reply;
                    656:     reply.root = WindowTable[pWin->drawable.pScreen->myNum].wid;
                    657:     reply.sequenceNumber = client->sequence;
                    658:     if (pWin->parent)
                    659:        reply.parent = pWin->parent->wid;
                    660:     else
                    661:         reply.parent = (Window)None;
                    662: 
                    663:     for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib)
                    664:        numChildren++;
                    665:     if (numChildren)
                    666:     {
                    667:        int curChild = 0;
                    668: 
                    669:        childIDs = (Window *) Xalloc(numChildren * sizeof(Window));
                    670:        for (pChild = pWin->lastChild; pChild; pChild = pChild->prevSib)
                    671:            childIDs[curChild++] = pChild->wid;
                    672:     }
                    673:     
                    674:     reply.nChildren = numChildren;
                    675:     reply.length = (numChildren * sizeof(Window)) >> 2;
                    676:     
                    677:     WriteReplyToClient(client, sizeof(xQueryTreeReply), &reply);
                    678:     if (numChildren)
                    679:     {
                    680:        client->pSwapReplyFunc = Swap32Write;
                    681:        WriteSwappedDataToClient(client, numChildren * sizeof(Window), childIDs);
                    682:        Xfree(childIDs);
                    683:     }
                    684: 
                    685:     return(client->noClientException);
                    686: }
                    687: 
                    688: int
                    689: ProcInternAtom(client)
                    690:     register ClientPtr client;
                    691: {
                    692:     Atom atom;
                    693:     char *tchar;
                    694:     REQUEST(xInternAtomReq);
                    695: 
                    696:     REQUEST_AT_LEAST_SIZE(xInternAtomReq);
                    697:     tchar = (char *) &stuff[1];
                    698:     atom = MakeAtom(tchar, stuff->nbytes, !stuff->onlyIfExists);
                    699:     if (atom || stuff->onlyIfExists)
                    700:     {
                    701:        xInternAtomReply reply;
                    702:        reply.type = X_Reply;
                    703:        reply.length = 0;
                    704:        reply.sequenceNumber = client->sequence;
                    705:        reply.atom = (atom ? atom : None);
                    706:        WriteReplyToClient(client, sizeof(xInternAtomReply), &reply);
                    707:        return(client->noClientException);
                    708:     }
                    709:     else
                    710:        return (BadAlloc);
                    711: }
                    712: 
                    713: int
                    714: ProcGetAtomName(client)
                    715:     register ClientPtr client;
                    716: {
                    717:     char *str;
                    718:     xGetAtomNameReply reply;
                    719:     int len;
                    720:     REQUEST(xResourceReq);
                    721: 
                    722:     REQUEST_SIZE_MATCH(xResourceReq);
                    723:     if (str = (char *)NameForAtom(stuff->id)) 
                    724:     {
                    725:        len = strlen(str);
                    726:        reply.type = X_Reply;
                    727:        reply.length = (len + 3) >> 2;
                    728:        reply.sequenceNumber = client->sequence;
                    729:        reply.nameLength = len;
                    730:        WriteReplyToClient(client, sizeof(xGetAtomNameReply), &reply);
                    731:        WriteToClient(client, len, str);
                    732:        return(client->noClientException);
                    733:     }
                    734:     else 
                    735:     { 
                    736:        client->errorValue = stuff->id;
                    737:        return (BadAtom);
                    738:     }
                    739: }
                    740: 
                    741: int 
                    742: ProcDeleteProperty(client)
                    743:     register ClientPtr client;
                    744: {
                    745:     WindowPtr pWin;
                    746:     REQUEST(xDeletePropertyReq);
                    747:     int result;
                    748:               
                    749:     REQUEST_SIZE_MATCH(xDeletePropertyReq);
                    750:     pWin = (WindowPtr)LookupWindow(stuff->window, client);
                    751:     if (!pWin)
                    752:         return(BadWindow);
                    753:     if (ValidAtom(stuff->property))
                    754:     {
                    755:        result = DeleteProperty(pWin, stuff->property);
                    756:         if (client->noClientException != Success)
                    757:             return(client->noClientException);
                    758:        else
                    759:            return(result);
                    760:     }
                    761:     else 
                    762:        return (BadAtom);
                    763: }
                    764: 
                    765: 
                    766: int
                    767: ProcSetSelectionOwner(client)
                    768:     register ClientPtr client;
                    769: {
                    770:     WindowPtr pWin;
                    771:     TimeStamp time;
                    772:     REQUEST(xSetSelectionOwnerReq);
                    773: 
                    774:     REQUEST_SIZE_MATCH(xSetSelectionOwnerReq);
                    775:     time = ClientTimeToServerTime(stuff->time);
                    776: 
                    777:     /* If the client's time stamp is in the future relative to the server's
                    778:        time stamp, do not set the selection, just return success. */
                    779:     if (CompareTimeStamps(time, currentTime) == LATER)
                    780:        return Success;
                    781:     if (stuff->window != None)
                    782:     {
                    783:         pWin = (WindowPtr)LookupWindow(stuff->window, client);
                    784:         if (!pWin)
                    785:             return(BadWindow);
                    786:     }
                    787:     else
                    788:         pWin = (WindowPtr)None;
                    789:     if (ValidAtom(stuff->selection))
                    790:     {
                    791:        int i = 0;
                    792: 
                    793:        /*
                    794:         * First, see if the selection is already set... 
                    795:         */
                    796:        while ((i < NumCurrentSelections) && 
                    797:               CurrentSelections[i].selection != stuff->selection) 
                    798:             i++;
                    799:         if (i < NumCurrentSelections)
                    800:         {        
                    801:            xEvent event;
                    802: 
                    803:            /* If the timestamp in client's request is in the past relative
                    804:                to the time stamp indicating the last time the owner of the
                    805:                selection was set, do not set the selection, just return 
                    806:                success. */
                    807:             if (CompareTimeStamps(time, CurrentSelections[i].lastTimeChanged)
                    808:                == EARLIER)
                    809:                return Success;
                    810:             if (CurrentSelections[i].pWin != (WindowPtr)None)
                    811:            {
                    812:                event.u.u.type = SelectionClear;
                    813:                event.u.selectionClear.time = time.milliseconds;
                    814:                event.u.selectionClear.window = CurrentSelections[i].window;
                    815:                event.u.selectionClear.atom = CurrentSelections[i].selection;
                    816:                DeliverEvents(CurrentSelections[i].pWin, &event, 1);
                    817:            }
                    818:            CurrentSelections[i].selection = stuff->selection;
                    819:            CurrentSelections[i].lastTimeChanged = time;
                    820:            CurrentSelections[i].window = stuff->window;
                    821:            CurrentSelections[i].pWin = pWin;
                    822:            CurrentSelections[i].client = client;
                    823:            return (client->noClientException);
                    824:        }
                    825:        /*
                    826:         * It doesn't exist, so add it...
                    827:         */
                    828:             NumCurrentSelections++;
                    829:            CurrentSelections = 
                    830:                        (Selection *)Xrealloc(CurrentSelections, 
                    831:                        NumCurrentSelections * sizeof(Selection));
                    832: 
                    833:        CurrentSelections[i].selection = stuff->selection;
                    834:         CurrentSelections[i].lastTimeChanged = time;
                    835:        CurrentSelections[i].window = stuff->window;
                    836:        CurrentSelections[i].pWin = pWin;
                    837:        CurrentSelections[i].client = client;
                    838:        return (client->noClientException);
                    839:     }
                    840:     else 
                    841:         return (BadAtom);
                    842: }
                    843: 
                    844: int
                    845: ProcGetSelectionOwner(client)
                    846:     register ClientPtr client;
                    847: {
                    848:     REQUEST(xResourceReq);
                    849: 
                    850:     REQUEST_SIZE_MATCH(xResourceReq);
                    851:     if (ValidAtom(stuff->id))
                    852:     {
                    853:        int i;
                    854:         xGetSelectionOwnerReply reply;
                    855: 
                    856:        i = 0;
                    857:         while ((i < NumCurrentSelections) && 
                    858:               CurrentSelections[i].selection != stuff->id) i++;
                    859:         reply.type = X_Reply;
                    860:        reply.length = 0;
                    861:        reply.sequenceNumber = client->sequence;
                    862:         if (i < NumCurrentSelections)
                    863:             reply.owner = CurrentSelections[i].window;
                    864:         else
                    865:             reply.owner = None;
                    866:         WriteReplyToClient(client, sizeof(xGetSelectionOwnerReply), &reply);
                    867:         return(client->noClientException);
                    868:     }
                    869:     else            
                    870:         return (BadAtom); 
                    871: }
                    872: 
                    873: int
                    874: ProcConvertSelection(client)
                    875:     register ClientPtr client;
                    876: {
                    877:     Bool paramsOkay = TRUE;
                    878:     xEvent event;
                    879:     WindowPtr pWin;
                    880:     REQUEST(xConvertSelectionReq);
                    881: 
                    882:     REQUEST_SIZE_MATCH(xConvertSelectionReq);
                    883:     pWin = (WindowPtr)LookupWindow(stuff->requestor, client);
                    884:     if (!pWin)
                    885:         return(BadWindow);
                    886: 
                    887:     paramsOkay = (ValidAtom(stuff->selection) && ValidAtom(stuff->target));
                    888:     if (stuff->property != None)
                    889:        paramsOkay &= ValidAtom(stuff->property);
                    890:     if (paramsOkay)
                    891:     {
                    892:        int i;
                    893: 
                    894:        i = 0;
                    895:        while ((i < NumCurrentSelections) && 
                    896:               CurrentSelections[i].selection != stuff->selection) i++;
                    897:        if ((i < NumCurrentSelections) && 
                    898:            (CurrentSelections[i].window != None))
                    899:        {        
                    900:            event.u.u.type = SelectionRequest;
                    901:            event.u.selectionRequest.time = stuff->time;
                    902:            event.u.selectionRequest.owner = 
                    903:                        CurrentSelections[i].window;
                    904:            event.u.selectionRequest.requestor = stuff->requestor;
                    905:            event.u.selectionRequest.selection = stuff->selection;
                    906:            event.u.selectionRequest.target = stuff->target;
                    907:            event.u.selectionRequest.property = stuff->property;
                    908:            if (TryClientEvents(
                    909:                CurrentSelections[i].client, &event, 1, NoEventMask,
                    910:                NoEventMask, NullGrab))
                    911:                return (client->noClientException);
                    912:        }
                    913:        event.u.u.type = SelectionNotify;
                    914:        event.u.selectionNotify.time = stuff->time;
                    915:        event.u.selectionNotify.requestor = stuff->requestor;
                    916:        event.u.selectionNotify.selection = stuff->selection;
                    917:        event.u.selectionNotify.target = stuff->target;
                    918:        event.u.selectionNotify.property = None;
                    919:        DeliverEvents(pWin, &event, 1);
                    920:        return (client->noClientException);
                    921:     }
                    922:     else 
                    923:         return (BadAtom);
                    924: }
                    925: 
                    926: int
                    927: ProcGrabServer(client)
                    928:     register ClientPtr client;
                    929: {
                    930:     OnlyListenToOneClient(client);
                    931:     grabbingClient = TRUE;
                    932:     onlyClient = client;
                    933:     return(client->noClientException);
                    934: }
                    935: 
                    936: int
                    937: ProcUngrabServer(client)
                    938:     register ClientPtr client;
                    939: {
                    940:     REQUEST(xReq);
                    941:     REQUEST_SIZE_MATCH(xReq);
                    942:     grabbingClient = FALSE;
                    943:     ListenToAllClients();
                    944:     return(client->noClientException);
                    945: }
                    946: 
                    947: int
                    948: ProcTranslateCoords(client)
                    949:     register ClientPtr client;
                    950: {
                    951:     REQUEST(xTranslateCoordsReq);
                    952: 
                    953:     register WindowPtr pWin, pDst;
                    954:     xTranslateCoordsReply rep;
                    955: 
                    956:     REQUEST_SIZE_MATCH(xTranslateCoordsReq);
                    957:     pWin = (WindowPtr)LookupWindow(stuff->srcWid, client);
                    958:     if (!pWin)
                    959:         return(BadWindow);
                    960:     pDst = (WindowPtr)LookupWindow(stuff->dstWid, client);
                    961:     if (!pDst)
                    962:         return(BadWindow);
                    963:     rep.type = X_Reply;
                    964:     rep.length = 0;
                    965:     rep.sequenceNumber = client->sequence;
                    966:     if (!SAME_SCREENS(pWin->drawable, pDst->drawable))
                    967:     {
                    968:        rep.sameScreen = xFalse;
                    969:         rep.child = None;
                    970:        rep.dstX = rep.dstY = 0;
                    971:     }
                    972:     else
                    973:     {
                    974:        INT16 x, y;
                    975:        rep.sameScreen = xTrue;
                    976:        rep.child = None;
                    977:        /* computing absolute coordinates -- adjust to destination later */
                    978:        x = pWin->absCorner.x + stuff->srcX;
                    979:        y = pWin->absCorner.y + stuff->srcY;
                    980:        pWin = pDst->firstChild;
                    981:        while (pWin)
                    982:        {
                    983:            if ((pWin->mapped) &&
                    984:                (x >= pWin->absCorner.x - pWin->borderWidth) &&
                    985:                (x < pWin->absCorner.x + pWin->clientWinSize.width +
                    986:                 pWin->borderWidth) &&
                    987:                (y >= pWin->absCorner.y - pWin->borderWidth) &&
                    988:                (y < pWin->absCorner.y + pWin->clientWinSize.height
                    989:                 + pWin->borderWidth))
                    990:             {
                    991:                rep.child = pWin->wid;
                    992:                pWin = (WindowPtr) NULL;
                    993:            }
                    994:            else
                    995:                pWin = pWin->nextSib;
                    996:        }
                    997:        /* adjust to destination coordinates */
                    998:        rep.dstX = x - pDst->absCorner.x;
                    999:        rep.dstY = y - pDst->absCorner.y;
                   1000:     }
                   1001:     WriteReplyToClient(client, sizeof(xTranslateCoordsReply), &rep);
                   1002:     return(client->noClientException);
                   1003: }
                   1004: 
                   1005: int
                   1006: ProcOpenFont(client)
                   1007:     register ClientPtr client;
                   1008: {
                   1009:     FontPtr pFont;
                   1010:     REQUEST(xOpenFontReq);
                   1011: 
                   1012:     REQUEST_AT_LEAST_SIZE(xOpenFontReq);
                   1013:     client->errorValue = stuff->fid;
                   1014:     LEGAL_NEW_RESOURCE(stuff->fid);
                   1015:     if ( pFont = OpenFont( stuff->nbytes, (char *)&stuff[1]))
                   1016:     {
                   1017:        AddResource( stuff->fid, RT_FONT, pFont, CloseFont,RC_CORE);
                   1018:        return(client->noClientException);
                   1019:     }
                   1020:     else
                   1021:        return (BadName);
                   1022: }
                   1023: 
                   1024: int
                   1025: ProcCloseFont(client)
                   1026:     register ClientPtr client;
                   1027: {
                   1028:     FontPtr pFont;
                   1029:     REQUEST(xResourceReq);
                   1030: 
                   1031:     REQUEST_SIZE_MATCH(xResourceReq);
                   1032:     pFont = (FontPtr)LookupID(stuff->id, RT_FONT, RC_CORE);
                   1033:     if ( pFont != (FontPtr)NULL)       /* id was valid */
                   1034:     {
                   1035:         FreeResource( stuff->id, RC_NONE);
                   1036:        return(client->noClientException);
                   1037:     }
                   1038:     else
                   1039:         return (BadFont);
                   1040: }
                   1041: 
                   1042: int
                   1043: ProcQueryFont(client)
                   1044:     register ClientPtr client;
                   1045: {
                   1046:     xQueryFontReply    *reply;
                   1047:     FontPtr pFont;
                   1048:     register GC *pGC;
                   1049:     REQUEST(xResourceReq);
                   1050: 
                   1051:     REQUEST_SIZE_MATCH(xResourceReq);
                   1052:     client->errorValue = stuff->id;            /* EITHER font or gc */
                   1053:     pFont = (FontPtr)LookupID(stuff->id, RT_FONT, RC_CORE);
                   1054:     if (!pFont)
                   1055:     {
                   1056:          /* can't use VERIFY_GC because it might return BadGC */
                   1057:        pGC = (GC *) LookupID(stuff->id, RT_GC, RC_CORE);
                   1058:         if (!pGC)
                   1059:             return(BadFont);     /* procotol spec says only error is BadFont */
                   1060:        pFont = pGC->font;
                   1061:     }
                   1062: 
                   1063:     {
                   1064:        CharInfoPtr     pmax = &pFont->pFI->maxbounds;
                   1065:        CharInfoPtr     pmin = &pFont->pFI->minbounds;
                   1066:        int             nprotoxcistructs;
                   1067:        int             rlength;
                   1068: 
                   1069:        nprotoxcistructs = (
                   1070:           pmax->metrics.rightSideBearing == pmin->metrics.rightSideBearing &&
                   1071:           pmax->metrics.leftSideBearing == pmin->metrics.leftSideBearing &&
                   1072:           pmax->metrics.descent == pmin->metrics.descent &&
                   1073:           pmax->metrics.ascent == pmin->metrics.ascent &&
                   1074:           pmax->metrics.characterWidth == pmin->metrics.characterWidth) ?
                   1075:                0 : n2dChars(pFont->pFI);
                   1076: 
                   1077:        rlength = sizeof(xQueryFontReply) +
                   1078:                     pFont->pFI->nProps * sizeof(xFontProp)  +
                   1079:                     nprotoxcistructs * sizeof(xCharInfo);
                   1080:        reply = (xQueryFontReply *)ALLOCATE_LOCAL(rlength);
                   1081:        if(!reply)
                   1082:        {
                   1083:            return(client->noClientException = BadAlloc);
                   1084:        }
                   1085: 
                   1086:        reply->type = X_Reply;
                   1087:        reply->length = (rlength - sizeof(xGenericReply)) >> 2;
                   1088:        reply->sequenceNumber = client->sequence;
                   1089:        QueryFont( pFont, reply, nprotoxcistructs);
                   1090: 
                   1091:         WriteReplyToClient(client, rlength, reply);
                   1092:        DEALLOCATE_LOCAL(reply);
                   1093:        return(client->noClientException);
                   1094:     }
                   1095: }
                   1096: 
                   1097: int
                   1098: ProcQueryTextExtents(client)
                   1099:     register ClientPtr client;
                   1100: {
                   1101:     REQUEST(xQueryTextExtentsReq);
                   1102:     xQueryTextExtentsReply reply;
                   1103:     FontPtr pFont;
                   1104:     GC *pGC;
                   1105:     ExtentInfoRec info;
                   1106:     short length;
                   1107: 
                   1108:     REQUEST_AT_LEAST_SIZE(xQueryTextExtentsReq);
                   1109:         
                   1110:     pFont = (FontPtr)LookupID( stuff->fid, RT_FONT, RC_CORE);
                   1111:     if (!pFont)
                   1112:     {
                   1113:         pGC = (GC *)LookupID( stuff->fid, RT_GC, RC_CORE);
                   1114:         if (!pGC)
                   1115:             return(BadFont);
                   1116:        pFont = pGC->font;
                   1117:     }
                   1118:     length = stuff->length - (sizeof(xQueryTextExtentsReq) >> 2);
                   1119:     length = length << 1;
                   1120:     if (stuff->oddLength)
                   1121:         length--;
                   1122:     QueryTextExtents(pFont, length, &stuff[1], &info);   
                   1123:     reply.type = X_Reply;
                   1124:     reply.length = 0;
                   1125:     reply.sequenceNumber = client->sequence;
                   1126:     reply.drawDirection = info.drawDirection;
                   1127:     reply.fontAscent = info.fontAscent;
                   1128:     reply.fontDescent = info.fontDescent;
                   1129:     reply.overallAscent = info.overallAscent;
                   1130:     reply.overallDescent = info.overallDescent;
                   1131:     reply.overallWidth = info.overallWidth;
                   1132:     reply.overallLeft = info.overallLeft;
                   1133:     reply.overallRight = info.overallRight;
                   1134:     WriteReplyToClient(client, sizeof(xQueryTextExtentsReply), &reply);
                   1135:     return(client->noClientException);
                   1136: }
                   1137: 
                   1138: int
                   1139: ProcListFonts(client)
                   1140:     register ClientPtr client;
                   1141: {
                   1142:     xListFontsReply reply; 
                   1143:     FontPathPtr fpr;
                   1144:     int stringLens, i;
                   1145:     char *bufptr, *bufferStart;
                   1146:     REQUEST(xListFontsReq);
                   1147: 
                   1148:     REQUEST_AT_LEAST_SIZE(xListFontsReq);
                   1149: 
                   1150:     fpr = ExpandFontNamePattern( stuff->nbytes, 
                   1151:                                              &stuff[1], stuff->maxNames);
                   1152:     stringLens = 0;
                   1153:     for (i=0; i<fpr->npaths; i++)
                   1154:         stringLens += fpr->length[i];
                   1155: 
                   1156:     reply.type = X_Reply;
                   1157:     reply.length = (stringLens + fpr->npaths + 3) >> 2;
                   1158:     reply.nFonts = fpr->npaths;
                   1159:     reply.sequenceNumber = client->sequence;
                   1160: 
                   1161:     bufptr = bufferStart = (char *)ALLOCATE_LOCAL(reply.length << 2);
                   1162:     if(!bufptr)
                   1163:         return(client->noClientException = BadAlloc);
                   1164: 
                   1165:             /* since WriteToClient long word aligns things, 
                   1166:               copy to temp buffer and write all at once */
                   1167:     for (i=0; i<fpr->npaths; i++)
                   1168:     {
                   1169:         *bufptr++ = fpr->length[i];
                   1170:         bcopy(fpr->paths[i], bufptr,  fpr->length[i]);
                   1171:         bufptr += fpr->length[i];
                   1172:     }
                   1173:     WriteReplyToClient(client, sizeof(xListFontsReply), &reply);
                   1174:     WriteToClient(client, stringLens + fpr->npaths, bufferStart);
                   1175:     FreeFontRecord(fpr);
                   1176:     DEALLOCATE_LOCAL(bufferStart);
                   1177:     
                   1178:     return(client->noClientException);
                   1179: }
                   1180: 
                   1181: int
                   1182: ProcListFontsWithInfo(client)
                   1183:     register ClientPtr client;
                   1184: {
                   1185:     register xListFontsWithInfoReply *reply;
                   1186:     xListFontsWithInfoReply last_reply;
                   1187:     FontRec font;
                   1188:     FontInfoRec finfo;
                   1189:     register FontPathPtr fpaths;
                   1190:     register char **path;
                   1191:     register int n, *length;
                   1192:     int rlength;
                   1193:     REQUEST(xListFontsWithInfoReq);
                   1194: 
                   1195:     REQUEST_AT_LEAST_SIZE(xListFontsWithInfoReq);
                   1196: 
                   1197:     fpaths = ExpandFontNamePattern( stuff->nbytes, &stuff[1], stuff->maxNames);
                   1198:     font.pFI = &finfo;
                   1199:     for (n = fpaths->npaths, path = fpaths->paths, length = fpaths->length;
                   1200:         --n >= 0;
                   1201:         path++, length++)
                   1202:     {
                   1203:        if (!(DescribeFont(*path, *length, &finfo, &font.pFP)))
                   1204:           continue;
                   1205:        rlength = sizeof(xListFontsWithInfoReply)
                   1206:                    + finfo.nProps * sizeof(xFontProp);
                   1207:        if (reply = (xListFontsWithInfoReply *)ALLOCATE_LOCAL(rlength))
                   1208:        {
                   1209:                reply->type = X_Reply;
                   1210:                reply->sequenceNumber = client->sequence;
                   1211:                reply->length = (rlength - sizeof(xGenericReply)
                   1212:                                 + *length + 3) >> 2;
                   1213:                QueryFont(&font, (xQueryFontReply *) reply, 0);
                   1214:                reply->nameLength = *length;
                   1215:                reply->nReplies = n;
                   1216:                WriteReplyToClient(client, rlength, reply);
                   1217:                WriteToClient(client, *length, *path);
                   1218:                DEALLOCATE_LOCAL(reply);
                   1219:        }
                   1220:        Xfree((char *)font.pFP);
                   1221:     }
                   1222:     FreeFontRecord(fpaths);
                   1223:     bzero((char *)&last_reply, sizeof(xListFontsWithInfoReply));
                   1224:     last_reply.type = X_Reply;
                   1225:     last_reply.sequenceNumber = client->sequence;
                   1226:     last_reply.length = (sizeof(xListFontsWithInfoReply)
                   1227:                          - sizeof(xGenericReply)) >> 2;
                   1228:     WriteReplyToClient(client, sizeof(xListFontsWithInfoReply), &last_reply);
                   1229:     return(client->noClientException);
                   1230: }
                   1231: 
                   1232: int
                   1233: ProcCreatePixmap(client)
                   1234:     register ClientPtr client;
                   1235: {
                   1236:     PixmapPtr pMap;
                   1237:     register DrawablePtr pDraw;
                   1238:     REQUEST(xCreatePixmapReq);
                   1239:     DepthPtr pDepth;
                   1240:     register int i;
                   1241: 
                   1242:     REQUEST_AT_LEAST_SIZE(xCreatePixmapReq);
                   1243:     client->errorValue = stuff->pid;
                   1244:     LEGAL_NEW_RESOURCE(stuff->pid);
                   1245:     if (!(pDraw = LOOKUP_DRAWABLE(stuff->drawable, client)))
                   1246:     {        /* can be inputonly */
                   1247:         if (!(pDraw = (DrawablePtr)LookupWindow(stuff->drawable, client))) 
                   1248:             return (BadDrawable);
                   1249:     }
                   1250: 
                   1251:     if (!stuff->width || !stuff->height)
                   1252:         return BadValue;
                   1253:     if (stuff->depth != 1)
                   1254:     {
                   1255:         pDepth = pDraw->pScreen->allowedDepths;
                   1256:         for (i=0; i<pDraw->pScreen->numDepths; i++, pDepth++)
                   1257:           if (pDepth->depth == stuff->depth)
                   1258:                goto CreatePmap;
                   1259:         return BadValue;
                   1260:     }
                   1261: CreatePmap:
                   1262:     pMap = (PixmapPtr)(*pDraw->pScreen->CreatePixmap)
                   1263:                (pDraw->pScreen, stuff->width,
                   1264:                 stuff->height, stuff->depth);
                   1265:     if (pMap)
                   1266:     {
                   1267:        pMap->drawable.serialNumber = NEXT_SERIAL_NUMBER;
                   1268:        AddResource(
                   1269:            stuff->pid, RT_PIXMAP, pMap, pDraw->pScreen->DestroyPixmap,
                   1270:            RC_CORE);
                   1271:        return(client->noClientException);
                   1272:     }
                   1273:     else
                   1274:        return (BadAlloc);
                   1275: }
                   1276: 
                   1277: int
                   1278: ProcFreePixmap(client)
                   1279:     register ClientPtr client;
                   1280: {
                   1281:     PixmapPtr pMap;
                   1282: 
                   1283:     REQUEST(xResourceReq);
                   1284: 
                   1285:     REQUEST_SIZE_MATCH(xResourceReq);
                   1286:     pMap = (PixmapPtr)LookupID(stuff->id, RT_PIXMAP, RC_CORE);
                   1287:     if (pMap) 
                   1288:     {
                   1289:        FreeResource(stuff->id, RC_NONE);
                   1290:        return(client->noClientException);
                   1291:     }
                   1292:     else 
                   1293:     {
                   1294:        client->errorValue = stuff->id;
                   1295:        return (BadPixmap);
                   1296:     }
                   1297: }
                   1298: 
                   1299: int
                   1300: ProcCreateGC(client)
                   1301:     register ClientPtr client;
                   1302: {
                   1303:     int error;
                   1304:     GC *pGC;
                   1305:     register DrawablePtr pDraw;
                   1306:     int len;
                   1307:     REQUEST(xCreateGCReq);
                   1308: 
                   1309:     REQUEST_AT_LEAST_SIZE(xCreateGCReq);
                   1310:     client->errorValue = stuff->gc;
                   1311:     LEGAL_NEW_RESOURCE(stuff->gc);
                   1312:     if (!(pDraw = LOOKUP_DRAWABLE( stuff->drawable, client) ))
                   1313:         return (BadDrawable);
                   1314:     len = stuff->length -  (sizeof(xCreateGCReq) >> 2);
                   1315:     if (len != Ones(stuff->mask))
                   1316:         return BadLength;
                   1317:     pGC = (GC *)CreateGC(pDraw, stuff->mask, 
                   1318:                         (char *) &stuff[1], &error);
                   1319:     if (error != Success)
                   1320:         return error;
                   1321:     if (pGC)
                   1322:     {
                   1323:        AddResource(stuff->gc, RT_GC, pGC, FreeGC, RC_CORE);
                   1324:        return(client->noClientException);
                   1325:     }
                   1326:     else 
                   1327:        return (BadAlloc);
                   1328: }
                   1329: 
                   1330: int
                   1331: ProcChangeGC(client)
                   1332:     register ClientPtr client;
                   1333: {
                   1334:     GC *pGC;
                   1335:     REQUEST(xChangeGCReq);
                   1336:     int result, len;
                   1337:                
                   1338:     REQUEST_AT_LEAST_SIZE(xChangeGCReq);
                   1339:     VERIFY_GC(pGC, stuff->gc, client);
                   1340:     len = stuff->length -  (sizeof(xChangeGCReq) >> 2);
                   1341:     if (len != Ones(stuff->mask))
                   1342:         return BadLength;
                   1343:     result = DoChangeGC(pGC, stuff->mask, (int *) &stuff[1], 0);
                   1344:     if (client->noClientException != Success)
                   1345:         return(client->noClientException);
                   1346:     else
                   1347:         return(result);
                   1348: }
                   1349: 
                   1350: int
                   1351: ProcCopyGC(client)
                   1352:     register ClientPtr client;
                   1353: {
                   1354:     register GC *dstGC;
                   1355:     register GC *pGC;
                   1356:     REQUEST(xCopyGCReq);
                   1357: 
                   1358:     REQUEST_SIZE_MATCH(xCopyGCReq);
                   1359:     VERIFY_GC( pGC, stuff->srcGC, client);
                   1360:     VERIFY_GC( dstGC, stuff->dstGC, client);
                   1361:     if ((dstGC->pScreen != pGC->pScreen) || (dstGC->depth != pGC->depth))
                   1362:         return (BadMatch);    
                   1363:     CopyGC(pGC, dstGC, stuff->mask);
                   1364:     return (client->noClientException);
                   1365: }
                   1366: 
                   1367: int
                   1368: ProcSetDashes(client)
                   1369:     register ClientPtr client;
                   1370: {
                   1371:     register GC *pGC;
                   1372:     int result;
                   1373:     REQUEST(xSetDashesReq);
                   1374: 
                   1375:     REQUEST_AT_LEAST_SIZE(xSetDashesReq);
                   1376:     if ((sizeof(xSetDashesReq) >> 2) == stuff->length)
                   1377:          return BadValue;
                   1378: 
                   1379:     VERIFY_GC(pGC,stuff->gc, client);
                   1380: 
                   1381:     result = SetDashes(pGC, stuff->dashOffset, stuff->nDashes, &stuff[1]);
                   1382:     if (client->noClientException != Success)
                   1383:         return(client->noClientException);
                   1384:     else
                   1385:         return(result);
                   1386: }
                   1387: 
                   1388: int
                   1389: ProcSetClipRectangles(client)
                   1390:     register ClientPtr client;
                   1391: {
                   1392:     int        nr;
                   1393:     register GC *pGC;
                   1394:     REQUEST(xSetClipRectanglesReq);
                   1395: 
                   1396:     REQUEST_AT_LEAST_SIZE(xSetClipRectanglesReq);
                   1397:     if ((stuff->ordering != Unsorted) && (stuff->ordering != YSorted) &&
                   1398:        (stuff->ordering != YXSorted) && (stuff->ordering != YXBanded))
                   1399:         return BadValue;
                   1400:     VERIFY_GC(pGC,stuff->gc, client);
                   1401:     pGC->clipOrg.x = stuff->xOrigin;
                   1402:     pGC->stateChanges |= GCClipXOrigin;
                   1403:                 
                   1404:     pGC->clipOrg.y = stuff->yOrigin;
                   1405:     pGC->stateChanges |= GCClipYOrigin;
                   1406:                 
                   1407:     nr = ((stuff->length  << 2) - sizeof(xSetClipRectanglesReq)) >> 3;
                   1408:     SetClipRects(pGC, nr, &stuff[1], stuff->ordering);
                   1409:     pGC->stateChanges |= GCClipMask;
                   1410:     pGC->serialNumber = 0;
                   1411:     return(client->noClientException);
                   1412: }
                   1413: 
                   1414: int
                   1415: ProcFreeGC(client)
                   1416:     register ClientPtr client;
                   1417: {
                   1418:     register GC *pGC;
                   1419:     REQUEST(xResourceReq);
                   1420: 
                   1421:     REQUEST_SIZE_MATCH(xResourceReq);
                   1422:     VERIFY_GC(pGC,stuff->id,client);
                   1423:     FreeResource(stuff->id, RC_NONE);
                   1424:     return(client->noClientException);
                   1425: }
                   1426: 
                   1427: int
                   1428: ProcClearToBackground(client)
                   1429:     register ClientPtr client;
                   1430: {
                   1431:     REQUEST(xClearAreaReq);
                   1432:     register WindowPtr pWin;
                   1433: 
                   1434:     REQUEST_SIZE_MATCH(xClearAreaReq);
                   1435:     pWin = (WindowPtr)LookupWindow( stuff->window, client);
                   1436:     if (!pWin)
                   1437:         return(BadWindow);
                   1438:     if (pWin->class == InputOnly)
                   1439:     {
                   1440:        client->errorValue = stuff->window;
                   1441:        return (BadWindow);
                   1442:     }              
                   1443:     if ((stuff->exposures != xTrue) && (stuff->exposures != xFalse))
                   1444:         return(BadValue);
                   1445:     (*pWin->ClearToBackground)(pWin, stuff->x, stuff->y,
                   1446:                               stuff->width, stuff->height,
                   1447:                               (Bool)stuff->exposures);
                   1448:     return(client->noClientException);
                   1449: }
                   1450: 
                   1451: int
                   1452: ProcCopyArea(client)
                   1453:     register ClientPtr client;
                   1454: {
                   1455:     register DrawablePtr pDst;
                   1456:     register DrawablePtr pSrc;
                   1457:     register GC *pGC;
                   1458:     REQUEST(xCopyAreaReq);
                   1459: 
                   1460:     REQUEST_SIZE_MATCH(xCopyAreaReq);
                   1461: 
                   1462:     VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pDst, pGC, client); 
                   1463:     if (stuff->dstDrawable != stuff->srcDrawable)
                   1464:     {
                   1465:         if (!(pSrc = LOOKUP_DRAWABLE(stuff->srcDrawable, client)))
                   1466:             return(BadDrawable);
                   1467:        if ((pDst->pScreen != pSrc->pScreen) || (pDst->depth != pSrc->depth))
                   1468:        {
                   1469:            client->errorValue = stuff->dstDrawable;
                   1470:            return (BadMatch);
                   1471:        }
                   1472:     }
                   1473:     else
                   1474:         pSrc = pDst;
                   1475:     (*pGC->CopyArea)(pSrc, pDst, pGC, stuff->srcX, stuff->srcY,
                   1476:                                 stuff->width, stuff->height, 
                   1477:                                 stuff->dstX, stuff->dstY);
                   1478:                                 
                   1479:     return(client->noClientException);
                   1480: }
                   1481: 
                   1482: int
                   1483: ProcCopyPlane(client)
                   1484:     register ClientPtr client;
                   1485: {
                   1486:     register DrawablePtr psrcDraw, pdstDraw;
                   1487:     register GC *pGC;
                   1488:     REQUEST(xCopyPlaneReq);
                   1489: 
                   1490:     REQUEST_SIZE_MATCH(xCopyPlaneReq);
                   1491: 
                   1492:    /* Check to see if stuff->bitPlane has exactly ONE bit set */
                   1493:    if(stuff->bitPlane == 0 || stuff->bitPlane & (stuff->bitPlane - 1)) 
                   1494:        return(BadValue);
                   1495: 
                   1496:     VALIDATE_DRAWABLE_AND_GC(stuff->dstDrawable, pdstDraw, pGC, client);
                   1497:     if (stuff->dstDrawable != stuff->srcDrawable)
                   1498:     {
                   1499:         if (!(psrcDraw = LOOKUP_DRAWABLE(stuff->srcDrawable, client)))
                   1500:             return(BadDrawable);
                   1501:        if (pdstDraw->pScreen != psrcDraw->pScreen)
                   1502:        {
                   1503:            client->errorValue = stuff->dstDrawable;
                   1504:            return (BadMatch);
                   1505:        }
                   1506:     }
                   1507:     else
                   1508:         psrcDraw = pdstDraw;
                   1509:     (*pGC->CopyPlane)(psrcDraw, pdstDraw, pGC, stuff->srcX, stuff->srcY,
                   1510:                                 stuff->width, stuff->height, 
                   1511:                                 stuff->dstX, stuff->dstY, stuff->bitPlane);
                   1512:     return(client->noClientException);
                   1513: }
                   1514: 
                   1515: int
                   1516: ProcPolyPoint(client)
                   1517:     register ClientPtr client;
                   1518: {
                   1519:     int npoint;
                   1520:     register GC *pGC;
                   1521:     register DrawablePtr pDraw;
                   1522:     REQUEST(xPolyPointReq);
                   1523: 
                   1524:     REQUEST_AT_LEAST_SIZE(xPolyPointReq);
                   1525:     if ((stuff->coordMode != CoordModeOrigin) && 
                   1526:        (stuff->coordMode != CoordModePrevious))
                   1527:         return BadValue;
                   1528:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client); 
                   1529:     npoint = ((stuff->length << 2) - sizeof(xPolyPointReq)) >> 2;
                   1530:     if (npoint)
                   1531:         (*pGC->PolyPoint)(pDraw, pGC, stuff->coordMode, npoint,
                   1532:                          (xPoint *) &stuff[1]);
                   1533:     return (client->noClientException);
                   1534: }
                   1535: 
                   1536: int
                   1537: ProcPolyLine(client)
                   1538:     register ClientPtr client;
                   1539: {
                   1540:     int npoint;
                   1541:     register GC *pGC;
                   1542:     register DrawablePtr pDraw;
                   1543:     REQUEST(xPolyLineReq);
                   1544: 
                   1545:     REQUEST_AT_LEAST_SIZE(xPolyLineReq);
                   1546:     if ((stuff->coordMode != CoordModeOrigin) && 
                   1547:        (stuff->coordMode != CoordModePrevious))
                   1548:         return BadValue;
                   1549:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1550:     npoint = ((stuff->length << 2) - sizeof(xPolyLineReq));
                   1551:     if(npoint % sizeof(xPoint) != 0)
                   1552:        return(BadLength);
                   1553:     npoint >>= 2;
                   1554:     if (npoint < 1)
                   1555:        return(BadLength);
                   1556: 
                   1557:     (*pGC->Polylines)(pDraw, pGC, stuff->coordMode, npoint, 
                   1558:                          (xPoint *) &stuff[1]);
                   1559:     return(client->noClientException);
                   1560: }
                   1561: 
                   1562: int
                   1563: ProcPolySegment(client)
                   1564:     register ClientPtr client;
                   1565: {
                   1566:     int nsegs;
                   1567:     register GC *pGC;
                   1568:     register DrawablePtr pDraw;
                   1569:     REQUEST(xPolySegmentReq);
                   1570: 
                   1571:     REQUEST_AT_LEAST_SIZE(xPolySegmentReq);
                   1572:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1573:     nsegs = (stuff->length << 2) - sizeof(xPolySegmentReq);
                   1574:     if(nsegs % sizeof(xSegment) != 0)
                   1575:        return(BadLength);
                   1576:     nsegs >>= 3;
                   1577:     if (nsegs)
                   1578:         (*pGC->PolySegment)(pDraw, pGC, nsegs, (xSegment *) &stuff[1]);
                   1579:     return (client->noClientException);
                   1580: }
                   1581: 
                   1582: int
                   1583: ProcPolyRectangle (client)
                   1584:     register ClientPtr client;
                   1585: {
                   1586:     int nrects;
                   1587:     register GC *pGC;
                   1588:     register DrawablePtr pDraw;
                   1589:     REQUEST(xPolyRectangleReq);
                   1590: 
                   1591:     REQUEST_AT_LEAST_SIZE(xPolyRectangleReq);
                   1592:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1593:     nrects = ((stuff->length << 2) - sizeof(xPolyRectangleReq)) >> 3;
                   1594:     if (nrects)
                   1595:         (*pGC->PolyRectangle)(pDraw, pGC, 
                   1596:                    nrects, (xRectangle *) &stuff[1]);
                   1597:     return(client->noClientException);
                   1598: }
                   1599: 
                   1600: int
                   1601: ProcPolyArc(client)
                   1602:     register ClientPtr client;
                   1603: {
                   1604:     int                narcs;
                   1605:     register GC *pGC;
                   1606:     register DrawablePtr pDraw;
                   1607:     REQUEST(xPolyArcReq);
                   1608: 
                   1609:     REQUEST_AT_LEAST_SIZE(xPolyArcReq);
                   1610:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1611:     narcs = ((stuff->length << 2) - sizeof(xPolyArcReq)) / 
                   1612:            sizeof(xArc);
                   1613:     if (narcs)
                   1614:         (*pGC->PolyArc)(pDraw, pGC, narcs, (xArc *) &stuff[1]);
                   1615:     return (client->noClientException);
                   1616: }
                   1617: 
                   1618: int
                   1619: ProcFillPoly(client)
                   1620:     register ClientPtr client;
                   1621: {
                   1622:     int          things;
                   1623:     register GC *pGC;
                   1624:     register DrawablePtr pDraw;
                   1625:     REQUEST(xFillPolyReq);
                   1626: 
                   1627:     REQUEST_AT_LEAST_SIZE(xFillPolyReq);
                   1628:     if ((stuff->shape != Complex) && (stuff->shape != Nonconvex) &&  
                   1629:        (stuff->shape != Convex) && (stuff->coordMode != CoordModeOrigin) && 
                   1630:        (stuff->coordMode != CoordModePrevious))
                   1631:         return BadValue;
                   1632: 
                   1633:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1634:     things = ((stuff->length << 2) - sizeof(xFillPolyReq)) >> 2;
                   1635:     if (things)
                   1636:         (*pGC->FillPolygon) (pDraw, pGC, stuff->shape,
                   1637:                         stuff->coordMode, things,
                   1638:                         (DDXPointPtr) &stuff[1]);
                   1639:     return(client->noClientException);
                   1640: }
                   1641: 
                   1642: int
                   1643: ProcPolyFillRectangle(client)
                   1644:     register ClientPtr client;
                   1645: {
                   1646:     int             things;
                   1647:     register GC *pGC;
                   1648:     register DrawablePtr pDraw;
                   1649:     REQUEST(xPolyFillRectangleReq);
                   1650: 
                   1651:     REQUEST_AT_LEAST_SIZE(xPolyFillRectangleReq);
                   1652:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1653:     things = ((stuff->length << 2) - 
                   1654:              sizeof(xPolyFillRectangleReq)) >> 3;
                   1655:     if (things)
                   1656:         (*pGC->PolyFillRect) (pDraw, pGC, things,
                   1657:                      (xRectangle *) &stuff[1]);
                   1658:     return (client->noClientException);
                   1659: }
                   1660: 
                   1661: int
                   1662: ProcPolyFillArc               (client)
                   1663:     register ClientPtr client;
                   1664: {
                   1665:     int                narcs;
                   1666:     register GC *pGC;
                   1667:     register DrawablePtr pDraw;
                   1668:     REQUEST(xPolyFillArcReq);
                   1669: 
                   1670:     REQUEST_AT_LEAST_SIZE(xPolyFillArcReq);
                   1671:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1672:     narcs = ((stuff->length << 2) - 
                   1673:             sizeof(xPolyFillArcReq)) / sizeof(xArc);
                   1674:     if (narcs)
                   1675:         (*pGC->PolyFillArc) (pDraw, pGC, narcs, (xArc *) &stuff[1]);
                   1676:     return (client->noClientException);
                   1677: }
                   1678: 
                   1679: int
                   1680: ProcPutImage(client)
                   1681:     register ClientPtr client;
                   1682: {
                   1683:     register GC *pGC;
                   1684:     register DrawablePtr pDraw;
                   1685:     REQUEST(xPutImageReq);
                   1686: 
                   1687:     REQUEST_AT_LEAST_SIZE(xPutImageReq);
                   1688:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1689:     if (stuff->format == XYBitmap)
                   1690:     {
                   1691:         if ((stuff->depth != 1) || (stuff->leftPad > screenInfo.bitmapScanlineUnit))
                   1692:             return BadMatch;
                   1693:     }
                   1694:     else if (stuff->format == XYPixmap)
                   1695:     {
                   1696:         if ((pDraw->depth != stuff->depth) || 
                   1697:            (stuff->leftPad > screenInfo.bitmapScanlineUnit))
                   1698:             return BadMatch;
                   1699:     }
                   1700:     else if (stuff->format == ZPixmap)
                   1701:     {
                   1702:         if ((pDraw->depth != stuff->depth) || (stuff->leftPad != 0))
                   1703:             return BadMatch;
                   1704:     }
                   1705:     else
                   1706:         return BadValue;
                   1707:     (*pGC->PutImage) (pDraw, pGC, stuff->depth, stuff->dstX, stuff->dstY,
                   1708:                  stuff->width, stuff->height, 
                   1709:                  stuff->leftPad, stuff->format, 
                   1710:                  (char *) &stuff[1]);
                   1711:      return (client->noClientException);
                   1712: }
                   1713: 
                   1714: int
                   1715: ProcGetImage(client)
                   1716:     register ClientPtr client;
                   1717: {
                   1718:     register DrawablePtr pDraw;
                   1719:     int                        nlines, linesPerBuf, widthBytesLine;
                   1720:     register int       height, linesDone;
                   1721:     int plane;
                   1722:     char               *pBuf;
                   1723:     xGetImageReply     xgi;
                   1724: 
                   1725:     REQUEST(xGetImageReq);
                   1726: 
                   1727:     height = stuff->height;
                   1728:     REQUEST_SIZE_MATCH(xGetImageReq);
                   1729:     if ((stuff->format != XYPixmap) && (stuff->format != ZPixmap))
                   1730:         return(BadValue);
                   1731:     if(!(pDraw = LOOKUP_DRAWABLE(stuff->drawable, client) ))
                   1732:        return (BadDrawable);
                   1733:     if(pDraw->type == DRAWABLE_WINDOW)
                   1734:     {
                   1735:       if( /* check for being on screen */
                   1736:          ((WindowPtr) pDraw)->absCorner.x + stuff->x < 0 ||
                   1737:          ((WindowPtr) pDraw)->absCorner.x + stuff->x + stuff->width >
                   1738:              pDraw->pScreen->width ||
                   1739:          ((WindowPtr) pDraw)->absCorner.y + stuff->y < 0 ||
                   1740:          ((WindowPtr) pDraw)->absCorner.y + stuff->y + height >
                   1741:              pDraw->pScreen->height ||
                   1742:           /* check for being inside of border */
                   1743:          stuff->x < -((WindowPtr)pDraw)->borderWidth ||
                   1744:          stuff->x + stuff->width >
                   1745:               ((WindowPtr)pDraw)->borderWidth +
                   1746:               ((WindowPtr)pDraw)->clientWinSize.width ||
                   1747:          stuff->y < -((WindowPtr)pDraw)->borderWidth ||
                   1748:          stuff->y + stuff->height >
                   1749:               ((WindowPtr)pDraw)->borderWidth +
                   1750:               ((WindowPtr)pDraw)->clientWinSize.height
                   1751:         )
                   1752:            return(BadMatch);
                   1753:        xgi.visual = ((WindowPtr) pDraw)->visual;
                   1754:     }
                   1755:     else
                   1756:     {
                   1757:       if((stuff->x < 0) ||
                   1758:          (stuff->x+stuff->width > ((PixmapPtr) pDraw)->width) ||
                   1759:          (stuff->y < 0) ||
                   1760:          (stuff->y+stuff->height > ((PixmapPtr) pDraw)->height)
                   1761:         )
                   1762:            return(BadMatch);
                   1763:        xgi.visual = None;
                   1764:     }
                   1765:     xgi.type = X_Reply;
                   1766:     /* should this be set??? */
                   1767:     xgi.sequenceNumber = client->sequence;
                   1768:     xgi.depth = pDraw->depth;
                   1769:     if(stuff->format == ZPixmap)
                   1770:     {
                   1771:        widthBytesLine = PixmapBytePad(stuff->width, pDraw->depth);
                   1772:        xgi.length = (widthBytesLine >> 2) * stuff->height;
                   1773:     }
                   1774:     else 
                   1775:     {
                   1776:        widthBytesLine = PixmapBytePad(stuff->width, 1);
                   1777:        xgi.length = (widthBytesLine >> 2) * stuff->height *
                   1778:                     /* only planes asked for */
                   1779:                     Ones(stuff->planeMask & ((1 << pDraw->depth) - 1));
                   1780:     }
                   1781:     linesPerBuf = IMAGE_BUFSIZE / widthBytesLine;
                   1782:     if(!(pBuf = (char *) ALLOCATE_LOCAL(IMAGE_BUFSIZE)))
                   1783:         return (client->noClientException = BadAlloc);
                   1784: 
                   1785:     WriteReplyToClient(client, sizeof (xGetImageReply), &xgi);
                   1786: 
                   1787:     if (stuff->format == ZPixmap)
                   1788:     {
                   1789:         linesDone = 0;
                   1790:         while (height - linesDone > 0)
                   1791:         {
                   1792:            nlines = min(linesPerBuf, height - linesDone);
                   1793:            (*pDraw->pScreen->GetImage) (pDraw,
                   1794:                                         stuff->x,
                   1795:                                         stuff->y + linesDone,
                   1796:                                         stuff->width, 
                   1797:                                         nlines,
                   1798:                                         stuff->format,
                   1799:                                         stuff->planeMask,
                   1800:                                         pBuf);
                   1801:            /* Note that this is NOT a call to WriteSwappedDataToClient,
                   1802:                as we do NOT byte swap */
                   1803:            WriteToClient(client, nlines * widthBytesLine, pBuf);
                   1804:            linesDone += nlines;
                   1805:         }
                   1806:     }
                   1807:     else
                   1808:     {
                   1809:         for (plane = 1 << (pDraw->depth - 1); plane; plane >>= 1)
                   1810:        {
                   1811:            if (stuff->planeMask & plane)
                   1812:            {
                   1813:                linesDone = 0;
                   1814:                while (height - linesDone > 0)
                   1815:                {
                   1816:                    nlines = min(linesPerBuf, height - linesDone);
                   1817:                    (*pDraw->pScreen->GetImage) (pDraw,
                   1818:                                                 stuff->x,
                   1819:                                                 stuff->y + linesDone,
                   1820:                                                 stuff->width, 
                   1821:                                                 nlines,
                   1822:                                                 stuff->format,
                   1823:                                                 plane,
                   1824:                                                 pBuf);
                   1825:                    /* Note: NOT a call to WriteSwappedDataToClient,
                   1826:                       as we do NOT byte swap */
                   1827:                    WriteToClient(client, nlines * widthBytesLine, pBuf);
                   1828:                    linesDone += nlines;
                   1829:                }
                   1830:             }
                   1831:        }
                   1832:     }
                   1833:     DEALLOCATE_LOCAL(pBuf);
                   1834:     return (client->noClientException);
                   1835: }
                   1836: 
                   1837: 
                   1838: int
                   1839: ProcPolyText(client)
                   1840:     register ClientPtr client;
                   1841: {
                   1842:     int                xorg;
                   1843:     REQUEST(xPolyTextReq);
                   1844:     register DrawablePtr pDraw;
                   1845:     register GC *pGC;
                   1846:     register FontPtr pFont;
                   1847: 
                   1848:     int (* polyText)();
                   1849:     register unsigned char *pElt;
                   1850:     unsigned char *pNextElt;
                   1851:     unsigned char *endReq;
                   1852:     int                itemSize;
                   1853:     
                   1854: #define TextEltHeader 2
                   1855: #define FontShiftSize 5
                   1856: 
                   1857:     REQUEST_AT_LEAST_SIZE(xPolyTextReq);
                   1858:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1859: 
                   1860:     pElt = (unsigned char *)&stuff[1];
                   1861:     endReq = ((unsigned char *) stuff) + (stuff->length <<2);
                   1862:     xorg = stuff->x;
                   1863:     if (stuff->reqType == X_PolyText8)
                   1864:     {
                   1865:        polyText = pGC->PolyText8;
                   1866:        itemSize = 1;
                   1867:     }
                   1868:     else
                   1869:     {
                   1870:        polyText =  pGC->PolyText16;
                   1871:        itemSize = 2;
                   1872:     }
                   1873: 
                   1874:     while (endReq - pElt > TextEltHeader)
                   1875:     {
                   1876:        if (*pElt == FontChange)
                   1877:         {
                   1878:            Font        fid;
                   1879: 
                   1880:            if (endReq - pElt < FontShiftSize)
                   1881:                 return (BadLength);
                   1882:            fid =  *(pElt+4)            /* big-endian */
                   1883:                 | *(pElt+3) << 8
                   1884:                 | *(pElt+2) << 16
                   1885:                 | *(pElt+1) << 24;
                   1886:            pFont = (FontPtr)LookupID(fid, RT_FONT, RC_CORE);
                   1887:            if (!pFont)
                   1888:            {
                   1889:                client->errorValue = fid;
                   1890:                return (BadFont);
                   1891:            }
                   1892:            if (pFont != pGC->font)
                   1893:            {
                   1894:                DoChangeGC( pGC, GCFont, &fid, 0);
                   1895:                ValidateGC(pDraw, pGC);
                   1896:            }
                   1897:            pElt += FontShiftSize;
                   1898:        }
                   1899:        else    /* print a string */
                   1900:        {
                   1901:            pNextElt = pElt + TextEltHeader + (*pElt)*itemSize;
                   1902:            if ( pNextElt > endReq)
                   1903:                return( BadLength);
                   1904:            xorg += *((char *)(pElt + 1));      /* must be signed */
                   1905:            xorg = (* polyText)(pDraw, pGC, xorg, stuff->y, *pElt,
                   1906:                pElt + TextEltHeader);
                   1907:            pElt = pNextElt;
                   1908:        }
                   1909:     }
                   1910:     return (client->noClientException);
                   1911: #undef TextEltHeader
                   1912: #undef FontShiftSize
                   1913: }
                   1914: 
                   1915: int
                   1916: ProcImageText(client)
                   1917:     register ClientPtr client;
                   1918: {
                   1919:     register DrawablePtr pDraw;
                   1920:     register GC *pGC;
                   1921: 
                   1922:     REQUEST(xImageTextReq);
                   1923: 
                   1924:     REQUEST_AT_LEAST_SIZE(xImageTextReq);
                   1925:     VALIDATE_DRAWABLE_AND_GC(stuff->drawable, pDraw, pGC, client);
                   1926: 
                   1927:     (*((stuff->reqType == X_ImageText8) ? pGC->ImageText8 : pGC->ImageText16))
                   1928:        (pDraw, pGC, stuff->x, stuff->y, stuff->nChars, &stuff[1]);
                   1929:     return (client->noClientException);
                   1930: }
                   1931: 
                   1932: 
                   1933: int
                   1934: ProcCreateColormap(client)
                   1935:     register ClientPtr client;
                   1936: {
                   1937:     VisualPtr  pVisual;
                   1938:     ColormapPtr        pmap;
                   1939:     int                mid;
                   1940:     register WindowPtr   pWin;
                   1941:     REQUEST(xCreateColormapReq);
                   1942:     int result;
                   1943: 
                   1944:     REQUEST_SIZE_MATCH(xCreateColormapReq);
                   1945: 
                   1946:     if ((stuff->alloc != AllocNone) && (stuff->alloc != AllocAll))
                   1947:         return(BadValue);
                   1948:     mid = stuff->mid;
                   1949:     LEGAL_NEW_RESOURCE(mid);    
                   1950:     pWin = (WindowPtr)LookupWindow(stuff->window, client);
                   1951:     if (!pWin)
                   1952:         return(BadWindow);
                   1953: 
                   1954:     pVisual = (VisualPtr)LookupID(stuff->visual, RT_VISUALID, RC_CORE);
                   1955:     if ((!pVisual) || pVisual->screen != pWin->drawable.pScreen->myNum)
                   1956:     {
                   1957:        client->errorValue = stuff->visual;
                   1958:        return(BadValue);
                   1959:     }
                   1960:     result =  CreateColormap(mid, pWin->drawable.pScreen,
                   1961:         pVisual, &pmap, stuff->alloc, client->index);
                   1962:     if (client->noClientException != Success)
                   1963:         return(client->noClientException);
                   1964:     else
                   1965:         return(result);
                   1966: }
                   1967: 
                   1968: int
                   1969: ProcFreeColormap(client)
                   1970:     register ClientPtr client;
                   1971: {
                   1972:     ColormapPtr pmap;
                   1973:     REQUEST(xResourceReq);
                   1974: 
                   1975:     REQUEST_SIZE_MATCH(xResourceReq);
                   1976:     pmap = (ColormapPtr )LookupID(stuff->id, RT_COLORMAP, RC_CORE);
                   1977:     if (pmap) 
                   1978:     {
                   1979:        FreeColormap(pmap, (client->index << CLIENTOFFSET));
                   1980:        FreeResource(stuff->id, RC_NONE);
                   1981:        return (client->noClientException);
                   1982:     }
                   1983:     else 
                   1984:     {
                   1985:        client->errorValue = stuff->id;
                   1986:        return (BadColor);
                   1987:     }
                   1988: }
                   1989: 
                   1990: 
                   1991: int
                   1992: ProcCopyColormapAndFree(client)
                   1993:     register ClientPtr client;
                   1994: {
                   1995:     int                mid;
                   1996:     ColormapPtr        pSrcMap;
                   1997:     REQUEST(xCopyColormapAndFreeReq);
                   1998:     int result;
                   1999: 
                   2000:     REQUEST_SIZE_MATCH(xCopyColormapAndFreeReq);
                   2001:     mid = stuff->mid;
                   2002:     LEGAL_NEW_RESOURCE(mid);
                   2003:     if(pSrcMap = (ColormapPtr )LookupID(stuff->srcCmap, RT_COLORMAP, RC_CORE))
                   2004:     {
                   2005:        result = CopyColormapAndFree(mid, pSrcMap, client->index);
                   2006:        if (client->noClientException != Success)
                   2007:             return(client->noClientException);
                   2008:        else
                   2009:             return(result);
                   2010:     }
                   2011:     else
                   2012:     {
                   2013:        client->errorValue = stuff->srcCmap;
                   2014:        return(BadColor);
                   2015:     }
                   2016: }
                   2017: 
                   2018: int
                   2019: ProcInstallColormap(client)
                   2020:     register ClientPtr client;
                   2021: {
                   2022:     ColormapPtr pcmp;
                   2023:     REQUEST(xResourceReq);
                   2024: 
                   2025:     REQUEST_SIZE_MATCH(xResourceReq);
                   2026:     pcmp = (ColormapPtr  )LookupID(stuff->id, RT_COLORMAP, RC_CORE);
                   2027:     if (pcmp)
                   2028:     {
                   2029:         (*(pcmp->pScreen->InstallColormap)) (pcmp);
                   2030:         return (client->noClientException);        
                   2031:     }
                   2032:     else
                   2033:     {
                   2034:         client->errorValue = stuff->id;
                   2035:         return (BadColor);
                   2036:     }
                   2037: }
                   2038: 
                   2039: int
                   2040: ProcUninstallColormap(client)
                   2041:     register ClientPtr client;
                   2042: {
                   2043:     ColormapPtr pcmp;
                   2044:     REQUEST(xResourceReq);
                   2045: 
                   2046:     REQUEST_SIZE_MATCH(xResourceReq);
                   2047:     pcmp = (ColormapPtr )LookupID(stuff->id, RT_COLORMAP, RC_CORE);
                   2048:     if (pcmp)
                   2049:     {
                   2050:        if(pcmp->mid != pcmp->pScreen->defColormap)
                   2051:             (*(pcmp->pScreen->UninstallColormap)) (pcmp);
                   2052:         return (client->noClientException);        
                   2053:     }
                   2054:     else
                   2055:     {
                   2056:         client->errorValue = stuff->id;
                   2057:         return (BadColor);
                   2058:     }
                   2059: }
                   2060: 
                   2061: int
                   2062: ProcListInstalledColormaps(client)
                   2063:     register ClientPtr client;
                   2064: {
                   2065:     xListInstalledColormapsReply *preply; 
                   2066:     int nummaps;
                   2067:     WindowPtr pWin;
                   2068:     REQUEST(xResourceReq);
                   2069: 
                   2070:     REQUEST_SIZE_MATCH(xResourceReq);
                   2071:     pWin = (WindowPtr)LookupWindow(stuff->id, client);
                   2072: 
                   2073:     if (!pWin)
                   2074:         return(BadWindow);
                   2075: 
                   2076:     preply = (xListInstalledColormapsReply *) 
                   2077:                ALLOCATE_LOCAL(sizeof(xListInstalledColormapsReply) +
                   2078:                     pWin->drawable.pScreen->maxInstalledCmaps *
                   2079:                     sizeof(Colormap));
                   2080:     if(!preply)
                   2081:         return(client->noClientException = BadAlloc);
                   2082: 
                   2083:     preply->type = X_Reply;
                   2084:     preply->sequenceNumber = client->sequence;
                   2085:     nummaps = (*pWin->drawable.pScreen->ListInstalledColormaps)
                   2086:         (pWin->drawable.pScreen, (Colormap *)&preply[1]);
                   2087:     preply->nColormaps = nummaps;
                   2088:     preply->length = nummaps;
                   2089:     WriteReplyToClient(client, sizeof (xListInstalledColormapsReply), preply);
                   2090:     client->pSwapReplyFunc = Swap32Write;
                   2091:     WriteSwappedDataToClient(client, nummaps * sizeof(Colormap), &preply[1]);
                   2092:     DEALLOCATE_LOCAL(preply);
                   2093:     return(client->noClientException);
                   2094: }
                   2095: 
                   2096: int
                   2097: ProcAllocColor                (client)
                   2098:     register ClientPtr client;
                   2099: {
                   2100:     ColormapPtr pmap;
                   2101:     int        retval;
                   2102:     xAllocColorReply acr;
                   2103:     REQUEST(xAllocColorReq);
                   2104: 
                   2105:     REQUEST_SIZE_MATCH(xAllocColorReq);
                   2106:     pmap = (ColormapPtr )LookupID(stuff->cmap, RT_COLORMAP, RC_CORE);
                   2107:     if (pmap)
                   2108:     {
                   2109:        acr.type = X_Reply;
                   2110:        acr.length = 0;
                   2111:        acr.sequenceNumber = client->sequence;
                   2112:        acr.red = stuff->red;
                   2113:        acr.green = stuff->green;
                   2114:        acr.blue = stuff->blue;
                   2115:        acr.pixel = 0;
                   2116:        if(retval = AllocColor(pmap, &acr.red, &acr.green, &acr.blue,
                   2117:                               &acr.pixel, client->index))
                   2118:        {
                   2119:             if (client->noClientException != Success)
                   2120:                 return(client->noClientException);
                   2121:            else
                   2122:                return (retval);
                   2123:        }
                   2124:         WriteReplyToClient(client, sizeof(xAllocColorReply), &acr);
                   2125:        return (client->noClientException);
                   2126: 
                   2127:     }
                   2128:     else
                   2129:     {
                   2130:         client->errorValue = stuff->cmap;
                   2131:         return (BadColor);
                   2132:     }
                   2133: }
                   2134: 
                   2135: int
                   2136: ProcAllocNamedColor           (client)
                   2137:     register ClientPtr client;
                   2138: {
                   2139:     ColormapPtr pcmp;
                   2140:     REQUEST(xAllocNamedColorReq);
                   2141: 
                   2142:     REQUEST_AT_LEAST_SIZE(xAllocNamedColorReq);
                   2143:     pcmp = (ColormapPtr )LookupID(stuff->cmap, RT_COLORMAP, RC_CORE);
                   2144:     if (pcmp)
                   2145:     {
                   2146:        int             retval;
                   2147: 
                   2148:        xAllocNamedColorReply ancr;
                   2149: 
                   2150:        ancr.type = X_Reply;
                   2151:        ancr.length = 0;
                   2152:        ancr.sequenceNumber = client->sequence;
                   2153: 
                   2154:        if(OsLookupColor(pcmp->pScreen->myNum, (char *)&stuff[1], stuff->nbytes,
                   2155:                         &ancr.exactRed, &ancr.exactGreen, &ancr.exactBlue))
                   2156:        {
                   2157:            ancr.screenRed = ancr.exactRed;
                   2158:            ancr.screenGreen = ancr.exactGreen;
                   2159:            ancr.screenBlue = ancr.exactBlue;
                   2160:            ancr.pixel = 0;
                   2161:            if(retval = AllocColor(pcmp,
                   2162:                         &ancr.screenRed, &ancr.screenGreen, &ancr.screenBlue,
                   2163:                         &ancr.pixel, client->index))
                   2164:            {
                   2165:                 if (client->noClientException != Success)
                   2166:                     return(client->noClientException);
                   2167:                 else
                   2168:                    return(retval);
                   2169:            }
                   2170:             WriteReplyToClient(client, sizeof (xAllocNamedColorReply), &ancr);
                   2171:            return (client->noClientException);
                   2172:        }
                   2173:        else
                   2174:            return(BadName);
                   2175:        
                   2176:     }
                   2177:     else
                   2178:     {
                   2179:         client->errorValue = stuff->cmap;
                   2180:         return (BadColor);
                   2181:     }
                   2182: }
                   2183: 
                   2184: int
                   2185: ProcAllocColorCells           (client)
                   2186:     register ClientPtr client;
                   2187: {
                   2188:     ColormapPtr pcmp;
                   2189:     REQUEST(xAllocColorCellsReq);
                   2190: 
                   2191:     REQUEST_SIZE_MATCH(xAllocColorCellsReq);
                   2192:     pcmp = (ColormapPtr )LookupID(stuff->cmap, RT_COLORMAP, RC_CORE);
                   2193:     if (pcmp)
                   2194:     {
                   2195:        xAllocColorCellsReply   accr;
                   2196:        int                     npixels, nmasks, retval;
                   2197:        unsigned long           *ppixels, *pmasks;
                   2198: 
                   2199:        npixels = stuff->colors;
                   2200:        nmasks = stuff->planes;
                   2201:        ppixels = (unsigned long *)ALLOCATE_LOCAL(npixels * sizeof(long) + 
                   2202:                                                  nmasks * sizeof(long));
                   2203:        if(!ppixels)
                   2204:             return(client->noClientException = BadAlloc);
                   2205:        pmasks = ppixels + npixels;
                   2206: 
                   2207:        if(retval = AllocColorCells(client->index, pcmp, npixels, nmasks, 
                   2208:                                    stuff->contiguous, ppixels, pmasks))
                   2209:        {
                   2210:            DEALLOCATE_LOCAL(ppixels);
                   2211:             if (client->noClientException != Success)
                   2212:                 return(client->noClientException);
                   2213:            else
                   2214:                return(retval);
                   2215:        }
                   2216:        accr.type = X_Reply;
                   2217:        accr.length = ( (npixels + nmasks) * sizeof(long)) >> 2;
                   2218:        accr.sequenceNumber = client->sequence;
                   2219:        accr.nPixels = npixels;
                   2220:        accr.nMasks = nmasks;
                   2221:         WriteReplyToClient(client, sizeof (xAllocColorCellsReply), &accr);
                   2222:        client->pSwapReplyFunc = Swap32Write;
                   2223:         WriteSwappedDataToClient(client, (npixels + nmasks) * sizeof (long), ppixels);
                   2224:        DEALLOCATE_LOCAL(ppixels);
                   2225:         return (client->noClientException);        
                   2226:     }
                   2227:     else
                   2228:     {
                   2229:         client->errorValue = stuff->cmap;
                   2230:         return (BadColor);
                   2231:     }
                   2232: }
                   2233: 
                   2234: int
                   2235: ProcAllocColorPlanes(client)
                   2236:     register ClientPtr client;
                   2237: {
                   2238:     ColormapPtr pcmp;
                   2239:     REQUEST(xAllocColorPlanesReq);
                   2240: 
                   2241:     REQUEST_SIZE_MATCH(xAllocColorPlanesReq);
                   2242:     pcmp = (ColormapPtr )LookupID(stuff->cmap, RT_COLORMAP, RC_CORE);
                   2243:     if (pcmp)
                   2244:     {
                   2245:        xAllocColorPlanesReply  acpr;
                   2246:        int                     npixels, retval;
                   2247:        unsigned long           *ppixels;
                   2248: 
                   2249:        npixels = stuff->colors;
                   2250:        acpr.type = X_Reply;
                   2251:        acpr.sequenceNumber = client->sequence;
                   2252:        acpr.nPixels = npixels;
                   2253:        npixels *= sizeof(long);
                   2254:        ppixels = (unsigned long *)ALLOCATE_LOCAL(npixels);
                   2255:        if(!ppixels)
                   2256:             return(client->noClientException = BadAlloc);
                   2257:        if(retval = AllocColorPlanes(client->index, pcmp, stuff->colors,
                   2258:            stuff->red, stuff->green, stuff->blue, stuff->contiguous, ppixels,
                   2259:            &acpr.redMask, &acpr.greenMask, &acpr.blueMask))
                   2260:        {
                   2261:             DEALLOCATE_LOCAL(ppixels);
                   2262:             if (client->noClientException != Success)
                   2263:                 return(client->noClientException);
                   2264:            else
                   2265:                return(retval);
                   2266:        }
                   2267:        acpr.length = npixels >> 2;
                   2268:        WriteReplyToClient(client, sizeof(xAllocColorPlanesReply), &acpr);
                   2269:        client->pSwapReplyFunc = Swap32Write;
                   2270:        WriteSwappedDataToClient(client, npixels, ppixels);
                   2271:        DEALLOCATE_LOCAL(ppixels);
                   2272:         return (client->noClientException);        
                   2273:     }
                   2274:     else
                   2275:     {
                   2276:         client->errorValue = stuff->cmap;
                   2277:         return (BadColor);
                   2278:     }
                   2279: }
                   2280: 
                   2281: int
                   2282: ProcFreeColors          (client)
                   2283:     register ClientPtr client;
                   2284: {
                   2285:     ColormapPtr pcmp;
                   2286:     REQUEST(xFreeColorsReq);
                   2287: 
                   2288:     REQUEST_AT_LEAST_SIZE(xFreeColorsReq);
                   2289:     pcmp = (ColormapPtr )LookupID(stuff->cmap, RT_COLORMAP, RC_CORE);
                   2290:     if (pcmp)
                   2291:     {
                   2292:        int     count;
                   2293:         int     retval;
                   2294: 
                   2295:        if(pcmp->flags & AllAllocated)
                   2296:            return(BadAccess);
                   2297:        count = ((stuff->length << 2)- sizeof(xFreeColorsReq)) >> 2;
                   2298:        retval =  FreeColors(pcmp, client->index, count,
                   2299:            (unsigned long *)&stuff[1], stuff->planeMask);
                   2300:         if (client->noClientException != Success)
                   2301:             return(client->noClientException);
                   2302:         else
                   2303:             return(retval);
                   2304: 
                   2305:     }
                   2306:     else
                   2307:     {
                   2308:         client->errorValue = stuff->cmap;
                   2309:         return (BadColor);
                   2310:     }
                   2311: }
                   2312: 
                   2313: int
                   2314: ProcStoreColors               (client)
                   2315:     register ClientPtr client;
                   2316: {
                   2317:     ColormapPtr pcmp;
                   2318:     REQUEST(xStoreColorsReq);
                   2319: 
                   2320:     REQUEST_AT_LEAST_SIZE(xStoreColorsReq);
                   2321:     pcmp = (ColormapPtr )LookupID(stuff->cmap, RT_COLORMAP, RC_CORE);
                   2322:     if (pcmp)
                   2323:     {
                   2324:        int     count;
                   2325:         int     retval;
                   2326: 
                   2327:         if(pcmp->flags & AllAllocated)
                   2328:            if(CLIENT_ID(stuff->cmap) != client->index)
                   2329:                return(BadAccess);
                   2330:         count =
                   2331:          ((stuff->length << 2) - sizeof(xStoreColorsReq)) / sizeof(xColorItem);
                   2332:        retval = StoreColors(pcmp, count, (xColorItem *)&stuff[1]);
                   2333:         if (client->noClientException != Success)
                   2334:             return(client->noClientException);
                   2335:         else
                   2336:             return(retval);
                   2337:     }
                   2338:     else
                   2339:     {
                   2340:         client->errorValue = stuff->cmap;
                   2341:         return (BadColor);
                   2342:     }
                   2343: }
                   2344: 
                   2345: int
                   2346: ProcStoreNamedColor           (client)
                   2347:     register ClientPtr client;
                   2348: {
                   2349:     ColormapPtr pcmp;
                   2350:     REQUEST(xStoreNamedColorReq);
                   2351: 
                   2352:     REQUEST_AT_LEAST_SIZE(xStoreNamedColorReq);
                   2353:     pcmp = (ColormapPtr )LookupID(stuff->cmap, RT_COLORMAP, RC_CORE);
                   2354:     if (pcmp)
                   2355:     {
                   2356:        xColorItem      def;
                   2357:         int             retval;
                   2358: 
                   2359:         if(pcmp->flags & AllAllocated)
                   2360:            if(CLIENT_ID(stuff->cmap) != client->index)
                   2361:                return(BadAccess);
                   2362: 
                   2363:        if(OsLookupColor(pcmp->pScreen->myNum, (char *)&stuff[1],
                   2364:                         stuff->nbytes, &def.red, &def.green, &def.blue))
                   2365:        {
                   2366:            def.flags = stuff->flags;
                   2367:            retval = StoreColors(pcmp, 1, &def);
                   2368:             if (client->noClientException != Success)
                   2369:                 return(client->noClientException);
                   2370:            else
                   2371:                return(retval);
                   2372:        }
                   2373:         return (BadName);        
                   2374:     }
                   2375:     else
                   2376:     {
                   2377:         client->errorValue = stuff->cmap;
                   2378:         return (BadColor);
                   2379:     }
                   2380: }
                   2381: 
                   2382: int
                   2383: ProcQueryColors(client)
                   2384:     register ClientPtr client;
                   2385: {
                   2386:     ColormapPtr pcmp;
                   2387:     REQUEST(xQueryColorsReq);
                   2388: 
                   2389:     REQUEST_AT_LEAST_SIZE(xQueryColorsReq);
                   2390:     pcmp = (ColormapPtr )LookupID(stuff->cmap, RT_COLORMAP, RC_CORE);
                   2391:     if (pcmp)
                   2392:     {
                   2393:        int                     count, retval;
                   2394:        xrgb                    *prgbs;
                   2395:        xQueryColorsReply       qcr;
                   2396: 
                   2397:        count = ((stuff->length << 2) - sizeof(xQueryColorsReq)) >> 2;
                   2398:        if(!(prgbs = (xrgb *)ALLOCATE_LOCAL(count * sizeof(xrgb))))
                   2399:             return(client->noClientException = BadAlloc);
                   2400:        if(retval = QueryColors(pcmp, count, (unsigned long *)&stuff[1], prgbs))
                   2401:        {
                   2402:            DEALLOCATE_LOCAL(prgbs);
                   2403:            if (client->noClientException != Success)
                   2404:                 return(client->noClientException);
                   2405:            else
                   2406:                return (retval);
                   2407:        }
                   2408:        qcr.type = X_Reply;
                   2409:        qcr.length = (count * sizeof(xrgb)) >> 2;
                   2410:        qcr.sequenceNumber = client->sequence;
                   2411:        qcr.nColors = count;
                   2412:        WriteReplyToClient(client, sizeof(xQueryColorsReply), &qcr);
                   2413:        client->pSwapReplyFunc = SQColorsExtend;
                   2414:        WriteSwappedDataToClient(client, count * sizeof(xrgb), prgbs);
                   2415:        DEALLOCATE_LOCAL(prgbs);
                   2416:        return(client->noClientException);
                   2417:        
                   2418:     }
                   2419:     else
                   2420:     {
                   2421:         client->errorValue = stuff->cmap;
                   2422:         return (BadColor);
                   2423:     }
                   2424: } 
                   2425: 
                   2426: int
                   2427: ProcLookupColor(client)
                   2428:     register ClientPtr client;
                   2429: {
                   2430:     ColormapPtr pcmp;
                   2431:     REQUEST(xLookupColorReq);
                   2432: 
                   2433:     REQUEST_AT_LEAST_SIZE(xLookupColorReq);
                   2434:     pcmp = (ColormapPtr )LookupID(stuff->cmap, RT_COLORMAP, RC_CORE);
                   2435:     if (pcmp)
                   2436:     {
                   2437:        xLookupColorReply lcr;
                   2438: 
                   2439:        if(OsLookupColor(pcmp->pScreen->myNum, (char *)&stuff[1], stuff->nbytes,
                   2440:                         &lcr.exactRed, &lcr.exactGreen, &lcr.exactBlue))
                   2441:        {
                   2442:            lcr.type = X_Reply;
                   2443:            lcr.length = 0;
                   2444:            lcr.sequenceNumber = client->sequence;
                   2445:            lcr.screenRed = lcr.exactRed;
                   2446:            lcr.screenGreen = lcr.exactGreen;
                   2447:            lcr.screenBlue = lcr.exactBlue;
                   2448:            (*pcmp->pScreen->ResolveColor)(&lcr.screenRed,
                   2449:                                           &lcr.screenGreen,
                   2450:                                           &lcr.screenBlue);
                   2451:            WriteReplyToClient(client, sizeof(xLookupColorReply), &lcr);
                   2452:            return(client->noClientException);
                   2453:        }
                   2454:         return (BadName);        
                   2455:     }
                   2456:     else
                   2457:     {
                   2458:         client->errorValue = stuff->cmap;
                   2459:         return (BadColor);
                   2460:     }
                   2461: }
                   2462: 
                   2463: int
                   2464: ProcCreateCursor( client)
                   2465:     register ClientPtr client;
                   2466: {
                   2467:     CursorPtr  pCursor;
                   2468: 
                   2469:     register PixmapPtr         src;
                   2470:     register PixmapPtr         msk;
                   2471:     unsigned int *     srcbits;
                   2472:     unsigned int *     mskbits;
                   2473:     int                width, height;
                   2474:     CursorMetricRec cm;
                   2475: 
                   2476: 
                   2477:     REQUEST(xCreateCursorReq);
                   2478: 
                   2479:     REQUEST_SIZE_MATCH(xCreateCursorReq);
                   2480:     LEGAL_NEW_RESOURCE(stuff->cid);
                   2481: 
                   2482:     src = (PixmapPtr)LookupID( stuff->source, RT_PIXMAP, RC_CORE);
                   2483:     msk = (PixmapPtr)LookupID( stuff->mask, RT_PIXMAP, RC_CORE);
                   2484:     if (   src == (PixmapPtr)NULL)
                   2485:        return (BadPixmap);
                   2486:     if ( msk == (PixmapPtr)NULL)
                   2487:        msk = src;
                   2488: 
                   2489:     if (  src->width != msk->width
                   2490:        || src->height != msk->height
                   2491:        || src->drawable.depth != 1
                   2492:        || msk->drawable.depth != 1)
                   2493:        return (BadMatch);
                   2494: 
                   2495:     width = src->width;
                   2496:     height = src->height;
                   2497: 
                   2498:     if ( stuff->x > width 
                   2499:       || stuff->y > height )
                   2500:        return (BadMatch);
                   2501: 
                   2502:     srcbits = (unsigned int *)Xalloc( PixmapBytePad(width, 1)*height); 
                   2503:     mskbits = (unsigned int *)Xalloc( PixmapBytePad(width, 1)*height); 
                   2504: 
                   2505:     (* src->drawable.pScreen->GetImage)( src, 0, 0, width, height,
                   2506:                                         XYBitmap, 0xffffffff, srcbits);
                   2507:     (* msk->drawable.pScreen->GetImage)( msk, 0, 0, width, height,
                   2508:                                         XYBitmap, 0xffffffff, mskbits);
                   2509:     cm.width = width;
                   2510:     cm.height = height;
                   2511:     cm.xhot = stuff->x;
                   2512:     cm.yhot = stuff->y;
                   2513:     pCursor = AllocCursor( srcbits, mskbits, &cm,
                   2514:            stuff->foreRed, stuff->foreGreen, stuff->foreBlue,
                   2515:            stuff->backRed, stuff->backGreen, stuff->backBlue);
                   2516: 
                   2517:     AddResource( stuff->cid, RT_CURSOR, pCursor, FreeCursor, RC_CORE);
                   2518:     return (client->noClientException);
                   2519: }
                   2520: 
                   2521: /*
                   2522:  * protocol requires positioning of glyphs so hot-spots are coincident XXX
                   2523:  */
                   2524: int
                   2525: ProcCreateGlyphCursor( client)
                   2526:     register ClientPtr client;
                   2527: {
                   2528:     FontPtr  sourcefont;
                   2529:     FontPtr  maskfont;
                   2530:     char   *srcbits;
                   2531:     char   *mskbits;
                   2532:     CursorPtr pCursor;
                   2533:     CursorMetricRec cm;
                   2534:     int res;
                   2535: 
                   2536:     REQUEST(xCreateGlyphCursorReq);
                   2537: 
                   2538:     REQUEST_SIZE_MATCH(xCreateGlyphCursorReq);
                   2539:     LEGAL_NEW_RESOURCE(stuff->cid);
                   2540: 
                   2541:     sourcefont = (FontPtr) LookupID(stuff->source, RT_FONT, RC_CORE);
                   2542:     maskfont = (FontPtr) LookupID(stuff->mask, RT_FONT, RC_CORE);
                   2543: 
                   2544:     if (sourcefont == (FontPtr) NULL)
                   2545:     {
                   2546:        client->errorValue = stuff->source;
                   2547:        return(BadFont);
                   2548:     }
                   2549: 
                   2550:     if (maskfont == (FontPtr) NULL)
                   2551:     {
                   2552:        client->errorValue = stuff->mask;
                   2553:        return(BadFont);
                   2554:     }
                   2555: 
                   2556:     if (!CursorMetricsFromGlyph(maskfont, stuff->maskChar, &cm))
                   2557:     {
                   2558:        client->errorValue = stuff->mask;
                   2559:        return BadValue;
                   2560:     }
                   2561: 
                   2562:     if (res = ServerBitsFromGlyph(stuff->source, 
                   2563:                                  sourcefont, stuff->sourceChar,
                   2564:                                  &cm, &srcbits))
                   2565:        return res;
                   2566:     if (res = ServerBitsFromGlyph(stuff->mask, 
                   2567:                                  maskfont, stuff->maskChar,
                   2568:                                  &cm, &mskbits))
                   2569:        return res;
                   2570: 
                   2571:     pCursor = AllocCursor(srcbits, mskbits, &cm,
                   2572:            stuff->foreRed, stuff->foreGreen, stuff->foreBlue,
                   2573:            stuff->backRed, stuff->backGreen, stuff->backBlue);
                   2574: 
                   2575:     AddResource(stuff->cid, RT_CURSOR, pCursor, FreeCursor, RC_CORE);
                   2576:     return client->noClientException;
                   2577: }
                   2578: 
                   2579: 
                   2580: int
                   2581: ProcFreeCursor(client)
                   2582:     register ClientPtr client;
                   2583: {
                   2584:     CursorPtr pCursor;
                   2585:     REQUEST(xResourceReq);
                   2586: 
                   2587:     REQUEST_SIZE_MATCH(xResourceReq);
                   2588:     pCursor = (CursorPtr)LookupID(stuff->id, RT_CURSOR, RC_CORE);
                   2589:     if (pCursor) 
                   2590:     {
                   2591:        FreeResource( stuff->id, RC_NONE);
                   2592:        return (client->noClientException);
                   2593:     }
                   2594:     else 
                   2595:     {
                   2596:        return (BadCursor);
                   2597:     }
                   2598: }
                   2599: 
                   2600: int
                   2601: ProcQueryBestSize   (client)
                   2602:     register ClientPtr client;
                   2603: {
                   2604:     xQueryBestSizeReply        reply;
                   2605:     register DrawablePtr pDraw;
                   2606:     ScreenPtr pScreen;
                   2607:     REQUEST(xQueryBestSizeReq);
                   2608: 
                   2609:     REQUEST_SIZE_MATCH(xQueryBestSizeReq);
                   2610:     if ((stuff->class != CursorShape) && 
                   2611:        (stuff->class != TileShape) && 
                   2612:        (stuff->class != StippleShape))
                   2613:         return(BadValue);
                   2614:     if (!(pDraw = LOOKUP_DRAWABLE(stuff->drawable, client)))
                   2615:     {
                   2616:        client->errorValue = stuff->drawable;
                   2617:        return (BadDrawable);
                   2618:     }
                   2619:     pScreen = pDraw->pScreen;
                   2620:     (* pScreen->QueryBestSize)(stuff->class, &stuff->width,
                   2621:                               &stuff->height);
                   2622:     reply.type = X_Reply;
                   2623:     reply.length = 0;
                   2624:     reply.sequenceNumber = client->sequence;
                   2625:     reply.width = stuff->width;
                   2626:     reply.height = stuff->height;
                   2627:     WriteReplyToClient(client, sizeof(xQueryBestSizeReply), &reply);
                   2628:     return (client->noClientException);
                   2629: }
                   2630: 
                   2631: 
                   2632: int
                   2633: ProcSetScreenSaver            (client)
                   2634:     register ClientPtr client;
                   2635: {
                   2636:     int blankingOption, exposureOption;
                   2637:     REQUEST(xSetScreenSaverReq);
                   2638: 
                   2639:     REQUEST_SIZE_MATCH(xSetScreenSaverReq);
                   2640:     blankingOption = stuff->preferBlank;
                   2641:     if ((blankingOption != DontPreferBlanking) &&
                   2642:         (blankingOption != PreferBlanking) &&
                   2643:         (blankingOption != DefaultBlanking))
                   2644:         return BadMatch;
                   2645: 
                   2646:     exposureOption = stuff->allowExpose;
                   2647:     if ((exposureOption != DontAllowExposures) &&
                   2648:         (exposureOption != AllowExposures) &&
                   2649:         (exposureOption != DefaultExposures))
                   2650:         return BadMatch;
                   2651: 
                   2652:     if ((stuff->timeout < -1) || (stuff->interval < -1))
                   2653:         return BadMatch;
                   2654: 
                   2655:     ScreenSaverBlanking = blankingOption; 
                   2656:     ScreenSaverAllowExposures = exposureOption;
                   2657: 
                   2658:     if (stuff->timeout >= 0)
                   2659:        ScreenSaverTime = stuff->timeout * MILLI_PER_SECOND;
                   2660:     else 
                   2661:        ScreenSaverTime = DEFAULT_SCREEN_SAVER_TIME;
                   2662:     if (stuff->interval > 0)
                   2663:        ScreenSaverInterval = stuff->interval * MILLI_PER_SECOND;
                   2664:     else
                   2665:        ScreenSaverInterval = DEFAULT_SCREEN_SAVER_TIME;
                   2666:     return (client->noClientException);
                   2667: }
                   2668: 
                   2669: int
                   2670: ProcGetScreenSaver(client)
                   2671:     register ClientPtr client;
                   2672: {
                   2673:     xGetScreenSaverReply rep;
                   2674: 
                   2675:     rep.type = X_Reply;
                   2676:     rep.length = 0;
                   2677:     rep.sequenceNumber = client->sequence;
                   2678:     rep.timeout = ScreenSaverTime / MILLI_PER_SECOND;
                   2679:     rep.interval = ScreenSaverInterval / MILLI_PER_SECOND;
                   2680:     rep.preferBlanking = ScreenSaverBlanking;
                   2681:     rep.allowExposures = ScreenSaverAllowExposures;
                   2682:     WriteReplyToClient(client, sizeof(xGetScreenSaverReply), &rep);
                   2683:     return (client->noClientException);
                   2684: }
                   2685: 
                   2686: int
                   2687: ProcChangeHosts(client)
                   2688:     register ClientPtr client;
                   2689: {
                   2690:     REQUEST(xChangeHostsReq);
                   2691:     int result;
                   2692: 
                   2693:     REQUEST_AT_LEAST_SIZE(xChangeHostsReq);
                   2694: 
                   2695:     if(stuff->mode == HostInsert)
                   2696:        result = AddHost(client, stuff->hostFamily, stuff->hostLength, 
                   2697:                &stuff[1]);
                   2698:     else if (stuff->mode == HostDelete)
                   2699:        result = RemoveHost(client, stuff->hostFamily, 
                   2700:                            stuff->hostLength,  &stuff[1]);  
                   2701:     else
                   2702:         return BadValue;
                   2703:     return (result || client->noClientException);
                   2704: }
                   2705: 
                   2706: int
                   2707: ProcListHosts(client)
                   2708:     register ClientPtr client;
                   2709: {
                   2710: extern int GetHosts();
                   2711:     xListHostsReply reply;
                   2712:     int        len, nHosts;
                   2713:     pointer    pdata;
                   2714:     REQUEST(xListHostsReq);
                   2715: 
                   2716:     REQUEST_SIZE_MATCH(xListHostsReq);
                   2717:     if((len = GetHosts(&pdata, &nHosts, &reply.enabled)) < 0)
                   2718:        return(BadImplementation);
                   2719:     reply.type = X_Reply;
                   2720:     reply.sequenceNumber = client->sequence;
                   2721:     reply.nHosts = nHosts;
                   2722:     reply.length = len >> 2;
                   2723:     WriteReplyToClient(client, sizeof(xListHostsReply), &reply);
                   2724:     client->pSwapReplyFunc = SLHostsExtend;
                   2725:     WriteSwappedDataToClient(client, len, pdata);
                   2726:     Xfree(pdata);
                   2727:     return (client->noClientException);
                   2728: }
                   2729: 
                   2730: int
                   2731: ProcChangeAccessControl(client)
                   2732:     register ClientPtr client;
                   2733: {
                   2734:     REQUEST(xSetAccessControlReq);
                   2735: 
                   2736:     REQUEST_SIZE_MATCH(xSetAccessControlReq);
                   2737:     if ((stuff->mode != EnableAccess) && (stuff->mode != DisableAccess))
                   2738:         return BadValue;
                   2739:     ChangeAccessControl(client, stuff->mode == EnableAccess);
                   2740:     return (client->noClientException);
                   2741: }
                   2742: 
                   2743: int
                   2744: ProcKillClient(client)
                   2745:     register ClientPtr client;
                   2746: {
                   2747:     REQUEST(xResourceReq);
                   2748: 
                   2749:     pointer *pResource;
                   2750:     int clientIndex;
                   2751: 
                   2752:     REQUEST_SIZE_MATCH(xResourceReq);
                   2753:     if (stuff->id == AllTemporary)
                   2754:     {
                   2755:        CloseDownRetainedResources();
                   2756:         return (client->noClientException);
                   2757:     }
                   2758:     pResource = (pointer *)LookupID(stuff->id, RT_ANY, RC_CORE);
                   2759:   
                   2760:     clientIndex = CLIENT_ID(stuff->id);
                   2761: 
                   2762:     if (clientIndex && pResource)
                   2763:     {
                   2764:        if (clients[clientIndex] && !clients[clientIndex]->clientGone)
                   2765:        {
                   2766:            CloseDownClient(clients[clientIndex]);
                   2767:             return (client->noClientException);
                   2768:        }
                   2769:     }
                   2770:     else   /* can't kill client 0, which is server */
                   2771:     {
                   2772:        client->errorValue = stuff->id;
                   2773:        return (BadValue);
                   2774:     }
                   2775: }
                   2776: 
                   2777: int
                   2778: ProcSetFontPath(client)
                   2779:     register ClientPtr client;
                   2780: {
                   2781:     REQUEST(xSetFontPathReq);
                   2782:     
                   2783:     REQUEST_AT_LEAST_SIZE(xSetFontPathReq);
                   2784:     
                   2785:     SetFontPath(stuff->nFonts, stuff->length, &stuff[1]);
                   2786:     return (client->noClientException);
                   2787: }
                   2788: 
                   2789: int
                   2790: ProcGetFontPath(client)
                   2791:     register ClientPtr client;
                   2792: {
                   2793:     FontPathPtr pFP;
                   2794:     xGetFontPathReply reply;
                   2795:     int stringLens, i;
                   2796:     char *bufferStart;
                   2797:     register char  *bufptr;
                   2798:     REQUEST (xReq);
                   2799: 
                   2800:     REQUEST_SIZE_MATCH(xReq);
                   2801:     pFP = GetFontPath();
                   2802:     stringLens = 0;
                   2803:     for (i=0; i<pFP->npaths; i++)
                   2804:         stringLens += pFP->length[i];
                   2805: 
                   2806:     reply.type = X_Reply;
                   2807:     reply.sequenceNumber = client->sequence;
                   2808:     reply.length = (stringLens + pFP->npaths + 3) >> 2;
                   2809:     reply.nPaths = pFP->npaths;
                   2810: 
                   2811:     bufptr = bufferStart = (char *)ALLOCATE_LOCAL(reply.length << 2);
                   2812:     if(!bufptr)
                   2813:         return(client->noClientException = BadAlloc);
                   2814:             /* since WriteToClient long word aligns things, 
                   2815:               copy to temp buffer and write all at once */
                   2816:     for (i=0; i<pFP->npaths; i++)
                   2817:     {
                   2818:         *bufptr++ = pFP->length[i];
                   2819:         bcopy(pFP->paths[i], bufptr,  pFP->length[i]);
                   2820:         bufptr += pFP->length[i];
                   2821:     }
                   2822:     WriteReplyToClient(client, sizeof(xGetFontPathReply), &reply);
                   2823:     WriteToClient(client, stringLens + pFP->npaths, bufferStart);
                   2824:     DEALLOCATE_LOCAL(bufferStart);
                   2825:     return(client->noClientException);
                   2826: }
                   2827: 
                   2828: int
                   2829: ProcChangeCloseDownMode(client)
                   2830:     register ClientPtr client;
                   2831: {
                   2832:     REQUEST(xSetCloseDownModeReq);
                   2833: 
                   2834:     REQUEST_SIZE_MATCH(xSetCloseDownModeReq);
                   2835:     if ((stuff->mode == AllTemporary) ||
                   2836:        (stuff->mode == RetainPermanent) ||
                   2837:        (stuff->mode == RetainTemporary))
                   2838:     {
                   2839:        client->closeDownMode = stuff->mode;
                   2840:        return (client->noClientException);
                   2841:     }
                   2842:     else   
                   2843:     {
                   2844:        client->errorValue = stuff->mode;
                   2845:        return (BadValue);
                   2846:     }
                   2847: }
                   2848: 
                   2849: int ProcForceScreenSaver(client)
                   2850:     register ClientPtr client;
                   2851: {    
                   2852:     REQUEST(xForceScreenSaverReq);
                   2853: 
                   2854:     REQUEST_SIZE_MATCH(xForceScreenSaverReq);
                   2855:     
                   2856:     if ((stuff->mode != ScreenSaverReset) && 
                   2857:        (stuff->mode != ScreenSaverActive))
                   2858:         return BadValue;
                   2859:     SaveScreens(SCREEN_SAVER_FORCER, stuff->mode);
                   2860:     return client->noClientException;
                   2861: }
                   2862: 
                   2863: int ProcNoOperation(client)
                   2864:     register ClientPtr client;
                   2865: {
                   2866:     REQUEST(xReq);
                   2867: 
                   2868:     REQUEST_AT_LEAST_SIZE(xReq);
                   2869:     
                   2870:     /* noop -- don't do anything */
                   2871:     return(client->noClientException);
                   2872: }
                   2873: 
                   2874: extern void NotImplemented();
                   2875: 
                   2876: void
                   2877: InitProcVectors()
                   2878: {
                   2879:     int i;
                   2880:     for (i = 0; i<256; i++)
                   2881:     {
                   2882:        if(!ProcVector[i])
                   2883:        {
                   2884:             ProcVector[i] = SwappedProcVector[i] = ProcBadRequest;
                   2885:            ReplySwapVector[i] = NotImplemented;
                   2886:        }
                   2887:     }
                   2888:     for(i = LASTEvent; i < 128; i++)
                   2889:     {
                   2890:        EventSwapVector[i] = NotImplemented;
                   2891:     }
                   2892:     
                   2893: }
                   2894: 
                   2895: /**********************
                   2896:  * CloseDownClient
                   2897:  *
                   2898:  *  Client can either mark his resources destroy or retain.  If retained and
                   2899:  *  then killed again, the client is really destroyed.
                   2900:  *********************/
                   2901: 
                   2902: void
                   2903: CloseDownClient(client)
                   2904:     register ClientPtr client;
                   2905: {
                   2906:     extern void DeleteClientFromAnySelections();
                   2907:     register int i;
                   2908:       /* ungrab server if grabbing client dies */
                   2909:     if (grabbingClient &&  (onlyClient == client))
                   2910:     {
                   2911:        grabbingClient = FALSE;
                   2912:        ListenToAllClients();
                   2913:     }
                   2914:     DeleteClientFromAnySelections(client);
                   2915:     ReleaseActiveGrabs(client);
                   2916:     
                   2917:     if (client->closeDownMode == DestroyAll)
                   2918:     {
                   2919:         client->clientGone = TRUE;  /* so events aren't sent to client */
                   2920:         CloseDownConnection(client);
                   2921:         FreeClientResources(client);
                   2922:         for (i=0; i<currentMaxClients; i++)
                   2923:             if (clients[i] == client)
                   2924:            {
                   2925:                nextFreeClientID = i;
                   2926:                 clients[nextFreeClientID] = NullClient;
                   2927:                break;
                   2928:            }
                   2929:         Xfree(client);
                   2930:        if(--nClients == 0)
                   2931:            nClients = -1;
                   2932:     }
                   2933:             /* really kill resources this time */
                   2934:     else if (client->clientGone)
                   2935:     {
                   2936:         FreeClientResources(client);
                   2937:         for (i=0; i<currentMaxClients; i++)
                   2938:             if (clients[i] == client)
                   2939:            {
                   2940:                nextFreeClientID = i;
                   2941:                 clients[nextFreeClientID] = NullClient;
                   2942:                break;
                   2943:            }
                   2944:         Xfree(client);
                   2945:        --nClients;
                   2946:     }
                   2947:     else
                   2948:     {
                   2949:         client->clientGone = TRUE;
                   2950:         CloseDownConnection(client);
                   2951:     }
                   2952: }
                   2953: 
                   2954: static void
                   2955: KillAllClients()
                   2956: {
                   2957:     int i;
                   2958:     for (i=1; i<currentMaxClients; i++)
                   2959:         if (clients[i] && !clients[i]->clientGone)
                   2960:             CloseDownClient(clients[i]);     
                   2961: }
                   2962: 
                   2963: void
                   2964: KillServerResources()
                   2965: {
                   2966:     int i;
                   2967: 
                   2968:     KillAllClients();
                   2969:     /* Good thing we stashed these two in globals so we could get at them
                   2970:      * here. */
                   2971:     CloseDownDevices(argcGlobal, argvGlobal);
                   2972:     for (i = 0; i < screenInfo.numScreens; i++)
                   2973:        (*screenInfo.screen[i].CloseScreen)(i, &screenInfo.screen[i]);
                   2974: }
                   2975: 
                   2976: 
                   2977: /*********************
                   2978:  * CloseDownRetainedResources
                   2979:  *
                   2980:  *    Find all clients that are gone and have terminated in RetainTemporary 
                   2981:  *    and  destroy their resources.
                   2982:  *********************/
                   2983: 
                   2984: CloseDownRetainedResources()
                   2985: {
                   2986:     register int i;
                   2987:     register ClientPtr client;
                   2988: 
                   2989:     for (i=1; i<currentMaxClients; i++)
                   2990:     {
                   2991:         client = clients[i];
                   2992:         if (client && (client->closeDownMode == RetainTemporary)
                   2993:            && (client->clientGone))
                   2994:        {
                   2995:             FreeClientResources(client);
                   2996:             nextFreeClientID = i;
                   2997:            Xfree(client);
                   2998:            clients[i] = NullClient;
                   2999:        }
                   3000:     }
                   3001: }
                   3002: 
                   3003: /************************
                   3004:  * int NextAvailableClientID()
                   3005:  *
                   3006:  * OS depedent portion can't assign client id's because of CloseDownModes.
                   3007:  * Returns -1 if the there are no free clients.
                   3008:  *************************/
                   3009: 
                   3010: ClientPtr
                   3011: NextAvailableClient()
                   3012: {
                   3013:     int i;
                   3014:     ClientPtr client;
                   3015: 
                   3016:     if (nextFreeClientID >= currentMaxClients)
                   3017:         nextFreeClientID = 1;
                   3018:     if (!clients[nextFreeClientID])
                   3019:     {
                   3020:        i = nextFreeClientID;
                   3021:        nextFreeClientID++;
                   3022:     }
                   3023:     else
                   3024:     {
                   3025:        i = 1;
                   3026:        while ((i<currentMaxClients) && (clients[i]))
                   3027:             i++;
                   3028:         if (i < currentMaxClients)
                   3029:            nextFreeClientID = i;
                   3030:        else
                   3031:         {
                   3032:            clients = (ClientPtr *)Xrealloc(clients, i * sizeof(ClientRec));
                   3033:            currentMaxClients++;
                   3034:        }
                   3035:     }
                   3036:     clients[i] = client =  (ClientPtr)Xalloc(sizeof(ClientRec));
                   3037:     client->index = i;
                   3038:     client->sequence = 0; 
                   3039:     client->clientAsMask = i << CLIENTOFFSET;
                   3040:     client->closeDownMode = DestroyAll;
                   3041:     client->clientGone = FALSE;
                   3042:     client->lastDrawable = (DrawablePtr) NULL;
                   3043:     client->lastDrawableID = INVALID;
                   3044:     client->lastGC = (GCPtr) NULL;
                   3045:     client->lastGCID = -1;
                   3046:     client->numSaved = 0;
                   3047:     client->saveSet = (pointer *)NULL;
                   3048:     client->noClientException = Success;
                   3049: 
                   3050:     return(client);
                   3051: }
                   3052: 
                   3053: SendConnectionSetupInfo(client)
                   3054:     ClientPtr client;
                   3055: {
                   3056:     xWindowRoot *root;
                   3057:     int i;
                   3058: 
                   3059:     ((xConnSetup *)ConnectionInfo)->ridBase = client->clientAsMask;
                   3060:     ((xConnSetup *)ConnectionInfo)->ridMask = 0xfffff;
                   3061:         /* fill in the "currentInputMask" */
                   3062:     root = (xWindowRoot *)(ConnectionInfo + connBlockScreenStart);
                   3063:     for (i=0; i<screenInfo.numScreens; root += sizeof(xWindowRoot), i++) 
                   3064:         root->currentInputMask = WindowTable[i].allEventMasks;
                   3065: 
                   3066:     if (client->swapped) {
                   3067:        WriteSConnSetupPrefix(client, &connSetupPrefix);
                   3068:         WriteSConnectionInfo(client, connSetupPrefix.length << 2, ConnectionInfo);
                   3069:        }
                   3070:     else {
                   3071:         WriteToClient(client, sizeof(xConnSetupPrefix), (char *) &connSetupPrefix);
                   3072:         WriteToClient(client, connSetupPrefix.length << 2, ConnectionInfo);
                   3073:        }
                   3074: }
                   3075: 
                   3076: /*****************
                   3077:  * Oops
                   3078:  *    Send an Error back to the client. 
                   3079:  *****************/
                   3080: 
                   3081: Oops (client, reqCode, minorCode, status)
                   3082:     ClientPtr client;
                   3083:     char reqCode, minorCode, status;
                   3084: {
                   3085:     xError rep;
                   3086:     register int i;
                   3087: 
                   3088:     rep.type = X_Error;
                   3089:     rep.sequenceNumber = client->sequence;
                   3090:     rep.errorCode = status;
                   3091:     rep.majorCode = reqCode;
                   3092:     rep.minorCode = minorCode;
                   3093:     rep.resourceID = client->errorValue;
                   3094: 
                   3095:     for (i=0; i<currentMaxClients; i++)
                   3096:         if (clients[i] == client) break;
                   3097: #ifdef notdef
                   3098:     ErrorF(  "OOPS! => client: %x, seq: %d, err: %d, maj:%d, min: %d resID: %x\n",
                   3099:        client->index, rep.sequenceNumber, rep.errorCode,
                   3100:        rep.majorCode, rep.minorCode, rep.resourceID);
                   3101: #endif
                   3102: 
                   3103:     WriteEventsToClient (client, 1, (xEvent *) &rep); 
                   3104: }
                   3105: 
                   3106: 
                   3107: void
                   3108: DeleteWindowFromAnySelections(pWin)
                   3109:     WindowPtr pWin;
                   3110: {
                   3111:     int i = 0;
                   3112: 
                   3113:     for (i = 0; i< NumCurrentSelections; i++)
                   3114:         if (CurrentSelections[i].pWin == pWin)
                   3115:         {
                   3116:             CurrentSelections[i].pWin = (WindowPtr)NULL;
                   3117:             CurrentSelections[i].window = None;
                   3118:        }
                   3119: }
                   3120: 
                   3121: static void
                   3122: DeleteClientFromAnySelections(client)
                   3123:     ClientPtr client;
                   3124: {
                   3125:     int i = 0;
                   3126: 
                   3127:     for (i = 0; i< NumCurrentSelections; i++)
                   3128:         if (CurrentSelections[i].client == client)
                   3129:         {
                   3130:             CurrentSelections[i].pWin = (WindowPtr)NULL;
                   3131:             CurrentSelections[i].window = None;
                   3132:        }
                   3133: }
                   3134: 
                   3135: void
                   3136: MarkClientException(client)
                   3137:     ClientPtr client;
                   3138: {
                   3139:     client->noClientException = -1;
                   3140: }
                   3141: 
                   3142: 
                   3143: /* Byte swap a list of longs */
                   3144: 
                   3145: SwapLongs (list, count)
                   3146:        register long *list;
                   3147:        register int count;
                   3148: {
                   3149:        register int n;
                   3150: 
                   3151:        while (count >= 8) {
                   3152:            swapl(list+0, n);
                   3153:            swapl(list+1, n);
                   3154:            swapl(list+2, n);
                   3155:            swapl(list+3, n);
                   3156:            swapl(list+4, n);
                   3157:            swapl(list+5, n);
                   3158:            swapl(list+6, n);
                   3159:            swapl(list+7, n);
                   3160:            list += 8;
                   3161:            count -= 8;
                   3162:        }
                   3163:        while (--count >= 0) {
                   3164:            swapl(list, n);
                   3165:            list++;
                   3166:        }
                   3167: }
                   3168: 
                   3169: /* Byte swap a list of shorts */
                   3170: 
                   3171: SwapShorts (list, count)
                   3172:        register short *list;
                   3173:        register int count;
                   3174: {
                   3175:        register int n;
                   3176: 
                   3177:        while (count >= 16) {
                   3178:            swaps(list+0, n);
                   3179:            swaps(list+1, n);
                   3180:            swaps(list+2, n);
                   3181:            swaps(list+3, n);
                   3182:            swaps(list+4, n);
                   3183:            swaps(list+5, n);
                   3184:            swaps(list+6, n);
                   3185:            swaps(list+7, n);
                   3186:            swaps(list+8, n);
                   3187:            swaps(list+9, n);
                   3188:            swaps(list+10, n);
                   3189:            swaps(list+11, n);
                   3190:            swaps(list+12, n);
                   3191:            swaps(list+13, n);
                   3192:            swaps(list+14, n);
                   3193:            swaps(list+15, n);
                   3194:            list += 16;
                   3195:            count -= 16;
                   3196:        }
                   3197:        while (--count >= 0) 
                   3198:         {
                   3199:            swaps(list, n);
                   3200:            list++;
                   3201:        }
                   3202: }

unix.superglobalmegacorp.com

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