diff --git a/Source/OpenTK/Platform/X11/X11GLNative.cs b/Source/OpenTK/Platform/X11/X11GLNative.cs index c81be85a..dbe4944c 100644 --- a/Source/OpenTK/Platform/X11/X11GLNative.cs +++ b/Source/OpenTK/Platform/X11/X11GLNative.cs @@ -429,7 +429,7 @@ namespace OpenTK.Platform.X11 (uint)SetWindowValuemask.BackPixel | (uint)SetWindowValuemask.BorderPixel; 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); if (window.Handle == IntPtr.Zero) @@ -439,8 +439,8 @@ namespace OpenTK.Platform.X11 XSizeHints hints = new XSizeHints(); hints.x = 0; hints.y = 0; - hints.width = mode.Width; - hints.height = mode.Height; + hints.width = width; + hints.height = height; hints.flags = (IntPtr)(XSizeHintsFlags.USSize | XSizeHintsFlags.USPosition); Functions.XSetWMNormalHints(window.Display, window.Handle, ref hints); @@ -493,7 +493,7 @@ namespace OpenTK.Platform.X11 /// 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 diff --git a/Source/OpenTK/Platform/X11/X11Input.cs b/Source/OpenTK/Platform/X11/X11Input.cs index b63b40a7..20fb6864 100644 --- a/Source/OpenTK/Platform/X11/X11Input.cs +++ b/Source/OpenTK/Platform/X11/X11Input.cs @@ -7,10 +7,10 @@ using System; using System.Collections.Generic; using System.Text; +using System.Diagnostics; +using System.Runtime.InteropServices; using OpenTK.Input; -using System.Diagnostics; -using System.Threading; namespace OpenTK.Platform.X11 { @@ -20,13 +20,16 @@ namespace OpenTK.Platform.X11 /// internal sealed class X11Input : IInputDriver { - X11Keyboard keyboardDriver; - X11Mouse mouseDriver; X11.WindowInfo window; + KeyboardDevice keyboard = new KeyboardDevice(); + MouseDevice mouse = new MouseDevice(); + List dummy_keyboard_list = new List(1); + List dummy_mice_list = new List(1); - //XEvent e = new XEvent(); - - Thread pollingThread = null; + X11KeyMap keymap = new X11KeyMap(); + 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; @@ -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."); 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(); - wnd_attr.background_pixel = IntPtr.Zero; - wnd_attr.border_pixel = IntPtr.Zero; - //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; + // Init keyboard + API.DisplayKeycodes(window.Display, ref firstKeyCode, ref lastKeyCode); + Debug.Print("First keycode: {0}, last {1}", firstKeyCode, lastKeyCode); - window.Handle = Functions.XCreateWindow(window.Display, window.Parent.Handle, - 0, 0, 30, 30, 0, Constants.CopyFromParent, Constants.InputOutput, - IntPtr.Zero, (UIntPtr)cw, ref wnd_attr); - - if (window.Handle == IntPtr.Zero) - throw new ApplicationException("Could not create hidden input window."); + 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); - Functions.XMapWindow(window.Display, window.Handle); - */ - //window = attach; - keyboardDriver = new X11Keyboard(window); - mouseDriver = new X11Mouse(window); + 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(); + 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(); } @@ -148,19 +142,38 @@ namespace OpenTK.Platform.X11 { case XEventName.KeyPress: case XEventName.KeyRelease: - //Debug.Print("Keyboard press"); - keyboardDriver.ProcessKeyboardEvent(ref e.KeyEvent); + bool pressed = e.type == XEventName.KeyPress; + + 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; - // See MouseDriver.Poll() instead. + 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: - //Debug.Print("Button"); - mouseDriver.ProcessButton(ref e.ButtonEvent); + if (e.ButtonEvent.button == (int)MouseButton.Button1) mouse[OpenTK.Input.MouseButton.Left] = false; + 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; case XEventName.MotionNotify: - //Debug.Print("Mouse move"); - mouseDriver.ProcessMotion(ref e.MotionEvent); + mouse.X = e.MotionEvent.x; + mouse.Y = e.MotionEvent.y; break; } } @@ -182,7 +195,7 @@ namespace OpenTK.Platform.X11 public IList Keyboard { - get { return keyboardDriver.Keyboard; } + get { return dummy_keyboard_list; }//return keyboardDriver.Keyboard; } #endregion @@ -191,7 +204,7 @@ namespace OpenTK.Platform.X11 public IList Mouse { - get { return mouseDriver.Mouse; } + get { return (IList)dummy_mice_list; } //return mouseDriver.Mouse; } #endregion @@ -214,30 +227,30 @@ namespace OpenTK.Platform.X11 public void Dispose() { - this.Dispose(true); - GC.SuppressFinalize(this); + //this.Dispose(true); + //GC.SuppressFinalize(this); } - private void Dispose(bool manual) - { - if (!disposed) - { - //disposing = true; - if (pollingThread != null && pollingThread.IsAlive) - pollingThread.Abort(); + //private void Dispose(bool manual) + //{ + // if (!disposed) + // { + // //disposing = true; + // if (pollingThread != null && pollingThread.IsAlive) + // pollingThread.Abort(); - if (manual) - { - } + // if (manual) + // { + // } - disposed = true; - } - } + // disposed = true; + // } + //} - ~X11Input() - { - this.Dispose(false); - } + //~X11Input() + //{ + // this.Dispose(false); + //} #endregion } diff --git a/Source/OpenTK/Platform/X11/X11KeyMap.cs b/Source/OpenTK/Platform/X11/X11KeyMap.cs new file mode 100644 index 00000000..945ea7e6 --- /dev/null +++ b/Source/OpenTK/Platform/X11/X11KeyMap.cs @@ -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 + { + 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())); + } + } + } +} diff --git a/Source/OpenTK/Platform/X11/X11Keyboard.cs b/Source/OpenTK/Platform/X11/X11Keyboard.cs index faf13c14..9f3bf83f 100644 --- a/Source/OpenTK/Platform/X11/X11Keyboard.cs +++ b/Source/OpenTK/Platform/X11/X11Keyboard.cs @@ -16,6 +16,8 @@ using System.Diagnostics; namespace OpenTK.Platform.X11 { + // THIS CLASS IS NOT USED ANYMORE. + /// /// Drives Keyboard devices on X11. /// 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()); - 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); - //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()); + //keyboards.Add(kb); + //Debug.Print("Keyboard added: {0}", kb.ToString()); } #endregion @@ -205,38 +191,9 @@ namespace OpenTK.Platform.X11 /// True if the event was processed, false otherwise. internal bool ProcessKeyboardEvent(ref X11.XKeyEvent e) { + return false; //int keysym = 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 diff --git a/Source/OpenTK/Platform/X11/X11Mouse.cs b/Source/OpenTK/Platform/X11/X11Mouse.cs index a2581f6c..5ebb2137 100644 --- a/Source/OpenTK/Platform/X11/X11Mouse.cs +++ b/Source/OpenTK/Platform/X11/X11Mouse.cs @@ -11,6 +11,8 @@ using OpenTK.Input; namespace OpenTK.Platform.X11 { + // THIS CLASS IS NOT USED ANYMORE. + /// /// Drives Mouse devices on X11. /// 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) { MouseDevice m = mice[0]; - 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.Button2Mask) != 0) m[OpenTK.Input.MouseButton.Middle] = pressed; - if ((e.state & (int)X11.MouseMask.Button3Mask) != 0) m[OpenTK.Input.MouseButton.Right] = pressed; + //bool pressed = e.type == XEventName.ButtonPress; + //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--; + + 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.Button5Mask) != 0) m.Wheel--; return true;