From b65a76de53862a4e883fdfb2804d1ccda9b40e33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com> Date: Tue, 15 Feb 2022 09:03:40 +0100 Subject: [PATCH] winebus.sys: Add a repeat count value to haptics output report. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: RГ©mi Bernon <rbernon@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org> --- dlls/winebus.sys/hid.c | 11 ++++++++++- dlls/xinput1_3/main.c | 6 ++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/dlls/winebus.sys/hid.c b/dlls/winebus.sys/hid.c index d308e7f276b..1b2681fdb94 100644 --- a/dlls/winebus.sys/hid.c +++ b/dlls/winebus.sys/hid.c @@ -314,6 +314,7 @@ struct hid_haptics_waveform { UINT16 intensity; BYTE manual_trigger; + BYTE repeat_count; }; #include "poppack.h" @@ -373,6 +374,13 @@ BOOL hid_device_add_haptics(struct unix_device *iface) REPORT_SIZE(1, 8), REPORT_COUNT(1, 1), OUTPUT(1, Data|Var|Abs), + + USAGE(1, HID_USAGE_HAPTICS_REPEAT_COUNT), + LOGICAL_MINIMUM(1, 0), + LOGICAL_MAXIMUM(1, 1), + REPORT_SIZE(1, 8), + REPORT_COUNT(1, 1), + OUTPUT(1, Data|Var|Abs), END_COLLECTION, }; @@ -1066,7 +1074,8 @@ static void hid_device_set_output_report(struct unix_device *iface, HID_XFER_PAC { haptics->waveform_intensity[report->manual_trigger] = report->intensity; duration_ms = haptics->features.waveform_cutoff_time_ms; - io->Status = iface->hid_vtbl->haptics_start(iface, duration_ms, *rumble_intensity, *buzz_intensity); + if (!report->repeat_count) io->Status = STATUS_SUCCESS; + else io->Status = iface->hid_vtbl->haptics_start(iface, duration_ms, *rumble_intensity, *buzz_intensity); } } } diff --git a/dlls/xinput1_3/main.c b/dlls/xinput1_3/main.c index 2179da1db72..bc0baa21ebf 100644 --- a/dlls/xinput1_3/main.c +++ b/dlls/xinput1_3/main.c @@ -320,6 +320,9 @@ static DWORD HID_set_state(struct xinput_controller *controller, XINPUT_VIBRATIO status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_MANUAL_TRIGGER, controller->hid.haptics_rumble_ordinal, preparsed, report_buf, report_len); if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue MANUAL_TRIGGER returned %#lx\n", status); + status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_REPEAT_COUNT, + 1, preparsed, report_buf, report_len); + if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue REPEAT_COUNT returned %#lx\n", status); if (!HidD_SetOutputReport(controller->device, report_buf, report_len)) { WARN("HidD_SetOutputReport failed with error %lu\n", GetLastError()); @@ -335,6 +338,9 @@ static DWORD HID_set_state(struct xinput_controller *controller, XINPUT_VIBRATIO status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_MANUAL_TRIGGER, controller->hid.haptics_buzz_ordinal, preparsed, report_buf, report_len); if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue MANUAL_TRIGGER returned %#lx\n", status); + status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_REPEAT_COUNT, + 1, preparsed, report_buf, report_len); + if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue REPEAT_COUNT returned %#lx\n", status); if (!HidD_SetOutputReport(controller->device, report_buf, report_len)) { WARN("HidD_SetOutputReport failed with error %lu\n", GetLastError()); -- 2.24.1