sig
  type color
  type colormap
  type visual
  type screen = [ `gdkscreen ] Gobject.obj
  type region
  type gc
  type window = [ `drawable | `gdkwindow ] Gobject.obj
  type pixmap = [ `drawable | `gdkpixmap ] Gobject.obj
  type bitmap = [ `drawable | `gdkbitmap | `gdkpixmap ] Gobject.obj
  type font
  type image = [ `gdkimage ] Gobject.obj
  type atom
  type keysym = int
  type +'a event
  type drag_context = [ `dragcontext ] Gobject.obj
  type cursor
  type xid = int32
  type device
  exception Error of string
  module Tags :
    sig
      type event_type =
        [ `BUTTON_PRESS
        | `BUTTON_RELEASE
        | `CLIENT_EVENT
        | `CONFIGURE
        | `DELETE
        | `DESTROY
        | `DRAG_ENTER
        | `DRAG_LEAVE
        | `DRAG_MOTION
        | `DRAG_STATUS
        | `DROP_FINISHED
        | `DROP_START
        | `ENTER_NOTIFY
        | `EXPOSE
        | `FOCUS_CHANGE
        | `KEY_PRESS
        | `KEY_RELEASE
        | `LEAVE_NOTIFY
        | `MAP
        | `MOTION_NOTIFY
        | `NOTHING
        | `NO_EXPOSE
        | `PROPERTY_NOTIFY
        | `PROXIMITY_IN
        | `PROXIMITY_OUT
        | `SCROLL
        | `SELECTION_CLEAR
        | `SELECTION_NOTIFY
        | `SELECTION_REQUEST
        | `SETTING
        | `THREE_BUTTON_PRESS
        | `TWO_BUTTON_PRESS
        | `UNMAP
        | `VISIBILITY_NOTIFY
        | `WINDOW_STATE ]
      type event_mask =
        [ `ALL_EVENTS
        | `BUTTON1_MOTION
        | `BUTTON2_MOTION
        | `BUTTON3_MOTION
        | `BUTTON_MOTION
        | `BUTTON_PRESS
        | `BUTTON_RELEASE
        | `ENTER_NOTIFY
        | `EXPOSURE
        | `FOCUS_CHANGE
        | `KEY_PRESS
        | `KEY_RELEASE
        | `LEAVE_NOTIFY
        | `POINTER_MOTION
        | `POINTER_MOTION_HINT
        | `PROPERTY_CHANGE
        | `PROXIMITY_IN
        | `PROXIMITY_OUT
        | `SCROLL
        | `STRUCTURE
        | `SUBSTRUCTURE
        | `VISIBILITY_NOTIFY ]
      type extension_mode = [ `ALL | `CURSOR | `NONE ]
      type visibility_state = [ `FULLY_OBSCURED | `PARTIAL | `UNOBSCURED ]
      type input_source = [ `CURSOR | `ERASER | `MOUSE | `PEN ]
      type scroll_direction = [ `DOWN | `LEFT | `RIGHT | `UP ]
      type notify_type =
        [ `ANCESTOR
        | `INFERIOR
        | `NONLINEAR
        | `NONLINEAR_VIRTUAL
        | `UNKNOWN
        | `VIRTUAL ]
      type crossing_mode = [ `GRAB | `NORMAL | `UNGRAB ]
      type setting_action = [ `CHANGED | `DELETED | `NEW ]
      type window_state = [ `ICONIFIED | `MAXIMIZED | `STICKY | `WITHDRAWN ]
      type modifier =
        [ `BUTTON1
        | `BUTTON2
        | `BUTTON3
        | `BUTTON4
        | `BUTTON5
        | `CONTROL
        | `LOCK
        | `MOD1
        | `MOD2
        | `MOD3
        | `MOD4
        | `MOD5
        | `SHIFT ]
      type drag_action =
        [ `ASK | `COPY | `DEFAULT | `LINK | `MOVE | `PRIVATE ]
      type rgb_dither = [ `MAX | `NONE | `NORMAL ]
      type property_state = [ `DELETE | `NEW_VALUE ]
      type property_mode = [ `APPEND | `PREPEND | `REPLACE ]
      type xdata =
        [ `BYTES of string | `INT32S of int32 array | `SHORTS of int array ]
      type xdata_ret =
        [ `BYTES of string
        | `INT32S of int32 array
        | `NONE
        | `SHORTS of int array ]
      type gravity =
        [ `CENTER
        | `EAST
        | `NORTH
        | `NORTH_EAST
        | `NORTH_WEST
        | `SOUTH
        | `SOUTH_EAST
        | `SOUTH_WEST
        | `STATIC
        | `WEST ]
      type window_type_hint =
        [ `DESKTOP
        | `DIALOG
        | `DOCK
        | `MENU
        | `NORMAL
        | `SPLASHSCREEN
        | `TOOLBAR
        | `UTILITY ]
    end
  module Convert :
    sig
      val test_modifier : Gdk.Tags.modifier -> int -> bool
      val modifier : int -> Gdk.Tags.modifier list
      val window_state : int -> Gdk.Tags.window_state list
    end
  module Atom :
    sig
      val intern : ?dont_create:bool -> string -> Gdk.atom
      val name : Gdk.atom -> string
      val none : Gdk.atom
      val primary : Gdk.atom
      val secondary : Gdk.atom
      val clipboard : Gdk.atom
      val string : Gdk.atom
    end
  module Property :
    sig
      val change :
        window:Gdk.window ->
        typ:Gdk.atom ->
        ?mode:Gdk.Tags.property_mode -> Gdk.atom -> Gdk.Tags.xdata -> unit
      val get :
        window:Gdk.window ->
        ?max_length:int ->
        ?delete:bool -> Gdk.atom -> (Gdk.atom * Gdk.Tags.xdata) option
      val delete : window:Gdk.window -> Gdk.atom -> unit
    end
  module Screen :
    sig
      val width : ?screen:Gdk.screen -> unit -> int
      val height : ?screen:Gdk.screen -> unit -> int
      val get_pango_context : ?screen:Gdk.screen -> unit -> Pango.context
      val default : unit -> Gdk.screen
    end
  module Visual :
    sig
      type visual_type =
        [ `DIRECT_COLOR
        | `GRAYSCALE
        | `PSEUDO_COLOR
        | `STATIC_COLOR
        | `STATIC_GRAY
        | `TRUE_COLOR ]
      val get_best :
        ?depth:int -> ?kind:Gdk.Visual.visual_type -> unit -> Gdk.visual
      val get_type : Gdk.visual -> Gdk.Visual.visual_type
      val depth : Gdk.visual -> int
      val red_mask : Gdk.visual -> int
      val red_shift : Gdk.visual -> int
      val red_prec : Gdk.visual -> int
      val green_mask : Gdk.visual -> int
      val green_shift : Gdk.visual -> int
      val green_prec : Gdk.visual -> int
      val blue_mask : Gdk.visual -> int
      val blue_shift : Gdk.visual -> int
      val blue_prec : Gdk.visual -> int
    end
  module Image :
    sig
      type image_type = [ `FASTEST | `NORMAL | `SHARED ]
      val create :
        kind:Gdk.Image.image_type ->
        visual:Gdk.visual -> width:int -> height:int -> Gdk.image
      val get :
        [> `drawable ] Gobject.obj ->
        x:int -> y:int -> width:int -> height:int -> Gdk.image
      val put_pixel : Gdk.image -> x:int -> y:int -> pixel:int -> unit
      val get_pixel : Gdk.image -> x:int -> y:int -> int
      val destroy : Gdk.image -> unit
      val width : Gdk.image -> int
      val height : Gdk.image -> int
      val depth : Gdk.image -> int
      val get_visual : Gdk.image -> Gdk.visual
    end
  module Color :
    sig
      val get_system_colormap : unit -> Gdk.colormap
      val get_colormap : ?privat:bool -> Gdk.visual -> Gdk.colormap
      val get_visual : Gdk.colormap -> Gdk.visual
      type spec =
        [ `BLACK | `NAME of string | `RGB of int * int * int | `WHITE ]
      val alloc : colormap:Gdk.colormap -> Gdk.Color.spec -> Gdk.color
      val red : Gdk.color -> int
      val blue : Gdk.color -> int
      val green : Gdk.color -> int
      val pixel : Gdk.color -> int
    end
  module Rectangle :
    sig
      type t
      val create :
        x:int -> y:int -> width:int -> height:int -> Gdk.Rectangle.t
      val x : Gdk.Rectangle.t -> int
      val y : Gdk.Rectangle.t -> int
      val width : Gdk.Rectangle.t -> int
      val height : Gdk.Rectangle.t -> int
    end
  module Drawable :
    sig
      val cast : 'Gobject.obj -> [ `drawable ] Gobject.obj
      val get_visual : [> `drawable ] Gobject.obj -> Gdk.visual
      val get_depth : [> `drawable ] Gobject.obj -> int
      val get_colormap : [> `drawable ] Gobject.obj -> Gdk.colormap
      val get_size : [> `drawable ] Gobject.obj -> int * int
    end
  module Window :
    sig
      val cast : 'Gobject.obj -> Gdk.window
      val get_parent : Gdk.window -> Gdk.window
      val get_position : Gdk.window -> int * int
      val get_pointer_location : Gdk.window -> int * int
      val root_parent : unit -> Gdk.window
      val clear : Gdk.window -> unit
      val get_xwindow : [> `drawable ] Gobject.obj -> Gdk.xid
      type background_pixmap =
        [ `NONE | `PARENT_RELATIVE | `PIXMAP of Gdk.pixmap ]
      val set_back_pixmap :
        Gdk.window -> Gdk.Window.background_pixmap -> unit
      val set_cursor : Gdk.window -> Gdk.cursor -> unit
      val get_visual : Gdk.window -> Gdk.visual
    end
  module PointArray :
    sig
      type t = { len : int; }
      val create : len:int -> Gdk.PointArray.t
      val set : Gdk.PointArray.t -> pos:int -> x:int -> y:int -> unit
    end
  module Region :
    sig
      type gdkFillRule = [ `EVEN_ODD_RULE | `WINDING_RULE ]
      type gdkOverlapType = [ `IN | `OUT | `PART ]
      val create : unit -> Gdk.region
      val destroy : Gdk.region -> unit
      val polygon : (int * int) list -> Gdk.Region.gdkFillRule -> Gdk.region
      val intersect : Gdk.region -> Gdk.region -> Gdk.region
      val union : Gdk.region -> Gdk.region -> Gdk.region
      val subtract : Gdk.region -> Gdk.region -> Gdk.region
      val xor : Gdk.region -> Gdk.region -> Gdk.region
      val union_with_rect : Gdk.region -> Gdk.Rectangle.t -> Gdk.region
      val offset : Gdk.region -> x:int -> y:int -> unit
      val shrink : Gdk.region -> x:int -> y:int -> unit
      val empty : Gdk.region -> bool
      val equal : Gdk.region -> Gdk.region -> bool
      val point_in : Gdk.region -> x:int -> y:int -> bool
      val rect_in :
        Gdk.region -> Gdk.Rectangle.t -> Gdk.Region.gdkOverlapType
      val get_clipbox : Gdk.region -> Gdk.Rectangle.t -> unit
    end
  module GC :
    sig
      type gdkFunction = [ `COPY | `INVERT | `XOR ]
      type gdkFill = [ `OPAQUE_STIPPLED | `SOLID | `STIPPLED | `TILED ]
      type gdkSubwindowMode = [ `CLIP_BY_CHILDREN | `INCLUDE_INFERIORS ]
      type gdkLineStyle = [ `DOUBLE_DASH | `ON_OFF_DASH | `SOLID ]
      type gdkCapStyle = [ `BUTT | `NOT_LAST | `PROJECTING | `ROUND ]
      type gdkJoinStyle = [ `BEVEL | `MITER | `ROUND ]
      val create : [> `drawable ] Gobject.obj -> Gdk.gc
      val set_foreground : Gdk.gc -> Gdk.color -> unit
      val set_background : Gdk.gc -> Gdk.color -> unit
      val set_font : Gdk.gc -> Gdk.font -> unit
      val set_function : Gdk.gc -> Gdk.GC.gdkFunction -> unit
      val set_fill : Gdk.gc -> Gdk.GC.gdkFill -> unit
      val set_tile : Gdk.gc -> Gdk.pixmap -> unit
      val set_stipple : Gdk.gc -> Gdk.pixmap -> unit
      val set_ts_origin : Gdk.gc -> x:int -> y:int -> unit
      val set_clip_origin : Gdk.gc -> x:int -> y:int -> unit
      val set_clip_mask : Gdk.gc -> Gdk.bitmap -> unit
      val set_clip_rectangle : Gdk.gc -> Gdk.Rectangle.t -> unit
      val set_clip_region : Gdk.gc -> Gdk.region -> unit
      val set_subwindow : Gdk.gc -> Gdk.GC.gdkSubwindowMode -> unit
      val set_exposures : Gdk.gc -> bool -> unit
      val set_line_attributes :
        Gdk.gc ->
        width:int ->
        style:Gdk.GC.gdkLineStyle ->
        cap:Gdk.GC.gdkCapStyle -> join:Gdk.GC.gdkJoinStyle -> unit
      val set_dashes : Gdk.gc -> offset:int -> int list -> unit
      val copy : dst:Gdk.gc -> Gdk.gc -> unit
      type values = {
        foreground : Gdk.color;
        background : Gdk.color;
        font : Gdk.font option;
        fonction : Gdk.GC.gdkFunction;
        fill : Gdk.GC.gdkFill;
        tile : Gdk.pixmap option;
        stipple : Gdk.pixmap option;
        clip_mask : Gdk.bitmap option;
        subwindow_mode : Gdk.GC.gdkSubwindowMode;
        ts_x_origin : int;
        ts_y_origin : int;
        clip_x_origin : int;
        clip_y_origin : int;
        graphics_exposures : bool;
        line_width : int;
        line_style : Gdk.GC.gdkLineStyle;
        cap_style : Gdk.GC.gdkCapStyle;
        join_style : Gdk.GC.gdkJoinStyle;
      }
      val get_values : Gdk.gc -> Gdk.GC.values
    end
  module Pixmap :
    sig
      val cast : 'Gobject.obj -> Gdk.pixmap
      val destroy : [> `gdkpixmap ] Gobject.obj -> unit
      val create :
        ?window:Gdk.window ->
        width:int -> height:int -> ?depth:int -> unit -> Gdk.pixmap
      val create_from_data :
        ?window:Gdk.window ->
        width:int ->
        height:int ->
        ?depth:int -> fg:Gdk.color -> bg:Gdk.color -> string -> Gdk.pixmap
      val create_from_xpm :
        ?window:Gdk.window ->
        ?colormap:Gdk.colormap ->
        ?transparent:Gdk.color ->
        file:string -> unit -> Gdk.pixmap * Gdk.bitmap
      val create_from_xpm_d :
        ?window:Gdk.window ->
        ?colormap:Gdk.colormap ->
        ?transparent:Gdk.color ->
        data:string array -> unit -> Gdk.pixmap * Gdk.bitmap
    end
  module Bitmap :
    sig
      val cast : 'Gobject.obj -> Gdk.bitmap
      val create :
        ?window:Gdk.window -> width:int -> height:int -> unit -> Gdk.bitmap
      val create_from_data :
        ?window:Gdk.window -> width:int -> height:int -> string -> Gdk.bitmap
    end
  module Font :
    sig
      val load : string -> Gdk.font
      val load_fontset : string -> Gdk.font
      val string_width : Gdk.font -> string -> int
      val char_width : Gdk.font -> char -> int
      val string_height : Gdk.font -> string -> int
      val char_height : Gdk.font -> char -> int
      val string_measure : Gdk.font -> string -> int
      val char_measure : Gdk.font -> char -> int
      val get_type : Gdk.font -> [ `FONT | `FONTSET ]
      val ascent : Gdk.font -> int
      val descent : Gdk.font -> int
    end
  module Draw :
    sig
      val point :
        [> `drawable ] Gobject.obj -> Gdk.gc -> x:int -> y:int -> unit
      val line :
        [> `drawable ] Gobject.obj ->
        Gdk.gc -> x:int -> y:int -> x:int -> y:int -> unit
      val rectangle :
        [> `drawable ] Gobject.obj ->
        Gdk.gc ->
        x:int ->
        y:int -> width:int -> height:int -> ?filled:bool -> unit -> unit
      val arc :
        [> `drawable ] Gobject.obj ->
        Gdk.gc ->
        x:int ->
        y:int ->
        width:int ->
        height:int ->
        ?filled:bool -> ?start:float -> ?angle:float -> unit -> unit
      val polygon :
        [> `drawable ] Gobject.obj ->
        Gdk.gc -> ?filled:bool -> (int * int) list -> unit
      val string :
        [> `drawable ] Gobject.obj ->
        font:Gdk.font -> Gdk.gc -> x:int -> y:int -> string -> unit
      val layout :
        [> `drawable ] Gobject.obj ->
        Gdk.gc ->
        x:int ->
        y:int -> Pango.layout -> ?fore:Gdk.color -> ?back:Gdk.color -> unit
      val image :
        [> `drawable ] Gobject.obj ->
        Gdk.gc ->
        ?xsrc:int ->
        ?ysrc:int ->
        ?xdest:int ->
        ?ydest:int -> ?width:int -> ?height:int -> Gdk.image -> unit
      val pixmap :
        [> `drawable ] Gobject.obj ->
        Gdk.gc ->
        ?xsrc:int ->
        ?ysrc:int ->
        ?xdest:int ->
        ?ydest:int -> ?width:int -> ?height:int -> Gdk.pixmap -> unit
      val points :
        [> `drawable ] Gobject.obj -> Gdk.gc -> (int * int) list -> unit
      val lines :
        [> `drawable ] Gobject.obj -> Gdk.gc -> (int * int) list -> unit
      val segments :
        [> `drawable ] Gobject.obj ->
        Gdk.gc -> ((int * int) * (int * int)) list -> unit
    end
  module Rgb :
    sig
      val init : unit -> unit
      val get_visual : unit -> Gdk.visual
      val get_cmap : unit -> Gdk.colormap
      val draw_image :
        [> `drawable ] Gobject.obj ->
        Gdk.gc ->
        width:int ->
        height:int ->
        ?x:int ->
        ?y:int ->
        ?dither:Gdk.Tags.rgb_dither ->
        ?row_stride:int -> Gpointer.region -> unit
    end
  module DnD :
    sig
      val drag_status :
        Gdk.drag_context -> Gdk.Tags.drag_action option -> time:int32 -> unit
      val drag_context_suggested_action :
        Gdk.drag_context -> Gdk.Tags.drag_action
      val drag_context_targets : Gdk.drag_context -> Gdk.atom list
    end
  module Truecolor :
    sig
      val color_creator :
        Gdk.visual -> red:int -> green:int -> blue:int -> int
      val color_parser : Gdk.visual -> int -> int * int * int
    end
  module X : sig val flush : unit -> unit val beep : unit -> unit end
  module Cursor :
    sig
      type cursor_type =
        [ `ARROW
        | `BASED_ARROW_DOWN
        | `BASED_ARROW_UP
        | `BOAT
        | `BOGOSITY
        | `BOTTOM_LEFT_CORNER
        | `BOTTOM_RIGHT_CORNER
        | `BOTTOM_SIDE
        | `BOTTOM_TEE
        | `BOX_SPIRAL
        | `CENTER_PTR
        | `CIRCLE
        | `CLOCK
        | `COFFEE_MUG
        | `CROSS
        | `CROSSHAIR
        | `CROSS_REVERSE
        | `DIAMOND_CROSS
        | `DOT
        | `DOTBOX
        | `DOUBLE_ARROW
        | `DRAFT_LARGE
        | `DRAFT_SMALL
        | `DRAPED_BOX
        | `EXCHANGE
        | `FLEUR
        | `GOBBLER
        | `GUMBY
        | `HAND1
        | `HAND2
        | `HEART
        | `ICON
        | `IRON_CROSS
        | `LEFTBUTTON
        | `LEFT_PTR
        | `LEFT_SIDE
        | `LEFT_TEE
        | `LL_ANGLE
        | `LR_ANGLE
        | `MAN
        | `MIDDLEBUTTON
        | `MOUSE
        | `PENCIL
        | `PIRATE
        | `PLUS
        | `QUESTION_ARROW
        | `RIGHTBUTTON
        | `RIGHT_PTR
        | `RIGHT_SIDE
        | `RIGHT_TEE
        | `RTL_LOGO
        | `SAILBOAT
        | `SB_DOWN_ARROW
        | `SB_H_DOUBLE_ARROW
        | `SB_LEFT_ARROW
        | `SB_RIGHT_ARROW
        | `SB_UP_ARROW
        | `SB_V_DOUBLE_ARROW
        | `SHUTTLE
        | `SIZING
        | `SPIDER
        | `SPRAYCAN
        | `STAR
        | `TARGET
        | `TCROSS
        | `TOP_LEFT_ARROW
        | `TOP_LEFT_CORNER
        | `TOP_RIGHT_CORNER
        | `TOP_SIDE
        | `TOP_TEE
        | `TREK
        | `UL_ANGLE
        | `UMBRELLA
        | `UR_ANGLE
        | `WATCH
        | `XTERM
        | `X_CURSOR ]
      val create : Gdk.Cursor.cursor_type -> Gdk.cursor
      val create_from_pixmap :
        Gdk.pixmap ->
        mask:Gdk.bitmap ->
        fg:Gdk.color -> bg:Gdk.color -> x:int -> y:int -> Gdk.cursor
      val destroy : Gdk.cursor -> unit
    end
end