Browse Source

Fix embedded TopLevel coordinate conversion (#16181)

* Fix embedded TopLevel coordinate conversion

* Adjust client / screen coordinate conversion

* Remove commented code
pull/16258/head
Benedikt Stebner 2 years ago
committed by GitHub
parent
commit
3eda9a0e22
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      native/Avalonia.Native/src/OSX/AvnView.h
  2. 22
      native/Avalonia.Native/src/OSX/AvnView.mm
  3. 2
      native/Avalonia.Native/src/OSX/AvnWindow.mm
  4. 41
      native/Avalonia.Native/src/OSX/TopLevelImpl.mm

1
native/Avalonia.Native/src/OSX/AvnView.h

@ -23,5 +23,4 @@
-(void) setResizeReason:(AvnPlatformResizeReason)reason;
-(void) setRenderTarget:(NSObject<IRenderTarget>* _Nonnull)target;
-(void) raiseAccessibilityChildrenChanged;
+ (AvnPoint)toAvnPoint:(CGPoint)p;
@end

22
native/Avalonia.Native/src/OSX/AvnView.mm

@ -189,16 +189,6 @@
return pt;
}
+ (AvnPoint)toAvnPoint:(CGPoint)p
{
AvnPoint result;
result.X = p.x;
result.Y = p.y;
return result;
}
- (void) viewDidChangeBackingProperties
{
auto fsize = [self convertSizeToBacking: [self frame].size];
@ -255,9 +245,13 @@
return;
}
auto localPoint = [self convertPoint:[event locationInWindow] toView:self];
auto avnPoint = [AvnView toAvnPoint:localPoint];
auto point = [self translateLocalPoint:avnPoint];
NSPoint eventLocation = [event locationInWindow];
auto viewLocation = [self convertPoint:NSMakePoint(0, 0) toView:nil];
auto localPoint = NSMakePoint(eventLocation.x - viewLocation.x, viewLocation.y - eventLocation.y);
auto point = ToAvnPoint(localPoint);
AvnVector delta = { 0, 0};
if(type == Wheel)
@ -734,7 +728,7 @@
- (NSDragOperation)triggerAvnDragEvent: (AvnDragEventType) type info: (id <NSDraggingInfo>)info
{
auto localPoint = [self convertPoint:[info draggingLocation] toView:self];
auto avnPoint = [AvnView toAvnPoint:localPoint];
auto avnPoint = ToAvnPoint(localPoint);
auto point = [self translateLocalPoint:avnPoint];
auto modifiers = [self getModifiers:[[NSApp currentEvent] modifierFlags]];
NSDragOperation nsop = [info draggingSourceOperationMask];

2
native/Avalonia.Native/src/OSX/AvnWindow.mm

@ -462,7 +462,7 @@
if (!NSPointInRect(viewPoint, view.bounds))
{
auto avnPoint = [AvnView toAvnPoint:windowPoint];
auto avnPoint = ToAvnPoint(windowPoint);
auto point = [self translateLocalPoint:avnPoint];
AvnVector delta = { 0, 0 };

41
native/Avalonia.Native/src/OSX/TopLevelImpl.mm

@ -192,11 +192,23 @@ HRESULT TopLevelImpl::PointToClient(AvnPoint point, AvnPoint *ret) {
return S_OK;
}
point = ConvertPointY(point);
NSRect convertRect = [window convertRectFromScreen:NSMakeRect(point.X, point.Y, 0.0, 0.0)];
auto viewPoint = NSMakePoint(convertRect.origin.x, convertRect.origin.y);
auto frame = [View frame];
auto viewRect = [View convertRect:frame toView:nil];
auto viewScreenRect = [window convertRectToScreen:viewRect];
auto primaryDisplayHeight = NSMaxY([[[NSScreen screens] firstObject] frame]);
//Window coord are bottom to top so we need to adjust by primaryScreenHeight
auto viewScreenLocation = NSMakePoint(viewScreenRect.origin.x, primaryDisplayHeight - viewScreenRect.origin.y - frame.size.height);
//Substract client point from screen position of the view
auto localPoint = NSMakePoint(point.X - viewScreenLocation.x, point.Y - viewScreenLocation.y);
point = ToAvnPoint(localPoint);
*ret = [View translateLocalPoint:ToAvnPoint(viewPoint)];
*ret = point;
return S_OK;
}
@ -217,11 +229,24 @@ HRESULT TopLevelImpl::PointToScreen(AvnPoint point, AvnPoint *ret) {
return S_OK;
}
auto frame = [View frame];
//Get rect inside current window
auto viewRect = [View convertRect:frame toView:nil];
//Get screen rect of the view
auto viewScreenRect = [window convertRectToScreen:viewRect];
auto primaryDisplayHeight = NSMaxY([[[NSScreen screens] firstObject] frame]);
//Window coord are bottom to top so we need to adjust by primaryScreenHeight
auto viewScreenLocation = NSMakePoint(viewScreenRect.origin.x, primaryDisplayHeight - viewScreenRect.origin.y - frame.size.height);
auto cocoaViewPoint = ToNSPoint([View translateLocalPoint:point]);
NSRect convertRect = [window convertRectToScreen:NSMakeRect(cocoaViewPoint.x, cocoaViewPoint.y, 0.0, 0.0)];
auto cocoaScreenPoint = NSPointFromCGPoint(NSMakePoint(convertRect.origin.x, convertRect.origin.y));
*ret = ConvertPointY(ToAvnPoint(cocoaScreenPoint));
//Add client point to screen position of the view
auto screenPoint = ToAvnPoint(NSMakePoint(viewScreenLocation.x + point.X, viewScreenLocation.y + point.Y));
*ret = screenPoint;
return S_OK;
}

Loading…
Cancel
Save