From 10247f3dc2f80e00584e098964715e09a8d832f0 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 3 Jun 2022 16:03:05 +0300 Subject: [PATCH] Stop animations from ticking when window is hidden --- .../Server/ServerCompositionTarget.cs | 22 +++++++++++++++++++ .../Composition/Server/ServerVisual.cs | 6 ++--- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs index 9513fb58fa..e8c417a98d 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerCompositionTarget.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Numerics; using System.Threading; using Avalonia.Media; @@ -24,6 +25,7 @@ namespace Avalonia.Rendering.Composition.Server private IDrawingContextLayerImpl? _layer; private bool _redrawRequested; private bool _disposed; + private HashSet _attachedVisuals = new(); public ReadbackIndices Readback { get; } = new(); @@ -39,9 +41,17 @@ namespace Avalonia.Rendering.Composition.Server partial void OnIsEnabledChanged() { if (IsEnabled) + { _compositor.AddCompositionTarget(this); + foreach (var v in _attachedVisuals) + v.Activate(); + } else + { _compositor.RemoveCompositionTarget(this); + foreach (var v in _attachedVisuals) + v.Deactivate(); + } } partial void DeserializeChangesExtra(BatchStreamReader c) @@ -155,5 +165,17 @@ namespace Avalonia.Rendering.Composition.Server _renderTarget?.Dispose(); _renderTarget = null; } + + public void AddVisual(ServerCompositionVisual visual) + { + if (_attachedVisuals.Add(visual) && IsEnabled) + visual.Activate(); + } + + public void RemoveVisual(ServerCompositionVisual visual) + { + if (_attachedVisuals.Remove(visual) && IsEnabled) + visual.Deactivate(); + } } } \ No newline at end of file diff --git a/src/Avalonia.Base/Rendering/Composition/Server/ServerVisual.cs b/src/Avalonia.Base/Rendering/Composition/Server/ServerVisual.cs index 5717ab2f8c..5c7067bfb1 100644 --- a/src/Avalonia.Base/Rendering/Composition/Server/ServerVisual.cs +++ b/src/Avalonia.Base/Rendering/Composition/Server/ServerVisual.cs @@ -126,14 +126,14 @@ namespace Avalonia.Rendering.Composition.Server partial void OnRootChanging() { - if(Root != null) - Deactivate(); + if (Root != null) + Root.RemoveVisual(this); } partial void OnRootChanged() { if (Root != null) - Activate(); + Root.AddVisual(this); } protected override void ValuesInvalidated()