Rémi Bernon : dinput: Look for the PID effect state input report.
Alexandre Julliard
julliard at winehq.org
Thu Dec 2 15:30:16 CST 2021
Module: wine
Branch: master
Commit: f6fa99bd4e63940b540a23555f10ebbbc709c752
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f6fa99bd4e63940b540a23555f10ebbbc709c752
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Thu Dec 2 10:47:46 2021 +0100
dinput: Look for the PID effect state input report.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52062
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/dinput/joystick_hid.c | 36 +++++++++++++++++++++---------------
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 49a8f28e864..9dac2b3af4b 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -159,6 +159,12 @@ struct pid_new_effect
ULONG type_coll;
};
+struct pid_effect_state
+{
+ BYTE id;
+ ULONG collection;
+};
+
struct hid_joystick
{
struct dinput_device base;
@@ -193,6 +199,7 @@ struct hid_joystick
struct pid_block_free pid_block_free;
struct pid_block_load pid_block_load;
struct pid_new_effect pid_new_effect;
+ struct pid_effect_state pid_effect_state;
};
static inline struct hid_joystick *impl_from_IDirectInputDevice8W( IDirectInputDevice8W *iface )
@@ -535,12 +542,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
if (!caps->usage_page) continue;
if (caps->flags & HID_VALUE_CAPS_IS_BUTTON) continue;
- if (caps->usage_page == HID_USAGE_PAGE_PID)
- {
- value_ofs += (caps->usage_max - caps->usage_min + 1) * sizeof(LONG);
- object += caps->usage_max - caps->usage_min + 1;
- }
- else if (caps->usage_page >= HID_USAGE_PAGE_VENDOR_DEFINED_BEGIN)
+ if (caps->usage_page >= HID_USAGE_PAGE_VENDOR_DEFINED_BEGIN)
value_ofs += (caps->usage_max - caps->usage_min + 1) * sizeof(LONG);
else for (j = caps->usage_min; j <= caps->usage_max; ++j)
{
@@ -613,12 +615,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
if (!caps->usage_page) continue;
if (!(caps->flags & HID_VALUE_CAPS_IS_BUTTON)) continue;
- if (caps->usage_page == HID_USAGE_PAGE_PID)
- {
- button_ofs += caps->usage_max - caps->usage_min + 1;
- object += caps->usage_max - caps->usage_min + 1;
- }
- else if (caps->usage_page >= HID_USAGE_PAGE_VENDOR_DEFINED_BEGIN)
+ if (caps->usage_page >= HID_USAGE_PAGE_VENDOR_DEFINED_BEGIN)
button_ofs += caps->usage_max - caps->usage_min + 1;
else for (j = caps->usage_min; j <= caps->usage_max; ++j)
{
@@ -1290,6 +1287,8 @@ static BOOL enum_objects_callback( struct hid_joystick *impl, struct hid_value_c
DIDEVICEOBJECTINSTANCEW *instance, void *data )
{
struct enum_objects_params *params = data;
+ if (instance->wUsagePage == HID_USAGE_PAGE_PID && !(instance->dwType & DIDFT_NODATA))
+ return DIENUM_CONTINUE;
return params->callback( instance, params->context );
}
@@ -1605,6 +1604,7 @@ static BOOL init_pid_reports( struct hid_joystick *impl, struct hid_value_caps *
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;
+ struct pid_effect_state *effect_state = &impl->pid_effect_state;
#define SET_COLLECTION( rep ) \
do \
@@ -1640,6 +1640,7 @@ static BOOL init_pid_reports( struct hid_joystick *impl, struct hid_value_caps *
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_STATE_REPORT: SET_COLLECTION( effect_state ); 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;
@@ -1677,8 +1678,7 @@ static BOOL init_pid_caps( struct hid_joystick *impl, struct hid_value_caps *cap
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;
+ struct pid_effect_state *effect_state = &impl->pid_effect_state;
#define SET_REPORT_ID( rep ) \
do \
@@ -1689,6 +1689,11 @@ static BOOL init_pid_caps( struct hid_joystick *impl, struct hid_value_caps *cap
FIXME( "multiple " #rep " report ids!\n" ); \
} while (0)
+ if (instance->wCollectionNumber == effect_state->collection)
+ SET_REPORT_ID( effect_state );
+
+ if (!(instance->dwType & DIDFT_OUTPUT)) return DIENUM_CONTINUE;
+
if (instance->wCollectionNumber == device_control->control_coll)
SET_REPORT_ID( device_control );
if (instance->wCollectionNumber == effect_control->control_coll)
@@ -1956,7 +1961,7 @@ HRESULT hid_joystick_create_device( IDirectInputImpl *dinput, const GUID *guid,
impl->usages_buf = usages;
enum_objects( impl, &filter, DIDFT_COLLECTION, init_pid_reports, NULL );
- enum_objects( impl, &filter, DIDFT_NODATA, init_pid_caps, NULL );
+ enum_objects( impl, &filter, DIDFT_NODATA | DIDFT_BUTTON | DIDFT_AXIS, init_pid_caps, NULL );
TRACE( "device control id %u, coll %u, control coll %u\n", impl->pid_device_control.id,
impl->pid_device_control.collection, impl->pid_device_control.control_coll );
@@ -1976,6 +1981,7 @@ HRESULT hid_joystick_create_device( IDirectInputImpl *dinput, const GUID *guid,
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 );
+ TRACE( "effect state id %u, coll %u\n", impl->pid_effect_state.id, impl->pid_effect_state.collection );
if (impl->pid_device_control.id)
{
More information about the wine-cvs
mailing list