From 07774ea4be9096a5ba8db2571fff6876c2084895 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 24 Sep 2018 18:05:02 +0100 Subject: [PATCH 1/2] implement max client size and top most. --- src/Avalonia.Native.OSX/window.mm | 20 ++++++++++++++++++++ src/Avalonia.Native/Helpers.cs | 5 +++++ src/Avalonia.Native/WindowImplBase.cs | 15 +++++++++------ src/headers/avalonia-native.h | 3 +++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/Avalonia.Native.OSX/window.mm b/src/Avalonia.Native.OSX/window.mm index c97569a548..ec25dcf428 100644 --- a/src/Avalonia.Native.OSX/window.mm +++ b/src/Avalonia.Native.OSX/window.mm @@ -44,6 +44,13 @@ public: return S_OK; } + virtual HRESULT SetTopMost (bool value) + { + [Window setLevel: value ? NSFloatingWindowLevel : NSNormalWindowLevel]; + + return S_OK; + } + virtual HRESULT Close() { [Window close]; @@ -60,6 +67,19 @@ public: return S_OK; } + virtual HRESULT GetMaxClientSize(AvnSize* ret) + { + if(ret == nullptr) + return E_POINTER; + + auto size = [NSScreen.screens objectAtIndex:0].frame.size; + + ret->Height = size.height; + ret->Width = size.width; + + return S_OK; + } + virtual HRESULT GetScaling (double* ret) { if(ret == nullptr) diff --git a/src/Avalonia.Native/Helpers.cs b/src/Avalonia.Native/Helpers.cs index 941dd1dd14..77673edd1b 100644 --- a/src/Avalonia.Native/Helpers.cs +++ b/src/Avalonia.Native/Helpers.cs @@ -14,5 +14,10 @@ namespace Avalonia.Native { return new AvnPoint { X = pt.X, Y = pt.Y }; } + + public static Size ToAvaloniaSize (this AvnSize size) + { + return new Size(size.Width, size.Height); + } } } diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index e6d4af62e1..e8893c0250 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -190,9 +190,17 @@ namespace Avalonia.Native _native.BeginMoveDrag(); } - #region Stubs + public Size MaxClientSize => _native.GetMaxClientSize().ToAvaloniaSize(); + + public void SetTopmost(bool value) + { + _native.SetTopMost(value); + } + public double Scaling => _native.GetScaling(); + #region Stubs + public Action PositionChanged { get; set; } public Action Deactivated { get; set; } public Action Activated { get; set; } @@ -201,16 +209,11 @@ namespace Avalonia.Native Action ScalingChanged { get; set; } public IPlatformHandle Handle => new PlatformHandle(IntPtr.Zero, "NOT SUPPORTED"); - public Size MaxClientSize => new Size(1600, 900); public IScreenImpl Screen => new ScreenImpl(); Action ITopLevelImpl.ScalingChanged { get; set; } - public void SetTopmost(bool value) - { - } - public void SetMinMaxSize(Size minSize, Size maxSize) { } diff --git a/src/headers/avalonia-native.h b/src/headers/avalonia-native.h index 4775859395..d69fb1201c 100644 --- a/src/headers/avalonia-native.h +++ b/src/headers/avalonia-native.h @@ -73,6 +73,7 @@ AVNCOM(IAvnWindowBase, 02) : virtual IUnknown virtual HRESULT Hide () = 0; virtual HRESULT Close() = 0; virtual HRESULT GetClientSize(AvnSize*ret) = 0; + virtual HRESULT GetMaxClientSize(AvnSize* ret) = 0; virtual HRESULT GetScaling(double*ret)=0; virtual HRESULT Resize(double width, double height) = 0; virtual void Invalidate (AvnRect rect) = 0; @@ -81,6 +82,8 @@ AVNCOM(IAvnWindowBase, 02) : virtual IUnknown virtual void SetPosition (AvnPoint point) = 0; virtual HRESULT PointToClient (AvnPoint point, AvnPoint*ret) = 0; virtual HRESULT PointToScreen (AvnPoint point, AvnPoint*ret) = 0; + virtual HRESULT SetTopMost (bool value) = 0; + }; AVNCOM(IAvnPopup, 03) : virtual IAvnWindowBase From 79a82e1ea5bf2232eb04f9a9326310ec5cec3e02 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Mon, 24 Sep 2018 18:16:05 +0100 Subject: [PATCH 2/2] implement scaling changed callback. --- src/Avalonia.Native.OSX/window.mm | 5 +++++ src/Avalonia.Native/WindowImplBase.cs | 13 ++++++++++--- src/headers/avalonia-native.h | 2 ++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Native.OSX/window.mm b/src/Avalonia.Native.OSX/window.mm index ec25dcf428..dd2df1be27 100644 --- a/src/Avalonia.Native.OSX/window.mm +++ b/src/Avalonia.Native.OSX/window.mm @@ -418,6 +418,11 @@ protected: return (AvnInputModifiers)rv; } + +- (void)viewDidChangeBackingProperties +{ + _parent->BaseEvents->ScalingChanged(); +} @end diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index e8893c0250..5a37f33cdf 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -99,10 +99,15 @@ namespace Avalonia.Native void IAvnWindowBaseEvents.Resized(AvnSize size) => _parent.Resized?.Invoke(new Size(size.Width, size.Height)); - public void RawMouseEvent(AvnRawMouseEventType type, uint timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) + void IAvnWindowBaseEvents.RawMouseEvent(AvnRawMouseEventType type, uint timeStamp, AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) { _parent.RawMouseEvent(type, timeStamp, modifiers, point, delta); } + + void IAvnWindowBaseEvents.ScalingChanged() + { + _parent.ScalingChanged?.Invoke(_parent.Scaling); + } } @@ -199,11 +204,13 @@ namespace Avalonia.Native public double Scaling => _native.GetScaling(); + public Action Deactivated { get; set; } + public Action Activated { get; set; } + #region Stubs public Action PositionChanged { get; set; } - public Action Deactivated { get; set; } - public Action Activated { get; set; } + public Action Input { get; set; } Action ScalingChanged { get; set; } diff --git a/src/headers/avalonia-native.h b/src/headers/avalonia-native.h index d69fb1201c..1cc4b92de8 100644 --- a/src/headers/avalonia-native.h +++ b/src/headers/avalonia-native.h @@ -109,6 +109,8 @@ AVNCOM(IAvnWindowBaseEvents, 05) : IUnknown AvnInputModifiers modifiers, AvnPoint point, AvnVector delta) = 0; + + virtual void ScalingChanged () = 0; };