#region --- License --- /* Copyright (c) 2007 Stefanos Apostolopoulos * See license.txt for license info */ #endregion using System; namespace OpenTK.Input { /// Represents a keyboard device and provides methods to query its status. public sealed class KeyboardDevice { private bool[] keys = new bool[(int)Key.LastKey]; private bool repeat; private KeyboardKeyEventArgs args = new KeyboardKeyEventArgs(); internal KeyboardDevice() { } /// Gets a value indicating the status of the specified Key. /// The Key to check. /// True if the Key is pressed, false otherwise. public bool this[Key key] { get { return keys[(int)key]; } internal set { if (keys[(int)key] != value || KeyRepeat) { keys[(int)key] = value; if (value && KeyDown != null) { args.Key = key; KeyDown(this, args); } else if (!value && KeyUp != null) { args.Key = key; KeyUp(this, args); } } } } /// Gets or sets a System.Boolean indicating key repeat status. /// If KeyRepeat is true, multiple KeyDown events will be generated while a key is being held. /// Otherwise only one KeyDown event will be reported. /// The rate of the generated KeyDown events is controlled by the Operating System. Usually, /// one KeyDown event will be reported, followed by a small (250-1000ms) pause and several /// more KeyDown events (6-30 events per second). /// Set to true to handle text input (where keyboard repeat is desirable), but set to false /// for game input. public bool KeyRepeat { get { return repeat; } set { repeat = value; } } /// Occurs when a key is pressed. public event EventHandler KeyDown; /// Occurs when a key is released. public event EventHandler KeyUp; internal void ClearKeys() { for (int i = 0; i < keys.Length; i++) if (this[(Key)i]) // Make sure KeyUp events are *not* raised for keys that are up, even if key repeat is on. this[(Key)i] = false; } } public class KeyboardKeyEventArgs : EventArgs { /// Gets the that generated this event. public Key Key; } }