[PATCH 2/6] dinput: Factor all GetProperty implementations together.
Rémi Bernon
rbernon at codeweavers.com
Tue Oct 19 02:20:02 CDT 2021
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
dlls/dinput/device.c | 128 ++++++++++++++++++++++++-----------
dlls/dinput/device_private.h | 2 +
dlls/dinput/joystick_hid.c | 105 ++++++++--------------------
dlls/dinput/keyboard.c | 58 +++++-----------
dlls/dinput/mouse.c | 85 +++++++----------------
dlls/dinput8/tests/device.c | 35 ----------
dlls/dinput8/tests/hid.c | 1 -
7 files changed, 160 insertions(+), 254 deletions(-)
diff --git a/dlls/dinput/device.c b/dlls/dinput/device.c
index 7a8864a45d2..75ca6676bec 100644
--- a/dlls/dinput/device.c
+++ b/dlls/dinput/device.c
@@ -1186,59 +1186,105 @@ HRESULT WINAPI IDirectInputDevice2WImpl_EnumObjects( IDirectInputDevice8W *iface
return DI_OK;
}
-/******************************************************************************
- * GetProperty
- */
+static BOOL CALLBACK find_object( const DIDEVICEOBJECTINSTANCEW *instance, void *context )
+{
+ *(DIDEVICEOBJECTINSTANCEW *)context = *instance;
+ return DIENUM_STOP;
+}
-HRESULT WINAPI IDirectInputDevice2WImpl_GetProperty(LPDIRECTINPUTDEVICE8W iface, REFGUID rguid, LPDIPROPHEADER pdiph)
+HRESULT WINAPI IDirectInputDevice2WImpl_GetProperty( IDirectInputDevice8W *iface, const GUID *guid,
+ DIPROPHEADER *header )
{
- IDirectInputDeviceImpl *This = impl_from_IDirectInputDevice8W(iface);
+ IDirectInputDeviceImpl *impl = impl_from_IDirectInputDevice8W( iface );
+ DWORD object_mask = DIDFT_AXIS | DIDFT_BUTTON | DIDFT_POV;
+ DIDEVICEOBJECTINSTANCEW instance;
+ HRESULT hr;
- TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(rguid), pdiph);
- _dump_DIPROPHEADER(pdiph);
+ TRACE( "iface %p, guid %s, header %p\n", iface, debugstr_guid( guid ), header );
- if (!IS_DIPROP(rguid)) return DI_OK;
+ if (!header) return DIERR_INVALIDPARAM;
+ if (header->dwHeaderSize != sizeof(DIPROPHEADER)) return DIERR_INVALIDPARAM;
+ if (!IS_DIPROP( guid )) return DI_OK;
- switch (LOWORD(rguid))
+ switch (LOWORD( guid ))
{
- case (DWORD_PTR) DIPROP_BUFFERSIZE:
- {
- LPDIPROPDWORD pd = (LPDIPROPDWORD)pdiph;
-
- if (pdiph->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
+ case (DWORD_PTR)DIPROP_PRODUCTNAME:
+ case (DWORD_PTR)DIPROP_INSTANCENAME:
+ if (header->dwSize != sizeof(DIPROPSTRING)) return DIERR_INVALIDPARAM;
+ if (header->dwHow != DIPH_DEVICE) return DIERR_UNSUPPORTED;
+ return impl->vtbl->get_property( iface, LOWORD( guid ), header, NULL );
+
+ case (DWORD_PTR)DIPROP_VIDPID:
+ case (DWORD_PTR)DIPROP_JOYSTICKID:
+ if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
+ if (header->dwHow != DIPH_DEVICE) return DIERR_UNSUPPORTED;
+ return impl->vtbl->get_property( iface, LOWORD( guid ), header, NULL );
+
+ case (DWORD_PTR)DIPROP_GUIDANDPATH:
+ if (header->dwSize != sizeof(DIPROPGUIDANDPATH)) return DIERR_INVALIDPARAM;
+ if (header->dwHow != DIPH_DEVICE) return DIERR_UNSUPPORTED;
+ return impl->vtbl->get_property( iface, LOWORD( guid ), header, NULL );
+
+ case (DWORD_PTR)DIPROP_RANGE:
+ if (header->dwSize != sizeof(DIPROPRANGE)) return DIERR_INVALIDPARAM;
+ if (header->dwHow == DIPH_DEVICE) return DIERR_UNSUPPORTED;
+ hr = impl->vtbl->enum_objects( iface, header, object_mask, find_object, &instance );
+ if (FAILED(hr)) return hr;
+ if (hr == DIENUM_CONTINUE) return DIERR_NOTFOUND;
+ if (!(instance.dwType & DIDFT_AXIS)) return DIERR_UNSUPPORTED;
+ return impl->vtbl->get_property( iface, LOWORD( guid ), header, &instance );
+
+ case (DWORD_PTR)DIPROP_DEADZONE:
+ case (DWORD_PTR)DIPROP_SATURATION:
+ case (DWORD_PTR)DIPROP_GRANULARITY:
+ if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
+ if (header->dwHow == DIPH_DEVICE) return DIERR_UNSUPPORTED;
+ hr = impl->vtbl->enum_objects( iface, header, object_mask, find_object, &instance );
+ if (FAILED(hr)) return hr;
+ if (hr == DIENUM_CONTINUE) return DIERR_NOTFOUND;
+ if (!(instance.dwType & DIDFT_AXIS)) return DIERR_UNSUPPORTED;
+ return impl->vtbl->get_property( iface, LOWORD( guid ), header, &instance );
- pd->dwData = This->buffersize;
- TRACE("buffersize = %d\n", pd->dwData);
- break;
- }
- case (DWORD_PTR) DIPROP_USERNAME:
- {
- LPDIPROPSTRING ps = (LPDIPROPSTRING)pdiph;
- struct DevicePlayer *device_player;
+ case (DWORD_PTR)DIPROP_KEYNAME:
+ if (header->dwSize != sizeof(DIPROPSTRING)) return DIERR_INVALIDPARAM;
+ hr = impl->vtbl->enum_objects( iface, header, object_mask, find_object, &instance );
+ if (FAILED(hr)) return hr;
+ if (hr == DIENUM_CONTINUE) return DIERR_NOTFOUND;
+ if (!(instance.dwType & DIDFT_BUTTON)) return DIERR_UNSUPPORTED;
+ return impl->vtbl->get_property( iface, LOWORD( guid ), header, &instance );
- if (pdiph->dwSize != sizeof(DIPROPSTRING)) return DIERR_INVALIDPARAM;
+ case (DWORD_PTR)DIPROP_AUTOCENTER:
+ if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
+ return DIERR_UNSUPPORTED;
- LIST_FOR_EACH_ENTRY(device_player, &This->dinput->device_players,
- struct DevicePlayer, entry)
+ case (DWORD_PTR)DIPROP_BUFFERSIZE:
+ {
+ DIPROPDWORD *value = (DIPROPDWORD *)header;
+ if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
+ value->dwData = impl->buffersize;
+ return DI_OK;
+ }
+ case (DWORD_PTR)DIPROP_USERNAME:
+ {
+ DIPROPSTRING *value = (DIPROPSTRING *)header;
+ struct DevicePlayer *device_player;
+ if (header->dwSize != sizeof(DIPROPSTRING)) return DIERR_INVALIDPARAM;
+ LIST_FOR_EACH_ENTRY( device_player, &impl->dinput->device_players, struct DevicePlayer, entry )
+ {
+ if (IsEqualGUID( &device_player->instance_guid, &impl->guid ))
{
- if (IsEqualGUID(&device_player->instance_guid, &This->guid))
- {
- if (*device_player->username)
- {
- lstrcpynW(ps->wsz, device_player->username, ARRAY_SIZE(ps->wsz));
- return DI_OK;
- }
- else break;
- }
+ if (!*device_player->username) break;
+ lstrcpynW( value->wsz, device_player->username, ARRAY_SIZE(value->wsz) );
+ return DI_OK;
}
- return S_FALSE;
}
- case (DWORD_PTR) DIPROP_VIDPID:
- FIXME("DIPROP_VIDPID not implemented\n");
- return DIERR_UNSUPPORTED;
- default:
- FIXME("Unknown property %s\n", debugstr_guid(rguid));
- return DIERR_INVALIDPARAM;
+ return S_FALSE;
+ }
+ case (DWORD_PTR)DIPROP_CALIBRATION:
+ return DIERR_INVALIDPARAM;
+ default:
+ FIXME( "Unknown property %s\n", debugstr_guid( guid ) );
+ return DIERR_UNSUPPORTED;
}
return DI_OK;
diff --git a/dlls/dinput/device_private.h b/dlls/dinput/device_private.h
index 8589eca41e3..e4290e5960b 100644
--- a/dlls/dinput/device_private.h
+++ b/dlls/dinput/device_private.h
@@ -62,6 +62,8 @@ struct dinput_device_vtbl
HRESULT (*unacquire)( IDirectInputDevice8W *iface );
HRESULT (*enum_objects)( IDirectInputDevice8W *iface, const DIPROPHEADER *filter, DWORD flags,
LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context );
+ HRESULT (*get_property)( IDirectInputDevice8W *iface, DWORD property, DIPROPHEADER *header,
+ DIDEVICEOBJECTINSTANCEW *instance );
};
#define DEVICE_STATE_MAX_SIZE 1024
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 9c1f75ec9ee..8c9218cd4e7 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -661,97 +661,56 @@ static ULONG WINAPI hid_joystick_Release( IDirectInputDevice8W *iface )
return ref;
}
-static BOOL get_property_prop_range( struct hid_joystick *impl, struct hid_value_caps *caps,
- DIDEVICEOBJECTINSTANCEW *instance, void *data )
-{
- struct extra_caps *extra = impl->input_extra_caps + instance->dwOfs / sizeof(LONG);
- DIPROPRANGE *value = data;
- value->lMin = extra->range_min;
- value->lMax = extra->range_max;
- return DIENUM_STOP;
-}
-
-static BOOL get_property_prop_deadzone( struct hid_joystick *impl, struct hid_value_caps *caps,
- DIDEVICEOBJECTINSTANCEW *instance, void *data )
-{
- struct extra_caps *extra = impl->input_extra_caps + instance->dwOfs / sizeof(LONG);
- DIPROPDWORD *deadzone = data;
- deadzone->dwData = extra->deadzone;
- return DIENUM_STOP;
-}
-
-static BOOL get_property_prop_saturation( struct hid_joystick *impl, struct hid_value_caps *caps,
- DIDEVICEOBJECTINSTANCEW *instance, void *data )
-{
- struct extra_caps *extra = impl->input_extra_caps + instance->dwOfs / sizeof(LONG);
- DIPROPDWORD *saturation = data;
- saturation->dwData = extra->saturation;
- return DIENUM_STOP;
-}
-
-static BOOL get_property_prop_granularity( struct hid_joystick *impl, struct hid_value_caps *caps,
- DIDEVICEOBJECTINSTANCEW *instance, void *data )
-{
- DIPROPDWORD *granularity = data;
- granularity->dwData = 1;
- return DIENUM_STOP;
-}
-
-static HRESULT WINAPI hid_joystick_GetProperty( IDirectInputDevice8W *iface, const GUID *guid,
- DIPROPHEADER *header )
+static HRESULT hid_joystick_internal_get_property( IDirectInputDevice8W *iface, DWORD property, DIPROPHEADER *header,
+ DIDEVICEOBJECTINSTANCEW *instance )
{
struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface );
+ struct extra_caps *extra = NULL;
- TRACE( "iface %p, guid %s, header %p\n", iface, debugstr_guid( guid ), header );
+ if (instance) extra = impl->input_extra_caps + instance->dwOfs / sizeof(LONG);
- if (!header) return DIERR_INVALIDPARAM;
- if (header->dwHeaderSize != sizeof(DIPROPHEADER)) return DIERR_INVALIDPARAM;
- if (!IS_DIPROP( guid )) return DI_OK;
-
- switch (LOWORD( guid ))
+ switch (property)
{
case (DWORD_PTR)DIPROP_RANGE:
- if (header->dwSize != sizeof(DIPROPRANGE)) return DIERR_INVALIDPARAM;
- if (header->dwHow == DIPH_DEVICE) return DIERR_UNSUPPORTED;
- if (enum_objects( impl, header, DIDFT_AXIS, get_property_prop_range, header ) == DIENUM_STOP)
- return DI_OK;
- return DIERR_NOTFOUND;
+ {
+ DIPROPRANGE *value = (DIPROPRANGE *)header;
+ value->lMin = extra->range_min;
+ value->lMax = extra->range_max;
+ return DI_OK;
+ }
case (DWORD_PTR)DIPROP_DEADZONE:
- if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
- if (header->dwHow == DIPH_DEVICE) return DIERR_UNSUPPORTED;
- if (enum_objects( impl, header, DIDFT_AXIS, get_property_prop_deadzone, header ) == DIENUM_STOP)
- return DI_OK;
- return DIERR_NOTFOUND;
+ {
+ DIPROPDWORD *value = (DIPROPDWORD *)header;
+ value->dwData = extra->deadzone;
+ return DI_OK;
+ }
case (DWORD_PTR)DIPROP_SATURATION:
- if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
- if (header->dwHow == DIPH_DEVICE) return DIERR_UNSUPPORTED;
- if (enum_objects( impl, header, DIDFT_AXIS, get_property_prop_saturation, header ) == DIENUM_STOP)
- return DI_OK;
- return DIERR_NOTFOUND;
+ {
+ DIPROPDWORD *value = (DIPROPDWORD *)header;
+ value->dwData = extra->saturation;
+ return DI_OK;
+ }
case (DWORD_PTR)DIPROP_GRANULARITY:
- if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
- if (header->dwHow == DIPH_DEVICE) return DIERR_UNSUPPORTED;
- if (enum_objects( impl, header, DIDFT_AXIS, get_property_prop_granularity, header ) == DIENUM_STOP)
- return DI_OK;
- return DIERR_NOTFOUND;
+ {
+ DIPROPDWORD *value = (DIPROPDWORD *)header;
+ value->dwData = 1;
+ return DI_OK;
+ }
case (DWORD_PTR)DIPROP_PRODUCTNAME:
{
DIPROPSTRING *value = (DIPROPSTRING *)header;
- if (header->dwSize != sizeof(DIPROPSTRING)) return DIERR_INVALIDPARAM;
lstrcpynW( value->wsz, impl->base.instance.tszProductName, MAX_PATH );
return DI_OK;
}
case (DWORD_PTR)DIPROP_INSTANCENAME:
{
DIPROPSTRING *value = (DIPROPSTRING *)header;
- if (header->dwSize != sizeof(DIPROPSTRING)) return DIERR_INVALIDPARAM;
lstrcpynW( value->wsz, impl->base.instance.tszInstanceName, MAX_PATH );
return DI_OK;
}
case (DWORD_PTR)DIPROP_VIDPID:
{
DIPROPDWORD *value = (DIPROPDWORD *)header;
- if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
if (!impl->attrs.VendorID || !impl->attrs.ProductID) return DIERR_UNSUPPORTED;
value->dwData = MAKELONG( impl->attrs.VendorID, impl->attrs.ProductID );
return DI_OK;
@@ -759,25 +718,18 @@ static HRESULT WINAPI hid_joystick_GetProperty( IDirectInputDevice8W *iface, con
case (DWORD_PTR)DIPROP_JOYSTICKID:
{
DIPROPDWORD *value = (DIPROPDWORD *)header;
- if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
value->dwData = impl->base.instance.guidInstance.Data3;
return DI_OK;
}
case (DWORD_PTR)DIPROP_GUIDANDPATH:
{
DIPROPGUIDANDPATH *value = (DIPROPGUIDANDPATH *)header;
- if (header->dwSize != sizeof(DIPROPGUIDANDPATH)) return DIERR_INVALIDPARAM;
lstrcpynW( value->wszPath, impl->device_path, MAX_PATH );
return DI_OK;
}
- case (DWORD_PTR)DIPROP_AUTOCENTER:
- if (header->dwSize != sizeof(DIPROPDWORD)) return DIERR_INVALIDPARAM;
- return DIERR_UNSUPPORTED;
- default:
- return IDirectInputDevice2WImpl_GetProperty( iface, guid, header );
}
- return DI_OK;
+ return DIERR_UNSUPPORTED;
}
static BOOL set_property_prop_range( struct hid_joystick *impl, struct hid_value_caps *caps,
@@ -1298,7 +1250,7 @@ static const IDirectInputDevice8WVtbl hid_joystick_vtbl =
/*** IDirectInputDevice methods ***/
IDirectInputDevice2WImpl_GetCapabilities,
IDirectInputDevice2WImpl_EnumObjects,
- hid_joystick_GetProperty,
+ IDirectInputDevice2WImpl_GetProperty,
hid_joystick_SetProperty,
IDirectInputDevice2WImpl_Acquire,
IDirectInputDevice2WImpl_Unacquire,
@@ -1551,6 +1503,7 @@ static const struct dinput_device_vtbl hid_joystick_internal_vtbl =
hid_joystick_internal_acquire,
hid_joystick_internal_unacquire,
hid_joystick_internal_enum_objects,
+ hid_joystick_internal_get_property,
};
static DWORD device_type_for_version( DWORD type, DWORD version )
diff --git a/dlls/dinput/keyboard.c b/dlls/dinput/keyboard.c
index 0d1baec3807..bb1102e38eb 100644
--- a/dlls/dinput/keyboard.c
+++ b/dlls/dinput/keyboard.c
@@ -273,46 +273,6 @@ static HRESULT WINAPI SysKeyboardWImpl_GetDeviceState(LPDIRECTINPUTDEVICE8W ifac
return DI_OK;
}
-/******************************************************************************
- * GetProperty : Retrieves information about the input device.
- */
-static HRESULT WINAPI SysKeyboardWImpl_GetProperty(LPDIRECTINPUTDEVICE8W iface,
- REFGUID rguid, LPDIPROPHEADER pdiph)
-{
- SysKeyboardImpl *This = impl_from_IDirectInputDevice8W(iface);
-
- TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(rguid), pdiph);
- _dump_DIPROPHEADER(pdiph);
-
- if (!IS_DIPROP(rguid)) return DI_OK;
-
- switch (LOWORD(rguid))
- {
- case (DWORD_PTR)DIPROP_KEYNAME:
- {
- HRESULT hr;
- LPDIPROPSTRING ps = (LPDIPROPSTRING)pdiph;
- DIDEVICEOBJECTINSTANCEW didoi;
-
- if (pdiph->dwSize != sizeof(DIPROPSTRING))
- return DIERR_INVALIDPARAM;
-
- didoi.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW);
-
- hr = IDirectInputDevice8_GetObjectInfo( iface, &didoi, ps->diph.dwObj, ps->diph.dwHow );
- if (hr == DI_OK)
- memcpy(ps->wsz, didoi.tszName, sizeof(ps->wsz));
- return hr;
- }
- case (DWORD_PTR) DIPROP_VIDPID:
- case (DWORD_PTR) DIPROP_RANGE:
- return DIERR_UNSUPPORTED;
- default:
- return IDirectInputDevice2WImpl_GetProperty( iface, rguid, pdiph );
- }
- return DI_OK;
-}
-
static HRESULT keyboard_internal_acquire( IDirectInputDevice8W *iface )
{
return DI_OK;
@@ -388,12 +348,28 @@ static HRESULT keyboard_internal_enum_objects( IDirectInputDevice8W *iface, cons
return DIENUM_CONTINUE;
}
+static HRESULT keyboard_internal_get_property( IDirectInputDevice8W *iface, DWORD property, DIPROPHEADER *header,
+ DIDEVICEOBJECTINSTANCEW *instance )
+{
+ switch (property)
+ {
+ case (DWORD_PTR)DIPROP_KEYNAME:
+ {
+ DIPROPSTRING *value = (DIPROPSTRING *)header;
+ lstrcpynW( value->wsz, instance->tszName, ARRAY_SIZE(value->wsz) );
+ return DI_OK;
+ }
+ }
+ return DIERR_UNSUPPORTED;
+}
+
static const struct dinput_device_vtbl keyboard_internal_vtbl =
{
NULL,
keyboard_internal_acquire,
keyboard_internal_unacquire,
keyboard_internal_enum_objects,
+ keyboard_internal_get_property,
};
static const IDirectInputDevice8WVtbl SysKeyboardWvt =
@@ -403,7 +379,7 @@ static const IDirectInputDevice8WVtbl SysKeyboardWvt =
IDirectInputDevice2WImpl_Release,
IDirectInputDevice2WImpl_GetCapabilities,
IDirectInputDevice2WImpl_EnumObjects,
- SysKeyboardWImpl_GetProperty,
+ IDirectInputDevice2WImpl_GetProperty,
IDirectInputDevice2WImpl_SetProperty,
IDirectInputDevice2WImpl_Acquire,
IDirectInputDevice2WImpl_Unacquire,
diff --git a/dlls/dinput/mouse.c b/dlls/dinput/mouse.c
index 23570e1f906..f6aedda080a 100644
--- a/dlls/dinput/mouse.c
+++ b/dlls/dinput/mouse.c
@@ -495,65 +495,6 @@ static HRESULT WINAPI SysMouseWImpl_GetDeviceData(LPDIRECTINPUTDEVICE8W iface,
return res;
}
-/******************************************************************************
- * GetProperty : get input device properties
- */
-static HRESULT WINAPI SysMouseWImpl_GetProperty(LPDIRECTINPUTDEVICE8W iface, REFGUID rguid, LPDIPROPHEADER pdiph)
-{
- SysMouseImpl *This = impl_from_IDirectInputDevice8W(iface);
-
- TRACE("(%p) %s,%p\n", This, debugstr_guid(rguid), pdiph);
- _dump_DIPROPHEADER(pdiph);
-
- if (IS_DIPROP(rguid)) {
- switch (LOWORD(rguid)) {
- case (DWORD_PTR) DIPROP_GRANULARITY: {
- LPDIPROPDWORD pr = (LPDIPROPDWORD) pdiph;
-
- if (
- ((pdiph->dwHow == DIPH_BYOFFSET) &&
- ((pdiph->dwObj == DIMOFS_X) ||
- (pdiph->dwObj == DIMOFS_Y)))
- ||
- ((pdiph->dwHow == DIPH_BYID) &&
- ((pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS)) ||
- (pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS))))
- ){
- /* Set granularity of X/Y Axis to 1. See MSDN on DIPROP_GRANULARITY */
- pr->dwData = 1;
- } else {
- /* We'll just assume that the app asks about the Z axis */
- pr->dwData = WHEEL_DELTA;
- }
-
- break;
- }
-
- case (DWORD_PTR) DIPROP_RANGE: {
- LPDIPROPRANGE pr = (LPDIPROPRANGE) pdiph;
-
- if ((pdiph->dwHow == DIPH_BYID) &&
- ((pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_X_AXIS_INSTANCE) | DIDFT_RELAXIS)) ||
- (pdiph->dwObj == (DIDFT_MAKEINSTANCE(WINE_MOUSE_Y_AXIS_INSTANCE) | DIDFT_RELAXIS)))) {
- /* Querying the range of either the X or the Y axis. As I do
- not know the range, do as if the range were
- unrestricted...*/
- pr->lMin = DIPROPRANGE_NOMIN;
- pr->lMax = DIPROPRANGE_NOMAX;
- }
-
- break;
- }
- case (DWORD_PTR) DIPROP_VIDPID:
- return DIERR_UNSUPPORTED;
- default:
- return IDirectInputDevice2WImpl_GetProperty(iface, rguid, pdiph);
- }
- }
-
- return DI_OK;
-}
-
static HRESULT mouse_internal_acquire( IDirectInputDevice8W *iface )
{
SysMouseImpl *impl = impl_from_IDirectInputDevice8W( iface );
@@ -731,12 +672,36 @@ static HRESULT mouse_internal_enum_objects( IDirectInputDevice8W *iface, const D
return DIENUM_CONTINUE;
}
+static HRESULT mouse_internal_get_property( IDirectInputDevice8W *iface, DWORD property, DIPROPHEADER *header,
+ DIDEVICEOBJECTINSTANCEW *instance )
+{
+ switch (property)
+ {
+ case (DWORD_PTR)DIPROP_RANGE:
+ {
+ DIPROPRANGE *range = (DIPROPRANGE *)header;
+ range->lMin = DIPROPRANGE_NOMIN;
+ range->lMax = DIPROPRANGE_NOMAX;
+ return DI_OK;
+ }
+ case (DWORD_PTR)DIPROP_GRANULARITY:
+ {
+ DIPROPDWORD *value = (DIPROPDWORD *)header;
+ if (instance->dwType == DIMOFS_Z) value->dwData = WHEEL_DELTA;
+ else value->dwData = 1;
+ return DI_OK;
+ }
+ }
+ return DIERR_UNSUPPORTED;
+}
+
static const struct dinput_device_vtbl mouse_internal_vtbl =
{
NULL,
mouse_internal_acquire,
mouse_internal_unacquire,
mouse_internal_enum_objects,
+ mouse_internal_get_property,
};
static const IDirectInputDevice8WVtbl SysMouseWvt =
@@ -746,7 +711,7 @@ static const IDirectInputDevice8WVtbl SysMouseWvt =
IDirectInputDevice2WImpl_Release,
IDirectInputDevice2WImpl_GetCapabilities,
IDirectInputDevice2WImpl_EnumObjects,
- SysMouseWImpl_GetProperty,
+ IDirectInputDevice2WImpl_GetProperty,
IDirectInputDevice2WImpl_SetProperty,
IDirectInputDevice2WImpl_Acquire,
IDirectInputDevice2WImpl_Unacquire,
diff --git a/dlls/dinput8/tests/device.c b/dlls/dinput8/tests/device.c
index c6cf5867657..9f331c1b84c 100644
--- a/dlls/dinput8/tests/device.c
+++ b/dlls/dinput8/tests/device.c
@@ -1291,18 +1291,14 @@ static void test_mouse_info(void)
prop_dword.diph.dwHow = DIPH_BYOFFSET;
prop_dword.diph.dwObj = DIMOFS_X;
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
prop_range.diph.dwHow = DIPH_BYOFFSET;
prop_range.diph.dwObj = DIMOFS_X;
hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
- todo_wine
ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_RANGE returned %#x\n", hr );
prop_dword.diph.dwHow = DIPH_DEVICE;
@@ -1340,44 +1336,34 @@ static void test_mouse_info(void)
hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, &prop_dword.diph );
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GUIDANDPATH, &prop_guid_path.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GUIDANDPATH returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_INSTANCENAME, &prop_string.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_INSTANCENAME returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_PRODUCTNAME, &prop_string.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_PRODUCTNAME returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_TYPENAME, &prop_string.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_TYPENAME returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_USERNAME, &prop_string.diph );
ok( hr == S_FALSE, "GetProperty DIPROP_USERNAME returned %#x\n", hr );
ok( !wcscmp( prop_string.wsz, L"" ), "got user %s\n", debugstr_w(prop_string.wsz) );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_JOYSTICKID, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_CALIBRATION, &prop_dword.diph );
ok( hr == DIERR_INVALIDPARAM, "GetProperty DIPROP_CALIBRATION returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_AUTOCENTER, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_AUTOCENTER returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFLOAD, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_FFLOAD returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
prop_dword.diph.dwHow = DIPH_BYUSAGE;
prop_dword.diph.dwObj = MAKELONG( HID_USAGE_GENERIC_X, HID_USAGE_PAGE_GENERIC );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
prop_dword.diph.dwHow = DIPH_BYOFFSET;
@@ -1387,18 +1373,14 @@ static void test_mouse_info(void)
ok( hr == DI_OK, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
ok( prop_dword.dwData == 1, "got %d expected 1\n", prop_dword.dwData );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
prop_range.lMin = 0xdeadbeef;
prop_range.lMax = 0xdeadbeef;
hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
ok( hr == DI_OK, "GetProperty DIPROP_RANGE returned %#x\n", hr );
- todo_wine
ok( prop_range.lMin == DIPROPRANGE_NOMIN, "got %d expected %d\n", prop_range.lMin, DIPROPRANGE_NOMIN );
- todo_wine
ok( prop_range.lMax == DIPROPRANGE_NOMAX, "got %d expected %d\n", prop_range.lMax, DIPROPRANGE_NOMAX );
res = 0;
@@ -1632,18 +1614,14 @@ static void test_keyboard_info(void)
prop_dword.diph.dwHow = DIPH_BYOFFSET;
prop_dword.diph.dwObj = 1;
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
prop_range.diph.dwHow = DIPH_BYOFFSET;
prop_range.diph.dwObj = 1;
hr = IDirectInputDevice8_GetProperty( device, DIPROP_RANGE, &prop_range.diph );
- todo_wine
ok( hr == DIERR_NOTFOUND, "GetProperty DIPROP_RANGE returned %#x\n", hr );
prop_dword.diph.dwHow = DIPH_DEVICE;
@@ -1681,56 +1659,43 @@ static void test_keyboard_info(void)
hr = IDirectInputDevice8_GetProperty( device, DIPROP_VIDPID, &prop_dword.diph );
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GUIDANDPATH, &prop_guid_path.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GUIDANDPATH returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_INSTANCENAME, &prop_string.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_INSTANCENAME returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_PRODUCTNAME, &prop_string.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_PRODUCTNAME returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_TYPENAME, &prop_string.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_TYPENAME returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_USERNAME, &prop_string.diph );
ok( hr == S_FALSE, "GetProperty DIPROP_USERNAME returned %#x\n", hr );
ok( !wcscmp( prop_string.wsz, L"" ), "got user %s\n", debugstr_w(prop_string.wsz) );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_JOYSTICKID, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_VIDPID returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_CALIBRATION, &prop_dword.diph );
ok( hr == DIERR_INVALIDPARAM, "GetProperty DIPROP_CALIBRATION returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_AUTOCENTER, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_AUTOCENTER returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFLOAD, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_FFLOAD returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
prop_dword.diph.dwHow = DIPH_BYUSAGE;
prop_dword.diph.dwObj = MAKELONG( HID_USAGE_KEYBOARD_LCTRL, HID_USAGE_PAGE_KEYBOARD );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
prop_dword.diph.dwHow = DIPH_BYOFFSET;
prop_dword.diph.dwObj = 1;
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_SATURATION, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_SATURATION returned %#x\n", hr );
prop_range.diph.dwHow = DIPH_BYOFFSET;
prop_range.diph.dwObj = 1;
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index 8fda1289843..8bb463b2fd7 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -4004,7 +4004,6 @@ static void test_simple_joystick(void)
hr = IDirectInputDevice8_GetProperty( device, DIPROP_DEADZONE, &prop_dword.diph );
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_DEADZONE returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_FFLOAD, &prop_dword.diph );
- todo_wine
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_FFLOAD returned %#x\n", hr );
hr = IDirectInputDevice8_GetProperty( device, DIPROP_GRANULARITY, &prop_dword.diph );
ok( hr == DIERR_UNSUPPORTED, "GetProperty DIPROP_GRANULARITY returned %#x\n", hr );
--
2.33.0
More information about the wine-devel
mailing list