SDL 2.0
SDL_winrtkeyboard.cpp
Go to the documentation of this file.
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2019 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_internal.h"
22
23#if SDL_VIDEO_DRIVER_WINRT
24
25/* Windows-specific includes */
26#include <Windows.h>
27#include <agile.h>
28
29
30/* SDL-specific includes */
31#include "SDL.h"
32#include "SDL_winrtevents_c.h"
33
34extern "C" {
35#include "../../events/scancodes_windows.h"
36#include "../../events/SDL_keyboard_c.h"
37}
38
39
40static SDL_Scancode WinRT_Official_Keycodes[] = {
41 SDL_SCANCODE_UNKNOWN, /* VirtualKey.None -- 0 */
42 SDL_SCANCODE_UNKNOWN, /* VirtualKey.LeftButton -- 1 */
43 SDL_SCANCODE_UNKNOWN, /* VirtualKey.RightButton -- 2 */
44 SDL_SCANCODE_CANCEL, /* VirtualKey.Cancel -- 3 */
45 SDL_SCANCODE_UNKNOWN, /* VirtualKey.MiddleButton -- 4 */
46 SDL_SCANCODE_UNKNOWN, /* VirtualKey.XButton1 -- 5 */
47 SDL_SCANCODE_UNKNOWN, /* VirtualKey.XButton2 -- 6 */
48 SDL_SCANCODE_UNKNOWN, /* -- 7 */
49 SDL_SCANCODE_BACKSPACE, /* VirtualKey.Back -- 8 */
50 SDL_SCANCODE_TAB, /* VirtualKey.Tab -- 9 */
51 SDL_SCANCODE_UNKNOWN, /* -- 10 */
52 SDL_SCANCODE_UNKNOWN, /* -- 11 */
53 SDL_SCANCODE_CLEAR, /* VirtualKey.Clear -- 12 */
54 SDL_SCANCODE_RETURN, /* VirtualKey.Enter -- 13 */
55 SDL_SCANCODE_UNKNOWN, /* -- 14 */
56 SDL_SCANCODE_UNKNOWN, /* -- 15 */
57 SDL_SCANCODE_LSHIFT, /* VirtualKey.Shift -- 16 */
58 SDL_SCANCODE_LCTRL, /* VirtualKey.Control -- 17 */
59 SDL_SCANCODE_MENU, /* VirtualKey.Menu -- 18 */
60 SDL_SCANCODE_PAUSE, /* VirtualKey.Pause -- 19 */
61 SDL_SCANCODE_CAPSLOCK, /* VirtualKey.CapitalLock -- 20 */
62 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Kana or VirtualKey.Hangul -- 21 */
63 SDL_SCANCODE_UNKNOWN, /* -- 22 */
64 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Junja -- 23 */
65 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Final -- 24 */
66 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Hanja or VirtualKey.Kanji -- 25 */
67 SDL_SCANCODE_UNKNOWN, /* -- 26 */
68 SDL_SCANCODE_ESCAPE, /* VirtualKey.Escape -- 27 */
69 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Convert -- 28 */
70 SDL_SCANCODE_UNKNOWN, /* VirtualKey.NonConvert -- 29 */
71 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Accept -- 30 */
72 SDL_SCANCODE_UNKNOWN, /* VirtualKey.ModeChange -- 31 (maybe SDL_SCANCODE_MODE ?) */
73 SDL_SCANCODE_SPACE, /* VirtualKey.Space -- 32 */
74 SDL_SCANCODE_PAGEUP, /* VirtualKey.PageUp -- 33 */
75 SDL_SCANCODE_PAGEDOWN, /* VirtualKey.PageDown -- 34 */
76 SDL_SCANCODE_END, /* VirtualKey.End -- 35 */
77 SDL_SCANCODE_HOME, /* VirtualKey.Home -- 36 */
78 SDL_SCANCODE_LEFT, /* VirtualKey.Left -- 37 */
79 SDL_SCANCODE_UP, /* VirtualKey.Up -- 38 */
80 SDL_SCANCODE_RIGHT, /* VirtualKey.Right -- 39 */
81 SDL_SCANCODE_DOWN, /* VirtualKey.Down -- 40 */
82 SDL_SCANCODE_SELECT, /* VirtualKey.Select -- 41 */
83 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Print -- 42 (maybe SDL_SCANCODE_PRINTSCREEN ?) */
84 SDL_SCANCODE_EXECUTE, /* VirtualKey.Execute -- 43 */
85 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Snapshot -- 44 */
86 SDL_SCANCODE_INSERT, /* VirtualKey.Insert -- 45 */
87 SDL_SCANCODE_DELETE, /* VirtualKey.Delete -- 46 */
88 SDL_SCANCODE_HELP, /* VirtualKey.Help -- 47 */
89 SDL_SCANCODE_0, /* VirtualKey.Number0 -- 48 */
90 SDL_SCANCODE_1, /* VirtualKey.Number1 -- 49 */
91 SDL_SCANCODE_2, /* VirtualKey.Number2 -- 50 */
92 SDL_SCANCODE_3, /* VirtualKey.Number3 -- 51 */
93 SDL_SCANCODE_4, /* VirtualKey.Number4 -- 52 */
94 SDL_SCANCODE_5, /* VirtualKey.Number5 -- 53 */
95 SDL_SCANCODE_6, /* VirtualKey.Number6 -- 54 */
96 SDL_SCANCODE_7, /* VirtualKey.Number7 -- 55 */
97 SDL_SCANCODE_8, /* VirtualKey.Number8 -- 56 */
98 SDL_SCANCODE_9, /* VirtualKey.Number9 -- 57 */
99 SDL_SCANCODE_UNKNOWN, /* -- 58 */
100 SDL_SCANCODE_UNKNOWN, /* -- 59 */
101 SDL_SCANCODE_UNKNOWN, /* -- 60 */
102 SDL_SCANCODE_UNKNOWN, /* -- 61 */
103 SDL_SCANCODE_UNKNOWN, /* -- 62 */
104 SDL_SCANCODE_UNKNOWN, /* -- 63 */
105 SDL_SCANCODE_UNKNOWN, /* -- 64 */
106 SDL_SCANCODE_A, /* VirtualKey.A -- 65 */
107 SDL_SCANCODE_B, /* VirtualKey.B -- 66 */
108 SDL_SCANCODE_C, /* VirtualKey.C -- 67 */
109 SDL_SCANCODE_D, /* VirtualKey.D -- 68 */
110 SDL_SCANCODE_E, /* VirtualKey.E -- 69 */
111 SDL_SCANCODE_F, /* VirtualKey.F -- 70 */
112 SDL_SCANCODE_G, /* VirtualKey.G -- 71 */
113 SDL_SCANCODE_H, /* VirtualKey.H -- 72 */
114 SDL_SCANCODE_I, /* VirtualKey.I -- 73 */
115 SDL_SCANCODE_J, /* VirtualKey.J -- 74 */
116 SDL_SCANCODE_K, /* VirtualKey.K -- 75 */
117 SDL_SCANCODE_L, /* VirtualKey.L -- 76 */
118 SDL_SCANCODE_M, /* VirtualKey.M -- 77 */
119 SDL_SCANCODE_N, /* VirtualKey.N -- 78 */
120 SDL_SCANCODE_O, /* VirtualKey.O -- 79 */
121 SDL_SCANCODE_P, /* VirtualKey.P -- 80 */
122 SDL_SCANCODE_Q, /* VirtualKey.Q -- 81 */
123 SDL_SCANCODE_R, /* VirtualKey.R -- 82 */
124 SDL_SCANCODE_S, /* VirtualKey.S -- 83 */
125 SDL_SCANCODE_T, /* VirtualKey.T -- 84 */
126 SDL_SCANCODE_U, /* VirtualKey.U -- 85 */
127 SDL_SCANCODE_V, /* VirtualKey.V -- 86 */
128 SDL_SCANCODE_W, /* VirtualKey.W -- 87 */
129 SDL_SCANCODE_X, /* VirtualKey.X -- 88 */
130 SDL_SCANCODE_Y, /* VirtualKey.Y -- 89 */
131 SDL_SCANCODE_Z, /* VirtualKey.Z -- 90 */
132 SDL_SCANCODE_UNKNOWN, /* VirtualKey.LeftWindows -- 91 (maybe SDL_SCANCODE_APPLICATION or SDL_SCANCODE_LGUI ?) */
133 SDL_SCANCODE_UNKNOWN, /* VirtualKey.RightWindows -- 92 (maybe SDL_SCANCODE_APPLICATION or SDL_SCANCODE_RGUI ?) */
134 SDL_SCANCODE_APPLICATION, /* VirtualKey.Application -- 93 */
135 SDL_SCANCODE_UNKNOWN, /* -- 94 */
136 SDL_SCANCODE_SLEEP, /* VirtualKey.Sleep -- 95 */
137 SDL_SCANCODE_KP_0, /* VirtualKey.NumberPad0 -- 96 */
138 SDL_SCANCODE_KP_1, /* VirtualKey.NumberPad1 -- 97 */
139 SDL_SCANCODE_KP_2, /* VirtualKey.NumberPad2 -- 98 */
140 SDL_SCANCODE_KP_3, /* VirtualKey.NumberPad3 -- 99 */
141 SDL_SCANCODE_KP_4, /* VirtualKey.NumberPad4 -- 100 */
142 SDL_SCANCODE_KP_5, /* VirtualKey.NumberPad5 -- 101 */
143 SDL_SCANCODE_KP_6, /* VirtualKey.NumberPad6 -- 102 */
144 SDL_SCANCODE_KP_7, /* VirtualKey.NumberPad7 -- 103 */
145 SDL_SCANCODE_KP_8, /* VirtualKey.NumberPad8 -- 104 */
146 SDL_SCANCODE_KP_9, /* VirtualKey.NumberPad9 -- 105 */
147 SDL_SCANCODE_KP_MULTIPLY, /* VirtualKey.Multiply -- 106 */
148 SDL_SCANCODE_KP_PLUS, /* VirtualKey.Add -- 107 */
149 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Separator -- 108 */
150 SDL_SCANCODE_KP_MINUS, /* VirtualKey.Subtract -- 109 */
151 SDL_SCANCODE_UNKNOWN, /* VirtualKey.Decimal -- 110 (maybe SDL_SCANCODE_DECIMALSEPARATOR, SDL_SCANCODE_KP_DECIMAL, or SDL_SCANCODE_KP_PERIOD ?) */
152 SDL_SCANCODE_KP_DIVIDE, /* VirtualKey.Divide -- 111 */
153 SDL_SCANCODE_F1, /* VirtualKey.F1 -- 112 */
154 SDL_SCANCODE_F2, /* VirtualKey.F2 -- 113 */
155 SDL_SCANCODE_F3, /* VirtualKey.F3 -- 114 */
156 SDL_SCANCODE_F4, /* VirtualKey.F4 -- 115 */
157 SDL_SCANCODE_F5, /* VirtualKey.F5 -- 116 */
158 SDL_SCANCODE_F6, /* VirtualKey.F6 -- 117 */
159 SDL_SCANCODE_F7, /* VirtualKey.F7 -- 118 */
160 SDL_SCANCODE_F8, /* VirtualKey.F8 -- 119 */
161 SDL_SCANCODE_F9, /* VirtualKey.F9 -- 120 */
162 SDL_SCANCODE_F10, /* VirtualKey.F10 -- 121 */
163 SDL_SCANCODE_F11, /* VirtualKey.F11 -- 122 */
164 SDL_SCANCODE_F12, /* VirtualKey.F12 -- 123 */
165 SDL_SCANCODE_F13, /* VirtualKey.F13 -- 124 */
166 SDL_SCANCODE_F14, /* VirtualKey.F14 -- 125 */
167 SDL_SCANCODE_F15, /* VirtualKey.F15 -- 126 */
168 SDL_SCANCODE_F16, /* VirtualKey.F16 -- 127 */
169 SDL_SCANCODE_F17, /* VirtualKey.F17 -- 128 */
170 SDL_SCANCODE_F18, /* VirtualKey.F18 -- 129 */
171 SDL_SCANCODE_F19, /* VirtualKey.F19 -- 130 */
172 SDL_SCANCODE_F20, /* VirtualKey.F20 -- 131 */
173 SDL_SCANCODE_F21, /* VirtualKey.F21 -- 132 */
174 SDL_SCANCODE_F22, /* VirtualKey.F22 -- 133 */
175 SDL_SCANCODE_F23, /* VirtualKey.F23 -- 134 */
176 SDL_SCANCODE_F24, /* VirtualKey.F24 -- 135 */
177 SDL_SCANCODE_UNKNOWN, /* -- 136 */
178 SDL_SCANCODE_UNKNOWN, /* -- 137 */
179 SDL_SCANCODE_UNKNOWN, /* -- 138 */
180 SDL_SCANCODE_UNKNOWN, /* -- 139 */
181 SDL_SCANCODE_UNKNOWN, /* -- 140 */
182 SDL_SCANCODE_UNKNOWN, /* -- 141 */
183 SDL_SCANCODE_UNKNOWN, /* -- 142 */
184 SDL_SCANCODE_UNKNOWN, /* -- 143 */
185 SDL_SCANCODE_NUMLOCKCLEAR, /* VirtualKey.NumberKeyLock -- 144 */
186 SDL_SCANCODE_SCROLLLOCK, /* VirtualKey.Scroll -- 145 */
187 SDL_SCANCODE_UNKNOWN, /* -- 146 */
188 SDL_SCANCODE_UNKNOWN, /* -- 147 */
189 SDL_SCANCODE_UNKNOWN, /* -- 148 */
190 SDL_SCANCODE_UNKNOWN, /* -- 149 */
191 SDL_SCANCODE_UNKNOWN, /* -- 150 */
192 SDL_SCANCODE_UNKNOWN, /* -- 151 */
193 SDL_SCANCODE_UNKNOWN, /* -- 152 */
194 SDL_SCANCODE_UNKNOWN, /* -- 153 */
195 SDL_SCANCODE_UNKNOWN, /* -- 154 */
196 SDL_SCANCODE_UNKNOWN, /* -- 155 */
197 SDL_SCANCODE_UNKNOWN, /* -- 156 */
198 SDL_SCANCODE_UNKNOWN, /* -- 157 */
199 SDL_SCANCODE_UNKNOWN, /* -- 158 */
200 SDL_SCANCODE_UNKNOWN, /* -- 159 */
201 SDL_SCANCODE_LSHIFT, /* VirtualKey.LeftShift -- 160 */
202 SDL_SCANCODE_RSHIFT, /* VirtualKey.RightShift -- 161 */
203 SDL_SCANCODE_LCTRL, /* VirtualKey.LeftControl -- 162 */
204 SDL_SCANCODE_RCTRL, /* VirtualKey.RightControl -- 163 */
205 SDL_SCANCODE_MENU, /* VirtualKey.LeftMenu -- 164 */
206 SDL_SCANCODE_MENU, /* VirtualKey.RightMenu -- 165 */
207 SDL_SCANCODE_AC_BACK, /* VirtualKey.GoBack -- 166 : The go back key. */
208 SDL_SCANCODE_AC_FORWARD, /* VirtualKey.GoForward -- 167 : The go forward key. */
209 SDL_SCANCODE_AC_REFRESH, /* VirtualKey.Refresh -- 168 : The refresh key. */
210 SDL_SCANCODE_AC_STOP, /* VirtualKey.Stop -- 169 : The stop key. */
211 SDL_SCANCODE_AC_SEARCH, /* VirtualKey.Search -- 170 : The search key. */
212 SDL_SCANCODE_AC_BOOKMARKS, /* VirtualKey.Favorites -- 171 : The favorites key. */
213 SDL_SCANCODE_AC_HOME /* VirtualKey.GoHome -- 172 : The go home key. */
214};
215
216/* Attempt to translate a keycode that isn't listed in WinRT's VirtualKey enum.
217 */
218static SDL_Scancode
219WINRT_TranslateUnofficialKeycode(int keycode)
220{
221 switch (keycode) {
222 case 173: return SDL_SCANCODE_MUTE; /* VK_VOLUME_MUTE */
223 case 174: return SDL_SCANCODE_VOLUMEDOWN; /* VK_VOLUME_DOWN */
224 case 175: return SDL_SCANCODE_VOLUMEUP; /* VK_VOLUME_UP */
225 case 176: return SDL_SCANCODE_AUDIONEXT; /* VK_MEDIA_NEXT_TRACK */
226 case 177: return SDL_SCANCODE_AUDIOPREV; /* VK_MEDIA_PREV_TRACK */
227 // case 178: return ; /* VK_MEDIA_STOP */
228 case 179: return SDL_SCANCODE_AUDIOPLAY; /* VK_MEDIA_PLAY_PAUSE */
229 case 180: return SDL_SCANCODE_MAIL; /* VK_LAUNCH_MAIL */
230 case 181: return SDL_SCANCODE_MEDIASELECT; /* VK_LAUNCH_MEDIA_SELECT */
231 // case 182: return ; /* VK_LAUNCH_APP1 */
232 case 183: return SDL_SCANCODE_CALCULATOR; /* VK_LAUNCH_APP2 */
233 // case 184: return ; /* ... reserved ... */
234 // case 185: return ; /* ... reserved ... */
235 case 186: return SDL_SCANCODE_SEMICOLON; /* VK_OEM_1, ';:' key on US standard keyboards */
236 case 187: return SDL_SCANCODE_EQUALS; /* VK_OEM_PLUS */
237 case 188: return SDL_SCANCODE_COMMA; /* VK_OEM_COMMA */
238 case 189: return SDL_SCANCODE_MINUS; /* VK_OEM_MINUS */
239 case 190: return SDL_SCANCODE_PERIOD; /* VK_OEM_PERIOD */
240 case 191: return SDL_SCANCODE_SLASH; /* VK_OEM_2, '/?' key on US standard keyboards */
241 case 192: return SDL_SCANCODE_GRAVE; /* VK_OEM_3, '`~' key on US standard keyboards */
242 // ?
243 // ... reserved or unassigned ...
244 // ?
245 case 219: return SDL_SCANCODE_LEFTBRACKET; /* VK_OEM_4, '[{' key on US standard keyboards */
246 case 220: return SDL_SCANCODE_BACKSLASH; /* VK_OEM_5, '\|' key on US standard keyboards */
247 case 221: return SDL_SCANCODE_RIGHTBRACKET; /* VK_OEM_6, ']}' key on US standard keyboards */
248 case 222: return SDL_SCANCODE_APOSTROPHE; /* VK_OEM_7, 'single/double quote' on US standard keyboards */
249 default: break;
250 }
252}
253
254static SDL_Scancode
255WINRT_TranslateKeycode(int keycode, unsigned int nativeScancode)
256{
257 // TODO, WinRT: try filling out the WinRT keycode table as much as possible, using the Win32 table for interpretation hints
258
260
261 /* HACK ALERT: At least one VirtualKey constant (Shift) with a left/right
262 * designation might not get reported with its correct handedness, however
263 * its hardware scan code can fill in the gaps. If this is detected,
264 * use the hardware scan code to try telling if the left, or the right
265 * side's key was used.
266 *
267 * If Microsoft ever allows MapVirtualKey or MapVirtualKeyEx to be used
268 * in WinRT apps, or something similar to these (it doesn't appear to be,
269 * at least not for Windows [Phone] 8/8.1, as of Oct 24, 2014), then this
270 * hack might become deprecated, or obsolete.
271 */
272 if (nativeScancode < SDL_arraysize(windows_scancode_table)) {
273 switch (keycode) {
274 case 16: // VirtualKey.Shift
275 switch (windows_scancode_table[nativeScancode]) {
278 return windows_scancode_table[nativeScancode];
279 }
280 break;
281
282 // Add others, as necessary.
283 //
284 // Unfortunately, this hack doesn't seem to work in determining
285 // handedness with Control keys.
286
287 default:
288 break;
289 }
290 }
291
292 /* Try to get a documented, WinRT, 'VirtualKey' next (as documented at
293 http://msdn.microsoft.com/en-us/library/windows/apps/windows.system.virtualkey.aspx ).
294 If that fails, fall back to a Win32 virtual key.
295 If that fails, attempt to fall back to a scancode-derived key.
296 */
297 if (keycode < SDL_arraysize(WinRT_Official_Keycodes)) {
298 scancode = WinRT_Official_Keycodes[keycode];
299 }
300 if (scancode == SDL_SCANCODE_UNKNOWN) {
301 scancode = WINRT_TranslateUnofficialKeycode(keycode);
302 }
303 if (scancode == SDL_SCANCODE_UNKNOWN) {
304 if (nativeScancode < SDL_arraysize(windows_scancode_table)) {
305 scancode = windows_scancode_table[nativeScancode];
306 }
307 }
308 /*
309 if (scancode == SDL_SCANCODE_UNKNOWN) {
310 SDL_Log("WinRT TranslateKeycode, unknown keycode=%d\n", (int)keycode);
311 }
312 */
313 return scancode;
314}
315
316void
317WINRT_ProcessKeyDownEvent(Windows::UI::Core::KeyEventArgs ^args)
318{
319 SDL_Scancode sdlScancode = WINRT_TranslateKeycode((int)args->VirtualKey, args->KeyStatus.ScanCode);
320#if 0
321 SDL_Keycode keycode = SDL_GetKeyFromScancode(sdlScancode);
322 SDL_Log("key down, handled=%s, ext?=%s, released?=%s, menu key down?=%s, "
323 "repeat count=%d, native scan code=0x%x, was down?=%s, vkey=%d, "
324 "sdl scan code=%d (%s), sdl key code=%d (%s)\n",
325 (args->Handled ? "1" : "0"),
326 (args->KeyStatus.IsExtendedKey ? "1" : "0"),
327 (args->KeyStatus.IsKeyReleased ? "1" : "0"),
328 (args->KeyStatus.IsMenuKeyDown ? "1" : "0"),
329 args->KeyStatus.RepeatCount,
330 args->KeyStatus.ScanCode,
331 (args->KeyStatus.WasKeyDown ? "1" : "0"),
332 args->VirtualKey,
333 sdlScancode,
334 SDL_GetScancodeName(sdlScancode),
335 keycode,
336 SDL_GetKeyName(keycode));
337 //args->Handled = true;
338#endif
339 SDL_SendKeyboardKey(SDL_PRESSED, sdlScancode);
340}
341
342void
343WINRT_ProcessKeyUpEvent(Windows::UI::Core::KeyEventArgs ^args)
344{
345 SDL_Scancode sdlScancode = WINRT_TranslateKeycode((int)args->VirtualKey, args->KeyStatus.ScanCode);
346#if 0
347 SDL_Keycode keycode = SDL_GetKeyFromScancode(sdlScancode);
348 SDL_Log("key up, handled=%s, ext?=%s, released?=%s, menu key down?=%s, "
349 "repeat count=%d, native scan code=0x%x, was down?=%s, vkey=%d, "
350 "sdl scan code=%d (%s), sdl key code=%d (%s)\n",
351 (args->Handled ? "1" : "0"),
352 (args->KeyStatus.IsExtendedKey ? "1" : "0"),
353 (args->KeyStatus.IsKeyReleased ? "1" : "0"),
354 (args->KeyStatus.IsMenuKeyDown ? "1" : "0"),
355 args->KeyStatus.RepeatCount,
356 args->KeyStatus.ScanCode,
357 (args->KeyStatus.WasKeyDown ? "1" : "0"),
358 args->VirtualKey,
359 sdlScancode,
360 SDL_GetScancodeName(sdlScancode),
361 keycode,
362 SDL_GetKeyName(keycode));
363 //args->Handled = true;
364#endif
365 SDL_SendKeyboardKey(SDL_RELEASED, sdlScancode);
366}
367
368void
369WINRT_ProcessCharacterReceivedEvent(Windows::UI::Core::CharacterReceivedEventArgs ^args)
370{
371 wchar_t src_ucs2[2];
372 char dest_utf8[16];
373 int result;
374
375 /* Setup src */
376 src_ucs2[0] = args->KeyCode;
377 src_ucs2[1] = L'\0';
378
379 /* Convert the text, then send an SDL_TEXTINPUT event. */
380 result = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)&src_ucs2, -1, (LPSTR)dest_utf8, sizeof(dest_utf8), NULL, NULL);
381 if (result > 0) {
382 SDL_SendKeyboardText(dest_utf8);
383 }
384}
385
386
387#if NTDDI_VERSION >= NTDDI_WIN10
388
389SDL_bool WINRT_HasScreenKeyboardSupport(_THIS)
390{
391 return SDL_TRUE;
392}
393
394void WINRT_ShowScreenKeyboard(_THIS, SDL_Window *window)
395{
396 using namespace Windows::UI::ViewManagement;
397 InputPane ^ inputPane = InputPane::GetForCurrentView();
398 if (inputPane) {
399 inputPane->TryShow();
400 }
401}
402
403void WINRT_HideScreenKeyboard(_THIS, SDL_Window *window)
404{
405 using namespace Windows::UI::ViewManagement;
406 InputPane ^ inputPane = InputPane::GetForCurrentView();
407 if (inputPane) {
408 inputPane->TryHide();
409 }
410}
411
412SDL_bool WINRT_IsScreenKeyboardShown(_THIS, SDL_Window *window)
413{
414 using namespace Windows::UI::ViewManagement;
415 InputPane ^ inputPane = InputPane::GetForCurrentView();
416 if (inputPane) {
417 // dludwig@pobox.com: checking inputPane->Visible doesn't seem to detect visibility,
418 // at least not on the Windows Phone 10.0.10240.0 emulator. Checking
419 // the size of inputPane->OccludedRect, however, does seem to work.
420 Windows::Foundation::Rect rect = inputPane->OccludedRect;
421 if (rect.Width > 0 && rect.Height > 0) {
422 return SDL_TRUE;
423 }
424 }
425 return SDL_FALSE;
426}
427
428#endif // NTDDI_VERSION >= ...
429
430#endif // SDL_VIDEO_DRIVER_WINRT
#define _THIS
#define SDL_GetScancodeName
#define SDL_GetKeyFromScancode
#define SDL_GetKeyName
#define SDL_Log
#define SDL_RELEASED
Definition: SDL_events.h:49
#define SDL_PRESSED
Definition: SDL_events.h:50
int SDL_SendKeyboardText(const char *text)
Definition: SDL_keyboard.c:789
int SDL_SendKeyboardKey(Uint8 state, SDL_Scancode scancode)
Definition: SDL_keyboard.c:679
Sint32 SDL_Keycode
The SDL virtual key representation.
Definition: SDL_keycode.h:45
GLuint64EXT * result
SDL_Scancode
The SDL keyboard scancode representation.
Definition: SDL_scancode.h:44
@ SDL_SCANCODE_E
Definition: SDL_scancode.h:58
@ SDL_SCANCODE_END
Definition: SDL_scancode.h:174
@ SDL_SCANCODE_BACKSLASH
Definition: SDL_scancode.h:102
@ SDL_SCANCODE_ESCAPE
Definition: SDL_scancode.h:93
@ SDL_SCANCODE_F15
Definition: SDL_scancode.h:217
@ SDL_SCANCODE_M
Definition: SDL_scancode.h:66
@ SDL_SCANCODE_F12
Definition: SDL_scancode.h:164
@ SDL_SCANCODE_X
Definition: SDL_scancode.h:77
@ SDL_SCANCODE_W
Definition: SDL_scancode.h:76
@ SDL_SCANCODE_KP_PLUS
Definition: SDL_scancode.h:186
@ SDL_SCANCODE_F4
Definition: SDL_scancode.h:156
@ SDL_SCANCODE_RIGHTBRACKET
Definition: SDL_scancode.h:101
@ SDL_SCANCODE_CAPSLOCK
Definition: SDL_scancode.h:151
@ SDL_SCANCODE_B
Definition: SDL_scancode.h:55
@ SDL_SCANCODE_F2
Definition: SDL_scancode.h:154
@ SDL_SCANCODE_KP_MINUS
Definition: SDL_scancode.h:185
@ SDL_SCANCODE_F6
Definition: SDL_scancode.h:158
@ SDL_SCANCODE_KP_0
Definition: SDL_scancode.h:197
@ SDL_SCANCODE_F11
Definition: SDL_scancode.h:163
@ SDL_SCANCODE_CANCEL
Definition: SDL_scancode.h:270
@ SDL_SCANCODE_COMMA
Definition: SDL_scancode.h:147
@ SDL_SCANCODE_F24
Definition: SDL_scancode.h:226
@ SDL_SCANCODE_CALCULATOR
Definition: SDL_scancode.h:359
@ SDL_SCANCODE_Y
Definition: SDL_scancode.h:78
@ SDL_SCANCODE_APOSTROPHE
Definition: SDL_scancode.h:129
@ SDL_SCANCODE_2
Definition: SDL_scancode.h:82
@ SDL_SCANCODE_O
Definition: SDL_scancode.h:68
@ SDL_SCANCODE_K
Definition: SDL_scancode.h:64
@ SDL_SCANCODE_F
Definition: SDL_scancode.h:59
@ SDL_SCANCODE_DELETE
Definition: SDL_scancode.h:173
@ SDL_SCANCODE_F10
Definition: SDL_scancode.h:162
@ SDL_SCANCODE_F3
Definition: SDL_scancode.h:155
@ SDL_SCANCODE_5
Definition: SDL_scancode.h:85
@ SDL_SCANCODE_H
Definition: SDL_scancode.h:61
@ SDL_SCANCODE_SLASH
Definition: SDL_scancode.h:149
@ SDL_SCANCODE_F1
Definition: SDL_scancode.h:153
@ SDL_SCANCODE_F21
Definition: SDL_scancode.h:223
@ SDL_SCANCODE_KP_6
Definition: SDL_scancode.h:193
@ SDL_SCANCODE_7
Definition: SDL_scancode.h:87
@ SDL_SCANCODE_9
Definition: SDL_scancode.h:89
@ SDL_SCANCODE_KP_7
Definition: SDL_scancode.h:194
@ SDL_SCANCODE_AC_REFRESH
Definition: SDL_scancode.h:366
@ SDL_SCANCODE_KP_9
Definition: SDL_scancode.h:196
@ SDL_SCANCODE_VOLUMEUP
Definition: SDL_scancode.h:239
@ SDL_SCANCODE_NUMLOCKCLEAR
Definition: SDL_scancode.h:181
@ SDL_SCANCODE_MAIL
Definition: SDL_scancode.h:358
@ SDL_SCANCODE_KP_3
Definition: SDL_scancode.h:190
@ SDL_SCANCODE_SCROLLLOCK
Definition: SDL_scancode.h:167
@ SDL_SCANCODE_AUDIOPREV
Definition: SDL_scancode.h:352
@ SDL_SCANCODE_PAUSE
Definition: SDL_scancode.h:168
@ SDL_SCANCODE_RETURN
Definition: SDL_scancode.h:92
@ SDL_SCANCODE_HELP
Definition: SDL_scancode.h:228
@ SDL_SCANCODE_PAGEDOWN
Definition: SDL_scancode.h:175
@ SDL_SCANCODE_LSHIFT
Definition: SDL_scancode.h:329
@ SDL_SCANCODE_TAB
Definition: SDL_scancode.h:95
@ SDL_SCANCODE_3
Definition: SDL_scancode.h:83
@ SDL_SCANCODE_LCTRL
Definition: SDL_scancode.h:328
@ SDL_SCANCODE_SEMICOLON
Definition: SDL_scancode.h:128
@ SDL_SCANCODE_F16
Definition: SDL_scancode.h:218
@ SDL_SCANCODE_F22
Definition: SDL_scancode.h:224
@ SDL_SCANCODE_UNKNOWN
Definition: SDL_scancode.h:45
@ SDL_SCANCODE_0
Definition: SDL_scancode.h:90
@ SDL_SCANCODE_AC_STOP
Definition: SDL_scancode.h:365
@ SDL_SCANCODE_LEFTBRACKET
Definition: SDL_scancode.h:100
@ SDL_SCANCODE_AC_SEARCH
Definition: SDL_scancode.h:361
@ SDL_SCANCODE_F19
Definition: SDL_scancode.h:221
@ SDL_SCANCODE_V
Definition: SDL_scancode.h:75
@ SDL_SCANCODE_EXECUTE
Definition: SDL_scancode.h:227
@ SDL_SCANCODE_GRAVE
Definition: SDL_scancode.h:130
@ SDL_SCANCODE_MENU
Definition: SDL_scancode.h:229
@ SDL_SCANCODE_MUTE
Definition: SDL_scancode.h:238
@ SDL_SCANCODE_8
Definition: SDL_scancode.h:88
@ SDL_SCANCODE_I
Definition: SDL_scancode.h:62
@ SDL_SCANCODE_F17
Definition: SDL_scancode.h:219
@ SDL_SCANCODE_6
Definition: SDL_scancode.h:86
@ SDL_SCANCODE_S
Definition: SDL_scancode.h:72
@ SDL_SCANCODE_AC_BACK
Definition: SDL_scancode.h:363
@ SDL_SCANCODE_PAGEUP
Definition: SDL_scancode.h:172
@ SDL_SCANCODE_Z
Definition: SDL_scancode.h:79
@ SDL_SCANCODE_AUDIOPLAY
Definition: SDL_scancode.h:354
@ SDL_SCANCODE_P
Definition: SDL_scancode.h:69
@ SDL_SCANCODE_D
Definition: SDL_scancode.h:57
@ SDL_SCANCODE_F23
Definition: SDL_scancode.h:225
@ SDL_SCANCODE_PERIOD
Definition: SDL_scancode.h:148
@ SDL_SCANCODE_R
Definition: SDL_scancode.h:71
@ SDL_SCANCODE_KP_1
Definition: SDL_scancode.h:188
@ SDL_SCANCODE_AC_BOOKMARKS
Definition: SDL_scancode.h:367
@ SDL_SCANCODE_DOWN
Definition: SDL_scancode.h:178
@ SDL_SCANCODE_RIGHT
Definition: SDL_scancode.h:176
@ SDL_SCANCODE_F7
Definition: SDL_scancode.h:159
@ SDL_SCANCODE_MINUS
Definition: SDL_scancode.h:98
@ SDL_SCANCODE_A
Definition: SDL_scancode.h:54
@ SDL_SCANCODE_G
Definition: SDL_scancode.h:60
@ SDL_SCANCODE_KP_2
Definition: SDL_scancode.h:189
@ SDL_SCANCODE_U
Definition: SDL_scancode.h:74
@ SDL_SCANCODE_KP_MULTIPLY
Definition: SDL_scancode.h:184
@ SDL_SCANCODE_4
Definition: SDL_scancode.h:84
@ SDL_SCANCODE_F9
Definition: SDL_scancode.h:161
@ SDL_SCANCODE_F5
Definition: SDL_scancode.h:157
@ SDL_SCANCODE_UP
Definition: SDL_scancode.h:179
@ SDL_SCANCODE_LEFT
Definition: SDL_scancode.h:177
@ SDL_SCANCODE_AUDIONEXT
Definition: SDL_scancode.h:351
@ SDL_SCANCODE_SELECT
Definition: SDL_scancode.h:230
@ SDL_SCANCODE_APPLICATION
Definition: SDL_scancode.h:210
@ SDL_SCANCODE_KP_4
Definition: SDL_scancode.h:191
@ SDL_SCANCODE_C
Definition: SDL_scancode.h:56
@ SDL_SCANCODE_HOME
Definition: SDL_scancode.h:171
@ SDL_SCANCODE_F14
Definition: SDL_scancode.h:216
@ SDL_SCANCODE_T
Definition: SDL_scancode.h:73
@ SDL_SCANCODE_F8
Definition: SDL_scancode.h:160
@ SDL_SCANCODE_KP_8
Definition: SDL_scancode.h:195
@ SDL_SCANCODE_RCTRL
Definition: SDL_scancode.h:332
@ SDL_SCANCODE_F20
Definition: SDL_scancode.h:222
@ SDL_SCANCODE_KP_5
Definition: SDL_scancode.h:192
@ SDL_SCANCODE_L
Definition: SDL_scancode.h:65
@ SDL_SCANCODE_CLEAR
Definition: SDL_scancode.h:271
@ SDL_SCANCODE_AC_HOME
Definition: SDL_scancode.h:362
@ SDL_SCANCODE_VOLUMEDOWN
Definition: SDL_scancode.h:240
@ SDL_SCANCODE_SLEEP
Definition: SDL_scancode.h:386
@ SDL_SCANCODE_KP_DIVIDE
Definition: SDL_scancode.h:183
@ SDL_SCANCODE_F18
Definition: SDL_scancode.h:220
@ SDL_SCANCODE_F13
Definition: SDL_scancode.h:215
@ SDL_SCANCODE_N
Definition: SDL_scancode.h:67
@ SDL_SCANCODE_MEDIASELECT
Definition: SDL_scancode.h:356
@ SDL_SCANCODE_BACKSPACE
Definition: SDL_scancode.h:94
@ SDL_SCANCODE_EQUALS
Definition: SDL_scancode.h:99
@ SDL_SCANCODE_SPACE
Definition: SDL_scancode.h:96
@ SDL_SCANCODE_RSHIFT
Definition: SDL_scancode.h:333
@ SDL_SCANCODE_INSERT
Definition: SDL_scancode.h:169
@ SDL_SCANCODE_AC_FORWARD
Definition: SDL_scancode.h:364
@ SDL_SCANCODE_J
Definition: SDL_scancode.h:63
@ SDL_SCANCODE_1
Definition: SDL_scancode.h:81
@ SDL_SCANCODE_Q
Definition: SDL_scancode.h:70
SDL_bool
Definition: SDL_stdinc.h:162
@ SDL_TRUE
Definition: SDL_stdinc.h:164
@ SDL_FALSE
Definition: SDL_stdinc.h:163
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115
#define NULL
Definition: begin_code.h:167
EGLSurface EGLNativeWindowType * window
Definition: eglext.h:1025
static const SDL_Scancode windows_scancode_table[]
The type used to identify a window.
Definition: SDL_sysvideo.h:74
SDL_Rect rect
Definition: testrelative.c:27