[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_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;

View File

@@ -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;

View File

@@ -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<const HIDMouseAbsoluteReport *>(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))