Rémi Bernon : dinput: Improve filtering of HID device state input report.

Alexandre Julliard julliard at winehq.org
Wed Sep 29 15:54:11 CDT 2021


Module: wine
Branch: master
Commit: 81bef14324be69be190ef3fcfe301a7063e39351
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=81bef14324be69be190ef3fcfe301a7063e39351

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Wed Sep 29 10:24:57 2021 +0200

dinput: Improve filtering of HID device state input report.

Make sure we only read input object from the device state input report
and only look for generic and button usage pages to find the report.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dinput/joystick_hid.c | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 29cb8990689..a20925b6176 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -937,6 +937,8 @@ static BOOL check_device_state_button( struct hid_joystick *impl, struct hid_cap
     struct parse_device_state_params *params = data;
     BYTE old_value, value;
 
+    if (instance->wReportId != impl->device_state_report_id) return DIENUM_CONTINUE;
+
     value = params->buttons[instance->wUsage - 1];
     old_value = params->old_state[instance->dwOfs];
     impl->device_state[instance->dwOfs] = value;
@@ -1008,6 +1010,8 @@ static BOOL read_device_state_value( struct hid_joystick *impl, struct hid_caps
     LONG old_value, value;
     NTSTATUS status;
 
+    if (instance->wReportId != impl->device_state_report_id) return DIENUM_CONTINUE;
+
     extra = impl->input_extra_caps + (value_caps - impl->input_value_caps);
     status = HidP_GetUsageValue( HidP_Input, instance->wUsagePage, 0, instance->wUsage,
                                  &logical_value, impl->preparsed, report_buf, report_len );
@@ -1360,10 +1364,15 @@ static BOOL init_objects( struct hid_joystick *impl, struct hid_caps *caps,
     if (instance->dwType & DIDFT_AXIS) impl->dev_caps.dwAxes++;
     if (instance->dwType & DIDFT_POV) impl->dev_caps.dwPOVs++;
 
-    if (!impl->device_state_report_id)
-        impl->device_state_report_id = instance->wReportId;
-    else if (impl->device_state_report_id != instance->wReportId)
-        FIXME( "multiple device state reports found!\n" );
+    if (instance->dwType & (DIDFT_BUTTON|DIDFT_AXIS|DIDFT_POV) &&
+        (instance->wUsagePage == HID_USAGE_PAGE_GENERIC ||
+         instance->wUsagePage == HID_USAGE_PAGE_BUTTON))
+    {
+        if (!impl->device_state_report_id)
+            impl->device_state_report_id = instance->wReportId;
+        else if (impl->device_state_report_id != instance->wReportId)
+            FIXME( "multiple device state reports found!\n" );
+    }
 
     return DIENUM_CONTINUE;
 }




More information about the wine-cvs mailing list