From 5578edf9e49e358183578933249a8e6f3aded739 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Wed, 18 Mar 2026 09:09:18 +0100 Subject: [PATCH] Input: Map PS button to start+select by default --- rpcs3/Emu/Io/pad_config.cpp | 21 ++++++++++++ rpcs3/Emu/Io/pad_config.h | 1 + rpcs3/Input/ds3_pad_handler.cpp | 44 +++++++++++++------------- rpcs3/Input/ds4_pad_handler.cpp | 2 +- rpcs3/Input/dualsense_pad_handler.cpp | 2 +- rpcs3/Input/evdev_joystick_handler.cpp | 2 +- rpcs3/Input/ps_move_handler.cpp | 2 +- rpcs3/Input/sdl_pad_handler.cpp | 2 +- rpcs3/Input/skateboard_pad_handler.cpp | 2 +- rpcs3/Input/xinput_pad_handler.cpp | 2 +- 10 files changed, 51 insertions(+), 29 deletions(-) diff --git a/rpcs3/Emu/Io/pad_config.cpp b/rpcs3/Emu/Io/pad_config.cpp index 5b89ca709d..68c1f9fabf 100644 --- a/rpcs3/Emu/Io/pad_config.cpp +++ b/rpcs3/Emu/Io/pad_config.cpp @@ -83,6 +83,27 @@ std::string cfg_pad::get_button_string(std::vector& combos) return fmt::merge(combo_strings, ","); } +std::string cfg_pad::make_button_string(const std::unordered_map& button_list, const std::vector>& button_combos) +{ + std::vector combos; + + for (const std::set& button_combo : button_combos) + { + if (button_combo.empty()) continue; + + pad::combo combo {}; + + for (u32 button : button_combo) + { + combo.add_button(::at32(button_list, button)); + } + + combos.push_back(std::move(combo)); + } + + return get_button_string(combos); +} + u8 cfg_pad::get_motor_speed(VibrateMotor& motor, f32 multiplier) const { // If motor is small, use either 0 or 255. diff --git a/rpcs3/Emu/Io/pad_config.h b/rpcs3/Emu/Io/pad_config.h index 24fe3e50b4..2d789805e2 100644 --- a/rpcs3/Emu/Io/pad_config.h +++ b/rpcs3/Emu/Io/pad_config.h @@ -59,6 +59,7 @@ struct cfg_pad final : cfg::node static std::vector get_combos(std::string_view button_string); static std::string get_button_string(std::vector& combos); + static std::string make_button_string(const std::unordered_map& button_list, const std::vector>& button_combos); u8 get_motor_speed(VibrateMotor& motor, f32 multiplier) const; u8 get_large_motor_speed(std::array& motors) const; diff --git a/rpcs3/Input/ds3_pad_handler.cpp b/rpcs3/Input/ds3_pad_handler.cpp index 77c924e60e..d809cd9d86 100644 --- a/rpcs3/Input/ds3_pad_handler.cpp +++ b/rpcs3/Input/ds3_pad_handler.cpp @@ -170,31 +170,31 @@ void ds3_pad_handler::init_config(cfg_pad* cfg) if (!cfg) return; // Set default button mapping - cfg->ls_left.def = ::at32(button_list, DS3KeyCodes::LSXNeg); - cfg->ls_down.def = ::at32(button_list, DS3KeyCodes::LSYNeg); + cfg->ls_left.def = ::at32(button_list, DS3KeyCodes::LSXNeg); + cfg->ls_down.def = ::at32(button_list, DS3KeyCodes::LSYNeg); cfg->ls_right.def = ::at32(button_list, DS3KeyCodes::LSXPos); - cfg->ls_up.def = ::at32(button_list, DS3KeyCodes::LSYPos); - cfg->rs_left.def = ::at32(button_list, DS3KeyCodes::RSXNeg); - cfg->rs_down.def = ::at32(button_list, DS3KeyCodes::RSYNeg); + cfg->ls_up.def = ::at32(button_list, DS3KeyCodes::LSYPos); + cfg->rs_left.def = ::at32(button_list, DS3KeyCodes::RSXNeg); + cfg->rs_down.def = ::at32(button_list, DS3KeyCodes::RSYNeg); cfg->rs_right.def = ::at32(button_list, DS3KeyCodes::RSXPos); - cfg->rs_up.def = ::at32(button_list, DS3KeyCodes::RSYPos); - cfg->start.def = ::at32(button_list, DS3KeyCodes::Start); - cfg->select.def = ::at32(button_list, DS3KeyCodes::Select); - cfg->ps.def = ::at32(button_list, DS3KeyCodes::PSButton); - cfg->square.def = ::at32(button_list, DS3KeyCodes::Square); - cfg->cross.def = ::at32(button_list, DS3KeyCodes::Cross); - cfg->circle.def = ::at32(button_list, DS3KeyCodes::Circle); + cfg->rs_up.def = ::at32(button_list, DS3KeyCodes::RSYPos); + cfg->start.def = ::at32(button_list, DS3KeyCodes::Start); + cfg->select.def = ::at32(button_list, DS3KeyCodes::Select); + cfg->ps.def = cfg_pad::make_button_string(button_list, {{DS3KeyCodes::PSButton}, {DS3KeyCodes::Start, DS3KeyCodes::Select}}); + cfg->square.def = ::at32(button_list, DS3KeyCodes::Square); + cfg->cross.def = ::at32(button_list, DS3KeyCodes::Cross); + cfg->circle.def = ::at32(button_list, DS3KeyCodes::Circle); cfg->triangle.def = ::at32(button_list, DS3KeyCodes::Triangle); - cfg->left.def = ::at32(button_list, DS3KeyCodes::Left); - cfg->down.def = ::at32(button_list, DS3KeyCodes::Down); - cfg->right.def = ::at32(button_list, DS3KeyCodes::Right); - cfg->up.def = ::at32(button_list, DS3KeyCodes::Up); - cfg->r1.def = ::at32(button_list, DS3KeyCodes::R1); - cfg->r2.def = ::at32(button_list, DS3KeyCodes::R2); - cfg->r3.def = ::at32(button_list, DS3KeyCodes::R3); - cfg->l1.def = ::at32(button_list, DS3KeyCodes::L1); - cfg->l2.def = ::at32(button_list, DS3KeyCodes::L2); - cfg->l3.def = ::at32(button_list, DS3KeyCodes::L3); + cfg->left.def = ::at32(button_list, DS3KeyCodes::Left); + cfg->down.def = ::at32(button_list, DS3KeyCodes::Down); + cfg->right.def = ::at32(button_list, DS3KeyCodes::Right); + cfg->up.def = ::at32(button_list, DS3KeyCodes::Up); + cfg->r1.def = ::at32(button_list, DS3KeyCodes::R1); + cfg->r2.def = ::at32(button_list, DS3KeyCodes::R2); + cfg->r3.def = ::at32(button_list, DS3KeyCodes::R3); + cfg->l1.def = ::at32(button_list, DS3KeyCodes::L1); + cfg->l2.def = ::at32(button_list, DS3KeyCodes::L2); + cfg->l3.def = ::at32(button_list, DS3KeyCodes::L3); cfg->pressure_intensity_button.def = ::at32(button_list, DS3KeyCodes::None); cfg->analog_limiter_button.def = ::at32(button_list, DS3KeyCodes::None); diff --git a/rpcs3/Input/ds4_pad_handler.cpp b/rpcs3/Input/ds4_pad_handler.cpp index 962dd65969..706c14ae7f 100644 --- a/rpcs3/Input/ds4_pad_handler.cpp +++ b/rpcs3/Input/ds4_pad_handler.cpp @@ -162,7 +162,7 @@ void ds4_pad_handler::init_config(cfg_pad* cfg) cfg->rs_up.def = ::at32(button_list, DS4KeyCodes::RSYPos); cfg->start.def = ::at32(button_list, DS4KeyCodes::Options); cfg->select.def = ::at32(button_list, DS4KeyCodes::Share); - cfg->ps.def = ::at32(button_list, DS4KeyCodes::PSButton); + cfg->ps.def = cfg_pad::make_button_string(button_list, {{DS4KeyCodes::PSButton}, {DS4KeyCodes::Options, DS4KeyCodes::Share}}); cfg->square.def = ::at32(button_list, DS4KeyCodes::Square); cfg->cross.def = ::at32(button_list, DS4KeyCodes::Cross); cfg->circle.def = ::at32(button_list, DS4KeyCodes::Circle); diff --git a/rpcs3/Input/dualsense_pad_handler.cpp b/rpcs3/Input/dualsense_pad_handler.cpp index 4058eb97d1..3936d0c5a7 100644 --- a/rpcs3/Input/dualsense_pad_handler.cpp +++ b/rpcs3/Input/dualsense_pad_handler.cpp @@ -235,7 +235,7 @@ void dualsense_pad_handler::init_config(cfg_pad* cfg) cfg->rs_up.def = ::at32(button_list, DualSenseKeyCodes::RSYPos); cfg->start.def = ::at32(button_list, DualSenseKeyCodes::Options); cfg->select.def = ::at32(button_list, DualSenseKeyCodes::Share); - cfg->ps.def = ::at32(button_list, DualSenseKeyCodes::PSButton); + cfg->ps.def = cfg_pad::make_button_string(button_list, {{DualSenseKeyCodes::PSButton}, {DualSenseKeyCodes::Options, DualSenseKeyCodes::Share}}); cfg->square.def = ::at32(button_list, DualSenseKeyCodes::Square); cfg->cross.def = ::at32(button_list, DualSenseKeyCodes::Cross); cfg->circle.def = ::at32(button_list, DualSenseKeyCodes::Circle); diff --git a/rpcs3/Input/evdev_joystick_handler.cpp b/rpcs3/Input/evdev_joystick_handler.cpp index 104d8d8c41..a8a957502a 100644 --- a/rpcs3/Input/evdev_joystick_handler.cpp +++ b/rpcs3/Input/evdev_joystick_handler.cpp @@ -88,7 +88,7 @@ void evdev_joystick_handler::init_config(cfg_pad* cfg) cfg->rs_up.def = ::at32(rev_axis_list, ABS_RY); cfg->start.def = ::at32(button_list, BTN_START); cfg->select.def = ::at32(button_list, BTN_SELECT); - cfg->ps.def = ::at32(button_list, BTN_MODE); + cfg->ps.def = cfg_pad::make_button_string(button_list, {{BTN_MODE}, {BTN_START, BTN_SELECT}}); cfg->square.def = ::at32(button_list, BTN_X); cfg->cross.def = ::at32(button_list, BTN_A); cfg->circle.def = ::at32(button_list, BTN_B); diff --git a/rpcs3/Input/ps_move_handler.cpp b/rpcs3/Input/ps_move_handler.cpp index fa3e5d542a..cf11479fc4 100644 --- a/rpcs3/Input/ps_move_handler.cpp +++ b/rpcs3/Input/ps_move_handler.cpp @@ -152,7 +152,7 @@ void ps_move_handler::init_config(cfg_pad* cfg) cfg->rs_up.def = ::at32(button_list, ps_move_key_codes::none); cfg->start.def = ::at32(button_list, ps_move_key_codes::start); cfg->select.def = ::at32(button_list, ps_move_key_codes::select); - cfg->ps.def = ::at32(button_list, ps_move_key_codes::ps); + cfg->ps.def = cfg_pad::make_button_string(button_list, {{ps_move_key_codes::ps}, {ps_move_key_codes::start, ps_move_key_codes::select}}); cfg->square.def = ::at32(button_list, ps_move_key_codes::square); cfg->cross.def = ::at32(button_list, ps_move_key_codes::cross); cfg->circle.def = ::at32(button_list, ps_move_key_codes::circle); diff --git a/rpcs3/Input/sdl_pad_handler.cpp b/rpcs3/Input/sdl_pad_handler.cpp index 9fd6c79dd5..099de9000e 100644 --- a/rpcs3/Input/sdl_pad_handler.cpp +++ b/rpcs3/Input/sdl_pad_handler.cpp @@ -121,7 +121,7 @@ void sdl_pad_handler::init_config(cfg_pad* cfg) cfg->rs_up.def = ::at32(button_list, SDLKeyCodes::RSYPos); cfg->start.def = ::at32(button_list, SDLKeyCodes::Start); cfg->select.def = ::at32(button_list, SDLKeyCodes::Back); - cfg->ps.def = ::at32(button_list, SDLKeyCodes::Guide); + cfg->ps.def = cfg_pad::make_button_string(button_list, {{SDLKeyCodes::Guide}, {SDLKeyCodes::Start, SDLKeyCodes::Back}}); cfg->square.def = ::at32(button_list, SDLKeyCodes::West); cfg->cross.def = ::at32(button_list, SDLKeyCodes::South); cfg->circle.def = ::at32(button_list, SDLKeyCodes::East); diff --git a/rpcs3/Input/skateboard_pad_handler.cpp b/rpcs3/Input/skateboard_pad_handler.cpp index 614d3e5976..732a22808a 100644 --- a/rpcs3/Input/skateboard_pad_handler.cpp +++ b/rpcs3/Input/skateboard_pad_handler.cpp @@ -112,7 +112,7 @@ void skateboard_pad_handler::init_config(cfg_pad* cfg) cfg->rs_up.def = ::at32(button_list, skateboard_key_codes::none); cfg->start.def = ::at32(button_list, skateboard_key_codes::start); cfg->select.def = ::at32(button_list, skateboard_key_codes::select); - cfg->ps.def = ::at32(button_list, skateboard_key_codes::ps); + cfg->ps.def = cfg_pad::make_button_string(button_list, {{skateboard_key_codes::ps}, {skateboard_key_codes::start, skateboard_key_codes::select}}); cfg->square.def = ::at32(button_list, skateboard_key_codes::square); cfg->cross.def = ::at32(button_list, skateboard_key_codes::cross); cfg->circle.def = ::at32(button_list, skateboard_key_codes::circle); diff --git a/rpcs3/Input/xinput_pad_handler.cpp b/rpcs3/Input/xinput_pad_handler.cpp index f7cfd9eb92..349d36c722 100644 --- a/rpcs3/Input/xinput_pad_handler.cpp +++ b/rpcs3/Input/xinput_pad_handler.cpp @@ -101,7 +101,7 @@ void xinput_pad_handler::init_config(cfg_pad* cfg) cfg->rs_up.def = ::at32(button_list, XInputKeyCodes::RSYPos); cfg->start.def = ::at32(button_list, XInputKeyCodes::Start); cfg->select.def = ::at32(button_list, XInputKeyCodes::Back); - cfg->ps.def = ::at32(button_list, XInputKeyCodes::Guide); + cfg->ps.def = cfg_pad::make_button_string(button_list, {{XInputKeyCodes::Guide}, {XInputKeyCodes::Start, XInputKeyCodes::Back}}); cfg->square.def = ::at32(button_list, XInputKeyCodes::X); cfg->cross.def = ::at32(button_list, XInputKeyCodes::A); cfg->circle.def = ::at32(button_list, XInputKeyCodes::B);