From 5416f432b5aa44e359026d0910638400d09b7d78 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Tue, 17 Mar 2026 19:15:26 +0100 Subject: [PATCH] input: Fix SDL buttons --- rpcs3/Input/sdl_pad_handler.cpp | 63 +++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 27 deletions(-) diff --git a/rpcs3/Input/sdl_pad_handler.cpp b/rpcs3/Input/sdl_pad_handler.cpp index eda154446c..9fd6c79dd5 100644 --- a/rpcs3/Input/sdl_pad_handler.cpp +++ b/rpcs3/Input/sdl_pad_handler.cpp @@ -65,16 +65,6 @@ sdl_pad_handler::sdl_pad_handler() : PadHandlerBase(pad_handler::sdl) { SDLKeyCodes::RSXPos, "RS X+" }, { SDLKeyCodes::RSYPos, "RS Y+" }, { SDLKeyCodes::RSYNeg, "RS Y-" }, - { SDLKeyCodes::PressureCross, "South" }, // Same name as non-pressure button - { SDLKeyCodes::PressureCircle, "East" }, // Same name as non-pressure button - { SDLKeyCodes::PressureSquare, "West" }, // Same name as non-pressure button - { SDLKeyCodes::PressureTriangle, "North" }, // Same name as non-pressure button - { SDLKeyCodes::PressureL1, "LB" }, // Same name as non-pressure button - { SDLKeyCodes::PressureR1, "RB" }, // Same name as non-pressure button - { SDLKeyCodes::PressureUp, "Up" }, // Same name as non-pressure button - { SDLKeyCodes::PressureDown, "Down" }, // Same name as non-pressure button - { SDLKeyCodes::PressureLeft, "Left" }, // Same name as non-pressure button - { SDLKeyCodes::PressureRight, "Right" }, // Same name as non-pressure button }; init_configs(); @@ -940,6 +930,34 @@ std::unordered_map sdl_pad_handler::get_button_values(const std::share if (!dev || !dev->sdl.gamepad) return values; + static const std::map button_to_pressure = + { + { SDLKeyCodes::South, SDLKeyCodes::PressureCross }, + { SDLKeyCodes::East, SDLKeyCodes::PressureCircle }, + { SDLKeyCodes::West, SDLKeyCodes::PressureSquare }, + { SDLKeyCodes::North, SDLKeyCodes::PressureTriangle }, + { SDLKeyCodes::LB, SDLKeyCodes::PressureL1 }, + { SDLKeyCodes::RB, SDLKeyCodes::PressureR1 }, + { SDLKeyCodes::Up, SDLKeyCodes::PressureUp }, + { SDLKeyCodes::Down, SDLKeyCodes::PressureDown }, + { SDLKeyCodes::Left, SDLKeyCodes::PressureLeft }, + { SDLKeyCodes::Right, SDLKeyCodes::PressureRight } + }; + + static const std::map pressure_to_button = + { + { SDLKeyCodes::PressureCross, SDLKeyCodes::South }, + { SDLKeyCodes::PressureCircle, SDLKeyCodes::East }, + { SDLKeyCodes::PressureSquare, SDLKeyCodes::West }, + { SDLKeyCodes::PressureTriangle, SDLKeyCodes::North }, + { SDLKeyCodes::PressureL1, SDLKeyCodes::LB }, + { SDLKeyCodes::PressureR1, SDLKeyCodes::RB }, + { SDLKeyCodes::PressureUp, SDLKeyCodes::Up }, + { SDLKeyCodes::PressureDown, SDLKeyCodes::Down }, + { SDLKeyCodes::PressureLeft, SDLKeyCodes::Left }, + { SDLKeyCodes::PressureRight, SDLKeyCodes::Right } + }; + std::set pressed_pressure_buttons; for (SDL_GamepadButton button_id : dev->sdl.button_ids) @@ -964,20 +982,6 @@ std::unordered_map sdl_pad_handler::get_button_values(const std::share case SDLKeyCodes::LB: case SDLKeyCodes::RB: { - static const std::map button_to_pressure = - { - { SDLKeyCodes::South, SDLKeyCodes::PressureCross }, - { SDLKeyCodes::East, SDLKeyCodes::PressureCircle }, - { SDLKeyCodes::West, SDLKeyCodes::PressureSquare }, - { SDLKeyCodes::North, SDLKeyCodes::PressureTriangle }, - { SDLKeyCodes::LB, SDLKeyCodes::PressureL1 }, - { SDLKeyCodes::RB, SDLKeyCodes::PressureR1 }, - { SDLKeyCodes::Up, SDLKeyCodes::PressureUp }, - { SDLKeyCodes::Down, SDLKeyCodes::PressureDown }, - { SDLKeyCodes::Left, SDLKeyCodes::PressureLeft }, - { SDLKeyCodes::Right, SDLKeyCodes::PressureRight } - }; - if (value) { pressed_pressure_buttons.insert(::at32(button_to_pressure, key_code)); @@ -1025,7 +1029,7 @@ std::unordered_map sdl_pad_handler::get_button_values(const std::share if (dev->sdl.is_ds3_with_pressure_buttons) { // Get pressure button value from axis - if (const int key_code = SDLKeyCodes::PressureBegin + 1 + axis_id - SDL_GAMEPAD_AXIS_COUNT; + if (int key_code = SDLKeyCodes::PressureBegin + 1 + axis_id - SDL_GAMEPAD_AXIS_COUNT; key_code > SDLKeyCodes::PressureBegin && key_code < SDLKeyCodes::PressureEnd) { // We need to get the joystick value directly for axis >= SDL_GAMEPAD_AXIS_COUNT @@ -1036,9 +1040,14 @@ std::unordered_map sdl_pad_handler::get_button_values(const std::share value = static_cast(ScaledInput(value, SDL_JOYSTICK_AXIS_MIN, SDL_JOYSTICK_AXIS_MAX, 0.0f, 255.0f)); - if (value <= 0 && pressed_pressure_buttons.contains(static_cast(key_code))) + if (pressed_pressure_buttons.contains(static_cast(key_code))) { - value = 1; + if (value <= 0) + { + value = 1; + } + + key_code = ::at32(pressure_to_button, static_cast(key_code)); } values[key_code] = Clamp0To255(value);