Rémi Bernon : dinput: Use fixed axis object instance number for common axes.

Alexandre Julliard julliard at winehq.org
Thu Sep 23 15:35:05 CDT 2021


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Thu Sep 23 10:51:38 2021 +0200

dinput: Use fixed axis object instance number for common axes.

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

---

 dlls/dinput/joystick_hid.c | 23 +++++++++++++++--------
 dlls/dinput8/tests/hid.c   |  6 ++----
 2 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 4d7bbe82a23..11c23cfd58f 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -220,13 +220,20 @@ static BOOL enum_object( struct hid_joystick *impl, const DIPROPHEADER *filter,
     return DIENUM_CONTINUE;
 }
 
+static void set_axis_type( DIDEVICEOBJECTINSTANCEW *instance, BOOL *seen, DWORD i, DWORD *count )
+{
+    if (!seen[i]) instance->dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( i );
+    else instance->dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 6 + *count++ );
+    seen[i] = TRUE;
+}
+
 static BOOL enum_value_objects( struct hid_joystick *impl, const DIPROPHEADER *filter,
                                 DWORD flags, enum_object_callback callback, void *data )
 {
     DIDEVICEOBJECTINSTANCEW instance = {.dwSize = sizeof(DIDEVICEOBJECTINSTANCEW)};
     struct hid_caps caps = {.type = VALUE_CAPS};
+    BOOL ret, seen_axis[6] = {0};
     DWORD axis = 0, pov = 0, i;
-    BOOL ret;
 
     for (i = 0; i < impl->caps.NumberInputValueCaps; ++i)
     {
@@ -254,49 +261,49 @@ static BOOL enum_value_objects( struct hid_joystick *impl, const DIPROPHEADER *f
             {
             case HID_USAGE_GENERIC_X:
                 instance.dwOfs = DIJOFS_X;
-                instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( axis++ );
+                set_axis_type( &instance, seen_axis, 0, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
                 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;
-                instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( axis++ );
+                set_axis_type( &instance, seen_axis, 1, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
                 ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             case HID_USAGE_GENERIC_Z:
                 instance.dwOfs = DIJOFS_Z;
-                instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( axis++ );
+                set_axis_type( &instance, seen_axis, 2, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
                 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;
-                instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( axis++ );
+                set_axis_type( &instance, seen_axis, 3, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
                 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;
-                instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( axis++ );
+                set_axis_type( &instance, seen_axis, 4, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
                 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;
-                instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( axis++ );
+                set_axis_type( &instance, seen_axis, 5, &axis );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
                 ret = enum_object( impl, filter, flags, callback, &caps, &instance, data );
                 if (ret != DIENUM_CONTINUE) return ret;
                 break;
             case HID_USAGE_GENERIC_SLIDER:
                 instance.dwOfs = DIJOFS_SLIDER( 0 );
-                instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( axis++ );
+                instance.dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( 6 + axis++ );
                 instance.dwFlags = DIDOI_ASPECTPOSITION;
                 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 54d85cae14b..75c9e7cd92a 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -3567,8 +3567,8 @@ static void test_simple_joystick(void)
     };
     const struct check_objects_todos objects_todos[ARRAY_SIZE(expect_objects)] =
     {
-        {.ofs = TRUE, .type = TRUE},
-        {.ofs = TRUE, .type = TRUE},
+        {.ofs = TRUE},
+        {.ofs = TRUE},
         {.ofs = TRUE},
         {.ofs = TRUE},
         {.ofs = TRUE},
@@ -3960,7 +3960,6 @@ static void test_simple_joystick(void)
     check_member_guid( objinst, expect_objects[1], guidType );
     todo_wine
     check_member( objinst, expect_objects[1], "%#x", dwOfs );
-    todo_wine
     check_member( objinst, expect_objects[1], "%#x", dwType );
     check_member( objinst, expect_objects[1], "%#x", dwFlags );
     if (!localized) todo_wine check_member_wstr( objinst, expect_objects[1], tszName );
@@ -4025,7 +4024,6 @@ static void test_simple_joystick(void)
     check_member_guid( objinst, expect_objects[0], guidType );
     todo_wine
     check_member( objinst, expect_objects[0], "%#x", dwOfs );
-    todo_wine
     check_member( objinst, expect_objects[0], "%#x", dwType );
     check_member( objinst, expect_objects[0], "%#x", dwFlags );
     if (!localized) todo_wine check_member_wstr( objinst, expect_objects[0], tszName );




More information about the wine-cvs mailing list