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