FabGL
ESP32 Display Controller and Graphics Library
codepages.cpp
1/*
2 Created by Fabrizio Di Vittorio (fdivitto2013@gmail.com) - <http://www.fabgl.com>
3 Copyright (c) 2019-2022 Fabrizio Di Vittorio.
4 All rights reserved.
5
6
7* Please contact fdivitto2013@gmail.com if you need a commercial license.
8
9
10* This library and related software is available under GPL v3.
11
12 FabGL is free software: you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation, either version 3 of the License, or
15 (at your option) any later version.
16
17 FabGL is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
21
22 You should have received a copy of the GNU General Public License
23 along with FabGL. If not, see <http://www.gnu.org/licenses/>.
24 */
25
26
27#include "codepages.h"
28
29
30#pragma GCC optimize ("O2")
31
32
33
34namespace fabgl {
35
36
37
39// Codepage 437
40
41const VirtualKeyToASCII VK2ASCII437[] = {
42
43 { VK_GRAVE_a, 0x85 }, // à
44 { VK_GRAVE_e, 0x8a }, // è
45 { VK_ACUTE_e, 0x82 }, // é
46 { VK_GRAVE_i, 0x8d }, // ì
47 { VK_GRAVE_o, 0x95 }, // ò
48 { VK_GRAVE_u, 0x97 }, // ù
49 { VK_CEDILLA_c, 0x87 }, // ç
50 { VK_ESZETT, 0xe1 }, // ß
51 { VK_UMLAUT_u, 0x81 }, // ü
52 { VK_UMLAUT_o, 0x94 }, // ö
53 { VK_UMLAUT_a, 0x84 }, // ä
54 { VK_ACUTEACCENT, 0x27 }, // ´ -> ' (not in cp437)
55 { VK_POUND, 0x9c }, // £
56 { VK_EURO, 0xee }, // € -> ε (not in cp437)
57 { VK_DEGREE, 0xf8 }, // °
58 { VK_NEGATION, 0xaa }, // ¬
59 { VK_SQUARE, 0xfd }, // ²
60 { VK_MU, 0xe6 }, // µ
61 { VK_CEDILLA_C, 0x80 }, // Ç
62 { VK_TILDE_n, 0xa4 }, // ñ
63 { VK_TILDE_N, 0xa5 }, // Ñ
64 { VK_UPPER_a, 0xa6 }, // ª
65 { VK_ACUTE_a, 0xa0 }, // á
66 { VK_ACUTE_o, 0xa2 }, // ó
67 { VK_ACUTE_u, 0xa3 }, // ú
68 { VK_UMLAUT_i, 0x8b }, // ï
69 { VK_EXCLAIM_INV, 0xad }, // ¡
70 { VK_QUESTION_INV, 0xa8 }, // ¿
71 { VK_ACUTE_A, 0x41 }, // Á -> A (not in cp437)
72 { VK_ACUTE_E, 0x90 }, // É
73 { VK_ACUTE_I, 0x49 }, // Í -> I (not in cp437)
74 { VK_ACUTE_O, 0xe0 }, // Ó -> O (not in cp437)
75 { VK_ACUTE_U, 0x55 }, // Ú -> U (not in cp437)
76 { VK_GRAVE_A, 0x41 }, // À -> A (not in cp437)
77 { VK_GRAVE_E, 0x45 }, // È -> E (not in cp437)
78 { VK_GRAVE_I, 0x49 }, // Ì -> I (not in cp437)
79 { VK_GRAVE_O, 0x4f }, // Ò -> O (not in cp437)
80 { VK_GRAVE_U, 0x55 }, // Ù -> U (not in cp437)
81 { VK_INTERPUNCT, 0xfa }, // ·
82 { VK_UMLAUT_e, 0x89 }, // ë
83 { VK_UMLAUT_A, 0x8e }, // Ä
84 { VK_UMLAUT_E, 0x45 }, // Ë -> E (not in cp437)
85 { VK_UMLAUT_I, 0x49 }, // Ï -> I (not in cp437)
86 { VK_UMLAUT_O, 0x99 }, // Ö
87 { VK_UMLAUT_U, 0x9a }, // Ü
88 { VK_CARET_a, 0x83 }, // â
89 { VK_CARET_e, 0x88 }, // ê
90 { VK_CARET_i, 0x8c }, // î
91 { VK_CARET_o, 0x93 }, // ô
92 { VK_CARET_u, 0x96 }, // û
93 { VK_CARET_A, 0x41 }, // Â -> A (not in cp437)
94 { VK_CARET_E, 0x45 }, // Ê -> E (not in cp437)
95 { VK_CARET_I, 0x49 }, // Î -> I (not in cp437)
96 { VK_CARET_O, 0x4f }, // Ô -> O (not in cp437)
97 { VK_CARET_U, 0x55 }, // Û -> U (not in cp437)
98 { VK_TILDE_a, 0x61 }, // ã -> a (not in cp437)
99 { VK_TILDE_A, 0x41 }, // Ã -> A (not in cp437)
100 { VK_TILDE_o, 0x6f }, // õ -> o (not in cp437)
101 { VK_TILDE_O, 0x4f }, // Õ -> O (not in cp437)
102 { VK_GRAVE_y, 0x79 }, // ỳ -> y (not in cp437)
103 { VK_GRAVE_Y, 0x59 }, // Ỳ -> Y (not in cp437)
104 { VK_ACUTE_y, 0x79 }, // ý -> y (not in cp437)
105 { VK_ACUTE_Y, 0x59 }, // Ý -> Y (not in cp437)
106 { VK_CARET_y, 0x79 }, // ŷ -> y (not in cp437)
107 { VK_CARET_Y, 0x59 }, // Ŷ -> Y (not in cp437)
108 { VK_UMLAUT_y, 0x98 }, // ÿ
109 { VK_UMLAUT_Y, 0x59 }, // Ÿ -> Y (not in cp437)
110
111 { VK_NONE, 0x00 }, // end of table
112};
113
114const CodePage CodePage437 = {
115 437,
116 VK2ASCII437,
117};
118
119
120
122// Codepage 1252
123
124const VirtualKeyToASCII VK2ASCII1252[] = {
125 { VK_GRAVE_a, 0xe0 }, // à
126 { VK_GRAVE_e, 0xe8 }, // è
127 { VK_ACUTE_e, 0xe9 }, // é
128 { VK_GRAVE_i, 0xec }, // ì
129 { VK_GRAVE_o, 0xf2 }, // ò
130 { VK_GRAVE_u, 0xf9 }, // ù
131 { VK_CEDILLA_c, 0xe7 }, // ç
132 { VK_ESZETT, 0xdf }, // ß
133 { VK_UMLAUT_u, 0xfc }, // ü
134 { VK_UMLAUT_o, 0xf6 }, // ö
135 { VK_UMLAUT_a, 0xe4 }, // ä
136 { VK_ACUTEACCENT, 0xb4 }, // ´
137 { VK_POUND, 0xa3 }, // £
138 { VK_EURO, 0x80 }, // €
139 { VK_DEGREE, 0xb0 }, // °
140 { VK_SECTION, 0xa7 }, // §
141 { VK_NEGATION, 0xac }, // ¬
142 { VK_SQUARE, 0xb2 }, // ²
143 { VK_MU, 0xb5 }, // µ
144 { VK_CEDILLA_C, 0xc7 }, // Ç
145 { VK_TILDE_n, 0xf1 }, // ñ
146 { VK_TILDE_N, 0xd1 }, // Ñ
147 { VK_UPPER_a, 0xaa }, // ª
148 { VK_ACUTE_a, 0xe1 }, // á
149 { VK_ACUTE_o, 0xf3 }, // ó
150 { VK_ACUTE_u, 0xfa }, // ú
151 { VK_UMLAUT_i, 0xef }, // ï
152 { VK_EXCLAIM_INV, 0xa1 }, // ¡
153 { VK_QUESTION_INV, 0xbf }, // ¿
154 { VK_ACUTE_A, 0xc1 }, // Á
155 { VK_ACUTE_E, 0xc9 }, // É
156 { VK_ACUTE_I, 0xcd }, // Í
157 { VK_ACUTE_O, 0xd3 }, // Ó
158 { VK_ACUTE_U, 0xda }, // Ú
159 { VK_GRAVE_A, 0xc0 }, // À
160 { VK_GRAVE_E, 0xc8 }, // È
161 { VK_GRAVE_I, 0xcc }, // Ì
162 { VK_GRAVE_O, 0xd2 }, // Ò
163 { VK_GRAVE_U, 0xd9 }, // Ù
164 { VK_INTERPUNCT, 0xb7 }, // ·
165 { VK_DIAERESIS, 0xa8 }, // ¨
166 { VK_UMLAUT_e, 0xeb }, // ë
167 { VK_UMLAUT_A, 0xc4 }, // Ä
168 { VK_UMLAUT_E, 0xcb }, // Ë
169 { VK_UMLAUT_I, 0xcf }, // Ï
170 { VK_UMLAUT_O, 0xd6 }, // Ö
171 { VK_UMLAUT_U, 0xdc }, // Ü
172 { VK_CARET_a, 0xe2 }, // â
173 { VK_CARET_e, 0xea }, // ê
174 { VK_CARET_i, 0xee }, // î
175 { VK_CARET_o, 0xf4 }, // ô
176 { VK_CARET_u, 0xfb }, // û
177 { VK_CARET_A, 0xc2 }, // Â
178 { VK_CARET_E, 0xca }, // Ê
179 { VK_CARET_I, 0xce }, // Î
180 { VK_CARET_O, 0xd4 }, // Ô
181 { VK_CARET_U, 0xdb }, // Û
182 { VK_TILDE_a, 0xe3 }, // ã
183 { VK_TILDE_A, 0xc3 }, // Ã
184 { VK_TILDE_o, 0xf5 }, // õ
185 { VK_TILDE_O, 0xd5 }, // Õ
186 { VK_GRAVE_y, 0x79 }, // ỳ -> y (not in cp1252)
187 { VK_GRAVE_Y, 0x59 }, // Ỳ -> Y (not in cp1252)
188 { VK_ACUTE_y, 0xfd }, // ý
189 { VK_ACUTE_Y, 0xdd }, // Ý
190 { VK_CARET_y, 0x79 }, // ŷ -> y (not in cp1252)
191 { VK_CARET_Y, 0x59 }, // Ŷ -> Y (not in cp1252)
192 { VK_UMLAUT_y, 0xff }, // ÿ
193 { VK_UMLAUT_Y, 0x9f }, // Ÿ
194
195 { VK_NONE, 0x00 }, // end of table
196};
197
198const CodePage CodePage1252 = {
199 1252,
200 VK2ASCII1252,
201};
202
203
204
205
207// virtualKeyToASCII
208
209
210// -1 = virtual key cannot be translated to ASCII
211// of VirtualKeyItem uses:
212// - .vk
213// - .CTRL
214// - .SHIFT
215// - .SCROLLLOCK
216int virtualKeyToASCII(VirtualKeyItem const & item, CodePage const * codepage)
217{
218 int r = -1;
219
220 if (item.CTRL) {
221
222 // CTRL + ....
223
224 switch (item.vk) {
225
226 case VK_SPACE:
227 r = ASCII_NUL; // CTRL SPACE = NUL
228 break;
229
230 case VK_BACKSPACE:
231 r = ASCII_DEL; // CTRL BACKSPACE = DEL
232 break;
233
234 case VK_DELETE:
235 case VK_KP_DELETE:
236 r = ASCII_DEL; // DELETE = dEL
237 break;
238
239 case VK_RETURN:
240 case VK_KP_ENTER:
241 r = ASCII_LF; // CTRL ENTER = LF
242 break;
243
244 case VK_ESCAPE:
245 r = ASCII_ESC; // CTRL ESCAPE = ESC
246 break;
247
248 case VK_2:
249 r = ASCII_NUL; // CTRL 2 = NUL
250 break;
251
252 case VK_6:
253 r = ASCII_RS; // CTRL 6 = RS
254 break;
255
256 case VK_a ... VK_z:
257 r = item.vk - VK_a + ASCII_SOH ; // CTRL alpha = SOH (a) ...SUB (z)
258 break;
259
260 case VK_A ... VK_Z:
261 r = item.vk - VK_A + ASCII_SOH; // CTRL alpha = SOH (A) ...SUB (Z)
262 break;
263
264 case VK_MINUS:
265 r = ASCII_US; // CTRL - = US
266 break;
267
268 case VK_BACKSLASH:
269 r = ASCII_FS; // CTRL \ = FS
270 break;
271
272 case VK_QUESTION:
273 r = ASCII_US; // CTRL ? = US
274 break;
275
276 case VK_LEFTBRACKET:
277 r = ASCII_ESC; // CTRL [ = ESC
278 break;
279
280 case VK_RIGHTBRACKET:
281 r = ASCII_GS; // CTRL ] = GS
282 break;
283
284 case VK_TILDE:
285 r = ASCII_RS; // CTRL ~ = RS
286 break;
287
288 default:
289 break;
290
291 }
292
293 } else {
294
295 switch (item.vk) {
296
297 case VK_BACKSPACE:
298 r = ASCII_BS; // BACKSPACE = BS
299 break;
300
301 case VK_RETURN:
302 case VK_KP_ENTER:
303 r = ASCII_CR; // ENTER = CR
304 break;
305
306 case VK_TAB:
307 if (!item.SHIFT)
308 r = ASCII_HT; // TAB = HT
309 break;
310
311 case VK_ESCAPE:
312 r = ASCII_ESC; // ESCAPE = ESC
313 break;
314
315 case VK_SCROLLLOCK:
316 r = item.SCROLLLOCK ? ASCII_XOFF : ASCII_XON; // SCROLLLOCK = switch XOFF / XON
317 break;
318
319 case VK_0 ... VK_9:
320 r = item.vk - VK_0 + '0'; // digits
321 break;
322
323 case VK_KP_0 ... VK_KP_9:
324 r = item.vk - VK_KP_0 + '0'; // keypad digits
325 break;
326
327 case VK_a ... VK_z:
328 r = item.vk - VK_a + 'a'; // lowercase alpha
329 break;
330
331 case VK_A ... VK_Z:
332 r = item.vk - VK_A + 'A'; // uppercase alpha
333 break;
334
335 case VK_SPACE:
336 r = ASCII_SPC; // SPACE
337 break;
338
339 case VK_QUOTE:
340 r = '\''; // '
341 break;
342
343 case VK_QUOTEDBL:
344 r = '"'; // "
345 break;
346
347 case VK_EQUALS:
348 r = '='; // =
349 break;
350
351 case VK_MINUS:
352 case VK_KP_MINUS:
353 r = '-'; // -
354 break;
355
356 case VK_PLUS:
357 case VK_KP_PLUS:
358 r = '+'; // +
359 break;
360
361 case VK_KP_MULTIPLY:
362 case VK_ASTERISK:
363 r = '*'; // *
364 break;
365
366 case VK_KP_DIVIDE:
367 case VK_SLASH:
368 r = '/'; // /
369 break;
370
371 case VK_KP_PERIOD:
372 case VK_PERIOD:
373 r = '.'; // .
374 break;
375
376 case VK_COLON:
377 r = ':'; // :
378 break;
379
380 case VK_COMMA:
381 r = ','; // ,
382 break;
383
384 case VK_SEMICOLON:
385 r = ';'; // ;
386 break;
387
388 case VK_AMPERSAND:
389 r = '&'; // &
390 break;
391
392 case VK_VERTICALBAR:
393 r = '|'; // |
394 break;
395
396 case VK_HASH:
397 r = '#'; // #
398 break;
399
400 case VK_AT:
401 r = '@'; // @
402 break;
403
404 case VK_CARET:
405 r = '^'; // ^
406 break;
407
408 case VK_DOLLAR:
409 r = '$'; // $
410 break;
411
412 case VK_GRAVEACCENT:
413 r = 0x60; // `
414 break;
415
416 case VK_PERCENT:
417 r = '%'; // %
418 break;
419
420 case VK_EXCLAIM:
421 r = '!'; // !
422 break;
423
424 case VK_LEFTBRACE:
425 r = '{'; // {
426 break;
427
428 case VK_RIGHTBRACE:
429 r = '}'; // }
430 break;
431
432 case VK_LEFTPAREN:
433 r = '('; // (
434 break;
435
436 case VK_RIGHTPAREN:
437 r = ')'; // )
438 break;
439
440 case VK_LESS:
441 r = '<'; // <
442 break;
443
444 case VK_GREATER:
445 r = '>'; // >
446 break;
447
448 case VK_UNDERSCORE:
449 r = '_'; // _
450 break;
451
452 case VK_BACKSLASH:
453 r = '\\'; // backslash
454 break;
455
456 case VK_QUESTION:
457 r = '?'; // ?
458 break;
459
460 case VK_LEFTBRACKET:
461 r = '['; // [
462 break;
463
464 case VK_RIGHTBRACKET:
465 r = ']'; // ]
466 break;
467
468 case VK_TILDE:
469 r = '~'; // ~
470 break;
471
472 default:
473 // look into codepage table
474 if (codepage) {
475 for (auto cpitem = codepage->convTable; cpitem->vk != VK_NONE; ++cpitem) {
476 if (item.vk == cpitem->vk) {
477 r = cpitem->ASCII;
478 break;
479 }
480 }
481 }
482 break;
483
484 }
485
486 }
487
488 return r;
489}
490
491
492
493
494} // fabgl namespace
This file contains codepages declarations.
@ VK_GRAVE_e
Definition: fabutils.h:1280
@ VK_CARET_A
Definition: fabutils.h:1328
@ VK_GRAVE_y
Definition: fabutils.h:1284
@ VK_PERIOD
Definition: fabutils.h:1191
@ VK_ACUTEACCENT
Definition: fabutils.h:1177
@ VK_CARET_o
Definition: fabutils.h:1324
@ VK_RIGHTBRACE
Definition: fabutils.h:1207
@ VK_GRAVE_I
Definition: fabutils.h:1295
@ VK_GRAVE_Y
Definition: fabutils.h:1298
@ VK_ESZETT
Definition: fabutils.h:1347
@ VK_KP_PERIOD
Definition: fabutils.h:1190
@ VK_GRAVE_U
Definition: fabutils.h:1297
@ VK_GRAVE_a
Definition: fabutils.h:1279
@ VK_RETURN
Definition: fabutils.h:1249
@ VK_ESCAPE
Definition: fabutils.h:1229
@ VK_CARET_U
Definition: fabutils.h:1332
@ VK_UPPER_a
Definition: fabutils.h:1346
@ VK_GRAVE_E
Definition: fabutils.h:1294
@ VK_COMMA
Definition: fabutils.h:1193
@ VK_UMLAUT_e
Definition: fabutils.h:1308
@ VK_MU
Definition: fabutils.h:1354
@ VK_TILDE_a
Definition: fabutils.h:1338
@ VK_9
Definition: fabutils.h:1111
@ VK_CEDILLA_c
Definition: fabutils.h:1335
@ VK_TILDE
Definition: fabutils.h:1217
@ VK_UMLAUT_a
Definition: fabutils.h:1307
@ VK_SPACE
Definition: fabutils.h:1100
@ VK_LEFTBRACKET
Definition: fabutils.h:1208
@ VK_UMLAUT_A
Definition: fabutils.h:1314
@ VK_KP_9
Definition: fabutils.h:1121
@ VK_ACUTE_A
Definition: fabutils.h:1300
@ VK_ACUTE_a
Definition: fabutils.h:1286
@ VK_POUND
Definition: fabutils.h:1201
@ VK_CARET_e
Definition: fabutils.h:1322
@ VK_HASH
Definition: fabutils.h:1197
@ VK_ACUTE_e
Definition: fabutils.h:1287
@ VK_UMLAUT_U
Definition: fabutils.h:1318
@ VK_UMLAUT_O
Definition: fabutils.h:1317
@ VK_GREATER
Definition: fabutils.h:1213
@ VK_KP_MULTIPLY
Definition: fabutils.h:1185
@ VK_LEFTPAREN
Definition: fabutils.h:1210
@ VK_GRAVE_o
Definition: fabutils.h:1282
@ VK_CARET_I
Definition: fabutils.h:1330
@ VK_VERTICALBAR
Definition: fabutils.h:1196
@ VK_a
Definition: fabutils.h:1123
@ VK_SLASH
Definition: fabutils.h:1189
@ VK_DEGREE
Definition: fabutils.h:1215
@ VK_RIGHTPAREN
Definition: fabutils.h:1211
@ VK_QUOTE
Definition: fabutils.h:1178
@ VK_SEMICOLON
Definition: fabutils.h:1194
@ VK_QUESTION_INV
Definition: fabutils.h:1349
@ VK_GRAVE_A
Definition: fabutils.h:1293
@ VK_z
Definition: fabutils.h:1148
@ VK_UMLAUT_I
Definition: fabutils.h:1316
@ VK_ASTERISK
Definition: fabutils.h:1186
@ VK_UNDERSCORE
Definition: fabutils.h:1214
@ VK_ACUTE_Y
Definition: fabutils.h:1305
@ VK_KP_DELETE
Definition: fabutils.h:1237
@ VK_ACUTE_O
Definition: fabutils.h:1303
@ VK_AT
Definition: fabutils.h:1198
@ VK_CARET_u
Definition: fabutils.h:1325
@ VK_KP_0
Definition: fabutils.h:1112
@ VK_DIAERESIS
Definition: fabutils.h:1351
@ VK_TILDE_O
Definition: fabutils.h:1343
@ VK_AMPERSAND
Definition: fabutils.h:1195
@ VK_CARET_y
Definition: fabutils.h:1326
@ VK_SCROLLLOCK
Definition: fabutils.h:1245
@ VK_EQUALS
Definition: fabutils.h:1180
@ VK_CARET_O
Definition: fabutils.h:1331
@ VK_COLON
Definition: fabutils.h:1192
@ VK_6
Definition: fabutils.h:1108
@ VK_TAB
Definition: fabutils.h:1248
@ VK_TILDE_n
Definition: fabutils.h:1340
@ VK_KP_DIVIDE
Definition: fabutils.h:1188
@ VK_LEFTBRACE
Definition: fabutils.h:1206
@ VK_CEDILLA_C
Definition: fabutils.h:1336
@ VK_LESS
Definition: fabutils.h:1212
@ VK_EXCLAIM
Definition: fabutils.h:1204
@ VK_TILDE_N
Definition: fabutils.h:1344
@ VK_CARET_E
Definition: fabutils.h:1329
@ VK_UMLAUT_u
Definition: fabutils.h:1311
@ VK_ACUTE_E
Definition: fabutils.h:1301
@ VK_GRAVE_O
Definition: fabutils.h:1296
@ VK_UMLAUT_y
Definition: fabutils.h:1312
@ VK_DELETE
Definition: fabutils.h:1236
@ VK_NEGATION
Definition: fabutils.h:1218
@ VK_KP_ENTER
Definition: fabutils.h:1250
@ VK_0
Definition: fabutils.h:1102
@ VK_CARET_Y
Definition: fabutils.h:1333
@ VK_GRAVEACCENT
Definition: fabutils.h:1176
@ VK_ACUTE_I
Definition: fabutils.h:1302
@ VK_A
Definition: fabutils.h:1149
@ VK_DOLLAR
Definition: fabutils.h:1200
@ VK_SECTION
Definition: fabutils.h:1216
@ VK_UMLAUT_o
Definition: fabutils.h:1310
@ VK_Z
Definition: fabutils.h:1174
@ VK_GRAVE_u
Definition: fabutils.h:1283
@ VK_CARET_a
Definition: fabutils.h:1321
@ VK_ACUTE_o
Definition: fabutils.h:1289
@ VK_BACKSPACE
Definition: fabutils.h:1238
@ VK_TILDE_o
Definition: fabutils.h:1339
@ VK_QUESTION
Definition: fabutils.h:1205
@ VK_MINUS
Definition: fabutils.h:1181
@ VK_UMLAUT_E
Definition: fabutils.h:1315
@ VK_BACKSLASH
Definition: fabutils.h:1187
@ VK_NONE
Definition: fabutils.h:1098
@ VK_INTERPUNCT
Definition: fabutils.h:1350
@ VK_ACUTE_U
Definition: fabutils.h:1304
@ VK_KP_MINUS
Definition: fabutils.h:1182
@ VK_CARET
Definition: fabutils.h:1199
@ VK_QUOTEDBL
Definition: fabutils.h:1179
@ VK_CARET_i
Definition: fabutils.h:1323
@ VK_ACUTE_y
Definition: fabutils.h:1291
@ VK_UMLAUT_Y
Definition: fabutils.h:1319
@ VK_EURO
Definition: fabutils.h:1202
@ VK_2
Definition: fabutils.h:1104
@ VK_RIGHTBRACKET
Definition: fabutils.h:1209
@ VK_UMLAUT_i
Definition: fabutils.h:1309
@ VK_PLUS
Definition: fabutils.h:1183
@ VK_SQUARE
Definition: fabutils.h:1352
@ VK_ACUTE_u
Definition: fabutils.h:1290
@ VK_EXCLAIM_INV
Definition: fabutils.h:1348
@ VK_GRAVE_i
Definition: fabutils.h:1281
@ VK_KP_PLUS
Definition: fabutils.h:1184
@ VK_PERCENT
Definition: fabutils.h:1203
@ VK_TILDE_A
Definition: fabutils.h:1342