From 584157277fcabcfb165bcbfeef2cf0e2fbad2694 Mon Sep 17 00:00:00 2001 From: GenericHeroGuy Date: Sat, 14 Feb 2026 23:36:01 +0100 Subject: [PATCH] Fix incorrect face button layout on Nintendo controllers --- src/sdl/i_gamepad.c | 1 + src/sdl/i_video.cpp | 19 +++++++++++++++++++ src/sdl/sdlmain.h | 2 ++ 3 files changed, 22 insertions(+) diff --git a/src/sdl/i_gamepad.c b/src/sdl/i_gamepad.c index 1ba66224a..fdc7d604c 100644 --- a/src/sdl/i_gamepad.c +++ b/src/sdl/i_gamepad.c @@ -218,6 +218,7 @@ void I_InitController(UINT8 playernum) SDL_PropertiesID controllerproperties = SDL_GetGamepadProperties(newcontroller); controller->hasrumble = SDL_GetBooleanProperty(controllerproperties, SDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN, false); controller->hasrgbled = SDL_GetBooleanProperty(controllerproperties, SDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN, false); + controller->flipbuttons = SDL_GetGamepadButtonLabel(newcontroller, SDL_GAMEPAD_BUTTON_SOUTH) == SDL_GAMEPAD_BUTTON_LABEL_B; } void I_InitController1(void) diff --git a/src/sdl/i_video.cpp b/src/sdl/i_video.cpp index 19fc258a9..4b8b37448 100644 --- a/src/sdl/i_video.cpp +++ b/src/sdl/i_video.cpp @@ -969,6 +969,25 @@ static void Impl_HandleControllerButtonEvent(SDL_GamepadButtonEvent evt, Uint32 return; } + switch (evt.button) + { + case SDL_GAMEPAD_BUTTON_SOUTH: + case SDL_GAMEPAD_BUTTON_EAST: + case SDL_GAMEPAD_BUTTON_WEST: + case SDL_GAMEPAD_BUTTON_NORTH: + for (INT32 i = 0; i < MAXSPLITSCREENPLAYERS; i++) + { + if (controllerInfo[i].dev != NULL && controllerInfo[i].id == evt.which && controllerInfo[i].flipbuttons) + { + event.data1 ^= 1; // lol + break; + } + } + break; + default: + break; + } + if (event.type != ev_console) { D_PostEvent(&event); diff --git a/src/sdl/sdlmain.h b/src/sdl/sdlmain.h index f5df5e63a..1118e5e46 100644 --- a/src/sdl/sdlmain.h +++ b/src/sdl/sdlmain.h @@ -56,6 +56,8 @@ typedef struct SDLJoyInfo_s boolean hasrumble; // RGB LED Support boolean hasrgbled; + // you can pry my nintendo button layout out of my cold dead hands, SDL3 + boolean flipbuttons; } controllerinfo_t; /** \brief SDL info about controllers