<Compile Include="Platform\X11\Structs.cs">
<SubType>Code</SubType>
</Compile>
- <Compile Include="Platform\X11\X11Input.cs">
- <SubType>Code</SubType>
- </Compile>
<Compile Include="Platform\X11\X11Factory.cs">
<SubType>Code</SubType>
</Compile>
X11WindowInfo window = new X11WindowInfo();
- // Legacy input support
- X11Input driver;
- KeyboardDevice keyboard;
- MouseDevice mouse;
-
// Window manager hints for fullscreen windows.
// Not used right now (the code is written, but is not 64bit-correct), but could be useful for older WMs which
// are not ICCM compliant, but may support MOTIF hints.
// Keyboard input
readonly byte[] ascii = new byte[16];
readonly char[] chars = new char[16];
- readonly KeyPressEventArgs KPEventArgs = new KeyPressEventArgs('\0');
- readonly KeyboardKeyEventArgs KeyDownEventArgs = new KeyboardKeyEventArgs();
- readonly KeyboardKeyEventArgs KeyUpEventArgs = new KeyboardKeyEventArgs();
readonly IntPtr EmptyCursor;
e.ConfigureEvent.height = height;
RefreshWindowBounds(ref e);
- driver = new X11Input(window);
- keyboard = driver.Keyboard[0];
- mouse = driver.Mouse[0];
-
EmptyCursor = CreateEmptyCursor(window);
Debug.WriteLine(String.Format("X11GLNative window created successfully (id: {0}).", Handle));
Debug.Unindent();
+ // Request that auto-repeat is only set on devices that support it physically.
+ // This typically means that it's turned off for keyboards (which is what we want).
+ // We prefer this method over XAutoRepeatOff/On, because the latter needs to
+ // be reset before the program exits.
+ bool supported;
+ Functions.XkbSetDetectableAutoRepeat(window.Display, true, out supported);
+
exists = true;
}
return cursor;
}
- static void SetMouseClamped(MouseDevice mouse, int x, int y,
+ void SetMouseClamped(int x, int y,
int left, int top, int width, int height)
{
// Clamp mouse to the specified rectangle.
x = Math.Min(x, width);
y = Math.Max(y, top);
y = Math.Min(y, height);
- mouse.Position = new Point(x, y);
+ MouseState.X = x;
+ MouseState.Y = y;
}
#endregion
case XEventName.KeyRelease:
bool pressed = e.type == XEventName.KeyPress;
Key key;
- if (driver.TranslateKey(ref e.KeyEvent, out key))
+ if (X11KeyMap.TranslateKey(ref e.KeyEvent, out key))
{
if (pressed)
{
// Raise KeyDown event
- KeyDownEventArgs.Key = key;
- KeyDownEventArgs.ScanCode = (uint)e.KeyEvent.keycode;
- KeyDownEventArgs.Modifiers = keyboard.GetModifiers();
- KeyDown(this, KeyDownEventArgs);
+ KeyDownArgs.Key = key;
+ KeyDownArgs.ScanCode = (uint)e.KeyEvent.keycode;
+ //KeyDownArgs.Modifiers = keyboard.GetModifiers();
+ OnKeyDown(KeyDownArgs);
}
else
{
// Raise KeyUp event
- KeyUpEventArgs.Key = key;
- KeyUpEventArgs.ScanCode = (uint)e.KeyEvent.keycode;
- KeyUpEventArgs.Modifiers = keyboard.GetModifiers();
- KeyUp(this, KeyUpEventArgs);
+ KeyUpArgs.Key = key;
+ KeyUpArgs.ScanCode = (uint)e.KeyEvent.keycode;
+ //KeyUpArgs.Modifiers = keyboard.GetModifiers();
+ OnKeyUp(KeyUpArgs);
}
if (pressed)
{
if (!Char.IsControl(chars[i]))
{
- KPEventArgs.KeyChar = chars[i];
- KeyPress(this, KPEventArgs);
+ KeyPressArgs.KeyChar = chars[i];
+ OnKeyPress(KeyPressArgs);
}
}
}
// to the dead center of the window. Fortunately, this situation
// is very very uncommon. Todo: Can this be remedied?
int x = e.MotionEvent.x;
- int y =e.MotionEvent.y;
+ int y = e.MotionEvent.y;
// TODO: Have offset as a stored field, only update it when the window moves
// The middle point cannot be the average of the Bounds.left/right/top/bottom,
// because these fields take into account window decoration (borders, etc),
}
else if (!CursorVisible)
{
- SetMouseClamped(mouse,
- mouse.X + x - mouse_rel_x,
- mouse.Y + y - mouse_rel_y,
+ SetMouseClamped(
+ MouseState.X + x - mouse_rel_x,
+ MouseState.Y + y - mouse_rel_y,
0, 0, Width, Height);
mouse_rel_x = x;
mouse_rel_y = y;
}
else
{
- SetMouseClamped(mouse, x, y, 0, 0, Width, Height);
+ SetMouseClamped(x, y, 0, 0, Width, Height);
mouse_rel_x = x;
mouse_rel_y = y;
}
+
+ OnMouseMove();
break;
}
case XEventName.ButtonPress:
+ switch (e.ButtonEvent.button)
+ {
+ case 1: MouseState.EnableBit((int)MouseButton.Left); break;
+ case 2: MouseState.EnableBit((int)MouseButton.Middle); break;
+ case 3: MouseState.EnableBit((int)MouseButton.Right); break;
+ case 4: MouseState.SetScrollRelative(0, 1); break;
+ case 5: MouseState.SetScrollRelative(0, -1); break;
+ case 6: MouseState.EnableBit((int)MouseButton.Button1); break;
+ case 7: MouseState.EnableBit((int)MouseButton.Button2); break;
+ case 8: MouseState.EnableBit((int)MouseButton.Button3); break;
+ case 9: MouseState.EnableBit((int)MouseButton.Button4); break;
+ case 10: MouseState.EnableBit((int)MouseButton.Button5); break;
+ case 11: MouseState.EnableBit((int)MouseButton.Button6); break;
+ case 12: MouseState.EnableBit((int)MouseButton.Button7); break;
+ case 13: MouseState.EnableBit((int)MouseButton.Button8); break;
+ case 14: MouseState.EnableBit((int)MouseButton.Button9); break;
+ }
+ OnMouseDown();
+ break;
+
case XEventName.ButtonRelease:
- driver.ProcessEvent(ref e);
+ switch (e.ButtonEvent.button)
+ {
+ case 1: MouseState.DisableBit((int)MouseButton.Left); break;
+ case 2: MouseState.DisableBit((int)MouseButton.Middle); break;
+ case 3: MouseState.DisableBit((int)MouseButton.Right); break;
+ case 6: MouseState.DisableBit((int)MouseButton.Button1); break;
+ case 7: MouseState.DisableBit((int)MouseButton.Button2); break;
+ case 8: MouseState.DisableBit((int)MouseButton.Button3); break;
+ case 9: MouseState.DisableBit((int)MouseButton.Button4); break;
+ case 10: MouseState.DisableBit((int)MouseButton.Button5); break;
+ case 11: MouseState.DisableBit((int)MouseButton.Button6); break;
+ case 12: MouseState.DisableBit((int)MouseButton.Button7); break;
+ case 13: MouseState.DisableBit((int)MouseButton.Button8); break;
+ case 14: MouseState.DisableBit((int)MouseButton.Button9); break;
+ }
+ OnMouseUp();
break;
case XEventName.FocusIn:
#region --- INativeGLWindow Members ---
- #region public IInputDriver InputDriver
-
- public IInputDriver InputDriver
- {
- get
- {
- return driver;
- }
- }
-
- #endregion
-
#region public bool Exists
/// <summary>
+++ /dev/null
-#region --- License ---
-/* Copyright (c) 2006, 2007 Stefanos Apostolopoulos
- * See license.txt for license info
- */
-#endregion
-
-using System;
-using System.Collections.Generic;
-#if !MINIMAL
-using System.Drawing;
-#endif
-using System.Text;
-using System.Diagnostics;
-using System.Runtime.InteropServices;
-
-using OpenTK.Input;
-
-namespace OpenTK.Platform.X11
-{
- /// \internal
- /// <summary>
- /// Drives the InputDriver on X11.
- /// This class supports OpenTK, and is not intended for users of OpenTK.
- /// </summary>
- internal sealed class X11Input : IInputDriver
- {
- KeyboardDevice keyboard = new KeyboardDevice();
- MouseDevice mouse = new MouseDevice();
- List<KeyboardDevice> dummy_keyboard_list = new List<KeyboardDevice>(1);
- List<MouseDevice> dummy_mice_list = new List<MouseDevice>(1);
-
- int firstKeyCode, lastKeyCode; // The smallest and largest KeyCode supported by the X server.
- int keysyms_per_keycode; // The number of KeySyms for each KeyCode.
- IntPtr[] keysyms;
-
- //bool disposed;
-
- #region --- Constructors ---
-
- /// <summary>
- /// Constructs a new X11Input driver. Creates a hidden InputOnly window, child to
- /// the main application window, which selects input events and routes them to
- /// the device specific drivers (Keyboard, Mouse, Hid).
- /// </summary>
- /// <param name="attach">The window which the InputDriver will attach itself on.</param>
- public X11Input(IWindowInfo attach)
- {
- Debug.WriteLine("Initalizing X11 input driver.");
- Debug.Indent();
-
- if (attach == null)
- throw new ArgumentException("A valid parent window must be defined, in order to create an X11Input driver.");
-
- //window = new X11WindowInfo(attach);
- X11WindowInfo window = (X11WindowInfo)attach;
-
- // Init mouse
- mouse.Description = "Default X11 mouse";
- mouse.DeviceID = IntPtr.Zero;
- mouse.NumberOfButtons = 5;
- mouse.NumberOfWheels = 1;
- dummy_mice_list.Add(mouse);
-
- using (new XLock(window.Display))
- {
- // Init keyboard
- API.DisplayKeycodes(window.Display, ref firstKeyCode, ref lastKeyCode);
- Debug.Print("First keycode: {0}, last {1}", firstKeyCode, lastKeyCode);
-
- IntPtr keysym_ptr = API.GetKeyboardMapping(window.Display, (byte)firstKeyCode,
- lastKeyCode - firstKeyCode + 1, ref keysyms_per_keycode);
- Debug.Print("{0} keysyms per keycode.", keysyms_per_keycode);
-
- keysyms = new IntPtr[(lastKeyCode - firstKeyCode + 1) * keysyms_per_keycode];
- Marshal.PtrToStructure(keysym_ptr, keysyms);
- API.Free(keysym_ptr);
-
- keyboard.Description = "Default X11 keyboard";
- keyboard.NumberOfKeys = lastKeyCode - firstKeyCode + 1;
- keyboard.DeviceID = IntPtr.Zero;
- dummy_keyboard_list.Add(keyboard);
-
- // Request that auto-repeat is only set on devices that support it physically.
- // This typically means that it's turned off for keyboards (which is what we want).
- // We prefer this method over XAutoRepeatOff/On, because the latter needs to
- // be reset before the program exits.
- bool supported;
- Functions.XkbSetDetectableAutoRepeat(window.Display, true, out supported);
- }
-
- Debug.Unindent();
- }
-
- #endregion
-
- #region TranslateKey
-
- internal bool TranslateKey(ref XKeyEvent e, out Key key)
- {
- XKey keysym = (XKey)API.LookupKeysym(ref e, 0);
- XKey keysym2 = (XKey)API.LookupKeysym(ref e, 1);
- key = X11KeyMap.GetKey(keysym);
- if (key == Key.Unknown)
- {
- key = X11KeyMap.GetKey(keysym2);
- }
- if (key == Key.Unknown)
- {
- Debug.Print("KeyCode {0} (Keysym: {1}, {2}) not mapped.", e.keycode, (XKey)keysym, (XKey)keysym2);
- }
-
- return key != Key.Unknown;
- }
-
- #endregion
-
- #region internal void ProcessEvent(ref XEvent e)
-
- internal void ProcessEvent(ref XEvent e)
- {
- switch (e.type)
- {
- case XEventName.ButtonPress:
- if (e.ButtonEvent.button == 1) mouse[OpenTK.Input.MouseButton.Left] = true;
- 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 == 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--;
- //Debug.Print("Button pressed: {0}", e.ButtonEvent.button);
- break;
-
- 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 == 14) mouse[OpenTK.Input.MouseButton.Button9] = false;
- break;
-
- case XEventName.MotionNotify:
- mouse.Position = new Point(e.MotionEvent.x, e.MotionEvent.y);
- break;
- }
- }
-
- #endregion
-
- #region --- IInputDriver Members ---
-
- #region public IList<Keyboard> Keyboard
-
- public IList<KeyboardDevice> Keyboard
- {
- get { return dummy_keyboard_list; }//return keyboardDriver.Keyboard;
- }
-
- #endregion
-
- #region public IList<Mouse> Mouse
-
- public IList<MouseDevice> Mouse
- {
- get { return (IList<MouseDevice>)dummy_mice_list; } //return mouseDriver.Mouse;
- }
-
- #endregion
-
- public IList<JoystickDevice> Joysticks
- {
- get { throw new NotImplementedException(); }
- }
-
- #endregion
-
- #region public void Poll()
-
- /// <summary>
- /// Polls and updates state of all keyboard, mouse and joystick devices.
- /// </summary>
- public void Poll()
- {
- }
-
- #endregion
-
- #region --- IDisposable Members ---
-
- public void Dispose()
- {
- //this.Dispose(true);
- //GC.SuppressFinalize(this);
- }
-
- //private void Dispose(bool manual)
- //{
- // if (!disposed)
- // {
- // //disposing = true;
- // if (pollingThread != null && pollingThread.IsAlive)
- // pollingThread.Abort();
-
- // if (manual)
- // {
- // }
-
- // disposed = true;
- // }
- //}
-
- //~X11Input()
- //{
- // this.Dispose(false);
- //}
-
- #endregion
- }
-}
return Key.Unknown;
}
}
+
+ internal static bool TranslateKey(ref XKeyEvent e, out Key key)
+ {
+ XKey keysym = (XKey)API.LookupKeysym(ref e, 0);
+ XKey keysym2 = (XKey)API.LookupKeysym(ref e, 1);
+ key = X11KeyMap.GetKey(keysym);
+ if (key == Key.Unknown)
+ {
+ key = X11KeyMap.GetKey(keysym2);
+ }
+ if (key == Key.Unknown)
+ {
+ Debug.Print("KeyCode {0} (Keysym: {1}, {2}) not mapped.", e.keycode, (XKey)keysym, (XKey)keysym2);
+ }
+
+ return key != Key.Unknown;
+ }
}
}