diff --git a/Source/Examples/Tests/S02_RawInput_Logger.cs b/Source/Examples/Tests/S02_RawInput_Logger.cs index ff307d84..21220940 100644 --- a/Source/Examples/Tests/S02_RawInput_Logger.cs +++ b/Source/Examples/Tests/S02_RawInput_Logger.cs @@ -60,6 +60,24 @@ namespace Examples.Tests public S02_RawInput_Logger() { this.CreateWindow(new OpenTK.Platform.DisplayMode(100, 100)); + + foreach (OpenTK.Input.Keyboard k in this.Keyboard) + { + k.KeyDown += new OpenTK.Input.KeyDownEvent(LogKeyDown); + k.KeyUp += new OpenTK.Input.KeyUpEvent(LogKeyUp); + } + } + + void LogKeyDown(object sender, OpenTK.Input.Key key) + { + Trace.WriteLine(String.Format("OpenTK key {0} pressed on Keyboard: ({1}).", + key, sender as OpenTK.Input.Keyboard)); + } + + void LogKeyUp(object sender, OpenTK.Input.Key key) + { + Trace.WriteLine(String.Format("OpenTK key {0} released on Keyboard: ({1}).", + key, sender as OpenTK.Input.Keyboard)); } public override void OnLoad(EventArgs e) @@ -75,6 +93,7 @@ namespace Examples.Tests GL.Clear(GL.Enums.ClearBufferMask.COLOR_BUFFER_BIT); Context.SwapBuffers(); + Thread.Sleep(1); } } } diff --git a/Source/OpenTK/Input/IKeyboard.cs b/Source/OpenTK/Input/IKeyboard.cs index b49ab281..9bfae655 100644 --- a/Source/OpenTK/Input/IKeyboard.cs +++ b/Source/OpenTK/Input/IKeyboard.cs @@ -13,5 +13,17 @@ namespace OpenTK.Input int NumberOfFunctionKeys { get; } int NumberOfLeds { get; } long DeviceID { get; } + + event KeyDownEvent KeyDown; + event KeyUpEvent KeyUp; } + + public delegate void KeyDownEvent(object sender, Key key); + public delegate void KeyUpEvent(object sender, Key key); + + //public class KeyEventArgs : System.EventArgs + //{ + // private Key key; + // public Key Key { get { return key; } } + //} } \ No newline at end of file diff --git a/Source/OpenTK/Input/Keyboard.cs b/Source/OpenTK/Input/Keyboard.cs index b9b070c9..102d5560 100644 --- a/Source/OpenTK/Input/Keyboard.cs +++ b/Source/OpenTK/Input/Keyboard.cs @@ -15,7 +15,7 @@ using System.Diagnostics; namespace OpenTK.Input { - public class Keyboard : IKeyboard + public sealed class Keyboard : IKeyboard { //private IKeyboard keyboard; private bool[] keys = new bool[(int)Key.MaxKeys]; @@ -38,8 +38,16 @@ namespace OpenTK.Input get { return keys[(int)k]; } internal set { - Debug.Print("OpenTK key {0} {1}.", k, value ? "pressed" : "released"); keys[(int)k] = value; + + if (value && KeyDown != null) + { + KeyDown(this, k); + } + else if (!value && KeyUp != null) + { + KeyUp(this, k); + } } } @@ -70,6 +78,16 @@ namespace OpenTK.Input internal set { devID = value; } } + /// + /// Occurs when a key is pressed. + /// + public event KeyDownEvent KeyDown; + + /// + /// Occurs when a key is released. + /// + public event KeyUpEvent KeyUp; + #endregion #region --- IInputDevice Members --- @@ -87,6 +105,8 @@ namespace OpenTK.Input #endregion + #region --- Public Methods --- + public override int GetHashCode() { //return base.GetHashCode(); @@ -96,9 +116,11 @@ namespace OpenTK.Input public override string ToString() { //return base.ToString(); - return String.Format("Keyboard: '{0}', {1} keys, {2} function keys, {3} leds. Device ID: {4}", - description, NumberOfKeys, NumberOfFunctionKeys, NumberOfLeds, DeviceID); + return String.Format("ID: {0} (keys: {1}, function keys: {2}, leds: {3}", + DeviceID, NumberOfKeys, NumberOfFunctionKeys, NumberOfLeds); } + + #endregion } #region public enum Key : int diff --git a/Source/OpenTK/Platform/X11/X11Input.cs b/Source/OpenTK/Platform/X11/X11Input.cs index b88a8bdf..036446a8 100644 --- a/Source/OpenTK/Platform/X11/X11Input.cs +++ b/Source/OpenTK/Platform/X11/X11Input.cs @@ -133,6 +133,16 @@ namespace OpenTK.Platform.X11 { keyboardDriver.ProcessKeyboardEvent(e.KeyEvent); } + /* + if (API.Pending(window.Display) > 0) + { + Functions.XPeekEvent(window.Display, ref e); + if (e.type == XEventName.KeyRelease || e.type == XEventName.KeyPress) + { + keyboardDriver.ProcessKeyboardEvent(e.KeyEvent); + } + } + */ } #endregion diff --git a/Source/OpenTK/Platform/X11/X11Keyboard.cs b/Source/OpenTK/Platform/X11/X11Keyboard.cs index dc551bfa..3f062030 100644 --- a/Source/OpenTK/Platform/X11/X11Keyboard.cs +++ b/Source/OpenTK/Platform/X11/X11Keyboard.cs @@ -204,21 +204,20 @@ namespace OpenTK.Platform.X11 switch (keysym.ToInt64()) { default: - if (keymap.ContainsKey((XKey)keysym)) - { - keyboards[0][keymap[(XKey)keysym]] = pressed; - } - else if (keymap.ContainsKey((XKey)keysym2)) - { - keyboards[0][keymap[(XKey)keysym2]] = pressed; - } - else - { - Debug.Print("KeyCode {0} (Keysym: {1}, {2}) not mapped.", e.keycode, (XKey)keysym, (XKey)keysym2); - return false; - } - return true; - + if (keymap.ContainsKey((XKey)keysym)) + { + keyboards[0][keymap[(XKey)keysym]] = pressed; + } + else if (keymap.ContainsKey((XKey)keysym2)) + { + keyboards[0][keymap[(XKey)keysym2]] = pressed; + } + else + { + Debug.Print("KeyCode {0} (Keysym: {1}, {2}) not mapped.", e.keycode, (XKey)keysym, (XKey)keysym2); + return false; + } + return true; } }