Annotation of 43BSDReno/contrib/isode-beta/others/X/client/Xlibint.h, revision 1.1.1.1

1.1       root        1: #include <X11/copyright.h>
                      2: 
                      3: /* $XConsortium: Xlibint.h,v 11.61 88/09/06 16:09:16 jim Exp $ */
                      4: /* Copyright 1984, 1985, 1987  Massachusetts Institute of Technology */
                      5: 
                      6: /*
                      7:  *     XlibInternal.h - Header definition and support file for the internal
                      8:  *     support routines (XlibInternal) used by the C subroutine interface
                      9:  *     library (Xlib) to the X Window System.
                     10:  *
                     11:  *     Warning, there be dragons here....
                     12:  */
                     13: #ifndef NEED_EVENTS
                     14: #define _XEVENT_
                     15: #endif
                     16: 
                     17: #ifdef CRAY
                     18: #ifndef __TYPES__
                     19: #define __TYPES__
                     20: #include <sys/types.h>                 /* forgot to protect it... */
                     21: #endif /* __TYPES__ */
                     22: #else
                     23: #include <sys/types.h>
                     24: #endif /* CRAY */
                     25: 
                     26: /*
                     27:  * define the following if you want the Data macro to be a procedure instead
                     28:  */
                     29: #if defined(CRAY)
                     30: #define DataRoutineIsProcedure
                     31: #endif /* CRAY */
                     32: 
                     33: #include "Xlib.h"
                     34: #include <X11/Xproto.h>
                     35: #include "Xlibos.h"
                     36: #include <errno.h>
                     37: 
                     38: #ifndef NULL
                     39: #define NULL 0
                     40: #endif
                     41: #define LOCKED 1
                     42: #define UNLOCKED 0
                     43: 
                     44: extern int errno;                      /* Internal system error number. */
                     45: extern void bcopy();
                     46: 
                     47: extern (*_XIOErrorFunction)();         /* X system error reporting routine. */
                     48: extern (*_XErrorFunction)();           /* X_Error event reporting routine. */
                     49: extern char *_XAllocScratch();         /* fast memory allocator */
                     50: extern Visual *_XVIDtoVisual();                /* given visual id, find structure */
                     51: 
                     52: #ifndef BUFSIZE
                     53: #define BUFSIZE 2048                   /* X output buffer size. */
                     54: #endif
                     55: #ifndef EPERBATCH
                     56: #define EPERBATCH 8                    /* when batching, how many elements */
                     57: #endif
                     58: #ifndef CURSORFONT
                     59: #define CURSORFONT "cursor"            /* standard cursor fonts */
                     60: #endif
                     61: 
                     62: /*
                     63:  * X Protocol packetizing macros.
                     64:  */
                     65: 
                     66: /*   Need to start requests on 64 bit word boundries
                     67:  *   on a CRAY computer so add a NoOp (127) if needed.
                     68:  *   A character pointer on a CRAY computer will be non-zero
                     69:  *   after shifting right 61 bits of it is not pointing to
                     70:  *   a word boundary.
                     71:  */
                     72: #ifdef WORD64
                     73: #define WORD64ALIGN if ((long)dpy->bufptr >> 61) {\
                     74:            dpy->last_req = dpy->bufptr;\
                     75:            *(dpy->bufptr)   = X_NoOperation;\
                     76:            *(dpy->bufptr+1) =  0;\
                     77:            *(dpy->bufptr+2) =  0;\
                     78:            *(dpy->bufptr+3) =  1;\
                     79:              dpy->request += 1;\
                     80:              dpy->bufptr += 4;\
                     81:          }
                     82: #else /* else does not require alignment on 64-bit boundaries */
                     83: #define WORD64ALIGN
                     84: #endif /* WORD64 */
                     85: 
                     86: 
                     87: /*
                     88:  * GetReq - Get the next avilable X request packet in the buffer and
                     89:  * return it. 
                     90:  *
                     91:  * "name" is the name of the request, e.g. CreatePixmap, OpenFont, etc.
                     92:  * "req" is the name of the request pointer.
                     93:  *
                     94:  */
                     95: 
                     96: #if defined(__STDC__) && !defined(UNIXCPP)
                     97: #define GetReq(name, req) \
                     98:         WORD64ALIGN\
                     99:        if ((dpy->bufptr + SIZEOF(x##name##Req)) > dpy->bufmax)\
                    100:                _XFlush(dpy);\
                    101:        req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
                    102:        req->reqType = X_##name;\
                    103:        req->length = (SIZEOF(x##name##Req))>>2;\
                    104:        dpy->bufptr += SIZEOF(x##name##Req);\
                    105:        dpy->request++
                    106: 
                    107: #else  /* non-ANSI C uses empty comment instead of "##" for token concatenation */
                    108: #define GetReq(name, req) \
                    109:         WORD64ALIGN\
                    110:        if ((dpy->bufptr + SIZEOF(x/**/name/**/Req)) > dpy->bufmax)\
                    111:                _XFlush(dpy);\
                    112:        req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
                    113:        req->reqType = X_/**/name;\
                    114:        req->length = (SIZEOF(x/**/name/**/Req))>>2;\
                    115:        dpy->bufptr += SIZEOF(x/**/name/**/Req);\
                    116:        dpy->request++
                    117: #endif
                    118: 
                    119: /* GetReqExtra is the same as GetReq, but allocates "n" additional
                    120:    bytes after the request. "n" must be a multiple of 4!  */
                    121: 
                    122: #if defined(__STDC__) && !defined(UNIXCPP)
                    123: #define GetReqExtra(name, n, req) \
                    124:         WORD64ALIGN\
                    125:        if ((dpy->bufptr + SIZEOF(*req) + n) > dpy->bufmax)\
                    126:                _XFlush(dpy);\
                    127:        req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\
                    128:        req->reqType = X_##name;\
                    129:        req->length = (SIZEOF(*req) + n)>>2;\
                    130:        dpy->bufptr += SIZEOF(*req) + n;\
                    131:        dpy->request++
                    132: #else
                    133: #define GetReqExtra(name, n, req) \
                    134:         WORD64ALIGN\
                    135:        if ((dpy->bufptr + SIZEOF(x/**/name/**/Req) + n) > dpy->bufmax)\
                    136:                _XFlush(dpy);\
                    137:        req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\
                    138:        req->reqType = X_/**/name;\
                    139:        req->length = (SIZEOF(x/**/name/**/Req) + n)>>2;\
                    140:        dpy->bufptr += SIZEOF(x/**/name/**/Req) + n;\
                    141:        dpy->request++
                    142: #endif
                    143: 
                    144: 
                    145: /*
                    146:  * GetResReq is for those requests that have a resource ID 
                    147:  * (Window, Pixmap, GContext, etc.) as their single argument.
                    148:  * "rid" is the name of the resource. 
                    149:  */
                    150: 
                    151: #if defined(__STDC__) && !defined(UNIXCPP)
                    152: #define GetResReq(name, rid, req) \
                    153:         WORD64ALIGN\
                    154:        if ((dpy->bufptr + SIZEOF(xResourceReq)) > dpy->bufmax)\
                    155:            _XFlush(dpy);\
                    156:        req = (xResourceReq *) (dpy->last_req = dpy->bufptr);\
                    157:        req->reqType = X_##name;\
                    158:        req->length = 2;\
                    159:        req->id = (rid);\
                    160:        dpy->bufptr += SIZEOF(xResourceReq);\
                    161:        dpy->request++
                    162: #else
                    163: #define GetResReq(name, rid, req) \
                    164:         WORD64ALIGN\
                    165:        if ((dpy->bufptr + SIZEOF(xResourceReq)) > dpy->bufmax)\
                    166:            _XFlush(dpy);\
                    167:        req = (xResourceReq *) (dpy->last_req = dpy->bufptr);\
                    168:        req->reqType = X_/**/name;\
                    169:        req->length = 2;\
                    170:        req->id = (rid);\
                    171:        dpy->bufptr += SIZEOF(xResourceReq);\
                    172:        dpy->request++
                    173: #endif
                    174: 
                    175: /*
                    176:  * GetEmptyReq is for those requests that have no arguments
                    177:  * at all. 
                    178:  */
                    179: #if defined(__STDC__) && !defined(UNIXCPP)
                    180: #define GetEmptyReq(name, req) \
                    181:         WORD64ALIGN\
                    182:        if ((dpy->bufptr + SIZEOF(xReq)) > dpy->bufmax)\
                    183:            _XFlush(dpy);\
                    184:        req = (xReq *) (dpy->last_req = dpy->bufptr);\
                    185:        req->reqType = X_##name;\
                    186:        req->length = 1;\
                    187:        dpy->bufptr += SIZEOF(xReq);\
                    188:        dpy->request++
                    189: #else
                    190: #define GetEmptyReq(name, req) \
                    191:         WORD64ALIGN\
                    192:        if ((dpy->bufptr + SIZEOF(xReq)) > dpy->bufmax)\
                    193:            _XFlush(dpy);\
                    194:        req = (xReq *) (dpy->last_req = dpy->bufptr);\
                    195:        req->reqType = X_/**/name;\
                    196:        req->length = 1;\
                    197:        dpy->bufptr += SIZEOF(xReq);\
                    198:        dpy->request++
                    199: #endif
                    200: 
                    201: 
                    202: #define SyncHandle() \
                    203:        if (dpy->synchandler) (*dpy->synchandler)(dpy)
                    204: 
                    205: #define FlushGC(dpy, gc) \
                    206:        if ((gc)->dirty) _XFlushGCCache((dpy), (gc))
                    207: /*
                    208:  * Data - Place data in the buffer and pad the end to provide
                    209:  * 32 bit word alignment.  Transmit if the buffer fills.
                    210:  *
                    211:  * "dpy" is a pointer to a Display.
                    212:  * "data" is a pinter to a data buffer.
                    213:  * "len" is the length of the data buffer.
                    214:  * we can presume buffer less than 2^16 bytes, so bcopy can be used safely.
                    215:  */
                    216: #ifdef DataRoutineIsProcedure
                    217: extern void Data();
                    218: #else
                    219: #define Data(dpy, data, len) \
                    220:        if (dpy->bufptr + (len) <= dpy->bufmax) {\
                    221:                bcopy(data, dpy->bufptr, (int)len);\
                    222:                dpy->bufptr += ((len) + 3) & ~3;\
                    223:        } else\
                    224:                _XSend(dpy, data, len)
                    225: #endif /* DataRoutineIsProcedure */
                    226: 
                    227: 
                    228: /* Allocate bytes from the buffer.  No padding is done, so if
                    229:  * the length is not a multiple of 4, the caller must be
                    230:  * careful to leave the buffer aligned after sending the
                    231:  * current request.
                    232:  *
                    233:  * "type" is the type of the pointer being assigned to.
                    234:  * "ptr" is the pointer being assigned to.
                    235:  * "n" is the number of bytes to allocate.
                    236:  *
                    237:  * Example: 
                    238:  *    xTextElt *elt;
                    239:  *    BufAlloc (xTextElt *, elt, nbytes)
                    240:  */
                    241: 
                    242: #define BufAlloc(type, ptr, n) \
                    243:     if (dpy->bufptr + (n) > dpy->bufmax) \
                    244:         _XFlush (dpy); \
                    245:     ptr = (type) dpy->bufptr; \
                    246:     dpy->bufptr += (n);
                    247: 
                    248: /*
                    249:  * provide emulation routines for smaller architectures
                    250:  */
                    251: #ifndef WORD64
                    252: #define Data16(dpy, data, len) Data((dpy), (char *)(data), (len))
                    253: #define Data32(dpy, data, len) Data((dpy), (char *)(data), (len))
                    254: #define _XRead16Pad(dpy, data, len) _XReadPad((dpy), (char *)(data), (len))
                    255: #define _XRead16(dpy, data, len) _XRead((dpy), (char *)(data), (len))
                    256: #define _XRead32(dpy, data, len) _XRead((dpy), (char *)(data), (len))
                    257: #endif /* not WORD64 */
                    258: 
                    259: #define PackData16(dpy,data,len) Data16 (dpy, data, len)
                    260: #define PackData32(dpy,data,len) Data32 (dpy, data, len)
                    261: 
                    262: /* Xlib manual is bogus */
                    263: #define PackData(dpy,data,len) PackData16 (dpy, data, len)
                    264: 
                    265: #define min(a,b) (((a) < (b)) ? (a) : (b))
                    266: #define max(a,b) (((a) > (b)) ? (a) : (b))
                    267: 
                    268: #define        CI_NONEXISTCHAR 0x4000  /* required because QueryFont represents
                    269:                                   a non-existant character with zero-value
                    270:                                   metrics, but requires drivers to output
                    271:                                   the default char in their place. */
                    272: 
                    273: 
                    274: #ifdef MUSTCOPY
                    275: 
                    276: /* a little bit of magic */
                    277: #define OneDataCard32(dpy,dstaddr,srcvar) \
                    278:   { dpy->bufptr -= 4; Data32 (dpy, (char *) &(srcvar), 4); }
                    279: 
                    280: #define STARTITERATE(tpvar,type,start,endcond,decr) \
                    281:   { register char *cpvar; \
                    282:   for (cpvar = (char *) start; endcond; cpvar = NEXTPTR(cpvar,type), decr) { \
                    283:     type dummy; bcopy (cpvar, (char *) &dummy, SIZEOF(type)); \
                    284:     tpvar = (type *) cpvar;
                    285: #define ENDITERATE }}
                    286: 
                    287: #else
                    288: 
                    289: /* srcvar must be a variable for large architecture version */
                    290: #define OneDataCard32(dpy,dstaddr,srcvar) \
                    291:   { *(unsigned long *)(dstaddr) = (srcvar); }
                    292: 
                    293: #define STARTITERATE(tpvar,type,start,endcond,decr) \
                    294:   for (tpvar = (type *) start; endcond; tpvar++, decr) {
                    295: #define ENDITERATE }
                    296: 
                    297: #endif /* MUSTCOPY - used machines whose C structs don't line up with proto */
                    298: 
                    299: #ifdef ISOCONN
                    300: extern int fd2family[MAXSOCKS];
                    301: 
                    302: extern int (*readfn[])(); 
                    303: extern int (*writefn[])(); 
                    304: extern int (*readvfn[])();
                    305: extern int (*writevfn[])();
                    306: extern int (*ioctlfn[])();
                    307: extern int (*closefn[])();
                    308: #endif /* ISOCONN */

unix.superglobalmegacorp.com

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