SDLInputSource: Simplify polling

And use the actual events for the changed-flag, rather than counting.
This commit is contained in:
Stenzek
2026-09-26 01:29:59 +10:00
parent aa77ed54da
commit 64b1e2b46c
2 changed files with 82 additions and 118 deletions
+81 -111
View File
@@ -318,13 +318,11 @@ bool SDLInputSource::Initialize(const SettingsInterface& si, std::unique_lock<Th
void SDLInputSource::UpdateSettings(const SettingsInterface& si, std::unique_lock<Threading::Mutex>& settings_lock)
{
const bool old_controller_touchpad_as_pointer = m_controller_touchpad_as_pointer;
const u8 old_advanced_options_bits = m_advanced_options_bits;
const u16 old_advanced_options_bits = m_advanced_options_bits;
LoadSettings(si);
if (m_advanced_options_bits != old_advanced_options_bits ||
m_controller_touchpad_as_pointer != old_controller_touchpad_as_pointer)
if (m_advanced_options_bits != old_advanced_options_bits)
{
settings_lock.unlock();
ShutdownSubsystem();
@@ -604,24 +602,6 @@ void SDLInputSource::ShutdownSubsystem()
g_dyn_sdl.QuitSubSystem(SDL_INIT_JOYSTICK | SDL_INIT_GAMEPAD | SDL_INIT_HAPTIC);
}
bool SDLInputSource::PollEvents()
{
bool topology_changed = false;
for (;;)
{
SDL_Event ev;
if (g_dyn_sdl.SDL_PollEvent(&ev))
{
const size_t old_controller_count = m_controllers.size();
ProcessSDLEvent(&ev);
topology_changed |= (m_controllers.size() != old_controller_count);
}
else
break;
}
return topology_changed;
}
InputManager::DeviceList SDLInputSource::EnumerateDevices()
{
InputManager::DeviceList ret;
@@ -987,100 +967,90 @@ void SDLInputSource::SetSubclassPollDeviceList(InputSubclass subclass, const std
}
}
bool SDLInputSource::IsHandledInputEvent(const SDL_Event* ev)
bool SDLInputSource::PollEvents()
{
switch (ev->type)
bool topology_changed = false;
for (;;)
{
case SDL_EVENT_GAMEPAD_ADDED:
case SDL_EVENT_GAMEPAD_REMOVED:
case SDL_EVENT_GAMEPAD_AXIS_MOTION:
case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
case SDL_EVENT_GAMEPAD_BUTTON_UP:
case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN:
case SDL_EVENT_GAMEPAD_TOUCHPAD_UP:
case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION:
case SDL_EVENT_GAMEPAD_SENSOR_UPDATE:
case SDL_EVENT_JOYSTICK_ADDED:
case SDL_EVENT_JOYSTICK_REMOVED:
case SDL_EVENT_JOYSTICK_AXIS_MOTION:
case SDL_EVENT_JOYSTICK_BUTTON_DOWN:
case SDL_EVENT_JOYSTICK_BUTTON_UP:
case SDL_EVENT_JOYSTICK_HAT_MOTION:
return true;
SDL_Event ev;
if (!g_dyn_sdl.SDL_PollEvent(&ev))
break;
default:
return false;
switch (ev.type)
{
case SDL_EVENT_GAMEPAD_ADDED:
{
INFO_LOG("Controller {} inserted", ev.gdevice.which);
topology_changed |= OpenDevice(ev.gdevice.which, true);
}
break;
case SDL_EVENT_GAMEPAD_REMOVED:
{
INFO_LOG("Controller {} removed", ev.gdevice.which);
topology_changed |= CloseDevice(ev.gdevice.which);
}
break;
case SDL_EVENT_JOYSTICK_ADDED:
{
// Let gamepad handle.. well.. gamepads.
if (!g_dyn_sdl.SDL_IsGamepad(ev.jdevice.which))
{
INFO_LOG("Joystick {} inserted", ev.jdevice.which);
topology_changed |= OpenDevice(ev.jdevice.which, false);
}
}
break;
case SDL_EVENT_JOYSTICK_REMOVED:
{
if (auto it = GetControllerDataForJoystickId(ev.jdevice.which); it != m_controllers.end() && !it->gamepad)
{
INFO_LOG("Joystick {} removed", ev.jdevice.which);
topology_changed |= CloseDevice(ev.jdevice.which);
}
}
break;
case SDL_EVENT_GAMEPAD_AXIS_MOTION:
HandleGamepadAxisMotionEvent(&ev.gaxis);
break;
case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
case SDL_EVENT_GAMEPAD_BUTTON_UP:
HandleGamepadButtonEvent(&ev.gbutton);
break;
case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN:
case SDL_EVENT_GAMEPAD_TOUCHPAD_UP:
case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION:
HandleGamepadTouchpadEvent(&ev.gtouchpad);
break;
case SDL_EVENT_GAMEPAD_SENSOR_UPDATE:
HandleGamepadSensorEvent(&ev.gsensor);
break;
case SDL_EVENT_JOYSTICK_AXIS_MOTION:
HandleJoystickAxisEvent(&ev.jaxis);
break;
case SDL_EVENT_JOYSTICK_BUTTON_DOWN:
case SDL_EVENT_JOYSTICK_BUTTON_UP:
HandleJoystickButtonEvent(&ev.jbutton);
break;
case SDL_EVENT_JOYSTICK_HAT_MOTION:
HandleJoystickHatEvent(&ev.jhat);
break;
default:
break;
}
}
}
bool SDLInputSource::ProcessSDLEvent(const SDL_Event* event)
{
switch (event->type)
{
case SDL_EVENT_GAMEPAD_ADDED:
{
INFO_LOG("Controller {} inserted", event->gdevice.which);
OpenDevice(event->gdevice.which, true);
return true;
}
case SDL_EVENT_GAMEPAD_REMOVED:
{
INFO_LOG("Controller {} removed", event->gdevice.which);
CloseDevice(event->gdevice.which);
return true;
}
case SDL_EVENT_JOYSTICK_ADDED:
{
// Let gamepad handle.. well.. gamepads.
if (g_dyn_sdl.SDL_IsGamepad(event->jdevice.which))
return false;
INFO_LOG("Joystick {} inserted", event->jdevice.which);
OpenDevice(event->jdevice.which, false);
return true;
}
break;
case SDL_EVENT_JOYSTICK_REMOVED:
{
if (auto it = GetControllerDataForJoystickId(event->jdevice.which); it != m_controllers.end() && it->gamepad)
return false;
INFO_LOG("Joystick {} removed", event->jdevice.which);
CloseDevice(event->jdevice.which);
return true;
}
case SDL_EVENT_GAMEPAD_AXIS_MOTION:
return HandleGamepadAxisMotionEvent(&event->gaxis);
case SDL_EVENT_GAMEPAD_BUTTON_DOWN:
case SDL_EVENT_GAMEPAD_BUTTON_UP:
return HandleGamepadButtonEvent(&event->gbutton);
case SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN:
case SDL_EVENT_GAMEPAD_TOUCHPAD_UP:
case SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION:
return HandleGamepadTouchpadEvent(&event->gtouchpad);
case SDL_EVENT_GAMEPAD_SENSOR_UPDATE:
return HandleGamepadSensorEvent(&event->gsensor);
case SDL_EVENT_JOYSTICK_AXIS_MOTION:
return HandleJoystickAxisEvent(&event->jaxis);
case SDL_EVENT_JOYSTICK_BUTTON_DOWN:
case SDL_EVENT_JOYSTICK_BUTTON_UP:
return HandleJoystickButtonEvent(&event->jbutton);
case SDL_EVENT_JOYSTICK_HAT_MOTION:
return HandleJoystickHatEvent(&event->jhat);
default:
return false;
}
return topology_changed;
}
SDL_Joystick* SDLInputSource::GetJoystickForDevice(std::string_view device)
+1 -7
View File
@@ -49,17 +49,11 @@ public:
void SetSubclassPollDeviceList(InputSubclass subclass, const std::span<const InputBindingKey>* devices) override;
std::unique_ptr<ForceFeedbackDevice> CreateForceFeedbackDevice(std::string_view device, Error* error) override;
bool ProcessSDLEvent(const SDL_Event* event);
SDL_Joystick* GetJoystickForDevice(std::string_view device);
static u32 GetRGBForPlayerId(const SettingsInterface& si, u32 player_id, bool active);
static u32 ParseRGBForPlayerId(std::string_view str, u32 player_id, bool active);
static std::span<const SettingInfo> GetAdvancedSettingsInfo();
static bool IsHandledInputEvent(const SDL_Event* ev);
private:
struct ControllerData
{
@@ -100,6 +94,7 @@ private:
void LoadSettings(const SettingsInterface& si);
void SetHints();
SDL_Joystick* GetJoystickForDevice(std::string_view device);
ControllerDataVector::iterator GetControllerDataForJoystickId(SDL_JoystickID id);
ControllerDataVector::iterator GetControllerDataForPlayerId(int id);
int GetFreePlayerId() const;
@@ -124,7 +119,6 @@ private:
std::array<std::array<u32, 2>, MAX_LED_COLORS> m_led_colors{};
std::vector<std::pair<std::string, std::string>> m_sdl_hints;
bool m_sdl_subsystem_initialized = false;
bool m_controller_touchpad_as_pointer = false;
union