Skip to content

Commit

Permalink
SDLInputSource: Use controller information for icons
Browse files Browse the repository at this point in the history
  • Loading branch information
TheLastRar committed Feb 16, 2025
1 parent 01d7778 commit 2b8f223
Showing 1 changed file with 125 additions and 6 deletions.
131 changes: 125 additions & 6 deletions pcsx2/Input/SDLInputSource.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,28 @@ static constexpr const char* s_sdl_axis_icons[][2] = {
{ICON_PF_LEFT_ANALOG_UP, ICON_PF_LEFT_ANALOG_DOWN}, // SDL_GAMEPAD_AXIS_LEFTY
{ICON_PF_RIGHT_ANALOG_LEFT, ICON_PF_RIGHT_ANALOG_RIGHT}, // SDL_GAMEPAD_AXIS_RIGHTX
{ICON_PF_RIGHT_ANALOG_UP, ICON_PF_RIGHT_ANALOG_DOWN}, // SDL_GAMEPAD_AXIS_RIGHTY
{nullptr, ICON_PF_LEFT_TRIGGER_PULL}, // SDL_GAMEPAD_AXIS_LEFT_TRIGGER
{nullptr, ICON_PF_RIGHT_TRIGGER_PULL}, // SDL_GAMEPAD_AXIS_RIGHT_TRIGGER
};

static constexpr const char* s_sdl_trigger_icons[] = {
ICON_PF_LEFT_TRIGGER_PULL, // SDL_GAMEPAD_AXIS_LEFT_TRIGGER
ICON_PF_RIGHT_TRIGGER_PULL, // SDL_GAMEPAD_AXIS_RIGHT_TRIGGER
};
static constexpr const char* s_sdl_trigger_ps_icons[] = {
ICON_PF_LEFT_TRIGGER_L2, // SDL_GAMEPAD_AXIS_LEFT_TRIGGER
ICON_PF_RIGHT_TRIGGER_R2, // SDL_GAMEPAD_AXIS_RIGHT_TRIGGER
};

static const char* const* s_sdl_trigger_icons_list[] = {
s_sdl_trigger_icons, // SDL_GAMEPAD_TYPE_UNKNOWN
s_sdl_trigger_icons, // SDL_GAMEPAD_TYPE_STANDARD
s_sdl_trigger_icons, // SDL_GAMEPAD_TYPE_XBOX360
s_sdl_trigger_icons, // SDL_GAMEPAD_TYPE_XBOXONE
s_sdl_trigger_ps_icons, // SDL_GAMEPAD_TYPE_PS3
s_sdl_trigger_ps_icons, // SDL_GAMEPAD_TYPE_PS4
s_sdl_trigger_ps_icons, // SDL_GAMEPAD_TYPE_PS5
// Switch
};

static constexpr const GenericInputBinding s_sdl_generic_binding_axis_mapping[][2] = {
{GenericInputBinding::LeftStickLeft, GenericInputBinding::LeftStickRight}, // SDL_GAMEPAD_AXIS_LEFTX
{GenericInputBinding::LeftStickUp, GenericInputBinding::LeftStickDown}, // SDL_GAMEPAD_AXIS_LEFTY
Expand Down Expand Up @@ -68,6 +87,18 @@ static constexpr const char* s_sdl_button_names[] = {
"Paddle4", // SDL_GAMEPAD_BUTTON_LEFT_PADDLE2
"Touchpad", // SDL_GAMEPAD_BUTTON_TOUCHPAD
};

static constexpr const char* s_sdl_face_button_icons[] = {
"", // SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN
ICON_PF_BUTTON_A, // SDL_GAMEPAD_BUTTON_LABEL_A
ICON_PF_BUTTON_B, // SDL_GAMEPAD_BUTTON_LABEL_B
ICON_PF_BUTTON_X, // SDL_GAMEPAD_BUTTON_LABEL_X
ICON_PF_BUTTON_Y, // SDL_GAMEPAD_BUTTON_LABEL_Y
ICON_PF_BUTTON_CROSS, // SDL_GAMEPAD_BUTTON_LABEL_CROSS
ICON_PF_BUTTON_CIRCLE, // SDL_GAMEPAD_BUTTON_LABEL_CIRCLE
ICON_PF_BUTTON_SQUARE, // SDL_GAMEPAD_BUTTON_LABEL_SQUARE
ICON_PF_BUTTON_TRIANGLE, // SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE
};
static constexpr const char* s_sdl_button_icons[] = {
ICON_PF_BUTTON_A, // SDL_GAMEPAD_BUTTON_SOUTH
ICON_PF_BUTTON_B, // SDL_GAMEPAD_BUTTON_EAST
Expand All @@ -85,6 +116,63 @@ static constexpr const char* s_sdl_button_icons[] = {
ICON_PF_XBOX_DPAD_LEFT, // SDL_GAMEPAD_BUTTON_DPAD_LEFT
ICON_PF_XBOX_DPAD_RIGHT, // SDL_GAMEPAD_BUTTON_DPAD_RIGHT
};
static constexpr const char* s_sdl_button_ps3_icons[] = {
ICON_PF_BUTTON_CROSS, // SDL_GAMEPAD_BUTTON_SOUTH
ICON_PF_BUTTON_CIRCLE, // SDL_GAMEPAD_BUTTON_EAST
ICON_PF_BUTTON_SQUARE, // SDL_GAMEPAD_BUTTON_WEST
ICON_PF_BUTTON_TRIANGLE, // SDL_GAMEPAD_BUTTON_NORTH
ICON_PF_SELECT_SHARE, // SDL_GAMEPAD_BUTTON_BACK
ICON_PF_XBOX, // SDL_GAMEPAD_BUTTON_GUIDE
ICON_PF_START, // SDL_GAMEPAD_BUTTON_START
ICON_PF_LEFT_ANALOG_CLICK, // SDL_GAMEPAD_BUTTON_LEFT_STICK
ICON_PF_RIGHT_ANALOG_CLICK, // SDL_GAMEPAD_BUTTON_RIGHT_STICK
ICON_PF_LEFT_SHOULDER_L1, // SDL_GAMEPAD_BUTTON_LEFT_SHOULDER
ICON_PF_RIGHT_SHOULDER_R1, // SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER
ICON_PF_DPAD_UP, // SDL_GAMEPAD_BUTTON_DPAD_UP
ICON_PF_DPAD_DOWN, // SDL_GAMEPAD_BUTTON_DPAD_DOWN
ICON_PF_DPAD_LEFT, // SDL_GAMEPAD_BUTTON_DPAD_LEFT
ICON_PF_DPAD_RIGHT, // SDL_GAMEPAD_BUTTON_DPAD_RIGHT
};
static constexpr const char* s_sdl_button_ps4_icons[] = {
ICON_PF_BUTTON_CROSS, // SDL_GAMEPAD_BUTTON_SOUTH
ICON_PF_BUTTON_CIRCLE, // SDL_GAMEPAD_BUTTON_EAST
ICON_PF_BUTTON_SQUARE, // SDL_GAMEPAD_BUTTON_WEST
ICON_PF_BUTTON_TRIANGLE, // SDL_GAMEPAD_BUTTON_NORTH
ICON_PF_DUALSHOCK_SHARE, // SDL_GAMEPAD_BUTTON_BACK
ICON_PF_PLAYSTATION, // SDL_GAMEPAD_BUTTON_GUIDE
ICON_PF_DUALSHOCK_OPTIONS, // SDL_GAMEPAD_BUTTON_START
ICON_PF_LEFT_ANALOG_CLICK, // SDL_GAMEPAD_BUTTON_LEFT_STICK
ICON_PF_RIGHT_ANALOG_CLICK, // SDL_GAMEPAD_BUTTON_RIGHT_STICK
ICON_PF_LEFT_SHOULDER_L1, // SDL_GAMEPAD_BUTTON_LEFT_SHOULDER
ICON_PF_RIGHT_SHOULDER_R1, // SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER
ICON_PF_DPAD_UP, // SDL_GAMEPAD_BUTTON_DPAD_UP
ICON_PF_DPAD_DOWN, // SDL_GAMEPAD_BUTTON_DPAD_DOWN
ICON_PF_DPAD_LEFT, // SDL_GAMEPAD_BUTTON_DPAD_LEFT
ICON_PF_DPAD_RIGHT, // SDL_GAMEPAD_BUTTON_DPAD_RIGHT
};

static constexpr const char* const* s_sdl_button_icons_list[] = {
s_sdl_button_icons, // SDL_GAMEPAD_TYPE_UNKNOWN
s_sdl_button_icons, // SDL_GAMEPAD_TYPE_STANDARD
s_sdl_button_icons, // SDL_GAMEPAD_TYPE_XBOX360
s_sdl_button_icons, // SDL_GAMEPAD_TYPE_XBOXONE
s_sdl_button_ps3_icons, // SDL_GAMEPAD_TYPE_PS3
s_sdl_button_ps4_icons, // SDL_GAMEPAD_TYPE_PS4
s_sdl_button_ps4_icons, // SDL_GAMEPAD_TYPE_PS5
// Switch
};
static constexpr size_t s_sdl_button_iconsize_list[] = {
std::size(s_sdl_button_icons), // SDL_GAMEPAD_TYPE_UNKNOWN
std::size(s_sdl_button_icons), // SDL_GAMEPAD_TYPE_STANDARD
std::size(s_sdl_button_icons), // SDL_GAMEPAD_TYPE_XBOX360
std::size(s_sdl_button_icons), // SDL_GAMEPAD_TYPE_XBOXONE
std::size(s_sdl_button_icons), // SDL_GAMEPAD_TYPE_XBOXONE
std::size(s_sdl_button_ps3_icons), // SDL_GAMEPAD_TYPE_PS3
std::size(s_sdl_button_ps3_icons), // SDL_GAMEPAD_TYPE_PS4
std::size(s_sdl_button_ps3_icons), // SDL_GAMEPAD_TYPE_PS5
// Switch
};

static constexpr const GenericInputBinding s_sdl_generic_binding_button_mapping[] = {
GenericInputBinding::Cross, // SDL_GAMEPAD_BUTTON_SOUTH
GenericInputBinding::Circle, // SDL_GAMEPAD_BUTTON_EAST
Expand Down Expand Up @@ -543,17 +631,48 @@ TinyString SDLInputSource::ConvertKeyToIcon(InputBindingKey key)

if (key.source_type == InputSourceType::SDL)
{
SDL_GamepadType type = SDL_GAMEPAD_TYPE_UNKNOWN;
auto it = GetControllerDataForPlayerId(key.source_index);
if (it != m_controllers.end())
type = SDL_GetRealGamepadType(it->gamepad);

if (key.source_subtype == InputSubclass::ControllerAxis)
{
if (key.data < std::size(s_sdl_axis_icons) && key.modifier != InputModifier::FullAxis)
if (key.modifier != InputModifier::FullAxis)
{
ret.format("SDL-{} {}", static_cast<u32>(key.source_index),
s_sdl_axis_icons[key.data][key.modifier == InputModifier::None]);
if (key.data < std::size(s_sdl_axis_icons))
{
ret.format("SDL-{} {}", static_cast<u32>(key.source_index),
s_sdl_axis_icons[key.data][key.modifier == InputModifier::None]);
}
else if (key.data - std::size(s_sdl_axis_icons) < std::size(s_sdl_trigger_icons))
{
const u32 trigger_index = key.data - std::size(s_sdl_axis_icons);

if (type < std::size(s_sdl_button_icons_list))
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_trigger_icons_list[type][trigger_index]);
else
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_trigger_icons[trigger_index]);
}
}
}
else if (key.source_subtype == InputSubclass::ControllerButton)
{
if (key.data < std::size(s_sdl_button_icons))
if (type > SDL_GAMEPAD_TYPE_STANDARD && type < std::size(s_sdl_button_icons_list))
{
if (key.data < s_sdl_button_iconsize_list[type])
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_button_icons_list[type][key.data]);
}
else if (key.data < 4)
{
const SDL_GamepadButtonLabel label = SDL_GetGamepadButtonLabel(it->gamepad, static_cast<SDL_GamepadButton>(key.data));

if (label > SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN && label < std::size(s_sdl_face_button_icons))
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_face_button_icons[label]);
else
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_button_icons[key.data]);
}
else if (key.data < std::size(s_sdl_button_icons))
ret.format("SDL-{} {}", static_cast<u32>(key.source_index), s_sdl_button_icons[key.data]);
}
}
Expand Down

0 comments on commit 2b8f223

Please sign in to comment.