[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

View file

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

View file

@ -32,163 +32,142 @@ using OpenTK.Input;
namespace OpenTK.Platform.Windows namespace OpenTK.Platform.Windows
{ {
class WinKeyMap static class WinKeyMap
{ {
readonly Dictionary<int, Key> ScanMap = new Dictionary<int, Key>(); public static Key GetKey(int code)
public WinKeyMap()
{ {
// 0 - 15 switch (code)
Append(Key.Unknown); {
Append(Key.Escape); // 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++) // 16-31
Append(Key.Number1 + i); case 16: return Key.Q;
Append(Key.Number0); 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); // 32 - 47
Append(Key.Plus); case 32: return Key.D;
Append(Key.BackSpace); case 33: return Key.F;
Append(Key.Tab); 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 // 48 - 63
Append(Key.Q); case 48: return Key.B;
Append(Key.W); case 49: return Key.N;
Append(Key.E); case 50: return Key.M;
Append(Key.R); case 51: return Key.Comma;
Append(Key.T); case 52: return Key.Period;
Append(Key.Y); case 53: return Key.Slash;
Append(Key.U); case 54: return Key.ShiftRight;
Append(Key.I); case 55: return Key.PrintScreen;
Append(Key.O); case 56: return Key.AltLeft;
Append(Key.P); case 57: return Key.Space;
Append(Key.BracketLeft); case 58: return Key.CapsLock;
Append(Key.BracketRight); case 59: return Key.F1;
Append(Key.Enter); case 60: return Key.F2;
Append(Key.ControlLeft); case 61: return Key.F3;
Append(Key.A); case 62: return Key.F4;
Append(Key.S); case 63: return Key.F5;
// 32 - 47 // 64 - 79
Append(Key.D); case 64: return Key.F6;
Append(Key.F); case 65: return Key.F7;
Append(Key.G); case 66: return Key.F8;
Append(Key.H); case 67: return Key.F9;
Append(Key.J); case 68: return Key.F10;
Append(Key.K); case 69: return Key.NumLock;
Append(Key.L); case 70: return Key.ScrollLock;
Append(Key.Semicolon); case 71: return Key.Home;
Append(Key.Quote); case 72: return Key.Up;
Append(Key.Grave); case 73: return Key.PageUp;
Append(Key.ShiftLeft); case 74: return Key.KeypadMinus;
Append(Key.BackSlash); case 75: return Key.Left;
Append(Key.Z); case 76: return Key.Keypad5;
Append(Key.X); case 77: return Key.Right;
Append(Key.C); case 78: return Key.KeypadPlus;
Append(Key.V); case 79: return Key.End;
// 48 - 63 // 80 - 95
Append(Key.B); case 80: return Key.Down;
Append(Key.N); case 81: return Key.PageDown;
Append(Key.M); case 82: return Key.Insert;
Append(Key.Comma); case 83: return Key.Delete;
Append(Key.Period); case 84: return Key.Unknown;
Append(Key.Slash); case 85: return Key.Unknown;
Append(Key.ShiftRight); case 86: return Key.NonUSBackSlash;
Append(Key.PrintScreen); case 87: return Key.F11;
Append(Key.AltLeft); case 88: return Key.F12;
Append(Key.Space); case 89: return Key.Pause;
Append(Key.CapsLock); case 90: return Key.Unknown;
Append(Key.F1); case 91: return Key.WinLeft;
Append(Key.F2); case 92: return Key.WinRight;
Append(Key.F3); case 93: return Key.Menu;
Append(Key.F4); case 94: return Key.Unknown;
Append(Key.F5); case 95: return Key.Unknown;
// 64 - 79 // 96 - 106
Append(Key.F6); case 96: return Key.Unknown;
Append(Key.F7); case 97: return Key.Unknown;
Append(Key.F8); case 98: return Key.Unknown;
Append(Key.F9); case 99: return Key.Unknown;
Append(Key.F10); case 100: return Key.F13;
Append(Key.NumLock); case 101: return Key.F14;
Append(Key.ScrollLock); case 102: return Key.F15;
Append(Key.Home); case 103: return Key.F16;
Append(Key.Up); case 104: return Key.F17;
Append(Key.PageUp); case 105: return Key.F18;
Append(Key.KeypadMinus); case 106: return Key.F19;
Append(Key.Left);
Append(Key.Keypad5);
Append(Key.Right);
Append(Key.KeypadPlus);
Append(Key.End);
// 80 - 95 default: return Key.Unknown;
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);
} }
void Append(Key key) public static Key TranslateKey(short scancode, VirtualKeys vkey, bool extended0, bool extended1, out bool is_valid)
{
ScanMap.Add(ScanMap.Count, key);
}
public Key TranslateKey(short scancode, VirtualKeys vkey, bool extended0, bool extended1, out bool is_valid)
{ {
is_valid = true; is_valid = true;
Key key; Key key = GetKey(scancode);
ScanMap.TryGetValue(scancode, out key);
if (!extended0) if (!extended0)
{ {

View file

@ -38,7 +38,6 @@ namespace OpenTK.Platform.Windows
{ {
sealed class WinRawKeyboard : IKeyboardDriver2 sealed class WinRawKeyboard : IKeyboardDriver2
{ {
static readonly WinKeyMap KeyMap = new WinKeyMap();
readonly List<KeyboardState> keyboards = new List<KeyboardState>(); readonly List<KeyboardState> keyboards = new List<KeyboardState>();
readonly List<string> names = new List<string>(); readonly List<string> names = new List<string>();
readonly Dictionary<ContextHandle, int> rawids = new Dictionary<ContextHandle, int>(); 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; int keyboard_handle = rawids.ContainsKey(handle) ? rawids[handle] : 0;
keyboard = keyboards[keyboard_handle]; 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) if (is_valid)
{ {