mirror of
https://github.com/stenzek/duckstation.git
synced 2026-10-12 02:23:23 +00:00
SDLInputSource: Simplify polling
And use the actual events for the changed-flag, rather than counting.
This commit is contained in:
+81
-111
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user