[PATCH 4/6] dinput: Implement EnumObjects through the internal vtable.
Rémi Bernon
rbernon at codeweavers.com
Fri Oct 15 04:57:42 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at 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 =
--
2.33.0
More information about the wine-devel
mailing list