[PATCH 1/5] xinput1_3: Use the implicit Stop waveform ordinal to stop the effects.

Rémi Bernon rbernon at codeweavers.com
Tue Feb 15 02:03:37 CST 2022


Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/xinput1_3/main.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/dlls/xinput1_3/main.c b/dlls/xinput1_3/main.c
index e669fa0af71..2179da1db72 100644
--- a/dlls/xinput1_3/main.c
+++ b/dlls/xinput1_3/main.c
@@ -81,6 +81,8 @@ struct xinput_controller
         char *feature_report_buf;
 
         BYTE haptics_report;
+        BYTE haptics_none_ordinal;
+        BYTE haptics_stop_ordinal;
         BYTE haptics_rumble_ordinal;
         BYTE haptics_buzz_ordinal;
     } hid;
@@ -244,6 +246,8 @@ static BOOL controller_check_caps(struct xinput_controller *controller, HANDLE d
         return TRUE;
     }
 
+    controller->hid.haptics_none_ordinal = 1; /* implicit None waveform ordinal, from the HID spec */
+    controller->hid.haptics_stop_ordinal = 2; /* implicit Stop waveform ordinal, from the HID spec */
     controller->hid.haptics_buzz_ordinal = 0;
     controller->hid.haptics_rumble_ordinal = 0;
     for (i = 3; status == HIDP_STATUS_SUCCESS; ++i)
@@ -291,6 +295,22 @@ static DWORD HID_set_state(struct xinput_controller *controller, XINPUT_VIBRATIO
 
     if (!controller->enabled) return ERROR_SUCCESS;
 
+    if (!state->wLeftMotorSpeed && !state->wRightMotorSpeed)
+    {
+        status = HidP_InitializeReportForID(HidP_Output, report_id, preparsed, report_buf, report_len);
+        if (status != HIDP_STATUS_SUCCESS) WARN("HidP_InitializeReportForID returned %#lx\n", status);
+        status = HidP_SetUsageValue(HidP_Output, HID_USAGE_PAGE_HAPTICS, 0, HID_USAGE_HAPTICS_MANUAL_TRIGGER,
+                                    controller->hid.haptics_stop_ordinal, preparsed, report_buf, report_len);
+        if (status != HIDP_STATUS_SUCCESS) WARN("HidP_SetUsageValue MANUAL_TRIGGER returned %#lx\n", status);
+        if (!HidD_SetOutputReport(controller->device, report_buf, report_len))
+        {
+            WARN("HidD_SetOutputReport failed with error %lu\n", GetLastError());
+            return GetLastError();
+        }
+
+        return 0;
+    }
+
     /* send haptics rumble report (left motor) */
     status = HidP_InitializeReportForID(HidP_Output, report_id, preparsed, report_buf, report_len);
     if (status != HIDP_STATUS_SUCCESS) WARN("HidP_InitializeReportForID returned %#lx\n", status);
-- 
2.34.1




More information about the wine-devel mailing list