From 613ce0106144c939f7ceab53f3812ebe9b24f7b9 Mon Sep 17 00:00:00 2001 From: hexawyz <8518235+hexawyz@users.noreply.github.com> Date: Sun, 9 Feb 2025 02:36:18 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20interactive=20embedded=20m?= =?UTF-8?q?onitor=20configuration=20changes=20not=20being=20notified.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmbeddedMonitorService.cs | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/Exo/Service/Exo.Service.Core/EmbeddedMonitorService.cs b/src/Exo/Service/Exo.Service.Core/EmbeddedMonitorService.cs index 6d7ca61..ac523bf 100644 --- a/src/Exo/Service/Exo.Service.Core/EmbeddedMonitorService.cs +++ b/src/Exo/Service/Exo.Service.Core/EmbeddedMonitorService.cs @@ -673,6 +673,7 @@ public async ValueTask SetBuiltInGraphicsAsync(Guid deviceId, Guid monitorId, Gu if (!_embeddedMonitorDeviceStates.TryGetValue(deviceId, out var deviceState)) throw new InvalidOperationException("Device not found."); PersistedMonitorConfiguration configuration; + ChannelWriter[]? configurationChangeListeners; using (await deviceState.Lock.WaitAsync(cancellationToken).ConfigureAwait(false)) { @@ -681,9 +682,23 @@ public async ValueTask SetBuiltInGraphicsAsync(Guid deviceId, Guid monitorId, Gu if (!await monitorState.SetBuiltInGraphicsAsync(graphicsId, cancellationToken).ConfigureAwait(false)) return; configuration = monitorState.CreatePersistedConfiguration(); + + configurationChangeListeners = Volatile.Read(ref _configurationChangeListeners); } await PersistConfigurationAsync(deviceState.EmbeddedMonitorConfigurationContainer, monitorId, configuration, cancellationToken).ConfigureAwait(false); + + configurationChangeListeners?.TryWrite + ( + new EmbeddedMonitorConfigurationWatchNotification + { + DeviceId = deviceId, + MonitorId = monitorId, + GraphicsId = configuration.GraphicsId, + ImageId = configuration.ImageId, + ImageRegion = configuration.ImageRegion, + } + ); } public async ValueTask SetImageAsync(Guid deviceId, Guid monitorId, UInt128 imageId, Rectangle imageRegion, CancellationToken cancellationToken) @@ -699,6 +714,7 @@ public async ValueTask SetImageAsync(Guid deviceId, Guid monitorId, UInt128 imag } PersistedMonitorConfiguration configuration; + ChannelWriter[]? configurationChangeListeners; using (await deviceState.Lock.WaitAsync(cancellationToken).ConfigureAwait(false)) { @@ -707,9 +723,23 @@ public async ValueTask SetImageAsync(Guid deviceId, Guid monitorId, UInt128 imag if (!await monitorState.SetImageAsync(_imageStorageService, imageId, imageRegion, cancellationToken).ConfigureAwait(false)) return; configuration = monitorState.CreatePersistedConfiguration(); + + configurationChangeListeners = Volatile.Read(ref _configurationChangeListeners); } await PersistConfigurationAsync(deviceState.EmbeddedMonitorConfigurationContainer, monitorId, configuration, cancellationToken).ConfigureAwait(false); + + configurationChangeListeners?.TryWrite + ( + new EmbeddedMonitorConfigurationWatchNotification + { + DeviceId = deviceId, + MonitorId = monitorId, + GraphicsId = configuration.GraphicsId, + ImageId = configuration.ImageId, + ImageRegion = configuration.ImageRegion, + } + ); } public async IAsyncEnumerable WatchDevicesAsync([EnumeratorCancellation] CancellationToken cancellationToken)