[PATCH 09/11] dinput: Implement IDirectInputJoyConfig8_GetConfig with EnumDevices.

Rémi Bernon rbernon at codeweavers.com
Mon Nov 15 03:00:28 CST 2021


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/dinput/dinput_main.c | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index f53a1b502e9..f2526f25972 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -926,12 +926,24 @@ static HRESULT WINAPI JoyConfig8Impl_DeleteType(IDirectInputJoyConfig8 *iface, L
     return E_NOTIMPL;
 }
 
+struct find_device_from_index_params
+{
+    UINT index;
+    DIDEVICEINSTANCEW instance;
+};
+
+static BOOL CALLBACK find_device_from_index( const DIDEVICEINSTANCEW *instance, void *context )
+{
+    struct find_device_from_index_params *params = context;
+    params->instance = *instance;
+    if (!params->index--) return DIENUM_STOP;
+    return DIENUM_CONTINUE;
+}
+
 static HRESULT WINAPI JoyConfig8Impl_GetConfig(IDirectInputJoyConfig8 *iface, UINT id, LPDIJOYCONFIG info, DWORD flags)
 {
-    DIDEVICEINSTANCEW instance = {.dwSize = sizeof(DIDEVICEINSTANCEW)};
     IDirectInputImpl *di = impl_from_IDirectInputJoyConfig8(iface);
-    unsigned int i = 0;
-    UINT found = 0;
+    struct find_device_from_index_params params = {.index = id};
     HRESULT hr;
 
     FIXME("(%p)->(%d, %p, 0x%08x): semi-stub!\n", iface, id, info, flags);
@@ -943,16 +955,11 @@ static HRESULT WINAPI JoyConfig8Impl_GetConfig(IDirectInputJoyConfig8 *iface, UI
     X(DIJC_CALLOUT)
 #undef X
 
-    do
-    {
-        hr = hid_joystick_enum_device( DI8DEVCLASS_GAMECTRL, 0, &instance, di->dwVersion, i++ );
-        if (hr != DI_OK) continue;
-        if (flags & DIJC_GUIDINSTANCE) info->guidInstance = instance.guidInstance;
-        /* Only take into account the chosen id */
-        if (found++ == id) return DI_OK;
-    } while (SUCCEEDED(hr));
-
-    return DIERR_NOMOREITEMS;
+    hr = IDirectInput8_EnumDevices( &di->IDirectInput8W_iface, DI8DEVCLASS_GAMECTRL, find_device_from_index, &params, 0 );
+    if (FAILED(hr)) return hr;
+    if (params.index != ~0) return DIERR_NOMOREITEMS;
+    if (flags & DIJC_GUIDINSTANCE) info->guidInstance = params.instance.guidInstance;
+    return DI_OK;
 }
 
 static HRESULT WINAPI JoyConfig8Impl_SetConfig(IDirectInputJoyConfig8 *iface, UINT id, LPCDIJOYCONFIG info, DWORD flags)
-- 
2.33.1




More information about the wine-devel mailing list