diff --git a/Source/OpenTK/Platform/X11/X11GLNative.cs b/Source/OpenTK/Platform/X11/X11GLNative.cs
index 70d45c53..5486b3e6 100644
--- a/Source/OpenTK/Platform/X11/X11GLNative.cs
+++ b/Source/OpenTK/Platform/X11/X11GLNative.cs
@@ -11,6 +11,7 @@ using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Reflection;
using OpenTK.OpenGL;
+using OpenTK.Input;
//using OpenTK.OpenGL;
@@ -27,6 +28,7 @@ namespace OpenTK.Platform.X11
private X11GLContext glContext;
private WindowInfo window = new WindowInfo();
private DisplayMode mode = new DisplayMode();
+ X11Input driver;
// Number of pending events.
private int pending = 0;
@@ -36,8 +38,7 @@ namespace OpenTK.Platform.X11
// C# ResizeEventArgs
private ResizeEventArgs resizeEventArgs = new ResizeEventArgs();
- // Low level X11 resize request
- // Event used for event loop.
+ // Used for event loop.
private XEvent e = new XEvent();
private bool disposed;
@@ -82,7 +83,7 @@ namespace OpenTK.Platform.X11
Functions.XNextEvent(window.Display, ref e);
- Debug.Print("Event: {0} ({1} pending)", e.type, pending);
+ //Debug.Print("Event: {0} ({1} pending)", e.type, pending);
// Respond to the event e
switch (e.type)
@@ -90,7 +91,7 @@ namespace OpenTK.Platform.X11
case XEventName.ReparentNotify:
// TODO: Is there a more suitable place to raise the Create event?
// ReparentNotify seems to be the first event raised on window creation.
- this.OnCreate(EventArgs.Empty);
+ //this.OnCreate(EventArgs.Empty);
break;
@@ -134,8 +135,9 @@ namespace OpenTK.Platform.X11
case XEventName.MotionNotify:
case XEventName.ButtonPress:
case XEventName.ButtonRelease:
- Functions.XPutBackEvent(window.Display, ref e);
- return;
+ //Functions.XPutBackEvent(window.Display, ref e);
+ driver.ProcessEvent(ref e);
+ break;
default:
Debug.WriteLine(String.Format("{0} event was not handled", e.type));
@@ -215,6 +217,49 @@ namespace OpenTK.Platform.X11
#endregion
+ #region public string Text
+
+ public string Title
+ {
+ get
+ {
+ return String.Empty;
+ }
+ set
+ {
+
+ }
+ }
+
+ #endregion
+
+ #region public bool Visible
+
+ public bool Visible
+ {
+ get
+ {
+ return true;
+ }
+ set
+ {
+ }
+ }
+
+ #endregion
+
+ #region public IInputDriver InputDriver
+
+ public IInputDriver InputDriver
+ {
+ get
+ {
+ return driver;
+ }
+ }
+
+ #endregion
+
#region public IWindowInfo WindowInfo
public IWindowInfo WindowInfo
@@ -273,9 +318,9 @@ namespace OpenTK.Platform.X11
API.CreateColormap(window.Display, window.RootWindow, window.VisualInfo.visual, 0/*AllocNone*/);
window.EventMask =
EventMask.StructureNotifyMask | EventMask.SubstructureNotifyMask | EventMask.ExposureMask |
- EventMask.KeyReleaseMask | EventMask.KeyPressMask |
- EventMask.PointerMotionMask | EventMask.PointerMotionHintMask |
- EventMask.ButtonPressMask | EventMask.ButtonReleaseMask;
+ EventMask.KeyReleaseMask | EventMask.KeyPressMask;/* |
+ EventMask.PointerMotionMask | /* Bad! EventMask.PointerMotionHintMask |
+ EventMask.ButtonPressMask | EventMask.ButtonReleaseMask;*/
attributes.event_mask = (IntPtr)window.EventMask;
uint mask = (uint)SetWindowValuemask.ColorMap | (uint)SetWindowValuemask.EventMask |
@@ -317,6 +362,8 @@ namespace OpenTK.Platform.X11
API.MapRaised(window.Display, window.Handle);
+ driver = new X11Input(window);
+
GL.LoadAll();
Glu.LoadAll();
diff --git a/Source/OpenTK/Platform/X11/X11Input.cs b/Source/OpenTK/Platform/X11/X11Input.cs
index f16449c3..80c2e307 100644
--- a/Source/OpenTK/Platform/X11/X11Input.cs
+++ b/Source/OpenTK/Platform/X11/X11Input.cs
@@ -38,7 +38,7 @@ namespace OpenTK.Platform.X11
/// the device specific drivers (Keyboard, Mouse, Hid).
///
/// The window which the InputDriver will attach itself on.
- public X11Input(X11.WindowInfo attach)
+ public X11Input(IWindowInfo attach)
{
Debug.WriteLine("Initalizing X11 input driver.");
Debug.Indent();
@@ -75,14 +75,14 @@ namespace OpenTK.Platform.X11
Functions.XMapWindow(window.Display, window.Handle);
*/
- window = attach;
+ //window = attach;
keyboardDriver = new X11Keyboard(window);
mouseDriver = new X11Mouse(window);
- Thread pollingThread = new Thread(InternalPoll);
+ //Thread pollingThread = new Thread(InternalPoll);
//pollingThread.Priority = ThreadPriority.BelowNormal;
- pollingThread.IsBackground = true;
- pollingThread.Start();
+ //pollingThread.IsBackground = true;
+ //pollingThread.Start();
Debug.Unindent();
}
@@ -93,39 +93,39 @@ namespace OpenTK.Platform.X11
{
try
{
- while (!disposed)
- {
- Functions.XMaskEvent(window.Display,
- EventMask.PointerMotionMask | EventMask.PointerMotionHintMask |
- EventMask.ButtonPressMask | EventMask.ButtonReleaseMask |
- EventMask.KeyPressMask | EventMask.KeyReleaseMask |
- EventMask.StructureNotifyMask, ref e);
+ //while (!disposed)
+ //{
+ // Functions.XMaskEvent(window.Display,
+ // EventMask.PointerMotionMask | EventMask.PointerMotionHintMask |
+ // EventMask.ButtonPressMask | EventMask.ButtonReleaseMask |
+ // EventMask.KeyPressMask | EventMask.KeyReleaseMask |
+ // EventMask.StructureNotifyMask, ref e);
- if (disposed || disposing)
- return;
+ // if (disposed || disposing)
+ // return;
- switch (e.type)
- {
- case XEventName.KeyPress:
- case XEventName.KeyRelease:
- keyboardDriver.ProcessKeyboardEvent(ref e.KeyEvent);
- break;
+ // switch (e.type)
+ // {
+ // case XEventName.KeyPress:
+ // case XEventName.KeyRelease:
+ // keyboardDriver.ProcessKeyboardEvent(ref e.KeyEvent);
+ // break;
- case XEventName.ButtonPress:
- case XEventName.ButtonRelease:
- mouseDriver.ProcessButton(ref e.ButtonEvent);
- break;
+ // case XEventName.ButtonPress:
+ // case XEventName.ButtonRelease:
+ // mouseDriver.ProcessButton(ref e.ButtonEvent);
+ // break;
- case XEventName.MotionNotify:
- mouseDriver.ProcessMotion(ref e.MotionEvent);
- break;
+ // case XEventName.MotionNotify:
+ // mouseDriver.ProcessMotion(ref e.MotionEvent);
+ // break;
- case XEventName.DestroyNotify:
- Functions.XPutBackEvent(window.Display, ref e);
- //pollingThread.Abort();
- return;
- }
- }
+ // case XEventName.DestroyNotify:
+ // Functions.XPutBackEvent(window.Display, ref e);
+ // //pollingThread.Abort();
+ // return;
+ // }
+ //}
}
catch (ThreadAbortException expt)
{
@@ -135,6 +135,29 @@ namespace OpenTK.Platform.X11
}
}
+ internal void ProcessEvent(ref XEvent e)
+ {
+ switch (e.type)
+ {
+ case XEventName.KeyPress:
+ case XEventName.KeyRelease:
+ //Debug.Print("Keyboard press");
+ keyboardDriver.ProcessKeyboardEvent(ref e.KeyEvent);
+ break;
+
+ case XEventName.ButtonPress:
+ case XEventName.ButtonRelease:
+ //Debug.Print("Button");
+ mouseDriver.ProcessButton(ref e.ButtonEvent);
+ break;
+
+ case XEventName.MotionNotify:
+ //Debug.Print("Mouse move");
+ mouseDriver.ProcessMotion(ref e.MotionEvent);
+ break;
+ }
+ }
+
#region --- IInputDriver Members ---
#region public IList InputDevices
@@ -148,7 +171,7 @@ namespace OpenTK.Platform.X11
#region public IList Keyboard
- public IList Keyboard
+ public IList Keyboard
{
get { return keyboardDriver.Keyboard; }
}
@@ -157,7 +180,7 @@ namespace OpenTK.Platform.X11
#region public IList Mouse
- public IList Mouse
+ public IList Mouse
{
get { return mouseDriver.Mouse; }
}
@@ -172,6 +195,7 @@ namespace OpenTK.Platform.X11
///
public void Poll()
{
+ mouseDriver.Poll();
}
#endregion
diff --git a/Source/OpenTK/Platform/X11/X11Keyboard.cs b/Source/OpenTK/Platform/X11/X11Keyboard.cs
index 882753e0..1af72ac4 100644
--- a/Source/OpenTK/Platform/X11/X11Keyboard.cs
+++ b/Source/OpenTK/Platform/X11/X11Keyboard.cs
@@ -27,7 +27,7 @@ namespace OpenTK.Platform.X11
///
WindowInfo window;
- List keyboards = new List();
+ List keyboards = new List();
static Dictionary keymap = new Dictionary((int)Key.MaxKeys);
///
/// The smallest and largest KeyCode supported by the X server. Queried through API.DisplayKeycodes()
@@ -186,7 +186,7 @@ namespace OpenTK.Platform.X11
API.Free(keysym_ptr);
- Keyboard kb = new Keyboard();
+ KeyboardDevice kb = new KeyboardDevice();
kb.Description = "Default X11 keyboard";
kb.NumberOfKeys = lastKeyCode - firstKeyCode + 1;
kb.DeviceID = IntPtr.Zero;
@@ -214,7 +214,7 @@ namespace OpenTK.Platform.X11
//Debug.Print("Key down: {0}", e.ToString());
- int index = keyboards.FindIndex(delegate(Keyboard kb)
+ int index = keyboards.FindIndex(delegate(KeyboardDevice kb)
{
return kb.DeviceID == IntPtr.Zero;
});
@@ -243,7 +243,7 @@ namespace OpenTK.Platform.X11
#region --- IKeyboardDriver Members ---
- public IList Keyboard
+ public IList Keyboard
{
get { return keyboards; }
}
diff --git a/Source/OpenTK/Platform/X11/X11Mouse.cs b/Source/OpenTK/Platform/X11/X11Mouse.cs
index d96c974c..c22484c9 100644
--- a/Source/OpenTK/Platform/X11/X11Mouse.cs
+++ b/Source/OpenTK/Platform/X11/X11Mouse.cs
@@ -18,7 +18,7 @@ namespace OpenTK.Platform.X11
internal sealed class X11Mouse : IMouseDriver
{
WindowInfo window;
- List mice = new List();
+ List mice = new List();
#region Constructor
@@ -28,7 +28,7 @@ namespace OpenTK.Platform.X11
// Just create one mouse now.
// TODO: support for multiple devices through evdev.
- Mouse m = new Mouse();
+ MouseDevice m = new MouseDevice();
m.Description = "Default X11 mouse";
m.DeviceID = IntPtr.Zero;
m.NumberOfButtons = 5;
@@ -40,7 +40,7 @@ namespace OpenTK.Platform.X11
#region --- IMouseDriver Members ---
- public IList Mouse
+ public IList Mouse
{
get { return mice; }
}
@@ -54,13 +54,14 @@ namespace OpenTK.Platform.X11
/// True if the event was processed, false otherwise.
internal bool ProcessButton(ref X11.XButtonEvent e)
{
- Mouse m = mice[0];
+ MouseDevice m = mice[0];
bool pressed = e.type == XEventName.ButtonPress;
- if ((e.state & (int)X11.MouseMask.Button1Mask) != 0) m[OpenTK.Input.MouseButton.Button1] = pressed;
- if ((e.state & (int)X11.MouseMask.Button2Mask) != 0) m[OpenTK.Input.MouseButton.Button2] = pressed;
- if ((e.state & (int)X11.MouseMask.Button3Mask) != 0) m[OpenTK.Input.MouseButton.Button3] = pressed;
- if ((e.state & (int)X11.MouseMask.Button4Mask) != 0) m[OpenTK.Input.MouseButton.Button4] = pressed;
- if ((e.state & (int)X11.MouseMask.Button5Mask) != 0) m[OpenTK.Input.MouseButton.Button5] = pressed;
+ //e.
+ if ((e.state & (int)X11.MouseMask.Button1Mask) != 0) m[OpenTK.Input.MouseButton.Left] = pressed;
+ if ((e.state & (int)X11.MouseMask.Button2Mask) != 0) m[OpenTK.Input.MouseButton.Middle] = pressed;
+ if ((e.state & (int)X11.MouseMask.Button3Mask) != 0) m[OpenTK.Input.MouseButton.Right] = pressed;
+ if ((e.state & (int)X11.MouseMask.Button4Mask) != 0) m.Wheel++;
+ if ((e.state & (int)X11.MouseMask.Button5Mask) != 0) m.Wheel--;
return true;
}
@@ -71,10 +72,28 @@ namespace OpenTK.Platform.X11
/// True if the event was processed, false otherwise.
internal bool ProcessMotion(ref X11.XMotionEvent e)
{
- Mouse m = mice[0];
+ MouseDevice m = mice[0];
m.X = e.x;
m.Y = e.y;
return true;
}
+
+ ///
+ /// Queries the mouse pos.
+ ///
+ internal void Poll()
+ {
+ IntPtr root, child;
+ int state, root_x, root_y, win_x, win_y;
+ MouseDevice m = mice[0];
+ Functions.XQueryPointer(window.Display, window.Handle, out root, out child, out root_x, out root_y, out win_x, out win_y, out state);
+ m[OpenTK.Input.MouseButton.Left] = (state & (int)X11.MouseMask.Button1Mask) != 0;
+ m[OpenTK.Input.MouseButton.Middle] = (state & (int)X11.MouseMask.Button2Mask) != 0;
+ m[OpenTK.Input.MouseButton.Right] = (state & (int)X11.MouseMask.Button3Mask) != 0;
+ m.Wheel += (state & (int)X11.MouseMask.Button4Mask);
+ m.Wheel -= (state & (int)X11.MouseMask.Button5Mask);
+ m.X = root_x;
+ m.Y = root_y;
+ }
}
}