dinput: Move SetProperty implementation to the generic device.

Signed-off-by: Rémi Bernon <rbernon@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Rémi Bernon 2021-11-18 09:53:16 +01:00 committed by Alexandre Julliard
parent 801bc147f0
commit 3834eaf9bd
5 changed files with 40 additions and 70 deletions

View File

@ -1143,8 +1143,35 @@ static BOOL CALLBACK set_object_property( const DIDEVICEOBJECTINSTANCEW *instanc
{ {
struct set_object_property_params *params = context; struct set_object_property_params *params = context;
struct dinput_device *impl = impl_from_IDirectInputDevice8W( params->iface ); struct dinput_device *impl = impl_from_IDirectInputDevice8W( params->iface );
impl->vtbl->set_property( params->iface, params->property, params->header, instance ); struct object_properties *properties = NULL;
return DIENUM_CONTINUE;
if (!impl->object_properties) return DIENUM_STOP;
properties = impl->object_properties + instance->dwOfs / sizeof(LONG);
switch (params->property)
{
case (DWORD_PTR)DIPROP_RANGE:
{
const DIPROPRANGE *value = (const DIPROPRANGE *)params->header;
properties->range_min = value->lMin;
properties->range_max = value->lMax;
return DIENUM_CONTINUE;
}
case (DWORD_PTR)DIPROP_DEADZONE:
{
const DIPROPDWORD *value = (const DIPROPDWORD *)params->header;
properties->deadzone = value->dwData;
return DIENUM_CONTINUE;
}
case (DWORD_PTR)DIPROP_SATURATION:
{
const DIPROPDWORD *value = (const DIPROPDWORD *)params->header;
properties->saturation = value->dwData;
return DIENUM_CONTINUE;
}
}
return DIENUM_STOP;
} }
static BOOL CALLBACK reset_object_value( const DIDEVICEOBJECTINSTANCEW *instance, void *context ) static BOOL CALLBACK reset_object_value( const DIDEVICEOBJECTINSTANCEW *instance, void *context )

View File

@ -45,8 +45,6 @@ struct dinput_device_vtbl
LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context ); LPDIENUMDEVICEOBJECTSCALLBACKW callback, void *context );
HRESULT (*get_property)( IDirectInputDevice8W *iface, DWORD property, DIPROPHEADER *header, HRESULT (*get_property)( IDirectInputDevice8W *iface, DWORD property, DIPROPHEADER *header,
DIDEVICEOBJECTINSTANCEW *instance ); DIDEVICEOBJECTINSTANCEW *instance );
HRESULT (*set_property)( IDirectInputDevice8W *iface, DWORD property, const DIPROPHEADER *header,
const DIDEVICEOBJECTINSTANCEW *instance );
HRESULT (*get_effect_info)( IDirectInputDevice8W *iface, DIEFFECTINFOW *info, const GUID *guid ); HRESULT (*get_effect_info)( IDirectInputDevice8W *iface, DIEFFECTINFOW *info, const GUID *guid );
HRESULT (*create_effect)( IDirectInputDevice8W *iface, IDirectInputEffect **out ); HRESULT (*create_effect)( IDirectInputDevice8W *iface, IDirectInputEffect **out );
HRESULT (*send_force_feedback_command)( IDirectInputDevice8W *iface, DWORD command, BOOL unacquire ); HRESULT (*send_force_feedback_command)( IDirectInputDevice8W *iface, DWORD command, BOOL unacquire );

View File

@ -780,22 +780,6 @@ static HRESULT hid_joystick_get_property( IDirectInputDevice8W *iface, DWORD pro
return DIERR_UNSUPPORTED; return DIERR_UNSUPPORTED;
} }
static void set_extra_caps_range( struct hid_joystick *impl, const DIDEVICEOBJECTINSTANCEW *instance,
LONG min, LONG max )
{
struct object_properties *properties = impl->base.object_properties + instance->dwOfs / sizeof(LONG);
LONG tmp;
properties->range_min = min;
properties->range_max = max;
if (instance->dwType & DIDFT_POV)
{
tmp = properties->logical_max - properties->logical_min;
if (tmp > 0) properties->range_max -= max / (tmp + 1);
}
}
static HRESULT hid_joystick_send_device_gain( IDirectInputDevice8W *iface, LONG device_gain ) static HRESULT hid_joystick_send_device_gain( IDirectInputDevice8W *iface, LONG device_gain )
{ {
struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface ); struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface );
@ -817,39 +801,6 @@ static HRESULT hid_joystick_send_device_gain( IDirectInputDevice8W *iface, LONG
return DI_OK; return DI_OK;
} }
static HRESULT hid_joystick_set_property( IDirectInputDevice8W *iface, DWORD property,
const DIPROPHEADER *header, const DIDEVICEOBJECTINSTANCEW *instance )
{
struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface );
struct object_properties *properties = NULL;
if (instance) properties = impl->base.object_properties + instance->dwOfs / sizeof(LONG);
switch (property)
{
case (DWORD_PTR)DIPROP_RANGE:
{
const DIPROPRANGE *value = (const DIPROPRANGE *)header;
set_extra_caps_range( impl, instance, value->lMin, value->lMax );
return DI_OK;
}
case (DWORD_PTR)DIPROP_DEADZONE:
{
const DIPROPDWORD *value = (const DIPROPDWORD *)header;
properties->deadzone = value->dwData;
return DI_OK;
}
case (DWORD_PTR)DIPROP_SATURATION:
{
const DIPROPDWORD *value = (const DIPROPDWORD *)header;
properties->saturation = value->dwData;
return DI_OK;
}
}
return DIERR_UNSUPPORTED;
}
static HRESULT hid_joystick_acquire( IDirectInputDevice8W *iface ) static HRESULT hid_joystick_acquire( IDirectInputDevice8W *iface )
{ {
struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface ); struct hid_joystick *impl = impl_from_IDirectInputDevice8W( iface );
@ -1301,7 +1252,6 @@ static const struct dinput_device_vtbl hid_joystick_vtbl =
hid_joystick_unacquire, hid_joystick_unacquire,
hid_joystick_enum_objects, hid_joystick_enum_objects,
hid_joystick_get_property, hid_joystick_get_property,
hid_joystick_set_property,
hid_joystick_get_effect_info, hid_joystick_get_effect_info,
hid_joystick_create_effect, hid_joystick_create_effect,
hid_joystick_send_force_feedback_command, hid_joystick_send_force_feedback_command,
@ -1561,11 +1511,20 @@ static BOOL init_object_properties( struct hid_joystick *impl, struct hid_value_
DIDEVICEOBJECTINSTANCEW *instance, void *data ) DIDEVICEOBJECTINSTANCEW *instance, void *data )
{ {
struct object_properties *properties = impl->base.object_properties + instance->dwOfs / sizeof(LONG); struct object_properties *properties = impl->base.object_properties + instance->dwOfs / sizeof(LONG);
LONG range_max = (instance->dwType & DIDFT_AXIS) ? 65535 : 36000; LONG tmp;
properties->bit_size = caps->bit_size; properties->bit_size = caps->bit_size;
properties->logical_min = caps->logical_min; properties->logical_min = caps->logical_min;
properties->logical_max = caps->logical_max; properties->logical_max = caps->logical_max;
set_extra_caps_range( impl, instance, 0, range_max );
if (instance->dwType & DIDFT_AXIS) properties->range_max = 65535;
else
{
properties->range_max = 36000;
tmp = caps->logical_max - caps->logical_min;
if (tmp > 0) properties->range_max -= 36000 / (tmp + 1);
}
properties->saturation = 10000; properties->saturation = 10000;
return DIENUM_CONTINUE; return DIENUM_CONTINUE;
} }

View File

@ -274,12 +274,6 @@ static HRESULT keyboard_get_property( IDirectInputDevice8W *iface, DWORD propert
return DIERR_UNSUPPORTED; return DIERR_UNSUPPORTED;
} }
static HRESULT keyboard_set_property( IDirectInputDevice8W *iface, DWORD property,
const DIPROPHEADER *header, const DIDEVICEOBJECTINSTANCEW *instance )
{
return DIERR_UNSUPPORTED;
}
static const struct dinput_device_vtbl keyboard_vtbl = static const struct dinput_device_vtbl keyboard_vtbl =
{ {
NULL, NULL,
@ -289,7 +283,6 @@ static const struct dinput_device_vtbl keyboard_vtbl =
keyboard_unacquire, keyboard_unacquire,
keyboard_enum_objects, keyboard_enum_objects,
keyboard_get_property, keyboard_get_property,
keyboard_set_property,
NULL, NULL,
NULL, NULL,
NULL, NULL,

View File

@ -576,12 +576,6 @@ static HRESULT mouse_get_property( IDirectInputDevice8W *iface, DWORD property,
return DIERR_UNSUPPORTED; return DIERR_UNSUPPORTED;
} }
static HRESULT mouse_set_property( IDirectInputDevice8W *iface, DWORD property,
const DIPROPHEADER *header, const DIDEVICEOBJECTINSTANCEW *instance )
{
return DIERR_UNSUPPORTED;
}
static const struct dinput_device_vtbl mouse_vtbl = static const struct dinput_device_vtbl mouse_vtbl =
{ {
NULL, NULL,
@ -591,7 +585,6 @@ static const struct dinput_device_vtbl mouse_vtbl =
mouse_unacquire, mouse_unacquire,
mouse_enum_objects, mouse_enum_objects,
mouse_get_property, mouse_get_property,
mouse_set_property,
NULL, NULL,
NULL, NULL,
NULL, NULL,