Browse Source

Re-removed clamped

Tig 1 year ago
parent
commit
17f9927a76

+ 2 - 2
Terminal.Gui/View/Adornment/Adornment.cs

@@ -83,7 +83,7 @@ public class Adornment : View
     }
     }
 
 
     /// <inheritdoc/>
     /// <inheritdoc/>
-    public override void BoundsToScreen (int col, int row, out int rcol, out int rrow, bool clipped = true)
+    public override void BoundsToScreen (int col, int row, out int rcol, out int rrow)
     {
     {
         // Adornments are *Children* of a View, not SubViews. Thus View.BoundsToScreen will not work.
         // Adornments are *Children* of a View, not SubViews. Thus View.BoundsToScreen will not work.
         // To get the screen-relative coordinates of a Adornment, we need to know who
         // To get the screen-relative coordinates of a Adornment, we need to know who
@@ -94,7 +94,7 @@ public class Adornment : View
 
 
         // We now have rcol/rrow in coordinates relative to our View's SuperView. If our View's SuperView has
         // We now have rcol/rrow in coordinates relative to our View's SuperView. If our View's SuperView has
         // a SuperView, keep going...
         // a SuperView, keep going...
-        Parent?.SuperView?.BoundsToScreen (rcol, rrow, out rcol, out rrow, clipped);
+        Parent?.SuperView?.BoundsToScreen (rcol, rrow, out rcol, out rrow);
     }
     }
 
 
     /// <inheritdoc/>
     /// <inheritdoc/>

+ 2 - 14
Terminal.Gui/View/Layout/ViewLayout.cs

@@ -501,7 +501,7 @@ public partial class View
     /// <summary>Converts a <see cref="Bounds"/>-relative region to a screen-relative region.</summary>
     /// <summary>Converts a <see cref="Bounds"/>-relative region to a screen-relative region.</summary>
     public Rectangle BoundsToScreen (Rectangle region)
     public Rectangle BoundsToScreen (Rectangle region)
     {
     {
-        BoundsToScreen (region.X, region.Y, out int screenX, out int screenY, false);
+        BoundsToScreen (region.X, region.Y, out int screenX, out int screenY);
 
 
         return region with { X = screenX, Y = screenY };
         return region with { X = screenX, Y = screenY };
     }
     }
@@ -514,12 +514,7 @@ public partial class View
     /// <param name="y"><see cref="Bounds"/>-relative row.</param>
     /// <param name="y"><see cref="Bounds"/>-relative row.</param>
     /// <param name="rx">Absolute column; screen-relative.</param>
     /// <param name="rx">Absolute column; screen-relative.</param>
     /// <param name="ry">Absolute row; screen-relative.</param>
     /// <param name="ry">Absolute row; screen-relative.</param>
-    /// <param name="clamped">
-    ///     If <see langword="true"/>, <paramref name="rx"/> and <paramref name="ry"/> will be clamped to the
-    ///     screen dimensions (will never be negative and will always be less than <see cref="ConsoleDriver.Cols"/> and
-    ///     <see cref="ConsoleDriver.Rows"/>, respectively.
-    /// </param>
-    public virtual void BoundsToScreen (int x, int y, out int rx, out int ry, bool clamped = true)
+    public virtual void BoundsToScreen (int x, int y, out int rx, out int ry)
     {
     {
         // PERF: Use Point.Offset
         // PERF: Use Point.Offset
         // Already dealing with Point here.
         // Already dealing with Point here.
@@ -536,13 +531,6 @@ public partial class View
             ry += super.Frame.Y + boundsOffset.Y;
             ry += super.Frame.Y + boundsOffset.Y;
             super = super.SuperView;
             super = super.SuperView;
         }
         }
-
-        // The following ensures that the cursor is always in the screen boundaries.
-        if (clamped)
-        {
-            ry = Math.Min (ry, Driver.Rows - 1);
-            rx = Math.Min (rx, Driver.Cols - 1);
-        }
     }
     }
 
 
 #nullable enable
 #nullable enable

+ 2 - 2
Terminal.Gui/View/ViewDrawing.cs

@@ -334,8 +334,8 @@ public partial class View
             return;
             return;
         }
         }
 
 
-        BoundsToScreen (col, row, out int rCol, out int rRow, false);
-        Driver?.Move (rCol, rRow);
+        Rectangle screen = BoundsToScreen (new (col, row, 0, 0));
+        Driver?.Move (screen.X, screen.Y);
     }
     }
 
 
     // TODO: Make this cancelable
     // TODO: Make this cancelable

+ 2 - 4
Terminal.Gui/Views/Menu/ContextMenu.cs

@@ -147,8 +147,7 @@ public sealed class ContextMenu : IDisposable
 
 
         if (Host is { })
         if (Host is { })
         {
         {
-            Host.BoundsToScreen (frame.X, frame.Y, out int x, out int y);
-            var pos = new Point (x, y);
+            Point pos = Host.BoundsToScreen (frame).Location;
             pos.Y += Host.Frame.Height - 1;
             pos.Y += Host.Frame.Height - 1;
 
 
             if (position != pos)
             if (position != pos)
@@ -185,8 +184,7 @@ public sealed class ContextMenu : IDisposable
                 }
                 }
                 else
                 else
                 {
                 {
-                    Host.BoundsToScreen (frame.X, frame.Y, out int x, out int y);
-                    var pos = new Point (x, y);
+                    Point pos = Host.BoundsToScreen (frame).Location;
                     position.Y = pos.Y - rect.Height - 1;
                     position.Y = pos.Y - rect.Height - 1;
                 }
                 }
             }
             }

+ 7 - 8
Terminal.Gui/Views/Menu/Menu.cs

@@ -884,11 +884,10 @@ internal sealed class Menu : View
                 textToDraw = item.Title;
                 textToDraw = item.Title;
             }
             }
 
 
-            BoundsToScreen (0, i, out int vtsCol, out int vtsRow, false);
-
-            if (vtsCol < Driver.Cols)
+            Rectangle screen = BoundsToScreen (new (new (0 , i), Size.Empty));
+            if (screen.X < Driver.Cols)
             {
             {
-                Driver.Move (vtsCol + 1, vtsRow);
+                Driver.Move (screen.X + 1, screen.Y);
 
 
                 if (!item.IsEnabled ())
                 if (!item.IsEnabled ())
                 {
                 {
@@ -923,17 +922,17 @@ internal sealed class Menu : View
                             ? item.Help.GetColumns ()
                             ? item.Help.GetColumns ()
                             : item.Help.GetColumns () + item.ShortcutTag.GetColumns () + 2;
                             : item.Help.GetColumns () + item.ShortcutTag.GetColumns () + 2;
                 int col = Frame.Width - l - 3;
                 int col = Frame.Width - l - 3;
-                BoundsToScreen (col, i, out vtsCol, out vtsRow, false);
+                screen = BoundsToScreen (new (new (col, i), Size.Empty));
 
 
-                if (vtsCol < Driver.Cols)
+                if (screen.X < Driver.Cols)
                 {
                 {
-                    Driver.Move (vtsCol, vtsRow);
+                    Driver.Move (screen.X, screen.Y);
                     Driver.AddStr (item.Help);
                     Driver.AddStr (item.Help);
 
 
                     // The shortcut tag string
                     // The shortcut tag string
                     if (!string.IsNullOrEmpty (item.ShortcutTag))
                     if (!string.IsNullOrEmpty (item.ShortcutTag))
                     {
                     {
-                        Driver.Move (vtsCol + l - item.ShortcutTag.GetColumns (), vtsRow);
+                        Driver.Move (screen.X + l - item.ShortcutTag.GetColumns (), screen.Y);
                         Driver.AddStr (item.ShortcutTag);
                         Driver.AddStr (item.ShortcutTag);
                     }
                     }
                 }
                 }

+ 4 - 4
Terminal.Gui/Views/Menu/MenuBar.cs

@@ -1320,8 +1320,8 @@ public class MenuBar : View
 
 
         if (mi.IsTopLevel)
         if (mi.IsTopLevel)
         {
         {
-            BoundsToScreen (i, 0, out int rx, out int ry);
-            var menu = new Menu { Host = this, X = rx, Y = ry, BarItems = mi };
+            Rectangle screen = BoundsToScreen (new (new (0, i), Size.Empty));
+            var menu = new Menu { Host = this, X = screen.X, Y = screen.Y, BarItems = mi };
             menu.Run (mi.Action);
             menu.Run (mi.Action);
             menu.Dispose ();
             menu.Dispose ();
         }
         }
@@ -1682,8 +1682,8 @@ public class MenuBar : View
                     {
                     {
                         if (Menus [i].IsTopLevel)
                         if (Menus [i].IsTopLevel)
                         {
                         {
-                            BoundsToScreen (i, 0, out int rx, out int ry);
-                            var menu = new Menu { Host = this, X = rx, Y = ry, BarItems = Menus [i] };
+                            Rectangle screen = BoundsToScreen (new (new (0, i), Size.Empty));
+                            var menu = new Menu { Host = this, X = screen.X, Y = screen.Y, BarItems = Menus [i] };
                             menu.Run (Menus [i].Action);
                             menu.Run (Menus [i].Action);
                             menu.Dispose ();
                             menu.Dispose ();
                         }
                         }

+ 4 - 6
Terminal.Gui/Views/TileView.cs

@@ -217,8 +217,8 @@ public class TileView : View
             {
             {
                 bool isRoot = _splitterLines.Contains (line);
                 bool isRoot = _splitterLines.Contains (line);
 
 
-                line.BoundsToScreen (0, 0, out int x1, out int y1);
-                Point origin = ScreenToFrame (x1, y1);
+                Rectangle screen = line.BoundsToScreen (new (new (0, 0), Size.Empty));
+                Point origin = ScreenToFrame (screen.X, screen.Y);
                 int length = line.Orientation == Orientation.Horizontal ? line.Frame.Width : line.Frame.Height;
                 int length = line.Orientation == Orientation.Horizontal ? line.Frame.Width : line.Frame.Height;
 
 
                 if (!isRoot)
                 if (!isRoot)
@@ -837,10 +837,8 @@ public class TileView : View
         /// </summary>
         /// </summary>
         public Point GetLocalCoordinateForTitle (TileView intoCoordinateSpace)
         public Point GetLocalCoordinateForTitle (TileView intoCoordinateSpace)
         {
         {
-            Tile.ContentView.BoundsToScreen (0, 0, out int screenCol, out int screenRow);
-            screenRow--;
-
-            return intoCoordinateSpace.ScreenToFrame (screenCol, screenRow);
+            Rectangle screen = Tile.ContentView.BoundsToScreen (Rectangle.Empty);
+            return intoCoordinateSpace.ScreenToFrame (screen.X, screen.Y - 1);
         }
         }
 
 
         internal string GetTrimmedTitle ()
         internal string GetTrimmedTitle ()

+ 2 - 2
UICatalog/Scenarios/Notepad.cs

@@ -350,9 +350,9 @@ public class Notepad : Scenario
                                     );
                                     );
         }
         }
 
 
-        ((View)sender).BoundsToScreen (e.MouseEvent.X, e.MouseEvent.Y, out int screenX, out int screenY);
+        Rectangle screen = ((View)sender).BoundsToScreen (new (e.MouseEvent.X, e.MouseEvent.Y, 0, 0));
 
 
-        var contextMenu = new ContextMenu { Position = new Point (screenX, screenY), MenuItems = items };
+        var contextMenu = new ContextMenu { Position = screen.Location, MenuItems = items };
 
 
         contextMenu.Show ();
         contextMenu.Show ();
         e.MouseEvent.Handled = true;
         e.MouseEvent.Handled = true;

+ 104 - 104
UnitTests/View/NavigationTests.cs

@@ -841,31 +841,31 @@ public class NavigationTests
 
 
         // top
         // top
         Assert.Equal (Point.Empty, top.ScreenToFrame (0, 0));
         Assert.Equal (Point.Empty, top.ScreenToFrame (0, 0));
-        top.Margin.BoundsToScreen (0, 0, out int col, out int row);
-        Assert.Equal (0, col);
-        Assert.Equal (0, row);
-        top.Border.BoundsToScreen (0, 0, out col, out row);
-        Assert.Equal (0, col);
-        Assert.Equal (0, row);
-        top.Padding.BoundsToScreen (0, 0, out col, out row);
-        Assert.Equal (0, col);
-        Assert.Equal (0, row);
-        top.BoundsToScreen (0, 0, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
-        top.BoundsToScreen (-1, -1, out col, out row);
-        Assert.Equal (0, col);
-        Assert.Equal (0, row);
+        Rectangle screen = top.Margin.BoundsToScreen (new (0, 0, 0, 0));
+        Assert.Equal (0, screen.X);
+        Assert.Equal (0, screen.Y);
+        screen = top.Border.BoundsToScreen (new (0, 0, 0, 0));
+        Assert.Equal (0, screen.X);
+        Assert.Equal (0, screen.Y);
+        screen = top.Padding.BoundsToScreen (new (0, 0, 0, 0));
+        Assert.Equal (0, screen.X);
+        Assert.Equal (0, screen.Y);
+        screen = top.BoundsToScreen (new (0, 0, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
+        screen = top.BoundsToScreen (new (-1, -1, 0, 0));
+        Assert.Equal (0, screen.X);
+        Assert.Equal (0, screen.Y);
         var found = View.FindDeepestView (top, 0, 0);
         var found = View.FindDeepestView (top, 0, 0);
         Assert.Equal (top, found);
         Assert.Equal (top, found);
  
  
         Assert.Equal (0, found.Frame.X);
         Assert.Equal (0, found.Frame.X);
         Assert.Equal (0, found.Frame.Y);
         Assert.Equal (0, found.Frame.Y);
         Assert.Equal (new Point (3, 2), top.ScreenToFrame (3, 2));
         Assert.Equal (new Point (3, 2), top.ScreenToFrame (3, 2));
-        top.BoundsToScreen (3, 2, out col, out row);
-        Assert.Equal (4, col);
-        Assert.Equal (3, row);
-        found = View.FindDeepestView (top, col, row);
+        screen = top.BoundsToScreen (new (3, 2, 0, 0));
+        Assert.Equal (4, screen.X);
+        Assert.Equal (3, screen.Y);
+        found = View.FindDeepestView (top, screen.X, screen.Y);
         Assert.Equal (view, found);
         Assert.Equal (view, found);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
@@ -874,24 +874,24 @@ public class NavigationTests
         //Assert.Equal (3, found.FrameToScreen ().X);
         //Assert.Equal (3, found.FrameToScreen ().X);
         //Assert.Equal (2, found.FrameToScreen ().Y);
         //Assert.Equal (2, found.FrameToScreen ().Y);
         Assert.Equal (new Point (13, 2), top.ScreenToFrame (13, 2));
         Assert.Equal (new Point (13, 2), top.ScreenToFrame (13, 2));
-        top.BoundsToScreen (12, 2, out col, out row);
-        Assert.Equal (13, col);
-        Assert.Equal (3, row);
-        found = View.FindDeepestView (top, col, row);
+        screen = top.BoundsToScreen (new (12, 2, 0, 0));
+        Assert.Equal (13, screen.X);
+        Assert.Equal (3, screen.Y);
+        found = View.FindDeepestView (top, screen.X, screen.Y);
         Assert.Equal (view, found);
         Assert.Equal (view, found);
         //Assert.Equal (9, found.FrameToScreen ().X);
         //Assert.Equal (9, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
-        top.BoundsToScreen (13, 2, out col, out row);
-        Assert.Equal (14, col);
-        Assert.Equal (3, row);
+        screen = top.BoundsToScreen (new (13, 2, 0, 0));
+        Assert.Equal (14, screen.X);
+        Assert.Equal (3, screen.Y);
         found = View.FindDeepestView (top, 13, 2);
         found = View.FindDeepestView (top, 13, 2);
         Assert.Equal (top, found);
         Assert.Equal (top, found);
         //Assert.Equal (13, found.FrameToScreen ().X);
         //Assert.Equal (13, found.FrameToScreen ().X);
         //Assert.Equal (2, found.FrameToScreen ().Y);
         //Assert.Equal (2, found.FrameToScreen ().Y);
         Assert.Equal (new Point (14, 3), top.ScreenToFrame (14, 3));
         Assert.Equal (new Point (14, 3), top.ScreenToFrame (14, 3));
-        top.BoundsToScreen (14, 3, out col, out row);
-        Assert.Equal (15, col);
-        Assert.Equal (4, row);
+        screen = top.BoundsToScreen (new (14, 3, 0, 0));
+        Assert.Equal (15, screen.X);
+        Assert.Equal (4, screen.Y);
         found = View.FindDeepestView (top, 14, 3);
         found = View.FindDeepestView (top, 14, 3);
         Assert.Equal (top, found);
         Assert.Equal (top, found);
         //Assert.Equal (14, found.FrameToScreen ().X);
         //Assert.Equal (14, found.FrameToScreen ().X);
@@ -899,45 +899,45 @@ public class NavigationTests
 
 
         // view
         // view
         Assert.Equal (new Point (-4, -3), view.ScreenToFrame (0, 0));
         Assert.Equal (new Point (-4, -3), view.ScreenToFrame (0, 0));
-        view.Margin.BoundsToScreen (-3, -2, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
-        view.Border.BoundsToScreen (-3, -2, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
-        view.Padding.BoundsToScreen (-3, -2, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
-        view.BoundsToScreen (-3, -2, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
-        view.BoundsToScreen (-4, -3, out col, out row);
-        Assert.Equal (0, col);
-        Assert.Equal (0, row);
+        screen = view.Margin.BoundsToScreen (new (-3, -2, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
+        screen = view.Border.BoundsToScreen (new (-3, -2, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
+        screen = view.Padding.BoundsToScreen (new (-3, -2, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
+        screen = view.BoundsToScreen (new (-3, -2, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
+        screen = view.BoundsToScreen (new (-4, -3, 0, 0));
+        Assert.Equal (0, screen.X);
+        Assert.Equal (0, screen.Y);
         found = View.FindDeepestView (top, 0, 0);
         found = View.FindDeepestView (top, 0, 0);
         Assert.Equal (top, found);
         Assert.Equal (top, found);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         Assert.Equal (new Point (-1, -1), view.ScreenToFrame (3, 2));
         Assert.Equal (new Point (-1, -1), view.ScreenToFrame (3, 2));
-        view.BoundsToScreen (0, 0, out col, out row);
-        Assert.Equal (4, col);
-        Assert.Equal (3, row);
+        screen = view.BoundsToScreen (new (0, 0, 0, 0));
+        Assert.Equal (4, screen.X);
+        Assert.Equal (3, screen.Y);
         found = View.FindDeepestView (top, 4, 3);
         found = View.FindDeepestView (top, 4, 3);
         Assert.Equal (view, found);
         Assert.Equal (view, found);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         Assert.Equal (new Point (9, -1), view.ScreenToFrame (13, 2));
         Assert.Equal (new Point (9, -1), view.ScreenToFrame (13, 2));
-        view.BoundsToScreen (10, 0, out col, out row);
-        Assert.Equal (14, col);
-        Assert.Equal (3, row);
+        screen = view.BoundsToScreen (new (10, 0, 0, 0));
+        Assert.Equal (14, screen.X);
+        Assert.Equal (3, screen.Y);
         found = View.FindDeepestView (top, 14, 3);
         found = View.FindDeepestView (top, 14, 3);
         Assert.Equal (top, found);
         Assert.Equal (top, found);
         //Assert.Equal (14, found.FrameToScreen ().X);
         //Assert.Equal (14, found.FrameToScreen ().X);
         //Assert.Equal (3, found.FrameToScreen ().Y);
         //Assert.Equal (3, found.FrameToScreen ().Y);
         Assert.Equal (new Point (10, 0), view.ScreenToFrame (14, 3));
         Assert.Equal (new Point (10, 0), view.ScreenToFrame (14, 3));
-        view.BoundsToScreen (11, 1, out col, out row);
-        Assert.Equal (15, col);
-        Assert.Equal (4, row);
+        screen = view.BoundsToScreen (new (11, 1, 0, 0));
+        Assert.Equal (15, screen.X);
+        Assert.Equal (4, screen.Y);
         found = View.FindDeepestView (top, 15, 4);
         found = View.FindDeepestView (top, 15, 4);
         Assert.Equal (top, found);
         Assert.Equal (top, found);
         //Assert.Equal (15, found.FrameToScreen ().X);
         //Assert.Equal (15, found.FrameToScreen ().X);
@@ -1000,96 +1000,96 @@ public class NavigationTests
 
 
         // top
         // top
         Assert.Equal (new Point (-3, -2), top.ScreenToFrame (0, 0));
         Assert.Equal (new Point (-3, -2), top.ScreenToFrame (0, 0));
-        top.Margin.BoundsToScreen (-3, -2, out int col, out int row);
-        Assert.Equal (0, col);
-        Assert.Equal (0, row);
-        top.Border.BoundsToScreen (-3, -2, out col, out row);
-        Assert.Equal (0, col);
-        Assert.Equal (0, row);
-        top.Padding.BoundsToScreen (-3, -2, out col, out row);
-        Assert.Equal (0, col);
-        Assert.Equal (0, row);
-        top.BoundsToScreen (-3, -2, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
-        top.BoundsToScreen (-4, -3, out col, out row);
-        Assert.Equal (0, col);
-        Assert.Equal (0, row);
+        Rectangle screen = top.Margin.BoundsToScreen (new (-3, -2, 0, 0));
+        Assert.Equal (0, screen.X);
+        Assert.Equal (0, screen.Y);
+        screen = top.Border.BoundsToScreen (new (-3, -2, 0, 0));
+        Assert.Equal (0, screen.X);
+        Assert.Equal (0, screen.Y);
+        screen = top.Padding.BoundsToScreen (new (-3, -2, 0, 0));
+        Assert.Equal (0, screen.X);
+        Assert.Equal (0, screen.Y);
+        screen = top.BoundsToScreen (new (-3, -2, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
+        screen = top.BoundsToScreen (new (-4, -3, 0, 0));
+        Assert.Equal (0, screen.X);
+        Assert.Equal (0, screen.Y);
         var found = View.FindDeepestView (top, -4, -3);
         var found = View.FindDeepestView (top, -4, -3);
         Assert.Null (found);
         Assert.Null (found);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         Assert.Equal (Point.Empty, top.ScreenToFrame (3, 2));
         Assert.Equal (Point.Empty, top.ScreenToFrame (3, 2));
-        top.BoundsToScreen (0, 0, out col, out row);
-        Assert.Equal (4, col);
-        Assert.Equal (3, row);
+        screen = top.BoundsToScreen (new (0, 0, 0, 0));
+        Assert.Equal (4, screen.X);
+        Assert.Equal (3, screen.Y);
         Assert.Equal (top, View.FindDeepestView (top, 3, 2));
         Assert.Equal (top, View.FindDeepestView (top, 3, 2));
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         Assert.Equal (new Point (10, 0), top.ScreenToFrame (13, 2));
         Assert.Equal (new Point (10, 0), top.ScreenToFrame (13, 2));
-        top.BoundsToScreen (10, 0, out col, out row);
-        Assert.Equal (14, col);
-        Assert.Equal (3, row);
+        screen = top.BoundsToScreen (new (10, 0, 0, 0));
+        Assert.Equal (14, screen.X);
+        Assert.Equal (3, screen.Y);
         Assert.Equal (top, View.FindDeepestView (top, 13, 2));
         Assert.Equal (top, View.FindDeepestView (top, 13, 2));
         //Assert.Equal (10, found.FrameToScreen ().X);
         //Assert.Equal (10, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         Assert.Equal (new Point (11, 1), top.ScreenToFrame (14, 3));
         Assert.Equal (new Point (11, 1), top.ScreenToFrame (14, 3));
-        top.BoundsToScreen (11, 1, out col, out row);
-        Assert.Equal (15, col);
-        Assert.Equal (4, row);
+        screen = top.BoundsToScreen (new (11, 1, 0, 0));
+        Assert.Equal (15, screen.X);
+        Assert.Equal (4, screen.Y);
         Assert.Equal (top, View.FindDeepestView (top, 14, 3));
         Assert.Equal (top, View.FindDeepestView (top, 14, 3));
         //Assert.Equal (11, found.FrameToScreen ().X);
         //Assert.Equal (11, found.FrameToScreen ().X);
         //Assert.Equal (1, found.FrameToScreen ().Y);
         //Assert.Equal (1, found.FrameToScreen ().Y);
 
 
         // view
         // view
         Assert.Equal (new Point (-7, -5), view.ScreenToFrame (0, 0));
         Assert.Equal (new Point (-7, -5), view.ScreenToFrame (0, 0));
-        view.Margin.BoundsToScreen (-6, -4, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
-        view.Border.BoundsToScreen (-6, -4, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
-        view.Padding.BoundsToScreen (-6, -4, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
-        view.BoundsToScreen (-6, -4, out col, out row);
-        Assert.Equal (1, col);
-        Assert.Equal (1, row);
+        screen = view.Margin.BoundsToScreen (new (-6, -4, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
+        screen = view.Border.BoundsToScreen (new (-6, -4, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
+        screen = view.Padding.BoundsToScreen (new (-6, -4, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
+        screen = view.BoundsToScreen (new (-6, -4, 0, 0));
+        Assert.Equal (1, screen.X);
+        Assert.Equal (1, screen.Y);
         Assert.Null (View.FindDeepestView (top, 1, 1));
         Assert.Null (View.FindDeepestView (top, 1, 1));
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         Assert.Equal (new Point (-4, -3), view.ScreenToFrame (3, 2));
         Assert.Equal (new Point (-4, -3), view.ScreenToFrame (3, 2));
-        view.BoundsToScreen (-3, -2, out col, out row);
-        Assert.Equal (4, col);
-        Assert.Equal (3, row);
+        screen = view.BoundsToScreen (new (-3, -2, 0, 0));
+        Assert.Equal (4, screen.X);
+        Assert.Equal (3, screen.Y);
         Assert.Equal (top, View.FindDeepestView (top, 4, 3));
         Assert.Equal (top, View.FindDeepestView (top, 4, 3));
         //Assert.Equal (1, found.FrameToScreen ().X);
         //Assert.Equal (1, found.FrameToScreen ().X);
         //Assert.Equal (1, found.FrameToScreen ().Y);
         //Assert.Equal (1, found.FrameToScreen ().Y);
         Assert.Equal (new Point (-1, -1), view.ScreenToFrame (6, 4));
         Assert.Equal (new Point (-1, -1), view.ScreenToFrame (6, 4));
-        view.BoundsToScreen (0, 0, out col, out row);
-        Assert.Equal (7, col);
-        Assert.Equal (5, row);
+        screen = view.BoundsToScreen (new (0, 0, 0, 0));
+        Assert.Equal (7, screen.X);
+        Assert.Equal (5, screen.Y);
         Assert.Equal (view, View.FindDeepestView (top, 7, 5));
         Assert.Equal (view, View.FindDeepestView (top, 7, 5));
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         Assert.Equal (new Point (6, -1), view.ScreenToFrame (13, 4));
         Assert.Equal (new Point (6, -1), view.ScreenToFrame (13, 4));
-        view.BoundsToScreen (7, 0, out col, out row);
-        Assert.Equal (14, col);
-        Assert.Equal (5, row);
+        screen = view.BoundsToScreen (new (7, 0, 0, 0));
+        Assert.Equal (14, screen.X);
+        Assert.Equal (5, screen.Y);
         Assert.Equal (view, View.FindDeepestView (top, 14, 5));
         Assert.Equal (view, View.FindDeepestView (top, 14, 5));
         //Assert.Equal (7, found.FrameToScreen ().X);
         //Assert.Equal (7, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         Assert.Equal (new Point (7, -2), view.ScreenToFrame (14, 3));
         Assert.Equal (new Point (7, -2), view.ScreenToFrame (14, 3));
-        view.BoundsToScreen (8, -1, out col, out row);
-        Assert.Equal (15, col);
-        Assert.Equal (4, row);
+        screen = view.BoundsToScreen (new (8, -1, 0, 0));
+        Assert.Equal (15, screen.X);
+        Assert.Equal (4, screen.Y);
         Assert.Equal (top, View.FindDeepestView (top, 15, 4));
         Assert.Equal (top, View.FindDeepestView (top, 15, 4));
         //Assert.Equal (12, found.FrameToScreen ().X);
         //Assert.Equal (12, found.FrameToScreen ().X);
         //Assert.Equal (2, found.FrameToScreen ().Y);
         //Assert.Equal (2, found.FrameToScreen ().Y);
         Assert.Equal (new Point (16, -2), view.ScreenToFrame (23, 3));
         Assert.Equal (new Point (16, -2), view.ScreenToFrame (23, 3));
-        view.BoundsToScreen (17, -1, out col, out row);
-        Assert.Equal (24, col);
-        Assert.Equal (4, row);
+        screen = view.BoundsToScreen (new (17, -1, 0, 0));
+        Assert.Equal (24, screen.X);
+        Assert.Equal (4, screen.Y);
         Assert.Null (View.FindDeepestView (top, 24, 4));
         Assert.Null (View.FindDeepestView (top, 24, 4));
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().X);
         //Assert.Equal (0, found.FrameToScreen ().Y);
         //Assert.Equal (0, found.FrameToScreen ().Y);