Moved keyboard and mouse code inside X11Input.cs

This commit is contained in:
the_fiddler 2008-02-01 23:28:23 +00:00
parent e5b5af7b11
commit effc907171
5 changed files with 241 additions and 124 deletions

View file

@ -429,7 +429,7 @@ namespace OpenTK.Platform.X11
(uint)SetWindowValuemask.BackPixel | (uint)SetWindowValuemask.BorderPixel; (uint)SetWindowValuemask.BackPixel | (uint)SetWindowValuemask.BorderPixel;
window.Handle = Functions.XCreateWindow(window.Display, window.RootWindow, window.Handle = Functions.XCreateWindow(window.Display, window.RootWindow,
0, 0, mode.Width, mode.Height, 0, window.VisualInfo.depth/*(int)CreateWindowArgs.CopyFromParent*/, 0, 0, width, height, 0, window.VisualInfo.depth/*(int)CreateWindowArgs.CopyFromParent*/,
(int)CreateWindowArgs.InputOutput, window.VisualInfo.visual, (UIntPtr)mask, ref attributes); (int)CreateWindowArgs.InputOutput, window.VisualInfo.visual, (UIntPtr)mask, ref attributes);
if (window.Handle == IntPtr.Zero) if (window.Handle == IntPtr.Zero)
@ -439,8 +439,8 @@ namespace OpenTK.Platform.X11
XSizeHints hints = new XSizeHints(); XSizeHints hints = new XSizeHints();
hints.x = 0; hints.x = 0;
hints.y = 0; hints.y = 0;
hints.width = mode.Width; hints.width = width;
hints.height = mode.Height; hints.height = height;
hints.flags = (IntPtr)(XSizeHintsFlags.USSize | XSizeHintsFlags.USPosition); hints.flags = (IntPtr)(XSizeHintsFlags.USSize | XSizeHintsFlags.USPosition);
Functions.XSetWMNormalHints(window.Display, window.Handle, ref hints); Functions.XSetWMNormalHints(window.Display, window.Handle, ref hints);
@ -493,7 +493,7 @@ namespace OpenTK.Platform.X11
/// </remarks> /// </remarks>
public void CreateWindow(int width, int height, DisplayMode mode, out IGraphicsContext glContext) public void CreateWindow(int width, int height, DisplayMode mode, out IGraphicsContext glContext)
{ {
this.CreateWindow(width, height, new GraphicsFormat(), out glContext); this.CreateWindow(width, height, mode.ToGraphicsFormat(), out glContext);
} }
#endregion #endregion

View file

@ -7,10 +7,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text; using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
using OpenTK.Input; using OpenTK.Input;
using System.Diagnostics;
using System.Threading;
namespace OpenTK.Platform.X11 namespace OpenTK.Platform.X11
{ {
@ -20,13 +20,16 @@ namespace OpenTK.Platform.X11
/// </summary> /// </summary>
internal sealed class X11Input : IInputDriver internal sealed class X11Input : IInputDriver
{ {
X11Keyboard keyboardDriver;
X11Mouse mouseDriver;
X11.WindowInfo window; X11.WindowInfo window;
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);
//XEvent e = new XEvent(); X11KeyMap keymap = new X11KeyMap();
int firstKeyCode, lastKeyCode; // The smallest and largest KeyCode supported by the X server.
Thread pollingThread = null; int keysyms_per_keycode; // The number of KeySyms for each KeyCode.
IntPtr[] keysyms;
bool disposed; bool disposed;
@ -47,43 +50,34 @@ namespace OpenTK.Platform.X11
throw new ArgumentException("A valid parent window must be defined, in order to create an X11Input driver."); throw new ArgumentException("A valid parent window must be defined, in order to create an X11Input driver.");
window = new X11.WindowInfo(attach); window = new X11.WindowInfo(attach);
/*
window = new WindowInfo();
window.Parent = attach;
Debug.Print("Creating hidden input window."); // Init mouse
mouse.Description = "Default X11 mouse";
mouse.DeviceID = IntPtr.Zero;
mouse.NumberOfButtons = 5;
mouse.NumberOfWheels = 1;
dummy_mice_list.Add(mouse);
XSetWindowAttributes wnd_attr = new XSetWindowAttributes(); // Init keyboard
wnd_attr.background_pixel = IntPtr.Zero; API.DisplayKeycodes(window.Display, ref firstKeyCode, ref lastKeyCode);
wnd_attr.border_pixel = IntPtr.Zero; Debug.Print("First keycode: {0}, last {1}", firstKeyCode, lastKeyCode);
//wnd_attr.colormap = IntPtr.Zero;
wnd_attr.event_mask = (IntPtr)
(EventMask.StructureNotifyMask |
EventMask.PointerMotionMask | EventMask.PointerMotionHintMask |
EventMask.ButtonPressMask | EventMask.ButtonReleaseMask |
EventMask.KeyPressMask | EventMask.KeyReleaseMask);
uint cw =
(uint)SetWindowValuemask.ColorMap | (uint)SetWindowValuemask.EventMask |
(uint)SetWindowValuemask.BackPixel | (uint)SetWindowValuemask.BorderPixel;
window.Handle = Functions.XCreateWindow(window.Display, window.Parent.Handle, IntPtr keysym_ptr = API.GetKeyboardMapping(window.Display, (byte)firstKeyCode,
0, 0, 30, 30, 0, Constants.CopyFromParent, Constants.InputOutput, lastKeyCode - firstKeyCode + 1, ref keysyms_per_keycode);
IntPtr.Zero, (UIntPtr)cw, ref wnd_attr); Debug.Print("{0} keysyms per keycode.", keysyms_per_keycode);
if (window.Handle == IntPtr.Zero)
throw new ApplicationException("Could not create hidden input window.");
Functions.XMapWindow(window.Display, window.Handle); keysyms = new IntPtr[(lastKeyCode - firstKeyCode + 1) * keysyms_per_keycode];
*/ Marshal.PtrToStructure(keysym_ptr, keysyms);
//window = attach; //keysyms = (IntPtr[])Marshal.PtrToStructure(keysym_ptr, typeof(IntPtr[]));
keyboardDriver = new X11Keyboard(window);
mouseDriver = new X11Mouse(window); API.Free(keysym_ptr);
KeyboardDevice kb = new KeyboardDevice();
keyboard.Description = "Default X11 keyboard";
keyboard.NumberOfKeys = lastKeyCode - firstKeyCode + 1;
keyboard.DeviceID = IntPtr.Zero;
dummy_keyboard_list.Add(keyboard);
//pollingThread = new Thread(InternalPoll);
//pollingThread.Priority = ThreadPriority.BelowNormal;
//pollingThread.IsBackground = true;
//pollingThread.Start();
Debug.Unindent(); Debug.Unindent();
} }
@ -148,19 +142,38 @@ namespace OpenTK.Platform.X11
{ {
case XEventName.KeyPress: case XEventName.KeyPress:
case XEventName.KeyRelease: case XEventName.KeyRelease:
//Debug.Print("Keyboard press"); bool pressed = e.type == XEventName.KeyPress;
keyboardDriver.ProcessKeyboardEvent(ref e.KeyEvent);
IntPtr keysym = API.LookupKeysym(ref e.KeyEvent, 0);
IntPtr keysym2 = API.LookupKeysym(ref e.KeyEvent, 1);
if (keymap.ContainsKey((XKey)keysym))
keyboard[keymap[(XKey)keysym]] = pressed;
else if (keymap.ContainsKey((XKey)keysym2))
keyboard[keymap[(XKey)keysym2]] = pressed;
else
Debug.Print("KeyCode {0} (Keysym: {1}, {2}) not mapped.", e.KeyEvent.keycode, (XKey)keysym, (XKey)keysym2);
break; break;
// See MouseDriver.Poll() instead.
case XEventName.ButtonPress: case XEventName.ButtonPress:
if (e.ButtonEvent.button == (int)MouseButton.Button1) mouse[OpenTK.Input.MouseButton.Left] = true;
else if (e.ButtonEvent.button == (int)MouseButton.Button2) mouse[OpenTK.Input.MouseButton.Middle] = true;
else if (e.ButtonEvent.button == (int)MouseButton.Button3) mouse[OpenTK.Input.MouseButton.Right] = true;
else if (e.ButtonEvent.button == (int)MouseButton.Button4) mouse.Wheel++;
else if (e.ButtonEvent.button == (int)MouseButton.Button5) mouse.Wheel--;
//if ((e.state & (int)X11.MouseMask.Button4Mask) != 0) m.Wheel++;
//if ((e.state & (int)X11.MouseMask.Button5Mask) != 0) m.Wheel--;
break;
case XEventName.ButtonRelease: case XEventName.ButtonRelease:
//Debug.Print("Button"); if (e.ButtonEvent.button == (int)MouseButton.Button1) mouse[OpenTK.Input.MouseButton.Left] = false;
mouseDriver.ProcessButton(ref e.ButtonEvent); else if (e.ButtonEvent.button == (int)MouseButton.Button2) mouse[OpenTK.Input.MouseButton.Middle] = false;
else if (e.ButtonEvent.button == (int)MouseButton.Button3) mouse[OpenTK.Input.MouseButton.Right] = false;
break; break;
case XEventName.MotionNotify: case XEventName.MotionNotify:
//Debug.Print("Mouse move"); mouse.X = e.MotionEvent.x;
mouseDriver.ProcessMotion(ref e.MotionEvent); mouse.Y = e.MotionEvent.y;
break; break;
} }
} }
@ -182,7 +195,7 @@ namespace OpenTK.Platform.X11
public IList<KeyboardDevice> Keyboard public IList<KeyboardDevice> Keyboard
{ {
get { return keyboardDriver.Keyboard; } get { return dummy_keyboard_list; }//return keyboardDriver.Keyboard;
} }
#endregion #endregion
@ -191,7 +204,7 @@ namespace OpenTK.Platform.X11
public IList<MouseDevice> Mouse public IList<MouseDevice> Mouse
{ {
get { return mouseDriver.Mouse; } get { return (IList<MouseDevice>)dummy_mice_list; } //return mouseDriver.Mouse;
} }
#endregion #endregion
@ -214,30 +227,30 @@ namespace OpenTK.Platform.X11
public void Dispose() public void Dispose()
{ {
this.Dispose(true); //this.Dispose(true);
GC.SuppressFinalize(this); //GC.SuppressFinalize(this);
} }
private void Dispose(bool manual) //private void Dispose(bool manual)
{ //{
if (!disposed) // if (!disposed)
{ // {
//disposing = true; // //disposing = true;
if (pollingThread != null && pollingThread.IsAlive) // if (pollingThread != null && pollingThread.IsAlive)
pollingThread.Abort(); // pollingThread.Abort();
if (manual) // if (manual)
{ // {
} // }
disposed = true; // disposed = true;
} // }
} //}
~X11Input() //~X11Input()
{ //{
this.Dispose(false); // this.Dispose(false);
} //}
#endregion #endregion
} }

View file

@ -0,0 +1,140 @@
#region --- License ---
/* Licensed under the MIT/X11 license.
* Copyright (c) 2006-2008 the OpenTK team.
* This notice may not be removed.
* See license.txt for licensing detailed licensing details.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using OpenTK.Input;
namespace OpenTK.Platform.X11
{
internal class X11KeyMap : Dictionary<XKey, Key>
{
internal X11KeyMap()
{
try
{
this.Add(XKey.Escape, Key.Escape);
this.Add(XKey.Return, Key.Enter);
this.Add(XKey.space, Key.Space);
this.Add(XKey.BackSpace, Key.BackSpace);
this.Add(XKey.Shift_L, Key.ShiftLeft);
this.Add(XKey.Shift_R, Key.ShiftRight);
this.Add(XKey.Alt_L, Key.AltLeft);
this.Add(XKey.Alt_R, Key.AltRight);
this.Add(XKey.Control_L, Key.ControlLeft);
this.Add(XKey.Control_R, Key.ControlRight);
this.Add(XKey.Super_L, Key.WinLeft);
this.Add(XKey.Super_R, Key.WinRight);
this.Add(XKey.Meta_L, Key.WinLeft);
this.Add(XKey.Meta_R, Key.WinRight);
this.Add(XKey.Menu, Key.Menu);
this.Add(XKey.Tab, Key.Tab);
this.Add(XKey.minus, Key.Minus);
this.Add(XKey.plus, Key.Plus);
this.Add(XKey.equal, Key.Plus);
this.Add(XKey.Caps_Lock, Key.CapsLock);
this.Add(XKey.Num_Lock, Key.NumLock);
for (int i = (int)XKey.F1; i <= (int)XKey.F35; i++)
{
this.Add((XKey)i, (Key)((int)Key.F1 + (i - (int)XKey.F1)));
}
for (int i = (int)XKey.a; i <= (int)XKey.z; i++)
{
this.Add((XKey)i, (Key)((int)Key.A + (i - (int)XKey.a)));
}
for (int i = (int)XKey.A; i <= (int)XKey.Z; i++)
{
this.Add((XKey)i, (Key)((int)Key.A + (i - (int)XKey.A)));
}
for (int i = (int)XKey.Number0; i <= (int)XKey.Number9; i++)
{
this.Add((XKey)i, (Key)((int)Key.Number0 + (i - (int)XKey.Number0)));
}
for (int i = (int)XKey.KP_0; i <= (int)XKey.KP_9; i++)
{
this.Add((XKey)i, (Key)((int)Key.Keypad0 + (i - (int)XKey.KP_0)));
}
this.Add(XKey.Pause, Key.Pause);
this.Add(XKey.Break, Key.Pause);
this.Add(XKey.Scroll_Lock, Key.Pause);
this.Add(XKey.Insert, Key.PrintScreen);
this.Add(XKey.Print, Key.PrintScreen);
this.Add(XKey.Sys_Req, Key.PrintScreen);
this.Add(XKey.backslash, Key.BackSlash);
this.Add(XKey.bar, Key.BackSlash);
this.Add(XKey.braceleft, Key.BracketLeft);
this.Add(XKey.bracketleft, Key.BracketLeft);
this.Add(XKey.braceright, Key.BracketRight);
this.Add(XKey.bracketright, Key.BracketRight);
this.Add(XKey.colon, Key.Semicolon);
this.Add(XKey.semicolon, Key.Semicolon);
this.Add(XKey.quoteright, Key.Quote);
this.Add(XKey.quotedbl, Key.Quote);
this.Add(XKey.quoteleft, Key.Tilde);
this.Add(XKey.asciitilde, Key.Tilde);
this.Add(XKey.comma, Key.Comma);
this.Add(XKey.less, Key.Comma);
this.Add(XKey.period, Key.Period);
this.Add(XKey.greater, Key.Period);
this.Add(XKey.slash, Key.Slash);
this.Add(XKey.question, Key.Slash);
this.Add(XKey.Left, Key.Left);
this.Add(XKey.Down, Key.Down);
this.Add(XKey.Right, Key.Right);
this.Add(XKey.Up, Key.Up);
this.Add(XKey.Delete, Key.Delete);
this.Add(XKey.Home, Key.Home);
this.Add(XKey.End, Key.End);
//this.Add(XKey.Prior, Key.PageUp); // XKey.Prior == XKey.Page_Up
this.Add(XKey.Page_Up, Key.PageUp);
this.Add(XKey.Page_Down, Key.PageDown);
//this.Add(XKey.Next, Key.PageDown); // XKey.Next == XKey.Page_Down
this.Add(XKey.KP_Add, Key.KeypadAdd);
this.Add(XKey.KP_Subtract, Key.KeypadSubtract);
this.Add(XKey.KP_Multiply, Key.KeypadMultiply);
this.Add(XKey.KP_Divide, Key.KeypadDivide);
this.Add(XKey.KP_Decimal, Key.KeypadDecimal);
this.Add(XKey.KP_Insert, Key.Keypad0);
this.Add(XKey.KP_End, Key.Keypad1);
this.Add(XKey.KP_Down, Key.Keypad2);
this.Add(XKey.KP_Page_Down, Key.Keypad3);
this.Add(XKey.KP_Left, Key.Keypad4);
this.Add(XKey.KP_Right, Key.Keypad6);
this.Add(XKey.KP_Home, Key.Keypad7);
this.Add(XKey.KP_Up, Key.Keypad8);
this.Add(XKey.KP_Page_Up, Key.Keypad9);
this.Add(XKey.KP_Delete, Key.KeypadDecimal);
this.Add(XKey.KP_Enter, Key.Enter);
}
catch (ArgumentException e)
{
Debug.Print("Exception while creating keymap: '{0}'.", e.ToString());
System.Windows.Forms.MessageBox.Show(
String.Format("Exception while creating keymap: '{0}'.", e.ToString()));
}
}
}
}

View file

@ -16,6 +16,8 @@ using System.Diagnostics;
namespace OpenTK.Platform.X11 namespace OpenTK.Platform.X11
{ {
// THIS CLASS IS NOT USED ANYMORE.
/// <summary> /// <summary>
/// Drives Keyboard devices on X11. /// Drives Keyboard devices on X11.
/// This class supports OpenTK, and is not intended for use by OpenTK programs. /// This class supports OpenTK, and is not intended for use by OpenTK programs.
@ -173,25 +175,9 @@ namespace OpenTK.Platform.X11
//Debug.Print("Info: {0}", window.ToString()); //Debug.Print("Info: {0}", window.ToString());
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, //keyboards.Add(kb);
lastKeyCode - firstKeyCode + 1, ref keysyms_per_keycode); //Debug.Print("Keyboard added: {0}", kb.ToString());
Debug.Print("{0} keysyms per keycode.", keysyms_per_keycode);
keysyms = new IntPtr[(lastKeyCode - firstKeyCode + 1) * keysyms_per_keycode];
Marshal.PtrToStructure(keysym_ptr, keysyms);
//keysyms = (IntPtr[])Marshal.PtrToStructure(keysym_ptr, typeof(IntPtr[]));
API.Free(keysym_ptr);
KeyboardDevice kb = new KeyboardDevice();
kb.Description = "Default X11 keyboard";
kb.NumberOfKeys = lastKeyCode - firstKeyCode + 1;
kb.DeviceID = IntPtr.Zero;
keyboards.Add(kb);
Debug.Print("Keyboard added: {0}", kb.ToString());
} }
#endregion #endregion
@ -205,38 +191,9 @@ namespace OpenTK.Platform.X11
/// <returns>True if the event was processed, false otherwise.</returns> /// <returns>True if the event was processed, false otherwise.</returns>
internal bool ProcessKeyboardEvent(ref X11.XKeyEvent e) internal bool ProcessKeyboardEvent(ref X11.XKeyEvent e)
{ {
return false;
//int keysym = keysyms[(e.keycode - firstKeyCode) * keysyms_per_keycode].ToInt32(); //int keysym = keysyms[(e.keycode - firstKeyCode) * keysyms_per_keycode].ToInt32();
//int keysym2 = keysyms[(e.keycode - firstKeyCode) * keysyms_per_keycode].ToInt32(); //int keysym2 = keysyms[(e.keycode - firstKeyCode) * keysyms_per_keycode].ToInt32();
bool pressed = e.type == XEventName.KeyPress;
IntPtr keysym = API.LookupKeysym(ref e, 0);
IntPtr keysym2 = API.LookupKeysym(ref e, 1);
//Debug.Print("Key down: {0}", e.ToString());
int index = keyboards.FindIndex(delegate(KeyboardDevice kb)
{
return kb.DeviceID == IntPtr.Zero;
});
switch (keysym.ToInt64())
{
default:
if (keymap.ContainsKey((XKey)keysym))
{
keyboards[index][keymap[(XKey)keysym]] = pressed;
}
else if (keymap.ContainsKey((XKey)keysym2))
{
keyboards[index][keymap[(XKey)keysym2]] = pressed;
}
else
{
//Debug.Print("KeyCode {0} (Keysym: {1}, {2}) not mapped.", e.keycode, (XKey)keysym, (XKey)keysym2);
return false;
}
return true;
}
} }
#endregion #endregion

View file

@ -11,6 +11,8 @@ using OpenTK.Input;
namespace OpenTK.Platform.X11 namespace OpenTK.Platform.X11
{ {
// THIS CLASS IS NOT USED ANYMORE.
/// <summary> /// <summary>
/// Drives Mouse devices on X11. /// Drives Mouse devices on X11.
/// This class supports OpenTK, and is not intended for use by OpenTK programs. /// This class supports OpenTK, and is not intended for use by OpenTK programs.
@ -56,11 +58,16 @@ namespace OpenTK.Platform.X11
internal bool ProcessButton(ref X11.XButtonEvent e) internal bool ProcessButton(ref X11.XButtonEvent e)
{ {
MouseDevice m = mice[0]; MouseDevice m = mice[0];
bool pressed = e.type == XEventName.ButtonPress; //bool pressed = e.type == XEventName.ButtonPress;
//e. //if ((e.state & (int)X11.MouseMask.Button1Mask) != 0) m[OpenTK.Input.MouseButton.Left] = pressed;
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.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.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--;
if (e.button == (int)MouseButton.Button1) m[OpenTK.Input.MouseButton.Left] = true;
else if (e.button == (int)MouseButton.Button2) m[OpenTK.Input.MouseButton.Middle] = true;
else if (e.button == (int)MouseButton.Button3) m[OpenTK.Input.MouseButton.Right] = true;
if ((e.state & (int)X11.MouseMask.Button4Mask) != 0) m.Wheel++; 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--;
return true; return true;