diff --git a/src/joystick/SDL_gamepad.c b/src/joystick/SDL_gamepad.c index f8774c54bd..03b3faec55 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); } }