[Linux] Improved mouse cursor behavior
authorthefiddler <stapostol@gmail.com>
Thu, 17 Jul 2014 09:20:01 +0000 (11:20 +0200)
committerthefiddler <stapostol@gmail.com>
Thu, 17 Jul 2014 09:20:01 +0000 (11:20 +0200)
Source/OpenTK/Platform/Linux/LinuxInput.cs
Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs

index 6f4185f..eca19e6 100644 (file)
@@ -255,7 +255,7 @@ namespace OpenTK.Platform.Linux
                 (int)Math.Round(CursorPosition.X + CursorOffset.X),
                 (int)Math.Round(CursorPosition.Y + CursorOffset.Y));
 
-            DisplayDevice display = DisplayDevice.FromPoint(p.X, p.Y);
+            DisplayDevice display = DisplayDevice.FromPoint(p.X, p.Y) ?? DisplayDevice.Default;
             if (display != null)
             {
                 LinuxDisplay d = (LinuxDisplay)display.Id;
@@ -465,8 +465,8 @@ namespace OpenTK.Platform.Linux
             }
 
             CursorPosition = new Vector2(
-                MathHelper.Clamp(CursorPosition.X + delta.X, bounds.Left, bounds.Right),
-                MathHelper.Clamp(CursorPosition.Y + delta.Y, bounds.Top, bounds.Bottom));
+                MathHelper.Clamp(CursorPosition.X + delta.X, bounds.Left, bounds.Right - 1),
+                MathHelper.Clamp(CursorPosition.Y + delta.Y, bounds.Top, bounds.Bottom - 1));
             UpdateCursor();
         }
 
index 866001d..8391f53 100644 (file)
@@ -260,6 +260,7 @@ namespace OpenTK.Platform.Linux
 
         MouseState ProcessMouse(MouseState mouse)
         {
+            // Handle mouse buttons
             for (MouseButton i = 0; i < MouseButton.LastButton; i++)
             {
                 if (mouse[i] && !previous_mouse[i])
@@ -273,11 +274,29 @@ namespace OpenTK.Platform.Linux
                 }
             }
 
-            if (mouse.X != previous_mouse.X || mouse.Y != previous_mouse.Y)
+            // Handle mouse movement
             {
-                OnMouseMove(mouse.X, mouse.Y);
+                int x = mouse.X;
+                int y = mouse.Y;
+
+                // Make sure the mouse cannot leave the GameWindow when captured
+                if (!CursorVisible)
+                {
+                    x = MathHelper.Clamp(mouse.X, Bounds.Left, Bounds.Right - 1);
+                    y = MathHelper.Clamp(mouse.X, Bounds.Top, Bounds.Bottom - 1);
+                    if (x != mouse.X || y != mouse.Y)
+                    {
+                        Mouse.SetPosition(x, y);
+                    }
+                }
+
+                if (X != previous_mouse.X || Y != previous_mouse.Y)
+                {
+                    OnMouseMove(x, y);
+                }
             }
 
+            // Handle mouse scroll
             if (mouse.Scroll != previous_mouse.Scroll)
             {
                 float dx = mouse.Scroll.X - previous_mouse.Scroll.X;
@@ -285,6 +304,7 @@ namespace OpenTK.Platform.Linux
                 OnMouseWheel(dx, dy);
             }
 
+            // Handle mouse focus
             // Note: focus follows mouse. Literally.
             bool cursor_in = Bounds.Contains(new Point(mouse.X, mouse.Y));
             if (!cursor_in && Focused)