Bruno Jesus : winejoystick.drv: Don' t assume the first joystick is at the first device on Linux.

Alexandre Julliard julliard at winehq.org
Tue Aug 16 10:41:00 CDT 2016


Module: wine
Branch: master
Commit: 62876f3fc5feb1ca23d27a6de5adca580d963d0c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=62876f3fc5feb1ca23d27a6de5adca580d963d0c

Author: Bruno Jesus <00cpxxx at gmail.com>
Date:   Mon Aug 15 19:01:48 2016 -0300

winejoystick.drv: Don't assume the first joystick is at the first device on Linux.

Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winejoystick.drv/joystick_linux.c | 35 ++++++++++++++++++++++++++--------
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/dlls/winejoystick.drv/joystick_linux.c b/dlls/winejoystick.drv/joystick_linux.c
index b8fda4f..289e728 100644
--- a/dlls/winejoystick.drv/joystick_linux.c
+++ b/dlls/winejoystick.drv/joystick_linux.c
@@ -126,6 +126,7 @@ LRESULT driver_open(LPSTR str, DWORD dwIntf)
 	return 0;
 
     JSTCK_Data[dwIntf].joyIntf = dwIntf;
+    JSTCK_Data[dwIntf].dev = -1;
     JSTCK_Data[dwIntf].in_use = TRUE;
     return (LRESULT)&JSTCK_Data[dwIntf];
 }
@@ -160,25 +161,43 @@ struct js_status
  */
 static	int	JSTCK_OpenDevice(WINE_JSTCK* jstick)
 {
-    char	buf[20];
-    int		flags;
+    char  buf[20];
+    int   flags, fd, found_ix, i;
 
     if (jstick->dev > 0)
       return jstick->dev;
 
-    sprintf(buf, JOYDEV_NEW, jstick->joyIntf);
 #ifdef HAVE_LINUX_22_JOYSTICK_API
     flags = O_RDONLY | O_NONBLOCK;
 #else
     flags = O_RDONLY;
 #endif
-    if ((jstick->dev = open(buf, flags)) < 0) {
-        sprintf(buf, JOYDEV_OLD, jstick->joyIntf);
-        if ((jstick->dev = open(buf, flags)) < 0)
-            return jstick->dev;
+
+    /* The first joystick may not be at /dev/input/js0, find the correct
+     * first or second device. For example the driver for XBOX 360 wireless
+     * receiver creates entries starting at 20.
+     */
+    for (found_ix = i = 0; i < MAXJOYSTICK; i++) {
+        sprintf(buf, JOYDEV_NEW, i);
+        if ((fd = open(buf, flags)) < 0) {
+            sprintf(buf, JOYDEV_OLD, i);
+            if ((fd = open(buf, flags)) < 0)
+                continue;
+        }
+
+        if (found_ix++ == jstick->joyIntf)
+        {
+            TRACE("Found joystick[%d] at %s\n", jstick->joyIntf, buf);
+            jstick->dev = fd;
+            break;
+        }
+
+        close(fd);
     }
+
 #ifdef HAVE_LINUX_22_JOYSTICK_API
-    ioctl(jstick->dev, JSIOCGAXMAP, jstick->axesMap);
+    if (jstick->dev > 0)
+        ioctl(jstick->dev, JSIOCGAXMAP, jstick->axesMap);
 #endif
     return jstick->dev;
 }




More information about the wine-cvs mailing list