src/video/winrt/SDL_winrtkeyboard.cpp
author David Ludwig
Mon, 26 Aug 2013 17:17:53 -0400
changeset 8489 7fd62b320c31
child 8494 5d165785918d
permissions -rw-r--r--
WinRT: moved most platform-specific keyboard and mouse code to shared locations
     1 /*
     2   Simple DirectMedia Layer
     3   Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
     4 
     5   This software is provided 'as-is', without any express or implied
     6   warranty.  In no event will the authors be held liable for any damages
     7   arising from the use of this software.
     8 
     9   Permission is granted to anyone to use this software for any purpose,
    10   including commercial applications, and to alter it and redistribute it
    11   freely, subject to the following restrictions:
    12 
    13   1. The origin of this software must not be misrepresented; you must not
    14      claim that you wrote the original software. If you use this software
    15      in a product, an acknowledgment in the product documentation would be
    16      appreciated but is not required.
    17   2. Altered source versions must be plainly marked as such, and must not be
    18      misrepresented as being the original software.
    19   3. This notice may not be removed or altered from any source distribution.
    20 */
    21 #include "SDL_config.h"
    22 
    23 #if SDL_VIDEO_DRIVER_WINRT
    24 
    25 // Standard C++11 headers:
    26 #include <unordered_map>
    27 
    28 
    29 // Windows-specific headers:
    30 #include <Windows.h>
    31 
    32 
    33 // SDL-specific headers:
    34 #include <SDL.h>
    35 #include "SDL_winrtevents_c.h"
    36 
    37 extern "C" {
    38 #include "../../events/scancodes_windows.h"
    39 #include "../../events/SDL_keyboard_c.h"
    40 }
    41 
    42 
    43 static SDL_Scancode WinRT_Official_Keycodes[] = {
    44     SDL_SCANCODE_UNKNOWN, // VirtualKey.None -- 0
    45     SDL_SCANCODE_UNKNOWN, // VirtualKey.LeftButton -- 1
    46     SDL_SCANCODE_UNKNOWN, // VirtualKey.RightButton -- 2
    47     SDL_SCANCODE_CANCEL, // VirtualKey.Cancel -- 3
    48     SDL_SCANCODE_UNKNOWN, // VirtualKey.MiddleButton -- 4
    49     SDL_SCANCODE_UNKNOWN, // VirtualKey.XButton1 -- 5
    50     SDL_SCANCODE_UNKNOWN, // VirtualKey.XButton2 -- 6
    51     SDL_SCANCODE_UNKNOWN, // -- 7
    52     SDL_SCANCODE_BACKSPACE, // VirtualKey.Back -- 8
    53     SDL_SCANCODE_TAB, // VirtualKey.Tab -- 9
    54     SDL_SCANCODE_UNKNOWN, // -- 10
    55     SDL_SCANCODE_UNKNOWN, // -- 11
    56     SDL_SCANCODE_CLEAR, // VirtualKey.Clear -- 12
    57     SDL_SCANCODE_RETURN, // VirtualKey.Enter -- 13
    58     SDL_SCANCODE_UNKNOWN, // -- 14
    59     SDL_SCANCODE_UNKNOWN, // -- 15
    60     SDL_SCANCODE_LSHIFT, // VirtualKey.Shift -- 16
    61     SDL_SCANCODE_LCTRL, // VirtualKey.Control -- 17
    62     SDL_SCANCODE_MENU, // VirtualKey.Menu -- 18
    63     SDL_SCANCODE_PAUSE, // VirtualKey.Pause -- 19
    64     SDL_SCANCODE_CAPSLOCK, // VirtualKey.CapitalLock -- 20
    65     SDL_SCANCODE_UNKNOWN, // VirtualKey.Kana or VirtualKey.Hangul -- 21
    66     SDL_SCANCODE_UNKNOWN, // -- 22
    67     SDL_SCANCODE_UNKNOWN, // VirtualKey.Junja -- 23
    68     SDL_SCANCODE_UNKNOWN, // VirtualKey.Final -- 24
    69     SDL_SCANCODE_UNKNOWN, // VirtualKey.Hanja or VirtualKey.Kanji -- 25
    70     SDL_SCANCODE_UNKNOWN, // -- 26
    71     SDL_SCANCODE_ESCAPE, // VirtualKey.Escape -- 27
    72     SDL_SCANCODE_UNKNOWN, // VirtualKey.Convert -- 28
    73     SDL_SCANCODE_UNKNOWN, // VirtualKey.NonConvert -- 29
    74     SDL_SCANCODE_UNKNOWN, // VirtualKey.Accept -- 30
    75     SDL_SCANCODE_UNKNOWN, // VirtualKey.ModeChange -- 31  (maybe SDL_SCANCODE_MODE ?)
    76     SDL_SCANCODE_SPACE, // VirtualKey.Space -- 32
    77     SDL_SCANCODE_PAGEUP, // VirtualKey.PageUp -- 33
    78     SDL_SCANCODE_PAGEDOWN, // VirtualKey.PageDown -- 34
    79     SDL_SCANCODE_END, // VirtualKey.End -- 35
    80     SDL_SCANCODE_HOME, // VirtualKey.Home -- 36
    81     SDL_SCANCODE_LEFT, // VirtualKey.Left -- 37
    82     SDL_SCANCODE_UP, // VirtualKey.Up -- 38
    83     SDL_SCANCODE_RIGHT, // VirtualKey.Right -- 39
    84     SDL_SCANCODE_DOWN, // VirtualKey.Down -- 40
    85     SDL_SCANCODE_SELECT, // VirtualKey.Select -- 41
    86     SDL_SCANCODE_UNKNOWN, // VirtualKey.Print -- 42  (maybe SDL_SCANCODE_PRINTSCREEN ?)
    87     SDL_SCANCODE_EXECUTE, // VirtualKey.Execute -- 43
    88     SDL_SCANCODE_UNKNOWN, // VirtualKey.Snapshot -- 44
    89     SDL_SCANCODE_INSERT, // VirtualKey.Insert -- 45
    90     SDL_SCANCODE_DELETE, // VirtualKey.Delete -- 46
    91     SDL_SCANCODE_HELP, // VirtualKey.Help -- 47
    92     SDL_SCANCODE_0, // VirtualKey.Number0 -- 48
    93     SDL_SCANCODE_1, // VirtualKey.Number1 -- 49
    94     SDL_SCANCODE_2, // VirtualKey.Number2 -- 50
    95     SDL_SCANCODE_3, // VirtualKey.Number3 -- 51
    96     SDL_SCANCODE_4, // VirtualKey.Number4 -- 52
    97     SDL_SCANCODE_5, // VirtualKey.Number5 -- 53
    98     SDL_SCANCODE_6, // VirtualKey.Number6 -- 54
    99     SDL_SCANCODE_7, // VirtualKey.Number7 -- 55
   100     SDL_SCANCODE_8, // VirtualKey.Number8 -- 56
   101     SDL_SCANCODE_9, // VirtualKey.Number9 -- 57
   102     SDL_SCANCODE_UNKNOWN, // -- 58
   103     SDL_SCANCODE_UNKNOWN, // -- 59
   104     SDL_SCANCODE_UNKNOWN, // -- 60
   105     SDL_SCANCODE_UNKNOWN, // -- 61
   106     SDL_SCANCODE_UNKNOWN, // -- 62
   107     SDL_SCANCODE_UNKNOWN, // -- 63
   108     SDL_SCANCODE_UNKNOWN, // -- 64
   109     SDL_SCANCODE_A, // VirtualKey.A -- 65
   110     SDL_SCANCODE_B, // VirtualKey.B -- 66
   111     SDL_SCANCODE_C, // VirtualKey.C -- 67
   112     SDL_SCANCODE_D, // VirtualKey.D -- 68
   113     SDL_SCANCODE_E, // VirtualKey.E -- 69
   114     SDL_SCANCODE_F, // VirtualKey.F -- 70
   115     SDL_SCANCODE_G, // VirtualKey.G -- 71
   116     SDL_SCANCODE_H, // VirtualKey.H -- 72
   117     SDL_SCANCODE_I, // VirtualKey.I -- 73
   118     SDL_SCANCODE_J, // VirtualKey.J -- 74
   119     SDL_SCANCODE_K, // VirtualKey.K -- 75
   120     SDL_SCANCODE_L, // VirtualKey.L -- 76
   121     SDL_SCANCODE_M, // VirtualKey.M -- 77
   122     SDL_SCANCODE_N, // VirtualKey.N -- 78
   123     SDL_SCANCODE_O, // VirtualKey.O -- 79
   124     SDL_SCANCODE_P, // VirtualKey.P -- 80
   125     SDL_SCANCODE_Q, // VirtualKey.Q -- 81
   126     SDL_SCANCODE_R, // VirtualKey.R -- 82
   127     SDL_SCANCODE_S, // VirtualKey.S -- 83
   128     SDL_SCANCODE_T, // VirtualKey.T -- 84
   129     SDL_SCANCODE_U, // VirtualKey.U -- 85
   130     SDL_SCANCODE_V, // VirtualKey.V -- 86
   131     SDL_SCANCODE_W, // VirtualKey.W -- 87
   132     SDL_SCANCODE_X, // VirtualKey.X -- 88
   133     SDL_SCANCODE_Y, // VirtualKey.Y -- 89
   134     SDL_SCANCODE_Z, // VirtualKey.Z -- 90
   135     SDL_SCANCODE_UNKNOWN, // VirtualKey.LeftWindows -- 91  (maybe SDL_SCANCODE_APPLICATION or SDL_SCANCODE_LGUI ?)
   136     SDL_SCANCODE_UNKNOWN, // VirtualKey.RightWindows -- 92  (maybe SDL_SCANCODE_APPLICATION or SDL_SCANCODE_RGUI ?)
   137     SDL_SCANCODE_APPLICATION, // VirtualKey.Application -- 93
   138     SDL_SCANCODE_UNKNOWN, // -- 94
   139     SDL_SCANCODE_SLEEP, // VirtualKey.Sleep -- 95
   140     SDL_SCANCODE_KP_0, // VirtualKey.NumberPad0 -- 96
   141     SDL_SCANCODE_KP_1, // VirtualKey.NumberPad1 -- 97
   142     SDL_SCANCODE_KP_2, // VirtualKey.NumberPad2 -- 98
   143     SDL_SCANCODE_KP_3, // VirtualKey.NumberPad3 -- 99
   144     SDL_SCANCODE_KP_4, // VirtualKey.NumberPad4 -- 100
   145     SDL_SCANCODE_KP_5, // VirtualKey.NumberPad5 -- 101
   146     SDL_SCANCODE_KP_6, // VirtualKey.NumberPad6 -- 102
   147     SDL_SCANCODE_KP_7, // VirtualKey.NumberPad7 -- 103
   148     SDL_SCANCODE_KP_8, // VirtualKey.NumberPad8 -- 104
   149     SDL_SCANCODE_KP_9, // VirtualKey.NumberPad9 -- 105
   150     SDL_SCANCODE_KP_MULTIPLY, // VirtualKey.Multiply -- 106
   151     SDL_SCANCODE_KP_PLUS, // VirtualKey.Add -- 107
   152     SDL_SCANCODE_UNKNOWN, // VirtualKey.Separator -- 108
   153     SDL_SCANCODE_KP_MINUS, // VirtualKey.Subtract -- 109
   154     SDL_SCANCODE_UNKNOWN, // VirtualKey.Decimal -- 110  (maybe SDL_SCANCODE_DECIMALSEPARATOR, SDL_SCANCODE_KP_DECIMAL, or SDL_SCANCODE_KP_PERIOD ?)
   155     SDL_SCANCODE_KP_DIVIDE, // VirtualKey.Divide -- 111
   156     SDL_SCANCODE_F1, // VirtualKey.F1 -- 112
   157     SDL_SCANCODE_F2, // VirtualKey.F2 -- 113
   158     SDL_SCANCODE_F3, // VirtualKey.F3 -- 114
   159     SDL_SCANCODE_F4, // VirtualKey.F4 -- 115
   160     SDL_SCANCODE_F5, // VirtualKey.F5 -- 116
   161     SDL_SCANCODE_F6, // VirtualKey.F6 -- 117
   162     SDL_SCANCODE_F7, // VirtualKey.F7 -- 118
   163     SDL_SCANCODE_F8, // VirtualKey.F8 -- 119
   164     SDL_SCANCODE_F9, // VirtualKey.F9 -- 120
   165     SDL_SCANCODE_F10, // VirtualKey.F10 -- 121
   166     SDL_SCANCODE_F11, // VirtualKey.F11 -- 122
   167     SDL_SCANCODE_F12, // VirtualKey.F12 -- 123
   168     SDL_SCANCODE_F13, // VirtualKey.F13 -- 124
   169     SDL_SCANCODE_F14, // VirtualKey.F14 -- 125
   170     SDL_SCANCODE_F15, // VirtualKey.F15 -- 126
   171     SDL_SCANCODE_F16, // VirtualKey.F16 -- 127
   172     SDL_SCANCODE_F17, // VirtualKey.F17 -- 128
   173     SDL_SCANCODE_F18, // VirtualKey.F18 -- 129
   174     SDL_SCANCODE_F19, // VirtualKey.F19 -- 130
   175     SDL_SCANCODE_F20, // VirtualKey.F20 -- 131
   176     SDL_SCANCODE_F21, // VirtualKey.F21 -- 132
   177     SDL_SCANCODE_F22, // VirtualKey.F22 -- 133
   178     SDL_SCANCODE_F23, // VirtualKey.F23 -- 134
   179     SDL_SCANCODE_F24, // VirtualKey.F24 -- 135
   180     SDL_SCANCODE_UNKNOWN, // -- 136
   181     SDL_SCANCODE_UNKNOWN, // -- 137
   182     SDL_SCANCODE_UNKNOWN, // -- 138
   183     SDL_SCANCODE_UNKNOWN, // -- 139
   184     SDL_SCANCODE_UNKNOWN, // -- 140
   185     SDL_SCANCODE_UNKNOWN, // -- 141
   186     SDL_SCANCODE_UNKNOWN, // -- 142
   187     SDL_SCANCODE_UNKNOWN, // -- 143
   188     SDL_SCANCODE_NUMLOCKCLEAR, // VirtualKey.NumberKeyLock -- 144
   189     SDL_SCANCODE_SCROLLLOCK, // VirtualKey.Scroll -- 145
   190     SDL_SCANCODE_UNKNOWN, // -- 146
   191     SDL_SCANCODE_UNKNOWN, // -- 147
   192     SDL_SCANCODE_UNKNOWN, // -- 148
   193     SDL_SCANCODE_UNKNOWN, // -- 149
   194     SDL_SCANCODE_UNKNOWN, // -- 150
   195     SDL_SCANCODE_UNKNOWN, // -- 151
   196     SDL_SCANCODE_UNKNOWN, // -- 152
   197     SDL_SCANCODE_UNKNOWN, // -- 153
   198     SDL_SCANCODE_UNKNOWN, // -- 154
   199     SDL_SCANCODE_UNKNOWN, // -- 155
   200     SDL_SCANCODE_UNKNOWN, // -- 156
   201     SDL_SCANCODE_UNKNOWN, // -- 157
   202     SDL_SCANCODE_UNKNOWN, // -- 158
   203     SDL_SCANCODE_UNKNOWN, // -- 159
   204     SDL_SCANCODE_LSHIFT, // VirtualKey.LeftShift -- 160
   205     SDL_SCANCODE_RSHIFT, // VirtualKey.RightShift -- 161
   206     SDL_SCANCODE_LCTRL, // VirtualKey.LeftControl -- 162
   207     SDL_SCANCODE_RCTRL, // VirtualKey.RightControl -- 163
   208     SDL_SCANCODE_MENU, // VirtualKey.LeftMenu -- 164
   209     SDL_SCANCODE_MENU, // VirtualKey.RightMenu -- 165
   210 };
   211 
   212 static std::unordered_map<int, SDL_Scancode> WinRT_Unofficial_Keycodes;
   213 
   214 static SDL_Scancode
   215 TranslateKeycode(int keycode)
   216 {
   217     if (WinRT_Unofficial_Keycodes.empty()) {
   218         /* Set up a table of undocumented (by Microsoft), WinRT-specific,
   219            key codes: */
   220         // TODO, WinRT: move content declarations of WinRT_Unofficial_Keycodes into a C++11 initializer list, when possible
   221         WinRT_Unofficial_Keycodes[220] = SDL_SCANCODE_GRAVE;
   222         WinRT_Unofficial_Keycodes[222] = SDL_SCANCODE_BACKSLASH;
   223     }
   224 
   225     /* Try to get a documented, WinRT, 'VirtualKey' first (as documented at
   226        http://msdn.microsoft.com/en-us/library/windows/apps/windows.system.virtualkey.aspx ).
   227        If that fails, fall back to a Win32 virtual key.
   228     */
   229     // TODO, WinRT: try filling out the WinRT keycode table as much as possible, using the Win32 table for interpretation hints
   230     //SDL_Log("WinRT TranslateKeycode, keycode=%d\n", (int)keycode);
   231     SDL_Scancode scancode = SDL_SCANCODE_UNKNOWN;
   232     if (keycode < SDL_arraysize(WinRT_Official_Keycodes)) {
   233         scancode = WinRT_Official_Keycodes[keycode];
   234     }
   235     if (scancode == SDL_SCANCODE_UNKNOWN) {
   236         if (WinRT_Unofficial_Keycodes.find(keycode) != WinRT_Unofficial_Keycodes.end()) {
   237             scancode = WinRT_Unofficial_Keycodes[keycode];
   238         }
   239     }
   240     if (scancode == SDL_SCANCODE_UNKNOWN) {
   241         if (keycode < SDL_arraysize(windows_scancode_table)) {
   242             scancode = windows_scancode_table[keycode];
   243         }
   244     }
   245     if (scancode == SDL_SCANCODE_UNKNOWN) {
   246         SDL_Log("WinRT TranslateKeycode, unknown keycode=%d\n", (int)keycode);
   247     }
   248     return scancode;
   249 }
   250 
   251 void
   252 WINRT_ProcessKeyDownEvent(Windows::UI::Core::KeyEventArgs ^args)
   253 {
   254     SDL_Scancode sdlScancode = TranslateKeycode((int)args->VirtualKey);
   255 #if 0
   256     SDL_Keycode keycode = SDL_GetKeyFromScancode(sdlScancode);
   257     SDL_Log("key down, handled=%s, ext?=%s, released?=%s, menu key down?=%s, repeat count=%d, native scan code=%d, was down?=%s, vkey=%d, sdl scan code=%d (%s), sdl key code=%d (%s)\n",
   258         (args->Handled ? "1" : "0"),
   259         (args->KeyStatus.IsExtendedKey ? "1" : "0"),
   260         (args->KeyStatus.IsKeyReleased ? "1" : "0"),
   261         (args->KeyStatus.IsMenuKeyDown ? "1" : "0"),
   262         args->KeyStatus.RepeatCount,
   263         args->KeyStatus.ScanCode,
   264         (args->KeyStatus.WasKeyDown ? "1" : "0"),
   265         args->VirtualKey,
   266         sdlScancode,
   267         SDL_GetScancodeName(sdlScancode),
   268         keycode,
   269         SDL_GetKeyName(keycode));
   270     //args->Handled = true;
   271     //VirtualKey vkey = args->VirtualKey;
   272 #endif
   273     SDL_SendKeyboardKey(SDL_PRESSED, sdlScancode);
   274 }
   275 
   276 void
   277 WINRT_ProcessKeyUpEvent(Windows::UI::Core::KeyEventArgs ^args)
   278 {
   279     SDL_Scancode sdlScancode = TranslateKeycode((int)args->VirtualKey);
   280 #if 0
   281     SDL_Keycode keycode = SDL_GetKeyFromScancode(sdlScancode);
   282     SDL_Log("key up, handled=%s, ext?=%s, released?=%s, menu key down?=%s, repeat count=%d, native scan code=%d, was down?=%s, vkey=%d, sdl scan code=%d (%s), sdl key code=%d (%s)\n",
   283         (args->Handled ? "1" : "0"),
   284         (args->KeyStatus.IsExtendedKey ? "1" : "0"),
   285         (args->KeyStatus.IsKeyReleased ? "1" : "0"),
   286         (args->KeyStatus.IsMenuKeyDown ? "1" : "0"),
   287         args->KeyStatus.RepeatCount,
   288         args->KeyStatus.ScanCode,
   289         (args->KeyStatus.WasKeyDown ? "1" : "0"),
   290         args->VirtualKey,
   291         sdlScancode,
   292         SDL_GetScancodeName(sdlScancode),
   293         keycode,
   294         SDL_GetKeyName(keycode));
   295     //args->Handled = true;
   296 #endif
   297     SDL_SendKeyboardKey(SDL_RELEASED, sdlScancode);
   298 }
   299 
   300 #endif // SDL_VIDEO_DRIVER_WINRT