From c89c01ae5afbe32e13d498e2aee5ecbb86012949 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Sun, 9 Aug 2026 01:57:51 +1000 Subject: [PATCH] [idd] input: preserve relative mode on reset --- idd/LGIdd/ipc/CInputPipeServer.cpp | 29 ++++++++------- idd/LGIdd/ipc/CInputPipeServer.h | 1 - idd/LGInput/CHIDDevice.cpp | 57 +++++++++++++++++------------- 3 files changed, 50 insertions(+), 37 deletions(-) diff --git a/idd/LGIdd/ipc/CInputPipeServer.cpp b/idd/LGIdd/ipc/CInputPipeServer.cpp index f6a44488..774463ed 100644 --- a/idd/LGIdd/ipc/CInputPipeServer.cpp +++ b/idd/LGIdd/ipc/CInputPipeServer.cpp @@ -99,7 +99,6 @@ void CInputPipeServer::DeInit() m_queueHead = 0; m_queueCount = 0; m_mouseMode = MouseMode::NONE; - m_absoluteValid = false; m_relativeButtons = 0; m_absoluteButtons = 0; @@ -198,17 +197,24 @@ bool CInputPipeServer::QueueRawLocked( bool CInputPipeServer::QueueResetLocked() { KVMFRInputPayload payload = {}; - if (!QueueRawLocked( - LG_INPUT_PIPE_MESSAGE_MOUSE_RELATIVE, payload, false)) - return false; - - if (m_absoluteValid) + switch (m_mouseMode) { - payload.mouseAbsolute.x = m_absoluteX; - payload.mouseAbsolute.y = m_absoluteY; - if (!QueueRawLocked( - LG_INPUT_PIPE_MESSAGE_MOUSE_ABSOLUTE, payload, false)) - return false; + case MouseMode::RELATIVE_INPUT: + if (!QueueRawLocked( + LG_INPUT_PIPE_MESSAGE_MOUSE_RELATIVE, payload, false)) + return false; + break; + + case MouseMode::ABSOLUTE_INPUT: + payload.mouseAbsolute.x = m_absoluteX; + payload.mouseAbsolute.y = m_absoluteY; + if (!QueueRawLocked( + LG_INPUT_PIPE_MESSAGE_MOUSE_ABSOLUTE, payload, false)) + return false; + break; + + case MouseMode::NONE: + break; } payload = {}; @@ -328,7 +334,6 @@ bool CInputPipeServer::SendMouseAbsolute( if (switching) m_relativeButtons = 0; m_mouseMode = MouseMode::ABSOLUTE_INPUT; - m_absoluteValid = true; m_absoluteX = x; m_absoluteY = y; m_absoluteButtons = buttons; diff --git a/idd/LGIdd/ipc/CInputPipeServer.h b/idd/LGIdd/ipc/CInputPipeServer.h index c93c77ac..0aa9b889 100644 --- a/idd/LGIdd/ipc/CInputPipeServer.h +++ b/idd/LGIdd/ipc/CInputPipeServer.h @@ -67,7 +67,6 @@ private: uint64_t m_sequence = 0; MouseMode m_mouseMode = MouseMode::NONE; - bool m_absoluteValid = false; uint16_t m_absoluteX = 0; uint16_t m_absoluteY = 0; uint32_t m_relativeButtons = 0; diff --git a/idd/LGInput/CHIDDevice.cpp b/idd/LGInput/CHIDDevice.cpp index 9a01a1b9..954481d8 100644 --- a/idd/LGInput/CHIDDevice.cpp +++ b/idd/LGInput/CHIDDevice.cpp @@ -74,7 +74,6 @@ struct HIDDeviceContext uint32_t relativeButtons; uint32_t absoluteButtons; uint16_t consumerUsage; - bool absoluteValid; uint16_t absoluteX; uint16_t absoluteY; HIDStatistics statistics; @@ -545,7 +544,6 @@ NTSTATUS CHIDDevice::SubmitReport( static_cast(report); context->mouseMode = reportId; context->absoluteButtons = mouse->buttons; - context->absoluteValid = true; context->absoluteX = mouse->x; context->absoluteY = mouse->y; break; @@ -571,9 +569,9 @@ NTSTATUS CHIDDevice::SubmitReport( NTSTATUS CHIDDevice::ResetReports() { + UCHAR mouseMode = 0; uint16_t absoluteX = 0; uint16_t absoluteY = 0; - bool absoluteValid = false; { CSRWSharedLock deviceLock(&s_deviceLock); HIDDeviceContext * context = s_device; @@ -584,7 +582,7 @@ NTSTATUS CHIDDevice::ResetReports() if (context->stopping) return STATUS_DEVICE_NOT_READY; - absoluteValid = context->absoluteValid; + mouseMode = context->mouseMode; absoluteX = context->absoluteX; absoluteY = context->absoluteY; context->statistics.resetDiscarded += context->reportCount; @@ -596,13 +594,6 @@ NTSTATUS CHIDDevice::ResetReports() context->consumerUsage = UINT16_MAX; } - const HIDMouseRelativeReport relative = { - HID_REPORT_ID_MOUSE_RELATIVE, - 0, - 0, - 0, - 0, - }; const HIDKeyboardReport keyboard = { HID_REPORT_ID_KEYBOARD, }; @@ -610,21 +601,39 @@ NTSTATUS CHIDDevice::ResetReports() HID_REPORT_ID_CONSUMER, }; - NTSTATUS status = SubmitReport(&relative, sizeof(relative)); - if (absoluteValid) + NTSTATUS status = STATUS_SUCCESS; + switch (mouseMode) { - const HIDMouseAbsoluteReport absolute = { - HID_REPORT_ID_MOUSE_ABSOLUTE, - 0, - absoluteX, - absoluteY, - 0, - }; - const NTSTATUS absoluteStatus = - SubmitReport(&absolute, sizeof(absolute)); - if (NT_SUCCESS(status)) - status = absoluteStatus; + case HID_REPORT_ID_MOUSE_RELATIVE: + { + const HIDMouseRelativeReport relative = { + HID_REPORT_ID_MOUSE_RELATIVE, + 0, + 0, + 0, + 0, + }; + status = SubmitReport(&relative, sizeof(relative)); + break; + } + + case HID_REPORT_ID_MOUSE_ABSOLUTE: + { + const HIDMouseAbsoluteReport absolute = { + HID_REPORT_ID_MOUSE_ABSOLUTE, + 0, + absoluteX, + absoluteY, + 0, + }; + status = SubmitReport(&absolute, sizeof(absolute)); + break; + } + + default: + break; } + const NTSTATUS keyboardStatus = SubmitReport(&keyboard, sizeof(keyboard)); if (NT_SUCCESS(status))