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)