+# ---
+# Redef services from `sdl2::events`
+
+redef class SDLEvent
+ private fun to_gamnit_event(buffer: SDLEventBuffer): GamnitInputEvent
+ do return new GamnitOtherEvent(buffer, self)
+end
+
+redef class SDLQuitEvent
+ redef fun to_gamnit_event(buffer) do return new GamnitQuitEvent(buffer, self)
+end
+
+redef class SDLMouseEvent
+ redef fun to_gamnit_event(buffer) do return new GamnitPointerEvent(buffer, self)
+end
+
+redef class SDLKeyboardEvent
+ redef fun to_gamnit_event(buffer) do return new GamnitKeyEvent(buffer, self)
+end
+
+# ---
+# Implement `mnit::inputs` interfaces
+
+# SDL2 event wrapper implementing the `mnit::input` API
+#
+# There is two views to the underlying native object: `buffer` and `native`.
+class GamnitInputEvent
+ super InputEvent
+
+ # Native SDL 2 event buffer with the pseudo class hierarchy metadata
+ var buffer: SDLEventBuffer
+
+ # Native SDL 2 event
+ var native: NATIVE
+
+ # Type of the `native` underlying SDL 2 event
+ type NATIVE: SDLEvent
+end
+
+# Event on user requested quit
+class GamnitQuitEvent
+ super GamnitInputEvent
+ super QuitEvent
+
+ redef type NATIVE: SDLQuitEvent
+end
+
+# Event on keyboard input
+class GamnitKeyEvent
+ super GamnitInputEvent
+ super KeyEvent
+
+ redef type NATIVE: SDLKeyboardEvent
+
+ redef fun is_down do return buffer.is_keydown
+ redef fun is_up do return buffer.is_keyup
+ redef fun is_arrow_up do return native.keysym.is_up
+ redef fun is_arrow_left do return native.keysym.is_left
+ redef fun is_arrow_down do return native.keysym.is_down
+ redef fun is_arrow_right do return native.keysym.is_right
+ redef fun to_c do return native.to_s.chars.first
+ redef fun name do return native.to_s.to_lower
+end
+
+# Event on pointer, mouse and finger input
+class GamnitPointerEvent
+ super GamnitInputEvent
+ super PointerEvent
+
+ redef type NATIVE: SDLMouseEvent