#ifndef _UNIX_GUTS_H_
#define _UNIX_GUTS_H_

#include "generic/config.h"
#define Drawable        XDrawable
#define Font            XFont
#define Window          XWindow
#undef  Bool
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
#define Box _prima_Box
#undef TRUE
#undef FALSE
#include <X11/Xregion.h>
#undef Box
#define Box BoxRec
#undef Box
#include <X11/Xresource.h>
#include <X11/cursorfont.h>
#ifdef HAVE_X11_EXTENSIONS_XRENDER_H
#include <X11/extensions/Xrender.h>
#endif
#ifdef HAVE_X11_EXTENSIONS_SHAPE_H
#include <X11/extensions/shape.h>
#endif
#if defined( HAVE_X11_EXTENSIONS_XSHM_H) && defined( HAVE_SYS_IPC_H) && defined( HAVE_SYS_SHM_H)
#include <sys/ipc.h>
#include <sys/shm.h>
#include <X11/extensions/XShm.h>
#define USE_MITSHM      1
#endif
#if defined(HAVE_X11_XFT_XFT_H) && defined(HAVE_FONTCONFIG_FONTCONFIG_H) && defined(HAVE_X11_EXTENSIONS_XRENDER_H) && defined(HAVE_FREETYPE_FREETYPE_H)
#include <X11/Xft/Xft.h>
#include <fontconfig/fontconfig.h>
#include FT_OUTLINE_H
#  if XFT_MAJOR > 1 && FC_MAJOR > 1
#     define USE_XFT
#  endif
#  if XFT_VERSION < 20112
#     define NEED_X11_EXTENSIONS_XRENDER_H
#  endif
#endif
#ifdef HAVE_X11_EXTENSIONS_XRANDR_H
#include <X11/extensions/Xrandr.h>
#endif
#ifdef HAVE_X11_EXTENSIONS_XCOMPOSITE_H
#include <X11/extensions/Xcomposite.h>
#endif
#ifdef HAVE_X11_XCURSOR_XCURSOR_H
#include <X11/Xcursor/Xcursor.h>
#endif

#ifdef WITH_FRIBIDI
#include <fribidi/fribidi.h>
#define ANALYSIS FriBidiLevel
#else
#define ANALYSIS Byte
#endif

#undef Font
#undef Drawable
#undef Bool
#undef Window
#define ComplexShape 0
#define XBool int
#undef Complex

#ifndef Button6
#define Button6		6
#endif
#ifndef Button7
#define Button7		7
#endif
#ifndef Button8
#define Button8		8
#endif
#ifndef Button9
#define Button9		9
#endif
#ifndef Button10
#define Button10	10
#endif
#ifndef Button11
#define Button11	11
#endif
#ifndef Button12
#define Button12	12
#endif
#ifndef Button13
#define Button13	13
#endif
#ifndef Button14
#define Button14	14
#endif
#ifndef Button15
#define Button15	15
#endif
#ifndef Button16
#define Button16	16
#endif
#ifndef Button6Mask
#define Button6Mask     (1<<13)
#endif
#ifndef Button7Mask
#define Button7Mask     (1<<14)
#endif

#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/time.h>

#include "../guts.h"
#include "queue.h"
#include "Widget.h"
#include "Image.h"
#include "img_conv.h"

#ifdef USE_MITSHM
/* at least some versions of XShm.h do not prototype XShmGetEventBase() */
extern int XShmGetEventBase( Display*);
#endif

typedef struct _PrimaXImage
{
	Bool shm;
	Bool can_free;
	int ref_cnt;
	void *data_alias;
	int bytes_per_line_alias;
	XImage *image;
#ifdef USE_MITSHM
	XShmSegmentInfo xmem;
#endif
} PrimaXImage;


#define CACHE_INVALID        0
#define CACHE_BITMAP         1
#define CACHE_PIXMAP         2
#define CACHE_LOW_RES        3
#define CACHE_LAYERED        4
#define CACHE_LAYERED_ALPHA  5
#define CACHE_A8             6

typedef struct {
	int type;
	PrimaXImage *image;
	PrimaXImage *icon;
} ImageCache;

typedef struct _RequestInformation
{
	unsigned long request;
	char *file;
	int line;
} RequestInformation, *PRequestInformation;

#define REQUEST_RING_SIZE 512

#define kbModKeyMask	0x00010000
#define kbCodeCharMask	0x00020000
#define kbVirtualMask	0x00040000
#define kbFunctionMask	0x00080000

typedef struct _FontFlags {
	unsigned height           : 1;
	unsigned width            : 1;
	unsigned style            : 1;
	unsigned pitch            : 1;
	unsigned direction        : 1;
	unsigned resolution       : 1;
	unsigned name             : 1;
	unsigned encoding         : 1;
	unsigned size             : 1;
	unsigned codepage         : 1;
	unsigned family           : 1;
	unsigned vector           : 1;
	unsigned ascent           : 1;
	unsigned descent          : 1;
	unsigned weight           : 1;
	unsigned maximalWidth     : 1;
	unsigned internalLeading  : 1;
	unsigned externalLeading  : 1;
	unsigned xDeviceRes       : 1;
	unsigned yDeviceRes       : 1;
	unsigned firstChar        : 1;
	unsigned lastChar         : 1;
	unsigned breakChar        : 1;
	unsigned defaultChar      : 1;
	/* extras */
	unsigned bad_vector	     : 1;
	unsigned sloppy           : 1;
	unsigned disabled         : 1;
	unsigned funky            : 1;
	unsigned heights_cache    : 1;
} FontFlags;

typedef struct _FontInfo {
	FontFlags    flags;
	Font         font;
	char        *vecname;
	char        *xname;
	short int    name_offset;
	short int    info_offset;
	int          heights_cache[2];
} FontInfo, *PFontInfo;

typedef struct _RotatedFont {
	double       direction;
	int          first1;
	int          first2;
	int          height;
	int          width;
	int          length;
	PrimaXImage**map;
	Point        shift;
	Point        dimension;
	Point        orgBox;
	Pixmap       arena;
	GC           arena_gc;
	Byte        *arena_bits;
	int          lineSize;
	int          defaultChar1;
	int          defaultChar2;
	Fixed        sin, cos, sin2, cos2;
	struct       RotatedFont *next;
} RotatedFont, *PRotatedFont;

typedef struct CachedFont {
	FontFlags    flags;
	Font         font;
	XFontStruct *fs;
	XFont        id;
	PRotatedFont rotated;
	int          underlinePos;
	int          underlineThickness;
	int          refCnt;
#ifdef USE_XFT
	XftFont     *xft;
	XftFont     *xft_no_aa;
	XftFont     *xft_base;
#endif
} CachedFont, *PCachedFont;

typedef struct _FontKey
{
	int height;
	int width;
	int style;
	int pitch;
	int direction;
	int vector;
	char name[ 256];
} FontKey, *PFontKey;

#define MAX_HGS_SIZE 5

typedef struct
{
	int sp;
	int locked;
	int target;
	int xlfd[MAX_HGS_SIZE];
	int prima[MAX_HGS_SIZE];
} HeightGuessStack;

union _unix_sys_data;

#define FIRST_SYS_TIMER         ((Handle)11)
#define CURSOR_TIMER	        ((Handle)11)
#define MENU_TIMER	        ((Handle)12)
#define MENU_UNFOCUS_TIMER	((Handle)13)
#define LAST_SYS_TIMER          ((Handle)13)

#if defined(sgi) && !defined(__GNUC__)
/* multiple compilation and runtime errors otherwise. must be some alignment tricks */
#define COMPONENT_SYS_DATA_ALIGN  unsigned dummy : 20;
#else
#define COMPONENT_SYS_DATA_ALIGN
#endif

#define COMPONENT_SYS_DATA                                                  \
	Handle self;                                                        \
	struct {                                                            \
		unsigned application           : 1;                         \
		unsigned bitmap                : 1;                         \
		unsigned dbm                   : 1;                         \
		unsigned drawable              : 1;                         \
		unsigned icon                  : 1;                         \
		unsigned image                 : 1;                         \
		unsigned menu                  : 1;                         \
		unsigned pixmap                : 1;                         \
		unsigned popup                 : 1;                         \
		unsigned timer                 : 1;                         \
		unsigned widget                : 1;                         \
		unsigned window                : 1;                         \
		COMPONENT_SYS_DATA_ALIGN                                    \
	} type;                                                             \
	XrmQuarkList q_class_name;                                          \
	XrmQuarkList q_instance_name;                                       \
	int n_class_name;                                                   \
	int n_instance_name

typedef struct _timer_sys_data
{
	COMPONENT_SYS_DATA;
	int timeout;
	Handle who;
	struct _timer_sys_data *older;
	struct _timer_sys_data *younger;
	struct timeval when;
} TimerSysData, *PTimerSysData;

typedef struct
{
	Region region;
	int aperture;
} RegionSysData, *PRegionSysData;

struct  _drawable_sys_data;

#define VIRGIN_GC_MASK  (       GCBackground    \
			|       GCCapStyle      \
			|       GCClipMask      \
			|       GCForeground    \
			|       GCFunction      \
			|       GCJoinStyle     \
			|       GCFillRule      \
			|       GCFillStyle      \
			|       GCTileStipXOrigin \
			|       GCTileStipYOrigin \
			|       GCLineStyle     \
			|       GCLineWidth     \
			|       GCSubwindowMode )

typedef struct gc_list
{
	GC gc;
	TAILQ_ENTRY(gc_list) gc_link;
} GCList;

TAILQ_HEAD(gc_head,gc_list);

typedef struct pending_event
{
	Handle recipient;
	Event event;
	TAILQ_ENTRY(pending_event) peventq_link;
} PendingEvent;

typedef struct configure_event_pair
{
	TAILQ_ENTRY(configure_event_pair) link;
	int w, h, match;
} ConfigureEventPair;

#define COLOR_R(x) (((x)>>16)&0xFF)
#define COLOR_G(x) (((x)>>8)&0xFF)
#define COLOR_B(x) ((x)&0xFF)
#define COLOR_R16(x) (((x)>>8)&0xFF00)
#define COLOR_G16(x) ((x)&0xFF00)
#define COLOR_B16(x) (((x)<<8)&0xFF00)

#define LPAL_ADDR(i)  (i)>>2
#define LPAL_MASK(i)  (3<<(((i)&3)*2))
#define LPAL_SET(i,j) (((j)&3)<<(((i)&3)*2))
#define LPAL_GET(i,j) (((j)>>(((i)&3)*2))&3)

extern int
prima_lpal_get( Byte * palette, int index);

extern void
prima_lpal_set( Byte * palette, int index, int rank);

#define wlpal_get(widget,index)      prima_lpal_get(X(widget)->palette,index)
#define wlpal_set(widget,index,rank) prima_lpal_set(X(widget)->palette,index,rank)

/* Every color cell in guts.palette is assigned a rank. Its purpose
is to maintain reasonable sharing of available system colors.
See prima_palette_replace which preforms sharing. */
#define RANK_IMMUTABLE 4 /* Static color for 'cubic' filtering - or for Static visuals */
#define RANK_LOCKED    3 /* Colors used in Pixmaps - cannot participate in palette managing, therefore 'locked' */
#define RANK_PRIORITY  2 /* Colors explicitly set by Widget::set_palette */
#define RANK_NORMAL    1 /* Automatically allocated colors for drawing routines */
#define RANK_FREE      0 /* Colors not allocated by XAllocColor. Their values are not reliable */

#define RGB_COMPOSITE(R,G,B) ((((R)&0xFF)<<16)|(((G)&0xFF)<<8)|((B)&0xFF))

typedef struct {
	Byte  r, g, b;
	Byte  rank;
	Bool  touched;
	long  composite;
	List  users;
} MainColorEntry;

typedef struct {
	unsigned long  primary;
	unsigned long  secondary;
	Color          color;
	Byte           balance; /* 0-63 */
} Brush;

#define AI_FXA_RESOLUTION_X               0
#define AI_FXA_RESOLUTION_Y               1
#define AI_FXA_PIXEL_SIZE                 2
#define AI_FXA_SPACING                    3
#define AI_FXA_RELATIVE_WEIGHT            4
#define AI_FXA_FOUNDRY                    5
#define AI_FXA_AVERAGE_WIDTH              6
#define AI_FXA_CHARSET_REGISTRY           7
#define AI_FXA_CHARSET_ENCODING           8
#define AI_CREATE_EVENT                   9
#define AI_WM_DELETE_WINDOW              10
#define AI_WM_PROTOCOLS                  11
#define AI_WM_TAKE_FOCUS                 12
#define AI_NET_WM_STATE                  13
#define AI_NET_WM_STATE_SKIP_TASKBAR     14
#define AI_NET_WM_STATE_MAXIMIZED_VERT   15
#define AI_NET_WM_STATE_MAXIMIZED_HORZ   16
#define AI_NET_WM_NAME                   17
#define AI_NET_WM_ICON_NAME              18
#define AI_UTF8_STRING                   19
#define AI_TARGETS                       20
#define AI_INCR                          21
#define AI_PIXEL                         22
#define AI_FOREGROUND                    23
#define AI_BACKGROUND                    24
#define AI_MOTIF_WM_HINTS                25
#define AI_NET_WM_STATE_MODAL            26
#define AI_NET_SUPPORTED                 27
#define AI_NET_WM_STATE_MAXIMIZED_HORIZ  28
#define AI_UTF8_MIME                     29
#define AI_NET_WM_STATE_STAYS_ON_TOP     30
#define AI_NET_CURRENT_DESKTOP           31
#define AI_NET_WORKAREA                  32
#define AI_NET_WM_STATE_ABOVE            33
#define AI_XdndEnter                     34
#define AI_XdndPosition                  35
#define AI_XdndStatus                    36
#define AI_XdndTypeList                  37
#define AI_XdndActionCopy                38
#define AI_XdndDrop                      39
#define AI_XdndLeave                     40
#define AI_XdndFinished                  41
#define AI_XdndSelection                 42
#define AI_XdndProxy                     43
#define AI_XdndAware                     44
#define AI_XdndActionMove                45
#define AI_XdndActionLink                46
#define AI_XdndActionAsk                 47
#define AI_XdndActionPrivate             48
#define AI_XdndActionList                49
#define AI_XdndActionDescription         50
#define AI_PLAINTEXT_MIME                51
#define AI_count                         52

#define FXA_RESOLUTION_X            pguts->atoms[AI_FXA_RESOLUTION_X           ]
#define FXA_RESOLUTION_Y            pguts->atoms[AI_FXA_RESOLUTION_Y           ]
#define FXA_POINT_SIZE              XA_POINT_SIZE
#define FXA_PIXEL_SIZE              pguts->atoms[AI_FXA_PIXEL_SIZE             ]
#define FXA_SPACING                 pguts->atoms[AI_FXA_SPACING                ]
#define FXA_WEIGHT                  XA_WEIGHT
#define FXA_RELATIVE_WEIGHT         pguts->atoms[AI_FXA_RELATIVE_WEIGHT        ]
#define FXA_FOUNDRY                 pguts->atoms[AI_FXA_FOUNDRY                ]
#define FXA_FAMILY_NAME             XA_FAMILY_NAME
#define FXA_AVERAGE_WIDTH           pguts->atoms[AI_FXA_AVERAGE_WIDTH          ]
#define FXA_CHARSET_REGISTRY        pguts->atoms[AI_FXA_CHARSET_REGISTRY       ]
#define FXA_CHARSET_ENCODING        pguts->atoms[AI_FXA_CHARSET_ENCODING       ]
#define FXA_CAP_HEIGHT              XA_CAP_HEIGHT
#define CREATE_EVENT                pguts->atoms[AI_CREATE_EVENT               ]
#define WM_DELETE_WINDOW            pguts->atoms[AI_WM_DELETE_WINDOW           ]
#define WM_PROTOCOLS                pguts->atoms[AI_WM_PROTOCOLS               ]
#define WM_TAKE_FOCUS               pguts->atoms[AI_WM_TAKE_FOCUS              ]
#define NET_WM_STATE                pguts->atoms[ AI_NET_WM_STATE              ]
#define NET_WM_STATE_SKIP_TASKBAR   pguts->atoms[AI_NET_WM_STATE_SKIP_TASKBAR  ]
#define NET_WM_STATE_MAXIMIZED_VERT pguts->atoms[AI_NET_WM_STATE_MAXIMIZED_VERT]
#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]
#define NET_WM_NAME                 pguts->atoms[AI_NET_WM_NAME                ]
#define NET_WM_ICON_NAME            pguts->atoms[AI_NET_WM_ICON_NAME           ]
#define UTF8_STRING                 pguts->atoms[AI_UTF8_STRING                ]
#define CF_TARGETS                  pguts->atoms[AI_TARGETS                    ]
#define XA_INCR                     pguts->atoms[AI_INCR                       ]
#define CF_PIXEL                    pguts->atoms[AI_PIXEL                      ]
#define CF_FOREGROUND               pguts->atoms[AI_FOREGROUND                 ]
#define CF_BACKGROUND               pguts->atoms[AI_BACKGROUND                 ]
#define XA_MOTIF_WM_HINTS           pguts->atoms[AI_MOTIF_WM_HINTS             ]
#define NET_WM_STATE_MODAL          pguts->atoms[AI_NET_WM_STATE_MODAL         ]
#define NET_SUPPORTED               pguts->atoms[AI_NET_SUPPORTED              ]
#define UTF8_MIME                   pguts->atoms[AI_UTF8_MIME                  ]
#define NET_WM_STATE_STAYS_ON_TOP   pguts->atoms[AI_NET_WM_STATE_STAYS_ON_TOP  ]
#define NET_CURRENT_DESKTOP         pguts->atoms[AI_NET_CURRENT_DESKTOP        ]
#define NET_WORKAREA                pguts->atoms[AI_NET_WORKAREA               ]
#define NET_WM_STATE_ABOVE          pguts->atoms[AI_NET_WM_STATE_ABOVE         ]
#define XdndEnter                   pguts->atoms[AI_XdndEnter                  ]
#define XdndPosition                pguts->atoms[AI_XdndPosition               ]
#define XdndStatus                  pguts->atoms[AI_XdndStatus                 ]
#define XdndTypeList                pguts->atoms[AI_XdndTypeList               ]
#define XdndActionCopy              pguts->atoms[AI_XdndActionCopy             ]
#define XdndDrop                    pguts->atoms[AI_XdndDrop                   ]
#define XdndLeave                   pguts->atoms[AI_XdndLeave                  ]
#define XdndFinished                pguts->atoms[AI_XdndFinished               ]
#define XdndSelection               pguts->atoms[AI_XdndSelection              ]
#define XdndProxy                   pguts->atoms[AI_XdndProxy                  ]
#define XdndAware                   pguts->atoms[AI_XdndAware                  ]
#define XdndActionMove              pguts->atoms[AI_XdndActionMove             ]
#define XdndActionLink              pguts->atoms[AI_XdndActionLink             ]
#define XdndActionAsk               pguts->atoms[AI_XdndActionAsk              ]
#define XdndActionPrivate           pguts->atoms[AI_XdndActionPrivate          ]
#define XdndActionList              pguts->atoms[AI_XdndActionList             ]
#define XdndActionDescription       pguts->atoms[AI_XdndActionDescription      ]
#define PLAINTEXT_MIME              pguts->atoms[AI_PLAINTEXT_MIME             ]

#define DEBUG_FONTS 0x01
#define DEBUG_CLIP  0x02
#define DEBUG_EVENT 0x04
#define DEBUG_MISC  0x08
#define DEBUG_COLOR 0x10
#define DEBUG_XRDB  0x20
#define DEBUG_ALL   0x3f
#define _debug prima_debug
extern int
prima_debug( const char *format, ...);
#define Fdebug if (pguts->debug & DEBUG_FONTS) _debug
#define Cdebug if (pguts->debug & DEBUG_CLIP) _debug
#define Edebug if (pguts->debug & DEBUG_EVENT) _debug
#define Mdebug if (pguts->debug & DEBUG_MISC) _debug
#define Pdebug if (pguts->debug & DEBUG_COLOR) _debug
#define Xdebug if (pguts->debug & DEBUG_XRDB) _debug
#define _F_DEBUG_PITCH(x) ((x==fpDefault)?"default":(x==fpFixed?"fixed":"variable"))
#define _F_DEBUG_STYLE(x) prima_font_debug_style(x)

typedef struct
{
	unsigned int red_shift, green_shift, blue_shift, alpha_shift;
	unsigned int red_range, green_range, blue_range, alpha_range;
	unsigned int red_mask,  green_mask,  blue_mask,  alpha_mask;
} RGBABitDescription, *PRGBABitDescription;

typedef struct
{
	int status; /* -1 not ok to use, 0 not initialized, 1, ok to use */
	Point hot_spot;
	Cursor cursor;
	Pixmap xor;
	Pixmap and;
#ifdef HAVE_X11_XCURSOR_XCURSOR_H
	XcursorImage * xcursor;
#endif
} CustomPointer;

#define MAX_UNICODE_HEX_LENGTH 6

typedef struct _UnixGuts
{
	/* Event management */
	Time                         click_time_frame;
	Time                         double_click_time_frame;
	PHash                        clipboards;
	PHash                        clipboard_xfers;
	Atom *                       clipboard_formats;
	int                          clipboard_formats_count;
	long                         clipboard_event_timeout;
	fd_set                       excpt_set;
	PList                        files;
	long                         handled_events;
	XButtonEvent                 last_button_event;
	XButtonEvent                 last_click;
	Time                         last_time;
	int (*                       main_error_handler   )(Display*,XErrorEvent*);
	int                          max_fd;
	int                          modal_count;
	TAILQ_HEAD(,pending_event)   peventq;
	fd_set                       read_set;
	long                         total_events;
	long                         skipped_events;
	long                         unhandled_events;
	fd_set                       write_set;
	/* Graphics */
	struct gc_head               bitmap_gc_pool;
	struct gc_head               screen_gc_pool;
	struct gc_head               argb_gc_pool;
	GC                                   menugc;
	TAILQ_HEAD(,_drawable_sys_data)      paintq;
	PHash                                ximages;
	/* Font management */
	PHash                        font_hash;
	PFontInfo                    font_info;
	char                       **font_names;
	int                          n_fonts;
	XFontStruct                 *pointer_font;
	Bool                         default_font_ok;
	Font                         default_font;
	Font                         default_menu_font;
	Font                         default_widget_font;
	Font                         default_msg_font;
	Font                         default_caption_font;
	int                          no_scaled_fonts;
	/* Resource management */
	XrmDatabase                  db;
	XrmQuark                     qBlinkinvisibletime;
	XrmQuark                     qblinkinvisibletime;
	XrmQuark                     qBlinkvisibletime;
	XrmQuark                     qblinkvisibletime;
	XrmQuark                     qClicktimeframe;
	XrmQuark                     qclicktimeframe;
	XrmQuark                     qDoubleclicktimeframe;
	XrmQuark                     qdoubleclicktimeframe;
	XrmQuark                     qString;
	XrmQuark                     qWheeldown;
	XrmQuark                     qwheeldown;
	XrmQuark                     qWheelup;
	XrmQuark                     qwheelup;
	XrmQuark                     qSubmenudelay;
	XrmQuark                     qsubmenudelay;
	XrmQuark                     qScrollfirst;
	XrmQuark                     qscrollfirst;
	XrmQuark                     qScrollnext;
	XrmQuark                     qscrollnext;
	/* Timers & cursors */
	unsigned int                 cursor_height;
	Point                        cursor_pixmap_size;
	Pixmap                       cursor_save;
	Bool                         cursor_shown;
	unsigned int                 cursor_width;
	Pixmap                       cursor_xor;
	Bool                         cursor_layered;
	Bool                         insert;
	int                          invisible_timeout;
	struct _timer_sys_data      *oldest;
	int                          visible_timeout;
	/* Window management */
	Handle                       focused;
	PHash                        menu_windows;
	PHash                        windows;
	/* XServer info */
	int                          bit_order;
	unsigned char                buttons_map[256];
	int                          byte_order;
	int                          connection;
	int                          depth;
	Display                     *display;
	int                          machine_byte_order;
	int                          idepth; /* image depth; can be 32 if depth == 24 */
	int                          qdepth; /* image depth for querying */
	int                          argb_depth; /* image depth for xrender RGBA */
	struct {
		long XDrawArcs;
		long XDrawLines;
		long XDrawRectangles;
		long XDrawSegments;
		long XFillArcs;
		long XFillPolygon;
		long XFillRectangles;
		long request_length;
	}                            limits;
	Bool                         local_connection;
	Cursor                       null_pointer;
	int                          pointer_invisible_count; /* 0 is visible, > 0 is not, can't be <0 */
	int                          mouse_buttons;
	int                          mouse_wheel_down;
	int                          mouse_wheel_up;
	Point                        resolution;
	RequestInformation           ri[REQUEST_RING_SIZE];
	int                          ri_head;
	int                          ri_tail;
	int                          screen_number;
	Bool                         shape_extension;
	int                          shape_event;
	int                          shape_error;
	Bool                         shared_image_extension;
	int                          shared_image_completion_event;
	Bool                         xshmattach_failed;
	int                          use_xft;
	Bool                         xft_priority;
	Bool                         xft_disable_large_fonts;
	int                          xft_xrender_major_opcode;
	Bool                         xft_no_antialias;
	Bool                         randr_extension;
	Bool                         render_extension;
	Bool                         composite_extension;
	int                          composite_opcode;
	Bool                         composite_error_triggered;
	struct MsgDlg               *message_boxes;
	XWindow                      grab_redirect;
	Handle                       grab_widget;
	Point                        grab_translate_mouse;
	Handle                       grab_confine;
	int                          scroll_first;
	int                          scroll_next;
	Handle                       currentMenu;
	Time                         currentFocusTime;
	Handle                       unfocusedMenu;
	int                          menu_timeout;
	XWindow                      root;
	XVisualInfo                  visual;
	int                          visualClass;
	XVisualInfo                  argb_visual;
#ifdef HAVE_X11_EXTENSIONS_XRENDER_H
	XRenderPictFormat *          xrender_argb_pic_format;
	XRenderPictFormat *          xrender_argb_compat_format;
#endif
	MainColorEntry *             palette;
	int                          mappingPlace[256];
	unsigned long                monochromeMap[2];
	int                          palSize;
	int                          localPalSize;
	int *                        systemColorMap;
	int                          systemColorMapSize;
	int                          colorCubeRib;
	Bool                         dynamicColors;
	Bool                         grayScale;
	Bool                         useDithering;
	Bool                         privateColormap;
	Colormap                     defaultColormap;
	Colormap                     argbColormap;
	FillPattern *                ditherPatterns;
	Point                        displaySize;
	long                         wm_event_timeout;
	RGBABitDescription           screen_bits;
	RGBABitDescription           argb_bits;
	Point                        ellipseDivergence;
	int                          appLock;
	XGCValues                    cursor_gcv;
	TimerSysData                 sys_timers[ LAST_SYS_TIMER - FIRST_SYS_TIMER + 1];
	Bool                         applicationClose;
	char                         locale[32];
	XFontStruct *                font_abc_nil_hack;
	Atom                         atoms[AI_count];
	XTextProperty                hostname;
	unsigned int			debug;
	Bool                         icccm_only;
	Bool                         net_wm_maximization;
	int                          net_wm_maximize_HORZ_vs_HORIZ;
	int                          use_gtk;
	int                          use_quartz;
	Bool                         use_harfbuzz;
	Bool                         is_xwayland;
	/* DND: Common */
	Handle                       xdnd_clipboard;
	int                          xdnd_disabled;
	/* DND: Receiver */
	Handle                       xdndr_receiver, xdndr_widget, xdndr_last_target;
	XWindow                      xdndr_source;
	long                         xdndr_timestamp;
	int                          xdndr_version, xdndr_last_action, xdndr_action_list_cache;
	Bool                         xdndr_last_drop_response;
	Box                          xdndr_suppress_events_within; /* in prima coordinates */
	/* DND: Sender */
	Handle                       xdnds_widget;
	XWindow                      xdnds_sender, xdnds_target;
	int                          xdnds_version, xdnds_last_action, xdnds_last_action_response;
	Bool                         xdnds_last_drop_response, xdnds_escape_key, xdnds_finished;
	Bool                         xdnds_default_pointers;
	Box                          xdnds_suppress_events_within; /* in root coordinates */

	CustomPointer                xdnd_pointers[5]; /* none,copy,link,move,ask */

	int                          unicode_hex_input_flags;
	char                         unicode_hex_input_buffer[MAX_UNICODE_HEX_LENGTH + 1];
} UnixGuts;

extern UnixGuts  guts;
extern UnixGuts* pguts;

#define XCHECKPOINT						\
	STMT_START {							\
		pguts-> ri[ pguts-> ri_head]. line = __LINE__;			\
		pguts-> ri[ pguts-> ri_head]. file = __FILE__;			\
		pguts-> ri[ pguts-> ri_head]. request = NextRequest(DISP);	\
		pguts-> ri_head++;						\
		if ( pguts-> ri_head >= REQUEST_RING_SIZE)			\
			pguts-> ri_head = 0;					\
		if ( pguts-> ri_tail == pguts-> ri_head) {			\
			pguts-> ri_tail++;					\
			if ( pguts-> ri_tail >= REQUEST_RING_SIZE)		\
				pguts-> ri_tail = 0;					\
		}								\
	} STMT_END

#define APC_BAD_SIZE INT_MAX
#define APC_BAD_ORIGIN INT_MAX


#define XT_IS_APPLICATION(x)    ((x)->type.application)
#define XT_IS_BITMAP(x)         ((x)->type.bitmap)
#define XT_IS_DBM(x)            ((x)->type.dbm)
#define XT_IS_DRAWABLE(x)       ((x)->type.drawable)
#define XT_IS_ICON(x)           ((x)->type.icon)
#define XT_IS_IMAGE(x)          ((x)->type.image)
#define XT_IS_MENU(x)           ((x)->type.menu)
#define XT_IS_PIXMAP(x)         ((x)->type.pixmap)
#define XT_IS_POPUP(x)          ((x)->type.popup)
#define XT_IS_TIMER(x)          ((x)->type.timer)
#define XT_IS_WIDGET(x)         ((x)->type.widget)
#define XT_IS_WINDOW(x)         ((x)->type.window)

typedef struct _drawable_sys_data
{
	COMPONENT_SYS_DATA;
	XDrawable udrawable;
	XDrawable gdrawable;
	XWindow parent;
	Point origin, size, bsize;
	Point transform, gtransform, btransform;
	Point ackOrigin, ackSize, ackFrameSize;
	int menuHeight;
	int menuColorImmunity;
	Point decorationSize;
	Handle owner;  /* The real one */
	XWindow real_parent; /* top levels */
	XWindow parentHandle; /* top levels */
	XWindow above;
	Rect zoomRect;
	XGCValues gcv;
	GC gc;
	GCList *gcl;
	Brush fore, back;
	Color saved_fore, saved_back;
	ColorSet colors;
	Region invalid_region, paint_region, current_region, cached_region;
	XRectangle clip_rect;
	FillPattern fill_pattern, saved_fill_pattern;
	Point fill_pattern_offset, saved_fill_pattern_offset;
	int fill_mode, saved_fill_mode;
	Pixmap fp_pixmap;
#if defined(sgi) && !defined(__GNUC__)
/* multiple compilation and runtime errors otherwise. must be some alignment tricks */
	char dummy_b_1[2];
#endif
	int rop, paint_rop;
	int rop2, paint_rop2;
	int line_style, line_width;
	float miter_limit;
	unsigned char *dashes, *paint_dashes;
	int ndashes, paint_ndashes;
	Point clip_mask_extent, shape_extent, shape_offset;
	PCachedFont font;
	Font saved_font;
	Point cursor_pos;
	Point cursor_size;
	CustomPointer user_pointer;
	int pointer_id;
	Cursor actual_pointer;
	void * recreateData;
	XWindow client;
	struct {
		unsigned base_line                : 1;
		unsigned brush_fore               : 1;
		unsigned brush_back               : 1;
		unsigned brush_null_hatch         : 1;
		unsigned clip_by_children	  : 1;
		unsigned clip_owner	          : 1;
		unsigned configured               : 1;
		unsigned cursor_visible		  : 1;
		unsigned dnd_aware                : 1;
		unsigned drop_target              : 1;
		unsigned enabled               	  : 1;
		unsigned exposed                  : 1;
		unsigned falsely_hidden           : 1;
		unsigned first_click              : 1;
		unsigned force_flush              : 1;
		unsigned grab                     : 1;
		unsigned has_icon                 : 1;
		unsigned layered                  : 1;
		unsigned layered_requested        : 1;
		unsigned iconic                   : 1;
		unsigned mapped                   : 1;
		unsigned modal                    : 1;
		unsigned kill_current_region      : 1;
		unsigned opaque                   : 1;
		unsigned paint                    : 1;
		unsigned paint_base_line          : 1;
		unsigned paint_opaque             : 1;
		unsigned paint_pending            : 1;
		unsigned pointer_obscured         : 1;
		unsigned position_determined      : 1;
		unsigned reload_font              : 1;
		unsigned sizeable                 : 1;
		unsigned sizemax_set              : 1;
		unsigned sync_paint               : 1;
		unsigned task_listed              : 1;
		unsigned title_utf8               : 1;
		unsigned transparent              : 1;
		unsigned transparent_busy         : 1;
		unsigned want_visible             : 1;
		unsigned withdrawn                : 1;
		unsigned zoomed                   : 1;
		unsigned xft_clip                 : 1;
	} flags;
	ImageCache image_cache;
	Handle preexec_focus;
	TAILQ_ENTRY(_drawable_sys_data) paintq_link;
	TAILQ_HEAD(,configure_event_pair)    configure_pairs;
	Byte * palette;
	int borderIcons;
	XVisualInfo * visual;
	Colormap colormap;
#ifdef USE_XFT
	XftDraw  * xft_drawable;
	uint32_t * xft_map8;
	double     xft_font_cos;
	double     xft_font_sin;
	XftDraw  * xft_shadow_drawable;
	Point      xft_shadow_extentions;
	Pixmap     xft_shadow_pixmap;
	GC         xft_shadow_gc;
#endif
#ifdef HAVE_X11_EXTENSIONS_XRENDER_H
	Picture    argb_picture;
#endif
} DrawableSysData, *PDrawableSysData;

#define XF_ENABLED(x)   ((x)->flags.enabled)
#define XF_IN_PAINT(x)  ((x)->flags.paint)
#define XF_LAYERED(x)  ((x)->flags.layered)
#define XFLUSH          if (XX->flags.force_flush) XFlush(DISP)

#define MenuTimerMessage   1021

#define MENU_ITEM_GAP 4
#define MENU_XOFFSET 5
#define MENU_CHECK_XOFFSET 10

typedef struct
{
	Bool is_mono;
	Bool use_stippling;
	Handle xor;
	Handle and;
	long fore, back;
} MenuBitmap, *PMenuBitmap;

typedef struct _menu_item
{
	int          x;
	int          y;
	int          width;
	int          height;
	int          accel_width;
	int          icon_width;
	MenuBitmap   bitmap, icon;
} UnixMenuItem, *PUnixMenuItem;

typedef struct _menu_window
{
	Handle               self;
	XWindow              w;
	Point                sz;
	Point                pos;
	PMenuItemReg         m;
	int                  num;
	PUnixMenuItem        um;
	struct _menu_window *next;
	struct _menu_window *prev;
	int                  selected;
	int                  right;
	int                  last;
	int                  first;
	Region               rgn;
#ifdef HAVE_X11_EXTENSIONS_XRENDER_H
	Picture              argb_picture;
#endif
} MenuWindow, *PMenuWindow;

#define MENU_PALETTE_SIZE (ciMaxId + 2)
typedef struct _menu_sys_data
{
	COMPONENT_SYS_DATA;
	Bool                 paint_pending;
	PMenuWindow          w;
	MenuWindow           wstatic;
	PCachedFont          font;
	int                  guillemots;
	Bool                 layered;
	unsigned long        c[MENU_PALETTE_SIZE];
	unsigned long        argb_c[MENU_PALETTE_SIZE];
	Color                rgb[MENU_PALETTE_SIZE];
	XWindow              focus;
	PMenuWindow          focused;
} MenuSysData, *PMenuSysData;

#define cfTargets    (cfCustom  + 0)
#define cfCOUNT      (cfTargets + 1)
/* XXX not implemented
#define cfPalette    (cfCustom  + 1)
#define cfForeground (cfCustom  + 2)
#define cfBackground (cfCustom  + 3)
#define cfCOUNT      (cfCustom  + 4)
*/

#define CF_32        (sizeof(long)*8)        /* 32-bit properties are hacky */

typedef struct {
	IV size;
	unsigned char * data;
	Atom name;
} ClipboardDataItem, *PClipboardDataItem;

typedef struct _clipboard_sys_data
{
	COMPONENT_SYS_DATA;
	Atom                 selection;
	Atom                 target;
	Bool                 opened;
	Bool                 inside_event;
	Bool                 need_write;
	Handle               selection_owner;
	PClipboardDataItem   external;
	PClipboardDataItem   internal;
	PList                xfers;
	Bool                 xdnd_sending, xdnd_receiving;
} ClipboardSysData, *PClipboardSysData;

typedef struct
{
	Handle               self;
	unsigned char      * data;
	unsigned long        size;
	unsigned int         blocks;
	unsigned int         offset;
	Bool                 data_detached;
	Bool                 data_master;
	long                 id;
	XWindow              requestor;
	Atom                 property;
	Atom                 target;
	int                  format;
	struct timeval       time;
	unsigned long        delay;
} ClipboardXfer;

typedef unsigned char ClipboardXferKey[sizeof(XWindow)+sizeof(Atom)];

#define CLIPBOARD_XFER_KEY(key,window,property) \
	memcpy(key,&window,sizeof(XWindow));\
	memcpy(((unsigned char*)key) + sizeof(XWindow),&property,sizeof(Atom))

typedef union _unix_sys_data
{
	ClipboardSysData             clipboard;
	struct {
		COMPONENT_SYS_DATA;
	}                            component;
	DrawableSysData              drawable;
	MenuSysData                  menu;
	TimerSysData                 timer;
	RegionSysData                region;
} UnixSysData, *PUnixSysData;

#define DISP		(pguts-> display)
#define SCREEN		(pguts-> screen_number)
#define VISUAL          (pguts-> visual. visual)
#define DRIN		pguts-> display, pguts-> screen_number
#define X_WINDOW	(PComponent(self)-> handle)
#define X(obj)		((PDrawableSysData)(PComponent((obj))-> sysData))
#define DEFXX		PDrawableSysData selfxx = (self == nilHandle ? nil : X(self))
#define M(obj)		((PMenuSysData)(PComponent((obj))-> sysData))
#define DEFMM           PMenuSysData selfxx = ((PMenuSysData)(PComponent((self))-> sysData))
#define C(obj)		((PClipboardSysData)(PComponent((obj))-> sysData))
#define DEFCC		PClipboardSysData selfxx = C(self)
#define XX		selfxx
#define WHEEL_DELTA	120
#define GET_RGBA_DESCRIPTION X(self)->flags.layered ? &guts. argb_bits : &guts. screen_bits
#define GET_REGION(obj) (&((PUnixSysData)(PComponent((obj))-> sysData))->region)

typedef U8 ColorComponent;

extern UnixGuts *
prima_unix_guts(void);

extern Handle
prima_xw2h( XWindow win);

extern void
prima_handle_event( XEvent *ev, XEvent *next_event);

extern void
prima_handle_menu_event( XEvent *ev, XWindow win, Handle self);

extern void
prima_handle_selection_event( XEvent *ev, XWindow win, Handle self);

extern void
prima_save_xerror_event( XErrorEvent *xr);

extern void
prima_restore_xerror_event( XErrorEvent *xr);

extern void
prima_get_gc( PDrawableSysData);

extern void
prima_rebuild_watchers( void);

extern void
prima_release_gc( PDrawableSysData);

extern Bool
prima_init_clipboard_subsystem( char * error_buf);

extern Bool
prima_init_font_subsystem( char * error_buf);

extern Bool
prima_font_subsystem_set_option( char *, char *);

extern Bool
prima_init_color_subsystem( char * error_buf);

extern Bool
prima_color_subsystem_set_option( char *, char *);

extern void
prima_done_color_subsystem( void);

extern int
prima_color_find( Handle self, long color, int maxDiff, int * diff, int maxRank);

extern Bool
prima_palette_replace( Handle self, Bool fast);

#define COLORHINT_NONE  0
#define COLORHINT_BLACK 1
#define COLORHINT_WHITE 2

#define LOGCOLOR_BLACK 0
#define LOGCOLOR_WHITE (pguts->palSize?(pguts->palSize-1):0xffffffff)

extern Color
prima_map_color( Color color, int * hint);

extern unsigned long
prima_allocate_color( Handle self, Color color, Brush * brush);

extern void
prima_palette_free( Handle self, Bool priority);

extern Bool
prima_palette_alloc( Handle self);

extern Bool
prima_color_add_ref( Handle self, int index, int rank);

extern int
prima_color_sync( void);

extern Pixmap
prima_get_hatch( FillPattern * fp);

extern void
prima_copy_xybitmap( unsigned char *data, const unsigned char *idata, int w, int h, int ls, int ils);

extern void
prima_mirror_bytes( unsigned char *data, int dataSize);

extern Bool
prima_create_icon_pixmaps( Handle bw_icon, Pixmap *xor, Pixmap *and);

extern ImageCache*
prima_image_cache( PImage img, int type);

extern Bool
prima_put_ximage( XDrawable win, GC gc, PrimaXImage *i,
		int src_x, int src_y, int dst_x, int dst_y,
		int width, int height);

extern Bool
prima_query_image( Handle self, XImage * image);

extern Bool
prima_std_query_image( Handle self, Pixmap px);

extern Pixmap
prima_std_pixmap( Handle self, int type);

extern void
prima_cleanup_drawable_after_painting( Handle self);

extern void
prima_cleanup_font_subsystem( void);

extern void
prima_cursor_tick( void);

extern void
prima_no_cursor( Handle self);

extern Cursor
prima_null_pointer( void);

#define WAIT_NEVER   0
#define WAIT_ALWAYS  1
#define WAIT_IF_NONE 2

extern Bool
prima_one_loop_round( int wait, Bool careOfApplication);

extern void
prima_prepare_drawable_for_painting( Handle self, Bool inside_on_paint);

extern Bool
prima_simple_message( Handle self, int cmd, Bool is_post);

extern void
prima_update_cursor( Handle self);

extern Bool
prima_update_rotated_fonts( PCachedFont f, const char * text, int len, Bool wide,
	double direction, PRotatedFont *result, Bool * ok_to_not_rotate);

extern void
prima_free_rotated_entry( PCachedFont f);

#define frUnix_int 1000

extern int
unix_rm_get_int( Handle self, XrmQuark class_detail, XrmQuark name_detail, int default_value);

extern void
prima_rect_union( XRectangle *t, const XRectangle *s);

extern void
prima_rect_intersect( XRectangle *t, const XRectangle *s);

extern void
prima_send_create_event( XWindow win);

extern void
prima_gc_ximages( void);

extern void
prima_ximage_event( XEvent*);

extern PrimaXImage*
prima_prepare_ximage( int width, int height, int format);

extern Bool
prima_free_ximage( PrimaXImage *i);

extern int
prima_rop_map( int rop);

extern void
prima_gp_get_clip_rect( Handle self, XRectangle *cr, Bool for_internal_paints);

extern XWindow
prima_find_frame_window( XWindow w);

extern Bool
prima_get_frame_info( Handle self, PRect r);

extern void
prima_send_cmSize( Handle self, Point oldSize);

extern Bool
prima_no_input( PDrawableSysData XX, Bool ignore_horizon, Bool beep);

extern void
process_transparents( Handle self);

extern Bool
apc_window_set_visible( Handle self, Bool show);

extern void
apc_SetWMNormalHints( Handle self, XSizeHints * hints);

extern Bool
prima_window_reset_menu( Handle self, int newMenuHeight);

extern void
prima_end_menu(void);

extern int
prima_handle_menu_shortcuts( Handle self, XEvent * ev, KeySym keysym);

extern void
prima_wm_sync( Handle self, int eventType);

extern Bool
prima_wm_net_state_read_maximization( XWindow window, Atom property);

extern unsigned char *
prima_get_window_property( XWindow window, Atom property, Atom req_type, Atom * actual_type,
			int * actual_format, unsigned long * nitems);

extern PFontABC
prima_xfont2abc( XFontStruct * fs, int firstChar, int lastChar);

extern PCachedFont
prima_find_known_font( PFont font, Bool refill, Bool bySize);

extern void
prima_font_pp2font( char * ppFontNameSize, PFont font);

extern void
prima_build_font_key( PFontKey key, PFont f, Bool bySize);

extern Bool
prima_core_font_pick( Handle self, Font * source, Font * dest);

extern Bool
prima_core_font_encoding( char * encoding);

extern void
prima_init_try_height( HeightGuessStack * p, int target, int firstMove );

extern int
prima_try_height( HeightGuessStack * p, int height);

extern void
prima_utf8_to_wchar( const char * utf8, XChar2b * u16, int src_len_bytes, int target_len_xchars);

extern XChar2b *
prima_alloc_utf8_to_wchar( const char * utf8, int length_chars);

extern void
prima_wchar2char( char * dest, XChar2b * src, int lim);

extern void
prima_char2wchar( XChar2b * dest, char * src, int lim);

extern XCharStruct *
prima_char_struct( XFontStruct * xs, void * c, Bool wide);

extern Color**
prima_standard_colors(void);

struct MsgDlg {
	struct MsgDlg * next;
	Font  * font;
	Point   btnPos;
	Point   btnSz;
	Bool    wide;
	char ** wrapped;
	int     wrappedCount;
	int    *widths, *lengths;
	int     OKwidth;
	Point   textPos;
	Bool    active;
	Bool    pressed;
	Bool    grab;
	int     fontId;
	Point   winSz;
	GC      gc;
	unsigned long fg, l3d, d3d;
	Brush   bg;
	XWindow w;
	int     focus_revertTo;
	XWindow focus;
};

extern void
prima_msgdlg_event( XEvent* ev, struct MsgDlg * md);

typedef void (*RETSIGTYPE)(int);

#undef XDestroyImage
#define XDestroyImage prima_XDestroyImage
extern void
prima_XDestroyImage( XImage * x);

typedef int (*XIfEventProcType)(Display*,XEvent*,XPointer);

#endif

#ifdef USE_XFT

extern void
prima_xft_init( void);

extern void
prima_xft_done( void);

extern void
prima_xft_gp_destroy( Handle self );

extern Bool
prima_xft_font_pick( Handle self, Font * source, Font * dest, double * size, XftFont ** xft_result);

extern Bool
prima_xft_set_font( Handle self, PFont font);

extern PFont
prima_xft_fonts( PFont array, const char *facename, const char * encoding, int *retCount);

extern void
prima_xft_font_encodings( PHash hash);

extern int
prima_xft_get_text_width( PCachedFont self, const char * text, int len,
			int flags, uint32_t * map8,
			Point * overhangs);

extern int
prima_xft_get_glyphs_width( PCachedFont self, PGlyphsOutRec glyphs,
			Point * overhangs);

extern Point *
prima_xft_get_text_box( Handle self, const char * text, int len, int flags);

extern Point *
prima_xft_get_glyphs_box( Handle self, PGlyphsOutRec glyphs);

extern Bool
prima_xft_text_out( Handle self, const char * text, int x, int y, int len, int flags);

extern Bool
prima_xft_glyphs_out( Handle self, PGlyphsOutRec glyphs, int x, int y);

extern unsigned long *
prima_xft_get_font_ranges( Handle self, int * count);

extern char *
prima_xft_get_font_languages( Handle self);

extern PFontABC
prima_xft_get_font_abc( Handle self, int firstChar, int lastChar, int flags);

extern PFontABC
prima_xft_get_font_def( Handle self, int firstChar, int lastChar, int flags);

extern int
prima_xft_get_glyph_outline( Handle self, int index, int flags, int ** buffer);

extern PCachedFont
prima_xft_get_cache( PFont font);

extern uint32_t *
prima_xft_map8( const char * encoding);

extern Bool
prima_xft_parse( char * ppFontNameSize, Font * font);

extern void
prima_xft_update_region( Handle self);

extern int
prima_xft_load_font( char * fontName );

extern Bool
prima_xft_text_shaper_ident( Handle self, PTextShapeRec r);

extern Bool
prima_xft_text_shaper_bytes( Handle self, PTextShapeRec r);

#ifdef WITH_HARFBUZZ
extern Bool
prima_xft_text_shaper_harfbuzz( Handle self, PTextShapeRec r);
#endif

#endif

#ifdef WITH_GTK
extern Display*
prima_gtk_init( void);

extern Bool
prima_gtk_done( void);

extern char *
prima_gtk_openfile( char * params);

extern Bool
prima_gtk_application_get_bitmap( Handle self, Handle image, int x, int y, int xLen, int yLen);
#endif

#ifdef WITH_COCOA
extern uint32_t*
prima_cocoa_application_get_bitmap( int x, int y, int xLen, int yLen, int yMax);

extern char *
prima_cocoa_system_action( char * params);
#endif

typedef struct _ViewProfile {
Point        pos;
Point        size;
Bool         visible;
Bool         focused;
Handle       capture;
char *       title;
int          shape_count;
int          shape_ordering;
XRectangle * shape_rects;
} ViewProfile, *PViewProfile;

extern void
prima_set_view_ex( Handle self, PViewProfile p);

extern void
prima_get_view_ex( Handle self, PViewProfile p);

extern void
prima_notify_sys_handle( Handle self );

extern int
prima_flush_events( Display * disp, XEvent * ev, Handle self);

extern const char *
prima_font_debug_style(int style);

extern Region
prima_region_create( Handle mask);

extern Handle
prima_find_toplevel_window(Handle self);

extern Byte*
prima_mirror_bits( void);

extern int
prima_copy_region_data(void * region);

#define RPS_OK       0
#define RPS_PARTIAL  1
#define RPS_NODATA   2
#define RPS_ERROR    3

extern Bool
prima_handle_dnd_event( Handle self, XEvent *xev);

extern int
prima_read_property( XWindow window, Atom property, Atom * type, int * format,
	unsigned long * size, unsigned char ** data, Bool delete_property);

extern void
prima_clipboard_kill_item( PClipboardDataItem item, Handle id);

extern void
prima_detach_xfers( PClipboardSysData XX, Handle id, Bool clear_original_data);

extern void
prima_clipboard_query_targets( Handle self );

extern int
prima_clipboard_fill_targets( Handle self);

extern void
prima_update_dnd_aware( Handle self );

extern Cursor
prima_get_cursor(Handle self);

