diff --git a/idd/LGIdd/ipc/CInputPipeServer.cpp b/idd/LGIdd/ipc/CInputPipeServer.cpp index 0bf368f6..e53b523f 100644 --- a/idd/LGIdd/ipc/CInputPipeServer.cpp +++ b/idd/LGIdd/ipc/CInputPipeServer.cpp @@ -636,6 +636,11 @@ bool CInputPipeServer::OnPipeMessage( const LGInputPipeMessage& frame = *static_cast(message); + + CSRWExclusiveLock connectionLock(m_connectionLock); + if (!(Atomic::Load(m_state, std::memory_order_relaxed) & 1)) + return true; + if (frame.magic != LG_INPUT_PIPE_MAGIC || frame.version != LG_INPUT_PIPE_VERSION || frame.type != LG_INPUT_PIPE_MESSAGE_KEYBOARD_LEDS || diff --git a/idd/LGInput/ipc/CInputPipeClient.cpp b/idd/LGInput/ipc/CInputPipeClient.cpp index 7e01d647..8d7c14e8 100644 --- a/idd/LGInput/ipc/CInputPipeClient.cpp +++ b/idd/LGInput/ipc/CInputPipeClient.cpp @@ -82,9 +82,12 @@ void CInputPipeClient::OnPipeConnected() { CSRWExclusiveLock lock(m_feedbackLock); m_feedbackSequence = 0; - m_feedbackReady = SendKeyboardLEDsLocked(); - if (!m_feedbackReady) + m_feedbackReady = true; + if (m_keyboardLEDsValid && !SendKeyboardLEDsLocked()) + { + m_feedbackReady = false; DEBUG_WARN("Failed to report LGInput keyboard LEDs"); + } } DEBUG_INFO("Connected to the LGIdd input transport"); } @@ -353,10 +356,11 @@ void CInputPipeClient::UpdateKeyboardLEDs(uint8_t leds) leds &= mask; CSRWExclusiveLock lock(m_feedbackLock); - if (m_keyboardLEDs == leds) + if (m_keyboardLEDsValid && m_keyboardLEDs == leds) return; - m_keyboardLEDs = leds; + m_keyboardLEDs = leds; + m_keyboardLEDsValid = true; if (m_feedbackReady && !SendKeyboardLEDsLocked()) { m_feedbackReady = false; diff --git a/idd/LGInput/ipc/CInputPipeClient.h b/idd/LGInput/ipc/CInputPipeClient.h index 297cc0fc..d6243b1a 100644 --- a/idd/LGInput/ipc/CInputPipeClient.h +++ b/idd/LGInput/ipc/CInputPipeClient.h @@ -50,13 +50,14 @@ private: CPipeEndpoint m_endpoint; CSRWLock m_feedbackLock; - bool m_feedbackReady = false; - uint64_t m_feedbackSequence = 0; - uint8_t m_keyboardLEDs = 0; - uint64_t m_lastSequence = 0; - uint64_t m_statReceived = 0; - uint64_t m_statMalformed = 0; - uint64_t m_statSequenceResets = 0; - uint64_t m_statSubmitFailed = 0; - ULONGLONG m_lastStatistics = 0; + bool m_feedbackReady = false; + bool m_keyboardLEDsValid = false; + uint64_t m_feedbackSequence = 0; + uint8_t m_keyboardLEDs = 0; + uint64_t m_lastSequence = 0; + uint64_t m_statReceived = 0; + uint64_t m_statMalformed = 0; + uint64_t m_statSequenceResets = 0; + uint64_t m_statSubmitFailed = 0; + ULONGLONG m_lastStatistics = 0; };