Permalink
Browse files

[Linux] Improved mouse cursor behavior

  • Loading branch information...
thefiddler committed Jul 17, 2014
1 parent fd6ff96 commit 36bb36663849ab1bb77564a4d95173da4c02f6e9
Showing with 25 additions and 5 deletions.
  1. +3 −3 Source/OpenTK/Platform/Linux/LinuxInput.cs
  2. +22 −2 Source/OpenTK/Platform/Linux/LinuxNativeWindow.cs
@@ -255,7 +255,7 @@ void UpdateCursor()
(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 @@ void HandlePointerMotion(MouseDevice mouse, PointerEvent e)
}
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();
}
@@ -260,6 +260,7 @@ KeyboardState ProcessKeyboard(KeyboardState keyboard)
MouseState ProcessMouse(MouseState mouse)
{
+ // Handle mouse buttons
for (MouseButton i = 0; i < MouseButton.LastButton; i++)
{
if (mouse[i] && !previous_mouse[i])
@@ -273,18 +274,37 @@ MouseState ProcessMouse(MouseState mouse)
}
}
- 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;
float dy = mouse.Scroll.Y - previous_mouse.Scroll.Y;
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)

0 comments on commit 36bb366

Please sign in to comment.