#ifndef MY_X11_DEFS
#define MY_X11_DEFS
#include <stdint.h>

typedef unsigned long XID;

typedef struct XImageSave_s {
    int   anyEmu;
    void* create;
    void* destroy;
    void* get;
    void* put;
    void* sub;
    void* add;
} XImageSave_t;

typedef struct ximage_s {
    void*(*create_image)(
            void*           /* display */,
            void*           /* visual */,
            uint32_t        /* depth */,
            int32_t         /* format */,
            int32_t         /* offset */,
            void*           /* data */,
            uint32_t        /* width */,
            uint32_t        /* height */,
            int32_t         /* bitmap_pad */,
            int32_t         /* bytes_per_line */);
    int32_t (*destroy_image)        (void*);
    uintptr_t (*get_pixel)           (void*, int32_t, int32_t);
    int32_t (*put_pixel)            (void*, int32_t, int32_t, uintptr_t);
    void*(*sub_image)    (void*, int32_t, int32_t, uint32_t, uint32_t); //sub_image return a new XImage that need bridging => custom wrapper
    int32_t (*add_pixel)            (void*, intptr_t);
} ximage_t;

typedef struct _XImage {
    int32_t width, height;          /* size of image */
    int32_t xoffset;                /* number of pixels offset in X direction */
    int32_t format;                 /* XYBitmap, XYPixmap, ZPixmap */
    void*   data;                   /* pointer to image data */
    int32_t byte_order;             /* data byte order, LSBFirst, MSBFirst */
    int32_t bitmap_unit;            /* quant. of scanline 8, 16, 32 */
    int32_t bitmap_bit_order;       /* LSBFirst, MSBFirst */
    int32_t bitmap_pad;             /* 8, 16, 32 either XY or ZPixmap */
    int32_t depth;                  /* depth of image */
    int32_t bytes_per_line;         /* accelarator to next line */
    int32_t bits_per_pixel;         /* bits per pixel (ZPixmap) */
    uintptr_t red_mask;             /* bits in z arrangment */
    uintptr_t green_mask;
    uintptr_t blue_mask;
    void*    obdata;                 /* hook for the object routines to hang on */
    ximage_t f;

} XImage;

struct my_XFreeFuncs {
    void* atoms;
    void* modifiermap;
    void* key_bindings;
    void* context_db;
    void* defaultCCCs;
    void* clientCmaps;
    void* intensityMaps;
    void* im_filters;
    void* xkb;
};

struct my_XExten {
    struct my_XExten *next;
    void* codes;    // XExtCodes
    void* create_GC;    // CreateGCType
    void* copy_GC;  // CopyGCType
    void* flush_GC; // FlushGCType
    void* free_GC;  // FreeGCType
    void* create_Font;  // CreateFontType
    void* free_Font;    // FreeFontType
    void* close_display;    // CloseDisplayType
    void* error;    // ErrorType
    void* error_string; // ErrorStringType
    char *name;
    void* error_values; // PrintErrorType
    void* before_flush; // BeforeFlushType
    struct my_XExten *next_flush;
};

struct my_XInternalAsync {
    struct my_XInternalAsync *next;
    int (*handler)(void*, void*, char*, int, void*);
    void* data;
};

struct my_XLockPtrs {
    void (*lock_display)(void* dpy);
    void (*unlock_display)(void *dpy);
};

struct my_XConnectionInfo {
    int fd;
    void* read_callback;    // _XInternalConnectionProc
    void* call_data;
    void* *watch_data;
    struct my_XConnectionInfo *next;
};

struct my_XConnWatchInfo {
    void* fn;   // XConnectionWatchProc
    void* client_data;
    struct _XConnWatchInfo *next;
};

typedef struct my_Visual_s {
    void*   ext_data;   //XExtData*
    XID visualid;
    int c_class;
    unsigned long red_mask, green_mask, blue_mask;
    int bits_per_rgb;
    int map_entries;
} my_Visual_t;

typedef struct my_Screen_s {
    void* ext_data;         //XExtData *
    struct my_XDisplay_s *display;
    XID root;
    int width, height;
    int mwidth, mheight;
    int ndepths;
    void* depths;   //Depth *
    int root_depth;         /* bits per pixel */
    my_Visual_t* root_visual;
    void* default_gc;   //GC == struct _XGC*
    XID cmap;
    unsigned long white_pixel;
    unsigned long black_pixel;
    int max_maps, min_maps;
    int backing_store;
    int save_unders;
    long root_input_mask;
} my_Screen_t;

typedef struct my_XDisplay_s
{
    void *ext_data;
    struct my_XFreeFuncs *free_funcs;
    int fd;
    int conn_checker;
    int proto_major_version;
    int proto_minor_version;
    char *vendor;
    XID resource_base;
    XID resource_mask;
    XID resource_id;
    int resource_shift;
    XID (*resource_alloc)(void*);
    int byte_order;
    int bitmap_unit;
    int bitmap_pad;
    int bitmap_bit_order;
    int nformats;
    void *pixmap_format;
    int vnumber;
    int release;
    void *head, *tail;
    int qlen;
    unsigned long last_request_read;
    unsigned long request;
    char *last_req;
    char *buffer;
    char *bufptr;
    char *bufmax;
    unsigned max_request_size;
    void* *db;
    int (*synchandler)(void*);
    char *display_name;
    int default_screen;
    int nscreens;
    my_Screen_t *screens;
    unsigned long motion_buffer;
    volatile unsigned long flags;
    int min_keycode;
    int max_keycode;
    void *keysyms;
    void *modifiermap;
    int keysyms_per_keycode;
    char *xdefaults;
    char *scratch_buffer;
    unsigned long scratch_length;
    int ext_number;
    struct my_XExten *ext_procs;
    int (*event_vec[128])(void *, void *, void *);
    int (*wire_vec[128])(void *, void *, void *);
    XID lock_meaning;
    void* lock;
    struct my_XInternalAsync *async_handlers;
    unsigned long bigreq_size;
    struct my_XLockPtrs *lock_fns;
    void (*idlist_alloc)(void *, void *, int);
    void* key_bindings;
    XID cursor_font;
    void* *atoms;
    unsigned int mode_switch;
    unsigned int num_lock;
    void* context_db;
    int (**error_vec)(void*, void*, void*);
    struct {
        void* defaultCCCs;
        void* clientCmaps;
        void* perVisualIntensityMaps;
    } cms;
    void* im_filters;
    void* qfree;
    unsigned long next_event_serial_num;
    struct my_XExten *flushes;
    struct my_XConnectionInfo *im_fd_info;
    int im_fd_length;
    struct my_XConnWatchInfo *conn_watchers;
    int watcher_count;
    void* filedes;
    int (*savedsynchandler)(void *);
    XID resource_max;
    int xcmisc_opcode;
    void* *xkb_info;
    void* *trans_conn;
    void* *xcb;
    unsigned int next_cookie;
    int (*generic_event_vec[128])(void*, void*, void*);
    int (*generic_event_copy_vec[128])(void*, void*, void*);
    void *cookiejar;
    unsigned long last_request_read_upper32bit; // 64bits only
    unsigned long request_upper32bit;   // 64bits only
    void* error_threads;
    void* exit_handler;
    void* exit_handler_data;
} my_XDisplay_t;

typedef struct my_XSetWindowAttributes_s {
    XID background_pixmap;
    unsigned long background_pixel;
    XID border_pixmap;
    unsigned long border_pixel;
    int bit_gravity;
    int win_gravity;
    int backing_store;
    unsigned long backing_planes;
    unsigned long backing_pixel;
    int save_under;
    long event_mask;
    long do_not_propagate_mask;
    int override_redirect;
    XID colormap;
    XID cursor;
} my_XSetWindowAttributes_t;

typedef struct my_XKeyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    XID root;
    XID subwindow;
    unsigned long time;
    int x, y;
    int x_root, y_root;
    unsigned int state;
    unsigned int keycode;
    int same_screen;
} my_XKeyEvent_t;
typedef my_XKeyEvent_t my_XKeyPressedEvent_t;
typedef my_XKeyEvent_t my_XKeyReleasedEvent_t;

typedef struct my_XButtonEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    XID root;
    XID subwindow;
    unsigned long time;
    int x, y;
    int x_root, y_root;
    unsigned int state;
    unsigned int button;
    int same_screen;
} my_XButtonEvent_t;
typedef my_XButtonEvent_t my_XButtonPressedEvent_t;
typedef my_XButtonEvent_t my_XButtonReleasedEvent_t;

typedef struct my_XMotionEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    XID root;
    XID subwindow;
    unsigned long time;
    int x, y;
    int x_root, y_root;
    unsigned int state;
    char is_hint;
    int same_screen;
} my_XMotionEvent_t;
typedef my_XMotionEvent_t my_XPointerMovedEvent_t;

typedef struct my_XCrossingEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    XID root;
    XID subwindow;
    unsigned long time;
    int x, y;
    int x_root, y_root;
    int mode;
    int detail;
    int same_screen;
    int focus;
    unsigned int state;
} my_XCrossingEvent_t;

typedef my_XCrossingEvent_t my_XEnterWindowEvent_t;
typedef my_XCrossingEvent_t my_XLeaveWindowEvent_t;

typedef struct my_XFocusChangeEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    int mode;
    int detail;
} my_XFocusChangeEvent_t;
typedef my_XFocusChangeEvent_t my_XFocusInEvent_t;
typedef my_XFocusChangeEvent_t my_XFocusOutEvent_t;

typedef struct my_XKeymapEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    char key_vector[32];
} my_XKeymapEvent_t;

typedef struct my_XExposeEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    int x, y;
    int width, height;
    int count;
} my_XExposeEvent_t;

typedef struct my_XGraphicsExposeEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID drawable;
    int x, y;
    int width, height;
    int count;
    int major_code;
    int minor_code;
} my_XGraphicsExposeEvent_t;

typedef struct my_XNoExposeEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID drawable;
    int major_code;
    int minor_code;
} my_XNoExposeEvent_t;

typedef struct my_XVisibilityEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    int state;
} my_XVisibilityEvent_t;

typedef struct my_XCreateWindowEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID parent;
    XID window;
    int x, y;
    int width, height;
    int border_width;
    int override_redirect;
} my_XCreateWindowEvent_t;

typedef struct my_XDestroyWindowEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID event;
    XID window;
} my_XDestroyWindowEvent_t;

typedef struct my_XUnmapEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID event;
    XID window;
    int from_configure;
} my_XUnmapEvent_t;

typedef struct my_XMapEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID event;
    XID window;
    int override_redirect;
} my_XMapEvent_t;

typedef struct my_XMapRequestEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID parent;
    XID window;
} my_XMapRequestEvent_t;

typedef struct my_XReparentEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID event;
    XID window;
    XID parent;
    int x, y;
    int override_redirect;
} my_XReparentEvent_t;

typedef struct my_XConfigureEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID event;
    XID window;
    int x, y;
    int width, height;
    int border_width;
    XID above;
    int override_redirect;
} my_XConfigureEvent_t;

typedef struct my_XGravityEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID event;
    XID window;
    int x, y;
} my_XGravityEvent_t;

typedef struct my_XResizeRequestEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    int width, height;
} my_XResizeRequestEvent_t;

typedef struct my_XConfigureRequestEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID parent;
    XID window;
    int x, y;
    int width, height;
    int border_width;
    XID above;
    int detail;
    unsigned long value_mask;
} my_XConfigureRequestEvent_t;

typedef struct my_XCirculateEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID event;
    XID window;
    int place;
} my_XCirculateEvent_t;

typedef struct my_XCirculateRequestEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID parent;
    XID window;
    int place;
} my_XCirculateRequestEvent_t;

typedef struct my_XPropertyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    XID atom;
    unsigned long time;
    int state;
} my_XPropertyEvent_t;

typedef struct my_XSelectionClearEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    XID selection;
    unsigned long time;
} my_XSelectionClearEvent_t;

typedef struct my_XSelectionRequestEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID owner;
    XID requestor;
    XID selection;
    XID target;
    XID property;
    unsigned long time;
} my_XSelectionRequestEvent_t;

typedef struct my_XSelectionEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID requestor;
    XID selection;
    XID target;
    XID property;
    unsigned long time;
} my_XSelectionEvent_t;

typedef struct my_XColormapEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    XID colormap;
    int c_new;
    int state;
} my_XColormapEvent_t;

typedef struct my_XClientMessageEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    XID message_type;
    int format;
    union {
            char b[20];
            short s[10];
            long l[5];
            } data;
} my_XClientMessageEvent_t;

typedef struct my_XMappingEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
    int request;
    int first_keycode;
    int count;
} my_XMappingEvent_t;

typedef struct my_XErrorEvent_s
{
    int type;
    my_XDisplay_t *display;
    XID           resourceid;
    unsigned long serial;
    unsigned char error_code;
    unsigned char request_code;
    unsigned char minor_code;
} my_XErrorEvent_t;

typedef struct my_XAnyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    my_XDisplay_t *display;
    XID window;
} my_XAnyEvent_t;

typedef struct my_XGenericEvent_s
{
    int            type;
    unsigned long  serial;
    int            send_event;
    my_XDisplay_t  *display;
    int            extension;
    int            evtype;
} my_XGenericEvent_t;

typedef struct my_XGenericEventCookie_s
{
    int            type;
    unsigned long  serial;
    int            send_event;
    my_XDisplay_t  *display;
    int            extension;
    int            evtype;
    unsigned int   cookie;
    void           *data;
} my_XGenericEventCookie_t;

typedef union my_XEvent_s {
        int type;
        my_XAnyEvent_t xany;
        my_XKeyEvent_t xkey;
        my_XButtonEvent_t xbutton;
        my_XMotionEvent_t xmotion;
        my_XCrossingEvent_t xcrossing;
        my_XFocusChangeEvent_t xfocus;
        my_XExposeEvent_t xexpose;
        my_XGraphicsExposeEvent_t xgraphicsexpose;
        my_XNoExposeEvent_t xnoexpose;
        my_XVisibilityEvent_t xvisibility;
        my_XCreateWindowEvent_t xcreatewindow;
        my_XDestroyWindowEvent_t xdestroywindow;
        my_XUnmapEvent_t xunmap;
        my_XMapEvent_t xmap;
        my_XMapRequestEvent_t xmaprequest;
        my_XReparentEvent_t xreparent;
        my_XConfigureEvent_t xconfigure;
        my_XGravityEvent_t xgravity;
        my_XResizeRequestEvent_t xresizerequest;
        my_XConfigureRequestEvent_t xconfigurerequest;
        my_XCirculateEvent_t xcirculate;
        my_XCirculateRequestEvent_t xcirculaterequest;
        my_XPropertyEvent_t xproperty;
        my_XSelectionClearEvent_t xselectionclear;
        my_XSelectionRequestEvent_t xselectionrequest;
        my_XSelectionEvent_t xselection;
        my_XColormapEvent_t xcolormap;
        my_XClientMessageEvent_t xclient;
        my_XMappingEvent_t xmapping;
        my_XErrorEvent_t xerror;
        my_XKeymapEvent_t xkeymap;
        my_XGenericEvent_t xgeneric;
        my_XGenericEventCookie_t xcookie;
        long pad[24];
} my_XEvent_t;

#define XEVT_KeyPress                2
#define XEVT_KeyRelease              3
#define XEVT_ButtonPress             4
#define XEVT_ButtonRelease           5
#define XEVT_MotionNotify            6
#define XEVT_EnterNotify             7
#define XEVT_LeaveNotify             8
#define XEVT_FocusIn                 9
#define XEVT_FocusOut                10
#define XEVT_KeymapNotify            11
#define XEVT_Expose                  12
#define XEVT_GraphicsExpose          13
#define XEVT_NoExpose                14
#define XEVT_VisibilityNotify        15
#define XEVT_CreateNotify            16
#define XEVT_DestroyNotify           17
#define XEVT_UnmapNotify             18
#define XEVT_MapNotify               19
#define XEVT_MapRequest              20
#define XEVT_ReparentNotify          21
#define XEVT_ConfigureNotify         22
#define XEVT_ConfigureRequest        23
#define XEVT_GravityNotify           24
#define XEVT_ResizeRequest           25
#define XEVT_CirculateNotify         26
#define XEVT_CirculateRequest        27
#define XEVT_PropertyNotify          28
#define XEVT_SelectionClear          29
#define XEVT_SelectionRequest        30
#define XEVT_SelectionNotify         31
#define XEVT_ColormapNotify          32
#define XEVT_ClientMessage           33
#define XEVT_MappingNotify           34
#define XEVT_GenericEvent            35


// WMHints 
typedef struct my_XWMHints_s {
    long flags;
    int input;
    int initial_state;
    XID icon_pixmap;
    XID icon_window;
    int icon_x;
    int icon_y;
    XID icon_mask;
    XID window_group;
} my_XWMHints_t;

#define XWMHint_InputHint               (1L << 0)
#define XWMHint_StateHint               (1L << 1)
#define XWMHint_IconPixmapHint          (1L << 2)
#define XWMHint_IconWindowHint          (1L << 3)
#define XWMHint_IconPositionHint        (1L << 4)
#define XWMHint_IconMaskHint            (1L << 5)
#define XWMHint_WindowGroupHint         (1L << 6)
#define XWMHint_XUrgencyHint            (1L << 8)

typedef struct my_XRRModeInfo_s {
    XID                 id;
    unsigned int        width;
    unsigned int        height;
    unsigned long       dotClock;
    unsigned int        hSyncStart;
    unsigned int        hSyncEnd;
    unsigned int        hTotal;
    unsigned int        hSkew;
    unsigned int        vSyncStart;
    unsigned int        vSyncEnd;
    unsigned int        vTotal;
    char                *name;
    unsigned int        nameLength;
    unsigned long       modeFlags;
} my_XRRModeInfo_t;


typedef struct my_XRRScreenResources_s {
    unsigned long   timestamp;
    unsigned long   configTimestamp;
    int             ncrtc;
    XID             *crtcs;
    int             noutput;
    XID             *outputs;
    int             nmode;
    my_XRRModeInfo_t *modes;
} my_XRRScreenResources_t;

typedef struct my_XRRCrtcInfo_s {
    unsigned long   timestamp;
    int             x, y;
    unsigned int    width, height;
    XID             mode;
    uint16_t        rotation;
    int             noutput;
    XID             *outputs;
    uint16_t        rotations;
    int             npossible;
    XID             *possible;
} my_XRRCrtcInfo_t;

typedef struct my_XRROutputInfo_s {
    unsigned long   timestamp;
    XID             crtc;
    char            *name;
    int             nameLen;
    unsigned long   mm_width;
    unsigned long   mm_height;
    uint16_t        connection;
    uint16_t        subpixel_order;
    int             ncrtc;
    XID             *crtcs;
    int             nclone;
    XID             *clones;
    int             nmode;
    int             npreferred;
    XID             *modes;
} my_XRROutputInfo_t;

// Window Attribute
typedef struct my_XWindowAttributes_s {
    int x, y;
    int width, height;
    int border_width;
    int depth;
    void* visual;   //Visual*
    XID root;
    int c_class;
    int bit_gravity;
    int win_gravity;
    int backing_store;
    unsigned long backing_planes;
    unsigned long backing_pixel;
    int save_under;
    XID colormap;
    int map_installed;
    int map_state;
    long all_event_masks;
    long your_event_mask;
    long do_not_propagate_mask;
    int override_redirect;
    void* screen;   //Screen*
} my_XWindowAttributes_t;

typedef struct my_XVisualInfo_s {
  my_Visual_t* visual;
  unsigned long  visualid;
  int screen;
  int depth;
  int c_class;
  unsigned long red_mask;
  unsigned long green_mask;
  unsigned long blue_mask;
  int colormap_size;
  int bits_per_rgb;
} my_XVisualInfo_t;

typedef struct my_XModifierKeymap_s {
    int             max_keypermod;
    uint8_t*        modifiermap;
} my_XModifierKeymap_t;


typedef struct my_XdbeVisualInfo_s
{
    XID         visual;
    int         depth;
    int         perflevel;
} my_XdbeVisualInfo_t;

typedef struct my_XdbeScreenVisualInfo_s
{
    int                     count;
    my_XdbeVisualInfo_t*    visinfo;
} my_XdbeScreenVisualInfo_t;

typedef struct my_XF86VidModeModeInfo_s
{
    unsigned int        dotclock;
    unsigned short      hdisplay;
    unsigned short      hsyncstart;
    unsigned short      hsyncend;
    unsigned short      htotal;
    unsigned short      hskew;
    unsigned short      vdisplay;
    unsigned short      vsyncstart;
    unsigned short      vsyncend;
    unsigned short      vtotal;
    unsigned int        flags;
    int                 privsize;
    int*                tc_private;
} my_XF86VidModeModeInfo_t;

typedef struct my_XColor_s {
	unsigned long pixel;
	unsigned short red, green, blue;
	char flags;
	char pad;
} my_XColor_t;

typedef struct my_XRRProviderInfo_s {
    unsigned int    capabilities;
    int             ncrtcs;
    XID*            crtcs;
    int             noutputs;
    XID*            outputs;
    char*           name;
    int             nassociatedproviders;
    XID*            associated_providers;
    unsigned int*   associated_capability;
    int             nameLen;
} my_XRRProviderInfo_t;

typedef struct my_XRRProviderResources_t {
    unsigned long   timestamp;
    int             nproviders;
    XID*            providers;
} my_XRRProviderResources_t;

typedef struct my_XIAnyClassInfo_s
{
    int         type;
    int         sourceid;
} my_XIAnyClassInfo_t;

typedef struct my_XIDeviceInfo_s
{
    int                     deviceid;
    char*                   name;
    int                     use;
    int                     attachment;
    int                     enabled;
    int                     num_classes;
    my_XIAnyClassInfo_t**   classes;
} my_XIDeviceInfo_t;

typedef struct my_XIEventMask_s {
    int deviceid;
    int mask_len;
    unsigned char* mask;
} my_XIEventMask_t;

typedef struct my_XInputClassInfo_s {
     unsigned char input_class;
     unsigned char event_type_base;
} my_XInputClassInfo_t;

typedef struct my_XDevice_s {
     XID                    device_id;
     int                    num_classes;
     my_XInputClassInfo_t*  classes;
} my_XDevice_t;

typedef struct my_XDeviceKeyEvent_s
{
    int            type;
    unsigned long  serial;
    int            send_event;
    void*          display; //Display*
    XID            window;
    XID            deviceid;
    XID            root;
    XID            subwindow;
    unsigned long  time;
    int            x, y;
    int            x_root;
    int            y_root;
    unsigned int   state;
    unsigned int   keycode;
    int            same_screen;
    unsigned int   device_state;
    unsigned char  axes_count;
    unsigned char  first_axis;
    int            axis_data[6];
} my_XDeviceKeyEvent_t;
typedef my_XDeviceKeyEvent_t my_XDeviceButtonEvent_t;
typedef struct my_XDeviceMotionEvent_s
{
    int            type;
    unsigned long  serial;
    int            send_event;
    void*          display; //Display*
    XID            window;
    XID            deviceid;
    XID            root;
    XID            subwindow;
    unsigned long  time;
    int            x, y;
    int            x_root;
    int            y_root;
    unsigned int   state;
    char           is_hint;
    int            same_screen;
    unsigned int   device_state;
    unsigned char  axes_count;
    unsigned char  first_axis;
    int            axis_data[6];
} my_XDeviceMotionEvent_t;
typedef struct my_XDeviceFocusChangeEvent_s
{
    int           type;
    unsigned long serial;
    int           send_event;
    void*         display;  //Display*
    XID           window;
    XID           deviceid;
    int           mode;
    int           detail;
    unsigned long time;
} my_XDeviceFocusChangeEvent_t;
typedef struct my_XProximityNotifyEvent_s
{
    int            type;
    unsigned long  serial;
    int            send_event;
    void*          display; //Display*
    XID            window;
    XID            deviceid;
    XID            root;
    XID            subwindow;
    unsigned long  time;
    int            x, y;
    int            x_root;
    int            y_root;
    unsigned int   state;
    int            same_screen;
    unsigned int   device_state;
    unsigned char  axes_count;
    unsigned char  first_axis;
    int            axis_data[6];
} my_XProximityNotifyEvent_t;
typedef struct my_XDeviceStateNotifyEvent_s
{
    int           type;
    unsigned long serial;
    int           send_event;
    void*         display;  //Display*
    XID           window;
    XID           deviceid;
    unsigned long time;
    int           num_classes;
    char	      data[64];
} my_XDeviceStateNotifyEvent_t;
typedef struct my_XDeviceMappingEvent_s
{
    int           type;
    unsigned long serial;
    int           send_event;
    void*         display;
    XID           window;
    XID           deviceid;
    unsigned long time;
    int           request;
    int           first_keycode;
    int           count;
} my_XDeviceMappingEvent_t;
typedef struct my_XChangeDeviceNotifyEvent_s
{
    int           type;
    unsigned long serial;
    int           send_event;
    void*         display;
    XID           window;
    XID           deviceid;
    unsigned long time;
    int           request;
} my_XChangeDeviceNotifyEvent_t;
typedef struct my_XDevicePresenceNotifyEvent_s
{
    int           type;
    unsigned long serial;
    int           send_event;
    void*         display;
    XID           window;
    unsigned long time;
    int           devchange;
    XID           deviceid;
    XID           control;
} my_XDevicePresenceNotifyEvent_t;
typedef struct my_XDevicePropertyNotifyEvent_s
{
    int           type;
    unsigned long serial;
    int           send_event;
    void*         display;
    XID           window;
    unsigned long time;
    XID           deviceid;
    XID           atom;
    int           state;
} my_XDevicePropertyNotifyEvent_t;
typedef struct my_XInputClass_s {
     unsigned char class;
     unsigned char length;
} my_XInputClass_t;
typedef struct my_XDeviceState_s {
     XID device_id;
     int num_classes;
     my_XInputClass_t* data;
} my_XDeviceState_t;

typedef struct my_XFixesSelectionNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    int subtype;
    XID owner;
    XID selection;
    unsigned long timestamp;
    unsigned long selection_timestamp;
} my_XFixesSelectionNotifyEvent_t;
typedef struct my_XFixesCursorNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    int subtype;
    unsigned long cursor_serial;
    unsigned long timestamp;
    XID cursor_name;
} my_XFixesCursorNotifyEvent_t;

typedef struct my_XRRScreenChangeNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    XID root;
    unsigned long timestamp;
    unsigned long config_timestamp;
    uint16_t size_index;
    uint16_t subpixel_order;
    uint16_t rotation;
    int width;
    int height;
    int mwidth;
    int mheight;
} my_XRRScreenChangeNotifyEvent_t;
typedef struct my_XRRNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    int subtype;
} my_XRRNotifyEvent_t;
typedef struct my_XRROutputChangeNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    int subtype;
    XID output;
    XID crtc;
    XID mode;
    uint16_t rotation;
    uint16_t connection;
    uint16_t subpixel_order;
} my_XRROutputChangeNotifyEvent_t;
typedef struct my_XRRCrtcChangeNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    int subtype;
    XID crtc;
    XID mode;
    uint16_t rotation;
    int x, y;
    unsigned int width, height;
} my_XRRCrtcChangeNotifyEvent_t;
typedef struct my_XRROutputPropertyNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    int subtype;
    XID output;
    XID property;
    unsigned long timestamp;
    int state;
} my_XRROutputPropertyNotifyEvent_t;
typedef struct my_XRRProviderChangeNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    int subtype;
    XID provider;
    unsigned long timestamp;
    unsigned int current_role;
} my_XRRProviderChangeNotifyEvent_t;
typedef struct my_XRRProviderPropertyNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    int subtype;
    XID provider;
    XID property;
    unsigned long timestamp;
    int state;
} my_XRRProviderPropertyNotifyEvent_t;
typedef struct my_XRRResourceChangeNotifyEvent_s
{
    int type;
    unsigned long serial;
    int send_event;
    void* display;
    XID window;
    int subtype;
    unsigned long timestamp;
} my_XRRResourceChangeNotifyEvent_t;

typedef struct my_XcursorCursors_s {
    void*      dpy;     //Display*
    int        ref;
    int        ncursor;
    void*      cursors; //Cursor*
} my_XcursorCursors_t;

typedef struct my_XcursorImage_s {
    uint32_t        version;
    uint32_t        size;
    uint32_t        width;
    uint32_t        height;
    uint32_t        xhot;
    uint32_t        yhot;
    uint32_t        delay;
    void*           pixels;
} my_XcursorImage_t;

typedef struct my_XcursorImages_s {
    int                 nimage;
    my_XcursorImage_t** images;
    char*               name;
} my_XcursorImages_t;

typedef struct my_XExtCodes_s {
    int extension;
    int major_opcode;
    int first_event;
    int first_error;
} my_XExtCodes_t;

typedef struct my_XExtDisplayInfo_s {
    struct my_XExtDisplayInfo_s *next;
    void*   display;    //Didsplay*
    my_XExtCodes_t *codes;
    void* data;
} my_XExtDisplayInfo_t;

typedef struct my_XExtensionInfo_s {
    my_XExtDisplayInfo_t *head;
    my_XExtDisplayInfo_t *cur;
    int ndisplays;
} my_XExtensionInfo_t;

typedef struct my_XCharStruct_s {
    short       lbearing;
    short       rbearing;
    short       width;
    short       ascent;
    short       descent;
    unsigned short attributes;
} my_XCharStruct_t;

typedef struct my_XFontProp_s {
    XID name;
    unsigned long card32;
} my_XFontProp_t;

typedef struct my_XFontStruct_s {
    void*             ext_data; //XExtData*
    XID               fid;
    unsigned          direction;
    unsigned          min_char_or_byte2;
    unsigned          max_char_or_byte2;
    unsigned          min_byte1;
    unsigned          max_byte1;
    int               all_chars_exist;
    unsigned          default_char;
    int               n_properties;
    my_XFontProp_t*   properties;
    my_XCharStruct_t  min_bounds;
    my_XCharStruct_t  max_bounds;
    my_XCharStruct_t* per_char;
    int               ascent;
    int               descent;
} my_XFontStruct_t;

typedef struct my_XExtensionHooks_s {
    int (*create_gc)(void* dpy, void* gc, my_XExtCodes_t* e);
    int (*copy_gc)(void* dpy, void* gc, my_XExtCodes_t* e);
    int (*flush_gc)(void* dpy, void* gc, my_XExtCodes_t* e);
    int (*free_gc)(void* dpy, void* gc, my_XExtCodes_t* e);
    int (*create_font)(void* dpy, my_XFontStruct_t* f, my_XExtCodes_t* e);
    int (*free_font)(void* dpy, my_XFontStruct_t* f, my_XExtCodes_t* e);
    int (*close_display)(void* dpy, my_XExtCodes_t* e);
    int (*wire_to_event)(void* dpy, my_XEvent_t* evt, void* xEvent);
    int (*event_to_wire)(void* dpy, my_XEvent_t* evt, void* xEvent);
    int (*error)(void* dpy, void* xError, my_XExtCodes_t* e, int* n);
    char*(*error_string)(void* dpy, int, my_XExtCodes_t* e, char* s, int n);
} my_XExtensionHooks_t;

typedef struct my_XRRPropertyInfo_s {
    int     pending;
    int     range;
    int     immutable;
    int     num_values;
    long*   values;
} my_XRRPropertyInfo_t;

typedef struct my_XShmSegmentInfo_s {
    XID     shmseg;
    int     shmid;
    char*   shmaddr;
    int     readOnly;
} my_XShmSegmentInfo_t;

typedef struct my_XkbNamesRec_s {
    XID             keycodes;
    XID             geometry;
    XID             symbols;
    XID             types;
    XID             compat;
    XID             vmods[16];
    XID             indicators[32];
    XID             groups[4];
    void*           keys; //XkbKeyNameRec* as array[xkb->max_key_code + 1]
    void*           key_aliases; //XkbKeyAliasRec* as array[num_key_aliases]
    XID*            radio_groups;
    XID             phys_symbols;
    unsigned char   num_keys;
    unsigned char   num_key_aliases;
    unsigned short  num_rg;
} my_XkbNamesRec_t;

typedef struct my_XkbClientMapRec_s {
    unsigned char            size_types;
    unsigned char            num_types;
    void*                    types; //XkbKeyTypePtr
    unsigned short           size_syms;
    unsigned short           num_syms;
    void*                    syms;  //KeySym*
    void*                    key_sym_map;   //XkbSymMapPtr
    unsigned char*           modmap;
} my_XkbClientMapRec_t;

typedef struct my_XkbDescRec_s {
   my_XDisplay_t*           display;
   unsigned short           flags;
   unsigned short           device_spec;
   uint8_t                  min_key_code;
   uint8_t                  max_key_code;
   void*                    ctrls; //XkbControlsPtr
   void*                    server; //XkbServerMapPtr
   my_XkbClientMapRec_t*    map; //XkbClientMapPtr
   void*                    indicators; //XkbIndicatorPtr
   my_XkbNamesRec_t*        names;
   void*                    compat; //XkbCompatMapPtr
   void*                    geom; //XkbGeometryPtr
} my_XkbDescRec_t;

typedef struct my_XmbTextItem_s {
    void*       chars;  //char*
    int         nchars;
    int         delta;
    void*       font_set;   //XFontSet
} my_XmbTextItem_t;

typedef struct my_XwcTextItem_s {
    void*           chars;  //wchar_t*
    int             nchars;
    int             delta;
    void*           font_set;   //XFontSet
} my_XwcTextItem_t;

typedef struct my_XAnyClassinfo_s {
    XID         c_class;
    int         length;
} my_XAnyClassInfo_t;

typedef struct my_XKeyInfo_s
{
    XID                 c_class;
    int                 length;
    unsigned short      min_keycode;
    unsigned short      max_keycode;
    unsigned short      num_keys;
} my_XKeyInfo_t;
typedef struct my_XButtonInfo_s
{
    XID         c_class;
    int         length;
    short       num_buttons;
} my_XButtonInfo_t;
typedef struct  my_XValuatorInfo_s
{
    XID                 c_class;
    int                 length;
    unsigned char       num_axes;
    unsigned char       mode;
    unsigned long       motion_buffer;
    void*               axes;   //XAxisInfoPtr
} my_XValuatorInfo_t;

typedef struct my_XDeviceInfo_s
{
    XID                 id;        
    XID                 type;
    char*               name;
    int                 num_classes;
    int                 use;
    my_XAnyClassInfo_t* inputclassinfo;
} my_XDeviceInfo_t;

typedef struct my_XTimeCoord_s {
	unsigned long time;
	short x, y;
} my_XTimeCoord_t;

typedef struct my_XDeviceTimeCoord_s {
    unsigned long   time;
    int*            data;
} my_XDeviceTimeCoord_t;

typedef struct my_XFixesCursorImage_s {
    short           x, y;
    unsigned short  width, height;
    unsigned short  xhot, yhot;
    unsigned long   cursor_serial;
    unsigned long*  pixels;
    XID             atom;                   /* Version >= 2 only */
    void*           name;                  /* Version >= 2 only */
} my_XFixesCursorImage_t;

#endif//MY_X11_DEFS