From: thefiddler Date: Thu, 17 Jul 2014 09:20:01 +0000 (+0200) Subject: [Linux] Improved mouse cursor behavior X-Git-Tag: 2.0-0~112^2~12 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=36bb36663849ab1bb77564a4d95173da4c02f6e9;p=platform%2Fcore%2Fcsapi%2Fopentk.git [Linux] Improved mouse cursor behavior --- diff --git a/Source/OpenTK/Platform/Linux/LinuxInput.cs b/Source/OpenTK/Platform/Linux/LinuxInput.cs index 6f4185f..eca19e6 100644 --- a/Source/OpenTK/Platform/Linux/LinuxInput.cs +++ b/Source/OpenTK/Platform/Linux/LinuxInput.cs @@ -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(); } diff --git a/Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs b/Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs index 866001d..8391f53 100644 --- a/Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs +++ b/Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs @@ -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)