diff --git a/src/Avalonia.Native.OSX/window.mm b/src/Avalonia.Native.OSX/window.mm index 2b04fd2e42..608f828e0e 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) @@ -468,6 +488,11 @@ NSArray* AllLoopModes = [NSArray arrayWithObjects: NSDefaultRunLoopMode, NSEvent return (AvnInputModifiers)rv; } + +- (void)viewDidChangeBackingProperties +{ + _parent->BaseEvents->ScalingChanged(); +} @end 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 f40d8ad4e7..98068773a8 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -129,7 +129,7 @@ namespace Avalonia.Native _parent.Resized?.Invoke(s); } - 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); } @@ -235,27 +235,32 @@ 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(); - public Action PositionChanged { get; set; } public Action Deactivated { get; set; } public Action Activated { get; set; } + + #region Stubs + + public Action PositionChanged { get; set; } + public Action Input { get; set; } 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 d5d13a369d..8d637e7f38 100644 --- a/src/headers/avalonia-native.h +++ b/src/headers/avalonia-native.h @@ -90,6 +90,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; @@ -99,6 +100,7 @@ AVNCOM(IAvnWindowBase, 02) : virtual IUnknown virtual HRESULT PointToClient (AvnPoint point, AvnPoint*ret) = 0; virtual HRESULT PointToScreen (AvnPoint point, AvnPoint*ret) = 0; virtual HRESULT ThreadSafeSetSwRenderedFrame(AvnFramebuffer* fb, IUnknown* dispose) = 0; + virtual HRESULT SetTopMost (bool value) = 0; }; AVNCOM(IAvnPopup, 03) : virtual IAvnWindowBase