Hi, Please find attached update to sdl2-2.0.9 with a fix for the missing XBox 360 gamepad/XInput D-pad functionality. I kept it together because the diff isn't overly long or complicated, but if preferred I'd be happy to split it into 2 separate diffs.
1. The update to 2.0.9 is trivial. Some new additions to API for sensors and joystick/gamecontroller. I tested launching and brief application use/gameplay with the following SDL2 ports without any issues: - milkytracker - citra - dolphin - mednafen - mgba - fnaify (multiple FNA games) - 0ad - barony - endless-sky - lugaru - megaglest - scummvm - sdl-jstest Per release notes and from looking at the lib with nm, only additions to API, therefore bumping only minor. Official release notes here: https://discourse.libsdl.org/t/sdl-2-0-9-released/25228 The local diffs to SDL_x11sym.h and SDL_x11keyboard.c have been merged upstream and are therefore removed. 2. The D-pad of the Xbox 360 controller and its family of generally compatible controllers doesn't hasn't worked with SDL applications so far. I dug into the SDL2 backend code and found that with legacy (DInput) controllers, the D-pad works because SDL2 recognizes the usage as a hat switch and reads the numerical value that represents the position of the hat switch. The Xbox 360 controller on the other hand contains for individual D-pad button usages in its report descriptor that are not picked up by SDL2. This diff adds recognition of a D-pad (as a hat) to the backend. The individual D-pad button presses are converted into SDL's internal representation of the hat position with dpad_to_sdl(). Tested and works with sdl2-jstest (from sdl-jstest package) and several FNA games (Owlboy, Rogue Legacy), both with my Xbox 360 controller and the Logitech F310 in XInput mode. The D-pad diff has been sent to upstream: https://bugzilla.libsdl.org/show_bug.cgi?id=4436 The Xbox 360 controller and Logitech F310 (XInput mode) button layout and axis directions can be set to the standard layout on other platforms with the following env var: $ export SDL_GAMECONTROLLERCONFIG="none,X360,a:b7,b:b8,back:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b2,lefttrigger:a2,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b3,righttrigger:a5,rightx:a3,righty:a4~,start:b0,x:b9,y:b10," ok? Index: Makefile =================================================================== RCS file: /cvs/ports/devel/sdl2/Makefile,v retrieving revision 1.23 diff -u -p -r1.23 Makefile --- Makefile 29 Oct 2018 05:39:49 -0000 1.23 +++ Makefile 28 Dec 2018 17:38:53 -0000 @@ -4,14 +4,13 @@ COMMENT= cross-platform multimedia libra BROKEN-hppa= src/atomic/SDL_spinlock.c:101:2: error: \ #error Please implement for your platform. -V= 2.0.8 +V= 2.0.9 DISTNAME= SDL2-${V} PKGNAME= sdl2-${V} CATEGORIES= devel MASTER_SITES= https://www.libsdl.org/release/ -REVISION= 1 -SHARED_LIBS= SDL2 0.5 # 0.8 +SHARED_LIBS= SDL2 0.6 # 0.9 HOMEPAGE= https://www.libsdl.org/ Index: distinfo =================================================================== RCS file: /cvs/ports/devel/sdl2/distinfo,v retrieving revision 1.7 diff -u -p -r1.7 distinfo --- distinfo 11 Mar 2018 22:40:20 -0000 1.7 +++ distinfo 28 Dec 2018 17:38:53 -0000 @@ -1,2 +1,2 @@ -SHA256 (SDL2-2.0.8.tar.gz) = 7cd8VzCGYdV26EM0TYY44CWngYv/c/j7+rCcPF/Qkuw= -SIZE (SDL2-2.0.8.tar.gz) = 4909017 +SHA256 (SDL2-2.0.9.tar.gz) = JVGG3GduzQwdvxDsiizF1oabUHnYo4GUwq7N/1SzJLE= +SIZE (SDL2-2.0.9.tar.gz) = 5246942 Index: patches/patch-Makefile_in =================================================================== RCS file: /cvs/ports/devel/sdl2/patches/patch-Makefile_in,v retrieving revision 1.5 diff -u -p -r1.5 patch-Makefile_in --- patches/patch-Makefile_in 11 Mar 2018 22:40:20 -0000 1.5 +++ patches/patch-Makefile_in 28 Dec 2018 17:38:53 -0000 @@ -3,7 +3,7 @@ $OpenBSD: patch-Makefile_in,v 1.5 2018/0 Index: Makefile.in --- Makefile.in.orig +++ Makefile.in -@@ -122,7 +122,7 @@ LT_AGE = @LT_AGE@ +@@ -123,7 +123,7 @@ LT_AGE = @LT_AGE@ LT_CURRENT = @LT_CURRENT@ LT_RELEASE = @LT_RELEASE@ LT_REVISION = @LT_REVISION@ Index: patches/patch-src_SDL_c =================================================================== RCS file: /cvs/ports/devel/sdl2/patches/patch-src_SDL_c,v retrieving revision 1.1 diff -u -p -r1.1 patch-src_SDL_c --- patches/patch-src_SDL_c 7 Jan 2018 22:56:46 -0000 1.1 +++ patches/patch-src_SDL_c 28 Dec 2018 17:38:53 -0000 @@ -7,7 +7,7 @@ until OpenBSD support has been rolled ou Index: src/SDL.c --- src/SDL.c.orig +++ src/SDL.c -@@ -227,8 +227,6 @@ SDL_InitSubSystem(Uint32 flags) +@@ -228,8 +228,6 @@ SDL_InitSubSystem(Uint32 flags) } } SDL_PrivateSubsystemRefCountIncr(SDL_INIT_HAPTIC); @@ -16,7 +16,7 @@ Index: src/SDL.c #endif } -@@ -425,7 +423,7 @@ SDL_GetPlatform() +@@ -449,7 +447,7 @@ SDL_GetPlatform() #elif __NETBSD__ return "NetBSD"; #elif __OPENBSD__ 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.2 diff -u -p -r1.2 patch-src_joystick_SDL_gamecontroller_c --- patches/patch-src_joystick_SDL_gamecontroller_c 11 Mar 2018 22:40:20 -0000 1.2 +++ patches/patch-src_joystick_SDL_gamecontroller_c 28 Dec 2018 17:38:53 -0000 @@ -9,10 +9,10 @@ map to SDL_GAMECONTROLLERCONFIG envvar i Index: src/joystick/SDL_gamecontroller.c --- src/joystick/SDL_gamecontroller.c.orig +++ src/joystick/SDL_gamecontroller.c -@@ -884,15 +884,21 @@ static ControllerMapping_t *SDL_PrivateGetControllerMa - #else - (void) s_pEmscriptenMapping; /* pacify ARMCC */ - #endif +@@ -1008,17 +1008,23 @@ static ControllerMapping_t *SDL_PrivateGetControllerMa + ControllerMapping_t *mapping; + + mapping = SDL_PrivateGetControllerMappingForGUID(&guid, SDL_FALSE); -#ifdef __LINUX__ +#if defined(__LINUX__) || defined(__OpenBSD__) if (!mapping && name) { @@ -33,5 +33,8 @@ Index: src/joystick/SDL_gamecontroller.c + } + //} } - #endif /* __LINUX__ */ +-#endif /* __LINUX__ */ ++#endif /* __LINUX__ || __OpenBSD__ */ + if (!mapping && name) { + if (SDL_strstr(name, "Xbox") || SDL_strstr(name, "X-Box") || SDL_strstr(name, "XBOX")) { Index: patches/patch-src_joystick_bsd_SDL_sysjoystick_c =================================================================== RCS file: patches/patch-src_joystick_bsd_SDL_sysjoystick_c diff -N patches/patch-src_joystick_bsd_SDL_sysjoystick_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-src_joystick_bsd_SDL_sysjoystick_c 28 Dec 2018 17:38:53 -0000 @@ -0,0 +1,109 @@ +$OpenBSD$ + +detect D-Pad as hat and turn D-pad input into equivalent hat position +This improves compatibility with Xbox 360 controller and XInput devices + +Index: src/joystick/bsd/SDL_sysjoystick.c +--- src/joystick/bsd/SDL_sysjoystick.c.orig ++++ src/joystick/bsd/SDL_sysjoystick.c +@@ -80,7 +80,50 @@ + #define MAX_JOY_JOYS 2 + #define MAX_JOYS (MAX_UHID_JOYS + MAX_JOY_JOYS) + ++#ifdef __OpenBSD__ + ++#define HUG_DPAD_UP 0x90 ++#define HUG_DPAD_DOWN 0x91 ++#define HUG_DPAD_RIGHT 0x92 ++#define HUG_DPAD_LEFT 0x93 ++ ++#define HAT_CENTERED 0x00 ++#define HAT_UP 0x01 ++#define HAT_RIGHT 0x02 ++#define HAT_DOWN 0x04 ++#define HAT_LEFT 0x08 ++#define HAT_RIGHTUP (HAT_RIGHT|HAT_UP) ++#define HAT_RIGHTDOWN (HAT_RIGHT|HAT_DOWN) ++#define HAT_LEFTUP (HAT_LEFT|HAT_UP) ++#define HAT_LEFTDOWN (HAT_LEFT|HAT_DOWN) ++ ++/* calculate the value from the state of the dpad */ ++int ++dpad_to_sdl(Sint32 *dpad) ++{ ++ if (dpad[2]) { ++ if (dpad[0]) ++ return HAT_RIGHTUP; ++ else if (dpad[1]) ++ return HAT_RIGHTDOWN; ++ else ++ return HAT_RIGHT; ++ } else if (dpad[3]) { ++ if (dpad[0]) ++ return HAT_LEFTUP; ++ else if (dpad[1]) ++ return HAT_LEFTDOWN; ++ else ++ return HAT_LEFT; ++ } else if (dpad[0]) { ++ return HAT_UP; ++ } else if (dpad[1]) { ++ return HAT_DOWN; ++ } ++ return HAT_CENTERED; ++} ++#endif ++ + struct report + { + #if defined(__FREEBSD__) && (__FreeBSD_kernel_version > 900000) +@@ -432,7 +475,11 @@ desc_failed: + int joyaxe = usage_to_joyaxe(usage); + if (joyaxe >= 0) { + hw->axis_map[joyaxe] = 1; +- } else if (usage == HUG_HAT_SWITCH) { ++ } else if (usage == HUG_HAT_SWITCH ++#ifdef __OpenBSD__ ++ || usage == HUG_DPAD_UP ++#endif ++ ) { + joy->nhats++; + } + break; +@@ -485,6 +532,9 @@ BSD_JoystickUpdate(SDL_Joystick * joy) + struct report *rep; + int nbutton, naxe = -1; + Sint32 v; ++#ifdef __OpenBSD__ ++ Sint32 dpad[4] = {0, 0, 0, 0}; ++#endif + + #if defined(__FREEBSD__) || SDL_JOYSTICK_USBHID_MACHINE_JOYSTICK_H || defined(__FreeBSD_kernel__) + struct joystick gameport; +@@ -570,6 +620,16 @@ BSD_JoystickUpdate(SDL_Joystick * joy) + hatval_to_sdl(v) - + hitem.logical_minimum); + } ++#ifdef __OpenBSD__ ++ else if (usage == HUG_DPAD_UP) ++ dpad[0] = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem); ++ else if (usage == HUG_DPAD_DOWN) ++ dpad[1] = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem); ++ else if (usage == HUG_DPAD_RIGHT) ++ dpad[2] = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem); ++ else if (usage == HUG_DPAD_LEFT) ++ dpad[3] = (Sint32) hid_get_data(REP_BUF_DATA(rep), &hitem); ++#endif + break; + } + case HUP_BUTTON: +@@ -585,6 +645,9 @@ BSD_JoystickUpdate(SDL_Joystick * joy) + break; + } + } ++#ifdef __OpenBSD__ ++ SDL_PrivateJoystickHat(joy, 0, dpad_to_sdl(dpad)); ++#endif + hid_end_parse(hdata); + } + } Index: patches/patch-src_video_x11_SDL_x11keyboard_c =================================================================== RCS file: patches/patch-src_video_x11_SDL_x11keyboard_c diff -N patches/patch-src_video_x11_SDL_x11keyboard_c --- patches/patch-src_video_x11_SDL_x11keyboard_c 30 Oct 2018 07:03:30 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,18 +0,0 @@ -$OpenBSD: patch-src_video_x11_SDL_x11keyboard_c,v 1.2 2018/10/30 07:03:30 kirby Exp $ - -fix incorrect function signature that breaks macppc platform (likely any big -endian platform): "stack overflow in function X11_InitKeyboard" -upstream changeset http://hg.libsdl.org/SDL/rev/9dd351b26dcb - -Index: src/video/x11/SDL_x11keyboard.c ---- src/video/x11/SDL_x11keyboard.c.orig -+++ src/video/x11/SDL_x11keyboard.c -@@ -266,7 +266,7 @@ X11_InitKeyboard(_THIS) - int best_distance; - int best_index; - int distance; -- BOOL xkb_repeat = 0; -+ Bool xkb_repeat = 0; - - X11_XAutoRepeatOn(data->display); - Index: patches/patch-src_video_x11_SDL_x11sym_h =================================================================== RCS file: patches/patch-src_video_x11_SDL_x11sym_h diff -N patches/patch-src_video_x11_SDL_x11sym_h --- patches/patch-src_video_x11_SDL_x11sym_h 30 Oct 2018 07:03:30 -0000 1.2 +++ /dev/null 1 Jan 1970 00:00:00 -0000 @@ -1,18 +0,0 @@ -$OpenBSD: patch-src_video_x11_SDL_x11sym_h,v 1.2 2018/10/30 07:03:30 kirby Exp $ - -fix incorrect function signature that breaks macppc platform (likely any big -endian platform) -upstream changeset http://hg.libsdl.org/SDL/rev/9dd351b26dcb - -Index: src/video/x11/SDL_x11sym.h ---- src/video/x11/SDL_x11sym.h.orig -+++ src/video/x11/SDL_x11sym.h -@@ -180,7 +180,7 @@ SDL_X11_SYM(Status,XkbGetUpdatedMap,(Display* a,unsign - SDL_X11_SYM(XkbDescPtr,XkbGetMap,(Display* a,unsigned int b,unsigned int c),(a,b,c),return) - SDL_X11_SYM(void,XkbFreeClientMap,(XkbDescPtr a,unsigned int b, Bool c),(a,b,c),) - SDL_X11_SYM(void,XkbFreeKeyboard,(XkbDescPtr a,unsigned int b, Bool c),(a,b,c),) --SDL_X11_SYM(BOOL,XkbSetDetectableAutoRepeat,(Display* a, BOOL b, BOOL* c),(a,b,c),return) -+SDL_X11_SYM(Bool,XkbSetDetectableAutoRepeat,(Display* a, Bool b, Bool* c),(a,b,c),return) - #endif - - #if NeedWidePrototypes
