113 lines
3.6 KiB
C#
113 lines
3.6 KiB
C#
using System.Collections.Generic;
|
|
using OpenTK.Input;
|
|
|
|
namespace BizHawk.Client.EmuHawk
|
|
{
|
|
public static class OTK_Keyboard
|
|
{
|
|
private static readonly Key[] KeyList = {
|
|
// A-Z
|
|
Key.A, Key.B, Key.C, Key.D, Key.E, Key.F, Key.G, Key.H, Key.I, Key.J, Key.K, Key.L, Key.M, Key.N, Key.O, Key.P, Key.Q, Key.R, Key.S, Key.T, Key.U, Key.V, Key.W, Key.X, Key.Y, Key.Z,
|
|
// 0-9
|
|
Key.Number1, Key.Number2, Key.Number3, Key.Number4, Key.Number5, Key.Number6, Key.Number7, Key.Number8, Key.Number9, Key.Number0,
|
|
// misc. printables (ASCII order)
|
|
Key.Space, Key.Quote, Key.Comma, Key.Minus, Key.Period, Key.Slash, Key.Semicolon, Key.Plus, Key.BracketLeft, Key.BackSlash, Key.BracketRight, Key.Tilde,
|
|
// misc. (alphabetically)
|
|
Key.BackSpace, Key.CapsLock, Key.Delete, Key.Down, Key.End, Key.Enter, Key.Escape, Key.Home, Key.Insert, Key.Left, Key.PageDown, Key.PageUp, Key.Pause, Key.Right, Key.ScrollLock, Key.Tab, Key.Up,
|
|
// modifier
|
|
Key.WinLeft, Key.WinRight, Key.ControlLeft, Key.ControlRight, Key.AltLeft, Key.AltRight, Key.ShiftLeft, Key.ShiftRight,
|
|
|
|
// function
|
|
Key.F1, Key.F2, Key.F3, Key.F4, Key.F5, Key.F6, Key.F7, Key.F8, Key.F9, Key.F10, Key.F11, Key.F12,
|
|
// keypad (alphabetically)
|
|
Key.Keypad0, Key.Keypad1, Key.Keypad2, Key.Keypad3, Key.Keypad4, Key.Keypad5, Key.Keypad6, Key.Keypad7, Key.Keypad8, Key.Keypad9, Key.KeypadAdd, Key.KeypadDecimal, Key.KeypadDivide, Key.KeypadEnter, Key.KeypadMultiply, Key.KeypadSubtract
|
|
};
|
|
|
|
private static readonly List<KeyEvent> EventList = new List<KeyEvent>();
|
|
private static KeyboardState _kbState;
|
|
|
|
public static void Initialize ()
|
|
{
|
|
_kbState = Keyboard.GetState();
|
|
}
|
|
|
|
public static IEnumerable<KeyEvent> Update()
|
|
{
|
|
EventList.Clear();
|
|
var lastState = _kbState;
|
|
try
|
|
{
|
|
_kbState = Keyboard.GetState();
|
|
foreach (var key in KeyList)
|
|
{
|
|
if (lastState.IsKeyUp(key) && _kbState.IsKeyDown(key))
|
|
EventList.Add(new KeyEvent { Key = key, Pressed = true });
|
|
else if (lastState.IsKeyDown(key) && _kbState.IsKeyUp(key))
|
|
EventList.Add(new KeyEvent { Key = key, Pressed = false });
|
|
}
|
|
}
|
|
catch
|
|
{
|
|
// OpenTK's keyboard class isn't thread safe.
|
|
// In rare cases (sometimes it takes up to 10 minutes to occur) it will
|
|
// be updating the keyboard state when we call GetState() and choke.
|
|
// Until I fix OpenTK, it's fine to just swallow it because input continues working.
|
|
if (System.Diagnostics.Debugger.IsAttached)
|
|
{
|
|
System.Console.WriteLine("OpenTK Keyboard thread is angry.");
|
|
}
|
|
}
|
|
return EventList;
|
|
}
|
|
|
|
public static bool IsPressed(Key key)
|
|
{
|
|
return _kbState.IsKeyDown(key);
|
|
}
|
|
|
|
public static bool ShiftModifier => IsPressed(Key.ShiftLeft) || IsPressed(Key.ShiftRight);
|
|
|
|
public static bool CtrlModifier => IsPressed(Key.ControlLeft) || IsPressed(Key.ControlRight);
|
|
|
|
public static bool AltModifier => IsPressed(Key.AltLeft) || IsPressed(Key.AltRight);
|
|
|
|
public static Input.ModifierKey GetModifierKeysAsKeys()
|
|
{
|
|
Input.ModifierKey ret = Input.ModifierKey.None;
|
|
if (ShiftModifier)
|
|
ret |= Input.ModifierKey.Shift;
|
|
if (CtrlModifier)
|
|
ret |= Input.ModifierKey.Control;
|
|
if (AltModifier)
|
|
ret |= Input.ModifierKey.Alt;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
internal static class KeyExtensions
|
|
{
|
|
public static bool IsModifier (this Key key)
|
|
{
|
|
if (key == Key.ShiftLeft)
|
|
return true;
|
|
if (key == Key.ShiftRight)
|
|
return true;
|
|
if (key == Key.ControlLeft)
|
|
return true;
|
|
if (key == Key.ControlRight)
|
|
return true;
|
|
if (key == Key.AltLeft)
|
|
return true;
|
|
if (key == Key.AltRight)
|
|
return true;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public struct KeyEvent
|
|
{
|
|
public Key Key;
|
|
public bool Pressed;
|
|
}
|
|
}
|