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