/* x11.vapi
 *
 * Copyright (C) 2009  Jürg Billeter
 * Copyright (C) 2011  Alexander Kurtz
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 *
 * Authors:
 * 	Jürg Billeter <j@bitron.ch>
 * 	Alexander Kurtz <kurtz.alex@googlemail.com>
 */

[CCode (gir_namespace = "xlib", gir_version = "2.0", cprefix = "", lower_case_cprefix = "", cheader_filename = "X11/Xlib.h,X11/Xatom.h,X11/Xutil.h,X11/Xregion.h")]
namespace X {
	// Note: must be called before opening a display or calling any other Xlib function,
	// see http://tronche.com/gui/x/xlib/display/XInitThreads.html
	[CCode (cname = "XInitThreads")]
	public Status init_threads ();

	[Compact]
	[CCode (cname = "Display", free_function = "XCloseDisplay")]
	public class Display {
		[CCode (cname = "XOpenDisplay")]
		public Display (string? name = null);

		[CCode (cname = "XAllPlanes")]
		public static ulong get_all_planes ();

		[CCode (cname = "XActivateScreenSaver")]
		public void activate_screensaver ();

		[CCode (cname = "XAddToSaveSet")]
		public int add_to_save_set (Window w);

		[CCode (cname = "XAllowEvents")]
		public int allow_events (int event_mode, int time);

		[CCode (cname = "XBitmapBitOrder")]
		public int bitmap_bit_order ();

		[CCode (cname = "XBitmapUnit")]
		public int bitmap_scanline_unit ();

		[CCode (cname = "XBitmapPad")]
		public int bitmap_scanline_padding ();

		[CCode (cname = "XChangeProperty")]
		public int change_property (Window w, Atom property, Atom type, int format, int mode, [CCode (array_length = false)] uchar[] data, int nelements);

		[CCode (cname = "XChangeWindowAttributes")]
		public int change_window_attributes (Window w, ulong valuemask, SetWindowAttributes attributes);

		[CCode (cname = "XConfigureWindow")]
		public int configure_window (Window w, uint value_mask, WindowChanges values);

		[CCode (cname = "ConnectionNumber")]
		public int connection_number ();

		[CCode (cname = "DefaultRootWindow")]
		public Window default_root_window ();

		[CCode (cname = "XDefaultScreenOfDisplay")]
		public unowned Screen default_screen ();

		[CCode (cname = "XScreenOfDisplay")]
		public unowned Screen screen_by_id (int screen_number);

		[CCode (cname = "DisplayString")]
		public unowned string display_string ();

		[CCode (cname = "XQLength")]
		public int event_queue_length ();

		[CCode (cname = "XFlush")]
		public int flush ();

		[CCode (cname = "XForceScreenSaver")]
		public void force_screensaver (int mode);

		[CCode (cname = "XGetKeyboardMapping", array_length = false)]
		public ulong[] get_keyboard_mapping (uchar first_keycode, int keycode_count, ref int keysyms_per_keycode_return);

		[CCode (cname = "XGetModifierMapping")]
		public ModifierKeymap get_modifier_mapping ();

		[CCode (cname = "XGetScreenSaver")]
		public void get_screensaver (out int timeout, out int interval, out int prefer_blanking, out int allow_exposures);

		[CCode (cname = "XGetSelectionOwner")]
		public Window get_selection_owner (Atom selection);

		[CCode (cname = "XGetInputFocus")]
		public void get_input_focus (out Window focus_return, out int revert_to_return);

		[CCode (cname = "XGetWindowAttributes")]
		public void get_window_attributes (Window w, out WindowAttributes window_attributes_return);

		[CCode (cname = "XGetWindowProperty")]
		public int get_window_property (Window w, Atom property, long long_offset, long long_length, bool delete, Atom req_type, out Atom actual_type_return, out int actual_format_return, out ulong nitems_return, out ulong bytes_after_return, [CCode (type = "unsigned char **")] out void* prop_return);

		[CCode (cname = "XGrabButton")]
		public int grab_button (uint button, uint modifiers, Window grab_window, bool owner_events, uint event_mask, int pointer_mode, int keyboard_mode, Window confine_to, uint cursor);

		[CCode (cname = "XGrabKey")]
		public int grab_key (int keycode, uint modifiers, Window grab_window, bool owner_events, int pointer_mode, int keyboard_mode);

		[CCode (cname = "XGrabPointer")]
		public int grab_pointer (Window grab_window, bool owner_events, uint event_mask, int pointer_mode, int keyboard_mode, Window confine_to, uint cursor, int time);

		[CCode (cname = "XGrabServer")]
		public int grab_server ();

		[CCode (cname = "XImageByteOrder")]
		public int image_byte_order ();

		[CCode (cname = "XInternAtom")]
		public Atom intern_atom (string atom_name, bool only_if_exists);

		[CCode (cname = "XInternAtoms")]
		public Status intern_atoms (string[] names, bool only_if_exists, [CCode (array_length = false)] Atom[] atoms_return);

		[CCode (cname = "XGetAtomName")]
		public string get_atom_name (X.Atom atom);

		[CCode (cname = "XGetAtomNames")]
		public Status get_atom_names (Atom[] atoms, [CCode (array_length = false)] string[] names);

		[CCode (cname = "XDeleteProperty")]
		public int delete_property (Window w, X.Atom property);

		[CCode (cname = "XGetGeometry")]
		public void get_geometry (Drawable d, out Window root_return, out int x_return, out int y_return, out uint width_return, out uint height_return, out uint border_width_return, out uint depth_return);

		[CCode (cname = "XInternalConnectionNumbers")]
		public Status internal_connection_numbers (ref int[] fd_return);

		[CCode (cname = "XDisplayKeycodes")]
		public int keycodes (ref int min_keycodes_return, ref int max_keycodes_return);

		[CCode (cname = "XKeysymToKeycode")]
		public uchar keysym_to_keycode (ulong keysym);

		[CCode (cname = "XKeycodeToKeysym")]
		public ulong keycode_to_keysym (uchar keycode, int index);

		[CCode (cname = "XLastKnownRequestProcessed")]
		public ulong last_known_request_processed ();

		[CCode (cname = "XLockDisplay")]
		public void lock_display ();

		[CCode (cname = "XMapWindow")]
		public int map_window (Window w);

		[CCode (cname = "XMapRaised")]
		public int map_raised (Window w);

		[CCode (cname = "XMaxRequestSize")]
		public long max_request_size ();

		[CCode (cname = "XExtendedMaxRequestSize")]
		public long max_extended_request_size ();

		[CCode (cname = "XEventsQueued")]
		public int events_queued (int mode);

		[CCode (cname = "XNextEvent")]
		public int next_event (ref Event event_return);

		[CCode (cname = "XNextRequest")]
		public ulong next_request ();

		[CCode (cname = "XNoOp")]
		public void no_operation ();

		[CCode (cname = "XScreenCount")]
		public int number_of_screens ();

		[CCode (cname = "XPending")]
		public int pending ();

		[CCode (cname = "XProcessInternalConnection")]
		public void process_internal_connection (int fd);

		[CCode (cname = "XProtocolVersion")]
		public int protocol_version ();

		[CCode (cname = "XProtocolRevision")]
		public int protocol_revision ();

		[CCode (cname = "XIconifyWindow")]
		public Status iconify_window (Window w, int screen_number);

		[CCode (cname = "XWithdrawWindow")]
		public Status withdraw_window (Window w, int screen_number);

		[CCode (cname = "XLowerWindow")]
		public int lower_window (Window w);

		[CCode (cname = "XRaiseWindow")]
		public int raise_window (Window w);

		[CCode (cname = "XReparentWindow")]
		public int reparent_window (Window w, Window parent, int x, int y);

		[CCode (cname = "XResetScreenSaver")]
		public void reset_screensaver ();

		[CCode (cname = "XResizeWindow")]
		public int resize_window (Window w, uint width, uint height);

		[CCode (cname = "XRootWindow")]
		public Window root_window (int screen_number);

		[CCode (cname = "ScreenCount")]
		public int screen_count ();

		[CCode (cname = "XScreenOfDisplay")]
		public unowned Screen screen_of_display (int screen_number);

		[CCode (cname = "XSelectInput")]
		public int select_input (Window w, long event_mask);

		[CCode (cname = "XSendEvent")]
		public void send_event (Window w, bool propagate, long event_mask, ref Event event_send);

		[CCode (cname = "XSetCloseDownMode")]
		public void set_close_down_mode (int close_mode);

		[CCode (cname = "XSetScreenSaver")]
		public void set_screensaver (int timeout, int interval, int prefer_blanking, int allow_exposures);

		[CCode (cname = "XSetSelectionOwner")]
		public Window set_selection_owner (Atom selection, Window owner, int time);

		[CCode (cname = "XSetInputFocus")]
		public int set_input_focus (Window focus, int revert_to, int time);

		[CCode (cname = "XUngrabButton")]
		public int ungrab_button (uint button, uint modifiers, Window grab_window);

		[CCode (cname = "XUngrabKey")]
		public int ungrab_key (int keycode, uint modifiers, Window grab_window);

		[CCode (cname = "XUngrabPointer")]
		public int ungrab_pointer (int time);

		[CCode (cname = "XUngrabServer")]
		public int ungrab_server ();

		[CCode (cname = "XUnlockDisplay")]
		public void unlock_display ();

		[CCode (cname = "XUnmapWindow")]
		public int unmap_window (Window w);

		[CCode (cname = "XQueryTree")]
		public void query_tree (Window w, out Window root_return, out Window parent_return, out Window[] children_return);

		[CCode (cname = "XTranslateCoordinates")]
		public bool translate_coordinates (Window src_w, Window dest_w, int src_x, int src_y, out int dest_x_return, out int dest_y_return, out Window child_return);

		[CCode (cname = "XQueryPointer")]
		public bool query_pointer (Window w, out Window root_retur, out Window child_retur, out int root_x_return, out int root_y_return, out int win_x_return, out int win_y_return, out uint mask_return);

		[CCode (cname = "XSetWMNormalHints")]
		public void set_wm_normal_hints (Window w, SizeHints hints);

		[CCode (cname = "XSetWMProtocols")]
		public void set_wm_protocols (Window w, Atom[] protocols);

		[CCode (cname = "XSetWMProtocols")]
		public void set_wm_protocols_n (Window w, Atom[] protocols);

		[CCode (cname = "XSetTransientForHint")]
		public int set_transient_for_hint (Window w, Window prop_window);

		[CCode (cname = "XGetTransientForHint")]
		public int get_transient_for_hint (Window w, out Window prop_window);

		[CCode (cname = "XGetWMProtocols")]
		public void get_wm_protocols (Window w, out Atom[] protocols);

		[CCode (cname = "XMoveResizeWindow")]
		public void move_resize_window (Window window, int x, int y, uint width, uint height);

		[CCode (cname = "XWindowEvent")]
		public int window_event (Window w, EventMask event_mask, out Event event_return);

		[CCode (cname = "XServerVendor")]
		public string xserver_vendor_name ();

		[CCode (cname = "XVendorRelease")]
		public int xserver_vendor_release ();

		[CCode (cname = "XMoveWindow")]
		public void move_window (Window window, int x, int y);

		[CCode (cname = "XQueryExtension")]
		public bool query_extension(string name, out int major_opcode, out int first_event_return, out int first_error_return);

		[CCode (cname = "XListProperties")]
		public X.Atom[] list_properties (Window w);

		[CCode (cname = "XGetVisualInfo")]
		public X.VisualInfo? get_visual_info (long vinfo_mask, X.VisualInfo template, out int nitems_return);

		[CCode (cname = "XMatchVisualInfo")]
		public X.Status match_visual_info (int screen, int depth, int @class, out X.VisualInfo vinfo_return);
	}

	[Compact]
	[CCode (cname = "XModifierKeymap", free_function = "XFreeModifiermap")]
	public class ModifierKeymap {
		// The server's max # of keys per modifier
		public int max_keypermod;
		// An 8 by max_keypermod array of modifiers
		[CCode (array_length = false)]
		public uchar[] modifiermap;
	}

	public const ulong AllPlanes;

	[SimpleType]
	[CCode (cname = "XPointer", has_type_id = false)]
	public struct Pointer {
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "Atom", type_id = "G_TYPE_LONG",
		marshaller_type_name = "LONG",
		get_value_function = "g_value_get_long",
		set_value_function = "g_value_set_long", has_type_id = false)]
	public struct Atom {
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "Colormap", has_type_id = false)]
	public struct Colormap {
	}

	[SimpleType]
	[CCode (cname = "GC", has_type_id = false)]
	public struct GC {
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "Status", has_type_id = false)]
	public struct Status {
	}

	[GIR (name = "XID")]
	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "XID", type_id = "G_TYPE_INT",
		marshaller_type_name = "INT",
		get_value_function = "g_value_get_int",
		set_value_function = "g_value_set_int", default_value = "0",
		type_signature = "i", has_type_id = false)]
	public struct ID {
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "Drawable", type_id = "G_TYPE_INT",
		marshaller_type_name = "INT",
		get_value_function = "g_value_get_int",
		set_value_function = "g_value_set_int", default_value = "0",
		type_signature = "i", has_type_id = false)]
	public struct Drawable : ID
	{
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "Window", type_id = "G_TYPE_INT",
		marshaller_type_name = "INT",
		get_value_function = "g_value_get_int",
		set_value_function = "g_value_set_int", default_value = "0",
		type_signature = "i", has_type_id = false)]
	public struct Window : Drawable {
	}


	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "Pixmap", type_id = "G_TYPE_INT",
		marshaller_type_name = "INT",
		get_value_function = "g_value_get_int",
		set_value_function = "g_value_set_int", default_value = "0",
		type_signature = "i", has_type_id = false)]
	public struct Pixmap : Drawable	{
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "Mask", has_type_id = false)]
	public struct Mask {
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "VisualID", has_type_id = false)]
	public struct VisualID {
	}

	[GIR (name = "XVisualInfo")]
	[CCode (cname = "XVisualInfo", has_type_id = false)]
	public struct VisualInfo {
		public unowned X.Visual visual;
		public X.VisualID visualid;
		public int screen;
		public int depth;
		public int @class;
		public ulong red_mask;
		public ulong green_mask;
		public ulong blue_mask;
		public int colormap_size;
		public int bits_per_rgb;
	}


	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "Time", has_type_id = false)]
	public struct Time {
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "Cursor", has_type_id = false)]
	public struct Cursor {
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "GContext", has_type_id = false)]
	public struct GContext {
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "KeySym", has_type_id = false)]
	public struct KeySym {
	}

	[SimpleType]
	[IntegerType (rank = 9)]
	[CCode (cname = "KeyCode", has_type_id = false)]
	public struct KeyCode {
	}

	[Compact]
	[CCode (cname = "XImage", free_function = "XDestroyImage")]
	public class Image {
		public int width;
		public int height;
		public int xoffset;
		public int format;
		public char *data;
		public int byte_order;
		public int bitmap_unit;
		public int bitmap_bit_order;
		public int bitmap_pad;
		public int depth;
		public int bytes_per_line;
		public int bits_per_pixel;
		public ulong red_mask;
		public ulong green_mask;
		public ulong blue_mask;
		public Pointer obdata;
	}

	[CCode (ref_function = "", unref_function = "")]
	[Compact]
	public class Visual {
		[CCode (cname = "XVisualIDFromVisual")]
		public VisualID get_visual_id ();
	}

	[CCode (cname = "XWindowChanges")]
	public struct WindowChanges {
		public int x;
		public int y;
		public int width;
		public int height;
		public int border_width;
		public Window sibling;
		public int stack_mode;
	}

	[CCode (cname = "XSizeHints")]
	public struct SizeHints {
		public long @flags;
		public int x;
		public int y;
		public int width;
		public int height;
	}

	[CCode (cprefix = "", cname = "int", has_type_id = false)]
	public enum ImageFormat {
		XYBitmap,
		XYPixmap,
		ZPixmap;
	}

	[CCode (cname = "XCreateWindow")]
	public Window create_window (Display display, Window parent, int x, int y, uint width, uint height, uint border_width, int depth, uint @class, Visual? visual, X.CW valuemask, ref SetWindowAttributes attributes);

	[CCode (cname = "XCreateSimpleWindow")]
	public Window create_simple_window (Display display, Window parent, int x, int y, uint width, uint height, uint border_width, ulong border, ulong background);

	[CCode (cname = "XClearWindow")]
	public int clear_window (X.Display display, X.Window w);

	[CCode (cname = "XCreatePixmap")]
	public X.Pixmap create_pixmap (X.Display display, X.Drawable d, uint width, uint height, uint depth);

	[CCode (cname = "XCreateImage")]
	public unowned Image create_image (Display display, Visual u, uint depth, int format, int offset, char *data, uint width, uint height, int bitmap_pad, int bytes_per_line);

	[CCode (cname = "XInitImage")]
	public Status init_image (Image img);

	[CCode (cname = "XGetImage")]
	public Image get_image (Display display, Drawable d, int x, int y, uint width, uint height, ulong plane_mask, int format);

	[CCode (cname = "XGetSubImage")]
	public Image get_sub_image (Display display, Drawable d, int x, int y, uint width, uint height, ulong plane_mask, int format, Image img, int dest_x, int dest_y);

	[CCode (cname = "XPutImage")]
	public int put_image (Display display, Drawable d, GC gc, Image img, int src_x, int src_y, int dest_x, int dest_y, uint width, uint height);

	[CCode (cname = "XGetPixel")]
	public ulong get_pixel (Image img, int x, int y);

	[CCode (cname = "XPutPixel")]
	public int put_pixel (Image img, int x, int y, ulong pixel);

	[CCode (cname = "XSubImage")]
	public Image sub_image (Image img, int x, int y, uint width, uint height);

	[CCode (cname = "XAddPixel")]
	public int add_pixel (Image img, long @value);

	[CCode (cname = "XSetWindowAttributes", has_type_id = false)]
	public struct SetWindowAttributes {
		public Pixmap background_pixmap;	/* background or None or ParentRelative */
		public ulong background_pixel;	/* background pixel */
		public Pixmap border_pixmap;	/* border of the window */
		public ulong border_pixel;	/* border pixel value */
		public int bit_gravity;		/* one of bit gravity values */
		public int win_gravity;		/* one of the window gravity values */
		public int backing_store;		/* NotUseful, WhenMapped, Always */
		public ulong backing_planes;/* planes to be preseved if possible */
		public ulong backing_pixel;/* value to use in restoring planes */
		public bool save_under;		/* should bits under be saved? (popups) */
		public long event_mask;		/* set of events that should be saved */
		public long do_not_propagate_mask;	/* set of events that should not propagate */
		public bool override_redirect;	/* boolean value for override-redirect */
		public Colormap colormap;		/* color map to be associated with window */
		public Cursor cursor;		/* cursor to be displayed (or None) */
	}

	[CCode (cname = "XSetWindowBackgroundPixmap")]
	public int set_window_background_pixmap (X.Display display, X.Window w, X.Pixmap background_pixmap);

	[CCode (cname = "XWindowAttributes", has_destroy_function = false, cheader_filename = "X11/Xlib.h,X11/Xatom.h,X11/Xutil.h", has_type_id = false)]
	public struct WindowAttributes {
		public int x;
		public int y;			/* location of window */
		public int width;
		public int height;		/* width and height of window */
		public int border_width;		/* border width of window */
		public int depth;          	/* depth of window */
		public Visual visual;		/* the associated visual structure */
		public Window root;        	/* root of screen containing window */
		public int @class;			/* InputOutput, InputOnly*/
		public int bit_gravity;		/* one of bit gravity values */
		public int win_gravity;		/* one of the window gravity values */
		public int backing_store;		/* NotUseful, WhenMapped, Always */
		public ulong backing_planes;/* planes to be preserved if possible */
		public ulong backing_pixel;/* value to be used when restoring planes */
		public bool save_under;		/* boolean, should bits under be saved? */
		public Colormap colormap;		/* color map to be associated with window */
		public bool map_installed;		/* boolean, is color map currently installed*/
		public int map_state;		/* IsUnmapped, IsUnviewable, IsViewable */
		public long all_event_masks;	/* set of events all people have interest in*/
		public long your_event_mask;	/* my event mask */
		public long do_not_propagate_mask; /* set of events that should not propagate */
		public bool override_redirect;	/* boolean value for override-redirect */
		public unowned Screen screen;   /* back pointer to correct screen */
	}

	[CCode (cname = "ParentRelative")]
	public const ulong PARENT_RELATIVE;

	[CCode (cname = "CopyFromParent")]
	public const ulong COPY_FROM_PARENT;

	[CCode (cname = "PointerWindow")]
	public const ulong POINTER_WINDOW;

	[CCode (cname = "InputFocus")]
	public const ulong INPUT_FOCUS;

	[CCode (cname = "PointerRoot")]
	public const ulong POINTER_ROOT;

	[CCode (cname = "AnyPropertyType")]
	public const ulong ANY_PROPERTY_TYPE;

	[CCode (cname = "AnyKey")]
	public const ulong ANY_KEY;

	[CCode (cname = "AnyButton")]
	public const ulong ANY_BUTTON;

	[CCode (cname = "AllTemporary")]
	public const ulong ALL_TEMPORARY;

	[CCode (cname = "CurrentTime")]
	public const ulong CURRENT_TIME;

	[CCode (cname = "NoSymbol")]
	public const ulong NO_SYMBOL;

	[CCode (cname = "Success")]
	public int Success;

	[CCode (cname = "XFree")]
	public int free (void* data);

	[CCode (cprefix = "", cname = "int", has_type_id = false)]
	public enum ErrorCode {
		[CCode (cname = "Success")]
		SUCCESS,
		[CCode (cname = "BadRequest")]
		BAD_REQUEST,
		[CCode (cname = "BadValue")]
		BAD_VALUE,
		[CCode (cname = "BadWindow")]
		BAD_WINDOW,
		[CCode (cname = "BadPixmap")]
		BAD_PIXMAP,
		[CCode (cname = "BadAtom")]
		BAD_ATOM,
		[CCode (cname = "BadCursor")]
		BAD_CURSOR,
		[CCode (cname = "BadFont")]
		BAD_FONT,
		[CCode (cname = "BadMatch")]
		BAD_MATCH,
		[CCode (cname = "BadDrawable")]
		BAD_DRAWABLE,
		[CCode (cname = "BadAccess")]
		BAD_ACCESS,
		[CCode (cname = "BadAlloc")]
		BAD_ALLOC,
		[CCode (cname = "BadColor")]
		BAD_COLOR,
		[CCode (cname = "BadGC")]
		BAD_GC,
		[CCode (cname = "BadIDChoice")]
		BAD_ID_CHOICE,
		[CCode (cname = "BadName")]
		BAD_NAME,
		[CCode (cname = "BadLength")]
		BAD_LENGTH,
		[CCode (cname = "BadImplementation")]
		BAD_IMPLEMENTATION,
		[CCode (cname = "FirstExtensionError")]
		FIRST_EXTENSION_ERROR,
		[CCode (cname = "LastExtensionError")]
		LAST_EXTENSION_ERROR
	}

	[CCode (cprefix = "", cname = "int", has_type_id = false)]
	public enum WindowClass {
		[CCode (cname = "InputOutput")]
		INPUT_OUTPUT,
		[CCode (cname = "InputOnly")]
		INPUT_ONLY
	}

	[CCode (cprefix = "CW", cname = "int")]
	[Flags]
	public enum CW {
		BackPixmap,
		BackPixel,
		BackingStore,
		BackingPlanes,
		BackingPixel,
		BitGravity,
		BorderPixmap,
		BorderPixel,
		BorderWidth,
		Colormap,
		Cursor,
		DontPropagate,
		EventMask,
		Height,
		OverrideRedirect,
		SaveUnder,
		Sibling,
		StackMode,
		X,
		Y,
		Width,
		WinGravity
	}

	[CCode (cprefix = "GrabMode", has_type_id = false)]
	public enum GrabMode {
		Sync,
		Async
	}

	[CCode (cprefix = "")]
	public enum CloseMode {
		DestroyAll,
		RetainPermanent,
		RetainTemporary
	}

	[CCode (cprefix = "")]
	[Flags]
	public enum EventMask {
		NoEventMask,
		KeyPressMask,
		KeyReleaseMask,
		ButtonPressMask,
		ButtonReleaseMask,
		EnterWindowMask,
		LeaveWindowMask,
		PointerMotionMask,
		PointerMotionHintMask,
		Button1MotionMask,
		Button2MotionMask,
		Button3MotionMask,
		Button4MotionMask,
		Button5MotionMask,
		ButtonMotionMask,
		KeymapStateMask,
		ExposureMask,
		VisibilityChangeMask,
		StructureNotifyMask,
		ResizeRedirectMask,
		SubstructureNotifyMask,
		SubstructureRedirectMask,
		FocusChangeMask,
		PropertyChangeMask,
		ColormapChangeMask,
		OwnerGrabButtonMask
	}

	[CCode (cprefix = "")]
	[Flags]
	public enum KeyMask {
		ShiftMask,
		LockMask,
		ControlMask,
		Mod1Mask,
		Mod2Mask,
		Mod3Mask,
		Mod4Mask,
		Mod5Mask
	}

	[CCode (cprefix = "", has_type_id = false)]
	public enum EventType {
		KeyPress,
		KeyRelease,
		ButtonPress,
		ButtonRelease,
		MotionNotify,
		EnterNotify,
		LeaveNotify,
		FocusIn,
		FocusOut,
		KeymapNotify,
		Expose,
		GraphicsExpose,
		NoExpose,
		VisibilityNotify,
		CreateNotify,
		DestroyNotify,
		UnmapNotify,
		MapNotify,
		MapRequest,
		ReparentNotify,
		ConfigureNotify,
		ConfigureRequest,
		GravityNotify,
		ResizeRequest,
		CirculateNotify,
		CirculateRequest,
		PropertyNotify,
		SelectionClear,
		SelectionRequest,
		SelectionNotify,
		ColormapNotify,
		ClientMessage,
		MappingNotify,
		GenericEvent
	}

	// union
	[GIR (name = "XEvent")]
	[CCode (cname = "XEvent", has_type_id = false)]
	public struct Event {
		public int type;
		public AnyEvent xany;
		public KeyEvent xkey;
		public ButtonEvent xbutton;
		public MotionEvent xmotion;
		public CrossingEvent xcrossing;
		public FocusChangeEvent xfocus;
		public ExposeEvent xexpose;
		public GraphicsExposeEvent xgraphicsexpose;
		public NoExposeEvent xnoexpose;
		public VisibilityEvent xvisibility;
		public CreateWindowEvent xcreatewindow;
		public DestroyWindowEvent xdestroywindow;
		public UnmapEvent xunmap;
		public MapEvent xmap;
		public MapRequestEvent xmaprequest;
		public ReparentEvent xreparent;
		public ConfigureEvent xconfigure;
		public GravityEvent xgravity;
		public ResizeRequestEvent xresizerequest;
		public ConfigureRequestEvent xconfigurerequest;
		public CirculateEvent xcirculate;
		public CirculateRequestEvent xcirculaterequest;
		public PropertyEvent xproperty;
		public SelectionClearEvent xselectionclear;
		public SelectionRequestEvent xselectionrequest;
		public SelectionEvent xselection;
		public ColormapEvent xcolormap;
		public ClientMessageEvent xclient;
		public MappingEvent xmapping;
		public ErrorEvent xerror;
		public KeymapEvent xkeymap;
		public GenericEvent xgeneric;
		public GenericEventCookie xcookie;
	}

	[CCode (cname = "XAnyEvent", has_type_id = false)]
	public struct AnyEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
	}

	[CCode (cname = "XKeyEvent", has_type_id = false)]
	public struct KeyEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public Window root;
		public Window subwindow;
		public ulong time;
		public int x;
		public int y;
		public int x_root;
		public int y_root;
		public uint state;
		public uint keycode;
		public bool same_screen;
	}

	[CCode (cname = "XButtonEvent", has_type_id = false)]
	public struct ButtonEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public Window subwindow;
		public ulong time;
		public int x;
		public int y;
		public int x_root;
		public int y_root;
		public uint state;
		public uint button;
		public bool same_screen;
	}

	[CCode (cname = "XMotionEvent", has_type_id = false)]
	public struct MotionEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public Window subwindow;
		public ulong time;
		public int x;
		public int y;
		public int x_root;
		public int y_root;
		public uint state;
		public char is_hint;
		public bool same_screen;
	}

	[CCode (cname = "XCrossingEvent", has_type_id = false)]
	public struct CrossingEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public Window root;
		public Window subwindow;
		public ulong time;
		public int x;
		public int y;
		public int x_root;
		public int y_root;
		public int mode;
		public int detail;
		public bool same_screen;
		public bool focus;
		public uint state;
	}

	[CCode (cname = "XFocusChangeEvent", has_type_id = false)]
	public struct FocusChangeEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public int mode;
		public int detail;
	}

	[CCode (cname = "XExposeEvent", has_type_id = false)]
	public struct ExposeEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public int x;
		public int y;
		public int width;
		public int height;
		public int count;
	}

	[CCode (cname = "XGraphicsExposeEvent", has_type_id = false)]
	public struct GraphicsExposeEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Drawable drawable;
		public int x;
		public int y;
		public int width;
		public int height;
		public int count;
		public int major_code;
		public int minor_code;
	}

	[CCode (cname = "XNoExposeEvent", has_type_id = false)]
	public struct NoExposeEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Drawable drawable;
		public int major_code;
		public int minor_code;
	}

	[CCode (cname = "XVisibilityEvent", has_type_id = false)]
	public struct VisibilityEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public int state;
	}

	[CCode (cname = "XCreateWindowEvent", has_type_id = false)]
	public struct CreateWindowEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window parent;
		public Window window;
		public int x;
		public int y;
		public int width;
		public int height;
		public int border_width;
		public bool override_redirect;
	}

	[CCode (cname = "XDestroyWindowEvent", has_type_id = false)]
	public struct DestroyWindowEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window event;
		public Window window;
	}

	[CCode (cname = "XUnmapEvent", has_type_id = false)]
	public struct UnmapEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window event;
		public Window window;
		public bool from_configure;
	}

	[CCode (cname = "XMapEvent", has_type_id = false)]
	public struct MapEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window event;
		public Window window;
		public bool override_redirect;
	}

	[CCode (cname = "XMapRequestEvent", has_type_id = false)]
	public struct MapRequestEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window parent;
		public Window window;
	}

	[CCode (cname = "XReparentEvent", has_type_id = false)]
	public struct ReparentEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window event;
		public Window window;
		public Window parent;
		public int x;
		public int y;
		public bool override_redirect;
	}

	[CCode (cname = "XConfigureEvent", has_type_id = false)]
	public struct ConfigureEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window event;
		public Window window;
		public int x;
		public int y;
		public int width;
		public int height;
		public int border_width;
		public Window above;
		public bool override_redirect;
	}

	[CCode (cname = "XGravityEvent", has_type_id = false)]
	public struct GravityEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window event;
		public Window window;
		public int x;
		public int y;
	}

	[CCode (cname = "XResizeRequestEvent", has_type_id = false)]
	public struct ResizeRequestEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public int width;
		public int height;
	}

	[CCode (cname = "XConfigureRequestEvent", has_type_id = false)]
	public struct ConfigureRequestEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window parent;
		public Window window;
		public int x;
		public int y;
		public int width;
		public int height;
		public int border_width;
		public Window above;
		public int detail;
		public ulong value_mask;
	}

	[CCode (cname = "XCirculateEvent", has_type_id = false)]
	public struct CirculateEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window event;
		public Window window;
		public int place;
	}

	[CCode (cname = "XCirculateRequestEvent", has_type_id = false)]
	public struct CirculateRequestEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window parent;
		public Window window;
		public int place;
	}

	[CCode (cname = "XPropertyEvent", has_type_id = false)]
	public struct PropertyEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public Atom atom;
		public ulong time;
		public int state;
	}

	[CCode (cname = "XSelectionClearEvent", has_type_id = false)]
	public struct SelectionClearEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public Atom selection;
		public ulong time;
	}

	[CCode (cname = "XSelectionRequestEvent", has_type_id = false)]
	public struct SelectionRequestEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window owner;
		public Window requestor;
		public Atom selection;
		public Atom target;
		public Atom property;
		public ulong time;
	}

	[CCode (cname = "XSelectionEvent", has_type_id = false)]
	public struct SelectionEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window requestor;
		public Atom selection;
		public Atom target;
		public Atom property;
		public ulong time;
	}

	[CCode (cname = "XColormapEvent", has_type_id = false)]
	public struct ColormapEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public Colormap colormap;
		public bool @new;
		public int state;
	}

	[CCode (cname = "XClientMessageEvent", has_type_id = false)]
	public struct ClientMessageEvent {
		public int type;
		public ulong serial;	/* # of last request processed by server */
		public bool send_event;	/* true if this came from a SendEvent request */
		public unowned Display display;	/* Display the event was read from */
		public Window window;
		public Atom message_type;
		public int format;
		[CCode (cname = "data.b")]
		public unowned char b[20];
		[CCode (cname = "data.s")]
		public unowned short s[10];
		[CCode (cname = "data.l")]
		public unowned long l[5];
	}

	[CCode (cname = "XMappingEvent", has_type_id = false)]
	public struct MappingEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public int request;
		public int first_keycode;
		public int count;
	}

	[CCode (cname = "XErrorEvent", has_type_id = false)]
	public struct ErrorEvent {
		public int type;
		public unowned Display display;
		public ID resourceid;
		public ulong serial;
		public uchar error_code;
		public uchar request_code;
		public uchar minor_code;
	}

	[CCode (cname = "XKeymapEvent", has_type_id = false)]
	public struct KeymapEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public Window window;
		public char key_vector[32];
	}

	[CCode (cname = "XGenericEvent", has_type_id = false)]
	public struct GenericEvent {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public int extension;
		public int evtype;
	}

	[CCode (cname = "XGenericEventCookie", has_type_id = false)]
	public struct GenericEventCookie {
		public int type;
		public ulong serial;
		public bool send_event;
		public unowned Display display;
		public int extension;
		public int evtype;
		public uint cookie;
		public void *data;
	}

	[CCode (cname = "RECTANGLE", has_type_id = false, has_type_id = false)]
	public struct Rectangle {
		public short x;
		public short y;
		public short width;
		public short height;
	}

	[CCode (cprefix = "Queued", has_type_id = false)]
	public enum QueuedMode {
		Already,
		AfterFlush,
		AfterReading
	}

	[CCode (cprefix = "PropMode", has_type_id = false)]
	public enum PropMode {
		Replace,
		Prepend,
		Append
	}

	[CCode (cprefix = "", has_type_id = false)]
	public enum AllowEventsMode {
		AsyncPointer,
		SyncPointer,
		ReplayPointer,
		AsyncKeyboard,
		SyncKeyboard,
		ReplayKeyboard,
		AsyncBoth,
		SyncBoth
	}

	[CCode (cprefix = "", has_type_id = false)]
	public enum MapState {
		IsUnmapped,
		IsUnviewable,
		IsViewable
	}

	[CCode (cprefix = "RevertTo", has_type_id = false)]
	public enum RevertTo {
		None,
		PointerRoot,
		Parent
	}

	[Compact]
	[CCode (cname = "Screen")]
	public class Screen {
		public Display display;
		public Window root;
		public int width;
		public int height;

		[CCode (cname = "ScreenOfDisplay")]
		public static unowned Screen get_screen (Display disp, int screen_number);

		[CCode (cname = "BlackPixelOfScreen")]
		public ulong black_pixel_of_screen ();

		[CCode (cname = "CellsOfScreen")]
		public int cells_of_screen ();

		[CCode (cname = "DefaultColormapOfScreen")]
		public Colormap default_colormap_of_screen ();

		[CCode (cname = "DefaultDepthOfScreen")]
		public int default_depth_of_screen ();

		[CCode (cname = "DefaultGCOfScreen")]
		public GC default_gc_of_screen ();

		[CCode (cname = "DefaultVisualOfScreen")]
		public Visual default_visual_of_screen ();

		[CCode (cname = "DisplayOfScreen")]
		public unowned Display display_of_screen ();

		[CCode (cname = "DoesBackingStore")]
		public int does_backing_store ();

		[CCode (cname = "DoesSaveUnders")]
		public bool does_save_unders ();

		[CCode (cname = "EventMaskOfScreen")]
		public long event_mask_of_Screen ();

		[CCode (cname = "HeightMMOfScreen")]
		public int height_in_mm_of_screen ();

		[CCode (cname = "HeightOfScreen")]
		public int height_of_screen ();

		[CCode (cname = "MaxCmapsOfScreen")]
		public int max_colormaps_of_screen ();

		[CCode (cname = "MinCmapsOfScreen")]
		public int min_colormaps_of_screen ();

		[CCode (cname = "PlanesOfScreen")]
		public int planes_of_screen ();

		[CCode (cname = "RootWindowOfScreen")]
		public Window root_window_of_screen ();

		[CCode (cname = "XScreenNumberOfScreen")]
		public int screen_number_of_screen ();

		[CCode (cname = "WhitePixelOfScreen")]
		public ulong white_pixel_of_screen ();

		[CCode (cname = "WidthMMOfScreen")]
		public int width_in_mm_of_screen ();

		[CCode (cname = "WidthOfScreen")]
		public int width_of_screen ();
	}

	public const X.ID None;

	public const X.Atom XA_PRIMARY;
	public const X.Atom XA_SECONDARY;
	public const X.Atom XA_ARC;
	public const X.Atom XA_ATOM;
	public const X.Atom XA_BITMAP;
	public const X.Atom XA_CARDINAL;
	public const X.Atom XA_COLORMAP;
	public const X.Atom XA_CURSOR;
	public const X.Atom XA_CUT_BUFFER0;
	public const X.Atom XA_CUT_BUFFER1;
	public const X.Atom XA_CUT_BUFFER2;
	public const X.Atom XA_CUT_BUFFER3;
	public const X.Atom XA_CUT_BUFFER4;
	public const X.Atom XA_CUT_BUFFER5;
	public const X.Atom XA_CUT_BUFFER6;
	public const X.Atom XA_CUT_BUFFER7;
	public const X.Atom XA_DRAWABLE;
	public const X.Atom XA_FONT;
	public const X.Atom XA_INTEGER;
	public const X.Atom XA_PIXMAP;
	public const X.Atom XA_POINT;
	public const X.Atom XA_RECTANGLE;
	public const X.Atom XA_RESOURCE_MANAGER;
	public const X.Atom XA_RGB_COLOR_MAP;
	public const X.Atom XA_RGB_BEST_MAP;
	public const X.Atom XA_RGB_BLUE_MAP;
	public const X.Atom XA_RGB_DEFAULT_MAP;
	public const X.Atom XA_RGB_GRAY_MAP;
	public const X.Atom XA_RGB_GREEN_MAP;
	public const X.Atom XA_RGB_RED_MAP;
	public const X.Atom XA_STRING;
	public const X.Atom XA_VISUALID;
	public const X.Atom XA_WINDOW;
	public const X.Atom XA_WM_COMMAND;
	public const X.Atom XA_WM_HINTS;
	public const X.Atom XA_WM_CLIENT_MACHINE;
	public const X.Atom XA_WM_ICON_NAME;
	public const X.Atom XA_WM_ICON_SIZE;
	public const X.Atom XA_WM_NAME;
	public const X.Atom XA_WM_NORMAL_HINTS;
	public const X.Atom XA_WM_SIZE_HINTS;
	public const X.Atom XA_WM_ZOOM_HINTS;
	public const X.Atom XA_MIN_SPACE;
	public const X.Atom XA_NORM_SPACE;
	public const X.Atom XA_MAX_SPACE;
	public const X.Atom XA_END_SPACE;
	public const X.Atom XA_SUPERSCRIPT_X;
	public const X.Atom XA_SUPERSCRIPT_Y;
	public const X.Atom XA_SUBSCRIPT_X;
	public const X.Atom XA_SUBSCRIPT_Y;
	public const X.Atom XA_UNDERLINE_POSITION;
	public const X.Atom XA_UNDERLINE_THICKNESS;
	public const X.Atom XA_STRIKEOUT_ASCENT;
	public const X.Atom XA_STRIKEOUT_DESCENT;
	public const X.Atom XA_ITALIC_ANGLE;
	public const X.Atom XA_X_HEIGHT;
	public const X.Atom XA_QUAD_WIDTH;
	public const X.Atom XA_WEIGHT;
	public const X.Atom XA_POINT_SIZE;
	public const X.Atom XA_RESOLUTION;
	public const X.Atom XA_COPYRIGHT;
	public const X.Atom XA_NOTICE;
	public const X.Atom XA_FONT_NAME;
	public const X.Atom XA_FAMILY_NAME;
	public const X.Atom XA_FULL_NAME;
	public const X.Atom XA_CAP_HEIGHT;
	public const X.Atom XA_WM_CLASS;
	public const X.Atom XA_WM_TRANSIENT_FOR;

	public const uint XK_Num_Lock;
	public const uint XK_Scroll_Lock;
	public const uint XK_Super_L;
	public const uint XK_Super_R;

	[CCode (cname = "XStringToKeysym")]
	public ulong string_to_keysym (string key);

	[CCode (cname = "XKeysymToString")]
	public unowned string keysym_to_string (ulong keysym);

	[CCode (cname = "XConvertCase")]
	public void convert_case (ulong keysym, out ulong lower_return, out ulong upper_return);
}

