diff --git a/src/Avalonia.Native.OSX/window.mm b/src/Avalonia.Native.OSX/window.mm index a35d6ba8df..2bc596d347 100644 --- a/src/Avalonia.Native.OSX/window.mm +++ b/src/Avalonia.Native.OSX/window.mm @@ -5,6 +5,7 @@ class WindowBaseImpl; @interface AvnView : NSView -(AvnView*) initWithParent: (WindowBaseImpl*) parent; -(NSEvent*) lastMouseDownEvent; +-(AvnPoint)translateLocalPoint:(AvnPoint)pt; @end @interface AvnWindow : NSWindow @@ -84,35 +85,56 @@ public: } - virtual AvnPoint GetPosition () + virtual HRESULT GetPosition (AvnPoint* ret) { + if(ret == nullptr) + { + return E_POINTER; + } + auto frame = [Window frame]; AvnPoint bottomLeft; bottomLeft.X = frame.origin.x; - bottomLeft.Y = frame.origin.y + frame.size.width; - - NSRect screen = [NSScreen.screens objectAtIndex:0].frame; - - auto t = MAX(screen.origin.y, screen.origin.y + screen.size.height); + bottomLeft.Y = frame.origin.y + frame.size.height; - bottomLeft.Y = t - bottomLeft.Y; + *ret = ConvertPointY(bottomLeft); - return bottomLeft; + return S_OK; } virtual void SetPosition (AvnPoint point) { - NSPoint nspoint; - nspoint.x = point.X; - nspoint.y = point.Y; + [Window setFrameTopLeftPoint:ToNSPoint(ConvertPointY(point))]; + } + + virtual HRESULT PointToClient (AvnPoint point, AvnPoint* ret) + { + if(ret == nullptr) + { + return E_POINTER; + } - NSRect screen = [NSScreen.screens objectAtIndex:0].frame; - auto t = MAX(screen.origin.y, screen.origin.y + screen.size.height); + point = ConvertPointY(point); + auto viewPoint = [Window convertScreenToBase:ToNSPoint(point)]; - nspoint.y = t - nspoint.y; + *ret = [View translateLocalPoint:ToAvnPoint(viewPoint)]; - [Window setFrameTopLeftPoint:nspoint]; + return S_OK; + } + + virtual HRESULT PointToScreen (AvnPoint point, AvnPoint* ret) + { + if(ret == nullptr) + { + return E_POINTER; + } + + auto cocoaViewPoint = ToNSPoint([View translateLocalPoint:point]); + auto cocoaScreenPoint = [Window convertBaseToScreen:cocoaViewPoint]; + *ret = ConvertPointY(ToAvnPoint(cocoaScreenPoint)); + + return S_OK; } protected: @@ -235,7 +257,6 @@ protected: } } - auto timestamp = [event timestamp] * 1000; auto modifiers = [self getModifiers:[event modifierFlags]]; diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs index 00d8aba27d..bd5c03b583 100644 --- a/src/Avalonia.Native/WindowImplBase.cs +++ b/src/Avalonia.Native/WindowImplBase.cs @@ -170,6 +170,25 @@ namespace Avalonia.Native set => _native.SetPosition(value.ToAvnPoint()); } + public Point PointToClient(Point point) + { + return _native.PointToClient(point.ToAvnPoint()).ToAvaloniaPoint(); + } + + public Point PointToScreen(Point point) + { + return _native.PointToScreen(point.ToAvnPoint()).ToAvaloniaPoint(); + } + + public void Hide() + { + _native.Hide(); + } + + public void BeginMoveDrag() + { + _native.BeginMoveDrag(); + } #region Stubs public double Scaling => 1; @@ -201,30 +220,10 @@ namespace Avalonia.Native { } - public void Hide() - { - _native.Hide(); - } - - public void BeginMoveDrag() - { - _native.BeginMoveDrag(); - } - public void BeginResizeDrag(WindowEdge edge) { } - public Point PointToClient(Point point) - { - return point; - } - - public Point PointToScreen(Point point) - { - return point; - } - #endregion } } diff --git a/src/headers/avalonia-native.h b/src/headers/avalonia-native.h index d05f82045f..237ea62381 100644 --- a/src/headers/avalonia-native.h +++ b/src/headers/avalonia-native.h @@ -73,8 +73,10 @@ AVNCOM(IAvnWindowBase, 02) : virtual IUnknown virtual HRESULT Resize(double width, double height) = 0; virtual void Invalidate (AvnRect rect) = 0; virtual void BeginMoveDrag () = 0; - virtual AvnPoint GetPosition () = 0; + virtual HRESULT GetPosition (AvnPoint*ret) = 0; virtual void SetPosition (AvnPoint point) = 0; + virtual HRESULT PointToClient (AvnPoint point, AvnPoint*ret) = 0; + virtual HRESULT PointToScreen (AvnPoint point, AvnPoint*ret) = 0; }; AVNCOM(IAvnPopup, 03) : virtual IAvnWindowBase