Annotation of researchv9/X11/src/X.V11R1/server/dix/dispatch.c, revision 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.