1 2 /* 3 4 Copyright 1984, 1985, 1987, 1989, 1998 The Open Group 5 6 Permission to use, copy, modify, distribute, and sell this software and its 7 documentation for any purpose is hereby granted without fee, provided that 8 the above copyright notice appear in all copies and that both that 9 copyright notice and this permission notice appear in supporting 10 documentation. 11 12 The above copyright notice and this permission notice shall be included 13 in all copies or substantial portions of the Software. 14 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 16 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18 IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 OTHER DEALINGS IN THE SOFTWARE. 22 23 Except as contained in this notice, the name of The Open Group shall 24 not be used in advertising or otherwise to promote the sale, use or 25 other dealings in this Software without prior written authorization 26 from The Open Group. 27 28 */ 29 30 #ifndef _X11_XLIBINT_H_ 31 #define _X11_XLIBINT_H_ 1 32 33 /* 34 * Xlibint.h - Header definition and support file for the internal 35 * support routines used by the C subroutine interface 36 * library (Xlib) to the X Window System. 37 * 38 * Warning, there be dragons here.... 39 */ 40 41 #include <X11/Xlib.h> 42 #include <X11/Xproto.h> /* to declare xEvent */ 43 #include <X11/XlibConf.h> /* for configured options like XTHREADS */ 44 45 #ifdef WIN32 46 #define _XFlush _XFlushIt 47 #endif 48 49 /* 50 * If your BytesReadable correctly detects broken connections, then 51 * you should NOT define XCONN_CHECK_FREQ. 52 */ 53 #ifndef XCONN_CHECK_FREQ 54 #define XCONN_CHECK_FREQ 256 55 #endif 56 57 struct _XGC 58 { 59 XExtData *ext_data; /* hook for extension to hang data */ 60 GContext gid; /* protocol ID for graphics context */ 61 Bool rects; /* boolean: TRUE if clipmask is list of rectangles */ 62 Bool dashes; /* boolean: TRUE if dash-list is really a list */ 63 unsigned long dirty;/* cache dirty bits */ 64 XGCValues values; /* shadow structure of values */ 65 }; 66 67 struct _XDisplay 68 { 69 XExtData *ext_data; /* hook for extension to hang data */ 70 struct _XFreeFuncs *free_funcs; /* internal free functions */ 71 int fd; /* Network socket. */ 72 int conn_checker; /* ugly thing used by _XEventsQueued */ 73 int proto_major_version;/* maj. version of server's X protocol */ 74 int proto_minor_version;/* minor version of server's X protocol */ 75 char *vendor; /* vendor of the server hardware */ 76 XID resource_base; /* resource ID base */ 77 XID resource_mask; /* resource ID mask bits */ 78 XID resource_id; /* allocator current ID */ 79 int resource_shift; /* allocator shift to correct bits */ 80 XID (*resource_alloc)( /* allocator function */ 81 struct _XDisplay* 82 ); 83 int byte_order; /* screen byte order, LSBFirst, MSBFirst */ 84 int bitmap_unit; /* padding and data requirements */ 85 int bitmap_pad; /* padding requirements on bitmaps */ 86 int bitmap_bit_order; /* LeastSignificant or MostSignificant */ 87 int nformats; /* number of pixmap formats in list */ 88 ScreenFormat *pixmap_format; /* pixmap format list */ 89 int vnumber; /* Xlib's X protocol version number. */ 90 int release; /* release of the server */ 91 struct _XSQEvent *head, *tail; /* Input event queue. */ 92 int qlen; /* Length of input event queue */ 93 unsigned long last_request_read; /* seq number of last event read */ 94 unsigned long request; /* sequence number of last request. */ 95 char *last_req; /* beginning of last request, or dummy */ 96 char *buffer; /* Output buffer starting address. */ 97 char *bufptr; /* Output buffer index pointer. */ 98 char *bufmax; /* Output buffer maximum+1 address. */ 99 unsigned max_request_size; /* maximum number 32 bit words in request*/ 100 struct _XrmHashBucketRec *db; 101 int (*synchandler)( /* Synchronization handler */ 102 struct _XDisplay* 103 ); 104 char *display_name; /* "host:display" string used on this connect*/ 105 int default_screen; /* default screen for operations */ 106 int nscreens; /* number of screens on this server*/ 107 Screen *screens; /* pointer to list of screens */ 108 unsigned long motion_buffer; /* size of motion buffer */ 109 volatile unsigned long flags; /* internal connection flags */ 110 int min_keycode; /* minimum defined keycode */ 111 int max_keycode; /* maximum defined keycode */ 112 KeySym *keysyms; /* This server's keysyms */ 113 XModifierKeymap *modifiermap; /* This server's modifier keymap */ 114 int keysyms_per_keycode;/* number of rows */ 115 char *xdefaults; /* contents of defaults from server */ 116 char *scratch_buffer; /* place to hang scratch buffer */ 117 unsigned long scratch_length; /* length of scratch buffer */ 118 int ext_number; /* extension number on this display */ 119 struct _XExten *ext_procs; /* extensions initialized on this display */ 120 /* 121 * the following can be fixed size, as the protocol defines how 122 * much address space is available. 123 * While this could be done using the extension vector, there 124 * may be MANY events processed, so a search through the extension 125 * list to find the right procedure for each event might be 126 * expensive if many extensions are being used. 127 */ 128 Bool (*event_vec[128])( /* vector for wire to event */ 129 Display * /* dpy */, 130 XEvent * /* re */, 131 xEvent * /* event */ 132 ); 133 Status (*wire_vec[128])( /* vector for event to wire */ 134 Display * /* dpy */, 135 XEvent * /* re */, 136 xEvent * /* event */ 137 ); 138 KeySym lock_meaning; /* for XLookupString */ 139 struct _XLockInfo *lock; /* multi-thread state, display lock */ 140 struct _XInternalAsync *async_handlers; /* for internal async */ 141 unsigned long bigreq_size; /* max size of big requests */ 142 struct _XLockPtrs *lock_fns; /* pointers to threads functions */ 143 void (*idlist_alloc)( /* XID list allocator function */ 144 Display * /* dpy */, 145 XID * /* ids */, 146 int /* count */ 147 ); 148 /* things above this line should not move, for binary compatibility */ 149 struct _XKeytrans *key_bindings; /* for XLookupString */ 150 Font cursor_font; /* for XCreateFontCursor */ 151 struct _XDisplayAtoms *atoms; /* for XInternAtom */ 152 unsigned int mode_switch; /* keyboard group modifiers */ 153 unsigned int num_lock; /* keyboard numlock modifiers */ 154 struct _XContextDB *context_db; /* context database */ 155 Bool (**error_vec)( /* vector for wire to error */ 156 Display * /* display */, 157 XErrorEvent * /* he */, 158 xError * /* we */ 159 ); 160 /* 161 * Xcms information 162 */ 163 struct { 164 XPointer defaultCCCs; /* pointer to an array of default XcmsCCC */ 165 XPointer clientCmaps; /* pointer to linked list of XcmsCmapRec */ 166 XPointer perVisualIntensityMaps; 167 /* linked list of XcmsIntensityMap */ 168 } cms; 169 struct _XIMFilter *im_filters; 170 struct _XSQEvent *qfree; /* unallocated event queue elements */ 171 unsigned long next_event_serial_num; /* inserted into next queue elt */ 172 struct _XExten *flushes; /* Flush hooks */ 173 struct _XConnectionInfo *im_fd_info; /* _XRegisterInternalConnection */ 174 int im_fd_length; /* number of im_fd_info */ 175 struct _XConnWatchInfo *conn_watchers; /* XAddConnectionWatch */ 176 int watcher_count; /* number of conn_watchers */ 177 XPointer filedes; /* struct pollfd cache for _XWaitForReadable */ 178 int (*savedsynchandler)( /* user synchandler when Xlib usurps */ 179 Display * /* dpy */ 180 ); 181 XID resource_max; /* allocator max ID */ 182 int xcmisc_opcode; /* major opcode for XC-MISC */ 183 struct _XkbInfoRec *xkb_info; /* XKB info */ 184 struct _XtransConnInfo *trans_conn; /* transport connection object */ 185 struct _X11XCBPrivate *xcb; /* XCB glue private data */ 186 187 /* Generic event cookie handling */ 188 unsigned int next_cookie; /* next event cookie */ 189 /* vector for wire to generic event, index is (extension - 128) */ 190 Bool (*generic_event_vec[128])( 191 Display * /* dpy */, 192 XGenericEventCookie * /* Xlib event */, 193 xEvent * /* wire event */); 194 /* vector for event copy, index is (extension - 128) */ 195 Bool (*generic_event_copy_vec[128])( 196 Display * /* dpy */, 197 XGenericEventCookie * /* in */, 198 XGenericEventCookie * /* out*/); 199 void *cookiejar; /* cookie events returned but not claimed */ 200 }; 201 202 #define XAllocIDs(dpy,ids,n) (*(dpy)->idlist_alloc)(dpy,ids,n) 203 204 /* 205 * define the following if you want the Data macro to be a procedure instead 206 */ 207 #ifdef CRAY 208 #define DataRoutineIsProcedure 209 #endif /* CRAY */ 210 211 #ifndef _XEVENT_ 212 /* 213 * _QEvent datatype for use in input queueing. 214 */ 215 typedef struct _XSQEvent 216 { 217 struct _XSQEvent *next; 218 XEvent event; 219 unsigned long qserial_num; /* so multi-threaded code can find new ones */ 220 } _XQEvent; 221 #endif 222 223 #include <X11/Xproto.h> 224 #ifdef __sgi 225 #define _SGI_MP_SOURCE /* turn this on to get MP safe errno */ 226 #endif 227 #include <errno.h> 228 #define _XBCOPYFUNC _Xbcopy 229 #include <X11/Xfuncs.h> 230 #include <X11/Xosdefs.h> 231 232 /* Utek leaves kernel macros around in include files (bleah) */ 233 #ifdef dirty 234 #undef dirty 235 #endif 236 237 #include <stdlib.h> 238 #include <string.h> 239 240 #include <X11/Xfuncproto.h> 241 242 _XFUNCPROTOBEGIN 243 244 /* 245 * The following definitions can be used for locking requests in multi-threaded 246 * address spaces. 247 */ 248 #ifdef XTHREADS 249 /* Author: Stephen Gildea, MIT X Consortium 250 * 251 * declarations for C Threads locking 252 */ 253 254 typedef struct _LockInfoRec *LockInfoPtr; 255 256 /* interfaces for locking.c */ 257 struct _XLockPtrs { 258 /* used by all, including extensions; do not move */ 259 void (*lock_display)( 260 Display *dpy 261 #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) 262 , char *file 263 , int line 264 #endif 265 ); 266 void (*unlock_display)( 267 Display *dpy 268 #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) 269 , char *file 270 , int line 271 #endif 272 ); 273 }; 274 275 #if defined(WIN32) && !defined(_XLIBINT_) 276 #define _XCreateMutex_fn (*_XCreateMutex_fn_p) 277 #define _XFreeMutex_fn (*_XFreeMutex_fn_p) 278 #define _XLockMutex_fn (*_XLockMutex_fn_p) 279 #define _XUnlockMutex_fn (*_XUnlockMutex_fn_p) 280 #define _Xglobal_lock (*_Xglobal_lock_p) 281 #endif 282 283 /* in XlibInt.c */ 284 extern void (*_XCreateMutex_fn)( 285 LockInfoPtr /* lock */ 286 ); 287 extern void (*_XFreeMutex_fn)( 288 LockInfoPtr /* lock */ 289 ); 290 extern void (*_XLockMutex_fn)( 291 LockInfoPtr /* lock */ 292 #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) 293 , char * /* file */ 294 , int /* line */ 295 #endif 296 ); 297 extern void (*_XUnlockMutex_fn)( 298 LockInfoPtr /* lock */ 299 #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) 300 , char * /* file */ 301 , int /* line */ 302 #endif 303 ); 304 305 extern LockInfoPtr _Xglobal_lock; 306 307 #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) 308 #define LockDisplay(d) if ((d)->lock_fns) (*(d)->lock_fns->lock_display)((d),__FILE__,__LINE__) 309 #define UnlockDisplay(d) if ((d)->lock_fns) (*(d)->lock_fns->unlock_display)((d),__FILE__,__LINE__) 310 #define _XLockMutex(lock) if (_XLockMutex_fn) (*_XLockMutex_fn)(lock,__FILE__,__LINE__) 311 #define _XUnlockMutex(lock) if (_XUnlockMutex_fn) (*_XUnlockMutex_fn)(lock,__FILE__,__LINE__) 312 #else 313 /* used everywhere, so must be fast if not using threads */ 314 #define LockDisplay(d) if ((d)->lock_fns) (*(d)->lock_fns->lock_display)(d) 315 #define UnlockDisplay(d) if ((d)->lock_fns) (*(d)->lock_fns->unlock_display)(d) 316 #define _XLockMutex(lock) if (_XLockMutex_fn) (*_XLockMutex_fn)(lock) 317 #define _XUnlockMutex(lock) if (_XUnlockMutex_fn) (*_XUnlockMutex_fn)(lock) 318 #endif 319 #define _XCreateMutex(lock) if (_XCreateMutex_fn) (*_XCreateMutex_fn)(lock); 320 #define _XFreeMutex(lock) if (_XFreeMutex_fn) (*_XFreeMutex_fn)(lock); 321 322 #else /* XTHREADS */ 323 #define LockDisplay(dis) 324 #define _XLockMutex(lock) 325 #define _XUnlockMutex(lock) 326 #define UnlockDisplay(dis) 327 #define _XCreateMutex(lock) 328 #define _XFreeMutex(lock) 329 #endif 330 331 #define Xfree(ptr) free((ptr)) 332 333 /* 334 * Note that some machines do not return a valid pointer for malloc(0), in 335 * which case we provide an alternate under the control of the 336 * define MALLOC_0_RETURNS_NULL. This is necessary because some 337 * Xlib code expects malloc(0) to return a valid pointer to storage. 338 */ 339 #if defined(MALLOC_0_RETURNS_NULL) || defined(__clang_analyzer__) 340 341 # define Xmalloc(size) malloc(((size) == 0 ? 1 : (size))) 342 # define Xrealloc(ptr, size) realloc((ptr), ((size) == 0 ? 1 : (size))) 343 # define Xcalloc(nelem, elsize) calloc(((nelem) == 0 ? 1 : (nelem)), (elsize)) 344 345 #else 346 347 # define Xmalloc(size) malloc((size)) 348 # define Xrealloc(ptr, size) realloc((ptr), (size)) 349 # define Xcalloc(nelem, elsize) calloc((nelem), (elsize)) 350 351 #endif 352 353 #include <stddef.h> 354 355 #define LOCKED 1 356 #define UNLOCKED 0 357 358 #ifndef BUFSIZE 359 #define BUFSIZE 2048 /* X output buffer size. */ 360 #endif 361 #ifndef PTSPERBATCH 362 #define PTSPERBATCH 1024 /* point batching */ 363 #endif 364 #ifndef WLNSPERBATCH 365 #define WLNSPERBATCH 50 /* wide line batching */ 366 #endif 367 #ifndef ZLNSPERBATCH 368 #define ZLNSPERBATCH 1024 /* thin line batching */ 369 #endif 370 #ifndef WRCTSPERBATCH 371 #define WRCTSPERBATCH 10 /* wide line rectangle batching */ 372 #endif 373 #ifndef ZRCTSPERBATCH 374 #define ZRCTSPERBATCH 256 /* thin line rectangle batching */ 375 #endif 376 #ifndef FRCTSPERBATCH 377 #define FRCTSPERBATCH 256 /* filled rectangle batching */ 378 #endif 379 #ifndef FARCSPERBATCH 380 #define FARCSPERBATCH 256 /* filled arc batching */ 381 #endif 382 #ifndef CURSORFONT 383 #define CURSORFONT "cursor" /* standard cursor fonts */ 384 #endif 385 386 /* 387 * Display flags 388 */ 389 #define XlibDisplayIOError (1L << 0) 390 #define XlibDisplayClosing (1L << 1) 391 #define XlibDisplayNoXkb (1L << 2) 392 #define XlibDisplayPrivSync (1L << 3) 393 #define XlibDisplayProcConni (1L << 4) /* in _XProcessInternalConnection */ 394 #define XlibDisplayReadEvents (1L << 5) /* in _XReadEvents */ 395 #define XlibDisplayReply (1L << 5) /* in _XReply */ 396 #define XlibDisplayWriting (1L << 6) /* in _XFlushInt, _XSend */ 397 #define XlibDisplayDfltRMDB (1L << 7) /* mark if RM db from XGetDefault */ 398 399 /* 400 * X Protocol packetizing macros. 401 */ 402 403 /* Need to start requests on 64 bit word boundaries 404 * on a CRAY computer so add a NoOp (127) if needed. 405 * A character pointer on a CRAY computer will be non-zero 406 * after shifting right 61 bits of it is not pointing to 407 * a word boundary. 408 */ 409 #ifdef WORD64 410 #define WORD64ALIGN if ((long)dpy->bufptr >> 61) {\ 411 dpy->last_req = dpy->bufptr;\ 412 *(dpy->bufptr) = X_NoOperation;\ 413 *(dpy->bufptr+1) = 0;\ 414 *(dpy->bufptr+2) = 0;\ 415 *(dpy->bufptr+3) = 1;\ 416 dpy->request++;\ 417 dpy->bufptr += 4;\ 418 } 419 #else /* else does not require alignment on 64-bit boundaries */ 420 #define WORD64ALIGN 421 #endif /* WORD64 */ 422 423 /** 424 * Return a len-sized request buffer for the request type. This function may 425 * flush the output queue. 426 * 427 * @param dpy The display connection 428 * @param type The request type 429 * @param len Length of the request in bytes 430 * 431 * @returns A pointer to the request buffer with a few default values 432 * initialized. 433 */ 434 extern void *_XGetRequest(Display *dpy, CARD8 type, size_t len); 435 436 /* GetReqSized is the same as GetReq but allows the caller to specify the 437 * size in bytes. 'sz' must be a multiple of 4! */ 438 439 #if !defined(UNIXCPP) || defined(ANSICPP) 440 #define GetReqSized(name, sz, req) \ 441 req = (x##name##Req *) _XGetRequest(dpy, X_##name, sz) 442 #else 443 #define GetReqSized(name, sz, req) \ 444 req = (x/**/name/**/Req *) _XGetRequest(dpy, X_/**/name, sz) 445 #endif 446 447 448 /* 449 * GetReq - Get the next available X request packet in the buffer and 450 * return it. 451 * 452 * "name" is the name of the request, e.g. CreatePixmap, OpenFont, etc. 453 * "req" is the name of the request pointer. 454 * 455 */ 456 457 #if !defined(UNIXCPP) || defined(ANSICPP) 458 #define GetReq(name, req) \ 459 GetReqSized(name, SIZEOF(x##name##Req), req) 460 #else /* non-ANSI C uses empty comment instead of "##" for token concatenation */ 461 #define GetReq(name, req) \ 462 GetReqSized(name, SIZEOF(x/**/name/**/Req), req) 463 #endif 464 465 /* GetReqExtra is the same as GetReq, but allocates "n" additional 466 bytes after the request. "n" must be a multiple of 4! */ 467 468 #if !defined(UNIXCPP) || defined(ANSICPP) 469 #define GetReqExtra(name, n, req) \ 470 GetReqSized(name, SIZEOF(x##name##Req) + n, req) 471 #else 472 #define GetReqExtra(name, n, req) \ 473 GetReqSized(name, SIZEOF(x/**/name/**/Req) + n, req) 474 #endif 475 476 477 /* 478 * GetResReq is for those requests that have a resource ID 479 * (Window, Pixmap, GContext, etc.) as their single argument. 480 * "rid" is the name of the resource. 481 */ 482 483 #if !defined(UNIXCPP) || defined(ANSICPP) 484 #define GetResReq(name, rid, req) \ 485 req = (xResourceReq *) _XGetRequest(dpy, X_##name, SIZEOF(xResourceReq)); \ 486 req->id = (rid) 487 #else 488 #define GetResReq(name, rid, req) \ 489 req = (xResourceReq *) _XGetRequest(dpy, X_/**/name, SIZEOF(xResourceReq)); \ 490 req->id = (rid) 491 #endif 492 493 /* 494 * GetEmptyReq is for those requests that have no arguments 495 * at all. 496 */ 497 #if !defined(UNIXCPP) || defined(ANSICPP) 498 #define GetEmptyReq(name, req) \ 499 req = (xReq *) _XGetRequest(dpy, X_##name, SIZEOF(xReq)) 500 #else 501 #define GetEmptyReq(name, req) \ 502 req = (xReq *) _XGetRequest(dpy, X_/**/name, SIZEOF(xReq)) 503 #endif 504 505 #ifdef WORD64 506 #define MakeBigReq(req,n) \ 507 { \ 508 char _BRdat[4]; \ 509 unsigned long _BRlen = req->length - 1; \ 510 req->length = 0; \ 511 memcpy(_BRdat, ((char *)req) + (_BRlen << 2), 4); \ 512 memmove(((char *)req) + 8, ((char *)req) + 4, _BRlen << 2); \ 513 memcpy(((char *)req) + 4, _BRdat, 4); \ 514 Data32(dpy, (long *)&_BRdat, 4); \ 515 } 516 #else 517 #ifdef LONG64 518 #define MakeBigReq(req,n) \ 519 { \ 520 CARD64 _BRdat; \ 521 CARD32 _BRlen = req->length - 1; \ 522 req->length = 0; \ 523 _BRdat = ((CARD32 *)req)[_BRlen]; \ 524 memmove(((char *)req) + 8, ((char *)req) + 4, _BRlen << 2); \ 525 ((CARD32 *)req)[1] = _BRlen + n + 2; \ 526 Data32(dpy, &_BRdat, 4); \ 527 } 528 #else 529 #define MakeBigReq(req,n) \ 530 { \ 531 CARD32 _BRdat; \ 532 CARD32 _BRlen = req->length - 1; \ 533 req->length = 0; \ 534 _BRdat = ((CARD32 *)req)[_BRlen]; \ 535 memmove(((char *)req) + 8, ((char *)req) + 4, _BRlen << 2); \ 536 ((CARD32 *)req)[1] = _BRlen + n + 2; \ 537 Data32(dpy, &_BRdat, 4); \ 538 } 539 #endif 540 #endif 541 542 #ifndef __clang_analyzer__ 543 #define SetReqLen(req,n,badlen) \ 544 if ((req->length + n) > (unsigned)65535) { \ 545 if (dpy->bigreq_size) { \ 546 MakeBigReq(req,n) \ 547 } else { \ 548 n = badlen; \ 549 req->length += n; \ 550 } \ 551 } else \ 552 req->length += n 553 #else 554 #define SetReqLen(req,n,badlen) \ 555 req->length += n 556 #endif 557 558 #define SyncHandle() \ 559 if (dpy->synchandler) (*dpy->synchandler)(dpy) 560 561 extern void _XFlushGCCache(Display *dpy, GC gc); 562 #define FlushGC(dpy, gc) \ 563 if ((gc)->dirty) _XFlushGCCache((dpy), (gc)) 564 /* 565 * Data - Place data in the buffer and pad the end to provide 566 * 32 bit word alignment. Transmit if the buffer fills. 567 * 568 * "dpy" is a pointer to a Display. 569 * "data" is a pinter to a data buffer. 570 * "len" is the length of the data buffer. 571 */ 572 #ifndef DataRoutineIsProcedure 573 #define Data(dpy, data, len) {\ 574 if (dpy->bufptr + (len) <= dpy->bufmax) {\ 575 memcpy(dpy->bufptr, data, (int)len);\ 576 dpy->bufptr += ((len) + 3) & ~3;\ 577 } else\ 578 _XSend(dpy, data, len);\ 579 } 580 #endif /* DataRoutineIsProcedure */ 581 582 583 /* Allocate bytes from the buffer. No padding is done, so if 584 * the length is not a multiple of 4, the caller must be 585 * careful to leave the buffer aligned after sending the 586 * current request. 587 * 588 * "type" is the type of the pointer being assigned to. 589 * "ptr" is the pointer being assigned to. 590 * "n" is the number of bytes to allocate. 591 * 592 * Example: 593 * xTextElt *elt; 594 * BufAlloc (xTextElt *, elt, nbytes) 595 */ 596 597 #define BufAlloc(type, ptr, n) \ 598 if (dpy->bufptr + (n) > dpy->bufmax) \ 599 _XFlush (dpy); \ 600 ptr = (type) dpy->bufptr; \ 601 memset(ptr, '\0', n); \ 602 dpy->bufptr += (n); 603 604 #ifdef WORD64 605 #define Data16(dpy, data, len) _XData16(dpy, (short *)data, len) 606 #define Data32(dpy, data, len) _XData32(dpy, (long *)data, len) 607 #else 608 #define Data16(dpy, data, len) Data((dpy), (char *)(data), (len)) 609 #define _XRead16Pad(dpy, data, len) _XReadPad((dpy), (char *)(data), (len)) 610 #define _XRead16(dpy, data, len) _XRead((dpy), (char *)(data), (len)) 611 #ifdef LONG64 612 #define Data32(dpy, data, len) _XData32(dpy, (long *)data, len) 613 extern int _XData32( 614 Display *dpy, 615 register long *data, 616 unsigned len 617 ); 618 extern void _XRead32( 619 Display *dpy, 620 register long *data, 621 long len 622 ); 623 #else 624 #define Data32(dpy, data, len) Data((dpy), (char *)(data), (len)) 625 #define _XRead32(dpy, data, len) _XRead((dpy), (char *)(data), (len)) 626 #endif 627 #endif /* not WORD64 */ 628 629 #define PackData16(dpy,data,len) Data16 (dpy, data, len) 630 #define PackData32(dpy,data,len) Data32 (dpy, data, len) 631 632 /* Xlib manual is bogus */ 633 #define PackData(dpy,data,len) PackData16 (dpy, data, len) 634 635 #define min(a,b) (((a) < (b)) ? (a) : (b)) 636 #define max(a,b) (((a) > (b)) ? (a) : (b)) 637 638 #define CI_NONEXISTCHAR(cs) (((cs)->width == 0) && \ 639 (((cs)->rbearing|(cs)->lbearing| \ 640 (cs)->ascent|(cs)->descent) == 0)) 641 642 /* 643 * CI_GET_CHAR_INFO_1D - return the charinfo struct for the indicated 8bit 644 * character. If the character is in the column and exists, then return the 645 * appropriate metrics (note that fonts with common per-character metrics will 646 * return min_bounds). If none of these hold true, try again with the default 647 * char. 648 */ 649 #define CI_GET_CHAR_INFO_1D(fs,col,def,cs) \ 650 { \ 651 cs = def; \ 652 if (col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \ 653 if (fs->per_char == NULL) { \ 654 cs = &fs->min_bounds; \ 655 } else { \ 656 cs = &fs->per_char[(col - fs->min_char_or_byte2)]; \ 657 if (CI_NONEXISTCHAR(cs)) cs = def; \ 658 } \ 659 } \ 660 } 661 662 #define CI_GET_DEFAULT_INFO_1D(fs,cs) \ 663 CI_GET_CHAR_INFO_1D (fs, fs->default_char, NULL, cs) 664 665 666 667 /* 668 * CI_GET_CHAR_INFO_2D - return the charinfo struct for the indicated row and 669 * column. This is used for fonts that have more than row zero. 670 */ 671 #define CI_GET_CHAR_INFO_2D(fs,row,col,def,cs) \ 672 { \ 673 cs = def; \ 674 if (row >= fs->min_byte1 && row <= fs->max_byte1 && \ 675 col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \ 676 if (fs->per_char == NULL) { \ 677 cs = &fs->min_bounds; \ 678 } else { \ 679 cs = &fs->per_char[((row - fs->min_byte1) * \ 680 (fs->max_char_or_byte2 - \ 681 fs->min_char_or_byte2 + 1)) + \ 682 (col - fs->min_char_or_byte2)]; \ 683 if (CI_NONEXISTCHAR(cs)) cs = def; \ 684 } \ 685 } \ 686 } 687 688 #define CI_GET_DEFAULT_INFO_2D(fs,cs) \ 689 { \ 690 unsigned int r = (fs->default_char >> 8); \ 691 unsigned int c = (fs->default_char & 0xff); \ 692 CI_GET_CHAR_INFO_2D (fs, r, c, NULL, cs); \ 693 } 694 695 696 #ifdef MUSTCOPY 697 698 /* for when 32-bit alignment is not good enough */ 699 #define OneDataCard32(dpy,dstaddr,srcvar) \ 700 { dpy->bufptr -= 4; Data32 (dpy, (char *) &(srcvar), 4); } 701 702 #else 703 704 /* srcvar must be a variable for large architecture version */ 705 #define OneDataCard32(dpy,dstaddr,srcvar) \ 706 { *(CARD32 *)(dstaddr) = (srcvar); } 707 708 #endif /* MUSTCOPY */ 709 710 typedef struct _XInternalAsync { 711 struct _XInternalAsync *next; 712 /* 713 * handler arguments: 714 * rep is the generic reply that caused this handler 715 * to be invoked. It must also be passed to _XGetAsyncReply. 716 * buf and len are opaque values that must be passed to 717 * _XGetAsyncReply or _XGetAsyncData. 718 * data is the closure stored in this struct. 719 * The handler returns True iff it handled this reply. 720 */ 721 Bool (*handler)( 722 Display* /* dpy */, 723 xReply* /* rep */, 724 char* /* buf */, 725 int /* len */, 726 XPointer /* data */ 727 ); 728 XPointer data; 729 } _XAsyncHandler; 730 731 typedef struct _XAsyncEState { 732 unsigned long min_sequence_number; 733 unsigned long max_sequence_number; 734 unsigned char error_code; 735 unsigned char major_opcode; 736 unsigned short minor_opcode; 737 unsigned char last_error_received; 738 int error_count; 739 } _XAsyncErrorState; 740 741 extern void _XDeqAsyncHandler(Display *dpy, _XAsyncHandler *handler); 742 #define DeqAsyncHandler(dpy,handler) { \ 743 if (dpy->async_handlers == (handler)) \ 744 dpy->async_handlers = (handler)->next; \ 745 else \ 746 _XDeqAsyncHandler(dpy, handler); \ 747 } 748 749 typedef void (*FreeFuncType) ( 750 Display* /* display */ 751 ); 752 753 typedef int (*FreeModmapType) ( 754 XModifierKeymap* /* modmap */ 755 ); 756 757 /* 758 * This structure is private to the library. 759 */ 760 typedef struct _XFreeFuncs { 761 FreeFuncType atoms; /* _XFreeAtomTable */ 762 FreeModmapType modifiermap; /* XFreeModifiermap */ 763 FreeFuncType key_bindings; /* _XFreeKeyBindings */ 764 FreeFuncType context_db; /* _XFreeContextDB */ 765 FreeFuncType defaultCCCs; /* _XcmsFreeDefaultCCCs */ 766 FreeFuncType clientCmaps; /* _XcmsFreeClientCmaps */ 767 FreeFuncType intensityMaps; /* _XcmsFreeIntensityMaps */ 768 FreeFuncType im_filters; /* _XFreeIMFilters */ 769 FreeFuncType xkb; /* _XkbFreeInfo */ 770 } _XFreeFuncRec; 771 772 /* types for InitExt.c */ 773 typedef int (*CreateGCType) ( 774 Display* /* display */, 775 GC /* gc */, 776 XExtCodes* /* codes */ 777 ); 778 779 typedef int (*CopyGCType)( 780 Display* /* display */, 781 GC /* gc */, 782 XExtCodes* /* codes */ 783 ); 784 785 typedef int (*FlushGCType) ( 786 Display* /* display */, 787 GC /* gc */, 788 XExtCodes* /* codes */ 789 ); 790 791 typedef int (*FreeGCType) ( 792 Display* /* display */, 793 GC /* gc */, 794 XExtCodes* /* codes */ 795 ); 796 797 typedef int (*CreateFontType) ( 798 Display* /* display */, 799 XFontStruct* /* fs */, 800 XExtCodes* /* codes */ 801 ); 802 803 typedef int (*FreeFontType) ( 804 Display* /* display */, 805 XFontStruct* /* fs */, 806 XExtCodes* /* codes */ 807 ); 808 809 typedef int (*CloseDisplayType) ( 810 Display* /* display */, 811 XExtCodes* /* codes */ 812 ); 813 814 typedef int (*ErrorType) ( 815 Display* /* display */, 816 xError* /* err */, 817 XExtCodes* /* codes */, 818 int* /* ret_code */ 819 ); 820 821 typedef char* (*ErrorStringType) ( 822 Display* /* display */, 823 int /* code */, 824 XExtCodes* /* codes */, 825 char* /* buffer */, 826 int /* nbytes */ 827 ); 828 829 typedef void (*PrintErrorType)( 830 Display* /* display */, 831 XErrorEvent* /* ev */, 832 void* /* fp */ 833 ); 834 835 typedef void (*BeforeFlushType)( 836 Display* /* display */, 837 XExtCodes* /* codes */, 838 _Xconst char* /* data */, 839 long /* len */ 840 ); 841 842 /* 843 * This structure is private to the library. 844 */ 845 typedef struct _XExten { /* private to extension mechanism */ 846 struct _XExten *next; /* next in list */ 847 XExtCodes codes; /* public information, all extension told */ 848 CreateGCType create_GC; /* routine to call when GC created */ 849 CopyGCType copy_GC; /* routine to call when GC copied */ 850 FlushGCType flush_GC; /* routine to call when GC flushed */ 851 FreeGCType free_GC; /* routine to call when GC freed */ 852 CreateFontType create_Font; /* routine to call when Font created */ 853 FreeFontType free_Font; /* routine to call when Font freed */ 854 CloseDisplayType close_display; /* routine to call when connection closed */ 855 ErrorType error; /* who to call when an error occurs */ 856 ErrorStringType error_string; /* routine to supply error string */ 857 char *name; /* name of this extension */ 858 PrintErrorType error_values; /* routine to supply error values */ 859 BeforeFlushType before_flush; /* routine to call when sending data */ 860 struct _XExten *next_flush; /* next in list of those with flushes */ 861 } _XExtension; 862 863 /* extension hooks */ 864 865 #ifdef DataRoutineIsProcedure 866 extern void Data(Display *dpy, char *data, long len); 867 #endif 868 extern int _XError( 869 Display* /* dpy */, 870 xError* /* rep */ 871 ); 872 extern int _XIOError( 873 Display* /* dpy */ 874 ) _X_NORETURN; 875 extern int (*_XIOErrorFunction)( 876 Display* /* dpy */ 877 ); 878 extern int (*_XErrorFunction)( 879 Display* /* dpy */, 880 XErrorEvent* /* error_event */ 881 ); 882 extern void _XEatData( 883 Display* /* dpy */, 884 unsigned long /* n */ 885 ); 886 extern char *_XAllocScratch( 887 Display* /* dpy */, 888 unsigned long /* nbytes */ 889 ); 890 extern char *_XAllocTemp( 891 Display* /* dpy */, 892 unsigned long /* nbytes */ 893 ); 894 extern void _XFreeTemp( 895 Display* /* dpy */, 896 char* /* buf */, 897 unsigned long /* nbytes */ 898 ); 899 extern Visual *_XVIDtoVisual( 900 Display* /* dpy */, 901 VisualID /* id */ 902 ); 903 extern unsigned long _XSetLastRequestRead( 904 Display* /* dpy */, 905 xGenericReply* /* rep */ 906 ); 907 extern int _XGetHostname( 908 char* /* buf */, 909 int /* maxlen */ 910 ); 911 extern Screen *_XScreenOfWindow( 912 Display* /* dpy */, 913 Window /* w */ 914 ); 915 extern Bool _XAsyncErrorHandler( 916 Display* /* dpy */, 917 xReply* /* rep */, 918 char* /* buf */, 919 int /* len */, 920 XPointer /* data */ 921 ); 922 extern char *_XGetAsyncReply( 923 Display* /* dpy */, 924 char* /* replbuf */, 925 xReply* /* rep */, 926 char* /* buf */, 927 int /* len */, 928 int /* extra */, 929 Bool /* discard */ 930 ); 931 extern void _XGetAsyncData( 932 Display* /* dpy */, 933 char * /* data */, 934 char * /* buf */, 935 int /* len */, 936 int /* skip */, 937 int /* datalen */, 938 int /* discardtotal */ 939 ); 940 extern void _XFlush( 941 Display* /* dpy */ 942 ); 943 extern int _XEventsQueued( 944 Display* /* dpy */, 945 int /* mode */ 946 ); 947 extern void _XReadEvents( 948 Display* /* dpy */ 949 ); 950 extern int _XRead( 951 Display* /* dpy */, 952 char* /* data */, 953 long /* size */ 954 ); 955 extern void _XReadPad( 956 Display* /* dpy */, 957 char* /* data */, 958 long /* size */ 959 ); 960 extern void _XSend( 961 Display* /* dpy */, 962 _Xconst char* /* data */, 963 long /* size */ 964 ); 965 extern Status _XReply( 966 Display* /* dpy */, 967 xReply* /* rep */, 968 int /* extra */, 969 Bool /* discard */ 970 ); 971 extern void _XEnq( 972 Display* /* dpy */, 973 xEvent* /* event */ 974 ); 975 extern void _XDeq( 976 Display* /* dpy */, 977 _XQEvent* /* prev */, 978 _XQEvent* /* qelt */ 979 ); 980 981 extern Bool _XUnknownWireEvent( 982 Display* /* dpy */, 983 XEvent* /* re */, 984 xEvent* /* event */ 985 ); 986 987 extern Bool _XUnknownWireEventCookie( 988 Display* /* dpy */, 989 XGenericEventCookie* /* re */, 990 xEvent* /* event */ 991 ); 992 993 extern Bool _XUnknownCopyEventCookie( 994 Display* /* dpy */, 995 XGenericEventCookie* /* in */, 996 XGenericEventCookie* /* out */ 997 ); 998 999 extern Status _XUnknownNativeEvent( 1000 Display* /* dpy */, 1001 XEvent* /* re */, 1002 xEvent* /* event */ 1003 ); 1004 1005 extern Bool _XWireToEvent(Display *dpy, XEvent *re, xEvent *event); 1006 extern Bool _XDefaultWireError(Display *display, XErrorEvent *he, xError *we); 1007 extern Bool _XPollfdCacheInit(Display *dpy); 1008 extern void _XPollfdCacheAdd(Display *dpy, int fd); 1009 extern void _XPollfdCacheDel(Display *dpy, int fd); 1010 extern XID _XAllocID(Display *dpy); 1011 extern void _XAllocIDs(Display *dpy, XID *ids, int count); 1012 1013 extern int _XFreeExtData( 1014 XExtData* /* extension */ 1015 ); 1016 1017 extern int (*XESetCreateGC( 1018 Display* /* display */, 1019 int /* extension */, 1020 int (*) ( 1021 Display* /* display */, 1022 GC /* gc */, 1023 XExtCodes* /* codes */ 1024 ) /* proc */ 1025 ))( 1026 Display*, GC, XExtCodes* 1027 ); 1028 1029 extern int (*XESetCopyGC( 1030 Display* /* display */, 1031 int /* extension */, 1032 int (*) ( 1033 Display* /* display */, 1034 GC /* gc */, 1035 XExtCodes* /* codes */ 1036 ) /* proc */ 1037 ))( 1038 Display*, GC, XExtCodes* 1039 ); 1040 1041 extern int (*XESetFlushGC( 1042 Display* /* display */, 1043 int /* extension */, 1044 int (*) ( 1045 Display* /* display */, 1046 GC /* gc */, 1047 XExtCodes* /* codes */ 1048 ) /* proc */ 1049 ))( 1050 Display*, GC, XExtCodes* 1051 ); 1052 1053 extern int (*XESetFreeGC( 1054 Display* /* display */, 1055 int /* extension */, 1056 int (*) ( 1057 Display* /* display */, 1058 GC /* gc */, 1059 XExtCodes* /* codes */ 1060 ) /* proc */ 1061 ))( 1062 Display*, GC, XExtCodes* 1063 ); 1064 1065 extern int (*XESetCreateFont( 1066 Display* /* display */, 1067 int /* extension */, 1068 int (*) ( 1069 Display* /* display */, 1070 XFontStruct* /* fs */, 1071 XExtCodes* /* codes */ 1072 ) /* proc */ 1073 ))( 1074 Display*, XFontStruct*, XExtCodes* 1075 ); 1076 1077 extern int (*XESetFreeFont( 1078 Display* /* display */, 1079 int /* extension */, 1080 int (*) ( 1081 Display* /* display */, 1082 XFontStruct* /* fs */, 1083 XExtCodes* /* codes */ 1084 ) /* proc */ 1085 ))( 1086 Display*, XFontStruct*, XExtCodes* 1087 ); 1088 1089 extern int (*XESetCloseDisplay( 1090 Display* /* display */, 1091 int /* extension */, 1092 int (*) ( 1093 Display* /* display */, 1094 XExtCodes* /* codes */ 1095 ) /* proc */ 1096 ))( 1097 Display*, XExtCodes* 1098 ); 1099 1100 extern int (*XESetError( 1101 Display* /* display */, 1102 int /* extension */, 1103 int (*) ( 1104 Display* /* display */, 1105 xError* /* err */, 1106 XExtCodes* /* codes */, 1107 int* /* ret_code */ 1108 ) /* proc */ 1109 ))( 1110 Display*, xError*, XExtCodes*, int* 1111 ); 1112 1113 extern char* (*XESetErrorString( 1114 Display* /* display */, 1115 int /* extension */, 1116 char* (*) ( 1117 Display* /* display */, 1118 int /* code */, 1119 XExtCodes* /* codes */, 1120 char* /* buffer */, 1121 int /* nbytes */ 1122 ) /* proc */ 1123 ))( 1124 Display*, int, XExtCodes*, char*, int 1125 ); 1126 1127 extern void (*XESetPrintErrorValues ( 1128 Display* /* display */, 1129 int /* extension */, 1130 void (*)( 1131 Display* /* display */, 1132 XErrorEvent* /* ev */, 1133 void* /* fp */ 1134 ) /* proc */ 1135 ))( 1136 Display*, XErrorEvent*, void* 1137 ); 1138 1139 extern Bool (*XESetWireToEvent( 1140 Display* /* display */, 1141 int /* event_number */, 1142 Bool (*) ( 1143 Display* /* display */, 1144 XEvent* /* re */, 1145 xEvent* /* event */ 1146 ) /* proc */ 1147 ))( 1148 Display*, XEvent*, xEvent* 1149 ); 1150 1151 extern Bool (*XESetWireToEventCookie( 1152 Display* /* display */, 1153 int /* extension */, 1154 Bool (*) ( 1155 Display* /* display */, 1156 XGenericEventCookie* /* re */, 1157 xEvent* /* event */ 1158 ) /* proc */ 1159 ))( 1160 Display*, XGenericEventCookie*, xEvent* 1161 ); 1162 1163 extern Bool (*XESetCopyEventCookie( 1164 Display* /* display */, 1165 int /* extension */, 1166 Bool (*) ( 1167 Display* /* display */, 1168 XGenericEventCookie* /* in */, 1169 XGenericEventCookie* /* out */ 1170 ) /* proc */ 1171 ))( 1172 Display*, XGenericEventCookie*, XGenericEventCookie* 1173 ); 1174 1175 1176 extern Status (*XESetEventToWire( 1177 Display* /* display */, 1178 int /* event_number */, 1179 Status (*) ( 1180 Display* /* display */, 1181 XEvent* /* re */, 1182 xEvent* /* event */ 1183 ) /* proc */ 1184 ))( 1185 Display*, XEvent*, xEvent* 1186 ); 1187 1188 extern Bool (*XESetWireToError( 1189 Display* /* display */, 1190 int /* error_number */, 1191 Bool (*) ( 1192 Display* /* display */, 1193 XErrorEvent* /* he */, 1194 xError* /* we */ 1195 ) /* proc */ 1196 ))( 1197 Display*, XErrorEvent*, xError* 1198 ); 1199 1200 extern void (*XESetBeforeFlush( 1201 Display* /* display */, 1202 int /* error_number */, 1203 void (*) ( 1204 Display* /* display */, 1205 XExtCodes* /* codes */, 1206 _Xconst char* /* data */, 1207 long /* len */ 1208 ) /* proc */ 1209 ))( 1210 Display*, XExtCodes*, _Xconst char*, long 1211 ); 1212 1213 /* internal connections for IMs */ 1214 1215 typedef void (*_XInternalConnectionProc)( 1216 Display* /* dpy */, 1217 int /* fd */, 1218 XPointer /* call_data */ 1219 ); 1220 1221 1222 extern Status _XRegisterInternalConnection( 1223 Display* /* dpy */, 1224 int /* fd */, 1225 _XInternalConnectionProc /* callback */, 1226 XPointer /* call_data */ 1227 ); 1228 1229 extern void _XUnregisterInternalConnection( 1230 Display* /* dpy */, 1231 int /* fd */ 1232 ); 1233 1234 extern void _XProcessInternalConnection( 1235 Display* /* dpy */, 1236 struct _XConnectionInfo* /* conn_info */ 1237 ); 1238 1239 /* Display structure has pointers to these */ 1240 1241 struct _XConnectionInfo { /* info from _XRegisterInternalConnection */ 1242 int fd; 1243 _XInternalConnectionProc read_callback; 1244 XPointer call_data; 1245 XPointer *watch_data; /* set/used by XConnectionWatchProc */ 1246 struct _XConnectionInfo *next; 1247 }; 1248 1249 struct _XConnWatchInfo { /* info from XAddConnectionWatch */ 1250 XConnectionWatchProc fn; 1251 XPointer client_data; 1252 struct _XConnWatchInfo *next; 1253 }; 1254 1255 #ifdef __UNIXOS2__ 1256 extern char* __XOS2RedirRoot( 1257 char* 1258 ); 1259 #endif 1260 1261 extern int _XTextHeight( 1262 XFontStruct* /* font_struct */, 1263 _Xconst char* /* string */, 1264 int /* count */ 1265 ); 1266 1267 extern int _XTextHeight16( 1268 XFontStruct* /* font_struct */, 1269 _Xconst XChar2b* /* string */, 1270 int /* count */ 1271 ); 1272 1273 #if defined(WIN32) 1274 1275 extern int _XOpenFile( 1276 _Xconst char* /* path */, 1277 int /* flags */ 1278 ); 1279 1280 extern int _XOpenFileMode( 1281 _Xconst char* /* path */, 1282 int /* flags */, 1283 mode_t /* mode */ 1284 ); 1285 1286 extern void* _XFopenFile( 1287 _Xconst char* /* path */, 1288 _Xconst char* /* mode */ 1289 ); 1290 1291 extern int _XAccessFile( 1292 _Xconst char* /* path */ 1293 ); 1294 #else 1295 #define _XOpenFile(path,flags) open(path,flags) 1296 #define _XOpenFileMode(path,flags,mode) open(path,flags,mode) 1297 #define _XFopenFile(path,mode) fopen(path,mode) 1298 #endif 1299 1300 /* EvToWire.c */ 1301 extern Status _XEventToWire(Display *dpy, XEvent *re, xEvent *event); 1302 1303 extern int _XF86LoadQueryLocaleFont( 1304 Display* /* dpy */, 1305 _Xconst char* /* name*/, 1306 XFontStruct** /* xfp*/, 1307 Font* /* fidp */ 1308 ); 1309 1310 extern void _XProcessWindowAttributes ( 1311 register Display *dpy, 1312 xChangeWindowAttributesReq *req, 1313 register unsigned long valuemask, 1314 register XSetWindowAttributes *attributes); 1315 1316 extern int _XDefaultError( 1317 Display *dpy, 1318 XErrorEvent *event); 1319 1320 extern int _XDefaultIOError( 1321 Display *dpy); 1322 1323 extern void _XSetClipRectangles ( 1324 register Display *dpy, 1325 GC gc, 1326 int clip_x_origin, int clip_y_origin, 1327 XRectangle *rectangles, 1328 int n, 1329 int ordering); 1330 1331 Status _XGetWindowAttributes( 1332 register Display *dpy, 1333 Window w, 1334 XWindowAttributes *attr); 1335 1336 int _XPutBackEvent ( 1337 register Display *dpy, 1338 register XEvent *event); 1339 1340 extern Bool _XIsEventCookie( 1341 Display *dpy, 1342 XEvent *ev); 1343 1344 extern void _XFreeEventCookies( 1345 Display *dpy); 1346 1347 extern void _XStoreEventCookie( 1348 Display *dpy, 1349 XEvent *ev); 1350 1351 extern Bool _XFetchEventCookie( 1352 Display *dpy, 1353 XGenericEventCookie *ev); 1354 1355 extern Bool _XCopyEventCookie( 1356 Display *dpy, 1357 XGenericEventCookie *in, 1358 XGenericEventCookie *out); 1359 1360 /* lcFile.c */ 1361 1362 extern void xlocaledir( 1363 char *buf, 1364 int buf_len 1365 ); 1366 1367 _XFUNCPROTOEND 1368 1369 #endif /* _X11_XLIBINT_H_ */ 1370