/* $XConsortium: Xlibint.h,v 11.61 88/09/06 16:09:16 jim Exp $ */ /* Copyright 1984, 1985, 1987 Massachusetts Institute of Technology */ /* * XlibInternal.h - Header definition and support file for the internal * support routines (XlibInternal) used by the C subroutine interface * library (Xlib) to the X Window System. * * Warning, there be dragons here.... */ #ifndef NEED_EVENTS #define _XEVENT_ #endif #ifdef CRAY #ifndef __TYPES__ #define __TYPES__ #include /* forgot to protect it... */ #endif #else #include #endif /* * define the following if you want the Data macro to be a procedure instead */ #if defined(CRAY) #define DataRoutineIsProcedure #endif #include #include #include #ifndef NULL #define NULL 0 #endif #define LOCKED 1 #define UNLOCKED 0 extern int errno; /* Internal system error number. */ /* extern void bcopy(); */ extern (*_XIOErrorFunction)(); /* X system error reporting routine. */ extern (*_XErrorFunction)(); /* X_Error event reporting routine. */ extern char *_XAllocScratch(); /* fast memory allocator */ extern Visual *_XVIDtoVisual(); /* given visual id, find structure */ #ifndef BUFSIZE #define BUFSIZE 2048 /* X output buffer size. */ #endif #ifndef EPERBATCH #define EPERBATCH 8 /* when batching, how many elements */ #endif #ifndef CURSORFONT #define CURSORFONT "cursor" /* standard cursor fonts */ #endif /* * X Protocol packetizing macros. */ /* Need to start requests on 64 bit word boundries * on a CRAY computer so add a NoOp (127) if needed. * A character pointer on a CRAY computer will be non-zero * after shifting right 61 bits of it is not pointing to * a word boundary. */ #ifdef WORD64 #define WORD64ALIGN if ((long)dpy->bufptr >> 61) {\ dpy->last_req = dpy->bufptr;\ *(dpy->bufptr) = X_NoOperation;\ *(dpy->bufptr+1) = 0;\ *(dpy->bufptr+2) = 0;\ *(dpy->bufptr+3) = 1;\ dpy->request += 1;\ dpy->bufptr += 4;\ } #else /* else does not require alignment on 64-bit boundaries */ #define WORD64ALIGN #endif /* * GetReq - Get the next avilable X request packet in the buffer and * return it. * * "name" is the name of the request, e.g. CreatePixmap, OpenFont, etc. * "req" is the name of the request pointer. * */ #if defined(__STDC__) && !defined(UNIXCPP) #define GetReq(name, req) \ WORD64ALIGN\ if ((dpy->bufptr + SIZEOF(x##name##Req)) > dpy->bufmax)\ _XFlush(dpy);\ req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\ req->reqType = X_##name;\ req->length = (SIZEOF(x##name##Req))>>2;\ dpy->bufptr += SIZEOF(x##name##Req);\ dpy->request++ #else /* non-ANSI C uses empty comment instead of "##" for token concatenation */ #define GetReq(name, req) \ WORD64ALIGN\ if ((dpy->bufptr + SIZEOF(x/**/name/**/Req)) > dpy->bufmax)\ _XFlush(dpy);\ req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\ req->reqType = X_/**/name;\ req->length = (SIZEOF(x/**/name/**/Req))>>2;\ dpy->bufptr += SIZEOF(x/**/name/**/Req);\ dpy->request++ #endif /* GetReqExtra is the same as GetReq, but allocates "n" additional bytes after the request. "n" must be a multiple of 4! */ #if defined(__STDC__) && !defined(UNIXCPP) #define GetReqExtra(name, n, req) \ WORD64ALIGN\ if ((dpy->bufptr + SIZEOF(*req) + n) > dpy->bufmax)\ _XFlush(dpy);\ req = (x##name##Req *)(dpy->last_req = dpy->bufptr);\ req->reqType = X_##name;\ req->length = (SIZEOF(*req) + n)>>2;\ dpy->bufptr += SIZEOF(*req) + n;\ dpy->request++ #else #define GetReqExtra(name, n, req) \ WORD64ALIGN\ if ((dpy->bufptr + SIZEOF(x/**/name/**/Req) + n) > dpy->bufmax)\ _XFlush(dpy);\ req = (x/**/name/**/Req *)(dpy->last_req = dpy->bufptr);\ req->reqType = X_/**/name;\ req->length = (SIZEOF(x/**/name/**/Req) + n)>>2;\ dpy->bufptr += SIZEOF(x/**/name/**/Req) + n;\ dpy->request++ #endif /* * GetResReq is for those requests that have a resource ID * (Window, Pixmap, GContext, etc.) as their single argument. * "rid" is the name of the resource. */ #if defined(__STDC__) && !defined(UNIXCPP) #define GetResReq(name, rid, req) \ WORD64ALIGN\ if ((dpy->bufptr + SIZEOF(xResourceReq)) > dpy->bufmax)\ _XFlush(dpy);\ req = (xResourceReq *) (dpy->last_req = dpy->bufptr);\ req->reqType = X_##name;\ req->length = 2;\ req->id = (rid);\ dpy->bufptr += SIZEOF(xResourceReq);\ dpy->request++ #else #define GetResReq(name, rid, req) \ WORD64ALIGN\ if ((dpy->bufptr + SIZEOF(xResourceReq)) > dpy->bufmax)\ _XFlush(dpy);\ req = (xResourceReq *) (dpy->last_req = dpy->bufptr);\ req->reqType = X_/**/name;\ req->length = 2;\ req->id = (rid);\ dpy->bufptr += SIZEOF(xResourceReq);\ dpy->request++ #endif /* * GetEmptyReq is for those requests that have no arguments * at all. */ #if defined(__STDC__) && !defined(UNIXCPP) #define GetEmptyReq(name, req) \ WORD64ALIGN\ if ((dpy->bufptr + SIZEOF(xReq)) > dpy->bufmax)\ _XFlush(dpy);\ req = (xReq *) (dpy->last_req = dpy->bufptr);\ req->reqType = X_##name;\ req->length = 1;\ dpy->bufptr += SIZEOF(xReq);\ dpy->request++ #else #define GetEmptyReq(name, req) \ WORD64ALIGN\ if ((dpy->bufptr + SIZEOF(xReq)) > dpy->bufmax)\ _XFlush(dpy);\ req = (xReq *) (dpy->last_req = dpy->bufptr);\ req->reqType = X_/**/name;\ req->length = 1;\ dpy->bufptr += SIZEOF(xReq);\ dpy->request++ #endif #define SyncHandle() \ if (dpy->synchandler) (*dpy->synchandler)(dpy) #define FlushGC(dpy, gc) \ if ((gc)->dirty) _XFlushGCCache((dpy), (gc)) /* * Data - Place data in the buffer and pad the end to provide * 32 bit word alignment. Transmit if the buffer fills. * * "dpy" is a pointer to a Display. * "data" is a pinter to a data buffer. * "len" is the length of the data buffer. */ #ifdef DataRoutineIsProcedure extern void Data(); #else #define Data(dpy, data, len) \ if (dpy->bufptr + (len) <= dpy->bufmax) {\ memcpy(dpy->bufptr, data, (size_t)len);\ dpy->bufptr += ((len) + 3) & ~3;\ } else\ _XSend(dpy, data, len) #endif /* Allocate bytes from the buffer. No padding is done, so if * the length is not a multiple of 4, the caller must be * careful to leave the buffer aligned after sending the * current request. * * "type" is the type of the pointer being assigned to. * "ptr" is the pointer being assigned to. * "n" is the number of bytes to allocate. * * Example: * xTextElt *elt; * BufAlloc (xTextElt *, elt, nbytes) */ #define BufAlloc(type, ptr, n) \ if (dpy->bufptr + (n) > dpy->bufmax) \ _XFlush (dpy); \ ptr = (type) dpy->bufptr; \ dpy->bufptr += (n); /* * provide emulation routines for smaller architectures */ #ifndef WORD64 #define Data16(dpy, data, len) Data((dpy), (char *)(data), (len)) #define Data32(dpy, data, len) Data((dpy), (char *)(data), (len)) #define _XRead16Pad(dpy, data, len) _XReadPad((dpy), (char *)(data), (len)) #define _XRead16(dpy, data, len) _XRead((dpy), (char *)(data), (len)) #define _XRead32(dpy, data, len) _XRead((dpy), (char *)(data), (len)) #endif #define PackData16(dpy,data,len) Data16 (dpy, data, len) #define PackData32(dpy,data,len) Data32 (dpy, data, len) /* Xlib manual is bogus */ #define PackData(dpy,data,len) PackData16 (dpy, data, len) #define min(a,b) (((a) < (b)) ? (a) : (b)) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define CI_NONEXISTCHAR 0x4000 /* required because QueryFont represents a non-existant character with zero-value metrics, but requires drivers to output the default char in their place. */ #ifdef MUSTCOPY /* a little bit of magic */ #define OneDataCard32(dpy,dstaddr,srcvar) \ { dpy->bufptr -= 4; Data32 (dpy, (char *) &(srcvar), 4); } #define STARTITERATE(tpvar,type,start,endcond,decr) \ { register char *cpvar; \ for (cpvar = (char *) start; endcond; cpvar = NEXTPTR(cpvar,type), decr) { \ type dummy; memcpy ((char *) &dummy, cpvar, (size_t)SIZEOF(type)); \ tpvar = (type *) cpvar; #define ENDITERATE }} #else /* srcvar must be a variable for large architecture version */ #define OneDataCard32(dpy,dstaddr,srcvar) \ { *(unsigned long *)(dstaddr) = (srcvar); } #define STARTITERATE(tpvar,type,start,endcond,decr) \ for (tpvar = (type *) start; endcond; tpvar++, decr) { #define ENDITERATE } #endif