diff --git a/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs b/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs index a70c51b..18e924a 100644 --- a/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs +++ b/ShiftOS.Frontend/GraphicsSubsystem/UIManager.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; +using MonoGame.Extended.Input.InputListeners; using ShiftOS.Engine; using ShiftOS.Frontend.Desktop; using ShiftOS.Frontend.GUI; @@ -279,15 +280,18 @@ namespace ShiftOS.Frontend.GraphicsSubsystem public class KeyEvent { - public KeyEvent(bool control, bool alt, bool shift, Keys key) + + public KeyEvent(KeyboardEventArgs e) { - ControlDown = control; - AltDown = alt; - ShiftDown = shift; - Key = key; - KeyChar = key.ToCharacter(shift); + ControlDown = false; + ShiftDown = e.Modifiers.HasFlag(KeyboardModifiers.Shift); + ControlDown = e.Modifiers.HasFlag(KeyboardModifiers.Control); + AltDown = e.Modifiers.HasFlag(KeyboardModifiers.Alt); + Key = e.Key; + KeyChar = e.Character ?? '\0' ; } + public bool ControlDown { get; private set; } public bool AltDown { get; private set; } public bool ShiftDown { get; set; } @@ -295,142 +299,4 @@ namespace ShiftOS.Frontend.GraphicsSubsystem public char KeyChar { get; private set; } } - - public static class KeysExtensions - { - /* - * Notice: The following keymapping does not take into account the user's keyboard - * layout. This is written under the assumption the keyboard is en_US. - * - * @MichaelTheShifter I'm leaving you to figure out how to make this work with other layouts. - * - * My suggestion would be to simply do what you are doing with strings, define a JSON file - * mapping each character to its associated character. - */ - - private static Dictionary keymapDefault = new Dictionary() { - { Keys.Space, ' ' }, - { Keys.Tab, '\t' }, - { Keys.Enter, '\n' }, - { Keys.Back, '\b' }, - { Keys.A, 'a'}, - { Keys.B, 'b'}, - { Keys.C, 'c' }, - { Keys.D, 'd' }, - { Keys.E, 'e' }, - { Keys.F, 'f' }, - { Keys.G, 'g' }, - { Keys.H, 'h' }, - { Keys.I, 'i' }, - { Keys.J, 'j' }, - { Keys.K, 'k' }, - { Keys.L, 'l' }, - { Keys.M, 'm' }, - { Keys.N, 'n' }, - { Keys.O, 'o' }, - { Keys.P, 'p' }, - { Keys.Q, 'q' }, - { Keys.R, 'r' }, - { Keys.S, 's' }, - { Keys.T, 't' }, - { Keys.U, 'u' }, - { Keys.V, 'v' }, - { Keys.W, 'w' }, - { Keys.X, 'x' }, - { Keys.Y, 'y' }, - { Keys.Z, 'z' }, - { Keys.D0, '0' }, - { Keys.D1, '1' }, - { Keys.D2, '2' }, - { Keys.D3, '3' }, - { Keys.D4, '4' }, - { Keys.D5, '5' }, - { Keys.D6, '6' }, - { Keys.D7, '7' }, - { Keys.D8, '8' }, - { Keys.D9, '9' }, - { Keys.OemTilde, '`' }, - { Keys.OemMinus, '-' }, - { Keys.OemPlus, '+' }, - { Keys.OemOpenBrackets, '[' }, - { Keys.OemCloseBrackets, ']'}, - { Keys.OemBackslash, '\\'}, - { Keys.OemPipe, '\\' }, - { Keys.OemSemicolon, ';' }, - { Keys.OemQuotes, '\'' }, - { Keys.OemComma, ',' }, - { Keys.OemPeriod, '.' }, - { Keys.OemQuestion, '/' }, - }; - - private static Dictionary keymapShift = new Dictionary () { - { Keys.Space, ' ' }, - { Keys.Tab, '\t' }, - { Keys.Enter, '\n' }, - { Keys.Back, '\b' }, - { Keys.A, 'A'}, - { Keys.B, 'B'}, - { Keys.C, 'C' }, - { Keys.D, 'D' }, - { Keys.E, 'E' }, - { Keys.F, 'F' }, - { Keys.G, 'G' }, - { Keys.H, 'H' }, - { Keys.I, 'I' }, - { Keys.J, 'J' }, - { Keys.K, 'K' }, - { Keys.L, 'L' }, - { Keys.M, 'M' }, - { Keys.N, 'N' }, - { Keys.O, 'O' }, - { Keys.P, 'P' }, - { Keys.Q, 'Q' }, - { Keys.R, 'R' }, - { Keys.S, 'S' }, - { Keys.T, 'T' }, - { Keys.U, 'U' }, - { Keys.V, 'V' }, - { Keys.W, 'W' }, - { Keys.X, 'X' }, - { Keys.Y, 'Y' }, - { Keys.Z, 'Z' }, - { Keys.D0, ')' }, - { Keys.D1, '!' }, - { Keys.D2, '@' }, - { Keys.D3, '#' }, - { Keys.D4, '$' }, - { Keys.D5, '%' }, - { Keys.D6, '^' }, - { Keys.D7, '&' }, - { Keys.D8, '*' }, - { Keys.D9, '(' }, - { Keys.OemTilde, '~' }, - { Keys.OemMinus, '_' }, - { Keys.OemPlus, '+' }, - { Keys.OemOpenBrackets, '{' }, - { Keys.OemCloseBrackets, '}'}, - { Keys.OemBackslash, '|'}, - { Keys.OemPipe, '|' }, - { Keys.OemSemicolon, ':' }, - { Keys.OemQuotes, '\'' }, - { Keys.OemComma, '<' }, - { Keys.OemPeriod, '>' }, - { Keys.OemQuestion, '?' }, - }; - - public static char ToCharacter(this Keys key, bool shift) - { - if (shift && keymapShift.ContainsKey(key)) - { - return keymapShift[key]; - } - - if (!shift && keymapDefault.ContainsKey(key)) - { - return keymapDefault[key]; - } - - return '\0'; // Ideally all keys should be included in this map - } - } } diff --git a/ShiftOS.Frontend/ShiftOS.Frontend.csproj b/ShiftOS.Frontend/ShiftOS.Frontend.csproj index cfc1132..212f103 100644 --- a/ShiftOS.Frontend/ShiftOS.Frontend.csproj +++ b/ShiftOS.Frontend/ShiftOS.Frontend.csproj @@ -86,6 +86,14 @@ + + ..\packages\MonoGame.Extended.0.6.568\lib\portable-net45+win8+wpa81\MonoGame.Extended.dll + True + + + ..\packages\MonoGame.Extended.Input.0.6.568\lib\portable-net45+win8+wpa81\MonoGame.Extended.Input.dll + True + $(MonoGameInstallDirectory)\MonoGame\v3.0\Assemblies\DesktopGL\MonoGame.Framework.dll diff --git a/ShiftOS.Frontend/ShiftOS.cs b/ShiftOS.Frontend/ShiftOS.cs index 5c897d3..cda7558 100644 --- a/ShiftOS.Frontend/ShiftOS.cs +++ b/ShiftOS.Frontend/ShiftOS.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; +using MonoGame.Extended.Input.InputListeners; using Newtonsoft.Json; using ShiftOS.Engine; using ShiftOS.Frontend.GraphicsSubsystem; @@ -30,6 +31,8 @@ namespace ShiftOS.Frontend private bool DisplayDebugInfo = false; + private KeyboardListener keyboardListener = new KeyboardListener (); + public ShiftOS() { Story.FailureRequested += (message) => @@ -68,11 +71,36 @@ namespace ShiftOS.Frontend //Fullscreen graphicsDevice.IsFullScreen = uconf.Fullscreen; + + // keyboard events + keyboardListener.KeyPressed += KeyboardListener_KeyPressed; + UIManager.Init(this); } - private Keys lastKey = Keys.None; + private void KeyboardListener_KeyPressed(object sender, KeyboardEventArgs e) + { + if (e.Key == Keys.F11) + { + UIManager.Fullscreen = !UIManager.Fullscreen; + } + else if (e.Modifiers.HasFlag(KeyboardModifiers.Control) && e.Key == Keys.D) + { + DisplayDebugInfo = !DisplayDebugInfo; + } + else if (e.Modifiers.HasFlag(KeyboardModifiers.Control) && e.Key == Keys.E) + { + UIManager.ExperimentalEffects = !UIManager.ExperimentalEffects; + } + else + { + // Notice: I would personally recommend just using KeyboardEventArgs instead of KeyEvent + // from now on, but what ever. -phath0m + UIManager.ProcessKeyEvent(new KeyEvent(e)); + } + } + /// /// Allows the game to perform any initialization it needs to before starting to run. @@ -160,8 +188,7 @@ namespace ShiftOS.Frontend MouseTexture = null; // TODO: Unload any non ContentManager content here } - - private double kb_elapsedms = 0; + private double mouseMS = 0; private MouseState LastMouseState; @@ -244,55 +271,8 @@ namespace ShiftOS.Frontend //Let's see how keyboard input works. - //Hmmm... just like the mouse... - var keystate = Keyboard.GetState(); + keyboardListener.Update(gameTime); - //Simple... just iterate through this list and generate some key events? - var keys = keystate.GetPressedKeys(); - if (keys.Length > 0) - { - var key = keys.FirstOrDefault(x => x != Keys.LeftControl && x != Keys.RightControl && x != Keys.LeftShift && x != Keys.RightShift && x != Keys.LeftAlt && x != Keys.RightAlt); - if (lastKey != key) - { - kb_elapsedms = 0; - lastKey = key; - } - } - if (keystate.IsKeyDown(lastKey)) - { - if (kb_elapsedms == 0 || kb_elapsedms >= 500) - { - if (lastKey == Keys.F11) - { - UIManager.Fullscreen = !UIManager.Fullscreen; - } - else - { - var shift = keystate.IsKeyDown(Keys.LeftShift) || keystate.IsKeyDown(Keys.RightShift); - var alt = keystate.IsKeyDown(Keys.LeftAlt) || keystate.IsKeyDown(Keys.RightAlt); - var control = keystate.IsKeyDown(Keys.LeftControl) || keystate.IsKeyDown(Keys.RightControl); - - if (control && lastKey == Keys.D) - { - DisplayDebugInfo = !DisplayDebugInfo; - } - else if (control && lastKey == Keys.E) - { - UIManager.ExperimentalEffects = !UIManager.ExperimentalEffects; - } - else - { - var e = new KeyEvent(control, alt, shift, lastKey); - UIManager.ProcessKeyEvent(e); - } - } - } - kb_elapsedms += gameTime.ElapsedGameTime.TotalMilliseconds; - } - else - { - kb_elapsedms = 0; - } //Cause layout update on all elements UIManager.LayoutUpdate(gameTime); diff --git a/ShiftOS.Frontend/packages.config b/ShiftOS.Frontend/packages.config index 223a8d3..5a72aa7 100644 --- a/ShiftOS.Frontend/packages.config +++ b/ShiftOS.Frontend/packages.config @@ -1,5 +1,7 @@  + + \ No newline at end of file