[dinput-0/6] multiple devices - Resend #2

Christoph Frick frick at sc-networks.de
Mon Jul 3 03:39:23 CDT 2006


hiho

this is again my patch for handling more than one /dev/input/event*
joystick within dinput. there are several other patches now to follow,
that expect this patch to be applied. so i label this one 0 of 6.
against the previous version it only has some "detect first joystick"
code moved around.

License: LGPL
ChangeLog: 
2006-07-02  Christoph Frick <rid at zefix.tv>
multiple /dev/input/event* joysticks

-- 
cu

Index: dlls/dinput/dinput_main.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/dinput_main.c,v
retrieving revision 1.62
diff -u -r1.62 dinput_main.c
--- dlls/dinput/dinput_main.c	23 May 2006 12:47:50 -0000	1.62
+++ dlls/dinput/dinput_main.c	3 Jul 2006 08:20:27 -0000
@@ -220,10 +220,11 @@
 
     for (i = 0; i < NB_DINPUT_DEVICES; i++) {
         if (!dinput_devices[i]->enum_deviceA) continue;
-        for (j = 0, r = -1; r != 0; j++) {
+        TRACE("  - checking device %d ('%s')\n", i, dinput_devices[i]->name);
+        for (j = 0, r = 0; r != -1; j++) {
 	    devInstance.dwSize = sizeof(devInstance);
-	    TRACE("  - checking device %d ('%s')\n", i, dinput_devices[i]->name);
-	    if ((r = dinput_devices[i]->enum_deviceA(dwDevType, dwFlags, &devInstance, This->dwVersion, j))) {
+	    if (1 == (r = dinput_devices[i]->enum_deviceA(dwDevType, dwFlags, &devInstance, This->dwVersion, j))) {
+                TRACE("  - found id %d\n", j);
 	        if (lpCallback(&devInstance,pvRef) == DIENUM_STOP)
 		    return 0;
 	    }
@@ -250,10 +251,11 @@
 
     for (i = 0; i < NB_DINPUT_DEVICES; i++) {
         if (!dinput_devices[i]->enum_deviceW) continue;
-        for (j = 0, r = -1; r != 0; j++) {
+        TRACE("  - checking device %d ('%s')\n", i, dinput_devices[i]->name);
+        for (j = 0, r = 0; r != -1; j++) {
 	    devInstance.dwSize = sizeof(devInstance);
-	    TRACE("  - checking device %d ('%s')\n", i, dinput_devices[i]->name);
-	    if ((r = dinput_devices[i]->enum_deviceW(dwDevType, dwFlags, &devInstance, This->dwVersion, j))) {
+	    if (1 == (r = dinput_devices[i]->enum_deviceW(dwDevType, dwFlags, &devInstance, This->dwVersion, j))) {
+                TRACE("  - found id %d\n", j);
 	        if (lpCallback(&devInstance,pvRef) == DIENUM_STOP)
 		    return 0;
 	    }
Index: dlls/dinput/joystick_linux.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/joystick_linux.c,v
retrieving revision 1.37
diff -u -r1.37 joystick_linux.c
--- dlls/dinput/joystick_linux.c	23 May 2006 12:47:51 -0000	1.37
+++ dlls/dinput/joystick_linux.c	3 Jul 2006 08:20:27 -0000
@@ -162,11 +162,15 @@
     return ret;
 }
 
-static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
+static int joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
 {
     int fd = -1;
     char dev[32];
 
+    if (id>0) {
+        return -1;
+    }
+
     if (dwFlags & DIEDFL_FORCEFEEDBACK) {
         WARN("force feedback not supported\n");
         return FALSE;
@@ -209,13 +213,17 @@
     return FALSE;
 }
 
-static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
+static int joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
 {
     int fd = -1;
     char name[MAX_PATH];
     char dev[32];
     char friendly[32];
 
+    if (id>0) {
+        return -1;
+    }
+
     if (dwFlags & DIEDFL_FORCEFEEDBACK) {
         WARN("force feedback not supported\n");
         return FALSE;
Index: dlls/dinput/joystick_linuxinput.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/joystick_linuxinput.c,v
retrieving revision 1.40
diff -u -r1.40 joystick_linuxinput.c
--- dlls/dinput/joystick_linuxinput.c	23 May 2006 12:47:51 -0000	1.40
+++ dlls/dinput/joystick_linuxinput.c	3 Jul 2006 08:20:28 -0000
@@ -85,12 +85,29 @@
 typedef struct JoystickImpl JoystickImpl;
 static const IDirectInputDevice8AVtbl JoystickAvt;
 static const IDirectInputDevice8WVtbl JoystickWvt;
+
+struct JoyDev {
+	int is_joystick;
+	char *device;
+	char *name;
+	GUID guid;
+
+	int has_ff;
+        int num_effects;
+
+	/* data returned by EVIOCGBIT for caps, EV_ABS, EV_KEY, and EV_FF */
+	BYTE				evbits[(EV_MAX+7)/8];
+	BYTE				absbits[(ABS_MAX+7)/8];
+	BYTE				keybits[(KEY_MAX+7)/8];
+	BYTE				ffbits[(FF_MAX+7)/8];	
+};
+
 struct JoystickImpl
 {
         const void                     *lpVtbl;
         LONG                            ref;
         GUID                            guid;
-
+        struct JoyDev                  *joydev;
 
 	/* The 'parent' DInput */
 	IDirectInputImpl               *dinput;
@@ -130,100 +147,128 @@
 #define AXE_ABSMAX	2
 #define AXE_ABSFUZZ	3
 #define AXE_ABSFLAT	4
-
-
-	/* data returned by EVIOCGBIT for caps, EV_ABS, EV_KEY, and EV_FF */
-	BYTE				evbits[(EV_MAX+7)/8];
-	BYTE				absbits[(ABS_MAX+7)/8];
-	BYTE				keybits[(KEY_MAX+7)/8];
-	BYTE				ffbits[(FF_MAX+7)/8];	
 };
 
+static void fake_current_js_state(JoystickImpl *ji);
+static int find_property_offset(JoystickImpl *This, LPCDIPROPHEADER ph);
+static DWORD map_pov(int event_value, int is_x);
+static void find_joydevs(void);
+
 /* This GUID is slightly different from the linux joystick one. Take note. */
-static GUID DInput_Wine_Joystick_GUID = { /* 9e573eda-7734-11d2-8d4a-23903fb6bdf7 */
+static const GUID DInput_Wine_Joystick_Base_GUID = { /* 9e573eda-7734-11d2-8d4a-23903fb6bdf7 */
   0x9e573eda,
   0x7734,
   0x11d2,
   {0x8d, 0x4a, 0x23, 0x90, 0x3f, 0xb6, 0xbd, 0xf7}
 };
 
-static void fake_current_js_state(JoystickImpl *ji);
-static int find_property_offset(JoystickImpl *This, LPCDIPROPHEADER ph);
-static DWORD map_pov(int event_value, int is_x);
-
 #define test_bit(arr,bit) (((BYTE*)(arr))[(bit)>>3]&(1<<((bit)&7)))
 
-static int joydev_have(BOOL require_ff)
+#define MAX_JOYDEV 64
+
+static int have_joydevs = -1;
+static struct JoyDev joydevs[MAX_JOYDEV] = {};
+
+static void find_joydevs(void)
 {
-  int i, fd, flags, num_effects;
-  int havejoy = 0;
+  int i, first_joydev = -1;
+
+  if (have_joydevs!=-1) {
+    return;
+  }
+
+  have_joydevs = 0;
+
+  for (i=0;i<MAX_JOYDEV;i++) {
+    char	buf[MAX_PATH];
+    struct JoyDev *joydev = &joydevs[i];
+    int fd;
+    int no_ff_check = 0;
+
+    snprintf(buf,MAX_PATH,EVDEVPREFIX"%d",i);
+    buf[MAX_PATH-1] = 0;
+
+    if ((fd=open(buf, O_RDWR))==-1) {
+      fd = open(buf, O_RDONLY);
+      no_ff_check = 1;
+    }
+
+    if (fd!=-1) {
+      if ((-1==ioctl(fd,EVIOCGBIT(0,sizeof(joydev->evbits)),joydev->evbits))) {
+        perror("EVIOCGBIT 0");
+        close(fd);
+        continue; 
+      }
+      if (-1==ioctl(fd,EVIOCGBIT(EV_ABS,sizeof(joydev->absbits)),joydev->absbits)) {
+        perror("EVIOCGBIT EV_ABS");
+        close(fd);
+        continue;
+      }
+      if (-1==ioctl(fd,EVIOCGBIT(EV_KEY,sizeof(joydev->keybits)),joydev->keybits)) {
+        perror("EVIOCGBIT EV_KEY");
+        close(fd);
+        continue;
+      }
+      /* A true joystick has at least axis X and Y, and at least 1
+       * button. copied from linux/drivers/input/joydev.c */
+      if (test_bit(joydev->absbits,ABS_X) && test_bit(joydev->absbits,ABS_Y) &&
+          (   test_bit(joydev->keybits,BTN_TRIGGER)	||
+              test_bit(joydev->keybits,BTN_A) 	||
+              test_bit(joydev->keybits,BTN_1)
+          )
+         ) {
+
+        joydev->is_joystick = 1;
+        joydev->device = strdup(buf);
+        if (-1!=ioctl(fd, EVIOCGNAME(MAX_PATH-1), buf)) {
+          buf[MAX_PATH-1] = 0;
+          joydev->name = strdup(buf);
+        } else {
+          joydev->name = joydev->device;
+        }
+        if (first_joydev==-1) {
+          first_joydev = i;
+          joydev->guid = GUID_Joystick;
+        } else {
+          joydev->guid = DInput_Wine_Joystick_Base_GUID;
+          joydev->guid.Data3 += have_joydevs;
+	}
+        have_joydevs++;
+
+        TRACE("Found %s joystick on %s: %s (%s)\n", 
+            first_joydev==i ? "first" : "a", 
+            joydev->device, joydev->name, 
+            debugstr_guid(&joydev->guid)
+            );
 
-  for (i=0;i<64;i++) {
-      char	buf[200];
-      BYTE	absbits[(ABS_MAX+7)/8],keybits[(KEY_MAX+7)/8];
-      BYTE	evbits[(EV_MAX+7)/8],ffbits[(FF_MAX+7)/8];
-
-      sprintf(buf,EVDEVPREFIX"%d",i);
-
-      if (require_ff) 
-	  flags = O_RDWR;
-      else
-	  flags = O_RDONLY;
-
-      if (-1!=(fd=open(buf,flags))) {
-	  if (-1==ioctl(fd,EVIOCGBIT(EV_ABS,sizeof(absbits)),absbits)) {
-	      perror("EVIOCGBIT EV_ABS");
-	      close(fd);
-	      continue;
-	  }
-	  if (-1==ioctl(fd,EVIOCGBIT(EV_KEY,sizeof(keybits)),keybits)) {
-	      perror("EVIOCGBIT EV_KEY");
-	      close(fd);
-	      continue;
-	  }
-
-	  /* test for force feedback if it's required */
-	  if (require_ff) {
-	      if ((-1==ioctl(fd,EVIOCGBIT(0,sizeof(evbits)),evbits))) {
-	          perror("EVIOCGBIT 0");
-	          close(fd);
-	          continue; 
-	      }
-	      if (   (!test_bit(evbits,EV_FF))
-	          || (-1==ioctl(fd,EVIOCGBIT(EV_FF,sizeof(ffbits)),ffbits)) 
-                  || (-1==ioctl(fd,EVIOCGEFFECTS,&num_effects))
-                  || (num_effects <= 0)) {
-		  close(fd);
-	          continue;
-	      }
-	  }
-
-	  /* A true joystick has at least axis X and Y, and at least 1
-	   * button. copied from linux/drivers/input/joydev.c */
-	  if (test_bit(absbits,ABS_X) && test_bit(absbits,ABS_Y) &&
-	      (   test_bit(keybits,BTN_TRIGGER)	||
-		  test_bit(keybits,BTN_A) 	||
-		  test_bit(keybits,BTN_1)
-	      )
-	  ) {
-	      FIXME("found a joystick at %s!\n",buf);
-	      havejoy = 1;
-	  }
-	  close(fd);
+#ifdef HAVE_STRUCT_FF_EFFECT_DIRECTION
+        if (!no_ff_check) {
+          if ((!test_bit(joydev->evbits,EV_FF))
+              || (-1==ioctl(fd,EVIOCGBIT(EV_FF,sizeof(joydev->ffbits)),joydev->ffbits)) 
+              || (-1==ioctl(fd,EVIOCGEFFECTS,&joydev->num_effects))
+              || (joydev->num_effects <= 0)) {
+            close(fd);
+            continue;
+          }
+
+          TRACE(" ... with force feedback\n");
+
+          joydev->has_ff = 1;
+        }
+#endif
       }
-      if (havejoy || (errno==ENODEV))
-	  break;
+
+      close(fd);
+    }
   }
-  return havejoy;
 }
 
-static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
+static int joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
 {
-  int havejoy = 0;
-
-  if (id != 0)
-      return FALSE;
-
+  if (id >= MAX_JOYDEV) {
+    return -1;
+  }
+ 
   if (!((dwDevType == 0) ||
         ((dwDevType == DIDEVTYPE_JOYSTICK) && (version < 0x0800)) ||
         (((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 0x0800))))
@@ -234,35 +279,30 @@
     return FALSE;
 #endif
 
-  havejoy = joydev_have(dwFlags & DIEDFL_FORCEFEEDBACK);
-
-  if (!havejoy)
-      return FALSE;
-
-  TRACE("Enumerating the linuxinput Joystick device\n");
+  find_joydevs();
 
-  /* Return joystick */
-  lpddi->guidInstance	= GUID_Joystick;
-  lpddi->guidProduct	= DInput_Wine_Joystick_GUID;
-
-  lpddi->guidFFDriver = GUID_NULL;
-  if (version >= 0x0800)
-    lpddi->dwDevType    = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
-  else
-    lpddi->dwDevType    = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
+  if (joydevs[id].is_joystick && ((!(dwFlags & DIEDFL_FORCEFEEDBACK)) || joydevs[id].has_ff)) {
+    lpddi->guidInstance	= joydevs[id].guid;
+    lpddi->guidProduct	= DInput_Wine_Joystick_Base_GUID;
+
+    lpddi->guidFFDriver = GUID_NULL;
+    if (version >= 0x0800)
+      lpddi->dwDevType    = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
+    else
+      lpddi->dwDevType    = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
 
-  strcpy(lpddi->tszInstanceName, "Joystick");
-  /* ioctl JSIOCGNAME(len) */
-  strcpy(lpddi->tszProductName,	"Wine Joystick");
-  return TRUE;
+    strcpy(lpddi->tszInstanceName, joydevs[id].name);
+    strcpy(lpddi->tszProductName, joydevs[id].device);
+    return TRUE;
+  }
+  return FALSE;
 }
 
-static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
+static int joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
 {
-  int havejoy = 0;
-
-  if (id != 0)
-      return FALSE;
+  if (id >= MAX_JOYDEV) {
+    return -1;
+  }
 
   if (!((dwDevType == 0) ||
         ((dwDevType == DIDEVTYPE_JOYSTICK) && (version < 0x0800)) ||
@@ -274,30 +314,26 @@
     return FALSE;
 #endif
 
-  havejoy = joydev_have(dwFlags & DIEDFL_FORCEFEEDBACK);
-
-  if (!havejoy)
-      return FALSE;
-
-  TRACE("Enumerating the linuxinput Joystick device\n");
+  find_joydevs();
 
-  /* Return joystick */
-  lpddi->guidInstance	= GUID_Joystick;
-  lpddi->guidProduct	= DInput_Wine_Joystick_GUID;
-
-  lpddi->guidFFDriver = GUID_NULL;
-  if (version >= 0x0800)
-    lpddi->dwDevType    = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
-  else
-    lpddi->dwDevType    = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
+  if (joydevs[id].is_joystick && ((!(dwFlags & DIEDFL_FORCEFEEDBACK)) || joydevs[id].has_ff)) {
+    lpddi->guidInstance	= joydevs[id].guid;
+    lpddi->guidProduct	= DInput_Wine_Joystick_Base_GUID;
+
+    lpddi->guidFFDriver = GUID_NULL;
+    if (version >= 0x0800)
+      lpddi->dwDevType    = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
+    else
+      lpddi->dwDevType    = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
 
-  MultiByteToWideChar(CP_ACP, 0, "Joystick", -1, lpddi->tszInstanceName, MAX_PATH);
-  /* ioctl JSIOCGNAME(len) */
-  MultiByteToWideChar(CP_ACP, 0, "Wine Joystick", -1, lpddi->tszProductName, MAX_PATH);
-  return TRUE;
+    MultiByteToWideChar(CP_ACP, 0, joydevs[id].name, -1, lpddi->tszInstanceName, MAX_PATH);
+    MultiByteToWideChar(CP_ACP, 0, joydevs[id].device, -1, lpddi->tszProductName, MAX_PATH);
+    return TRUE;
+  }
+  return FALSE;
 }
 
-static JoystickImpl *alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *dinput)
+static JoystickImpl *alloc_device(REFGUID rguid, const void *jvt, IDirectInputImpl *dinput, struct JoyDev *joydev)
 {
   JoystickImpl* newDevice;
   int i;
@@ -307,6 +343,7 @@
   newDevice->ref = 1;
   newDevice->joyfd = -1;
   newDevice->dinput = dinput;
+  newDevice->joydev = joydev;
 #ifdef HAVE_STRUCT_FF_EFFECT_DIRECTION
   newDevice->ff_state = FF_STATUS_STOPPED;
 #endif
@@ -327,25 +364,30 @@
 
 static HRESULT joydev_create_deviceA(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEA* pdev)
 {
-  int havejoy = 0;
+  int i;
 
-  havejoy = joydev_have(FALSE);
+  find_joydevs();
 
-  if (!havejoy)
+  if (!have_joydevs)
       return DIERR_DEVICENOTREG;
 
-  if ((IsEqualGUID(&GUID_Joystick,rguid)) ||
-      (IsEqualGUID(&DInput_Wine_Joystick_GUID,rguid))) {
-    if ((riid == NULL) ||
-	IsEqualGUID(&IID_IDirectInputDeviceA,riid) ||
-	IsEqualGUID(&IID_IDirectInputDevice2A,riid) ||
-	IsEqualGUID(&IID_IDirectInputDevice7A,riid) ||
-	IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {
-      *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &JoystickAvt, dinput);
-      TRACE("Creating a Joystick device (%p)\n", *pdev);
-      return DI_OK;
-    } else
-      return DIERR_NOINTERFACE;
+  for (i=0; i<MAX_JOYDEV; i++) {
+    if (joydevs[i].is_joystick && (
+        IsEqualGUID(&GUID_Joystick,rguid) ||
+        IsEqualGUID(&joydevs[i].guid,rguid)
+        )) {
+      if ((riid == NULL) ||
+          IsEqualGUID(&IID_IDirectInputDeviceA,riid) ||
+          IsEqualGUID(&IID_IDirectInputDevice2A,riid) ||
+          IsEqualGUID(&IID_IDirectInputDevice7A,riid) ||
+          IsEqualGUID(&IID_IDirectInputDevice8A,riid)) {
+        *pdev = (IDirectInputDeviceA*) alloc_device(rguid, &JoystickAvt, dinput, &joydevs[i]);
+        TRACE("Creating a Joystick device (%p)\n", *pdev);
+        return DI_OK;
+      } else {
+        return DIERR_NOINTERFACE;
+      }
+    }
   }
 
   return DIERR_DEVICENOTREG;
@@ -354,25 +396,30 @@
 
 static HRESULT joydev_create_deviceW(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPDIRECTINPUTDEVICEW* pdev)
 {
-  int havejoy = 0;
+  int i;
 
-  havejoy = joydev_have(FALSE);
+  find_joydevs();
 
-  if (!havejoy)
+  if (!have_joydevs)
       return DIERR_DEVICENOTREG;
 
-  if ((IsEqualGUID(&GUID_Joystick,rguid)) ||
-      (IsEqualGUID(&DInput_Wine_Joystick_GUID,rguid))) {
-    if ((riid == NULL) ||
-	IsEqualGUID(&IID_IDirectInputDeviceW,riid) ||
-	IsEqualGUID(&IID_IDirectInputDevice2W,riid) ||
-	IsEqualGUID(&IID_IDirectInputDevice7W,riid) ||
-	IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {
-      *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &JoystickWvt, dinput);
-      TRACE("Creating a Joystick device (%p)\n", *pdev);
-      return DI_OK;
-    } else
-      return DIERR_NOINTERFACE;
+  for (i=0; i<MAX_JOYDEV; i++) {
+    if (joydevs[i].is_joystick && (
+        IsEqualGUID(&GUID_Joystick,rguid) ||
+        IsEqualGUID(&joydevs[i].guid,rguid)
+        )) {
+      if ((riid == NULL) ||
+          IsEqualGUID(&IID_IDirectInputDeviceW,riid) ||
+          IsEqualGUID(&IID_IDirectInputDevice2W,riid) ||
+          IsEqualGUID(&IID_IDirectInputDevice7W,riid) ||
+          IsEqualGUID(&IID_IDirectInputDevice8W,riid)) {
+        *pdev = (IDirectInputDeviceW*) alloc_device(rguid, &JoystickWvt, dinput, &joydevs[i]);
+        TRACE("Creating a Joystick device (%p)\n", *pdev);
+        return DI_OK;
+      } else {
+        return DIERR_NOINTERFACE;
+      }
+    }
   }
 
   return DIERR_DEVICENOTREG;
@@ -461,9 +508,8 @@
   */
 static HRESULT WINAPI JoystickAImpl_Acquire(LPDIRECTINPUTDEVICE8A iface)
 {
-    int		i,buttons;
+    int		i, buttons;
     JoystickImpl *This = (JoystickImpl *)iface;
-    char	buf[200];
     BOOL	readonly = TRUE;
 
     TRACE("(this=%p)\n",This);
@@ -472,68 +518,23 @@
     if (This->df==NULL) {
       return DIERR_INVALIDPARAM;
     }
-    for (i=0;i<64;i++) {
-      sprintf(buf,EVDEVPREFIX"%d",i);
-      if (-1==(This->joyfd=open(buf,O_RDWR))) { 
-        if (-1==(This->joyfd=open(buf,O_RDONLY))) {
-	  /* Couldn't open the device at all */ 
-	  if (errno==ENODEV)
-	    return DIERR_NOTFOUND;
-	  perror(buf);
-	  continue;
-	}
-	else {
-	  /* Couldn't open in r/w but opened in read-only. */
-          WARN("Could not open %s in read-write mode.  Force feedback will be disabled.\n",buf);
-	}
-      }
-      else {
-	/* Opened device in read-write */
-	readonly = FALSE;
-      }
-      if ((-1!=ioctl(This->joyfd,EVIOCGBIT(0,sizeof(This->evbits)),This->evbits)) &&
-	  (-1!=ioctl(This->joyfd,EVIOCGBIT(EV_ABS,sizeof(This->absbits)),This->absbits)) &&
-          (-1!=ioctl(This->joyfd,EVIOCGBIT(EV_KEY,sizeof(This->keybits)),This->keybits)) &&
-          (test_bit(This->absbits,ABS_X) && test_bit(This->absbits,ABS_Y) &&
-	   (test_bit(This->keybits,BTN_TRIGGER)||
-	    test_bit(This->keybits,BTN_A)	 ||
-	    test_bit(This->keybits,BTN_1)
-	  )
-	 )
-      )
-	break;
-      close(This->joyfd);
-      This->joyfd = -1;
-    }
-    if (This->joyfd==-1)
-    	return DIERR_NOTFOUND;
 
-    This->has_ff = FALSE;
-    This->num_effects = 0;
-
-#ifdef HAVE_STRUCT_FF_EFFECT_DIRECTION
-    if (!readonly && test_bit(This->evbits, EV_FF)) {
-        if (-1!=ioctl(This->joyfd,EVIOCGBIT(EV_FF,sizeof(This->ffbits)),This->ffbits)) {
-	    if (-1!=ioctl(This->joyfd,EVIOCGEFFECTS,&This->num_effects) 
-		&& This->num_effects > 0) {
-		This->has_ff = TRUE;
-		TRACE("Joystick seems to be capable of force feedback.\n");
-	    }
-	    else {
-		TRACE("Joystick does not support any effects, disabling force feedback.\n");
-	    }
-        }
-        else {
-            TRACE("Could not get EV_FF bits; disabling force feedback.\n");
-        }
-    }
-    else {
-        TRACE("Force feedback disabled (device is readonly or joystick incapable).\n");
+    if (-1==(This->joyfd=open(This->joydev->device,O_RDWR))) { 
+      if (-1==(This->joyfd=open(This->joydev->device,O_RDONLY))) {
+        /* Couldn't open the device at all */ 
+        perror(This->joydev->device);
+        return DIERR_NOTFOUND;
+      } else {
+        /* Couldn't open in r/w but opened in read-only. */
+        WARN("Could not open %s in read-write mode.  Force feedback will be disabled.\n", This->joydev->device);
+      }
+    } else {
+      /* Opened device in read-write */
+      readonly = FALSE;
     }
-#endif
 
     for (i=0;i<ABS_MAX;i++) {
-	if (test_bit(This->absbits,i)) {
+	if (test_bit(This->joydev->absbits,i)) {
 	  if (-1==ioctl(This->joyfd,EVIOCGABS(i),&(This->axes[i])))
 	    continue;
 	  TRACE("axe %d: cur=%d, min=%d, max=%d, fuzz=%d, flat=%d\n",
@@ -550,14 +551,14 @@
     }
     buttons = 0;
     for (i=0;i<KEY_MAX;i++) {
-	    if (test_bit(This->keybits,i)) {
+	    if (test_bit(This->joydev->keybits,i)) {
 		    TRACE("button %d: %d\n", i, buttons);
 		    This->buttons[i] = 0x80 | buttons;
 		    buttons++;
 	    }
     }
 
-	fake_current_js_state(This);
+    fake_current_js_state(This);
 
     return 0;
 }
@@ -985,7 +986,6 @@
 	LPDIDEVCAPS lpDIDevCaps)
 {
     JoystickImpl *This = (JoystickImpl *)iface;
-    int		xfd = This->joyfd;
     int		i,axes,buttons;
 
     TRACE("%p->(%p)\n",iface,lpDIDevCaps);
@@ -1000,11 +1000,6 @@
         return DIERR_INVALIDPARAM;
     }
 
-    if (xfd==-1) {
-	/* yes, games assume we return something, even if unacquired */
-	JoystickAImpl_Acquire(iface);
-    }
-
     lpDIDevCaps->dwFlags	= DIDC_ATTACHED;
     if (This->dinput->dwVersion >= 0x0800)
         lpDIDevCaps->dwDevType = DI8DEVTYPE_JOYSTICK | (DI8DEVTYPEJOYSTICK_STANDARD << 8);
@@ -1012,9 +1007,9 @@
         lpDIDevCaps->dwDevType = DIDEVTYPE_JOYSTICK | (DIDEVTYPEJOYSTICK_TRADITIONAL << 8);
 
     axes=0;
-    for (i=0;i<ABS_MAX;i++) if (test_bit(This->absbits,i)) axes++;
+    for (i=0;i<ABS_MAX;i++) if (test_bit(This->joydev->absbits,i)) axes++;
     buttons=0;
-    for (i=0;i<KEY_MAX;i++) if (test_bit(This->keybits,i)) buttons++;
+    for (i=0;i<KEY_MAX;i++) if (test_bit(This->joydev->keybits,i)) buttons++;
 
     if (This->has_ff) 
 	 lpDIDevCaps->dwFlags |= DIDC_FORCEFEEDBACK;
@@ -1022,10 +1017,6 @@
     lpDIDevCaps->dwAxes = axes;
     lpDIDevCaps->dwButtons = buttons;
 
-    if (xfd==-1) {
-      JoystickAImpl_Unacquire(iface);
-    }
-
     return DI_OK;
 }
 
@@ -1052,7 +1043,6 @@
 {
   JoystickImpl *This = (JoystickImpl *)iface;
   DIDEVICEOBJECTINSTANCEA ddoi;
-  int xfd = This->joyfd;
 
   TRACE("(this=%p,%p,%p,%08lx)\n", This, lpCallback, lpvRef, dwFlags);
   if (TRACE_ON(dinput)) {
@@ -1061,10 +1051,6 @@
     TRACE("\n");
   }
 
-  /* We need to work even if we're not yet acquired */
-  if (xfd == -1)
-    IDirectInputDevice8_Acquire(iface);
-
   /* Only the fields till dwFFMaxForce are relevant */
   ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEA, dwFFMaxForce);
 
@@ -1075,7 +1061,7 @@
     BYTE i;
 
     for (i = 0; i < ABS_MAX; i++) {
-      if (!test_bit(This->absbits,i)) continue;
+      if (!test_bit(This->joydev->absbits,i)) continue;
 
       switch (i) {
       case ABS_X:
@@ -1122,9 +1108,6 @@
       sprintf(ddoi.tszName, "%d-Axis", i);
       _dump_OBJECTINSTANCEA(&ddoi);
       if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) {
-	/* return to unaquired state if that's where we were */
-	if (xfd == -1)
-	  IDirectInputDevice8_Unacquire(iface);
 	return DI_OK;
       }
     }
@@ -1135,15 +1118,12 @@
     int i;
     ddoi.guidType = GUID_POV;
     for (i=0; i<4; i++) {
-      if (test_bit(This->absbits,ABS_HAT0X+(i<<1)) && test_bit(This->absbits,ABS_HAT0Y+(i<<1))) {
+      if (test_bit(This->joydev->absbits,ABS_HAT0X+(i<<1)) && test_bit(This->joydev->absbits,ABS_HAT0Y+(i<<1))) {
         ddoi.dwOfs = DIJOFS_POV(i);
         ddoi.dwType = DIDFT_MAKEINSTANCE(i << WINE_JOYSTICK_POV_BASE) | DIDFT_POV;
         sprintf(ddoi.tszName, "%d-POV", i);
         _dump_OBJECTINSTANCEA(&ddoi);
         if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) {
-          /* return to unaquired state if that's where we were */
-          if (xfd == -1)
-            IDirectInputDevice8_Unacquire(iface);
           return DI_OK;
         }
       }
@@ -1159,25 +1139,18 @@
     ddoi.guidType = GUID_Button;
 
     for (i = 0; i < KEY_MAX; i++) {
-      if (!test_bit(This->keybits,i)) continue;
+      if (!test_bit(This->joydev->keybits,i)) continue;
       ddoi.dwOfs = DIJOFS_BUTTON(btncount);
       ddoi.dwType = DIDFT_MAKEINSTANCE(btncount << WINE_JOYSTICK_BUTTON_BASE) | DIDFT_PSHBUTTON;
       sprintf(ddoi.tszName, "%d-Button", btncount);
       btncount++;
       _dump_OBJECTINSTANCEA(&ddoi);
       if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) {
-	/* return to unaquired state if that's where we were */
-	if (xfd == -1)
-	  IDirectInputDevice8_Unacquire(iface);
 	return DI_OK;
       }
     }
   }
 
-  /* return to unaquired state if that's where we were */
-  if (xfd == -1)
-    IDirectInputDevice8_Unacquire(iface);
-
   return DI_OK;
 }
 
@@ -1300,74 +1273,66 @@
     DIEFFECTINFOA dei; /* feif */
     DWORD type = DIEFT_GETTYPE(dwEffType);
     JoystickImpl* This = (JoystickImpl*)iface;
-    int xfd = This->joyfd;
 
-    TRACE("(this=%p,%p,%ld) type=%ld fd=%d\n", This, pvRef, dwEffType, type, xfd);
+    TRACE("(this=%p,%p,%ld) type=%ld\n", This, pvRef, dwEffType, type);
 
     dei.dwSize = sizeof(DIEFFECTINFOA);          
 
-    /* We need to return something even if we're not yet acquired */
-    if (xfd == -1)
-	IDirectInputDevice8_Acquire(iface);
-
     if ((type == DIEFT_ALL || type == DIEFT_CONSTANTFORCE)
-	&& test_bit(This->ffbits, FF_CONSTANT)) {
+	&& test_bit(This->joydev->ffbits, FF_CONSTANT)) {
 	IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_ConstantForce);
 	(*lpCallback)(&dei, pvRef);
     }
 
     if ((type == DIEFT_ALL || type == DIEFT_PERIODIC)
-	&& test_bit(This->ffbits, FF_PERIODIC)) {
-	if (test_bit(This->ffbits, FF_SQUARE)) {
+	&& test_bit(This->joydev->ffbits, FF_PERIODIC)) {
+	if (test_bit(This->joydev->ffbits, FF_SQUARE)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Square);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_SINE)) {
+	if (test_bit(This->joydev->ffbits, FF_SINE)) {
             IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Sine);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_TRIANGLE)) {
+	if (test_bit(This->joydev->ffbits, FF_TRIANGLE)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Triangle);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_SAW_UP)) {
+	if (test_bit(This->joydev->ffbits, FF_SAW_UP)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_SawtoothUp);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_SAW_DOWN)) {
+	if (test_bit(This->joydev->ffbits, FF_SAW_DOWN)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_SawtoothDown);
 	    (*lpCallback)(&dei, pvRef);
 	}
     } 
 
     if ((type == DIEFT_ALL || type == DIEFT_RAMPFORCE)
-	&& test_bit(This->ffbits, FF_RAMP)) {
+	&& test_bit(This->joydev->ffbits, FF_RAMP)) {
         IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_RampForce);
         (*lpCallback)(&dei, pvRef);
     }
 
     if (type == DIEFT_ALL || type == DIEFT_CONDITION) {
-	if (test_bit(This->ffbits, FF_SPRING)) {
+	if (test_bit(This->joydev->ffbits, FF_SPRING)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Spring);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_DAMPER)) {
+	if (test_bit(This->joydev->ffbits, FF_DAMPER)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Damper);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_INERTIA)) {
+	if (test_bit(This->joydev->ffbits, FF_INERTIA)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Inertia);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_FRICTION)) {
+	if (test_bit(This->joydev->ffbits, FF_FRICTION)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Friction);
 	    (*lpCallback)(&dei, pvRef);
 	}
     }
 
-    /* return to unaquired state if that's where it was */
-    if (xfd == -1)
-	IDirectInputDevice8_Unacquire(iface);
 #endif
 
     return DI_OK;
@@ -1390,60 +1355,56 @@
 
     dei.dwSize = sizeof(DIEFFECTINFOW);          
 
-    /* We need to return something even if we're not yet acquired */
-    if (xfd == -1)
-	IDirectInputDevice8_Acquire(iface);
-
     if ((type == DIEFT_ALL || type == DIEFT_CONSTANTFORCE)
-	&& test_bit(This->ffbits, FF_CONSTANT)) {
+	&& test_bit(This->joydev->ffbits, FF_CONSTANT)) {
 	IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_ConstantForce);
 	(*lpCallback)(&dei, pvRef);
     }
 
     if ((type == DIEFT_ALL || type == DIEFT_PERIODIC)
-	&& test_bit(This->ffbits, FF_PERIODIC)) {
-	if (test_bit(This->ffbits, FF_SQUARE)) {
+	&& test_bit(This->joydev->ffbits, FF_PERIODIC)) {
+	if (test_bit(This->joydev->ffbits, FF_SQUARE)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Square);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_SINE)) {
+	if (test_bit(This->joydev->ffbits, FF_SINE)) {
             IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Sine);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_TRIANGLE)) {
+	if (test_bit(This->joydev->ffbits, FF_TRIANGLE)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Triangle);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_SAW_UP)) {
+	if (test_bit(This->joydev->ffbits, FF_SAW_UP)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_SawtoothUp);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_SAW_DOWN)) {
+	if (test_bit(This->joydev->ffbits, FF_SAW_DOWN)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_SawtoothDown);
 	    (*lpCallback)(&dei, pvRef);
 	}
     } 
 
     if ((type == DIEFT_ALL || type == DIEFT_RAMPFORCE)
-	&& test_bit(This->ffbits, FF_RAMP)) {
+	&& test_bit(This->joydev->ffbits, FF_RAMP)) {
         IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_RampForce);
         (*lpCallback)(&dei, pvRef);
     }
 
     if (type == DIEFT_ALL || type == DIEFT_CONDITION) {
-	if (test_bit(This->ffbits, FF_SPRING)) {
+	if (test_bit(This->joydev->ffbits, FF_SPRING)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Spring);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_DAMPER)) {
+	if (test_bit(This->joydev->ffbits, FF_DAMPER)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Damper);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_INERTIA)) {
+	if (test_bit(This->joydev->ffbits, FF_INERTIA)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Inertia);
 	    (*lpCallback)(&dei, pvRef);
 	}
-	if (test_bit(This->ffbits, FF_FRICTION)) {
+	if (test_bit(This->joydev->ffbits, FF_FRICTION)) {
 	    IDirectInputDevice8_GetEffectInfo(iface, &dei, &GUID_Friction);
 	    (*lpCallback)(&dei, pvRef);
 	}
Index: dlls/dinput/keyboard.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/keyboard.c,v
retrieving revision 1.24
diff -u -r1.24 keyboard.c
--- dlls/dinput/keyboard.c	23 May 2006 12:47:51 -0000	1.24
+++ dlls/dinput/keyboard.c	3 Jul 2006 08:20:28 -0000
@@ -186,10 +186,10 @@
     memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi)));
 }
  
-static BOOL keyboarddev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
+static int keyboarddev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
 {
   if (id != 0)
-    return FALSE;
+    return -1;
 
   if ((dwDevType == 0) ||
       ((dwDevType == DIDEVTYPE_KEYBOARD) && (version < 0x0800)) ||
@@ -204,10 +204,10 @@
   return FALSE;
 }
 
-static BOOL keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
+static int keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
 {
   if (id != 0)
-    return FALSE;
+    return -1;
 
   if ((dwDevType == 0) ||
       ((dwDevType == DIDEVTYPE_KEYBOARD) && (version < 0x0800)) ||
Index: dlls/dinput/mouse.c
===================================================================
RCS file: /home/wine/wine/dlls/dinput/mouse.c,v
retrieving revision 1.33
diff -u -r1.33 mouse.c
--- dlls/dinput/mouse.c	23 Jun 2006 11:46:16 -0000	1.33
+++ dlls/dinput/mouse.c	3 Jul 2006 08:20:28 -0000
@@ -203,10 +203,10 @@
     memcpy(lpddi, &ddi, (dwSize < sizeof(ddi) ? dwSize : sizeof(ddi)));
 }
 
-static BOOL mousedev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
+static int mousedev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
 {
     if (id != 0)
-        return FALSE;
+        return -1;
 
     if ((dwDevType == 0) ||
 	((dwDevType == DIDEVTYPE_MOUSE) && (version < 0x0800)) ||
@@ -221,10 +221,10 @@
     return FALSE;
 }
 
-static BOOL mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
+static int mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
 {
     if (id != 0)
-        return FALSE;
+        return -1;
 
     if ((dwDevType == 0) ||
 	((dwDevType == DIDEVTYPE_MOUSE) && (version < 0x0800)) ||
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 163 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-patches/attachments/20060703/e6b2e7fe/attachment-0001.pgp


More information about the wine-patches mailing list