bsd_KbdMap.c revision 7baae195
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_BSlash2,	/* \ _ # ~ 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(unsigned char))
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(unsigned char))
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(unsigned char))
820
821static
822TransMapRec wsAdb = {
823    0,
824    WS_ADB_MAP_SIZE,
825    wsAdbMap
826};
827
828static CARD8 wsSunMap[] = {
829	/* 0x00 */ KEY_Help,
830	/* 0x01 */ KEY_L1,		/* stop */
831	/* 0x02 */ KEY_AudioLower,	/* BrightnessDown / S-VolumeDown */
832	/* 0x03 */ KEY_L2,		/* again */
833	/* 0x04 */ KEY_AudioRaise,	/* BridgtnessUp / S-VolumeUp */
834	/* 0x05 */ KEY_F1,
835	/* 0x06 */ KEY_F2,
836	/* 0x07 */ KEY_F10,
837	/* 0x08 */ KEY_F3,
838	/* 0x09 */ KEY_F11,
839	/* 0x0a */ KEY_F4,
840	/* 0x0b */ KEY_F12,
841	/* 0x0c */ KEY_F5,
842	/* 0x0d */ KEY_AltLang,
843	/* 0x0e */ KEY_F6,
844	/* 0x0f */ KEY_NOTUSED,
845	/* 0x10 */ KEY_F7,
846	/* 0x11 */ KEY_F8,
847	/* 0x12 */ KEY_F9,
848	/* 0x13 */ KEY_Alt,
849	/* 0x14 */ KEY_Up,
850	/* 0x15 */ KEY_Pause,
851	/* 0x16 */ KEY_Print,
852	/* 0x17 */ KEY_ScrollLock,
853	/* 0x18 */ KEY_Left,
854	/* 0x19 */ KEY_L3,		/* props */
855	/* 0x1a */ KEY_L4,		/* undo */
856	/* 0x1b */ KEY_Down,
857	/* 0x1c */ KEY_Right,
858	/* 0x1d */ KEY_Escape,
859	/* 0x1e */ KEY_1,
860	/* 0x1f */ KEY_2,
861	/* 0x20 */ KEY_3,
862	/* 0x21 */ KEY_4,
863	/* 0x22 */ KEY_5,
864	/* 0x23 */ KEY_6,
865	/* 0x24 */ KEY_7,
866	/* 0x25 */ KEY_8,
867	/* 0x26 */ KEY_9,
868	/* 0x27 */ KEY_0,
869	/* 0x28 */ KEY_Minus,
870	/* 0x29 */ KEY_Equal,
871	/* 0x2a */ KEY_Tilde,
872	/* 0x2b */ KEY_BackSpace,
873	/* 0x2c */ KEY_Insert,
874	/* 0x2d */ KEY_Mute,		/* Audio Mute */
875	/* 0x2e */ KEY_KP_Divide,
876	/* 0x2f */ KEY_KP_Multiply,
877	/* 0x30 */ KEY_Power,
878	/* 0x31 */ KEY_L5,		/* front */
879	/* 0x32 */ KEY_KP_Decimal,
880	/* 0x33 */ KEY_L6,		/* copy */
881	/* 0x34 */ KEY_Home,
882	/* 0x35 */ KEY_Tab,
883	/* 0x36 */ KEY_Q,
884	/* 0x37 */ KEY_W,
885	/* 0x38 */ KEY_E,
886	/* 0x39 */ KEY_R,
887	/* 0x3a */ KEY_T,
888	/* 0x3b */ KEY_Y,
889	/* 0x3c */ KEY_U,
890	/* 0x3d */ KEY_I,
891	/* 0x3e */ KEY_O,
892	/* 0x3f */ KEY_P,
893	/* 0x40 */ KEY_LBrace,
894	/* 0x41 */ KEY_RBrace,
895	/* 0x42 */ KEY_Delete,
896	/* 0x43 */ KEY_Menu,		/* compose */
897	/* 0x44 */ KEY_KP_7,
898	/* 0x45 */ KEY_KP_8,
899	/* 0x46 */ KEY_KP_9,
900	/* 0x47 */ KEY_KP_Minus,
901	/* 0x48 */ KEY_L7,		/* open */
902	/* 0x49 */ KEY_L8,		/* paste */
903	/* 0x4a */ KEY_End,
904	/* 0x4b */ KEY_NOTUSED,
905	/* 0x4c */ KEY_LCtrl,
906	/* 0x4d */ KEY_A,
907	/* 0x4e */ KEY_S,
908	/* 0x4f */ KEY_D,
909	/* 0x50 */ KEY_F,
910	/* 0x51 */ KEY_G,
911	/* 0x52 */ KEY_H,
912	/* 0x53 */ KEY_J,
913	/* 0x54 */ KEY_K,
914	/* 0x55 */ KEY_L,
915	/* 0x56 */ KEY_SemiColon,
916	/* 0x57 */ KEY_Quote,
917	/* 0x58 */ KEY_BSlash,
918	/* 0x59 */ KEY_Enter,
919	/* 0x5a */ KEY_KP_Enter,
920	/* 0x5b */ KEY_KP_4,
921	/* 0x5c */ KEY_KP_5,
922	/* 0x5d */ KEY_KP_6,
923	/* 0x5e */ KEY_KP_0,
924	/* 0x5f */ KEY_L9,		/* find */
925	/* 0x60 */ KEY_PgUp,
926	/* 0x61 */ KEY_L10,		/* cut */
927	/* 0x62 */ KEY_NumLock,
928	/* 0x63 */ KEY_ShiftL,
929	/* 0x64 */ KEY_Z,
930	/* 0x65 */ KEY_X,
931	/* 0x66 */ KEY_C,
932	/* 0x67 */ KEY_V,
933	/* 0x68 */ KEY_B,
934	/* 0x69 */ KEY_N,
935	/* 0x6a */ KEY_M,
936	/* 0x6b */ KEY_Comma,
937	/* 0x6c */ KEY_Period,
938	/* 0x6d */ KEY_Slash,
939	/* 0x6e */ KEY_ShiftR,
940	/* 0x6f */ KEY_NOTUSED,		/* linefeed */
941	/* 0x70 */ KEY_KP_1,
942	/* 0x71 */ KEY_KP_2,
943	/* 0x72 */ KEY_KP_3,
944	/* 0x73 */ KEY_NOTUSED,
945	/* 0x74 */ KEY_NOTUSED,
946	/* 0x75 */ KEY_NOTUSED,
947	/* 0x76 */ KEY_Help,		/* help */
948	/* 0x77 */ KEY_CapsLock,
949	/* 0x78 */ KEY_LMeta,
950	/* 0x79 */ KEY_Space,
951	/* 0x7a */ KEY_RMeta,
952	/* 0x7b */ KEY_PgDown,
953	/* 0x7c */ KEY_Less,		/* < > on some keyboards */
954	/* 0x7d */ KEY_KP_Plus,
955	/* 0x7e */ KEY_NOTUSED,
956	/* 0x7f */ KEY_NOTUSED
957};
958#define WS_SUN_MAP_SIZE (sizeof(wsSunMap)/sizeof(unsigned char))
959
960static
961TransMapRec wsSun = {
962    0,
963    WS_SUN_MAP_SIZE,
964    wsSunMap
965};
966
967#endif /* WSCONS_SUPPORT */
968
969/*ARGSUSED*/
970
971/*
972 * KbdGetMapping --
973 *	Get the national keyboard mapping. The keyboard type is set, a new map
974 *      and the modifiermap is computed.
975 */
976
977void
978KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
979{
980  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
981  KeySym        *k;
982  int           i;
983
984#ifndef __bsdi__
985  switch (pKbd->consType) {
986
987/*
988 * XXX wscons has no GIO_KEYMAP
989 */
990#if (defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)) && defined(GIO_KEYMAP)
991  case SYSCONS:
992  case PCVT:
993    {
994      keymap_t keymap;
995
996      if (ioctl(pInfo->fd, GIO_KEYMAP, &keymap) != -1) {
997	for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++)
998	  if (remap[i]) {
999	    k = map + (remap[i] << 2);
1000	    k[0] = KD_GET_ENTRY(i,0);           /* non-shifed */
1001	    k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
1002	    k[2] = KD_GET_ENTRY(i,4);	      /* alt */
1003	    k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
1004	    if (k[3] == k[2]) k[3] = NoSymbol;
1005	    if (k[2] == k[1]) k[2] = NoSymbol;
1006	    if (k[1] == k[0]) k[1] = NoSymbol;
1007	    if (k[0] == k[2] && k[1] == k[3])
1008	      k[2] = k[3] = NoSymbol;
1009	  }
1010      }
1011    }
1012    break;
1013#endif /* SYSCONS || PCVT */
1014
1015  }
1016#endif /* !bsdi */
1017
1018  /*
1019   * compute the modifier map
1020   */
1021  for (i = 0; i < MAP_LENGTH; i++)
1022    pModMap[i] = NoSymbol;  /* make sure it is restored */
1023
1024  for (k = map, i = MIN_KEYCODE;
1025       i < (NUM_KEYCODES + MIN_KEYCODE);
1026       i++, k += 4)
1027
1028    switch(*k) {
1029
1030    case XK_Shift_L:
1031    case XK_Shift_R:
1032      pModMap[i] = ShiftMask;
1033      break;
1034
1035    case XK_Control_L:
1036    case XK_Control_R:
1037      pModMap[i] = ControlMask;
1038      break;
1039
1040    case XK_Caps_Lock:
1041      pModMap[i] = LockMask;
1042      break;
1043
1044    case XK_Alt_L:
1045    case XK_Alt_R:
1046      pModMap[i] = AltMask;
1047      break;
1048
1049    case XK_Num_Lock:
1050      pModMap[i] = NumLockMask;
1051      break;
1052
1053    case XK_Scroll_Lock:
1054      pModMap[i] = ScrollLockMask;
1055      break;
1056
1057      /* kana support */
1058    case XK_Kana_Lock:
1059    case XK_Kana_Shift:
1060      pModMap[i] = KanaMask;
1061      break;
1062
1063      /* alternate toggle for multinational support */
1064    case XK_Mode_switch:
1065      pModMap[i] = AltLangMask;
1066      break;
1067
1068    }
1069
1070  pKeySyms->map        = map;
1071  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
1072  pKeySyms->minKeyCode = MIN_KEYCODE;
1073  pKeySyms->maxKeyCode = MAX_KEYCODE;
1074
1075  switch(pKbd->consType) {
1076#ifdef SYSCONS_SUPPORT
1077      case SYSCONS:
1078           if (pKbd->CustomKeycodes)
1079              pKbd->scancodeMap = &sysconsCODE;
1080           else
1081              pKbd->RemapScanCode = ATScancode;
1082           break;
1083#endif
1084#if defined(PCCONS_SUPPORT) || defined (PCVT_SUPPORT)
1085      case PCCONS:
1086      case PCVT:
1087           pKbd->RemapScanCode = ATScancode;
1088	   break;
1089#endif
1090#ifdef WSCONS_SUPPORT
1091      case WSCONS:
1092	if (!pKbd->isConsole) {
1093           switch (pKbd->wsKbdType) {
1094	       case WSKBD_TYPE_PC_XT:
1095	       case WSKBD_TYPE_PC_AT:
1096                    pKbd->scancodeMap = &wsXt;
1097                    break;
1098	       case WSKBD_TYPE_USB:
1099#ifdef WSKBD_TYPE_MAPLE
1100	       case WSKBD_TYPE_MAPLE:
1101#endif
1102                    pKbd->scancodeMap = &wsUsb;
1103                    break;
1104#ifdef WSKBD_TYPE_ADB
1105	       case WSKBD_TYPE_ADB:
1106                    pKbd->scancodeMap = &wsAdb;
1107                    break;
1108#endif
1109#ifdef WSKBD_TYPE_SUN
1110#ifdef WSKBD_TYPE_SUN5
1111	       case WSKBD_TYPE_SUN5:
1112#endif
1113	       case WSKBD_TYPE_SUN:
1114                    pKbd->scancodeMap = &wsSun;
1115                    break;
1116#endif
1117	       default:
1118		    ErrorF("Unknown wskbd type %d\n", pKbd->wsKbdType);
1119           }
1120	} else {
1121           pKbd->RemapScanCode = ATScancode;
1122	}
1123      break;
1124#endif
1125  }
1126  return;
1127}
1128