From 975f23e8dbd8f382dc3ff6e5e5b538a284e79afd Mon Sep 17 00:00:00 2001 From: Isaac Daly Date: Thu, 21 Mar 2024 20:29:11 +1100 Subject: [PATCH] MonitorManager locks --- src/Whim/Monitor/MonitorManager.cs | 59 ++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 19 deletions(-) diff --git a/src/Whim/Monitor/MonitorManager.cs b/src/Whim/Monitor/MonitorManager.cs index 276b0a46a..eb3e13bc2 100644 --- a/src/Whim/Monitor/MonitorManager.cs +++ b/src/Whim/Monitor/MonitorManager.cs @@ -14,6 +14,7 @@ namespace Whim; /// internal class MonitorManager : IInternalMonitorManager, IMonitorManager { + private readonly object _lockObj = new(); private readonly IContext _context; private readonly IInternalContext _internalContext; @@ -74,6 +75,7 @@ public void Initialize() public void OnWindowFocused(IWindow? window) { + using Lock _ = new(_lockObj); // If we know the window, use what the Butler knows instead of Windows. if (window is not null) { @@ -119,6 +121,7 @@ public void OnWindowFocused(IWindow? window) public void ActivateEmptyMonitor(IMonitor monitor) { + using Lock _ = new(_lockObj); Logger.Debug($"Activating empty monitor {monitor}"); if (!_monitors.Contains(monitor)) @@ -144,16 +147,46 @@ private void WindowMessageMonitor_SessionChanged(object? sender, WindowMessageMo private void WindowMessageMonitor_MonitorsChanged(object? sender, WindowMessageMonitorEventArgs e) { + OnMonitorsChanged( + e, + out List unchangedMonitors, + out List removedMonitors, + out List addedMonitors + ); + + // Notify listeners of the unchanged, removed, and added monitors. + MonitorsChangedEventArgs args = + new() + { + UnchangedMonitors = unchangedMonitors, + RemovedMonitors = removedMonitors, + AddedMonitors = addedMonitors + }; + + if (addedMonitors.Count != 0 || removedMonitors.Count != 0) + { + _internalContext.ButlerEventHandlers.OnMonitorsChanged(args); + } + MonitorsChanged?.Invoke(this, args); + } + + private void OnMonitorsChanged( + WindowMessageMonitorEventArgs e, + out List unchangedMonitors, + out List removedMonitors, + out List addedMonitors + ) + { + using Lock _ = new(_lockObj); Logger.Debug($"Monitors changed: {e.MessagePayload}"); // Get the new monitors. IMonitor[] previousMonitors = _monitors; _monitors = GetCurrentMonitors(); - List unchangedMonitors = new(); - List removedMonitors = new(); - List addedMonitors = new(); - + unchangedMonitors = new(); + removedMonitors = new(); + addedMonitors = new(); HashSet previousMonitorsSet = new(previousMonitors); HashSet currentMonitorsSet = new(_monitors); @@ -183,21 +216,6 @@ private void WindowMessageMonitor_MonitorsChanged(object? sender, WindowMessageM PrimaryMonitor = monitor; } } - - // Notify listeners of the unchanged, removed, and added monitors. - MonitorsChangedEventArgs args = - new() - { - UnchangedMonitors = unchangedMonitors, - RemovedMonitors = removedMonitors, - AddedMonitors = addedMonitors - }; - - if (addedMonitors.Count != 0 || removedMonitors.Count != 0) - { - _internalContext.ButlerEventHandlers.OnMonitorsChanged(args); - } - MonitorsChanged?.Invoke(this, args); } private void MouseHook_MouseLeftButtonUp(object? sender, MouseEventArgs e) @@ -267,6 +285,7 @@ private unsafe Monitor[] GetCurrentMonitors() public IMonitor GetMonitorAtPoint(IPoint point) { + using Lock _ = new(_lockObj); Logger.Debug($"Getting monitor at point {point}"); HMONITOR hmonitor = _internalContext.CoreNativeManager.MonitorFromPoint( point.ToSystemPoint(), @@ -285,6 +304,7 @@ public IMonitor GetMonitorAtPoint(IPoint point) public IMonitor GetPreviousMonitor(IMonitor monitor) { + using Lock _ = new(_lockObj); Logger.Debug($"Getting previous monitor for {monitor}"); int index = Array.IndexOf(_monitors, monitor); @@ -299,6 +319,7 @@ public IMonitor GetPreviousMonitor(IMonitor monitor) public IMonitor GetNextMonitor(IMonitor monitor) { + using Lock _ = new(_lockObj); Logger.Debug($"Getting next monitor for {monitor}"); int index = Array.IndexOf(_monitors, monitor);