1/*
2 * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
3 * Copyright 1993 by David Dawes <dawes@xfree86.org>
4 *
5 * Permission to use, copy, modify, distribute, and sell this software and its
6 * documentation for any purpose is hereby granted without fee, provided that
7 * the above copyright notice appear in all copies and that both that copyright
8 * notice and this permission notice appear in supporting documentation, and
9 * that the names of Thomas Roell and David Dawes not be used in advertising or
10 * publicity pertaining to distribution of the software without specific,
11 * written prior permission.  Thomas Roell and David Dawes make no
12 * representations about the suitability of this software for any purpose.  It
13 * is provided "as is" without express or implied warranty.
14 *
15 * THOMAS ROELL AND DAVID DAWES DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
16 * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
17 * IN NO EVENT SHALL THOMAS ROELL OR DAVID DAWES BE LIABLE FOR ANY SPECIAL,
18 * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
19 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
20 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
21 * PERFORMANCE OF THIS SOFTWARE.
22 */
23
24#ifdef HAVE_CONFIG_H
25#include "config.h"
26#endif
27
28#include <xorg-server.h>
29#include <X11/Xfuncproto.h>
30#include <X11/Sunkeysym.h>
31#include "atKeynames.h"
32#include "xf86OSKbd.h"
33#include "xf86Keymap.h"
34#include "sun_kbd.h"
35
36#include <sys/kbd.h>
37
38/* Map the Solaris keycodes to the "XFree86" keycodes. */
39
40/*
41 * Additional Korean 106 Keyboard Keys not defined in atKeynames.h
42 * These are exactly same USB usage id with Kana(0x90) and Eisu(0x91) keys
43 * in Mac Japanese keyboard. From /usr/X11/lib/X11/xkb/keycodes/xfree86, these
44 * are 209 and 210. So these should be 0xc9(209-8=201) and 0xca(210-8=202).
45 *   <EISU> =   210;          // Alphanumeric mode on macintosh
46 *   <KANA> =   209;          // Kana mode on macintosh
47 */
48#define KEY_Hangul            0xC9    /* Also Kana in Mac Japanaese kbd */
49#define KEY_Hangul_Hanja      0xCA    /* Also Eisu in Mac Japanaese kbd */
50
51/* Override atKeynames.h values with unique keycodes, so we can distinguish
52   KEY_F15 from KEY_HKTG & KEY_KP_DEC from KEY_BSlash2 */
53#undef KEY_HKTG
54#define KEY_HKTG         /* Hirugana/Katakana tog 0xC8  */  200 /* was 112 */
55#undef KEY_BSlash2
56#define KEY_BSlash2      /* \           _         0xCB  */  203 /* was 115 */
57
58static unsigned char sunmap[256] = {
59#if defined(i386) || defined(__i386) || defined(__i386__) || defined(__x86)
60	KEY_NOTUSED,		/*   0 */
61	KEY_Tilde,		/*   1 */
62	KEY_1,			/*   2 */
63	KEY_2,			/*   3 */
64	KEY_3,			/*   4 */
65	KEY_4,			/*   5 */
66	KEY_5,			/*   6 */
67	KEY_6,			/*   7 */
68	KEY_7,			/*   8 */
69	KEY_8,			/*   9 */
70	KEY_9,			/*  10 */
71	KEY_0,			/*  11 */
72	KEY_Minus,		/*  12 */
73	KEY_Equal,		/*  13 */
74	0x7D, /*KEY_P_YEN*/	/*  14 */
75	KEY_BackSpace,		/*  15 */
76	KEY_Tab,		/*  16 */
77	KEY_Q,			/*  17 */
78	KEY_W,			/*  18 */
79	KEY_E,			/*  19 */
80	KEY_R,			/*  20 */
81	KEY_T,			/*  21 */
82	KEY_Y,			/*  22 */
83	KEY_U,			/*  23 */
84	KEY_I,			/*  24 */
85	KEY_O,			/*  25 */
86	KEY_P,			/*  26 */
87	KEY_LBrace,		/*  27 */
88	KEY_RBrace,		/*  28 */
89	KEY_BSlash,		/*  29 */
90	KEY_CapsLock,		/*  30 */
91	KEY_A,			/*  31 */
92	KEY_S,			/*  32 */
93	KEY_D,			/*  33 */
94	KEY_F,			/*  34 */
95	KEY_G,			/*  35 */
96	KEY_H,			/*  36 */
97	KEY_J,			/*  37 */
98	KEY_K,			/*  38 */
99	KEY_L,			/*  39 */
100	KEY_SemiColon,		/*  40 */
101	KEY_Quote,		/*  41 */
102	KEY_UNKNOWN,		/*  42 */
103	KEY_Enter,		/*  43 */
104	KEY_ShiftL,		/*  44 */
105	KEY_Less,		/*  45 */
106	KEY_Z,			/*  46 */
107	KEY_X,			/*  47 */
108	KEY_C,			/*  48 */
109	KEY_V,			/*  49 */
110	KEY_B,			/*  50 */
111	KEY_N,			/*  51 */
112	KEY_M,			/*  52 */
113	KEY_Comma,		/*  53 */
114	KEY_Period,		/*  54 */
115	KEY_Slash,		/*  55 */
116	KEY_BSlash2,		/*  56 */
117	KEY_ShiftR,		/*  57 */
118	KEY_LCtrl,		/*  58 */
119	KEY_LMeta,		/*  59 */
120	KEY_Alt,		/*  60 */
121	KEY_Space,		/*  61 */
122	KEY_AltLang,		/*  62 */
123	KEY_RMeta,		/*  63 */
124	KEY_RCtrl,		/*  64 */
125	KEY_Menu,		/*  65 */
126	KEY_UNKNOWN,		/*  66 */
127	KEY_UNKNOWN,		/*  67 */
128	KEY_UNKNOWN,		/*  68 */
129	KEY_UNKNOWN,		/*  69 */
130	KEY_UNKNOWN,		/*  70 */
131	KEY_UNKNOWN,		/*  71 */
132	KEY_UNKNOWN,		/*  72 */
133	KEY_UNKNOWN,		/*  73 */
134	KEY_UNKNOWN,		/*  74 */
135	KEY_Insert,		/*  75 */
136	KEY_Delete,		/*  76 */
137	KEY_UNKNOWN,		/*  77 */
138	KEY_UNKNOWN,		/*  78 */
139	KEY_Left,		/*  79 */
140	KEY_Home,		/*  80 */
141	KEY_End,		/*  81 */
142	KEY_UNKNOWN,		/*  82 */
143	KEY_Up,			/*  83 */
144	KEY_Down,		/*  84 */
145	KEY_PgUp,		/*  85 */
146	KEY_PgDown,		/*  86 */
147	KEY_UNKNOWN,		/*  87 */
148	KEY_UNKNOWN,		/*  88 */
149	KEY_Right,		/*  89 */
150	KEY_NumLock,		/*  90 */
151	KEY_KP_7,		/*  91 */
152	KEY_KP_4,		/*  92 */
153	KEY_KP_1,		/*  93 */
154	KEY_UNKNOWN,		/*  94 */
155	KEY_KP_Divide,		/*  95 */
156	KEY_KP_8,		/*  96 */
157	KEY_KP_5,		/*  97 */
158	KEY_KP_2,		/*  98 */
159	KEY_KP_0,		/*  99 */
160	KEY_KP_Multiply,	/* 100 */
161	KEY_KP_9,		/* 101 */
162	KEY_KP_6,		/* 102 */
163	KEY_KP_3,		/* 103 */
164	KEY_KP_Decimal,		/* 104 */
165	KEY_KP_Minus,		/* 105 */
166	KEY_KP_Plus,		/* 106 */
167	KEY_UNKNOWN,		/* 107 */
168	KEY_KP_Enter,		/* 108 */
169	KEY_UNKNOWN,		/* 109 */
170	KEY_Escape,		/* 110 */
171	KEY_UNKNOWN,		/* 111 */
172	KEY_F1,			/* 112 */
173	KEY_F2,			/* 113 */
174	KEY_F3,			/* 114 */
175	KEY_F4,			/* 115 */
176	KEY_F5,			/* 116 */
177	KEY_F6,			/* 117 */
178	KEY_F7,			/* 118 */
179	KEY_F8,			/* 119 */
180	KEY_F9,			/* 120 */
181	KEY_F10,		/* 121 */
182	KEY_F11,		/* 122 */
183	KEY_F12,		/* 123 */
184	KEY_Print,		/* 124 */
185	KEY_ScrollLock,		/* 125 */
186	KEY_Pause,		/* 126 */
187	KEY_UNKNOWN,		/* 127 */
188	KEY_UNKNOWN,		/* 128 */
189	KEY_UNKNOWN,		/* 129 */
190	KEY_UNKNOWN,		/* 130 */
191	KEY_NFER,		/* 131 */
192	KEY_XFER,		/* 132 */
193	KEY_HKTG,		/* 133 */
194	KEY_UNKNOWN,		/* 134 */
195#elif defined(sparc) || defined(__sparc__)
196	KEY_UNKNOWN,		/* 0x00 */
197	KEY_UNKNOWN,		/* 0x01 */
198	KEY_UNKNOWN,		/* 0x02 */
199	KEY_UNKNOWN,		/* 0x03 */
200	KEY_UNKNOWN,		/* 0x04 */
201	KEY_F1,			/* 0x05 */
202	KEY_F2,			/* 0x06 */
203	KEY_F10,		/* 0x07 */
204	KEY_F3,			/* 0x08 */
205	KEY_F11,		/* 0x09 */
206	KEY_F4,			/* 0x0A */
207	KEY_F12,		/* 0x0B */
208	KEY_F5,			/* 0x0C */
209	KEY_UNKNOWN,		/* 0x0D */
210	KEY_F6,			/* 0x0E */
211	KEY_UNKNOWN,		/* 0x0F */
212	KEY_F7,			/* 0x10 */
213	KEY_F8,			/* 0x11 */
214	KEY_F9,			/* 0x12 */
215	KEY_Alt,		/* 0x13 */
216	KEY_Up,			/* 0x14 */
217	KEY_Pause,		/* 0x15 */
218	KEY_SysReqest,		/* 0x16 */
219	KEY_ScrollLock,		/* 0x17 */
220	KEY_Left,		/* 0x18 */
221	KEY_UNKNOWN,		/* 0x19 */
222	KEY_UNKNOWN,		/* 0x1A */
223	KEY_Down,		/* 0x1B */
224	KEY_Right,		/* 0x1C */
225	KEY_Escape,		/* 0x1D */
226	KEY_1,			/* 0x1E */
227	KEY_2,			/* 0x1F */
228	KEY_3,			/* 0x20 */
229	KEY_4,			/* 0x21 */
230	KEY_5,			/* 0x22 */
231	KEY_6,			/* 0x23 */
232	KEY_7,			/* 0x24 */
233	KEY_8,			/* 0x25 */
234	KEY_9,			/* 0x26 */
235	KEY_0,			/* 0x27 */
236	KEY_Minus,		/* 0x28 */
237	KEY_Equal,		/* 0x29 */
238	KEY_Tilde,		/* 0x2A */
239	KEY_BackSpace,		/* 0x2B */
240	KEY_Insert,		/* 0x2C */
241	KEY_UNKNOWN,		/* 0x2D */
242	KEY_KP_Divide,		/* 0x2E */
243	KEY_KP_Multiply,	/* 0x2F */
244	KEY_UNKNOWN,		/* 0x30 */
245	KEY_UNKNOWN,		/* 0x31 */
246	KEY_KP_Decimal,		/* 0x32 */
247	KEY_UNKNOWN,		/* 0x33 */
248	KEY_Home,		/* 0x34 */
249	KEY_Tab,		/* 0x35 */
250	KEY_Q,			/* 0x36 */
251	KEY_W,			/* 0x37 */
252	KEY_E,			/* 0x38 */
253	KEY_R,			/* 0x39 */
254	KEY_T,			/* 0x3A */
255	KEY_Y,			/* 0x3B */
256	KEY_U,			/* 0x3C */
257	KEY_I,			/* 0x3D */
258	KEY_O,			/* 0x3E */
259	KEY_P,			/* 0x3F */
260	KEY_LBrace,		/* 0x40 */
261	KEY_RBrace,		/* 0x41 */
262	KEY_Delete,		/* 0x42 */
263	KEY_UNKNOWN,		/* 0x43 */
264	KEY_KP_7,		/* 0x44 */
265	KEY_KP_8,		/* 0x45 */
266	KEY_KP_9,		/* 0x46 */
267	KEY_KP_Minus,		/* 0x47 */
268	KEY_UNKNOWN,		/* 0x48 */
269	KEY_UNKNOWN,		/* 0x49 */
270	KEY_End,		/* 0x4A */
271	KEY_UNKNOWN,		/* 0x4B */
272	KEY_LCtrl,		/* 0x4C */
273	KEY_A,			/* 0x4D */
274	KEY_S,			/* 0x4E */
275	KEY_D,			/* 0x4F */
276	KEY_F,			/* 0x50 */
277	KEY_G,			/* 0x51 */
278	KEY_H,			/* 0x52 */
279	KEY_J,			/* 0x53 */
280	KEY_K,			/* 0x54 */
281	KEY_L,			/* 0x55 */
282	KEY_SemiColon,		/* 0x56 */
283	KEY_Quote,		/* 0x57 */
284	KEY_BSlash,		/* 0x58 */
285	KEY_Enter,		/* 0x59 */
286	KEY_KP_Enter,		/* 0x5A */
287	KEY_KP_4,		/* 0x5B */
288	KEY_KP_5,		/* 0x5C */
289	KEY_KP_6,		/* 0x5D */
290	KEY_KP_0,		/* 0x5E */
291	KEY_UNKNOWN,		/* 0x5F */
292	KEY_PgUp,		/* 0x60 */
293	KEY_UNKNOWN,		/* 0x61 */
294	KEY_NumLock,		/* 0x62 */
295	KEY_ShiftL,		/* 0x63 */
296	KEY_Z,			/* 0x64 */
297	KEY_X,			/* 0x65 */
298	KEY_C,			/* 0x66 */
299	KEY_V,			/* 0x67 */
300	KEY_B,			/* 0x68 */
301	KEY_N,			/* 0x69 */
302	KEY_M,			/* 0x6A */
303	KEY_Comma,		/* 0x6B */
304	KEY_Period,		/* 0x6C */
305	KEY_Slash,		/* 0x6D */
306	KEY_ShiftR,		/* 0x6E */
307	KEY_UNKNOWN,		/* 0x6F */
308	KEY_KP_1,		/* 0x70 */
309	KEY_KP_2,		/* 0x71 */
310	KEY_KP_3,		/* 0x72 */
311	KEY_UNKNOWN,		/* 0x73 */
312	KEY_UNKNOWN,		/* 0x74 */
313	KEY_UNKNOWN,		/* 0x75 */
314	KEY_UNKNOWN,		/* 0x76 */
315	KEY_CapsLock,		/* 0x77 */
316	KEY_LMeta,		/* 0x78 */
317	KEY_Space,		/* 0x79 */
318	KEY_RMeta,		/* 0x7A */
319	KEY_PgDown,		/* 0x7B */
320	KEY_UNKNOWN,		/* 0x7C */
321	KEY_KP_Plus,		/* 0x7D */
322	KEY_UNKNOWN,		/* 0x7E */
323	KEY_UNKNOWN,		/* 0x7F */
324#endif
325	/* The rest default to KEY_UNKNOWN */
326};
327
328static
329TransMapRec sunTransMap = {
330    0,
331    (sizeof(sunmap)/sizeof(unsigned char)),
332    sunmap
333};
334
335#if defined(KB_USB)
336static unsigned char usbmap[256] = {
337/*
338 * partially taken from ../bsd/bsd_KbdMap.c
339 *
340 * added keycodes for Sun special keys (left function keys, audio control)
341 */
342	/* 0 */ KEY_NOTUSED,
343	/* 1 */ KEY_NOTUSED,
344	/* 2 */ KEY_NOTUSED,
345	/* 3 */ KEY_NOTUSED,
346	/* 4 */ KEY_A,
347	/* 5 */ KEY_B,
348	/* 6 */ KEY_C,
349	/* 7 */ KEY_D,
350	/* 8 */ KEY_E,
351	/* 9 */ KEY_F,
352	/* 10 */ KEY_G,
353	/* 11 */ KEY_H,
354	/* 12 */ KEY_I,
355	/* 13 */ KEY_J,
356	/* 14 */ KEY_K,
357	/* 15 */ KEY_L,
358	/* 16 */ KEY_M,
359	/* 17 */ KEY_N,
360	/* 18 */ KEY_O,
361	/* 19 */ KEY_P,
362	/* 20 */ KEY_Q,
363	/* 21 */ KEY_R,
364	/* 22 */ KEY_S,
365	/* 23 */ KEY_T,
366	/* 24 */ KEY_U,
367	/* 25 */ KEY_V,
368	/* 26 */ KEY_W,
369	/* 27 */ KEY_X,
370	/* 28 */ KEY_Y,
371	/* 29 */ KEY_Z,
372	/* 30 */ KEY_1,		/* 1 !*/
373	/* 31 */ KEY_2,		/* 2 @ */
374	/* 32 */ KEY_3,		/* 3 # */
375	/* 33 */ KEY_4,		/* 4 $ */
376	/* 34 */ KEY_5,		/* 5 % */
377	/* 35 */ KEY_6,		/* 6 ^ */
378	/* 36 */ KEY_7,		/* 7 & */
379	/* 37 */ KEY_8,		/* 8 * */
380	/* 38 */ KEY_9,		/* 9 ( */
381	/* 39 */ KEY_0,		/* 0 ) */
382	/* 40 */ KEY_Enter,	/* Return  */
383	/* 41 */ KEY_Escape,	/* Escape */
384	/* 42 */ KEY_BackSpace,	/* Backspace Delete */
385	/* 43 */ KEY_Tab,	/* Tab */
386	/* 44 */ KEY_Space,	/* Space */
387	/* 45 */ KEY_Minus,	/* - _ */
388	/* 46 */ KEY_Equal,	/* = + */
389	/* 47 */ KEY_LBrace,	/* [ { */
390	/* 48 */ KEY_RBrace,	/* ] } */
391	/* 49 */ KEY_BSlash,	/* \ | */
392	/* 50 */ KEY_BSlash,	/* \ _ # ~ on some keyboards */
393	/* 51 */ KEY_SemiColon,	/* ; : */
394	/* 52 */ KEY_Quote,	/* ' " */
395	/* 53 */ KEY_Tilde,	/* ` ~ */
396	/* 54 */ KEY_Comma,	/* , <  */
397	/* 55 */ KEY_Period,	/* . > */
398	/* 56 */ KEY_Slash,	/* / ? */
399	/* 57 */ KEY_CapsLock,	/* Caps Lock */
400	/* 58 */ KEY_F1,		/* F1 */
401	/* 59 */ KEY_F2,		/* F2 */
402	/* 60 */ KEY_F3,		/* F3 */
403	/* 61 */ KEY_F4,		/* F4 */
404	/* 62 */ KEY_F5,		/* F5 */
405	/* 63 */ KEY_F6,		/* F6 */
406	/* 64 */ KEY_F7,		/* F7 */
407	/* 65 */ KEY_F8,		/* F8 */
408	/* 66 */ KEY_F9,		/* F9 */
409	/* 67 */ KEY_F10,	/* F10 */
410	/* 68 */ KEY_F11,	/* F11 */
411	/* 69 */ KEY_F12,	/* F12 */
412	/* 70 */ KEY_Print,	/* PrintScrn SysReq */
413	/* 71 */ KEY_ScrollLock,	/* Scroll Lock */
414	/* 72 */ KEY_Pause,	/* Pause Break */
415	/* 73 */ KEY_Insert,	/* Insert XXX  Help on some Mac Keyboards */
416	/* 74 */ KEY_Home,	/* Home */
417	/* 75 */ KEY_PgUp,	/* Page Up */
418	/* 76 */ KEY_Delete,	/* Delete */
419	/* 77 */ KEY_End,	/* End */
420	/* 78 */ KEY_PgDown,	/* Page Down */
421	/* 79 */ KEY_Right,	/* Right Arrow */
422	/* 80 */ KEY_Left,	/* Left Arrow */
423	/* 81 */ KEY_Down,	/* Down Arrow */
424	/* 82 */ KEY_Up,		/* Up Arrow */
425	/* 83 */ KEY_NumLock,	/* Num Lock */
426	/* 84 */ KEY_KP_Divide,	/* Keypad / */
427	/* 85 */ KEY_KP_Multiply, /* Keypad * */
428	/* 86 */ KEY_KP_Minus,	/* Keypad - */
429	/* 87 */ KEY_KP_Plus,	/* Keypad + */
430	/* 88 */ KEY_KP_Enter,	/* Keypad Enter */
431	/* 89 */ KEY_KP_1,	/* Keypad 1 End */
432	/* 90 */ KEY_KP_2,	/* Keypad 2 Down */
433	/* 91 */ KEY_KP_3,	/* Keypad 3 Pg Down */
434	/* 92 */ KEY_KP_4,	/* Keypad 4 Left  */
435	/* 93 */ KEY_KP_5,	/* Keypad 5 */
436	/* 94 */ KEY_KP_6,	/* Keypad 6 */
437	/* 95 */ KEY_KP_7,	/* Keypad 7 Home */
438	/* 96 */ KEY_KP_8,	/* Keypad 8 Up */
439	/* 97 */ KEY_KP_9,	/* KEypad 9 Pg Up */
440	/* 98 */ KEY_KP_0,	/* Keypad 0 Ins */
441	/* 99 */ KEY_KP_Decimal,	/* Keypad . Del */
442	/* 100 */ KEY_Less,	/* < > on some keyboards */
443	/* 101 */ KEY_Menu,	/* Menu */
444	/* 102 */ KEY_Power,	/* Sun: Power */
445	/* 103 */ KEY_KP_Equal, /* Keypad = on Mac keyboards */
446	/* 104 */ KEY_NOTUSED,
447	/* 105 */ KEY_NOTUSED,
448	/* 106 */ KEY_NOTUSED,
449	/* 107 */ KEY_NOTUSED,
450	/* 108 */ KEY_NOTUSED,
451	/* 109 */ KEY_NOTUSED,
452	/* 110 */ KEY_NOTUSED,
453	/* 111 */ KEY_NOTUSED,
454	/* 112 */ KEY_NOTUSED,
455	/* 113 */ KEY_NOTUSED,
456	/* 114 */ KEY_NOTUSED,
457	/* 115 */ KEY_NOTUSED,
458	/* 116 */ KEY_L7,	/* Sun: Open */
459	/* 117 */ KEY_Help,	/* Sun: Help */
460	/* 118 */ KEY_L3,	/* Sun: Props */
461	/* 119 */ KEY_L5,	/* Sun: Front */
462	/* 120 */ KEY_L1,	/* Sun: Stop */
463	/* 121 */ KEY_L2,	/* Sun: Again */
464	/* 122 */ KEY_L4,	/* Sun: Undo */
465	/* 123 */ KEY_L10,	/* Sun: Cut */
466	/* 124 */ KEY_L6,	/* Sun: Copy */
467	/* 125 */ KEY_L8,	/* Sun: Paste */
468	/* 126 */ KEY_L9,	/* Sun: Find */
469	/* 127 */ KEY_Mute,	/* Sun: AudioMute */
470	/* 128 */ KEY_AudioRaise,	/* Sun: AudioRaise */
471	/* 129 */ KEY_AudioLower,	/* Sun: AudioLower */
472	/* 130 */ KEY_NOTUSED,
473	/* 131 */ KEY_NOTUSED,
474	/* 132 */ KEY_NOTUSED,
475	/* 133 */ KEY_NOTUSED,
476	/* 134 */ KEY_NOTUSED,
477	/* 135 */ KEY_BSlash2,	/* Sun Japanese Kbd: Backslash / Underscore */
478	/* 136 */ KEY_HKTG,	/* Sun Japanese type7 Kbd: Hirugana/Katakana */
479	/* 137 */ KEY_Yen,	/* Sun Japanese Kbd: Yen / Brokenbar */
480	/* 138 */ KEY_XFER,	/* Sun Japanese Kbd: Kanji Transfer */
481	/* 139 */ KEY_NFER,	/* Sun Japanese Kbd: No Kanji Transfer */
482	/* 140 */ KEY_NOTUSED,
483	/* 141 */ KEY_NOTUSED,
484	/* 142 */ KEY_NOTUSED,
485	/* 143 */ KEY_NOTUSED,
486	/* 144 */ KEY_Hangul,		/* Korean 106 Kbd: Hangul */
487	/* 145 */ KEY_Hangul_Hanja,	/* Korean 106 Kbd: Hanja */
488	/* 146 */ KEY_NOTUSED,
489	/* 147 */ KEY_NOTUSED,
490	/* 148 */ KEY_NOTUSED,
491	/* 149 */ KEY_NOTUSED,
492	/* 150 */ KEY_NOTUSED,
493	/* 151 */ KEY_NOTUSED,
494	/* 152 */ KEY_NOTUSED,
495	/* 153 */ KEY_NOTUSED,
496	/* 154 */ KEY_NOTUSED,
497	/* 155 */ KEY_NOTUSED,
498	/* 156 */ KEY_NOTUSED,
499	/* 157 */ KEY_NOTUSED,
500	/* 158 */ KEY_NOTUSED,
501	/* 159 */ KEY_NOTUSED,
502	/* 160 */ KEY_NOTUSED,
503	/* 161 */ KEY_NOTUSED,
504	/* 162 */ KEY_NOTUSED,
505	/* 163 */ KEY_NOTUSED,
506	/* 164 */ KEY_NOTUSED,
507	/* 165 */ KEY_NOTUSED,
508	/* 166 */ KEY_NOTUSED,
509	/* 167 */ KEY_NOTUSED,
510	/* 168 */ KEY_NOTUSED,
511	/* 169 */ KEY_NOTUSED,
512	/* 170 */ KEY_NOTUSED,
513	/* 171 */ KEY_NOTUSED,
514	/* 172 */ KEY_NOTUSED,
515	/* 173 */ KEY_NOTUSED,
516	/* 174 */ KEY_NOTUSED,
517	/* 175 */ KEY_NOTUSED,
518	/* 176 */ KEY_NOTUSED,
519	/* 177 */ KEY_NOTUSED,
520	/* 178 */ KEY_NOTUSED,
521	/* 179 */ KEY_NOTUSED,
522	/* 180 */ KEY_NOTUSED,
523	/* 181 */ KEY_NOTUSED,
524	/* 182 */ KEY_NOTUSED,
525	/* 183 */ KEY_NOTUSED,
526	/* 184 */ KEY_NOTUSED,
527	/* 185 */ KEY_NOTUSED,
528	/* 186 */ KEY_NOTUSED,
529	/* 187 */ KEY_NOTUSED,
530	/* 188 */ KEY_NOTUSED,
531	/* 189 */ KEY_NOTUSED,
532	/* 190 */ KEY_NOTUSED,
533	/* 191 */ KEY_NOTUSED,
534	/* 192 */ KEY_NOTUSED,
535	/* 193 */ KEY_NOTUSED,
536	/* 194 */ KEY_NOTUSED,
537	/* 195 */ KEY_NOTUSED,
538	/* 196 */ KEY_NOTUSED,
539	/* 197 */ KEY_NOTUSED,
540	/* 198 */ KEY_NOTUSED,
541	/* 199 */ KEY_NOTUSED,
542	/* 200 */ KEY_NOTUSED,
543	/* 201 */ KEY_NOTUSED,
544	/* 202 */ KEY_NOTUSED,
545	/* 203 */ KEY_NOTUSED,
546	/* 204 */ KEY_NOTUSED,
547	/* 205 */ KEY_NOTUSED,
548	/* 206 */ KEY_NOTUSED,
549	/* 207 */ KEY_NOTUSED,
550	/* 208 */ KEY_NOTUSED,
551	/* 209 */ KEY_NOTUSED,
552	/* 210 */ KEY_NOTUSED,
553	/* 211 */ KEY_NOTUSED,
554	/* 212 */ KEY_NOTUSED,
555	/* 213 */ KEY_NOTUSED,
556	/* 214 */ KEY_NOTUSED,
557	/* 215 */ KEY_NOTUSED,
558	/* 216 */ KEY_NOTUSED,
559	/* 217 */ KEY_NOTUSED,
560	/* 218 */ KEY_NOTUSED,
561	/* 219 */ KEY_NOTUSED,
562	/* 220 */ KEY_NOTUSED,
563	/* 221 */ KEY_NOTUSED,
564	/* 222 */ KEY_NOTUSED,
565	/* 223 */ KEY_NOTUSED,
566	/* 224 */ KEY_LCtrl,	/* Left Control */
567	/* 225 */ KEY_ShiftL,	/* Left Shift */
568	/* 226 */ KEY_Alt,	/* Left Alt */
569	/* 227 */ KEY_LMeta,	/* Left Meta */
570	/* 228 */ KEY_RCtrl,	/* Right Control */
571	/* 229 */ KEY_ShiftR,	/* Right Shift */
572	/* 230 */ KEY_AltLang,	/* Right Alt, AKA AltGr */
573	/* 231 */ KEY_RMeta,	/* Right Meta */
574};
575
576static
577TransMapRec usbTransMap = {
578    0,
579    (sizeof(usbmap)/sizeof(unsigned char)),
580    usbmap
581};
582#endif /* KB_USB */
583
584_X_HIDDEN void
585KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
586{
587    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
588    sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
589    int i;
590    KeySym        *k;
591
592#if defined(KB_USB)
593    if (priv->ktype == KB_USB)
594	pKbd->scancodeMap = &usbTransMap;
595    else
596#endif
597        pKbd->scancodeMap = &sunTransMap;
598
599    /*
600     * Add Sun keyboard keysyms to default map
601     */
602#define map_for_key(k,c) 	map[(k * GLYPHS_PER_KEY) + c]
603    map_for_key(KEY_Power,	0) = SunXK_PowerSwitch;
604    map_for_key(KEY_Power,	1) = SunXK_PowerSwitchShift;
605    map_for_key(KEY_Mute,	0) = SunXK_AudioMute;
606    map_for_key(KEY_Mute,	1) = SunXK_VideoDegauss;
607    map_for_key(KEY_AudioLower,	0) = SunXK_AudioLowerVolume;
608    map_for_key(KEY_AudioLower,	1) = SunXK_VideoLowerBrightness;
609    map_for_key(KEY_AudioRaise,	0) = SunXK_AudioRaiseVolume;
610    map_for_key(KEY_AudioRaise,	1) = SunXK_VideoRaiseBrightness;
611    map_for_key(KEY_Help,	0) = XK_Help;
612    map_for_key(KEY_L1,		0) = XK_L1;
613    map_for_key(KEY_L2,		0) = XK_L2;
614    map_for_key(KEY_L3,		0) = XK_L3;
615    map_for_key(KEY_L4,		0) = XK_L4;
616    map_for_key(KEY_L5,		0) = XK_L5;
617    map_for_key(KEY_L6,		0) = XK_L6;
618    map_for_key(KEY_L7,		0) = XK_L7;
619    map_for_key(KEY_L8,		0) = XK_L8;
620    map_for_key(KEY_L9,		0) = XK_L9;
621    map_for_key(KEY_L10,	0) = XK_L10;
622    map_for_key(KEY_F11,	0) = SunXK_F36;
623    map_for_key(KEY_F12,	0) = SunXK_F37;
624    map_for_key(KEY_Menu,	0) = XK_Multi_key;
625
626    /*
627     * compute the modifier map
628     */
629    for (i = 0; i < MAP_LENGTH; i++)
630	pModMap[i] = NoSymbol;  /* make sure it is restored */
631
632    for (k = map, i = MIN_KEYCODE;
633	 i < (NUM_KEYCODES + MIN_KEYCODE);
634	 i++, k += 4)
635    {
636	switch(*k) {
637
638	case XK_Shift_L:
639	case XK_Shift_R:
640	    pModMap[i] = ShiftMask;
641	    break;
642
643	case XK_Control_L:
644	case XK_Control_R:
645	    pModMap[i] = ControlMask;
646	    break;
647
648	case XK_Caps_Lock:
649	    pModMap[i] = LockMask;
650	    break;
651
652	case XK_Alt_L:
653	case XK_Alt_R:
654	    pModMap[i] = AltMask;
655	    break;
656
657	case XK_Num_Lock:
658	    pModMap[i] = NumLockMask;
659	    break;
660
661	case XK_Scroll_Lock:
662	    pModMap[i] = ScrollLockMask;
663	    break;
664
665	    /* kana support */
666	case XK_Kana_Lock:
667	case XK_Kana_Shift:
668	    pModMap[i] = KanaMask;
669	    break;
670
671	    /* alternate toggle for multinational support */
672	case XK_Mode_switch:
673	    pModMap[i] = AltLangMask;
674	    break;
675
676	}
677    }
678
679    pKeySyms->map        = map;
680    pKeySyms->mapWidth   = GLYPHS_PER_KEY;
681    pKeySyms->minKeyCode = MIN_KEYCODE;
682    pKeySyms->maxKeyCode = MAX_KEYCODE;
683}
684