From fe1b8ff0ab2d29f607fa58060657bcebfee209bf Mon Sep 17 00:00:00 2001 From: lizzie Date: Tue, 7 Jul 2026 19:54:15 +0200 Subject: [PATCH] [input_common] Fix GetButtonMappingForDevice() when joystick doesn't have a gamepad associated with it (#4172) from PS4 PR - this should help fix the case where a controller doesn't have an associated gamepad and thus its not automatically configured. this should fix that :) Signed-off-by: lizzie Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/4172 Reviewed-by: MaranBr Reviewed-by: CamilleLaVey --- src/input_common/drivers/sdl_driver.cpp | 43 ++++++++++++++----------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index ad854110ef..9ba9010dc1 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -948,34 +948,39 @@ ButtonMapping SDLDriver::GetButtonMappingForDevice(const Common::ParamPackage& p } const auto joystick = GetSDLJoystickByGUID(params.Get("guid", ""), params.Get("port", 0)); - auto* controller = joystick->GetSDLGameController(); - if (controller == nullptr) { - return {}; - } - // This list is missing ZL/ZR since those are not considered buttons in SDL GameController. // We will add those afterwards - ButtonBindings switch_to_sdl_button; - - switch_to_sdl_button = GetDefaultButtonBinding(joystick); - + ButtonBindings switch_to_sdl_button = GetDefaultButtonBinding(joystick); // Add the missing bindings for ZL/ZR static constexpr ZButtonBindings switch_to_sdl_axis{{ {Settings::NativeButton::ZL, SDL_GAMEPAD_AXIS_LEFT_TRIGGER}, {Settings::NativeButton::ZR, SDL_GAMEPAD_AXIS_RIGHT_TRIGGER}, }}; - - // Parameters contain two joysticks return dual - if (params.Has("guid2")) { - const auto joystick2 = GetSDLJoystickByGUID(params.Get("guid2", ""), params.Get("port", 0)); - - if (joystick2->GetSDLGameController() != nullptr) { - return GetDualControllerMapping(joystick, joystick2, switch_to_sdl_button, - switch_to_sdl_axis); + if (auto* controller = joystick->GetSDLGameController(); controller) { + // Parameters contain two joysticks return dual + if (params.Has("guid2")) { + const auto joystick2 = GetSDLJoystickByGUID(params.Get("guid2", ""), params.Get("port", 0)); + if (joystick2->GetSDLGameController()) + return GetDualControllerMapping(joystick, joystick2, switch_to_sdl_button, switch_to_sdl_axis); } + return GetSingleControllerMapping(joystick, switch_to_sdl_button, switch_to_sdl_axis); } - - return GetSingleControllerMapping(joystick, switch_to_sdl_button, switch_to_sdl_axis); + // Default mappings for when the controller doesn't have an associated gamepad + // This fixes issues where SDL uses a backend which doesn't support gamepad remappings + ButtonMapping mapping; + for (const auto& pair : switch_to_sdl_button) { + SDL_GamepadBinding binding{}; + binding.input_type = SDL_GAMEPAD_BINDTYPE_BUTTON; + binding.input.button = pair.second; + mapping.insert_or_assign(pair.first, BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding)); + } + for (const auto& pair : switch_to_sdl_axis) { + SDL_GamepadBinding binding{}; + binding.input_type = SDL_GAMEPAD_BINDTYPE_AXIS; + binding.input.axis.axis = pair.second; + mapping.insert_or_assign(pair.first, BuildParamPackageForBinding(joystick->GetPort(), joystick->GetGUID(), binding)); + } + return mapping; } ButtonBindings SDLDriver::GetDefaultButtonBinding(