sig
  type uint8 = int
  type int16 = int
  type uint16 = int
  type uint32 = int32
  type uint64 = int64
  type ('a, 'b) bigarray = ('a, 'b, Bigarray.c_layout) Bigarray.Array1.t
  type 'a result = ('a, [ `Msg of string ]) Result.result
  module Init :
    sig
      type t
      val ( + ) : Tsdl.Sdl.Init.t -> Tsdl.Sdl.Init.t -> Tsdl.Sdl.Init.t
      val test : Tsdl.Sdl.Init.t -> Tsdl.Sdl.Init.t -> bool
      val eq : Tsdl.Sdl.Init.t -> Tsdl.Sdl.Init.t -> bool
      val timer : Tsdl.Sdl.Init.t
      val audio : Tsdl.Sdl.Init.t
      val video : Tsdl.Sdl.Init.t
      val joystick : Tsdl.Sdl.Init.t
      val haptic : Tsdl.Sdl.Init.t
      val gamecontroller : Tsdl.Sdl.Init.t
      val events : Tsdl.Sdl.Init.t
      val everything : Tsdl.Sdl.Init.t
      val noparachute : Tsdl.Sdl.Init.t
    end
  val init : Tsdl.Sdl.Init.t -> unit Tsdl.Sdl.result
  val init_sub_system : Tsdl.Sdl.Init.t -> unit Tsdl.Sdl.result
  val quit : unit -> unit
  val quit_sub_system : Tsdl.Sdl.Init.t -> unit
  val was_init : Tsdl.Sdl.Init.t option -> Tsdl.Sdl.Init.t
  module Hint :
    sig
      type t = string
      val framebuffer_acceleration : Tsdl.Sdl.Hint.t
      val idle_timer_disabled : Tsdl.Sdl.Hint.t
      val orientations : Tsdl.Sdl.Hint.t
      val render_driver : Tsdl.Sdl.Hint.t
      val render_opengl_shaders : Tsdl.Sdl.Hint.t
      val render_scale_quality : Tsdl.Sdl.Hint.t
      val render_vsync : Tsdl.Sdl.Hint.t
      type priority
      val default : Tsdl.Sdl.Hint.priority
      val normal : Tsdl.Sdl.Hint.priority
      val override : Tsdl.Sdl.Hint.priority
    end
  val clear_hints : unit -> unit
  val get_hint : Tsdl.Sdl.Hint.t -> string option
  val set_hint : Tsdl.Sdl.Hint.t -> string -> bool
  val set_hint_with_priority :
    Tsdl.Sdl.Hint.t -> string -> Tsdl.Sdl.Hint.priority -> bool
  val clear_error : unit -> unit
  val get_error : unit -> string
  val set_error : ('b, Format.formatter, unit) Pervasives.format -> 'b
  module Log :
    sig
      type category = int
      val category_application : Tsdl.Sdl.Log.category
      val category_error : Tsdl.Sdl.Log.category
      val category_system : Tsdl.Sdl.Log.category
      val category_audio : Tsdl.Sdl.Log.category
      val category_video : Tsdl.Sdl.Log.category
      val category_render : Tsdl.Sdl.Log.category
      val category_input : Tsdl.Sdl.Log.category
      type priority
      val priority_compare :
        Tsdl.Sdl.Log.priority -> Tsdl.Sdl.Log.priority -> int
      val priority_verbose : Tsdl.Sdl.Log.priority
      val priority_debug : Tsdl.Sdl.Log.priority
      val priority_info : Tsdl.Sdl.Log.priority
      val priority_warn : Tsdl.Sdl.Log.priority
      val priority_error : Tsdl.Sdl.Log.priority
      val priority_critical : Tsdl.Sdl.Log.priority
    end
  val log : ('b, Format.formatter, unit) Pervasives.format -> 'b
  val log_critical :
    Tsdl.Sdl.Log.category ->
    ('b, Format.formatter, unit) Pervasives.format -> 'b
  val log_debug :
    Tsdl.Sdl.Log.category ->
    ('b, Format.formatter, unit) Pervasives.format -> 'b
  val log_error :
    Tsdl.Sdl.Log.category ->
    ('b, Format.formatter, unit) Pervasives.format -> 'b
  val log_get_priority : Tsdl.Sdl.Log.category -> Tsdl.Sdl.Log.priority
  val log_info :
    Tsdl.Sdl.Log.category ->
    ('b, Format.formatter, unit) Pervasives.format -> 'b
  val log_message :
    Tsdl.Sdl.Log.category ->
    Tsdl.Sdl.Log.priority ->
    ('b, Format.formatter, unit) Pervasives.format -> 'b
  val log_reset_priorities : unit -> unit
  val log_set_all_priority : Tsdl.Sdl.Log.priority -> unit
  val log_set_priority :
    Tsdl.Sdl.Log.category -> Tsdl.Sdl.Log.priority -> unit
  val log_verbose :
    Tsdl.Sdl.Log.category ->
    ('b, Format.formatter, unit) Pervasives.format -> 'b
  val log_warn :
    Tsdl.Sdl.Log.category ->
    ('b, Format.formatter, unit) Pervasives.format -> 'b
  val get_version : unit -> int * int * int
  val get_revision : unit -> string
  val get_revision_number : unit -> int
  type rw_ops
  val rw_from_file : string -> string -> Tsdl.Sdl.rw_ops Tsdl.Sdl.result
  val rw_close : Tsdl.Sdl.rw_ops -> unit Tsdl.Sdl.result
  val unsafe_rw_ops_of_ptr : nativeint -> Tsdl.Sdl.rw_ops
  val unsafe_ptr_of_rw_ops : Tsdl.Sdl.rw_ops -> nativeint
  val get_base_path : unit -> string Tsdl.Sdl.result
  val get_pref_path : org:string -> app:string -> string Tsdl.Sdl.result
  type window
  val unsafe_window_of_ptr : nativeint -> Tsdl.Sdl.window
  val unsafe_ptr_of_window : Tsdl.Sdl.window -> nativeint
  type color
  module Color :
    sig
      val create :
        r:Tsdl.Sdl.uint8 ->
        g:Tsdl.Sdl.uint8 ->
        b:Tsdl.Sdl.uint8 -> a:Tsdl.Sdl.uint8 -> Tsdl.Sdl.color
      val r : Tsdl.Sdl.color -> Tsdl.Sdl.uint8
      val g : Tsdl.Sdl.color -> Tsdl.Sdl.uint8
      val b : Tsdl.Sdl.color -> Tsdl.Sdl.uint8
      val a : Tsdl.Sdl.color -> Tsdl.Sdl.uint8
      val set_r : Tsdl.Sdl.color -> Tsdl.Sdl.uint8 -> unit
      val set_g : Tsdl.Sdl.color -> Tsdl.Sdl.uint8 -> unit
      val set_b : Tsdl.Sdl.color -> Tsdl.Sdl.uint8 -> unit
      val set_a : Tsdl.Sdl.color -> Tsdl.Sdl.uint8 -> unit
    end
  type point
  module Point :
    sig
      val create : x:int -> y:int -> Tsdl.Sdl.point
      val x : Tsdl.Sdl.point -> int
      val y : Tsdl.Sdl.point -> int
      val set_x : Tsdl.Sdl.point -> int -> unit
      val set_y : Tsdl.Sdl.point -> int -> unit
    end
  type rect
  module Rect :
    sig
      val create : x:int -> y:int -> w:int -> h:int -> Tsdl.Sdl.rect
      val x : Tsdl.Sdl.rect -> int
      val y : Tsdl.Sdl.rect -> int
      val w : Tsdl.Sdl.rect -> int
      val h : Tsdl.Sdl.rect -> int
      val set_x : Tsdl.Sdl.rect -> int -> unit
      val set_y : Tsdl.Sdl.rect -> int -> unit
      val set_w : Tsdl.Sdl.rect -> int -> unit
      val set_h : Tsdl.Sdl.rect -> int -> unit
    end
  val enclose_points :
    ?clip:Tsdl.Sdl.rect -> Tsdl.Sdl.point list -> Tsdl.Sdl.rect option
  val enclose_points_ba :
    ?clip:Tsdl.Sdl.rect ->
    (int32, Bigarray.int32_elt) Tsdl.Sdl.bigarray -> Tsdl.Sdl.rect option
  val has_intersection : Tsdl.Sdl.rect -> Tsdl.Sdl.rect -> bool
  val intersect_rect : Tsdl.Sdl.rect -> Tsdl.Sdl.rect -> Tsdl.Sdl.rect option
  val intersect_rect_and_line :
    Tsdl.Sdl.rect ->
    int -> int -> int -> int -> ((int * int) * (int * int)) option
  val rect_empty : Tsdl.Sdl.rect -> bool
  val rect_equals : Tsdl.Sdl.rect -> Tsdl.Sdl.rect -> bool
  val union_rect : Tsdl.Sdl.rect -> Tsdl.Sdl.rect -> Tsdl.Sdl.rect
  type palette
  val alloc_palette : int -> Tsdl.Sdl.palette Tsdl.Sdl.result
  val free_palette : Tsdl.Sdl.palette -> unit
  val get_palette_ncolors : Tsdl.Sdl.palette -> int
  val get_palette_colors : Tsdl.Sdl.palette -> Tsdl.Sdl.color list
  val get_palette_colors_ba :
    Tsdl.Sdl.palette -> (int, Bigarray.int8_unsigned_elt) Tsdl.Sdl.bigarray
  val set_palette_colors :
    Tsdl.Sdl.palette ->
    Tsdl.Sdl.color list -> fst:int -> unit Tsdl.Sdl.result
  val set_palette_colors_ba :
    Tsdl.Sdl.palette ->
    (int, Bigarray.int8_unsigned_elt) Tsdl.Sdl.bigarray ->
    fst:int -> unit Tsdl.Sdl.result
  val unsafe_palette_of_ptr : nativeint -> Tsdl.Sdl.palette
  val unsafe_ptr_of_palette : Tsdl.Sdl.palette -> nativeint
  type gamma_ramp = (int, Bigarray.int16_unsigned_elt) Tsdl.Sdl.bigarray
  val calculate_gamma_ramp : float -> Tsdl.Sdl.gamma_ramp
  module Blend :
    sig
      type mode
      val mode_none : Tsdl.Sdl.Blend.mode
      val mode_blend : Tsdl.Sdl.Blend.mode
      val mode_add : Tsdl.Sdl.Blend.mode
      val mode_mod : Tsdl.Sdl.Blend.mode
    end
  module Pixel :
    sig
      type format_enum
      val eq :
        Tsdl.Sdl.Pixel.format_enum -> Tsdl.Sdl.Pixel.format_enum -> bool
      val to_uint32 : Tsdl.Sdl.Pixel.format_enum -> Tsdl.Sdl.uint32
      val format_unknown : Tsdl.Sdl.Pixel.format_enum
      val format_index1lsb : Tsdl.Sdl.Pixel.format_enum
      val format_index1msb : Tsdl.Sdl.Pixel.format_enum
      val format_index4lsb : Tsdl.Sdl.Pixel.format_enum
      val format_index4msb : Tsdl.Sdl.Pixel.format_enum
      val format_index8 : Tsdl.Sdl.Pixel.format_enum
      val format_rgb332 : Tsdl.Sdl.Pixel.format_enum
      val format_rgb444 : Tsdl.Sdl.Pixel.format_enum
      val format_rgb555 : Tsdl.Sdl.Pixel.format_enum
      val format_bgr555 : Tsdl.Sdl.Pixel.format_enum
      val format_argb4444 : Tsdl.Sdl.Pixel.format_enum
      val format_rgba4444 : Tsdl.Sdl.Pixel.format_enum
      val format_abgr4444 : Tsdl.Sdl.Pixel.format_enum
      val format_bgra4444 : Tsdl.Sdl.Pixel.format_enum
      val format_argb1555 : Tsdl.Sdl.Pixel.format_enum
      val format_rgba5551 : Tsdl.Sdl.Pixel.format_enum
      val format_abgr1555 : Tsdl.Sdl.Pixel.format_enum
      val format_bgra5551 : Tsdl.Sdl.Pixel.format_enum
      val format_rgb565 : Tsdl.Sdl.Pixel.format_enum
      val format_bgr565 : Tsdl.Sdl.Pixel.format_enum
      val format_rgb24 : Tsdl.Sdl.Pixel.format_enum
      val format_bgr24 : Tsdl.Sdl.Pixel.format_enum
      val format_rgb888 : Tsdl.Sdl.Pixel.format_enum
      val format_rgbx8888 : Tsdl.Sdl.Pixel.format_enum
      val format_bgr888 : Tsdl.Sdl.Pixel.format_enum
      val format_bgrx8888 : Tsdl.Sdl.Pixel.format_enum
      val format_argb8888 : Tsdl.Sdl.Pixel.format_enum
      val format_rgba8888 : Tsdl.Sdl.Pixel.format_enum
      val format_abgr8888 : Tsdl.Sdl.Pixel.format_enum
      val format_bgra8888 : Tsdl.Sdl.Pixel.format_enum
      val format_argb2101010 : Tsdl.Sdl.Pixel.format_enum
      val format_yv12 : Tsdl.Sdl.Pixel.format_enum
      val format_iyuv : Tsdl.Sdl.Pixel.format_enum
      val format_yuy2 : Tsdl.Sdl.Pixel.format_enum
      val format_uyvy : Tsdl.Sdl.Pixel.format_enum
      val format_yvyu : Tsdl.Sdl.Pixel.format_enum
    end
  type pixel_format
  val alloc_format :
    Tsdl.Sdl.Pixel.format_enum -> Tsdl.Sdl.pixel_format Tsdl.Sdl.result
  val free_format : Tsdl.Sdl.pixel_format -> unit
  val get_pixel_format_name : Tsdl.Sdl.Pixel.format_enum -> string
  val get_pixel_format_format :
    Tsdl.Sdl.pixel_format -> Tsdl.Sdl.Pixel.format_enum
  val get_pixel_format_bits_pp : Tsdl.Sdl.pixel_format -> int
  val get_pixel_format_bytes_pp : Tsdl.Sdl.pixel_format -> int
  val get_rgb :
    Tsdl.Sdl.pixel_format ->
    Tsdl.Sdl.uint32 -> Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8
  val get_rgba :
    Tsdl.Sdl.pixel_format ->
    Tsdl.Sdl.uint32 ->
    Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8
  val map_rgb :
    Tsdl.Sdl.pixel_format ->
    Tsdl.Sdl.uint8 -> Tsdl.Sdl.uint8 -> Tsdl.Sdl.uint8 -> Tsdl.Sdl.uint32
  val map_rgba :
    Tsdl.Sdl.pixel_format ->
    Tsdl.Sdl.uint8 ->
    Tsdl.Sdl.uint8 -> Tsdl.Sdl.uint8 -> Tsdl.Sdl.uint8 -> Tsdl.Sdl.uint32
  val masks_to_pixel_format_enum :
    int ->
    Tsdl.Sdl.uint32 ->
    Tsdl.Sdl.uint32 ->
    Tsdl.Sdl.uint32 -> Tsdl.Sdl.uint32 -> Tsdl.Sdl.Pixel.format_enum
  val pixel_format_enum_to_masks :
    Tsdl.Sdl.Pixel.format_enum ->
    (int * Tsdl.Sdl.uint32 * Tsdl.Sdl.uint32 * Tsdl.Sdl.uint32 *
     Tsdl.Sdl.uint32)
    Tsdl.Sdl.result
  val set_pixel_format_palette :
    Tsdl.Sdl.pixel_format -> Tsdl.Sdl.palette -> unit Tsdl.Sdl.result
  val unsafe_pixel_format_of_ptr : nativeint -> Tsdl.Sdl.pixel_format
  val unsafe_ptr_of_pixel_format : Tsdl.Sdl.pixel_format -> nativeint
  type surface
  val blit_scaled :
    src:Tsdl.Sdl.surface ->
    Tsdl.Sdl.rect ->
    dst:Tsdl.Sdl.surface -> Tsdl.Sdl.rect option -> unit Tsdl.Sdl.result
  val blit_surface :
    src:Tsdl.Sdl.surface ->
    Tsdl.Sdl.rect option ->
    dst:Tsdl.Sdl.surface -> Tsdl.Sdl.rect -> unit Tsdl.Sdl.result
  val convert_pixels :
    w:int ->
    h:int ->
    src:Tsdl.Sdl.Pixel.format_enum ->
    ('a, 'b) Tsdl.Sdl.bigarray ->
    int ->
    dst:Tsdl.Sdl.Pixel.format_enum ->
    ('c, 'd) Tsdl.Sdl.bigarray -> int -> unit Tsdl.Sdl.result
  val convert_surface :
    Tsdl.Sdl.surface ->
    Tsdl.Sdl.pixel_format -> Tsdl.Sdl.surface Tsdl.Sdl.result
  val convert_surface_format :
    Tsdl.Sdl.surface ->
    Tsdl.Sdl.Pixel.format_enum -> Tsdl.Sdl.surface Tsdl.Sdl.result
  val create_rgb_surface :
    w:int ->
    h:int ->
    depth:int ->
    Tsdl.Sdl.uint32 ->
    Tsdl.Sdl.uint32 ->
    Tsdl.Sdl.uint32 -> Tsdl.Sdl.uint32 -> Tsdl.Sdl.surface Tsdl.Sdl.result
  val create_rgb_surface_from :
    ('a, 'b) Tsdl.Sdl.bigarray ->
    w:int ->
    h:int ->
    depth:int ->
    pitch:int ->
    Tsdl.Sdl.uint32 ->
    Tsdl.Sdl.uint32 ->
    Tsdl.Sdl.uint32 -> Tsdl.Sdl.uint32 -> Tsdl.Sdl.surface Tsdl.Sdl.result
  val fill_rect :
    Tsdl.Sdl.surface ->
    Tsdl.Sdl.rect option -> Tsdl.Sdl.uint32 -> unit Tsdl.Sdl.result
  val fill_rects :
    Tsdl.Sdl.surface ->
    Tsdl.Sdl.rect list -> Tsdl.Sdl.uint32 -> unit Tsdl.Sdl.result
  val fill_rects_ba :
    Tsdl.Sdl.surface ->
    (int32, Bigarray.int32_elt) Tsdl.Sdl.bigarray ->
    Tsdl.Sdl.uint32 -> unit Tsdl.Sdl.result
  val free_surface : Tsdl.Sdl.surface -> unit
  val get_clip_rect : Tsdl.Sdl.surface -> Tsdl.Sdl.rect
  val get_color_key : Tsdl.Sdl.surface -> Tsdl.Sdl.uint32 Tsdl.Sdl.result
  val get_surface_alpha_mod :
    Tsdl.Sdl.surface -> Tsdl.Sdl.uint8 Tsdl.Sdl.result
  val get_surface_blend_mode :
    Tsdl.Sdl.surface -> Tsdl.Sdl.Blend.mode Tsdl.Sdl.result
  val get_surface_color_mod :
    Tsdl.Sdl.surface -> (int * int * int) Tsdl.Sdl.result
  val get_surface_format_enum :
    Tsdl.Sdl.surface -> Tsdl.Sdl.Pixel.format_enum
  val get_surface_pitch : Tsdl.Sdl.surface -> int
  val get_surface_pixels :
    Tsdl.Sdl.surface -> ('a, 'b) Bigarray.kind -> ('a, 'b) Tsdl.Sdl.bigarray
  val get_surface_size : Tsdl.Sdl.surface -> int * int
  val load_bmp : string -> Tsdl.Sdl.surface Tsdl.Sdl.result
  val load_bmp_rw :
    Tsdl.Sdl.rw_ops -> close:bool -> Tsdl.Sdl.surface Tsdl.Sdl.result
  val lock_surface : Tsdl.Sdl.surface -> unit Tsdl.Sdl.result
  val lower_blit :
    src:Tsdl.Sdl.surface ->
    Tsdl.Sdl.rect ->
    dst:Tsdl.Sdl.surface -> Tsdl.Sdl.rect -> unit Tsdl.Sdl.result
  val lower_blit_scaled :
    src:Tsdl.Sdl.surface ->
    Tsdl.Sdl.rect ->
    dst:Tsdl.Sdl.surface -> Tsdl.Sdl.rect -> unit Tsdl.Sdl.result
  val save_bmp : Tsdl.Sdl.surface -> string -> unit Tsdl.Sdl.result
  val save_bmp_rw :
    Tsdl.Sdl.surface -> Tsdl.Sdl.rw_ops -> close:bool -> unit Tsdl.Sdl.result
  val set_clip_rect : Tsdl.Sdl.surface -> Tsdl.Sdl.rect -> bool
  val set_color_key :
    Tsdl.Sdl.surface -> bool -> Tsdl.Sdl.uint32 -> unit Tsdl.Sdl.result
  val set_surface_alpha_mod :
    Tsdl.Sdl.surface -> Tsdl.Sdl.uint8 -> unit Tsdl.Sdl.result
  val set_surface_blend_mode :
    Tsdl.Sdl.surface -> Tsdl.Sdl.Blend.mode -> unit Tsdl.Sdl.result
  val set_surface_color_mod :
    Tsdl.Sdl.surface ->
    Tsdl.Sdl.uint8 ->
    Tsdl.Sdl.uint8 -> Tsdl.Sdl.uint8 -> unit Tsdl.Sdl.result
  val set_surface_palette :
    Tsdl.Sdl.surface -> Tsdl.Sdl.palette -> unit Tsdl.Sdl.result
  val set_surface_rle : Tsdl.Sdl.surface -> bool -> unit Tsdl.Sdl.result
  val unlock_surface : Tsdl.Sdl.surface -> unit
  val unsafe_surface_of_ptr : nativeint -> Tsdl.Sdl.surface
  val unsafe_ptr_of_surface : Tsdl.Sdl.surface -> nativeint
  type flip
  module Flip :
    sig
      val ( + ) : Tsdl.Sdl.flip -> Tsdl.Sdl.flip -> Tsdl.Sdl.flip
      val none : Tsdl.Sdl.flip
      val horizontal : Tsdl.Sdl.flip
      val vertical : Tsdl.Sdl.flip
    end
  type texture
  val unsafe_texture_of_ptr : nativeint -> Tsdl.Sdl.texture
  val unsafe_ptr_of_texture : Tsdl.Sdl.texture -> nativeint
  type renderer
  val unsafe_renderer_of_ptr : nativeint -> Tsdl.Sdl.renderer
  val unsafe_ptr_of_renderer : Tsdl.Sdl.renderer -> nativeint
  module Renderer :
    sig
      type flags
      val ( + ) :
        Tsdl.Sdl.Renderer.flags ->
        Tsdl.Sdl.Renderer.flags -> Tsdl.Sdl.Renderer.flags
      val test : Tsdl.Sdl.Renderer.flags -> Tsdl.Sdl.Renderer.flags -> bool
      val eq : Tsdl.Sdl.Renderer.flags -> Tsdl.Sdl.Renderer.flags -> bool
      val software : Tsdl.Sdl.Renderer.flags
      val accelerated : Tsdl.Sdl.Renderer.flags
      val presentvsync : Tsdl.Sdl.Renderer.flags
      val targettexture : Tsdl.Sdl.Renderer.flags
    end
  type renderer_info = {
    ri_name : string;
    ri_flags : Tsdl.Sdl.Renderer.flags;
    ri_texture_formats : Tsdl.Sdl.Pixel.format_enum list;
    ri_max_texture_width : int;
    ri_max_texture_height : int;
  }
  val create_renderer :
    ?index:int ->
    ?flags:Tsdl.Sdl.Renderer.flags ->
    Tsdl.Sdl.window -> Tsdl.Sdl.renderer Tsdl.Sdl.result
  val create_software_renderer :
    Tsdl.Sdl.surface -> Tsdl.Sdl.renderer Tsdl.Sdl.result
  val destroy_renderer : Tsdl.Sdl.renderer -> unit
  val get_num_render_drivers : unit -> int Tsdl.Sdl.result
  val get_render_draw_blend_mode :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.Blend.mode Tsdl.Sdl.result
  val get_render_draw_color :
    Tsdl.Sdl.renderer ->
    (Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8)
    Tsdl.Sdl.result
  val get_render_driver_info : int -> Tsdl.Sdl.renderer_info Tsdl.Sdl.result
  val get_render_target : Tsdl.Sdl.renderer -> Tsdl.Sdl.texture option
  val get_renderer : Tsdl.Sdl.window -> Tsdl.Sdl.renderer Tsdl.Sdl.result
  val get_renderer_info :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.renderer_info Tsdl.Sdl.result
  val get_renderer_output_size :
    Tsdl.Sdl.renderer -> (int * int) Tsdl.Sdl.result
  val render_clear : Tsdl.Sdl.renderer -> unit Tsdl.Sdl.result
  val render_copy :
    ?src:Tsdl.Sdl.rect ->
    ?dst:Tsdl.Sdl.rect ->
    Tsdl.Sdl.renderer -> Tsdl.Sdl.texture -> unit Tsdl.Sdl.result
  val render_copy_ex :
    ?src:Tsdl.Sdl.rect ->
    ?dst:Tsdl.Sdl.rect ->
    Tsdl.Sdl.renderer ->
    Tsdl.Sdl.texture ->
    float -> Tsdl.Sdl.point option -> Tsdl.Sdl.flip -> unit Tsdl.Sdl.result
  val render_draw_line :
    Tsdl.Sdl.renderer -> int -> int -> int -> int -> unit Tsdl.Sdl.result
  val render_draw_lines :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.point list -> unit Tsdl.Sdl.result
  val render_draw_lines_ba :
    Tsdl.Sdl.renderer ->
    (int32, Bigarray.int32_elt) Tsdl.Sdl.bigarray -> unit Tsdl.Sdl.result
  val render_draw_point :
    Tsdl.Sdl.renderer -> int -> int -> unit Tsdl.Sdl.result
  val render_draw_points :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.point list -> unit Tsdl.Sdl.result
  val render_draw_points_ba :
    Tsdl.Sdl.renderer ->
    (int32, Bigarray.int32_elt) Tsdl.Sdl.bigarray -> unit Tsdl.Sdl.result
  val render_draw_rect :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.rect option -> unit Tsdl.Sdl.result
  val render_draw_rects :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.rect list -> unit Tsdl.Sdl.result
  val render_draw_rects_ba :
    Tsdl.Sdl.renderer ->
    (int32, Bigarray.int32_elt) Tsdl.Sdl.bigarray -> unit Tsdl.Sdl.result
  val render_fill_rect :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.rect option -> unit Tsdl.Sdl.result
  val render_fill_rects :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.rect list -> unit Tsdl.Sdl.result
  val render_fill_rects_ba :
    Tsdl.Sdl.renderer ->
    (int32, Bigarray.int32_elt) Tsdl.Sdl.bigarray -> unit Tsdl.Sdl.result
  val render_get_clip_rect : Tsdl.Sdl.renderer -> Tsdl.Sdl.rect
  val render_get_logical_size : Tsdl.Sdl.renderer -> int * int
  val render_get_scale : Tsdl.Sdl.renderer -> float * float
  val render_get_viewport : Tsdl.Sdl.renderer -> Tsdl.Sdl.rect
  val render_present : Tsdl.Sdl.renderer -> unit
  val render_read_pixels :
    Tsdl.Sdl.renderer ->
    Tsdl.Sdl.rect option ->
    Tsdl.Sdl.Pixel.format_enum option ->
    ('a, 'b) Tsdl.Sdl.bigarray -> int -> unit Tsdl.Sdl.result
  val render_set_clip_rect :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.rect option -> unit Tsdl.Sdl.result
  val render_set_logical_size :
    Tsdl.Sdl.renderer -> int -> int -> unit Tsdl.Sdl.result
  val render_set_scale :
    Tsdl.Sdl.renderer -> float -> float -> unit Tsdl.Sdl.result
  val render_set_viewport :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.rect option -> unit Tsdl.Sdl.result
  val render_target_supported : Tsdl.Sdl.renderer -> bool
  val set_render_draw_blend_mode :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.Blend.mode -> unit Tsdl.Sdl.result
  val set_render_draw_color :
    Tsdl.Sdl.renderer ->
    Tsdl.Sdl.uint8 ->
    Tsdl.Sdl.uint8 ->
    Tsdl.Sdl.uint8 -> Tsdl.Sdl.uint8 -> unit Tsdl.Sdl.result
  val set_render_target :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.texture option -> unit Tsdl.Sdl.result
  module Texture :
    sig
      type access
      val access_static : Tsdl.Sdl.Texture.access
      val access_streaming : Tsdl.Sdl.Texture.access
      val access_target : Tsdl.Sdl.Texture.access
      type modulate
      val modulate_none : Tsdl.Sdl.Texture.modulate
      val modulate_color : Tsdl.Sdl.Texture.modulate
      val modulate_alpha : Tsdl.Sdl.Texture.modulate
    end
  val create_texture :
    Tsdl.Sdl.renderer ->
    Tsdl.Sdl.Pixel.format_enum ->
    Tsdl.Sdl.Texture.access ->
    w:int -> h:int -> Tsdl.Sdl.texture Tsdl.Sdl.result
  val create_texture_from_surface :
    Tsdl.Sdl.renderer -> Tsdl.Sdl.surface -> Tsdl.Sdl.texture Tsdl.Sdl.result
  val destroy_texture : Tsdl.Sdl.texture -> unit
  val get_texture_alpha_mod :
    Tsdl.Sdl.texture -> Tsdl.Sdl.uint8 Tsdl.Sdl.result
  val get_texture_blend_mode :
    Tsdl.Sdl.texture -> Tsdl.Sdl.Blend.mode Tsdl.Sdl.result
  val get_texture_color_mod :
    Tsdl.Sdl.texture ->
    (Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8 * Tsdl.Sdl.uint8) Tsdl.Sdl.result
  val lock_texture :
    Tsdl.Sdl.texture ->
    Tsdl.Sdl.rect option ->
    ('a, 'b) Bigarray.kind ->
    (('a, 'b) Tsdl.Sdl.bigarray * int) Tsdl.Sdl.result
  val query_texture :
    Tsdl.Sdl.texture ->
    (Tsdl.Sdl.Pixel.format_enum * Tsdl.Sdl.Texture.access * (int * int))
    Tsdl.Sdl.result
  val set_texture_alpha_mod :
    Tsdl.Sdl.texture -> Tsdl.Sdl.uint8 -> unit Tsdl.Sdl.result
  val set_texture_blend_mode :
    Tsdl.Sdl.texture -> Tsdl.Sdl.Blend.mode -> unit Tsdl.Sdl.result
  val set_texture_color_mod :
    Tsdl.Sdl.texture ->
    Tsdl.Sdl.uint8 ->
    Tsdl.Sdl.uint8 -> Tsdl.Sdl.uint8 -> unit Tsdl.Sdl.result
  val unlock_texture : Tsdl.Sdl.texture -> unit
  val update_texture :
    Tsdl.Sdl.texture ->
    Tsdl.Sdl.rect option ->
    ('a, 'b) Tsdl.Sdl.bigarray -> int -> unit Tsdl.Sdl.result
  val update_yuv_texture :
    Tsdl.Sdl.texture ->
    Tsdl.Sdl.rect option ->
    y:(int, Bigarray.int8_unsigned_elt) Tsdl.Sdl.bigarray ->
    int ->
    u:(int, Bigarray.int8_unsigned_elt) Tsdl.Sdl.bigarray ->
    int ->
    v:(int, Bigarray.int8_unsigned_elt) Tsdl.Sdl.bigarray ->
    int -> unit Tsdl.Sdl.result
  val get_current_video_driver : unit -> string option
  val get_num_video_drivers : unit -> int Tsdl.Sdl.result
  val get_video_driver : int -> string Tsdl.Sdl.result
  val video_init : string option -> unit Tsdl.Sdl.result
  val video_quit : unit -> unit
  type driverdata
  type display_mode = {
    dm_format : Tsdl.Sdl.Pixel.format_enum;
    dm_w : int;
    dm_h : int;
    dm_refresh_rate : int option;
    dm_driverdata : Tsdl.Sdl.driverdata option;
  }
  val get_closest_display_mode :
    int -> Tsdl.Sdl.display_mode -> Tsdl.Sdl.display_mode option
  val get_current_display_mode : int -> Tsdl.Sdl.display_mode Tsdl.Sdl.result
  val get_desktop_display_mode : int -> Tsdl.Sdl.display_mode Tsdl.Sdl.result
  val get_display_bounds : int -> Tsdl.Sdl.rect Tsdl.Sdl.result
  val get_display_mode : int -> int -> Tsdl.Sdl.display_mode Tsdl.Sdl.result
  val get_display_name : int -> string Tsdl.Sdl.result
  val get_num_display_modes : int -> int Tsdl.Sdl.result
  val get_num_video_displays : unit -> int Tsdl.Sdl.result
  module Window :
    sig
      val pos_undefined : int
      val pos_centered : int
      type flags
      val ( + ) :
        Tsdl.Sdl.Window.flags ->
        Tsdl.Sdl.Window.flags -> Tsdl.Sdl.Window.flags
      val test : Tsdl.Sdl.Window.flags -> Tsdl.Sdl.Window.flags -> bool
      val eq : Tsdl.Sdl.Window.flags -> Tsdl.Sdl.Window.flags -> bool
      val windowed : Tsdl.Sdl.Window.flags
      val fullscreen : Tsdl.Sdl.Window.flags
      val fullscreen_desktop : Tsdl.Sdl.Window.flags
      val opengl : Tsdl.Sdl.Window.flags
      val shown : Tsdl.Sdl.Window.flags
      val hidden : Tsdl.Sdl.Window.flags
      val borderless : Tsdl.Sdl.Window.flags
      val resizable : Tsdl.Sdl.Window.flags
      val minimized : Tsdl.Sdl.Window.flags
      val maximized : Tsdl.Sdl.Window.flags
      val input_grabbed : Tsdl.Sdl.Window.flags
      val input_focus : Tsdl.Sdl.Window.flags
      val mouse_focus : Tsdl.Sdl.Window.flags
      val foreign : Tsdl.Sdl.Window.flags
      val allow_highdpi : Tsdl.Sdl.Window.flags
    end
  val create_window :
    string ->
    ?x:int ->
    ?y:int ->
    w:int ->
    h:int -> Tsdl.Sdl.Window.flags -> Tsdl.Sdl.window Tsdl.Sdl.result
  val create_window_and_renderer :
    w:int ->
    h:int ->
    Tsdl.Sdl.Window.flags ->
    (Tsdl.Sdl.window * Tsdl.Sdl.renderer) Tsdl.Sdl.result
  val destroy_window : Tsdl.Sdl.window -> unit
  val get_window_brightness : Tsdl.Sdl.window -> float
  val get_window_display_index : Tsdl.Sdl.window -> int Tsdl.Sdl.result
  val get_window_display_mode :
    Tsdl.Sdl.window -> Tsdl.Sdl.display_mode Tsdl.Sdl.result
  val get_window_flags : Tsdl.Sdl.window -> Tsdl.Sdl.Window.flags
  val get_window_from_id : int -> Tsdl.Sdl.window Tsdl.Sdl.result
  val get_window_gamma_ramp :
    Tsdl.Sdl.window ->
    (Tsdl.Sdl.gamma_ramp * Tsdl.Sdl.gamma_ramp * Tsdl.Sdl.gamma_ramp)
    Tsdl.Sdl.result
  val get_window_grab : Tsdl.Sdl.window -> bool
  val get_window_id : Tsdl.Sdl.window -> int
  val get_window_maximum_size : Tsdl.Sdl.window -> int * int
  val get_window_minimum_size : Tsdl.Sdl.window -> int * int
  val get_window_pixel_format : Tsdl.Sdl.window -> Tsdl.Sdl.Pixel.format_enum
  val get_window_position : Tsdl.Sdl.window -> int * int
  val get_window_size : Tsdl.Sdl.window -> int * int
  val get_window_surface :
    Tsdl.Sdl.window -> Tsdl.Sdl.surface Tsdl.Sdl.result
  val get_window_title : Tsdl.Sdl.window -> string
  val hide_window : Tsdl.Sdl.window -> unit
  val maximize_window : Tsdl.Sdl.window -> unit
  val minimize_window : Tsdl.Sdl.window -> unit
  val raise_window : Tsdl.Sdl.window -> unit
  val restore_window : Tsdl.Sdl.window -> unit
  val set_window_bordered : Tsdl.Sdl.window -> bool -> unit
  val set_window_brightness :
    Tsdl.Sdl.window -> float -> unit Tsdl.Sdl.result
  val set_window_display_mode :
    Tsdl.Sdl.window -> Tsdl.Sdl.display_mode -> unit Tsdl.Sdl.result
  val set_window_fullscreen :
    Tsdl.Sdl.window -> Tsdl.Sdl.Window.flags -> unit Tsdl.Sdl.result
  val set_window_gamma_ramp :
    Tsdl.Sdl.window ->
    Tsdl.Sdl.gamma_ramp ->
    Tsdl.Sdl.gamma_ramp -> Tsdl.Sdl.gamma_ramp -> unit Tsdl.Sdl.result
  val set_window_grab : Tsdl.Sdl.window -> bool -> unit
  val set_window_icon : Tsdl.Sdl.window -> Tsdl.Sdl.surface -> unit
  val set_window_maximum_size : Tsdl.Sdl.window -> w:int -> h:int -> unit
  val set_window_minimum_size : Tsdl.Sdl.window -> w:int -> h:int -> unit
  val set_window_position : Tsdl.Sdl.window -> x:int -> y:int -> unit
  val set_window_size : Tsdl.Sdl.window -> w:int -> h:int -> unit
  val set_window_title : Tsdl.Sdl.window -> string -> unit
  val show_window : Tsdl.Sdl.window -> unit
  val update_window_surface : Tsdl.Sdl.window -> unit Tsdl.Sdl.result
  val update_window_surface_rects :
    Tsdl.Sdl.window -> Tsdl.Sdl.rect list -> unit Tsdl.Sdl.result
  val update_window_surface_rects_ba :
    Tsdl.Sdl.window ->
    (int32, Bigarray.int32_elt) Tsdl.Sdl.bigarray -> unit Tsdl.Sdl.result
  type gl_context
  val unsafe_gl_context_of_ptr : nativeint -> Tsdl.Sdl.gl_context
  val unsafe_ptr_of_gl_context : Tsdl.Sdl.gl_context -> nativeint
  module Gl :
    sig
      type context_flags = int
      val context_debug_flag : Tsdl.Sdl.Gl.context_flags
      val context_forward_compatible_flag : Tsdl.Sdl.Gl.context_flags
      val context_robust_access_flag : Tsdl.Sdl.Gl.context_flags
      val context_reset_isolation_flag : Tsdl.Sdl.Gl.context_flags
      type profile = int
      val context_profile_core : Tsdl.Sdl.Gl.profile
      val context_profile_compatibility : Tsdl.Sdl.Gl.profile
      val context_profile_es : Tsdl.Sdl.Gl.profile
      type attr
      val red_size : Tsdl.Sdl.Gl.attr
      val green_size : Tsdl.Sdl.Gl.attr
      val blue_size : Tsdl.Sdl.Gl.attr
      val alpha_size : Tsdl.Sdl.Gl.attr
      val buffer_size : Tsdl.Sdl.Gl.attr
      val doublebuffer : Tsdl.Sdl.Gl.attr
      val depth_size : Tsdl.Sdl.Gl.attr
      val stencil_size : Tsdl.Sdl.Gl.attr
      val accum_red_size : Tsdl.Sdl.Gl.attr
      val accum_green_size : Tsdl.Sdl.Gl.attr
      val accum_blue_size : Tsdl.Sdl.Gl.attr
      val accum_alpha_size : Tsdl.Sdl.Gl.attr
      val stereo : Tsdl.Sdl.Gl.attr
      val multisamplebuffers : Tsdl.Sdl.Gl.attr
      val multisamplesamples : Tsdl.Sdl.Gl.attr
      val accelerated_visual : Tsdl.Sdl.Gl.attr
      val context_major_version : Tsdl.Sdl.Gl.attr
      val context_minor_version : Tsdl.Sdl.Gl.attr
      val context_egl : Tsdl.Sdl.Gl.attr
      val context_flags : Tsdl.Sdl.Gl.attr
      val context_profile_mask : Tsdl.Sdl.Gl.attr
      val share_with_current_context : Tsdl.Sdl.Gl.attr
      val framebuffer_srgb_capable : Tsdl.Sdl.Gl.attr
    end
  val gl_create_context :
    Tsdl.Sdl.window -> Tsdl.Sdl.gl_context Tsdl.Sdl.result
  val gl_bind_texture : Tsdl.Sdl.texture -> (float * float) Tsdl.Sdl.result
  val gl_delete_context : Tsdl.Sdl.gl_context -> unit
  val gl_extension_supported : string -> bool
  val gl_get_attribute : Tsdl.Sdl.Gl.attr -> int Tsdl.Sdl.result
  val gl_get_current_context : unit -> Tsdl.Sdl.gl_context Tsdl.Sdl.result
  val gl_get_drawable_size : Tsdl.Sdl.window -> int * int
  val gl_get_swap_interval : unit -> int Tsdl.Sdl.result
  val gl_make_current :
    Tsdl.Sdl.window -> Tsdl.Sdl.gl_context -> unit Tsdl.Sdl.result
  val gl_set_attribute : Tsdl.Sdl.Gl.attr -> int -> unit Tsdl.Sdl.result
  val gl_set_swap_interval : int -> unit Tsdl.Sdl.result
  val gl_swap_window : Tsdl.Sdl.window -> unit
  val gl_reset_attributes : unit -> unit
  val gl_unbind_texture : Tsdl.Sdl.texture -> unit Tsdl.Sdl.result
  val disable_screen_saver : unit -> unit
  val enable_screen_saver : unit -> unit
  val is_screen_saver_enabled : unit -> bool
  module Message_box :
    sig
      type button_flags
      val button_returnkey_default : Tsdl.Sdl.Message_box.button_flags
      val button_escapekey_default : Tsdl.Sdl.Message_box.button_flags
      type button_data = {
        button_flags : Tsdl.Sdl.Message_box.button_flags;
        button_id : int;
        button_text : string;
      }
      type flags
      val error : Tsdl.Sdl.Message_box.flags
      val warning : Tsdl.Sdl.Message_box.flags
      val information : Tsdl.Sdl.Message_box.flags
      type color = int * int * int
      type color_scheme = {
        color_background : Tsdl.Sdl.Message_box.color;
        color_text : Tsdl.Sdl.Message_box.color;
        color_button_border : Tsdl.Sdl.Message_box.color;
        color_button_background : Tsdl.Sdl.Message_box.color;
        color_button_selected : Tsdl.Sdl.Message_box.color;
      }
      type data = {
        flags : Tsdl.Sdl.Message_box.flags;
        window : Tsdl.Sdl.window option;
        title : string;
        message : string;
        buttons : Tsdl.Sdl.Message_box.button_data list;
        color_scheme : Tsdl.Sdl.Message_box.color_scheme option;
      }
    end
  val show_message_box : Tsdl.Sdl.Message_box.data -> int Tsdl.Sdl.result
  val show_simple_message_box :
    Tsdl.Sdl.Message_box.flags ->
    title:string -> string -> Tsdl.Sdl.window option -> unit Tsdl.Sdl.result
  val get_clipboard_text : unit -> string Tsdl.Sdl.result
  val has_clipboard_text : unit -> bool
  val set_clipboard_text : string -> unit Tsdl.Sdl.result
  type button_state
  val pressed : Tsdl.Sdl.button_state
  val released : Tsdl.Sdl.button_state
  type toggle_state
  val disable : Tsdl.Sdl.toggle_state
  val enable : Tsdl.Sdl.toggle_state
  type scancode = int
  module Scancode :
    sig
      val enum :
        Tsdl.Sdl.scancode ->
        [ `A
        | `Ac_back
        | `Ac_bookmarks
        | `Ac_forward
        | `Ac_home
        | `Ac_refresh
        | `Ac_search
        | `Ac_stop
        | `Again
        | `Alterase
        | `Apostrophe
        | `App1
        | `App2
        | `Application
        | `Audiomute
        | `Audionext
        | `Audioplay
        | `Audioprev
        | `Audiostop
        | `B
        | `Backslash
        | `Backspace
        | `Brightnessdown
        | `Brightnessup
        | `C
        | `Calculator
        | `Cancel
        | `Capslock
        | `Clear
        | `Clearagain
        | `Comma
        | `Computer
        | `Copy
        | `Crsel
        | `Currencysubunit
        | `Currencyunit
        | `Cut
        | `D
        | `Decimalseparator
        | `Delete
        | `Displayswitch
        | `Down
        | `E
        | `Eject
        | `End
        | `Equals
        | `Escape
        | `Execute
        | `Exsel
        | `F
        | `F1
        | `F10
        | `F11
        | `F12
        | `F13
        | `F14
        | `F15
        | `F16
        | `F17
        | `F18
        | `F19
        | `F2
        | `F20
        | `F21
        | `F22
        | `F23
        | `F24
        | `F3
        | `F4
        | `F5
        | `F6
        | `F7
        | `F8
        | `F9
        | `Find
        | `G
        | `Grave
        | `H
        | `Help
        | `Home
        | `I
        | `Insert
        | `International1
        | `International2
        | `International3
        | `International4
        | `International5
        | `International6
        | `International7
        | `International8
        | `International9
        | `J
        | `K
        | `K0
        | `K1
        | `K2
        | `K3
        | `K4
        | `K5
        | `K6
        | `K7
        | `K8
        | `K9
        | `Kbdillumdown
        | `Kbdillumtoggle
        | `Kbdillumup
        | `Kp_0
        | `Kp_00
        | `Kp_000
        | `Kp_1
        | `Kp_2
        | `Kp_3
        | `Kp_4
        | `Kp_5
        | `Kp_6
        | `Kp_7
        | `Kp_8
        | `Kp_9
        | `Kp_a
        | `Kp_ampersand
        | `Kp_at
        | `Kp_b
        | `Kp_backspace
        | `Kp_binary
        | `Kp_c
        | `Kp_clear
        | `Kp_clearentry
        | `Kp_colon
        | `Kp_comma
        | `Kp_d
        | `Kp_dblampersand
        | `Kp_dblverticalbar
        | `Kp_decimal
        | `Kp_divide
        | `Kp_e
        | `Kp_enter
        | `Kp_equals
        | `Kp_equalsas400
        | `Kp_exclam
        | `Kp_f
        | `Kp_greater
        | `Kp_hash
        | `Kp_hexadecimal
        | `Kp_leftbrace
        | `Kp_leftparen
        | `Kp_less
        | `Kp_memadd
        | `Kp_memclear
        | `Kp_memdivide
        | `Kp_memmultiply
        | `Kp_memrecall
        | `Kp_memstore
        | `Kp_memsubtract
        | `Kp_minus
        | `Kp_multiply
        | `Kp_octal
        | `Kp_percent
        | `Kp_period
        | `Kp_plus
        | `Kp_plusminus
        | `Kp_power
        | `Kp_rightbrace
        | `Kp_rightparen
        | `Kp_space
        | `Kp_tab
        | `Kp_verticalbar
        | `Kp_xor
        | `L
        | `Lalt
        | `Lang1
        | `Lang2
        | `Lang3
        | `Lang4
        | `Lang5
        | `Lang6
        | `Lang7
        | `Lang8
        | `Lang9
        | `Lctrl
        | `Left
        | `Leftbracket
        | `Lgui
        | `Lshift
        | `M
        | `Mail
        | `Mediaselect
        | `Menu
        | `Minus
        | `Mode
        | `Mute
        | `N
        | `Nonusbackslash
        | `Nonushash
        | `Numlockclear
        | `O
        | `Oper
        | `Out
        | `P
        | `Pagedown
        | `Pageup
        | `Paste
        | `Pause
        | `Period
        | `Power
        | `Printscreen
        | `Prior
        | `Q
        | `R
        | `Ralt
        | `Rctrl
        | `Return
        | `Return2
        | `Rgui
        | `Right
        | `Rightbracket
        | `Rshift
        | `S
        | `Scrolllock
        | `Select
        | `Semicolon
        | `Separator
        | `Slash
        | `Sleep
        | `Space
        | `Stop
        | `Sysreq
        | `T
        | `Tab
        | `Thousandsseparator
        | `U
        | `Undo
        | `Unknown
        | `Up
        | `V
        | `Volumedown
        | `Volumeup
        | `W
        | `Www
        | `X
        | `Y
        | `Z ]
      val num_scancodes : int
      val unknown : Tsdl.Sdl.scancode
      val a : Tsdl.Sdl.scancode
      val b : Tsdl.Sdl.scancode
      val c : Tsdl.Sdl.scancode
      val d : Tsdl.Sdl.scancode
      val e : Tsdl.Sdl.scancode
      val f : Tsdl.Sdl.scancode
      val g : Tsdl.Sdl.scancode
      val h : Tsdl.Sdl.scancode
      val i : Tsdl.Sdl.scancode
      val j : Tsdl.Sdl.scancode
      val k : Tsdl.Sdl.scancode
      val l : Tsdl.Sdl.scancode
      val m : Tsdl.Sdl.scancode
      val n : Tsdl.Sdl.scancode
      val o : Tsdl.Sdl.scancode
      val p : Tsdl.Sdl.scancode
      val q : Tsdl.Sdl.scancode
      val r : Tsdl.Sdl.scancode
      val s : Tsdl.Sdl.scancode
      val t : Tsdl.Sdl.scancode
      val u : Tsdl.Sdl.scancode
      val v : Tsdl.Sdl.scancode
      val w : Tsdl.Sdl.scancode
      val x : Tsdl.Sdl.scancode
      val y : Tsdl.Sdl.scancode
      val z : Tsdl.Sdl.scancode
      val k1 : Tsdl.Sdl.scancode
      val k2 : Tsdl.Sdl.scancode
      val k3 : Tsdl.Sdl.scancode
      val k4 : Tsdl.Sdl.scancode
      val k5 : Tsdl.Sdl.scancode
      val k6 : Tsdl.Sdl.scancode
      val k7 : Tsdl.Sdl.scancode
      val k8 : Tsdl.Sdl.scancode
      val k9 : Tsdl.Sdl.scancode
      val k0 : Tsdl.Sdl.scancode
      val return : Tsdl.Sdl.scancode
      val escape : Tsdl.Sdl.scancode
      val backspace : Tsdl.Sdl.scancode
      val tab : Tsdl.Sdl.scancode
      val space : Tsdl.Sdl.scancode
      val minus : Tsdl.Sdl.scancode
      val equals : Tsdl.Sdl.scancode
      val leftbracket : Tsdl.Sdl.scancode
      val rightbracket : Tsdl.Sdl.scancode
      val backslash : Tsdl.Sdl.scancode
      val nonushash : Tsdl.Sdl.scancode
      val semicolon : Tsdl.Sdl.scancode
      val apostrophe : Tsdl.Sdl.scancode
      val grave : Tsdl.Sdl.scancode
      val comma : Tsdl.Sdl.scancode
      val period : Tsdl.Sdl.scancode
      val slash : Tsdl.Sdl.scancode
      val capslock : Tsdl.Sdl.scancode
      val f1 : Tsdl.Sdl.scancode
      val f2 : Tsdl.Sdl.scancode
      val f3 : Tsdl.Sdl.scancode
      val f4 : Tsdl.Sdl.scancode
      val f5 : Tsdl.Sdl.scancode
      val f6 : Tsdl.Sdl.scancode
      val f7 : Tsdl.Sdl.scancode
      val f8 : Tsdl.Sdl.scancode
      val f9 : Tsdl.Sdl.scancode
      val f10 : Tsdl.Sdl.scancode
      val f11 : Tsdl.Sdl.scancode
      val f12 : Tsdl.Sdl.scancode
      val printscreen : Tsdl.Sdl.scancode
      val scrolllock : Tsdl.Sdl.scancode
      val pause : Tsdl.Sdl.scancode
      val insert : Tsdl.Sdl.scancode
      val home : Tsdl.Sdl.scancode
      val pageup : Tsdl.Sdl.scancode
      val delete : Tsdl.Sdl.scancode
      val kend : Tsdl.Sdl.scancode
      val pagedown : Tsdl.Sdl.scancode
      val right : Tsdl.Sdl.scancode
      val left : Tsdl.Sdl.scancode
      val down : Tsdl.Sdl.scancode
      val up : Tsdl.Sdl.scancode
      val numlockclear : Tsdl.Sdl.scancode
      val kp_divide : Tsdl.Sdl.scancode
      val kp_multiply : Tsdl.Sdl.scancode
      val kp_minus : Tsdl.Sdl.scancode
      val kp_plus : Tsdl.Sdl.scancode
      val kp_enter : Tsdl.Sdl.scancode
      val kp_1 : Tsdl.Sdl.scancode
      val kp_2 : Tsdl.Sdl.scancode
      val kp_3 : Tsdl.Sdl.scancode
      val kp_4 : Tsdl.Sdl.scancode
      val kp_5 : Tsdl.Sdl.scancode
      val kp_6 : Tsdl.Sdl.scancode
      val kp_7 : Tsdl.Sdl.scancode
      val kp_8 : Tsdl.Sdl.scancode
      val kp_9 : Tsdl.Sdl.scancode
      val kp_0 : Tsdl.Sdl.scancode
      val kp_period : Tsdl.Sdl.scancode
      val nonusbackslash : Tsdl.Sdl.scancode
      val application : Tsdl.Sdl.scancode
      val kp_equals : Tsdl.Sdl.scancode
      val f13 : Tsdl.Sdl.scancode
      val f14 : Tsdl.Sdl.scancode
      val f15 : Tsdl.Sdl.scancode
      val f16 : Tsdl.Sdl.scancode
      val f17 : Tsdl.Sdl.scancode
      val f18 : Tsdl.Sdl.scancode
      val f19 : Tsdl.Sdl.scancode
      val f20 : Tsdl.Sdl.scancode
      val f21 : Tsdl.Sdl.scancode
      val f22 : Tsdl.Sdl.scancode
      val f23 : Tsdl.Sdl.scancode
      val f24 : Tsdl.Sdl.scancode
      val execute : Tsdl.Sdl.scancode
      val help : Tsdl.Sdl.scancode
      val menu : Tsdl.Sdl.scancode
      val select : Tsdl.Sdl.scancode
      val stop : Tsdl.Sdl.scancode
      val again : Tsdl.Sdl.scancode
      val undo : Tsdl.Sdl.scancode
      val cut : Tsdl.Sdl.scancode
      val copy : Tsdl.Sdl.scancode
      val paste : Tsdl.Sdl.scancode
      val find : Tsdl.Sdl.scancode
      val mute : Tsdl.Sdl.scancode
      val volumeup : Tsdl.Sdl.scancode
      val volumedown : Tsdl.Sdl.scancode
      val kp_comma : Tsdl.Sdl.scancode
      val kp_equalsas400 : Tsdl.Sdl.scancode
      val international1 : Tsdl.Sdl.scancode
      val international2 : Tsdl.Sdl.scancode
      val international3 : Tsdl.Sdl.scancode
      val international4 : Tsdl.Sdl.scancode
      val international5 : Tsdl.Sdl.scancode
      val international6 : Tsdl.Sdl.scancode
      val international7 : Tsdl.Sdl.scancode
      val international8 : Tsdl.Sdl.scancode
      val international9 : Tsdl.Sdl.scancode
      val lang1 : Tsdl.Sdl.scancode
      val lang2 : Tsdl.Sdl.scancode
      val lang3 : Tsdl.Sdl.scancode
      val lang4 : Tsdl.Sdl.scancode
      val lang5 : Tsdl.Sdl.scancode
      val lang6 : Tsdl.Sdl.scancode
      val lang7 : Tsdl.Sdl.scancode
      val lang8 : Tsdl.Sdl.scancode
      val lang9 : Tsdl.Sdl.scancode
      val alterase : Tsdl.Sdl.scancode
      val sysreq : Tsdl.Sdl.scancode
      val cancel : Tsdl.Sdl.scancode
      val clear : Tsdl.Sdl.scancode
      val prior : Tsdl.Sdl.scancode
      val return2 : Tsdl.Sdl.scancode
      val separator : Tsdl.Sdl.scancode
      val out : Tsdl.Sdl.scancode
      val oper : Tsdl.Sdl.scancode
      val clearagain : Tsdl.Sdl.scancode
      val crsel : Tsdl.Sdl.scancode
      val exsel : Tsdl.Sdl.scancode
      val kp_00 : Tsdl.Sdl.scancode
      val kp_000 : Tsdl.Sdl.scancode
      val thousandsseparator : Tsdl.Sdl.scancode
      val decimalseparator : Tsdl.Sdl.scancode
      val currencyunit : Tsdl.Sdl.scancode
      val currencysubunit : Tsdl.Sdl.scancode
      val kp_leftparen : Tsdl.Sdl.scancode
      val kp_rightparen : Tsdl.Sdl.scancode
      val kp_leftbrace : Tsdl.Sdl.scancode
      val kp_rightbrace : Tsdl.Sdl.scancode
      val kp_tab : Tsdl.Sdl.scancode
      val kp_backspace : Tsdl.Sdl.scancode
      val kp_a : Tsdl.Sdl.scancode
      val kp_b : Tsdl.Sdl.scancode
      val kp_c : Tsdl.Sdl.scancode
      val kp_d : Tsdl.Sdl.scancode
      val kp_e : Tsdl.Sdl.scancode
      val kp_f : Tsdl.Sdl.scancode
      val kp_xor : Tsdl.Sdl.scancode
      val kp_power : Tsdl.Sdl.scancode
      val kp_percent : Tsdl.Sdl.scancode
      val kp_less : Tsdl.Sdl.scancode
      val kp_greater : Tsdl.Sdl.scancode
      val kp_ampersand : Tsdl.Sdl.scancode
      val kp_dblampersand : Tsdl.Sdl.scancode
      val kp_verticalbar : Tsdl.Sdl.scancode
      val kp_dblverticalbar : Tsdl.Sdl.scancode
      val kp_colon : Tsdl.Sdl.scancode
      val kp_hash : Tsdl.Sdl.scancode
      val kp_space : Tsdl.Sdl.scancode
      val kp_at : Tsdl.Sdl.scancode
      val kp_exclam : Tsdl.Sdl.scancode
      val kp_memstore : Tsdl.Sdl.scancode
      val kp_memrecall : Tsdl.Sdl.scancode
      val kp_memclear : Tsdl.Sdl.scancode
      val kp_memadd : Tsdl.Sdl.scancode
      val kp_memsubtract : Tsdl.Sdl.scancode
      val kp_memmultiply : Tsdl.Sdl.scancode
      val kp_memdivide : Tsdl.Sdl.scancode
      val kp_plusminus : Tsdl.Sdl.scancode
      val kp_clear : Tsdl.Sdl.scancode
      val kp_clearentry : Tsdl.Sdl.scancode
      val kp_binary : Tsdl.Sdl.scancode
      val kp_octal : Tsdl.Sdl.scancode
      val kp_decimal : Tsdl.Sdl.scancode
      val kp_hexadecimal : Tsdl.Sdl.scancode
      val lctrl : Tsdl.Sdl.scancode
      val lshift : Tsdl.Sdl.scancode
      val lalt : Tsdl.Sdl.scancode
      val lgui : Tsdl.Sdl.scancode
      val rctrl : Tsdl.Sdl.scancode
      val rshift : Tsdl.Sdl.scancode
      val ralt : Tsdl.Sdl.scancode
      val rgui : Tsdl.Sdl.scancode
      val mode : Tsdl.Sdl.scancode
      val audionext : Tsdl.Sdl.scancode
      val audioprev : Tsdl.Sdl.scancode
      val audiostop : Tsdl.Sdl.scancode
      val audioplay : Tsdl.Sdl.scancode
      val audiomute : Tsdl.Sdl.scancode
      val mediaselect : Tsdl.Sdl.scancode
      val www : Tsdl.Sdl.scancode
      val mail : Tsdl.Sdl.scancode
      val calculator : Tsdl.Sdl.scancode
      val computer : Tsdl.Sdl.scancode
      val ac_search : Tsdl.Sdl.scancode
      val ac_home : Tsdl.Sdl.scancode
      val ac_back : Tsdl.Sdl.scancode
      val ac_forward : Tsdl.Sdl.scancode
      val ac_stop : Tsdl.Sdl.scancode
      val ac_refresh : Tsdl.Sdl.scancode
      val ac_bookmarks : Tsdl.Sdl.scancode
      val brightnessdown : Tsdl.Sdl.scancode
      val brightnessup : Tsdl.Sdl.scancode
      val displayswitch : Tsdl.Sdl.scancode
      val kbdillumtoggle : Tsdl.Sdl.scancode
      val kbdillumdown : Tsdl.Sdl.scancode
      val kbdillumup : Tsdl.Sdl.scancode
      val eject : Tsdl.Sdl.scancode
      val sleep : Tsdl.Sdl.scancode
      val app1 : Tsdl.Sdl.scancode
      val app2 : Tsdl.Sdl.scancode
    end
  type keycode = int
  module K :
    sig
      val scancode_mask : int
      val unknown : Tsdl.Sdl.keycode
      val return : Tsdl.Sdl.keycode
      val escape : Tsdl.Sdl.keycode
      val backspace : Tsdl.Sdl.keycode
      val tab : Tsdl.Sdl.keycode
      val space : Tsdl.Sdl.keycode
      val exclaim : Tsdl.Sdl.keycode
      val quotedbl : Tsdl.Sdl.keycode
      val hash : Tsdl.Sdl.keycode
      val percent : Tsdl.Sdl.keycode
      val dollar : Tsdl.Sdl.keycode
      val ampersand : Tsdl.Sdl.keycode
      val quote : Tsdl.Sdl.keycode
      val leftparen : Tsdl.Sdl.keycode
      val rightparen : Tsdl.Sdl.keycode
      val asterisk : Tsdl.Sdl.keycode
      val plus : Tsdl.Sdl.keycode
      val comma : Tsdl.Sdl.keycode
      val minus : Tsdl.Sdl.keycode
      val period : Tsdl.Sdl.keycode
      val slash : Tsdl.Sdl.keycode
      val k0 : Tsdl.Sdl.keycode
      val k1 : Tsdl.Sdl.keycode
      val k2 : Tsdl.Sdl.keycode
      val k3 : Tsdl.Sdl.keycode
      val k4 : Tsdl.Sdl.keycode
      val k5 : Tsdl.Sdl.keycode
      val k6 : Tsdl.Sdl.keycode
      val k7 : Tsdl.Sdl.keycode
      val k8 : Tsdl.Sdl.keycode
      val k9 : Tsdl.Sdl.keycode
      val colon : Tsdl.Sdl.keycode
      val semicolon : Tsdl.Sdl.keycode
      val less : Tsdl.Sdl.keycode
      val equals : Tsdl.Sdl.keycode
      val greater : Tsdl.Sdl.keycode
      val question : Tsdl.Sdl.keycode
      val at : Tsdl.Sdl.keycode
      val leftbracket : Tsdl.Sdl.keycode
      val backslash : Tsdl.Sdl.keycode
      val rightbracket : Tsdl.Sdl.keycode
      val caret : Tsdl.Sdl.keycode
      val underscore : Tsdl.Sdl.keycode
      val backquote : Tsdl.Sdl.keycode
      val a : Tsdl.Sdl.keycode
      val b : Tsdl.Sdl.keycode
      val c : Tsdl.Sdl.keycode
      val d : Tsdl.Sdl.keycode
      val e : Tsdl.Sdl.keycode
      val f : Tsdl.Sdl.keycode
      val g : Tsdl.Sdl.keycode
      val h : Tsdl.Sdl.keycode
      val i : Tsdl.Sdl.keycode
      val j : Tsdl.Sdl.keycode
      val k : Tsdl.Sdl.keycode
      val l : Tsdl.Sdl.keycode
      val m : Tsdl.Sdl.keycode
      val n : Tsdl.Sdl.keycode
      val o : Tsdl.Sdl.keycode
      val p : Tsdl.Sdl.keycode
      val q : Tsdl.Sdl.keycode
      val r : Tsdl.Sdl.keycode
      val s : Tsdl.Sdl.keycode
      val t : Tsdl.Sdl.keycode
      val u : Tsdl.Sdl.keycode
      val v : Tsdl.Sdl.keycode
      val w : Tsdl.Sdl.keycode
      val x : Tsdl.Sdl.keycode
      val y : Tsdl.Sdl.keycode
      val z : Tsdl.Sdl.keycode
      val capslock : Tsdl.Sdl.keycode
      val f1 : Tsdl.Sdl.keycode
      val f2 : Tsdl.Sdl.keycode
      val f3 : Tsdl.Sdl.keycode
      val f4 : Tsdl.Sdl.keycode
      val f5 : Tsdl.Sdl.keycode
      val f6 : Tsdl.Sdl.keycode
      val f7 : Tsdl.Sdl.keycode
      val f8 : Tsdl.Sdl.keycode
      val f9 : Tsdl.Sdl.keycode
      val f10 : Tsdl.Sdl.keycode
      val f11 : Tsdl.Sdl.keycode
      val f12 : Tsdl.Sdl.keycode
      val printscreen : Tsdl.Sdl.keycode
      val scrolllock : Tsdl.Sdl.keycode
      val pause : Tsdl.Sdl.keycode
      val insert : Tsdl.Sdl.keycode
      val home : Tsdl.Sdl.keycode
      val pageup : Tsdl.Sdl.keycode
      val delete : Tsdl.Sdl.keycode
      val kend : Tsdl.Sdl.keycode
      val pagedown : Tsdl.Sdl.keycode
      val right : Tsdl.Sdl.keycode
      val left : Tsdl.Sdl.keycode
      val down : Tsdl.Sdl.keycode
      val up : Tsdl.Sdl.keycode
      val numlockclear : Tsdl.Sdl.keycode
      val kp_divide : Tsdl.Sdl.keycode
      val kp_multiply : Tsdl.Sdl.keycode
      val kp_minus : Tsdl.Sdl.keycode
      val kp_plus : Tsdl.Sdl.keycode
      val kp_enter : Tsdl.Sdl.keycode
      val kp_1 : Tsdl.Sdl.keycode
      val kp_2 : Tsdl.Sdl.keycode
      val kp_3 : Tsdl.Sdl.keycode
      val kp_4 : Tsdl.Sdl.keycode
      val kp_5 : Tsdl.Sdl.keycode
      val kp_6 : Tsdl.Sdl.keycode
      val kp_7 : Tsdl.Sdl.keycode
      val kp_8 : Tsdl.Sdl.keycode
      val kp_9 : Tsdl.Sdl.keycode
      val kp_0 : Tsdl.Sdl.keycode
      val kp_period : Tsdl.Sdl.keycode
      val application : Tsdl.Sdl.keycode
      val power : Tsdl.Sdl.keycode
      val kp_equals : Tsdl.Sdl.keycode
      val f13 : Tsdl.Sdl.keycode
      val f14 : Tsdl.Sdl.keycode
      val f15 : Tsdl.Sdl.keycode
      val f16 : Tsdl.Sdl.keycode
      val f17 : Tsdl.Sdl.keycode
      val f18 : Tsdl.Sdl.keycode
      val f19 : Tsdl.Sdl.keycode
      val f20 : Tsdl.Sdl.keycode
      val f21 : Tsdl.Sdl.keycode
      val f22 : Tsdl.Sdl.keycode
      val f23 : Tsdl.Sdl.keycode
      val f24 : Tsdl.Sdl.keycode
      val execute : Tsdl.Sdl.keycode
      val help : Tsdl.Sdl.keycode
      val menu : Tsdl.Sdl.keycode
      val select : Tsdl.Sdl.keycode
      val stop : Tsdl.Sdl.keycode
      val again : Tsdl.Sdl.keycode
      val undo : Tsdl.Sdl.keycode
      val cut : Tsdl.Sdl.keycode
      val copy : Tsdl.Sdl.keycode
      val paste : Tsdl.Sdl.keycode
      val find : Tsdl.Sdl.keycode
      val mute : Tsdl.Sdl.keycode
      val volumeup : Tsdl.Sdl.keycode
      val volumedown : Tsdl.Sdl.keycode
      val kp_comma : Tsdl.Sdl.keycode
      val kp_equalsas400 : Tsdl.Sdl.keycode
      val alterase : Tsdl.Sdl.keycode
      val sysreq : Tsdl.Sdl.keycode
      val cancel : Tsdl.Sdl.keycode
      val clear : Tsdl.Sdl.keycode
      val prior : Tsdl.Sdl.keycode
      val return2 : Tsdl.Sdl.keycode
      val separator : Tsdl.Sdl.keycode
      val out : Tsdl.Sdl.keycode
      val oper : Tsdl.Sdl.keycode
      val clearagain : Tsdl.Sdl.keycode
      val crsel : Tsdl.Sdl.keycode
      val exsel : Tsdl.Sdl.keycode
      val kp_00 : Tsdl.Sdl.keycode
      val kp_000 : Tsdl.Sdl.keycode
      val thousandsseparator : Tsdl.Sdl.keycode
      val decimalseparator : Tsdl.Sdl.keycode
      val currencyunit : Tsdl.Sdl.keycode
      val currencysubunit : Tsdl.Sdl.keycode
      val kp_leftparen : Tsdl.Sdl.keycode
      val kp_rightparen : Tsdl.Sdl.keycode
      val kp_leftbrace : Tsdl.Sdl.keycode
      val kp_rightbrace : Tsdl.Sdl.keycode
      val kp_tab : Tsdl.Sdl.keycode
      val kp_backspace : Tsdl.Sdl.keycode
      val kp_a : Tsdl.Sdl.keycode
      val kp_b : Tsdl.Sdl.keycode
      val kp_c : Tsdl.Sdl.keycode
      val kp_d : Tsdl.Sdl.keycode
      val kp_e : Tsdl.Sdl.keycode
      val kp_f : Tsdl.Sdl.keycode
      val kp_xor : Tsdl.Sdl.keycode
      val kp_power : Tsdl.Sdl.keycode
      val kp_percent : Tsdl.Sdl.keycode
      val kp_less : Tsdl.Sdl.keycode
      val kp_greater : Tsdl.Sdl.keycode
      val kp_ampersand : Tsdl.Sdl.keycode
      val kp_dblampersand : Tsdl.Sdl.keycode
      val kp_verticalbar : Tsdl.Sdl.keycode
      val kp_dblverticalbar : Tsdl.Sdl.keycode
      val kp_colon : Tsdl.Sdl.keycode
      val kp_hash : Tsdl.Sdl.keycode
      val kp_space : Tsdl.Sdl.keycode
      val kp_at : Tsdl.Sdl.keycode
      val kp_exclam : Tsdl.Sdl.keycode
      val kp_memstore : Tsdl.Sdl.keycode
      val kp_memrecall : Tsdl.Sdl.keycode
      val kp_memclear : Tsdl.Sdl.keycode
      val kp_memadd : Tsdl.Sdl.keycode
      val kp_memsubtract : Tsdl.Sdl.keycode
      val kp_memmultiply : Tsdl.Sdl.keycode
      val kp_memdivide : Tsdl.Sdl.keycode
      val kp_plusminus : Tsdl.Sdl.keycode
      val kp_clear : Tsdl.Sdl.keycode
      val kp_clearentry : Tsdl.Sdl.keycode
      val kp_binary : Tsdl.Sdl.keycode
      val kp_octal : Tsdl.Sdl.keycode
      val kp_decimal : Tsdl.Sdl.keycode
      val kp_hexadecimal : Tsdl.Sdl.keycode
      val lctrl : Tsdl.Sdl.keycode
      val lshift : Tsdl.Sdl.keycode
      val lalt : Tsdl.Sdl.keycode
      val lgui : Tsdl.Sdl.keycode
      val rctrl : Tsdl.Sdl.keycode
      val rshift : Tsdl.Sdl.keycode
      val ralt : Tsdl.Sdl.keycode
      val rgui : Tsdl.Sdl.keycode
      val mode : Tsdl.Sdl.keycode
      val audionext : Tsdl.Sdl.keycode
      val audioprev : Tsdl.Sdl.keycode
      val audiostop : Tsdl.Sdl.keycode
      val audioplay : Tsdl.Sdl.keycode
      val audiomute : Tsdl.Sdl.keycode
      val mediaselect : Tsdl.Sdl.keycode
      val www : Tsdl.Sdl.keycode
      val mail : Tsdl.Sdl.keycode
      val calculator : Tsdl.Sdl.keycode
      val computer : Tsdl.Sdl.keycode
      val ac_search : Tsdl.Sdl.keycode
      val ac_home : Tsdl.Sdl.keycode
      val ac_back : Tsdl.Sdl.keycode
      val ac_forward : Tsdl.Sdl.keycode
      val ac_stop : Tsdl.Sdl.keycode
      val ac_refresh : Tsdl.Sdl.keycode
      val ac_bookmarks : Tsdl.Sdl.keycode
      val brightnessdown : Tsdl.Sdl.keycode
      val brightnessup : Tsdl.Sdl.keycode
      val displayswitch : Tsdl.Sdl.keycode
      val kbdillumtoggle : Tsdl.Sdl.keycode
      val kbdillumdown : Tsdl.Sdl.keycode
      val kbdillumup : Tsdl.Sdl.keycode
      val eject : Tsdl.Sdl.keycode
      val sleep : Tsdl.Sdl.keycode
    end
  type keymod = int
  module Kmod :
    sig
      val none : Tsdl.Sdl.keymod
      val lshift : Tsdl.Sdl.keymod
      val rshift : Tsdl.Sdl.keymod
      val lctrl : Tsdl.Sdl.keymod
      val rctrl : Tsdl.Sdl.keymod
      val lalt : Tsdl.Sdl.keymod
      val ralt : Tsdl.Sdl.keymod
      val lgui : Tsdl.Sdl.keymod
      val rgui : Tsdl.Sdl.keymod
      val num : Tsdl.Sdl.keymod
      val caps : Tsdl.Sdl.keymod
      val mode : Tsdl.Sdl.keymod
      val reserved : Tsdl.Sdl.keymod
      val ctrl : Tsdl.Sdl.keymod
      val shift : Tsdl.Sdl.keymod
      val alt : Tsdl.Sdl.keymod
      val gui : Tsdl.Sdl.keymod
    end
  val get_keyboard_focus : unit -> Tsdl.Sdl.window option
  val get_keyboard_state :
    unit -> (int, Bigarray.int8_unsigned_elt) Tsdl.Sdl.bigarray
  val get_key_from_name : string -> Tsdl.Sdl.keycode
  val get_key_from_scancode : Tsdl.Sdl.scancode -> Tsdl.Sdl.keycode
  val get_key_name : Tsdl.Sdl.keycode -> string
  val get_mod_state : unit -> Tsdl.Sdl.keymod
  val get_scancode_from_key : Tsdl.Sdl.keycode -> Tsdl.Sdl.scancode
  val get_scancode_from_name : string -> Tsdl.Sdl.scancode
  val get_scancode_name : Tsdl.Sdl.scancode -> string
  val has_screen_keyboard_support : unit -> bool
  val is_screen_keyboard_shown : Tsdl.Sdl.window -> bool
  val is_text_input_active : unit -> bool
  val set_mod_state : Tsdl.Sdl.keymod -> unit
  val set_text_input_rect : Tsdl.Sdl.rect option -> unit
  val start_text_input : unit -> unit
  val stop_text_input : unit -> unit
  type cursor
  val unsafe_cursor_of_ptr : nativeint -> Tsdl.Sdl.cursor
  val unsafe_ptr_of_cursor : Tsdl.Sdl.cursor -> nativeint
  module System_cursor :
    sig
      type t
      val arrow : Tsdl.Sdl.System_cursor.t
      val ibeam : Tsdl.Sdl.System_cursor.t
      val wait : Tsdl.Sdl.System_cursor.t
      val crosshair : Tsdl.Sdl.System_cursor.t
      val waitarrow : Tsdl.Sdl.System_cursor.t
      val size_nw_se : Tsdl.Sdl.System_cursor.t
      val size_ne_sw : Tsdl.Sdl.System_cursor.t
      val size_we : Tsdl.Sdl.System_cursor.t
      val size_ns : Tsdl.Sdl.System_cursor.t
      val size_all : Tsdl.Sdl.System_cursor.t
      val no : Tsdl.Sdl.System_cursor.t
      val hand : Tsdl.Sdl.System_cursor.t
    end
  module Button :
    sig
      val left : int
      val middle : int
      val right : int
      val x1 : int
      val x2 : int
      val lmask : Tsdl.Sdl.uint32
      val mmask : Tsdl.Sdl.uint32
      val rmask : Tsdl.Sdl.uint32
      val x1mask : Tsdl.Sdl.uint32
      val x2mask : Tsdl.Sdl.uint32
    end
  val create_color_cursor :
    Tsdl.Sdl.surface ->
    hot_x:int -> hot_y:int -> Tsdl.Sdl.cursor Tsdl.Sdl.result
  val create_cursor :
    (int, Bigarray.int8_unsigned_elt) Tsdl.Sdl.bigarray ->
    (int, Bigarray.int8_unsigned_elt) Tsdl.Sdl.bigarray ->
    w:int ->
    h:int -> hot_x:int -> hot_y:int -> Tsdl.Sdl.cursor Tsdl.Sdl.result
  val create_system_cursor :
    Tsdl.Sdl.System_cursor.t -> Tsdl.Sdl.cursor Tsdl.Sdl.result
  val free_cursor : Tsdl.Sdl.cursor -> unit
  val get_cursor : unit -> Tsdl.Sdl.cursor option
  val get_default_cursor : unit -> Tsdl.Sdl.cursor option
  val get_mouse_focus : unit -> Tsdl.Sdl.window option
  val get_mouse_state : unit -> Tsdl.Sdl.uint32 * (int * int)
  val get_relative_mouse_mode : unit -> bool
  val get_relative_mouse_state : unit -> Tsdl.Sdl.uint32 * (int * int)
  val get_cursor_shown : unit -> bool Tsdl.Sdl.result
  val set_cursor : Tsdl.Sdl.cursor option -> unit
  val set_relative_mouse_mode : bool -> unit Tsdl.Sdl.result
  val show_cursor : bool -> bool Tsdl.Sdl.result
  val warp_mouse_in_window : Tsdl.Sdl.window option -> x:int -> y:int -> unit
  type touch_id = int64
  val touch_mouse_id : Tsdl.Sdl.touch_id
  type gesture_id = int64
  type finger_id = int64
  type finger
  module Finger :
    sig
      val id : Tsdl.Sdl.finger -> Tsdl.Sdl.finger_id
      val x : Tsdl.Sdl.finger -> float
      val y : Tsdl.Sdl.finger -> float
      val pressure : Tsdl.Sdl.finger -> float
    end
  val get_num_touch_devices : unit -> int
  val get_num_touch_fingers : Tsdl.Sdl.touch_id -> int
  val get_touch_device : int -> Tsdl.Sdl.touch_id Tsdl.Sdl.result
  val get_touch_finger : Tsdl.Sdl.touch_id -> int -> Tsdl.Sdl.finger option
  val load_dollar_templates :
    Tsdl.Sdl.touch_id -> Tsdl.Sdl.rw_ops -> unit Tsdl.Sdl.result
  val record_gesture : Tsdl.Sdl.touch_id -> unit Tsdl.Sdl.result
  val save_dollar_template :
    Tsdl.Sdl.gesture_id -> Tsdl.Sdl.rw_ops -> unit Tsdl.Sdl.result
  val save_all_dollar_templates : Tsdl.Sdl.rw_ops -> unit Tsdl.Sdl.result
  type joystick_guid
  type joystick_id = int32
  type joystick
  val unsafe_joystick_of_ptr : nativeint -> Tsdl.Sdl.joystick
  val unsafe_ptr_of_joystick : Tsdl.Sdl.joystick -> nativeint
  module Hat :
    sig
      type t = int
      val centered : int
      val up : int
      val right : int
      val down : int
      val left : int
      val rightup : int
      val rightdown : int
      val leftup : int
      val leftdown : int
    end
  val joystick_close : Tsdl.Sdl.joystick -> unit
  val joystick_get_event_state :
    unit -> Tsdl.Sdl.toggle_state Tsdl.Sdl.result
  val joystick_set_event_state :
    Tsdl.Sdl.toggle_state -> Tsdl.Sdl.toggle_state Tsdl.Sdl.result
  val joystick_get_attached : Tsdl.Sdl.joystick -> bool
  val joystick_get_axis : Tsdl.Sdl.joystick -> int -> Tsdl.Sdl.int16
  val joystick_get_ball :
    Tsdl.Sdl.joystick -> int -> (int * int) Tsdl.Sdl.result
  val joystick_get_button : Tsdl.Sdl.joystick -> int -> Tsdl.Sdl.uint8
  val joystick_get_device_guid : int -> Tsdl.Sdl.joystick_guid
  val joystick_get_guid : Tsdl.Sdl.joystick -> Tsdl.Sdl.joystick_guid
  val joystick_get_guid_from_string : string -> Tsdl.Sdl.joystick_guid
  val joystick_get_guid_string : Tsdl.Sdl.joystick_guid -> string
  val joystick_get_hat : Tsdl.Sdl.joystick -> int -> Tsdl.Sdl.Hat.t
  val joystick_instance_id :
    Tsdl.Sdl.joystick -> Tsdl.Sdl.joystick_id Tsdl.Sdl.result
  val joystick_name : Tsdl.Sdl.joystick -> string Tsdl.Sdl.result
  val joystick_name_for_index : int -> string Tsdl.Sdl.result
  val joystick_num_axes : Tsdl.Sdl.joystick -> int Tsdl.Sdl.result
  val joystick_num_balls : Tsdl.Sdl.joystick -> int Tsdl.Sdl.result
  val joystick_num_buttons : Tsdl.Sdl.joystick -> int Tsdl.Sdl.result
  val joystick_num_hats : Tsdl.Sdl.joystick -> int Tsdl.Sdl.result
  val joystick_open : int -> Tsdl.Sdl.joystick Tsdl.Sdl.result
  val joystick_update : unit -> unit
  val num_joysticks : unit -> int Tsdl.Sdl.result
  type game_controller
  val unsafe_game_controller_of_ptr : nativeint -> Tsdl.Sdl.game_controller
  val unsafe_ptr_of_game_controller : Tsdl.Sdl.game_controller -> nativeint
  module Controller :
    sig
      type bind_type
      val bind_type_none : Tsdl.Sdl.Controller.bind_type
      val bind_type_button : Tsdl.Sdl.Controller.bind_type
      val bind_type_axis : Tsdl.Sdl.Controller.bind_type
      val bind_type_hat : Tsdl.Sdl.Controller.bind_type
      type axis
      val axis_invalid : Tsdl.Sdl.Controller.axis
      val axis_left_x : Tsdl.Sdl.Controller.axis
      val axis_left_y : Tsdl.Sdl.Controller.axis
      val axis_right_x : Tsdl.Sdl.Controller.axis
      val axis_right_y : Tsdl.Sdl.Controller.axis
      val axis_trigger_left : Tsdl.Sdl.Controller.axis
      val axis_trigger_right : Tsdl.Sdl.Controller.axis
      val axis_max : Tsdl.Sdl.Controller.axis
      type button
      val button_invalid : Tsdl.Sdl.Controller.button
      val button_a : Tsdl.Sdl.Controller.button
      val button_b : Tsdl.Sdl.Controller.button
      val button_x : Tsdl.Sdl.Controller.button
      val button_y : Tsdl.Sdl.Controller.button
      val button_back : Tsdl.Sdl.Controller.button
      val button_guide : Tsdl.Sdl.Controller.button
      val button_start : Tsdl.Sdl.Controller.button
      val button_left_stick : Tsdl.Sdl.Controller.button
      val button_right_stick : Tsdl.Sdl.Controller.button
      val button_left_shoulder : Tsdl.Sdl.Controller.button
      val button_right_shoulder : Tsdl.Sdl.Controller.button
      val button_dpad_up : Tsdl.Sdl.Controller.button
      val button_dpad_down : Tsdl.Sdl.Controller.button
      val button_dpad_left : Tsdl.Sdl.Controller.button
      val button_dpad_right : Tsdl.Sdl.Controller.button
      val button_max : Tsdl.Sdl.Controller.button
      type button_bind
      val bind_type :
        Tsdl.Sdl.Controller.button_bind -> Tsdl.Sdl.Controller.bind_type
      val bind_button_value : Tsdl.Sdl.Controller.button_bind -> int
      val bind_axis_value : Tsdl.Sdl.Controller.button_bind -> int
      val bind_hat_value : Tsdl.Sdl.Controller.button_bind -> int * int
    end
  val game_controller_add_mapping : string -> bool Tsdl.Sdl.result
  val game_controller_add_mapping_from_file : string -> int Tsdl.Sdl.result
  val game_controller_add_mapping_from_rw :
    Tsdl.Sdl.rw_ops -> bool -> int Tsdl.Sdl.result
  val game_controller_close : Tsdl.Sdl.game_controller -> unit
  val game_controller_get_event_state :
    unit -> Tsdl.Sdl.toggle_state Tsdl.Sdl.result
  val game_controller_set_event_state :
    Tsdl.Sdl.toggle_state -> Tsdl.Sdl.toggle_state Tsdl.Sdl.result
  val game_controller_get_attached : Tsdl.Sdl.game_controller -> bool
  val game_controller_get_axis :
    Tsdl.Sdl.game_controller -> Tsdl.Sdl.Controller.axis -> Tsdl.Sdl.int16
  val game_controller_get_axis_from_string :
    string -> Tsdl.Sdl.Controller.axis
  val game_controller_get_bind_for_axis :
    Tsdl.Sdl.game_controller ->
    Tsdl.Sdl.Controller.axis -> Tsdl.Sdl.Controller.button_bind
  val game_controller_get_bind_for_button :
    Tsdl.Sdl.game_controller ->
    Tsdl.Sdl.Controller.button -> Tsdl.Sdl.Controller.button_bind
  val game_controller_get_button :
    Tsdl.Sdl.game_controller -> Tsdl.Sdl.Controller.button -> Tsdl.Sdl.uint8
  val game_controller_get_button_from_string :
    string -> Tsdl.Sdl.Controller.button
  val game_controller_get_joystick :
    Tsdl.Sdl.game_controller -> Tsdl.Sdl.joystick Tsdl.Sdl.result
  val game_controller_get_string_for_axis :
    Tsdl.Sdl.Controller.axis -> string option
  val game_controller_get_string_for_button :
    Tsdl.Sdl.Controller.button -> string option
  val game_controller_mapping :
    Tsdl.Sdl.game_controller -> string Tsdl.Sdl.result
  val game_controller_mapping_for_guid :
    Tsdl.Sdl.joystick_guid -> string Tsdl.Sdl.result
  val game_controller_name :
    Tsdl.Sdl.game_controller -> string Tsdl.Sdl.result
  val game_controller_name_for_index : int -> string Tsdl.Sdl.result
  val game_controller_open : int -> Tsdl.Sdl.game_controller Tsdl.Sdl.result
  val game_controller_update : unit -> unit
  val is_game_controller : int -> bool
  type event_type = int
  type event
  module Event :
    sig
      type 'b field
      val create : unit -> Tsdl.Sdl.event
      val get : Tsdl.Sdl.event -> 'Tsdl.Sdl.Event.field -> 'b
      val set : Tsdl.Sdl.event -> 'Tsdl.Sdl.Event.field -> '-> unit
      val first_event : Tsdl.Sdl.event_type
      val last_event : Tsdl.Sdl.event_type
      val typ : Tsdl.Sdl.event_type Tsdl.Sdl.Event.field
      val timestamp : Tsdl.Sdl.uint32 Tsdl.Sdl.Event.field
      val app_did_enter_background : Tsdl.Sdl.event_type
      val app_did_enter_foreground : Tsdl.Sdl.event_type
      val app_low_memory : Tsdl.Sdl.event_type
      val app_terminating : Tsdl.Sdl.event_type
      val app_will_enter_background : Tsdl.Sdl.event_type
      val app_will_enter_foreground : Tsdl.Sdl.event_type
      val clipboard_update : Tsdl.Sdl.event_type
      val controller_axis_motion : Tsdl.Sdl.event_type
      val controller_button_down : Tsdl.Sdl.event_type
      val controller_button_up : Tsdl.Sdl.event_type
      val controller_device_added : Tsdl.Sdl.event_type
      val controller_device_remapped : Tsdl.Sdl.event_type
      val controller_device_removed : Tsdl.Sdl.event_type
      val controller_axis_which : Tsdl.Sdl.joystick_id Tsdl.Sdl.Event.field
      val controller_axis_axis : Tsdl.Sdl.uint8 Tsdl.Sdl.Event.field
      val controller_axis_value : Tsdl.Sdl.int16 Tsdl.Sdl.Event.field
      val controller_button_which : Tsdl.Sdl.joystick_id Tsdl.Sdl.Event.field
      val controller_button_button : Tsdl.Sdl.uint8 Tsdl.Sdl.Event.field
      val controller_button_state :
        Tsdl.Sdl.button_state Tsdl.Sdl.Event.field
      val controller_device_which : Tsdl.Sdl.joystick_id Tsdl.Sdl.Event.field
      val dollar_gesture : Tsdl.Sdl.event_type
      val dollar_record : Tsdl.Sdl.event_type
      val dollar_gesture_touch_id : Tsdl.Sdl.touch_id Tsdl.Sdl.Event.field
      val dollar_gesture_gesture_id :
        Tsdl.Sdl.gesture_id Tsdl.Sdl.Event.field
      val dollar_gesture_num_fingers : int Tsdl.Sdl.Event.field
      val dollar_gesture_error : float Tsdl.Sdl.Event.field
      val dollar_gesture_x : float Tsdl.Sdl.Event.field
      val dollar_gesture_y : float Tsdl.Sdl.Event.field
      val drop_file : Tsdl.Sdl.event_type
      val drop_file_free : Tsdl.Sdl.event -> unit
      val drop_file_file : Tsdl.Sdl.event -> string
      val finger_down : Tsdl.Sdl.event_type
      val finger_motion : Tsdl.Sdl.event_type
      val finger_up : Tsdl.Sdl.event_type
      val touch_finger_touch_id : Tsdl.Sdl.touch_id Tsdl.Sdl.Event.field
      val touch_finger_finger_id : Tsdl.Sdl.finger_id Tsdl.Sdl.Event.field
      val touch_finger_x : float Tsdl.Sdl.Event.field
      val touch_finger_y : float Tsdl.Sdl.Event.field
      val touch_finger_dx : float Tsdl.Sdl.Event.field
      val touch_finger_dy : float Tsdl.Sdl.Event.field
      val touch_finger_pressure : float Tsdl.Sdl.Event.field
      val joy_axis_motion : Tsdl.Sdl.event_type
      val joy_ball_motion : Tsdl.Sdl.event_type
      val joy_button_down : Tsdl.Sdl.event_type
      val joy_button_up : Tsdl.Sdl.event_type
      val joy_device_added : Tsdl.Sdl.event_type
      val joy_device_removed : Tsdl.Sdl.event_type
      val joy_hat_motion : Tsdl.Sdl.event_type
      val joy_axis_which : Tsdl.Sdl.joystick_id Tsdl.Sdl.Event.field
      val joy_axis_axis : Tsdl.Sdl.uint8 Tsdl.Sdl.Event.field
      val joy_axis_value : Tsdl.Sdl.int16 Tsdl.Sdl.Event.field
      val joy_ball_which : Tsdl.Sdl.joystick_id Tsdl.Sdl.Event.field
      val joy_ball_ball : Tsdl.Sdl.uint8 Tsdl.Sdl.Event.field
      val joy_ball_xrel : int Tsdl.Sdl.Event.field
      val joy_ball_yrel : int Tsdl.Sdl.Event.field
      val joy_button_which : Tsdl.Sdl.joystick_id Tsdl.Sdl.Event.field
      val joy_button_button : Tsdl.Sdl.uint8 Tsdl.Sdl.Event.field
      val joy_button_state : Tsdl.Sdl.button_state Tsdl.Sdl.Event.field
      val joy_device_which : Tsdl.Sdl.joystick_id Tsdl.Sdl.Event.field
      val joy_hat_which : Tsdl.Sdl.joystick_id Tsdl.Sdl.Event.field
      val joy_hat_hat : Tsdl.Sdl.uint8 Tsdl.Sdl.Event.field
      val joy_hat_value : Tsdl.Sdl.Hat.t Tsdl.Sdl.Event.field
      val key_down : Tsdl.Sdl.event_type
      val key_up : Tsdl.Sdl.event_type
      val keyboard_window_id : int Tsdl.Sdl.Event.field
      val keyboard_state : Tsdl.Sdl.button_state Tsdl.Sdl.Event.field
      val keyboard_repeat : int Tsdl.Sdl.Event.field
      val keyboard_scancode : Tsdl.Sdl.scancode Tsdl.Sdl.Event.field
      val keyboard_keycode : Tsdl.Sdl.keycode Tsdl.Sdl.Event.field
      val keyboard_keymod : Tsdl.Sdl.keymod Tsdl.Sdl.Event.field
      val mouse_button_down : Tsdl.Sdl.event_type
      val mouse_button_up : Tsdl.Sdl.event_type
      val mouse_motion : Tsdl.Sdl.event_type
      val mouse_wheel : Tsdl.Sdl.event_type
      val mouse_button_window_id : int Tsdl.Sdl.Event.field
      val mouse_button_which : Tsdl.Sdl.uint32 Tsdl.Sdl.Event.field
      val mouse_button_button : Tsdl.Sdl.uint8 Tsdl.Sdl.Event.field
      val mouse_button_state : Tsdl.Sdl.button_state Tsdl.Sdl.Event.field
      val mouse_button_clicks : Tsdl.Sdl.uint8 Tsdl.Sdl.Event.field
      val mouse_button_x : int Tsdl.Sdl.Event.field
      val mouse_button_y : int Tsdl.Sdl.Event.field
      val mouse_motion_window_id : int Tsdl.Sdl.Event.field
      val mouse_motion_which : Tsdl.Sdl.uint32 Tsdl.Sdl.Event.field
      val mouse_motion_state : Tsdl.Sdl.uint32 Tsdl.Sdl.Event.field
      val mouse_motion_x : int Tsdl.Sdl.Event.field
      val mouse_motion_y : int Tsdl.Sdl.Event.field
      val mouse_motion_xrel : int Tsdl.Sdl.Event.field
      val mouse_motion_yrel : int Tsdl.Sdl.Event.field
      val mouse_wheel_window_id : int Tsdl.Sdl.Event.field
      val mouse_wheel_which : Tsdl.Sdl.uint32 Tsdl.Sdl.Event.field
      val mouse_wheel_x : int Tsdl.Sdl.Event.field
      val mouse_wheel_y : int Tsdl.Sdl.Event.field
      val multi_gesture : Tsdl.Sdl.event_type
      val multi_gesture_touch_id : Tsdl.Sdl.touch_id Tsdl.Sdl.Event.field
      val multi_gesture_dtheta : float Tsdl.Sdl.Event.field
      val multi_gesture_ddist : float Tsdl.Sdl.Event.field
      val multi_gesture_x : float Tsdl.Sdl.Event.field
      val multi_gesture_y : float Tsdl.Sdl.Event.field
      val multi_gesture_num_fingers : int Tsdl.Sdl.Event.field
      val quit : Tsdl.Sdl.event_type
      val sys_wm_event : Tsdl.Sdl.event_type
      val text_editing : Tsdl.Sdl.event_type
      val text_input : Tsdl.Sdl.event_type
      val text_editing_window_id : int Tsdl.Sdl.Event.field
      val text_editing_text : string Tsdl.Sdl.Event.field
      val text_editing_start : int Tsdl.Sdl.Event.field
      val text_editing_length : int Tsdl.Sdl.Event.field
      val text_input_window_id : int Tsdl.Sdl.Event.field
      val text_input_text : string Tsdl.Sdl.Event.field
      val user_event : Tsdl.Sdl.event_type
      val user_window_id : int Tsdl.Sdl.Event.field
      val user_code : int Tsdl.Sdl.Event.field
      val window_event : Tsdl.Sdl.event_type
      type window_event_id = int
      val window_event_enum :
        Tsdl.Sdl.Event.window_event_id ->
        [ `Close
        | `Enter
        | `Exposed
        | `Focus_gained
        | `Focus_lost
        | `Hidden
        | `Leave
        | `Maximized
        | `Minimized
        | `Moved
        | `Resized
        | `Restored
        | `Shown
        | `Size_changed ]
      val window_event_shown : Tsdl.Sdl.Event.window_event_id
      val window_event_hidden : Tsdl.Sdl.Event.window_event_id
      val window_event_exposed : Tsdl.Sdl.Event.window_event_id
      val window_event_moved : Tsdl.Sdl.Event.window_event_id
      val window_event_resized : Tsdl.Sdl.Event.window_event_id
      val window_event_size_changed : Tsdl.Sdl.Event.window_event_id
      val window_event_minimized : Tsdl.Sdl.Event.window_event_id
      val window_event_maximized : Tsdl.Sdl.Event.window_event_id
      val window_event_restored : Tsdl.Sdl.Event.window_event_id
      val window_event_enter : Tsdl.Sdl.Event.window_event_id
      val window_event_leave : Tsdl.Sdl.Event.window_event_id
      val window_event_focus_gained : Tsdl.Sdl.Event.window_event_id
      val window_event_focus_lost : Tsdl.Sdl.Event.window_event_id
      val window_event_close : Tsdl.Sdl.Event.window_event_id
      val window_window_id : int Tsdl.Sdl.Event.field
      val window_event_id :
        Tsdl.Sdl.Event.window_event_id Tsdl.Sdl.Event.field
      val window_data1 : int32 Tsdl.Sdl.Event.field
      val window_data2 : int32 Tsdl.Sdl.Event.field
      val enum :
        Tsdl.Sdl.event_type ->
        [ `App_did_enter_background
        | `App_did_enter_foreground
        | `App_low_memory
        | `App_terminating
        | `App_will_enter_background
        | `App_will_enter_foreground
        | `Clipboard_update
        | `Controller_axis_motion
        | `Controller_button_down
        | `Controller_button_up
        | `Controller_device_added
        | `Controller_device_remapped
        | `Controller_device_removed
        | `Dollar_gesture
        | `Dollar_record
        | `Drop_file
        | `Finger_down
        | `Finger_motion
        | `Finger_up
        | `Joy_axis_motion
        | `Joy_ball_motion
        | `Joy_button_down
        | `Joy_button_up
        | `Joy_device_added
        | `Joy_device_removed
        | `Joy_hat_motion
        | `Key_down
        | `Key_up
        | `Mouse_button_down
        | `Mouse_button_up
        | `Mouse_motion
        | `Mouse_wheel
        | `Multi_gesture
        | `Quit
        | `Sys_wm_event
        | `Text_editing
        | `Text_input
        | `Unknown
        | `User_event
        | `Window_event ]
    end
  val get_event_state : Tsdl.Sdl.event_type -> Tsdl.Sdl.toggle_state
  val set_event_state : Tsdl.Sdl.event_type -> Tsdl.Sdl.toggle_state -> unit
  val flush_event : Tsdl.Sdl.event_type -> unit
  val flush_events : Tsdl.Sdl.event_type -> Tsdl.Sdl.event_type -> unit
  val has_event : Tsdl.Sdl.event_type -> bool
  val has_events : Tsdl.Sdl.event_type -> Tsdl.Sdl.event_type -> bool
  val poll_event : Tsdl.Sdl.event option -> bool
  val pump_events : unit -> unit
  val push_event : Tsdl.Sdl.event -> bool Tsdl.Sdl.result
  val register_event : unit -> Tsdl.Sdl.event_type option
  val wait_event : Tsdl.Sdl.event option -> unit Tsdl.Sdl.result
  val wait_event_timeout : Tsdl.Sdl.event option -> int -> bool
  type haptic
  type haptic_effect
  type haptic_effect_id
  module Haptic :
    sig
      val infinity : Tsdl.Sdl.uint32
      type feature = int
      val gain : Tsdl.Sdl.Haptic.feature
      val autocenter : Tsdl.Sdl.Haptic.feature
      val status : Tsdl.Sdl.Haptic.feature
      val pause : Tsdl.Sdl.Haptic.feature
      type direction_type = int
      val polar : Tsdl.Sdl.Haptic.direction_type
      val cartesian : Tsdl.Sdl.Haptic.direction_type
      val spherical : Tsdl.Sdl.Haptic.direction_type
      module Direction :
        sig
          type t
          val create :
            int -> int32 -> int32 -> int32 -> Tsdl.Sdl.Haptic.Direction.t
          val typ :
            Tsdl.Sdl.Haptic.Direction.t -> Tsdl.Sdl.Haptic.direction_type
          val dir_0 : Tsdl.Sdl.Haptic.Direction.t -> int32
          val dir_1 : Tsdl.Sdl.Haptic.Direction.t -> int32
          val dir_2 : Tsdl.Sdl.Haptic.Direction.t -> int32
        end
      type effect_type = int
      type 'a field
      val create_effect : unit -> Tsdl.Sdl.haptic_effect
      val get : Tsdl.Sdl.haptic_effect -> 'Tsdl.Sdl.Haptic.field -> 'a
      val set :
        Tsdl.Sdl.haptic_effect -> 'Tsdl.Sdl.Haptic.field -> '-> unit
      val typ : Tsdl.Sdl.Haptic.effect_type Tsdl.Sdl.Haptic.field
      val constant : Tsdl.Sdl.Haptic.effect_type
      val constant_type : Tsdl.Sdl.Haptic.effect_type Tsdl.Sdl.Haptic.field
      val constant_direction :
        Tsdl.Sdl.Haptic.Direction.t Tsdl.Sdl.Haptic.field
      val constant_length : Tsdl.Sdl.uint32 Tsdl.Sdl.Haptic.field
      val constant_delay : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val constant_button : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val constant_interval : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val constant_level : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val constant_attack_length : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val constant_attack_level : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val constant_fade_length : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val constant_fade_level : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val sine : Tsdl.Sdl.Haptic.effect_type
      val left_right : Tsdl.Sdl.Haptic.effect_type
      val triangle : Tsdl.Sdl.Haptic.effect_type
      val sawtooth_up : Tsdl.Sdl.Haptic.effect_type
      val sawtooth_down : Tsdl.Sdl.Haptic.effect_type
      val periodic_type : Tsdl.Sdl.Haptic.effect_type Tsdl.Sdl.Haptic.field
      val periodic_direction :
        Tsdl.Sdl.Haptic.Direction.t Tsdl.Sdl.Haptic.field
      val periodic_length : Tsdl.Sdl.uint32 Tsdl.Sdl.Haptic.field
      val periodic_delay : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val periodic_button : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val periodic_interval : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val periodic_period : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val periodic_magnitude : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val periodic_offset : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val periodic_phase : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val periodic_attack_length : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val periodic_attack_level : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val periodic_fade_length : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val periodic_fade_level : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val spring : Tsdl.Sdl.Haptic.effect_type
      val damper : Tsdl.Sdl.Haptic.effect_type
      val inertia : Tsdl.Sdl.Haptic.effect_type
      val friction : Tsdl.Sdl.Haptic.effect_type
      val condition_type : Tsdl.Sdl.Haptic.effect_type Tsdl.Sdl.Haptic.field
      val condition_direction :
        Tsdl.Sdl.Haptic.Direction.t Tsdl.Sdl.Haptic.field
      val condition_length : Tsdl.Sdl.uint32 Tsdl.Sdl.Haptic.field
      val condition_delay : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_button : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_interval : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_right_sat_0 : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_right_sat_1 : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_right_sat_2 : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_left_sat_0 : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_left_sat_1 : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_left_sat_2 : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_right_coeff_0 : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val condition_right_coeff_1 : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val condition_right_coeff_2 : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val condition_left_coeff_0 : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val condition_left_coeff_1 : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val condition_left_coeff_2 : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val condition_deadband_0 : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_deadband_1 : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_deadband_2 : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val condition_center_0 : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val condition_center_1 : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val condition_center_2 : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val ramp : Tsdl.Sdl.Haptic.effect_type
      val ramp_type : Tsdl.Sdl.Haptic.effect_type Tsdl.Sdl.Haptic.field
      val ramp_direction : Tsdl.Sdl.Haptic.Direction.t Tsdl.Sdl.Haptic.field
      val ramp_length : Tsdl.Sdl.uint32 Tsdl.Sdl.Haptic.field
      val ramp_delay : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val ramp_button : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val ramp_interval : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val ramp_start : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val ramp_end : Tsdl.Sdl.int16 Tsdl.Sdl.Haptic.field
      val ramp_attack_length : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val ramp_attack_level : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val ramp_fade_length : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val ramp_fade_level : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val left_right_type : Tsdl.Sdl.Haptic.effect_type Tsdl.Sdl.Haptic.field
      val left_right_length : Tsdl.Sdl.uint32 Tsdl.Sdl.Haptic.field
      val left_right_large_magnitude : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val left_right_small_magnitude : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val custom : Tsdl.Sdl.Haptic.effect_type
      val custom_type : Tsdl.Sdl.Haptic.effect_type Tsdl.Sdl.Haptic.field
      val custom_direction :
        Tsdl.Sdl.Haptic.Direction.t Tsdl.Sdl.Haptic.field
      val custom_length : Tsdl.Sdl.uint32 Tsdl.Sdl.Haptic.field
      val custom_delay : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val custom_button : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val custom_interval : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val custom_channels : Tsdl.Sdl.uint8 Tsdl.Sdl.Haptic.field
      val custom_period : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val custom_samples : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val custom_data : Tsdl.Sdl.uint16 list Tsdl.Sdl.Haptic.field
      val custom_attack_length : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val custom_attack_level : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val custom_fade_length : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
      val custom_fade_level : Tsdl.Sdl.uint16 Tsdl.Sdl.Haptic.field
    end
  val haptic_close : Tsdl.Sdl.haptic -> unit
  val haptic_destroy_effect :
    Tsdl.Sdl.haptic -> Tsdl.Sdl.haptic_effect_id -> unit
  val haptic_effect_supported :
    Tsdl.Sdl.haptic -> Tsdl.Sdl.haptic_effect -> bool Tsdl.Sdl.result
  val haptic_get_effect_status :
    Tsdl.Sdl.haptic -> Tsdl.Sdl.haptic_effect_id -> bool Tsdl.Sdl.result
  val haptic_index : Tsdl.Sdl.haptic -> int Tsdl.Sdl.result
  val haptic_name : int -> string Tsdl.Sdl.result
  val haptic_new_effect :
    Tsdl.Sdl.haptic ->
    Tsdl.Sdl.haptic_effect -> Tsdl.Sdl.haptic_effect_id Tsdl.Sdl.result
  val haptic_num_axes : Tsdl.Sdl.haptic -> int Tsdl.Sdl.result
  val haptic_num_effects : Tsdl.Sdl.haptic -> int Tsdl.Sdl.result
  val haptic_num_effects_playing : Tsdl.Sdl.haptic -> int Tsdl.Sdl.result
  val haptic_open : int -> Tsdl.Sdl.haptic Tsdl.Sdl.result
  val haptic_open_from_joystick :
    Tsdl.Sdl.joystick -> Tsdl.Sdl.haptic Tsdl.Sdl.result
  val haptic_open_from_mouse : unit -> Tsdl.Sdl.haptic Tsdl.Sdl.result
  val haptic_opened : int -> bool
  val haptic_pause : Tsdl.Sdl.haptic -> unit Tsdl.Sdl.result
  val haptic_query : Tsdl.Sdl.haptic -> int
  val haptic_rumble_init : Tsdl.Sdl.haptic -> unit Tsdl.Sdl.result
  val haptic_rumble_play :
    Tsdl.Sdl.haptic -> float -> Tsdl.Sdl.uint32 -> unit Tsdl.Sdl.result
  val haptic_rumble_stop : Tsdl.Sdl.haptic -> unit Tsdl.Sdl.result
  val haptic_rumble_supported : Tsdl.Sdl.haptic -> bool Tsdl.Sdl.result
  val haptic_run_effect :
    Tsdl.Sdl.haptic ->
    Tsdl.Sdl.haptic_effect_id -> Tsdl.Sdl.uint32 -> unit Tsdl.Sdl.result
  val haptic_set_autocenter : Tsdl.Sdl.haptic -> int -> unit Tsdl.Sdl.result
  val haptic_set_gain : Tsdl.Sdl.haptic -> int -> unit Tsdl.Sdl.result
  val haptic_stop_all : Tsdl.Sdl.haptic -> unit Tsdl.Sdl.result
  val haptic_stop_effect :
    Tsdl.Sdl.haptic -> Tsdl.Sdl.haptic_effect_id -> unit Tsdl.Sdl.result
  val haptic_unpause : Tsdl.Sdl.haptic -> unit Tsdl.Sdl.result
  val haptic_update_effect :
    Tsdl.Sdl.haptic ->
    Tsdl.Sdl.haptic_effect_id ->
    Tsdl.Sdl.haptic_effect -> unit Tsdl.Sdl.result
  val joystick_is_haptic : Tsdl.Sdl.joystick -> bool Tsdl.Sdl.result
  val mouse_is_haptic : unit -> bool Tsdl.Sdl.result
  val num_haptics : unit -> int Tsdl.Sdl.result
  module Audio :
    sig
      type status = int
      val stopped : Tsdl.Sdl.Audio.status
      val playing : Tsdl.Sdl.Audio.status
      val paused : Tsdl.Sdl.Audio.status
      type format = int
      val s8 : Tsdl.Sdl.Audio.format
      val u8 : Tsdl.Sdl.Audio.format
      val s16_msb : Tsdl.Sdl.Audio.format
      val s16_sys : Tsdl.Sdl.Audio.format
      val s16 : Tsdl.Sdl.Audio.format
      val s16_lsb : Tsdl.Sdl.Audio.format
      val u16_msb : Tsdl.Sdl.Audio.format
      val u16_sys : Tsdl.Sdl.Audio.format
      val u16 : Tsdl.Sdl.Audio.format
      val u16_lsb : Tsdl.Sdl.Audio.format
      val s32_msb : Tsdl.Sdl.Audio.format
      val s32_sys : Tsdl.Sdl.Audio.format
      val s32 : Tsdl.Sdl.Audio.format
      val s32_lsb : Tsdl.Sdl.Audio.format
      val f32_lsb : Tsdl.Sdl.Audio.format
      val f32_msb : Tsdl.Sdl.Audio.format
      val f32_sys : Tsdl.Sdl.Audio.format
      val f32 : Tsdl.Sdl.Audio.format
      type allow = int
      val allow_frequency_change : int
      val allow_format_change : int
      val allow_channels_change : int
      val allow_any_change : int
    end
  val audio_init : string option -> unit Tsdl.Sdl.result
  val audio_quit : unit -> unit
  val get_audio_driver : int -> string Tsdl.Sdl.result
  val get_current_audio_driver : unit -> string option
  val get_num_audio_drivers : unit -> int Tsdl.Sdl.result
  type audio_device_id
  type ('a, 'b) audio_spec = {
    as_freq : int;
    as_format : Tsdl.Sdl.Audio.format;
    as_channels : Tsdl.Sdl.uint8;
    as_silence : Tsdl.Sdl.uint8;
    as_samples : Tsdl.Sdl.uint8;
    as_size : Tsdl.Sdl.uint32;
    as_ba_kind : ('a, 'b) Bigarray.kind;
  }
  val close_audio_device : Tsdl.Sdl.audio_device_id -> unit
  val free_wav : ('a, 'b) Tsdl.Sdl.bigarray -> unit
  val get_audio_device_name : int -> bool -> string Tsdl.Sdl.result
  val get_audio_device_status :
    Tsdl.Sdl.audio_device_id -> Tsdl.Sdl.Audio.status
  val get_num_audio_devices : bool -> int Tsdl.Sdl.result
  val load_wav_rw :
    Tsdl.Sdl.rw_ops ->
    ('a, 'b) Tsdl.Sdl.audio_spec ->
    (('a, 'b) Tsdl.Sdl.audio_spec * ('a, 'b) Tsdl.Sdl.bigarray)
    Tsdl.Sdl.result
  val lock_audio_device : Tsdl.Sdl.audio_device_id -> unit
  val open_audio_device :
    string option ->
    bool ->
    ('a, 'b) Tsdl.Sdl.audio_spec ->
    Tsdl.Sdl.Audio.allow ->
    (Tsdl.Sdl.audio_device_id * ('a, 'b) Tsdl.Sdl.audio_spec) Tsdl.Sdl.result
  val pause_audio_device : Tsdl.Sdl.audio_device_id -> bool -> unit
  val unlock_audio_device : Tsdl.Sdl.audio_device_id -> unit
  val delay : Tsdl.Sdl.uint32 -> unit
  val get_ticks : unit -> Tsdl.Sdl.uint32
  val get_performance_counter : unit -> Tsdl.Sdl.uint64
  val get_performance_frequency : unit -> Tsdl.Sdl.uint64
  val get_platform : unit -> string
  val get_cpu_cache_line_size : unit -> int Tsdl.Sdl.result
  val get_cpu_count : unit -> int
  val get_system_ram : unit -> int
  val has_3d_now : unit -> bool
  val has_altivec : unit -> bool
  val has_avx : unit -> bool
  val has_mmx : unit -> bool
  val has_rdtsc : unit -> bool
  val has_sse : unit -> bool
  val has_sse2 : unit -> bool
  val has_sse3 : unit -> bool
  val has_sse41 : unit -> bool
  val has_sse42 : unit -> bool
  type power_state =
      [ `Charged | `Charging | `No_battery | `On_battery | `Unknown ]
  type power_info = {
    pi_state : Tsdl.Sdl.power_state;
    pi_secs : int option;
    pi_pct : int option;
  }
  val get_power_info : unit -> Tsdl.Sdl.power_info
end