Fixed mouse delta handling.

This commit is contained in:
the_fiddler 2008-05-04 17:42:19 +00:00
parent 027c6eb542
commit f65fd4b221
5 changed files with 180 additions and 86 deletions

View file

@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace OpenTK.Input
{
/// <summary>
/// Enumerates all possible mouse buttons.
/// </summary>
public enum MouseButton
{
/// <summary>
/// The left mouse button.
/// </summary>
Left = 0,
/// <summary>
/// The middle mouse button.
/// </summary>
Middle,
/// <summary>
/// The right mouse button.
/// </summary>
Right,
/// <summary>
/// The first extra mouse button.
/// </summary>
Button1,
/// <summary>
/// The second extra mouse button.
/// </summary>
Button2,
/// <summary>
/// The third extra mouse button.
/// </summary>
Button3,
/// <summary>
/// The fourth extra mouse button.
/// </summary>
Button4,
/// <summary>
/// The fifth extra mouse button.
/// </summary>
Button5,
/// <summary>
/// The sixth extra mouse button.
/// </summary>
Button6,
/// <summary>
/// The seventh extra mouse button.
/// </summary>
Button7,
/// <summary>
/// The eigth extra mouse button.
/// </summary>
Button8,
/// <summary>
/// The ninth extra mouse button.
/// </summary>
Button9,
/// <summary>
/// Indicates the last available mouse button.
/// </summary>
LastButton
}
}

View file

@ -20,8 +20,9 @@ namespace OpenTK.Input
private int numButtons, numWheels;
private IntPtr id;
private bool[] button = new bool[(int)MouseButton.LastButton];
private int wheel, last_wheel;
private int wheel, wheel_last_accessed = 0;
private Point pos = new Point();
private Point pos_last_accessed = new Point();
internal int last_x, last_y;
#region --- IInputDevice Members ---
@ -47,6 +48,8 @@ namespace OpenTK.Input
#region --- Public Members ---
#region public int NumberOfButtons
/// <summary>
/// Gets an integer representing the number of buttons on this MouseDevice.
/// </summary>
@ -56,6 +59,10 @@ namespace OpenTK.Input
internal set { numButtons = value; }
}
#endregion
#region public int NumberOfWheels
/// <summary>
/// Gets an integer representing the number of wheels on this MouseDevice.
/// </summary>
@ -65,6 +72,10 @@ namespace OpenTK.Input
internal set { numWheels = value; }
}
#endregion
#region public IntPtr DeviceID
/// <summary>
/// Gets an IntPtr representing a device dependent ID.
/// </summary>
@ -74,6 +85,10 @@ namespace OpenTK.Input
internal set { id = value; }
}
#endregion
#region public int Wheel
/// <summary>
/// Gets an integer representing the absolute wheel position.
/// </summary>
@ -82,11 +97,16 @@ namespace OpenTK.Input
get { return wheel; }
internal set
{
last_wheel = wheel;
wheel = value;
if (Move != null)
Move(this, EventArgs.Empty);
}
}
#endregion
#region public int WheelDelta
/// <summary>
/// Gets an integer representing the relative wheel movement.
/// </summary>
@ -94,37 +114,40 @@ namespace OpenTK.Input
{
get
{
return wheel - last_wheel;
int result = wheel - wheel_last_accessed;
wheel_last_accessed = wheel;
return wheel;
}
//internal set { wheel_delta = value; }
}
#endregion
#region public int X
/// <summary>
/// Gets an integer representing the absolute x position of the pointer, in window pixel coordinates.
/// </summary>
public int X
{
get { return pos.X; }
internal set
{
last_x = pos.X;
pos.X = value;
}
}
#endregion
#region public int Y
/// <summary>
/// Gets an integer representing the absolute y position of the pointer, in window pixel coordinates.
/// </summary>
public int Y
{
get { return pos.Y; }
internal set
{
last_y = pos.Y;
pos.Y = value;
}
}
#endregion
#region public int XDelta
/// <summary>
/// Gets an integer representing the relative x movement of the pointer, in pixel coordinates.
/// </summary>
@ -132,12 +155,16 @@ namespace OpenTK.Input
{
get
{
//return delta_x;
return pos.X - last_x;
int result = pos.X - pos_last_accessed.X;
pos_last_accessed.X = pos.X;
return result;
}
//internal set { delta_x = value; }
}
#endregion
#region public int YDelta
/// <summary>
/// Gets an integer representing the relative y movement of the pointer, in pixel coordinates.
/// </summary>
@ -145,25 +172,35 @@ namespace OpenTK.Input
{
get
{
//return delta_y;
return pos.Y - last_y;
int result = pos.Y - pos_last_accessed.Y;
pos_last_accessed.Y = pos.Y;
return result;
}
//internal set { delta_y = value; }
}
#region public Point Position
/// <summary>
/// Gets a System.Drawing.Point representing the absolute position of the pointer, in window pixel coordinates.
/// </summary>
public Point Position
{
get { return pos; }
}
#endregion
//public event MouseMoveEvent Move;
#region internal Point Position
/// <summary>
/// Sets a System.Drawing.Point representing the absolute position of the pointer, in window pixel coordinates.
/// </summary>
internal Point Position
{
set
{
pos = value;
if (Move != null)
Move(this, EventArgs.Empty);
}
}
#endregion
/// <summary>
/// Occurs when the mouse, or one of its wheels, is moved.
/// </summary>
public event MouseMoveEvent Move;
/// <summary>
/// Occurs when a button is pressed.
@ -202,6 +239,8 @@ namespace OpenTK.Input
#endregion
#region --- Overrides ---
public override int GetHashCode()
{
//return base.GetHashCode();
@ -215,33 +254,28 @@ namespace OpenTK.Input
}
#endregion
#endregion
}
public delegate void MouseMoveEvent(MouseDevice sender);
public delegate void MouseButtonDownEvent(MouseDevice sender, MouseButton button);
public delegate void MouseButtonUpEvent(MouseDevice sender, MouseButton button);
#region public enum MouseButton
/// <summary>
/// Enumerates all possible mouse buttons.
/// Defines a MouseMove event.
/// </summary>
public enum MouseButton
{
Left = 0,
Middle,
Right,
Button1,
Button2,
Button3,
Button4,
Button5,
Button6,
Button7,
Button8,
Button9,
LastButton
}
/// <param name="sender">The MouseDevice that generated this event.</param>
/// <param name="e">Not used.</param>
public delegate void MouseMoveEvent(MouseDevice sender, EventArgs e);
#endregion
/// <summary>
/// Defines the MouseButtonDown event.
/// </summary>
/// <param name="sender">The MouseDevice that generated this event.</param>
/// <param name="button">The MouseButton that was pressed.</param>
public delegate void MouseButtonDownEvent(MouseDevice sender, MouseButton button);
/// <summary>
/// Defines the MouseButtonUp event.
/// </summary>
/// <param name="sender">The MouseDevice that generated this event.</param>
/// <param name="button">The MouseButton that was released.</param>
public delegate void MouseButtonUpEvent(MouseDevice sender, MouseButton button);
}

View file

@ -66,8 +66,8 @@ namespace OpenTK.Platform.Windows
// Mouse events:
case WindowMessage.MOUSEMOVE:
//case WindowMessage.NCMOUSEMOVE:
mouse.X = msg.LParam.ToInt32() & 0x0000FFFF;
mouse.Y = (int)(msg.LParam.ToInt32() & 0xFFFF0000) >> 16;
mouse.Position = new System.Drawing.Point(msg.LParam.ToInt32() & 0x0000FFFF,
(int)(msg.LParam.ToInt32() & 0xFFFF0000) >> 16);
return;
case WindowMessage.MOUSEWHEEL:

View file

@ -155,10 +155,7 @@ namespace OpenTK.Platform.Windows
Debug.Print("Registered mouse {0}", mouse.ToString());
System.Drawing.Point p = new System.Drawing.Point();
if (Functions.GetCursorPos(ref p))
{
mouse.X = p.X;
mouse.Y = p.Y;
}
mouse.Position = p;
}
}
@ -200,13 +197,12 @@ namespace OpenTK.Platform.Windows
if ((rin.Data.Mouse.Flags & RawMouseFlags.MOUSE_MOVE_ABSOLUTE) != 0)
{
mouse.X = rin.Data.Mouse.LastX;
mouse.Y = rin.Data.Mouse.LastY;
mouse.Position = new System.Drawing.Point(rin.Data.Mouse.LastX, rin.Data.Mouse.LastY);
}
else
{ // Seems like MOUSE_MOVE_RELATIVE is the default, unless otherwise noted.
mouse.X += rin.Data.Mouse.LastX;
mouse.Y += rin.Data.Mouse.LastY;
mouse.Position = new System.Drawing.Point(mouse.X + rin.Data.Mouse.LastX,
mouse.Y + rin.Data.Mouse.LastY);
}
if ((rin.Data.Mouse.Flags & RawMouseFlags.MOUSE_VIRTUAL_DESKTOP) != 0)

View file

@ -159,39 +159,38 @@ namespace OpenTK.Platform.X11
else if (e.ButtonEvent.button == 2) mouse[OpenTK.Input.MouseButton.Middle] = true;
else if (e.ButtonEvent.button == 3) mouse[OpenTK.Input.MouseButton.Right] = true;
else if (e.ButtonEvent.button == 4) mouse.Wheel++;
else if (e.ButtonEvent.button == 5) mouse.Wheel--;
else if (e.ButtonEvent.button == 6) mouse[OpenTK.Input.MouseButton.Button1] = true;
else if (e.ButtonEvent.button == 7) mouse[OpenTK.Input.MouseButton.Button2] = true;
else if (e.ButtonEvent.button == 8) mouse[OpenTK.Input.MouseButton.Button3] = true;
else if (e.ButtonEvent.button == 9) mouse[OpenTK.Input.MouseButton.Button4] = true;
else if (e.ButtonEvent.button == 10) mouse[OpenTK.Input.MouseButton.Button5] = true;
else if (e.ButtonEvent.button == 11) mouse[OpenTK.Input.MouseButton.Button6] = true;
else if (e.ButtonEvent.button == 12) mouse[OpenTK.Input.MouseButton.Button7] = true;
else if (e.ButtonEvent.button == 13) mouse[OpenTK.Input.MouseButton.Button8] = true;
else if (e.ButtonEvent.button == 5) mouse.Wheel--;
else if (e.ButtonEvent.button == 6) mouse[OpenTK.Input.MouseButton.Button1] = true;
else if (e.ButtonEvent.button == 7) mouse[OpenTK.Input.MouseButton.Button2] = true;
else if (e.ButtonEvent.button == 8) mouse[OpenTK.Input.MouseButton.Button3] = true;
else if (e.ButtonEvent.button == 9) mouse[OpenTK.Input.MouseButton.Button4] = true;
else if (e.ButtonEvent.button == 10) mouse[OpenTK.Input.MouseButton.Button5] = true;
else if (e.ButtonEvent.button == 11) mouse[OpenTK.Input.MouseButton.Button6] = true;
else if (e.ButtonEvent.button == 12) mouse[OpenTK.Input.MouseButton.Button7] = true;
else if (e.ButtonEvent.button == 13) mouse[OpenTK.Input.MouseButton.Button8] = true;
else if (e.ButtonEvent.button == 14) mouse[OpenTK.Input.MouseButton.Button9] = true;
//if ((e.state & (int)X11.MouseMask.Button4Mask) != 0) m.Wheel++;
//if ((e.state & (int)X11.MouseMask.Button5Mask) != 0) m.Wheel--;
//if ((e.state & (int)X11.MouseMask.Button5Mask) != 0) m.Wheel--;
//Debug.Print("Button pressed: {0}", e.ButtonEvent.button);
break;
case XEventName.ButtonRelease:
case XEventName.ButtonRelease:
if (e.ButtonEvent.button == 1) mouse[OpenTK.Input.MouseButton.Left] = false;
else if (e.ButtonEvent.button == 2) mouse[OpenTK.Input.MouseButton.Middle] = false;
else if (e.ButtonEvent.button == 3) mouse[OpenTK.Input.MouseButton.Right] = false;
else if (e.ButtonEvent.button == 6) mouse[OpenTK.Input.MouseButton.Button1] = false;
else if (e.ButtonEvent.button == 7) mouse[OpenTK.Input.MouseButton.Button2] = false;
else if (e.ButtonEvent.button == 8) mouse[OpenTK.Input.MouseButton.Button3] = false;
else if (e.ButtonEvent.button == 9) mouse[OpenTK.Input.MouseButton.Button4] = false;
else if (e.ButtonEvent.button == 10) mouse[OpenTK.Input.MouseButton.Button5] = false;
else if (e.ButtonEvent.button == 11) mouse[OpenTK.Input.MouseButton.Button6] = false;
else if (e.ButtonEvent.button == 12) mouse[OpenTK.Input.MouseButton.Button7] = false;
else if (e.ButtonEvent.button == 13) mouse[OpenTK.Input.MouseButton.Button8] = false;
else if (e.ButtonEvent.button == 6) mouse[OpenTK.Input.MouseButton.Button1] = false;
else if (e.ButtonEvent.button == 7) mouse[OpenTK.Input.MouseButton.Button2] = false;
else if (e.ButtonEvent.button == 8) mouse[OpenTK.Input.MouseButton.Button3] = false;
else if (e.ButtonEvent.button == 9) mouse[OpenTK.Input.MouseButton.Button4] = false;
else if (e.ButtonEvent.button == 10) mouse[OpenTK.Input.MouseButton.Button5] = false;
else if (e.ButtonEvent.button == 11) mouse[OpenTK.Input.MouseButton.Button6] = false;
else if (e.ButtonEvent.button == 12) mouse[OpenTK.Input.MouseButton.Button7] = false;
else if (e.ButtonEvent.button == 13) mouse[OpenTK.Input.MouseButton.Button8] = false;
else if (e.ButtonEvent.button == 14) mouse[OpenTK.Input.MouseButton.Button9] = false;
break;
case XEventName.MotionNotify:
mouse.X = e.MotionEvent.x;
mouse.Y = e.MotionEvent.y;
mouse.Position = new System.Drawing.Point(mouse.X, mouse.Y);
break;
}
}