Rémi Bernon : dinput: Implement EnumDevicesBySemantics with EnumDevices.
Alexandre Julliard
julliard at winehq.org
Tue Nov 16 16:32:26 CST 2021
Module: wine
Branch: master
Commit: fb4c45c5daad5e98cfd29ab21422ba6a2b16534e
URL: https://source.winehq.org/git/wine.git/?a=commit;h=fb4c45c5daad5e98cfd29ab21422ba6a2b16534e
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Tue Nov 16 08:23:41 2021 +0100
dinput: Implement EnumDevicesBySemantics with EnumDevices.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dinput/dinput_main.c | 58 +++++++++++++++++++++++++++++++----------------
1 file changed, 39 insertions(+), 19 deletions(-)
diff --git a/dlls/dinput/dinput_main.c b/dlls/dinput/dinput_main.c
index f2526f25972..4a6bca7d77f 100644
--- a/dlls/dinput/dinput_main.c
+++ b/dlls/dinput/dinput_main.c
@@ -751,42 +751,62 @@ static BOOL should_enumerate_device(const WCHAR *username, DWORD dwFlags,
return should_enumerate;
}
+struct enum_device_by_semantics_params
+{
+ IDirectInput8W *iface;
+ const WCHAR *username;
+ DWORD flags;
+
+ DIDEVICEINSTANCEW *instances;
+ DWORD instance_count;
+};
+
+static BOOL CALLBACK enum_device_by_semantics( const DIDEVICEINSTANCEW *instance, void *context )
+{
+ struct enum_device_by_semantics_params *params = context;
+ IDirectInputImpl *This = impl_from_IDirectInput8W( params->iface );
+
+ if (should_enumerate_device( params->username, params->flags, &This->device_players, &instance->guidInstance ))
+ {
+ params->instance_count++;
+ params->instances = realloc( params->instances, sizeof(DIDEVICEINSTANCEW) * params->instance_count );
+ params->instances[params->instance_count - 1] = *instance;
+ }
+
+ return DIENUM_CONTINUE;
+}
+
static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
LPDIRECTINPUT8W iface, LPCWSTR ptszUserName, LPDIACTIONFORMATW lpdiActionFormat,
LPDIENUMDEVICESBYSEMANTICSCBW lpCallback,
LPVOID pvRef, DWORD dwFlags
)
{
+ struct enum_device_by_semantics_params params = {.iface = iface, .username = ptszUserName, .flags = dwFlags};
+ DWORD callbackFlags, enum_flags = DIEDFL_ATTACHEDONLY | (dwFlags & DIEDFL_FORCEFEEDBACK);
static REFGUID guids[2] = { &GUID_SysKeyboard, &GUID_SysMouse };
static const DWORD actionMasks[] = { DIKEYBOARD_MASK, DIMOUSE_MASK };
IDirectInputImpl *This = impl_from_IDirectInput8W(iface);
DIDEVICEINSTANCEW didevi;
LPDIRECTINPUTDEVICE8W lpdid;
- DWORD callbackFlags;
unsigned int i = 0;
HRESULT hr;
- int device_count = 0;
int remain;
- DIDEVICEINSTANCEW *didevis = 0;
FIXME("(this=%p,%s,%p,%p,%p,%04x): semi-stub\n", This, debugstr_w(ptszUserName), lpdiActionFormat,
lpCallback, pvRef, dwFlags);
didevi.dwSize = sizeof(didevi);
- do
+ hr = IDirectInput8_EnumDevices( &This->IDirectInput8W_iface, DI8DEVCLASS_GAMECTRL,
+ enum_device_by_semantics, ¶ms, enum_flags );
+ if (FAILED(hr))
{
- hr = hid_joystick_enum_device( DI8DEVCLASS_GAMECTRL, DIEDFL_ATTACHEDONLY | dwFlags, &didevi, This->dwVersion, i++ );
- if (hr != DI_OK) continue;
- if (should_enumerate_device( ptszUserName, dwFlags, &This->device_players, &didevi.guidInstance ))
- {
- device_count++;
- didevis = realloc( didevis, sizeof(DIDEVICEINSTANCEW) * device_count );
- didevis[device_count - 1] = didevi;
- }
- } while (SUCCEEDED(hr));
+ free( params.instances );
+ return hr;
+ }
- remain = device_count;
+ remain = params.instance_count;
/* Add keyboard and mouse to remaining device count */
if (!(dwFlags & DIEDBSFL_FORCEFEEDBACK))
{
@@ -797,21 +817,21 @@ static HRESULT WINAPI IDirectInput8WImpl_EnumDevicesBySemantics(
}
}
- for (i = 0; i < device_count; i++)
+ for (i = 0; i < params.instance_count; i++)
{
callbackFlags = diactionformat_priorityW(lpdiActionFormat, lpdiActionFormat->dwGenre);
- IDirectInput_CreateDevice(iface, &didevis[i].guidInstance, &lpdid, NULL);
+ IDirectInput_CreateDevice( iface, ¶ms.instances[i].guidInstance, &lpdid, NULL );
- if (lpCallback(&didevis[i], lpdid, callbackFlags, --remain, pvRef) == DIENUM_STOP)
+ if (lpCallback( ¶ms.instances[i], lpdid, callbackFlags, --remain, pvRef ) == DIENUM_STOP)
{
- free( didevis );
+ free( params.instances );
IDirectInputDevice_Release(lpdid);
return DI_OK;
}
IDirectInputDevice_Release(lpdid);
}
- free( didevis );
+ free( params.instances );
if (dwFlags & DIEDBSFL_FORCEFEEDBACK) return DI_OK;
More information about the wine-cvs
mailing list