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