Rémi Bernon : dinput: Convert DIPH_BYOFFSET filter to use current data format offsets.

Alexandre Julliard julliard at winehq.org
Mon Sep 27 15:21:43 CDT 2021


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Mon Sep 27 09:43:06 2021 +0200

dinput: Convert DIPH_BYOFFSET filter to use current data format offsets.

Instead of hardcoded DIJOYSTATE2 offsets.

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 ++++++++++++++++++++++++------------
 dlls/dinput8/tests/hid.c   |  1 -
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index ade58166e27..e83b6747e0c 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -231,14 +231,26 @@ static void set_axis_type( DIDEVICEOBJECTINSTANCEW *instance, BOOL *seen, DWORD
     seen[i] = TRUE;
 }
 
-static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter, DWORD flags,
+static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *header, DWORD flags,
                           enum_object_callback callback, void *data )
 {
     DIDEVICEOBJECTINSTANCEW instance = {.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW)};
     DWORD collection = 0, axis = 0, button = 0, pov = 0, i, j;
+    DIDATAFORMAT *format = impl->base.data_format.wine_df;
+    int *offsets = impl->base.data_format.offsets;
+    DIPROPHEADER filter = *header;
     BOOL ret, seen_axis[6] = {0};
     struct hid_caps caps = {0};
 
+    if (filter.dwHow == DIPH_BYOFFSET)
+    {
+        if (!offsets) return DIENUM_CONTINUE;
+        for (i = 0; i < format->dwNumObjs; ++i)
+            if (offsets[i] == filter.dwObj) break;
+        if (i == format->dwNumObjs) return DIENUM_CONTINUE;
+        filter.dwObj = format->rgodf[i].dwOfs;
+    }
+
     for (i = 0; i < impl->caps.NumberInputValueCaps; ++i)
     {
         caps.value = impl->input_value_caps + i;
@@ -267,14 +279,14 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
                 instance.dwOfs = DIJOFS_X;
                 set_axis_type( &instance, seen_axis, 0, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
-                ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+                ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             case HID_USAGE_GENERIC_Y:
                 instance.dwOfs = DIJOFS_Y;
                 set_axis_type( &instance, seen_axis, 1, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
-                ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+                ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             case HID_USAGE_GENERIC_Z:
@@ -282,28 +294,28 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
                 instance.dwOfs = DIJOFS_Z;
                 set_axis_type( &instance, seen_axis, 2, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
-                ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+                ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             case HID_USAGE_GENERIC_RX:
                 instance.dwOfs = DIJOFS_RX;
                 set_axis_type( &instance, seen_axis, 3, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
-                ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+                ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             case HID_USAGE_GENERIC_RY:
                 instance.dwOfs = DIJOFS_RY;
                 set_axis_type( &instance, seen_axis, 4, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
-                ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+                ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             case HID_USAGE_GENERIC_RZ:
                 instance.dwOfs = DIJOFS_RZ;
                 set_axis_type( &instance, seen_axis, 5, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
-                ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+                ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             case HID_USAGE_GENERIC_DIAL:
@@ -311,14 +323,14 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
                 instance.dwOfs = DIJOFS_SLIDER( 0 );
                 instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 6 + axis++ );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
-                ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+                ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             case HID_USAGE_GENERIC_HATSWITCH:
                 instance.dwOfs = DIJOFS_POV( 0 );
                 instance.dwType = DIDFT_POV | DIDFT_MAKEINSTANCE( pov++ );
                 instance.dwFlags = 0;
-                ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+                ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             default:
@@ -352,7 +364,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
                 instance.guidType = *object_usage_to_guid( instance.wUsagePage, instance.wUsage );
                 instance.wReportId = caps.button->ReportID;
                 instance.wCollectionNumber = caps.button->LinkCollection;
-                ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+                ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
             }
         }
@@ -368,7 +380,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
             instance.guidType = *object_usage_to_guid( instance.wUsagePage, instance.wUsage );
             instance.wReportId = caps.button->ReportID;
             instance.wCollectionNumber = caps.button->LinkCollection;
-            ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+            ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
             if (ret != DIENUM_CONTINUE) return ret;
         }
     }
@@ -391,7 +403,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
             instance.guidType = *object_usage_to_guid( instance.wUsagePage, instance.wUsage );
             instance.wReportId = 0;
             instance.wCollectionNumber = caps.node->Parent;
-            ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
+            ret = enum_object( impl, &filter, flags, callback, &caps, &instance, data );
             if (ret != DIENUM_CONTINUE) return ret;
         }
     }
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index c7f5b82c187..5031c4429af 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -3988,7 +3988,6 @@ static void test_simple_joystick(void)
     hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, 0x14, DIPH_BYOFFSET );
     ok( hr == DIERR_NOTFOUND, "IDirectInputDevice8_GetObjectInfo returned: %#x\n", hr );
     hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, 0, DIPH_BYOFFSET );
-    todo_wine
     ok( hr == DIERR_NOTFOUND, "IDirectInputDevice8_GetObjectInfo returned: %#x\n", hr );
     res = DIDFT_PSHBUTTON | DIDFT_MAKEINSTANCE( 3 );
     hr = IDirectInputDevice8_GetObjectInfo( device, &objinst, res, DIPH_BYID );




More information about the wine-cvs mailing list