Untested fix for bug 946 (SDL_HapticIndex returns 0 for all devices)
authorSam Lantinga <slouken@libsdl.org>
Sun, 20 Feb 2011 09:28:13 -0800
changeset 5358 5b330ef7b8dd
parent 5357 ea8fec220775
child 5359 d5fe4ed3a28d
Untested fix for bug 946 (SDL_HapticIndex returns 0 for all devices) Edgar Simo 2011-02-20 09:02:31 PST Linux uses fname, which is the name of the device path like for example /dev/input/event3 so it shouldn't have the issue. However I can confirm that it looks like haptic->index never gets properly set on windows. Have to look at mac os x also. I'll see if I can fix it real quick now.
src/haptic/darwin/SDL_syshaptic.c
src/haptic/windows/SDL_syshaptic.c
--- a/src/haptic/darwin/SDL_syshaptic.c	Sun Feb 20 09:24:02 2011 -0800
+++ b/src/haptic/darwin/SDL_syshaptic.c	Sun Feb 20 09:28:13 2011 -0800
@@ -534,6 +534,18 @@
 int
 SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
 {
+    int i;
+    for (i=0; i<SDL_numhaptics; i++) {
+       if (IOObjectIsEqualTo((io_object_t) SDL_hapticlist[i].dev,
+                             joystick->hwdata->ffservice)) {
+           haptic->index = i;
+           break;
+       }
+    }
+    if (i >= SDL_numhaptics) {
+       return -1;
+    }
+
     return SDL_SYS_HapticOpenFromService(haptic, joystick->hwdata->ffservice);
 }
 
--- a/src/haptic/windows/SDL_syshaptic.c	Sun Feb 20 09:24:02 2011 -0800
+++ b/src/haptic/windows/SDL_syshaptic.c	Sun Feb 20 09:28:13 2011 -0800
@@ -576,7 +576,26 @@
 int
 SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
 {
-    int ret;
+    int i, ret;
+    HRESULT idret;
+    DIDEVICEINSTANCE joy_instance;
+
+    /* Since it comes from a joystick we have to try to match it with a haptic device on our haptic list. */
+    for (i=0; i<SDL_numhaptics; i++) {
+        idret = IDirectInputDevice2_GetDeviceInfo(joystick->hwdata->InputDevice,
+              &joy_instance);
+        if (FAILED(idret)) {
+            return -1;
+        }
+        if (DI_GUIDIsSame(&SDL_hapticlist[i].instance.guidInstance,
+                          &joy_instance.guidInstance)) {
+            haptic->index = i;
+            break;
+        }
+    }
+    if (i >= SDL_numhaptics) {
+        return -1;
+    }
 
     /* Allocate the hwdata */
     haptic->hwdata = (struct haptic_hwdata *)