diff --git a/client/transports/LGMP/input.c b/client/transports/LGMP/input.c index d2b8cfe7..da542fea 100644 --- a/client/transports/LGMP/input.c +++ b/client/transports/LGMP/input.c @@ -146,7 +146,7 @@ struct LGMPInput struct LGMPInputStats stats; }; -static void buildKeyboardPayload(const LGMPInput * input, +static bool buildKeyboardPayload(const LGMPInput * input, KVMFRInputPayload * payload); static bool queueMouse(LGMPInput * input, enum LGMPInputMouseMode mode, int32_t x, int32_t y, int32_t wheel, uint32_t buttons, @@ -484,12 +484,6 @@ static bool inputStateHeld(const LGMPInput * input) return false; } -static bool inputStateActive(const LGMPInput * input) -{ - return input->mouseMode == LGMP_INPUT_MOUSE_ABSOLUTE || - inputStateHeld(input); -} - static void discardProtocolState(LGMPInput * input) { input->pendingHead = 0; @@ -504,18 +498,19 @@ static void discardProtocolState(LGMPInput * input) static bool restoreInputState(LGMPInput * input, bool * wake) { - if (!inputStateActive(input)) + if (!inputStateHeld(input)) return true; if (!claim(input, wake)) return false; KVMFRInputPayload keyboard = { 0 }; - buildKeyboardPayload(input, &keyboard); - if (!queuePayload(input, KVMFR_INPUT_MESSAGE_KEYBOARD, + const bool keyboardHeld = buildKeyboardPayload(input, &keyboard); + if (keyboardHeld && !queuePayload(input, KVMFR_INPUT_MESSAGE_KEYBOARD, &keyboard, false, wake)) return false; - if (input->mouseMode != LGMP_INPUT_MOUSE_NONE && + if (input->mouseButtons && + input->mouseMode != LGMP_INPUT_MOUSE_NONE && !queueMouse(input, input->mouseMode, 0, 0, 0, input->mouseButtons, false, wake)) return false; @@ -1087,26 +1082,32 @@ static void inputSetStatusListener(void * opaque, callback(callbackOpaque, &status); } -static void buildKeyboardPayload(const LGMPInput * input, +static bool buildKeyboardPayload(const LGMPInput * input, KVMFRInputPayload * payload) { + bool held = false; for (unsigned usage = 224; usage <= 231; ++usage) if (input->keyState[usage]) + { payload->keyboard.modifiers |= 1U << (usage - 224); + held = true; + } unsigned count = 0; for (unsigned usage = 1; usage < 224; ++usage) { if (!input->keyState[usage]) continue; + held = true; if (count == KVMFR_INPUT_KEYBOARD_KEY_COUNT) { memset(payload->keyboard.keys, 1, sizeof(payload->keyboard.keys)); - return; + return true; } payload->keyboard.keys[count++] = (uint8_t)usage; } + return held; } static bool updateKey(void * opaque, int key, bool pressed) diff --git a/idd/LGIdd/ipc/CInputPipeServer.cpp b/idd/LGIdd/ipc/CInputPipeServer.cpp index 774463ed..47226350 100644 --- a/idd/LGIdd/ipc/CInputPipeServer.cpp +++ b/idd/LGIdd/ipc/CInputPipeServer.cpp @@ -200,17 +200,20 @@ bool CInputPipeServer::QueueResetLocked() switch (m_mouseMode) { case MouseMode::RELATIVE_INPUT: - if (!QueueRawLocked( + if (m_relativeButtons && !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; + if (m_absoluteButtons) + { + 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: @@ -270,7 +273,7 @@ bool CInputPipeServer::SendMouseRelative( const bool pureMotion = wheel == 0 && buttons == m_relativeButtons; const bool switching = m_mouseMode == MouseMode::ABSOLUTE_INPUT; bool queued = (m_state.load(std::memory_order_relaxed) & 1) != 0; - if (queued && switching) + if (queued && switching && m_absoluteButtons) { KVMFRInputPayload neutral = {}; neutral.mouseAbsolute.x = m_absoluteX; @@ -317,7 +320,7 @@ bool CInputPipeServer::SendMouseAbsolute( const bool pureMotion = wheel == 0 && buttons == m_absoluteButtons; const bool switching = m_mouseMode == MouseMode::RELATIVE_INPUT; bool queued = (m_state.load(std::memory_order_relaxed) & 1) != 0; - if (queued && switching) + if (queued && switching && m_relativeButtons) { const KVMFRInputPayload neutral = {}; queued = QueueRawLocked( diff --git a/idd/LGInput/CHIDDevice.cpp b/idd/LGInput/CHIDDevice.cpp index 954481d8..09d6ec92 100644 --- a/idd/LGInput/CHIDDevice.cpp +++ b/idd/LGInput/CHIDDevice.cpp @@ -569,9 +569,10 @@ NTSTATUS CHIDDevice::SubmitReport( NTSTATUS CHIDDevice::ResetReports() { - UCHAR mouseMode = 0; - uint16_t absoluteX = 0; - uint16_t absoluteY = 0; + UCHAR mouseMode = 0; + uint32_t mouseButtons = 0; + uint16_t absoluteX = 0; + uint16_t absoluteY = 0; { CSRWSharedLock deviceLock(&s_deviceLock); HIDDeviceContext * context = s_device; @@ -583,6 +584,8 @@ NTSTATUS CHIDDevice::ResetReports() return STATUS_DEVICE_NOT_READY; mouseMode = context->mouseMode; + mouseButtons = mouseMode == HID_REPORT_ID_MOUSE_ABSOLUTE ? + context->absoluteButtons : context->relativeButtons; absoluteX = context->absoluteX; absoluteY = context->absoluteY; context->statistics.resetDiscarded += context->reportCount; @@ -602,36 +605,39 @@ NTSTATUS CHIDDevice::ResetReports() }; NTSTATUS status = STATUS_SUCCESS; - switch (mouseMode) + if (mouseButtons) { - case HID_REPORT_ID_MOUSE_RELATIVE: + switch (mouseMode) { - const HIDMouseRelativeReport relative = { - HID_REPORT_ID_MOUSE_RELATIVE, - 0, - 0, - 0, - 0, - }; - status = SubmitReport(&relative, sizeof(relative)); - break; - } + 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; - } + 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; + default: + break; + } } const NTSTATUS keyboardStatus =