1
0
Fork 0
mirror of https://github.com/Ryujinx/Opentk.git synced 2025-03-27 08:05:19 +00:00

[Win] Replaced KeyMap dictionary with switch

This reduces the amount of allocations on the startup path.
This commit is contained in:
thefiddler 2014-04-25 14:13:55 +02:00
parent e36a0d0fbc
commit 58e41a2b97
3 changed files with 124 additions and 147 deletions
Source/OpenTK/Platform/Windows

View file

@ -51,7 +51,6 @@ namespace OpenTK.Platform.Windows
const ExtendedWindowStyle ParentStyleEx = ExtendedWindowStyle.WindowEdge | ExtendedWindowStyle.ApplicationWindow;
const ExtendedWindowStyle ChildStyleEx = 0;
static readonly WinKeyMap KeyMap = new WinKeyMap();
readonly IntPtr Instance = Marshal.GetHINSTANCE(typeof(WinGLNative).Module);
readonly IntPtr ClassName = Marshal.StringToHGlobalAuto(Guid.NewGuid().ToString());
readonly WindowProcedure WindowProcedureDelegate;
@ -578,7 +577,7 @@ namespace OpenTK.Platform.Windows
short scancode = (short)((lParam.ToInt64() >> 16) & 0xFF);
VirtualKeys vkey = (VirtualKeys)wParam;
bool is_valid;
Key key = KeyMap.TranslateKey(scancode, vkey, extended, false, out is_valid);
Key key = WinKeyMap.TranslateKey(scancode, vkey, extended, false, out is_valid);
if (is_valid)
{

View file

@ -32,163 +32,142 @@ using OpenTK.Input;
namespace OpenTK.Platform.Windows
{
class WinKeyMap
static class WinKeyMap
{
readonly Dictionary<int, Key> ScanMap = new Dictionary<int, Key>();
public WinKeyMap()
public static Key GetKey(int code)
{
// 0 - 15
Append(Key.Unknown);
Append(Key.Escape);
switch (code)
{
// 0 - 15
case 0: return Key.Unknown;
case 1: return Key.Escape;
case 2: return Key.Number1;
case 3: return Key.Number2;
case 4: return Key.Number3;
case 5: return Key.Number4;
case 6: return Key.Number5;
case 7: return Key.Number6;
case 8: return Key.Number7;
case 9: return Key.Number8;
case 10: return Key.Number9;
case 11: return Key.Number0;
case 12: return Key.Minus;
case 13: return Key.Plus;
case 14: return Key.BackSpace;
case 15: return Key.Tab;
for (int i = 0; i < 9; i++)
Append(Key.Number1 + i);
Append(Key.Number0);
// 16-31
case 16: return Key.Q;
case 17: return Key.W;
case 18: return Key.E;
case 19: return Key.R;
case 20: return Key.T;
case 21: return Key.Y;
case 22: return Key.U;
case 23: return Key.I;
case 24: return Key.O;
case 25: return Key.P;
case 26: return Key.BracketLeft;
case 27: return Key.BracketRight;
case 28: return Key.Enter;
case 29: return Key.ControlLeft;
case 30: return Key.A;
case 31: return Key.S;
Append(Key.Minus);
Append(Key.Plus);
Append(Key.BackSpace);
Append(Key.Tab);
// 32 - 47
case 32: return Key.D;
case 33: return Key.F;
case 34: return Key.G;
case 35: return Key.H;
case 36: return Key.J;
case 37: return Key.K;
case 38: return Key.L;
case 39: return Key.Semicolon;
case 40: return Key.Quote;
case 41: return Key.Grave;
case 42: return Key.ShiftLeft;
case 43: return Key.BackSlash;
case 44: return Key.Z;
case 45: return Key.X;
case 46: return Key.C;
case 47: return Key.V;
// 16-31
Append(Key.Q);
Append(Key.W);
Append(Key.E);
Append(Key.R);
Append(Key.T);
Append(Key.Y);
Append(Key.U);
Append(Key.I);
Append(Key.O);
Append(Key.P);
Append(Key.BracketLeft);
Append(Key.BracketRight);
Append(Key.Enter);
Append(Key.ControlLeft);
Append(Key.A);
Append(Key.S);
// 48 - 63
case 48: return Key.B;
case 49: return Key.N;
case 50: return Key.M;
case 51: return Key.Comma;
case 52: return Key.Period;
case 53: return Key.Slash;
case 54: return Key.ShiftRight;
case 55: return Key.PrintScreen;
case 56: return Key.AltLeft;
case 57: return Key.Space;
case 58: return Key.CapsLock;
case 59: return Key.F1;
case 60: return Key.F2;
case 61: return Key.F3;
case 62: return Key.F4;
case 63: return Key.F5;
// 32 - 47
Append(Key.D);
Append(Key.F);
Append(Key.G);
Append(Key.H);
Append(Key.J);
Append(Key.K);
Append(Key.L);
Append(Key.Semicolon);
Append(Key.Quote);
Append(Key.Grave);
Append(Key.ShiftLeft);
Append(Key.BackSlash);
Append(Key.Z);
Append(Key.X);
Append(Key.C);
Append(Key.V);
// 64 - 79
case 64: return Key.F6;
case 65: return Key.F7;
case 66: return Key.F8;
case 67: return Key.F9;
case 68: return Key.F10;
case 69: return Key.NumLock;
case 70: return Key.ScrollLock;
case 71: return Key.Home;
case 72: return Key.Up;
case 73: return Key.PageUp;
case 74: return Key.KeypadMinus;
case 75: return Key.Left;
case 76: return Key.Keypad5;
case 77: return Key.Right;
case 78: return Key.KeypadPlus;
case 79: return Key.End;
// 48 - 63
Append(Key.B);
Append(Key.N);
Append(Key.M);
Append(Key.Comma);
Append(Key.Period);
Append(Key.Slash);
Append(Key.ShiftRight);
Append(Key.PrintScreen);
Append(Key.AltLeft);
Append(Key.Space);
Append(Key.CapsLock);
Append(Key.F1);
Append(Key.F2);
Append(Key.F3);
Append(Key.F4);
Append(Key.F5);
// 80 - 95
case 80: return Key.Down;
case 81: return Key.PageDown;
case 82: return Key.Insert;
case 83: return Key.Delete;
case 84: return Key.Unknown;
case 85: return Key.Unknown;
case 86: return Key.NonUSBackSlash;
case 87: return Key.F11;
case 88: return Key.F12;
case 89: return Key.Pause;
case 90: return Key.Unknown;
case 91: return Key.WinLeft;
case 92: return Key.WinRight;
case 93: return Key.Menu;
case 94: return Key.Unknown;
case 95: return Key.Unknown;
// 64 - 79
Append(Key.F6);
Append(Key.F7);
Append(Key.F8);
Append(Key.F9);
Append(Key.F10);
Append(Key.NumLock);
Append(Key.ScrollLock);
Append(Key.Home);
Append(Key.Up);
Append(Key.PageUp);
Append(Key.KeypadMinus);
Append(Key.Left);
Append(Key.Keypad5);
Append(Key.Right);
Append(Key.KeypadPlus);
Append(Key.End);
// 96 - 106
case 96: return Key.Unknown;
case 97: return Key.Unknown;
case 98: return Key.Unknown;
case 99: return Key.Unknown;
case 100: return Key.F13;
case 101: return Key.F14;
case 102: return Key.F15;
case 103: return Key.F16;
case 104: return Key.F17;
case 105: return Key.F18;
case 106: return Key.F19;
// 80 - 95
Append(Key.Down);
Append(Key.PageDown);
Append(Key.Insert);
Append(Key.Delete);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.NonUSBackSlash);
Append(Key.F11);
Append(Key.F12);
Append(Key.Pause);
Append(Key.Unknown);
Append(Key.WinLeft);
Append(Key.WinRight);
Append(Key.Menu);
Append(Key.Unknown);
Append(Key.Unknown);
// 96 - 111
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.F13);
Append(Key.F14);
Append(Key.F15);
Append(Key.F16);
Append(Key.F17);
Append(Key.F18);
Append(Key.F19);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
// 112 - 127
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
Append(Key.Unknown);
default: return Key.Unknown;
}
}
void Append(Key key)
{
ScanMap.Add(ScanMap.Count, key);
}
public Key TranslateKey(short scancode, VirtualKeys vkey, bool extended0, bool extended1, out bool is_valid)
public static Key TranslateKey(short scancode, VirtualKeys vkey, bool extended0, bool extended1, out bool is_valid)
{
is_valid = true;
Key key;
ScanMap.TryGetValue(scancode, out key);
Key key = GetKey(scancode);
if (!extended0)
{

View file

@ -38,7 +38,6 @@ namespace OpenTK.Platform.Windows
{
sealed class WinRawKeyboard : IKeyboardDriver2
{
static readonly WinKeyMap KeyMap = new WinKeyMap();
readonly List<KeyboardState> keyboards = new List<KeyboardState>();
readonly List<string> names = new List<string>();
readonly Dictionary<ContextHandle, int> rawids = new Dictionary<ContextHandle, int>();
@ -185,7 +184,7 @@ namespace OpenTK.Platform.Windows
int keyboard_handle = rawids.ContainsKey(handle) ? rawids[handle] : 0;
keyboard = keyboards[keyboard_handle];
Key key = KeyMap.TranslateKey(scancode, vkey, extended0, extended1, out is_valid);
Key key = WinKeyMap.TranslateKey(scancode, vkey, extended0, extended1, out is_valid);
if (is_valid)
{