From 1285bbfa43c6db32dba3cafedb3bc3ca99046a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Wed, 6 Oct 2021 10:21:58 +0200 Subject: [PATCH] dinput: Add DIDFT_FFACTUATOR flag on PID effect axes. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: RĂ©mi Bernon Signed-off-by: Alexandre Julliard --- 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}, {},