1 #ifndef _UNIX_GUTS_H_
2 #define _UNIX_GUTS_H_
3 
4 #include "generic/config.h"
5 #if defined(HAS_GLIBC) && !defined(_GNU_SOURCE)
6 #	define _GNU_SOURCE
7 #endif
8 #define Drawable        XDrawable
9 #define Font            XFont
10 #define Window          XWindow
11 #undef  Bool
12 #include <X11/X.h>
13 #include <X11/Xlib.h>
14 #include <X11/Xutil.h>
15 #include <X11/Xatom.h>
16 #define Box _prima_Box
17 #undef TRUE
18 #undef FALSE
19 #include <X11/Xregion.h>
20 #undef Box
21 #define Box BoxRec
22 #undef Box
23 #include <X11/Xresource.h>
24 #include <X11/cursorfont.h>
25 #ifdef HAVE_X11_EXTENSIONS_XRENDER_H
26 #include <X11/extensions/Xrender.h>
27 #endif
28 #ifdef HAVE_X11_EXTENSIONS_SHAPE_H
29 #include <X11/extensions/shape.h>
30 #endif
31 #if defined( HAVE_X11_EXTENSIONS_XSHM_H) && defined( HAVE_SYS_IPC_H) && defined( HAVE_SYS_SHM_H)
32 #include <sys/ipc.h>
33 #include <sys/shm.h>
34 #include <X11/extensions/XShm.h>
35 #define USE_MITSHM      1
36 #endif
37 #if defined(HAVE_X11_XFT_XFT_H) && defined(HAVE_FONTCONFIG_FONTCONFIG_H) && defined(HAVE_X11_EXTENSIONS_XRENDER_H) && defined(HAVE_FREETYPE_FREETYPE_H)
38 #include <X11/Xft/Xft.h>
39 #include <fontconfig/fontconfig.h>
40 #include FT_OUTLINE_H
41 #  if XFT_MAJOR > 1 && FC_MAJOR > 1
42 #     define USE_XFT
43 #  endif
44 #  if XFT_VERSION < 20112
45 #     define NEED_X11_EXTENSIONS_XRENDER_H
46 #  endif
47 #endif
48 #ifdef HAVE_X11_EXTENSIONS_XRANDR_H
49 #include <X11/extensions/Xrandr.h>
50 #endif
51 #ifdef HAVE_X11_EXTENSIONS_XCOMPOSITE_H
52 #include <X11/extensions/Xcomposite.h>
53 #endif
54 #ifdef HAVE_X11_XCURSOR_XCURSOR_H
55 #include <X11/Xcursor/Xcursor.h>
56 #endif
57 
58 #ifdef WITH_FRIBIDI
59 #include <fribidi/fribidi.h>
60 #define ANALYSIS FriBidiLevel
61 #else
62 #define ANALYSIS Byte
63 #endif
64 
65 #undef Font
66 #undef Drawable
67 #undef Bool
68 #undef Window
69 #define ComplexShape 0
70 #define XBool int
71 #undef Complex
72 
73 #ifndef Button6
74 #define Button6		6
75 #endif
76 #ifndef Button7
77 #define Button7		7
78 #endif
79 #ifndef Button8
80 #define Button8		8
81 #endif
82 #ifndef Button9
83 #define Button9		9
84 #endif
85 #ifndef Button10
86 #define Button10	10
87 #endif
88 #ifndef Button11
89 #define Button11	11
90 #endif
91 #ifndef Button12
92 #define Button12	12
93 #endif
94 #ifndef Button13
95 #define Button13	13
96 #endif
97 #ifndef Button14
98 #define Button14	14
99 #endif
100 #ifndef Button15
101 #define Button15	15
102 #endif
103 #ifndef Button16
104 #define Button16	16
105 #endif
106 #ifndef Button6Mask
107 #define Button6Mask     (1<<13)
108 #endif
109 #ifndef Button7Mask
110 #define Button7Mask     (1<<14)
111 #endif
112 
113 #include <unistd.h>
114 #include <string.h>
115 #include <fcntl.h>
116 #include <sys/time.h>
117 
118 #include "../guts.h"
119 #include "queue.h"
120 #include "Widget.h"
121 #include "Image.h"
122 #include "img_conv.h"
123 
124 #ifdef USE_MITSHM
125 /* at least some versions of XShm.h do not prototype XShmGetEventBase() */
126 extern int XShmGetEventBase( Display*);
127 #endif
128 
129 typedef struct _PrimaXImage
130 {
131 	Bool shm;
132 	Bool can_free;
133 	int ref_cnt;
134 	void *data_alias;
135 	int bytes_per_line_alias;
136 	XImage *image;
137 #ifdef USE_MITSHM
138 	XShmSegmentInfo xmem;
139 #endif
140 } PrimaXImage;
141 
142 
143 #define CACHE_INVALID        0
144 #define CACHE_BITMAP         1
145 #define CACHE_PIXMAP         2
146 #define CACHE_LOW_RES        3
147 #define CACHE_LAYERED        4
148 #define CACHE_LAYERED_ALPHA  5
149 #define CACHE_A8             6
150 
151 typedef struct {
152 	int type;
153 	PrimaXImage *image;
154 	PrimaXImage *icon;
155 } ImageCache;
156 
157 typedef struct _RequestInformation
158 {
159 	unsigned long request;
160 	char *file;
161 	int line;
162 } RequestInformation, *PRequestInformation;
163 
164 #define REQUEST_RING_SIZE 512
165 
166 #define kbModKeyMask	0x00010000
167 #define kbCodeCharMask	0x00020000
168 #define kbVirtualMask	0x00040000
169 #define kbFunctionMask	0x00080000
170 
171 typedef struct _FontFlags {
172 	unsigned height           : 1;
173 	unsigned width            : 1;
174 	unsigned style            : 1;
175 	unsigned pitch            : 1;
176 	unsigned direction        : 1;
177 	unsigned resolution       : 1;
178 	unsigned name             : 1;
179 	unsigned encoding         : 1;
180 	unsigned size             : 1;
181 	unsigned codepage         : 1;
182 	unsigned family           : 1;
183 	unsigned vector           : 1;
184 	unsigned ascent           : 1;
185 	unsigned descent          : 1;
186 	unsigned weight           : 1;
187 	unsigned maximalWidth     : 1;
188 	unsigned internalLeading  : 1;
189 	unsigned externalLeading  : 1;
190 	unsigned xDeviceRes       : 1;
191 	unsigned yDeviceRes       : 1;
192 	unsigned firstChar        : 1;
193 	unsigned lastChar         : 1;
194 	unsigned breakChar        : 1;
195 	unsigned defaultChar      : 1;
196 	/* extras */
197 	unsigned bad_vector	     : 1;
198 	unsigned sloppy           : 1;
199 	unsigned disabled         : 1;
200 	unsigned funky            : 1;
201 	unsigned heights_cache    : 1;
202 	unsigned known            : 1;
203 } FontFlags;
204 
205 typedef struct _FontInfo {
206 	FontFlags    flags;
207 	Font         font;
208 	char        *vecname;
209 	char        *xname;
210 	short int    name_offset;
211 	short int    info_offset;
212 	int          heights_cache[2];
213 } FontInfo, *PFontInfo;
214 
215 typedef struct _RotatedFont {
216 	double       direction;
217 	int          first1;
218 	int          first2;
219 	int          height;
220 	int          width;
221 	int          length;
222 	PrimaXImage**map;
223 	Point        shift;
224 	Point        dimension;
225 	Point        orgBox;
226 	Pixmap       arena;
227 	GC           arena_gc;
228 	Byte        *arena_bits;
229 	int          lineSize;
230 	int          defaultChar1;
231 	int          defaultChar2;
232 	Fixed        sin, cos, sin2, cos2;
233 	struct       RotatedFont *next;
234 } RotatedFont, *PRotatedFont;
235 
236 typedef struct CachedFont {
237 	FontFlags    flags;
238 	Font         font;
239 	XFontStruct *fs;
240 	XFont        id;
241 	PRotatedFont rotated;
242 	int          underlinePos;
243 	int          underlineThickness;
244 	int          refCnt;
245 #ifdef USE_XFT
246 	XftFont     *xft;
247 	XftFont     *xft_no_aa;
248 	XftFont     *xft_base;
249 #endif
250 } CachedFont, *PCachedFont;
251 
252 typedef struct _FontKey
253 {
254 	int height;
255 	int width;
256 	int style;
257 	int pitch;
258 	int direction;
259 	int vector;
260 	char name[ 256];
261 } FontKey, *PFontKey;
262 
263 #define MAX_HGS_SIZE 5
264 
265 typedef struct
266 {
267 	int sp;
268 	int locked;
269 	int target;
270 	int xlfd[MAX_HGS_SIZE];
271 	int prima[MAX_HGS_SIZE];
272 } HeightGuessStack;
273 
274 union _unix_sys_data;
275 
276 #define FIRST_SYS_TIMER         ((Handle)11)
277 #define CURSOR_TIMER	        ((Handle)11)
278 #define MENU_TIMER	        ((Handle)12)
279 #define MENU_UNFOCUS_TIMER	((Handle)13)
280 #define LAST_SYS_TIMER          ((Handle)13)
281 
282 #if defined(sgi) && !defined(__GNUC__)
283 /* multiple compilation and runtime errors otherwise. must be some alignment tricks */
284 #define COMPONENT_SYS_DATA_ALIGN  unsigned dummy : 20;
285 #else
286 #define COMPONENT_SYS_DATA_ALIGN
287 #endif
288 
289 #define COMPONENT_SYS_DATA                                                  \
290 	Handle self;                                                        \
291 	struct {                                                            \
292 		unsigned application           : 1;                         \
293 		unsigned bitmap                : 1;                         \
294 		unsigned dbm                   : 1;                         \
295 		unsigned drawable              : 1;                         \
296 		unsigned icon                  : 1;                         \
297 		unsigned image                 : 1;                         \
298 		unsigned menu                  : 1;                         \
299 		unsigned pixmap                : 1;                         \
300 		unsigned popup                 : 1;                         \
301 		unsigned timer                 : 1;                         \
302 		unsigned widget                : 1;                         \
303 		unsigned window                : 1;                         \
304 		COMPONENT_SYS_DATA_ALIGN                                    \
305 	} type;                                                             \
306 	XrmQuarkList q_class_name;                                          \
307 	XrmQuarkList q_instance_name;                                       \
308 	int n_class_name;                                                   \
309 	int n_instance_name
310 
311 typedef struct _timer_sys_data
312 {
313 	COMPONENT_SYS_DATA;
314 	int timeout;
315 	Handle who;
316 	struct _timer_sys_data *older;
317 	struct _timer_sys_data *younger;
318 	struct timeval when;
319 } TimerSysData, *PTimerSysData;
320 
321 typedef struct
322 {
323 	Region region;
324 	int aperture;
325 } RegionSysData, *PRegionSysData;
326 
327 struct  _drawable_sys_data;
328 
329 #define VIRGIN_GC_MASK  (       GCBackground    \
330 			|       GCCapStyle      \
331 			|       GCClipMask      \
332 			|       GCForeground    \
333 			|       GCFunction      \
334 			|       GCJoinStyle     \
335 			|       GCFillRule      \
336 			|       GCFillStyle      \
337 			|       GCTileStipXOrigin \
338 			|       GCTileStipYOrigin \
339 			|       GCLineStyle     \
340 			|       GCLineWidth     \
341 			|       GCSubwindowMode )
342 
343 typedef struct gc_list
344 {
345 	GC gc;
346 	TAILQ_ENTRY(gc_list) gc_link;
347 } GCList;
348 
349 TAILQ_HEAD(gc_head,gc_list);
350 
351 typedef struct pending_event
352 {
353 	Handle recipient;
354 	Event event;
355 	TAILQ_ENTRY(pending_event) peventq_link;
356 } PendingEvent;
357 
358 typedef struct configure_event_pair
359 {
360 	TAILQ_ENTRY(configure_event_pair) link;
361 	int w, h, match;
362 } ConfigureEventPair;
363 
364 #define COLOR_R(x) (((x)>>16)&0xFF)
365 #define COLOR_G(x) (((x)>>8)&0xFF)
366 #define COLOR_B(x) ((x)&0xFF)
367 #define COLOR_R16(x) (((x)>>8)&0xFF00)
368 #define COLOR_G16(x) ((x)&0xFF00)
369 #define COLOR_B16(x) (((x)<<8)&0xFF00)
370 
371 #define LPAL_ADDR(i)  (i)>>2
372 #define LPAL_MASK(i)  (3<<(((i)&3)*2))
373 #define LPAL_SET(i,j) (((j)&3)<<(((i)&3)*2))
374 #define LPAL_GET(i,j) (((j)>>(((i)&3)*2))&3)
375 
376 extern int
377 prima_lpal_get( Byte * palette, int index);
378 
379 extern void
380 prima_lpal_set( Byte * palette, int index, int rank);
381 
382 #define wlpal_get(widget,index)      prima_lpal_get(X(widget)->palette,index)
383 #define wlpal_set(widget,index,rank) prima_lpal_set(X(widget)->palette,index,rank)
384 
385 /* Every color cell in guts.palette is assigned a rank. Its purpose
386 is to maintain reasonable sharing of available system colors.
387 See prima_palette_replace which preforms sharing. */
388 #define RANK_IMMUTABLE 4 /* Static color for 'cubic' filtering - or for Static visuals */
389 #define RANK_LOCKED    3 /* Colors used in Pixmaps - cannot participate in palette managing, therefore 'locked' */
390 #define RANK_PRIORITY  2 /* Colors explicitly set by Widget::set_palette */
391 #define RANK_NORMAL    1 /* Automatically allocated colors for drawing routines */
392 #define RANK_FREE      0 /* Colors not allocated by XAllocColor. Their values are not reliable */
393 
394 #define RGB_COMPOSITE(R,G,B) ((((R)&0xFF)<<16)|(((G)&0xFF)<<8)|((B)&0xFF))
395 
396 typedef struct {
397 	Byte  r, g, b;
398 	Byte  rank;
399 	Bool  touched;
400 	long  composite;
401 	List  users;
402 } MainColorEntry;
403 
404 typedef struct {
405 	unsigned long  primary;
406 	unsigned long  secondary;
407 	Color          color;
408 	Byte           balance; /* 0-63 */
409 } Brush;
410 
411 #define AI_FXA_RESOLUTION_X               0
412 #define AI_FXA_RESOLUTION_Y               1
413 #define AI_FXA_PIXEL_SIZE                 2
414 #define AI_FXA_SPACING                    3
415 #define AI_FXA_RELATIVE_WEIGHT            4
416 #define AI_FXA_FOUNDRY                    5
417 #define AI_FXA_AVERAGE_WIDTH              6
418 #define AI_FXA_CHARSET_REGISTRY           7
419 #define AI_FXA_CHARSET_ENCODING           8
420 #define AI_CREATE_EVENT                   9
421 #define AI_WM_DELETE_WINDOW              10
422 #define AI_WM_PROTOCOLS                  11
423 #define AI_WM_TAKE_FOCUS                 12
424 #define AI_NET_WM_STATE                  13
425 #define AI_NET_WM_STATE_SKIP_TASKBAR     14
426 #define AI_NET_WM_STATE_MAXIMIZED_VERT   15
427 #define AI_NET_WM_STATE_MAXIMIZED_HORZ   16
428 #define AI_NET_WM_NAME                   17
429 #define AI_NET_WM_ICON_NAME              18
430 #define AI_UTF8_STRING                   19
431 #define AI_TARGETS                       20
432 #define AI_INCR                          21
433 #define AI_PIXEL                         22
434 #define AI_FOREGROUND                    23
435 #define AI_BACKGROUND                    24
436 #define AI_MOTIF_WM_HINTS                25
437 #define AI_NET_WM_STATE_MODAL            26
438 #define AI_NET_SUPPORTED                 27
439 #define AI_NET_WM_STATE_MAXIMIZED_HORIZ  28
440 #define AI_UTF8_MIME                     29
441 #define AI_NET_WM_STATE_STAYS_ON_TOP     30
442 #define AI_NET_CURRENT_DESKTOP           31
443 #define AI_NET_WORKAREA                  32
444 #define AI_NET_WM_STATE_ABOVE            33
445 #define AI_XdndEnter                     34
446 #define AI_XdndPosition                  35
447 #define AI_XdndStatus                    36
448 #define AI_XdndTypeList                  37
449 #define AI_XdndActionCopy                38
450 #define AI_XdndDrop                      39
451 #define AI_XdndLeave                     40
452 #define AI_XdndFinished                  41
453 #define AI_XdndSelection                 42
454 #define AI_XdndProxy                     43
455 #define AI_XdndAware                     44
456 #define AI_XdndActionMove                45
457 #define AI_XdndActionLink                46
458 #define AI_XdndActionAsk                 47
459 #define AI_XdndActionPrivate             48
460 #define AI_XdndActionList                49
461 #define AI_XdndActionDescription         50
462 #define AI_PLAINTEXT_MIME                51
463 #define AI_count                         52
464 
465 #define FXA_RESOLUTION_X            pguts->atoms[AI_FXA_RESOLUTION_X           ]
466 #define FXA_RESOLUTION_Y            pguts->atoms[AI_FXA_RESOLUTION_Y           ]
467 #define FXA_POINT_SIZE              XA_POINT_SIZE
468 #define FXA_PIXEL_SIZE              pguts->atoms[AI_FXA_PIXEL_SIZE             ]
469 #define FXA_SPACING                 pguts->atoms[AI_FXA_SPACING                ]
470 #define FXA_WEIGHT                  XA_WEIGHT
471 #define FXA_RELATIVE_WEIGHT         pguts->atoms[AI_FXA_RELATIVE_WEIGHT        ]
472 #define FXA_FOUNDRY                 pguts->atoms[AI_FXA_FOUNDRY                ]
473 #define FXA_FAMILY_NAME             XA_FAMILY_NAME
474 #define FXA_AVERAGE_WIDTH           pguts->atoms[AI_FXA_AVERAGE_WIDTH          ]
475 #define FXA_CHARSET_REGISTRY        pguts->atoms[AI_FXA_CHARSET_REGISTRY       ]
476 #define FXA_CHARSET_ENCODING        pguts->atoms[AI_FXA_CHARSET_ENCODING       ]
477 #define FXA_CAP_HEIGHT              XA_CAP_HEIGHT
478 #define CREATE_EVENT                pguts->atoms[AI_CREATE_EVENT               ]
479 #define WM_DELETE_WINDOW            pguts->atoms[AI_WM_DELETE_WINDOW           ]
480 #define WM_PROTOCOLS                pguts->atoms[AI_WM_PROTOCOLS               ]
481 #define WM_TAKE_FOCUS               pguts->atoms[AI_WM_TAKE_FOCUS              ]
482 #define NET_WM_STATE                pguts->atoms[ AI_NET_WM_STATE              ]
483 #define NET_WM_STATE_SKIP_TASKBAR   pguts->atoms[AI_NET_WM_STATE_SKIP_TASKBAR  ]
484 #define NET_WM_STATE_MAXIMIZED_VERT pguts->atoms[AI_NET_WM_STATE_MAXIMIZED_VERT]
485 #define NET_WM_STATE_MAXIMIZED_HORZ pguts->atoms[(pguts-> net_wm_maximize_HORZ_vs_HORIZ > 0) ? pguts-> net_wm_maximize_HORZ_vs_HORIZ : AI_NET_WM_STATE_MAXIMIZED_HORZ]
486 #define NET_WM_NAME                 pguts->atoms[AI_NET_WM_NAME                ]
487 #define NET_WM_ICON_NAME            pguts->atoms[AI_NET_WM_ICON_NAME           ]
488 #define UTF8_STRING                 pguts->atoms[AI_UTF8_STRING                ]
489 #define CF_TARGETS                  pguts->atoms[AI_TARGETS                    ]
490 #define XA_INCR                     pguts->atoms[AI_INCR                       ]
491 #define CF_PIXEL                    pguts->atoms[AI_PIXEL                      ]
492 #define CF_FOREGROUND               pguts->atoms[AI_FOREGROUND                 ]
493 #define CF_BACKGROUND               pguts->atoms[AI_BACKGROUND                 ]
494 #define XA_MOTIF_WM_HINTS           pguts->atoms[AI_MOTIF_WM_HINTS             ]
495 #define NET_WM_STATE_MODAL          pguts->atoms[AI_NET_WM_STATE_MODAL         ]
496 #define NET_SUPPORTED               pguts->atoms[AI_NET_SUPPORTED              ]
497 #define UTF8_MIME                   pguts->atoms[AI_UTF8_MIME                  ]
498 #define NET_WM_STATE_STAYS_ON_TOP   pguts->atoms[AI_NET_WM_STATE_STAYS_ON_TOP  ]
499 #define NET_CURRENT_DESKTOP         pguts->atoms[AI_NET_CURRENT_DESKTOP        ]
500 #define NET_WORKAREA                pguts->atoms[AI_NET_WORKAREA               ]
501 #define NET_WM_STATE_ABOVE          pguts->atoms[AI_NET_WM_STATE_ABOVE         ]
502 #define XdndEnter                   pguts->atoms[AI_XdndEnter                  ]
503 #define XdndPosition                pguts->atoms[AI_XdndPosition               ]
504 #define XdndStatus                  pguts->atoms[AI_XdndStatus                 ]
505 #define XdndTypeList                pguts->atoms[AI_XdndTypeList               ]
506 #define XdndActionCopy              pguts->atoms[AI_XdndActionCopy             ]
507 #define XdndDrop                    pguts->atoms[AI_XdndDrop                   ]
508 #define XdndLeave                   pguts->atoms[AI_XdndLeave                  ]
509 #define XdndFinished                pguts->atoms[AI_XdndFinished               ]
510 #define XdndSelection               pguts->atoms[AI_XdndSelection              ]
511 #define XdndProxy                   pguts->atoms[AI_XdndProxy                  ]
512 #define XdndAware                   pguts->atoms[AI_XdndAware                  ]
513 #define XdndActionMove              pguts->atoms[AI_XdndActionMove             ]
514 #define XdndActionLink              pguts->atoms[AI_XdndActionLink             ]
515 #define XdndActionAsk               pguts->atoms[AI_XdndActionAsk              ]
516 #define XdndActionPrivate           pguts->atoms[AI_XdndActionPrivate          ]
517 #define XdndActionList              pguts->atoms[AI_XdndActionList             ]
518 #define XdndActionDescription       pguts->atoms[AI_XdndActionDescription      ]
519 #define PLAINTEXT_MIME              pguts->atoms[AI_PLAINTEXT_MIME             ]
520 
521 #define DEBUG_FONTS 0x01
522 #define DEBUG_CLIP  0x02
523 #define DEBUG_EVENT 0x04
524 #define DEBUG_MISC  0x08
525 #define DEBUG_COLOR 0x10
526 #define DEBUG_XRDB  0x20
527 #define DEBUG_ALL   0x3f
528 #define _debug prima_debug
529 extern int
530 prima_debug( const char *format, ...);
531 #define Fdebug if (pguts->debug & DEBUG_FONTS) _debug
532 #define Cdebug if (pguts->debug & DEBUG_CLIP) _debug
533 #define Edebug if (pguts->debug & DEBUG_EVENT) _debug
534 #define Mdebug if (pguts->debug & DEBUG_MISC) _debug
535 #define Pdebug if (pguts->debug & DEBUG_COLOR) _debug
536 #define Xdebug if (pguts->debug & DEBUG_XRDB) _debug
537 #define _F_DEBUG_PITCH(x) ((x==fpDefault)?"default":(x==fpFixed?"fixed":"variable"))
538 #define _F_DEBUG_STYLE(x) prima_font_debug_style(x)
539 
540 typedef struct
541 {
542 	unsigned int red_shift, green_shift, blue_shift, alpha_shift;
543 	unsigned int red_range, green_range, blue_range, alpha_range;
544 	unsigned int red_mask,  green_mask,  blue_mask,  alpha_mask;
545 } RGBABitDescription, *PRGBABitDescription;
546 
547 typedef struct
548 {
549 	int status; /* -1 not ok to use, 0 not initialized, 1, ok to use */
550 	Point hot_spot;
551 	Cursor cursor;
552 	Pixmap xor;
553 	Pixmap and;
554 #ifdef HAVE_X11_XCURSOR_XCURSOR_H
555 	XcursorImage * xcursor;
556 #endif
557 } CustomPointer;
558 
559 #define MAX_UNICODE_HEX_LENGTH 6
560 
561 typedef struct _UnixGuts
562 {
563 	/* Event management */
564 	Time                         click_time_frame;
565 	Time                         double_click_time_frame;
566 	PHash                        clipboards;
567 	PHash                        clipboard_xfers;
568 	Atom *                       clipboard_formats;
569 	int                          clipboard_formats_count;
570 	long                         clipboard_event_timeout;
571 	fd_set                       excpt_set;
572 	PList                        files;
573 	long                         handled_events;
574 	XButtonEvent                 last_button_event;
575 	XButtonEvent                 last_click;
576 	Time                         last_time;
577 	int (*                       main_error_handler   )(Display*,XErrorEvent*);
578 	int                          max_fd;
579 	int                          modal_count;
580 	TAILQ_HEAD(,pending_event)   peventq;
581 	fd_set                       read_set;
582 	long                         total_events;
583 	long                         skipped_events;
584 	long                         unhandled_events;
585 	fd_set                       write_set;
586 	/* Graphics */
587 	struct gc_head               bitmap_gc_pool;
588 	struct gc_head               screen_gc_pool;
589 	struct gc_head               argb_gc_pool;
590 	GC                                   menugc;
591 	TAILQ_HEAD(,_drawable_sys_data)      paintq;
592 	PHash                                ximages;
593 	/* Font management */
594 	PHash                        font_hash;
595 	PFontInfo                    font_info;
596 	char                       **font_names;
597 	int                          n_fonts;
598 	XFontStruct                 *pointer_font;
599 	Bool                         default_font_ok;
600 	Font                         default_font;
601 	Font                         default_menu_font;
602 	Font                         default_widget_font;
603 	Font                         default_msg_font;
604 	Font                         default_caption_font;
605 	int                          no_scaled_fonts;
606 	/* Resource management */
607 	XrmDatabase                  db;
608 	XrmQuark                     qBlinkinvisibletime;
609 	XrmQuark                     qblinkinvisibletime;
610 	XrmQuark                     qBlinkvisibletime;
611 	XrmQuark                     qblinkvisibletime;
612 	XrmQuark                     qClicktimeframe;
613 	XrmQuark                     qclicktimeframe;
614 	XrmQuark                     qDoubleclicktimeframe;
615 	XrmQuark                     qdoubleclicktimeframe;
616 	XrmQuark                     qString;
617 	XrmQuark                     qWheeldown;
618 	XrmQuark                     qwheeldown;
619 	XrmQuark                     qWheelup;
620 	XrmQuark                     qwheelup;
621 	XrmQuark                     qSubmenudelay;
622 	XrmQuark                     qsubmenudelay;
623 	XrmQuark                     qScrollfirst;
624 	XrmQuark                     qscrollfirst;
625 	XrmQuark                     qScrollnext;
626 	XrmQuark                     qscrollnext;
627 	/* Timers & cursors */
628 	unsigned int                 cursor_height;
629 	Point                        cursor_pixmap_size;
630 	Pixmap                       cursor_save;
631 	Bool                         cursor_shown;
632 	unsigned int                 cursor_width;
633 	Pixmap                       cursor_xor;
634 	Bool                         cursor_layered;
635 	Bool                         insert;
636 	int                          invisible_timeout;
637 	struct _timer_sys_data      *oldest;
638 	int                          visible_timeout;
639 	/* Window management */
640 	Handle                       focused;
641 	PHash                        menu_windows;
642 	PHash                        windows;
643 	/* XServer info */
644 	int                          bit_order;
645 	unsigned char                buttons_map[256];
646 	int                          byte_order;
647 	int                          connection;
648 	int                          depth;
649 	Display                     *display;
650 	int                          machine_byte_order;
651 	int                          idepth; /* image depth; can be 32 if depth == 24 */
652 	int                          qdepth; /* image depth for querying */
653 	int                          argb_depth; /* image depth for xrender RGBA */
654 	struct {
655 		long XDrawArcs;
656 		long XDrawLines;
657 		long XDrawRectangles;
658 		long XDrawSegments;
659 		long XFillArcs;
660 		long XFillPolygon;
661 		long XFillRectangles;
662 		long request_length;
663 	}                            limits;
664 	Bool                         local_connection;
665 	Cursor                       null_pointer;
666 	int                          pointer_invisible_count; /* 0 is visible, > 0 is not, can't be <0 */
667 	int                          mouse_buttons;
668 	int                          mouse_wheel_down;
669 	int                          mouse_wheel_up;
670 	Point                        resolution;
671 	RequestInformation           ri[REQUEST_RING_SIZE];
672 	int                          ri_head;
673 	int                          ri_tail;
674 	int                          screen_number;
675 	Bool                         shape_extension;
676 	int                          shape_event;
677 	int                          shape_error;
678 	Bool                         shared_image_extension;
679 	int                          shared_image_completion_event;
680 	Bool                         xshmattach_failed;
681 	int                          use_xft;
682 	Bool                         xft_priority;
683 	Bool                         xft_disable_large_fonts;
684 	int                          xft_xrender_major_opcode;
685 	Bool                         xft_no_antialias;
686 	Bool                         randr_extension;
687 	Bool                         render_extension;
688 	Bool                         composite_extension;
689 	int                          composite_opcode;
690 	Bool                         composite_error_triggered;
691 	struct MsgDlg               *message_boxes;
692 	XWindow                      grab_redirect;
693 	Handle                       grab_widget;
694 	Point                        grab_translate_mouse;
695 	Handle                       grab_confine;
696 	int                          scroll_first;
697 	int                          scroll_next;
698 	Handle                       currentMenu;
699 	Time                         currentFocusTime;
700 	Handle                       unfocusedMenu;
701 	int                          menu_timeout;
702 	XWindow                      root;
703 	XVisualInfo                  visual;
704 	int                          visualClass;
705 	XVisualInfo                  argb_visual;
706 #ifdef HAVE_X11_EXTENSIONS_XRENDER_H
707 	XRenderPictFormat *          xrender_display_format;
708 	XRenderPictFormat *          xrender_argb32_format;
709 	XRenderPictFormat *          xrender_a8_format;
710 	XRenderPictFormat *          xrender_a1_format;
711 #endif
712 	Bool                         xrender_pen_dirty;
713 	MainColorEntry *             palette;
714 	int                          mappingPlace[256];
715 	unsigned long                monochromeMap[2];
716 	int                          palSize;
717 	int                          localPalSize;
718 	int *                        systemColorMap;
719 	int                          systemColorMapSize;
720 	int                          colorCubeRib;
721 	Bool                         dynamicColors;
722 	Bool                         grayScale;
723 	Bool                         useDithering;
724 	Bool                         privateColormap;
725 	Colormap                     defaultColormap;
726 	Colormap                     argbColormap;
727 	FillPattern *                ditherPatterns;
728 	Point                        displaySize;
729 	long                         wm_event_timeout;
730 	RGBABitDescription           screen_bits;
731 	RGBABitDescription           argb_bits;
732 	Point                        ellipseDivergence;
733 	int                          appLock;
734 	XGCValues                    cursor_gcv;
735 	TimerSysData                 sys_timers[ LAST_SYS_TIMER - FIRST_SYS_TIMER + 1];
736 	Bool                         applicationClose;
737 	char                         locale[32];
738 	XFontStruct *                font_abc_nil_hack;
739 	Atom                         atoms[AI_count];
740 	XTextProperty                hostname;
741 	unsigned int			debug;
742 	Bool                         icccm_only;
743 	Bool                         net_wm_maximization;
744 	int                          net_wm_maximize_HORZ_vs_HORIZ;
745 	int                          use_gtk;
746 	int                          use_quartz;
747 	Bool                         use_harfbuzz;
748 	Bool                         is_xwayland;
749 	/* DND: Common */
750 	Handle                       xdnd_clipboard;
751 	int                          xdnd_disabled;
752 	/* DND: Receiver */
753 	Handle                       xdndr_receiver, xdndr_widget, xdndr_last_target;
754 	XWindow                      xdndr_source;
755 	long                         xdndr_timestamp;
756 	int                          xdndr_version, xdndr_last_action, xdndr_action_list_cache;
757 	Bool                         xdndr_last_drop_response;
758 	Box                          xdndr_suppress_events_within; /* in prima coordinates */
759 	/* DND: Sender */
760 	Handle                       xdnds_widget;
761 	XWindow                      xdnds_sender, xdnds_target;
762 	int                          xdnds_version, xdnds_last_action, xdnds_last_action_response;
763 	Bool                         xdnds_last_drop_response, xdnds_escape_key, xdnds_finished;
764 	Bool                         xdnds_default_pointers;
765 	Box                          xdnds_suppress_events_within; /* in root coordinates */
766 
767 	CustomPointer                xdnd_pointers[5]; /* none,copy,link,move,ask */
768 
769 	int                          unicode_hex_input_flags;
770 	char                         unicode_hex_input_buffer[MAX_UNICODE_HEX_LENGTH + 1];
771 
772 	Bool                         application_stop_signal;
773 } UnixGuts;
774 
775 extern UnixGuts  guts;
776 extern UnixGuts* pguts;
777 
778 #define XCHECKPOINT						\
779 	STMT_START {							\
780 		pguts-> ri[ pguts-> ri_head]. line = __LINE__;			\
781 		pguts-> ri[ pguts-> ri_head]. file = __FILE__;			\
782 		pguts-> ri[ pguts-> ri_head]. request = NextRequest(DISP);	\
783 		pguts-> ri_head++;						\
784 		if ( pguts-> ri_head >= REQUEST_RING_SIZE)			\
785 			pguts-> ri_head = 0;					\
786 		if ( pguts-> ri_tail == pguts-> ri_head) {			\
787 			pguts-> ri_tail++;					\
788 			if ( pguts-> ri_tail >= REQUEST_RING_SIZE)		\
789 				pguts-> ri_tail = 0;					\
790 		}								\
791 	} STMT_END
792 
793 #define APC_BAD_SIZE INT_MAX
794 #define APC_BAD_ORIGIN INT_MAX
795 
796 
797 #define XT_IS_APPLICATION(x)    ((x)->type.application)
798 #define XT_IS_BITMAP(x)         ((x)->type.bitmap)
799 #define XT_IS_DBM(x)            ((x)->type.dbm)
800 #define XT_IS_DRAWABLE(x)       ((x)->type.drawable)
801 #define XT_IS_ICON(x)           ((x)->type.icon)
802 #define XT_IS_IMAGE(x)          ((x)->type.image)
803 #define XT_IS_MENU(x)           ((x)->type.menu)
804 #define XT_IS_PIXMAP(x)         ((x)->type.pixmap)
805 #define XT_IS_POPUP(x)          ((x)->type.popup)
806 #define XT_IS_TIMER(x)          ((x)->type.timer)
807 #define XT_IS_WIDGET(x)         ((x)->type.widget)
808 #define XT_IS_WINDOW(x)         ((x)->type.window)
809 
810 typedef struct _drawable_sys_data
811 {
812 	COMPONENT_SYS_DATA;
813 	XDrawable udrawable;
814 	XDrawable gdrawable;
815 	XWindow parent;
816 	Point origin, size, bsize;
817 	Point transform, gtransform, btransform;
818 	Point ackOrigin, ackSize, ackFrameSize;
819 	int menuHeight;
820 	int menuColorImmunity;
821 	Point decorationSize;
822 	Handle owner;  /* The real one */
823 	XWindow real_parent; /* top levels */
824 	XWindow parentHandle; /* top levels */
825 	XWindow above;
826 	Rect zoomRect;
827 	XGCValues gcv;
828 	GC gc;
829 	GCList *gcl;
830 	Brush fore, back;
831 	Color saved_fore, saved_back;
832 	ColorSet colors;
833 	Region invalid_region, paint_region, current_region, cached_region;
834 	XRectangle clip_rect;
835 	FillPattern fill_pattern, saved_fill_pattern;
836 	Point fill_pattern_offset, saved_fill_pattern_offset;
837 	int fill_mode, saved_fill_mode;
838 	Pixmap fp_pixmap;
839 #if defined(sgi) && !defined(__GNUC__)
840 /* multiple compilation and runtime errors otherwise. must be some alignment tricks */
841 	char dummy_b_1[2];
842 #endif
843 	int rop, paint_rop;
844 	int rop2, paint_rop2;
845 	int alpha, paint_alpha;
846 	int line_style;
847 	float line_width, paint_line_width, miter_limit;
848 	unsigned char *dashes, *paint_dashes;
849 	int ndashes, paint_ndashes;
850 	Point clip_mask_extent, shape_extent, shape_offset;
851 	PCachedFont font;
852 	Font saved_font;
853 	Point cursor_pos;
854 	Point cursor_size;
855 	CustomPointer user_pointer;
856 	int pointer_id;
857 	Cursor actual_pointer;
858 	void * recreateData;
859 	XWindow client;
860 	struct {
861 		unsigned antialias                : 1;
862 		unsigned saved_antialias          : 1;
863 		unsigned base_line                : 1;
864 		unsigned brush_fore               : 1;
865 		unsigned brush_back               : 1;
866 		unsigned brush_null_hatch         : 1;
867 		unsigned clip_by_children	  : 1;
868 		unsigned clip_owner	          : 1;
869 		unsigned configured               : 1;
870 		unsigned cursor_visible		  : 1;
871 		unsigned dnd_aware                : 1;
872 		unsigned drop_target              : 1;
873 		unsigned enabled               	  : 1;
874 		unsigned exposed                  : 1;
875 		unsigned falsely_hidden           : 1;
876 		unsigned first_click              : 1;
877 		unsigned force_flush              : 1;
878 		unsigned grab                     : 1;
879 		unsigned has_icon                 : 1;
880 		unsigned layered                  : 1;
881 		unsigned layered_requested        : 1;
882 		unsigned iconic                   : 1;
883 		unsigned mapped                   : 1;
884 		unsigned modal                    : 1;
885 		unsigned kill_current_region      : 1;
886 		unsigned opaque                   : 1;
887 		unsigned paint                    : 1;
888 		unsigned paint_base_line          : 1;
889 		unsigned paint_opaque             : 1;
890 		unsigned paint_pending            : 1;
891 		unsigned pointer_obscured         : 1;
892 		unsigned position_determined      : 1;
893 		unsigned reload_font              : 1;
894 		unsigned sizeable                 : 1;
895 		unsigned sizemax_set              : 1;
896 		unsigned sync_paint               : 1;
897 		unsigned task_listed              : 1;
898 		unsigned title_utf8               : 1;
899 		unsigned transparent              : 1;
900 		unsigned transparent_busy         : 1;
901 		unsigned want_visible             : 1;
902 		unsigned withdrawn                : 1;
903 		unsigned zoomed                   : 1;
904 		unsigned xft_clip                 : 1;
905 	} flags;
906 	ImageCache image_cache;
907 	Handle preexec_focus;
908 	TAILQ_ENTRY(_drawable_sys_data) paintq_link;
909 	TAILQ_HEAD(,configure_event_pair)    configure_pairs;
910 	Byte * palette;
911 	int borderIcons;
912 	XVisualInfo * visual;
913 	Colormap colormap;
914 #ifdef USE_XFT
915 	XftDraw  * xft_drawable;
916 	uint32_t * xft_map8;
917 	double     xft_font_cos;
918 	double     xft_font_sin;
919 	XftDraw  * xft_shadow_drawable;
920 	Point      xft_shadow_extentions;
921 	Pixmap     xft_shadow_pixmap;
922 	GC         xft_shadow_gc;
923 #endif
924 #ifdef HAVE_X11_EXTENSIONS_XRENDER_H
925 	Picture    argb_picture;
926 #endif
927 } DrawableSysData, *PDrawableSysData;
928 
929 #define XF_ENABLED(x)   ((x)->flags.enabled)
930 #define XF_IN_PAINT(x)  ((x)->flags.paint)
931 #define XF_LAYERED(x)  ((x)->flags.layered)
932 #define XFLUSH          if (XX->flags.force_flush) XFlush(DISP)
933 
934 #define MenuTimerMessage   1021
935 
936 #define MENU_ITEM_GAP 4
937 #define MENU_XOFFSET 5
938 #define MENU_CHECK_XOFFSET 10
939 
940 typedef struct
941 {
942 	Bool is_mono;
943 	Bool use_stippling;
944 	Handle xor;
945 	Handle and;
946 	long fore, back;
947 } MenuBitmap, *PMenuBitmap;
948 
949 typedef struct _menu_item
950 {
951 	int          x;
952 	int          y;
953 	int          width;
954 	int          height;
955 	int          accel_width;
956 	int          icon_width;
957 	MenuBitmap   bitmap, icon;
958 } UnixMenuItem, *PUnixMenuItem;
959 
960 typedef struct _menu_window
961 {
962 	Handle               self;
963 	XWindow              w;
964 	Point                sz;
965 	Point                pos;
966 	PMenuItemReg         m;
967 	int                  num;
968 	PUnixMenuItem        um;
969 	struct _menu_window *next;
970 	struct _menu_window *prev;
971 	int                  selected;
972 	int                  right;
973 	int                  last;
974 	int                  first;
975 	Region               rgn;
976 #ifdef HAVE_X11_EXTENSIONS_XRENDER_H
977 	Picture              argb_picture;
978 #endif
979 } MenuWindow, *PMenuWindow;
980 
981 #define MENU_PALETTE_SIZE (ciMaxId + 2)
982 typedef struct _menu_sys_data
983 {
984 	COMPONENT_SYS_DATA;
985 	Bool                 paint_pending;
986 	PMenuWindow          w;
987 	MenuWindow           wstatic;
988 	PCachedFont          font;
989 	int                  guillemots;
990 	Bool                 layered;
991 	unsigned long        c[MENU_PALETTE_SIZE];
992 	unsigned long        argb_c[MENU_PALETTE_SIZE];
993 	Color                rgb[MENU_PALETTE_SIZE];
994 	XWindow              focus;
995 	PMenuWindow          focused;
996 } MenuSysData, *PMenuSysData;
997 
998 #define cfTargets    (cfCustom  + 0)
999 #define cfCOUNT      (cfTargets + 1)
1000 /* XXX not implemented
1001 #define cfPalette    (cfCustom  + 1)
1002 #define cfForeground (cfCustom  + 2)
1003 #define cfBackground (cfCustom  + 3)
1004 #define cfCOUNT      (cfCustom  + 4)
1005 */
1006 
1007 #define CF_32        (sizeof(long)*8)        /* 32-bit properties are hacky */
1008 
1009 typedef struct {
1010 	IV size;
1011 	unsigned char * data;
1012 	Handle image;
1013 	Atom name;
1014 	Bool immediate;
1015 } ClipboardDataItem, *PClipboardDataItem;
1016 
1017 typedef struct _clipboard_sys_data
1018 {
1019 	COMPONENT_SYS_DATA;
1020 	Atom                 selection;
1021 	Atom                 target;
1022 	Bool                 opened;
1023 	Bool                 inside_event;
1024 	Bool                 need_write;
1025 	Handle               selection_owner;
1026 	PClipboardDataItem   external;
1027 	PClipboardDataItem   internal;
1028 	PList                xfers;
1029 	Bool                 xdnd_sending, xdnd_receiving;
1030 } ClipboardSysData, *PClipboardSysData;
1031 
1032 typedef struct
1033 {
1034 	Handle               self;
1035 	unsigned char      * data;
1036 	unsigned long        size;
1037 	unsigned int         blocks;
1038 	unsigned int         offset;
1039 	Bool                 data_detached;
1040 	Bool                 data_master;
1041 	long                 id;
1042 	XWindow              requestor;
1043 	Atom                 property;
1044 	Atom                 target;
1045 	int                  format;
1046 	struct timeval       time;
1047 	unsigned long        delay;
1048 } ClipboardXfer;
1049 
1050 typedef unsigned char ClipboardXferKey[sizeof(XWindow)+sizeof(Atom)];
1051 
1052 #define CLIPBOARD_XFER_KEY(key,window,property) \
1053 	memcpy(key,&window,sizeof(XWindow));\
1054 	memcpy(((unsigned char*)key) + sizeof(XWindow),&property,sizeof(Atom))
1055 
1056 typedef union _unix_sys_data
1057 {
1058 	ClipboardSysData             clipboard;
1059 	struct {
1060 		COMPONENT_SYS_DATA;
1061 	}                            component;
1062 	DrawableSysData              drawable;
1063 	MenuSysData                  menu;
1064 	TimerSysData                 timer;
1065 	RegionSysData                region;
1066 } UnixSysData, *PUnixSysData;
1067 
1068 #define DISP		(pguts-> display)
1069 #define SCREEN		(pguts-> screen_number)
1070 #define VISUAL          (pguts-> visual. visual)
1071 #define DRIN		pguts-> display, pguts-> screen_number
1072 #define X_WINDOW	(PComponent(self)-> handle)
1073 #define X(obj)		((PDrawableSysData)(PComponent((obj))-> sysData))
1074 #define DEFXX		PDrawableSysData selfxx = (self == NULL_HANDLE ? NULL : X(self))
1075 #define M(obj)		((PMenuSysData)(PComponent((obj))-> sysData))
1076 #define DEFMM           PMenuSysData selfxx = ((PMenuSysData)(PComponent((self))-> sysData))
1077 #define C(obj)		((PClipboardSysData)(PComponent((obj))-> sysData))
1078 #define DEFCC		PClipboardSysData selfxx = C(self)
1079 #define XX		selfxx
1080 #define WHEEL_DELTA	120
1081 #define GET_RGBA_DESCRIPTION X(self)->flags.layered ? &guts. argb_bits : &guts. screen_bits
1082 #define GET_REGION(obj) (&((PUnixSysData)(PComponent((obj))-> sysData))->region)
1083 
1084 typedef U8 ColorComponent;
1085 
1086 extern UnixGuts *
1087 prima_unix_guts(void);
1088 
1089 extern Handle
1090 prima_xw2h( XWindow win);
1091 
1092 extern void
1093 prima_handle_event( XEvent *ev, XEvent *next_event);
1094 
1095 extern void
1096 prima_handle_menu_event( XEvent *ev, XWindow win, Handle self);
1097 
1098 extern void
1099 prima_handle_selection_event( XEvent *ev, XWindow win, Handle self);
1100 
1101 extern void
1102 prima_save_xerror_event( XErrorEvent *xr);
1103 
1104 extern void
1105 prima_restore_xerror_event( XErrorEvent *xr);
1106 
1107 extern void
1108 prima_get_gc( PDrawableSysData);
1109 
1110 extern void
1111 prima_rebuild_watchers( void);
1112 
1113 extern void
1114 prima_release_gc( PDrawableSysData);
1115 
1116 extern Bool
1117 prima_init_clipboard_subsystem( char * error_buf);
1118 
1119 extern Bool
1120 prima_init_font_subsystem( char * error_buf);
1121 
1122 extern Bool
1123 prima_font_subsystem_set_option( char *, char *);
1124 
1125 extern Bool
1126 prima_init_color_subsystem( char * error_buf);
1127 
1128 extern Bool
1129 prima_init_xrender_subsystem( char * error_buf);
1130 
1131 extern Bool
1132 prima_find_color_mask_range( unsigned long mask, unsigned int * shift, unsigned int * range);
1133 
1134 extern Bool
1135 prima_color_subsystem_set_option( char *, char *);
1136 
1137 extern void
1138 prima_done_color_subsystem( void);
1139 
1140 extern void
1141 prima_done_xrender_subsystem( void);
1142 
1143 extern int
1144 prima_color_find( Handle self, long color, int maxDiff, int * diff, int maxRank);
1145 
1146 extern Bool
1147 prima_palette_replace( Handle self, Bool fast);
1148 
1149 #define COLORHINT_NONE  0
1150 #define COLORHINT_BLACK 1
1151 #define COLORHINT_WHITE 2
1152 
1153 #define LOGCOLOR_BLACK 0
1154 #define LOGCOLOR_WHITE (pguts->palSize?(pguts->palSize-1):0xffffffff)
1155 
1156 extern Color
1157 prima_map_color( Color color, int * hint);
1158 
1159 extern unsigned long
1160 prima_allocate_color( Handle self, Color color, Brush * brush);
1161 
1162 extern void
1163 prima_palette_free( Handle self, Bool priority);
1164 
1165 extern Bool
1166 prima_palette_alloc( Handle self);
1167 
1168 extern Bool
1169 prima_color_add_ref( Handle self, int index, int rank);
1170 
1171 extern int
1172 prima_color_sync( void);
1173 
1174 extern Pixmap
1175 prima_get_hatch( FillPattern * fp);
1176 
1177 extern void
1178 prima_copy_xybitmap( unsigned char *data, const unsigned char *idata, int w, int h, int ls, int ils);
1179 
1180 extern void
1181 prima_mirror_bytes( unsigned char *data, int dataSize);
1182 
1183 extern Bool
1184 prima_create_icon_pixmaps( Handle bw_icon, Pixmap *xor, Pixmap *and);
1185 
1186 extern ImageCache*
1187 prima_image_cache( PImage img, int type);
1188 
1189 extern Bool
1190 prima_put_ximage( XDrawable win, GC gc, PrimaXImage *i,
1191 		int src_x, int src_y, int dst_x, int dst_y,
1192 		int width, int height);
1193 
1194 extern Bool
1195 prima_query_image( Handle self, XImage * image);
1196 
1197 extern Bool
1198 prima_std_query_image( Handle self, Pixmap px);
1199 
1200 extern Pixmap
1201 prima_std_pixmap( Handle self, int type);
1202 
1203 #ifdef HAVE_X11_EXTENSIONS_XRENDER_H
1204 
1205 #define DELETE_ARGB_PICTURE(x) if ((x)) { \
1206 	XRenderFreePicture( DISP, x);     \
1207 	x = 0;                            \
1208 }
1209 
1210 #define CLIP_ARGB_PICTURE(x,region) if ((x)) \
1211 	XRenderSetPictureClipRegion(DISP, x, region);
1212 
1213 #define CREATE_ARGB_PICTURE(drawable, depth, target) \
1214 	if ( guts.render_extension) target = prima_render_create_picture(drawable, depth)
1215 
1216 extern Picture
1217 prima_render_create_picture(XDrawable drawable, int depth);
1218 
1219 #else
1220 
1221 #define CREATE_ARGB_PICTURE(drawable, depth, target)
1222 #define DELETE_ARGB_PICTURE(x)
1223 #define CLIP_ARGB_PICTURE(x,region)
1224 
1225 #endif
1226 
1227 extern void
1228 prima_cleanup_drawable_after_painting( Handle self);
1229 
1230 extern void
1231 prima_cleanup_font_subsystem( void);
1232 
1233 extern void
1234 prima_cursor_tick( void);
1235 
1236 extern void
1237 prima_no_cursor( Handle self);
1238 
1239 extern Cursor
1240 prima_null_pointer( void);
1241 
1242 #define WAIT_NEVER   0
1243 #define WAIT_ALWAYS  1
1244 #define WAIT_IF_NONE 2
1245 
1246 extern Bool
1247 prima_one_loop_round( int wait, Bool careOfApplication);
1248 
1249 extern void
1250 prima_prepare_drawable_for_painting( Handle self, Bool inside_on_paint);
1251 
1252 extern Bool
1253 prima_simple_message( Handle self, int cmd, Bool is_post);
1254 
1255 extern void
1256 prima_update_cursor( Handle self);
1257 
1258 extern Bool
1259 prima_update_rotated_fonts( PCachedFont f, const char * text, int len, Bool wide,
1260 	double direction, PRotatedFont *result, Bool * ok_to_not_rotate);
1261 
1262 extern void
1263 prima_free_rotated_entry( PCachedFont f);
1264 
1265 #define frUnix_int 1000
1266 
1267 extern int
1268 unix_rm_get_int( Handle self, XrmQuark class_detail, XrmQuark name_detail, int default_value);
1269 
1270 extern void
1271 prima_rect_union( XRectangle *t, const XRectangle *s);
1272 
1273 extern void
1274 prima_rect_intersect( XRectangle *t, const XRectangle *s);
1275 
1276 extern void
1277 prima_send_create_event( XWindow win);
1278 
1279 extern void
1280 prima_gc_ximages( void);
1281 
1282 extern void
1283 prima_ximage_event( XEvent*);
1284 
1285 extern PrimaXImage*
1286 prima_prepare_ximage( int width, int height, int format);
1287 
1288 extern Bool
1289 prima_free_ximage( PrimaXImage *i);
1290 
1291 extern int
1292 prima_rop_map( int rop);
1293 
1294 extern void
1295 prima_gp_get_clip_rect( Handle self, XRectangle *cr, Bool for_internal_paints);
1296 
1297 extern XWindow
1298 prima_find_frame_window( XWindow w);
1299 
1300 extern Bool
1301 prima_get_frame_info( Handle self, PRect r);
1302 
1303 extern void
1304 prima_send_cmSize( Handle self, Point oldSize);
1305 
1306 extern Bool
1307 prima_no_input( PDrawableSysData XX, Bool ignore_horizon, Bool beep);
1308 
1309 extern void
1310 process_transparents( Handle self);
1311 
1312 extern Bool
1313 apc_window_set_visible( Handle self, Bool show);
1314 
1315 extern void
1316 apc_SetWMNormalHints( Handle self, XSizeHints * hints);
1317 
1318 extern Bool
1319 prima_window_reset_menu( Handle self, int newMenuHeight);
1320 
1321 extern void
1322 prima_end_menu(void);
1323 
1324 extern int
1325 prima_handle_menu_shortcuts( Handle self, XEvent * ev, KeySym keysym);
1326 
1327 extern void
1328 prima_wm_sync( Handle self, int eventType);
1329 
1330 extern Bool
1331 prima_wm_net_state_read_maximization( XWindow window, Atom property);
1332 
1333 extern unsigned char *
1334 prima_get_window_property( XWindow window, Atom property, Atom req_type, Atom * actual_type,
1335 			int * actual_format, unsigned long * nitems);
1336 
1337 extern PFontABC
1338 prima_xfont2abc( XFontStruct * fs, int firstChar, int lastChar);
1339 
1340 extern PCachedFont
1341 prima_find_known_font( PFont font, Bool refill, Bool bySize);
1342 
1343 extern void
1344 prima_font_pp2font( char * ppFontNameSize, PFont font);
1345 
1346 extern void
1347 prima_build_font_key( PFontKey key, PFont f, Bool bySize);
1348 
1349 extern Bool
1350 prima_core_font_pick( Handle self, Font * source, Font * dest);
1351 
1352 extern Bool
1353 prima_core_font_encoding( char * encoding);
1354 
1355 extern void
1356 prima_init_try_height( HeightGuessStack * p, int target, int firstMove );
1357 
1358 extern int
1359 prima_try_height( HeightGuessStack * p, int height);
1360 
1361 extern void
1362 prima_utf8_to_wchar( const char * utf8, XChar2b * u16, int src_len_bytes, int target_len_xchars);
1363 
1364 extern XChar2b *
1365 prima_alloc_utf8_to_wchar( const char * utf8, int length_chars);
1366 
1367 extern void
1368 prima_wchar2char( char * dest, XChar2b * src, int lim);
1369 
1370 extern void
1371 prima_char2wchar( XChar2b * dest, char * src, int lim);
1372 
1373 extern XCharStruct *
1374 prima_char_struct( XFontStruct * xs, void * c, Bool wide);
1375 
1376 extern Color**
1377 prima_standard_colors(void);
1378 
1379 struct MsgDlg {
1380 	struct MsgDlg * next;
1381 	Font  * font;
1382 	Point   btnPos;
1383 	Point   btnSz;
1384 	Bool    wide;
1385 	char ** wrapped;
1386 	int     count;
1387 	int     wrappedCount;
1388 	int    *widths, *lengths;
1389 	int     OKwidth;
1390 	Point   textPos;
1391 	Bool    active;
1392 	Bool    pressed;
1393 	Bool    grab;
1394 	int     fontId;
1395 	Point   winSz;
1396 	GC      gc;
1397 	unsigned long fg, l3d, d3d;
1398 	Brush   bg;
1399 	XWindow w;
1400 	int     focus_revertTo;
1401 	XWindow focus;
1402 };
1403 
1404 extern void
1405 prima_msgdlg_event( XEvent* ev, struct MsgDlg * md);
1406 
1407 typedef void (*RETSIGTYPE)(int);
1408 
1409 #undef XDestroyImage
1410 #define XDestroyImage prima_XDestroyImage
1411 extern void
1412 prima_XDestroyImage( XImage * x);
1413 
1414 typedef int (*XIfEventProcType)(Display*,XEvent*,XPointer);
1415 
1416 #endif
1417 
1418 #ifdef USE_XFT
1419 
1420 extern void
1421 prima_xft_init( void);
1422 
1423 extern void
1424 prima_xft_init_font_substitution( void);
1425 
1426 extern void
1427 prima_xft_done( void);
1428 
1429 extern void
1430 prima_xft_gp_destroy( Handle self );
1431 
1432 extern Bool
1433 prima_xft_font_pick( Handle self, Font * source, Font * dest, double * size, XftFont ** xft_result);
1434 
1435 extern Bool
1436 prima_xft_set_font( Handle self, PFont font);
1437 
1438 extern PFont
1439 prima_xft_fonts( PFont array, const char *facename, const char * encoding, int *retCount);
1440 
1441 extern void
1442 prima_xft_font_encodings( PHash hash);
1443 
1444 extern int
1445 prima_xft_get_text_width( PCachedFont self, const char * text, int len,
1446 			int flags, uint32_t * map8,
1447 			Point * overhangs);
1448 
1449 extern int
1450 prima_xft_get_glyphs_width( PCachedFont self, PGlyphsOutRec glyphs,
1451 			Point * overhangs);
1452 
1453 extern Point *
1454 prima_xft_get_text_box( Handle self, const char * text, int len, int flags);
1455 
1456 extern Point *
1457 prima_xft_get_glyphs_box( Handle self, PGlyphsOutRec glyphs);
1458 
1459 extern Bool
1460 prima_xft_text_out( Handle self, const char * text, int x, int y, int len, int flags);
1461 
1462 extern Bool
1463 prima_xft_glyphs_out( Handle self, PGlyphsOutRec glyphs, int x, int y);
1464 
1465 extern unsigned long *
1466 prima_xft_get_font_ranges( Handle self, int * count);
1467 
1468 extern char *
1469 prima_xft_get_font_languages( Handle self);
1470 
1471 extern PFontABC
1472 prima_xft_get_font_abc( Handle self, int firstChar, int lastChar, int flags);
1473 
1474 extern PFontABC
1475 prima_xft_get_font_def( Handle self, int firstChar, int lastChar, int flags);
1476 
1477 extern int
1478 prima_xft_get_glyph_outline( Handle self, int index, int flags, int ** buffer);
1479 
1480 extern PCachedFont
1481 prima_xft_get_cache( PFont font);
1482 
1483 extern uint32_t *
1484 prima_xft_map8( const char * encoding);
1485 
1486 extern Bool
1487 prima_xft_parse( char * ppFontNameSize, Font * font);
1488 
1489 extern void
1490 prima_xft_update_region( Handle self);
1491 
1492 extern int
1493 prima_xft_load_font( char * fontName );
1494 
1495 extern Bool
1496 prima_xft_text_shaper_ident( Handle self, PTextShapeRec r);
1497 
1498 extern Bool
1499 prima_xft_text_shaper_bytes( Handle self, PTextShapeRec r);
1500 
1501 #ifdef WITH_HARFBUZZ
1502 extern Bool
1503 prima_xft_text_shaper_harfbuzz( Handle self, PTextShapeRec r);
1504 #endif
1505 
1506 extern unsigned long *
1507 prima_xft_mapper_query_ranges(PFont font, int * count, unsigned int * flags);
1508 
1509 #endif
1510 
1511 #ifdef WITH_GTK
1512 extern Display*
1513 prima_gtk_init( void);
1514 
1515 extern Bool
1516 prima_gtk_done( void);
1517 
1518 extern char *
1519 prima_gtk_openfile( char * params);
1520 
1521 extern Bool
1522 prima_gtk_application_get_bitmap( Handle self, Handle image, int x, int y, int xLen, int yLen);
1523 #endif
1524 
1525 #ifdef WITH_COCOA
1526 extern uint32_t*
1527 prima_cocoa_application_get_bitmap( int x, int y, int xLen, int yLen, int yMax);
1528 
1529 extern char *
1530 prima_cocoa_system_action( char * params);
1531 
1532 extern int
1533 prima_cocoa_is_x11_local(void);
1534 #endif
1535 
1536 typedef struct _ViewProfile {
1537 Point        pos;
1538 Point        size;
1539 Bool         visible;
1540 Bool         focused;
1541 Handle       capture;
1542 char *       title;
1543 int          shape_count;
1544 int          shape_ordering;
1545 XRectangle * shape_rects;
1546 } ViewProfile, *PViewProfile;
1547 
1548 extern void
1549 prima_set_view_ex( Handle self, PViewProfile p);
1550 
1551 extern void
1552 prima_get_view_ex( Handle self, PViewProfile p);
1553 
1554 extern void
1555 prima_notify_sys_handle( Handle self );
1556 
1557 extern int
1558 prima_flush_events( Display * disp, XEvent * ev, Handle self);
1559 
1560 extern const char *
1561 prima_font_debug_style(int style);
1562 
1563 extern Region
1564 prima_region_create( Handle mask);
1565 
1566 extern Handle
1567 prima_find_toplevel_window(Handle self);
1568 
1569 extern Byte*
1570 prima_mirror_bits( void);
1571 
1572 extern int
1573 prima_copy_region_data(void * region);
1574 
1575 #define RPS_OK       0
1576 #define RPS_PARTIAL  1
1577 #define RPS_NODATA   2
1578 #define RPS_ERROR    3
1579 
1580 extern Bool
1581 prima_handle_dnd_event( Handle self, XEvent *xev);
1582 
1583 extern int
1584 prima_read_property( XWindow window, Atom property, Atom * type, int * format,
1585 	unsigned long * size, unsigned char ** data, Bool delete_property);
1586 
1587 extern void
1588 prima_clipboard_kill_item( PClipboardDataItem item, Handle id);
1589 
1590 extern void
1591 prima_detach_xfers( PClipboardSysData XX, Handle id, Bool clear_original_data);
1592 
1593 extern void
1594 prima_clipboard_query_targets( Handle self );
1595 
1596 extern int
1597 prima_clipboard_fill_targets( Handle self);
1598 
1599 extern void
1600 prima_update_dnd_aware( Handle self );
1601 
1602 extern Cursor
1603 prima_get_cursor(Handle self);
1604 
1605