sig
  type state = Released | Pressed
  val string_of_state : Sdlevent.state -> string
  type keyboard_event = {
    ke_timestamp : int32;
    ke_window_id : int32;
    ke_state : Sdlevent.state;
    ke_repeat : int;
    scancode : Sdlscancode.t;
    keycode : Sdlkeycode.t;
    keymod : Sdlkeymod.t list;
  }
  type mouse_motion_event = {
    mm_timestamp : int32;
    mm_window_id : int32;
    mm_buttons : int list;
    mm_x : int;
    mm_y : int;
    mm_xrel : int;
    mm_yrel : int;
  }
  type mouse_button_event = {
    mb_timestamp : int32;
    mb_window_id : int32;
    mb_button : int;
    mb_state : Sdlevent.state;
    mb_x : int;
    mb_y : int;
  }
  type mouse_wheel_event = {
    mw_timestamp : int32;
    mw_window_id : int32;
    mw_x : int;
    mw_y : int;
  }
  type joy_axis_event = {
    ja_timestamp : int32;
    ja_which : int;
    ja_axis : int;
    ja_value : int;
  }
  type joy_button_event = {
    jb_timestamp : int32;
    jb_which : int;
    jb_button : int;
    jb_state : Sdlevent.state;
  }
  type joy_hat_event = {
    jh_timestamp : int32;
    jh_which : int;
    jh_hat : int;
    jh_dir : Sdlhat.direction;
    jh_pos : Sdlhat.positions;
  }
  type joy_device_change = JoyDevice_Added | JoyDevice_Removed
  val string_of_joy_device_change : Sdlevent.joy_device_change -> string
  type joy_device_event = {
    jd_timestamp : int32;
    jd_which : int;
    jd_change : Sdlevent.joy_device_change;
  }
  type window_event_xy = { win_x : int; win_y : int; }
  type window_event_kind =
      WindowEvent_None
    | WindowEvent_Shown
    | WindowEvent_Hidden
    | WindowEvent_Exposed
    | WindowEvent_Moved of Sdlevent.window_event_xy
    | WindowEvent_Resized of Sdlevent.window_event_xy
    | WindowEvent_Size_Changed of Sdlevent.window_event_xy
    | WindowEvent_Minimized
    | WindowEvent_Maximized
    | WindowEvent_Restored
    | WindowEvent_Enter
    | WindowEvent_Leave
    | WindowEvent_Focus_Gained
    | WindowEvent_Focus_Lost
    | WindowEvent_Close
    | WindowEvent_Take_Focus
    | WindowEvent_Hit_Test
  val string_of_window_event_kind : Sdlevent.window_event_kind -> string
  type window_event = {
    we_timestamp : int32;
    window_ID : int32;
    kind : Sdlevent.window_event_kind;
  }
  type quit_event = { quit_timestamp : int32; }
  type text_editing_event = {
    te_timestamp : int32;
    te_window_ID : int32;
    te_text : string;
    te_begin : int;
    te_length : int;
  }
  type text_input_event = {
    ti_timestamp : int32;
    ti_window_ID : int32;
    ti_text : string;
  }
  type t =
      Quit of Sdlevent.quit_event
    | Mouse_Motion of Sdlevent.mouse_motion_event
    | Mouse_Button_Down of Sdlevent.mouse_button_event
    | Mouse_Button_Up of Sdlevent.mouse_button_event
    | Mouse_Wheel of Sdlevent.mouse_wheel_event
    | KeyDown of Sdlevent.keyboard_event
    | KeyUp of Sdlevent.keyboard_event
    | Text_Editing of Sdlevent.text_editing_event
    | Text_Input of Sdlevent.text_input_event
    | Joy_Axis_Motion of Sdlevent.joy_axis_event
    | Joy_Ball_Motion
    | Joy_Hat_Motion of Sdlevent.joy_hat_event
    | Joy_Button_Down of Sdlevent.joy_button_event
    | Joy_Button_Up of Sdlevent.joy_button_event
    | Joy_Device_Added of Sdlevent.joy_device_event
    | Joy_Device_Removed of Sdlevent.joy_device_event
    | Controller_Axis_Motion
    | Controller_Button_Down
    | Controller_Button_Up
    | Controller_Device_Added
    | Controller_Device_Removed
    | Controller_Device_Remapped
    | Finger_Down
    | Finger_Up
    | Finger_Motion
    | Dollar_Gesture
    | Dollar_Record
    | Multi_Gesture
    | Clipboard_Update
    | Drop_File
    | User_Event
    | Window_Event of Sdlevent.window_event
    | SysWM_Event
    | APP_Terminating
    | APP_LowMemory
    | APP_Will_Enter_Background
    | APP_Did_Enter_Background
    | APP_Will_Enter_Foreground
    | APP_Did_Enter_Foreground
    | Display_Event
    | Keymap_Changed
    | Drop_Text
    | Drop_Begin
    | Drop_Complete
    | Audio_Device_Added
    | Audio_Device_Removed
    | Sensor_Update
    | Render_Targets_Reset
    | Render_Device_Reset
  external poll_event : unit -> Sdlevent.t option = "caml_SDL_PollEvent"
  val to_string : Sdlevent.t -> string
end