Annotation of researchv9/X11/src/X.V11R1/lib/X/save/XlibInt.c, revision 1.1

1.1     ! root        1: #include "copyright.h"
        !             2: /* Copyright    Massachusetts Institute of Technology    1985, 1986, 1987 */
        !             3: 
        !             4: #ifndef lint
        !             5: static char rcsid[] = "$Header: XlibInt.c,v 11.55 87/08/20 17:25:23 newman Exp $";
        !             6: #endif
        !             7: 
        !             8: /*
        !             9:  *     XlibInternal.c - Internal support routines for the C subroutine
        !            10:  *     interface library (Xlib) to the X Window System Protocol V11.0.
        !            11:  */
        !            12: #define NEED_EVENTS
        !            13: #define NEED_REPLIES
        !            14: 
        !            15: #include <stdio.h>
        !            16: #include "Xlibint.h"
        !            17: 
        !            18: /*
        !            19:  * The following routines are internal routines used by Xlib for protocol
        !            20:  * packet transmission and reception.
        !            21:  *
        !            22:  * XIOError(Display *) will be called if any sort of system call error occurs.
        !            23:  * This is assumed to be a fatal condition, i.e., XIOError should not return.
        !            24:  *
        !            25:  * XError(Display *, XErrorEvent *) will be called whenever an X_Error event is
        !            26:  * received.  This is not assumed to be a fatal condition, i.e., it is
        !            27:  * acceptable for this procedure to return.  However, XError should NOT
        !            28:  * perform any operations (directly or indirectly) on the DISPLAY.
        !            29:  *
        !            30:  * Routines declared with a return type of 'Status' return 0 on failure,
        !            31:  * and non 0 on success.  Routines with no declared return type don't 
        !            32:  * return anything.  Whenever possible routines that create objects return
        !            33:  * the object they have created.
        !            34:  */
        !            35: 
        !            36: _XQEvent *_qfree = NULL;                       /* NULL _XQEvent. */
        !            37: 
        !            38: static int padlength[4] = {0, 3, 2, 1};
        !            39:     /* lookup table for adding padding bytes to data that is read from
        !            40:        or written to the X socket.  */
        !            41: 
        !            42: static xReq _dummy_request = {
        !            43:        0, 0, 0
        !            44: };
        !            45: /*
        !            46:  * _XFlush - Flush the X request buffer.  If the buffer is empty, no
        !            47:  * action is taken.  This routine correctly handles incremental writes.
        !            48:  * This routine may have to be reworked if int < long.
        !            49:  */
        !            50: _XFlush (dpy)
        !            51:        register Display *dpy;
        !            52: {
        !            53:        register long size;
        !            54:        register int write_stat;
        !            55:        register char *bufindex;
        !            56: 
        !            57:        size = dpy->bufptr - dpy->buffer;
        !            58:        bufindex = dpy->bufptr = dpy->buffer;
        !            59:        /*
        !            60:         * While write has not written the entire buffer, keep looping
        !            61:         * until the entire buffer is written.  bufindex will be incremented
        !            62:         * and size decremented as buffer is written out.
        !            63:         */
        !            64:        while (size) {
        !            65:            write_stat = WriteToServer(dpy->fd, bufindex, (int) size);
        !            66:            if (write_stat > 0) {
        !            67:                size -= write_stat;
        !            68:                bufindex += write_stat;
        !            69:            } else {
        !            70:                /* Write failed! */
        !            71:                /* errno set by write system call. */
        !            72:                (*_XIOErrorFunction)(dpy);
        !            73:            }
        !            74:        }
        !            75:        dpy->last_req = (char *)&_dummy_request;
        !            76: }
        !            77: 
        !            78: /* 
        !            79:  * _XRead - Read bytes from the socket taking into account incomplete
        !            80:  * reads.  This routine may have to be reworked if int < long.
        !            81:  */
        !            82: _XRead (dpy, data, size)
        !            83:        register Display *dpy;
        !            84:        register char *data;
        !            85:        register long size;
        !            86: {
        !            87:        register long bytes_read;
        !            88: 
        !            89:        if (size == 0) return;
        !            90:        while ((bytes_read = ReadFromServer(dpy->fd, data, (int)size))
        !            91:                != size) {
        !            92: 
        !            93:                if (bytes_read > 0) {
        !            94:                    size -= bytes_read;
        !            95:                    data += bytes_read;
        !            96:                    }
        !            97: 
        !            98:                else if (bytes_read == 0) {
        !            99:                    /* Read failed because of end of file! */
        !           100:                    errno = EPIPE;
        !           101:                    (*_XIOErrorFunction)(dpy);
        !           102:                    }
        !           103: 
        !           104:                else  /* bytes_read is less than 0; presumably -1 */ {
        !           105:                    /* If it's a system call interrupt, it's not an error. */
        !           106:                    if (errno != EINTR)
        !           107:                        (*_XIOErrorFunction)(dpy);
        !           108:                    }
        !           109:                 }
        !           110: }
        !           111: 
        !           112: /*
        !           113:  * _XReadPad - Read bytes from the socket taking into account incomplete
        !           114:  * reads.  If the number of bytes is not 0 mod 32, read additional pad
        !           115:  * bytes. This routine may have to be reworked if int < long.
        !           116:  */
        !           117: _XReadPad (dpy, data, size)
        !           118:        register Display *dpy;  
        !           119:        register char *data;
        !           120:        register long size;
        !           121: {
        !           122:        register long bytes_read;
        !           123:        long padsize;
        !           124:        char pad[3];
        !           125: 
        !           126:        if (size == 0) return;
        !           127:        /* 
        !           128:         * The following hack is used to provide 32 bit long-word
        !           129:         * aligned padding.  The [1] vector is of length 0, 1, 2, or 3,
        !           130:         * whatever is needed.
        !           131:         */
        !           132:        padsize = padlength[size & 3];
        !           133: 
        !           134:        while ((bytes_read = ReadFromServer (dpy->fd, data, size)) != size) {
        !           135: 
        !           136:            if (bytes_read > 0) {
        !           137:                size -= bytes_read;
        !           138:                data += bytes_read;
        !           139:                }
        !           140: 
        !           141:            else if (bytes_read == 0) {
        !           142:                /* Read failed because of end of file! */
        !           143:                errno = EPIPE;
        !           144:                (*_XIOErrorFunction)(dpy);
        !           145:                }
        !           146:            
        !           147:            else  /* bytes_read is less than 0; presumably -1 */ {
        !           148:                /* If it's a system call interrupt, it's not an error. */
        !           149:                if (errno != EINTR)
        !           150:                    (*_XIOErrorFunction)(dpy);
        !           151:                }
        !           152:            }
        !           153: 
        !           154:        size = padsize;
        !           155:        if (size == 0) return;
        !           156:        data = pad;
        !           157:        while ((bytes_read = ReadFromServer (dpy->fd, data, size)) != size) {
        !           158:            if (bytes_read > 0) {
        !           159:                size -= bytes_read;
        !           160:                data += bytes_read;
        !           161:                }
        !           162: 
        !           163:            else if (bytes_read == 0) {
        !           164:                /* Read failed because of end of file! */
        !           165:                errno = EPIPE;
        !           166:                (*_XIOErrorFunction)(dpy);
        !           167:                }
        !           168:            
        !           169:            else  /* bytes_read is less than 0; presumably -1 */ {
        !           170:                /* If it's a system call interrupt, it's not an error. */
        !           171:                if (errno != EINTR)
        !           172:                    (*_XIOErrorFunction)(dpy);
        !           173:                }
        !           174:        }
        !           175:            
        !           176: }
        !           177: 
        !           178: /*
        !           179:  * _XSend - Flush the buffer and send the client data. 32 bit word aligned
        !           180:  * transmission is used, if size is not 0 mod 4, extra bytes are transmitted.
        !           181:  * This routine may have to be reworked if int < long;
        !           182:  */
        !           183: _XSend (dpy, data, size)
        !           184:        register Display *dpy;
        !           185:        char *data;
        !           186:        register long size;
        !           187: {
        !           188:        register long len;
        !           189:        static char pad[3] = {0, 0, 0};
        !           190:            /* XText8 and XText16 require that the padding bytes be zero! */
        !           191: 
        !           192:        len = dpy->bufptr - dpy->buffer;
        !           193:        dpy->bufptr = dpy->buffer;
        !           194:        if (len && WriteToServer(dpy->fd, dpy->buffer, len) != len)
        !           195:                (*_XIOErrorFunction)(dpy);      
        !           196:        if (size && WriteToServer(dpy->fd, data, size) != size)
        !           197:                (*_XIOErrorFunction)(dpy);      
        !           198:        /* 
        !           199:         * The following hack is used to provide 32 bit long-word
        !           200:         * aligned padding.  The [2] vector is of length 0, 1, 2, or 3,
        !           201:         * whatever is needed.
        !           202:         */
        !           203:        len = padlength[size & 3];
        !           204:        if (len && WriteToServer(dpy->fd, pad, len) != len)
        !           205:                (*_XIOErrorFunction)(dpy);      
        !           206:        dpy->last_req = (char *) & _dummy_request;
        !           207: }
        !           208: 
        !           209: /*
        !           210:  * _XAllocID - normal resource ID allocation routine.  A client
        !           211:  * can roll his own and instatantiate it if he wants, but must
        !           212:  * follow the rules.
        !           213:  */
        !           214: XID _XAllocID(dpy)
        !           215: register Display *dpy;
        !           216: {
        !           217:    return (dpy->resource_base + (dpy->resource_id++ << dpy->resource_shift));
        !           218: }
        !           219: 
        !           220: /*
        !           221:  * _XReply - Wait for a reply packet and copy its contents into the
        !           222:  * specified rep.  Mean while we must handle error and event packets that
        !           223:  * we may encounter.
        !           224:  */
        !           225: Status _XReply (dpy, rep, extra, discard)
        !           226:     register Display *dpy;
        !           227:     register xReply *rep;
        !           228:     int extra;         /* number of 32-bit words expected after the reply */
        !           229:     Bool discard;      /* should I discard data followind "extra" words? */
        !           230: {
        !           231:     _XFlush(dpy);
        !           232:     while (1) {
        !           233:        _XRead(dpy, (char *)rep, (long)sizeof(xReply));
        !           234:        switch ((int)rep->generic.type) {
        !           235: 
        !           236:            case X_Reply:
        !           237:                /* Reply recieved. */
        !           238:                if (extra == 0) {
        !           239:                    if (discard && (rep->generic.length > 0))
        !           240:                       /* unexpectedly long reply! */
        !           241:                       _EatData (dpy, rep->generic.length);
        !           242:                    return (1);
        !           243:                    }
        !           244:                if (extra == rep->generic.length) {
        !           245:                    /* 
        !           246:                     * Read the extra data into storage immediately following
        !           247:                     * the GenericReply structure. 
        !           248:                     */
        !           249:                    _XRead (dpy, (char *) (rep+1), ((long)extra)<<2);
        !           250:                    return (1);
        !           251:                    }
        !           252:                if (extra < rep->generic.length) {
        !           253:                    /* Actual reply is longer than "extra" */
        !           254:                    _XRead (dpy, (char *) (rep+1), ((long)extra)<<2);
        !           255:                    if (discard)
        !           256:                        _EatData (dpy, rep->generic.length - extra);
        !           257:                    return (1);
        !           258:                    }
        !           259:                /* 
        !           260:                 *if we get here, then extra > rep->generic.length--meaning we
        !           261:                 * read a reply that's shorter than we expected.  This is an 
        !           262:                 * error,  but we still need to figure out how to handle it...
        !           263:                 */
        !           264:                _XRead (dpy, (char *) (rep+1), (long) (rep->generic.length<<2));
        !           265:                (*_XIOErrorFunction) (dpy);
        !           266:                return (0);
        !           267: 
        !           268:            case X_Error:
        !           269:                {
        !           270:                register _XExtension *ext;
        !           271:                register Bool ret = False;
        !           272:                int ret_code;
        !           273:                xError *err = (xError *) rep;
        !           274:                if (err->sequenceNumber == dpy->request)
        !           275:                        /* do not die on "no such font", "can't allocate",
        !           276:                           "can't grab" failures */
        !           277:                        switch ((int)err->errorCode) {
        !           278:                        case BadName:
        !           279:                            switch (err->majorCode)
        !           280:                                case X_OpenFont:
        !           281:                                case X_LookupColor:
        !           282:                                case X_AllocNamedColor:
        !           283:                                    return(0);
        !           284:                                break;
        !           285:                        case BadFont:
        !           286:                            if (err->majorCode == X_QueryFont)
        !           287:                                return (0);
        !           288:                            break;
        !           289:                        case BadAlloc:
        !           290:                        case BadAccess:
        !           291:                                return (0);
        !           292:                        /* 
        !           293:                         * we better see if there is an extension who may
        !           294:                         * want to suppress the error.
        !           295:                         */
        !           296:                        default:
        !           297:                            ext = dpy->ext_procs;
        !           298:                            while (ext) {
        !           299:                                if (ext->error != NULL) 
        !           300:                                   ret = (*ext->error)
        !           301:                                        (dpy, err, &ext->codes, &ret_code);
        !           302:                                ext = ext->next;
        !           303:                                }
        !           304:                            if (ret) return (ret_code);
        !           305:                            break;
        !           306:                        }
        !           307:                _XError(dpy, err);
        !           308:                if (err->sequenceNumber == dpy->request)
        !           309:                    return(0);
        !           310:                }
        !           311:                break;
        !           312:            default:
        !           313:                _XEnq(dpy, (xEvent *) rep);
        !           314:                break;
        !           315:            }
        !           316:        }
        !           317: }   
        !           318: 
        !           319: 
        !           320: /* Read and discard "n" 32-bit words. */
        !           321: 
        !           322: static _EatData (dpy, n)
        !           323:     Display *dpy;
        !           324:     unsigned long n;
        !           325:     {
        !           326:     unsigned int bufsize;
        !           327:     char *buf;
        !           328:     n <<= 2;  /* convert to number of bytes */
        !           329:     buf = Xmalloc (bufsize = (n > 2048) ? 2048 : n);
        !           330:     while (n) {
        !           331:        long bytes_read = (n > bufsize) ? bufsize : n;
        !           332:        _XRead (dpy, buf, bytes_read);
        !           333:        n -= bytes_read;
        !           334:        }
        !           335:     Xfree (buf);
        !           336:     }
        !           337: 
        !           338: /*
        !           339:  * _XEnq - Place event packets on the display's queue.
        !           340:  * note that no squishing of move events in V11, since there
        !           341:  * is pointer motion hints....
        !           342:  */
        !           343: _XEnq (dpy, event)
        !           344:        register Display *dpy;
        !           345:        register xEvent *event;
        !           346: {
        !           347:        register _XQEvent *qelt;
        !           348: 
        !           349: /*NOSTRICT*/
        !           350:        if (qelt = _qfree) {
        !           351:                /* If _qfree is non-NULL do this, else malloc a new one. */
        !           352:                _qfree = qelt->next;
        !           353:        }
        !           354:        else if ((qelt = 
        !           355:            (_XQEvent *) Xmalloc((unsigned)sizeof(_XQEvent))) == NULL) {
        !           356:                /* Malloc call failed! */
        !           357:                errno = ENOMEM;
        !           358:                (*_XIOErrorFunction)(dpy);
        !           359:        }
        !           360:        qelt->next = NULL;
        !           361:        /* go call through display to find proper event reformatter */
        !           362:        (*dpy->event_vec[event->u.u.type & 0177])(dpy, &qelt->event, event);
        !           363: 
        !           364:        if (dpy->tail)  dpy->tail->next = qelt;
        !           365:        else            dpy->head = qelt;
        !           366: 
        !           367:        dpy->tail = qelt;
        !           368:        dpy->qlen++;
        !           369: }
        !           370: /*
        !           371:  * EventToWire in seperate file in that often not needed.
        !           372:  */
        !           373: 
        !           374: /*ARGSUSED*/
        !           375: _XUnknownWireEvent(dpy, re, event)
        !           376: register Display *dpy; /* pointer to display structure */
        !           377: register XEvent *re;   /* pointer to where event should be reformatted */
        !           378: register xEvent *event;        /* wire protocol event */
        !           379: {
        !           380:        (void) fprintf(stderr, 
        !           381:            "Xlib: unhandled wire event! event number = %d, display = %x\n.",
        !           382:                        event->u.u.type, dpy);
        !           383:        exit(1);
        !           384: }
        !           385: 
        !           386: /*ARGSUSED*/
        !           387: _XUnknownNativeEvent(dpy, re, event)
        !           388: register Display *dpy; /* pointer to display structure */
        !           389: register XEvent *re;   /* pointer to where event should be reformatted */
        !           390: register xEvent *event;        /* wire protocol event */
        !           391: {
        !           392:        (void) fprintf(stderr, 
        !           393:           "Xlib: unhandled native event! event number = %d, display = %x\n.",
        !           394:                        re->type, dpy);
        !           395:        exit(1);
        !           396: }
        !           397: /*
        !           398:  * reformat a wire event into an XEvent structure of the right type.
        !           399:  */
        !           400: _XWireToEvent(dpy, re, event)
        !           401: register Display *dpy; /* pointer to display structure */
        !           402: register XEvent *re;   /* pointer to where event should be reformatted */
        !           403: register xEvent *event;        /* wire protocol event */
        !           404: {
        !           405: 
        !           406:        ((XAnyEvent *)re)->display = dpy;       
        !           407:        re->type = event->u.u.type;
        !           408:        
        !           409:        /* Ignore the leading bit of the event type since it is set when a
        !           410:                client sends an event rather than the server. */
        !           411: 
        !           412:        switch (event-> u.u.type & 0177) {
        !           413:              case KeyPress:
        !           414:              case KeyRelease:
        !           415:                {
        !           416:                        register XKeyEvent *ev = (XKeyEvent*) re;
        !           417:                        ev->root        = event->u.keyButtonPointer.root;
        !           418:                        ev->window      = event->u.keyButtonPointer.event;
        !           419:                        ev->subwindow   = event->u.keyButtonPointer.child;
        !           420:                        ev->time        = event->u.keyButtonPointer.time;
        !           421:                        ev->x           = event->u.keyButtonPointer.eventX;
        !           422:                        ev->y           = event->u.keyButtonPointer.eventY;
        !           423:                        ev->x_root      = event->u.keyButtonPointer.rootX;
        !           424:                        ev->y_root      = event->u.keyButtonPointer.rootY;
        !           425:                        ev->state       = event->u.keyButtonPointer.state;
        !           426:                        ev->same_screen = event->u.keyButtonPointer.sameScreen;
        !           427:                        ev->keycode     = event->u.u.detail;
        !           428:                }
        !           429:                break;
        !           430:              case ButtonPress:
        !           431:              case ButtonRelease:
        !           432:                {
        !           433:                        register XButtonEvent *ev =  (XButtonEvent *) re;
        !           434:                        ev->root        = event->u.keyButtonPointer.root;
        !           435:                        ev->window      = event->u.keyButtonPointer.event;
        !           436:                        ev->subwindow   = event->u.keyButtonPointer.child;
        !           437:                        ev->time        = event->u.keyButtonPointer.time;
        !           438:                        ev->x           = event->u.keyButtonPointer.eventX;
        !           439:                        ev->y           = event->u.keyButtonPointer.eventY;
        !           440:                        ev->x_root      = event->u.keyButtonPointer.rootX;
        !           441:                        ev->y_root      = event->u.keyButtonPointer.rootY;
        !           442:                        ev->state       = event->u.keyButtonPointer.state;
        !           443:                        ev->same_screen = event->u.keyButtonPointer.sameScreen;
        !           444:                        ev->button      = event->u.u.detail;
        !           445:                }
        !           446:                break;
        !           447:              case MotionNotify:
        !           448:                {
        !           449:                        register XMotionEvent *ev =   (XMotionEvent *)re;
        !           450:                        ev->root        = event->u.keyButtonPointer.root;
        !           451:                        ev->window      = event->u.keyButtonPointer.event;
        !           452:                        ev->subwindow   = event->u.keyButtonPointer.child;
        !           453:                        ev->time        = event->u.keyButtonPointer.time;
        !           454:                        ev->x           = event->u.keyButtonPointer.eventX;
        !           455:                        ev->y           = event->u.keyButtonPointer.eventY;
        !           456:                        ev->x_root      = event->u.keyButtonPointer.rootX;
        !           457:                        ev->y_root      = event->u.keyButtonPointer.rootY;
        !           458:                        ev->state       = event->u.keyButtonPointer.state;
        !           459:                        ev->same_screen = event->u.keyButtonPointer.sameScreen;
        !           460:                        ev->is_hint     = event->u.u.detail;
        !           461:                }
        !           462:                break;
        !           463:              case EnterNotify:
        !           464:              case LeaveNotify:
        !           465:                {
        !           466:                        register XCrossingEvent *ev   = (XCrossingEvent *) re;
        !           467:                        ev->root        = event->u.enterLeave.root;
        !           468:                        ev->window      = event->u.enterLeave.event;
        !           469:                        ev->subwindow   = event->u.enterLeave.child;
        !           470:                        ev->time        = event->u.enterLeave.time;
        !           471:                        ev->x           = event->u.enterLeave.eventX;
        !           472:                        ev->y           = event->u.enterLeave.eventY;
        !           473:                        ev->x_root      = event->u.enterLeave.rootX;
        !           474:                        ev->y_root      = event->u.enterLeave.rootY;
        !           475:                        ev->state       = event->u.enterLeave.state;
        !           476:                        ev->mode        = event->u.enterLeave.mode;
        !           477:                        ev->same_screen = (event->u.enterLeave.flags & 
        !           478:                                ELFlagSameScreen) && True;
        !           479:                        ev->focus       = (event->u.enterLeave.flags &
        !           480:                                ELFlagFocus) && True;
        !           481:                        ev->detail      = event->u.u.detail;
        !           482:                }
        !           483:                  break;
        !           484:              case FocusIn:
        !           485:              case FocusOut:
        !           486:                {
        !           487:                        register XFocusChangeEvent *ev = (XFocusChangeEvent *) re;
        !           488:                        ev->window      = event->u.focus.window;
        !           489:                        ev->mode        = event->u.focus.mode;
        !           490:                        ev->detail      = event->u.u.detail;
        !           491:                }
        !           492:                  break;
        !           493:              case KeymapNotify:
        !           494:                {
        !           495:                        register XKeymapEvent *ev = (XKeymapEvent *) re;
        !           496:                        ev->window      = dpy->current;
        !           497:                        bcopy ((char *)((xKeymapEvent *) event)->map,
        !           498:                               &ev->key_vector[1], 
        !           499:                               sizeof (((xKeymapEvent *) event)->map));
        !           500:                }
        !           501:                break;
        !           502:              case Expose:
        !           503:                {
        !           504:                        register XExposeEvent *ev = (XExposeEvent *) re;
        !           505:                        ev->window      = event->u.expose.window;
        !           506:                        ev->x           = event->u.expose.x;
        !           507:                        ev->y           = event->u.expose.y;
        !           508:                        ev->width       = event->u.expose.width;
        !           509:                        ev->height      = event->u.expose.height;
        !           510:                        ev->count       = event->u.expose.count;
        !           511:                }
        !           512:                break;
        !           513:              case GraphicsExpose:
        !           514:                {
        !           515:                    register XGraphicsExposeEvent *ev =
        !           516:                        (XGraphicsExposeEvent *) re;
        !           517:                    ev->drawable        = event->u.graphicsExposure.drawable;
        !           518:                    ev->x               = event->u.graphicsExposure.x;
        !           519:                    ev->y               = event->u.graphicsExposure.y;
        !           520:                    ev->width           = event->u.graphicsExposure.width;
        !           521:                    ev->height          = event->u.graphicsExposure.height;
        !           522:                    ev->count           = event->u.graphicsExposure.count;
        !           523:                    ev->major_code      = event->u.graphicsExposure.majorEvent;
        !           524:                    ev->minor_code      = event->u.graphicsExposure.minorEvent;
        !           525:                }
        !           526:                break;
        !           527:              case NoExpose:
        !           528:                {
        !           529:                    register XNoExposeEvent *ev = (XNoExposeEvent *) re;
        !           530:                    ev->drawable        = event->u.noExposure.drawable;
        !           531:                    ev->major_code      = event->u.noExposure.majorEvent;
        !           532:                    ev->minor_code      = event->u.noExposure.minorEvent;
        !           533:                }
        !           534:                break;
        !           535:              case VisibilityNotify:
        !           536:                {
        !           537:                    register XVisibilityEvent *ev = (XVisibilityEvent *) re;
        !           538:                    ev->window          = event->u.visibility.window;
        !           539:                    ev->state           = event->u.visibility.state;
        !           540:                }
        !           541:                break;
        !           542:              case CreateNotify:
        !           543:                {
        !           544:                    register XCreateWindowEvent *ev =
        !           545:                         (XCreateWindowEvent *) re;
        !           546:                    ev->window          = event->u.createNotify.window;
        !           547:                    ev->parent          = event->u.createNotify.parent;
        !           548:                    ev->x               = event->u.createNotify.x;
        !           549:                    ev->y               = event->u.createNotify.y;
        !           550:                    ev->width           = event->u.createNotify.width;
        !           551:                    ev->height          = event->u.createNotify.height;
        !           552:                    ev->border_width    = event->u.createNotify.borderWidth;
        !           553:                    ev->override_redirect       = event->u.createNotify.override;
        !           554:                }
        !           555:                break;
        !           556:              case DestroyNotify:
        !           557:                {
        !           558:                    register XDestroyWindowEvent *ev =
        !           559:                                (XDestroyWindowEvent *) re;
        !           560:                    ev->window          = event->u.destroyNotify.window;
        !           561:                    ev->event           = event->u.destroyNotify.event;
        !           562:                }
        !           563:                break;
        !           564:              case UnmapNotify:
        !           565:                {
        !           566:                    register XUnmapEvent *ev = (XUnmapEvent *) re;
        !           567:                    ev->window          = event->u.unmapNotify.window;
        !           568:                    ev->event           = event->u.unmapNotify.event;
        !           569:                    ev->from_configure  = event->u.unmapNotify.fromConfigure;
        !           570:                }
        !           571:                break;
        !           572:              case MapNotify:
        !           573:                {
        !           574:                    register XMapEvent *ev = (XMapEvent *) re;
        !           575:                    ev->window          = event->u.mapNotify.window;
        !           576:                    ev->event           = event->u.mapNotify.event;
        !           577:                    ev->override_redirect       = event->u.mapNotify.override;
        !           578:                }
        !           579:                break;
        !           580:              case MapRequest:
        !           581:                {
        !           582:                    register XMapRequestEvent *ev = (XMapRequestEvent *) re;
        !           583:                    ev->window          = event->u.mapRequest.window;
        !           584:                    ev->parent          = event->u.mapRequest.parent;
        !           585:                }
        !           586:                break;
        !           587:              case ReparentNotify:
        !           588:                {
        !           589:                    register XReparentEvent *ev = (XReparentEvent *) re;
        !           590:                    ev->event           = event->u.reparent.event;
        !           591:                    ev->window          = event->u.reparent.window;
        !           592:                    ev->parent          = event->u.reparent.parent;
        !           593:                    ev->x               = event->u.reparent.x;
        !           594:                    ev->y               = event->u.reparent.y;
        !           595:                    ev->override_redirect       = event->u.reparent.override;
        !           596:                }
        !           597:                break;
        !           598:              case ConfigureNotify:
        !           599:                {
        !           600:                    register XConfigureEvent *ev = (XConfigureEvent *) re;
        !           601:                    ev->event   = event->u.configureNotify.event;
        !           602:                    ev->window  = event->u.configureNotify.window;
        !           603:                    ev->above   = event->u.configureNotify.aboveSibling;
        !           604:                    ev->x       = event->u.configureNotify.x;
        !           605:                    ev->y       = event->u.configureNotify.y;
        !           606:                    ev->width   = event->u.configureNotify.width;
        !           607:                    ev->height  = event->u.configureNotify.height;
        !           608:                    ev->border_width  = event->u.configureNotify.borderWidth;
        !           609:                    ev->override_redirect = event->u.configureNotify.override;
        !           610:                }
        !           611:                break;
        !           612:              case ConfigureRequest:
        !           613:                {
        !           614:                    register XConfigureRequestEvent *ev =
        !           615:                        (XConfigureRequestEvent *) re;
        !           616:                    ev->window          = event->u.configureRequest.window;
        !           617:                    ev->parent          = event->u.configureRequest.parent;
        !           618:                    ev->above           = event->u.configureRequest.sibling;
        !           619:                    ev->x               = event->u.configureRequest.x;
        !           620:                    ev->y               = event->u.configureRequest.y;
        !           621:                    ev->width           = event->u.configureRequest.width;
        !           622:                    ev->height          = event->u.configureRequest.height;
        !           623:                    ev->border_width    = event->u.configureRequest.borderWidth;
        !           624:                    ev->value_mask      = event->u.configureRequest.valueMask;
        !           625:                    ev->detail          = event->u.u.detail;
        !           626:                }
        !           627:                break;
        !           628:              case GravityNotify:
        !           629:                {
        !           630:                    register XGravityEvent *ev = (XGravityEvent *) re;
        !           631:                    ev->window          = event->u.gravity.window;
        !           632:                    ev->event           = event->u.gravity.event;
        !           633:                    ev->x               = event->u.gravity.x;
        !           634:                    ev->y               = event->u.gravity.y;
        !           635:                }
        !           636:                break;
        !           637:              case ResizeRequest:
        !           638:                {
        !           639:                    register XResizeRequestEvent *ev =
        !           640:                        (XResizeRequestEvent *) re;
        !           641:                    ev->window          = event->u.resizeRequest.window;
        !           642:                    ev->width           = event->u.resizeRequest.width;
        !           643:                    ev->height          = event->u.resizeRequest.height;
        !           644:                }
        !           645:                break;
        !           646:              case CirculateNotify:
        !           647:                {
        !           648:                    register XCirculateEvent *ev = (XCirculateEvent *) re;
        !           649:                    ev->window          = event->u.circulate.window;
        !           650:                    ev->event           = event->u.circulate.event;
        !           651:                    ev->place           = event->u.circulate.place;
        !           652:                }
        !           653:                break;
        !           654:              case CirculateRequest:
        !           655:                {
        !           656:                    register XCirculateRequestEvent *ev =
        !           657:                        (XCirculateRequestEvent *) re;
        !           658:                    ev->window          = event->u.circulate.window;
        !           659:                    ev->parent          = event->u.circulate.event;
        !           660:                    ev->place           = event->u.circulate.place;
        !           661:                }
        !           662:                break;
        !           663:              case PropertyNotify:
        !           664:                {
        !           665:                    register XPropertyEvent *ev = (XPropertyEvent *) re;
        !           666:                    ev->window          = event->u.property.window;
        !           667:                    ev->atom            = event->u.property.atom;
        !           668:                    ev->time            = event->u.property.time;
        !           669:                    ev->state           = event->u.property.state;
        !           670:                }
        !           671:                break;
        !           672:              case SelectionClear:
        !           673:                {
        !           674:                    register XSelectionClearEvent *ev =
        !           675:                         (XSelectionClearEvent *) re;
        !           676:                    ev->window          = event->u.selectionClear.window;
        !           677:                    ev->selection       = event->u.selectionClear.atom;
        !           678:                    ev->time            = event->u.selectionClear.time;
        !           679:                }
        !           680:                break;
        !           681:              case SelectionRequest:
        !           682:                {
        !           683:                    register XSelectionRequestEvent *ev =
        !           684:                        (XSelectionRequestEvent *) re;
        !           685:                    ev->owner           = event->u.selectionRequest.owner;
        !           686:                    ev->requestor       = event->u.selectionRequest.requestor;
        !           687:                    ev->selection       = event->u.selectionRequest.selection;
        !           688:                    ev->target          = event->u.selectionRequest.target;
        !           689:                    ev->property        = event->u.selectionRequest.property;
        !           690:                    ev->time            = event->u.selectionRequest.time;
        !           691:                }
        !           692:                break;
        !           693:              case SelectionNotify:
        !           694:                {
        !           695:                    register XSelectionEvent *ev = (XSelectionEvent *) re;
        !           696:                    ev->requestor       = event->u.selectionNotify.requestor;
        !           697:                    ev->selection       = event->u.selectionNotify.selection;
        !           698:                    ev->target          = event->u.selectionNotify.target;
        !           699:                    ev->property        = event->u.selectionNotify.property;
        !           700:                    ev->time            = event->u.selectionNotify.time;
        !           701:                }
        !           702:                break;
        !           703:              case ColormapNotify:
        !           704:                {
        !           705:                    register XColormapEvent *ev = (XColormapEvent *) re;
        !           706:                    ev->window          = event->u.colormap.window;
        !           707:                    ev->colormap        = event->u.colormap.colormap;
        !           708:                    ev->new             = event->u.colormap.new;
        !           709:                    ev->state           = event->u.colormap.state;
        !           710:                }
        !           711:                break;
        !           712:              case ClientMessage:
        !           713:                {
        !           714:                   register int i;
        !           715:                   register XClientMessageEvent *ev 
        !           716:                                        = (XClientMessageEvent *) re;
        !           717:                   ev->window           = event->u.clientMessage.window;
        !           718:                   ev->format           = event->u.u.detail;
        !           719:                   switch (ev->format) {
        !           720:                        case 8: 
        !           721:                           ev->message_type = event->u.clientMessage.u.b.type;
        !           722:                           for (i = 0; i < 20; i++)     
        !           723:                             ev->data.b[i] = event->u.clientMessage.u.b.bytes[i];
        !           724:                           break;
        !           725:                        case 16:
        !           726:                           ev->message_type = event->u.clientMessage.u.s.type;
        !           727:                           ev->data.s[0] = event->u.clientMessage.u.s.shorts0;
        !           728:                           ev->data.s[1] = event->u.clientMessage.u.s.shorts1;
        !           729:                           ev->data.s[2] = event->u.clientMessage.u.s.shorts2;
        !           730:                           ev->data.s[3] = event->u.clientMessage.u.s.shorts3;
        !           731:                           ev->data.s[4] = event->u.clientMessage.u.s.shorts4;
        !           732:                           ev->data.s[5] = event->u.clientMessage.u.s.shorts5;
        !           733:                           ev->data.s[6] = event->u.clientMessage.u.s.shorts6;
        !           734:                           ev->data.s[7] = event->u.clientMessage.u.s.shorts7;
        !           735:                           ev->data.s[8] = event->u.clientMessage.u.s.shorts8;
        !           736:                           ev->data.s[9] = event->u.clientMessage.u.s.shorts9;
        !           737:                           break;
        !           738:                        case 32:
        !           739:                           ev->message_type = event->u.clientMessage.u.l.type;
        !           740:                           ev->data.l[0] = event->u.clientMessage.u.l.longs0;
        !           741:                           ev->data.l[1] = event->u.clientMessage.u.l.longs1;
        !           742:                           ev->data.l[2] = event->u.clientMessage.u.l.longs2;
        !           743:                           ev->data.l[3] = event->u.clientMessage.u.l.longs3;
        !           744:                           ev->data.l[4] = event->u.clientMessage.u.l.longs4;
        !           745:                           break;
        !           746:                        default: /* XXX should never occur */
        !           747:                                break;
        !           748:                    }
        !           749:                }
        !           750:                break;
        !           751:              case MappingNotify:
        !           752:                {
        !           753:                   register XMappingEvent *ev = (XMappingEvent *)re;
        !           754:                   ev->first_keycode    = event->u.mappingNotify.firstKeyCode;
        !           755:                   ev->request          = event->u.mappingNotify.request;
        !           756:                   ev->count            = event->u.mappingNotify.count;
        !           757:                }
        !           758:                break;
        !           759:              default:
        !           760:                /* XXX should do something about unknown event here */
        !           761:                break;
        !           762:        }
        !           763: }
        !           764: 
        !           765: 
        !           766: /*
        !           767:  * _XIOError - Default fatal system error reporting routine.  Called when
        !           768:  * an X internal system error is encountered.
        !           769:  */
        !           770: _XIOError (dpy)
        !           771:        Display *dpy;
        !           772: {
        !           773:        if (errno == EPIPE) {
        !           774:            (void) fprintf (stderr, 
        !           775:                        "Connection # %d to server broken.\n", dpy->fd);
        !           776:          }
        !           777:        perror("XIO");
        !           778:        exit(1);
        !           779: }
        !           780: 
        !           781: /*
        !           782:  * _XError - Default non-fatal error reporting routine.  Called when an
        !           783:  * X_Error packet is encountered in the input stream.
        !           784:  */
        !           785: int _XError (dpy, rep)
        !           786:     Display *dpy;
        !           787:     xError *rep;
        !           788: {
        !           789:     XErrorEvent event;
        !           790:     /* 
        !           791:      * X_Error packet encountered!  We need to unpack the error before
        !           792:      * giving it to the user.
        !           793:      */
        !           794: 
        !           795:     event.display = dpy;
        !           796:     event.type = X_Error;
        !           797:     event.serial = rep->sequenceNumber;
        !           798:     event.resourceid = rep->resourceID;
        !           799:     event.error_code = rep->errorCode;
        !           800:     event.request_code = rep->majorCode;
        !           801:     event.minor_code = rep->minorCode;
        !           802:     if (_XErrorFunction != NULL) {
        !           803:        return ((*_XErrorFunction)(dpy, &event));
        !           804:       }
        !           805:     exit(1);
        !           806:     return(0);                 /* stupid lint */
        !           807: }
        !           808:     
        !           809: int _XDefaultError(dpy, event)
        !           810:        Display *dpy;
        !           811:        XErrorEvent *event;
        !           812: {
        !           813:     char buffer[BUFSIZ];
        !           814:     char mesg[BUFSIZ];
        !           815:     char number[32];
        !           816:     char *mtype = "XlibMessage";
        !           817:     XGetErrorText(dpy, event->error_code, buffer, BUFSIZ);
        !           818:     XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ);
        !           819:     (void) fprintf(stderr, "%s: %s\n  ", mesg, buffer);
        !           820:     XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d", 
        !           821:        mesg, BUFSIZ);
        !           822:     (void) fprintf(stderr, mesg, event->request_code);
        !           823:     sprintf(number, "%d", event->request_code);
        !           824:     XGetErrorDatabaseText(dpy, "XRequest", number, "",         buffer, BUFSIZ);
        !           825:     (void) fprintf(stderr, " %s", buffer);
        !           826:     fputs("\n  ", stderr);
        !           827:     XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code", 
        !           828:        mesg, BUFSIZ);
        !           829:     (void) fprintf(stderr, mesg, event->minor_code);
        !           830:     fputs("\n  ", stderr);
        !           831:     XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
        !           832:        mesg, BUFSIZ);
        !           833:     (void) fprintf(stderr, mesg, event->resourceid);
        !           834:     fputs("\n  ", stderr);
        !           835:     XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d", 
        !           836:        mesg, BUFSIZ);
        !           837:     (void) fprintf(stderr, mesg, event->serial);
        !           838:     fputs("\n  ", stderr);
        !           839:     XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d",
        !           840:        mesg, BUFSIZ);
        !           841:     (void) fprintf(stderr, mesg, dpy->request);
        !           842:     fputs("\n  ", stderr);
        !           843:     if (event->error_code == BadImplementation) return 0;
        !           844:     exit(1);
        !           845:     return (0);                        /* stupid lint */
        !           846: }
        !           847: 
        !           848: int (*_XIOErrorFunction)() = _XIOError;
        !           849: int (*_XErrorFunction)() = _XDefaultError;
        !           850: 
        !           851: /*
        !           852:  * This routine can be used to (cheaply) get some memory within a single
        !           853:  * Xlib routine for scratch space.  It is reallocated from the same place
        !           854:  * each time, unless the library needs a large scratch space.
        !           855:  */
        !           856: char *_XAllocScratch (dpy, nbytes)
        !           857:        register Display *dpy;
        !           858:        unsigned long nbytes;
        !           859: {
        !           860:        if (nbytes > dpy->scratch_length) {
        !           861:            if (dpy->scratch_buffer != NULL) Xfree (dpy->scratch_buffer);
        !           862:            return( dpy->scratch_length = nbytes, 
        !           863:            dpy->scratch_buffer = Xmalloc ((unsigned)nbytes) );
        !           864:        }
        !           865:        return (dpy->scratch_buffer);
        !           866: }
        !           867: 
        !           868: /*
        !           869:  * Given a visual id, find the visual structure for this id on this display.
        !           870:  */
        !           871: Visual *_XVIDtoVisual (dpy, id)
        !           872:        Display *dpy;
        !           873:        VisualID id;
        !           874: {
        !           875:        register int i, j, k;
        !           876:        register Screen *sp;
        !           877:        register Depth *dp;
        !           878:        register Visual *vp;
        !           879:        for (i = 0; i < dpy->nscreens; i++) {
        !           880:                sp = &dpy->screens[i];
        !           881:                for (j = 0; j < sp->ndepths; j++) {
        !           882:                        dp = &sp->depths[j];
        !           883:                        for (k = 0; k < dp->nvisuals; k++) {
        !           884:                                vp = &dp->visuals[k];
        !           885:                                if (vp->visualid == id) return (vp);
        !           886:                        }
        !           887:                }
        !           888:        }
        !           889:        return (NULL);
        !           890: }
        !           891: 
        !           892: XFree (data)
        !           893:        char *data;
        !           894: {
        !           895:        Xfree (data);
        !           896: }
        !           897: 
        !           898: #ifdef BIGSHORTS
        !           899: UnpackShorts(from, to, bytes)
        !           900:        ushort_p *from;
        !           901:        short *to;
        !           902:        unsigned bytes;
        !           903: {
        !           904:        unsigned i;
        !           905:        for (i = 0; i < (bytes/psizeof(short)); i++)
        !           906:                if (i&1)
        !           907:                        to[i] = from[i>>1].right;
        !           908:                else
        !           909:                        to[i] = from[i>>1].left;
        !           910: }
        !           911: 
        !           912: char packbuffer[1000];
        !           913: PackData(dpy, data, len)
        !           914:     register Display *dpy;
        !           915:     short *data;
        !           916:     unsigned len;
        !           917: {
        !           918:        if (dpy->bufptr + len < dpy->bufmax) {
        !           919:                PackShorts(data, dpy->bufptr, len);
        !           920:                dpy->bufptr += (len + 3) & ~3;
        !           921:        } else {
        !           922:                PackShorts(data, packbuffer, len);
        !           923:                _XSend(dpy, packbuffer, len);
        !           924:        }
        !           925: }
        !           926: 
        !           927: PackShorts(from, to, bytes)
        !           928:        short *from;
        !           929:        char *to;
        !           930:        unsigned bytes;
        !           931: {
        !           932:        unsigned i, n, offset;
        !           933:        ushort_p *uto;
        !           934: 
        !           935:        uto = (ushort_p *)to;
        !           936:        offset = ((int)to & 2) >> 1; /* lost 2 bits of pointer */
        !           937:        n = (bytes / 2) + offset;
        !           938:        for (i = offset; i < n; i++) {
        !           939:                if (i&1)
        !           940:                        uto[i>>1].right = from[i-offset];
        !           941:                else
        !           942:                        uto[i>>1].left = from[i-offset];
        !           943:        }
        !           944: }
        !           945: #endif

unix.superglobalmegacorp.com

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