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