Joystick patch
David D. Hagood
wowbagger at sktc.net
Tue Jul 31 19:31:23 CDT 2001
Sorry about the diff format. I've attached a cvs diff -u diff.
-------------- next part --------------
Index: dlls/winmm/joystick/joystick.c
===================================================================
RCS file: /home/wine/wine/dlls/winmm/joystick/joystick.c,v
retrieving revision 1.9
diff -u -r1.9 joystick.c
--- dlls/winmm/joystick/joystick.c 2001/07/11 18:56:44 1.9
+++ dlls/winmm/joystick/joystick.c 2001/07/31 23:33:11
@@ -53,6 +53,7 @@
typedef struct tagWINE_JSTCK {
int joyIntf;
int in_use;
+ int fd;
} WINE_JSTCK;
static WINE_JSTCK JSTCK_Data[MAXJOYSTICK];
@@ -63,7 +64,6 @@
static WINE_JSTCK* JSTCK_drvGet(DWORD dwDevID)
{
int p;
-
if ((dwDevID - (DWORD)JSTCK_Data) % sizeof(JSTCK_Data[0]) != 0)
return NULL;
p = (dwDevID - (DWORD)JSTCK_Data) / sizeof(JSTCK_Data[0]);
@@ -114,13 +114,16 @@
char buf[20];
int flags;
+ if (jstick->fd > 0) /* already opened this? */
+ return jstick->fd;
+
sprintf(buf, JOYDEV, jstick->joyIntf);
#ifdef HAVE_LINUX_22_JOYSTICK_API
flags = O_RDONLY | O_NONBLOCK;
#else
flags = O_RDONLY;
#endif
- return open(buf, flags);
+ return jstick->fd = open(buf, flags);
}
/**************************************************************************
@@ -185,7 +188,6 @@
JOYCAPS_HASPOV, JOYCAPS_POV4DIR, JOYCAPS_POVCTS */
}
}
- close(dev);
#else
lpCaps->wMid = MM_MICROSOFT;
@@ -241,34 +243,35 @@
/* After opening the device, its state can be
read with JS_EVENT_INIT flag */
while ((read(dev, &ev, sizeof(struct js_event))) > 0) {
- if (ev.type == (JS_EVENT_AXIS | JS_EVENT_INIT)) {
+ if (ev.type & JS_EVENT_AXIS) {
switch (ev.number) {
case 0:
if (lpInfo->dwFlags & JOY_RETURNX)
- lpInfo->dwXpos = ev.value + 32767;
+ lpInfo->dwXpos = ev.value;
break;
case 1:
if (lpInfo->dwFlags & JOY_RETURNY)
- lpInfo->dwYpos = ev.value + 32767;
+ lpInfo->dwYpos = ev.value;
break;
case 2:
if (lpInfo->dwFlags & JOY_RETURNZ)
- lpInfo->dwZpos = ev.value + 32767;
+ lpInfo->dwZpos = ev.value;
break;
case 3:
if (lpInfo->dwFlags & JOY_RETURNR)
- lpInfo->dwRpos = ev.value + 32767;
+ lpInfo->dwRpos = ev.value;
case 4:
if (lpInfo->dwFlags & JOY_RETURNU)
- lpInfo->dwUpos = ev.value + 32767;
+ lpInfo->dwUpos = ev.value;
case 5:
if (lpInfo->dwFlags & JOY_RETURNV)
- lpInfo->dwVpos = ev.value + 32767;
+ lpInfo->dwVpos = ev.value;
break;
default:
FIXME("Unknown joystick event '%d'\n", ev.number);
}
- } else if (ev.type == (JS_EVENT_BUTTON | JS_EVENT_INIT)) {
+ }
+ if (ev.type & JS_EVENT_BUTTON) {
if (lpInfo->dwFlags & JOY_RETURNBUTTONS) {
if (ev.value) {
lpInfo->dwButtons |= (1 << ev.number);
@@ -289,6 +292,7 @@
dev_stat = read(dev, &js, sizeof(js));
if (dev_stat != sizeof(js)) {
close(dev);
+ jstk->fd = -1; /* mark file descriptor as closed */
return JOYERR_UNPLUGGED; /* FIXME: perhaps wrong, but what should I return else ? */
}
js.x = js.x<<8;
@@ -300,8 +304,6 @@
if (lpInfo->dwFlags & JOY_RETURNBUTTONS)
lpInfo->dwButtons = js.buttons;
#endif
-
- close(dev);
TRACE("x: %ld, y: %ld, z: %ld, r: %ld, u: %ld, v: %ld, buttons: 0x%04x, flags: 0x%04x\n",
lpInfo->dwXpos, lpInfo->dwYpos, lpInfo->dwZpos,
More information about the wine-patches
mailing list