コード例 #1
0
        // 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);
        }
コード例 #2
0
        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);
        }