Ivo Ivanov : dinput: Look for the device managed effect creation reports.
Alexandre Julliard
julliard at winehq.org
Fri Nov 19 15:45:33 CST 2021
Module: wine
Branch: master
Commit: 21171bec319adf508ba8cf1fac1fd3f19073a134
URL: https://source.winehq.org/git/wine.git/?a=commit;h=21171bec319adf508ba8cf1fac1fd3f19073a134
Author: Ivo Ivanov <logos128 at gmail.com>
Date: Fri Nov 19 12:37:18 2021 +0100
dinput: Look for the device managed effect creation reports.
Signed-off-by: Ivo Ivanov <logos128 at gmail.com>
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dinput/joystick_hid.c | 73 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 71 insertions(+), 2 deletions(-)
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 0910c870762..858755140d1 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -132,6 +132,33 @@ struct pid_device_gain
struct hid_value_caps *device_gain_caps;
};
+struct pid_device_pool
+{
+ BYTE id;
+ ULONG collection;
+ struct hid_value_caps *device_managed_caps;
+};
+
+struct pid_block_free
+{
+ BYTE id;
+ ULONG collection;
+};
+
+struct pid_block_load
+{
+ BYTE id;
+ ULONG collection;
+ ULONG status_coll;
+};
+
+struct pid_new_effect
+{
+ BYTE id;
+ ULONG collection;
+ ULONG type_coll;
+};
+
struct hid_joystick
{
struct dinput_device base;
@@ -161,6 +188,10 @@ struct hid_joystick
struct pid_set_constant_force pid_set_constant_force;
struct pid_set_ramp_force pid_set_ramp_force;
struct pid_device_gain pid_device_gain;
+ struct pid_device_pool pid_device_pool;
+ struct pid_block_free pid_block_free;
+ struct pid_block_load pid_block_load;
+ struct pid_new_effect pid_new_effect;
};
static inline struct hid_joystick *impl_from_IDirectInputDevice8W( IDirectInputDevice8W *iface )
@@ -441,7 +472,7 @@ static void set_axis_type( DIDEVICEOBJECTINSTANCEW *instance, BOOL *seen, DWORD
static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter, DWORD flags,
enum_object_callback callback, void *data )
{
- DWORD collection = 0, object = 0, axis = 0, button = 0, pov = 0, value_ofs = 0, button_ofs = 0, j, len;
+ DWORD collection = 0, object = 0, axis = 0, button = 0, pov = 0, value_ofs = 0, button_ofs = 0, j, count, len;
struct hid_preparsed_data *preparsed = (struct hid_preparsed_data *)impl->preparsed;
DIDEVICEOBJECTINSTANCEW instance = {.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW)};
struct hid_value_caps *caps, *caps_end, *nary, *nary_end, *effect_caps;
@@ -573,7 +604,8 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
}
}
- for (caps = HID_OUTPUT_VALUE_CAPS( preparsed ), caps_end = caps + preparsed->output_caps_count;
+ count = preparsed->output_caps_count + preparsed->feature_caps_count;
+ for (caps = HID_OUTPUT_VALUE_CAPS( preparsed ), caps_end = caps + count;
caps != caps_end; ++caps)
{
if (!caps->usage_page) continue;
@@ -1519,6 +1551,10 @@ static BOOL init_pid_reports( struct hid_joystick *impl, struct hid_value_caps *
struct pid_set_periodic *set_periodic = &impl->pid_set_periodic;
struct pid_set_envelope *set_envelope = &impl->pid_set_envelope;
struct pid_device_gain *device_gain = &impl->pid_device_gain;
+ struct pid_device_pool *device_pool = &impl->pid_device_pool;
+ struct pid_block_free *block_free = &impl->pid_block_free;
+ struct pid_block_load *block_load = &impl->pid_block_load;
+ struct pid_new_effect *new_effect = &impl->pid_new_effect;
#define SET_COLLECTION( rep ) \
do \
@@ -1550,15 +1586,22 @@ static BOOL init_pid_reports( struct hid_joystick *impl, struct hid_value_caps *
case PID_USAGE_SET_CONSTANT_FORCE_REPORT: SET_COLLECTION( set_constant_force ); break;
case PID_USAGE_SET_RAMP_FORCE_REPORT: SET_COLLECTION( set_ramp_force ); break;
case PID_USAGE_DEVICE_GAIN_REPORT: SET_COLLECTION( device_gain ); break;
+ case PID_USAGE_POOL_REPORT: SET_COLLECTION( device_pool ); break;
+ case PID_USAGE_BLOCK_FREE_REPORT: SET_COLLECTION( block_free ); break;
+ case PID_USAGE_BLOCK_LOAD_REPORT: SET_COLLECTION( block_load ); break;
+ case PID_USAGE_CREATE_NEW_EFFECT_REPORT: SET_COLLECTION( new_effect ); break;
case PID_USAGE_DEVICE_CONTROL: SET_SUB_COLLECTION( device_control, control_coll ); break;
case PID_USAGE_EFFECT_OPERATION: SET_SUB_COLLECTION( effect_control, control_coll ); break;
case PID_USAGE_EFFECT_TYPE:
if (instance->wCollectionNumber == effect_update->collection)
SET_SUB_COLLECTION( effect_update, type_coll );
+ else if (instance->wCollectionNumber == new_effect->collection)
+ SET_SUB_COLLECTION( new_effect, type_coll );
break;
case PID_USAGE_AXES_ENABLE: SET_SUB_COLLECTION( effect_update, axes_coll ); break;
case PID_USAGE_DIRECTION: SET_SUB_COLLECTION( effect_update, direction_coll ); break;
+ case PID_USAGE_BLOCK_LOAD_STATUS: SET_SUB_COLLECTION( block_load, status_coll ); break;
}
}
@@ -1580,6 +1623,10 @@ static BOOL init_pid_caps( struct hid_joystick *impl, struct hid_value_caps *cap
struct pid_set_periodic *set_periodic = &impl->pid_set_periodic;
struct pid_set_envelope *set_envelope = &impl->pid_set_envelope;
struct pid_device_gain *device_gain = &impl->pid_device_gain;
+ struct pid_device_pool *device_pool = &impl->pid_device_pool;
+ struct pid_block_free *block_free = &impl->pid_block_free;
+ struct pid_block_load *block_load = &impl->pid_block_load;
+ struct pid_new_effect *new_effect = &impl->pid_new_effect;
if (!(instance->dwType & DIDFT_OUTPUT)) return DIENUM_CONTINUE;
@@ -1756,6 +1803,22 @@ static BOOL init_pid_caps( struct hid_joystick *impl, struct hid_value_caps *cap
device_gain->device_gain_caps = caps;
}
}
+ if (instance->wCollectionNumber == device_pool->collection)
+ {
+ SET_REPORT_ID( device_pool );
+ if (instance->wUsage == PID_USAGE_DEVICE_MANAGED_POOL)
+ device_pool->device_managed_caps = caps;
+ }
+ if (instance->wCollectionNumber == block_free->collection)
+ SET_REPORT_ID( block_free );
+ if (instance->wCollectionNumber == block_load->collection)
+ SET_REPORT_ID( block_load );
+ if (instance->wCollectionNumber == block_load->status_coll)
+ SET_REPORT_ID( block_load );
+ if (instance->wCollectionNumber == new_effect->collection)
+ SET_REPORT_ID( new_effect );
+ if (instance->wCollectionNumber == new_effect->type_coll)
+ SET_REPORT_ID( new_effect );
#undef SET_REPORT_ID
@@ -1854,6 +1917,12 @@ HRESULT hid_joystick_create_device( IDirectInputImpl *dinput, const GUID *guid,
impl->pid_set_constant_force.collection );
TRACE( "set ramp force id %u, coll %u\n", impl->pid_set_ramp_force.id, impl->pid_set_ramp_force.collection );
TRACE( "device gain id %u, coll %u\n", impl->pid_device_gain.id, impl->pid_device_gain.collection );
+ TRACE( "device pool id %u, coll %u\n", impl->pid_device_pool.id, impl->pid_device_pool.collection );
+ TRACE( "block free id %u, coll %u\n", impl->pid_block_free.id, impl->pid_block_free.collection );
+ TRACE( "block load id %u, coll %u, status_coll %u\n", impl->pid_block_load.id,
+ impl->pid_block_load.collection, impl->pid_block_load.status_coll );
+ TRACE( "create new effect id %u, coll %u, type_coll %u\n", impl->pid_new_effect.id,
+ impl->pid_new_effect.collection, impl->pid_new_effect.type_coll );
if (impl->pid_device_control.id)
{
More information about the wine-cvs
mailing list