source: trunk/synergy/lib/platform/CXWindowsUtil.cpp

Last change on this file was 2749, checked in by bird, 19 years ago

synergy v1.3.1 sources (zip).

File size: 79.9 KB
Line 
1/*
2 * synergy -- mouse and keyboard sharing utility
3 * Copyright (C) 2002 Chris Schoeneman
4 *
5 * This package is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * found in the file COPYING that should have accompanied this file.
8 *
9 * This package is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14
15#include "CXWindowsUtil.h"
16#include "KeyTypes.h"
17#include "CThread.h"
18#include "CLog.h"
19#include "CStringUtil.h"
20#include <X11/Xatom.h>
21#define XK_APL
22#define XK_ARABIC
23#define XK_ARMENIAN
24#define XK_CAUCASUS
25#define XK_CURRENCY
26#define XK_CYRILLIC
27#define XK_GEORGIAN
28#define XK_GREEK
29#define XK_HEBREW
30#define XK_KATAKANA
31#define XK_KOREAN
32#define XK_LATIN1
33#define XK_LATIN2
34#define XK_LATIN3
35#define XK_LATIN4
36#define XK_LATIN8
37#define XK_LATIN9
38#define XK_MISCELLANY
39#define XK_PUBLISHING
40#define XK_SPECIAL
41#define XK_TECHNICAL
42#define XK_THAI
43#define XK_VIETNAMESE
44#define XK_XKB_KEYS
45#include <X11/keysym.h>
46
47#if !defined(XK_OE)
48#define XK_OE 0x13bc
49#endif
50#if !defined(XK_oe)
51#define XK_oe 0x13bd
52#endif
53#if !defined(XK_Ydiaeresis)
54#define XK_Ydiaeresis 0x13be
55#endif
56
57/*
58 * This table maps keysym values into the corresponding ISO 10646
59 * (UCS, Unicode) values.
60 *
61 * The array keysymtab[] contains pairs of X11 keysym values for graphical
62 * characters and the corresponding Unicode value.
63 *
64 * Author: Markus G. Kuhn <http://www.cl.cam.ac.uk/~mgk25/>,
65 * University of Cambridge, April 2001
66 *
67 * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing
68 * an initial draft of the mapping table.
69 *
70 * This software is in the public domain. Share and enjoy!
71 */
72
73struct codepair {
74 KeySym keysym;
75 UInt32 ucs4;
76} s_keymap[] = {
77{ XK_Aogonek, 0x0104 }, /* LATIN CAPITAL LETTER A WITH OGONEK */
78{ XK_breve, 0x02d8 }, /* BREVE */
79{ XK_Lstroke, 0x0141 }, /* LATIN CAPITAL LETTER L WITH STROKE */
80{ XK_Lcaron, 0x013d }, /* LATIN CAPITAL LETTER L WITH CARON */
81{ XK_Sacute, 0x015a }, /* LATIN CAPITAL LETTER S WITH ACUTE */
82{ XK_Scaron, 0x0160 }, /* LATIN CAPITAL LETTER S WITH CARON */
83{ XK_Scedilla, 0x015e }, /* LATIN CAPITAL LETTER S WITH CEDILLA */
84{ XK_Tcaron, 0x0164 }, /* LATIN CAPITAL LETTER T WITH CARON */
85{ XK_Zacute, 0x0179 }, /* LATIN CAPITAL LETTER Z WITH ACUTE */
86{ XK_Zcaron, 0x017d }, /* LATIN CAPITAL LETTER Z WITH CARON */
87{ XK_Zabovedot, 0x017b }, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */
88{ XK_aogonek, 0x0105 }, /* LATIN SMALL LETTER A WITH OGONEK */
89{ XK_ogonek, 0x02db }, /* OGONEK */
90{ XK_lstroke, 0x0142 }, /* LATIN SMALL LETTER L WITH STROKE */
91{ XK_lcaron, 0x013e }, /* LATIN SMALL LETTER L WITH CARON */
92{ XK_sacute, 0x015b }, /* LATIN SMALL LETTER S WITH ACUTE */
93{ XK_caron, 0x02c7 }, /* CARON */
94{ XK_scaron, 0x0161 }, /* LATIN SMALL LETTER S WITH CARON */
95{ XK_scedilla, 0x015f }, /* LATIN SMALL LETTER S WITH CEDILLA */
96{ XK_tcaron, 0x0165 }, /* LATIN SMALL LETTER T WITH CARON */
97{ XK_zacute, 0x017a }, /* LATIN SMALL LETTER Z WITH ACUTE */
98{ XK_doubleacute, 0x02dd }, /* DOUBLE ACUTE ACCENT */
99{ XK_zcaron, 0x017e }, /* LATIN SMALL LETTER Z WITH CARON */
100{ XK_zabovedot, 0x017c }, /* LATIN SMALL LETTER Z WITH DOT ABOVE */
101{ XK_Racute, 0x0154 }, /* LATIN CAPITAL LETTER R WITH ACUTE */
102{ XK_Abreve, 0x0102 }, /* LATIN CAPITAL LETTER A WITH BREVE */
103{ XK_Lacute, 0x0139 }, /* LATIN CAPITAL LETTER L WITH ACUTE */
104{ XK_Cacute, 0x0106 }, /* LATIN CAPITAL LETTER C WITH ACUTE */
105{ XK_Ccaron, 0x010c }, /* LATIN CAPITAL LETTER C WITH CARON */
106{ XK_Eogonek, 0x0118 }, /* LATIN CAPITAL LETTER E WITH OGONEK */
107{ XK_Ecaron, 0x011a }, /* LATIN CAPITAL LETTER E WITH CARON */
108{ XK_Dcaron, 0x010e }, /* LATIN CAPITAL LETTER D WITH CARON */
109{ XK_Dstroke, 0x0110 }, /* LATIN CAPITAL LETTER D WITH STROKE */
110{ XK_Nacute, 0x0143 }, /* LATIN CAPITAL LETTER N WITH ACUTE */
111{ XK_Ncaron, 0x0147 }, /* LATIN CAPITAL LETTER N WITH CARON */
112{ XK_Odoubleacute, 0x0150 }, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
113{ XK_Rcaron, 0x0158 }, /* LATIN CAPITAL LETTER R WITH CARON */
114{ XK_Uring, 0x016e }, /* LATIN CAPITAL LETTER U WITH RING ABOVE */
115{ XK_Udoubleacute, 0x0170 }, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
116{ XK_Tcedilla, 0x0162 }, /* LATIN CAPITAL LETTER T WITH CEDILLA */
117{ XK_racute, 0x0155 }, /* LATIN SMALL LETTER R WITH ACUTE */
118{ XK_abreve, 0x0103 }, /* LATIN SMALL LETTER A WITH BREVE */
119{ XK_lacute, 0x013a }, /* LATIN SMALL LETTER L WITH ACUTE */
120{ XK_cacute, 0x0107 }, /* LATIN SMALL LETTER C WITH ACUTE */
121{ XK_ccaron, 0x010d }, /* LATIN SMALL LETTER C WITH CARON */
122{ XK_eogonek, 0x0119 }, /* LATIN SMALL LETTER E WITH OGONEK */
123{ XK_ecaron, 0x011b }, /* LATIN SMALL LETTER E WITH CARON */
124{ XK_dcaron, 0x010f }, /* LATIN SMALL LETTER D WITH CARON */
125{ XK_dstroke, 0x0111 }, /* LATIN SMALL LETTER D WITH STROKE */
126{ XK_nacute, 0x0144 }, /* LATIN SMALL LETTER N WITH ACUTE */
127{ XK_ncaron, 0x0148 }, /* LATIN SMALL LETTER N WITH CARON */
128{ XK_odoubleacute, 0x0151 }, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */
129{ XK_rcaron, 0x0159 }, /* LATIN SMALL LETTER R WITH CARON */
130{ XK_uring, 0x016f }, /* LATIN SMALL LETTER U WITH RING ABOVE */
131{ XK_udoubleacute, 0x0171 }, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */
132{ XK_tcedilla, 0x0163 }, /* LATIN SMALL LETTER T WITH CEDILLA */
133{ XK_abovedot, 0x02d9 }, /* DOT ABOVE */
134{ XK_Hstroke, 0x0126 }, /* LATIN CAPITAL LETTER H WITH STROKE */
135{ XK_Hcircumflex, 0x0124 }, /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
136{ XK_Iabovedot, 0x0130 }, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
137{ XK_Gbreve, 0x011e }, /* LATIN CAPITAL LETTER G WITH BREVE */
138{ XK_Jcircumflex, 0x0134 }, /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
139{ XK_hstroke, 0x0127 }, /* LATIN SMALL LETTER H WITH STROKE */
140{ XK_hcircumflex, 0x0125 }, /* LATIN SMALL LETTER H WITH CIRCUMFLEX */
141{ XK_idotless, 0x0131 }, /* LATIN SMALL LETTER DOTLESS I */
142{ XK_gbreve, 0x011f }, /* LATIN SMALL LETTER G WITH BREVE */
143{ XK_jcircumflex, 0x0135 }, /* LATIN SMALL LETTER J WITH CIRCUMFLEX */
144{ XK_Cabovedot, 0x010a }, /* LATIN CAPITAL LETTER C WITH DOT ABOVE */
145{ XK_Ccircumflex, 0x0108 }, /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
146{ XK_Gabovedot, 0x0120 }, /* LATIN CAPITAL LETTER G WITH DOT ABOVE */
147{ XK_Gcircumflex, 0x011c }, /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
148{ XK_Ubreve, 0x016c }, /* LATIN CAPITAL LETTER U WITH BREVE */
149{ XK_Scircumflex, 0x015c }, /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
150{ XK_cabovedot, 0x010b }, /* LATIN SMALL LETTER C WITH DOT ABOVE */
151{ XK_ccircumflex, 0x0109 }, /* LATIN SMALL LETTER C WITH CIRCUMFLEX */
152{ XK_gabovedot, 0x0121 }, /* LATIN SMALL LETTER G WITH DOT ABOVE */
153{ XK_gcircumflex, 0x011d }, /* LATIN SMALL LETTER G WITH CIRCUMFLEX */
154{ XK_ubreve, 0x016d }, /* LATIN SMALL LETTER U WITH BREVE */
155{ XK_scircumflex, 0x015d }, /* LATIN SMALL LETTER S WITH CIRCUMFLEX */
156{ XK_kra, 0x0138 }, /* LATIN SMALL LETTER KRA */
157{ XK_Rcedilla, 0x0156 }, /* LATIN CAPITAL LETTER R WITH CEDILLA */
158{ XK_Itilde, 0x0128 }, /* LATIN CAPITAL LETTER I WITH TILDE */
159{ XK_Lcedilla, 0x013b }, /* LATIN CAPITAL LETTER L WITH CEDILLA */
160{ XK_Emacron, 0x0112 }, /* LATIN CAPITAL LETTER E WITH MACRON */
161{ XK_Gcedilla, 0x0122 }, /* LATIN CAPITAL LETTER G WITH CEDILLA */
162{ XK_Tslash, 0x0166 }, /* LATIN CAPITAL LETTER T WITH STROKE */
163{ XK_rcedilla, 0x0157 }, /* LATIN SMALL LETTER R WITH CEDILLA */
164{ XK_itilde, 0x0129 }, /* LATIN SMALL LETTER I WITH TILDE */
165{ XK_lcedilla, 0x013c }, /* LATIN SMALL LETTER L WITH CEDILLA */
166{ XK_emacron, 0x0113 }, /* LATIN SMALL LETTER E WITH MACRON */
167{ XK_gcedilla, 0x0123 }, /* LATIN SMALL LETTER G WITH CEDILLA */
168{ XK_tslash, 0x0167 }, /* LATIN SMALL LETTER T WITH STROKE */
169{ XK_ENG, 0x014a }, /* LATIN CAPITAL LETTER ENG */
170{ XK_eng, 0x014b }, /* LATIN SMALL LETTER ENG */
171{ XK_Amacron, 0x0100 }, /* LATIN CAPITAL LETTER A WITH MACRON */
172{ XK_Iogonek, 0x012e }, /* LATIN CAPITAL LETTER I WITH OGONEK */
173{ XK_Eabovedot, 0x0116 }, /* LATIN CAPITAL LETTER E WITH DOT ABOVE */
174{ XK_Imacron, 0x012a }, /* LATIN CAPITAL LETTER I WITH MACRON */
175{ XK_Ncedilla, 0x0145 }, /* LATIN CAPITAL LETTER N WITH CEDILLA */
176{ XK_Omacron, 0x014c }, /* LATIN CAPITAL LETTER O WITH MACRON */
177{ XK_Kcedilla, 0x0136 }, /* LATIN CAPITAL LETTER K WITH CEDILLA */
178{ XK_Uogonek, 0x0172 }, /* LATIN CAPITAL LETTER U WITH OGONEK */
179{ XK_Utilde, 0x0168 }, /* LATIN CAPITAL LETTER U WITH TILDE */
180{ XK_Umacron, 0x016a }, /* LATIN CAPITAL LETTER U WITH MACRON */
181{ XK_amacron, 0x0101 }, /* LATIN SMALL LETTER A WITH MACRON */
182{ XK_iogonek, 0x012f }, /* LATIN SMALL LETTER I WITH OGONEK */
183{ XK_eabovedot, 0x0117 }, /* LATIN SMALL LETTER E WITH DOT ABOVE */
184{ XK_imacron, 0x012b }, /* LATIN SMALL LETTER I WITH MACRON */
185{ XK_ncedilla, 0x0146 }, /* LATIN SMALL LETTER N WITH CEDILLA */
186{ XK_omacron, 0x014d }, /* LATIN SMALL LETTER O WITH MACRON */
187{ XK_kcedilla, 0x0137 }, /* LATIN SMALL LETTER K WITH CEDILLA */
188{ XK_uogonek, 0x0173 }, /* LATIN SMALL LETTER U WITH OGONEK */
189{ XK_utilde, 0x0169 }, /* LATIN SMALL LETTER U WITH TILDE */
190{ XK_umacron, 0x016b }, /* LATIN SMALL LETTER U WITH MACRON */
191{ XK_Babovedot, 0x1e02 }, /* LATIN CAPITAL LETTER B WITH DOT ABOVE */
192{ XK_babovedot, 0x1e03 }, /* LATIN SMALL LETTER B WITH DOT ABOVE */
193{ XK_Dabovedot, 0x1e0a }, /* LATIN CAPITAL LETTER D WITH DOT ABOVE */
194{ XK_Wgrave, 0x1e80 }, /* LATIN CAPITAL LETTER W WITH GRAVE */
195{ XK_Wacute, 0x1e82 }, /* LATIN CAPITAL LETTER W WITH ACUTE */
196{ XK_dabovedot, 0x1e0b }, /* LATIN SMALL LETTER D WITH DOT ABOVE */
197{ XK_Ygrave, 0x1ef2 }, /* LATIN CAPITAL LETTER Y WITH GRAVE */
198{ XK_Fabovedot, 0x1e1e }, /* LATIN CAPITAL LETTER F WITH DOT ABOVE */
199{ XK_fabovedot, 0x1e1f }, /* LATIN SMALL LETTER F WITH DOT ABOVE */
200{ XK_Mabovedot, 0x1e40 }, /* LATIN CAPITAL LETTER M WITH DOT ABOVE */
201{ XK_mabovedot, 0x1e41 }, /* LATIN SMALL LETTER M WITH DOT ABOVE */
202{ XK_Pabovedot, 0x1e56 }, /* LATIN CAPITAL LETTER P WITH DOT ABOVE */
203{ XK_wgrave, 0x1e81 }, /* LATIN SMALL LETTER W WITH GRAVE */
204{ XK_pabovedot, 0x1e57 }, /* LATIN SMALL LETTER P WITH DOT ABOVE */
205{ XK_wacute, 0x1e83 }, /* LATIN SMALL LETTER W WITH ACUTE */
206{ XK_Sabovedot, 0x1e60 }, /* LATIN CAPITAL LETTER S WITH DOT ABOVE */
207{ XK_ygrave, 0x1ef3 }, /* LATIN SMALL LETTER Y WITH GRAVE */
208{ XK_Wdiaeresis, 0x1e84 }, /* LATIN CAPITAL LETTER W WITH DIAERESIS */
209{ XK_wdiaeresis, 0x1e85 }, /* LATIN SMALL LETTER W WITH DIAERESIS */
210{ XK_sabovedot, 0x1e61 }, /* LATIN SMALL LETTER S WITH DOT ABOVE */
211{ XK_Wcircumflex, 0x0174 }, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
212{ XK_Tabovedot, 0x1e6a }, /* LATIN CAPITAL LETTER T WITH DOT ABOVE */
213{ XK_Ycircumflex, 0x0176 }, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
214{ XK_wcircumflex, 0x0175 }, /* LATIN SMALL LETTER W WITH CIRCUMFLEX */
215{ XK_tabovedot, 0x1e6b }, /* LATIN SMALL LETTER T WITH DOT ABOVE */
216{ XK_ycircumflex, 0x0177 }, /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */
217{ XK_overline, 0x203e }, /* OVERLINE */
218{ XK_kana_fullstop, 0x3002 }, /* IDEOGRAPHIC FULL STOP */
219{ XK_kana_openingbracket, 0x300c }, /* LEFT CORNER BRACKET */
220{ XK_kana_closingbracket, 0x300d }, /* RIGHT CORNER BRACKET */
221{ XK_kana_comma, 0x3001 }, /* IDEOGRAPHIC COMMA */
222{ XK_kana_conjunctive, 0x30fb }, /* KATAKANA MIDDLE DOT */
223{ XK_kana_WO, 0x30f2 }, /* KATAKANA LETTER WO */
224{ XK_kana_a, 0x30a1 }, /* KATAKANA LETTER SMALL A */
225{ XK_kana_i, 0x30a3 }, /* KATAKANA LETTER SMALL I */
226{ XK_kana_u, 0x30a5 }, /* KATAKANA LETTER SMALL U */
227{ XK_kana_e, 0x30a7 }, /* KATAKANA LETTER SMALL E */
228{ XK_kana_o, 0x30a9 }, /* KATAKANA LETTER SMALL O */
229{ XK_kana_ya, 0x30e3 }, /* KATAKANA LETTER SMALL YA */
230{ XK_kana_yu, 0x30e5 }, /* KATAKANA LETTER SMALL YU */
231{ XK_kana_yo, 0x30e7 }, /* KATAKANA LETTER SMALL YO */
232{ XK_kana_tsu, 0x30c3 }, /* KATAKANA LETTER SMALL TU */
233{ XK_prolongedsound, 0x30fc }, /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */
234{ XK_kana_A, 0x30a2 }, /* KATAKANA LETTER A */
235{ XK_kana_I, 0x30a4 }, /* KATAKANA LETTER I */
236{ XK_kana_U, 0x30a6 }, /* KATAKANA LETTER U */
237{ XK_kana_E, 0x30a8 }, /* KATAKANA LETTER E */
238{ XK_kana_O, 0x30aa }, /* KATAKANA LETTER O */
239{ XK_kana_KA, 0x30ab }, /* KATAKANA LETTER KA */
240{ XK_kana_KI, 0x30ad }, /* KATAKANA LETTER KI */
241{ XK_kana_KU, 0x30af }, /* KATAKANA LETTER KU */
242{ XK_kana_KE, 0x30b1 }, /* KATAKANA LETTER KE */
243{ XK_kana_KO, 0x30b3 }, /* KATAKANA LETTER KO */
244{ XK_kana_SA, 0x30b5 }, /* KATAKANA LETTER SA */
245{ XK_kana_SHI, 0x30b7 }, /* KATAKANA LETTER SI */
246{ XK_kana_SU, 0x30b9 }, /* KATAKANA LETTER SU */
247{ XK_kana_SE, 0x30bb }, /* KATAKANA LETTER SE */
248{ XK_kana_SO, 0x30bd }, /* KATAKANA LETTER SO */
249{ XK_kana_TA, 0x30bf }, /* KATAKANA LETTER TA */
250{ XK_kana_CHI, 0x30c1 }, /* KATAKANA LETTER TI */
251{ XK_kana_TSU, 0x30c4 }, /* KATAKANA LETTER TU */
252{ XK_kana_TE, 0x30c6 }, /* KATAKANA LETTER TE */
253{ XK_kana_TO, 0x30c8 }, /* KATAKANA LETTER TO */
254{ XK_kana_NA, 0x30ca }, /* KATAKANA LETTER NA */
255{ XK_kana_NI, 0x30cb }, /* KATAKANA LETTER NI */
256{ XK_kana_NU, 0x30cc }, /* KATAKANA LETTER NU */
257{ XK_kana_NE, 0x30cd }, /* KATAKANA LETTER NE */
258{ XK_kana_NO, 0x30ce }, /* KATAKANA LETTER NO */
259{ XK_kana_HA, 0x30cf }, /* KATAKANA LETTER HA */
260{ XK_kana_HI, 0x30d2 }, /* KATAKANA LETTER HI */
261{ XK_kana_FU, 0x30d5 }, /* KATAKANA LETTER HU */
262{ XK_kana_HE, 0x30d8 }, /* KATAKANA LETTER HE */
263{ XK_kana_HO, 0x30db }, /* KATAKANA LETTER HO */
264{ XK_kana_MA, 0x30de }, /* KATAKANA LETTER MA */
265{ XK_kana_MI, 0x30df }, /* KATAKANA LETTER MI */
266{ XK_kana_MU, 0x30e0 }, /* KATAKANA LETTER MU */
267{ XK_kana_ME, 0x30e1 }, /* KATAKANA LETTER ME */
268{ XK_kana_MO, 0x30e2 }, /* KATAKANA LETTER MO */
269{ XK_kana_YA, 0x30e4 }, /* KATAKANA LETTER YA */
270{ XK_kana_YU, 0x30e6 }, /* KATAKANA LETTER YU */
271{ XK_kana_YO, 0x30e8 }, /* KATAKANA LETTER YO */
272{ XK_kana_RA, 0x30e9 }, /* KATAKANA LETTER RA */
273{ XK_kana_RI, 0x30ea }, /* KATAKANA LETTER RI */
274{ XK_kana_RU, 0x30eb }, /* KATAKANA LETTER RU */
275{ XK_kana_RE, 0x30ec }, /* KATAKANA LETTER RE */
276{ XK_kana_RO, 0x30ed }, /* KATAKANA LETTER RO */
277{ XK_kana_WA, 0x30ef }, /* KATAKANA LETTER WA */
278{ XK_kana_N, 0x30f3 }, /* KATAKANA LETTER N */
279{ XK_voicedsound, 0x309b }, /* KATAKANA-HIRAGANA VOICED SOUND MARK */
280{ XK_semivoicedsound, 0x309c }, /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
281{ XK_Farsi_0, 0x06f0 }, /* EXTENDED ARABIC-INDIC DIGIT 0 */
282{ XK_Farsi_1, 0x06f1 }, /* EXTENDED ARABIC-INDIC DIGIT 1 */
283{ XK_Farsi_2, 0x06f2 }, /* EXTENDED ARABIC-INDIC DIGIT 2 */
284{ XK_Farsi_3, 0x06f3 }, /* EXTENDED ARABIC-INDIC DIGIT 3 */
285{ XK_Farsi_4, 0x06f4 }, /* EXTENDED ARABIC-INDIC DIGIT 4 */
286{ XK_Farsi_5, 0x06f5 }, /* EXTENDED ARABIC-INDIC DIGIT 5 */
287{ XK_Farsi_6, 0x06f6 }, /* EXTENDED ARABIC-INDIC DIGIT 6 */
288{ XK_Farsi_7, 0x06f7 }, /* EXTENDED ARABIC-INDIC DIGIT 7 */
289{ XK_Farsi_8, 0x06f8 }, /* EXTENDED ARABIC-INDIC DIGIT 8 */
290{ XK_Farsi_9, 0x06f9 }, /* EXTENDED ARABIC-INDIC DIGIT 9 */
291{ XK_Arabic_percent, 0x066a }, /* ARABIC PERCENT */
292{ XK_Arabic_superscript_alef, 0x0670 }, /* ARABIC LETTER SUPERSCRIPT ALEF */
293{ XK_Arabic_tteh, 0x0679 }, /* ARABIC LETTER TTEH */
294{ XK_Arabic_peh, 0x067e }, /* ARABIC LETTER PEH */
295{ XK_Arabic_tcheh, 0x0686 }, /* ARABIC LETTER TCHEH */
296{ XK_Arabic_ddal, 0x0688 }, /* ARABIC LETTER DDAL */
297{ XK_Arabic_rreh, 0x0691 }, /* ARABIC LETTER RREH */
298{ XK_Arabic_comma, 0x060c }, /* ARABIC COMMA */
299{ XK_Arabic_fullstop, 0x06d4 }, /* ARABIC FULLSTOP */
300{ XK_Arabic_semicolon, 0x061b }, /* ARABIC SEMICOLON */
301{ XK_Arabic_0, 0x0660 }, /* ARABIC 0 */
302{ XK_Arabic_1, 0x0661 }, /* ARABIC 1 */
303{ XK_Arabic_2, 0x0662 }, /* ARABIC 2 */
304{ XK_Arabic_3, 0x0663 }, /* ARABIC 3 */
305{ XK_Arabic_4, 0x0664 }, /* ARABIC 4 */
306{ XK_Arabic_5, 0x0665 }, /* ARABIC 5 */
307{ XK_Arabic_6, 0x0666 }, /* ARABIC 6 */
308{ XK_Arabic_7, 0x0667 }, /* ARABIC 7 */
309{ XK_Arabic_8, 0x0668 }, /* ARABIC 8 */
310{ XK_Arabic_9, 0x0669 }, /* ARABIC 9 */
311{ XK_Arabic_question_mark, 0x061f }, /* ARABIC QUESTION MARK */
312{ XK_Arabic_hamza, 0x0621 }, /* ARABIC LETTER HAMZA */
313{ XK_Arabic_maddaonalef, 0x0622 }, /* ARABIC LETTER ALEF WITH MADDA ABOVE */
314{ XK_Arabic_hamzaonalef, 0x0623 }, /* ARABIC LETTER ALEF WITH HAMZA ABOVE */
315{ XK_Arabic_hamzaonwaw, 0x0624 }, /* ARABIC LETTER WAW WITH HAMZA ABOVE */
316{ XK_Arabic_hamzaunderalef, 0x0625 }, /* ARABIC LETTER ALEF WITH HAMZA BELOW */
317{ XK_Arabic_hamzaonyeh, 0x0626 }, /* ARABIC LETTER YEH WITH HAMZA ABOVE */
318{ XK_Arabic_alef, 0x0627 }, /* ARABIC LETTER ALEF */
319{ XK_Arabic_beh, 0x0628 }, /* ARABIC LETTER BEH */
320{ XK_Arabic_tehmarbuta, 0x0629 }, /* ARABIC LETTER TEH MARBUTA */
321{ XK_Arabic_teh, 0x062a }, /* ARABIC LETTER TEH */
322{ XK_Arabic_theh, 0x062b }, /* ARABIC LETTER THEH */
323{ XK_Arabic_jeem, 0x062c }, /* ARABIC LETTER JEEM */
324{ XK_Arabic_hah, 0x062d }, /* ARABIC LETTER HAH */
325{ XK_Arabic_khah, 0x062e }, /* ARABIC LETTER KHAH */
326{ XK_Arabic_dal, 0x062f }, /* ARABIC LETTER DAL */
327{ XK_Arabic_thal, 0x0630 }, /* ARABIC LETTER THAL */
328{ XK_Arabic_ra, 0x0631 }, /* ARABIC LETTER REH */
329{ XK_Arabic_zain, 0x0632 }, /* ARABIC LETTER ZAIN */
330{ XK_Arabic_seen, 0x0633 }, /* ARABIC LETTER SEEN */
331{ XK_Arabic_sheen, 0x0634 }, /* ARABIC LETTER SHEEN */
332{ XK_Arabic_sad, 0x0635 }, /* ARABIC LETTER SAD */
333{ XK_Arabic_dad, 0x0636 }, /* ARABIC LETTER DAD */
334{ XK_Arabic_tah, 0x0637 }, /* ARABIC LETTER TAH */
335{ XK_Arabic_zah, 0x0638 }, /* ARABIC LETTER ZAH */
336{ XK_Arabic_ain, 0x0639 }, /* ARABIC LETTER AIN */
337{ XK_Arabic_ghain, 0x063a }, /* ARABIC LETTER GHAIN */
338{ XK_Arabic_tatweel, 0x0640 }, /* ARABIC TATWEEL */
339{ XK_Arabic_feh, 0x0641 }, /* ARABIC LETTER FEH */
340{ XK_Arabic_qaf, 0x0642 }, /* ARABIC LETTER QAF */
341{ XK_Arabic_kaf, 0x0643 }, /* ARABIC LETTER KAF */
342{ XK_Arabic_lam, 0x0644 }, /* ARABIC LETTER LAM */
343{ XK_Arabic_meem, 0x0645 }, /* ARABIC LETTER MEEM */
344{ XK_Arabic_noon, 0x0646 }, /* ARABIC LETTER NOON */
345{ XK_Arabic_ha, 0x0647 }, /* ARABIC LETTER HEH */
346{ XK_Arabic_waw, 0x0648 }, /* ARABIC LETTER WAW */
347{ XK_Arabic_alefmaksura, 0x0649 }, /* ARABIC LETTER ALEF MAKSURA */
348{ XK_Arabic_yeh, 0x064a }, /* ARABIC LETTER YEH */
349{ XK_Arabic_fathatan, 0x064b }, /* ARABIC FATHATAN */
350{ XK_Arabic_dammatan, 0x064c }, /* ARABIC DAMMATAN */
351{ XK_Arabic_kasratan, 0x064d }, /* ARABIC KASRATAN */
352{ XK_Arabic_fatha, 0x064e }, /* ARABIC FATHA */
353{ XK_Arabic_damma, 0x064f }, /* ARABIC DAMMA */
354{ XK_Arabic_kasra, 0x0650 }, /* ARABIC KASRA */
355{ XK_Arabic_shadda, 0x0651 }, /* ARABIC SHADDA */
356{ XK_Arabic_sukun, 0x0652 }, /* ARABIC SUKUN */
357{ XK_Arabic_madda_above, 0x0653 }, /* ARABIC MADDA ABOVE */
358{ XK_Arabic_hamza_above, 0x0654 }, /* ARABIC HAMZA ABOVE */
359{ XK_Arabic_hamza_below, 0x0655 }, /* ARABIC HAMZA BELOW */
360{ XK_Arabic_jeh, 0x0698 }, /* ARABIC LETTER JEH */
361{ XK_Arabic_veh, 0x06a4 }, /* ARABIC LETTER VEH */
362{ XK_Arabic_keheh, 0x06a9 }, /* ARABIC LETTER KEHEH */
363{ XK_Arabic_gaf, 0x06af }, /* ARABIC LETTER GAF */
364{ XK_Arabic_noon_ghunna, 0x06ba }, /* ARABIC LETTER NOON GHUNNA */
365{ XK_Arabic_heh_doachashmee, 0x06be }, /* ARABIC LETTER HEH DOACHASHMEE */
366{ XK_Arabic_farsi_yeh, 0x06cc }, /* ARABIC LETTER FARSI YEH */
367{ XK_Arabic_yeh_baree, 0x06d2 }, /* ARABIC LETTER YEH BAREE */
368{ XK_Arabic_heh_goal, 0x06c1 }, /* ARABIC LETTER HEH GOAL */
369{ XK_Serbian_dje, 0x0452 }, /* CYRILLIC SMALL LETTER DJE */
370{ XK_Macedonia_gje, 0x0453 }, /* CYRILLIC SMALL LETTER GJE */
371{ XK_Cyrillic_io, 0x0451 }, /* CYRILLIC SMALL LETTER IO */
372{ XK_Ukrainian_ie, 0x0454 }, /* CYRILLIC SMALL LETTER UKRAINIAN IE */
373{ XK_Macedonia_dse, 0x0455 }, /* CYRILLIC SMALL LETTER DZE */
374{ XK_Ukrainian_i, 0x0456 }, /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
375{ XK_Ukrainian_yi, 0x0457 }, /* CYRILLIC SMALL LETTER YI */
376{ XK_Cyrillic_je, 0x0458 }, /* CYRILLIC SMALL LETTER JE */
377{ XK_Cyrillic_lje, 0x0459 }, /* CYRILLIC SMALL LETTER LJE */
378{ XK_Cyrillic_nje, 0x045a }, /* CYRILLIC SMALL LETTER NJE */
379{ XK_Serbian_tshe, 0x045b }, /* CYRILLIC SMALL LETTER TSHE */
380{ XK_Macedonia_kje, 0x045c }, /* CYRILLIC SMALL LETTER KJE */
381{ XK_Ukrainian_ghe_with_upturn, 0x0491 }, /* CYRILLIC SMALL LETTER GHE WITH UPTURN */
382{ XK_Byelorussian_shortu, 0x045e }, /* CYRILLIC SMALL LETTER SHORT U */
383{ XK_Cyrillic_dzhe, 0x045f }, /* CYRILLIC SMALL LETTER DZHE */
384{ XK_numerosign, 0x2116 }, /* NUMERO SIGN */
385{ XK_Serbian_DJE, 0x0402 }, /* CYRILLIC CAPITAL LETTER DJE */
386{ XK_Macedonia_GJE, 0x0403 }, /* CYRILLIC CAPITAL LETTER GJE */
387{ XK_Cyrillic_IO, 0x0401 }, /* CYRILLIC CAPITAL LETTER IO */
388{ XK_Ukrainian_IE, 0x0404 }, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */
389{ XK_Macedonia_DSE, 0x0405 }, /* CYRILLIC CAPITAL LETTER DZE */
390{ XK_Ukrainian_I, 0x0406 }, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
391{ XK_Ukrainian_YI, 0x0407 }, /* CYRILLIC CAPITAL LETTER YI */
392{ XK_Cyrillic_JE, 0x0408 }, /* CYRILLIC CAPITAL LETTER JE */
393{ XK_Cyrillic_LJE, 0x0409 }, /* CYRILLIC CAPITAL LETTER LJE */
394{ XK_Cyrillic_NJE, 0x040a }, /* CYRILLIC CAPITAL LETTER NJE */
395{ XK_Serbian_TSHE, 0x040b }, /* CYRILLIC CAPITAL LETTER TSHE */
396{ XK_Macedonia_KJE, 0x040c }, /* CYRILLIC CAPITAL LETTER KJE */
397{ XK_Ukrainian_GHE_WITH_UPTURN, 0x0490 }, /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
398{ XK_Byelorussian_SHORTU, 0x040e }, /* CYRILLIC CAPITAL LETTER SHORT U */
399{ XK_Cyrillic_DZHE, 0x040f }, /* CYRILLIC CAPITAL LETTER DZHE */
400{ XK_Cyrillic_yu, 0x044e }, /* CYRILLIC SMALL LETTER YU */
401{ XK_Cyrillic_a, 0x0430 }, /* CYRILLIC SMALL LETTER A */
402{ XK_Cyrillic_be, 0x0431 }, /* CYRILLIC SMALL LETTER BE */
403{ XK_Cyrillic_tse, 0x0446 }, /* CYRILLIC SMALL LETTER TSE */
404{ XK_Cyrillic_de, 0x0434 }, /* CYRILLIC SMALL LETTER DE */
405{ XK_Cyrillic_ie, 0x0435 }, /* CYRILLIC SMALL LETTER IE */
406{ XK_Cyrillic_ef, 0x0444 }, /* CYRILLIC SMALL LETTER EF */
407{ XK_Cyrillic_ghe, 0x0433 }, /* CYRILLIC SMALL LETTER GHE */
408{ XK_Cyrillic_ha, 0x0445 }, /* CYRILLIC SMALL LETTER HA */
409{ XK_Cyrillic_i, 0x0438 }, /* CYRILLIC SMALL LETTER I */
410{ XK_Cyrillic_shorti, 0x0439 }, /* CYRILLIC SMALL LETTER SHORT I */
411{ XK_Cyrillic_ka, 0x043a }, /* CYRILLIC SMALL LETTER KA */
412{ XK_Cyrillic_el, 0x043b }, /* CYRILLIC SMALL LETTER EL */
413{ XK_Cyrillic_em, 0x043c }, /* CYRILLIC SMALL LETTER EM */
414{ XK_Cyrillic_en, 0x043d }, /* CYRILLIC SMALL LETTER EN */
415{ XK_Cyrillic_o, 0x043e }, /* CYRILLIC SMALL LETTER O */
416{ XK_Cyrillic_pe, 0x043f }, /* CYRILLIC SMALL LETTER PE */
417{ XK_Cyrillic_ya, 0x044f }, /* CYRILLIC SMALL LETTER YA */
418{ XK_Cyrillic_er, 0x0440 }, /* CYRILLIC SMALL LETTER ER */
419{ XK_Cyrillic_es, 0x0441 }, /* CYRILLIC SMALL LETTER ES */
420{ XK_Cyrillic_te, 0x0442 }, /* CYRILLIC SMALL LETTER TE */
421{ XK_Cyrillic_u, 0x0443 }, /* CYRILLIC SMALL LETTER U */
422{ XK_Cyrillic_zhe, 0x0436 }, /* CYRILLIC SMALL LETTER ZHE */
423{ XK_Cyrillic_ve, 0x0432 }, /* CYRILLIC SMALL LETTER VE */
424{ XK_Cyrillic_softsign, 0x044c }, /* CYRILLIC SMALL LETTER SOFT SIGN */
425{ XK_Cyrillic_yeru, 0x044b }, /* CYRILLIC SMALL LETTER YERU */
426{ XK_Cyrillic_ze, 0x0437 }, /* CYRILLIC SMALL LETTER ZE */
427{ XK_Cyrillic_sha, 0x0448 }, /* CYRILLIC SMALL LETTER SHA */
428{ XK_Cyrillic_e, 0x044d }, /* CYRILLIC SMALL LETTER E */
429{ XK_Cyrillic_shcha, 0x0449 }, /* CYRILLIC SMALL LETTER SHCHA */
430{ XK_Cyrillic_che, 0x0447 }, /* CYRILLIC SMALL LETTER CHE */
431{ XK_Cyrillic_hardsign, 0x044a }, /* CYRILLIC SMALL LETTER HARD SIGN */
432{ XK_Cyrillic_YU, 0x042e }, /* CYRILLIC CAPITAL LETTER YU */
433{ XK_Cyrillic_A, 0x0410 }, /* CYRILLIC CAPITAL LETTER A */
434{ XK_Cyrillic_BE, 0x0411 }, /* CYRILLIC CAPITAL LETTER BE */
435{ XK_Cyrillic_TSE, 0x0426 }, /* CYRILLIC CAPITAL LETTER TSE */
436{ XK_Cyrillic_DE, 0x0414 }, /* CYRILLIC CAPITAL LETTER DE */
437{ XK_Cyrillic_IE, 0x0415 }, /* CYRILLIC CAPITAL LETTER IE */
438{ XK_Cyrillic_EF, 0x0424 }, /* CYRILLIC CAPITAL LETTER EF */
439{ XK_Cyrillic_GHE, 0x0413 }, /* CYRILLIC CAPITAL LETTER GHE */
440{ XK_Cyrillic_HA, 0x0425 }, /* CYRILLIC CAPITAL LETTER HA */
441{ XK_Cyrillic_I, 0x0418 }, /* CYRILLIC CAPITAL LETTER I */
442{ XK_Cyrillic_SHORTI, 0x0419 }, /* CYRILLIC CAPITAL LETTER SHORT I */
443{ XK_Cyrillic_KA, 0x041a }, /* CYRILLIC CAPITAL LETTER KA */
444{ XK_Cyrillic_EL, 0x041b }, /* CYRILLIC CAPITAL LETTER EL */
445{ XK_Cyrillic_EM, 0x041c }, /* CYRILLIC CAPITAL LETTER EM */
446{ XK_Cyrillic_EN, 0x041d }, /* CYRILLIC CAPITAL LETTER EN */
447{ XK_Cyrillic_O, 0x041e }, /* CYRILLIC CAPITAL LETTER O */
448{ XK_Cyrillic_PE, 0x041f }, /* CYRILLIC CAPITAL LETTER PE */
449{ XK_Cyrillic_YA, 0x042f }, /* CYRILLIC CAPITAL LETTER YA */
450{ XK_Cyrillic_ER, 0x0420 }, /* CYRILLIC CAPITAL LETTER ER */
451{ XK_Cyrillic_ES, 0x0421 }, /* CYRILLIC CAPITAL LETTER ES */
452{ XK_Cyrillic_TE, 0x0422 }, /* CYRILLIC CAPITAL LETTER TE */
453{ XK_Cyrillic_U, 0x0423 }, /* CYRILLIC CAPITAL LETTER U */
454{ XK_Cyrillic_ZHE, 0x0416 }, /* CYRILLIC CAPITAL LETTER ZHE */
455{ XK_Cyrillic_VE, 0x0412 }, /* CYRILLIC CAPITAL LETTER VE */
456{ XK_Cyrillic_SOFTSIGN, 0x042c }, /* CYRILLIC CAPITAL LETTER SOFT SIGN */
457{ XK_Cyrillic_YERU, 0x042b }, /* CYRILLIC CAPITAL LETTER YERU */
458{ XK_Cyrillic_ZE, 0x0417 }, /* CYRILLIC CAPITAL LETTER ZE */
459{ XK_Cyrillic_SHA, 0x0428 }, /* CYRILLIC CAPITAL LETTER SHA */
460{ XK_Cyrillic_E, 0x042d }, /* CYRILLIC CAPITAL LETTER E */
461{ XK_Cyrillic_SHCHA, 0x0429 }, /* CYRILLIC CAPITAL LETTER SHCHA */
462{ XK_Cyrillic_CHE, 0x0427 }, /* CYRILLIC CAPITAL LETTER CHE */
463{ XK_Cyrillic_HARDSIGN, 0x042a }, /* CYRILLIC CAPITAL LETTER HARD SIGN */
464{ XK_Greek_ALPHAaccent, 0x0386 }, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
465{ XK_Greek_EPSILONaccent, 0x0388 }, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
466{ XK_Greek_ETAaccent, 0x0389 }, /* GREEK CAPITAL LETTER ETA WITH TONOS */
467{ XK_Greek_IOTAaccent, 0x038a }, /* GREEK CAPITAL LETTER IOTA WITH TONOS */
468{ XK_Greek_IOTAdiaeresis, 0x03aa }, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
469{ XK_Greek_OMICRONaccent, 0x038c }, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
470{ XK_Greek_UPSILONaccent, 0x038e }, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
471{ XK_Greek_UPSILONdieresis, 0x03ab }, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
472{ XK_Greek_OMEGAaccent, 0x038f }, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
473{ XK_Greek_accentdieresis, 0x0385 }, /* GREEK DIALYTIKA TONOS */
474{ XK_Greek_horizbar, 0x2015 }, /* HORIZONTAL BAR */
475{ XK_Greek_alphaaccent, 0x03ac }, /* GREEK SMALL LETTER ALPHA WITH TONOS */
476{ XK_Greek_epsilonaccent, 0x03ad }, /* GREEK SMALL LETTER EPSILON WITH TONOS */
477{ XK_Greek_etaaccent, 0x03ae }, /* GREEK SMALL LETTER ETA WITH TONOS */
478{ XK_Greek_iotaaccent, 0x03af }, /* GREEK SMALL LETTER IOTA WITH TONOS */
479{ XK_Greek_iotadieresis, 0x03ca }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */
480{ XK_Greek_iotaaccentdieresis, 0x0390 }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
481{ XK_Greek_omicronaccent, 0x03cc }, /* GREEK SMALL LETTER OMICRON WITH TONOS */
482{ XK_Greek_upsilonaccent, 0x03cd }, /* GREEK SMALL LETTER UPSILON WITH TONOS */
483{ XK_Greek_upsilondieresis, 0x03cb }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
484{ XK_Greek_upsilonaccentdieresis, 0x03b0 }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
485{ XK_Greek_omegaaccent, 0x03ce }, /* GREEK SMALL LETTER OMEGA WITH TONOS */
486{ XK_Greek_ALPHA, 0x0391 }, /* GREEK CAPITAL LETTER ALPHA */
487{ XK_Greek_BETA, 0x0392 }, /* GREEK CAPITAL LETTER BETA */
488{ XK_Greek_GAMMA, 0x0393 }, /* GREEK CAPITAL LETTER GAMMA */
489{ XK_Greek_DELTA, 0x0394 }, /* GREEK CAPITAL LETTER DELTA */
490{ XK_Greek_EPSILON, 0x0395 }, /* GREEK CAPITAL LETTER EPSILON */
491{ XK_Greek_ZETA, 0x0396 }, /* GREEK CAPITAL LETTER ZETA */
492{ XK_Greek_ETA, 0x0397 }, /* GREEK CAPITAL LETTER ETA */
493{ XK_Greek_THETA, 0x0398 }, /* GREEK CAPITAL LETTER THETA */
494{ XK_Greek_IOTA, 0x0399 }, /* GREEK CAPITAL LETTER IOTA */
495{ XK_Greek_KAPPA, 0x039a }, /* GREEK CAPITAL LETTER KAPPA */
496{ XK_Greek_LAMBDA, 0x039b }, /* GREEK CAPITAL LETTER LAMDA */
497{ XK_Greek_MU, 0x039c }, /* GREEK CAPITAL LETTER MU */
498{ XK_Greek_NU, 0x039d }, /* GREEK CAPITAL LETTER NU */
499{ XK_Greek_XI, 0x039e }, /* GREEK CAPITAL LETTER XI */
500{ XK_Greek_OMICRON, 0x039f }, /* GREEK CAPITAL LETTER OMICRON */
501{ XK_Greek_PI, 0x03a0 }, /* GREEK CAPITAL LETTER PI */
502{ XK_Greek_RHO, 0x03a1 }, /* GREEK CAPITAL LETTER RHO */
503{ XK_Greek_SIGMA, 0x03a3 }, /* GREEK CAPITAL LETTER SIGMA */
504{ XK_Greek_TAU, 0x03a4 }, /* GREEK CAPITAL LETTER TAU */
505{ XK_Greek_UPSILON, 0x03a5 }, /* GREEK CAPITAL LETTER UPSILON */
506{ XK_Greek_PHI, 0x03a6 }, /* GREEK CAPITAL LETTER PHI */
507{ XK_Greek_CHI, 0x03a7 }, /* GREEK CAPITAL LETTER CHI */
508{ XK_Greek_PSI, 0x03a8 }, /* GREEK CAPITAL LETTER PSI */
509{ XK_Greek_OMEGA, 0x03a9 }, /* GREEK CAPITAL LETTER OMEGA */
510{ XK_Greek_alpha, 0x03b1 }, /* GREEK SMALL LETTER ALPHA */
511{ XK_Greek_beta, 0x03b2 }, /* GREEK SMALL LETTER BETA */
512{ XK_Greek_gamma, 0x03b3 }, /* GREEK SMALL LETTER GAMMA */
513{ XK_Greek_delta, 0x03b4 }, /* GREEK SMALL LETTER DELTA */
514{ XK_Greek_epsilon, 0x03b5 }, /* GREEK SMALL LETTER EPSILON */
515{ XK_Greek_zeta, 0x03b6 }, /* GREEK SMALL LETTER ZETA */
516{ XK_Greek_eta, 0x03b7 }, /* GREEK SMALL LETTER ETA */
517{ XK_Greek_theta, 0x03b8 }, /* GREEK SMALL LETTER THETA */
518{ XK_Greek_iota, 0x03b9 }, /* GREEK SMALL LETTER IOTA */
519{ XK_Greek_kappa, 0x03ba }, /* GREEK SMALL LETTER KAPPA */
520{ XK_Greek_lambda, 0x03bb }, /* GREEK SMALL LETTER LAMDA */
521{ XK_Greek_mu, 0x03bc }, /* GREEK SMALL LETTER MU */
522{ XK_Greek_nu, 0x03bd }, /* GREEK SMALL LETTER NU */
523{ XK_Greek_xi, 0x03be }, /* GREEK SMALL LETTER XI */
524{ XK_Greek_omicron, 0x03bf }, /* GREEK SMALL LETTER OMICRON */
525{ XK_Greek_pi, 0x03c0 }, /* GREEK SMALL LETTER PI */
526{ XK_Greek_rho, 0x03c1 }, /* GREEK SMALL LETTER RHO */
527{ XK_Greek_sigma, 0x03c3 }, /* GREEK SMALL LETTER SIGMA */
528{ XK_Greek_finalsmallsigma, 0x03c2 }, /* GREEK SMALL LETTER FINAL SIGMA */
529{ XK_Greek_tau, 0x03c4 }, /* GREEK SMALL LETTER TAU */
530{ XK_Greek_upsilon, 0x03c5 }, /* GREEK SMALL LETTER UPSILON */
531{ XK_Greek_phi, 0x03c6 }, /* GREEK SMALL LETTER PHI */
532{ XK_Greek_chi, 0x03c7 }, /* GREEK SMALL LETTER CHI */
533{ XK_Greek_psi, 0x03c8 }, /* GREEK SMALL LETTER PSI */
534{ XK_Greek_omega, 0x03c9 }, /* GREEK SMALL LETTER OMEGA */
535{ XK_leftradical, 0x23b7 }, /* ??? */
536{ XK_topleftradical, 0x250c }, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
537{ XK_horizconnector, 0x2500 }, /* BOX DRAWINGS LIGHT HORIZONTAL */
538{ XK_topintegral, 0x2320 }, /* TOP HALF INTEGRAL */
539{ XK_botintegral, 0x2321 }, /* BOTTOM HALF INTEGRAL */
540{ XK_vertconnector, 0x2502 }, /* BOX DRAWINGS LIGHT VERTICAL */
541{ XK_topleftsqbracket, 0x23a1 }, /* ??? */
542{ XK_botleftsqbracket, 0x23a3 }, /* ??? */
543{ XK_toprightsqbracket, 0x23a4 }, /* ??? */
544{ XK_botrightsqbracket, 0x23a6 }, /* ??? */
545{ XK_topleftparens, 0x239b }, /* ??? */
546{ XK_botleftparens, 0x239d }, /* ??? */
547{ XK_toprightparens, 0x239e }, /* ??? */
548{ XK_botrightparens, 0x23a0 }, /* ??? */
549{ XK_leftmiddlecurlybrace, 0x23a8 }, /* ??? */
550{ XK_rightmiddlecurlybrace, 0x23ac }, /* ??? */
551{ XK_lessthanequal, 0x2264 }, /* LESS-THAN OR EQUAL TO */
552{ XK_notequal, 0x2260 }, /* NOT EQUAL TO */
553{ XK_greaterthanequal, 0x2265 }, /* GREATER-THAN OR EQUAL TO */
554{ XK_integral, 0x222b }, /* INTEGRAL */
555{ XK_therefore, 0x2234 }, /* THEREFORE */
556{ XK_variation, 0x221d }, /* PROPORTIONAL TO */
557{ XK_infinity, 0x221e }, /* INFINITY */
558{ XK_nabla, 0x2207 }, /* NABLA */
559{ XK_approximate, 0x223c }, /* TILDE OPERATOR */
560{ XK_similarequal, 0x2243 }, /* ASYMPTOTICALLY EQUAL TO */
561{ XK_ifonlyif, 0x21d4 }, /* LEFT RIGHT DOUBLE ARROW */
562{ XK_implies, 0x21d2 }, /* RIGHTWARDS DOUBLE ARROW */
563{ XK_identical, 0x2261 }, /* IDENTICAL TO */
564{ XK_radical, 0x221a }, /* SQUARE ROOT */
565{ XK_includedin, 0x2282 }, /* SUBSET OF */
566{ XK_includes, 0x2283 }, /* SUPERSET OF */
567{ XK_intersection, 0x2229 }, /* INTERSECTION */
568{ XK_union, 0x222a }, /* UNION */
569{ XK_logicaland, 0x2227 }, /* LOGICAL AND */
570{ XK_logicalor, 0x2228 }, /* LOGICAL OR */
571{ XK_partialderivative, 0x2202 }, /* PARTIAL DIFFERENTIAL */
572{ XK_function, 0x0192 }, /* LATIN SMALL LETTER F WITH HOOK */
573{ XK_leftarrow, 0x2190 }, /* LEFTWARDS ARROW */
574{ XK_uparrow, 0x2191 }, /* UPWARDS ARROW */
575{ XK_rightarrow, 0x2192 }, /* RIGHTWARDS ARROW */
576{ XK_downarrow, 0x2193 }, /* DOWNWARDS ARROW */
577/*{ XK_blank, ??? }, */
578{ XK_soliddiamond, 0x25c6 }, /* BLACK DIAMOND */
579{ XK_checkerboard, 0x2592 }, /* MEDIUM SHADE */
580{ XK_ht, 0x2409 }, /* SYMBOL FOR HORIZONTAL TABULATION */
581{ XK_ff, 0x240c }, /* SYMBOL FOR FORM FEED */
582{ XK_cr, 0x240d }, /* SYMBOL FOR CARRIAGE RETURN */
583{ XK_lf, 0x240a }, /* SYMBOL FOR LINE FEED */
584{ XK_nl, 0x2424 }, /* SYMBOL FOR NEWLINE */
585{ XK_vt, 0x240b }, /* SYMBOL FOR VERTICAL TABULATION */
586{ XK_lowrightcorner, 0x2518 }, /* BOX DRAWINGS LIGHT UP AND LEFT */
587{ XK_uprightcorner, 0x2510 }, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
588{ XK_upleftcorner, 0x250c }, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
589{ XK_lowleftcorner, 0x2514 }, /* BOX DRAWINGS LIGHT UP AND RIGHT */
590{ XK_crossinglines, 0x253c }, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
591{ XK_horizlinescan1, 0x23ba }, /* HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */
592{ XK_horizlinescan3, 0x23bb }, /* HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */
593{ XK_horizlinescan5, 0x2500 }, /* BOX DRAWINGS LIGHT HORIZONTAL */
594{ XK_horizlinescan7, 0x23bc }, /* HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */
595{ XK_horizlinescan9, 0x23bd }, /* HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */
596{ XK_leftt, 0x251c }, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
597{ XK_rightt, 0x2524 }, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
598{ XK_bott, 0x2534 }, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
599{ XK_topt, 0x252c }, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
600{ XK_vertbar, 0x2502 }, /* BOX DRAWINGS LIGHT VERTICAL */
601{ XK_emspace, 0x2003 }, /* EM SPACE */
602{ XK_enspace, 0x2002 }, /* EN SPACE */
603{ XK_em3space, 0x2004 }, /* THREE-PER-EM SPACE */
604{ XK_em4space, 0x2005 }, /* FOUR-PER-EM SPACE */
605{ XK_digitspace, 0x2007 }, /* FIGURE SPACE */
606{ XK_punctspace, 0x2008 }, /* PUNCTUATION SPACE */
607{ XK_thinspace, 0x2009 }, /* THIN SPACE */
608{ XK_hairspace, 0x200a }, /* HAIR SPACE */
609{ XK_emdash, 0x2014 }, /* EM DASH */
610{ XK_endash, 0x2013 }, /* EN DASH */
611/*{ XK_signifblank, ??? }, */
612{ XK_ellipsis, 0x2026 }, /* HORIZONTAL ELLIPSIS */
613{ XK_doubbaselinedot, 0x2025 }, /* TWO DOT LEADER */
614{ XK_onethird, 0x2153 }, /* VULGAR FRACTION ONE THIRD */
615{ XK_twothirds, 0x2154 }, /* VULGAR FRACTION TWO THIRDS */
616{ XK_onefifth, 0x2155 }, /* VULGAR FRACTION ONE FIFTH */
617{ XK_twofifths, 0x2156 }, /* VULGAR FRACTION TWO FIFTHS */
618{ XK_threefifths, 0x2157 }, /* VULGAR FRACTION THREE FIFTHS */
619{ XK_fourfifths, 0x2158 }, /* VULGAR FRACTION FOUR FIFTHS */
620{ XK_onesixth, 0x2159 }, /* VULGAR FRACTION ONE SIXTH */
621{ XK_fivesixths, 0x215a }, /* VULGAR FRACTION FIVE SIXTHS */
622{ XK_careof, 0x2105 }, /* CARE OF */
623{ XK_figdash, 0x2012 }, /* FIGURE DASH */
624{ XK_leftanglebracket, 0x2329 }, /* LEFT-POINTING ANGLE BRACKET */
625/*{ XK_decimalpoint, ??? }, */
626{ XK_rightanglebracket, 0x232a }, /* RIGHT-POINTING ANGLE BRACKET */
627/*{ XK_marker, ??? }, */
628{ XK_oneeighth, 0x215b }, /* VULGAR FRACTION ONE EIGHTH */
629{ XK_threeeighths, 0x215c }, /* VULGAR FRACTION THREE EIGHTHS */
630{ XK_fiveeighths, 0x215d }, /* VULGAR FRACTION FIVE EIGHTHS */
631{ XK_seveneighths, 0x215e }, /* VULGAR FRACTION SEVEN EIGHTHS */
632{ XK_trademark, 0x2122 }, /* TRADE MARK SIGN */
633{ XK_signaturemark, 0x2613 }, /* SALTIRE */
634/*{ XK_trademarkincircle, ??? }, */
635{ XK_leftopentriangle, 0x25c1 }, /* WHITE LEFT-POINTING TRIANGLE */
636{ XK_rightopentriangle, 0x25b7 }, /* WHITE RIGHT-POINTING TRIANGLE */
637{ XK_emopencircle, 0x25cb }, /* WHITE CIRCLE */
638{ XK_emopenrectangle, 0x25af }, /* WHITE VERTICAL RECTANGLE */
639{ XK_leftsinglequotemark, 0x2018 }, /* LEFT SINGLE QUOTATION MARK */
640{ XK_rightsinglequotemark, 0x2019 }, /* RIGHT SINGLE QUOTATION MARK */
641{ XK_leftdoublequotemark, 0x201c }, /* LEFT DOUBLE QUOTATION MARK */
642{ XK_rightdoublequotemark, 0x201d }, /* RIGHT DOUBLE QUOTATION MARK */
643{ XK_prescription, 0x211e }, /* PRESCRIPTION TAKE */
644{ XK_minutes, 0x2032 }, /* PRIME */
645{ XK_seconds, 0x2033 }, /* DOUBLE PRIME */
646{ XK_latincross, 0x271d }, /* LATIN CROSS */
647/*{ XK_hexagram, ??? }, */
648{ XK_filledrectbullet, 0x25ac }, /* BLACK RECTANGLE */
649{ XK_filledlefttribullet, 0x25c0 }, /* BLACK LEFT-POINTING TRIANGLE */
650{ XK_filledrighttribullet, 0x25b6 }, /* BLACK RIGHT-POINTING TRIANGLE */
651{ XK_emfilledcircle, 0x25cf }, /* BLACK CIRCLE */
652{ XK_emfilledrect, 0x25ae }, /* BLACK VERTICAL RECTANGLE */
653{ XK_enopencircbullet, 0x25e6 }, /* WHITE BULLET */
654{ XK_enopensquarebullet, 0x25ab }, /* WHITE SMALL SQUARE */
655{ XK_openrectbullet, 0x25ad }, /* WHITE RECTANGLE */
656{ XK_opentribulletup, 0x25b3 }, /* WHITE UP-POINTING TRIANGLE */
657{ XK_opentribulletdown, 0x25bd }, /* WHITE DOWN-POINTING TRIANGLE */
658{ XK_openstar, 0x2606 }, /* WHITE STAR */
659{ XK_enfilledcircbullet, 0x2022 }, /* BULLET */
660{ XK_enfilledsqbullet, 0x25aa }, /* BLACK SMALL SQUARE */
661{ XK_filledtribulletup, 0x25b2 }, /* BLACK UP-POINTING TRIANGLE */
662{ XK_filledtribulletdown, 0x25bc }, /* BLACK DOWN-POINTING TRIANGLE */
663{ XK_leftpointer, 0x261c }, /* WHITE LEFT POINTING INDEX */
664{ XK_rightpointer, 0x261e }, /* WHITE RIGHT POINTING INDEX */
665{ XK_club, 0x2663 }, /* BLACK CLUB SUIT */
666{ XK_diamond, 0x2666 }, /* BLACK DIAMOND SUIT */
667{ XK_heart, 0x2665 }, /* BLACK HEART SUIT */
668{ XK_maltesecross, 0x2720 }, /* MALTESE CROSS */
669{ XK_dagger, 0x2020 }, /* DAGGER */
670{ XK_doubledagger, 0x2021 }, /* DOUBLE DAGGER */
671{ XK_checkmark, 0x2713 }, /* CHECK MARK */
672{ XK_ballotcross, 0x2717 }, /* BALLOT X */
673{ XK_musicalsharp, 0x266f }, /* MUSIC SHARP SIGN */
674{ XK_musicalflat, 0x266d }, /* MUSIC FLAT SIGN */
675{ XK_malesymbol, 0x2642 }, /* MALE SIGN */
676{ XK_femalesymbol, 0x2640 }, /* FEMALE SIGN */
677{ XK_telephone, 0x260e }, /* BLACK TELEPHONE */
678{ XK_telephonerecorder, 0x2315 }, /* TELEPHONE RECORDER */
679{ XK_phonographcopyright, 0x2117 }, /* SOUND RECORDING COPYRIGHT */
680{ XK_caret, 0x2038 }, /* CARET */
681{ XK_singlelowquotemark, 0x201a }, /* SINGLE LOW-9 QUOTATION MARK */
682{ XK_doublelowquotemark, 0x201e }, /* DOUBLE LOW-9 QUOTATION MARK */
683/*{ XK_cursor, ??? }, */
684{ XK_leftcaret, 0x003c }, /* LESS-THAN SIGN */
685{ XK_rightcaret, 0x003e }, /* GREATER-THAN SIGN */
686{ XK_downcaret, 0x2228 }, /* LOGICAL OR */
687{ XK_upcaret, 0x2227 }, /* LOGICAL AND */
688{ XK_overbar, 0x00af }, /* MACRON */
689{ XK_downtack, 0x22a5 }, /* UP TACK */
690{ XK_upshoe, 0x2229 }, /* INTERSECTION */
691{ XK_downstile, 0x230a }, /* LEFT FLOOR */
692{ XK_underbar, 0x005f }, /* LOW LINE */
693{ XK_jot, 0x2218 }, /* RING OPERATOR */
694{ XK_quad, 0x2395 }, /* APL FUNCTIONAL SYMBOL QUAD */
695{ XK_uptack, 0x22a4 }, /* DOWN TACK */
696{ XK_circle, 0x25cb }, /* WHITE CIRCLE */
697{ XK_upstile, 0x2308 }, /* LEFT CEILING */
698{ XK_downshoe, 0x222a }, /* UNION */
699{ XK_rightshoe, 0x2283 }, /* SUPERSET OF */
700{ XK_leftshoe, 0x2282 }, /* SUBSET OF */
701{ XK_lefttack, 0x22a2 }, /* RIGHT TACK */
702{ XK_righttack, 0x22a3 }, /* LEFT TACK */
703{ XK_hebrew_doublelowline, 0x2017 }, /* DOUBLE LOW LINE */
704{ XK_hebrew_aleph, 0x05d0 }, /* HEBREW LETTER ALEF */
705{ XK_hebrew_bet, 0x05d1 }, /* HEBREW LETTER BET */
706{ XK_hebrew_gimel, 0x05d2 }, /* HEBREW LETTER GIMEL */
707{ XK_hebrew_dalet, 0x05d3 }, /* HEBREW LETTER DALET */
708{ XK_hebrew_he, 0x05d4 }, /* HEBREW LETTER HE */
709{ XK_hebrew_waw, 0x05d5 }, /* HEBREW LETTER VAV */
710{ XK_hebrew_zain, 0x05d6 }, /* HEBREW LETTER ZAYIN */
711{ XK_hebrew_chet, 0x05d7 }, /* HEBREW LETTER HET */
712{ XK_hebrew_tet, 0x05d8 }, /* HEBREW LETTER TET */
713{ XK_hebrew_yod, 0x05d9 }, /* HEBREW LETTER YOD */
714{ XK_hebrew_finalkaph, 0x05da }, /* HEBREW LETTER FINAL KAF */
715{ XK_hebrew_kaph, 0x05db }, /* HEBREW LETTER KAF */
716{ XK_hebrew_lamed, 0x05dc }, /* HEBREW LETTER LAMED */
717{ XK_hebrew_finalmem, 0x05dd }, /* HEBREW LETTER FINAL MEM */
718{ XK_hebrew_mem, 0x05de }, /* HEBREW LETTER MEM */
719{ XK_hebrew_finalnun, 0x05df }, /* HEBREW LETTER FINAL NUN */
720{ XK_hebrew_nun, 0x05e0 }, /* HEBREW LETTER NUN */
721{ XK_hebrew_samech, 0x05e1 }, /* HEBREW LETTER SAMEKH */
722{ XK_hebrew_ayin, 0x05e2 }, /* HEBREW LETTER AYIN */
723{ XK_hebrew_finalpe, 0x05e3 }, /* HEBREW LETTER FINAL PE */
724{ XK_hebrew_pe, 0x05e4 }, /* HEBREW LETTER PE */
725{ XK_hebrew_finalzade, 0x05e5 }, /* HEBREW LETTER FINAL TSADI */
726{ XK_hebrew_zade, 0x05e6 }, /* HEBREW LETTER TSADI */
727{ XK_hebrew_qoph, 0x05e7 }, /* HEBREW LETTER QOF */
728{ XK_hebrew_resh, 0x05e8 }, /* HEBREW LETTER RESH */
729{ XK_hebrew_shin, 0x05e9 }, /* HEBREW LETTER SHIN */
730{ XK_hebrew_taw, 0x05ea }, /* HEBREW LETTER TAV */
731{ XK_Thai_kokai, 0x0e01 }, /* THAI CHARACTER KO KAI */
732{ XK_Thai_khokhai, 0x0e02 }, /* THAI CHARACTER KHO KHAI */
733{ XK_Thai_khokhuat, 0x0e03 }, /* THAI CHARACTER KHO KHUAT */
734{ XK_Thai_khokhwai, 0x0e04 }, /* THAI CHARACTER KHO KHWAI */
735{ XK_Thai_khokhon, 0x0e05 }, /* THAI CHARACTER KHO KHON */
736{ XK_Thai_khorakhang, 0x0e06 }, /* THAI CHARACTER KHO RAKHANG */
737{ XK_Thai_ngongu, 0x0e07 }, /* THAI CHARACTER NGO NGU */
738{ XK_Thai_chochan, 0x0e08 }, /* THAI CHARACTER CHO CHAN */
739{ XK_Thai_choching, 0x0e09 }, /* THAI CHARACTER CHO CHING */
740{ XK_Thai_chochang, 0x0e0a }, /* THAI CHARACTER CHO CHANG */
741{ XK_Thai_soso, 0x0e0b }, /* THAI CHARACTER SO SO */
742{ XK_Thai_chochoe, 0x0e0c }, /* THAI CHARACTER CHO CHOE */
743{ XK_Thai_yoying, 0x0e0d }, /* THAI CHARACTER YO YING */
744{ XK_Thai_dochada, 0x0e0e }, /* THAI CHARACTER DO CHADA */
745{ XK_Thai_topatak, 0x0e0f }, /* THAI CHARACTER TO PATAK */
746{ XK_Thai_thothan, 0x0e10 }, /* THAI CHARACTER THO THAN */
747{ XK_Thai_thonangmontho, 0x0e11 }, /* THAI CHARACTER THO NANGMONTHO */
748{ XK_Thai_thophuthao, 0x0e12 }, /* THAI CHARACTER THO PHUTHAO */
749{ XK_Thai_nonen, 0x0e13 }, /* THAI CHARACTER NO NEN */
750{ XK_Thai_dodek, 0x0e14 }, /* THAI CHARACTER DO DEK */
751{ XK_Thai_totao, 0x0e15 }, /* THAI CHARACTER TO TAO */
752{ XK_Thai_thothung, 0x0e16 }, /* THAI CHARACTER THO THUNG */
753{ XK_Thai_thothahan, 0x0e17 }, /* THAI CHARACTER THO THAHAN */
754{ XK_Thai_thothong, 0x0e18 }, /* THAI CHARACTER THO THONG */
755{ XK_Thai_nonu, 0x0e19 }, /* THAI CHARACTER NO NU */
756{ XK_Thai_bobaimai, 0x0e1a }, /* THAI CHARACTER BO BAIMAI */
757{ XK_Thai_popla, 0x0e1b }, /* THAI CHARACTER PO PLA */
758{ XK_Thai_phophung, 0x0e1c }, /* THAI CHARACTER PHO PHUNG */
759{ XK_Thai_fofa, 0x0e1d }, /* THAI CHARACTER FO FA */
760{ XK_Thai_phophan, 0x0e1e }, /* THAI CHARACTER PHO PHAN */
761{ XK_Thai_fofan, 0x0e1f }, /* THAI CHARACTER FO FAN */
762{ XK_Thai_phosamphao, 0x0e20 }, /* THAI CHARACTER PHO SAMPHAO */
763{ XK_Thai_moma, 0x0e21 }, /* THAI CHARACTER MO MA */
764{ XK_Thai_yoyak, 0x0e22 }, /* THAI CHARACTER YO YAK */
765{ XK_Thai_rorua, 0x0e23 }, /* THAI CHARACTER RO RUA */
766{ XK_Thai_ru, 0x0e24 }, /* THAI CHARACTER RU */
767{ XK_Thai_loling, 0x0e25 }, /* THAI CHARACTER LO LING */
768{ XK_Thai_lu, 0x0e26 }, /* THAI CHARACTER LU */
769{ XK_Thai_wowaen, 0x0e27 }, /* THAI CHARACTER WO WAEN */
770{ XK_Thai_sosala, 0x0e28 }, /* THAI CHARACTER SO SALA */
771{ XK_Thai_sorusi, 0x0e29 }, /* THAI CHARACTER SO RUSI */
772{ XK_Thai_sosua, 0x0e2a }, /* THAI CHARACTER SO SUA */
773{ XK_Thai_hohip, 0x0e2b }, /* THAI CHARACTER HO HIP */
774{ XK_Thai_lochula, 0x0e2c }, /* THAI CHARACTER LO CHULA */
775{ XK_Thai_oang, 0x0e2d }, /* THAI CHARACTER O ANG */
776{ XK_Thai_honokhuk, 0x0e2e }, /* THAI CHARACTER HO NOKHUK */
777{ XK_Thai_paiyannoi, 0x0e2f }, /* THAI CHARACTER PAIYANNOI */
778{ XK_Thai_saraa, 0x0e30 }, /* THAI CHARACTER SARA A */
779{ XK_Thai_maihanakat, 0x0e31 }, /* THAI CHARACTER MAI HAN-AKAT */
780{ XK_Thai_saraaa, 0x0e32 }, /* THAI CHARACTER SARA AA */
781{ XK_Thai_saraam, 0x0e33 }, /* THAI CHARACTER SARA AM */
782{ XK_Thai_sarai, 0x0e34 }, /* THAI CHARACTER SARA I */
783{ XK_Thai_saraii, 0x0e35 }, /* THAI CHARACTER SARA II */
784{ XK_Thai_saraue, 0x0e36 }, /* THAI CHARACTER SARA UE */
785{ XK_Thai_sarauee, 0x0e37 }, /* THAI CHARACTER SARA UEE */
786{ XK_Thai_sarau, 0x0e38 }, /* THAI CHARACTER SARA U */
787{ XK_Thai_sarauu, 0x0e39 }, /* THAI CHARACTER SARA UU */
788{ XK_Thai_phinthu, 0x0e3a }, /* THAI CHARACTER PHINTHU */
789/*{ XK_Thai_maihanakat_maitho, ??? }, */
790{ XK_Thai_baht, 0x0e3f }, /* THAI CURRENCY SYMBOL BAHT */
791{ XK_Thai_sarae, 0x0e40 }, /* THAI CHARACTER SARA E */
792{ XK_Thai_saraae, 0x0e41 }, /* THAI CHARACTER SARA AE */
793{ XK_Thai_sarao, 0x0e42 }, /* THAI CHARACTER SARA O */
794{ XK_Thai_saraaimaimuan, 0x0e43 }, /* THAI CHARACTER SARA AI MAIMUAN */
795{ XK_Thai_saraaimaimalai, 0x0e44 }, /* THAI CHARACTER SARA AI MAIMALAI */
796{ XK_Thai_lakkhangyao, 0x0e45 }, /* THAI CHARACTER LAKKHANGYAO */
797{ XK_Thai_maiyamok, 0x0e46 }, /* THAI CHARACTER MAIYAMOK */
798{ XK_Thai_maitaikhu, 0x0e47 }, /* THAI CHARACTER MAITAIKHU */
799{ XK_Thai_maiek, 0x0e48 }, /* THAI CHARACTER MAI EK */
800{ XK_Thai_maitho, 0x0e49 }, /* THAI CHARACTER MAI THO */
801{ XK_Thai_maitri, 0x0e4a }, /* THAI CHARACTER MAI TRI */
802{ XK_Thai_maichattawa, 0x0e4b }, /* THAI CHARACTER MAI CHATTAWA */
803{ XK_Thai_thanthakhat, 0x0e4c }, /* THAI CHARACTER THANTHAKHAT */
804{ XK_Thai_nikhahit, 0x0e4d }, /* THAI CHARACTER NIKHAHIT */
805{ XK_Thai_leksun, 0x0e50 }, /* THAI DIGIT ZERO */
806{ XK_Thai_leknung, 0x0e51 }, /* THAI DIGIT ONE */
807{ XK_Thai_leksong, 0x0e52 }, /* THAI DIGIT TWO */
808{ XK_Thai_leksam, 0x0e53 }, /* THAI DIGIT THREE */
809{ XK_Thai_leksi, 0x0e54 }, /* THAI DIGIT FOUR */
810{ XK_Thai_lekha, 0x0e55 }, /* THAI DIGIT FIVE */
811{ XK_Thai_lekhok, 0x0e56 }, /* THAI DIGIT SIX */
812{ XK_Thai_lekchet, 0x0e57 }, /* THAI DIGIT SEVEN */
813{ XK_Thai_lekpaet, 0x0e58 }, /* THAI DIGIT EIGHT */
814{ XK_Thai_lekkao, 0x0e59 }, /* THAI DIGIT NINE */
815{ XK_Hangul_Kiyeog, 0x3131 }, /* HANGUL LETTER KIYEOK */
816{ XK_Hangul_SsangKiyeog, 0x3132 }, /* HANGUL LETTER SSANGKIYEOK */
817{ XK_Hangul_KiyeogSios, 0x3133 }, /* HANGUL LETTER KIYEOK-SIOS */
818{ XK_Hangul_Nieun, 0x3134 }, /* HANGUL LETTER NIEUN */
819{ XK_Hangul_NieunJieuj, 0x3135 }, /* HANGUL LETTER NIEUN-CIEUC */
820{ XK_Hangul_NieunHieuh, 0x3136 }, /* HANGUL LETTER NIEUN-HIEUH */
821{ XK_Hangul_Dikeud, 0x3137 }, /* HANGUL LETTER TIKEUT */
822{ XK_Hangul_SsangDikeud, 0x3138 }, /* HANGUL LETTER SSANGTIKEUT */
823{ XK_Hangul_Rieul, 0x3139 }, /* HANGUL LETTER RIEUL */
824{ XK_Hangul_RieulKiyeog, 0x313a }, /* HANGUL LETTER RIEUL-KIYEOK */
825{ XK_Hangul_RieulMieum, 0x313b }, /* HANGUL LETTER RIEUL-MIEUM */
826{ XK_Hangul_RieulPieub, 0x313c }, /* HANGUL LETTER RIEUL-PIEUP */
827{ XK_Hangul_RieulSios, 0x313d }, /* HANGUL LETTER RIEUL-SIOS */
828{ XK_Hangul_RieulTieut, 0x313e }, /* HANGUL LETTER RIEUL-THIEUTH */
829{ XK_Hangul_RieulPhieuf, 0x313f }, /* HANGUL LETTER RIEUL-PHIEUPH */
830{ XK_Hangul_RieulHieuh, 0x3140 }, /* HANGUL LETTER RIEUL-HIEUH */
831{ XK_Hangul_Mieum, 0x3141 }, /* HANGUL LETTER MIEUM */
832{ XK_Hangul_Pieub, 0x3142 }, /* HANGUL LETTER PIEUP */
833{ XK_Hangul_SsangPieub, 0x3143 }, /* HANGUL LETTER SSANGPIEUP */
834{ XK_Hangul_PieubSios, 0x3144 }, /* HANGUL LETTER PIEUP-SIOS */
835{ XK_Hangul_Sios, 0x3145 }, /* HANGUL LETTER SIOS */
836{ XK_Hangul_SsangSios, 0x3146 }, /* HANGUL LETTER SSANGSIOS */
837{ XK_Hangul_Ieung, 0x3147 }, /* HANGUL LETTER IEUNG */
838{ XK_Hangul_Jieuj, 0x3148 }, /* HANGUL LETTER CIEUC */
839{ XK_Hangul_SsangJieuj, 0x3149 }, /* HANGUL LETTER SSANGCIEUC */
840{ XK_Hangul_Cieuc, 0x314a }, /* HANGUL LETTER CHIEUCH */
841{ XK_Hangul_Khieuq, 0x314b }, /* HANGUL LETTER KHIEUKH */
842{ XK_Hangul_Tieut, 0x314c }, /* HANGUL LETTER THIEUTH */
843{ XK_Hangul_Phieuf, 0x314d }, /* HANGUL LETTER PHIEUPH */
844{ XK_Hangul_Hieuh, 0x314e }, /* HANGUL LETTER HIEUH */
845{ XK_Hangul_A, 0x314f }, /* HANGUL LETTER A */
846{ XK_Hangul_AE, 0x3150 }, /* HANGUL LETTER AE */
847{ XK_Hangul_YA, 0x3151 }, /* HANGUL LETTER YA */
848{ XK_Hangul_YAE, 0x3152 }, /* HANGUL LETTER YAE */
849{ XK_Hangul_EO, 0x3153 }, /* HANGUL LETTER EO */
850{ XK_Hangul_E, 0x3154 }, /* HANGUL LETTER E */
851{ XK_Hangul_YEO, 0x3155 }, /* HANGUL LETTER YEO */
852{ XK_Hangul_YE, 0x3156 }, /* HANGUL LETTER YE */
853{ XK_Hangul_O, 0x3157 }, /* HANGUL LETTER O */
854{ XK_Hangul_WA, 0x3158 }, /* HANGUL LETTER WA */
855{ XK_Hangul_WAE, 0x3159 }, /* HANGUL LETTER WAE */
856{ XK_Hangul_OE, 0x315a }, /* HANGUL LETTER OE */
857{ XK_Hangul_YO, 0x315b }, /* HANGUL LETTER YO */
858{ XK_Hangul_U, 0x315c }, /* HANGUL LETTER U */
859{ XK_Hangul_WEO, 0x315d }, /* HANGUL LETTER WEO */
860{ XK_Hangul_WE, 0x315e }, /* HANGUL LETTER WE */
861{ XK_Hangul_WI, 0x315f }, /* HANGUL LETTER WI */
862{ XK_Hangul_YU, 0x3160 }, /* HANGUL LETTER YU */
863{ XK_Hangul_EU, 0x3161 }, /* HANGUL LETTER EU */
864{ XK_Hangul_YI, 0x3162 }, /* HANGUL LETTER YI */
865{ XK_Hangul_I, 0x3163 }, /* HANGUL LETTER I */
866{ XK_Hangul_J_Kiyeog, 0x11a8 }, /* HANGUL JONGSEONG KIYEOK */
867{ XK_Hangul_J_SsangKiyeog, 0x11a9 }, /* HANGUL JONGSEONG SSANGKIYEOK */
868{ XK_Hangul_J_KiyeogSios, 0x11aa }, /* HANGUL JONGSEONG KIYEOK-SIOS */
869{ XK_Hangul_J_Nieun, 0x11ab }, /* HANGUL JONGSEONG NIEUN */
870{ XK_Hangul_J_NieunJieuj, 0x11ac }, /* HANGUL JONGSEONG NIEUN-CIEUC */
871{ XK_Hangul_J_NieunHieuh, 0x11ad }, /* HANGUL JONGSEONG NIEUN-HIEUH */
872{ XK_Hangul_J_Dikeud, 0x11ae }, /* HANGUL JONGSEONG TIKEUT */
873{ XK_Hangul_J_Rieul, 0x11af }, /* HANGUL JONGSEONG RIEUL */
874{ XK_Hangul_J_RieulKiyeog, 0x11b0 }, /* HANGUL JONGSEONG RIEUL-KIYEOK */
875{ XK_Hangul_J_RieulMieum, 0x11b1 }, /* HANGUL JONGSEONG RIEUL-MIEUM */
876{ XK_Hangul_J_RieulPieub, 0x11b2 }, /* HANGUL JONGSEONG RIEUL-PIEUP */
877{ XK_Hangul_J_RieulSios, 0x11b3 }, /* HANGUL JONGSEONG RIEUL-SIOS */
878{ XK_Hangul_J_RieulTieut, 0x11b4 }, /* HANGUL JONGSEONG RIEUL-THIEUTH */
879{ XK_Hangul_J_RieulPhieuf, 0x11b5 }, /* HANGUL JONGSEONG RIEUL-PHIEUPH */
880{ XK_Hangul_J_RieulHieuh, 0x11b6 }, /* HANGUL JONGSEONG RIEUL-HIEUH */
881{ XK_Hangul_J_Mieum, 0x11b7 }, /* HANGUL JONGSEONG MIEUM */
882{ XK_Hangul_J_Pieub, 0x11b8 }, /* HANGUL JONGSEONG PIEUP */
883{ XK_Hangul_J_PieubSios, 0x11b9 }, /* HANGUL JONGSEONG PIEUP-SIOS */
884{ XK_Hangul_J_Sios, 0x11ba }, /* HANGUL JONGSEONG SIOS */
885{ XK_Hangul_J_SsangSios, 0x11bb }, /* HANGUL JONGSEONG SSANGSIOS */
886{ XK_Hangul_J_Ieung, 0x11bc }, /* HANGUL JONGSEONG IEUNG */
887{ XK_Hangul_J_Jieuj, 0x11bd }, /* HANGUL JONGSEONG CIEUC */
888{ XK_Hangul_J_Cieuc, 0x11be }, /* HANGUL JONGSEONG CHIEUCH */
889{ XK_Hangul_J_Khieuq, 0x11bf }, /* HANGUL JONGSEONG KHIEUKH */
890{ XK_Hangul_J_Tieut, 0x11c0 }, /* HANGUL JONGSEONG THIEUTH */
891{ XK_Hangul_J_Phieuf, 0x11c1 }, /* HANGUL JONGSEONG PHIEUPH */
892{ XK_Hangul_J_Hieuh, 0x11c2 }, /* HANGUL JONGSEONG HIEUH */
893{ XK_Hangul_RieulYeorinHieuh, 0x316d }, /* HANGUL LETTER RIEUL-YEORINHIEUH */
894{ XK_Hangul_SunkyeongeumMieum, 0x3171 }, /* HANGUL LETTER KAPYEOUNMIEUM */
895{ XK_Hangul_SunkyeongeumPieub, 0x3178 }, /* HANGUL LETTER KAPYEOUNPIEUP */
896{ XK_Hangul_PanSios, 0x317f }, /* HANGUL LETTER PANSIOS */
897{ XK_Hangul_KkogjiDalrinIeung, 0x3181 }, /* HANGUL LETTER YESIEUNG */
898{ XK_Hangul_SunkyeongeumPhieuf, 0x3184 }, /* HANGUL LETTER KAPYEOUNPHIEUPH */
899{ XK_Hangul_YeorinHieuh, 0x3186 }, /* HANGUL LETTER YEORINHIEUH */
900{ XK_Hangul_AraeA, 0x318d }, /* HANGUL LETTER ARAEA */
901{ XK_Hangul_AraeAE, 0x318e }, /* HANGUL LETTER ARAEAE */
902{ XK_Hangul_J_PanSios, 0x11eb }, /* HANGUL JONGSEONG PANSIOS */
903{ XK_Hangul_J_KkogjiDalrinIeung, 0x11f0 }, /* HANGUL JONGSEONG YESIEUNG */
904{ XK_Hangul_J_YeorinHieuh, 0x11f9 }, /* HANGUL JONGSEONG YEORINHIEUH */
905{ XK_Korean_Won, 0x20a9 }, /* WON SIGN */
906{ XK_OE, 0x0152 }, /* LATIN CAPITAL LIGATURE OE */
907{ XK_oe, 0x0153 }, /* LATIN SMALL LIGATURE OE */
908{ XK_Ydiaeresis, 0x0178 }, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */
909{ XK_EuroSign, 0x20ac }, /* EURO SIGN */
910
911/* combining dead keys */
912{ XK_dead_abovedot, 0x0307 }, /* COMBINING DOT ABOVE */
913{ XK_dead_abovering, 0x030a }, /* COMBINING RING ABOVE */
914{ XK_dead_acute, 0x0301 }, /* COMBINING ACUTE ACCENT */
915{ XK_dead_breve, 0x0306 }, /* COMBINING BREVE */
916{ XK_dead_caron, 0x030c }, /* COMBINING CARON */
917{ XK_dead_cedilla, 0x0327 }, /* COMBINING CEDILLA */
918{ XK_dead_circumflex, 0x0302 }, /* COMBINING CIRCUMFLEX ACCENT */
919{ XK_dead_diaeresis, 0x0308 }, /* COMBINING DIAERESIS */
920{ XK_dead_doubleacute, 0x030b }, /* COMBINING DOUBLE ACUTE ACCENT */
921{ XK_dead_grave, 0x0300 }, /* COMBINING GRAVE ACCENT */
922{ XK_dead_macron, 0x0304 }, /* COMBINING MACRON */
923{ XK_dead_ogonek, 0x0328 }, /* COMBINING OGONEK */
924{ XK_dead_tilde, 0x0303 } /* COMBINING TILDE */
925};
926/* XXX -- map these too
927XK_Cyrillic_GHE_bar
928XK_Cyrillic_ZHE_descender
929XK_Cyrillic_KA_descender
930XK_Cyrillic_KA_vertstroke
931XK_Cyrillic_EN_descender
932XK_Cyrillic_U_straight
933XK_Cyrillic_U_straight_bar
934XK_Cyrillic_HA_descender
935XK_Cyrillic_CHE_descender
936XK_Cyrillic_CHE_vertstroke
937XK_Cyrillic_SHHA
938XK_Cyrillic_SCHWA
939XK_Cyrillic_I_macron
940XK_Cyrillic_O_bar
941XK_Cyrillic_U_macron
942XK_Cyrillic_ghe_bar
943XK_Cyrillic_zhe_descender
944XK_Cyrillic_ka_descender
945XK_Cyrillic_ka_vertstroke
946XK_Cyrillic_en_descender
947XK_Cyrillic_u_straight
948XK_Cyrillic_u_straight_bar
949XK_Cyrillic_ha_descender
950XK_Cyrillic_che_descender
951XK_Cyrillic_che_vertstroke
952XK_Cyrillic_shha
953XK_Cyrillic_schwa
954XK_Cyrillic_i_macron
955XK_Cyrillic_o_bar
956XK_Cyrillic_u_macron
957
958XK_Armenian_eternity
959XK_Armenian_ligature_ew
960XK_Armenian_full_stop
961XK_Armenian_verjaket
962XK_Armenian_parenright
963XK_Armenian_parenleft
964XK_Armenian_guillemotright
965XK_Armenian_guillemotleft
966XK_Armenian_em_dash
967XK_Armenian_dot
968XK_Armenian_mijaket
969XK_Armenian_but
970XK_Armenian_separation_mark
971XK_Armenian_comma
972XK_Armenian_en_dash
973XK_Armenian_hyphen
974XK_Armenian_yentamna
975XK_Armenian_ellipsis
976XK_Armenian_amanak
977XK_Armenian_exclam
978XK_Armenian_accent
979XK_Armenian_shesht
980XK_Armenian_paruyk
981XK_Armenian_question
982XK_Armenian_AYB
983XK_Armenian_ayb
984XK_Armenian_BEN
985XK_Armenian_ben
986XK_Armenian_GIM
987XK_Armenian_gim
988XK_Armenian_DA
989XK_Armenian_da
990XK_Armenian_YECH
991XK_Armenian_yech
992XK_Armenian_ZA
993XK_Armenian_za
994XK_Armenian_E
995XK_Armenian_e
996XK_Armenian_AT
997XK_Armenian_at
998XK_Armenian_TO
999XK_Armenian_to
1000XK_Armenian_ZHE
1001XK_Armenian_zhe
1002XK_Armenian_INI
1003XK_Armenian_ini
1004XK_Armenian_LYUN
1005XK_Armenian_lyun
1006XK_Armenian_KHE
1007XK_Armenian_khe
1008XK_Armenian_TSA
1009XK_Armenian_tsa
1010XK_Armenian_KEN
1011XK_Armenian_ken
1012XK_Armenian_HO
1013XK_Armenian_ho
1014XK_Armenian_DZA
1015XK_Armenian_dza
1016XK_Armenian_GHAT
1017XK_Armenian_ghat
1018XK_Armenian_TCHE
1019XK_Armenian_tche
1020XK_Armenian_MEN
1021XK_Armenian_men
1022XK_Armenian_HI
1023XK_Armenian_hi
1024XK_Armenian_NU
1025XK_Armenian_nu
1026XK_Armenian_SHA
1027XK_Armenian_sha
1028XK_Armenian_VO
1029XK_Armenian_vo
1030XK_Armenian_CHA
1031XK_Armenian_cha
1032XK_Armenian_PE
1033XK_Armenian_pe
1034XK_Armenian_JE
1035XK_Armenian_je
1036XK_Armenian_RA
1037XK_Armenian_ra
1038XK_Armenian_SE
1039XK_Armenian_se
1040XK_Armenian_VEV
1041XK_Armenian_vev
1042XK_Armenian_TYUN
1043XK_Armenian_tyun
1044XK_Armenian_RE
1045XK_Armenian_re
1046XK_Armenian_TSO
1047XK_Armenian_tso
1048XK_Armenian_VYUN
1049XK_Armenian_vyun
1050XK_Armenian_PYUR
1051XK_Armenian_pyur
1052XK_Armenian_KE
1053XK_Armenian_ke
1054XK_Armenian_O
1055XK_Armenian_o
1056XK_Armenian_FE
1057XK_Armenian_fe
1058XK_Armenian_apostrophe
1059XK_Armenian_section_sign
1060
1061XK_Georgian_an
1062XK_Georgian_ban
1063XK_Georgian_gan
1064XK_Georgian_don
1065XK_Georgian_en
1066XK_Georgian_vin
1067XK_Georgian_zen
1068XK_Georgian_tan
1069XK_Georgian_in
1070XK_Georgian_kan
1071XK_Georgian_las
1072XK_Georgian_man
1073XK_Georgian_nar
1074XK_Georgian_on
1075XK_Georgian_par
1076XK_Georgian_zhar
1077XK_Georgian_rae
1078XK_Georgian_san
1079XK_Georgian_tar
1080XK_Georgian_un
1081XK_Georgian_phar
1082XK_Georgian_khar
1083XK_Georgian_ghan
1084XK_Georgian_qar
1085XK_Georgian_shin
1086XK_Georgian_chin
1087XK_Georgian_can
1088XK_Georgian_jil
1089XK_Georgian_cil
1090XK_Georgian_char
1091XK_Georgian_xan
1092XK_Georgian_jhan
1093XK_Georgian_hae
1094XK_Georgian_he
1095XK_Georgian_hie
1096XK_Georgian_we
1097XK_Georgian_har
1098XK_Georgian_hoe
1099XK_Georgian_fi
1100
1101XK_Ccedillaabovedot
1102XK_Xabovedot
1103XK_Qabovedot
1104XK_Ibreve
1105XK_IE
1106XK_UO
1107XK_Zstroke
1108XK_Gcaron
1109XK_Obarred
1110XK_ccedillaabovedot
1111XK_xabovedot
1112XK_Ocaron
1113XK_qabovedot
1114XK_ibreve
1115XK_ie
1116XK_uo
1117XK_zstroke
1118XK_gcaron
1119XK_ocaron
1120XK_obarred
1121XK_SCHWA
1122XK_Lbelowdot
1123XK_Lstrokebelowdot
1124XK_Gtilde
1125XK_lbelowdot
1126XK_lstrokebelowdot
1127XK_gtilde
1128XK_schwa
1129
1130XK_Abelowdot
1131XK_abelowdot
1132XK_Ahook
1133XK_ahook
1134XK_Acircumflexacute
1135XK_acircumflexacute
1136XK_Acircumflexgrave
1137XK_acircumflexgrave
1138XK_Acircumflexhook
1139XK_acircumflexhook
1140XK_Acircumflextilde
1141XK_acircumflextilde
1142XK_Acircumflexbelowdot
1143XK_acircumflexbelowdot
1144XK_Abreveacute
1145XK_abreveacute
1146XK_Abrevegrave
1147XK_abrevegrave
1148XK_Abrevehook
1149XK_abrevehook
1150XK_Abrevetilde
1151XK_abrevetilde
1152XK_Abrevebelowdot
1153XK_abrevebelowdot
1154XK_Ebelowdot
1155XK_ebelowdot
1156XK_Ehook
1157XK_ehook
1158XK_Etilde
1159XK_etilde
1160XK_Ecircumflexacute
1161XK_ecircumflexacute
1162XK_Ecircumflexgrave
1163XK_ecircumflexgrave
1164XK_Ecircumflexhook
1165XK_ecircumflexhook
1166XK_Ecircumflextilde
1167XK_ecircumflextilde
1168XK_Ecircumflexbelowdot
1169XK_ecircumflexbelowdot
1170XK_Ihook
1171XK_ihook
1172XK_Ibelowdot
1173XK_ibelowdot
1174XK_Obelowdot
1175XK_obelowdot
1176XK_Ohook
1177XK_ohook
1178XK_Ocircumflexacute
1179XK_ocircumflexacute
1180XK_Ocircumflexgrave
1181XK_ocircumflexgrave
1182XK_Ocircumflexhook
1183XK_ocircumflexhook
1184XK_Ocircumflextilde
1185XK_ocircumflextilde
1186XK_Ocircumflexbelowdot
1187XK_ocircumflexbelowdot
1188XK_Ohornacute
1189XK_ohornacute
1190XK_Ohorngrave
1191XK_ohorngrave
1192XK_Ohornhook
1193XK_ohornhook
1194XK_Ohorntilde
1195XK_ohorntilde
1196XK_Ohornbelowdot
1197XK_ohornbelowdot
1198XK_Ubelowdot
1199XK_ubelowdot
1200XK_Uhook
1201XK_uhook
1202XK_Uhornacute
1203XK_uhornacute
1204XK_Uhorngrave
1205XK_uhorngrave
1206XK_Uhornhook
1207XK_uhornhook
1208XK_Uhorntilde
1209XK_uhorntilde
1210XK_Uhornbelowdot
1211XK_uhornbelowdot
1212XK_Ybelowdot
1213XK_ybelowdot
1214XK_Yhook
1215XK_yhook
1216XK_Ytilde
1217XK_ytilde
1218XK_Ohorn
1219XK_ohorn
1220XK_Uhorn
1221XK_uhorn
1222*/
1223
1224// map "Internet" keys to KeyIDs
1225static const KeySym s_map1008FF[] =
1226{
1227 /* 0x00 */ 0, 0, 0, 0, 0, 0, 0, 0,
1228 /* 0x08 */ 0, 0, 0, 0, 0, 0, 0, 0,
1229 /* 0x10 */ 0, kKeyAudioDown, kKeyAudioMute, kKeyAudioUp,
1230 /* 0x14 */ kKeyAudioPlay, kKeyAudioStop, kKeyAudioPrev, kKeyAudioNext,
1231 /* 0x18 */ kKeyWWWHome, kKeyAppMail, 0, kKeyWWWSearch, 0, 0, 0, 0,
1232 /* 0x20 */ 0, 0, 0, 0, 0, 0, kKeyWWWBack, kKeyWWWForward,
1233 /* 0x28 */ kKeyWWWStop, kKeyWWWRefresh, 0, 0, kKeyEject, 0, 0, 0,
1234 /* 0x30 */ kKeyWWWFavorites, 0, kKeyAppMedia, 0, 0, 0, 0, 0,
1235 /* 0x38 */ 0, 0, 0, 0, 0, 0, 0, 0,
1236 /* 0x40 */ kKeyAppUser1, kKeyAppUser2, 0, 0, 0, 0, 0, 0,
1237 /* 0x48 */ 0, 0, 0, 0, 0, 0, 0, 0,
1238 /* 0x50 */ 0, 0, 0, 0, 0, 0, 0, 0,
1239 /* 0x58 */ 0, 0, 0, 0, 0, 0, 0, 0,
1240 /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0,
1241 /* 0x68 */ 0, 0, 0, 0, 0, 0, 0, 0,
1242 /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0,
1243 /* 0x78 */ 0, 0, 0, 0, 0, 0, 0, 0,
1244 /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0,
1245 /* 0x88 */ 0, 0, 0, 0, 0, 0, 0, 0,
1246 /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0,
1247 /* 0x98 */ 0, 0, 0, 0, 0, 0, 0, 0,
1248 /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0,
1249 /* 0xa8 */ 0, 0, 0, 0, 0, 0, 0, 0,
1250 /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0,
1251 /* 0xb8 */ 0, 0, 0, 0, 0, 0, 0, 0,
1252 /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0,
1253 /* 0xc8 */ 0, 0, 0, 0, 0, 0, 0, 0,
1254 /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0,
1255 /* 0xd8 */ 0, 0, 0, 0, 0, 0, 0, 0,
1256 /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0,
1257 /* 0xe8 */ 0, 0, 0, 0, 0, 0, 0, 0,
1258 /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0,
1259 /* 0xf8 */ 0, 0, 0, 0, 0, 0, 0, 0
1260};
1261
1262
1263//
1264// CXWindowsUtil
1265//
1266
1267CXWindowsUtil::CKeySymMap CXWindowsUtil::s_keySymToUCS4;
1268
1269bool
1270CXWindowsUtil::getWindowProperty(Display* display, Window window,
1271 Atom property, CString* data, Atom* type,
1272 SInt32* format, bool deleteProperty)
1273{
1274 assert(display != NULL);
1275
1276 Atom actualType;
1277 int actualDatumSize;
1278
1279 // ignore errors. XGetWindowProperty() will report failure.
1280 CXWindowsUtil::CErrorLock lock(display);
1281
1282 // read the property
1283 bool okay = true;
1284 const long length = XMaxRequestSize(display);
1285 long offset = 0;
1286 unsigned long bytesLeft = 1;
1287 while (bytesLeft != 0) {
1288 // get more data
1289 unsigned long numItems;
1290 unsigned char* rawData;
1291 if (XGetWindowProperty(display, window, property,
1292 offset, length, False, AnyPropertyType,
1293 &actualType, &actualDatumSize,
1294 &numItems, &bytesLeft, &rawData) != Success ||
1295 actualType == None || actualDatumSize == 0) {
1296 // failed
1297 okay = false;
1298 break;
1299 }
1300
1301 // compute bytes read and advance offset
1302 unsigned long numBytes;
1303 switch (actualDatumSize) {
1304 case 8:
1305 default:
1306 numBytes = numItems;
1307 offset += numItems / 4;
1308 break;
1309
1310 case 16:
1311 numBytes = 2 * numItems;
1312 offset += numItems / 2;
1313 break;
1314
1315 case 32:
1316 numBytes = 4 * numItems;
1317 offset += numItems;
1318 break;
1319 }
1320
1321 // append data
1322 if (data != NULL) {
1323 data->append((char*)rawData, numBytes);
1324 }
1325 else {
1326 // data is not required so don't try to get any more
1327 bytesLeft = 0;
1328 }
1329
1330 // done with returned data
1331 XFree(rawData);
1332 }
1333
1334 // delete the property if requested
1335 if (deleteProperty) {
1336 XDeleteProperty(display, window, property);
1337 }
1338
1339 // save property info
1340 if (type != NULL) {
1341 *type = actualType;
1342 }
1343 if (format != NULL) {
1344 *format = static_cast<SInt32>(actualDatumSize);
1345 }
1346
1347 if (okay) {
1348 LOG((CLOG_DEBUG2 "read property %d on window 0x%08x: bytes=%d", property, window, (data == NULL) ? 0 : data->size()));
1349 return true;
1350 }
1351 else {
1352 LOG((CLOG_DEBUG2 "can't read property %d on window 0x%08x", property, window));
1353 return false;
1354 }
1355}
1356
1357bool
1358CXWindowsUtil::setWindowProperty(Display* display, Window window,
1359 Atom property, const void* vdata, UInt32 size,
1360 Atom type, SInt32 format)
1361{
1362 const UInt32 length = 4 * XMaxRequestSize(display);
1363 const unsigned char* data = reinterpret_cast<const unsigned char*>(vdata);
1364 const UInt32 datumSize = static_cast<UInt32>(format / 8);
1365
1366 // save errors
1367 bool error = false;
1368 CXWindowsUtil::CErrorLock lock(display, &error);
1369
1370 // how much data to send in first chunk?
1371 UInt32 chunkSize = size;
1372 if (chunkSize > length) {
1373 chunkSize = length;
1374 }
1375
1376 // send first chunk
1377 XChangeProperty(display, window, property,
1378 type, format, PropModeReplace,
1379 data, chunkSize / datumSize);
1380
1381 // append remaining chunks
1382 data += chunkSize;
1383 size -= chunkSize;
1384 while (!error && size > 0) {
1385 chunkSize = size;
1386 if (chunkSize > length) {
1387 chunkSize = length;
1388 }
1389 XChangeProperty(display, window, property,
1390 type, format, PropModeAppend,
1391 data, chunkSize / datumSize);
1392 data += chunkSize;
1393 size -= chunkSize;
1394 }
1395
1396 return !error;
1397}
1398
1399Time
1400CXWindowsUtil::getCurrentTime(Display* display, Window window)
1401{
1402 // select property events on window
1403 XWindowAttributes attr;
1404 XGetWindowAttributes(display, window, &attr);
1405 XSelectInput(display, window, attr.your_event_mask | PropertyChangeMask);
1406
1407 // make a property name to receive dummy change
1408 Atom atom = XInternAtom(display, "TIMESTAMP", False);
1409
1410 // do a zero-length append to get the current time
1411 unsigned char dummy;
1412 XChangeProperty(display, window, atom,
1413 XA_INTEGER, 8,
1414 PropModeAppend,
1415 &dummy, 0);
1416
1417 // look for property notify events with the following
1418 CPropertyNotifyPredicateInfo filter;
1419 filter.m_window = window;
1420 filter.m_property = atom;
1421
1422 // wait for reply
1423 XEvent xevent;
1424 XIfEvent(display, &xevent, &CXWindowsUtil::propertyNotifyPredicate,
1425 (XPointer)&filter);
1426 assert(xevent.type == PropertyNotify);
1427 assert(xevent.xproperty.window == window);
1428 assert(xevent.xproperty.atom == atom);
1429
1430 // restore event mask
1431 XSelectInput(display, window, attr.your_event_mask);
1432
1433 return xevent.xproperty.time;
1434}
1435
1436KeyID
1437CXWindowsUtil::mapKeySymToKeyID(KeySym k)
1438{
1439 initKeyMaps();
1440
1441 switch (k & 0xffffff00) {
1442 case 0x0000:
1443 // Latin-1
1444 return static_cast<KeyID>(k);
1445
1446 case 0xfe00:
1447 // ISO 9995 Function and Modifier Keys
1448 switch (k) {
1449 case XK_ISO_Left_Tab:
1450 return kKeyLeftTab;
1451
1452 case XK_ISO_Level3_Shift:
1453 return kKeyAltGr;
1454
1455 case XK_ISO_Next_Group:
1456 return kKeyNextGroup;
1457
1458 case XK_ISO_Prev_Group:
1459 return kKeyPrevGroup;
1460
1461 case XK_dead_grave:
1462 return kKeyDeadGrave;
1463
1464 case XK_dead_acute:
1465 return kKeyDeadAcute;
1466
1467 case XK_dead_circumflex:
1468 return kKeyDeadCircumflex;
1469
1470 case XK_dead_tilde:
1471 return kKeyDeadTilde;
1472
1473 case XK_dead_macron:
1474 return kKeyDeadMacron;
1475
1476 case XK_dead_breve:
1477 return kKeyDeadBreve;
1478
1479 case XK_dead_abovedot:
1480 return kKeyDeadAbovedot;
1481
1482 case XK_dead_diaeresis:
1483 return kKeyDeadDiaeresis;
1484
1485 case XK_dead_abovering:
1486 return kKeyDeadAbovering;
1487
1488 case XK_dead_doubleacute:
1489 return kKeyDeadDoubleacute;
1490
1491 case XK_dead_caron:
1492 return kKeyDeadCaron;
1493
1494 case XK_dead_cedilla:
1495 return kKeyDeadCedilla;
1496
1497 case XK_dead_ogonek:
1498 return kKeyDeadOgonek;
1499
1500 default:
1501 return kKeyNone;
1502 }
1503
1504 case 0xff00:
1505 // MISCELLANY
1506 return static_cast<KeyID>(k - 0xff00 + 0xef00);
1507
1508 case 0x1008ff00:
1509 // "Internet" keys
1510 return s_map1008FF[k & 0xff];
1511
1512 default: {
1513 // lookup character in table
1514 CKeySymMap::const_iterator index = s_keySymToUCS4.find(k);
1515 if (index != s_keySymToUCS4.end()) {
1516 return static_cast<KeyID>(index->second);
1517 }
1518
1519 // unknown character
1520 return kKeyNone;
1521 }
1522 }
1523}
1524
1525UInt32
1526CXWindowsUtil::getModifierBitForKeySym(KeySym keysym)
1527{
1528 switch (keysym) {
1529 case XK_Shift_L:
1530 case XK_Shift_R:
1531 return kKeyModifierBitShift;
1532
1533 case XK_Control_L:
1534 case XK_Control_R:
1535 return kKeyModifierBitControl;
1536
1537 case XK_Alt_L:
1538 case XK_Alt_R:
1539 return kKeyModifierBitAlt;
1540
1541 case XK_Meta_L:
1542 case XK_Meta_R:
1543 return kKeyModifierBitMeta;
1544
1545 case XK_Super_L:
1546 case XK_Super_R:
1547 case XK_Hyper_L:
1548 case XK_Hyper_R:
1549 return kKeyModifierBitSuper;
1550
1551 case XK_Mode_switch:
1552 case XK_ISO_Level3_Shift:
1553 return kKeyModifierBitAltGr;
1554
1555 case XK_Caps_Lock:
1556 return kKeyModifierBitCapsLock;
1557
1558 case XK_Num_Lock:
1559 return kKeyModifierBitNumLock;
1560
1561 case XK_Scroll_Lock:
1562 return kKeyModifierBitScrollLock;
1563
1564 default:
1565 return kKeyModifierBitNone;
1566 }
1567}
1568
1569CString
1570CXWindowsUtil::atomToString(Display* display, Atom atom)
1571{
1572 if (atom == 0) {
1573 return "None";
1574 }
1575
1576 bool error = false;
1577 CXWindowsUtil::CErrorLock lock(display, &error);
1578 char* name = XGetAtomName(display, atom);
1579 if (error) {
1580 return CStringUtil::print("<UNKNOWN> (%d)", (int)atom);
1581 }
1582 else {
1583 CString msg = CStringUtil::print("%s (%d)", name, (int)atom);
1584 XFree(name);
1585 return msg;
1586 }
1587}
1588
1589CString
1590CXWindowsUtil::atomsToString(Display* display, const Atom* atom, UInt32 num)
1591{
1592 char** names = new char*[num];
1593 bool error = false;
1594 CXWindowsUtil::CErrorLock lock(display, &error);
1595 XGetAtomNames(display, const_cast<Atom*>(atom), (int)num, names);
1596 CString msg;
1597 if (error) {
1598 for (UInt32 i = 0; i < num; ++i) {
1599 msg += CStringUtil::print("<UNKNOWN> (%d), ", (int)atom[i]);
1600 }
1601 }
1602 else {
1603 for (UInt32 i = 0; i < num; ++i) {
1604 msg += CStringUtil::print("%s (%d), ", names[i], (int)atom[i]);
1605 XFree(names[i]);
1606 }
1607 }
1608 delete[] names;
1609 if (msg.size() > 2) {
1610 msg.erase(msg.size() - 2);
1611 }
1612 return msg;
1613}
1614
1615void
1616CXWindowsUtil::convertAtomProperty(CString& data)
1617{
1618 // as best i can tell, 64-bit systems don't pack Atoms into properties
1619 // as 32-bit numbers but rather as the 64-bit numbers they are. that
1620 // seems wrong but we have to cope. sometimes we'll get a list of
1621 // atoms that's 8*n+4 bytes long, missing the trailing 4 bytes which
1622 // should all be 0. since we're going to reference the Atoms as
1623 // 64-bit numbers we have to ensure the last number is a full 64 bits.
1624 if (sizeof(Atom) != 4 && ((data.size() / 4) & 1) != 0) {
1625 UInt32 zero = 0;
1626 data.append(reinterpret_cast<char*>(&zero), sizeof(zero));
1627 }
1628}
1629
1630void
1631CXWindowsUtil::appendAtomData(CString& data, Atom atom)
1632{
1633 data.append(reinterpret_cast<char*>(&atom), sizeof(Atom));
1634}
1635
1636void
1637CXWindowsUtil::replaceAtomData(CString& data, UInt32 index, Atom atom)
1638{
1639 data.replace(index * sizeof(Atom), sizeof(Atom),
1640 reinterpret_cast<const char*>(&atom),
1641 sizeof(Atom));
1642}
1643
1644void
1645CXWindowsUtil::appendTimeData(CString& data, Time time)
1646{
1647 data.append(reinterpret_cast<char*>(&time), sizeof(Time));
1648}
1649
1650Bool
1651CXWindowsUtil::propertyNotifyPredicate(Display*, XEvent* xevent, XPointer arg)
1652{
1653 CPropertyNotifyPredicateInfo* filter =
1654 reinterpret_cast<CPropertyNotifyPredicateInfo*>(arg);
1655 return (xevent->type == PropertyNotify &&
1656 xevent->xproperty.window == filter->m_window &&
1657 xevent->xproperty.atom == filter->m_property &&
1658 xevent->xproperty.state == PropertyNewValue) ? True : False;
1659}
1660
1661void
1662CXWindowsUtil::initKeyMaps()
1663{
1664 if (s_keySymToUCS4.empty()) {
1665 for (size_t i =0; i < sizeof(s_keymap) / sizeof(s_keymap[0]); ++i) {
1666 s_keySymToUCS4[s_keymap[i].keysym] = s_keymap[i].ucs4;
1667 }
1668 }
1669}
1670
1671
1672//
1673// CXWindowsUtil::CErrorLock
1674//
1675
1676CXWindowsUtil::CErrorLock* CXWindowsUtil::CErrorLock::s_top = NULL;
1677
1678CXWindowsUtil::CErrorLock::CErrorLock(Display* display) :
1679 m_display(display)
1680{
1681 install(&CXWindowsUtil::CErrorLock::ignoreHandler, NULL);
1682}
1683
1684CXWindowsUtil::CErrorLock::CErrorLock(Display* display, bool* flag) :
1685 m_display(display)
1686{
1687 install(&CXWindowsUtil::CErrorLock::saveHandler, flag);
1688}
1689
1690CXWindowsUtil::CErrorLock::CErrorLock(Display* display,
1691 ErrorHandler handler, void* data) :
1692 m_display(display)
1693{
1694 install(handler, data);
1695}
1696
1697CXWindowsUtil::CErrorLock::~CErrorLock()
1698{
1699 // make sure everything finishes before uninstalling handler
1700 if (m_display != NULL) {
1701 XSync(m_display, False);
1702 }
1703
1704 // restore old handler
1705 XSetErrorHandler(m_oldXHandler);
1706 s_top = m_next;
1707}
1708
1709void
1710CXWindowsUtil::CErrorLock::install(ErrorHandler handler, void* data)
1711{
1712 // make sure everything finishes before installing handler
1713 if (m_display != NULL) {
1714 XSync(m_display, False);
1715 }
1716
1717 // install handler
1718 m_handler = handler;
1719 m_userData = data;
1720 m_oldXHandler = XSetErrorHandler(
1721 &CXWindowsUtil::CErrorLock::internalHandler);
1722 m_next = s_top;
1723 s_top = this;
1724}
1725
1726int
1727CXWindowsUtil::CErrorLock::internalHandler(Display* display, XErrorEvent* event)
1728{
1729 if (s_top != NULL && s_top->m_handler != NULL) {
1730 s_top->m_handler(display, event, s_top->m_userData);
1731 }
1732 return 0;
1733}
1734
1735void
1736CXWindowsUtil::CErrorLock::ignoreHandler(Display*, XErrorEvent* e, void*)
1737{
1738 LOG((CLOG_DEBUG1 "ignoring X error: %d", e->error_code));
1739}
1740
1741void
1742CXWindowsUtil::CErrorLock::saveHandler(Display*, XErrorEvent* e, void* flag)
1743{
1744 LOG((CLOG_DEBUG1 "flagging X error: %d", e->error_code));
1745 *reinterpret_cast<bool*>(flag) = true;
1746}
Note: See TracBrowser for help on using the repository browser.