Current status of SDL.

This commit is contained in:
BadQuanta
2026-05-13 19:48:22 +00:00
parent 28e9c4ba18
commit 15bb051619
24 changed files with 1806 additions and 360 deletions
+131 -333
View File
@@ -3,7 +3,7 @@
/// For complete documentation, see src/event.cpp
#include <SDL3/SDL_events.h>
#include <SDL3/SDL_init.h>
#include <hdk/grid/AbstractEventDispatch.hpp>
#include <hdk/grid/EPS.hpp>
#include <hdk/sdl/video/Window.hpp>
#include <cstdio>
#include <map>
@@ -69,11 +69,11 @@ namespace hdk::sdl::evt {
: value_dispatch_map(dispatch_map) { }
// The extractor function is a pure virtual function that child classes must implement to extract the value from
// the event
virtual ValueType extractor(SDL_Event* event) = 0;
virtual ValueType extractor(SDL_Event* event) const = 0;
// The Trigger function overrides the base Event Trigger function to extract the value from the event and dispatch
// to the appropriate callback based on that value, as well as triggering any callbacks in the base Event dispatch
// list.
virtual void Trigger(SDL_Event* event) override {
virtual void Trigger(SDL_Event* event) const override {
if (!event)
return;
ValueType value = this->extractor(event);
@@ -94,83 +94,67 @@ namespace hdk::sdl::evt {
public:
EventTypeRouter(value_dispatch_map_t dispatch_map)
: EventValueRouter(std::move(dispatch_map)) { }
virtual SDL_EventType extractor(SDL_Event* event) override { return (SDL_EventType)event->type; }
virtual SDL_EventType extractor(SDL_Event* event) const override { return (SDL_EventType)event->type; }
};
class DisplayEvents : public EventTypeRouter {
public:
EventConduit Orientation, Added, Removed, Moved, DesktopModeChanged, CurrentModeChanged, ContentScaleChanged;
// clang-format off
DisplayEvents()
: EventTypeRouter({
{ SDL_EVENT_DISPLAY_ORIENTATION, &Orientation },
{ SDL_EVENT_DISPLAY_ADDED, &Added },
{ SDL_EVENT_DISPLAY_REMOVED, &Removed },
{ SDL_EVENT_DISPLAY_MOVED, &Moved },
{ SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED, &DesktopModeChanged },
{ SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED, &CurrentModeChanged },
{ SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED, &ContentScaleChanged }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_DISPLAY_ORIENTATION, &Orientation }, { SDL_EVENT_DISPLAY_ADDED, &Added },
{ SDL_EVENT_DISPLAY_REMOVED, &Removed }, { SDL_EVENT_DISPLAY_MOVED, &Moved },
{ SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED, &DesktopModeChanged },
{ SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED, &CurrentModeChanged },
{ SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED, &ContentScaleChanged } }) { }
};
class KeyEvents : public EventTypeRouter {
public:
EventConduit Down, Up;
// clang-format off
KeyEvents()
: EventTypeRouter({
{ SDL_EVENT_KEY_DOWN, &Down },
{ SDL_EVENT_KEY_UP, &Up }
}) { };
// clang-format on
: EventTypeRouter({ { SDL_EVENT_KEY_DOWN, &Down }, { SDL_EVENT_KEY_UP, &Up } }) { };
};
class KeysEvents : public EventValueRouter<SDL_Keycode, KeyEvents> {
public:
KeysEvents()
: EventValueRouter({}) { }
virtual SDL_Keycode extractor(SDL_Event* event) override { return event->key.key; }
virtual SDL_Keycode extractor(SDL_Event* event) const override { return event->key.key; }
};
class JoystickAxisEvents : public EventValueRouter<Uint8> {
public:
JoystickAxisEvents()
: EventValueRouter({}) { }
virtual Uint8 extractor(SDL_Event* event) override { return event->jaxis.axis; }
virtual Uint8 extractor(SDL_Event* event) const override { return event->jaxis.axis; }
};
class JoystickBallEvents : public EventValueRouter<Uint8> {
public:
JoystickBallEvents()
: EventValueRouter({}) { }
virtual Uint8 extractor(SDL_Event* event) override { return event->jball.ball; }
virtual Uint8 extractor(SDL_Event* event) const override { return event->jball.ball; }
};
class JoystickHatEvents : public EventValueRouter<Uint8> {
public:
JoystickHatEvents()
: EventValueRouter({}) { }
virtual Uint8 extractor(SDL_Event* event) override { return event->jhat.hat; }
virtual Uint8 extractor(SDL_Event* event) const override { return event->jhat.hat; }
};
class JoystickButtonEvents : public EventTypeRouter {
public:
EventConduit Down, Up;
// clang-format off
JoystickButtonEvents()
: EventTypeRouter({
{ SDL_EVENT_JOYSTICK_BUTTON_DOWN, &Down },
{ SDL_EVENT_JOYSTICK_BUTTON_UP, &Up }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_JOYSTICK_BUTTON_DOWN, &Down }, { SDL_EVENT_JOYSTICK_BUTTON_UP, &Up } }) { }
};
class JoystickButtonsEvents : public EventValueRouter<Uint8, JoystickButtonEvents> {
public:
JoystickButtonsEvents()
: EventValueRouter({}) { }
virtual Uint8 extractor(SDL_Event* event) override { return event->jbutton.button; }
virtual Uint8 extractor(SDL_Event* event) const override { return event->jbutton.button; }
};
class JoystickEvents : public EventTypeRouter {
@@ -180,27 +164,20 @@ namespace hdk::sdl::evt {
JoystickHatEvents HatMotion;
JoystickButtonsEvents Button;
EventConduit Added, Removed, BatteryUpdated, UpdateComplete;
// clang-format off
JoystickEvents()
: EventTypeRouter({
{ SDL_EVENT_JOYSTICK_AXIS_MOTION, &AxisMotion },
{ SDL_EVENT_JOYSTICK_BALL_MOTION, &BallMotion },
{ SDL_EVENT_JOYSTICK_HAT_MOTION, &HatMotion },
{ SDL_EVENT_JOYSTICK_BUTTON_DOWN, &Button },
{ SDL_EVENT_JOYSTICK_BUTTON_UP, &Button },
{ SDL_EVENT_JOYSTICK_ADDED, &Added },
{ SDL_EVENT_JOYSTICK_REMOVED, &Removed },
{ SDL_EVENT_JOYSTICK_BATTERY_UPDATED, &BatteryUpdated },
{ SDL_EVENT_JOYSTICK_UPDATE_COMPLETE, &UpdateComplete }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_JOYSTICK_AXIS_MOTION, &AxisMotion },
{ SDL_EVENT_JOYSTICK_BALL_MOTION, &BallMotion }, { SDL_EVENT_JOYSTICK_HAT_MOTION, &HatMotion },
{ SDL_EVENT_JOYSTICK_BUTTON_DOWN, &Button }, { SDL_EVENT_JOYSTICK_BUTTON_UP, &Button },
{ SDL_EVENT_JOYSTICK_ADDED, &Added }, { SDL_EVENT_JOYSTICK_REMOVED, &Removed },
{ SDL_EVENT_JOYSTICK_BATTERY_UPDATED, &BatteryUpdated },
{ SDL_EVENT_JOYSTICK_UPDATE_COMPLETE, &UpdateComplete } }) { }
};
class JoysticksEvents : public EventValueRouter<SDL_JoystickID, JoystickEvents> {
public:
JoysticksEvents()
: EventValueRouter({}) { }
virtual SDL_JoystickID extractor(SDL_Event* event) override {
virtual SDL_JoystickID extractor(SDL_Event* event) const override {
switch (event->type) {
case SDL_EVENT_JOYSTICK_AXIS_MOTION:
return event->jaxis.which;
@@ -226,26 +203,21 @@ namespace hdk::sdl::evt {
public:
GamepadAxisEvents()
: EventValueRouter({}) { }
virtual SDL_GamepadAxis extractor(SDL_Event* event) override { return (SDL_GamepadAxis)event->gaxis.axis; }
virtual SDL_GamepadAxis extractor(SDL_Event* event) const override { return (SDL_GamepadAxis)event->gaxis.axis; }
};
class GamepadButtonEvents : public EventTypeRouter {
public:
EventConduit Down, Up;
// clang-format off
GamepadButtonEvents()
: EventTypeRouter({
{ SDL_EVENT_GAMEPAD_BUTTON_DOWN, &Down },
{ SDL_EVENT_GAMEPAD_BUTTON_UP, &Up }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_GAMEPAD_BUTTON_DOWN, &Down }, { SDL_EVENT_GAMEPAD_BUTTON_UP, &Up } }) { }
};
class GamepadButtonsEvents : public EventValueRouter<SDL_GamepadButton, GamepadButtonEvents> {
public:
GamepadButtonsEvents()
: EventValueRouter({}) { }
virtual SDL_GamepadButton extractor(SDL_Event* event) override {
virtual SDL_GamepadButton extractor(SDL_Event* event) const override {
return (SDL_GamepadButton)event->gbutton.button;
}
};
@@ -253,14 +225,9 @@ namespace hdk::sdl::evt {
class GamepadTouchpadEvents : public EventTypeRouter {
public:
EventConduit Down, Motion, Up;
// clang-format off
GamepadTouchpadEvents()
: EventTypeRouter({
{ SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN, &Down },
{ SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION, &Motion },
{ SDL_EVENT_GAMEPAD_TOUCHPAD_UP, &Up }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN, &Down },
{ SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION, &Motion }, { SDL_EVENT_GAMEPAD_TOUCHPAD_UP, &Up } }) { }
};
class GamepadEvents : public EventTypeRouter {
@@ -271,30 +238,21 @@ namespace hdk::sdl::evt {
GamepadTouchpadEvents Touchpad;
EventConduit SensorUpdate, UpdateComplete, SteamHandleUpdate;
// clang-format off
GamepadEvents()
: EventTypeRouter({
{ SDL_EVENT_GAMEPAD_AXIS_MOTION, &AxisMotion },
{ SDL_EVENT_GAMEPAD_BUTTON_DOWN, &Button },
{ SDL_EVENT_GAMEPAD_BUTTON_UP, &Button },
{ SDL_EVENT_GAMEPAD_ADDED, &Added },
{ SDL_EVENT_GAMEPAD_REMOVED, &Removed },
{ SDL_EVENT_GAMEPAD_REMAPPED, &Remapped },
{ SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN, &Touchpad },
{ SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION, &Touchpad },
{ SDL_EVENT_GAMEPAD_TOUCHPAD_UP, &Touchpad },
{ SDL_EVENT_GAMEPAD_SENSOR_UPDATE, &SensorUpdate },
{ SDL_EVENT_GAMEPAD_UPDATE_COMPLETE, &UpdateComplete }
}) {
: EventTypeRouter({ { SDL_EVENT_GAMEPAD_AXIS_MOTION, &AxisMotion }, { SDL_EVENT_GAMEPAD_BUTTON_DOWN, &Button },
{ SDL_EVENT_GAMEPAD_BUTTON_UP, &Button }, { SDL_EVENT_GAMEPAD_ADDED, &Added },
{ SDL_EVENT_GAMEPAD_REMOVED, &Removed }, { SDL_EVENT_GAMEPAD_REMAPPED, &Remapped },
{ SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN, &Touchpad }, { SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION, &Touchpad },
{ SDL_EVENT_GAMEPAD_TOUCHPAD_UP, &Touchpad }, { SDL_EVENT_GAMEPAD_SENSOR_UPDATE, &SensorUpdate },
{ SDL_EVENT_GAMEPAD_UPDATE_COMPLETE, &UpdateComplete } }) {
}
// clang-format on
};
class GamepadsEvents : public EventValueRouter<SDL_JoystickID, GamepadEvents> {
public:
GamepadsEvents()
: EventValueRouter({}) { }
virtual SDL_JoystickID extractor(SDL_Event* event) override {
virtual SDL_JoystickID extractor(SDL_Event* event) const override {
switch (event->type) {
case SDL_EVENT_GAMEPAD_AXIS_MOTION:
return event->gaxis.which;
@@ -322,141 +280,89 @@ namespace hdk::sdl::evt {
class FingerEvents : public EventTypeRouter {
public:
EventConduit Down, Up, Motion, Canceled;
// clang-format off
FingerEvents()
: EventTypeRouter({
{ SDL_EVENT_FINGER_DOWN, &Down },
{ SDL_EVENT_FINGER_UP, &Up },
{ SDL_EVENT_FINGER_MOTION, &Motion } ,
{ SDL_EVENT_FINGER_CANCELED, &Canceled }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_FINGER_DOWN, &Down }, { SDL_EVENT_FINGER_UP, &Up },
{ SDL_EVENT_FINGER_MOTION, &Motion }, { SDL_EVENT_FINGER_CANCELED, &Canceled } }) { }
};
class DropEvents : public EventTypeRouter {
public:
EventConduit File, Text, Begin, Complete;
// clang-format off
DropEvents()
: EventTypeRouter({
{ SDL_EVENT_DROP_FILE, &File },
{ SDL_EVENT_DROP_TEXT, &Text },
{ SDL_EVENT_DROP_BEGIN, &Begin },
{ SDL_EVENT_DROP_COMPLETE, &Complete }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_DROP_FILE, &File }, { SDL_EVENT_DROP_TEXT, &Text },
{ SDL_EVENT_DROP_BEGIN, &Begin }, { SDL_EVENT_DROP_COMPLETE, &Complete } }) { }
};
class AudioDeviceEvents : public EventTypeRouter {
public:
EventConduit Added, Removed, FormatChanged;
// clang-format off
AudioDeviceEvents()
: EventTypeRouter({
{ SDL_EVENT_AUDIO_DEVICE_ADDED, &Added },
{ SDL_EVENT_AUDIO_DEVICE_REMOVED, &Removed },
{ SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED, &FormatChanged }
}) {
: EventTypeRouter({ { SDL_EVENT_AUDIO_DEVICE_ADDED, &Added }, { SDL_EVENT_AUDIO_DEVICE_REMOVED, &Removed },
{ SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED, &FormatChanged } }) {
}
// clang-format on
};
class PenEvents : public EventTypeRouter {
public:
EventConduit ProximityIn, ProximityOut, Down, Up, Motion;
// clang-format off
PenEvents()
: EventTypeRouter({
{ SDL_EVENT_PEN_PROXIMITY_IN, &ProximityIn },
{ SDL_EVENT_PEN_PROXIMITY_OUT, &ProximityOut },
{ SDL_EVENT_PEN_DOWN, &Down },
{ SDL_EVENT_PEN_UP, &Up },
{ SDL_EVENT_PEN_MOTION, &Motion }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_PEN_PROXIMITY_IN, &ProximityIn }, { SDL_EVENT_PEN_PROXIMITY_OUT, &ProximityOut },
{ SDL_EVENT_PEN_DOWN, &Down }, { SDL_EVENT_PEN_UP, &Up }, { SDL_EVENT_PEN_MOTION, &Motion } }) { }
};
class CameraDeviceEvents : public EventTypeRouter {
public:
EventConduit Added, Removed, Approved, Denied;
// clang-format off
CameraDeviceEvents()
: EventTypeRouter({
{ SDL_EVENT_CAMERA_DEVICE_ADDED, &Added },
{ SDL_EVENT_CAMERA_DEVICE_REMOVED, &Removed },
{ SDL_EVENT_CAMERA_DEVICE_APPROVED, &Approved } ,
{ SDL_EVENT_CAMERA_DEVICE_DENIED, &Denied}
}) {
: EventTypeRouter({ { SDL_EVENT_CAMERA_DEVICE_ADDED, &Added }, { SDL_EVENT_CAMERA_DEVICE_REMOVED, &Removed },
{ SDL_EVENT_CAMERA_DEVICE_APPROVED, &Approved }, { SDL_EVENT_CAMERA_DEVICE_DENIED, &Denied } }) {
}
// clang-format on
};
class RenderEvents : public EventTypeRouter {
public:
EventConduit TargetsReset, DeviceReset, DeviceLost;
// clang-format off
RenderEvents()
: EventTypeRouter({
{ SDL_EVENT_RENDER_TARGETS_RESET, &TargetsReset },
{ SDL_EVENT_RENDER_DEVICE_RESET, &DeviceReset },
{ SDL_EVENT_RENDER_DEVICE_LOST, &DeviceLost }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_RENDER_TARGETS_RESET, &TargetsReset },
{ SDL_EVENT_RENDER_DEVICE_RESET, &DeviceReset }, { SDL_EVENT_RENDER_DEVICE_LOST, &DeviceLost } }) { }
};
class KeyboardEvents : public EventTypeRouter {
public:
EventConduit Added, Removed;
// clang-format off
KeyboardEvents()
: EventTypeRouter({
{ SDL_EVENT_KEYBOARD_ADDED, &Added },
{ SDL_EVENT_KEYBOARD_REMOVED, &Removed }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_KEYBOARD_ADDED, &Added }, { SDL_EVENT_KEYBOARD_REMOVED, &Removed } }) { }
};
class MouseButtonEvents : public EventTypeRouter {
public:
EventConduit Down, Up;
// clang-format off
MouseButtonEvents()
: EventTypeRouter({
{ SDL_EVENT_MOUSE_BUTTON_DOWN, &Down },
{ SDL_EVENT_MOUSE_BUTTON_UP, &Up }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_MOUSE_BUTTON_DOWN, &Down }, { SDL_EVENT_MOUSE_BUTTON_UP, &Up } }) { }
};
class MouseButtonsEvents : public EventValueRouter<Uint8, MouseButtonEvents> {
public:
MouseButtonsEvents()
: EventValueRouter({}) { }
virtual Uint8 extractor(SDL_Event* event) override { return event->button.button; }
virtual Uint8 extractor(SDL_Event* event) const override { return event->button.button; }
};
class MouseEvents : public EventTypeRouter {
public:
MouseButtonsEvents Button;
EventConduit Motion, Wheel, Added, Removed;
// clang-format off
MouseEvents()
: EventTypeRouter({
{ SDL_EVENT_MOUSE_MOTION, &Motion },
{ SDL_EVENT_MOUSE_BUTTON_DOWN, &Button },
{ SDL_EVENT_MOUSE_BUTTON_UP, &Button },
{ SDL_EVENT_MOUSE_WHEEL, &Wheel },
{ SDL_EVENT_MOUSE_ADDED, &Added },
{ SDL_EVENT_MOUSE_REMOVED, &Removed }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_MOUSE_MOTION, &Motion }, { SDL_EVENT_MOUSE_BUTTON_DOWN, &Button },
{ SDL_EVENT_MOUSE_BUTTON_UP, &Button }, { SDL_EVENT_MOUSE_WHEEL, &Wheel },
{ SDL_EVENT_MOUSE_ADDED, &Added }, { SDL_EVENT_MOUSE_REMOVED, &Removed } }) { }
};
class MiceEvents : public EventValueRouter<SDL_MouseID, MouseEvents> {
public:
MiceEvents()
: EventValueRouter({}) { }
virtual SDL_MouseID extractor(SDL_Event* event) override {
virtual SDL_MouseID extractor(SDL_Event* event) const override {
switch (event->type) {
case SDL_EVENT_MOUSE_MOTION:
return event->motion.which;
@@ -477,14 +383,9 @@ namespace hdk::sdl::evt {
class TextEvents : public EventTypeRouter {
public:
EventConduit Input, Editing, EditingCandidates;
// clang-format off
TextEvents()
: EventTypeRouter({
{ SDL_EVENT_TEXT_INPUT, &Input },
{ SDL_EVENT_TEXT_EDITING, &Editing },
{ SDL_EVENT_TEXT_EDITING_CANDIDATES, &EditingCandidates }
}) { }
// clang-format on
: EventTypeRouter({ { SDL_EVENT_TEXT_INPUT, &Input }, { SDL_EVENT_TEXT_EDITING, &Editing },
{ SDL_EVENT_TEXT_EDITING_CANDIDATES, &EditingCandidates } }) { }
};
class WindowEvents : public EventTypeRouter {
@@ -505,79 +406,33 @@ namespace hdk::sdl::evt {
TextEvents Text;
DropEvents Drop;
RenderEvents Render;
// clang-format off
WindowEvents()
: EventTypeRouter({
{ SDL_EVENT_WINDOW_SHOWN, &Shown },
{ SDL_EVENT_WINDOW_HIDDEN, &Hidden },
{ SDL_EVENT_WINDOW_EXPOSED, &Exposed },
{ SDL_EVENT_WINDOW_MOVED, &Moved },
{ SDL_EVENT_WINDOW_RESIZED, &Resized },
{ SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED, &PixelSizeChanged },
{ SDL_EVENT_WINDOW_METAL_VIEW_RESIZED, &MetalViewResized },
{ SDL_EVENT_WINDOW_MINIMIZED, &Minimized },
{ SDL_EVENT_WINDOW_MAXIMIZED, &Maximized },
{ SDL_EVENT_WINDOW_RESTORED, &Restored },
{ SDL_EVENT_WINDOW_MOUSE_ENTER, &MouseEnter },
{ SDL_EVENT_WINDOW_MOUSE_LEAVE, &MouseLeave },
{ SDL_EVENT_WINDOW_FOCUS_LOST, &FocusLost },
{ SDL_EVENT_WINDOW_CLOSE_REQUESTED, &CloseRequested },
{ SDL_EVENT_WINDOW_HIT_TEST, &HitTest },
{ SDL_EVENT_WINDOW_ICCPROF_CHANGED, &ICCProfChange },
: EventTypeRouter({ { SDL_EVENT_WINDOW_SHOWN, &Shown }, { SDL_EVENT_WINDOW_HIDDEN, &Hidden },
{ SDL_EVENT_WINDOW_EXPOSED, &Exposed }, { SDL_EVENT_WINDOW_MOVED, &Moved },
{ SDL_EVENT_WINDOW_RESIZED, &Resized }, { SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED, &PixelSizeChanged },
{ SDL_EVENT_WINDOW_METAL_VIEW_RESIZED, &MetalViewResized }, { SDL_EVENT_WINDOW_MINIMIZED, &Minimized },
{ SDL_EVENT_WINDOW_MAXIMIZED, &Maximized }, { SDL_EVENT_WINDOW_RESTORED, &Restored },
{ SDL_EVENT_WINDOW_MOUSE_ENTER, &MouseEnter }, { SDL_EVENT_WINDOW_MOUSE_LEAVE, &MouseLeave },
{ SDL_EVENT_WINDOW_FOCUS_LOST, &FocusLost }, { SDL_EVENT_WINDOW_CLOSE_REQUESTED, &CloseRequested },
{ SDL_EVENT_WINDOW_HIT_TEST, &HitTest }, { SDL_EVENT_WINDOW_ICCPROF_CHANGED, &ICCProfChange },
{ SDL_EVENT_WINDOW_DISPLAY_CHANGED, &DisplayChanged },
{ SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED, &DisplayScaleChanged },
{ SDL_EVENT_WINDOW_SAFE_AREA_CHANGED, &SafeAreaChanged },
{ SDL_EVENT_WINDOW_OCCLUDED, &Occluded },
{ SDL_EVENT_WINDOW_SAFE_AREA_CHANGED, &SafeAreaChanged }, { SDL_EVENT_WINDOW_OCCLUDED, &Occluded },
{ SDL_EVENT_WINDOW_ENTER_FULLSCREEN, &EnterFullscreen },
{ SDL_EVENT_WINDOW_LEAVE_FULLSCREEN, &LeaveFullscreen },
{ SDL_EVENT_WINDOW_DESTROYED, &Destroyed },
{ SDL_EVENT_WINDOW_HDR_STATE_CHANGED, &HdrStateChanged },
{ SDL_EVENT_FINGER_DOWN, &Finger },
{ SDL_EVENT_FINGER_UP, &Finger },
{ SDL_EVENT_FINGER_MOTION, &Finger },
{ SDL_EVENT_FINGER_CANCELED, &Finger },
{ SDL_EVENT_PEN_MOTION, &Pen },
{ SDL_EVENT_PEN_BUTTON_DOWN, &Pen },
{ SDL_EVENT_PEN_BUTTON_UP, &Pen },
{ SDL_EVENT_PEN_AXIS, &Pen },
{ SDL_EVENT_MOUSE_WHEEL, &Mouse},
{ SDL_EVENT_MOUSE_MOTION, &Mouse},
{ SDL_EVENT_MOUSE_BUTTON_DOWN, &Mouse },
{ SDL_EVENT_MOUSE_BUTTON_UP, &Mouse },
{ SDL_EVENT_KEY_DOWN, &Key },
{ SDL_EVENT_KEY_UP, &Key },
{ SDL_EVENT_PEN_PROXIMITY_IN, &Pen },
{ SDL_EVENT_PEN_PROXIMITY_OUT, &Pen },
{ SDL_EVENT_PEN_DOWN, &Pen },
{ SDL_EVENT_PEN_UP, &Pen },
{ SDL_EVENT_TEXT_INPUT, &Text },
{ SDL_EVENT_TEXT_EDITING, &Text },
{ SDL_EVENT_TEXT_EDITING_CANDIDATES, &Text },
{ SDL_EVENT_RENDER_TARGETS_RESET, &Render },
{ SDL_EVENT_RENDER_DEVICE_RESET, &Render },
{ SDL_EVENT_RENDER_DEVICE_LOST, &Render },
{ SDL_EVENT_DROP_BEGIN, &Drop },
{ SDL_EVENT_DROP_FILE, &Drop },
{ SDL_EVENT_DROP_TEXT, &Drop },
{ SDL_EVENT_DROP_COMPLETE, &Drop },
{ SDL_EVENT_DROP_POSITION, &Drop }
}) { }
// clang-format on
{ SDL_EVENT_WINDOW_LEAVE_FULLSCREEN, &LeaveFullscreen }, { SDL_EVENT_WINDOW_DESTROYED, &Destroyed },
{ SDL_EVENT_WINDOW_HDR_STATE_CHANGED, &HdrStateChanged }, { SDL_EVENT_FINGER_DOWN, &Finger },
{ SDL_EVENT_FINGER_UP, &Finger }, { SDL_EVENT_FINGER_MOTION, &Finger },
{ SDL_EVENT_FINGER_CANCELED, &Finger }, { SDL_EVENT_PEN_MOTION, &Pen },
{ SDL_EVENT_PEN_BUTTON_DOWN, &Pen }, { SDL_EVENT_PEN_BUTTON_UP, &Pen }, { SDL_EVENT_PEN_AXIS, &Pen },
{ SDL_EVENT_MOUSE_WHEEL, &Mouse }, { SDL_EVENT_MOUSE_MOTION, &Mouse },
{ SDL_EVENT_MOUSE_BUTTON_DOWN, &Mouse }, { SDL_EVENT_MOUSE_BUTTON_UP, &Mouse },
{ SDL_EVENT_KEY_DOWN, &Key }, { SDL_EVENT_KEY_UP, &Key }, { SDL_EVENT_PEN_PROXIMITY_IN, &Pen },
{ SDL_EVENT_PEN_PROXIMITY_OUT, &Pen }, { SDL_EVENT_PEN_DOWN, &Pen }, { SDL_EVENT_PEN_UP, &Pen },
{ SDL_EVENT_TEXT_INPUT, &Text }, { SDL_EVENT_TEXT_EDITING, &Text },
{ SDL_EVENT_TEXT_EDITING_CANDIDATES, &Text }, { SDL_EVENT_RENDER_TARGETS_RESET, &Render },
{ SDL_EVENT_RENDER_DEVICE_RESET, &Render }, { SDL_EVENT_RENDER_DEVICE_LOST, &Render },
{ SDL_EVENT_DROP_BEGIN, &Drop }, { SDL_EVENT_DROP_FILE, &Drop }, { SDL_EVENT_DROP_TEXT, &Drop },
{ SDL_EVENT_DROP_COMPLETE, &Drop }, { SDL_EVENT_DROP_POSITION, &Drop } }) { }
};
class WindowsEvents : public EventValueRouter<SDL_WindowID, WindowEvents> {
@@ -590,7 +445,7 @@ namespace hdk::sdl::evt {
value_dispatch_map[window_id] = &window;
return window;
}
virtual SDL_WindowID extractor(SDL_Event* event) override {
virtual SDL_WindowID extractor(SDL_Event* event) const override {
switch (event->type) {
case SDL_EVENT_WINDOW_SHOWN:
case SDL_EVENT_WINDOW_HIDDEN:
@@ -705,120 +560,63 @@ namespace hdk::sdl::evt {
CameraDeviceEvents CameraDevice;
/* Render Events */
RenderEvents Render;
// clang-format off
AllTypes()
// https://wiki.libsdl.org/SDL3/SDL_EventType
: EventTypeRouter({
{SDL_EVENT_QUIT, &Quit },
{SDL_EVENT_TERMINATING, &Terminating },
{SDL_EVENT_LOW_MEMORY, &LowMemory },
{SDL_EVENT_WILL_ENTER_BACKGROUND, &WillEnterBackground },
{SDL_EVENT_DID_ENTER_BACKGROUND, &DidEnterBackground },
{SDL_EVENT_WILL_ENTER_FOREGROUND, &WillEnterForeground },
{SDL_EVENT_LOCALE_CHANGED, &LocaleChanged },
{SDL_EVENT_SYSTEM_THEME_CHANGED, &SystemThemeChanged },
{SDL_EVENT_DISPLAY_ORIENTATION, &Display },
{SDL_EVENT_DISPLAY_ADDED, &Display },
{SDL_EVENT_DISPLAY_REMOVED, &Display },
{SDL_EVENT_DISPLAY_MOVED, &Display },
{SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED, &Display },
{SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED, &Display },
{SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED, &Display },
{SDL_EVENT_WINDOW_SHOWN, &Window },
{SDL_EVENT_WINDOW_HIDDEN, &Window },
{SDL_EVENT_WINDOW_EXPOSED, &Window },
{SDL_EVENT_WINDOW_MOVED, &Window },
{SDL_EVENT_WINDOW_RESIZED, &Window },
{SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED, &Window },
{SDL_EVENT_WINDOW_METAL_VIEW_RESIZED, &Window },
{SDL_EVENT_WINDOW_MINIMIZED, &Window },
{SDL_EVENT_WINDOW_MAXIMIZED, &Window },
{SDL_EVENT_WINDOW_RESTORED, &Window },
{SDL_EVENT_WINDOW_MOUSE_ENTER, &Window },
{SDL_EVENT_WINDOW_MOUSE_LEAVE, &Window },
{SDL_EVENT_WINDOW_FOCUS_LOST, &Window },
{SDL_EVENT_WINDOW_CLOSE_REQUESTED, &Window },
{SDL_EVENT_WINDOW_HIT_TEST, &Window },
{SDL_EVENT_WINDOW_ICCPROF_CHANGED, &Window },
{SDL_EVENT_WINDOW_DISPLAY_CHANGED, &Window },
{SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED, &Window },
{SDL_EVENT_WINDOW_SAFE_AREA_CHANGED, &Window },
{SDL_EVENT_WINDOW_OCCLUDED, &Window },
{SDL_EVENT_WINDOW_ENTER_FULLSCREEN, &Window },
{SDL_EVENT_WINDOW_LEAVE_FULLSCREEN, &Window },
{SDL_EVENT_WINDOW_DESTROYED, &Window },
{SDL_EVENT_WINDOW_HDR_STATE_CHANGED, &Window },
{SDL_EVENT_KEY_DOWN, &Key },
{SDL_EVENT_KEY_UP, &Key },
{SDL_EVENT_TEXT_EDITING, &Text },
{SDL_EVENT_TEXT_INPUT, &Text },
{SDL_EVENT_TEXT_EDITING_CANDIDATES, &Text },
{SDL_EVENT_KEYMAP_CHANGED, &KeymapChanged },
{SDL_EVENT_KEYBOARD_ADDED, &Keyboard },
{SDL_EVENT_KEYBOARD_REMOVED, &Keyboard },
{SDL_EVENT_MOUSE_MOTION, &Mouse },
{SDL_EVENT_MOUSE_BUTTON_DOWN, &Mouse },
{SDL_EVENT_MOUSE_BUTTON_UP, &Mouse },
{SDL_EVENT_MOUSE_WHEEL, &Mouse },
{SDL_EVENT_MOUSE_ADDED, &Mouse},
{SDL_EVENT_MOUSE_REMOVED, &Mouse},
{SDL_EVENT_JOYSTICK_AXIS_MOTION, &Joystick},
{SDL_EVENT_JOYSTICK_BALL_MOTION, &Joystick},
{SDL_EVENT_JOYSTICK_HAT_MOTION, &Joystick},
{SDL_EVENT_JOYSTICK_BUTTON_DOWN, &Joystick},
{SDL_EVENT_JOYSTICK_BUTTON_UP, &Joystick},
{SDL_EVENT_JOYSTICK_ADDED, &Joystick},
{SDL_EVENT_JOYSTICK_REMOVED, &Joystick},
{SDL_EVENT_JOYSTICK_BATTERY_UPDATED, &Joystick},
{SDL_EVENT_JOYSTICK_UPDATE_COMPLETE, &Joystick},
{SDL_EVENT_GAMEPAD_AXIS_MOTION, &Gamepad},
{SDL_EVENT_GAMEPAD_BUTTON_DOWN, &Gamepad},
{SDL_EVENT_GAMEPAD_BUTTON_UP, &Gamepad},
{SDL_EVENT_GAMEPAD_ADDED, &Gamepad},
{SDL_EVENT_GAMEPAD_REMOVED, &Gamepad},
{SDL_EVENT_GAMEPAD_REMAPPED, &Gamepad},
{SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN, &Gamepad},
{SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION, &Gamepad},
{SDL_EVENT_GAMEPAD_TOUCHPAD_UP, &Gamepad},
{SDL_EVENT_GAMEPAD_SENSOR_UPDATE, &Gamepad},
{SDL_EVENT_GAMEPAD_UPDATE_COMPLETE, &Gamepad},
{SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED, &Gamepad},
{SDL_EVENT_FINGER_DOWN, &Finger},
{SDL_EVENT_FINGER_UP, &Finger},
{SDL_EVENT_FINGER_MOTION, &Finger},
{SDL_EVENT_FINGER_CANCELED, &Finger},
{SDL_EVENT_CLIPBOARD_UPDATE, &ClipboardUpdate},
{SDL_EVENT_DROP_FILE, &Drop},
{SDL_EVENT_DROP_TEXT, &Drop},
{SDL_EVENT_DROP_BEGIN, &Drop},
{SDL_EVENT_DROP_COMPLETE, &Drop},
{SDL_EVENT_DROP_POSITION, &Drop},
{SDL_EVENT_AUDIO_DEVICE_ADDED, &AudioDevice},
{SDL_EVENT_AUDIO_DEVICE_REMOVED, &AudioDevice},
{SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED, &AudioDevice},
{SDL_EVENT_SENSOR_UPDATE, &SensorUpdate},
{SDL_EVENT_PEN_PROXIMITY_IN, &Pen},
{SDL_EVENT_PEN_PROXIMITY_OUT, &Pen},
{SDL_EVENT_PEN_DOWN, &Pen },
{SDL_EVENT_PEN_UP, &Pen},
{SDL_EVENT_PEN_BUTTON_DOWN, &Pen},
{SDL_EVENT_PEN_BUTTON_UP, &Pen},
{SDL_EVENT_PEN_MOTION, &Pen},
{SDL_EVENT_PEN_AXIS, &Pen},
{SDL_EVENT_CAMERA_DEVICE_ADDED, &CameraDevice},
{SDL_EVENT_CAMERA_DEVICE_REMOVED, &CameraDevice},
{SDL_EVENT_CAMERA_DEVICE_APPROVED, &CameraDevice },
{SDL_EVENT_CAMERA_DEVICE_DENIED, &CameraDevice},
{SDL_EVENT_RENDER_TARGETS_RESET , &Render },
{SDL_EVENT_RENDER_DEVICE_RESET, &Render},
{SDL_EVENT_RENDER_DEVICE_LOST, &Render}
}) { };
// clang-format on
: EventTypeRouter({ { SDL_EVENT_QUIT, &Quit }, { SDL_EVENT_TERMINATING, &Terminating },
{ SDL_EVENT_LOW_MEMORY, &LowMemory }, { SDL_EVENT_WILL_ENTER_BACKGROUND, &WillEnterBackground },
{ SDL_EVENT_DID_ENTER_BACKGROUND, &DidEnterBackground },
{ SDL_EVENT_WILL_ENTER_FOREGROUND, &WillEnterForeground }, { SDL_EVENT_LOCALE_CHANGED, &LocaleChanged },
{ SDL_EVENT_SYSTEM_THEME_CHANGED, &SystemThemeChanged }, { SDL_EVENT_DISPLAY_ORIENTATION, &Display },
{ SDL_EVENT_DISPLAY_ADDED, &Display }, { SDL_EVENT_DISPLAY_REMOVED, &Display },
{ SDL_EVENT_DISPLAY_MOVED, &Display }, { SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED, &Display },
{ SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED, &Display }, { SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED, &Display },
{ SDL_EVENT_WINDOW_SHOWN, &Window }, { SDL_EVENT_WINDOW_HIDDEN, &Window },
{ SDL_EVENT_WINDOW_EXPOSED, &Window }, { SDL_EVENT_WINDOW_MOVED, &Window },
{ SDL_EVENT_WINDOW_RESIZED, &Window }, { SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED, &Window },
{ SDL_EVENT_WINDOW_METAL_VIEW_RESIZED, &Window }, { SDL_EVENT_WINDOW_MINIMIZED, &Window },
{ SDL_EVENT_WINDOW_MAXIMIZED, &Window }, { SDL_EVENT_WINDOW_RESTORED, &Window },
{ SDL_EVENT_WINDOW_MOUSE_ENTER, &Window }, { SDL_EVENT_WINDOW_MOUSE_LEAVE, &Window },
{ SDL_EVENT_WINDOW_FOCUS_LOST, &Window }, { SDL_EVENT_WINDOW_CLOSE_REQUESTED, &Window },
{ SDL_EVENT_WINDOW_HIT_TEST, &Window }, { SDL_EVENT_WINDOW_ICCPROF_CHANGED, &Window },
{ SDL_EVENT_WINDOW_DISPLAY_CHANGED, &Window }, { SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED, &Window },
{ SDL_EVENT_WINDOW_SAFE_AREA_CHANGED, &Window }, { SDL_EVENT_WINDOW_OCCLUDED, &Window },
{ SDL_EVENT_WINDOW_ENTER_FULLSCREEN, &Window }, { SDL_EVENT_WINDOW_LEAVE_FULLSCREEN, &Window },
{ SDL_EVENT_WINDOW_DESTROYED, &Window }, { SDL_EVENT_WINDOW_HDR_STATE_CHANGED, &Window },
{ SDL_EVENT_KEY_DOWN, &Key }, { SDL_EVENT_KEY_UP, &Key }, { SDL_EVENT_TEXT_EDITING, &Text },
{ SDL_EVENT_TEXT_INPUT, &Text }, { SDL_EVENT_TEXT_EDITING_CANDIDATES, &Text },
{ SDL_EVENT_KEYMAP_CHANGED, &KeymapChanged }, { SDL_EVENT_KEYBOARD_ADDED, &Keyboard },
{ SDL_EVENT_KEYBOARD_REMOVED, &Keyboard }, { SDL_EVENT_MOUSE_MOTION, &Mouse },
{ SDL_EVENT_MOUSE_BUTTON_DOWN, &Mouse }, { SDL_EVENT_MOUSE_BUTTON_UP, &Mouse },
{ SDL_EVENT_MOUSE_WHEEL, &Mouse }, { SDL_EVENT_MOUSE_ADDED, &Mouse }, { SDL_EVENT_MOUSE_REMOVED, &Mouse },
{ SDL_EVENT_JOYSTICK_AXIS_MOTION, &Joystick }, { SDL_EVENT_JOYSTICK_BALL_MOTION, &Joystick },
{ SDL_EVENT_JOYSTICK_HAT_MOTION, &Joystick }, { SDL_EVENT_JOYSTICK_BUTTON_DOWN, &Joystick },
{ SDL_EVENT_JOYSTICK_BUTTON_UP, &Joystick }, { SDL_EVENT_JOYSTICK_ADDED, &Joystick },
{ SDL_EVENT_JOYSTICK_REMOVED, &Joystick }, { SDL_EVENT_JOYSTICK_BATTERY_UPDATED, &Joystick },
{ SDL_EVENT_JOYSTICK_UPDATE_COMPLETE, &Joystick }, { SDL_EVENT_GAMEPAD_AXIS_MOTION, &Gamepad },
{ SDL_EVENT_GAMEPAD_BUTTON_DOWN, &Gamepad }, { SDL_EVENT_GAMEPAD_BUTTON_UP, &Gamepad },
{ SDL_EVENT_GAMEPAD_ADDED, &Gamepad }, { SDL_EVENT_GAMEPAD_REMOVED, &Gamepad },
{ SDL_EVENT_GAMEPAD_REMAPPED, &Gamepad }, { SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN, &Gamepad },
{ SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION, &Gamepad }, { SDL_EVENT_GAMEPAD_TOUCHPAD_UP, &Gamepad },
{ SDL_EVENT_GAMEPAD_SENSOR_UPDATE, &Gamepad }, { SDL_EVENT_GAMEPAD_UPDATE_COMPLETE, &Gamepad },
{ SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED, &Gamepad }, { SDL_EVENT_FINGER_DOWN, &Finger },
{ SDL_EVENT_FINGER_UP, &Finger }, { SDL_EVENT_FINGER_MOTION, &Finger },
{ SDL_EVENT_FINGER_CANCELED, &Finger }, { SDL_EVENT_CLIPBOARD_UPDATE, &ClipboardUpdate },
{ SDL_EVENT_DROP_FILE, &Drop }, { SDL_EVENT_DROP_TEXT, &Drop }, { SDL_EVENT_DROP_BEGIN, &Drop },
{ SDL_EVENT_DROP_COMPLETE, &Drop }, { SDL_EVENT_DROP_POSITION, &Drop },
{ SDL_EVENT_AUDIO_DEVICE_ADDED, &AudioDevice }, { SDL_EVENT_AUDIO_DEVICE_REMOVED, &AudioDevice },
{ SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED, &AudioDevice }, { SDL_EVENT_SENSOR_UPDATE, &SensorUpdate },
{ SDL_EVENT_PEN_PROXIMITY_IN, &Pen }, { SDL_EVENT_PEN_PROXIMITY_OUT, &Pen }, { SDL_EVENT_PEN_DOWN, &Pen },
{ SDL_EVENT_PEN_UP, &Pen }, { SDL_EVENT_PEN_BUTTON_DOWN, &Pen }, { SDL_EVENT_PEN_BUTTON_UP, &Pen },
{ SDL_EVENT_PEN_MOTION, &Pen }, { SDL_EVENT_PEN_AXIS, &Pen },
{ SDL_EVENT_CAMERA_DEVICE_ADDED, &CameraDevice }, { SDL_EVENT_CAMERA_DEVICE_REMOVED, &CameraDevice },
{ SDL_EVENT_CAMERA_DEVICE_APPROVED, &CameraDevice }, { SDL_EVENT_CAMERA_DEVICE_DENIED, &CameraDevice },
{ SDL_EVENT_RENDER_TARGETS_RESET, &Render }, { SDL_EVENT_RENDER_DEVICE_RESET, &Render },
{ SDL_EVENT_RENDER_DEVICE_LOST, &Render } }) { };
// In addition to dispatching things to their normal handler we are also going to send all events that have a
// WindowID to the CompleteWindowsEvents handler, so that users can listen for all events related to a specific
// window in one place if they want to.
virtual void Trigger(SDL_Event* event) override {
virtual void Trigger(SDL_Event* event) const override {
switch (event->type) {
// SDL_EVENT_WINDOW_* is already forwarded to Window event handlers
// But these following events contain a WindowID, and so we want to forward them too there.