Moved keyboard and mouse code inside X11Input.cs
This commit is contained in:
parent
e5b5af7b11
commit
effc907171
5 changed files with 241 additions and 124 deletions
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
140
Source/OpenTK/Platform/X11/X11KeyMap.cs
Normal file
140
Source/OpenTK/Platform/X11/X11KeyMap.cs
Normal 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()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue