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__ */

Reply via email to