sig
  type button =
      BUTTON_LEFT
    | BUTTON_MIDDLE
    | BUTTON_RIGHT
    | BUTTON_WHEELUP
    | BUTTON_WHEELDOWN
  external get_state :
    ?relative:bool -> unit -> int * int * Sdlmouse.button list
    = "mlsdlevent_get_mouse_state"
  external warp : int -> int -> unit = "ml_SDL_WarpMouse"
  type cursor
  type cursor_data = {
    data :
      (int, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array2.t;
    mask :
      (int, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array2.t;
    w : int;
    h : int;
    hot_x : int;
    hot_y : int;
  }
  external make_cursor :
    data:(int, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
         Bigarray.Array2.t ->
    mask:(int, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
         Bigarray.Array2.t ->
    hot_x:int -> hot_y:int -> Sdlmouse.cursor = "ml_SDL_CreateCursor"
  external free_cursor : Sdlmouse.cursor -> unit = "ml_SDL_FreeCursor"
  external set_cursor : Sdlmouse.cursor -> unit = "ml_SDL_SetCursor"
  external get_cursor : unit -> Sdlmouse.cursor = "ml_SDL_GetCursor"
  external cursor_visible : unit -> bool = "ml_SDL_ShowCursor_query"
  external show_cursor : bool -> unit = "ml_SDL_ShowCursor"
  external cursor_data : Sdlmouse.cursor -> Sdlmouse.cursor_data
    = "ml_SDL_Cursor_data"
  val pprint_cursor : Sdlmouse.cursor -> unit
  val convert_to_cursor :
    data:int array ->
    mask:int array ->
    w:int -> h:int -> hot_x:int -> hot_y:int -> Sdlmouse.cursor
end