// The following two methods are backward compatible (10.7) public static CGPoint ConvertPointFromScreenSafe(this NSWindow window, CGPoint point) { return(window.ConvertRectFromScreen(new CGRect(point, CGSize.Empty)).Location); }
public virtual NSObject GetAccessibilityHitTest(CGPoint pointOnScreen) { var gdkWindow = parent.GdkWindow; if (gdkWindow == null) { return(this); } var ptr = gdk_quartz_window_get_nswindow(gdkWindow.Handle); if (ptr == IntPtr.Zero) { return(this); } NSWindow nsWin = Runtime.GetNSObject <NSWindow> (ptr); CGRect screenRect = new CGRect(pointOnScreen.X, pointOnScreen.Y, 1, 1); CGRect windowRect = nsWin.ConvertRectFromScreen(screenRect); CGPoint pointInWindow = new CGPoint(windowRect.X, windowRect.Y); // Flip the y coords to Gtk origin nfloat halfWindowHeight = nsWin.ContentView.Frame.Height / 2; nfloat dy = pointInWindow.Y - halfWindowHeight; CGPoint pointInGtkWindow = new CGPoint(pointInWindow.X, halfWindowHeight - dy); int parentInWindowX, parentInWindowY; GetCoordsInWindow(parent, out parentInWindowX, out parentInWindowY); if (AccessibilityChildren == null) { return(this); } foreach (var o in AccessibilityChildren) { var proxy = o as RealAccessibilityElementProxy; if (proxy == null) { throw new Exception($"Unsupported type {o.GetType ()} inside AccessibilityElementProxy"); } if (proxy.AccessibilityHidden) { continue; } var frameInRealParent = proxy.realFrame; if (frameInRealParent.X + parentInWindowX < pointInGtkWindow.X && frameInRealParent.X + parentInWindowX + frameInRealParent.Width >= pointInGtkWindow.X && frameInRealParent.Y + parentInWindowY < pointInGtkWindow.Y && frameInRealParent.Y + parentInWindowY + frameInRealParent.Height >= pointInGtkWindow.Y) { return(proxy.GetAccessibilityHitTest(pointOnScreen)); } } return(this); }