From 4631a14c446dcd5a7e27ddcdaed0ca9783e38172 Mon Sep 17 00:00:00 2001 From: Geoffrey McRae Date: Sat, 18 Jul 2026 04:12:13 +1000 Subject: [PATCH] [idd] implement config reload --- idd/LGIdd/CPipeServer.cpp | 17 +++++++++++++++-- idd/LGIdd/CPipeServer.h | 9 ++++++++- idd/LGIdd/Device.cpp | 5 +++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/idd/LGIdd/CPipeServer.cpp b/idd/LGIdd/CPipeServer.cpp index 1b260212..a47f4977 100644 --- a/idd/LGIdd/CPipeServer.cpp +++ b/idd/LGIdd/CPipeServer.cpp @@ -20,6 +20,7 @@ #include "CPipeServer.h" #include "CDebug.h" +#include "CIndirectDeviceContext.h" CPipeServer g_pipe; @@ -257,7 +258,19 @@ void CPipeServer::WriteMsg(const LGPipeMsg & msg) void CPipeServer::HandleReloadSettings() { - DEBUG_INFO("TODO: reload settings"); + DEBUG_INFO("Reloading settings"); + + AcquireSRWLockShared(&m_deviceContextLock); + if (m_deviceContext) + m_deviceContext->ReplugMonitor(); + ReleaseSRWLockShared(&m_deviceContextLock); +} + +void CPipeServer::SetDeviceContext(CIndirectDeviceContext* context) +{ + AcquireSRWLockExclusive(&m_deviceContextLock); + m_deviceContext = context; + ReleaseSRWLockExclusive(&m_deviceContextLock); } void CPipeServer::SetCursorPos(uint32_t x, uint32_t y) @@ -292,4 +305,4 @@ void CPipeServer::SetGPUStatus(bool software) msg.type = LGPipeMsg::GPUSTATUS; msg.gpuStatus.software = software; WriteMsg(msg); -} \ No newline at end of file +} diff --git a/idd/LGIdd/CPipeServer.h b/idd/LGIdd/CPipeServer.h index d1dfacd6..f509f0a0 100644 --- a/idd/LGIdd/CPipeServer.h +++ b/idd/LGIdd/CPipeServer.h @@ -32,6 +32,8 @@ using namespace Microsoft::WRL; using namespace Microsoft::WRL::Wrappers; using namespace Microsoft::WRL::Wrappers::HandleTraits; +class CIndirectDeviceContext; + class CPipeServer { private: @@ -43,6 +45,9 @@ class CPipeServer bool m_running = false; bool m_connected = false; + SRWLOCK m_deviceContextLock = SRWLOCK_INIT; + CIndirectDeviceContext* m_deviceContext = nullptr; + void _DeInit(); static DWORD WINAPI _pipeThread(LPVOID lpParam) { ((CPipeServer*)lpParam)->Thread(); return 0; } @@ -58,9 +63,11 @@ class CPipeServer bool Init(); void DeInit(); + void SetDeviceContext(CIndirectDeviceContext* context); + void SetCursorPos(uint32_t x, uint32_t y); void SetDisplayMode(uint32_t width, uint32_t height, uint32_t refresh); void SetGPUStatus(bool software); }; -extern CPipeServer g_pipe; \ No newline at end of file +extern CPipeServer g_pipe; diff --git a/idd/LGIdd/Device.cpp b/idd/LGIdd/Device.cpp index 8335ba46..e4142763 100644 --- a/idd/LGIdd/Device.cpp +++ b/idd/LGIdd/Device.cpp @@ -32,6 +32,7 @@ #include "CDebug.h" #include "CIndirectDeviceContext.h" #include "CIndirectMonitorContext.h" +#include "CPipeServer.h" #include "CSettings.h" WDFDEVICE l_wdfDevice = nullptr; @@ -74,6 +75,7 @@ NTSTATUS LGIddAdapterInitFinished(IDDCX_ADAPTER adapter, const IDARG_IN_ADAPTER_ return STATUS_SUCCESS; wrapper->context->FinishInit(0); + g_pipe.SetDeviceContext(wrapper->context); return STATUS_SUCCESS; } @@ -256,7 +258,10 @@ NTSTATUS LGIddCreateDevice(_Inout_ PWDFDEVICE_INIT deviceInit) { auto * wrapper = WdfObjectGet_CIndirectDeviceContextWrapper(object); if (wrapper) + { + g_pipe.SetDeviceContext(nullptr); wrapper->Cleanup(); + } l_wdfDevice = nullptr; };