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

unix.superglobalmegacorp.com

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