From 7016d1ba24cc6a5cf529573cce0280d3d0116600 Mon Sep 17 00:00:00 2001 From: KeyffMS <124252104+KeyffMS@users.noreply.github.com> Date: Thu, 23 Jul 2026 20:48:37 +0200 Subject: [PATCH 1/3] Prevent duplicate runtime settings activation --- src/SightAdapt/RuntimeCoordinator.cs | 38 +++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/src/SightAdapt/RuntimeCoordinator.cs b/src/SightAdapt/RuntimeCoordinator.cs index 01d123dc..d23845de 100644 --- a/src/SightAdapt/RuntimeCoordinator.cs +++ b/src/SightAdapt/RuntimeCoordinator.cs @@ -35,6 +35,7 @@ internal sealed class RuntimeCoordinator private readonly Func _resolveIdentity; private readonly Action _showNotification; private readonly Action _synchronizeAutomaticMode; + private bool _committingSettings; public RuntimeCoordinator( SettingsCoordinator settingsCoordinator, @@ -119,7 +120,7 @@ public void ToggleActiveApplicationProfile() return; } - var commit = _settingsCoordinator.Commit(settings => + var commit = CommitSettings(settings => { var result = ApplicationProfileManagementService.Toggle( @@ -148,6 +149,10 @@ public void ToggleActiveApplicationProfile() { ResumeAutomaticOperation(); } + else + { + HandleSettingsChanged(); + } _showNotification(result.IsEnabled ? result.WasCreated @@ -159,7 +164,7 @@ public void ToggleActiveApplicationProfile() public void SetAutomaticMode(bool enabled) { - var commit = _settingsCoordinator.Commit(settings => + var commit = CommitSettings(settings => AutomaticModeManagementService.Set(settings, enabled)); if (!commit.Succeeded) @@ -173,6 +178,10 @@ public void SetAutomaticMode(bool enabled) { ResumeAutomaticOperation(); } + else + { + HandleSettingsChanged(); + } } public void HandleForegroundWindowChanged(nint candidate) @@ -191,6 +200,11 @@ public void HandleForegroundWindowChanged(nint candidate) public void HandleSettingsChanged() { + if (_committingSettings) + { + return; + } + if (_stateController.Current.Kind == ApplicationRunState.ManualActive) { @@ -237,7 +251,7 @@ public void EmergencyDisable() _stateController.SetEmergency( "All overlays were disabled."); - var commit = _settingsCoordinator.Commit(settings => + var commit = CommitSettings(settings => AutomaticModeManagementService.Disable(settings)); if (commit.Succeeded) @@ -261,6 +275,22 @@ public void DisableForExit() _stateController.SetInactive(); } + private SettingsCommitResult CommitSettings( + Func mutation) + { + ArgumentNullException.ThrowIfNull(mutation); + + _committingSettings = true; + try + { + return _settingsCoordinator.Commit(mutation); + } + finally + { + _committingSettings = false; + } + } + private void ResumeAutomaticOperation() { if (_stateController.Current.Kind is @@ -427,4 +457,4 @@ private void ShowCommitError(string? message) ? "Settings could not be changed." : message); } -} \ No newline at end of file +} From e9347196d6adf55e391eb90977cac8e27419b78f Mon Sep 17 00:00:00 2001 From: KeyffMS <124252104+KeyffMS@users.noreply.github.com> Date: Thu, 23 Jul 2026 20:49:06 +0200 Subject: [PATCH 2/3] Cover runtime settings event activation --- .../RuntimeCoordinatorTests.cs | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/tests/SightAdapt.Tests/RuntimeCoordinatorTests.cs b/tests/SightAdapt.Tests/RuntimeCoordinatorTests.cs index 50781f64..9e324cef 100644 --- a/tests/SightAdapt.Tests/RuntimeCoordinatorTests.cs +++ b/tests/SightAdapt.Tests/RuntimeCoordinatorTests.cs @@ -48,6 +48,43 @@ public void ForegroundChangeAutomaticallyActivatesConfiguredTarget() context.State.Current.VisualProfileId); } + [TestMethod] + public void ProfileToggleWithSettingsEventActivatesOverlayOnce() + { + using var context = new RuntimeTestContext(); + context.AddDisabledAssignment(); + context.WireSettingsChanged(); + + context.Coordinator.ToggleActiveApplicationProfile(); + + Assert.AreEqual(1, context.Overlay.ActivationCount); + Assert.IsTrue(context.Overlay.IsActive); + Assert.IsTrue( + context.Settings.Current.AutomaticMode); + Assert.AreEqual( + ApplicationRunState.AutomaticActive, + context.State.Current.Kind); + } + + [TestMethod] + public void EnablingAutomaticModeWithSettingsEventActivatesOverlayOnce() + { + using var context = new RuntimeTestContext(); + context.AddEnabledAssignment(); + context.DisableAutomaticMode(); + context.WireSettingsChanged(); + + context.Coordinator.SetAutomaticMode(enabled: true); + + Assert.AreEqual(1, context.Overlay.ActivationCount); + Assert.IsTrue(context.Overlay.IsActive); + Assert.IsTrue( + context.Settings.Current.AutomaticMode); + Assert.AreEqual( + ApplicationRunState.AutomaticActive, + context.State.Current.Kind); + } + [TestMethod] public void EmergencyDisablesOverlayBeforePersistingAutomaticMode() { @@ -141,6 +178,36 @@ public void AddEnabledAssignment() Assert.IsTrue(result.Succeeded); } + public void AddDisabledAssignment() + { + var result = Settings.Commit(settings => + { + var assignment = + ApplicationProfileManagementService.AddOrEnable( + settings, + _identity).Profile; + ApplicationProfileManagementService.SetEnabled( + settings, + assignment, + enabled: false); + AutomaticModeManagementService.Disable(settings); + }); + Assert.IsTrue(result.Succeeded); + } + + public void DisableAutomaticMode() + { + var result = Settings.Commit(settings => + AutomaticModeManagementService.Disable(settings)); + Assert.IsTrue(result.Succeeded); + } + + public void WireSettingsChanged() + { + Settings.Changed += (_, _) => + Coordinator.HandleSettingsChanged(); + } + public void Dispose() { if (Directory.Exists(_directory)) @@ -180,4 +247,4 @@ public void Disable() TargetWindow = nint.Zero; } } -} \ No newline at end of file +} From a65018aaa89a998936ccf266858409537bc84d18 Mon Sep 17 00:00:00 2001 From: KeyffMS <124252104+KeyffMS@users.noreply.github.com> Date: Thu, 23 Jul 2026 20:49:20 +0200 Subject: [PATCH 3/3] Advance version to 0.5.0.31 --- src/SightAdapt/SightAdapt.csproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SightAdapt/SightAdapt.csproj b/src/SightAdapt/SightAdapt.csproj index af7d8ce8..6402b546 100644 --- a/src/SightAdapt/SightAdapt.csproj +++ b/src/SightAdapt/SightAdapt.csproj @@ -16,10 +16,10 @@ Copyright © $(Company) MIT https://github.com/KeyffMS/SightAdapt - 0.5.0.30 + 0.5.0.31 0.5.0.0 - 0.5.0.30 - 0.5.0.30 + 0.5.0.31 + 0.5.0.31 x64 x64 10.0.19041.0