From b3e7c9d22752429caa9f6103e43b845676c3e3a9 Mon Sep 17 00:00:00 2001 From: Jaylyn Barbee <51131738+Jaylyn-Barbee@users.noreply.github.com> Date: Mon, 2 Feb 2026 20:23:54 -0500 Subject: [PATCH] [Light Switch] Fix Light Switch start up logic (#45304) ## Summary of the Pull Request Title ## PR Checklist - [x] Closes: https://github.com/microsoft/PowerToys/issues/45291 - [x] **Communication:** I've discussed this with core contributors already. If the work hasn't been agreed, this work might be rejected ## Detailed Description of the Pull Request / Additional comments Before, there was a function that initialized some variables about the current system state that were later used to check against if that state needed to change in a different function. That caused from some issues because I was reusing the function for a double purpose. Now the `SyncInitialThemeState()` function in the State Manager will sync those initial variables and apply the correct theme if needed. I also removed an unnecessary parameter from `onTick` ## Validation Steps Performed Manual testing --- .../LightSwitch/LightSwitchService/LightSwitchService.cpp | 3 +-- .../LightSwitchService/LightSwitchStateManager.cpp | 6 +++++- .../LightSwitchService/LightSwitchStateManager.h | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp index 8919f4274b..5b4fa8297b 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp @@ -250,7 +250,6 @@ DWORD WINAPI ServiceWorkerThread(LPVOID lpParam) Logger::info(L"[LightSwitchService] Initialized at {:02d}:{:02d}.", st.wHour, st.wMinute); stateManager.SyncInitialThemeState(); - stateManager.OnTick(nowMinutes); // ──────────────────────────────────────────────────────────────── // Worker Loop @@ -281,7 +280,7 @@ DWORD WINAPI ServiceWorkerThread(LPVOID lpParam) GetLocalTime(&st); nowMinutes = st.wHour * 60 + st.wMinute; DetectAndHandleExternalThemeChange(stateManager); - stateManager.OnTick(nowMinutes); + stateManager.OnTick(); continue; } diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.cpp b/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.cpp index f562d38c41..cc4f959881 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.cpp +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.cpp @@ -28,7 +28,7 @@ void LightSwitchStateManager::OnSettingsChanged() } // Called once per minute -void LightSwitchStateManager::OnTick(int currentMinutes) +void LightSwitchStateManager::OnTick() { std::lock_guard lock(_stateMutex); if (_state.lastAppliedMode != ScheduleMode::FollowNightLight) @@ -109,10 +109,14 @@ void LightSwitchStateManager::SyncInitialThemeState() std::lock_guard lock(_stateMutex); _state.isSystemLightActive = GetCurrentSystemTheme(); _state.isAppsLightActive = GetCurrentAppsTheme(); + _state.isNightLightActive = IsNightLightEnabled(); Logger::debug(L"[LightSwitchStateManager] Synced initial state to current system theme ({})", _state.isSystemLightActive ? L"light" : L"dark"); Logger::debug(L"[LightSwitchStateManager] Synced initial state to current apps theme ({})", _state.isAppsLightActive ? L"light" : L"dark"); + + // This will ensure that the theme is applied according to current settings at startup + EvaluateAndApplyIfNeeded(); } static std::pair update_sun_times(auto& settings) diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.h b/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.h index c4f39a2e9a..65d6f7ada7 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.h +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.h @@ -28,7 +28,7 @@ public: void OnSettingsChanged(); // Called every minute (from service worker tick). - void OnTick(int currentMinutes); + void OnTick(); // Called when manual override is toggled (via shortcut or system change). void OnManualOverride();