From c68254927f75326a3f8644edfe51f3bdfb31e579 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Mon, 17 Nov 2025 09:28:06 -0800
Subject: [PATCH] Fixed the SI GameCube dual stage trigger button mapping
Also moved the second touchpad button to the end of the misc buttons
---
src/joystick/SDL_gamepad.c | 66 +++++++++++---------------------------
1 file changed, 18 insertions(+), 48 deletions(-)
diff --git a/src/joystick/SDL_gamepad.c b/src/joystick/SDL_gamepad.c
index f8774c54bd6c7..03b3faec555b4 100644
--- a/src/joystick/SDL_gamepad.c
+++ b/src/joystick/SDL_gamepad.c
@@ -806,12 +806,14 @@ static inline void SDL_SInputStylesMapExtraction(SDL_SInputStyles_t* styles, cha
int current_button = 0;
int current_axis = 0;
int misc_buttons = 0;
+ int misc_button, misc_end;
bool digital_triggers = false;
bool dualstage_triggers = false;
int bumpers = 0;
bool left_stick = false;
bool right_stick = false;
int paddle_pairs = 0;
+ char misc_label[32];
// Determine how many misc buttons are used
switch (styles->misc_style) {
@@ -834,6 +836,9 @@ static inline void SDL_SInputStylesMapExtraction(SDL_SInputStyles_t* styles, cha
default:
break;
}
+ // The share button is reserved as misc1, additional buttons start at misc2
+ misc_button = 2;
+ misc_end = misc_button + misc_buttons;
// Analog joysticks (always come first in axis mapping)
switch (styles->analog_style) {
@@ -945,29 +950,14 @@ static inline void SDL_SInputStylesMapExtraction(SDL_SInputStyles_t* styles, cha
SDL_ADD_BUTTON_MAPPING("righttrigger", current_button++, mapping_string_len);
} else if (dualstage_triggers) {
// Dual-stage trigger buttons are appended as MISC buttons
- // but only if we have the space to use them.
- if (misc_buttons <= 2) {
- switch (misc_buttons) {
- case 0:
- SDL_ADD_BUTTON_MAPPING("misc3", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc4", current_button++, mapping_string_len);
- break;
-
- case 1:
- SDL_ADD_BUTTON_MAPPING("misc4", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc5", current_button++, mapping_string_len);
- break;
-
- case 2:
- SDL_ADD_BUTTON_MAPPING("misc5", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc6", current_button++, mapping_string_len);
- break;
-
- default:
- // We do not overwrite other misc buttons if they are used.
- break;
- }
+ // By convention the trigger buttons are misc3 and misc4 for GameCube style controllers
+ if (misc_end < 3) {
+ misc_end = 3;
}
+ SDL_snprintf(misc_label, sizeof(misc_label), "misc%d", misc_end++);
+ SDL_ADD_BUTTON_MAPPING(misc_label, current_button++, mapping_string_len);
+ SDL_snprintf(misc_label, sizeof(misc_label), "misc%d", misc_end++);
+ SDL_ADD_BUTTON_MAPPING(misc_label, current_button++, mapping_string_len);
}
// Paddle 1/2
@@ -1016,38 +1006,18 @@ static inline void SDL_SInputStylesMapExtraction(SDL_SInputStyles_t* styles, cha
case SINPUT_TOUCHSTYLE_DOUBLE:
SDL_ADD_BUTTON_MAPPING("touchpad", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc2", current_button++, mapping_string_len);
+ // Add the second touchpad button at the end of the misc buttons
+ SDL_snprintf(misc_label, sizeof(misc_label), "misc%d", misc_end++);
+ SDL_ADD_BUTTON_MAPPING(misc_label, current_button++, mapping_string_len);
break;
default:
break;
}
- switch (misc_buttons) {
- case 1:
- SDL_ADD_BUTTON_MAPPING("misc3", current_button++, mapping_string_len);
- break;
-
- case 2:
- SDL_ADD_BUTTON_MAPPING("misc3", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc4", current_button++, mapping_string_len);
- break;
-
- case 3:
- SDL_ADD_BUTTON_MAPPING("misc3", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc4", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc5", current_button++, mapping_string_len);
- break;
-
- case 4:
- SDL_ADD_BUTTON_MAPPING("misc3", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc4", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc5", current_button++, mapping_string_len);
- SDL_ADD_BUTTON_MAPPING("misc6", current_button++, mapping_string_len);
- break;
-
- default:
- break;
+ for (int i = 0; i < misc_buttons; ++i) {
+ SDL_snprintf(misc_label, sizeof(misc_label), "misc%d", misc_button++);
+ SDL_ADD_BUTTON_MAPPING(misc_label, current_button++, mapping_string_len);
}
}