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