From 0116f7ad9616dcff55ccdb987c93b9ee62827a0a Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 14 May 2020 11:58:09 -0300 Subject: [PATCH] remove disabledBy array on win32. --- src/Avalonia.Controls/Window.cs | 20 +++++++++++++++++++- src/Windows/Avalonia.Win32/WindowImpl.cs | 22 +++++----------------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 7fa21669f7..ea4cdb395f 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -69,6 +69,9 @@ namespace Avalonia.Controls /// public class Window : WindowBase, IStyleable, IFocusScope, ILayoutRoot { + private List _children = new List(); + private Window _owner; + /// /// Defines the property. /// @@ -366,6 +369,12 @@ namespace Avalonia.Controls { if (close) { + if(_owner != null) + { + _owner._children.Remove(this); + _owner = null; + } + PlatformImpl?.Dispose(); } } @@ -408,6 +417,14 @@ namespace Avalonia.Controls using (BeginAutoSizing()) { Renderer?.Stop(); + + if (_owner != null) + { + _owner._children.Remove(this); + // update enabled state of parent. + _owner = null; + } + PlatformImpl?.Hide(); } @@ -521,7 +538,8 @@ namespace Avalonia.Controls using (BeginAutoSizing()) { PlatformImpl.SetParent(owner.PlatformImpl); - owner.PlatformImpl.SetEnabled(false); + owner._children.Add(this); + owner.PlatformImpl.SetEnabled(false); PlatformImpl?.Show(); Renderer?.Start(); diff --git a/src/Windows/Avalonia.Win32/WindowImpl.cs b/src/Windows/Avalonia.Win32/WindowImpl.cs index d57884c29e..192fa2ec0e 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.cs @@ -44,8 +44,7 @@ namespace Avalonia.Win32 private readonly ManagedWindowResizeDragHelper _managedDrag; #endif - private const WindowStyles WindowStateMask = (WindowStyles.WS_MAXIMIZE | WindowStyles.WS_MINIMIZE); - private readonly List _disabledBy; + private const WindowStyles WindowStateMask = (WindowStyles.WS_MAXIMIZE | WindowStyles.WS_MINIMIZE); private readonly TouchDevice _touchDevice; private readonly MouseDevice _mouseDevice; private readonly ManagedDeferredRendererLock _rendererLock; @@ -70,7 +69,6 @@ namespace Avalonia.Win32 public WindowImpl() { - _disabledBy = new List(); _touchDevice = new TouchDevice(); _mouseDevice = new WindowsMouseDevice(); @@ -342,13 +340,6 @@ namespace Avalonia.Win32 public void Hide() { - if (_parent != null) - { - _parent._disabledBy.Remove(this); - _parent.UpdateEnabled(); - _parent = null; - } - UnmanagedMethods.ShowWindow(_hwnd, ShowWindowCommand.Hide); } @@ -363,7 +354,7 @@ namespace Avalonia.Win32 public void SetParent(IWindowImpl parent) { _parent = (WindowImpl)parent; - _parent._disabledBy.Add(this); + SetOwnerHandle(_parent._hwnd); } public void SetEnabled(bool enable) => EnableWindow(_hwnd, enable); @@ -665,7 +656,9 @@ namespace Avalonia.Win32 SetWindowPos(_hwnd, WindowPosZOrder.HWND_NOTOPMOST, x, y, cx, cy, SetWindowPosFlags.SWP_SHOWWINDOW); } } - } + } + + private void SetOwnerHandle(IntPtr handle) => SetWindowLongPtr(_hwnd, (int)WindowLongParam.GWL_HWNDPARENT, handle); private WindowStyles GetWindowStateStyles () { @@ -722,11 +715,6 @@ namespace Avalonia.Win32 } } - private void UpdateEnabled() - { - SetEnabled(_disabledBy.Count == 0); - } - private void UpdateWindowProperties(WindowProperties newProperties, bool forceChanges = false) { var oldProperties = _windowProperties;