* Input/Mouse.cs:
* Platform/X11/X11Mouse.cs: * Platform/X11/XI2Mouse.cs: Added internal list of mouse devices in preparation for multi-mouse support.
This commit is contained in:
parent
6276057c65
commit
d49b315ced
3 changed files with 28 additions and 11 deletions
|
@ -61,6 +61,8 @@ namespace OpenTK.Input
|
||||||
/// <returns>A <see cref="OpenTK.Input.MouseState"/> structure containing the state of the mouse device.</returns>
|
/// <returns>A <see cref="OpenTK.Input.MouseState"/> structure containing the state of the mouse device.</returns>
|
||||||
public static MouseState GetState(int index)
|
public static MouseState GetState(int index)
|
||||||
{
|
{
|
||||||
|
if (index < 0)
|
||||||
|
throw new ArgumentOutOfRangeException("index");
|
||||||
return driver.GetState(index);
|
return driver.GetState(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -77,13 +77,12 @@ namespace OpenTK.Platform.X11
|
||||||
|
|
||||||
public MouseState GetState(int index)
|
public MouseState GetState(int index)
|
||||||
{
|
{
|
||||||
|
|
||||||
// X11Mouse supports a single mouse only
|
|
||||||
if (index < 0 || index > 1)
|
|
||||||
throw new ArgumentOutOfRangeException("index");
|
|
||||||
|
|
||||||
ProcessEvents();
|
ProcessEvents();
|
||||||
|
// X11Mouse supports only one device
|
||||||
|
if (index == 0)
|
||||||
return mouse;
|
return mouse;
|
||||||
|
else
|
||||||
|
return new MouseState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriteBit(MouseButton offset, int enabled)
|
void WriteBit(MouseButton offset, int enabled)
|
||||||
|
|
|
@ -37,8 +37,10 @@ namespace OpenTK.Platform.X11
|
||||||
// This should be easy: just read the device id and route the data to the correct device.
|
// This should be easy: just read the device id and route the data to the correct device.
|
||||||
sealed class XI2Mouse : IMouseDriver
|
sealed class XI2Mouse : IMouseDriver
|
||||||
{
|
{
|
||||||
MouseState state = new MouseState();
|
List<MouseState> mice = new List<MouseState>();
|
||||||
X11WindowInfo window;
|
Dictionary<int, int> rawids = new Dictionary<int, int>(); // maps raw ids to mouse ids
|
||||||
|
int first_mouse;
|
||||||
|
readonly X11WindowInfo window;
|
||||||
readonly int XIOpCode;
|
readonly int XIOpCode;
|
||||||
|
|
||||||
static readonly Functions.EventPredicate PredicateImpl = IsEventValid;
|
static readonly Functions.EventPredicate PredicateImpl = IsEventValid;
|
||||||
|
@ -88,13 +90,19 @@ namespace OpenTK.Platform.X11
|
||||||
public MouseState GetState()
|
public MouseState GetState()
|
||||||
{
|
{
|
||||||
ProcessEvents();
|
ProcessEvents();
|
||||||
return state;
|
if (mice.Count > 0)
|
||||||
|
return mice[0];
|
||||||
|
else
|
||||||
|
return new MouseState();
|
||||||
}
|
}
|
||||||
|
|
||||||
public MouseState GetState(int index)
|
public MouseState GetState(int index)
|
||||||
{
|
{
|
||||||
ProcessEvents();
|
ProcessEvents();
|
||||||
return state;
|
if (mice.Count > index)
|
||||||
|
return mice[index];
|
||||||
|
else
|
||||||
|
return new MouseState();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProcessEvents()
|
void ProcessEvents()
|
||||||
|
@ -115,6 +123,13 @@ namespace OpenTK.Platform.X11
|
||||||
XIRawEvent raw = (XIRawEvent)
|
XIRawEvent raw = (XIRawEvent)
|
||||||
Marshal.PtrToStructure(cookie.data, typeof(XIRawEvent));
|
Marshal.PtrToStructure(cookie.data, typeof(XIRawEvent));
|
||||||
|
|
||||||
|
if (!rawids.ContainsKey(raw.deviceid))
|
||||||
|
{
|
||||||
|
mice.Add(new MouseState());
|
||||||
|
rawids.Add(raw.deviceid, mice.Count - 1);
|
||||||
|
}
|
||||||
|
MouseState state = mice[rawids[raw.deviceid]];
|
||||||
|
|
||||||
switch (raw.evtype)
|
switch (raw.evtype)
|
||||||
{
|
{
|
||||||
case XIEventType.RawMotion:
|
case XIEventType.RawMotion:
|
||||||
|
@ -162,6 +177,7 @@ namespace OpenTK.Platform.X11
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
mice[rawids[raw.deviceid]] = state;
|
||||||
}
|
}
|
||||||
Functions.XFreeEventData(window.Display, ref cookie);
|
Functions.XFreeEventData(window.Display, ref cookie);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue