mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-08-09 08:41:31 +00:00
[idd] input: preserve relative mode on reset
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|||||||
Reference in New Issue
Block a user