FabGL
ESP32 Display Controller and Graphics Library
kbdlayouts.cpp
1 /*
2  Created by Fabrizio Di Vittorio (fdivitto2013@gmail.com) - <http://www.fabgl.com>
3  Copyright (c) 2019-2021 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 "kbdlayouts.h"
28 
29 
30 
31 
32  namespace fabgl {
33 
34 
35 
36 
37 
38 /**************************************************************************************/
39 /* US LAYOUT */
40 /**************************************************************************************/
41 const KeyboardLayout USLayout {
42  // name
43  "US",
44 
45  // desc
46  "US English",
47 
48  // inherited layout
49  nullptr,
50 
51  // single byte scancodes
52  {
53  { 0x76, VK_ESCAPE },
54  { 0x05, VK_F1 },
55  { 0x06, VK_F2 },
56  { 0x04, VK_F3 },
57  { 0x0C, VK_F4 },
58  { 0x03, VK_F5 },
59  { 0x0B, VK_F6 },
60  { 0x83, VK_F7 },
61  { 0x0A, VK_F8 },
62  { 0x01, VK_F9 },
63  { 0x09, VK_F10 },
64  { 0x78, VK_F11 },
65  { 0x07, VK_F12 },
66  { 0x16, VK_1 },
67  { 0x1E, VK_2 },
68  { 0x26, VK_3 },
69  { 0x25, VK_4 },
70  { 0x2E, VK_5 },
71  { 0x36, VK_6 },
72  { 0x3D, VK_7 },
73  { 0x3E, VK_8 },
74  { 0x46, VK_9 },
75  { 0x45, VK_0 },
76  { 0x15, VK_q },
77  { 0x1D, VK_w },
78  { 0x24, VK_e },
79  { 0x2D, VK_r },
80  { 0x2C, VK_t },
81  { 0x35, VK_y },
82  { 0x3C, VK_u },
83  { 0x43, VK_i },
84  { 0x44, VK_o },
85  { 0x4D, VK_p },
86  { 0x1C, VK_a },
87  { 0x1b, VK_s },
88  { 0x23, VK_d },
89  { 0x2b, VK_f },
90  { 0x34, VK_g },
91  { 0x33, VK_h },
92  { 0x3B, VK_j },
93  { 0x42, VK_k },
94  { 0x4B, VK_l },
95  { 0x1A, VK_z },
96  { 0x22, VK_x },
97  { 0x21, VK_c },
98  { 0x2A, VK_v },
99  { 0x32, VK_b },
100  { 0x31, VK_n },
101  { 0x3A, VK_m },
102  { 0x0E, VK_GRAVEACCENT },
103  { 0x4E, VK_MINUS },
104  { 0x55, VK_EQUALS },
105  { 0x54, VK_LEFTBRACKET },
106  { 0x5B, VK_RIGHTBRACKET },
107  { 0x5D, VK_BACKSLASH },
108  { 0x4C, VK_SEMICOLON },
109  { 0x52, VK_QUOTE },
110  { 0x41, VK_COMMA },
111  { 0x49, VK_PERIOD },
112  { 0x4A, VK_SLASH },
113  { 0x70, VK_KP_INSERT },
114  { 0x69, VK_KP_END },
115  { 0x72, VK_KP_DOWN },
116  { 0x7A, VK_KP_PAGEDOWN },
117  { 0x6B, VK_KP_LEFT },
118  { 0x73, VK_KP_CENTER }, // "5" in the keypad
119  { 0x74, VK_KP_RIGHT },
120  { 0x6C, VK_KP_HOME },
121  { 0x75, VK_KP_UP },
122  { 0x7D, VK_KP_PAGEUP },
123  { 0x71, VK_KP_DELETE },
124  { 0x7C, VK_KP_MULTIPLY },
125  { 0x79, VK_KP_PLUS },
126  { 0x7B, VK_KP_MINUS },
127  { 0x66, VK_BACKSPACE },
128  { 0x0D, VK_TAB },
129  { 0x5A, VK_RETURN },
130  { 0x77, VK_NUMLOCK },
131  { 0x7E, VK_SCROLLLOCK },
132  { 0x58, VK_CAPSLOCK },
133  { 0x12, VK_LSHIFT },
134  { 0x59, VK_RSHIFT },
135  { 0x14, VK_LCTRL },
136  { 0x11, VK_LALT },
137  { 0x29, VK_SPACE },
138  { 0x84, VK_SYSREQ }, // ALT + PRINTSCREEN directly translated by the keyboard
139  },
140 
141  // extended scancodes (0xE0..)
142  {
143  { 0x14, VK_RCTRL },
144  { 0x11, VK_RALT },
145  { 0x1F, VK_LGUI },
146  { 0x27, VK_RGUI },
147  { 0x2F, VK_APPLICATION },
148  { 0x70, VK_INSERT },
149  { 0x71, VK_DELETE },
150  { 0x4A, VK_KP_DIVIDE },
151  { 0x5A, VK_KP_ENTER },
152  { 0x7D, VK_PAGEUP },
153  { 0x7A, VK_PAGEDOWN },
154  { 0x6C, VK_HOME },
155  { 0x69, VK_END },
156  { 0x75, VK_UP },
157  { 0x72, VK_DOWN },
158  { 0x6B, VK_LEFT },
159  { 0x74, VK_RIGHT },
160  { 0x7C, VK_PRINTSCREEN },
161  // note1: pressing CTRL + PAUSE will generate "E0 7E" instead of normal Pause sequence. Here is translated to VK_BREAK.
162  // note2: pressing CTRL + PAUSE generates both keydown and keyup at the same time (hence the sequence E0 7E E0 F0 7E)
163  { 0x7E, VK_BREAK },
164  // these codes are discarded. They are a sort of extended left and right shifts.
165  // They are prefixed/postfixed on some special keys (insert, cursor,...) in combination with SHIFT or NUM LOCK, and even in unshifted PRINTSCREEN
166  { 0x12, VK_NONE },
167  { 0x59, VK_NONE },
168  },
169 
170  // virtual keys generated by other virtual keys combinations
171  // in_key, { CTRL, LALT, RALT, SHIFT }, out_key
172  {
173  { VK_1, { 0, 0, 0, 1 }, VK_EXCLAIM }, // SHIFT "1" = "!"
174  { VK_2, { 0, 0, 0, 1 }, VK_AT }, // SHIFT "2" = "@"
175  { VK_3, { 0, 0, 0, 1 }, VK_HASH }, // SHIFT "3" = "#"
176  { VK_4, { 0, 0, 0, 1 }, VK_DOLLAR }, // SHIFT "4" = "$"
177  { VK_5, { 0, 0, 0, 1 }, VK_PERCENT }, // SHIFT "5" = "%"
178  { VK_6, { 0, 0, 0, 1 }, VK_CARET }, // SHIFT "6" = "^"
179  { VK_7, { 0, 0, 0, 1 }, VK_AMPERSAND }, // SHIFT "7" = "&"
180  { VK_8, { 0, 0, 0, 1 }, VK_ASTERISK }, // SHIFT "8" = "*"
181  { VK_9, { 0, 0, 0, 1 }, VK_LEFTPAREN }, // SHIFT "9" = "("
182  { VK_0, { 0, 0, 0, 1 }, VK_RIGHTPAREN }, // SHIFT "0" = ")"
183 
184  { VK_GRAVEACCENT, { 0, 0, 0, 1 }, VK_TILDE }, // SHIFT "`" = "~"
185  { VK_MINUS, { 0, 0, 0, 1 }, VK_UNDERSCORE }, // SHIFT "-" = "_"
186  { VK_EQUALS, { 0, 0, 0, 1 }, VK_PLUS }, // SHIFT "=" = "+"
187  { VK_LEFTBRACKET, { 0, 0, 0, 1 }, VK_LEFTBRACE }, // SHIFT "[" = "{"
188  { VK_RIGHTBRACKET, { 0, 0, 0, 1 }, VK_RIGHTBRACE }, // SHIFT "]" = "}"
189  { VK_BACKSLASH, { 0, 0, 0, 1 }, VK_VERTICALBAR }, // SHIFT "\" = "|"
190  { VK_SEMICOLON, { 0, 0, 0, 1 }, VK_COLON }, // SHIFT ";" = ":"
191  { VK_QUOTE, { 0, 0, 0, 1 }, VK_QUOTEDBL }, // SHIFT "'" = """
192  { VK_COMMA, { 0, 0, 0, 1 }, VK_LESS }, // SHIFT "," = "<"
193  { VK_PERIOD, { 0, 0, 0, 1 }, VK_GREATER }, // SHIFT "." = ">"
194  { VK_SLASH, { 0, 0, 0, 1 }, VK_QUESTION }, // SHIFT "/" = "?"
195 
196  // SHIFT "a".."z" = "A".."Z"
197  { VK_a, { 0, 0, 0, 1 }, VK_A },
198  { VK_b, { 0, 0, 0, 1 }, VK_B },
199  { VK_c, { 0, 0, 0, 1 }, VK_C },
200  { VK_d, { 0, 0, 0, 1 }, VK_D },
201  { VK_e, { 0, 0, 0, 1 }, VK_E },
202  { VK_f, { 0, 0, 0, 1 }, VK_F },
203  { VK_g, { 0, 0, 0, 1 }, VK_G },
204  { VK_h, { 0, 0, 0, 1 }, VK_H },
205  { VK_i, { 0, 0, 0, 1 }, VK_I },
206  { VK_j, { 0, 0, 0, 1 }, VK_J },
207  { VK_k, { 0, 0, 0, 1 }, VK_K },
208  { VK_l, { 0, 0, 0, 1 }, VK_L },
209  { VK_m, { 0, 0, 0, 1 }, VK_M },
210  { VK_n, { 0, 0, 0, 1 }, VK_N },
211  { VK_o, { 0, 0, 0, 1 }, VK_O },
212  { VK_p, { 0, 0, 0, 1 }, VK_P },
213  { VK_q, { 0, 0, 0, 1 }, VK_Q },
214  { VK_r, { 0, 0, 0, 1 }, VK_R },
215  { VK_s, { 0, 0, 0, 1 }, VK_S },
216  { VK_t, { 0, 0, 0, 1 }, VK_T },
217  { VK_u, { 0, 0, 0, 1 }, VK_U },
218  { VK_v, { 0, 0, 0, 1 }, VK_V },
219  { VK_w, { 0, 0, 0, 1 }, VK_W },
220  { VK_x, { 0, 0, 0, 1 }, VK_X },
221  { VK_y, { 0, 0, 0, 1 }, VK_Y },
222  { VK_z, { 0, 0, 0, 1 }, VK_Z },
223 
224  // SHIFT "A".."Z" = "a".."z"
225  { VK_A, { 0, 0, 0, 1 }, VK_a },
226  { VK_B, { 0, 0, 0, 1 }, VK_b },
227  { VK_C, { 0, 0, 0, 1 }, VK_c },
228  { VK_D, { 0, 0, 0, 1 }, VK_d },
229  { VK_E, { 0, 0, 0, 1 }, VK_e },
230  { VK_F, { 0, 0, 0, 1 }, VK_f },
231  { VK_G, { 0, 0, 0, 1 }, VK_g },
232  { VK_H, { 0, 0, 0, 1 }, VK_h },
233  { VK_I, { 0, 0, 0, 1 }, VK_i },
234  { VK_J, { 0, 0, 0, 1 }, VK_j },
235  { VK_K, { 0, 0, 0, 1 }, VK_k },
236  { VK_L, { 0, 0, 0, 1 }, VK_l },
237  { VK_M, { 0, 0, 0, 1 }, VK_m },
238  { VK_N, { 0, 0, 0, 1 }, VK_n },
239  { VK_O, { 0, 0, 0, 1 }, VK_o },
240  { VK_P, { 0, 0, 0, 1 }, VK_p },
241  { VK_Q, { 0, 0, 0, 1 }, VK_q },
242  { VK_R, { 0, 0, 0, 1 }, VK_r },
243  { VK_S, { 0, 0, 0, 1 }, VK_s },
244  { VK_T, { 0, 0, 0, 1 }, VK_t },
245  { VK_U, { 0, 0, 0, 1 }, VK_u },
246  { VK_V, { 0, 0, 0, 1 }, VK_v },
247  { VK_W, { 0, 0, 0, 1 }, VK_w },
248  { VK_X, { 0, 0, 0, 1 }, VK_x },
249  { VK_Y, { 0, 0, 0, 1 }, VK_y },
250  { VK_Z, { 0, 0, 0, 1 }, VK_z },
251 
252  },
253 
254  // deadkeys
255  {
256  },
257 
258  // deadkeys translation
259  {
260  },
261 };
262 
263 
264 /**************************************************************************************/
265 /* UK LAYOUT */
266 /**************************************************************************************/
267 const KeyboardLayout UKLayout {
268  // name
269  "UK",
270 
271  // desc
272  "UK British",
273 
274  // inherited layout
275  &USLayout,
276 
277  // single byte scancodes
278  {
279  { 0x5D, VK_HASH },
280  { 0x61, VK_BACKSLASH },
281  },
282 
283  // extended scancodes (0xE0..)
284  {
285  },
286 
287  // virtual keys generated by other virtual keys combinations
288  // in_key, { CTRL, LALT, RALT, SHIFT }, out_key
289  {
290  { VK_GRAVEACCENT, { 0, 0, 0, 1 }, VK_NEGATION }, // SHIFT "`" = "¬"
291  { VK_2, { 0, 0, 0, 1 }, VK_QUOTEDBL }, // SHIFT "2" = """
292  { VK_3, { 0, 0, 0, 1 }, VK_POUND }, // SHIFT "3" = "£"
293  { VK_QUOTE, { 0, 0, 0, 1 }, VK_AT }, // SHIFT "'" = "@"
294  { VK_HASH, { 0, 0, 0, 1 }, VK_TILDE }, // SHIFT "#" = "~"
295  { VK_BACKSLASH, { 0, 0, 0, 1 }, VK_VERTICALBAR }, // SHIFT "\" = "|"
296  },
297 
298  // deadkeys
299  {
300  },
301 
302  // deadkeys translation
303  {
304  },
305 };
306 
307 
308 /**************************************************************************************/
309 /* GERMAN LAYOUT */
310 /**************************************************************************************/
311 const KeyboardLayout GermanLayout {
312  // name
313  "DE",
314 
315  // desc
316  "German",
317 
318  // inherited layout
319  &USLayout,
320 
321  // single byte scancodes
322  {
323  { 0x0E, VK_CARET },
324  { 0x4E, VK_ESZETT },
325  { 0x55, VK_ACUTEACCENT },
326  { 0x54, VK_UMLAUT_u },
327  { 0x5B, VK_PLUS },
328  { 0x4C, VK_UMLAUT_o },
329  { 0x52, VK_UMLAUT_a },
330  { 0x5D, VK_HASH },
331  { 0x61, VK_LESS },
332  { 0x4A, VK_MINUS },
333  { 0x35, VK_z },
334  { 0x1A, VK_y },
335  },
336 
337  // extended scancodes (0xE0..)
338  {
339  },
340 
341  // virtual keys generated by other virtual keys combinations
342  // in_key, { CTRL, LALT, RALT, SHIFT }, out_key
343  {
344  { VK_CARET, { 0, 0, 0, 1 }, VK_DEGREE }, // SHIFT "^" = "°"
345  { VK_2, { 0, 0, 0, 1 }, VK_QUOTEDBL }, // SHIFT "2" = """
346  { VK_3, { 0, 0, 0, 1 }, VK_SECTION }, // SHIFT "3" = "§"
347  { VK_6, { 0, 0, 0, 1 }, VK_AMPERSAND }, // SHIFT "6" = "&"
348  { VK_7, { 0, 0, 0, 1 }, VK_SLASH }, // SHIFT "7" = "/"
349  { VK_8, { 0, 0, 0, 1 }, VK_LEFTPAREN }, // SHIFT "8" = "("
350  { VK_9, { 0, 0, 0, 1 }, VK_RIGHTPAREN }, // SHIFT "9" = ")"
351  { VK_0, { 0, 0, 0, 1 }, VK_EQUALS }, // SHIFT "0" = "="
352  { VK_ESZETT, { 0, 0, 0, 1 }, VK_QUESTION }, // SHIFT "ß" = "?"
353  { VK_ACUTEACCENT, { 0, 0, 0, 1 }, VK_GRAVEACCENT }, // SHIFT "´" = "`"
354  { VK_PLUS, { 0, 0, 0, 1 }, VK_ASTERISK }, // SHIFT "+" = "*"
355  { VK_HASH, { 0, 0, 0, 1 }, VK_QUOTE }, // SHIFT "#" = "'"
356  { VK_LESS, { 0, 0, 0, 1 }, VK_GREATER }, // SHIFT "<" = ">"
357  { VK_COMMA, { 0, 0, 0, 1 }, VK_SEMICOLON }, // SHIFT "," = ";"
358  { VK_PERIOD, { 0, 0, 0, 1 }, VK_COLON }, // SHIFT "." = ":"
359  { VK_MINUS, { 0, 0, 0, 1 }, VK_UNDERSCORE }, // SHIFT "-" = "_"
360  { VK_7, { 0, 0, 1, 0 }, VK_LEFTBRACE }, // ALT "7" = "{"
361  { VK_8, { 0, 0, 1, 0 }, VK_LEFTBRACKET }, // ALT "8" = "["
362  { VK_9, { 0, 0, 1, 0 }, VK_RIGHTBRACKET }, // ALT "9" = "]"
363  { VK_0, { 0, 0, 1, 0 }, VK_RIGHTBRACE }, // ALT "0" = "}"
364  { VK_ESZETT, { 0, 0, 1, 0 }, VK_BACKSLASH }, // ALT "ß" = "\"
365  { VK_q, { 0, 0, 1, 0 }, VK_AT }, // ALT "q" = "@"
366  { VK_e, { 0, 0, 1, 0 }, VK_EURO }, // ALT "e" = "€"
367  { VK_PLUS, { 0, 0, 1, 0 }, VK_TILDE }, // ALT "+" = "~"
368  { VK_LESS, { 0, 0, 1, 0 }, VK_VERTICALBAR }, // ALT "<" = "|"
369  },
370 
371  // deadkeys
372  {
373  },
374 
375  // deadkeys translation
376  {
377  },
378 };
379 
380 
381 /**************************************************************************************/
382 /* ITALIAN LAYOUT */
383 /**************************************************************************************/
384 const KeyboardLayout ItalianLayout {
385  // name
386  "IT",
387 
388  // desc
389  "Italian",
390 
391  // inherited layout
392  &USLayout,
393 
394  // single byte scancodes
395  {
396  { 0x0E, VK_BACKSLASH },
397  { 0x4E, VK_QUOTE },
398  { 0x55, VK_GRAVE_i },
399  { 0x54, VK_GRAVE_e },
400  { 0x5B, VK_PLUS },
401  { 0x4C, VK_GRAVE_o },
402  { 0x52, VK_GRAVE_a },
403  { 0x5D, VK_GRAVE_u },
404  { 0x61, VK_LESS },
405  { 0x4A, VK_MINUS },
406  },
407 
408  // extended scancodes (0xE0..)
409  {
410  },
411 
412  // virtual keys generated by other virtual keys combinations
413  // in_key, { CTRL, LALT, RALT, SHIFT }, out_key
414  {
415  { VK_BACKSLASH, { 0, 0, 0, 1 }, VK_VERTICALBAR }, // SHIFT "\" = "|"
416  { VK_2, { 0, 0, 0, 1 }, VK_QUOTEDBL }, // SHIFT "2" = """
417  { VK_3, { 0, 0, 0, 1 }, VK_POUND }, // SHIFT "3" = "£"
418  { VK_6, { 0, 0, 0, 1 }, VK_AMPERSAND }, // SHIFT "6" = "&"
419  { VK_7, { 0, 0, 0, 1 }, VK_SLASH }, // SHIFT "7" = "/"
420  { VK_8, { 0, 0, 0, 1 }, VK_LEFTPAREN }, // SHIFT "8" = "("
421  { VK_9, { 0, 0, 0, 1 }, VK_RIGHTPAREN }, // SHIFT "9" = ")"
422  { VK_0, { 0, 0, 0, 1 }, VK_EQUALS }, // SHIFT "0" = "="
423  { VK_QUOTE, { 0, 0, 0, 1 }, VK_QUESTION }, // SHIFT "'" = "?"
424  { VK_GRAVE_i, { 0, 0, 0, 1 }, VK_CARET }, // SHIFT "ì" = "^"
425  { VK_GRAVE_e, { 0, 0, 0, 1 }, VK_ACUTE_e }, // SHIFT "è" = "é"
426  { VK_PLUS, { 0, 0, 0, 1 }, VK_ASTERISK }, // SHIFT "+" = "*"
427  { VK_GRAVE_o, { 0, 0, 0, 1 }, VK_CEDILLA_c }, // SHIFT "ò" = "ç"
428  { VK_GRAVE_a, { 0, 0, 0, 1 }, VK_DEGREE }, // SHIFT "à" = "°"
429  { VK_GRAVE_u, { 0, 0, 0, 1 }, VK_SECTION }, // SHIFT "ù" = "§"
430  { VK_LESS, { 0, 0, 0, 1 }, VK_GREATER }, // SHIFT "<" = ">"
431  { VK_COMMA, { 0, 0, 0, 1 }, VK_SEMICOLON }, // SHIFT "," = ";"
432  { VK_PERIOD, { 0, 0, 0, 1 }, VK_COLON }, // SHIFT "." = ":"
433  { VK_MINUS, { 0, 0, 0, 1 }, VK_UNDERSCORE }, // SHIFT "-" = "_"
434  { VK_BACKSLASH, { 0, 0, 1, 0 }, VK_GRAVEACCENT }, // ALT "\" = "`"
435  { VK_5, { 0, 0, 1, 0 }, VK_TILDE }, // ALT "5" = "~"
436  { VK_e, { 0, 0, 1, 0 }, VK_EURO }, // ALT "e" = "€"
437  { VK_GRAVE_e, { 0, 0, 1, 0 }, VK_LEFTBRACKET }, // ALT "è" = "["
438  { VK_PLUS, { 0, 0, 1, 0 }, VK_RIGHTBRACKET }, // ALT "+" = "]"
439  { VK_GRAVE_o, { 0, 0, 1, 0 }, VK_AT }, // ALT "ò" = "@"
440  { VK_GRAVE_a, { 0, 0, 1, 0 }, VK_HASH }, // ALT "à" = "#"
441  { VK_GRAVE_e, { 0, 0, 1, 1 }, VK_LEFTBRACE }, // SHIFT ALT "è" = "{"
442  { VK_PLUS, { 0, 0, 1, 1 }, VK_RIGHTBRACE }, // SHIFT ALT "+" = "}"
443  },
444 
445  // deadkeys
446  {
447  },
448 
449  // deadkeys translation
450  {
451  },
452 };
453 
454 
455 /**************************************************************************************/
456 /* SPANISH LAYOUT */
457 /* */
458 /* Implemented by Carles Oriol (https://github.com/carlesoriol) */
459 /**************************************************************************************/
460 const KeyboardLayout SpanishLayout {
461  // name
462  "ES",
463 
464  // desc
465  "Spanish",
466 
467  // inherited layout
468  &USLayout, // To avoid conflict key combinations
469 
470  // single byte scancodes
471  {
472  { 0x0E, VK_DEGREE },
473  { 0x4E, VK_QUOTE },
474  { 0x55, VK_EXCLAIM_INV }, // inverted exclaim
475  { 0x5D, VK_CEDILLA_c },
476 
477  { 0x54, VK_GRAVEACCENT },
478  { 0x5B, VK_PLUS },
479 
480  { 0x4C, VK_TILDE_n }, // spanish ñ
481  { 0x52, VK_ACUTEACCENT },
482 
483  { 0x61, VK_LESS },
484  { 0x4A, VK_MINUS }
485 
486 
487  },
488 
489  // extended scancodes (0xE0..)
490  {
491  },
492 
493 
494  // virtual keys generated by other virtual keys combinations
495  // in_key, { CTRL, LALT, RALT, SHIFT }, out_key
496  {
497 
498  { VK_DEGREE, { 0, 0, 1, 0 }, VK_BACKSLASH }, // ALT "º" = "\"
499  { VK_DEGREE, { 0, 0, 0, 1 }, VK_UPPER_a }, // SHIFT "º" = "ª"
500 
501  { VK_1, { 0, 0, 1, 0 }, VK_VERTICALBAR }, // ALT "1" = "|"
502  { VK_1, { 0, 0, 0, 1 }, VK_EXCLAIM }, // SHIFT "1" = "!"
503 
504  { VK_2, { 0, 0, 0, 1 }, VK_QUOTEDBL }, // SHIFT "2" = """
505  { VK_2, { 0, 0, 1, 0 }, VK_AT }, // ALT "2" = "@"
506 
507  { VK_3, { 0, 0, 0, 1 }, VK_INTERPUNCT }, // SHIFT "3" = "·"
508  { VK_3, { 0, 0, 1, 0 }, VK_HASH }, // SHIFT "3" = "#"
509 
510  { VK_4, { 0, 0, 1, 0 }, VK_TILDE }, // SHIFT "4" = "~"
511 
512  { VK_6, { 0, 0, 0, 1 }, VK_AMPERSAND }, // SHIFT "6" = "&"
513  { VK_6, { 0, 0, 1, 0 }, VK_NEGATION }, // ALT "6" = "¬"
514 
515  { VK_7, { 0, 0, 0, 1 }, VK_SLASH }, // SHIFT "7" = "/"
516  { VK_8, { 0, 0, 0, 1 }, VK_LEFTPAREN }, // SHIFT "8" = "("
517  { VK_9, { 0, 0, 0, 1 }, VK_RIGHTPAREN }, // SHIFT "9" = ")"
518  { VK_0, { 0, 0, 0, 1 }, VK_EQUALS }, // SHIFT "0" = "="
519 
520  { VK_QUOTE, { 0, 0, 0, 1 }, VK_QUESTION }, // SHIFT "'" = "?"
521  { VK_EXCLAIM_INV, { 0, 0, 0, 1 }, VK_QUESTION_INV }, // SHIFT "¡" = "¿"
522 
523  { VK_GRAVEACCENT, { 0, 0, 0, 1 }, VK_CARET }, // SHIFT "`" = "^"
524  { VK_GRAVEACCENT, { 0, 0, 1, 0 }, VK_LEFTBRACKET }, // SHIFT "`" = "["
525 
526  { VK_PLUS, { 0, 0, 0, 1 }, VK_ASTERISK }, // SHIFT "'" = "*"
527  { VK_PLUS, { 0, 0, 1, 0 }, VK_RIGHTBRACKET }, // SHIFT "'" = "]"
528 
529  { VK_CEDILLA_c, { 0, 0, 0, 1 }, VK_CEDILLA_C }, // SHIFT "ç" = "Ç" // should be upper case
530  { VK_CEDILLA_c, { 0, 0, 1, 0 }, VK_RIGHTBRACE }, // ALT "ç" = "}" // should be upper case
531 
532  { VK_ACUTEACCENT, { 0, 0, 0, 1 }, VK_DIAERESIS }, // ALT "'" = "¨" // should be diaeresis for vocals
533  { VK_ACUTEACCENT, { 0, 0, 1, 0 }, VK_LEFTBRACE }, // ALT "'" = "{" //
534 
535  { VK_LESS, { 0, 0, 0, 1 }, VK_GREATER }, // SHIFT "<" = ">"
536  { VK_LESS, { 0, 0, 1, 0 }, VK_VERTICALBAR }, // ALT "<" = "|"
537 
538  { VK_COMMA, { 0, 0, 0, 1 }, VK_SEMICOLON }, // SHIFT "," = ";"
539  { VK_PERIOD, { 0, 0, 0, 1 }, VK_COLON }, // SHIFT "." = ":"
540 
541  { VK_MINUS, { 0, 0, 0, 1 }, VK_UNDERSCORE }, // SHIFT "-" = "_"
542 
543  { VK_TILDE_n, { 0, 0, 0, 1 }, VK_TILDE_N }, // SHIFT "ñ" = "Ñ"
544  },
545 
546  // deadkeys
547  {
550  VK_DIAERESIS,
551  VK_CARET,
552  },
553 
554  // deadkeys translation
555  {
559  { VK_CARET, VK_SPACE, VK_CARET },
560 
566 
572 
578 
584 
585  { VK_CARET, VK_a, VK_CARET_a },
586  { VK_CARET, VK_e, VK_CARET_e },
587  { VK_CARET, VK_i, VK_CARET_i },
588  { VK_CARET, VK_o, VK_CARET_o },
589  { VK_CARET, VK_u, VK_CARET_u },
590 
591  { VK_CARET, VK_A, VK_CARET_A },
592  { VK_CARET, VK_E, VK_CARET_E },
593  { VK_CARET, VK_I, VK_CARET_I },
594  { VK_CARET, VK_O, VK_CARET_O },
595  { VK_CARET, VK_U, VK_CARET_U },
596 
602 
608  },
609 };
610 
611 
612 /**************************************************************************************/
613 /* FRENCH LAYOUT */
614 /* */
615 /* Contributions from: */
616 /* Alain Trentin */
617 /* Denis Bodor (https://github.com/0xDRRB) */
618 /**************************************************************************************/
619 const KeyboardLayout FrenchLayout {
620  // name
621  "FR",
622 
623  // desc
624  "French",
625 
626  // inherited layout
627  &USLayout,
628 
629  // single byte scancodes
630  {
631  { 0x0E, VK_SQUARE },
632  { 0x16, VK_AMPERSAND },
633  { 0x1E, VK_ACUTE_e },
634  { 0x26, VK_QUOTEDBL },
635  { 0x25, VK_QUOTE },
636  { 0x2E, VK_LEFTPAREN },
637  { 0x36, VK_MINUS },
638  { 0x3D, VK_GRAVE_e },
639  { 0x3E, VK_UNDERSCORE },
640  { 0x46, VK_CEDILLA_c },
641  { 0x45, VK_GRAVE_a },
642  { 0x4E, VK_RIGHTPAREN },
643  { 0x79, VK_EQUALS },
644 
645  { 0x15, VK_a },
646  { 0x1D, VK_z },
647  { 0x54, VK_CARET },
648  { 0x5B, VK_DOLLAR },
649 
650  { 0x1C, VK_q },
651  { 0x4C, VK_m },
652  { 0x52, VK_GRAVE_u },
653  { 0x5D, VK_ASTERISK },
654 
655  { 0x61, VK_LESS },
656  { 0x1A, VK_w },
657  { 0x3A, VK_COMMA },
658  { 0x41, VK_SEMICOLON },
659  { 0x49, VK_COLON },
660  { 0x4A, VK_EXCLAIM },
661  { 0x55, VK_EXCLAIM_INV },
662 
663  },
664 
665  // extended scancodes (0xE0..)
666  {
667  },
668 
669  // virtual keys generated by other virtual keys combinations
670  // in_key, { CTRL, LALT, RALT, SHIFT }, out_key
671  {
672  { VK_AMPERSAND, { 0, 0, 0, 1 }, VK_1 }, // SHIFT "&" = "1"
673  { VK_ACUTE_e, { 0, 0, 0, 1 }, VK_2 }, // SHIFT "é" = "2"
674  { VK_QUOTEDBL, { 0, 0, 0, 1 }, VK_3 }, // SHIFT """ = "3"
675  { VK_QUOTE, { 0, 0, 0, 1 }, VK_4 }, // SHIFT "'" = "4"
676  { VK_LEFTPAREN, { 0, 0, 0, 1 }, VK_5 }, // SHIFT "(" = "5"
677  { VK_MINUS, { 0, 0, 0, 1 }, VK_6 }, // SHIFT "-" = "6"
678  { VK_GRAVE_e, { 0, 0, 0, 1 }, VK_7 }, // SHIFT "è" = "7"
679  { VK_UNDERSCORE, { 0, 0, 0, 1 }, VK_8 }, // SHIFT "_" = "8"
680  { VK_CEDILLA_c, { 0, 0, 0, 1 }, VK_9 }, // SHIFT "ç" = "9"
681  { VK_GRAVE_a, { 0, 0, 0, 1 }, VK_0 }, // SHIFT "à" = "0"
682  { VK_RIGHTPAREN, { 0, 0, 0, 1 }, VK_DEGREE }, // SHIFT ")" = "°"
683  { VK_EQUALS, { 0, 0, 0, 1 }, VK_PLUS }, // SHIFT "=" = "+"
684  { VK_AMPERSAND, { 0, 0, 1, 0 }, VK_NONE }, // ALTGR "&" = ""
685  { VK_ACUTE_e, { 0, 0, 1, 0 }, VK_TILDE }, // ALTGR "é" = "~"
686  { VK_QUOTEDBL, { 0, 0, 1, 0 }, VK_HASH }, // ALTGR """ = "#"
687  { VK_QUOTE, { 0, 0, 1, 0 }, VK_LEFTBRACE }, // ALTGR "'" = "{"
688  { VK_LEFTPAREN, { 0, 0, 1, 0 }, VK_LEFTBRACKET }, // ALTGR "(" = "["
689  { VK_MINUS, { 0, 0, 1, 0 }, VK_VERTICALBAR }, // ALTGR "-" = "|"
690  { VK_GRAVE_e, { 0, 0, 1, 0 }, VK_GRAVEACCENT }, // ALTGR "è" = "`"
691  { VK_UNDERSCORE, { 0, 0, 1, 0 }, VK_BACKSLASH }, // ALTGR "_" = "\"
692  { VK_CEDILLA_c, { 0, 0, 1, 0 }, VK_CARET }, // ALTGR "ç" = "^"
693  { VK_GRAVE_a, { 0, 0, 1, 0 }, VK_AT }, // ALTGR "à" = "@"
694  { VK_RIGHTPAREN, { 0, 0, 1, 0 }, VK_RIGHTBRACKET }, // ALTGR ")" = "]"
695  { VK_EQUALS, { 0, 0, 1, 0 }, VK_RIGHTBRACE }, // ALTGR "=" = "}"
696  { VK_CARET, { 0, 0, 0, 1 }, VK_DIAERESIS }, // SHIFT "^" = "¨"
697  { VK_DOLLAR, { 0, 0, 0, 1 }, VK_POUND }, // SHIFT "$" = "£"
698  { VK_DOLLAR, { 0, 0, 1, 0 }, VK_CURRENCY }, // ALTGR "$" = "¤"
699  { VK_GRAVE_u, { 0, 0, 0, 1 }, VK_PERCENT }, // SHIFT "ù" = "%"
700  { VK_ASTERISK, { 0, 0, 0, 1 }, VK_MU }, // SHIFT "*" = "µ"
701  { VK_LESS, { 0, 0, 0, 1 }, VK_GREATER }, // SHIFT "<" = ">"
702  { VK_COMMA, { 0, 0, 0, 1 }, VK_QUESTION }, // SHIFT "," = "?"
703  { VK_SEMICOLON, { 0, 0, 0, 1 }, VK_PERIOD }, // SHIFT ";" = "."
704  { VK_COLON, { 0, 0, 0, 1 }, VK_SLASH }, // SHIFT ":" = "/"
705  { VK_EXCLAIM, { 0, 0, 0, 1 }, VK_SECTION }, // SHIFT "!" = "§"
706  { VK_e, { 0, 0, 1, 0 }, VK_EURO }, // ALTGR "e" = "€"
707  },
708 
709  // deadkeys
710  {
711  VK_CARET,
713  },
714 
715  // deadkeys translation
716  {
717  { VK_CARET, VK_a, VK_CARET_a }, // "â"
718  { VK_CARET, VK_e, VK_CARET_e }, // "ê"
719  { VK_CARET, VK_i, VK_CARET_i }, // "î"
720  { VK_CARET, VK_o, VK_CARET_o }, // "ô"
721  { VK_CARET, VK_u, VK_CARET_u }, // "û"
722 
723  { VK_CARET, VK_A, VK_CARET_A }, // "Â"
724  { VK_CARET, VK_E, VK_CARET_E }, // "Ê"
725  { VK_CARET, VK_I, VK_CARET_I }, // "Î"
726  { VK_CARET, VK_O, VK_CARET_O }, // "Ô"
727  { VK_CARET, VK_U, VK_CARET_U }, // "Û"
728 
729  { VK_DIAERESIS, VK_a, VK_CARET_a }, // "ä"
730  { VK_DIAERESIS, VK_e, VK_CARET_e }, // "ë"
731  { VK_DIAERESIS, VK_i, VK_CARET_i }, // "ï"
732  { VK_DIAERESIS, VK_o, VK_CARET_o }, // "ö"
733  { VK_DIAERESIS, VK_u, VK_CARET_u }, // "ü"
734 
735  { VK_DIAERESIS, VK_A, VK_CARET_A }, // "Ä"
736  { VK_DIAERESIS, VK_E, VK_CARET_E }, // "Ë"
737  { VK_DIAERESIS, VK_I, VK_CARET_I }, // "Ï"
738  { VK_DIAERESIS, VK_O, VK_CARET_O }, // "Ö"
739  { VK_DIAERESIS, VK_U, VK_CARET_U } // "Ü"
740  },
741 };
742 
743 
744 
745 /**************************************************************************************/
746 /* BELGIAN LAYOUT */
747 /* */
748 /* Implemented by Michel Bernard (https://github.com/GmEsoft) */
749 /**************************************************************************************/
750 const KeyboardLayout BelgianLayout {
751  // name
752  "BE",
753 
754  // desc
755  "Belgian",
756 
757  // inherited layout
758  &USLayout,
759 
760  // single byte scancodes
761  {
762  { 0x0E, VK_SQUARE }, // exponent 2
763  { 0x16, VK_AMPERSAND }, // 1 -> &
764  { 0x1E, VK_ACUTE_e }, // 2 -> é
765  { 0x26, VK_QUOTEDBL }, // 3 -> "
766  { 0x25, VK_QUOTE }, // 4 -> '
767  { 0x2E, VK_LEFTPAREN }, // 5 -> (
768  { 0x36, VK_SECTION }, // 6 -> §
769  { 0x3D, VK_GRAVE_e }, // 7 -> è
770  { 0x3E, VK_EXCLAIM }, // 8 -> !
771  { 0x46, VK_CEDILLA_c }, // 9 -> ç
772  { 0x45, VK_GRAVE_a }, // 0 -> à
773 
774  { 0x15, VK_a }, // q -> a
775  { 0x1D, VK_z }, // w -> z
776  { 0x1C, VK_q }, // a -> q
777  { 0x1A, VK_w }, // z -> w
778  { 0x3A, VK_COMMA }, // m -> ,
779 
780  { 0x4E, VK_RIGHTPAREN }, // - -> )
781  { 0x55, VK_MINUS }, // = -> -
782  { 0x54, VK_CARET }, // [ -> ^ (dead)
783  { 0x5B, VK_DOLLAR }, // ] -> $
784 
785  { 0x5D, VK_MU }, // \ -> mu
786  { 0x61, VK_LESS }, // UK \ -> <
787 
788  { 0x4C, VK_m }, // ; -> m
789  { 0x52, VK_GRAVE_u }, // ' -> ù
790  { 0x41, VK_SEMICOLON }, // , -> ;
791  { 0x49, VK_COLON }, // . -> :
792  { 0x4A, VK_EQUALS }, // / -> =
793 
794  { 0x00, VK_NONE } // END MARKER
795  },
796 
797  // extended scancodes (0xE0..)
798  {
799  { 0x00, VK_NONE } // END MARKER
800  },
801 
802  // virtual keys generated by other virtual keys combinations
803  // in_key, { CTRL, LALT, RALT, SHIFT }, out_key
804  {
805  { VK_AMPERSAND, { 0, 0, 0, 1 }, VK_1 }, // SHIFT "&" = "1"
806  { VK_ACUTE_e, { 0, 0, 0, 1 }, VK_2 }, // SHIFT "é" = "2"
807  { VK_QUOTEDBL, { 0, 0, 0, 1 }, VK_3 }, // SHIFT """ = "3"
808  { VK_QUOTE, { 0, 0, 0, 1 }, VK_4 }, // SHIFT "'" = "4"
809  { VK_LEFTPAREN, { 0, 0, 0, 1 }, VK_5 }, // SHIFT "(" = "5"
810  { VK_SECTION, { 0, 0, 0, 1 }, VK_6 }, // SHIFT "§" = "6"
811  { VK_GRAVE_e, { 0, 0, 0, 1 }, VK_7 }, // SHIFT "è" = "7"
812  { VK_EXCLAIM, { 0, 0, 0, 1 }, VK_8 }, // SHIFT "!" = "8"
813  { VK_CEDILLA_c, { 0, 0, 0, 1 }, VK_9 }, // SHIFT "ç" = "9"
814  { VK_GRAVE_a, { 0, 0, 0, 1 }, VK_0 }, // SHIFT "à" = "0"
815 
816  { VK_SQUARE, { 0, 0, 0, 1 }, VK_HASH }, // SHIFT "@" = "#" (Apple) or Cube (tbd)
817  { VK_RIGHTPAREN, { 0, 0, 0, 1 }, VK_DEGREE }, // SHIFT ")" = "°"
818  { VK_MINUS, { 0, 0, 0, 1 }, VK_UNDERSCORE }, // SHIFT "-" = "_"
819  { VK_CARET, { 0, 0, 0, 1 }, VK_DIAERESIS }, // SHIFT "^" = "¨"
820  { VK_DOLLAR, { 0, 0, 0, 1 }, VK_ASTERISK }, // SHIFT "$" = "*"
821  { VK_GRAVE_u, { 0, 0, 0, 1 }, VK_PERCENT }, // SHIFT "ù" = "%"
822  { VK_ESZETT, { 0, 0, 0, 1 }, VK_POUND }, // SHIFT "`" = "£"
823  { VK_LESS, { 0, 0, 0, 1 }, VK_GREATER }, // SHIFT "<" = ">"
824  { VK_COMMA, { 0, 0, 0, 1 }, VK_QUESTION }, // SHIFT "," = "?"
825  { VK_SEMICOLON, { 0, 0, 0, 1 }, VK_PERIOD }, // SHIFT ";" = "."
826  { VK_COLON, { 0, 0, 0, 1 }, VK_SLASH }, // SHIFT ":" = "/"
827  { VK_EQUALS, { 0, 0, 0, 1 }, VK_PLUS }, // SHIFT "=" = "+"
828 
829  { VK_AMPERSAND, { 0, 0, 1, 0 }, VK_VERTICALBAR }, // ALTGR "&" = "|"
830  { VK_ACUTE_e, { 0, 0, 1, 0 }, VK_AT }, // ALTGR "é" = "@"
831  { VK_QUOTEDBL, { 0, 0, 1, 0 }, VK_HASH }, // ALTGR """ = "#"
832  { VK_QUOTE, { 0, 0, 1, 0 }, VK_LEFTBRACE }, // ALTGR "'" = "{" (add-on)
833  { VK_LEFTPAREN, { 0, 0, 1, 0 }, VK_LEFTBRACKET }, // ALTGR "(" = "[" (add-on)
834  { VK_SECTION, { 0, 0, 1, 0 }, VK_CARET }, // ALTGR "§" = "^" (should not be dead...)
835  { VK_CEDILLA_c, { 0, 0, 1, 0 }, VK_LEFTBRACE }, // ALTGR "ç" = "{"
836  { VK_GRAVE_a, { 0, 0, 1, 0 }, VK_RIGHTBRACE }, // ALTGR "à" = "}"
837  { VK_RIGHTPAREN, { 0, 0, 1, 0 }, VK_RIGHTBRACKET }, // ALTGR "à" = "]" (add-on)
838  { VK_GRAVE_a, { 0, 0, 1, 0 }, VK_RIGHTBRACE }, // ALTGR "-" = "}" (add-on)
839 
840  { VK_e, { 0, 0, 1, 0 }, VK_EURO }, // ALTGR "e" = "€"
841  { VK_CARET, { 0, 0, 1, 0 }, VK_LEFTBRACKET }, // ALTGR "^" = "["
842  { VK_DOLLAR, { 0, 0, 1, 0 }, VK_RIGHTBRACKET }, // ALTGR "$" = "]"
843  { VK_GRAVE_u, { 0, 0, 1, 0 }, VK_ACUTEACCENT }, // ALTGR "ù" = "´"
844  { VK_MU, { 0, 0, 1, 0 }, VK_GRAVEACCENT }, // ALTGR "mu" = "`"
845  { VK_LESS, { 0, 0, 1, 0 }, VK_BACKSLASH }, // ALTGR "<" = "\"
846  { VK_EQUALS, { 0, 0, 1, 0 }, VK_TILDE }, // ALTGR "=" = "~"
847 
848  { VK_NONE, { 0, 0, 0, 0 }, VK_NONE } // END MARKER
849  },
850 
851  // deadkeys
852  {
853  VK_GRAVEACCENT, // `
854  VK_ACUTEACCENT, // ´
855  VK_DIAERESIS, // ¨
856  VK_CARET, // ^
857  VK_TILDE, // ~
858  VK_NONE // END MARKER
859  },
860 
861  // deadkeys translation
862  {
866  { VK_CARET, VK_SPACE, VK_CARET },
867  { VK_TILDE, VK_SPACE, VK_TILDE },
868 
869  { VK_TILDE, VK_n, VK_TILDE_n },
870  { VK_TILDE, VK_N, VK_TILDE_N },
871  { VK_TILDE, VK_a, VK_TILDE_a },
872  { VK_TILDE, VK_A, VK_TILDE_A },
873  { VK_TILDE, VK_o, VK_TILDE_o },
874  { VK_TILDE, VK_O, VK_TILDE_O },
875 
882 
889 
896 
903 
904  { VK_CARET, VK_a, VK_CARET_a },
905  { VK_CARET, VK_e, VK_CARET_e },
906  { VK_CARET, VK_i, VK_CARET_i },
907  { VK_CARET, VK_o, VK_CARET_o },
908  { VK_CARET, VK_u, VK_CARET_u },
909  { VK_CARET, VK_y, VK_CARET_y },
910 
911  { VK_CARET, VK_A, VK_CARET_A },
912  { VK_CARET, VK_E, VK_CARET_E },
913  { VK_CARET, VK_I, VK_CARET_I },
914  { VK_CARET, VK_O, VK_CARET_O },
915  { VK_CARET, VK_U, VK_CARET_U },
916  { VK_CARET, VK_Y, VK_CARET_Y },
917 
924 
931 
932  { VK_NONE, VK_NONE, VK_NONE} // END MARKER
933 
934  },
935 };
936 
937 
938 
939 
940 
941 
942  } // end of namespace
This file contains keyboard layouts.
Definition: canvas.cpp:36