diff --git a/Externals/SDL/SDL b/Externals/SDL/SDL index 42d09a8f42..0bfeed061b 160000 --- a/Externals/SDL/SDL +++ b/Externals/SDL/SDL @@ -1 +1 @@ -Subproject commit 42d09a8f42e3fbac7171d065199667b182da3fb4 +Subproject commit 0bfeed061b10ea7dd37c88d9bae1824bad760f3a diff --git a/Externals/SDL/SDL2.vcxproj b/Externals/SDL/SDL2.vcxproj index 7847419e32..1693429f70 100644 --- a/Externals/SDL/SDL2.vcxproj +++ b/Externals/SDL/SDL2.vcxproj @@ -289,7 +289,9 @@ + + diff --git a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp index 327002c3a3..3f0f372fa4 100644 --- a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp +++ b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.cpp @@ -294,6 +294,27 @@ void InputBackend::PopulateDevices() #endif } +struct SDLMotionAxis +{ + std::string_view name; + int index; + ControlState scale; +}; +using SDLMotionAxisList = std::array; + +// clang-format off +static constexpr SDLMotionAxisList SDL_AXES_ACCELEROMETER = {{ + {"Up", 1, 1}, {"Down", 1, -1}, + {"Left", 0, -1}, {"Right", 0, 1}, + {"Forward", 2, -1}, {"Backward", 2, 1}, +}}; +static constexpr SDLMotionAxisList SDL_AXES_GYRO = {{ + {"Pitch Up", 0, 1}, {"Pitch Down", 0, -1}, + {"Roll Left", 2, 1}, {"Roll Right", 2, -1}, + {"Yaw Left", 1, 1}, {"Yaw Right", 1, -1}, +}}; +// clang-format on + Joystick::Joystick(SDL_Joystick* const joystick, const int sdl_index) : m_joystick(joystick), m_name(StripWhitespace(GetJoystickName(sdl_index))) { @@ -398,29 +419,26 @@ Joystick::Joystick(SDL_Joystick* const joystick, const int sdl_index) m_controller = SDL_GameControllerOpen(sdl_index); if (m_controller) { - if (SDL_GameControllerSetSensorEnabled(m_controller, SDL_SENSOR_ACCEL, SDL_TRUE) == 0) - { - AddInput(new MotionInput("Accel Up", m_controller, SDL_SENSOR_ACCEL, 1, 1)); - AddInput(new MotionInput("Accel Down", m_controller, SDL_SENSOR_ACCEL, 1, -1)); + auto AddSensor = [this](SDL_SensorType type, std::string_view name, + const SDLMotionAxisList& axes) { + if (SDL_GameControllerSetSensorEnabled(m_controller, type, SDL_TRUE) == 0) + { + for (const SDLMotionAxis& axis : axes) + { + AddInput(new MotionInput(fmt::format("{} {}", name, axis.name), m_controller, type, + axis.index, axis.scale)); + } + } + }; - AddInput(new MotionInput("Accel Left", m_controller, SDL_SENSOR_ACCEL, 0, -1)); - AddInput(new MotionInput("Accel Right", m_controller, SDL_SENSOR_ACCEL, 0, 1)); - - AddInput(new MotionInput("Accel Forward", m_controller, SDL_SENSOR_ACCEL, 2, -1)); - AddInput(new MotionInput("Accel Backward", m_controller, SDL_SENSOR_ACCEL, 2, 1)); - } - - if (SDL_GameControllerSetSensorEnabled(m_controller, SDL_SENSOR_GYRO, SDL_TRUE) == 0) - { - AddInput(new MotionInput("Gyro Pitch Up", m_controller, SDL_SENSOR_GYRO, 0, 1)); - AddInput(new MotionInput("Gyro Pitch Down", m_controller, SDL_SENSOR_GYRO, 0, -1)); - - AddInput(new MotionInput("Gyro Roll Left", m_controller, SDL_SENSOR_GYRO, 2, 1)); - AddInput(new MotionInput("Gyro Roll Right", m_controller, SDL_SENSOR_GYRO, 2, -1)); - - AddInput(new MotionInput("Gyro Yaw Left", m_controller, SDL_SENSOR_GYRO, 1, 1)); - AddInput(new MotionInput("Gyro Yaw Right", m_controller, SDL_SENSOR_GYRO, 1, -1)); - } + AddSensor(SDL_SENSOR_ACCEL, "Accel", SDL_AXES_ACCELEROMETER); + AddSensor(SDL_SENSOR_GYRO, "Gyro", SDL_AXES_GYRO); +#if SDL_VERSION_ATLEAST(2, 26, 0) + AddSensor(SDL_SENSOR_ACCEL_L, "Accel L", SDL_AXES_ACCELEROMETER); + AddSensor(SDL_SENSOR_GYRO_L, "Gyro L", SDL_AXES_GYRO); + AddSensor(SDL_SENSOR_ACCEL_R, "Accel R", SDL_AXES_ACCELEROMETER); + AddSensor(SDL_SENSOR_GYRO_R, "Gyro R", SDL_AXES_GYRO); +#endif } } #endif diff --git a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h index 1b37a22b9e..74e66f05c1 100644 --- a/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h +++ b/Source/Core/InputCommon/ControllerInterface/SDL/SDL.h @@ -161,16 +161,16 @@ private: class MotionInput : public Input { public: - MotionInput(const char* name, SDL_GameController* gc, SDL_SensorType type, int index, + MotionInput(std::string name, SDL_GameController* gc, SDL_SensorType type, int index, ControlState scale) - : m_name(name), m_gc(gc), m_type(type), m_index(index), m_scale(scale){}; + : m_name(std::move(name)), m_gc(gc), m_type(type), m_index(index), m_scale(scale){}; std::string GetName() const override { return m_name; }; bool IsDetectable() const override { return false; }; ControlState GetState() const override; private: - const char* m_name; + std::string m_name; SDL_GameController* const m_gc; SDL_SensorType const m_type;