///|
pub struct Event(@lib.SDL_Event)

///|
pub(all) enum EventType {
  /// Normal Events
  /// User-requested quit
  Quit
  /// The application is being terminated by the OS
  Terminating
  /// The application is low on memory, free memory if possible
  LowMemory
  /// The application is about to enter the background
  WILL_ENTER_BACKGROUND
  /// The application did enter the background and may not get CPU for some time
  DID_ENTER_BACKGROUND
  /// The application is about to enter the foreground
  WILL_ENTER_FOREGROUND
  /// The application is now interactive
  DID_ENTER_FOREGROUND
  /// The user's locale preferences have changed
  LOCALE_CHANGED
  /// The system theme changed
  SYSTEM_THEME_CHANGED
  /// Display events
  /// Display orientation has changed to data1
  DISPLAY_ORIENTATION
  /// Display has been added to the system
  DISPLAY_ADDED
  /// Display has been removed from the system
  DISPLAY_REMOVED
  /// Display has changed position
  DISPLAY_MOVED
  /// Display has changed desktop mode
  DISPLAY_DESKTOP_MODE_CHANGED
  /// Display has changed current mode
  DISPLAY_CURRENT_MODE_CHANGED
  /// Display has changed content scale
  DISPLAY_CONTENT_SCALE_CHANGED
  /// Window events
  /// Window has been shown
  WINDOW_SHOWN
  /// Window has been hidden
  WINDOW_HIDDEN
  /// Window has been exposed and should be redrawn
  WINDOW_EXPOSED
  /// Window has been moved to data1, data2
  WINDOW_MOVED
  /// Window has been resized to data1xdata2
  WINDOW_RESIZED
  /// The pixel size of the window has changed to data1xdata2
  WINDOW_PIXEL_SIZE_CHANGED
  /// The pixel size of a Metal view associated with the window has changed
  WINDOW_METAL_VIEW_RESIZED
  /// Window has been minimized
  WINDOW_MINIMIZED
  /// Window has been maximized
  WINDOW_MAXIMIZED
  /// Window has been restored to normal size and position
  WINDOW_RESTORED
  /// Window has gained mouse focus
  WINDOW_MOUSE_ENTER
  /// Window has lost mouse focus
  WINDOW_MOUSE_LEAVE
  /// Window has gained keyboard focus
  WINDOW_FOCUS_GAINED
  /// Window has lost keyboard focus
  WINDOW_FOCUS_LOST
  /// The window manager requests that the window be closed
  WINDOW_CLOSE_REQUESTED
  /// Window had a hit test that wasn't SDL_HITTEST_NORMAL
  WINDOW_HIT_TEST
  /// The ICC profile of the window's display has changed
  WINDOW_ICCPROF_CHANGED
  /// Window has been moved to display data1
  WINDOW_DISPLAY_CHANGED
  /// Window display scale has been changed
  WINDOW_DISPLAY_SCALE_CHANGED
  /// The window safe area has been changed
  WINDOW_SAFE_AREA_CHANGED
  /// The window has been occluded
  WINDOW_OCCLUDED
  /// The window has entered fullscreen mode
  WINDOW_ENTER_FULLSCREEN
  /// The window has left fullscreen mode
  WINDOW_LEAVE_FULLSCREEN
  /// The window with the associated ID is being or has been destroyed
  WINDOW_DESTROYED
  /// Window HDR properties have changed
  WINDOW_HDR_STATE_CHANGED
  /// Keyboard events
  /// Key pressed
  KEY_DOWN
  /// Key released
  KEY_UP
  /// Keyboard text editing (composition)
  TEXT_EDITING
  /// Keyboard text input
  TEXT_INPUT
  /// Keymap changed due to a system event
  KEYMAP_CHANGED
  /// A new keyboard has been inserted into the system
  KEYBOARD_ADDED
  /// A keyboard has been removed
  KEYBOARD_REMOVED
  /// Keyboard text editing candidates
  TEXT_EDITING_CANDIDATES
  /// Mouse events
  /// Mouse moved
  MOUSE_MOTION
  /// Mouse button pressed
  MOUSE_BUTTON_DOWN
  /// Mouse button released
  MOUSE_BUTTON_UP
  /// Mouse wheel motion
  MOUSE_WHEEL
  /// A new mouse has been inserted into the system
  MOUSE_ADDED
  /// A mouse has been removed
  MOUSE_REMOVED
  /// Joystick events
  /// Joystick axis motion
  JOYSTICK_AXIS_MOTION
  /// Joystick trackball motion
  JOYSTICK_BALL_MOTION
  /// Joystick hat position change
  JOYSTICK_HAT_MOTION
  /// Joystick button pressed
  JOYSTICK_BUTTON_DOWN
  /// Joystick button released
  JOYSTICK_BUTTON_UP
  /// A new joystick has been inserted into the system
  JOYSTICK_ADDED
  /// An opened joystick has been removed
  JOYSTICK_REMOVED
  /// Joystick battery level change
  JOYSTICK_BATTERY_UPDATED
  /// Joystick update is complete
  JOYSTICK_UPDATE_COMPLETE
  /// Gamepad events
  /// Gamepad axis motion
  GAMEPAD_AXIS_MOTION
  /// Gamepad button pressed
  GAMEPAD_BUTTON_DOWN
  /// Gamepad button released
  GAMEPAD_BUTTON_UP
  /// A new gamepad has been inserted into the system
  GAMEPAD_ADDED
  /// A gamepad has been removed
  GAMEPAD_REMOVED
  /// The gamepad mapping was updated
  GAMEPAD_REMAPPED
  /// Gamepad touchpad was touched
  GAMEPAD_TOUCHPAD_DOWN
  /// Gamepad touchpad finger was moved
  GAMEPAD_TOUCHPAD_MOTION
  /// Gamepad touchpad finger was lifted
  GAMEPAD_TOUCHPAD_UP
  /// Gamepad sensor was updated
  GAMEPAD_SENSOR_UPDATE
  /// Gamepad update is complete
  GAMEPAD_UPDATE_COMPLETE
  /// Gamepad Steam handle has changed
  GAMEPAD_STEAM_HANDLE_UPDATED
  /// Touch events
  /// Finger touched down on the touch surface
  FINGER_DOWN
  /// Finger lifted up from the touch surface
  FINGER_UP
  /// Finger moved along the touch surface
  FINGER_MOTION
  /// Finger touch canceled
  FINGER_CANCELED
  /// Clipboard events
  /// The clipboard or primary selection changed
  CLIPBOARD_UPDATE
  /// Drag and drop events
  /// The system requests a file open
  DROP_FILE
  /// text/plain drag-and-drop event
  DROP_TEXT
  /// A new set of drops is beginning
  DROP_BEGIN
  /// Current set of drops is now complete
  DROP_COMPLETE
  /// Position while moving over the window
  DROP_POSITION
  /// Audio hotplug events
  /// A new audio device is available
  AUDIO_DEVICE_ADDED
  /// An audio device has been removed
  AUDIO_DEVICE_REMOVED
  /// An audio device's format has been changed by the system
  AUDIO_DEVICE_FORMAT_CHANGED
  /// Sensor events
  /// A sensor was updated
  SENSOR_UPDATE
  /// Pressure-sensitive pen events
  /// Pressure-sensitive pen has become available
  PEN_PROXIMITY_IN
  /// Pressure-sensitive pen has become unavailable
  PEN_PROXIMITY_OUT
  /// Pressure-sensitive pen touched drawing surface
  PEN_DOWN
  /// Pressure-sensitive pen stopped touching drawing surface
  PEN_UP
  /// Pressure-sensitive pen button pressed
  PEN_BUTTON_DOWN
  /// Pressure-sensitive pen button released
  PEN_BUTTON_UP
  /// Pressure-sensitive pen is moving on the tablet
  PEN_MOTION
  /// Pressure-sensitive pen angle/pressure/etc changed
  PEN_AXIS
  /// Camera hotplug events
  /// A new camera device is available
  CAMERA_DEVICE_ADDED
  /// A camera device has been removed
  CAMERA_DEVICE_REMOVED
  /// A camera device has been approved for use by the user
  CAMERA_DEVICE_APPROVED
  /// A camera device has been denied for use by the user
  CAMERA_DEVICE_DENIED
  /// Render events
  /// The render targets have been reset and their contents need to be updated
  RENDER_TARGETS_RESET
  /// The device has been reset and all textures need to be recreated
  RENDER_DEVICE_RESET
  /// The device has been lost and can't be recovered
  RENDER_DEVICE_LOST
  /// Reserved events for private platforms
  PRIVATE0
  PRIVATE1
  PRIVATE2
  PRIVATE3
  /// Internal events
  /// Signals the end of an event poll cycle
  POLL_SENTINEL
  /// User events
  /// Events SDL_EVENT_USER through SDL_EVENT_LAST are for your use
  USER
  InValidEventType
}

///|
pub fn Event::getType(self : Self) -> EventType {
  match self.0.get_type() {
    SDL_EVENT_QUIT => Quit
    SDL_EVENT_TERMINATING => Terminating
    SDL_EVENT_LOW_MEMORY => LowMemory
    SDL_EVENT_WILL_ENTER_BACKGROUND => WILL_ENTER_BACKGROUND
    SDL_EVENT_DID_ENTER_BACKGROUND => DID_ENTER_BACKGROUND
    SDL_EVENT_WILL_ENTER_FOREGROUND => WILL_ENTER_FOREGROUND
    SDL_EVENT_DID_ENTER_FOREGROUND => DID_ENTER_FOREGROUND
    SDL_EVENT_LOCALE_CHANGED => LOCALE_CHANGED
    SDL_EVENT_SYSTEM_THEME_CHANGED => SYSTEM_THEME_CHANGED
    SDL_EVENT_DISPLAY_ORIENTATION => DISPLAY_ORIENTATION
    SDL_EVENT_DISPLAY_ADDED => DISPLAY_ADDED
    SDL_EVENT_DISPLAY_REMOVED => DISPLAY_REMOVED
    SDL_EVENT_DISPLAY_MOVED => DISPLAY_MOVED
    SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED => DISPLAY_DESKTOP_MODE_CHANGED
    SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED => DISPLAY_CURRENT_MODE_CHANGED
    SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED => DISPLAY_CONTENT_SCALE_CHANGED
    SDL_EVENT_WINDOW_SHOWN => WINDOW_SHOWN
    SDL_EVENT_WINDOW_HIDDEN => WINDOW_HIDDEN
    SDL_EVENT_WINDOW_EXPOSED => WINDOW_EXPOSED
    SDL_EVENT_WINDOW_MOVED => WINDOW_MOVED
    SDL_EVENT_WINDOW_RESIZED => WINDOW_RESIZED
    SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED => WINDOW_PIXEL_SIZE_CHANGED
    SDL_EVENT_WINDOW_METAL_VIEW_RESIZED => WINDOW_METAL_VIEW_RESIZED
    SDL_EVENT_WINDOW_MINIMIZED => WINDOW_MINIMIZED
    SDL_EVENT_WINDOW_MAXIMIZED => WINDOW_MAXIMIZED
    SDL_EVENT_WINDOW_RESTORED => WINDOW_RESTORED
    SDL_EVENT_WINDOW_MOUSE_ENTER => WINDOW_MOUSE_ENTER
    SDL_EVENT_WINDOW_MOUSE_LEAVE => WINDOW_MOUSE_LEAVE
    SDL_EVENT_WINDOW_FOCUS_GAINED => WINDOW_FOCUS_GAINED
    SDL_EVENT_WINDOW_FOCUS_LOST => WINDOW_FOCUS_LOST
    SDL_EVENT_WINDOW_CLOSE_REQUESTED => WINDOW_CLOSE_REQUESTED
    SDL_EVENT_WINDOW_HIT_TEST => WINDOW_HIT_TEST
    SDL_EVENT_WINDOW_ICCPROF_CHANGED => WINDOW_ICCPROF_CHANGED
    SDL_EVENT_WINDOW_DISPLAY_CHANGED => WINDOW_DISPLAY_CHANGED
    SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED => WINDOW_DISPLAY_SCALE_CHANGED
    SDL_EVENT_WINDOW_SAFE_AREA_CHANGED => WINDOW_SAFE_AREA_CHANGED
    SDL_EVENT_WINDOW_OCCLUDED => WINDOW_OCCLUDED
    SDL_EVENT_WINDOW_ENTER_FULLSCREEN => WINDOW_ENTER_FULLSCREEN
    SDL_EVENT_WINDOW_LEAVE_FULLSCREEN => WINDOW_LEAVE_FULLSCREEN
    SDL_EVENT_WINDOW_DESTROYED => WINDOW_DESTROYED
    SDL_EVENT_WINDOW_HDR_STATE_CHANGED => WINDOW_HDR_STATE_CHANGED
    SDL_EVENT_KEY_DOWN => KEY_DOWN
    SDL_EVENT_KEY_UP => KEY_UP
    SDL_EVENT_TEXT_EDITING => TEXT_EDITING
    SDL_EVENT_TEXT_INPUT => TEXT_INPUT
    SDL_EVENT_KEYMAP_CHANGED => KEYMAP_CHANGED
    SDL_EVENT_KEYBOARD_ADDED => KEYBOARD_ADDED
    SDL_EVENT_KEYBOARD_REMOVED => KEYBOARD_REMOVED
    SDL_EVENT_TEXT_EDITING_CANDIDATES => TEXT_EDITING_CANDIDATES
    SDL_EVENT_MOUSE_MOTION => MOUSE_MOTION
    SDL_EVENT_MOUSE_BUTTON_DOWN => MOUSE_BUTTON_DOWN
    SDL_EVENT_MOUSE_BUTTON_UP => MOUSE_BUTTON_UP
    SDL_EVENT_MOUSE_WHEEL => MOUSE_WHEEL
    SDL_EVENT_MOUSE_ADDED => MOUSE_ADDED
    SDL_EVENT_MOUSE_REMOVED => MOUSE_REMOVED
    SDL_EVENT_JOYSTICK_AXIS_MOTION => JOYSTICK_AXIS_MOTION
    SDL_EVENT_JOYSTICK_BALL_MOTION => JOYSTICK_BALL_MOTION
    SDL_EVENT_JOYSTICK_HAT_MOTION => JOYSTICK_HAT_MOTION
    SDL_EVENT_JOYSTICK_BUTTON_DOWN => JOYSTICK_BUTTON_DOWN
    SDL_EVENT_JOYSTICK_BUTTON_UP => JOYSTICK_BUTTON_UP
    SDL_EVENT_JOYSTICK_ADDED => JOYSTICK_ADDED
    SDL_EVENT_JOYSTICK_REMOVED => JOYSTICK_REMOVED
    SDL_EVENT_JOYSTICK_BATTERY_UPDATED => JOYSTICK_BATTERY_UPDATED
    SDL_EVENT_JOYSTICK_UPDATE_COMPLETE => JOYSTICK_UPDATE_COMPLETE
    SDL_EVENT_GAMEPAD_AXIS_MOTION => GAMEPAD_AXIS_MOTION
    SDL_EVENT_GAMEPAD_BUTTON_DOWN => GAMEPAD_BUTTON_DOWN
    SDL_EVENT_GAMEPAD_BUTTON_UP => GAMEPAD_BUTTON_UP
    SDL_EVENT_GAMEPAD_ADDED => GAMEPAD_ADDED
    SDL_EVENT_GAMEPAD_REMOVED => GAMEPAD_REMOVED
    SDL_EVENT_GAMEPAD_REMAPPED => GAMEPAD_REMAPPED
    SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN => GAMEPAD_TOUCHPAD_DOWN
    SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION => GAMEPAD_TOUCHPAD_MOTION
    SDL_EVENT_GAMEPAD_TOUCHPAD_UP => GAMEPAD_TOUCHPAD_UP
    SDL_EVENT_GAMEPAD_SENSOR_UPDATE => GAMEPAD_SENSOR_UPDATE
    SDL_EVENT_GAMEPAD_UPDATE_COMPLETE => GAMEPAD_UPDATE_COMPLETE
    SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED => GAMEPAD_STEAM_HANDLE_UPDATED
    SDL_EVENT_FINGER_DOWN => FINGER_DOWN
    SDL_EVENT_FINGER_UP => FINGER_UP
    SDL_EVENT_FINGER_MOTION => FINGER_MOTION
    SDL_EVENT_FINGER_CANCELED => FINGER_CANCELED
    SDL_EVENT_CLIPBOARD_UPDATE => CLIPBOARD_UPDATE
    SDL_EVENT_DROP_FILE => DROP_FILE
    SDL_EVENT_DROP_TEXT => DROP_TEXT
    SDL_EVENT_DROP_BEGIN => DROP_BEGIN
    SDL_EVENT_DROP_COMPLETE => DROP_COMPLETE
    SDL_EVENT_DROP_POSITION => DROP_POSITION
    SDL_EVENT_AUDIO_DEVICE_ADDED => AUDIO_DEVICE_ADDED
    SDL_EVENT_AUDIO_DEVICE_REMOVED => AUDIO_DEVICE_REMOVED
    SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED => AUDIO_DEVICE_FORMAT_CHANGED
    SDL_EVENT_SENSOR_UPDATE => SENSOR_UPDATE
    SDL_EVENT_PEN_PROXIMITY_IN => PEN_PROXIMITY_IN
    SDL_EVENT_PEN_PROXIMITY_OUT => PEN_PROXIMITY_OUT
    SDL_EVENT_PEN_DOWN => PEN_DOWN
    SDL_EVENT_PEN_UP => PEN_UP
    SDL_EVENT_PEN_BUTTON_DOWN => PEN_BUTTON_DOWN
    SDL_EVENT_PEN_BUTTON_UP => PEN_BUTTON_UP
    SDL_EVENT_PEN_MOTION => PEN_MOTION
    SDL_EVENT_PEN_AXIS => PEN_AXIS
    SDL_EVENT_CAMERA_DEVICE_ADDED => CAMERA_DEVICE_ADDED
    SDL_EVENT_CAMERA_DEVICE_REMOVED => CAMERA_DEVICE_REMOVED
    SDL_EVENT_CAMERA_DEVICE_APPROVED => CAMERA_DEVICE_APPROVED
    SDL_EVENT_CAMERA_DEVICE_DENIED => CAMERA_DEVICE_DENIED
    SDL_EVENT_RENDER_TARGETS_RESET => RENDER_TARGETS_RESET
    SDL_EVENT_RENDER_DEVICE_RESET => RENDER_DEVICE_RESET
    SDL_EVENT_RENDER_DEVICE_LOST => RENDER_DEVICE_LOST
    SDL_EVENT_PRIVATE0 => PRIVATE0
    SDL_EVENT_PRIVATE1 => PRIVATE1
    SDL_EVENT_PRIVATE2 => PRIVATE2
    SDL_EVENT_PRIVATE3 => PRIVATE3
    SDL_EVENT_POLL_SENTINEL => POLL_SENTINEL
    SDL_EVENT_USER => USER
    _ => InValidEventType
  }
}