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