Hi, The way that SDL2's gamecontroller API was enabled with the 2.0.7 upgrade hardcoded one controller mapping at compile time (which was an upgrade from not being able to use it all in FNA games, reportedly also PPSSPP before that).
SDL2 *should* however be able to map the controller layout at runtime based on 1) the SDL_GAMECONTROLLERCONFIG environment variable, and 2) files with controller layout specifications, in several applications called gamecontrollerdb.txt. The below diff adds the ability to assign controller mapping at runtime via the SDL_GAMECONTROLLERCONFIG env variable. It is a workaround because it is not clear yet where the upstream SDL2 code fails to achieve this. Reading mapping from file is not (yet) possible. The diff only changes a handful of lines (see below). I tested it completely remapping a Logitech Dual Action gamepad, including D-pad. The first 2 parts of the string (guid and device name) don't have any functional impact at this point when passed via the SDL_GAMECONTROLLERCONFIG. My suggested approach at the moment is using the port sdl-jstest to display the mapping string with 'sdl2-jstest -l', adjusting the buttons, axes, and dpad from there and pass it into the SDL_GAMECONTROLLERCONfIG environment variable. Empty SDL_GAMECONTROLLERCONFIG keeps default mappings. An invalid mapping string seems to disable the gamepad in the application based on my testing. Thanks. Index: Makefile =================================================================== RCS file: /cvs/ports/devel/sdl2/Makefile,v retrieving revision 1.20 diff -u -p -r1.20 Makefile --- Makefile 12 Jan 2018 19:32:54 -0000 1.20 +++ Makefile 21 Jan 2018 23:40:12 -0000 @@ -9,7 +9,7 @@ DISTNAME= SDL2-${V} PKGNAME= sdl2-${V} CATEGORIES= devel MASTER_SITES= https://www.libsdl.org/release/ -REVISION= 0 +REVISION= 1 SHARED_LIBS= SDL2 0.4 # 0.7 Index: patches/patch-src_joystick_SDL_gamecontroller_c =================================================================== RCS file: /cvs/ports/devel/sdl2/patches/patch-src_joystick_SDL_gamecontroller_c,v retrieving revision 1.1 diff -u -p -r1.1 patch-src_joystick_SDL_gamecontroller_c --- patches/patch-src_joystick_SDL_gamecontroller_c 7 Jan 2018 22:56:46 -0000 1.1 +++ patches/patch-src_joystick_SDL_gamecontroller_c 21 Jan 2018 23:40:12 -0000 @@ -5,11 +5,12 @@ also disable checking string "Xbox 360 W everything will be Xbox360 controller (works with generic joysticks) - note: the actual Xbox360 controller has buttons and axes messed up on openbsd with these mappings +map to SDL_GAMECONTROLLERCONFIG envvar if available Index: src/joystick/SDL_gamecontroller.c --- src/joystick/SDL_gamecontroller.c.orig +++ src/joystick/SDL_gamecontroller.c -@@ -884,15 +884,15 @@ static ControllerMapping_t *SDL_PrivateGetControllerMa +@@ -884,15 +884,21 @@ static ControllerMapping_t *SDL_PrivateGetControllerMa #else (void) s_pEmscriptenMapping; /* pacify ARMCC */ #endif @@ -20,10 +21,17 @@ Index: src/joystick/SDL_gamecontroller.c + //if (SDL_strstr(name, "Xbox 360 Wireless Receiver")) { /* The Linux driver xpad.c maps the wireless dpad to buttons */ SDL_bool existing; - mapping = SDL_PrivateAddMappingForGUID(guid, +- mapping = SDL_PrivateAddMappingForGUID(guid, ++ char guid_str[1024]; ++ SDL_JoystickGetGUIDString(guid, guid_str, sizeof(guid_str)); ++ if (SDL_GetHint(SDL_HINT_GAMECONTROLLERCONFIG) == NULL) { ++ mapping = SDL_PrivateAddMappingForGUID(guid, "none,X360 Wireless Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,", &existing, SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT); - } ++ } else { ++ mapping = SDL_PrivateAddMappingForGUID(guid, SDL_GetHint(SDL_HINT_GAMECONTROLLERCONFIG), &existing, SDL_CONTROLLER_MAPPING_PRIORITY_DEFAULT); ++ } + //} } #endif /* __LINUX__ */