From 4b7e4313fe7c0d745e787ebe7fe6df9d25329046 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 27 Nov 2019 00:41:36 +0100 Subject: [PATCH 01/13] Bump version to 0.9.999 for CI builds. Now that 0.9 is (nearly) out, bump version on master. --- build/SharedVersion.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/SharedVersion.props b/build/SharedVersion.props index 44d5c239ef..897e70ff81 100644 --- a/build/SharedVersion.props +++ b/build/SharedVersion.props @@ -2,7 +2,7 @@ xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> Avalonia - 0.8.999 + 0.9.999 Copyright 2019 © The AvaloniaUI Project https://avaloniaui.net https://github.com/AvaloniaUI/Avalonia/ From cff59382c78367859ab8a25da4987d8a62a1d451 Mon Sep 17 00:00:00 2001 From: FoggyFinder Date: Wed, 27 Nov 2019 11:16:28 +0200 Subject: [PATCH 02/13] adjust comments --- src/Avalonia.Input/InputElement.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Input/InputElement.cs b/src/Avalonia.Input/InputElement.cs index 535b930f8b..1e2a621bd1 100644 --- a/src/Avalonia.Input/InputElement.cs +++ b/src/Avalonia.Input/InputElement.cs @@ -342,7 +342,7 @@ namespace Avalonia.Input } /// - /// Gets or sets a value indicating whether the control is focused. + /// Gets a value indicating whether the control is focused. /// public bool IsFocused { @@ -360,7 +360,7 @@ namespace Avalonia.Input } /// - /// Gets or sets a value indicating whether the pointer is currently over the control. + /// Gets a value indicating whether the pointer is currently over the control. /// public bool IsPointerOver { From e61933c206857c829cde9c148b6b278e5bcce314 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 27 Nov 2019 19:59:45 +0000 Subject: [PATCH 03/13] [OSX] fix the osx menu on catalina. --- native/Avalonia.Native/src/OSX/app.mm | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/app.mm b/native/Avalonia.Native/src/OSX/app.mm index 81855995b7..5c50aad4cc 100644 --- a/native/Avalonia.Native/src/OSX/app.mm +++ b/native/Avalonia.Native/src/OSX/app.mm @@ -1,16 +1,25 @@ #include "common.h" @interface AvnAppDelegate : NSObject @end + extern NSApplicationActivationPolicy AvnDesiredActivationPolicy = NSApplicationActivationPolicyRegular; @implementation AvnAppDelegate - (void)applicationWillFinishLaunching:(NSNotification *)notification { - [[NSApplication sharedApplication] setActivationPolicy: AvnDesiredActivationPolicy]; + if([[NSApplication sharedApplication] activationPolicy] != AvnDesiredActivationPolicy) + { + for (NSRunningApplication * app in [NSRunningApplication runningApplicationsWithBundleIdentifier:@"com.apple.dock"]) { + [app activateWithOptions:NSApplicationActivateIgnoringOtherApps]; + break; + } + + [[NSApplication sharedApplication] setActivationPolicy: AvnDesiredActivationPolicy]; + } } - (void)applicationDidFinishLaunching:(NSNotification *)notification { - [NSApp activateIgnoringOtherApps:true]; + [[NSRunningApplication currentApplication] activateWithOptions:NSApplicationActivateIgnoringOtherApps]; } @end @@ -20,5 +29,4 @@ extern void InitializeAvnApp() NSApplication* app = [NSApplication sharedApplication]; id delegate = [AvnAppDelegate new]; [app setDelegate:delegate]; - } From d7be0f9837ac353c4d17ce2cad0c11ac6709cb87 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 11:12:34 +0000 Subject: [PATCH 04/13] add implementation of platform handles on the managed side. --- .../Platform/IMacOSTopLevelPlatformHandle.cs | 15 +++++++++ src/Avalonia.Native/WindowImplBase.cs | 33 ++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/Avalonia.Base/Platform/IMacOSTopLevelPlatformHandle.cs diff --git a/src/Avalonia.Base/Platform/IMacOSTopLevelPlatformHandle.cs b/src/Avalonia.Base/Platform/IMacOSTopLevelPlatformHandle.cs new file mode 100644 index 0000000000..837ea1abcd --- /dev/null +++ b/src/Avalonia.Base/Platform/IMacOSTopLevelPlatformHandle.cs @@ -0,0 +1,15 @@ +// Copyright (c) The Avalonia Project. All rights reserved. +// Licensed under the MIT license. See licence.md file in the project root for full license information. + +using System; + +namespace Avalonia.Platform +{ + public interface IMacOSTopLevelPlatformHandle + { + IntPtr NSView { get; } + IntPtr GetNSViewRetained(); + IntPtr NSWindow { get; } + IntPtr GetNSWindowRetained(); + } +} diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 8b397403ca..f8c9c7c440 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -16,6 +16,34 @@ using Avalonia.Threading; namespace Avalonia.Native { + public class MacOSTopLevelWindowHandle : IPlatformHandle, IMacOSTopLevelPlatformHandle + { + IAvnWindowBase _native; + + public MacOSTopLevelWindowHandle(IAvnWindowBase native) + { + _native = native; + } + + public IntPtr Handle => IntPtr.Zero; + + public string HandleDescriptor => "NOT SUPPORTED"; + + public IntPtr NSView => throw new NotImplementedException(); + + public IntPtr NSWindow => throw new NotImplementedException(); + + public IntPtr GetNSViewRetained() + { + throw new NotImplementedException(); + } + + public IntPtr GetNSWindowRetained() + { + throw new NotImplementedException(); + } + } + public abstract class WindowBaseImpl : IWindowBaseImpl, IFramebufferPlatformSurface { @@ -45,6 +73,9 @@ namespace Avalonia.Native protected void Init(IAvnWindowBase window, IAvnScreens screens) { _native = window; + + Handle = new MacOSTopLevelWindowHandle(window); + _glSurface = new GlPlatformSurface(window); Screen = new ScreenImpl(screens); _savedLogicalSize = ClientSize; @@ -349,6 +380,6 @@ namespace Avalonia.Native } - public IPlatformHandle Handle => new PlatformHandle(IntPtr.Zero, "NOT SUPPORTED"); + public IPlatformHandle Handle { get; private set; } } } From c41ef366287b0ee857f193a96d73e30925b2f62e Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 11:30:49 +0000 Subject: [PATCH 05/13] add osx implementation to get nsview and nswindow. --- native/Avalonia.Native/inc/avalonia-native.h | 4 ++ native/Avalonia.Native/src/OSX/window.mm | 48 ++++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index f1c7664c3e..e5d67717c1 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -212,6 +212,10 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown virtual HRESULT GetSoftwareFramebuffer(AvnFramebuffer*ret) = 0; virtual HRESULT SetMainMenu(IAvnAppMenu* menu) = 0; virtual HRESULT ObtainMainMenu(IAvnAppMenu** retOut) = 0; + virtual HRESULT GetNSWindowHandle(void** ret) = 0; + virtual HRESULT GetNSWindowHandleRetained(void** ret) = 0; + virtual HRESULT GetNSViewHandle(void** ret) = 0; + virtual HRESULT GetNSViewHandleRetained(void** ret) = 0; virtual bool TryLock() = 0; virtual void Unlock() = 0; }; diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index 0e85332555..ed86b2f612 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -83,6 +83,54 @@ public: [Window setContentView: View]; } + virtual HRESULT GetNSWindowHandle(void** ret) override + { + if (ret == nullptr) + { + return E_POINTER; + } + + *ret = (__bridge void*)Window; + + return S_OK; + } + + virtual HRESULT GetNSWindowHandleRetained(void** ret) override + { + if (ret == nullptr) + { + return E_POINTER; + } + + *ret = (__bridge_retained void*)Window; + + return S_OK; + } + + virtual HRESULT GetNSViewHandle(void** ret) override + { + if (ret == nullptr) + { + return E_POINTER; + } + + *ret = (__bridge void*)View; + + return S_OK; + } + + virtual HRESULT GetNSViewHandleRetained(void** ret) override + { + if (ret == nullptr) + { + return E_POINTER; + } + + *ret = (__bridge_retained void*)View; + + return S_OK; + } + virtual AvnWindow* GetNSWindow() override { return Window; From 9c67c805f96a04f15a46faaf3dfdf339d61ec175 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 11:41:44 +0000 Subject: [PATCH 06/13] fix method signature for sharpgen conventions. --- native/Avalonia.Native/inc/avalonia-native.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index e5d67717c1..becc354c0e 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -212,10 +212,10 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown virtual HRESULT GetSoftwareFramebuffer(AvnFramebuffer*ret) = 0; virtual HRESULT SetMainMenu(IAvnAppMenu* menu) = 0; virtual HRESULT ObtainMainMenu(IAvnAppMenu** retOut) = 0; - virtual HRESULT GetNSWindowHandle(void** ret) = 0; - virtual HRESULT GetNSWindowHandleRetained(void** ret) = 0; - virtual HRESULT GetNSViewHandle(void** ret) = 0; - virtual HRESULT GetNSViewHandleRetained(void** ret) = 0; + virtual HRESULT GetNSWindowHandle(void** ppv) = 0; + virtual HRESULT GetNSWindowHandleRetained(void** ppv) = 0; + virtual HRESULT GetNSViewHandle(void** ppv) = 0; + virtual HRESULT GetNSViewHandleRetained(void** ppv) = 0; virtual bool TryLock() = 0; virtual void Unlock() = 0; }; From 6cd6f71ee7c1037a8fe4cb7faa8653324c1c2f49 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 11:45:49 +0000 Subject: [PATCH 07/13] try out var --- native/Avalonia.Native/inc/avalonia-native.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index becc354c0e..9fa0123906 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -213,9 +213,9 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown virtual HRESULT SetMainMenu(IAvnAppMenu* menu) = 0; virtual HRESULT ObtainMainMenu(IAvnAppMenu** retOut) = 0; virtual HRESULT GetNSWindowHandle(void** ppv) = 0; - virtual HRESULT GetNSWindowHandleRetained(void** ppv) = 0; - virtual HRESULT GetNSViewHandle(void** ppv) = 0; - virtual HRESULT GetNSViewHandleRetained(void** ppv) = 0; + virtual HRESULT GetNSWindowHandleRetained(void** retOut) = 0; + virtual HRESULT GetNSViewHandle(void** retOut) = 0; + virtual HRESULT GetNSViewHandleRetained(void** retOut) = 0; virtual bool TryLock() = 0; virtual void Unlock() = 0; }; From 726d692cb675489fd54922dd7de8bc90e8117e06 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 11:48:03 +0000 Subject: [PATCH 08/13] use obtain instead of get so sharpgen doesnt generate invalid properties. --- native/Avalonia.Native/inc/avalonia-native.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/native/Avalonia.Native/inc/avalonia-native.h b/native/Avalonia.Native/inc/avalonia-native.h index 9fa0123906..06d6bdf311 100644 --- a/native/Avalonia.Native/inc/avalonia-native.h +++ b/native/Avalonia.Native/inc/avalonia-native.h @@ -212,10 +212,10 @@ AVNCOM(IAvnWindowBase, 02) : IUnknown virtual HRESULT GetSoftwareFramebuffer(AvnFramebuffer*ret) = 0; virtual HRESULT SetMainMenu(IAvnAppMenu* menu) = 0; virtual HRESULT ObtainMainMenu(IAvnAppMenu** retOut) = 0; - virtual HRESULT GetNSWindowHandle(void** ppv) = 0; - virtual HRESULT GetNSWindowHandleRetained(void** retOut) = 0; - virtual HRESULT GetNSViewHandle(void** retOut) = 0; - virtual HRESULT GetNSViewHandleRetained(void** retOut) = 0; + virtual HRESULT ObtainNSWindowHandle(void** retOut) = 0; + virtual HRESULT ObtainNSWindowHandleRetained(void** retOut) = 0; + virtual HRESULT ObtainNSViewHandle(void** retOut) = 0; + virtual HRESULT ObtainNSViewHandleRetained(void** retOut) = 0; virtual bool TryLock() = 0; virtual void Unlock() = 0; }; From b9f0898a37a9d004ae109c377e93509fd8a12f12 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 11:50:58 +0000 Subject: [PATCH 09/13] return native handles. --- src/Avalonia.Native/WindowImplBase.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index f8c9c7c440..d51da8fe1c 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -29,18 +29,18 @@ namespace Avalonia.Native public string HandleDescriptor => "NOT SUPPORTED"; - public IntPtr NSView => throw new NotImplementedException(); + public IntPtr NSView => _native.ObtainNSViewHandle(); - public IntPtr NSWindow => throw new NotImplementedException(); + public IntPtr NSWindow => _native.ObtainNSWindowHandle(); public IntPtr GetNSViewRetained() { - throw new NotImplementedException(); + return _native.ObtainNSViewHandleRetained(); } public IntPtr GetNSWindowRetained() { - throw new NotImplementedException(); + return _native.ObtainNSWindowHandleRetained(); } } From 916343448e8ac20a98da7ee38a728010495679d0 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 13:54:00 +0000 Subject: [PATCH 10/13] make the default handle the NSWindow. --- src/Avalonia.Native/WindowImplBase.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index d51da8fe1c..e72fefe3ce 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -25,9 +25,9 @@ namespace Avalonia.Native _native = native; } - public IntPtr Handle => IntPtr.Zero; + public IntPtr Handle => NSWindow; - public string HandleDescriptor => "NOT SUPPORTED"; + public string HandleDescriptor => "NSWindow"; public IntPtr NSView => _native.ObtainNSViewHandle(); From 172da86e65e9a982fe078ce008bbf8398d2d794f Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 14:00:43 +0000 Subject: [PATCH 11/13] fix Implementation method names. --- native/Avalonia.Native/src/OSX/window.mm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/native/Avalonia.Native/src/OSX/window.mm b/native/Avalonia.Native/src/OSX/window.mm index ed86b2f612..021f6e5603 100644 --- a/native/Avalonia.Native/src/OSX/window.mm +++ b/native/Avalonia.Native/src/OSX/window.mm @@ -83,7 +83,7 @@ public: [Window setContentView: View]; } - virtual HRESULT GetNSWindowHandle(void** ret) override + virtual HRESULT ObtainNSWindowHandle(void** ret) override { if (ret == nullptr) { @@ -95,7 +95,7 @@ public: return S_OK; } - virtual HRESULT GetNSWindowHandleRetained(void** ret) override + virtual HRESULT ObtainNSWindowHandleRetained(void** ret) override { if (ret == nullptr) { @@ -107,7 +107,7 @@ public: return S_OK; } - virtual HRESULT GetNSViewHandle(void** ret) override + virtual HRESULT ObtainNSViewHandle(void** ret) override { if (ret == nullptr) { @@ -119,7 +119,7 @@ public: return S_OK; } - virtual HRESULT GetNSViewHandleRetained(void** ret) override + virtual HRESULT ObtainNSViewHandleRetained(void** ret) override { if (ret == nullptr) { From 0d2e10498f2f46d92ff34731eb1ca08dcb1c5672 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 19:37:30 +0000 Subject: [PATCH 12/13] Window shouldnt call HandleClosed as this is called by TopLevel signaled by backed Closed event. --- src/Avalonia.Controls/Window.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Avalonia.Controls/Window.cs b/src/Avalonia.Controls/Window.cs index 1816a6c81d..f66a248aaf 100644 --- a/src/Avalonia.Controls/Window.cs +++ b/src/Avalonia.Controls/Window.cs @@ -336,7 +336,6 @@ namespace Avalonia.Controls if (close) { PlatformImpl?.Dispose(); - HandleClosed(); } } } From b8b8e3f8cc16a7669a0360e00582390c55d4c16a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 29 Nov 2019 10:44:39 +0100 Subject: [PATCH 13/13] Fix IWindowImpl mocks to call Close on Dispose. --- tests/Avalonia.Controls.UnitTests/WindowTests.cs | 3 +-- tests/Avalonia.UnitTests/MockWindowingPlatform.cs | 4 ++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/Avalonia.Controls.UnitTests/WindowTests.cs b/tests/Avalonia.Controls.UnitTests/WindowTests.cs index d87014f646..0508edd92f 100644 --- a/tests/Avalonia.Controls.UnitTests/WindowTests.cs +++ b/tests/Avalonia.Controls.UnitTests/WindowTests.cs @@ -228,8 +228,7 @@ namespace Avalonia.Controls.UnitTests { using (UnitTestApplication.Start(TestServices.StyledWindow)) { - var windowImpl = Mock.Of(x => x.Scaling == 1); - var target = new Window(windowImpl); + var target = new Window(); target.Show(); target.Close(); diff --git a/tests/Avalonia.UnitTests/MockWindowingPlatform.cs b/tests/Avalonia.UnitTests/MockWindowingPlatform.cs index c33ec72141..a6701ef655 100644 --- a/tests/Avalonia.UnitTests/MockWindowingPlatform.cs +++ b/tests/Avalonia.UnitTests/MockWindowingPlatform.cs @@ -28,6 +28,10 @@ namespace Avalonia.UnitTests return CreatePopupMock().Object; }); + mock.Setup(x => x.Dispose()).Callback(() => + { + mock.Object.Closed?.Invoke(); + }); PixelPoint pos = default; mock.SetupGet(x => x.Position).Returns(() => pos); mock.Setup(x => x.Move(It.IsAny())).Callback(new Action(np => pos = np));