diff options
Diffstat (limited to 'src/input_common/drivers/sdl_driver.cpp')
| -rw-r--r-- | src/input_common/drivers/sdl_driver.cpp | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index c17ea305e..a5c63e74a 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp | |||
| @@ -62,7 +62,7 @@ public: | |||
| 62 | 62 | ||
| 63 | bool UpdateMotion(SDL_ControllerSensorEvent event) { | 63 | bool UpdateMotion(SDL_ControllerSensorEvent event) { |
| 64 | constexpr float gravity_constant = 9.80665f; | 64 | constexpr float gravity_constant = 9.80665f; |
| 65 | std::lock_guard lock{mutex}; | 65 | std::scoped_lock lock{mutex}; |
| 66 | const u64 time_difference = event.timestamp - last_motion_update; | 66 | const u64 time_difference = event.timestamp - last_motion_update; |
| 67 | last_motion_update = event.timestamp; | 67 | last_motion_update = event.timestamp; |
| 68 | switch (event.sensor) { | 68 | switch (event.sensor) { |
| @@ -241,7 +241,7 @@ private: | |||
| 241 | }; | 241 | }; |
| 242 | 242 | ||
| 243 | std::shared_ptr<SDLJoystick> SDLDriver::GetSDLJoystickByGUID(const std::string& guid, int port) { | 243 | std::shared_ptr<SDLJoystick> SDLDriver::GetSDLJoystickByGUID(const std::string& guid, int port) { |
| 244 | std::lock_guard lock{joystick_map_mutex}; | 244 | std::scoped_lock lock{joystick_map_mutex}; |
| 245 | const auto it = joystick_map.find(guid); | 245 | const auto it = joystick_map.find(guid); |
| 246 | 246 | ||
| 247 | if (it != joystick_map.end()) { | 247 | if (it != joystick_map.end()) { |
| @@ -263,7 +263,7 @@ std::shared_ptr<SDLJoystick> SDLDriver::GetSDLJoystickBySDLID(SDL_JoystickID sdl | |||
| 263 | auto sdl_joystick = SDL_JoystickFromInstanceID(sdl_id); | 263 | auto sdl_joystick = SDL_JoystickFromInstanceID(sdl_id); |
| 264 | const std::string guid = GetGUID(sdl_joystick); | 264 | const std::string guid = GetGUID(sdl_joystick); |
| 265 | 265 | ||
| 266 | std::lock_guard lock{joystick_map_mutex}; | 266 | std::scoped_lock lock{joystick_map_mutex}; |
| 267 | const auto map_it = joystick_map.find(guid); | 267 | const auto map_it = joystick_map.find(guid); |
| 268 | 268 | ||
| 269 | if (map_it == joystick_map.end()) { | 269 | if (map_it == joystick_map.end()) { |
| @@ -297,7 +297,7 @@ void SDLDriver::InitJoystick(int joystick_index) { | |||
| 297 | 297 | ||
| 298 | const std::string guid = GetGUID(sdl_joystick); | 298 | const std::string guid = GetGUID(sdl_joystick); |
| 299 | 299 | ||
| 300 | std::lock_guard lock{joystick_map_mutex}; | 300 | std::scoped_lock lock{joystick_map_mutex}; |
| 301 | if (joystick_map.find(guid) == joystick_map.end()) { | 301 | if (joystick_map.find(guid) == joystick_map.end()) { |
| 302 | auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller); | 302 | auto joystick = std::make_shared<SDLJoystick>(guid, 0, sdl_joystick, sdl_gamecontroller); |
| 303 | PreSetController(joystick->GetPadIdentifier()); | 303 | PreSetController(joystick->GetPadIdentifier()); |
| @@ -326,7 +326,7 @@ void SDLDriver::InitJoystick(int joystick_index) { | |||
| 326 | void SDLDriver::CloseJoystick(SDL_Joystick* sdl_joystick) { | 326 | void SDLDriver::CloseJoystick(SDL_Joystick* sdl_joystick) { |
| 327 | const std::string guid = GetGUID(sdl_joystick); | 327 | const std::string guid = GetGUID(sdl_joystick); |
| 328 | 328 | ||
| 329 | std::lock_guard lock{joystick_map_mutex}; | 329 | std::scoped_lock lock{joystick_map_mutex}; |
| 330 | // This call to guid is safe since the joystick is guaranteed to be in the map | 330 | // This call to guid is safe since the joystick is guaranteed to be in the map |
| 331 | const auto& joystick_guid_list = joystick_map[guid]; | 331 | const auto& joystick_guid_list = joystick_map[guid]; |
| 332 | const auto joystick_it = std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(), | 332 | const auto joystick_it = std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(), |
| @@ -392,7 +392,7 @@ void SDLDriver::HandleGameControllerEvent(const SDL_Event& event) { | |||
| 392 | } | 392 | } |
| 393 | 393 | ||
| 394 | void SDLDriver::CloseJoysticks() { | 394 | void SDLDriver::CloseJoysticks() { |
| 395 | std::lock_guard lock{joystick_map_mutex}; | 395 | std::scoped_lock lock{joystick_map_mutex}; |
| 396 | joystick_map.clear(); | 396 | joystick_map.clear(); |
| 397 | } | 397 | } |
| 398 | 398 | ||
| @@ -934,4 +934,37 @@ u8 SDLDriver::GetHatButtonId(const std::string& direction_name) const { | |||
| 934 | return direction; | 934 | return direction; |
| 935 | } | 935 | } |
| 936 | 936 | ||
| 937 | bool SDLDriver::IsStickInverted(const Common::ParamPackage& params) { | ||
| 938 | if (!params.Has("guid") || !params.Has("port")) { | ||
| 939 | return false; | ||
| 940 | } | ||
| 941 | const auto joystick = GetSDLJoystickByGUID(params.Get("guid", ""), params.Get("port", 0)); | ||
| 942 | if (joystick == nullptr) { | ||
| 943 | return false; | ||
| 944 | } | ||
| 945 | auto* controller = joystick->GetSDLGameController(); | ||
| 946 | if (controller == nullptr) { | ||
| 947 | return false; | ||
| 948 | } | ||
| 949 | |||
| 950 | const auto& axis_x = params.Get("axis_x", 0); | ||
| 951 | const auto& axis_y = params.Get("axis_y", 0); | ||
| 952 | const auto& binding_left_x = | ||
| 953 | SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); | ||
| 954 | const auto& binding_right_x = | ||
| 955 | SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_RIGHTX); | ||
| 956 | const auto& binding_left_y = | ||
| 957 | SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_LEFTY); | ||
| 958 | const auto& binding_right_y = | ||
| 959 | SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_RIGHTY); | ||
| 960 | |||
| 961 | if (axis_x != binding_left_y.value.axis && axis_x != binding_right_y.value.axis) { | ||
| 962 | return false; | ||
| 963 | } | ||
| 964 | if (axis_y != binding_left_x.value.axis && axis_y != binding_right_x.value.axis) { | ||
| 965 | return false; | ||
| 966 | } | ||
| 967 | return true; | ||
| 968 | } | ||
| 969 | |||
| 937 | } // namespace InputCommon | 970 | } // namespace InputCommon |