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 <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 | |
58 | struct _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 | |
68 | struct _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 | |
207 | #define XAllocIDs(dpy,ids,n) (*(dpy)->idlist_alloc)(dpy,ids,n) |
208 | |
209 | /* |
210 | * access "last_request_read" and "request" with 64bit |
211 | * warning: the value argument of the SET-macros must not |
212 | * have any side-effects because it may get called twice. |
213 | */ |
214 | #ifndef LONG64 |
215 | /* accessors for 32-bit unsigned long */ |
216 | |
217 | #define X_DPY_GET_REQUEST(dpy) \ |
218 | ( \ |
219 | ((uint64_t)(((struct _XDisplay*)dpy)->request)) \ |
220 | + (((uint64_t)(((struct _XDisplay*)dpy)->request_upper32bit)) << 32) \ |
221 | ) |
222 | |
223 | #define X_DPY_SET_REQUEST(dpy, value) \ |
224 | ( \ |
225 | (((struct _XDisplay*)dpy)->request = \ |
226 | (value) & 0xFFFFFFFFUL), \ |
227 | (((struct _XDisplay*)dpy)->request_upper32bit = \ |
228 | ((uint64_t)(value)) >> 32), \ |
229 | (void)0 /* don't use the result */ \ |
230 | ) |
231 | |
232 | #define X_DPY_GET_LAST_REQUEST_READ(dpy) \ |
233 | ( \ |
234 | ((uint64_t)(((struct _XDisplay*)dpy)->last_request_read)) \ |
235 | + ( \ |
236 | ((uint64_t)( \ |
237 | ((struct _XDisplay*)dpy)->last_request_read_upper32bit \ |
238 | )) << 32 \ |
239 | ) \ |
240 | ) |
241 | |
242 | #define X_DPY_SET_LAST_REQUEST_READ(dpy, value) \ |
243 | ( \ |
244 | (((struct _XDisplay*)dpy)->last_request_read = \ |
245 | (value) & 0xFFFFFFFFUL), \ |
246 | (((struct _XDisplay*)dpy)->last_request_read_upper32bit = \ |
247 | ((uint64_t)(value)) >> 32), \ |
248 | (void)0 /* don't use the result */ \ |
249 | ) |
250 | |
251 | /* |
252 | * widen a 32-bit sequence number to a 64 sequence number. |
253 | * This macro makes the following assumptions: |
254 | * - ulseq refers to a sequence that has already been sent |
255 | * - ulseq means the most recent possible sequence number |
256 | * with these lower 32 bits. |
257 | * |
258 | * The following optimization is used: |
259 | * The comparison result is taken a 0 or 1 to avoid a branch. |
260 | */ |
261 | #define X_DPY_WIDEN_UNSIGNED_LONG_SEQ(dpy, ulseq) \ |
262 | ( \ |
263 | ((uint64_t)ulseq) \ |
264 | + \ |
265 | (( \ |
266 | ((uint64_t)(((struct _XDisplay*)dpy)->request_upper32bit)) \ |
267 | - (uint64_t)( \ |
268 | (ulseq) > (((struct _XDisplay*)dpy)->request) \ |
269 | ) \ |
270 | ) << 32) \ |
271 | ) |
272 | |
273 | #define X_DPY_REQUEST_INCREMENT(dpy) \ |
274 | ( \ |
275 | ((struct _XDisplay*)dpy)->request++, \ |
276 | ( \ |
277 | (((struct _XDisplay*)dpy)->request == 0) ? ( \ |
278 | ((struct _XDisplay*)dpy)->request_upper32bit++ \ |
279 | ) : 0 \ |
280 | ), \ |
281 | (void)0 /* don't use the result */ \ |
282 | ) |
283 | |
284 | |
285 | #define X_DPY_REQUEST_DECREMENT(dpy) \ |
286 | ( \ |
287 | ( \ |
288 | (((struct _XDisplay*)dpy)->request == 0) ? (\ |
289 | ((struct _XDisplay*)dpy)->request--, /* wrap */ \ |
290 | ((struct _XDisplay*)dpy)->request_upper32bit-- \ |
291 | ) : ( \ |
292 | ((struct _XDisplay*)dpy)->request-- \ |
293 | ) \ |
294 | ), \ |
295 | (void)0 /* don't use the result */ \ |
296 | ) |
297 | |
298 | #else |
299 | /* accessors for 64-bit unsigned long */ |
300 | #define X_DPY_GET_REQUEST(dpy) \ |
301 | (((struct _XDisplay*)dpy)->request) |
302 | #define X_DPY_SET_REQUEST(dpy, value) \ |
303 | ((struct _XDisplay*)dpy)->request = (value) |
304 | |
305 | #define X_DPY_GET_LAST_REQUEST_READ(dpy) \ |
306 | (((struct _XDisplay*)dpy)->last_request_read) |
307 | #define X_DPY_SET_LAST_REQUEST_READ(dpy, value) \ |
308 | ((struct _XDisplay*)dpy)->last_request_read = (value) |
309 | |
310 | #define X_DPY_WIDEN_UNSIGNED_LONG_SEQ(dpy, ulseq) ulseq |
311 | |
312 | #define X_DPY_REQUEST_INCREMENT(dpy) ((struct _XDisplay*)dpy)->request++ |
313 | #define X_DPY_REQUEST_DECREMENT(dpy) ((struct _XDisplay*)dpy)->request-- |
314 | #endif |
315 | |
316 | |
317 | #ifndef _XEVENT_ |
318 | /* |
319 | * _QEvent datatype for use in input queueing. |
320 | */ |
321 | typedef struct _XSQEvent |
322 | { |
323 | struct _XSQEvent *next; |
324 | XEvent event; |
325 | unsigned long qserial_num; /* so multi-threaded code can find new ones */ |
326 | } _XQEvent; |
327 | #endif |
328 | |
329 | #include <X11/Xproto.h> |
330 | #ifdef __sgi |
331 | #define _SGI_MP_SOURCE /* turn this on to get MP safe errno */ |
332 | #endif |
333 | #include <errno.h> |
334 | #define _XBCOPYFUNC _Xbcopy |
335 | #include <X11/Xfuncs.h> |
336 | #include <X11/Xosdefs.h> |
337 | |
338 | /* Utek leaves kernel macros around in include files (bleah) */ |
339 | #ifdef dirty |
340 | #undef dirty |
341 | #endif |
342 | |
343 | #include <stdlib.h> |
344 | #include <string.h> |
345 | |
346 | #include <X11/Xfuncproto.h> |
347 | |
348 | _XFUNCPROTOBEGIN |
349 | |
350 | /* |
351 | * The following definitions can be used for locking requests in multi-threaded |
352 | * address spaces. |
353 | */ |
354 | #ifdef XTHREADS |
355 | /* Author: Stephen Gildea, MIT X Consortium |
356 | * |
357 | * declarations for C Threads locking |
358 | */ |
359 | |
360 | typedef struct _LockInfoRec *LockInfoPtr; |
361 | |
362 | /* interfaces for locking.c */ |
363 | struct _XLockPtrs { |
364 | /* used by all, including extensions; do not move */ |
365 | void (*lock_display)( |
366 | Display *dpy |
367 | #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) |
368 | , char *file |
369 | , int line |
370 | #endif |
371 | ); |
372 | void (*unlock_display)( |
373 | Display *dpy |
374 | #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) |
375 | , char *file |
376 | , int line |
377 | #endif |
378 | ); |
379 | }; |
380 | |
381 | #if defined(WIN32) && !defined(_XLIBINT_) |
382 | #define _XCreateMutex_fn (*_XCreateMutex_fn_p) |
383 | #define _XFreeMutex_fn (*_XFreeMutex_fn_p) |
384 | #define _XLockMutex_fn (*_XLockMutex_fn_p) |
385 | #define _XUnlockMutex_fn (*_XUnlockMutex_fn_p) |
386 | #define _Xglobal_lock (*_Xglobal_lock_p) |
387 | #endif |
388 | |
389 | /* in XlibInt.c */ |
390 | extern void (*_XCreateMutex_fn)( |
391 | LockInfoPtr /* lock */ |
392 | ); |
393 | extern void (*_XFreeMutex_fn)( |
394 | LockInfoPtr /* lock */ |
395 | ); |
396 | extern void (*_XLockMutex_fn)( |
397 | LockInfoPtr /* lock */ |
398 | #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) |
399 | , char * /* file */ |
400 | , int /* line */ |
401 | #endif |
402 | ); |
403 | extern void (*_XUnlockMutex_fn)( |
404 | LockInfoPtr /* lock */ |
405 | #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) |
406 | , char * /* file */ |
407 | , int /* line */ |
408 | #endif |
409 | ); |
410 | |
411 | extern LockInfoPtr _Xglobal_lock; |
412 | |
413 | #if defined(XTHREADS_WARN) || defined(XTHREADS_FILE_LINE) |
414 | #define LockDisplay(d) if ((d)->lock_fns) (*(d)->lock_fns->lock_display)((d),__FILE__,__LINE__) |
415 | #define UnlockDisplay(d) if ((d)->lock_fns) (*(d)->lock_fns->unlock_display)((d),__FILE__,__LINE__) |
416 | #define _XLockMutex(lock) if (_XLockMutex_fn) (*_XLockMutex_fn)(lock,__FILE__,__LINE__) |
417 | #define _XUnlockMutex(lock) if (_XUnlockMutex_fn) (*_XUnlockMutex_fn)(lock,__FILE__,__LINE__) |
418 | #else |
419 | /* used everywhere, so must be fast if not using threads */ |
420 | #define LockDisplay(d) if ((d)->lock_fns) (*(d)->lock_fns->lock_display)(d) |
421 | #define UnlockDisplay(d) if ((d)->lock_fns) (*(d)->lock_fns->unlock_display)(d) |
422 | #define _XLockMutex(lock) if (_XLockMutex_fn) (*_XLockMutex_fn)(lock) |
423 | #define _XUnlockMutex(lock) if (_XUnlockMutex_fn) (*_XUnlockMutex_fn)(lock) |
424 | #endif |
425 | #define _XCreateMutex(lock) if (_XCreateMutex_fn) (*_XCreateMutex_fn)(lock); |
426 | #define _XFreeMutex(lock) if (_XFreeMutex_fn) (*_XFreeMutex_fn)(lock); |
427 | |
428 | #else /* XTHREADS */ |
429 | #define LockDisplay(dis) |
430 | #define _XLockMutex(lock) |
431 | #define _XUnlockMutex(lock) |
432 | #define UnlockDisplay(dis) |
433 | #define _XCreateMutex(lock) |
434 | #define _XFreeMutex(lock) |
435 | #endif |
436 | |
437 | #define Xfree(ptr) free((ptr)) |
438 | |
439 | /* |
440 | * Note that some machines do not return a valid pointer for malloc(0), in |
441 | * which case we provide an alternate under the control of the |
442 | * define MALLOC_0_RETURNS_NULL. This is necessary because some |
443 | * Xlib code expects malloc(0) to return a valid pointer to storage. |
444 | */ |
445 | #if defined(MALLOC_0_RETURNS_NULL) || defined(__clang_analyzer__) |
446 | |
447 | # define Xmalloc(size) malloc(((size) == 0 ? 1 : (size))) |
448 | # define Xrealloc(ptr, size) realloc((ptr), ((size) == 0 ? 1 : (size))) |
449 | # define Xcalloc(nelem, elsize) calloc(((nelem) == 0 ? 1 : (nelem)), (elsize)) |
450 | |
451 | #else |
452 | |
453 | # define Xmalloc(size) malloc((size)) |
454 | # define Xrealloc(ptr, size) realloc((ptr), (size)) |
455 | # define Xcalloc(nelem, elsize) calloc((nelem), (elsize)) |
456 | |
457 | #endif |
458 | |
459 | #include <stddef.h> |
460 | |
461 | #define LOCKED 1 |
462 | #define UNLOCKED 0 |
463 | |
464 | #ifndef BUFSIZE |
465 | #define BUFSIZE 2048 /* X output buffer size. */ |
466 | #endif |
467 | #ifndef PTSPERBATCH |
468 | #define PTSPERBATCH 1024 /* point batching */ |
469 | #endif |
470 | #ifndef WLNSPERBATCH |
471 | #define WLNSPERBATCH 50 /* wide line batching */ |
472 | #endif |
473 | #ifndef ZLNSPERBATCH |
474 | #define ZLNSPERBATCH 1024 /* thin line batching */ |
475 | #endif |
476 | #ifndef WRCTSPERBATCH |
477 | #define WRCTSPERBATCH 10 /* wide line rectangle batching */ |
478 | #endif |
479 | #ifndef ZRCTSPERBATCH |
480 | #define ZRCTSPERBATCH 256 /* thin line rectangle batching */ |
481 | #endif |
482 | #ifndef FRCTSPERBATCH |
483 | #define FRCTSPERBATCH 256 /* filled rectangle batching */ |
484 | #endif |
485 | #ifndef FARCSPERBATCH |
486 | #define FARCSPERBATCH 256 /* filled arc batching */ |
487 | #endif |
488 | #ifndef CURSORFONT |
489 | #define CURSORFONT "cursor" /* standard cursor fonts */ |
490 | #endif |
491 | |
492 | /* |
493 | * Display flags |
494 | */ |
495 | #define XlibDisplayIOError (1L << 0) |
496 | #define XlibDisplayClosing (1L << 1) |
497 | #define XlibDisplayNoXkb (1L << 2) |
498 | #define XlibDisplayPrivSync (1L << 3) |
499 | #define XlibDisplayProcConni (1L << 4) /* in _XProcessInternalConnection */ |
500 | #define XlibDisplayReadEvents (1L << 5) /* in _XReadEvents */ |
501 | #define XlibDisplayReply (1L << 5) /* in _XReply */ |
502 | #define XlibDisplayWriting (1L << 6) /* in _XFlushInt, _XSend */ |
503 | #define XlibDisplayDfltRMDB (1L << 7) /* mark if RM db from XGetDefault */ |
504 | |
505 | /* |
506 | * X Protocol packetizing macros. |
507 | */ |
508 | |
509 | /* Leftover from CRAY support - was defined empty on all non-Cray systems */ |
510 | #define WORD64ALIGN |
511 | |
512 | /** |
513 | * Return a len-sized request buffer for the request type. This function may |
514 | * flush the output queue. |
515 | * |
516 | * @param dpy The display connection |
517 | * @param type The request type |
518 | * @param len Length of the request in bytes |
519 | * |
520 | * @returns A pointer to the request buffer with a few default values |
521 | * initialized. |
522 | */ |
523 | extern void *_XGetRequest(Display *dpy, CARD8 type, size_t len); |
524 | |
525 | /* GetReqSized is the same as GetReq but allows the caller to specify the |
526 | * size in bytes. 'sz' must be a multiple of 4! */ |
527 | |
528 | #define GetReqSized(name, sz, req) \ |
529 | req = (x##name##Req *) _XGetRequest(dpy, X_##name, sz) |
530 | |
531 | /* |
532 | * GetReq - Get the next available X request packet in the buffer and |
533 | * return it. |
534 | * |
535 | * "name" is the name of the request, e.g. CreatePixmap, OpenFont, etc. |
536 | * "req" is the name of the request pointer. |
537 | * |
538 | */ |
539 | |
540 | #define GetReq(name, req) \ |
541 | GetReqSized(name, SIZEOF(x##name##Req), req) |
542 | |
543 | /* GetReqExtra is the same as GetReq, but allocates "n" additional |
544 | bytes after the request. "n" must be a multiple of 4! */ |
545 | |
546 | #define (name, n, req) \ |
547 | GetReqSized(name, SIZEOF(x##name##Req) + n, req) |
548 | |
549 | /* |
550 | * GetResReq is for those requests that have a resource ID |
551 | * (Window, Pixmap, GContext, etc.) as their single argument. |
552 | * "rid" is the name of the resource. |
553 | */ |
554 | |
555 | #define GetResReq(name, rid, req) \ |
556 | req = (xResourceReq *) _XGetRequest(dpy, X_##name, SIZEOF(xResourceReq)); \ |
557 | req->id = (rid) |
558 | |
559 | /* |
560 | * GetEmptyReq is for those requests that have no arguments |
561 | * at all. |
562 | */ |
563 | |
564 | #define GetEmptyReq(name, req) \ |
565 | req = (xReq *) _XGetRequest(dpy, X_##name, SIZEOF(xReq)) |
566 | |
567 | /* |
568 | * MakeBigReq sets the CARD16 "req->length" to 0 and inserts a new CARD32 |
569 | * length, after req->length, before the data in the request. The new length |
570 | * includes the "n" extra 32-bit words. |
571 | * |
572 | * Do not use MakeBigReq if there is no data already in the request. |
573 | * req->length must already be >= 2. |
574 | */ |
575 | #ifdef LONG64 |
576 | #define MakeBigReq(req,n) \ |
577 | { \ |
578 | CARD64 _BRdat; \ |
579 | CARD32 _BRlen = req->length - 1; \ |
580 | req->length = 0; \ |
581 | _BRdat = ((CARD32 *)req)[_BRlen]; \ |
582 | memmove(((char *)req) + 8, ((char *)req) + 4, (_BRlen - 1) << 2); \ |
583 | ((CARD32 *)req)[1] = _BRlen + n + 2; \ |
584 | Data32(dpy, &_BRdat, 4); \ |
585 | } |
586 | #else |
587 | #define MakeBigReq(req,n) \ |
588 | { \ |
589 | CARD32 _BRdat; \ |
590 | CARD32 _BRlen = req->length - 1; \ |
591 | req->length = 0; \ |
592 | _BRdat = ((CARD32 *)req)[_BRlen]; \ |
593 | memmove(((char *)req) + 8, ((char *)req) + 4, (_BRlen - 1) << 2); \ |
594 | ((CARD32 *)req)[1] = _BRlen + n + 2; \ |
595 | Data32(dpy, &_BRdat, 4); \ |
596 | } |
597 | #endif |
598 | |
599 | /* |
600 | * SetReqLen increases the count of 32-bit words in the request by "n", |
601 | * or by "badlen" if "n" is too large. |
602 | * |
603 | * Do not use SetReqLen if "req" does not already have data after the |
604 | * xReq header. req->length must already be >= 2. |
605 | */ |
606 | #ifndef __clang_analyzer__ |
607 | #define SetReqLen(req,n,badlen) \ |
608 | if ((req->length + n) > (unsigned)65535) { \ |
609 | if (dpy->bigreq_size) { \ |
610 | MakeBigReq(req,n) \ |
611 | } else { \ |
612 | n = badlen; \ |
613 | req->length += n; \ |
614 | } \ |
615 | } else \ |
616 | req->length += n |
617 | #else |
618 | #define SetReqLen(req,n,badlen) \ |
619 | req->length += n |
620 | #endif |
621 | |
622 | #define SyncHandle() \ |
623 | if (dpy->synchandler) (*dpy->synchandler)(dpy) |
624 | |
625 | extern void _XFlushGCCache(Display *dpy, GC gc); |
626 | #define FlushGC(dpy, gc) \ |
627 | if ((gc)->dirty) _XFlushGCCache((dpy), (gc)) |
628 | /* |
629 | * Data - Place data in the buffer and pad the end to provide |
630 | * 32 bit word alignment. Transmit if the buffer fills. |
631 | * |
632 | * "dpy" is a pointer to a Display. |
633 | * "data" is a pointer to a data buffer. |
634 | * "len" is the length of the data buffer. |
635 | */ |
636 | #ifndef DataRoutineIsProcedure |
637 | #define Data(dpy, data, len) {\ |
638 | if (dpy->bufptr + (len) <= dpy->bufmax) {\ |
639 | memcpy(dpy->bufptr, data, (int)len);\ |
640 | dpy->bufptr += ((len) + 3) & ~3;\ |
641 | } else\ |
642 | _XSend(dpy, data, len);\ |
643 | } |
644 | #endif /* DataRoutineIsProcedure */ |
645 | |
646 | |
647 | /* Allocate bytes from the buffer. No padding is done, so if |
648 | * the length is not a multiple of 4, the caller must be |
649 | * careful to leave the buffer aligned after sending the |
650 | * current request. |
651 | * |
652 | * "type" is the type of the pointer being assigned to. |
653 | * "ptr" is the pointer being assigned to. |
654 | * "n" is the number of bytes to allocate. |
655 | * |
656 | * Example: |
657 | * xTextElt *elt; |
658 | * BufAlloc (xTextElt *, elt, nbytes) |
659 | */ |
660 | |
661 | #define BufAlloc(type, ptr, n) \ |
662 | if (dpy->bufptr + (n) > dpy->bufmax) \ |
663 | _XFlush (dpy); \ |
664 | ptr = (type) dpy->bufptr; \ |
665 | memset(ptr, '\0', n); \ |
666 | dpy->bufptr += (n); |
667 | |
668 | #define Data16(dpy, data, len) Data((dpy), (_Xconst char *)(data), (len)) |
669 | #define _XRead16Pad(dpy, data, len) _XReadPad((dpy), (char *)(data), (len)) |
670 | #define _XRead16(dpy, data, len) _XRead((dpy), (char *)(data), (len)) |
671 | #ifdef LONG64 |
672 | #define Data32(dpy, data, len) _XData32(dpy, (_Xconst long *)data, len) |
673 | extern int _XData32( |
674 | Display *dpy, |
675 | register _Xconst long *data, |
676 | unsigned len |
677 | ); |
678 | extern void _XRead32( |
679 | Display *dpy, |
680 | register long *data, |
681 | long len |
682 | ); |
683 | #else |
684 | #define Data32(dpy, data, len) Data((dpy), (_Xconst char *)(data), (len)) |
685 | #define _XRead32(dpy, data, len) _XRead((dpy), (char *)(data), (len)) |
686 | #endif |
687 | |
688 | #define PackData16(dpy,data,len) Data16 (dpy, data, len) |
689 | #define PackData32(dpy,data,len) Data32 (dpy, data, len) |
690 | |
691 | /* Xlib manual is bogus */ |
692 | #define PackData(dpy,data,len) PackData16 (dpy, data, len) |
693 | |
694 | #define min(a,b) (((a) < (b)) ? (a) : (b)) |
695 | #define max(a,b) (((a) > (b)) ? (a) : (b)) |
696 | |
697 | #define CI_NONEXISTCHAR(cs) (((cs)->width == 0) && \ |
698 | (((cs)->rbearing|(cs)->lbearing| \ |
699 | (cs)->ascent|(cs)->descent) == 0)) |
700 | |
701 | /* |
702 | * CI_GET_CHAR_INFO_1D - return the charinfo struct for the indicated 8bit |
703 | * character. If the character is in the column and exists, then return the |
704 | * appropriate metrics (note that fonts with common per-character metrics will |
705 | * return min_bounds). If none of these hold true, try again with the default |
706 | * char. |
707 | */ |
708 | #define CI_GET_CHAR_INFO_1D(fs,col,def,cs) \ |
709 | { \ |
710 | cs = def; \ |
711 | if (col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \ |
712 | if (fs->per_char == NULL) { \ |
713 | cs = &fs->min_bounds; \ |
714 | } else { \ |
715 | cs = &fs->per_char[(col - fs->min_char_or_byte2)]; \ |
716 | if (CI_NONEXISTCHAR(cs)) cs = def; \ |
717 | } \ |
718 | } \ |
719 | } |
720 | |
721 | #define CI_GET_DEFAULT_INFO_1D(fs,cs) \ |
722 | CI_GET_CHAR_INFO_1D (fs, fs->default_char, NULL, cs) |
723 | |
724 | |
725 | |
726 | /* |
727 | * CI_GET_CHAR_INFO_2D - return the charinfo struct for the indicated row and |
728 | * column. This is used for fonts that have more than row zero. |
729 | */ |
730 | #define CI_GET_CHAR_INFO_2D(fs,row,col,def,cs) \ |
731 | { \ |
732 | cs = def; \ |
733 | if (row >= fs->min_byte1 && row <= fs->max_byte1 && \ |
734 | col >= fs->min_char_or_byte2 && col <= fs->max_char_or_byte2) { \ |
735 | if (fs->per_char == NULL) { \ |
736 | cs = &fs->min_bounds; \ |
737 | } else { \ |
738 | cs = &fs->per_char[((row - fs->min_byte1) * \ |
739 | (fs->max_char_or_byte2 - \ |
740 | fs->min_char_or_byte2 + 1)) + \ |
741 | (col - fs->min_char_or_byte2)]; \ |
742 | if (CI_NONEXISTCHAR(cs)) cs = def; \ |
743 | } \ |
744 | } \ |
745 | } |
746 | |
747 | #define CI_GET_DEFAULT_INFO_2D(fs,cs) \ |
748 | { \ |
749 | unsigned int r = (fs->default_char >> 8); \ |
750 | unsigned int c = (fs->default_char & 0xff); \ |
751 | CI_GET_CHAR_INFO_2D (fs, r, c, NULL, cs); \ |
752 | } |
753 | |
754 | |
755 | /* srcvar must be a variable for large architecture version */ |
756 | #define OneDataCard32(dpy,dstaddr,srcvar) \ |
757 | { *(CARD32 *)(dstaddr) = (srcvar); } |
758 | |
759 | |
760 | typedef struct _XInternalAsync { |
761 | struct _XInternalAsync *next; |
762 | /* |
763 | * handler arguments: |
764 | * rep is the generic reply that caused this handler |
765 | * to be invoked. It must also be passed to _XGetAsyncReply. |
766 | * buf and len are opaque values that must be passed to |
767 | * _XGetAsyncReply or _XGetAsyncData. |
768 | * data is the closure stored in this struct. |
769 | * The handler returns True iff it handled this reply. |
770 | */ |
771 | Bool (*handler)( |
772 | Display* /* dpy */, |
773 | xReply* /* rep */, |
774 | char* /* buf */, |
775 | int /* len */, |
776 | XPointer /* data */ |
777 | ); |
778 | XPointer data; |
779 | } _XAsyncHandler; |
780 | |
781 | /* |
782 | * This struct is part of the ABI and is defined by value |
783 | * in user-code. This means that we cannot make |
784 | * the sequence-numbers 64bit. |
785 | */ |
786 | typedef struct _XAsyncEState { |
787 | unsigned long min_sequence_number; |
788 | unsigned long max_sequence_number; |
789 | unsigned char error_code; |
790 | unsigned char major_opcode; |
791 | unsigned short minor_opcode; |
792 | unsigned char last_error_received; |
793 | int error_count; |
794 | } _XAsyncErrorState; |
795 | |
796 | extern void _XDeqAsyncHandler(Display *dpy, _XAsyncHandler *handler); |
797 | #define DeqAsyncHandler(dpy,handler) { \ |
798 | if (dpy->async_handlers == (handler)) \ |
799 | dpy->async_handlers = (handler)->next; \ |
800 | else \ |
801 | _XDeqAsyncHandler(dpy, handler); \ |
802 | } |
803 | |
804 | typedef void (*FreeFuncType) ( |
805 | Display* /* display */ |
806 | ); |
807 | |
808 | typedef int (*FreeModmapType) ( |
809 | XModifierKeymap* /* modmap */ |
810 | ); |
811 | |
812 | /* |
813 | * This structure is private to the library. |
814 | */ |
815 | typedef struct _XFreeFuncs { |
816 | FreeFuncType atoms; /* _XFreeAtomTable */ |
817 | FreeModmapType modifiermap; /* XFreeModifiermap */ |
818 | FreeFuncType key_bindings; /* _XFreeKeyBindings */ |
819 | FreeFuncType context_db; /* _XFreeContextDB */ |
820 | FreeFuncType defaultCCCs; /* _XcmsFreeDefaultCCCs */ |
821 | FreeFuncType clientCmaps; /* _XcmsFreeClientCmaps */ |
822 | FreeFuncType intensityMaps; /* _XcmsFreeIntensityMaps */ |
823 | FreeFuncType im_filters; /* _XFreeIMFilters */ |
824 | FreeFuncType xkb; /* _XkbFreeInfo */ |
825 | } _XFreeFuncRec; |
826 | |
827 | /* types for InitExt.c */ |
828 | typedef int (*CreateGCType) ( |
829 | Display* /* display */, |
830 | GC /* gc */, |
831 | XExtCodes* /* codes */ |
832 | ); |
833 | |
834 | typedef int (*CopyGCType)( |
835 | Display* /* display */, |
836 | GC /* gc */, |
837 | XExtCodes* /* codes */ |
838 | ); |
839 | |
840 | typedef int (*FlushGCType) ( |
841 | Display* /* display */, |
842 | GC /* gc */, |
843 | XExtCodes* /* codes */ |
844 | ); |
845 | |
846 | typedef int (*FreeGCType) ( |
847 | Display* /* display */, |
848 | GC /* gc */, |
849 | XExtCodes* /* codes */ |
850 | ); |
851 | |
852 | typedef int (*CreateFontType) ( |
853 | Display* /* display */, |
854 | XFontStruct* /* fs */, |
855 | XExtCodes* /* codes */ |
856 | ); |
857 | |
858 | typedef int (*FreeFontType) ( |
859 | Display* /* display */, |
860 | XFontStruct* /* fs */, |
861 | XExtCodes* /* codes */ |
862 | ); |
863 | |
864 | typedef int (*CloseDisplayType) ( |
865 | Display* /* display */, |
866 | XExtCodes* /* codes */ |
867 | ); |
868 | |
869 | typedef int (*ErrorType) ( |
870 | Display* /* display */, |
871 | xError* /* err */, |
872 | XExtCodes* /* codes */, |
873 | int* /* ret_code */ |
874 | ); |
875 | |
876 | typedef char* (*ErrorStringType) ( |
877 | Display* /* display */, |
878 | int /* code */, |
879 | XExtCodes* /* codes */, |
880 | char* /* buffer */, |
881 | int /* nbytes */ |
882 | ); |
883 | |
884 | typedef void (*PrintErrorType)( |
885 | Display* /* display */, |
886 | XErrorEvent* /* ev */, |
887 | void* /* fp */ |
888 | ); |
889 | |
890 | typedef void (*BeforeFlushType)( |
891 | Display* /* display */, |
892 | XExtCodes* /* codes */, |
893 | _Xconst char* /* data */, |
894 | long /* len */ |
895 | ); |
896 | |
897 | /* |
898 | * This structure is private to the library. |
899 | */ |
900 | typedef struct _XExten { /* private to extension mechanism */ |
901 | struct _XExten *next; /* next in list */ |
902 | XExtCodes codes; /* public information, all extension told */ |
903 | CreateGCType create_GC; /* routine to call when GC created */ |
904 | CopyGCType copy_GC; /* routine to call when GC copied */ |
905 | FlushGCType flush_GC; /* routine to call when GC flushed */ |
906 | FreeGCType free_GC; /* routine to call when GC freed */ |
907 | CreateFontType create_Font; /* routine to call when Font created */ |
908 | FreeFontType free_Font; /* routine to call when Font freed */ |
909 | CloseDisplayType close_display; /* routine to call when connection closed */ |
910 | ErrorType error; /* who to call when an error occurs */ |
911 | ErrorStringType error_string; /* routine to supply error string */ |
912 | char *name; /* name of this extension */ |
913 | PrintErrorType error_values; /* routine to supply error values */ |
914 | BeforeFlushType before_flush; /* routine to call when sending data */ |
915 | struct _XExten *next_flush; /* next in list of those with flushes */ |
916 | } _XExtension; |
917 | |
918 | /* Temporary definition until we can depend on an xproto release with it */ |
919 | #ifdef _X_COLD |
920 | # define _XLIB_COLD _X_COLD |
921 | #elif defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 403) /* 4.3+ */ |
922 | # define _XLIB_COLD __attribute__((__cold__)) |
923 | #else |
924 | # define _XLIB_COLD /* nothing */ |
925 | #endif |
926 | |
927 | /* extension hooks */ |
928 | |
929 | #ifdef DataRoutineIsProcedure |
930 | extern void Data(Display *dpy, char *data, long len); |
931 | #endif |
932 | extern int _XError( |
933 | Display* /* dpy */, |
934 | xError* /* rep */ |
935 | ); |
936 | extern int _XIOError( |
937 | Display* /* dpy */ |
938 | ) _X_NORETURN; |
939 | extern int (*_XIOErrorFunction)( |
940 | Display* /* dpy */ |
941 | ); |
942 | extern int (*_XErrorFunction)( |
943 | Display* /* dpy */, |
944 | XErrorEvent* /* error_event */ |
945 | ); |
946 | extern void _XEatData( |
947 | Display* /* dpy */, |
948 | unsigned long /* n */ |
949 | ) _XLIB_COLD; |
950 | extern void _XEatDataWords( |
951 | Display* /* dpy */, |
952 | unsigned long /* n */ |
953 | ) _XLIB_COLD; |
954 | #if defined(__SUNPRO_C) /* Studio compiler alternative to "cold" attribute */ |
955 | # pragma rarely_called(_XEatData, _XEatDataWords) |
956 | #endif |
957 | extern char *_XAllocScratch( |
958 | Display* /* dpy */, |
959 | unsigned long /* nbytes */ |
960 | ); |
961 | extern char *_XAllocTemp( |
962 | Display* /* dpy */, |
963 | unsigned long /* nbytes */ |
964 | ); |
965 | extern void _XFreeTemp( |
966 | Display* /* dpy */, |
967 | char* /* buf */, |
968 | unsigned long /* nbytes */ |
969 | ); |
970 | extern Visual *_XVIDtoVisual( |
971 | Display* /* dpy */, |
972 | VisualID /* id */ |
973 | ); |
974 | extern unsigned long _XSetLastRequestRead( |
975 | Display* /* dpy */, |
976 | xGenericReply* /* rep */ |
977 | ); |
978 | extern int _XGetHostname( |
979 | char* /* buf */, |
980 | int /* maxlen */ |
981 | ); |
982 | extern Screen *_XScreenOfWindow( |
983 | Display* /* dpy */, |
984 | Window /* w */ |
985 | ); |
986 | extern Bool _XAsyncErrorHandler( |
987 | Display* /* dpy */, |
988 | xReply* /* rep */, |
989 | char* /* buf */, |
990 | int /* len */, |
991 | XPointer /* data */ |
992 | ); |
993 | extern char *_XGetAsyncReply( |
994 | Display* /* dpy */, |
995 | char* /* replbuf */, |
996 | xReply* /* rep */, |
997 | char* /* buf */, |
998 | int /* len */, |
999 | int /* extra */, |
1000 | Bool /* discard */ |
1001 | ); |
1002 | extern void _XGetAsyncData( |
1003 | Display* /* dpy */, |
1004 | char * /* data */, |
1005 | char * /* buf */, |
1006 | int /* len */, |
1007 | int /* skip */, |
1008 | int /* datalen */, |
1009 | int /* discardtotal */ |
1010 | ); |
1011 | extern void _XFlush( |
1012 | Display* /* dpy */ |
1013 | ); |
1014 | extern int _XEventsQueued( |
1015 | Display* /* dpy */, |
1016 | int /* mode */ |
1017 | ); |
1018 | extern void _XReadEvents( |
1019 | Display* /* dpy */ |
1020 | ); |
1021 | extern int _XRead( |
1022 | Display* /* dpy */, |
1023 | char* /* data */, |
1024 | long /* size */ |
1025 | ); |
1026 | extern void _XReadPad( |
1027 | Display* /* dpy */, |
1028 | char* /* data */, |
1029 | long /* size */ |
1030 | ); |
1031 | extern void _XSend( |
1032 | Display* /* dpy */, |
1033 | _Xconst char* /* data */, |
1034 | long /* size */ |
1035 | ); |
1036 | extern Status _XReply( |
1037 | Display* /* dpy */, |
1038 | xReply* /* rep */, |
1039 | int /* extra */, |
1040 | Bool /* discard */ |
1041 | ); |
1042 | extern void _XEnq( |
1043 | Display* /* dpy */, |
1044 | xEvent* /* event */ |
1045 | ); |
1046 | extern void _XDeq( |
1047 | Display* /* dpy */, |
1048 | _XQEvent* /* prev */, |
1049 | _XQEvent* /* qelt */ |
1050 | ); |
1051 | |
1052 | extern Bool _XUnknownWireEvent( |
1053 | Display* /* dpy */, |
1054 | XEvent* /* re */, |
1055 | xEvent* /* event */ |
1056 | ); |
1057 | |
1058 | extern Bool _XUnknownWireEventCookie( |
1059 | Display* /* dpy */, |
1060 | XGenericEventCookie* /* re */, |
1061 | xEvent* /* event */ |
1062 | ); |
1063 | |
1064 | extern Bool _XUnknownCopyEventCookie( |
1065 | Display* /* dpy */, |
1066 | XGenericEventCookie* /* in */, |
1067 | XGenericEventCookie* /* out */ |
1068 | ); |
1069 | |
1070 | extern Status _XUnknownNativeEvent( |
1071 | Display* /* dpy */, |
1072 | XEvent* /* re */, |
1073 | xEvent* /* event */ |
1074 | ); |
1075 | |
1076 | extern Bool _XWireToEvent(Display *dpy, XEvent *re, xEvent *event); |
1077 | extern Bool _XDefaultWireError(Display *display, XErrorEvent *he, xError *we); |
1078 | extern Bool _XPollfdCacheInit(Display *dpy); |
1079 | extern void _XPollfdCacheAdd(Display *dpy, int fd); |
1080 | extern void _XPollfdCacheDel(Display *dpy, int fd); |
1081 | extern XID _XAllocID(Display *dpy); |
1082 | extern void _XAllocIDs(Display *dpy, XID *ids, int count); |
1083 | |
1084 | extern int _XFreeExtData( |
1085 | XExtData* /* extension */ |
1086 | ); |
1087 | |
1088 | extern int (*XESetCreateGC( |
1089 | Display* /* display */, |
1090 | int /* extension */, |
1091 | int (*) ( |
1092 | Display* /* display */, |
1093 | GC /* gc */, |
1094 | XExtCodes* /* codes */ |
1095 | ) /* proc */ |
1096 | ))( |
1097 | Display*, GC, XExtCodes* |
1098 | ); |
1099 | |
1100 | extern int (*XESetCopyGC( |
1101 | Display* /* display */, |
1102 | int /* extension */, |
1103 | int (*) ( |
1104 | Display* /* display */, |
1105 | GC /* gc */, |
1106 | XExtCodes* /* codes */ |
1107 | ) /* proc */ |
1108 | ))( |
1109 | Display*, GC, XExtCodes* |
1110 | ); |
1111 | |
1112 | extern int (*XESetFlushGC( |
1113 | Display* /* display */, |
1114 | int /* extension */, |
1115 | int (*) ( |
1116 | Display* /* display */, |
1117 | GC /* gc */, |
1118 | XExtCodes* /* codes */ |
1119 | ) /* proc */ |
1120 | ))( |
1121 | Display*, GC, XExtCodes* |
1122 | ); |
1123 | |
1124 | extern int (*XESetFreeGC( |
1125 | Display* /* display */, |
1126 | int /* extension */, |
1127 | int (*) ( |
1128 | Display* /* display */, |
1129 | GC /* gc */, |
1130 | XExtCodes* /* codes */ |
1131 | ) /* proc */ |
1132 | ))( |
1133 | Display*, GC, XExtCodes* |
1134 | ); |
1135 | |
1136 | extern int (*XESetCreateFont( |
1137 | Display* /* display */, |
1138 | int /* extension */, |
1139 | int (*) ( |
1140 | Display* /* display */, |
1141 | XFontStruct* /* fs */, |
1142 | XExtCodes* /* codes */ |
1143 | ) /* proc */ |
1144 | ))( |
1145 | Display*, XFontStruct*, XExtCodes* |
1146 | ); |
1147 | |
1148 | extern int (*XESetFreeFont( |
1149 | Display* /* display */, |
1150 | int /* extension */, |
1151 | int (*) ( |
1152 | Display* /* display */, |
1153 | XFontStruct* /* fs */, |
1154 | XExtCodes* /* codes */ |
1155 | ) /* proc */ |
1156 | ))( |
1157 | Display*, XFontStruct*, XExtCodes* |
1158 | ); |
1159 | |
1160 | extern int (*XESetCloseDisplay( |
1161 | Display* /* display */, |
1162 | int /* extension */, |
1163 | int (*) ( |
1164 | Display* /* display */, |
1165 | XExtCodes* /* codes */ |
1166 | ) /* proc */ |
1167 | ))( |
1168 | Display*, XExtCodes* |
1169 | ); |
1170 | |
1171 | extern int (*XESetError( |
1172 | Display* /* display */, |
1173 | int /* extension */, |
1174 | int (*) ( |
1175 | Display* /* display */, |
1176 | xError* /* err */, |
1177 | XExtCodes* /* codes */, |
1178 | int* /* ret_code */ |
1179 | ) /* proc */ |
1180 | ))( |
1181 | Display*, xError*, XExtCodes*, int* |
1182 | ); |
1183 | |
1184 | extern char* (*XESetErrorString( |
1185 | Display* /* display */, |
1186 | int /* extension */, |
1187 | char* (*) ( |
1188 | Display* /* display */, |
1189 | int /* code */, |
1190 | XExtCodes* /* codes */, |
1191 | char* /* buffer */, |
1192 | int /* nbytes */ |
1193 | ) /* proc */ |
1194 | ))( |
1195 | Display*, int, XExtCodes*, char*, int |
1196 | ); |
1197 | |
1198 | extern void (*XESetPrintErrorValues ( |
1199 | Display* /* display */, |
1200 | int /* extension */, |
1201 | void (*)( |
1202 | Display* /* display */, |
1203 | XErrorEvent* /* ev */, |
1204 | void* /* fp */ |
1205 | ) /* proc */ |
1206 | ))( |
1207 | Display*, XErrorEvent*, void* |
1208 | ); |
1209 | |
1210 | extern Bool (*XESetWireToEvent( |
1211 | Display* /* display */, |
1212 | int /* event_number */, |
1213 | Bool (*) ( |
1214 | Display* /* display */, |
1215 | XEvent* /* re */, |
1216 | xEvent* /* event */ |
1217 | ) /* proc */ |
1218 | ))( |
1219 | Display*, XEvent*, xEvent* |
1220 | ); |
1221 | |
1222 | extern Bool (*XESetWireToEventCookie( |
1223 | Display* /* display */, |
1224 | int /* extension */, |
1225 | Bool (*) ( |
1226 | Display* /* display */, |
1227 | XGenericEventCookie* /* re */, |
1228 | xEvent* /* event */ |
1229 | ) /* proc */ |
1230 | ))( |
1231 | Display*, XGenericEventCookie*, xEvent* |
1232 | ); |
1233 | |
1234 | extern Bool (*XESetCopyEventCookie( |
1235 | Display* /* display */, |
1236 | int /* extension */, |
1237 | Bool (*) ( |
1238 | Display* /* display */, |
1239 | XGenericEventCookie* /* in */, |
1240 | XGenericEventCookie* /* out */ |
1241 | ) /* proc */ |
1242 | ))( |
1243 | Display*, XGenericEventCookie*, XGenericEventCookie* |
1244 | ); |
1245 | |
1246 | |
1247 | extern Status (*XESetEventToWire( |
1248 | Display* /* display */, |
1249 | int /* event_number */, |
1250 | Status (*) ( |
1251 | Display* /* display */, |
1252 | XEvent* /* re */, |
1253 | xEvent* /* event */ |
1254 | ) /* proc */ |
1255 | ))( |
1256 | Display*, XEvent*, xEvent* |
1257 | ); |
1258 | |
1259 | extern Bool (*XESetWireToError( |
1260 | Display* /* display */, |
1261 | int /* error_number */, |
1262 | Bool (*) ( |
1263 | Display* /* display */, |
1264 | XErrorEvent* /* he */, |
1265 | xError* /* we */ |
1266 | ) /* proc */ |
1267 | ))( |
1268 | Display*, XErrorEvent*, xError* |
1269 | ); |
1270 | |
1271 | extern void (*XESetBeforeFlush( |
1272 | Display* /* display */, |
1273 | int /* error_number */, |
1274 | void (*) ( |
1275 | Display* /* display */, |
1276 | XExtCodes* /* codes */, |
1277 | _Xconst char* /* data */, |
1278 | long /* len */ |
1279 | ) /* proc */ |
1280 | ))( |
1281 | Display*, XExtCodes*, _Xconst char*, long |
1282 | ); |
1283 | |
1284 | /* internal connections for IMs */ |
1285 | |
1286 | typedef void (*_XInternalConnectionProc)( |
1287 | Display* /* dpy */, |
1288 | int /* fd */, |
1289 | XPointer /* call_data */ |
1290 | ); |
1291 | |
1292 | |
1293 | extern Status _XRegisterInternalConnection( |
1294 | Display* /* dpy */, |
1295 | int /* fd */, |
1296 | _XInternalConnectionProc /* callback */, |
1297 | XPointer /* call_data */ |
1298 | ); |
1299 | |
1300 | extern void _XUnregisterInternalConnection( |
1301 | Display* /* dpy */, |
1302 | int /* fd */ |
1303 | ); |
1304 | |
1305 | extern void _XProcessInternalConnection( |
1306 | Display* /* dpy */, |
1307 | struct _XConnectionInfo* /* conn_info */ |
1308 | ); |
1309 | |
1310 | /* Display structure has pointers to these */ |
1311 | |
1312 | struct _XConnectionInfo { /* info from _XRegisterInternalConnection */ |
1313 | int fd; |
1314 | _XInternalConnectionProc read_callback; |
1315 | XPointer call_data; |
1316 | XPointer *watch_data; /* set/used by XConnectionWatchProc */ |
1317 | struct _XConnectionInfo *next; |
1318 | }; |
1319 | |
1320 | struct _XConnWatchInfo { /* info from XAddConnectionWatch */ |
1321 | XConnectionWatchProc fn; |
1322 | XPointer client_data; |
1323 | struct _XConnWatchInfo *next; |
1324 | }; |
1325 | |
1326 | #ifdef __UNIXOS2__ |
1327 | extern char* __XOS2RedirRoot( |
1328 | char* |
1329 | ); |
1330 | #endif |
1331 | |
1332 | extern int _XTextHeight( |
1333 | XFontStruct* /* font_struct */, |
1334 | _Xconst char* /* string */, |
1335 | int /* count */ |
1336 | ); |
1337 | |
1338 | extern int _XTextHeight16( |
1339 | XFontStruct* /* font_struct */, |
1340 | _Xconst XChar2b* /* string */, |
1341 | int /* count */ |
1342 | ); |
1343 | |
1344 | #if defined(WIN32) |
1345 | |
1346 | extern int _XOpenFile( |
1347 | _Xconst char* /* path */, |
1348 | int /* flags */ |
1349 | ); |
1350 | |
1351 | extern int _XOpenFileMode( |
1352 | _Xconst char* /* path */, |
1353 | int /* flags */, |
1354 | mode_t /* mode */ |
1355 | ); |
1356 | |
1357 | extern void* _XFopenFile( |
1358 | _Xconst char* /* path */, |
1359 | _Xconst char* /* mode */ |
1360 | ); |
1361 | |
1362 | extern int _XAccessFile( |
1363 | _Xconst char* /* path */ |
1364 | ); |
1365 | #else |
1366 | #define _XOpenFile(path,flags) open(path,flags) |
1367 | #define _XOpenFileMode(path,flags,mode) open(path,flags,mode) |
1368 | #define _XFopenFile(path,mode) fopen(path,mode) |
1369 | #endif |
1370 | |
1371 | /* EvToWire.c */ |
1372 | extern Status _XEventToWire(Display *dpy, XEvent *re, xEvent *event); |
1373 | |
1374 | extern int _XF86LoadQueryLocaleFont( |
1375 | Display* /* dpy */, |
1376 | _Xconst char* /* name*/, |
1377 | XFontStruct** /* xfp*/, |
1378 | Font* /* fidp */ |
1379 | ); |
1380 | |
1381 | extern void _XProcessWindowAttributes ( |
1382 | register Display *dpy, |
1383 | xChangeWindowAttributesReq *req, |
1384 | register unsigned long valuemask, |
1385 | register XSetWindowAttributes *attributes); |
1386 | |
1387 | extern int _XDefaultError( |
1388 | Display *dpy, |
1389 | XErrorEvent *event); |
1390 | |
1391 | extern int _XDefaultIOError( |
1392 | Display *dpy); |
1393 | |
1394 | extern void _XSetClipRectangles ( |
1395 | register Display *dpy, |
1396 | GC gc, |
1397 | int clip_x_origin, int clip_y_origin, |
1398 | XRectangle *rectangles, |
1399 | int n, |
1400 | int ordering); |
1401 | |
1402 | Status _XGetWindowAttributes( |
1403 | register Display *dpy, |
1404 | Window w, |
1405 | XWindowAttributes *attr); |
1406 | |
1407 | int _XPutBackEvent ( |
1408 | register Display *dpy, |
1409 | register XEvent *event); |
1410 | |
1411 | extern Bool _XIsEventCookie( |
1412 | Display *dpy, |
1413 | XEvent *ev); |
1414 | |
1415 | extern void _XFreeEventCookies( |
1416 | Display *dpy); |
1417 | |
1418 | extern void _XStoreEventCookie( |
1419 | Display *dpy, |
1420 | XEvent *ev); |
1421 | |
1422 | extern Bool _XFetchEventCookie( |
1423 | Display *dpy, |
1424 | XGenericEventCookie *ev); |
1425 | |
1426 | extern Bool _XCopyEventCookie( |
1427 | Display *dpy, |
1428 | XGenericEventCookie *in, |
1429 | XGenericEventCookie *out); |
1430 | |
1431 | /* lcFile.c */ |
1432 | |
1433 | extern 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 | |