bsd_KbdMap.c revision aa8e367b
1/*
2 * Slightly modified xf86KbdBSD.c which is
3 *
4 * Derived from xf86Kbd.c by S_ren Schmidt (sos@login.dkuug.dk)
5 * which is Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
6 * and from xf86KbdCODrv.c by Holger Veit
7 */
8
9#ifdef HAVE_CONFIG_H
10#include "config.h"
11#endif
12
13#include <xorg-server.h>
14#include <X11/X.h>
15#include <X11/Xmd.h>
16#include "input.h"
17#include "scrnintstr.h"
18
19#include "compiler.h"
20
21#include "xf86.h"
22#include "xf86Priv.h"
23#include "xf86_OSlib.h"
24#include "xf86Xinput.h"
25#include "xf86OSKbd.h"
26#include "atKeynames.h"
27#include "xf86Keymap.h"
28#include "bsd_kbd.h"
29
30#if (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT)) && defined(GIO_KEYMAP)
31#define KD_GET_ENTRY(i,n) \
32  eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + keymap.key[i].map[n]]
33
34static unsigned char remap[NUM_KEYCODES] = {
35     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
36  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
37  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
38  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
39  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
40  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
41  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
42  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
43  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
44     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
45     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
46  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
47     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
48     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
49     0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
50     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
51};
52
53/* This table assumes the ibm code page 437 coding for characters
54 * > 0x80. They are returned in this form by PCVT */
55static KeySym eascii_to_x[512] = {
56	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
57	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
58	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
59	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
60	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
61	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
62	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
63	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
64	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
65	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
66	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
67	XK_comma,	XK_minus,	XK_period,	XK_slash,
68	XK_0,		XK_1,		XK_2,		XK_3,
69	XK_4,		XK_5,		XK_6,		XK_7,
70	XK_8,		XK_9,		XK_colon,	XK_semicolon,
71	XK_less,	XK_equal,	XK_greater,	XK_question,
72	XK_at,		XK_A,		XK_B,		XK_C,
73	XK_D,		XK_E,		XK_F,		XK_G,
74	XK_H,		XK_I,		XK_J,		XK_K,
75	XK_L,		XK_M,		XK_N,		XK_O,
76	XK_P,		XK_Q,		XK_R,		XK_S,
77	XK_T,		XK_U,		XK_V,		XK_W,
78	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
79	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
80	XK_grave,	XK_a,		XK_b,		XK_c,
81	XK_d,		XK_e,		XK_f,		XK_g,
82	XK_h,		XK_i,		XK_j,		XK_k,
83	XK_l,		XK_m,		XK_n,		XK_o,
84	XK_p,		XK_q,		XK_r,		XK_s,
85	XK_t,		XK_u,		XK_v,		XK_w,
86	XK_x,		XK_y,		XK_z,		XK_braceleft,
87	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
88	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
89	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
90	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
91	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
92	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
93	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
94	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
95	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
96	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
97	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
98	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
99	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
100	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
101	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
102	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
103	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
104	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
105	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
106	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
107	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
108	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
109	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
110	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
111	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
112	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
113	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
114	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
115	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
116	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
117	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
118	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
119	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
120
121	/*
122	 * special marked entries (256 + x)
123	 */
124
125	/* This has been checked against what syscons actually does */
126	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
127	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
128	XK_ISO_Left_Tab,XK_Control_L,	NoSymbol,	NoSymbol,
129	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
130	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
131	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
132	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
133	XK_F2,		XK_F3,		XK_F4,		XK_F5,
134	XK_F6,		XK_F7,		XK_F8,		XK_F9,
135	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
136	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
137	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
138	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
139	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
140	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
141	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
142	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
143	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
144	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
145	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
146	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
147	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
148	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
149	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
150	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
151	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
152	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
153	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
154	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
155	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
156	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
157	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
158	XK_Control_R,	XK_Alt_R,	NoSymbol,	NoSymbol,
159	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
160	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
161	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
162	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
163	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
164	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
165	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
166	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
167	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
168	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
169	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
170	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
171	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
172	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
173	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
174	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
175	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
176	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
177	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
178	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
179	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
180	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
181	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
182	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
183	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
184	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
185	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
186	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
187	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
188	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
189	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol
190};
191
192#ifdef SYSCONS_SUPPORT
193static
194unsigned char sysconsCODEMap[] = {
195	KEY_KP_Enter,	KEY_RCtrl,	KEY_KP_Divide,	KEY_Print,
196	KEY_AltLang,	KEY_KP_7,	KEY_KP_8,	KEY_KP_9,
197	KEY_KP_4,	KEY_KP_6,	KEY_KP_1,	KEY_KP_2,
198	KEY_KP_3,	KEY_KP_0,	KEY_KP_Decimal,	KEY_Pause,
199	KEY_LMeta,	KEY_RMeta,	KEY_Menu,	KEY_Break
200};
201static
202TransMapRec sysconsCODE = {
203    0x59,
204    0x6d,
205    sysconsCODEMap
206};
207#endif
208#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
209
210#ifdef WSCONS_SUPPORT
211
212static CARD8 wsUsbMap[] = {
213	/* 0 */ KEY_NOTUSED,
214	/* 1 */ KEY_NOTUSED,
215	/* 2 */ KEY_NOTUSED,
216	/* 3 */ KEY_NOTUSED,
217	/* 4 */ KEY_A,
218	/* 5 */ KEY_B,
219	/* 6 */ KEY_C,
220	/* 7 */ KEY_D,
221	/* 8 */ KEY_E,
222	/* 9 */ KEY_F,
223	/* 10 */ KEY_G,
224	/* 11 */ KEY_H,
225	/* 12 */ KEY_I,
226	/* 13 */ KEY_J,
227	/* 14 */ KEY_K,
228	/* 15 */ KEY_L,
229	/* 16 */ KEY_M,
230	/* 17 */ KEY_N,
231	/* 18 */ KEY_O,
232	/* 19 */ KEY_P,
233	/* 20 */ KEY_Q,
234	/* 21 */ KEY_R,
235	/* 22 */ KEY_S,
236	/* 23 */ KEY_T,
237	/* 24 */ KEY_U,
238	/* 25 */ KEY_V,
239	/* 26 */ KEY_W,
240	/* 27 */ KEY_X,
241	/* 28 */ KEY_Y,
242	/* 29 */ KEY_Z,
243	/* 30 */ KEY_1,		/* 1 !*/
244	/* 31 */ KEY_2,		/* 2 @ */
245	/* 32 */ KEY_3,		/* 3 # */
246	/* 33 */ KEY_4,		/* 4 $ */
247	/* 34 */ KEY_5,		/* 5 % */
248	/* 35 */ KEY_6,		/* 6 ^ */
249	/* 36 */ KEY_7,		/* 7 & */
250	/* 37 */ KEY_8,		/* 8 * */
251	/* 38 */ KEY_9,		/* 9 ( */
252	/* 39 */ KEY_0,		/* 0 ) */
253	/* 40 */ KEY_Enter,	/* Return  */
254	/* 41 */ KEY_Escape,	/* Escape */
255	/* 42 */ KEY_BackSpace,	/* Backspace Delete */
256	/* 43 */ KEY_Tab,	/* Tab */
257	/* 44 */ KEY_Space,	/* Space */
258	/* 45 */ KEY_Minus,	/* - _ */
259	/* 46 */ KEY_Equal,	/* = + */
260	/* 47 */ KEY_LBrace,	/* [ { */
261	/* 48 */ KEY_RBrace,	/* ] } */
262	/* 49 */ KEY_BSlash,	/* \ | */
263	/* 50 */ KEY_BSlash,    /* \ _ # ~ on some keyboards */
264	/* 51 */ KEY_SemiColon,	/* ; : */
265	/* 52 */ KEY_Quote,	/* ' " */
266	/* 53 */ KEY_Tilde,	/* ` ~ */
267	/* 54 */ KEY_Comma,	/* , <  */
268	/* 55 */ KEY_Period,	/* . > */
269	/* 56 */ KEY_Slash,	/* / ? */
270	/* 57 */ KEY_CapsLock,	/* Caps Lock */
271	/* 58 */ KEY_F1,		/* F1 */
272	/* 59 */ KEY_F2,		/* F2 */
273	/* 60 */ KEY_F3,		/* F3 */
274	/* 61 */ KEY_F4,		/* F4 */
275	/* 62 */ KEY_F5,		/* F5 */
276	/* 63 */ KEY_F6,		/* F6 */
277	/* 64 */ KEY_F7,		/* F7 */
278	/* 65 */ KEY_F8,		/* F8 */
279	/* 66 */ KEY_F9,		/* F9 */
280	/* 67 */ KEY_F10,	/* F10 */
281	/* 68 */ KEY_F11,	/* F11 */
282	/* 69 */ KEY_F12,	/* F12 */
283	/* 70 */ KEY_Print,	/* PrintScrn SysReq */
284	/* 71 */ KEY_ScrollLock,	/* Scroll Lock */
285	/* 72 */ KEY_Pause,	/* Pause Break */
286	/* 73 */ KEY_Insert,	/* Insert XXX  Help on some Mac Keyboards */
287	/* 74 */ KEY_Home,	/* Home */
288	/* 75 */ KEY_PgUp,	/* Page Up */
289	/* 76 */ KEY_Delete,	/* Delete */
290	/* 77 */ KEY_End,	/* End */
291	/* 78 */ KEY_PgDown,	/* Page Down */
292	/* 79 */ KEY_Right,	/* Right Arrow */
293	/* 80 */ KEY_Left,	/* Left Arrow */
294	/* 81 */ KEY_Down,	/* Down Arrow */
295	/* 82 */ KEY_Up,		/* Up Arrow */
296	/* 83 */ KEY_NumLock,	/* Num Lock */
297	/* 84 */ KEY_KP_Divide,	/* Keypad / */
298	/* 85 */ KEY_KP_Multiply, /* Keypad * */
299	/* 86 */ KEY_KP_Minus,	/* Keypad - */
300	/* 87 */ KEY_KP_Plus,	/* Keypad + */
301	/* 88 */ KEY_KP_Enter,	/* Keypad Enter */
302	/* 89 */ KEY_KP_1,	/* Keypad 1 End */
303	/* 90 */ KEY_KP_2,	/* Keypad 2 Down */
304	/* 91 */ KEY_KP_3,	/* Keypad 3 Pg Down */
305	/* 92 */ KEY_KP_4,	/* Keypad 4 Left  */
306	/* 93 */ KEY_KP_5,	/* Keypad 5 */
307	/* 94 */ KEY_KP_6,	/* Keypad 6 */
308	/* 95 */ KEY_KP_7,	/* Keypad 7 Home */
309	/* 96 */ KEY_KP_8,	/* Keypad 8 Up */
310	/* 97 */ KEY_KP_9,	/* KEypad 9 Pg Up */
311	/* 98 */ KEY_KP_0,	/* Keypad 0 Ins */
312	/* 99 */ KEY_KP_Decimal,	/* Keypad . Del */
313	/* 100 */ KEY_Less,	/* < > on some keyboards */
314	/* 101 */ KEY_Menu,	/* Menu */
315	/* 102 */ KEY_Power,	/* sleep key on Sun USB */
316	/* 103 */ KEY_KP_Equal, /* Keypad = on Mac keyboards */
317	/* 104 */ KEY_F13,
318	/* 105 */ KEY_F14,
319	/* 106 */ KEY_F15,
320	/* 107 */ KEY_F16,
321	/* 108 */ KEY_NOTUSED,
322	/* 109 */ KEY_Power,
323	/* 110 */ KEY_NOTUSED,
324	/* 111 */ KEY_NOTUSED,
325	/* 112 */ KEY_NOTUSED,
326	/* 113 */ KEY_NOTUSED,
327	/* 114 */ KEY_NOTUSED,
328	/* 115 */ KEY_NOTUSED,
329	/* 116 */ KEY_L7,
330	/* 117 */ KEY_Help,
331	/* 118 */ KEY_L3,
332	/* 119 */ KEY_L5,
333	/* 120 */ KEY_L1,
334	/* 121 */ KEY_L2,
335	/* 122 */ KEY_L4,
336	/* 123 */ KEY_L10,
337	/* 124 */ KEY_L6,
338	/* 125 */ KEY_L8,
339	/* 126 */ KEY_L9,
340	/* 127 */ KEY_Mute,
341	/* 128 */ KEY_AudioRaise,
342	/* 129 */ KEY_AudioLower,
343	/* 130 */ KEY_NOTUSED,
344	/* 131 */ KEY_NOTUSED,
345	/* 132 */ KEY_NOTUSED,
346	/* 133 */ KEY_NOTUSED,
347	/* 134 */ KEY_NOTUSED,
348	/* 135 */ KEY_NOTUSED,
349	/* 136 */ KEY_NOTUSED,
350	/* 137 */ KEY_NOTUSED,
351	/* 138 */ KEY_NOTUSED,
352	/* 139 */ KEY_NOTUSED,
353	/* 140 */ KEY_NOTUSED,
354	/* 141 */ KEY_NOTUSED,
355	/* 142 */ KEY_NOTUSED,
356	/* 143 */ KEY_NOTUSED,
357	/* 144 */ KEY_NOTUSED,
358	/* 145 */ KEY_NOTUSED,
359	/* 146 */ KEY_NOTUSED,
360	/* 147 */ KEY_NOTUSED,
361	/* 148 */ KEY_NOTUSED,
362	/* 149 */ KEY_NOTUSED,
363	/* 150 */ KEY_NOTUSED,
364	/* 151 */ KEY_NOTUSED,
365	/* 152 */ KEY_NOTUSED,
366	/* 153 */ KEY_NOTUSED,
367	/* 154 */ KEY_NOTUSED,
368	/* 155 */ KEY_NOTUSED,
369	/* 156 */ KEY_NOTUSED,
370	/* 157 */ KEY_NOTUSED,
371	/* 158 */ KEY_NOTUSED,
372	/* 159 */ KEY_NOTUSED,
373	/* 160 */ KEY_NOTUSED,
374	/* 161 */ KEY_NOTUSED,
375	/* 162 */ KEY_NOTUSED,
376	/* 163 */ KEY_NOTUSED,
377	/* 164 */ KEY_NOTUSED,
378	/* 165 */ KEY_NOTUSED,
379	/* 166 */ KEY_NOTUSED,
380	/* 167 */ KEY_NOTUSED,
381	/* 168 */ KEY_NOTUSED,
382	/* 169 */ KEY_NOTUSED,
383	/* 170 */ KEY_NOTUSED,
384	/* 171 */ KEY_NOTUSED,
385	/* 172 */ KEY_NOTUSED,
386	/* 173 */ KEY_NOTUSED,
387	/* 174 */ KEY_NOTUSED,
388	/* 175 */ KEY_NOTUSED,
389	/* 176 */ KEY_NOTUSED,
390	/* 177 */ KEY_NOTUSED,
391	/* 178 */ KEY_NOTUSED,
392	/* 179 */ KEY_NOTUSED,
393	/* 180 */ KEY_NOTUSED,
394	/* 181 */ KEY_NOTUSED,
395	/* 182 */ KEY_NOTUSED,
396	/* 183 */ KEY_NOTUSED,
397	/* 184 */ KEY_NOTUSED,
398	/* 185 */ KEY_NOTUSED,
399	/* 186 */ KEY_NOTUSED,
400	/* 187 */ KEY_NOTUSED,
401	/* 188 */ KEY_NOTUSED,
402	/* 189 */ KEY_NOTUSED,
403	/* 190 */ KEY_NOTUSED,
404	/* 191 */ KEY_NOTUSED,
405	/* 192 */ KEY_NOTUSED,
406	/* 193 */ KEY_NOTUSED,
407	/* 194 */ KEY_NOTUSED,
408	/* 195 */ KEY_NOTUSED,
409	/* 196 */ KEY_NOTUSED,
410	/* 197 */ KEY_NOTUSED,
411	/* 198 */ KEY_NOTUSED,
412	/* 199 */ KEY_NOTUSED,
413	/* 200 */ KEY_NOTUSED,
414	/* 201 */ KEY_NOTUSED,
415	/* 202 */ KEY_NOTUSED,
416	/* 203 */ KEY_NOTUSED,
417	/* 204 */ KEY_NOTUSED,
418	/* 205 */ KEY_NOTUSED,
419	/* 206 */ KEY_NOTUSED,
420	/* 207 */ KEY_NOTUSED,
421	/* 208 */ KEY_NOTUSED,
422	/* 209 */ KEY_NOTUSED,
423	/* 210 */ KEY_NOTUSED,
424	/* 211 */ KEY_NOTUSED,
425	/* 212 */ KEY_NOTUSED,
426	/* 213 */ KEY_NOTUSED,
427	/* 214 */ KEY_NOTUSED,
428	/* 215 */ KEY_NOTUSED,
429	/* 216 */ KEY_NOTUSED,
430	/* 217 */ KEY_NOTUSED,
431	/* 218 */ KEY_NOTUSED,
432	/* 219 */ KEY_NOTUSED,
433	/* 220 */ KEY_NOTUSED,
434	/* 221 */ KEY_NOTUSED,
435	/* 222 */ KEY_NOTUSED,
436	/* 223 */ KEY_NOTUSED,
437	/* 224 */ KEY_LCtrl,	/* Left Control */
438	/* 225 */ KEY_ShiftL,	/* Left Shift */
439	/* 226 */ KEY_Alt,	/* Left Alt */
440	/* 227 */ KEY_LMeta,	/* Left Meta */
441	/* 228 */ KEY_RCtrl,	/* Right Control */
442	/* 229 */ KEY_ShiftR,	/* Right Shift */
443	/* 230 */ KEY_AltLang,	/* Right Alt, AKA AltGr */
444	/* 231 */ KEY_LMeta,	/* Right Meta XXX */
445};
446#define WS_USB_MAP_SIZE (sizeof(wsUsbMap)/sizeof(*wsUsbMap))
447
448static
449TransMapRec wsUsb = {
450    0,
451    WS_USB_MAP_SIZE,
452    wsUsbMap
453};
454
455static CARD8 wsXtMap[] = {
456	/* 0 */ KEY_NOTUSED,
457	/* 1 */ KEY_Escape,
458	/* 2 */ KEY_1,
459	/* 3 */ KEY_2,
460	/* 4 */ KEY_3,
461	/* 5 */ KEY_4,
462	/* 6 */ KEY_5,
463	/* 7 */ KEY_6,
464	/* 8 */ KEY_7,
465	/* 9 */ KEY_8,
466	/* 10 */ KEY_9,
467	/* 11 */ KEY_0,
468	/* 12 */ KEY_Minus,
469	/* 13 */ KEY_Equal,
470	/* 14 */ KEY_BackSpace,
471	/* 15 */ KEY_Tab,
472	/* 16 */ KEY_Q,
473	/* 17 */ KEY_W,
474	/* 18 */ KEY_E,
475	/* 19 */ KEY_R,
476	/* 20 */ KEY_T,
477	/* 21 */ KEY_Y,
478	/* 22 */ KEY_U,
479	/* 23 */ KEY_I,
480	/* 24 */ KEY_O,
481	/* 25 */ KEY_P,
482	/* 26 */ KEY_LBrace,
483	/* 27 */ KEY_RBrace,
484	/* 28 */ KEY_Enter,
485	/* 29 */ KEY_LCtrl,
486	/* 30 */ KEY_A,
487	/* 31 */ KEY_S,
488	/* 32 */ KEY_D,
489	/* 33 */ KEY_F,
490	/* 34 */ KEY_G,
491	/* 35 */ KEY_H,
492	/* 36 */ KEY_J,
493	/* 37 */ KEY_K,
494	/* 38 */ KEY_L,
495	/* 39 */ KEY_SemiColon,
496	/* 40 */ KEY_Quote,
497	/* 41 */ KEY_Tilde,
498	/* 42 */ KEY_ShiftL,
499	/* 43 */ KEY_BSlash,
500	/* 44 */ KEY_Z,
501	/* 45 */ KEY_X,
502	/* 46 */ KEY_C,
503	/* 47 */ KEY_V,
504	/* 48 */ KEY_B,
505	/* 49 */ KEY_N,
506	/* 50 */ KEY_M,
507	/* 51 */ KEY_Comma,
508	/* 52 */ KEY_Period,
509	/* 53 */ KEY_Slash,
510	/* 54 */ KEY_ShiftR,
511	/* 55 */ KEY_KP_Multiply,
512	/* 56 */ KEY_Alt,
513	/* 57 */ KEY_Space,
514	/* 58 */ KEY_CapsLock,
515	/* 59 */ KEY_F1,
516	/* 60 */ KEY_F2,
517	/* 61 */ KEY_F3,
518	/* 62 */ KEY_F4,
519	/* 63 */ KEY_F5,
520	/* 64 */ KEY_F6,
521	/* 65 */ KEY_F7,
522	/* 66 */ KEY_F8,
523	/* 67 */ KEY_F9,
524	/* 68 */ KEY_F10,
525	/* 69 */ KEY_NumLock,
526	/* 70 */ KEY_ScrollLock,
527	/* 71 */ KEY_KP_7,
528	/* 72 */ KEY_KP_8,
529	/* 73 */ KEY_KP_9,
530	/* 74 */ KEY_KP_Minus,
531	/* 75 */ KEY_KP_4,
532	/* 76 */ KEY_KP_5,
533	/* 77 */ KEY_KP_6,
534	/* 78 */ KEY_KP_Plus,
535	/* 79 */ KEY_KP_1,
536	/* 80 */ KEY_KP_2,
537	/* 81 */ KEY_KP_3,
538	/* 82 */ KEY_KP_0,
539	/* 83 */ KEY_KP_Decimal,
540	/* 84 */ KEY_NOTUSED,
541	/* 85 */ KEY_NOTUSED,
542	/* 86 */ KEY_Less,	/* backslash on uk, < on german */
543	/* 87 */ KEY_F11,
544	/* 88 */ KEY_F12,
545	/* 89 */ KEY_NOTUSED,
546	/* 90 */ KEY_NOTUSED,
547	/* 91 */ KEY_NOTUSED,
548	/* 92 */ KEY_NOTUSED,
549	/* 93 */ KEY_NOTUSED,
550	/* 94 */ KEY_NOTUSED,
551	/* 95 */ KEY_NOTUSED,
552	/* 96 */ KEY_NOTUSED,
553	/* 97 */ KEY_NOTUSED,
554	/* 98 */ KEY_NOTUSED,
555	/* 99 */ KEY_NOTUSED,
556	/* 100 */ KEY_NOTUSED,
557	/* 101 */ KEY_NOTUSED,
558	/* 102 */ KEY_NOTUSED,
559	/* 103 */ KEY_NOTUSED,
560	/* 104 */ KEY_NOTUSED,
561	/* 105 */ KEY_NOTUSED,
562	/* 106 */ KEY_NOTUSED,
563	/* 107 */ KEY_NOTUSED,
564	/* 108 */ KEY_NOTUSED,
565	/* 109 */ KEY_NOTUSED,
566	/* 110 */ KEY_NOTUSED,
567	/* 111 */ KEY_NOTUSED,
568	/* 112 */ KEY_NOTUSED,
569	/* 113 */ KEY_NOTUSED,
570	/* 114 */ KEY_NOTUSED,
571	/* 115 */ KEY_NOTUSED,
572	/* 116 */ KEY_NOTUSED,
573	/* 117 */ KEY_NOTUSED,
574	/* 118 */ KEY_NOTUSED,
575	/* 119 */ KEY_NOTUSED,
576	/* 120 */ KEY_NOTUSED,
577	/* 121 */ KEY_NOTUSED,
578	/* 122 */ KEY_NOTUSED,
579	/* 123 */ KEY_NOTUSED,
580	/* 124 */ KEY_NOTUSED,
581	/* 125 */ KEY_NOTUSED,
582	/* 126 */ KEY_NOTUSED,
583	/* 127 */ KEY_Pause,
584	/* 128 */ KEY_NOTUSED,
585	/* 129 */ KEY_NOTUSED,
586	/* 130 */ KEY_NOTUSED,
587	/* 131 */ KEY_NOTUSED,
588	/* 132 */ KEY_NOTUSED,
589	/* 133 */ KEY_NOTUSED,
590	/* 134 */ KEY_NOTUSED,
591	/* 135 */ KEY_NOTUSED,
592	/* 136 */ KEY_NOTUSED,
593	/* 137 */ KEY_NOTUSED,
594	/* 138 */ KEY_NOTUSED,
595	/* 139 */ KEY_NOTUSED,
596	/* 140 */ KEY_NOTUSED,
597	/* 141 */ KEY_NOTUSED,
598	/* 142 */ KEY_NOTUSED,
599	/* 143 */ KEY_NOTUSED,
600	/* 144 */ KEY_NOTUSED,
601	/* 145 */ KEY_NOTUSED,
602	/* 146 */ KEY_NOTUSED,
603	/* 147 */ KEY_NOTUSED,
604	/* 148 */ KEY_NOTUSED,
605	/* 149 */ KEY_NOTUSED,
606	/* 150 */ KEY_NOTUSED,
607	/* 151 */ KEY_NOTUSED,
608	/* 152 */ KEY_NOTUSED,
609	/* 153 */ KEY_NOTUSED,
610	/* 154 */ KEY_NOTUSED,
611	/* 155 */ KEY_NOTUSED,
612	/* 156 */ KEY_KP_Enter,
613	/* 157 */ KEY_RCtrl,
614	/* 158 */ KEY_NOTUSED,
615	/* 159 */ KEY_NOTUSED,
616	/* 160 */ KEY_Mute,
617	/* 161 */ KEY_NOTUSED,
618	/* 162 */ KEY_NOTUSED,
619	/* 163 */ KEY_NOTUSED,
620	/* 164 */ KEY_NOTUSED,
621	/* 165 */ KEY_NOTUSED,
622	/* 166 */ KEY_NOTUSED,
623	/* 167 */ KEY_NOTUSED,
624	/* 168 */ KEY_NOTUSED,
625	/* 169 */ KEY_NOTUSED,
626	/* 170 */ KEY_Print,
627	/* 171 */ KEY_NOTUSED,
628	/* 172 */ KEY_NOTUSED,
629	/* 173 */ KEY_NOTUSED,
630	/* 174 */ KEY_AudioLower,
631	/* 175 */ KEY_AudioRaise,
632	/* 176 */ KEY_NOTUSED,
633	/* 177 */ KEY_NOTUSED,
634	/* 178 */ KEY_NOTUSED,
635	/* 179 */ KEY_NOTUSED,
636	/* 180 */ KEY_NOTUSED,
637	/* 181 */ KEY_KP_Divide,
638	/* 182 */ KEY_NOTUSED,
639	/* 183 */ KEY_Print,
640	/* 184 */ KEY_AltLang,
641	/* 185 */ KEY_NOTUSED,
642	/* 186 */ KEY_NOTUSED,
643	/* 187 */ KEY_NOTUSED,
644	/* 188 */ KEY_NOTUSED,
645	/* 189 */ KEY_NOTUSED,
646	/* 190 */ KEY_NOTUSED,
647	/* 191 */ KEY_NOTUSED,
648	/* 192 */ KEY_NOTUSED,
649	/* 193 */ KEY_NOTUSED,
650	/* 194 */ KEY_NOTUSED,
651	/* 195 */ KEY_NOTUSED,
652	/* 196 */ KEY_NOTUSED,
653	/* 197 */ KEY_NOTUSED,
654	/* 198 */ KEY_NOTUSED,
655	/* 199 */ KEY_Home,
656	/* 200 */ KEY_Up,
657	/* 201 */ KEY_PgUp,
658	/* 202 */ KEY_NOTUSED,
659	/* 203 */ KEY_Left,
660	/* 204 */ KEY_NOTUSED,
661	/* 205 */ KEY_Right,
662	/* 206 */ KEY_NOTUSED,
663	/* 207 */ KEY_End,
664	/* 208 */ KEY_Down,
665	/* 209 */ KEY_PgDown,
666	/* 210 */ KEY_Insert,
667	/* 211 */ KEY_Delete,
668	/* 212 */ KEY_NOTUSED,
669	/* 213 */ KEY_NOTUSED,
670	/* 214 */ KEY_NOTUSED,
671	/* 215 */ KEY_NOTUSED,
672	/* 216 */ KEY_NOTUSED,
673	/* 217 */ KEY_NOTUSED,
674	/* 218 */ KEY_NOTUSED,
675	/* 219 */ KEY_LMeta,
676	/* 220 */ KEY_RMeta,
677	/* 221 */ KEY_Menu,
678};
679#define WS_XT_MAP_SIZE (sizeof(wsXtMap)/sizeof(*wsXtMap))
680
681static
682TransMapRec wsXt = {
683    0,
684    WS_XT_MAP_SIZE,
685    wsXtMap
686};
687
688/* Map for adb keyboards  */
689static CARD8 wsAdbMap[] = {
690	/* 0 */ KEY_A,
691	/* 1 */ KEY_S,
692	/* 2 */ KEY_D,
693	/* 3 */ KEY_F,
694	/* 4 */ KEY_H,
695	/* 5 */ KEY_G,
696	/* 6 */ KEY_Z,
697	/* 7 */ KEY_X,
698	/* 8 */ KEY_C,
699	/* 9 */ KEY_V,
700	/* 10 */ KEY_UNKNOWN,	/* @ # on french keyboards */
701	/* 11 */ KEY_B,
702	/* 12 */ KEY_Q,
703	/* 13 */ KEY_W,
704	/* 14 */ KEY_E,
705	/* 15 */ KEY_R,
706	/* 16 */ KEY_Y,
707	/* 17 */ KEY_T,
708	/* 18 */ KEY_1,
709	/* 19 */ KEY_2,
710	/* 20 */ KEY_3,
711	/* 21 */ KEY_4,
712	/* 22 */ KEY_6,
713	/* 23 */ KEY_5,
714	/* 24 */ KEY_Equal,
715	/* 25 */ KEY_9,
716	/* 26 */ KEY_7,
717	/* 27 */ KEY_Minus,
718	/* 28 */ KEY_8,
719	/* 29 */ KEY_0,
720	/* 30 */ KEY_RBrace,
721	/* 31 */ KEY_O,
722	/* 32 */ KEY_U,
723	/* 33 */ KEY_LBrace,
724	/* 34 */ KEY_I,
725	/* 35 */ KEY_P,
726	/* 36 */ KEY_Enter,
727	/* 37 */ KEY_L,
728	/* 38 */ KEY_J,
729	/* 39 */ KEY_Quote,
730	/* 40 */ KEY_K,
731	/* 41 */ KEY_SemiColon,
732	/* 42 */ KEY_BSlash,
733	/* 43 */ KEY_Comma,
734	/* 44 */ KEY_Slash,
735	/* 45 */ KEY_N,
736	/* 46 */ KEY_M,
737	/* 47 */ KEY_Period,
738	/* 48 */ KEY_Tab,
739	/* 49 */ KEY_Space,
740	/* 50 */ KEY_Tilde,
741	/* 51 */ KEY_BackSpace,
742	/* 52 */ KEY_AltLang,
743	/* 53 */ KEY_Escape,
744	/* 54 */ KEY_LCtrl,
745	/* 55 */ KEY_LMeta,
746	/* 56 */ KEY_ShiftL,
747	/* 57 */ KEY_CapsLock,
748	/* 58 */ KEY_Alt,
749	/* 59 */ KEY_Left,
750	/* 60 */ KEY_Right,
751	/* 61 */ KEY_Down,
752	/* 62 */ KEY_Up,
753	/* 63 */ KEY_UNKNOWN,	/* Fn */
754	/* 64 */ KEY_NOTUSED,
755	/* 65 */ KEY_KP_Decimal,
756	/* 66 */ KEY_NOTUSED,
757	/* 67 */ KEY_KP_Multiply,
758	/* 68 */ KEY_NOTUSED,
759	/* 69 */ KEY_KP_Plus,
760	/* 70 */ KEY_NOTUSED,
761	/* 71 */ KEY_NumLock,	/* Clear */
762	/* 72 */ KEY_NOTUSED,
763	/* 73 */ KEY_NOTUSED,
764	/* 74 */ KEY_NOTUSED,
765	/* 75 */ KEY_KP_Divide,
766	/* 76 */ KEY_KP_Enter,
767	/* 77 */ KEY_NOTUSED,
768	/* 78 */ KEY_KP_Minus,
769	/* 79 */ KEY_NOTUSED,
770	/* 80 */ KEY_NOTUSED,
771	/* 81 */ KEY_KP_Equal,	/* Keypad = */
772	/* 82 */ KEY_KP_0,
773	/* 83 */ KEY_KP_1,
774	/* 84 */ KEY_KP_2,
775	/* 85 */ KEY_KP_3,
776	/* 86 */ KEY_KP_4,
777	/* 87 */ KEY_KP_5,
778	/* 88 */ KEY_KP_6,
779	/* 89 */ KEY_KP_7,
780	/* 90 */ KEY_NOTUSED,
781	/* 91 */ KEY_KP_8,
782	/* 92 */ KEY_KP_9,
783	/* 93 */ KEY_NOTUSED,
784	/* 94 */ KEY_NOTUSED,
785	/* 95 */ KEY_KP_Decimal,	/* Keypad ,  */
786	/* 96 */ KEY_F5,
787	/* 97 */ KEY_F6,
788	/* 98 */ KEY_F7,
789	/* 99 */ KEY_F3,
790	/* 100 */ KEY_F8,
791	/* 101 */ KEY_F9,
792	/* 102 */ KEY_NOTUSED,
793	/* 103 */ KEY_F11,
794	/* 104 */ KEY_NOTUSED,
795	/* 105 */ KEY_Print,
796	/* 106 */ KEY_KP_Enter,
797	/* 107 */ KEY_ScrollLock,
798	/* 108 */ KEY_NOTUSED,
799	/* 109 */ KEY_F10,
800	/* 110 */ KEY_NOTUSED,
801	/* 111 */ KEY_F12,
802	/* 112 */ KEY_NOTUSED,
803	/* 113 */ KEY_Pause,
804	/* 114 */ KEY_Insert,
805	/* 115 */ KEY_Home,
806	/* 116 */ KEY_PgUp,
807	/* 117 */ KEY_Delete,
808	/* 118 */ KEY_F4,
809	/* 119 */ KEY_End,
810	/* 120 */ KEY_F2,
811	/* 121 */ KEY_PgDown,
812	/* 122 */ KEY_F1,
813	/* 123 */ KEY_NOTUSED,
814	/* 124 */ KEY_NOTUSED,
815	/* 125 */ KEY_NOTUSED,
816	/* 126 */ KEY_NOTUSED,
817	/* 127 */ KEY_Power
818};
819#define WS_ADB_MAP_SIZE (sizeof(wsAdbMap)/sizeof(*wsAdbMap))
820
821static
822TransMapRec wsAdb = {
823    0,
824    WS_ADB_MAP_SIZE,
825    wsAdbMap
826};
827
828/* Map for LK201 keyboards  */
829static CARD8 wsLk201Map[] = {
830	/* 0 */ KEY_F1,
831	/* 1 */ KEY_F2,
832	/* 2 */ KEY_F3,
833	/* 3 */ KEY_F4,
834	/* 4 */ KEY_F5,
835	/* 5 */ KEY_NOTUSED,
836	/* 6 */ KEY_NOTUSED,
837	/* 7 */ KEY_NOTUSED,
838	/* 8 */ KEY_NOTUSED,
839	/* 9 */ KEY_NOTUSED,
840	/* 10 */ KEY_NOTUSED,
841	/* 11 */ KEY_NOTUSED,
842	/* 12 */ KEY_NOTUSED,
843	/* 13 */ KEY_NOTUSED,
844	/* 14 */ KEY_F6,
845	/* 15 */ KEY_F7,
846	/* 16 */ KEY_F8,
847	/* 17 */ KEY_F9,
848	/* 18 */ KEY_F10,
849	/* 19 */ KEY_NOTUSED,
850	/* 20 */ KEY_NOTUSED,
851	/* 21 */ KEY_NOTUSED,
852	/* 22 */ KEY_NOTUSED,
853	/* 23 */ KEY_NOTUSED,
854	/* 24 */ KEY_NOTUSED,
855	/* 25 */ KEY_NOTUSED,
856	/* 26 */ KEY_NOTUSED,
857	/* 27 */ KEY_F11,
858	/* 28 */ KEY_F12,
859	/* 29 */ KEY_F13,
860	/* 30 */ KEY_F14,
861	/* 31 */ KEY_NOTUSED,
862	/* 32 */ KEY_NOTUSED,
863	/* 33 */ KEY_NOTUSED,
864	/* 34 */ KEY_NOTUSED,
865	/* 35 */ KEY_NOTUSED,
866	/* 36 */ KEY_NOTUSED,
867	/* 37 */ KEY_NOTUSED,
868	/* 38 */ KEY_Help,
869	/* 39 */ KEY_F16,	/* Do */
870	/* 40 */ KEY_NOTUSED,
871	/* 41 */ KEY_NOTUSED,
872	/* 42 */ KEY_F17,
873	/* 43 */ KEY_L8,	/* F18 */
874	/* 44 */ KEY_L9,	/* F19 */
875	/* 45 */ KEY_L10,	/* F20 */
876	/* 46 */ KEY_NOTUSED,
877	/* 47 */ KEY_NOTUSED,
878	/* 48 */ KEY_NOTUSED,
879	/* 49 */ KEY_NOTUSED,
880	/* 50 */ KEY_NOTUSED,
881	/* 51 */ KEY_NOTUSED,
882	/* 52 */ KEY_Home,	/* Find */
883	/* 53 */ KEY_Insert,	/* Insert Here */
884	/* 54 */ KEY_Delete,	/* Re-move */
885	/* 55 */ KEY_End,	/* Select */
886	/* 56 */ KEY_PgUp,	/* Prev-Screen */
887	/* 57 */ KEY_PgDown,	/* Next-Screen */
888	/* 58 */ KEY_NOTUSED,
889	/* 59 */ KEY_NOTUSED,
890	/* 60 */ KEY_KP_0,
891	/* 61 */ KEY_NOTUSED,
892	/* 62 */ KEY_KP_Decimal,
893	/* 63 */ KEY_KP_Enter,
894	/* 64 */ KEY_KP_1,
895	/* 65 */ KEY_KP_2,
896	/* 66 */ KEY_KP_3,
897	/* 67 */ KEY_KP_4,
898	/* 68 */ KEY_KP_5,
899	/* 69 */ KEY_KP_6,
900	/* 70 */ KEY_KP_Plus,	/* KP Comma */
901	/* 71 */ KEY_KP_7,
902	/* 72 */ KEY_KP_8,
903	/* 73 */ KEY_KP_9,
904	/* 74 */ KEY_KP_Minus,
905	/* 75 */ KEY_L1,	/* PF1 */
906	/* 76 */ KEY_L2,	/* PF2 */
907	/* 77 */ KEY_L3,	/* PF3 */
908	/* 78 */ KEY_L4,	/* PF4 */
909	/* 79 */ KEY_NOTUSED,
910	/* 80 */ KEY_NOTUSED,
911	/* 81 */ KEY_Left,
912	/* 82 */ KEY_Right,
913	/* 83 */ KEY_Down,
914	/* 84 */ KEY_Up,
915	/* 85 */ KEY_NOTUSED,
916	/* 86 */ KEY_NOTUSED,
917	/* 87 */ KEY_NOTUSED,
918	/* 88 */ KEY_ShiftL,
919	/* 89 */ KEY_LCtrl,
920	/* 90 */ KEY_CapsLock,
921	/* 91 */ KEY_Alt, 	/* Compose */
922	/* 92 */ KEY_NOTUSED,
923	/* 93 */ KEY_NOTUSED,
924	/* 94 */ KEY_NOTUSED,
925	/* 95 */ KEY_NOTUSED,
926	/* 96 */ KEY_NOTUSED,
927	/* 97 */ KEY_NOTUSED,
928	/* 98 */ KEY_NOTUSED,
929	/* 99 */ KEY_NOTUSED,
930	/* 100 */ KEY_NOTUSED,
931	/* 101 */ KEY_NOTUSED,
932	/* 102 */ KEY_Delete,
933	/* 103 */ KEY_Enter,
934	/* 104 */ KEY_Tab,
935	/* 105 */ KEY_Escape, /* tilde */
936	/* 106 */ KEY_1,
937	/* 107 */ KEY_Q,
938	/* 108 */ KEY_A,
939	/* 109 */ KEY_Z,
940	/* 110 */ KEY_NOTUSED,
941	/* 111 */ KEY_2,
942	/* 112 */ KEY_W,
943	/* 113 */ KEY_S,
944	/* 114 */ KEY_X,
945	/* 115 */ KEY_Less,
946	/* 116 */ KEY_NOTUSED,
947	/* 117 */ KEY_3,
948	/* 118 */ KEY_E,
949	/* 119 */ KEY_D,
950	/* 120 */ KEY_C,
951	/* 121 */ KEY_NOTUSED,
952	/* 122 */ KEY_4,
953	/* 123 */ KEY_R,
954	/* 124 */ KEY_F,
955	/* 125 */ KEY_V,
956	/* 126 */ KEY_Space,
957	/* 127 */ KEY_NOTUSED,
958	/* 128 */ KEY_5,
959	/* 129 */ KEY_T,
960	/* 130 */ KEY_G,
961	/* 131 */ KEY_B,
962	/* 132 */ KEY_NOTUSED,
963	/* 133 */ KEY_6,
964	/* 134 */ KEY_Y,
965	/* 135 */ KEY_H,
966	/* 136 */ KEY_N,
967	/* 137 */ KEY_NOTUSED,
968	/* 138 */ KEY_7,
969	/* 139 */ KEY_U,
970	/* 140 */ KEY_J,
971	/* 141 */ KEY_M,
972	/* 142 */ KEY_NOTUSED,
973	/* 143 */ KEY_8,
974	/* 144 */ KEY_I,
975	/* 145 */ KEY_K,
976	/* 146 */ KEY_Comma,
977	/* 147 */ KEY_NOTUSED,
978	/* 148 */ KEY_9,
979	/* 149 */ KEY_O,
980	/* 150 */ KEY_L,
981	/* 151 */ KEY_Period,
982	/* 152 */ KEY_NOTUSED,
983	/* 153 */ KEY_0,
984	/* 154 */ KEY_P,
985	/* 155 */ KEY_NOTUSED,
986	/* 156 */ KEY_SemiColon,
987	/* 157 */ KEY_Slash,
988	/* 158 */ KEY_NOTUSED,
989	/* 159 */ KEY_Equal,
990	/* 160 */ KEY_RBrace,
991	/* 161 */ KEY_BSlash,
992	/* 162 */ KEY_NOTUSED,
993	/* 163 */ KEY_Minus,
994	/* 164 */ KEY_LBrace,
995	/* 165 */ KEY_Quote,
996	/* 166 */ KEY_NOTUSED,
997	/* 167 */ KEY_NOTUSED,
998	/* 168 */ KEY_NOTUSED,
999	/* 169 */ KEY_NOTUSED,
1000	/* 170 */ KEY_NOTUSED,
1001	/* 171 */ KEY_NOTUSED,
1002	/* 172 */ KEY_NOTUSED,
1003	/* 173 */ KEY_NOTUSED,
1004	/* 174 */ KEY_NOTUSED,
1005	/* 175 */ KEY_NOTUSED,
1006	/* 176 */ KEY_NOTUSED,
1007	/* 177 */ KEY_NOTUSED,
1008	/* 178 */ KEY_NOTUSED,
1009	/* 179 */ KEY_NOTUSED,
1010	/* 180 */ KEY_NOTUSED,
1011	/* 181 */ KEY_NOTUSED,
1012	/* 182 */ KEY_NOTUSED,
1013	/* 183 */ KEY_NOTUSED,
1014	/* 184 */ KEY_NOTUSED,
1015	/* 185 */ KEY_NOTUSED,
1016	/* 186 */ KEY_NOTUSED,
1017	/* 187 */ KEY_NOTUSED,
1018	/* 188 */ KEY_NOTUSED,
1019	/* 189 */ KEY_NOTUSED,
1020	/* 190 */ KEY_NOTUSED,
1021	/* 191 */ KEY_NOTUSED,
1022	/* 192 */ KEY_NOTUSED,
1023	/* 193 */ KEY_NOTUSED,
1024	/* 194 */ KEY_NOTUSED,
1025	/* 195 */ KEY_NOTUSED,
1026	/* 196 */ KEY_NOTUSED,
1027	/* 197 */ KEY_NOTUSED,
1028	/* 198 */ KEY_NOTUSED,
1029	/* 199 */ KEY_NOTUSED,
1030	/* 200 */ KEY_NOTUSED,
1031	/* 201 */ KEY_NOTUSED,
1032	/* 202 */ KEY_NOTUSED,
1033	/* 203 */ KEY_NOTUSED,
1034	/* 204 */ KEY_NOTUSED,
1035	/* 205 */ KEY_NOTUSED,
1036	/* 206 */ KEY_NOTUSED,
1037	/* 207 */ KEY_NOTUSED,
1038	/* 208 */ KEY_NOTUSED,
1039	/* 209 */ KEY_NOTUSED,
1040	/* 210 */ KEY_NOTUSED,
1041	/* 211 */ KEY_NOTUSED,
1042	/* 212 */ KEY_NOTUSED,
1043	/* 213 */ KEY_NOTUSED,
1044	/* 214 */ KEY_NOTUSED,
1045	/* 215 */ KEY_NOTUSED,
1046	/* 216 */ KEY_NOTUSED,
1047	/* 217 */ KEY_NOTUSED,
1048	/* 218 */ KEY_NOTUSED,
1049	/* 219 */ KEY_NOTUSED,
1050	/* 220 */ KEY_NOTUSED,
1051	/* 221 */ KEY_NOTUSED,
1052	/* 222 */ KEY_NOTUSED,
1053	/* 223 */ KEY_NOTUSED,
1054	/* 224 */ KEY_NOTUSED,
1055	/* 225 */ KEY_NOTUSED,
1056	/* 226 */ KEY_NOTUSED,
1057	/* 227 */ KEY_NOTUSED,
1058	/* 228 */ KEY_NOTUSED,
1059	/* 229 */ KEY_NOTUSED,
1060	/* 230 */ KEY_NOTUSED,
1061	/* 231 */ KEY_NOTUSED,
1062	/* 232 */ KEY_NOTUSED,
1063	/* 233 */ KEY_NOTUSED,
1064	/* 234 */ KEY_NOTUSED,
1065	/* 235 */ KEY_NOTUSED,
1066	/* 236 */ KEY_NOTUSED,
1067	/* 237 */ KEY_NOTUSED,
1068	/* 238 */ KEY_NOTUSED,
1069	/* 239 */ KEY_NOTUSED,
1070	/* 240 */ KEY_NOTUSED,
1071	/* 241 */ KEY_NOTUSED,
1072	/* 242 */ KEY_NOTUSED,
1073	/* 243 */ KEY_NOTUSED,
1074	/* 244 */ KEY_NOTUSED,
1075	/* 245 */ KEY_NOTUSED,
1076	/* 246 */ KEY_NOTUSED,
1077	/* 247 */ KEY_NOTUSED,
1078	/* 248 */ KEY_NOTUSED,
1079	/* 249 */ KEY_NOTUSED,
1080	/* 250 */ KEY_NOTUSED,
1081	/* 251 */ KEY_NOTUSED,
1082};
1083#define WS_LK201_MAP_SIZE (sizeof(wsLk201Map)/sizeof(*wsLk201Map))
1084
1085static
1086TransMapRec wsLk201 = {
1087    0,
1088    WS_LK201_MAP_SIZE,
1089    wsLk201Map
1090};
1091
1092static CARD8 wsSunMap[] = {
1093	/* 0x00 */ KEY_Help,
1094	/* 0x01 */ KEY_L1,		/* stop */
1095	/* 0x02 */ KEY_AudioLower,	/* BrightnessDown / S-VolumeDown */
1096	/* 0x03 */ KEY_L2,		/* again */
1097	/* 0x04 */ KEY_AudioRaise,	/* BridgtnessUp / S-VolumeUp */
1098	/* 0x05 */ KEY_F1,
1099	/* 0x06 */ KEY_F2,
1100	/* 0x07 */ KEY_F10,
1101	/* 0x08 */ KEY_F3,
1102	/* 0x09 */ KEY_F11,
1103	/* 0x0a */ KEY_F4,
1104	/* 0x0b */ KEY_F12,
1105	/* 0x0c */ KEY_F5,
1106	/* 0x0d */ KEY_AltLang,
1107	/* 0x0e */ KEY_F6,
1108	/* 0x0f */ KEY_NOTUSED,
1109	/* 0x10 */ KEY_F7,
1110	/* 0x11 */ KEY_F8,
1111	/* 0x12 */ KEY_F9,
1112	/* 0x13 */ KEY_Alt,
1113	/* 0x14 */ KEY_Up,
1114	/* 0x15 */ KEY_Pause,
1115	/* 0x16 */ KEY_Print,
1116	/* 0x17 */ KEY_ScrollLock,
1117	/* 0x18 */ KEY_Left,
1118	/* 0x19 */ KEY_L3,		/* props */
1119	/* 0x1a */ KEY_L4,		/* undo */
1120	/* 0x1b */ KEY_Down,
1121	/* 0x1c */ KEY_Right,
1122	/* 0x1d */ KEY_Escape,
1123	/* 0x1e */ KEY_1,
1124	/* 0x1f */ KEY_2,
1125	/* 0x20 */ KEY_3,
1126	/* 0x21 */ KEY_4,
1127	/* 0x22 */ KEY_5,
1128	/* 0x23 */ KEY_6,
1129	/* 0x24 */ KEY_7,
1130	/* 0x25 */ KEY_8,
1131	/* 0x26 */ KEY_9,
1132	/* 0x27 */ KEY_0,
1133	/* 0x28 */ KEY_Minus,
1134	/* 0x29 */ KEY_Equal,
1135	/* 0x2a */ KEY_Tilde,
1136	/* 0x2b */ KEY_BackSpace,
1137	/* 0x2c */ KEY_Insert,
1138	/* 0x2d */ KEY_Mute,		/* Audio Mute */
1139	/* 0x2e */ KEY_KP_Divide,
1140	/* 0x2f */ KEY_KP_Multiply,
1141	/* 0x30 */ KEY_Power,
1142	/* 0x31 */ KEY_L5,		/* front */
1143	/* 0x32 */ KEY_KP_Decimal,
1144	/* 0x33 */ KEY_L6,		/* copy */
1145	/* 0x34 */ KEY_Home,
1146	/* 0x35 */ KEY_Tab,
1147	/* 0x36 */ KEY_Q,
1148	/* 0x37 */ KEY_W,
1149	/* 0x38 */ KEY_E,
1150	/* 0x39 */ KEY_R,
1151	/* 0x3a */ KEY_T,
1152	/* 0x3b */ KEY_Y,
1153	/* 0x3c */ KEY_U,
1154	/* 0x3d */ KEY_I,
1155	/* 0x3e */ KEY_O,
1156	/* 0x3f */ KEY_P,
1157	/* 0x40 */ KEY_LBrace,
1158	/* 0x41 */ KEY_RBrace,
1159	/* 0x42 */ KEY_Delete,
1160	/* 0x43 */ KEY_Menu,		/* compose */
1161	/* 0x44 */ KEY_KP_7,
1162	/* 0x45 */ KEY_KP_8,
1163	/* 0x46 */ KEY_KP_9,
1164	/* 0x47 */ KEY_KP_Minus,
1165	/* 0x48 */ KEY_L7,		/* open */
1166	/* 0x49 */ KEY_L8,		/* paste */
1167	/* 0x4a */ KEY_End,
1168	/* 0x4b */ KEY_NOTUSED,
1169	/* 0x4c */ KEY_LCtrl,
1170	/* 0x4d */ KEY_A,
1171	/* 0x4e */ KEY_S,
1172	/* 0x4f */ KEY_D,
1173	/* 0x50 */ KEY_F,
1174	/* 0x51 */ KEY_G,
1175	/* 0x52 */ KEY_H,
1176	/* 0x53 */ KEY_J,
1177	/* 0x54 */ KEY_K,
1178	/* 0x55 */ KEY_L,
1179	/* 0x56 */ KEY_SemiColon,
1180	/* 0x57 */ KEY_Quote,
1181	/* 0x58 */ KEY_BSlash,
1182	/* 0x59 */ KEY_Enter,
1183	/* 0x5a */ KEY_KP_Enter,
1184	/* 0x5b */ KEY_KP_4,
1185	/* 0x5c */ KEY_KP_5,
1186	/* 0x5d */ KEY_KP_6,
1187	/* 0x5e */ KEY_KP_0,
1188	/* 0x5f */ KEY_L9,		/* find */
1189	/* 0x60 */ KEY_PgUp,
1190	/* 0x61 */ KEY_L10,		/* cut */
1191	/* 0x62 */ KEY_NumLock,
1192	/* 0x63 */ KEY_ShiftL,
1193	/* 0x64 */ KEY_Z,
1194	/* 0x65 */ KEY_X,
1195	/* 0x66 */ KEY_C,
1196	/* 0x67 */ KEY_V,
1197	/* 0x68 */ KEY_B,
1198	/* 0x69 */ KEY_N,
1199	/* 0x6a */ KEY_M,
1200	/* 0x6b */ KEY_Comma,
1201	/* 0x6c */ KEY_Period,
1202	/* 0x6d */ KEY_Slash,
1203	/* 0x6e */ KEY_ShiftR,
1204	/* 0x6f */ KEY_NOTUSED,		/* linefeed */
1205	/* 0x70 */ KEY_KP_1,
1206	/* 0x71 */ KEY_KP_2,
1207	/* 0x72 */ KEY_KP_3,
1208	/* 0x73 */ KEY_NOTUSED,
1209	/* 0x74 */ KEY_NOTUSED,
1210	/* 0x75 */ KEY_NOTUSED,
1211	/* 0x76 */ KEY_Help,		/* help */
1212	/* 0x77 */ KEY_CapsLock,
1213	/* 0x78 */ KEY_LMeta,
1214	/* 0x79 */ KEY_Space,
1215	/* 0x7a */ KEY_RMeta,
1216	/* 0x7b */ KEY_PgDown,
1217	/* 0x7c */ KEY_Less,		/* < > on some keyboards */
1218	/* 0x7d */ KEY_KP_Plus,
1219	/* 0x7e */ KEY_NOTUSED,
1220	/* 0x7f */ KEY_NOTUSED
1221};
1222#define WS_SUN_MAP_SIZE (sizeof(wsSunMap)/sizeof(*wsSunMap))
1223
1224static
1225TransMapRec wsSun = {
1226    0,
1227    WS_SUN_MAP_SIZE,
1228    wsSunMap
1229};
1230
1231#endif /* WSCONS_SUPPORT */
1232
1233/*ARGSUSED*/
1234
1235/*
1236 * KbdGetMapping --
1237 *	Get the national keyboard mapping. The keyboard type is set, a new map
1238 *      and the modifiermap is computed.
1239 */
1240
1241void
1242KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
1243{
1244  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
1245  KeySym        *k;
1246  int           i;
1247
1248#ifndef __bsdi__
1249  switch (pKbd->consType) {
1250
1251/*
1252 * XXX wscons has no GIO_KEYMAP
1253 */
1254#if (defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)) && defined(GIO_KEYMAP)
1255  case SYSCONS:
1256  case PCVT:
1257    {
1258      keymap_t keymap;
1259
1260      if (ioctl(pInfo->fd, GIO_KEYMAP, &keymap) != -1) {
1261	for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++)
1262	  if (remap[i]) {
1263	    k = map + (remap[i] << 2);
1264	    k[0] = KD_GET_ENTRY(i,0);           /* non-shifed */
1265	    k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
1266	    k[2] = KD_GET_ENTRY(i,4);	      /* alt */
1267	    k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
1268	    if (k[3] == k[2]) k[3] = NoSymbol;
1269	    if (k[2] == k[1]) k[2] = NoSymbol;
1270	    if (k[1] == k[0]) k[1] = NoSymbol;
1271	    if (k[0] == k[2] && k[1] == k[3])
1272	      k[2] = k[3] = NoSymbol;
1273	  }
1274      }
1275    }
1276    break;
1277#endif /* SYSCONS || PCVT */
1278
1279  }
1280#endif /* !bsdi */
1281
1282  /*
1283   * compute the modifier map
1284   */
1285  for (i = 0; i < MAP_LENGTH; i++)
1286    pModMap[i] = NoSymbol;  /* make sure it is restored */
1287
1288  for (k = map, i = MIN_KEYCODE;
1289       i < (NUM_KEYCODES + MIN_KEYCODE);
1290       i++, k += 4)
1291
1292    switch(*k) {
1293
1294    case XK_Shift_L:
1295    case XK_Shift_R:
1296      pModMap[i] = ShiftMask;
1297      break;
1298
1299    case XK_Control_L:
1300    case XK_Control_R:
1301      pModMap[i] = ControlMask;
1302      break;
1303
1304    case XK_Caps_Lock:
1305      pModMap[i] = LockMask;
1306      break;
1307
1308    case XK_Alt_L:
1309    case XK_Alt_R:
1310      pModMap[i] = AltMask;
1311      break;
1312
1313    case XK_Num_Lock:
1314      pModMap[i] = NumLockMask;
1315      break;
1316
1317    case XK_Scroll_Lock:
1318      pModMap[i] = ScrollLockMask;
1319      break;
1320
1321      /* kana support */
1322    case XK_Kana_Lock:
1323    case XK_Kana_Shift:
1324      pModMap[i] = KanaMask;
1325      break;
1326
1327      /* alternate toggle for multinational support */
1328    case XK_Mode_switch:
1329      pModMap[i] = AltLangMask;
1330      break;
1331
1332    }
1333
1334  pKeySyms->map        = map;
1335  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
1336  pKeySyms->minKeyCode = MIN_KEYCODE;
1337  pKeySyms->maxKeyCode = MAX_KEYCODE;
1338
1339  switch(pKbd->consType) {
1340#ifdef SYSCONS_SUPPORT
1341      case SYSCONS:
1342           if (pKbd->CustomKeycodes)
1343              pKbd->scancodeMap = &sysconsCODE;
1344           else
1345              pKbd->RemapScanCode = ATScancode;
1346           break;
1347#endif
1348#if defined(PCCONS_SUPPORT) || defined (PCVT_SUPPORT)
1349      case PCCONS:
1350      case PCVT:
1351           pKbd->RemapScanCode = ATScancode;
1352	   break;
1353#endif
1354#ifdef WSCONS_SUPPORT
1355      case WSCONS:
1356	if (!pKbd->isConsole) {
1357           switch (pKbd->wsKbdType) {
1358	       case WSKBD_TYPE_PC_XT:
1359	       case WSKBD_TYPE_PC_AT:
1360                    pKbd->scancodeMap = &wsXt;
1361                    break;
1362	       case WSKBD_TYPE_USB:
1363#ifdef WSKBD_TYPE_MAPLE
1364	       case WSKBD_TYPE_MAPLE:
1365#endif
1366                    pKbd->scancodeMap = &wsUsb;
1367                    break;
1368#ifdef WSKBD_TYPE_ADB
1369	       case WSKBD_TYPE_ADB:
1370                    pKbd->scancodeMap = &wsAdb;
1371                    break;
1372#endif
1373#ifdef WSKBD_TYPE_LK201
1374	       case WSKBD_TYPE_LK201:
1375                    pKbd->scancodeMap = &wsLk201;
1376                    break;
1377#endif
1378#ifdef WSKBD_TYPE_SUN
1379#ifdef WSKBD_TYPE_SUN5
1380	       case WSKBD_TYPE_SUN5:
1381#endif
1382	       case WSKBD_TYPE_SUN:
1383                    pKbd->scancodeMap = &wsSun;
1384                    break;
1385#endif
1386	       default:
1387		    ErrorF("Unknown wskbd type %d\n", pKbd->wsKbdType);
1388           }
1389	} else {
1390           pKbd->RemapScanCode = ATScancode;
1391	}
1392      break;
1393#endif
1394  }
1395  return;
1396}
1397