diff --git a/LanMountainDesktop/Views/MainWindow.DesktopPaging.cs b/LanMountainDesktop/Views/MainWindow.DesktopPaging.cs index 4ff3f0c..621eb9d 100644 --- a/LanMountainDesktop/Views/MainWindow.DesktopPaging.cs +++ b/LanMountainDesktop/Views/MainWindow.DesktopPaging.cs @@ -479,7 +479,7 @@ public partial class MainWindow _currentDesktopSurfaceIndex = target; BeginDesktopPageContextSettle(previousIndex, target); ApplyDesktopSurfaceOffset(); - PersistSettings(); + SchedulePersistSettings(delayMs: Math.Max(280, (int)FluttermotionToken.Page.TotalMilliseconds + 80)); } private bool CanSwipeDesktopSurface() diff --git a/LanMountainDesktop/Views/MainWindow.SettingsHardCut.Stubs.cs b/LanMountainDesktop/Views/MainWindow.SettingsHardCut.Stubs.cs index 3abb52f..ef9f4c8 100644 --- a/LanMountainDesktop/Views/MainWindow.SettingsHardCut.Stubs.cs +++ b/LanMountainDesktop/Views/MainWindow.SettingsHardCut.Stubs.cs @@ -32,6 +32,11 @@ public partial class MainWindow { _ = sender; + if (_suppressOwnSettingsReloadCount > 0) + { + return; + } + if (e.Scope == SettingsScope.App && e.ChangedKeys is { Count: > 0 }) { var changedKeys = e.ChangedKeys.ToArray(); @@ -382,6 +387,7 @@ public partial class MainWindow private void PersistSettings() { + _persistSettingsRevision++; if (_suppressSettingsPersistence) { return; @@ -389,6 +395,8 @@ public partial class MainWindow try { + // Saving our own state should not trigger a full external reload cycle. + _suppressOwnSettingsReloadCount++; _settingsService.SaveSnapshot(SettingsScope.App, BuildAppSettingsSnapshot()); _componentLayoutStore.SaveLayout(BuildDesktopLayoutSettingsSnapshot()); _settingsService.SaveSnapshot(SettingsScope.Launcher, BuildLauncherSettingsSnapshot()); @@ -397,11 +405,29 @@ public partial class MainWindow { AppLogger.Warn("SettingsRuntime", "Failed to persist settings.", ex); } + finally + { + if (_suppressOwnSettingsReloadCount > 0) + { + _suppressOwnSettingsReloadCount--; + } + } } private void SchedulePersistSettings(int delayMs = 200) { - DispatcherTimer.RunOnce(PersistSettings, TimeSpan.FromMilliseconds(Math.Max(0, delayMs))); + var revision = ++_persistSettingsRevision; + DispatcherTimer.RunOnce( + () => + { + if (revision != _persistSettingsRevision) + { + return; + } + + PersistSettings(); + }, + TimeSpan.FromMilliseconds(Math.Max(0, delayMs))); } internal void ReloadFromPersistedSettings() diff --git a/LanMountainDesktop/Views/MainWindow.axaml b/LanMountainDesktop/Views/MainWindow.axaml index 55f2704..f9f1c4b 100644 --- a/LanMountainDesktop/Views/MainWindow.axaml +++ b/LanMountainDesktop/Views/MainWindow.axaml @@ -145,7 +145,9 @@ - + diff --git a/LanMountainDesktop/Views/MainWindow.axaml.cs b/LanMountainDesktop/Views/MainWindow.axaml.cs index fb3f319..a033ac1 100644 --- a/LanMountainDesktop/Views/MainWindow.axaml.cs +++ b/LanMountainDesktop/Views/MainWindow.axaml.cs @@ -153,6 +153,8 @@ public partial class MainWindow : Window, ISettingsWindowAnchorProvider private bool _isWeatherPreviewInProgress; private ClockDisplayFormat _clockDisplayFormat = ClockDisplayFormat.HourMinuteSecond; private bool _externalSettingsReloadPending; + private int _persistSettingsRevision; + private int _suppressOwnSettingsReloadCount; private double CurrentDesktopPitch => _currentDesktopCellSize + _currentDesktopCellGap; public MainWindow()