using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Input; namespace EventInput { public readonly record struct CharacterEventArgs(char Character, long Param) { public long RepeatCount => Param & 0xffff; public bool ExtendedKey => (Param & (1 << 24)) > 0; public bool AltPressed => (Param & (1 << 29)) > 0; public bool PreviousState => (Param & (1 << 30)) > 0; public bool TransitionState => (Param & (1 << 31)) > 0; } public readonly record struct KeyEventArgs(Keys KeyCode, char Character); public delegate void CharEnteredHandler(object sender, CharacterEventArgs e); public delegate void KeyEventHandler(object sender, KeyEventArgs e); public delegate void EditingTextHandler(object sender, TextEditingEventArgs e); public static class EventInput { /// /// Event raised when a Character has been entered. /// public static event CharEnteredHandler CharEntered; /// /// Event raised when a key has been pressed down. May fire multiple times due to keyboard repeat. /// public static event KeyEventHandler KeyDown; /// /// Event raised when a key has been released. /// public static event KeyEventHandler KeyUp; /// /// Raised when the user is editing text and IME is in progress. /// public static event EditingTextHandler EditingText; static bool initialized; /// /// Initialize the TextInput with the given GameWindow. /// /// The XNA window to which text input should be linked. public static void Initialize(GameWindow window) { if (initialized) { return; } window.TextInput += ReceiveInput; window.KeyDown += ReceiveKeyDown; window.TextEditing += ReceiveTextEditing; initialized = true; } private static void ReceiveInput(object sender, TextInputEventArgs e) { OnCharEntered(e.Character); } private static void ReceiveKeyDown(object sender, TextInputEventArgs e) { KeyDown?.Invoke(sender, new KeyEventArgs(e.Key, e.Character)); } private static void ReceiveTextEditing(object sender, TextEditingEventArgs e) { EditingText?.Invoke(sender, e); } public static void OnCharEntered(char character) { CharEntered?.Invoke(null, new CharacterEventArgs(character, 0)); } } }