[PATCH 1/3] dinput: Enumerate devices past the first non-matching device

Andrew Eikum aeikum at codeweavers.com
Mon May 20 14:10:02 CDT 2013


---
 dlls/dinput/dinput_main.c         | 62 ++++++++++++++++++++-------------------
 dlls/dinput/dinput_private.h      |  4 +--
 dlls/dinput/joystick_linux.c      | 24 +++++++--------
 dlls/dinput/joystick_linuxinput.c | 24 +++++++--------
 dlls/dinput/joystick_osx.c        | 20 ++++++-------
 dlls/dinput/keyboard.c            | 16 +++++-----
 dlls/dinput/mouse.c               | 16 +++++-----
 7 files changed, 84 insertions(+), 82 deletions(-)

diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index 1c6bf9a..14d5285 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -370,17 +370,17 @@ static HRESULT WINAPI IDirectInputAImpl_EnumDevices(
 
     for (i = 0; i < NB_DINPUT_DEVICES; i++) {
         if (!dinput_devices[i]->enum_deviceA) continue;
-        for (j = 0, r = -1; r != 0; j++) {
-	    devInstance.dwSize = sizeof(devInstance);
-	    TRACE("  - checking device %u ('%s')\n", i, dinput_devices[i]->name);
-	    if ((r = dinput_devices[i]->enum_deviceA(dwDevType, dwFlags, &devInstance, This->dwVersion, j))) {
-	        if (lpCallback(&devInstance,pvRef) == DIENUM_STOP)
-		    return 0;
-	    }
-	}
+        for (j = 0, r = S_OK; SUCCEEDED(r); j++) {
+            devInstance.dwSize = sizeof(devInstance);
+            TRACE("  - checking device %u ('%s')\n", i, dinput_devices[i]->name);
+            r = dinput_devices[i]->enum_deviceA(dwDevType, dwFlags, &devInstance, This->dwVersion, j);
+            if (r == S_OK)
+                if (lpCallback(&devInstance,pvRef) == DIENUM_STOP)
+                    return S_OK;
+        }
     }
-    
-    return 0;
+
+    return S_OK;
 }
 /******************************************************************************
  *	IDirectInputW_EnumDevices
@@ -392,7 +392,8 @@ static HRESULT WINAPI IDirectInputWImpl_EnumDevices(
     IDirectInputImpl *This = impl_from_IDirectInput7W( iface );
     DIDEVICEINSTANCEW devInstance;
     unsigned int i;
-    int j, r;
+    int j;
+    HRESULT r;
 
     TRACE("(this=%p,0x%04x '%s',%p,%p,%04x)\n",
 	  This, dwDevType, _dump_DIDEVTYPE_value(dwDevType),
@@ -409,17 +410,17 @@ static HRESULT WINAPI IDirectInputWImpl_EnumDevices(
 
     for (i = 0; i < NB_DINPUT_DEVICES; i++) {
         if (!dinput_devices[i]->enum_deviceW) continue;
-        for (j = 0, r = -1; r != 0; j++) {
-	    devInstance.dwSize = sizeof(devInstance);
-	    TRACE("  - checking device %u ('%s')\n", i, dinput_devices[i]->name);
-	    if ((r = dinput_devices[i]->enum_deviceW(dwDevType, dwFlags, &devInstance, This->dwVersion, j))) {
-	        if (lpCallback(&devInstance,pvRef) == DIENUM_STOP)
-		    return 0;
-	    }
-	}
+        for (j = 0, r = S_OK; SUCCEEDED(r); j++) {
+            devInstance.dwSize = sizeof(devInstance);
+            TRACE("  - checking device %u ('%s')\n", i, dinput_devices[i]->name);
+            r = dinput_devices[i]->enum_deviceW(dwDevType, dwFlags, &devInstance, This->dwVersion, j);
+            if (r == S_OK)
+                if (lpCallback(&devInstance,pvRef) == DIENUM_STOP)
+                    return S_OK;
+        }
     }
-    
-    return 0;
+
+    return S_OK;
 }
 
 static ULONG WINAPI IDirectInputAImpl_AddRef(LPDIRECTINPUT7A iface)
@@ -908,18 +909,18 @@ static HRESULT WINAPI IDirectInput8AImpl_EnumDevicesBySemantics(
     /* Enumerate all the joysticks */
     for (i = 0; i < NB_DINPUT_DEVICES; i++)
     {
-        BOOL enumSuccess;
+        HRESULT enumSuccess;
 
         if (!dinput_devices[i]->enum_deviceA) continue;
 
-        for (j = 0, enumSuccess = -1; enumSuccess != 0; j++)
+        for (j = 0, enumSuccess = S_OK; SUCCEEDED(enumSuccess); j++)
         {
             TRACE(" - checking device %u ('%s')\n", i, dinput_devices[i]->name);
 
             callbackFlags = diactionformat_priorityA(lpdiActionFormat, lpdiActionFormat->dwGenre);
             /* Default behavior is to enumerate attached game controllers */
             enumSuccess = dinput_devices[i]->enum_deviceA(DI8DEVCLASS_GAMECTRL, DIEDFL_ATTACHEDONLY | dwFlags, &didevi, This->dwVersion, j);
-            if (enumSuccess)
+            if (enumSuccess == S_OK)
             {
                 IDirectInput_CreateDevice(iface, &didevi.guidInstance, &lpdid, NULL);
 
@@ -968,18 +969,18 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
     /* Enumerate all the joysticks */
     for (i = 0; i < NB_DINPUT_DEVICES; i++)
     {
-        BOOL enumSuccess;
+        HRESULT enumSuccess;
 
         if (!dinput_devices[i]->enum_deviceW) continue;
 
-        for (j = 0, enumSuccess = -1; enumSuccess != 0; j++)
+        for (j = 0, enumSuccess = S_OK; SUCCEEDED(enumSuccess); j++)
         {
             TRACE(" - checking device %u ('%s')\n", i, dinput_devices[i]->name);
 
             callbackFlags = diactionformat_priorityW(lpdiActionFormat, lpdiActionFormat->dwGenre);
             /* Default behavior is to enumerate attached game controllers */
             enumSuccess = dinput_devices[i]->enum_deviceW(DI8DEVCLASS_GAMECTRL, DIEDFL_ATTACHEDONLY | dwFlags, &didevi, This->dwVersion, j);
-            if (enumSuccess)
+            if (enumSuccess == S_OK)
             {
                 IDirectInput_CreateDevice(iface, &didevi.guidInstance, &lpdid, NULL);
 
@@ -1147,7 +1148,8 @@ static HRESULT WINAPI JoyConfig8Impl_GetConfig(IDirectInputJoyConfig8 *iface, UI
 {
     IDirectInputImpl *di = impl_from_IDirectInputJoyConfig8(iface);
     UINT found = 0;
-    int i, j, r;
+    int i, j;
+    HRESULT r;
 
     FIXME("(%p)->(%d, %p, 0x%08x): semi-stub!\n", iface, id, info, flags);
 
@@ -1163,11 +1165,11 @@ static HRESULT WINAPI JoyConfig8Impl_GetConfig(IDirectInputJoyConfig8 *iface, UI
     {
         if (!dinput_devices[i]->enum_deviceA) continue;
 
-        for (j = 0, r = -1; r != 0; j++)
+        for (j = 0, r = S_OK; SUCCEEDED(r); j++)
         {
             DIDEVICEINSTANCEA dev;
             dev.dwSize = sizeof(dev);
-            if ((r = dinput_devices[i]->enum_deviceA(DI8DEVCLASS_GAMECTRL, 0, &dev, di->dwVersion, j)))
+            if ((r = dinput_devices[i]->enum_deviceA(DI8DEVCLASS_GAMECTRL, 0, &dev, di->dwVersion, j)) == S_OK)
             {
                 /* Only take into account the chosen id */
                 if (found == id)
diff --git a/dlls/dinput/dinput_private.h b/dlls/dinput/dinput_private.h
index e593b40..022a7a9 100644
--- a/dlls/dinput/dinput_private.h
+++ b/dlls/dinput/dinput_private.h
@@ -51,8 +51,8 @@ struct IDirectInputImpl
 /* Function called by all devices that Wine supports */
 struct dinput_device {
     const char *name;
-    BOOL (*enum_deviceA)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id);
-    BOOL (*enum_deviceW)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id);
+    HRESULT (*enum_deviceA)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id);
+    HRESULT (*enum_deviceW)(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id);
     HRESULT (*create_device)(IDirectInputImpl *dinput, REFGUID rguid, REFIID riid, LPVOID *pdev, int unicode);
 };
 
diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index a91c5e8..d973a84 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -220,15 +220,15 @@ static INT find_joystick_devices(void)
     return joystick_devices_count;
 }
 
-static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
+static HRESULT joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
 {
     int fd = -1;
 
-    if (id >= find_joystick_devices()) return FALSE;
+    if (id >= find_joystick_devices()) return E_FAIL;
 
     if (dwFlags & DIEDFL_FORCEFEEDBACK) {
         WARN("force feedback not supported\n");
-        return FALSE;
+        return S_FALSE;
     }
 
     if ((dwDevType == 0) ||
@@ -238,7 +238,7 @@ static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
         if ((fd = open(joystick_devices[id].device, O_RDONLY)) < 0)
         {
             WARN("open(%s, O_RDONLY) failed: %s\n", joystick_devices[id].name, strerror(errno));
-            return FALSE;
+            return S_FALSE;
         }
 
         /* Return joystick */
@@ -257,21 +257,21 @@ static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
         lpddi->guidFFDriver = GUID_NULL;
         close(fd);
         TRACE("Enumerating the linux Joystick device: %s (%s)\n", joystick_devices[id].device, lpddi->tszProductName);
-        return TRUE;
+        return S_OK;
     }
 
-    return FALSE;
+    return S_FALSE;
 }
 
-static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
+static HRESULT joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
 {
     int fd = -1;
 
-    if (id >= find_joystick_devices()) return FALSE;
+    if (id >= find_joystick_devices()) return E_FAIL;
 
     if (dwFlags & DIEDFL_FORCEFEEDBACK) {
         WARN("force feedback not supported\n");
-        return FALSE;
+        return S_FALSE;
     }
 
     if ((dwDevType == 0) ||
@@ -281,7 +281,7 @@ static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
         if ((fd = open(joystick_devices[id].device, O_RDONLY)) < 0)
         {
             WARN("open(%s,O_RDONLY) failed: %s\n", joystick_devices[id].device, strerror(errno));
-            return FALSE;
+            return S_FALSE;
         }
 
         /* Return joystick */
@@ -299,10 +299,10 @@ static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
         lpddi->guidFFDriver = GUID_NULL;
         close(fd);
         TRACE("Enumerating the linux Joystick device: %s (%s)\n", joystick_devices[id].device, joystick_devices[id].name);
-        return TRUE;
+        return S_OK;
     }
 
-    return FALSE;
+    return S_FALSE;
 }
 
 static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
diff --git a/dlls/dinput/joystick_linuxinput.c b/dlls/dinput/joystick_linuxinput.c
index 5ed9bde..6b22f4a 100644
--- a/dlls/dinput/joystick_linuxinput.c
+++ b/dlls/dinput/joystick_linuxinput.c
@@ -363,54 +363,54 @@ static void fill_joystick_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
     MultiByteToWideChar(CP_ACP, 0, joydevs[id].name, -1, lpddi->tszProductName, MAX_PATH);
 }
 
-static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
+static HRESULT joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
 {
   find_joydevs();
 
   if (id >= have_joydevs) {
-    return FALSE;
+    return E_FAIL;
   }
 
   if (!((dwDevType == 0) ||
         ((dwDevType == DIDEVTYPE_JOYSTICK) && (version > 0x0300 && version < 0x0800)) ||
         (((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 0x0800))))
-    return FALSE;
+    return S_FALSE;
 
 #ifndef HAVE_STRUCT_FF_EFFECT_DIRECTION
   if (dwFlags & DIEDFL_FORCEFEEDBACK)
-    return FALSE;
+    return S_FALSE;
 #endif
 
   if (!(dwFlags & DIEDFL_FORCEFEEDBACK) || joydevs[id].has_ff) {
     fill_joystick_dideviceinstanceA(lpddi, version, id);
-    return TRUE;
+    return S_OK;
   }
-  return FALSE;
+  return S_FALSE;
 }
 
-static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
+static HRESULT joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
 {
   find_joydevs();
 
   if (id >= have_joydevs) {
-    return FALSE;
+    return E_FAIL;
   }
 
   if (!((dwDevType == 0) ||
         ((dwDevType == DIDEVTYPE_JOYSTICK) && (version > 0x0300 && version < 0x0800)) ||
         (((dwDevType == DI8DEVCLASS_GAMECTRL) || (dwDevType == DI8DEVTYPE_JOYSTICK)) && (version >= 0x0800))))
-    return FALSE;
+    return S_FALSE;
 
 #ifndef HAVE_STRUCT_FF_EFFECT_DIRECTION
   if (dwFlags & DIEDFL_FORCEFEEDBACK)
-    return FALSE;
+    return S_FALSE;
 #endif
 
   if (!(dwFlags & DIEDFL_FORCEFEEDBACK) || joydevs[id].has_ff) {
     fill_joystick_dideviceinstanceW(lpddi, version, id);
-    return TRUE;
+    return S_OK;
   }
-  return FALSE;
+  return S_FALSE;
 }
 
 static JoystickImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput, unsigned short index)
diff --git a/dlls/dinput/joystick_osx.c b/dlls/dinput/joystick_osx.c
index 40268ad..60db656 100644
--- a/dlls/dinput/joystick_osx.c
+++ b/dlls/dinput/joystick_osx.c
@@ -651,13 +651,13 @@ static INT find_joystick_devices(void)
     return  joystick_devices_count;
 }
 
-static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
+static HRESULT joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
 {
-    if (id >= find_joystick_devices()) return FALSE;
+    if (id >= find_joystick_devices()) return E_FAIL;
 
     if (dwFlags & DIEDFL_FORCEFEEDBACK) {
         WARN("force feedback not supported\n");
-        return FALSE;
+        return S_FALSE;
     }
 
     if ((dwDevType == 0) ||
@@ -679,22 +679,22 @@ static BOOL joydev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
         get_osx_device_name(id, lpddi->tszProductName, MAX_PATH);
 
         lpddi->guidFFDriver = GUID_NULL;
-        return TRUE;
+        return S_OK;
     }
 
-    return FALSE;
+    return S_FALSE;
 }
 
-static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
+static HRESULT joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
 {
     char name[MAX_PATH];
     char friendly[32];
 
-    if (id >= find_joystick_devices()) return FALSE;
+    if (id >= find_joystick_devices()) return E_FAIL;
 
     if (dwFlags & DIEDFL_FORCEFEEDBACK) {
         WARN("force feedback not supported\n");
-        return FALSE;
+        return S_FALSE;
     }
 
     if ((dwDevType == 0) ||
@@ -716,10 +716,10 @@ static BOOL joydev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTAN
 
         MultiByteToWideChar(CP_ACP, 0, name, -1, lpddi->tszProductName, MAX_PATH);
         lpddi->guidFFDriver = GUID_NULL;
-        return TRUE;
+        return S_OK;
     }
 
-    return FALSE;
+    return S_FALSE;
 }
 
 static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index 99697a1..e8e7515 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -184,10 +184,10 @@ static void fill_keyboard_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD ver
     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 HRESULT keyboarddev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
 {
   if (id != 0)
-    return FALSE;
+    return E_FAIL;
 
   if ((dwDevType == 0) ||
       ((dwDevType == DIDEVTYPE_KEYBOARD) && (version < 0x0800)) ||
@@ -196,16 +196,16 @@ static BOOL keyboarddev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEI
  
     fill_keyboard_dideviceinstanceA(lpddi, version);
     
-    return TRUE;
+    return S_OK;
   }
 
-  return FALSE;
+  return S_FALSE;
 }
 
-static BOOL keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
+static HRESULT keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
 {
   if (id != 0)
-    return FALSE;
+    return E_FAIL;
 
   if ((dwDevType == 0) ||
       ((dwDevType == DIDEVTYPE_KEYBOARD) && (version < 0x0800)) ||
@@ -214,10 +214,10 @@ static BOOL keyboarddev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEI
 
     fill_keyboard_dideviceinstanceW(lpddi, version);
     
-    return TRUE;
+    return S_OK;
   }
 
-  return FALSE;
+  return S_FALSE;
 }
 
 static SysKeyboardImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput)
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 4e94d8e..03fc0b0 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -159,10 +159,10 @@ static void fill_mouse_dideviceinstanceW(LPDIDEVICEINSTANCEW lpddi, DWORD versio
     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 HRESULT mousedev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEA lpddi, DWORD version, int id)
 {
     if (id != 0)
-        return FALSE;
+        return E_FAIL;
 
     if ((dwDevType == 0) ||
 	((dwDevType == DIDEVTYPE_MOUSE) && (version < 0x0800)) ||
@@ -171,16 +171,16 @@ static BOOL mousedev_enum_deviceA(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINST
 	
 	fill_mouse_dideviceinstanceA(lpddi, version);
 	
-	return TRUE;
+	return S_OK;
     }
     
-    return FALSE;
+    return S_FALSE;
 }
 
-static BOOL mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
+static HRESULT mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINSTANCEW lpddi, DWORD version, int id)
 {
     if (id != 0)
-        return FALSE;
+        return E_FAIL;
 
     if ((dwDevType == 0) ||
 	((dwDevType == DIDEVTYPE_MOUSE) && (version < 0x0800)) ||
@@ -189,10 +189,10 @@ static BOOL mousedev_enum_deviceW(DWORD dwDevType, DWORD dwFlags, LPDIDEVICEINST
 	
 	fill_mouse_dideviceinstanceW(lpddi, version);
 	
-	return TRUE;
+	return S_OK;
     }
     
-    return FALSE;
+    return S_FALSE;
 }
 
 static SysMouseImpl *alloc_device(REFGUID rguid, IDirectInputImpl *dinput)
-- 
1.8.2.3





More information about the wine-patches mailing list