Signed-off-by: Rémi Bernon rbernon@codeweavers.com --- dlls/dinput/device.c | 77 ++++++++++++++++++++++++--------- dlls/dinput/device_private.h | 8 ++-- dlls/dinput/joystick_hid.c | 84 ++++++++++-------------------------- dlls/dinput/keyboard.c | 1 + dlls/dinput/mouse.c | 1 + 5 files changed, 87 insertions(+), 84 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c index 03c10c7360f..bee9ac8ab45 100644 --- a/dlls/dinput/device.c +++ b/dlls/dinput/device.c @@ -1140,33 +1140,70 @@ ULONG WINAPI IDirectInputDevice2WImpl_AddRef(LPDIRECTINPUTDEVICE8W iface) return ref; }
-HRESULT WINAPI IDirectInputDevice2WImpl_EnumObjects(LPDIRECTINPUTDEVICE8W iface, - LPDIENUMDEVICEOBJECTSCALLBACKW lpCallback, LPVOID lpvRef, DWORD dwFlags) +HRESULT WINAPI IDirectInputDevice2WImpl_EnumObjects( IDirectInputDevice8W *iface, LPDIENUMDEVICEOBJECTSCALLBACKW callback, + void *context, DWORD flags ) { - IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface); - DIDEVICEOBJECTINSTANCEW ddoi; - int i; - - TRACE("(%p)->(%p,%p flags:%08x)\n", This, lpCallback, lpvRef, dwFlags); - TRACE(" - flags = "); - _dump_EnumObjects_flags(dwFlags); - TRACE("\n"); + static const DIPROPHEADER filter = + { + .dwSize = sizeof(filter), + .dwHeaderSize = sizeof(filter), + .dwHow = DIPH_DEVICE, + }; + struct IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8W( iface ); + HRESULT hr;
- if (!lpCallback) return DIERR_INVALIDPARAM; + TRACE( "iface %p, callback %p, context %p, flags %#x.\n", iface, callback, context, flags );
- /* Only the fields till dwFFMaxForce are relevant */ - memset(&ddoi, 0, sizeof(ddoi)); - ddoi.dwSize = FIELD_OFFSET(DIDEVICEOBJECTINSTANCEW, dwFFMaxForce); + if (!callback) return DIERR_INVALIDPARAM; + if (flags & ~(DIDFT_AXIS | DIDFT_POV | DIDFT_BUTTON | DIDFT_NODATA | DIDFT_COLLECTION)) + return DIERR_INVALIDPARAM;
- for (i = 0; i < This->data_format.wine_df->dwNumObjs; i++) + if (!impl->vtbl->enum_objects) { - LPDIOBJECTDATAFORMAT odf = dataformat_to_odf(This->data_format.wine_df, i); + DIDEVICEOBJECTINSTANCEW ddoi; + DWORD i; + + /* Only the fields till dwFFMaxForce are relevant */ + memset( &ddoi, 0, sizeof(ddoi) ); + ddoi.dwSize = FIELD_OFFSET( DIDEVICEOBJECTINSTANCEW, dwFFMaxForce );
- if (dwFlags != DIDFT_ALL && !(dwFlags & DIDFT_GETTYPE(odf->dwType))) continue; - if (IDirectInputDevice_GetObjectInfo(iface, &ddoi, odf->dwType, DIPH_BYID) != DI_OK) - continue; + for (i = 0; i < impl->data_format.wine_df->dwNumObjs; i++) + { + LPDIOBJECTDATAFORMAT odf = dataformat_to_odf( impl->data_format.wine_df, i ); + + if (flags != DIDFT_ALL && !(flags & DIDFT_GETTYPE( odf->dwType ))) continue; + if (IDirectInputDevice_GetObjectInfo( iface, &ddoi, odf->dwType, DIPH_BYID ) != DI_OK) + continue;
- if (lpCallback(&ddoi, lpvRef) != DIENUM_CONTINUE) break; + if (callback( &ddoi, context ) != DIENUM_CONTINUE) break; + } + + return DI_OK; + } + + if (flags == DIDFT_ALL || (flags & DIDFT_AXIS)) + { + hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_AXIS, callback, context ); + if (FAILED(hr)) return hr; + if (hr != DIENUM_CONTINUE) return DI_OK; + } + if (flags == DIDFT_ALL || (flags & DIDFT_POV)) + { + hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_POV, callback, context ); + if (FAILED(hr)) return hr; + if (hr != DIENUM_CONTINUE) return DI_OK; + } + if (flags == DIDFT_ALL || (flags & DIDFT_BUTTON)) + { + hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_BUTTON, callback, context ); + if (FAILED(hr)) return hr; + if (hr != DIENUM_CONTINUE) return DI_OK; + } + if (flags == DIDFT_ALL || (flags & (DIDFT_NODATA | DIDFT_COLLECTION))) + { + hr = impl->vtbl->enum_objects( iface, &filter, DIDFT_NODATA, callback, context ); + if (FAILED(hr)) return hr; + if (hr != DIENUM_CONTINUE) return DI_OK; }
return DI_OK; diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h index 43629abdb15..8589eca41e3 100644 --- a/dlls/dinput/device_private.h +++ b/dlls/dinput/device_private.h @@ -57,9 +57,11 @@ typedef HRESULT dinput_device_read_state( IDirectInputDevice8W *iface );
struct dinput_device_vtbl { - HRESULT (*read)(IDirectInputDevice8W *); - HRESULT (*acquire)(IDirectInputDevice8W *); - HRESULT (*unacquire)(IDirectInputDevice8W *); + HRESULT (*read)( IDirectInputDevice8W *iface ); + HRESULT (*acquire)( IDirectInputDevice8W *iface ); + HRESULT (*unacquire)( IDirectInputDevice8W *iface ); + HRESULT (*enum_objects)( IDirectInputDevice8W *iface, const DIPROPHEADER *filter, DWORD flags, + LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context ); };
#define DEVICE_STATE_MAX_SIZE 1024 diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c index b6eeb772fcf..89ad70cbf19 100644 --- a/dlls/dinput/joystick_hid.c +++ b/dlls/dinput/joystick_hid.c @@ -656,66 +656,6 @@ static ULONG WINAPI hid_joystick_Release( IDirectInputDevice8W *iface ) return ref; }
-struct enum_objects_params -{ - LPDIENUMDEVICEOBJECTSCALLBACKW callback; - void *context; -}; - -static BOOL enum_objects_callback( struct hid_joystick *impl, struct hid_value_caps *caps, - DIDEVICEOBJECTINSTANCEW *instance, void *data ) -{ - struct enum_objects_params *params = data; - return params->callback( instance, params->context ); -} - -static HRESULT WINAPI hid_joystick_EnumObjects( IDirectInputDevice8W *iface, LPDIENUMDEVICEOBJECTSCALLBACKW callback, - void *context, DWORD flags ) -{ - static const DIPROPHEADER filter = - { - .dwSize = sizeof(filter), - .dwHeaderSize = sizeof(filter), - .dwHow = DIPH_DEVICE, - }; - struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface ); - struct enum_objects_params params = - { - .callback = callback, - .context = context, - }; - BOOL ret; - - TRACE( "iface %p, callback %p, context %p, flags %#x.\n", iface, callback, context, flags ); - - if (!callback) return DIERR_INVALIDPARAM; - if (flags & ~(DIDFT_AXIS | DIDFT_POV | DIDFT_BUTTON | DIDFT_NODATA | DIDFT_COLLECTION)) - return DIERR_INVALIDPARAM; - - if (flags == DIDFT_ALL || (flags & DIDFT_AXIS)) - { - ret = enum_objects( impl, &filter, DIDFT_AXIS, enum_objects_callback, ¶ms ); - if (ret != DIENUM_CONTINUE) return DI_OK; - } - if (flags == DIDFT_ALL || (flags & DIDFT_POV)) - { - ret = enum_objects( impl, &filter, DIDFT_POV, enum_objects_callback, ¶ms ); - if (ret != DIENUM_CONTINUE) return DI_OK; - } - if (flags == DIDFT_ALL || (flags & DIDFT_BUTTON)) - { - ret = enum_objects( impl, &filter, DIDFT_BUTTON, enum_objects_callback, ¶ms ); - if (ret != DIENUM_CONTINUE) return DI_OK; - } - if (flags == DIDFT_ALL || (flags & (DIDFT_NODATA | DIDFT_COLLECTION))) - { - ret = enum_objects( impl, &filter, DIDFT_NODATA, enum_objects_callback, ¶ms ); - if (ret != DIENUM_CONTINUE) return DI_OK; - } - - return DI_OK; -} - static BOOL get_property_prop_range( struct hid_joystick *impl, struct hid_value_caps *caps, DIDEVICEOBJECTINSTANCEW *instance, void *data ) { @@ -1392,7 +1332,7 @@ static const IDirectInputDevice8WVtbl hid_joystick_vtbl = hid_joystick_Release, /*** IDirectInputDevice methods ***/ IDirectInputDevice2WImpl_GetCapabilities, - hid_joystick_EnumObjects, + IDirectInputDevice2WImpl_EnumObjects, hid_joystick_GetProperty, hid_joystick_SetProperty, IDirectInputDevice2WImpl_Acquire, @@ -1616,11 +1556,33 @@ static HRESULT hid_joystick_internal_read( IDirectInputDevice8W *iface ) return hr; }
+struct enum_objects_params +{ + LPDIENUMDEVICEOBJECTSCALLBACKW callback; + void *context; +}; + +static BOOL enum_objects_callback( struct hid_joystick *impl, struct hid_value_caps *caps, + DIDEVICEOBJECTINSTANCEW *instance, void *data ) +{ + struct enum_objects_params *params = data; + return params->callback( instance, params->context ); +} + +static HRESULT hid_joystick_internal_enum_objects( IDirectInputDevice8W *iface, const DIPROPHEADER *filter, DWORD flags, + LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context ) +{ + struct enum_objects_params params = {.callback = callback, .context = context}; + struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface ); + return enum_objects( impl, filter, flags, enum_objects_callback, ¶ms ); +} + static const struct dinput_device_vtbl hid_joystick_internal_vtbl = { hid_joystick_internal_read, hid_joystick_internal_acquire, hid_joystick_internal_unacquire, + hid_joystick_internal_enum_objects, };
static DWORD device_type_for_version( DWORD type, DWORD version ) diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c index 138b8439374..a296ebc98ce 100644 --- a/dlls/dinput/keyboard.c +++ b/dlls/dinput/keyboard.c @@ -412,6 +412,7 @@ static const struct dinput_device_vtbl keyboard_internal_vtbl = NULL, keyboard_internal_acquire, keyboard_internal_unacquire, + NULL, };
static const IDirectInputDevice8WVtbl SysKeyboardWvt = diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c index 20a4ab9af40..ea3fcbb5581 100644 --- a/dlls/dinput/mouse.c +++ b/dlls/dinput/mouse.c @@ -668,6 +668,7 @@ static const struct dinput_device_vtbl mouse_internal_vtbl = NULL, mouse_internal_acquire, mouse_internal_unacquire, + NULL, };
static const IDirectInputDevice8WVtbl SysMouseWvt =