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