diff --git a/src/Avalonia.Native.OSX/window.mm b/src/Avalonia.Native.OSX/window.mm
index 9e2abfead1..a35d6ba8df 100644
--- a/src/Avalonia.Native.OSX/window.mm
+++ b/src/Avalonia.Native.OSX/window.mm
@@ -83,6 +83,38 @@ public:
[Window performWindowDragWithEvent:lastEvent];
}
+
+ virtual AvnPoint GetPosition ()
+ {
+ 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 = t - bottomLeft.Y;
+
+ return bottomLeft;
+ }
+
+ virtual void SetPosition (AvnPoint point)
+ {
+ NSPoint nspoint;
+ nspoint.x = point.X;
+ nspoint.y = point.Y;
+
+ NSRect screen = [NSScreen.screens objectAtIndex:0].frame;
+ auto t = MAX(screen.origin.y, screen.origin.y + screen.size.height);
+
+ nspoint.y = t - nspoint.y;
+
+ [Window setFrameTopLeftPoint:nspoint];
+ }
+
protected:
virtual NSWindowStyleMask GetStyle()
{
diff --git a/src/Avalonia.Native/Avalonia.Native.csproj b/src/Avalonia.Native/Avalonia.Native.csproj
index 9f699ab664..7b0eef0a92 100644
--- a/src/Avalonia.Native/Avalonia.Native.csproj
+++ b/src/Avalonia.Native/Avalonia.Native.csproj
@@ -12,4 +12,12 @@
+
+
+
+
+
+
+
+
diff --git a/src/Avalonia.Native/Helpers.cs b/src/Avalonia.Native/Helpers.cs
new file mode 100644
index 0000000000..941dd1dd14
--- /dev/null
+++ b/src/Avalonia.Native/Helpers.cs
@@ -0,0 +1,18 @@
+using System;
+using Avalonia.Native.Interop;
+
+namespace Avalonia.Native
+{
+ public static class Helpers
+ {
+ public static Point ToAvaloniaPoint (this AvnPoint pt)
+ {
+ return new Point(pt.X, pt.Y);
+ }
+
+ public static AvnPoint ToAvnPoint (this Point pt)
+ {
+ return new AvnPoint { X = pt.X, Y = pt.Y };
+ }
+ }
+}
diff --git a/src/Avalonia.Native/WindowImplBase.cs b/src/Avalonia.Native/WindowImplBase.cs
index b5defeda6a..00d8aba27d 100644
--- a/src/Avalonia.Native/WindowImplBase.cs
+++ b/src/Avalonia.Native/WindowImplBase.cs
@@ -118,11 +118,11 @@ namespace Avalonia.Native
switch (type)
{
case AvnRawMouseEventType.Wheel:
- Input?.Invoke(new RawMouseWheelEventArgs(_mouse, timeStamp, _inputRoot, new Point(point.X, point.Y), new Vector(delta.X, delta.Y), (InputModifiers)modifiers));
+ Input?.Invoke(new RawMouseWheelEventArgs(_mouse, timeStamp, _inputRoot, point.ToAvaloniaPoint(), new Vector(delta.X, delta.Y), (InputModifiers)modifiers));
break;
default:
- Input?.Invoke(new RawMouseEventArgs(_mouse, timeStamp, _inputRoot, (RawMouseEventType)type, new Point(point.X, point.Y), (InputModifiers)modifiers));
+ Input?.Invoke(new RawMouseEventArgs(_mouse, timeStamp, _inputRoot, (RawMouseEventType)type, point.ToAvaloniaPoint(), (InputModifiers)modifiers));
break;
}
}
@@ -164,10 +164,16 @@ namespace Avalonia.Native
}
+ public Point Position
+ {
+ get => _native.GetPosition().ToAvaloniaPoint();
+ set => _native.SetPosition(value.ToAvnPoint());
+ }
+
+
#region Stubs
public double Scaling => 1;
- public Point Position { get; set; }
public Action PositionChanged { get; set; }
public Action Deactivated { get; set; }
public Action Activated { get; set; }
diff --git a/src/headers/avalonia-native.h b/src/headers/avalonia-native.h
index 110dc0f425..d05f82045f 100644
--- a/src/headers/avalonia-native.h
+++ b/src/headers/avalonia-native.h
@@ -73,6 +73,8 @@ 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 void SetPosition (AvnPoint point) = 0;
};
AVNCOM(IAvnPopup, 03) : virtual IAvnWindowBase