Fixed initial theme desync

This commit is contained in:
Jaylyn Barbee
2025-11-07 17:42:12 -05:00
parent bd73f4ad26
commit 62ea01e54f
3 changed files with 40 additions and 7 deletions

View File

@@ -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);
// ────────────────────────────────────────────────────────────────

View File

@@ -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<std::mutex> 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<int, int> 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;

View File

@@ -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; }