sig
  module Sdl :
    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 option ->
        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 option -> 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_text : Tsdl.Sdl.event_type
          val drop_begin : Tsdl.Sdl.event_type
          val drop_complete : 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 keymap_changed : 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
            | `Hit_test
            | `Leave
            | `Maximized
            | `Minimized
            | `Moved
            | `Resized
            | `Restored
            | `Shown
            | `Size_changed
            | `Take_focus
            | `Unknown of Tsdl.Sdl.Event.window_event_id ]
          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_event_take_focus : Tsdl.Sdl.Event.window_event_id
          val window_event_hit_test : 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 render_targets_reset : Tsdl.Sdl.event_type
          val render_device_reset : Tsdl.Sdl.event_type
          val audio_device_added : Tsdl.Sdl.event_type
          val audio_device_removed : Tsdl.Sdl.event_type
          val audio_device_timestamp : Tsdl.Sdl.uint32 Tsdl.Sdl.Event.field
          val audio_device_which : Tsdl.Sdl.uint32 Tsdl.Sdl.Event.field
          val audio_device_is_capture : int 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 of int
            | `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 = Tsdl.Sdl.uint32
      type audio_callback
      val audio_callback :
        ('a, 'b) Bigarray.kind ->
        (('a, 'b) Tsdl.Sdl.bigarray -> unit) -> Tsdl.Sdl.audio_callback
      type 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_callback : Tsdl.Sdl.audio_callback option;
      }
      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 ->
        Tsdl.Sdl.audio_spec ->
        ('a, 'b) Bigarray.kind ->
        (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 ->
        Tsdl.Sdl.audio_spec ->
        Tsdl.Sdl.Audio.allow ->
        (Tsdl.Sdl.audio_device_id * 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 queue_audio :
        Tsdl.Sdl.audio_device_id ->
        ('a, 'b) Tsdl.Sdl.bigarray -> unit Tsdl.Sdl.result
      val dequeue_audio :
        Tsdl.Sdl.audio_device_id -> ('a, 'b) Tsdl.Sdl.bigarray -> int
      val get_queued_audio_size : Tsdl.Sdl.audio_device_id -> int
      val clear_queued_audio : 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
end