From d7be0f9837ac353c4d17ce2cad0c11ac6709cb87 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 28 Nov 2019 11:12:34 +0000 Subject: [PATCH 1/8] 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 2/8] 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 3/8] 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 4/8] 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 5/8] 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 6/8] 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 7/8] 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 8/8] 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) {