diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp index 6d5371c321..ac517a8e8c 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchService.cpp @@ -217,6 +217,7 @@ DWORD WINAPI ServiceWorkerThread(LPVOID lpParam) int nowMinutes = st.wHour * 60 + st.wMinute; Logger::info(L"[LightSwitchService] Initialized at {:02d}:{:02d}.", st.wHour, st.wMinute); + stateManager.SyncInitialThemeState(); stateManager.OnTick(nowMinutes); // ──────────────────────────────────────────────────────────────── diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.cpp b/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.cpp index a10f5235a2..024fd20e3b 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.cpp +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.cpp @@ -47,10 +47,13 @@ void LightSwitchStateManager::OnManualOverride() // When entering manual override, sync internal theme state to match the current system if (_state.isManualOverride) { - bool systemLight = GetCurrentSystemTheme(); - _state.isLightThemeActive = systemLight; - Logger::info(L"[LightSwitchStateManager] Synced internal theme state to current system theme ({})", - systemLight ? L"light" : L"dark"); + _state.isSystemLightActive = GetCurrentSystemTheme(); + + _state.isAppsLightActive = GetCurrentAppsTheme(); + + Logger::info(L"[LightSwitchStateManager] Synced internal theme state to current system theme ({}) and apps theme ({}).", + (_state.isSystemLightActive ? L"light" : L"dark"), + (_state.isAppsLightActive ? L"light" : L"dark")); } EvaluateAndApplyIfNeeded(); @@ -71,6 +74,17 @@ bool LightSwitchStateManager::CoordinatesAreValid(const std::wstring& lat, const } } +void LightSwitchStateManager::SyncInitialThemeState() +{ + std::lock_guard lock(_stateMutex); + _state.isSystemLightActive = GetCurrentSystemTheme(); + _state.isAppsLightActive = GetCurrentAppsTheme(); + Logger::info(L"[LightSwitchStateManager] Synced initial state to current system theme ({})", + _state.isSystemLightActive ? L"light" : L"dark"); + Logger::info(L"[LightSwitchStateManager] Synced initial state to current apps theme ({})", + _state.isAppsLightActive ? L"light" : L"dark"); +} + static std::pair update_sun_times(auto& settings) { double latitude = std::stod(settings.latitude); @@ -183,12 +197,26 @@ void LightSwitchStateManager::EvaluateAndApplyIfNeeded() bool shouldBeLight = ShouldBeLight(now, _state.effectiveLightMinutes, _state.effectiveDarkMinutes); + bool appsNeedsToChange = _currentSettings.changeApps && (_state.isAppsLightActive != shouldBeLight); + bool systemNeedsToChange = _currentSettings.changeSystem && (_state.isSystemLightActive != shouldBeLight); + + Logger::debug("should be light = {}, apps needs change = {}, system needs change = {}", + shouldBeLight ? "true" : "false", + appsNeedsToChange ? "true" : "false", + systemNeedsToChange ? "true" : "false"); + // Only apply theme if there's a change or no override active - if (!_state.isManualOverride && _state.isLightThemeActive != shouldBeLight) + if (!_state.isManualOverride && (appsNeedsToChange || systemNeedsToChange)) { Logger::info(L"[LightSwitchStateManager] Applying {} theme", shouldBeLight ? L"light" : L"dark"); ApplyTheme(shouldBeLight); - _state.isLightThemeActive = shouldBeLight; + + _state.isSystemLightActive = GetCurrentSystemTheme(); + _state.isAppsLightActive = GetCurrentAppsTheme(); + + Logger::debug(L"[LightSwitchStateManager] Synced post-apply theme state — System: {}, Apps: {}", + _state.isSystemLightActive ? L"light" : L"dark", + _state.isAppsLightActive ? L"light" : L"dark"); } _state.lastTickMinutes = now; diff --git a/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.h b/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.h index 778fa5281c..5c9bcc6e25 100644 --- a/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.h +++ b/src/modules/LightSwitch/LightSwitchService/LightSwitchStateManager.h @@ -7,7 +7,8 @@ struct LightSwitchState { ScheduleMode lastAppliedMode = ScheduleMode::Off; bool isManualOverride = false; - bool isLightThemeActive = false; + bool isSystemLightActive = false; + bool isAppsLightActive = false; int lastEvaluatedDay = -1; int lastTickMinutes = -1; @@ -31,6 +32,9 @@ public: // Called when manual override is toggled (via shortcut or system change). void OnManualOverride(); + // Initial sync at startup to align internal state with system theme + void SyncInitialThemeState(); + // Accessor for current state (optional, for debugging or telemetry) const LightSwitchState& GetState() const { return _state; }