ping - any takers who would import this? It's a brief and easy update and makes
SDL2 gamepad use much more enjoyable.
On Sun, Jan 21, 2018 at 04:13:29PM -0800, Thomas Frohwein wrote:
> 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__ */
>