[idd] input: preserve relative mode on reset

This commit is contained in:
Geoffrey McRae
2026-08-09 01:57:51 +10:00
parent 008a4482d6
commit c89c01ae5a
3 changed files with 50 additions and 37 deletions

View File

@@ -99,7 +99,6 @@ void CInputPipeServer::DeInit()
m_queueHead = 0; m_queueHead = 0;
m_queueCount = 0; m_queueCount = 0;
m_mouseMode = MouseMode::NONE; m_mouseMode = MouseMode::NONE;
m_absoluteValid = false;
m_relativeButtons = 0; m_relativeButtons = 0;
m_absoluteButtons = 0; m_absoluteButtons = 0;
@@ -198,17 +197,24 @@ bool CInputPipeServer::QueueRawLocked(
bool CInputPipeServer::QueueResetLocked() bool CInputPipeServer::QueueResetLocked()
{ {
KVMFRInputPayload payload = {}; KVMFRInputPayload payload = {};
switch (m_mouseMode)
{
case MouseMode::RELATIVE_INPUT:
if (!QueueRawLocked( if (!QueueRawLocked(
LG_INPUT_PIPE_MESSAGE_MOUSE_RELATIVE, payload, false)) LG_INPUT_PIPE_MESSAGE_MOUSE_RELATIVE, payload, false))
return false; return false;
break;
if (m_absoluteValid) case MouseMode::ABSOLUTE_INPUT:
{
payload.mouseAbsolute.x = m_absoluteX; payload.mouseAbsolute.x = m_absoluteX;
payload.mouseAbsolute.y = m_absoluteY; payload.mouseAbsolute.y = m_absoluteY;
if (!QueueRawLocked( if (!QueueRawLocked(
LG_INPUT_PIPE_MESSAGE_MOUSE_ABSOLUTE, payload, false)) LG_INPUT_PIPE_MESSAGE_MOUSE_ABSOLUTE, payload, false))
return false; return false;
break;
case MouseMode::NONE:
break;
} }
payload = {}; payload = {};
@@ -328,7 +334,6 @@ bool CInputPipeServer::SendMouseAbsolute(
if (switching) if (switching)
m_relativeButtons = 0; m_relativeButtons = 0;
m_mouseMode = MouseMode::ABSOLUTE_INPUT; m_mouseMode = MouseMode::ABSOLUTE_INPUT;
m_absoluteValid = true;
m_absoluteX = x; m_absoluteX = x;
m_absoluteY = y; m_absoluteY = y;
m_absoluteButtons = buttons; m_absoluteButtons = buttons;

View File

@@ -67,7 +67,6 @@ private:
uint64_t m_sequence = 0; uint64_t m_sequence = 0;
MouseMode m_mouseMode = MouseMode::NONE; MouseMode m_mouseMode = MouseMode::NONE;
bool m_absoluteValid = false;
uint16_t m_absoluteX = 0; uint16_t m_absoluteX = 0;
uint16_t m_absoluteY = 0; uint16_t m_absoluteY = 0;
uint32_t m_relativeButtons = 0; uint32_t m_relativeButtons = 0;

View File

@@ -74,7 +74,6 @@ struct HIDDeviceContext
uint32_t relativeButtons; uint32_t relativeButtons;
uint32_t absoluteButtons; uint32_t absoluteButtons;
uint16_t consumerUsage; uint16_t consumerUsage;
bool absoluteValid;
uint16_t absoluteX; uint16_t absoluteX;
uint16_t absoluteY; uint16_t absoluteY;
HIDStatistics statistics; HIDStatistics statistics;
@@ -545,7 +544,6 @@ NTSTATUS CHIDDevice::SubmitReport(
static_cast<const HIDMouseAbsoluteReport *>(report); static_cast<const HIDMouseAbsoluteReport *>(report);
context->mouseMode = reportId; context->mouseMode = reportId;
context->absoluteButtons = mouse->buttons; context->absoluteButtons = mouse->buttons;
context->absoluteValid = true;
context->absoluteX = mouse->x; context->absoluteX = mouse->x;
context->absoluteY = mouse->y; context->absoluteY = mouse->y;
break; break;
@@ -571,9 +569,9 @@ NTSTATUS CHIDDevice::SubmitReport(
NTSTATUS CHIDDevice::ResetReports() NTSTATUS CHIDDevice::ResetReports()
{ {
UCHAR mouseMode = 0;
uint16_t absoluteX = 0; uint16_t absoluteX = 0;
uint16_t absoluteY = 0; uint16_t absoluteY = 0;
bool absoluteValid = false;
{ {
CSRWSharedLock deviceLock(&s_deviceLock); CSRWSharedLock deviceLock(&s_deviceLock);
HIDDeviceContext * context = s_device; HIDDeviceContext * context = s_device;
@@ -584,7 +582,7 @@ NTSTATUS CHIDDevice::ResetReports()
if (context->stopping) if (context->stopping)
return STATUS_DEVICE_NOT_READY; return STATUS_DEVICE_NOT_READY;
absoluteValid = context->absoluteValid; mouseMode = context->mouseMode;
absoluteX = context->absoluteX; absoluteX = context->absoluteX;
absoluteY = context->absoluteY; absoluteY = context->absoluteY;
context->statistics.resetDiscarded += context->reportCount; context->statistics.resetDiscarded += context->reportCount;
@@ -596,13 +594,6 @@ NTSTATUS CHIDDevice::ResetReports()
context->consumerUsage = UINT16_MAX; context->consumerUsage = UINT16_MAX;
} }
const HIDMouseRelativeReport relative = {
HID_REPORT_ID_MOUSE_RELATIVE,
0,
0,
0,
0,
};
const HIDKeyboardReport keyboard = { const HIDKeyboardReport keyboard = {
HID_REPORT_ID_KEYBOARD, HID_REPORT_ID_KEYBOARD,
}; };
@@ -610,8 +601,23 @@ NTSTATUS CHIDDevice::ResetReports()
HID_REPORT_ID_CONSUMER, HID_REPORT_ID_CONSUMER,
}; };
NTSTATUS status = SubmitReport(&relative, sizeof(relative)); NTSTATUS status = STATUS_SUCCESS;
if (absoluteValid) switch (mouseMode)
{
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 = { const HIDMouseAbsoluteReport absolute = {
HID_REPORT_ID_MOUSE_ABSOLUTE, HID_REPORT_ID_MOUSE_ABSOLUTE,
@@ -620,11 +626,14 @@ NTSTATUS CHIDDevice::ResetReports()
absoluteY, absoluteY,
0, 0,
}; };
const NTSTATUS absoluteStatus = status = SubmitReport(&absolute, sizeof(absolute));
SubmitReport(&absolute, sizeof(absolute)); break;
if (NT_SUCCESS(status))
status = absoluteStatus;
} }
default:
break;
}
const NTSTATUS keyboardStatus = const NTSTATUS keyboardStatus =
SubmitReport(&keyboard, sizeof(keyboard)); SubmitReport(&keyboard, sizeof(keyboard));
if (NT_SUCCESS(status)) if (NT_SUCCESS(status))