[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, ¶ms, 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