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

Reply via email to