1/*	$NetBSD: hidkbdmap.c,v 1.15 2021/09/22 17:37:32 nia Exp $	*/
2
3/*
4 * Copyright (c) 1999,2001 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Lennart Augustsson (lennart@augustsson.net) at
9 * Carlstedt Research & Technology.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
31 */
32
33#include <sys/cdefs.h>
34__KERNEL_RCSID(0, "$NetBSD: hidkbdmap.c,v 1.15 2021/09/22 17:37:32 nia Exp $");
35
36#include <sys/param.h>
37#include <sys/types.h>
38#include <dev/wscons/wsksymdef.h>
39#include <dev/wscons/wsksymvar.h>
40
41#include <dev/usb/usb.h>
42
43#define KC(n)		KS_KEYCODE(n)
44
45Static const keysym_t hidkbd_keydesc_us[] = {
46/*  pos      command		normal		shifted */
47    KC(4), 			KS_a,
48    KC(5), 			KS_b,
49    KC(6), 			KS_c,
50    KC(7), 			KS_d,
51    KC(8), 			KS_e,
52    KC(9), 			KS_f,
53    KC(10), 			KS_g,
54    KC(11), 			KS_h,
55    KC(12), 			KS_i,
56    KC(13), 			KS_j,
57    KC(14), 			KS_k,
58    KC(15), 			KS_l,
59    KC(16), 			KS_m,
60    KC(17), 			KS_n,
61    KC(18), 			KS_o,
62    KC(19), 			KS_p,
63    KC(20), 			KS_q,
64    KC(21), 			KS_r,
65    KC(22), 			KS_s,
66    KC(23), 			KS_t,
67    KC(24), 			KS_u,
68    KC(25), 			KS_v,
69    KC(26), 			KS_w,
70    KC(27), 			KS_x,
71    KC(28), 			KS_y,
72    KC(29), 			KS_z,
73    KC(30),  			KS_1,		KS_exclam,
74    KC(31),  			KS_2,		KS_at,
75    KC(32),  			KS_3,		KS_numbersign,
76    KC(33),  			KS_4,		KS_dollar,
77    KC(34),  			KS_5,		KS_percent,
78    KC(35),  			KS_6,		KS_asciicircum,
79    KC(36),  			KS_7,		KS_ampersand,
80    KC(37),  			KS_8,		KS_asterisk,
81    KC(38), 			KS_9,		KS_parenleft,
82    KC(39), 			KS_0,		KS_parenright,
83    KC(40), 			KS_Return,
84    KC(41),   KS_Cmd_Debugger,	KS_Escape,
85    KC(42), 			KS_BackSpace,
86    KC(43), 			KS_Tab,
87    KC(44), 			KS_space,
88    KC(45), 			KS_minus,	KS_underscore,
89    KC(46), 			KS_equal,	KS_plus,
90    KC(47), 			KS_bracketleft,	KS_braceleft,
91    KC(48), 			KS_bracketright,KS_braceright,
92    KC(49), 			KS_backslash,	KS_bar,
93    KC(50), 			KS_backslash,	KS_bar,
94    KC(51), 			KS_semicolon,	KS_colon,
95    KC(52), 			KS_apostrophe,	KS_quotedbl,
96    KC(53), 			KS_grave,	KS_asciitilde,
97    KC(54), 			KS_comma,	KS_less,
98    KC(55), 			KS_period,	KS_greater,
99    KC(56), 			KS_slash,	KS_question,
100    KC(57), 			KS_Caps_Lock,
101    KC(58),  KS_Cmd_Screen0,	KS_f1,
102    KC(59),  KS_Cmd_Screen1,	KS_f2,
103    KC(60),  KS_Cmd_Screen2,	KS_f3,
104    KC(61),  KS_Cmd_Screen3,	KS_f4,
105    KC(62),  KS_Cmd_Screen4,	KS_f5,
106    KC(63),  KS_Cmd_Screen5,	KS_f6,
107    KC(64),  KS_Cmd_Screen6,	KS_f7,
108    KC(65),  KS_Cmd_Screen7,	KS_f8,
109    KC(66),  KS_Cmd_Screen8,	KS_f9,
110    KC(67),  KS_Cmd_Screen9,	KS_f10,
111    KC(68), 			KS_f11,
112    KC(69), 			KS_f12,
113    KC(70),			KS_Print_Screen,
114    KC(71), 			KS_Hold_Screen,
115    KC(72),			KS_Pause,
116    KC(73),			KS_Insert,
117    KC(74),			KS_Home,
118    KC(75), KS_Cmd_ScrollFastUp, KS_Prior,
119    KC(76),			KS_Delete,
120    KC(77),			KS_End,
121    KC(78), KS_Cmd_ScrollFastDown, KS_Next,
122    KC(79),			KS_Right,
123    KC(80),			KS_Left,
124    KC(81),			KS_Down,
125    KC(82),			KS_Up,
126    KC(83), 			KS_Num_Lock,
127    KC(84),			KS_KP_Divide,
128    KC(85), 			KS_KP_Multiply,
129    KC(86), 			KS_KP_Subtract,
130    KC(87), 			KS_KP_Add,
131    KC(88),			KS_KP_Enter,
132    KC(89), 			KS_KP_End,	KS_KP_1,
133    KC(90), 			KS_KP_Down,	KS_KP_2,
134    KC(91), KS_Cmd_ScrollFastDown, KS_KP_Next,	KS_KP_3,
135    KC(92), 			KS_KP_Left,	KS_KP_4,
136    KC(93), 			KS_KP_Begin,	KS_KP_5,
137    KC(94), 			KS_KP_Right,	KS_KP_6,
138    KC(95), 			KS_KP_Home,	KS_KP_7,
139    KC(96), 			KS_KP_Up,	KS_KP_8,
140    KC(97), KS_Cmd_ScrollFastUp, KS_KP_Prior,	KS_KP_9,
141    KC(98), 			KS_KP_Insert,	KS_KP_0,
142    KC(99), 			KS_KP_Delete,	KS_KP_Decimal,
143    KC(100),			KS_backslash,	KS_bar,
144    KC(101),			KS_Menu,
145/* ... */
146    KC(104), 			KS_f13,
147    KC(105), 			KS_f14,
148    KC(106), 			KS_f15,
149    KC(107), 			KS_f16,
150/* ... */
151    KC(109),			KS_Power,
152/* ... many unmapped keys ... */
153    KC(224),  KS_Cmd1,		KS_Control_L,
154    KC(225), 			KS_Shift_L,
155    KC(226),  KS_Cmd2,		KS_Alt_L,
156    KC(227),			KS_Meta_L,
157    KC(228),			KS_Control_R,
158    KC(229), 			KS_Shift_R,
159    KC(230),			KS_Alt_R,	KS_Multi_key,
160    KC(231),			KS_Meta_R,
161};
162
163Static const keysym_t hidkbd_keydesc_jp[] = {
164/*  pos      command		normal			shifted */
165    KC(31),  			KS_2,			KS_quotedbl,
166    KC(35),  			KS_6,			KS_ampersand,
167    KC(36),  			KS_7,			KS_apostrophe,
168    KC(37),  			KS_8,			KS_parenleft,
169    KC(38), 			KS_9,			KS_parenright,
170    KC(39), 			KS_0,
171    KC(45),			KS_minus,		KS_equal,
172    KC(46),			KS_asciicircum,		KS_asciitilde,
173    KC(47),			KS_at,			KS_grave,
174    KC(48),			KS_bracketleft,		KS_braceleft,
175    KC(49), /* ARCHISS */	KS_bracketright,	KS_braceright,
176    KC(50), /* other model */	KS_bracketright,	KS_braceright,
177    KC(51),			KS_semicolon,		KS_plus,
178    KC(52),			KS_colon,		KS_asterisk,
179    KC(53), 			KS_Zenkaku_Hankaku, /* replace grave/tilde */
180    KC(135),			KS_backslash,		KS_underscore,
181    KC(136),			KS_Hiragana_Katakana,
182    KC(137),			KS_backslash,		KS_bar,
183    KC(138),			KS_Henkan,
184    KC(139),			KS_Muhenkan,
185};
186
187Static const keysym_t hidkbd_keydesc_us_dvorak[] = {
188/*  pos      command		normal			shifted */
189    KC(4), 			KS_a,
190    KC(5), 			KS_x,
191    KC(6), 			KS_j,
192    KC(7), 			KS_e,
193    KC(8), 			KS_period,		KS_greater,
194    KC(9), 			KS_u,
195    KC(10), 			KS_i,
196    KC(11), 			KS_d,
197    KC(12), 			KS_c,
198    KC(13), 			KS_h,
199    KC(14), 			KS_t,
200    KC(15), 			KS_n,
201    KC(16), 			KS_m,
202    KC(17), 			KS_b,
203    KC(18), 			KS_r,
204    KC(19), 			KS_l,
205    KC(20), 			KS_apostrophe,		KS_quotedbl,
206    KC(21), 			KS_p,
207    KC(22), 			KS_o,
208    KC(23), 			KS_y,
209    KC(24), 			KS_g,
210    KC(25), 			KS_k,
211    KC(26), 			KS_comma,		KS_less,
212    KC(27), 			KS_q,
213    KC(28), 			KS_f,
214    KC(29), 			KS_semicolon,		KS_colon,
215    KC(45), 			KS_bracketleft,		KS_braceleft,
216    KC(46), 			KS_bracketright,	KS_braceright,
217    KC(47), 			KS_slash,		KS_question,
218    KC(48), 			KS_equal,		KS_plus,
219    KC(51), 			KS_s,
220    KC(52), 			KS_minus,		KS_underscore,
221    KC(54), 			KS_w,
222    KC(55), 			KS_v,
223    KC(56), 			KS_z,
224};
225
226Static const keysym_t hidkbd_keydesc_us_colemak[] = {
227/*  pos      command		normal		shifted */
228    KC(4), 			KS_a,		KS_A,		KS_aacute,	KS_Aacute,
229    KC(5), 			KS_b,		KS_B,		KS_asciitilde,	KS_asciitilde,
230    KC(6), 			KS_c,		KS_C,		KS_ccedilla,	KS_Ccedilla,
231    KC(7), 			KS_s,		KS_S,		KS_ssharp,	KS_asciitilde,
232    KC(8), 			KS_f,		KS_F,		KS_atilde,	KS_Atilde,
233    KC(9), 			KS_t,		KS_T,		KS_dead_acute,	KS_asciitilde,
234    KC(10), 			KS_d,		KS_D,		KS_dead_diaeresis, KS_asciitilde,
235    KC(11), 			KS_h,		KS_H,		KS_asciitilde,	KS_asciitilde,
236    KC(12), 			KS_u,		KS_U,		KS_uacute,	KS_Uacute,
237    KC(13), 			KS_n,		KS_N,		KS_ntilde,	KS_Ntilde,
238    KC(14), 			KS_e,		KS_E,		KS_eacute,	KS_Eacute,
239    KC(15), 			KS_i,		KS_I,		KS_iacute,	KS_Iacute,
240    KC(16), 			KS_m,		KS_M,		KS_asciitilde,	KS_asciitilde,
241    KC(17), 			KS_k,		KS_K,		KS_asciitilde,	KS_asciitilde,
242    KC(18), 			KS_y,		KS_Y,		KS_udiaeresis,	KS_Udiaeresis,
243    KC(19), 			KS_semicolon,	KS_colon,	KS_odiaeresis,	KS_Odiaeresis,
244    KC(20), 			KS_q,		KS_Q,		KS_adiaeresis,	KS_Adiaeresis,
245    KC(21), 			KS_p,		KS_P,		KS_oslash,	KS_Ooblique,
246    KC(22), 			KS_r,		KS_R,		KS_dead_grave,	KS_asciitilde,
247    KC(23), 			KS_g,		KS_G,		KS_asciitilde,	KS_asciitilde,
248    KC(24), 			KS_l,		KS_L,		KS_asciitilde,	KS_asciitilde,
249    KC(25), 			KS_v,		KS_V,		KS_asciitilde,	KS_asciitilde,
250    KC(26), 			KS_w,		KS_W,		KS_aring,	KS_Aring,
251    KC(27), 			KS_x,		KS_X,		KS_dead_circumflex, KS_asciitilde,
252    KC(28), 			KS_j,		KS_J,		KS_asciitilde,	KS_asciitilde,
253    KC(29), 			KS_z,		KS_Z,		KS_ae,		KS_AE,
254    KC(30),  			KS_1,		KS_exclam,	KS_exclamdown,	KS_onesuperior,
255    KC(31),  			KS_2,		KS_at,		KS_masculine,	KS_twosuperior,
256    KC(32),  			KS_3,		KS_numbersign,	KS_ordfeminine,	KS_threesuperior,
257    KC(33),  			KS_4,		KS_dollar,	KS_cent,	KS_sterling,
258    KC(34),  			KS_5,		KS_percent,	KS_asciitilde,	KS_yen,
259    KC(35),  			KS_6,		KS_asciicircum,	KS_asciitilde,	KS_asciitilde,
260    KC(36),  			KS_7,		KS_ampersand,	KS_eth,		KS_ETH,
261    KC(37),  			KS_8,		KS_asterisk,	KS_thorn,	KS_THORN,
262    KC(38), 			KS_9,		KS_parenleft,	KS_asciitilde,	KS_asciitilde,
263    KC(39), 			KS_0,		KS_parenright,	KS_asciitilde,	KS_asciitilde,
264    KC(44), 			KS_space,	KS_space,	KS_space,	KS_nobreakspace,
265    KC(45), 			KS_minus,	KS_underscore,	KS_asciitilde,	KS_asciitilde,
266    KC(46), 			KS_equal,	KS_plus,	KS_multiply,	KS_division,
267    KC(47), 			KS_bracketleft,	KS_braceleft,	KS_guillemotleft, KS_asciitilde,
268    KC(48), 			KS_bracketright, KS_braceright,	KS_guillemotright, KS_asciitilde,
269    KC(49), 			KS_backslash,	KS_bar,		KS_asciitilde,	KS_asciitilde,
270    KC(50), 			KS_backslash,	KS_bar,		KS_asciitilde,	KS_asciitilde,
271    KC(51), 			KS_o,		KS_O,		KS_oacute,	KS_Oacute,
272    KC(52), 			KS_apostrophe,	KS_quotedbl,	KS_otilde,	KS_Otilde,
273    KC(53), 			KS_grave,	KS_asciitilde,	KS_dead_tilde,	KS_asciitilde,
274    KC(54), 			KS_comma,	KS_less,	KS_dead_cedilla, KS_asciitilde,
275    KC(55), 			KS_period,	KS_greater,	KS_asciitilde,	KS_asciitilde,
276    KC(56), 			KS_slash,	KS_question,	KS_questiondown, KS_asciitilde,
277    KC(57), 			KS_BackSpace,
278    KC(100), 			KS_minus,	KS_underscore,	KS_asciitilde,	KS_asciitilde,
279    KC(230), KS_Mode_switch,	KS_Multi_key,
280};
281
282Static const keysym_t hidkbd_keydesc_swapctrlcaps[] = {
283/*  pos      command		normal		shifted */
284    KC(57),  KS_Cmd1,		KS_Control_L,
285    KC(224), 			KS_Caps_Lock,
286};
287
288/* switch screens using Command-F* as on ADB keyboards */
289Static const keysym_t hidkbd_keydesc_apple[] = {
290/*  pos      command		normal		shifted */
291    KC(224),			KS_Control_L,
292    KC(226),			KS_Alt_L,
293    KC(227),  KS_Cmd,		KS_Meta_L,
294};
295
296Static const keysym_t hidkbd_keydesc_de[] = {
297/*  pos      normal		shifted		altgr		shift-altgr */
298    KC(16),  KS_m,		KS_M,		KS_mu,
299    KC(20),  KS_q,		KS_Q,		KS_at,
300    KC(28),  KS_z,
301    KC(29),  KS_y,
302    KC(31),  KS_2,		KS_quotedbl,	KS_twosuperior,
303    KC(32),  KS_3,		KS_section,	KS_threesuperior,
304    KC(35),  KS_6,		KS_ampersand,
305    KC(36),  KS_7,		KS_slash,	KS_braceleft,
306    KC(37),  KS_8,		KS_parenleft,	KS_bracketleft,
307    KC(38),  KS_9,		KS_parenright,	KS_bracketright,
308    KC(39),  KS_0,		KS_equal,	KS_braceright,
309    KC(45),  KS_ssharp,		KS_question,	KS_backslash,
310    KC(46),  KS_dead_acute,	KS_dead_grave,
311    KC(47),  KS_udiaeresis,
312    KC(48),  KS_plus,		KS_asterisk,	KS_dead_tilde,
313    KC(50),  KS_numbersign,	KS_apostrophe,
314    KC(51),  KS_odiaeresis,
315    KC(52),  KS_adiaeresis,
316    KC(53),  KS_dead_circumflex,KS_dead_abovering,
317    KC(54),  KS_comma,		KS_semicolon,
318    KC(55),  KS_period,		KS_colon,
319    KC(56),  KS_minus,		KS_underscore,
320    KC(100), KS_less,		KS_greater,	KS_bar,		KS_brokenbar,
321    KC(230), KS_Mode_switch,	KS_Multi_key,
322};
323
324Static const keysym_t hidkbd_keydesc_de_nodead[] = {
325/*  pos      normal		shifted		altgr		shift-altgr */
326    KC(46),  KS_apostrophe,	KS_grave,
327    KC(48),  KS_plus,		KS_asterisk,	KS_asciitilde,
328    KC(53),  KS_asciicircum,	KS_degree,
329};
330
331Static const keysym_t hidkbd_keydesc_de_neo[] = {
332/*  pos     normal		shifted 	layer 3		layer 4 */
333    KC(53),  KS_dead_circumflex,	KS_dead_caron,
334    KC(30),  KS_1,		KS_degree,	KS_onesuperior,	KS_ordfeminine,
335    KC(31),  KS_2,		KS_section,	KS_twosuperior,	KS_masculine,
336    KC(32),  KS_3,		KS_l,		KS_threesuperior,KS_numbersign,
337    KC(33),  KS_4,		KS_guillemotright,KS_greater,
338    KC(34),  KS_5,		KS_guillemotleft,KS_less,	KS_periodcentered,
339    KC(35),  KS_6,		KS_dollar,	KS_cent,	KS_sterling,
340    KC(36),  KS_7,		KS_currency,	KS_yen,		KS_currency,
341    KC(37),  KS_8,		KS_quotedbl,	KS_quotedbl,	KS_Tab,
342    KC(38),  KS_9,		KS_quotedbl,	KS_quotedbl,	KS_KP_Divide,
343    KC(39),  KS_0,		KS_quotedbl,	KS_quotedbl,	KS_KP_Multiply,
344    KC(45),  KS_minus,		KS_hyphen,	KS_minus,	KS_minus,
345    KC(46),  KS_dead_grave,	KS_dead_cedilla,KS_dead_abovering,
346    KC(20),  KS_x,		KS_X,		KS_period,	KS_Prior,
347    KC(26),  KS_v,		KS_V,		KS_underscore,	KS_BackSpace,
348    KC(8),   KS_l,		KS_L,		KS_bracketleft,	KS_Up,
349    KC(21),  KS_c,		KS_C,		KS_bracketright,KS_Delete,
350    KC(23),  KS_w,		KS_W,		KS_asciicircum,	KS_Next,
351    KC(28),  KS_k,		KS_K,		KS_exclam,	KS_exclamdown,
352    KC(24),  KS_h,		KS_H,		KS_less,	KS_KP_7,
353    KC(12),  KS_g,		KS_G,		KS_greater,	KS_KP_8,
354    KC(18),  KS_f,		KS_F,		KS_equal,	KS_KP_9,
355    KC(19),  KS_q,		KS_Q,		KS_ampersand,	KS_KP_Add,
356    KC(47),  KS_ssharp,		KS_ssharp,	KS_f,		KS_KP_Subtract,
357    KC(48),  KS_dead_acute,	KS_dead_tilde,
358    KC(4),   KS_u,		KS_U,		KS_backslash,	KS_Home,
359    KC(22),  KS_i,		KS_I,		KS_slash,	KS_Left,
360    KC(7),   KS_a,		KS_A,		KS_braceleft,	KS_Down,
361    KC(9),   KS_e,		KS_E,		KS_braceright,	KS_Right,
362    KC(10),  KS_o,		KS_O,		KS_asterisk,	KS_End,
363    KC(11),  KS_s,		KS_S,		KS_question,	KS_questiondown,
364    KC(13),  KS_n,		KS_N,		KS_parenleft,	KS_KP_4,
365    KC(14),  KS_r,		KS_R,		KS_parenright,	KS_KP_5,
366    KC(15),  KS_t,		KS_T,		KS_minus,	KS_KP_6,
367    KC(51),  KS_d,		KS_D,		KS_colon,	KS_KP_Separator,
368    KC(52),  KS_y,		KS_Y,		KS_at,		KS_KP_Decimal,
369    KC(29),  KS_udiaeresis,	KS_Udiaeresis,	KS_numbersign,	KS_Escape,
370    KC(27),  KS_odiaeresis,	KS_Odiaeresis,	KS_dollar,	KS_Tab,
371    KC(6),   KS_adiaeresis,	KS_Adiaeresis,	KS_bar,		KS_Insert,
372    KC(25),  KS_p,		KS_P,		KS_asciitilde,	KS_Return,
373    KC(5),   KS_z,		KS_Z,		KS_grave,	KS_Undo,
374    KC(17),  KS_b,		KS_B,		KS_plus,	KS_colon,
375    KC(16),  KS_m,		KS_M,		KS_percent,	KS_KP_1,
376    KC(54),  KS_comma,		KS_minus,	KS_quotedbl,	KS_KP_2,
377    KC(55),  KS_period,		KS_period,	KS_apostrophe,	KS_KP_3,
378    KC(56),  KS_j,		KS_J,		KS_semicolon,	KS_semicolon,
379    KC(50),  KS_Mode_switch,	KS_Multi_key,
380    KC(57),  KS_Mode_switch,	KS_Multi_key,
381    KC(100), KS_Mode_switch,	KS_Multi_key,
382    KC(230), KS_Mode_switch,	KS_Multi_key,
383};
384
385Static const keysym_t hidkbd_keydesc_dk[] = {
386/*  pos      normal		shifted		altgr		shift-altgr */
387    KC(31),  KS_2,		KS_quotedbl,	KS_at,
388    KC(32),  KS_3,		KS_numbersign,	KS_sterling,
389    KC(33),  KS_4,		KS_currency,	KS_dollar,
390    KC(35),  KS_6,		KS_ampersand,
391    KC(36),  KS_7,		KS_slash,	KS_braceleft,
392    KC(37),  KS_8,		KS_parenleft,	KS_bracketleft,
393    KC(38),  KS_9,		KS_parenright,	KS_bracketright,
394    KC(39),  KS_0,		KS_equal,	KS_braceright,
395    KC(45),  KS_plus,		KS_question,
396    KC(46),  KS_dead_acute,	KS_dead_grave,	KS_bar,
397    KC(47),  KS_aring,
398    KC(48),  KS_dead_diaeresis,	KS_dead_circumflex, KS_dead_tilde,
399    KC(50),  KS_apostrophe,	KS_asterisk,
400    KC(51),  KS_ae,
401    KC(52),  KS_oslash,
402    KC(53),  KS_onehalf,	KS_paragraph,
403    KC(54),  KS_comma,		KS_semicolon,
404    KC(55),  KS_period,		KS_colon,
405    KC(56),  KS_minus,		KS_underscore,
406    KC(100), KS_less,		KS_greater,	KS_backslash,
407    KC(230), KS_Mode_switch,	KS_Multi_key,
408};
409
410Static const keysym_t hidkbd_keydesc_dk_nodead[] = {
411/*  pos      normal		shifted		altgr		shift-altgr */
412    KC(46),  KS_apostrophe,	KS_grave,	KS_bar,
413    KC(48),  KS_diaeresis,	KS_asciicircum,	KS_asciitilde,
414};
415
416Static const keysym_t hidkbd_keydesc_sv[] = {
417/*  pos      normal		shifted		altgr		shift-altgr */
418    KC(45),  KS_plus,		KS_question,	KS_backslash,
419    KC(48),  KS_dead_diaeresis,	KS_dead_circumflex, KS_dead_tilde,
420    KC(50),  KS_apostrophe,	KS_asterisk,
421    KC(51),  KS_odiaeresis,
422    KC(52),  KS_adiaeresis,
423    KC(53),  KS_paragraph,	KS_onehalf,
424    KC(100), KS_less,		KS_greater,	KS_bar,
425    KC(230), KS_Mode_switch,	KS_Multi_key,
426};
427
428Static const keysym_t hidkbd_keydesc_sv_nodead[] = {
429/*  pos      normal		shifted		altgr		shift-altgr */
430    KC(46),  KS_apostrophe,	KS_grave,	KS_bar,
431    KC(48),  KS_diaeresis,	KS_asciicircum,	KS_asciitilde,
432};
433
434Static const keysym_t hidkbd_keydesc_ee[] = {
435/*  pos      normal             shifted         altgr                   shift-altgr */
436    KC(22),  KS_s,		KS_S,		KS_scaron,		KS_Scaron,
437    KC(29),  KS_z,		KS_Z,		KS_zcaron,		KS_Zcaron,
438    KC(47),  KS_udiaeresis,	KS_Udiaeresis,	KS_dead_diaeresis,	KS_dead_abovering,
439    KC(48),  KS_otilde,		KS_Otilde,	KS_section,
440    KC(50),  KS_apostrophe,	KS_asterisk,	KS_onehalf,		KS_dead_breve,
441    KC(52),  KS_adiaeresis,	KS_Adiaeresis,	KS_asciicircum,		KS_dead_caron,
442    KC(53),  KS_dead_caron,	KS_dead_tilde,	KS_notsign,		KS_notsign,
443};
444
445Static const keysym_t hidkbd_keydesc_ee_nodead[] = {
446/*  pos      normal		shifted		altgr		shift-altgr */
447    KC(53),  KS_asciicircum,	KS_asciitilde,	KS_notsign,	KS_notsign,
448};
449
450Static const keysym_t hidkbd_keydesc_no[] = {
451/*  pos      normal		shifted		altgr		shift-altgr */
452    KC(46),  KS_backslash,	KS_dead_grave,	KS_dead_acute,
453    KC(48),  KS_dead_diaeresis,	KS_dead_circumflex, KS_dead_tilde,
454    KC(50),  KS_comma,		KS_asterisk,
455    KC(51),  KS_oslash,
456    KC(52),  KS_ae,
457    KC(53),  KS_bar,		KS_paragraph,
458    KC(100), KS_less,		KS_greater,
459};
460
461Static const keysym_t hidkbd_keydesc_no_nodead[] = {
462/*  pos      normal		shifted		altgr		shift-altgr */
463    KC(46),  KS_backslash,	KS_grave,	KS_acute,
464    KC(48),  KS_diaeresis,	KS_asciicircum,	KS_asciitilde,
465};
466
467Static const keysym_t hidkbd_keydesc_fr[] = {
468/*  pos	     normal		shifted		altgr		shift-altgr */
469    KC(4),   KS_q,
470    KC(16),  KS_comma,		KS_question,
471    KC(20),  KS_a,
472    KC(26),  KS_z,
473    KC(29),  KS_w,
474    KC(30),  KS_ampersand,	KS_1,
475    KC(31),  KS_eacute,		KS_2,		KS_asciitilde,
476    KC(32),  KS_quotedbl,	KS_3,		KS_numbersign,
477    KC(33),  KS_apostrophe,	KS_4,		KS_braceleft,
478    KC(34),  KS_parenleft,	KS_5,		KS_bracketleft,
479    KC(35),  KS_minus,		KS_6,		KS_bar,
480    KC(36),  KS_egrave,		KS_7,		KS_grave,
481    KC(37),  KS_underscore,	KS_8,		KS_backslash,
482    KC(38),  KS_ccedilla,	KS_9,		KS_asciicircum,
483    KC(39),  KS_agrave,		KS_0,		KS_at,
484    KC(45),  KS_parenright,	KS_degree,	KS_bracketright,
485    KC(46),  KS_equal,		KS_plus,	KS_braceright,
486    KC(47),  KS_dead_circumflex, KS_dead_diaeresis,
487    KC(48),  KS_dollar,		KS_sterling,	KS_currency,
488    KC(50),  KS_asterisk,	KS_mu,
489    KC(51),  KS_m,
490    KC(52),  KS_ugrave,		KS_percent,
491    KC(53),  KS_twosuperior,
492    KC(54),  KS_semicolon,	KS_period,
493    KC(55),  KS_colon,		KS_slash,
494    KC(56),  KS_exclam,		KS_section,
495    KC(100), KS_less,		KS_greater,
496    KC(230), KS_Mode_switch,	KS_Multi_key,
497};
498
499Static const keysym_t hidkbd_keydesc_fr_bepo[] = {
500/*  pos	    normal		shifted		altgr		shift-altgr */
501    KC(53),  KS_dollar,		KS_numbersign,
502    KC(30),  KS_quotedbl,	KS_1,
503    KC(31),  KS_guillemotleft,	KS_2,		KS_less,
504    KC(32),  KS_guillemotright,	KS_3,		KS_greater,
505    KC(33),  KS_parenleft,	KS_4,		KS_bracketleft,
506    KC(34),  KS_parenright,	KS_5,		KS_bracketright,
507    KC(35),  KS_at,		KS_6,		KS_asciicircum,
508    KC(36),  KS_plus,		KS_7,		KS_plusminus,
509    KC(37),  KS_minus,		KS_8,
510    KC(38),  KS_slash,		KS_9,		KS_division,
511    KC(39),  KS_asterisk,	KS_0,		KS_multiply,
512    KC(45),  KS_equal,		KS_degree,
513    KC(46),  KS_percent,	KS_grave,
514    KC(20),  KS_b,		KS_B,		KS_bar,		KS_underscore,
515    KC(26),  KS_eacute,		KS_Eacute,	KS_dead_acute,
516    KC(8),   KS_p,		KS_P,		KS_ampersand,	KS_section,
517    KC(21),  KS_o,		KS_O,
518    KC(23),  KS_egrave,		KS_Egrave,	KS_dead_grave,	KS_grave,
519    KC(28),  KS_dead_circumflex,KS_exclam,	KS_exclamdown,
520    KC(24),  KS_v,		KS_V,		KS_dead_caron,
521    KC(12),  KS_d,		KS_D,
522    KC(18),  KS_l,		KS_L,		KS_sterling,
523    KC(19),  KS_j,		KS_J,
524    KC(47),  KS_z,		KS_Z,
525    KC(48),  KS_w,		KS_W,
526    KC(4),   KS_a,		KS_A,		KS_ae,		KS_AE,
527    KC(22),  KS_u,		KS_U,		KS_ugrave,	KS_Ugrave,
528    KC(7),   KS_i,		KS_I,		KS_dead_diaeresis,
529    KC(9),   KS_e,		KS_E,		KS_currency,
530    KC(10),  KS_comma,		KS_semicolon,	KS_apostrophe,
531    KC(11),  KS_c,		KS_C,		KS_dead_cedilla,KS_copyright,
532    KC(13),  KS_t,		KS_T,
533    KC(14),  KS_s,		KS_S,
534    KC(15),  KS_r,		KS_R,		KS_dead_breve,	KS_registered,
535    KC(51),  KS_n,		KS_N,		KS_dead_tilde,
536    KC(52),  KS_m,		KS_M,
537    KC(50),  KS_ccedilla,	KS_Ccedilla,
538    KC(29),  KS_agrave,		KS_Agrave,	KS_backslash,
539    KC(27),  KS_y,		KS_Y,		KS_braceleft,
540    KC(6),   KS_x,		KS_X,		KS_braceright,
541    KC(25),  KS_period,		KS_colon,
542    KC(5),   KS_k,		KS_K,		KS_asciitilde,
543    KC(17),  KS_apostrophe,	KS_question,	KS_questiondown,
544    KC(16),  KS_q,		KS_Q,		KS_dead_abovering,
545    KC(54),  KS_g,		KS_G,
546    KC(55),  KS_h,		KS_H,
547    KC(56),  KS_f,		KS_F,		KS_dead_ogonek,
548    KC(44),  KS_space,		KS_space,	KS_underscore,	KS_nobreakspace,
549    KC(100), KS_ecircumflex,	KS_Ecircumflex,	KS_slash,	KS_asciicircum,
550    KC(230), KS_Mode_switch,	KS_Multi_key,
551};
552
553Static const keysym_t hidkbd_keydesc_be[] = {
554/*  pos	     normal		shifted		altgr		shift-altgr */
555    KC(30),  KS_ampersand,	KS_1,		KS_bar,
556    KC(31),  KS_eacute,		KS_2,		KS_at,
557    KC(33),  KS_apostrophe,	KS_4,
558    KC(34),  KS_parenleft,	KS_5,
559    KC(35),  KS_section,	KS_6,		KS_asciicircum,
560    KC(36),  KS_egrave,		KS_7,
561    KC(37),  KS_exclam,		KS_8,
562    KC(38),  KS_ccedilla,	KS_9,		KS_braceleft,
563    KC(39),  KS_agrave,		KS_0,		KS_braceright,
564    KC(45),  KS_parenright,	KS_degree,
565    KC(46),  KS_minus,		KS_underscore,
566    KC(47),  KS_dead_circumflex, KS_dead_diaeresis,	KS_bracketleft,
567    KC(48),  KS_dollar,		KS_asterisk,	KS_bracketright,
568    KC(50),  KS_mu,		KS_sterling,	KS_grave,
569    KC(52),  KS_ugrave,		KS_percent,	KS_acute,
570    KC(53),  KS_twosuperior,	KS_threesuperior,
571    KC(56),  KS_equal,		KS_plus,	KS_asciitilde,
572    KC(100), KS_less,		KS_greater,	KS_backslash,
573};
574
575Static const keysym_t hidkbd_keydesc_it[] = {
576/*  pos      normal		shifted		altgr		shift-altgr */
577    KC(31),  KS_2,	    	KS_quotedbl,	KS_twosuperior,
578    KC(32),  KS_3,	    	KS_sterling,	KS_threesuperior,
579    KC(33),  KS_4,	    	KS_dollar,
580    KC(34),  KS_5,	    	KS_percent,
581    KC(35),  KS_6,	    	KS_ampersand,
582    KC(36),  KS_7,	    	KS_slash,
583    KC(37),  KS_8,	    	KS_parenleft,
584    KC(38),  KS_9,	    	KS_parenright,
585    KC(39),  KS_0,	    	KS_equal,
586    KC(45),  KS_apostrophe,	KS_question,
587    KC(46),  KS_igrave,	    	KS_asciicircum,
588    KC(47),  KS_egrave,		KS_eacute,	KS_braceleft,	KS_bracketleft,
589    KC(48),  KS_plus,		KS_asterisk,	KS_braceright,	KS_bracketright,
590    KC(49),  KS_ugrave,		KS_section,
591    KC(51),  KS_ograve,		KS_Ccedilla,	KS_at,
592    KC(52),  KS_agrave,		KS_degree,	KS_numbersign,
593    KC(53),  KS_backslash,	KS_bar,
594    KC(54),  KS_comma,		KS_semicolon,
595    KC(55),  KS_period,		KS_colon,
596    KC(56),  KS_minus,		KS_underscore,
597    KC(100), KS_less,		KS_greater,
598    KC(230), KS_Mode_switch,	KS_Multi_key,
599};
600
601Static const keysym_t hidkbd_keydesc_uk[] = {
602/*  pos      normal             shifted         altgr           shift-altgr */
603    KC(30),  KS_1,              KS_exclam,      KS_plusminus,   KS_exclamdown,
604    KC(31),  KS_2,              KS_quotedbl,    KS_twosuperior, KS_cent,
605    KC(32),  KS_3,              KS_sterling,    KS_threesuperior,
606    KC(33),  KS_4,              KS_dollar,      KS_acute,       KS_currency,
607    KC(34),  KS_5,              KS_percent,     KS_mu,          KS_yen,
608    KC(35),  KS_6,              KS_asciicircum, KS_paragraph,
609    KC(36),  KS_7,              KS_ampersand,   KS_periodcentered, KS_brokenbar,
610    KC(37),  KS_8,              KS_asterisk,    KS_cedilla,     KS_ordfeminine,
611    KC(38),  KS_9,              KS_parenleft,   KS_onesuperior, KS_diaeresis,
612    KC(39),  KS_0,              KS_parenright,  KS_masculine,   KS_copyright,
613    KC(45),  KS_minus,          KS_underscore,  KS_hyphen,      KS_ssharp,
614    KC(46),  KS_equal,          KS_plus,        KS_onehalf,    KS_guillemotleft,
615    KC(49),  KS_numbersign,     KS_asciitilde,  KS_sterling,    KS_thorn,
616    KC(50),  KS_numbersign,	KS_asciitilde,
617    KC(52),  KS_apostrophe,     KS_at,          KS_section,     KS_Agrave,
618    KC(53),  KS_grave,          KS_grave,       KS_agrave,      KS_agrave,
619    KC(100), KS_backslash,      KS_bar,         KS_Udiaeresis,
620};
621
622Static const keysym_t hidkbd_keydesc_es[] = {
623/*  pos      normal		shifted		altgr		shift-altgr */
624    KC(30),  KS_1,		KS_exclam,	KS_bar,
625    KC(31),  KS_2,		KS_quotedbl,	KS_at,
626    KC(32),  KS_3,		KS_periodcentered, KS_numbersign,
627    KC(33),  KS_4,		KS_dollar,	KS_asciitilde,
628    KC(35),  KS_6,		KS_ampersand,
629    KC(36),  KS_7,		KS_slash,
630    KC(37),  KS_8,		KS_parenleft,
631    KC(38),  KS_9,		KS_parenright,
632    KC(39),  KS_0,		KS_equal,
633    KC(45),  KS_apostrophe,	KS_question,
634    KC(46),  KS_exclamdown,	KS_questiondown,
635    KC(47),  KS_dead_grave,	KS_dead_circumflex, KS_bracketleft,
636    KC(48),  KS_plus,		KS_asterisk,	KS_bracketright,
637    KC(49),  KS_ccedilla,	KS_Ccedilla,	KS_braceright,
638    KC(50),  KS_ccedilla,	KS_Ccedilla,	KS_braceright,
639    KC(51),  KS_ntilde,
640    KC(52),  KS_dead_acute,	KS_dead_diaeresis, KS_braceleft,
641    KC(53),  KS_degree,		KS_ordfeminine,	KS_backslash,
642    KC(54),  KS_comma,		KS_semicolon,
643    KC(55),  KS_period,		KS_colon,
644    KC(56),  KS_minus,		KS_underscore,
645    KC(100), KS_less,		KS_greater,
646    KC(230), KS_Mode_switch,	KS_Multi_key,
647};
648
649Static const keysym_t hidkbd_keydesc_pt[] = {
650/*  pos      normal		shifted		altgr		shift-altgr */
651    KC(31),  KS_2,		KS_quotedbl,	KS_at,
652    KC(32),  KS_3,		KS_numbersign,	KS_sterling,
653    KC(35),  KS_6,		KS_ampersand,
654    KC(36),  KS_7,		KS_slash,	KS_braceleft,
655    KC(37),  KS_8,		KS_parenleft,	KS_bracketleft,
656    KC(38),  KS_9,		KS_parenright,	KS_bracketright,
657    KC(39),  KS_0,		KS_equal,	KS_braceright,
658    KC(45),  KS_apostrophe,	KS_question,
659    KC(46),  KS_plus,		KS_asterisk,
660    KC(47),  KS_plus,		KS_asterisk,
661    KC(48),  KS_dead_acute,	KS_dead_grave,
662    KC(49),  KS_less,		KS_greater,
663    KC(50),  KS_dead_tilde,	KS_dead_circumflex,
664    KC(51),  KS_ccedilla,	KS_Ccedilla,
665    KC(52),  KS_masculine,	KS_ordfeminine,
666    KC(53),  KS_backslash,	KS_bar,
667    KC(54),  KS_comma,		KS_semicolon,
668    KC(55),  KS_period,		KS_colon,
669    KC(56),  KS_minus,		KS_underscore,
670    KC(100), KS_less,		KS_greater,
671    KC(226), KS_Mode_switch,	KS_Multi_key,
672    KC(230), KS_Mode_switch,	KS_Multi_key,
673};
674
675Static const keysym_t hidkbd_keydesc_sg[] = {
676/*  pos      normal		shifted		altgr		shift-altgr */
677    KC(30),  KS_1,		KS_plus,	KS_bar,
678    KC(31),  KS_2,		KS_quotedbl,	KS_at,
679    KC(32),  KS_3,		KS_asterisk,	KS_numbersign,
680    KC(33),  KS_4,		KS_ccedilla,
681    KC(35),  KS_6,		KS_ampersand,	KS_notsign,
682    KC(36),  KS_7,		KS_slash,	KS_brokenbar,
683    KC(37),  KS_8,		KS_parenleft,	KS_cent,
684    KC(38),  KS_9,		KS_parenright,
685    KC(39),  KS_0,		KS_equal,
686    KC(45),  KS_apostrophe,	KS_question,	KS_dead_acute,
687    KC(46),  KS_dead_circumflex,KS_dead_grave,	KS_dead_tilde,
688    KC(8),   KS_e,		KS_E,		KS_currency,
689    KC(28),  KS_z,
690    KC(47),  KS_udiaeresis,	KS_egrave,	KS_bracketleft,
691    KC(48),  KS_dead_diaeresis,	KS_exclam,	KS_bracketright,
692    KC(51),  KS_odiaeresis,	KS_eacute,
693    KC(52),  KS_adiaeresis,	KS_agrave,	KS_braceleft,
694    KC(53),  KS_section,	KS_degree,	KS_dead_abovering,
695    KC(50),  KS_dollar,		KS_sterling,	KS_braceright,
696    KC(29),  KS_y,
697    KC(54),  KS_comma,		KS_semicolon,
698    KC(55),  KS_period,		KS_colon,
699    KC(56),  KS_minus,		KS_underscore,
700    KC(100), KS_less,		KS_greater,	KS_backslash,
701    KC(230), KS_Mode_switch,	KS_Multi_key,
702};
703
704Static const keysym_t hidkbd_keydesc_sg_nodead[] = {
705/*  pos      normal		shifted		altgr		shift-altgr */
706    KC(45),  KS_apostrophe,	KS_question,	KS_acute,
707    KC(46),  KS_asciicircum,	KS_grave,	KS_asciitilde,
708    KC(48),  KS_diaeresis,	KS_exclam,	KS_bracketright
709};
710
711Static const keysym_t hidkbd_keydesc_sf[] = {
712/*  pos      normal            shifted         altgr           shift-altgr */
713    KC(47),  KS_egrave,        KS_udiaeresis,  KS_bracketleft,
714    KC(51),  KS_eacute,        KS_odiaeresis,
715    KC(52),  KS_agrave,        KS_adiaeresis,  KS_braceleft
716};
717
718static const keysym_t hidkbd_keydesc_hu[] = {
719/*  pos      normal		shifted		altgr		shift-altgr */
720    KC(5),   KS_b,		KS_B,		KS_braceleft,
721    KC(6),   KS_c,		KS_C,		KS_ampersand,
722    KC(9),   KS_f,		KS_F,		KS_bracketleft,
723    KC(10),  KS_g,		KS_G,		KS_bracketright,
724    KC(17),  KS_n,		KS_N,		KS_braceright,
725    KC(20),  KS_q,		KS_Q,		KS_backslash,
726    KC(25),  KS_v,		KS_V,		KS_at,
727    KC(26),  KS_w,		KS_W,		KS_bar,
728    KC(27),  KS_x,		KS_X,		KS_numbersign,
729    KC(28),  KS_z,
730    KC(29),  KS_y,		KS_Y,		KS_greater,
731    KC(30),  KS_1,		KS_apostrophe,	KS_asciitilde,
732    KC(31),  KS_2,		KS_quotedbl,	KS_dead_caron,
733    KC(32),  KS_3,		KS_plus,	KS_asciicircum,
734    KC(33),  KS_4,		KS_exclam,	KS_dead_breve,
735    KC(34),  KS_5,		KS_percent,	KS_dead_abovering,
736    KC(35),  KS_6,		KS_slash,	KS_dead_ogonek,
737    KC(36),  KS_7,		KS_equal,	KS_grave,
738    KC(37),  KS_8,		KS_parenleft,	KS_dead_dotaccent,
739    KC(38),  KS_9,		KS_parenright,	KS_dead_acute,
740    KC(39),  KS_odiaeresis,	KS_Odiaeresis,	KS_dead_hungarumlaut,
741    KC(45),  KS_udiaeresis,	KS_Udiaeresis,	KS_dead_diaeresis,
742    KC(46),  KS_oacute,		KS_Oacute,	KS_dead_cedilla,
743    KC(47),  KS_odoubleacute,	KS_Odoubleacute,KS_division,
744    KC(48),  KS_uacute,		KS_Uacute,	KS_multiply,
745    KC(49),  KS_udoubleacute,	KS_Udoubleacute,KS_currency,
746    KC(50),  KS_iacute,		KS_Iacute,	KS_less,
747    KC(51),  KS_eacute,		KS_Eacute,	KS_dollar,
748    KC(52),  KS_aacute,		KS_Aacute,	KS_ssharp,
749    KC(53),  KS_0,		KS_section,
750    KC(54),  KS_comma,		KS_question,	KS_semicolon,
751    KC(55),  KS_period,		KS_colon,
752    KC(56),  KS_minus,		KS_underscore,	KS_asterisk,
753    KC(230), KS_Mode_switch,	KS_Multi_key
754};
755
756static const keysym_t hidkbd_keydesc_br[] = {
757/*  pos      normal             shifted                 altgr                   shift-altgr */
758    KC(6),   KS_c,		KS_C,			KS_copyright,		KS_copyright,
759    KC(8),   KS_e,		KS_E,			KS_currency,		KS_currency,
760    KC(16),  KS_m,		KS_M,			KS_mu,			KS_mu,
761    KC(20),  KS_q,		KS_Q,			KS_slash,		KS_slash,
762    KC(21),  KS_r,		KS_R,			KS_registered,		KS_registered,
763    KC(26),  KS_w,		KS_W,			KS_question,		KS_question,
764    KC(30),  KS_1,		KS_exclam,		KS_onesuperior,		KS_exclamdown,
765    KC(31),  KS_2,		KS_at,			KS_twosuperior,		KS_onehalf,
766    KC(32),  KS_3,		KS_numbersign,		KS_threesuperior,	KS_threequarters,
767    KC(33),  KS_4,		KS_dollar,		KS_sterling,		KS_onequarter,
768    KC(34),  KS_5,		KS_percent,		KS_cent,		KS_cent,
769    KC(35),  KS_6,		KS_dead_diaeresis,	KS_notsign,		KS_diaeresis,
770    KC(46),  KS_equal,		KS_plus,		KS_section,		KS_dead_ogonek,
771    KC(47),  KS_dead_acute,	KS_dead_grave,		KS_acute,		KS_grave,
772    KC(48),  KS_bracketleft,	KS_braceleft,		KS_ordfeminine,		KS_macron,
773    KC(49),  KS_bracketright,	KS_braceright,		KS_masculine,		KS_masculine,
774    KC(50),  KS_bracketright,	KS_braceright,		KS_masculine,		KS_masculine,
775    KC(51),  KS_ccedilla,	KS_Ccedilla,		KS_dead_acute,		KS_dead_hungarumlaut,
776    KC(52),  KS_dead_tilde,	KS_dead_circumflex,	KS_asciitilde,		KS_asciicircum,
777    KC(53),  KS_apostrophe,	KS_quotedbl,		KS_notsign,		KS_notsign,
778    KC(56),  KS_semicolon,	KS_colon,		KS_dead_dotaccent,	KS_abovedot,
779    KC(100), KS_backslash,	KS_bar,			KS_masculine,		KS_dead_breve,
780    KC(135), KS_slash,		KS_question,		KS_degree,		KS_questiondown,
781    KC(230), KS_Mode_switch,	KS_Multi_key,
782};
783
784static const keysym_t hidkbd_keydesc_br_nodead[] = {
785/*  pos      normal             shifted         altgr           shift-altgr */
786    KC(35),  KS_6,		KS_diaeresis,	KS_notsign,	KS_dead_diaeresis,
787    KC(47),  KS_apostrophe,	KS_grave,	KS_dead_acute,	KS_dead_grave,
788    KC(52),  KS_asciitilde,	KS_asciicircum,	KS_dead_tilde,	KS_dead_circumflex,
789};
790
791static const keysym_t hidkbd_keydesc_tr[] = {
792/*  pos      normal		shifted         altgr           shift-altgr */
793    KC(12),  KS_L5_idotless,	KS_I,
794    KC(20),  KS_q,		KS_Q,		KS_at,
795    KC(31),  KS_2,		KS_apostrophe,	KS_sterling,
796    KC(32),  KS_3,		KS_asciicircum,	KS_numbersign,
797    KC(33),  KS_4,		KS_plus,	KS_dollar,
798    KC(34),  KS_5,		KS_percent,	KS_onehalf,
799    KC(35),  KS_6,		KS_ampersand,
800    KC(36),  KS_7,		KS_slash,	KS_braceleft,
801    KC(37),  KS_8,		KS_parenleft,	KS_bracketleft,
802    KC(38),  KS_9,		KS_parenright,	KS_bracketright,
803    KC(39),  KS_0,		KS_equal,	KS_braceright,
804    KC(45),  KS_asterisk,	KS_question,	KS_backslash,
805    KC(46),  KS_minus,	KS_underscore,
806    KC(47),  KS_L5_gbreve,	KS_L5_Gbreve,	KS_dead_diaeresis,
807    KC(48),  KS_udiaeresis,	KS_Udiaeresis,	KS_asciitilde,
808    KC(49),  KS_comma,	KS_semicolon,	KS_dead_grave,
809    KC(50),  KS_comma,	KS_semicolon,	KS_dead_grave,
810    KC(51),  KS_L5_scedilla,	KS_L5_Scedilla,	KS_dead_acute,
811    KC(52),  KS_i,		KS_L5_Idotabove,
812    KC(53),  KS_quotedbl,	KS_eacute,
813    KC(54),  KS_odiaeresis,	KS_Odiaeresis,
814    KC(55),  KS_ccedilla,	KS_Ccedilla,
815    KC(56),  KS_period,	KS_colon,
816    KC(100), KS_less,	KS_greater,	KS_bar,
817    KC(230), KS_Mode_switch,	KS_Multi_key,
818};
819
820static const keysym_t hidkbd_keydesc_tr_nodead[] = {
821/*  pos      normal		shifted         altgr           shift-altgr */
822    KC(47),  KS_L5_gbreve,	KS_L5_Gbreve,
823    KC(49),  KS_comma,		KS_semicolon,	KS_grave,
824    KC(50),  KS_comma,		KS_semicolon,	KS_grave,
825    KC(51),  KS_L5_scedilla,	KS_L5_Scedilla,	KS_apostrophe,
826};
827
828static const keysym_t hidkbd_keydesc_is[] = {
829/*  pos      normal		shifted			altgr			shift-altgr */
830    KC(8),   KS_e,		KS_E,			KS_currency,		KS_cent,
831    KC(16),  KS_m,		KS_M,			KS_mu,
832    KC(20),  KS_q,		KS_Q,			KS_at,
833    KC(30),  KS_1,		KS_exclam,		KS_onesuperior,		KS_exclamdown,
834    KC(31),  KS_2,		KS_quotedbl,		KS_twosuperior,		KS_currency,
835    KC(32),  KS_3,		KS_numbersign,		KS_threesuperior,	KS_sterling,
836    KC(33),  KS_4,		KS_dollar,		KS_onequarter,
837    KC(34),  KS_5,		KS_percent,		KS_onehalf,
838    KC(35),  KS_6,		KS_ampersand,		KS_notsign,
839    KC(36),  KS_7,		KS_slash,		KS_braceleft,
840    KC(37),  KS_8,		KS_parenleft,		KS_bracketleft,
841    KC(38),  KS_9,		KS_parenright,		KS_bracketright,	KS_plusminus,
842    KC(39),  KS_0,		KS_equal,		KS_braceright,		KS_degree,
843    KC(45),  KS_odiaeresis,	KS_Odiaeresis,		KS_backslash,		KS_questiondown,
844    KC(46),  KS_minus,		KS_underscore,		KS_dead_cedilla,	KS_dead_ogonek,
845    KC(47),  KS_eth,		KS_ETH,			KS_dead_diaeresis,	KS_dead_abovering,
846    KC(48),  KS_apostrophe,	KS_question,		KS_asciitilde,
847    KC(49),  KS_plus,		KS_asterisk,		KS_grave,		KS_dead_breve,
848    KC(50),  KS_plus,		KS_asterisk,		KS_grave,		KS_dead_breve,
849    KC(51),  KS_ae,		KS_AE,			KS_asciicircum,		KS_dead_hungarumlaut,
850    KC(52),  KS_dead_acute,	KS_dead_diaeresis,	KS_dead_circumflex,
851    KC(53),  KS_degree,		KS_diaeresis,
852    KC(54),  KS_comma,		KS_semicolon,
853    KC(55),  KS_period,		KS_colon,		KS_periodcentered,	KS_division,
854    KC(56),  KS_thorn,		KS_THORN,
855    KC(100), KS_less,		KS_greater,		KS_bar,
856    KC(230), KS_Mode_switch,	KS_Multi_key,
857};
858
859static const keysym_t hidkbd_keydesc_is_nodead[] = {
860/*  pos      normal	shifted		altgr		shift-altgr */
861    KC(52),  KS_acute,	KS_diaeresis,	KS_asciicircum,
862};
863
864static const keysym_t hidkbd_keydesc_la[] = {
865/*  pos      normal		shifted			altgr			shift-altgr */
866    KC(20),  KS_q,		KS_Q,			KS_at,
867    KC(30),  KS_1,		KS_exclam,		KS_bar,
868    KC(31),  KS_2,		KS_quotedbl,		KS_at,
869    KC(32),  KS_3,		KS_numbersign,		KS_periodcentered,
870    KC(35),  KS_6,		KS_ampersand,		KS_notsign,
871    KC(36),  KS_7,		KS_slash,
872    KC(37),  KS_8,		KS_parenleft,
873    KC(38),  KS_9,		KS_parenright,
874    KC(39),  KS_0,		KS_equal,
875    KC(45),  KS_apostrophe,	KS_question,		KS_backslash,
876    KC(46),  KS_questiondown,	KS_exclamdown,		KS_dead_cedilla,	KS_dead_ogonek,
877    KC(47),  KS_dead_acute,	KS_dead_diaeresis,	KS_dead_diaeresis,	KS_dead_abovering,
878    KC(48),  KS_plus,		KS_asterisk,		KS_asciitilde,
879    KC(49),  KS_braceright,	KS_bracketright,	KS_dead_grave,
880    KC(50),  KS_braceright,	KS_bracketright,	KS_dead_grave,
881    KC(51),  KS_ntilde,		KS_Ntilde,		KS_asciitilde,
882    KC(52),  KS_braceleft,	KS_bracketleft,		KS_dead_circumflex,
883    KC(53),  KS_bar,		KS_degree,		KS_notsign,
884    KC(54),  KS_comma,		KS_semicolon,
885    KC(55),  KS_period,		KS_colon,
886    KC(56),  KS_minus,		KS_underscore,
887    KC(100), KS_less,		KS_greater,
888    KC(230), KS_Mode_switch,	KS_Multi_key,
889};
890
891static const keysym_t hidkbd_keydesc_cf[] = {
892/*  pos      normal		shifted			altgr		shift-altgr */
893    KC(16),  KS_m,		KS_M,			KS_mu,
894    KC(18),  KS_o,		KS_O,			KS_section,
895    KC(19),  KS_p,		KS_P,			KS_paragraph,
896    KC(30),  KS_1,		KS_exclam,		KS_plusminus,
897    KC(31),  KS_2,		KS_quotedbl,		KS_at,
898    KC(32),  KS_3,		KS_slash,		KS_sterling,
899    KC(33),  KS_4,		KS_dollar,		KS_cent,
900    KC(34),  KS_5,		KS_percent,		KS_currency,
901    KC(35),  KS_6,		KS_question,		KS_notsign,
902    KC(36),  KS_7,		KS_ampersand,		KS_brokenbar,
903    KC(37),  KS_8,		KS_asterisk,		KS_twosuperior,
904    KC(38),  KS_9,		KS_parenleft,		KS_threesuperior,
905    KC(39),  KS_0,		KS_parenright,		KS_onequarter,
906    KC(44),  KS_space,		KS_space,		KS_nobreakspace,
907    KC(45),  KS_minus,		KS_underscore,		KS_onehalf,
908    KC(46),  KS_equal,		KS_plus,		KS_threequarters,
909    KC(47),  KS_dead_circumflex,KS_dead_circumflex,	KS_bracketleft,
910    KC(48),  KS_dead_cedilla,	KS_dead_diaeresis,	KS_bracketright,
911    KC(49),  KS_less,		KS_greater,		KS_braceright,
912    KC(50),  KS_less,		KS_greater,		KS_braceright,
913    KC(51),  KS_semicolon,	KS_colon,		KS_asciitilde,
914    KC(52),  KS_dead_grave,	KS_dead_grave,		KS_braceleft,
915    KC(53),  KS_numbersign,	KS_bar,			KS_backslash,
916    KC(54),  KS_comma,		KS_apostrophe,		KS_macron,
917    KC(55),  KS_period,		KS_period,		KS_hyphen,
918    KC(56),  KS_eacute,		KS_Eacute,		KS_dead_acute,
919    KC(100), KS_guillemotleft,	KS_guillemotright,	KS_degree,
920    KC(230), KS_Mode_switch,	KS_Multi_key,
921};
922
923#define KBD_MAP(name, base, map) \
924			{ name, base, sizeof(map)/sizeof(keysym_t), map }
925
926const struct wscons_keydesc hidkbd_keydesctab[] = {
927	KBD_MAP(KB_US,			0,	hidkbd_keydesc_us),
928	KBD_MAP(KB_US | KB_SWAPCTRLCAPS,KB_US,	hidkbd_keydesc_swapctrlcaps),
929	KBD_MAP(KB_US | KB_DVORAK,	KB_US,	hidkbd_keydesc_us_dvorak),
930	KBD_MAP(KB_US | KB_DVORAK | KB_SWAPCTRLCAPS,	KB_US| KB_DVORAK,
931		hidkbd_keydesc_swapctrlcaps),
932	KBD_MAP(KB_US | KB_COLEMAK,	KB_US,	hidkbd_keydesc_us_colemak),
933	KBD_MAP(KB_US | KB_APPLE,	KB_US,	hidkbd_keydesc_apple),
934	KBD_MAP(KB_JP,			KB_US,	hidkbd_keydesc_jp),
935	KBD_MAP(KB_JP | KB_SWAPCTRLCAPS,KB_JP,	hidkbd_keydesc_swapctrlcaps),
936	KBD_MAP(KB_DE,			KB_US,	hidkbd_keydesc_de),
937	KBD_MAP(KB_DE | KB_NODEAD,	KB_DE,	hidkbd_keydesc_de_nodead),
938	KBD_MAP(KB_FR,                  KB_US,  hidkbd_keydesc_fr),
939	KBD_MAP(KB_FR | KB_SWAPCTRLCAPS,KB_FR,	hidkbd_keydesc_swapctrlcaps),
940	KBD_MAP(KB_BEPO,                KB_US,  hidkbd_keydesc_fr_bepo),
941	KBD_MAP(KB_BE,                  KB_FR,  hidkbd_keydesc_be),
942	KBD_MAP(KB_BR,                  KB_US,  hidkbd_keydesc_br),
943	KBD_MAP(KB_BR | KB_NODEAD,	KB_BR,  hidkbd_keydesc_br_nodead),
944	KBD_MAP(KB_DK,			KB_US,	hidkbd_keydesc_dk),
945	KBD_MAP(KB_DK | KB_NODEAD,	KB_DK,	hidkbd_keydesc_dk_nodead),
946	KBD_MAP(KB_IS,			KB_US,	hidkbd_keydesc_is),
947	KBD_MAP(KB_IS | KB_NODEAD,	KB_IS,	hidkbd_keydesc_is_nodead),
948	KBD_MAP(KB_IT,			KB_US,	hidkbd_keydesc_it),
949	KBD_MAP(KB_UK,			KB_US,	hidkbd_keydesc_uk),
950	KBD_MAP(KB_UK | KB_SWAPCTRLCAPS,KB_UK,	hidkbd_keydesc_swapctrlcaps),
951	KBD_MAP(KB_SV,			KB_DK,	hidkbd_keydesc_sv),
952	KBD_MAP(KB_SV | KB_NODEAD,	KB_SV,	hidkbd_keydesc_sv_nodead),
953	KBD_MAP(KB_EE,			KB_SV,	hidkbd_keydesc_ee),
954	KBD_MAP(KB_EE | KB_NODEAD,	KB_EE,	hidkbd_keydesc_ee_nodead),
955	KBD_MAP(KB_NEO,			KB_US,	hidkbd_keydesc_de_neo),
956	KBD_MAP(KB_NO,			KB_DK,	hidkbd_keydesc_no),
957	KBD_MAP(KB_NO | KB_NODEAD,	KB_NO,	hidkbd_keydesc_no_nodead),
958	KBD_MAP(KB_ES ,			KB_US,	hidkbd_keydesc_es),
959	KBD_MAP(KB_PT,			KB_US,	hidkbd_keydesc_pt),
960	KBD_MAP(KB_SG,			KB_US,	hidkbd_keydesc_sg),
961	KBD_MAP(KB_SG | KB_NODEAD,	KB_SG,	hidkbd_keydesc_sg_nodead),
962	KBD_MAP(KB_SF,			KB_SG,	hidkbd_keydesc_sf),
963	KBD_MAP(KB_SF | KB_NODEAD,	KB_SF,	hidkbd_keydesc_sg_nodead),
964	KBD_MAP(KB_TR,			KB_US,	hidkbd_keydesc_tr),
965	KBD_MAP(KB_TR | KB_NODEAD,	KB_TR,	hidkbd_keydesc_tr_nodead),
966	KBD_MAP(KB_LA,			KB_US,	hidkbd_keydesc_la),
967	KBD_MAP(KB_CF,			KB_US,	hidkbd_keydesc_cf),
968	KBD_MAP(KB_HU,			KB_US,	hidkbd_keydesc_hu),
969	{0, 0, 0, 0}
970};
971
972#undef KBD_MAP
973#undef KC
974