From 26d47460967501bebb0790dd68e6576919b5e439 Mon Sep 17 00:00:00 2001 From: jankrib Date: Tue, 13 Jun 2023 13:35:13 +0200 Subject: [PATCH] Break layout flip flop in headless --- .../Avalonia.Headless/HeadlessWindowImpl.cs | 13 ++++++---- .../RenderingTests.cs | 24 ++++++++++++++++++- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs b/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs index 84aca6e94f..c7eb07ba10 100644 --- a/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs +++ b/src/Headless/Avalonia.Headless/HeadlessWindowImpl.cs @@ -114,23 +114,26 @@ namespace Avalonia.Headless public Size MaxClientSize { get; } = new Size(1920, 1280); public void Resize(Size clientSize, WindowResizeReason reason) { + if (ClientSize == clientSize) + return; + // Emulate X11 behavior here if (IsPopup) - DoResize(clientSize); + DoResize(clientSize, reason); else Dispatcher.UIThread.Post(() => { - DoResize(clientSize); - }); + DoResize(clientSize, reason); + }, DispatcherPriority.Send); } - private void DoResize(Size clientSize) + private void DoResize(Size clientSize, WindowResizeReason reason) { // Uncomment this check and experience a weird bug in layout engine if (ClientSize != clientSize) { ClientSize = clientSize; - Resized?.Invoke(clientSize, WindowResizeReason.Unspecified); + Resized?.Invoke(clientSize, reason); } } diff --git a/tests/Avalonia.Headless.UnitTests/RenderingTests.cs b/tests/Avalonia.Headless.UnitTests/RenderingTests.cs index 3f45bf97e4..cda459e7f9 100644 --- a/tests/Avalonia.Headless.UnitTests/RenderingTests.cs +++ b/tests/Avalonia.Headless.UnitTests/RenderingTests.cs @@ -1,4 +1,5 @@ -using Avalonia.Controls; +using System.Collections.ObjectModel; +using Avalonia.Controls; using Avalonia.Layout; using Avalonia.Media; using Avalonia.Threading; @@ -24,6 +25,27 @@ public class RenderingTests Content = new PathIcon { Data = StreamGeometry.Parse("M0,9 L10,0 20,9 19,10 10,2 1,10 z") +#if NUNIT + [AvaloniaTest, Timeout(10000)] +#elif XUNIT + [AvaloniaFact(Timeout = 10000)] +#endif + public void Should_Not_Hang_With_Non_Trivial_Layout() + { + var window = new Window + { + Content = new ContentControl + { + HorizontalAlignment = HorizontalAlignment.Stretch, + VerticalAlignment = VerticalAlignment.Stretch, + Padding = new Thickness(1), + Content = new ListBox + { + ItemsSource = new ObservableCollection() + { + "Test 1", + "Test 2" + } } }, SizeToContent = SizeToContent.WidthAndHeight