Rémi Bernon : dinput: Add DIDFT_FFACTUATOR flag on PID effect axes.

Alexandre Julliard julliard at winehq.org
Wed Oct 6 15:51:38 CDT 2021


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

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Wed Oct  6 10:21:58 2021 +0200

dinput: Add DIDFT_FFACTUATOR flag on PID effect 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 | 18 ++++++++++++++++++
 dlls/dinput8/tests/hid.c   |  6 +++---
 2 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/dlls/dinput/joystick_hid.c b/dlls/dinput/joystick_hid.c
index 1a22c7c8baa..846d4095391 100644
--- a/dlls/dinput/joystick_hid.c
+++ b/dlls/dinput/joystick_hid.c
@@ -255,6 +255,23 @@ static BOOL enum_object( struct hid_joystick *impl, const DIPROPHEADER *filter,
     return DIENUM_CONTINUE;
 }
 
+static void check_pid_effect_axis_caps( struct hid_joystick *impl, DIDEVICEOBJECTINSTANCEW *instance )
+{
+    struct pid_effect_update *effect_update = &impl->pid_effect_update;
+    ULONG i;
+
+    for (i = 0; i < effect_update->axis_count; ++i)
+    {
+        if (effect_update->axis_caps[i]->usage_page != instance->wUsagePage) continue;
+        if (effect_update->axis_caps[i]->usage_min > instance->wUsage) continue;
+        if (effect_update->axis_caps[i]->usage_max >= instance->wUsage) break;
+    }
+
+    if (i == effect_update->axis_count) return;
+    instance->dwType |= DIDFT_FFACTUATOR;
+    instance->dwFlags |= DIDOI_FFACTUATOR;
+}
+
 static void set_axis_type( DIDEVICEOBJECTINSTANCEW *instance, BOOL *seen, DWORD i, DWORD *count )
 {
     if (!seen[i]) instance->dwType = DIDFT_ABSAXIS | DIDFT_MAKEINSTANCE( i );
@@ -331,6 +348,7 @@ static BOOL enum_objects( struct hid_joystick *impl, const DIPROPHEADER *header,
             instance.guidType = *object_usage_to_guid( instance.wUsagePage, instance.wUsage );
             instance.wReportId = caps->report_id;
             instance.wCollectionNumber = caps->link_collection;
+            check_pid_effect_axis_caps( impl, &instance );
             ret = enum_object( impl, &filter, flags, callback, caps, &instance, data );
             if (ret != DIENUM_CONTINUE) return ret;
             value_ofs += sizeof(LONG);
diff --git a/dlls/dinput8/tests/hid.c b/dlls/dinput8/tests/hid.c
index 019e7b7ae87..aad23ad4c61 100644
--- a/dlls/dinput8/tests/hid.c
+++ b/dlls/dinput8/tests/hid.c
@@ -6392,9 +6392,9 @@ static void test_force_feedback_joystick( void )
     };
     const struct check_objects_todos objects_todos[ARRAY_SIZE(expect_objects)] =
     {
-        {.type = TRUE, .flags = TRUE},
-        {.type = TRUE, .flags = TRUE},
-        {.type = TRUE, .flags = TRUE},
+        {},
+        {},
+        {},
         {.type = TRUE, .flags = TRUE},
         {.type = TRUE, .flags = TRUE},
         {},




More information about the wine-cvs mailing list