CXWindowsUtil.cpp

00001 /*
00002  * synergy -- mouse and keyboard sharing utility
00003  * Copyright (C) 2002 Chris Schoeneman
00004  * 
00005  * This package is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU General Public License
00007  * found in the file COPYING that should have accompanied this file.
00008  * 
00009  * This package is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  */
00014 
00015 #include "CXWindowsUtil.h"
00016 #include "KeyTypes.h"
00017 #include "CThread.h"
00018 #include "CLog.h"
00019 #include "CStringUtil.h"
00020 #include <X11/Xatom.h>
00021 #define XK_APL
00022 #define XK_ARABIC
00023 #define XK_ARMENIAN
00024 #define XK_CAUCASUS
00025 #define XK_CURRENCY
00026 #define XK_CYRILLIC
00027 #define XK_GEORGIAN
00028 #define XK_GREEK
00029 #define XK_HEBREW
00030 #define XK_KATAKANA
00031 #define XK_KOREAN
00032 #define XK_LATIN1
00033 #define XK_LATIN2
00034 #define XK_LATIN3
00035 #define XK_LATIN4
00036 #define XK_LATIN8
00037 #define XK_LATIN9
00038 #define XK_MISCELLANY
00039 #define XK_PUBLISHING
00040 #define XK_SPECIAL
00041 #define XK_TECHNICAL
00042 #define XK_THAI
00043 #define XK_VIETNAMESE
00044 #define XK_XKB_KEYS
00045 #include <X11/keysym.h>
00046 
00047 #if !defined(XK_OE)
00048 #define XK_OE                  0x13bc
00049 #endif
00050 #if !defined(XK_oe)
00051 #define XK_oe                  0x13bd
00052 #endif
00053 #if !defined(XK_Ydiaeresis)
00054 #define XK_Ydiaeresis          0x13be
00055 #endif
00056 
00057 /*
00058  * This table maps keysym values into the corresponding ISO 10646
00059  * (UCS, Unicode) values.
00060  *
00061  * The array keysymtab[] contains pairs of X11 keysym values for graphical
00062  * characters and the corresponding Unicode value.
00063  *
00064  * Author: Markus G. Kuhn <http://www.cl.cam.ac.uk/~mgk25/>,
00065  *         University of Cambridge, April 2001
00066  *
00067  * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing
00068  * an initial draft of the mapping table.
00069  *
00070  * This software is in the public domain. Share and enjoy!
00071  */
00072 
00073 struct codepair {
00074     KeySym              keysym;
00075     UInt32              ucs4;
00076 } s_keymap[] = {
00077 { XK_Aogonek,                     0x0104 }, /* LATIN CAPITAL LETTER A WITH OGONEK */
00078 { XK_breve,                       0x02d8 }, /* BREVE */
00079 { XK_Lstroke,                     0x0141 }, /* LATIN CAPITAL LETTER L WITH STROKE */
00080 { XK_Lcaron,                      0x013d }, /* LATIN CAPITAL LETTER L WITH CARON */
00081 { XK_Sacute,                      0x015a }, /* LATIN CAPITAL LETTER S WITH ACUTE */
00082 { XK_Scaron,                      0x0160 }, /* LATIN CAPITAL LETTER S WITH CARON */
00083 { XK_Scedilla,                    0x015e }, /* LATIN CAPITAL LETTER S WITH CEDILLA */
00084 { XK_Tcaron,                      0x0164 }, /* LATIN CAPITAL LETTER T WITH CARON */
00085 { XK_Zacute,                      0x0179 }, /* LATIN CAPITAL LETTER Z WITH ACUTE */
00086 { XK_Zcaron,                      0x017d }, /* LATIN CAPITAL LETTER Z WITH CARON */
00087 { XK_Zabovedot,                   0x017b }, /* LATIN CAPITAL LETTER Z WITH DOT ABOVE */
00088 { XK_aogonek,                     0x0105 }, /* LATIN SMALL LETTER A WITH OGONEK */
00089 { XK_ogonek,                      0x02db }, /* OGONEK */
00090 { XK_lstroke,                     0x0142 }, /* LATIN SMALL LETTER L WITH STROKE */
00091 { XK_lcaron,                      0x013e }, /* LATIN SMALL LETTER L WITH CARON */
00092 { XK_sacute,                      0x015b }, /* LATIN SMALL LETTER S WITH ACUTE */
00093 { XK_caron,                       0x02c7 }, /* CARON */
00094 { XK_scaron,                      0x0161 }, /* LATIN SMALL LETTER S WITH CARON */
00095 { XK_scedilla,                    0x015f }, /* LATIN SMALL LETTER S WITH CEDILLA */
00096 { XK_tcaron,                      0x0165 }, /* LATIN SMALL LETTER T WITH CARON */
00097 { XK_zacute,                      0x017a }, /* LATIN SMALL LETTER Z WITH ACUTE */
00098 { XK_doubleacute,                 0x02dd }, /* DOUBLE ACUTE ACCENT */
00099 { XK_zcaron,                      0x017e }, /* LATIN SMALL LETTER Z WITH CARON */
00100 { XK_zabovedot,                   0x017c }, /* LATIN SMALL LETTER Z WITH DOT ABOVE */
00101 { XK_Racute,                      0x0154 }, /* LATIN CAPITAL LETTER R WITH ACUTE */
00102 { XK_Abreve,                      0x0102 }, /* LATIN CAPITAL LETTER A WITH BREVE */
00103 { XK_Lacute,                      0x0139 }, /* LATIN CAPITAL LETTER L WITH ACUTE */
00104 { XK_Cacute,                      0x0106 }, /* LATIN CAPITAL LETTER C WITH ACUTE */
00105 { XK_Ccaron,                      0x010c }, /* LATIN CAPITAL LETTER C WITH CARON */
00106 { XK_Eogonek,                     0x0118 }, /* LATIN CAPITAL LETTER E WITH OGONEK */
00107 { XK_Ecaron,                      0x011a }, /* LATIN CAPITAL LETTER E WITH CARON */
00108 { XK_Dcaron,                      0x010e }, /* LATIN CAPITAL LETTER D WITH CARON */
00109 { XK_Dstroke,                     0x0110 }, /* LATIN CAPITAL LETTER D WITH STROKE */
00110 { XK_Nacute,                      0x0143 }, /* LATIN CAPITAL LETTER N WITH ACUTE */
00111 { XK_Ncaron,                      0x0147 }, /* LATIN CAPITAL LETTER N WITH CARON */
00112 { XK_Odoubleacute,                0x0150 }, /* LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
00113 { XK_Rcaron,                      0x0158 }, /* LATIN CAPITAL LETTER R WITH CARON */
00114 { XK_Uring,                       0x016e }, /* LATIN CAPITAL LETTER U WITH RING ABOVE */
00115 { XK_Udoubleacute,                0x0170 }, /* LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
00116 { XK_Tcedilla,                    0x0162 }, /* LATIN CAPITAL LETTER T WITH CEDILLA */
00117 { XK_racute,                      0x0155 }, /* LATIN SMALL LETTER R WITH ACUTE */
00118 { XK_abreve,                      0x0103 }, /* LATIN SMALL LETTER A WITH BREVE */
00119 { XK_lacute,                      0x013a }, /* LATIN SMALL LETTER L WITH ACUTE */
00120 { XK_cacute,                      0x0107 }, /* LATIN SMALL LETTER C WITH ACUTE */
00121 { XK_ccaron,                      0x010d }, /* LATIN SMALL LETTER C WITH CARON */
00122 { XK_eogonek,                     0x0119 }, /* LATIN SMALL LETTER E WITH OGONEK */
00123 { XK_ecaron,                      0x011b }, /* LATIN SMALL LETTER E WITH CARON */
00124 { XK_dcaron,                      0x010f }, /* LATIN SMALL LETTER D WITH CARON */
00125 { XK_dstroke,                     0x0111 }, /* LATIN SMALL LETTER D WITH STROKE */
00126 { XK_nacute,                      0x0144 }, /* LATIN SMALL LETTER N WITH ACUTE */
00127 { XK_ncaron,                      0x0148 }, /* LATIN SMALL LETTER N WITH CARON */
00128 { XK_odoubleacute,                0x0151 }, /* LATIN SMALL LETTER O WITH DOUBLE ACUTE */
00129 { XK_rcaron,                      0x0159 }, /* LATIN SMALL LETTER R WITH CARON */
00130 { XK_uring,                       0x016f }, /* LATIN SMALL LETTER U WITH RING ABOVE */
00131 { XK_udoubleacute,                0x0171 }, /* LATIN SMALL LETTER U WITH DOUBLE ACUTE */
00132 { XK_tcedilla,                    0x0163 }, /* LATIN SMALL LETTER T WITH CEDILLA */
00133 { XK_abovedot,                    0x02d9 }, /* DOT ABOVE */
00134 { XK_Hstroke,                     0x0126 }, /* LATIN CAPITAL LETTER H WITH STROKE */
00135 { XK_Hcircumflex,                 0x0124 }, /* LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
00136 { XK_Iabovedot,                   0x0130 }, /* LATIN CAPITAL LETTER I WITH DOT ABOVE */
00137 { XK_Gbreve,                      0x011e }, /* LATIN CAPITAL LETTER G WITH BREVE */
00138 { XK_Jcircumflex,                 0x0134 }, /* LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
00139 { XK_hstroke,                     0x0127 }, /* LATIN SMALL LETTER H WITH STROKE */
00140 { XK_hcircumflex,                 0x0125 }, /* LATIN SMALL LETTER H WITH CIRCUMFLEX */
00141 { XK_idotless,                    0x0131 }, /* LATIN SMALL LETTER DOTLESS I */
00142 { XK_gbreve,                      0x011f }, /* LATIN SMALL LETTER G WITH BREVE */
00143 { XK_jcircumflex,                 0x0135 }, /* LATIN SMALL LETTER J WITH CIRCUMFLEX */
00144 { XK_Cabovedot,                   0x010a }, /* LATIN CAPITAL LETTER C WITH DOT ABOVE */
00145 { XK_Ccircumflex,                 0x0108 }, /* LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
00146 { XK_Gabovedot,                   0x0120 }, /* LATIN CAPITAL LETTER G WITH DOT ABOVE */
00147 { XK_Gcircumflex,                 0x011c }, /* LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
00148 { XK_Ubreve,                      0x016c }, /* LATIN CAPITAL LETTER U WITH BREVE */
00149 { XK_Scircumflex,                 0x015c }, /* LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
00150 { XK_cabovedot,                   0x010b }, /* LATIN SMALL LETTER C WITH DOT ABOVE */
00151 { XK_ccircumflex,                 0x0109 }, /* LATIN SMALL LETTER C WITH CIRCUMFLEX */
00152 { XK_gabovedot,                   0x0121 }, /* LATIN SMALL LETTER G WITH DOT ABOVE */
00153 { XK_gcircumflex,                 0x011d }, /* LATIN SMALL LETTER G WITH CIRCUMFLEX */
00154 { XK_ubreve,                      0x016d }, /* LATIN SMALL LETTER U WITH BREVE */
00155 { XK_scircumflex,                 0x015d }, /* LATIN SMALL LETTER S WITH CIRCUMFLEX */
00156 { XK_kra,                         0x0138 }, /* LATIN SMALL LETTER KRA */
00157 { XK_Rcedilla,                    0x0156 }, /* LATIN CAPITAL LETTER R WITH CEDILLA */
00158 { XK_Itilde,                      0x0128 }, /* LATIN CAPITAL LETTER I WITH TILDE */
00159 { XK_Lcedilla,                    0x013b }, /* LATIN CAPITAL LETTER L WITH CEDILLA */
00160 { XK_Emacron,                     0x0112 }, /* LATIN CAPITAL LETTER E WITH MACRON */
00161 { XK_Gcedilla,                    0x0122 }, /* LATIN CAPITAL LETTER G WITH CEDILLA */
00162 { XK_Tslash,                      0x0166 }, /* LATIN CAPITAL LETTER T WITH STROKE */
00163 { XK_rcedilla,                    0x0157 }, /* LATIN SMALL LETTER R WITH CEDILLA */
00164 { XK_itilde,                      0x0129 }, /* LATIN SMALL LETTER I WITH TILDE */
00165 { XK_lcedilla,                    0x013c }, /* LATIN SMALL LETTER L WITH CEDILLA */
00166 { XK_emacron,                     0x0113 }, /* LATIN SMALL LETTER E WITH MACRON */
00167 { XK_gcedilla,                    0x0123 }, /* LATIN SMALL LETTER G WITH CEDILLA */
00168 { XK_tslash,                      0x0167 }, /* LATIN SMALL LETTER T WITH STROKE */
00169 { XK_ENG,                         0x014a }, /* LATIN CAPITAL LETTER ENG */
00170 { XK_eng,                         0x014b }, /* LATIN SMALL LETTER ENG */
00171 { XK_Amacron,                     0x0100 }, /* LATIN CAPITAL LETTER A WITH MACRON */
00172 { XK_Iogonek,                     0x012e }, /* LATIN CAPITAL LETTER I WITH OGONEK */
00173 { XK_Eabovedot,                   0x0116 }, /* LATIN CAPITAL LETTER E WITH DOT ABOVE */
00174 { XK_Imacron,                     0x012a }, /* LATIN CAPITAL LETTER I WITH MACRON */
00175 { XK_Ncedilla,                    0x0145 }, /* LATIN CAPITAL LETTER N WITH CEDILLA */
00176 { XK_Omacron,                     0x014c }, /* LATIN CAPITAL LETTER O WITH MACRON */
00177 { XK_Kcedilla,                    0x0136 }, /* LATIN CAPITAL LETTER K WITH CEDILLA */
00178 { XK_Uogonek,                     0x0172 }, /* LATIN CAPITAL LETTER U WITH OGONEK */
00179 { XK_Utilde,                      0x0168 }, /* LATIN CAPITAL LETTER U WITH TILDE */
00180 { XK_Umacron,                     0x016a }, /* LATIN CAPITAL LETTER U WITH MACRON */
00181 { XK_amacron,                     0x0101 }, /* LATIN SMALL LETTER A WITH MACRON */
00182 { XK_iogonek,                     0x012f }, /* LATIN SMALL LETTER I WITH OGONEK */
00183 { XK_eabovedot,                   0x0117 }, /* LATIN SMALL LETTER E WITH DOT ABOVE */
00184 { XK_imacron,                     0x012b }, /* LATIN SMALL LETTER I WITH MACRON */
00185 { XK_ncedilla,                    0x0146 }, /* LATIN SMALL LETTER N WITH CEDILLA */
00186 { XK_omacron,                     0x014d }, /* LATIN SMALL LETTER O WITH MACRON */
00187 { XK_kcedilla,                    0x0137 }, /* LATIN SMALL LETTER K WITH CEDILLA */
00188 { XK_uogonek,                     0x0173 }, /* LATIN SMALL LETTER U WITH OGONEK */
00189 { XK_utilde,                      0x0169 }, /* LATIN SMALL LETTER U WITH TILDE */
00190 { XK_umacron,                     0x016b }, /* LATIN SMALL LETTER U WITH MACRON */
00191 #if defined(XK_Babovedot)
00192 { XK_Babovedot,                   0x1e02 }, /* LATIN CAPITAL LETTER B WITH DOT ABOVE */
00193 { XK_babovedot,                   0x1e03 }, /* LATIN SMALL LETTER B WITH DOT ABOVE */
00194 { XK_Dabovedot,                   0x1e0a }, /* LATIN CAPITAL LETTER D WITH DOT ABOVE */
00195 { XK_Wgrave,                      0x1e80 }, /* LATIN CAPITAL LETTER W WITH GRAVE */
00196 { XK_Wacute,                      0x1e82 }, /* LATIN CAPITAL LETTER W WITH ACUTE */
00197 { XK_dabovedot,                   0x1e0b }, /* LATIN SMALL LETTER D WITH DOT ABOVE */
00198 { XK_Ygrave,                      0x1ef2 }, /* LATIN CAPITAL LETTER Y WITH GRAVE  */
00199 { XK_Fabovedot,                   0x1e1e }, /* LATIN CAPITAL LETTER F WITH DOT ABOVE */
00200 { XK_fabovedot,                   0x1e1f }, /* LATIN SMALL LETTER F WITH DOT ABOVE */
00201 { XK_Mabovedot,                   0x1e40 }, /* LATIN CAPITAL LETTER M WITH DOT ABOVE */
00202 { XK_mabovedot,                   0x1e41 }, /* LATIN SMALL LETTER M WITH DOT ABOVE */
00203 { XK_Pabovedot,                   0x1e56 }, /* LATIN CAPITAL LETTER P WITH DOT ABOVE */
00204 { XK_wgrave,                      0x1e81 }, /* LATIN SMALL LETTER W WITH GRAVE  */
00205 { XK_pabovedot,                   0x1e57 }, /* LATIN SMALL LETTER P WITH DOT ABOVE */
00206 { XK_wacute,                      0x1e83 }, /* LATIN SMALL LETTER W WITH ACUTE  */
00207 { XK_Sabovedot,                   0x1e60 }, /* LATIN CAPITAL LETTER S WITH DOT ABOVE */
00208 { XK_ygrave,                      0x1ef3 }, /* LATIN SMALL LETTER Y WITH GRAVE  */
00209 { XK_Wdiaeresis,                  0x1e84 }, /* LATIN CAPITAL LETTER W WITH DIAERESIS */
00210 { XK_wdiaeresis,                  0x1e85 }, /* LATIN SMALL LETTER W WITH DIAERESIS */
00211 { XK_sabovedot,                   0x1e61 }, /* LATIN SMALL LETTER S WITH DOT ABOVE */
00212 { XK_Wcircumflex,                 0x0174 }, /* LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
00213 { XK_Tabovedot,                   0x1e6a }, /* LATIN CAPITAL LETTER T WITH DOT ABOVE */
00214 { XK_Ycircumflex,                 0x0176 }, /* LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
00215 { XK_wcircumflex,                 0x0175 }, /* LATIN SMALL LETTER W WITH CIRCUMFLEX */
00216 { XK_tabovedot,                   0x1e6b }, /* LATIN SMALL LETTER T WITH DOT ABOVE */
00217 { XK_ycircumflex,                 0x0177 }, /* LATIN SMALL LETTER Y WITH CIRCUMFLEX */
00218 #endif // defined(XK_Babovedot)
00219 #if defined(XK_overline)
00220 { XK_overline,                    0x203e }, /* OVERLINE */
00221 { XK_kana_fullstop,               0x3002 }, /* IDEOGRAPHIC FULL STOP */
00222 { XK_kana_openingbracket,         0x300c }, /* LEFT CORNER BRACKET */
00223 { XK_kana_closingbracket,         0x300d }, /* RIGHT CORNER BRACKET */
00224 { XK_kana_comma,                  0x3001 }, /* IDEOGRAPHIC COMMA */
00225 { XK_kana_conjunctive,            0x30fb }, /* KATAKANA MIDDLE DOT */
00226 { XK_kana_WO,                     0x30f2 }, /* KATAKANA LETTER WO */
00227 { XK_kana_a,                      0x30a1 }, /* KATAKANA LETTER SMALL A */
00228 { XK_kana_i,                      0x30a3 }, /* KATAKANA LETTER SMALL I */
00229 { XK_kana_u,                      0x30a5 }, /* KATAKANA LETTER SMALL U */
00230 { XK_kana_e,                      0x30a7 }, /* KATAKANA LETTER SMALL E */
00231 { XK_kana_o,                      0x30a9 }, /* KATAKANA LETTER SMALL O */
00232 { XK_kana_ya,                     0x30e3 }, /* KATAKANA LETTER SMALL YA */
00233 { XK_kana_yu,                     0x30e5 }, /* KATAKANA LETTER SMALL YU */
00234 { XK_kana_yo,                     0x30e7 }, /* KATAKANA LETTER SMALL YO */
00235 { XK_kana_tsu,                    0x30c3 }, /* KATAKANA LETTER SMALL TU */
00236 { XK_prolongedsound,              0x30fc }, /* KATAKANA-HIRAGANA PROLONGED SOUND MARK */
00237 { XK_kana_A,                      0x30a2 }, /* KATAKANA LETTER A */
00238 { XK_kana_I,                      0x30a4 }, /* KATAKANA LETTER I */
00239 { XK_kana_U,                      0x30a6 }, /* KATAKANA LETTER U */
00240 { XK_kana_E,                      0x30a8 }, /* KATAKANA LETTER E */
00241 { XK_kana_O,                      0x30aa }, /* KATAKANA LETTER O */
00242 { XK_kana_KA,                     0x30ab }, /* KATAKANA LETTER KA */
00243 { XK_kana_KI,                     0x30ad }, /* KATAKANA LETTER KI */
00244 { XK_kana_KU,                     0x30af }, /* KATAKANA LETTER KU */
00245 { XK_kana_KE,                     0x30b1 }, /* KATAKANA LETTER KE */
00246 { XK_kana_KO,                     0x30b3 }, /* KATAKANA LETTER KO */
00247 { XK_kana_SA,                     0x30b5 }, /* KATAKANA LETTER SA */
00248 { XK_kana_SHI,                    0x30b7 }, /* KATAKANA LETTER SI */
00249 { XK_kana_SU,                     0x30b9 }, /* KATAKANA LETTER SU */
00250 { XK_kana_SE,                     0x30bb }, /* KATAKANA LETTER SE */
00251 { XK_kana_SO,                     0x30bd }, /* KATAKANA LETTER SO */
00252 { XK_kana_TA,                     0x30bf }, /* KATAKANA LETTER TA */
00253 { XK_kana_CHI,                    0x30c1 }, /* KATAKANA LETTER TI */
00254 { XK_kana_TSU,                    0x30c4 }, /* KATAKANA LETTER TU */
00255 { XK_kana_TE,                     0x30c6 }, /* KATAKANA LETTER TE */
00256 { XK_kana_TO,                     0x30c8 }, /* KATAKANA LETTER TO */
00257 { XK_kana_NA,                     0x30ca }, /* KATAKANA LETTER NA */
00258 { XK_kana_NI,                     0x30cb }, /* KATAKANA LETTER NI */
00259 { XK_kana_NU,                     0x30cc }, /* KATAKANA LETTER NU */
00260 { XK_kana_NE,                     0x30cd }, /* KATAKANA LETTER NE */
00261 { XK_kana_NO,                     0x30ce }, /* KATAKANA LETTER NO */
00262 { XK_kana_HA,                     0x30cf }, /* KATAKANA LETTER HA */
00263 { XK_kana_HI,                     0x30d2 }, /* KATAKANA LETTER HI */
00264 { XK_kana_FU,                     0x30d5 }, /* KATAKANA LETTER HU */
00265 { XK_kana_HE,                     0x30d8 }, /* KATAKANA LETTER HE */
00266 { XK_kana_HO,                     0x30db }, /* KATAKANA LETTER HO */
00267 { XK_kana_MA,                     0x30de }, /* KATAKANA LETTER MA */
00268 { XK_kana_MI,                     0x30df }, /* KATAKANA LETTER MI */
00269 { XK_kana_MU,                     0x30e0 }, /* KATAKANA LETTER MU */
00270 { XK_kana_ME,                     0x30e1 }, /* KATAKANA LETTER ME */
00271 { XK_kana_MO,                     0x30e2 }, /* KATAKANA LETTER MO */
00272 { XK_kana_YA,                     0x30e4 }, /* KATAKANA LETTER YA */
00273 { XK_kana_YU,                     0x30e6 }, /* KATAKANA LETTER YU */
00274 { XK_kana_YO,                     0x30e8 }, /* KATAKANA LETTER YO */
00275 { XK_kana_RA,                     0x30e9 }, /* KATAKANA LETTER RA */
00276 { XK_kana_RI,                     0x30ea }, /* KATAKANA LETTER RI */
00277 { XK_kana_RU,                     0x30eb }, /* KATAKANA LETTER RU */
00278 { XK_kana_RE,                     0x30ec }, /* KATAKANA LETTER RE */
00279 { XK_kana_RO,                     0x30ed }, /* KATAKANA LETTER RO */
00280 { XK_kana_WA,                     0x30ef }, /* KATAKANA LETTER WA */
00281 { XK_kana_N,                      0x30f3 }, /* KATAKANA LETTER N */
00282 { XK_voicedsound,                 0x309b }, /* KATAKANA-HIRAGANA VOICED SOUND MARK */
00283 { XK_semivoicedsound,             0x309c }, /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
00284 #endif // defined(XK_overline)
00285 #if defined(XK_Farsi_0)
00286 { XK_Farsi_0,                     0x06f0 }, /* EXTENDED ARABIC-INDIC DIGIT 0 */
00287 { XK_Farsi_1,                     0x06f1 }, /* EXTENDED ARABIC-INDIC DIGIT 1 */
00288 { XK_Farsi_2,                     0x06f2 }, /* EXTENDED ARABIC-INDIC DIGIT 2 */
00289 { XK_Farsi_3,                     0x06f3 }, /* EXTENDED ARABIC-INDIC DIGIT 3 */
00290 { XK_Farsi_4,                     0x06f4 }, /* EXTENDED ARABIC-INDIC DIGIT 4 */
00291 { XK_Farsi_5,                     0x06f5 }, /* EXTENDED ARABIC-INDIC DIGIT 5 */
00292 { XK_Farsi_6,                     0x06f6 }, /* EXTENDED ARABIC-INDIC DIGIT 6 */
00293 { XK_Farsi_7,                     0x06f7 }, /* EXTENDED ARABIC-INDIC DIGIT 7 */
00294 { XK_Farsi_8,                     0x06f8 }, /* EXTENDED ARABIC-INDIC DIGIT 8 */
00295 { XK_Farsi_9,                     0x06f9 }, /* EXTENDED ARABIC-INDIC DIGIT 9 */
00296 { XK_Arabic_percent,              0x066a }, /* ARABIC PERCENT */
00297 { XK_Arabic_superscript_alef,     0x0670 }, /* ARABIC LETTER SUPERSCRIPT ALEF */
00298 { XK_Arabic_tteh,                 0x0679 }, /* ARABIC LETTER TTEH */
00299 { XK_Arabic_peh,                  0x067e }, /* ARABIC LETTER PEH */
00300 { XK_Arabic_tcheh,                0x0686 }, /* ARABIC LETTER TCHEH */
00301 { XK_Arabic_ddal,                 0x0688 }, /* ARABIC LETTER DDAL */
00302 { XK_Arabic_rreh,                 0x0691 }, /* ARABIC LETTER RREH */
00303 { XK_Arabic_comma,                0x060c }, /* ARABIC COMMA */
00304 { XK_Arabic_fullstop,             0x06d4 }, /* ARABIC FULLSTOP */
00305 { XK_Arabic_semicolon,            0x061b }, /* ARABIC SEMICOLON */
00306 { XK_Arabic_0,                    0x0660 }, /* ARABIC 0 */
00307 { XK_Arabic_1,                    0x0661 }, /* ARABIC 1 */
00308 { XK_Arabic_2,                    0x0662 }, /* ARABIC 2 */
00309 { XK_Arabic_3,                    0x0663 }, /* ARABIC 3 */
00310 { XK_Arabic_4,                    0x0664 }, /* ARABIC 4 */
00311 { XK_Arabic_5,                    0x0665 }, /* ARABIC 5 */
00312 { XK_Arabic_6,                    0x0666 }, /* ARABIC 6 */
00313 { XK_Arabic_7,                    0x0667 }, /* ARABIC 7 */
00314 { XK_Arabic_8,                    0x0668 }, /* ARABIC 8 */
00315 { XK_Arabic_9,                    0x0669 }, /* ARABIC 9 */
00316 { XK_Arabic_question_mark,        0x061f }, /* ARABIC QUESTION MARK */
00317 { XK_Arabic_hamza,                0x0621 }, /* ARABIC LETTER HAMZA */
00318 { XK_Arabic_maddaonalef,          0x0622 }, /* ARABIC LETTER ALEF WITH MADDA ABOVE */
00319 { XK_Arabic_hamzaonalef,          0x0623 }, /* ARABIC LETTER ALEF WITH HAMZA ABOVE */
00320 { XK_Arabic_hamzaonwaw,           0x0624 }, /* ARABIC LETTER WAW WITH HAMZA ABOVE */
00321 { XK_Arabic_hamzaunderalef,       0x0625 }, /* ARABIC LETTER ALEF WITH HAMZA BELOW */
00322 { XK_Arabic_hamzaonyeh,           0x0626 }, /* ARABIC LETTER YEH WITH HAMZA ABOVE */
00323 { XK_Arabic_alef,                 0x0627 }, /* ARABIC LETTER ALEF */
00324 { XK_Arabic_beh,                  0x0628 }, /* ARABIC LETTER BEH */
00325 { XK_Arabic_tehmarbuta,           0x0629 }, /* ARABIC LETTER TEH MARBUTA */
00326 { XK_Arabic_teh,                  0x062a }, /* ARABIC LETTER TEH */
00327 { XK_Arabic_theh,                 0x062b }, /* ARABIC LETTER THEH */
00328 { XK_Arabic_jeem,                 0x062c }, /* ARABIC LETTER JEEM */
00329 { XK_Arabic_hah,                  0x062d }, /* ARABIC LETTER HAH */
00330 { XK_Arabic_khah,                 0x062e }, /* ARABIC LETTER KHAH */
00331 { XK_Arabic_dal,                  0x062f }, /* ARABIC LETTER DAL */
00332 { XK_Arabic_thal,                 0x0630 }, /* ARABIC LETTER THAL */
00333 { XK_Arabic_ra,                   0x0631 }, /* ARABIC LETTER REH */
00334 { XK_Arabic_zain,                 0x0632 }, /* ARABIC LETTER ZAIN */
00335 { XK_Arabic_seen,                 0x0633 }, /* ARABIC LETTER SEEN */
00336 { XK_Arabic_sheen,                0x0634 }, /* ARABIC LETTER SHEEN */
00337 { XK_Arabic_sad,                  0x0635 }, /* ARABIC LETTER SAD */
00338 { XK_Arabic_dad,                  0x0636 }, /* ARABIC LETTER DAD */
00339 { XK_Arabic_tah,                  0x0637 }, /* ARABIC LETTER TAH */
00340 { XK_Arabic_zah,                  0x0638 }, /* ARABIC LETTER ZAH */
00341 { XK_Arabic_ain,                  0x0639 }, /* ARABIC LETTER AIN */
00342 { XK_Arabic_ghain,                0x063a }, /* ARABIC LETTER GHAIN */
00343 { XK_Arabic_tatweel,              0x0640 }, /* ARABIC TATWEEL */
00344 { XK_Arabic_feh,                  0x0641 }, /* ARABIC LETTER FEH */
00345 { XK_Arabic_qaf,                  0x0642 }, /* ARABIC LETTER QAF */
00346 { XK_Arabic_kaf,                  0x0643 }, /* ARABIC LETTER KAF */
00347 { XK_Arabic_lam,                  0x0644 }, /* ARABIC LETTER LAM */
00348 { XK_Arabic_meem,                 0x0645 }, /* ARABIC LETTER MEEM */
00349 { XK_Arabic_noon,                 0x0646 }, /* ARABIC LETTER NOON */
00350 { XK_Arabic_ha,                   0x0647 }, /* ARABIC LETTER HEH */
00351 { XK_Arabic_waw,                  0x0648 }, /* ARABIC LETTER WAW */
00352 { XK_Arabic_alefmaksura,          0x0649 }, /* ARABIC LETTER ALEF MAKSURA */
00353 { XK_Arabic_yeh,                  0x064a }, /* ARABIC LETTER YEH */
00354 { XK_Arabic_fathatan,             0x064b }, /* ARABIC FATHATAN */
00355 { XK_Arabic_dammatan,             0x064c }, /* ARABIC DAMMATAN */
00356 { XK_Arabic_kasratan,             0x064d }, /* ARABIC KASRATAN */
00357 { XK_Arabic_fatha,                0x064e }, /* ARABIC FATHA */
00358 { XK_Arabic_damma,                0x064f }, /* ARABIC DAMMA */
00359 { XK_Arabic_kasra,                0x0650 }, /* ARABIC KASRA */
00360 { XK_Arabic_shadda,               0x0651 }, /* ARABIC SHADDA */
00361 { XK_Arabic_sukun,                0x0652 }, /* ARABIC SUKUN */
00362 { XK_Arabic_madda_above,          0x0653 }, /* ARABIC MADDA ABOVE */
00363 { XK_Arabic_hamza_above,          0x0654 }, /* ARABIC HAMZA ABOVE */
00364 { XK_Arabic_hamza_below,          0x0655 }, /* ARABIC HAMZA BELOW */
00365 { XK_Arabic_jeh,                  0x0698 }, /* ARABIC LETTER JEH */
00366 { XK_Arabic_veh,                  0x06a4 }, /* ARABIC LETTER VEH */
00367 { XK_Arabic_keheh,                0x06a9 }, /* ARABIC LETTER KEHEH */
00368 { XK_Arabic_gaf,                  0x06af }, /* ARABIC LETTER GAF */
00369 { XK_Arabic_noon_ghunna,          0x06ba }, /* ARABIC LETTER NOON GHUNNA */
00370 { XK_Arabic_heh_doachashmee,      0x06be }, /* ARABIC LETTER HEH DOACHASHMEE */
00371 { XK_Arabic_farsi_yeh,            0x06cc }, /* ARABIC LETTER FARSI YEH */
00372 { XK_Arabic_yeh_baree,            0x06d2 }, /* ARABIC LETTER YEH BAREE */
00373 { XK_Arabic_heh_goal,             0x06c1 }, /* ARABIC LETTER HEH GOAL */
00374 #endif // defined(XK_Farsi_0)
00375 #if defined(XK_Serbian_dje)
00376 { XK_Serbian_dje,                 0x0452 }, /* CYRILLIC SMALL LETTER DJE */
00377 { XK_Macedonia_gje,               0x0453 }, /* CYRILLIC SMALL LETTER GJE */
00378 { XK_Cyrillic_io,                 0x0451 }, /* CYRILLIC SMALL LETTER IO */
00379 { XK_Ukrainian_ie,                0x0454 }, /* CYRILLIC SMALL LETTER UKRAINIAN IE */
00380 { XK_Macedonia_dse,               0x0455 }, /* CYRILLIC SMALL LETTER DZE */
00381 { XK_Ukrainian_i,                 0x0456 }, /* CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
00382 { XK_Ukrainian_yi,                0x0457 }, /* CYRILLIC SMALL LETTER YI */
00383 { XK_Cyrillic_je,                 0x0458 }, /* CYRILLIC SMALL LETTER JE */
00384 { XK_Cyrillic_lje,                0x0459 }, /* CYRILLIC SMALL LETTER LJE */
00385 { XK_Cyrillic_nje,                0x045a }, /* CYRILLIC SMALL LETTER NJE */
00386 { XK_Serbian_tshe,                0x045b }, /* CYRILLIC SMALL LETTER TSHE */
00387 { XK_Macedonia_kje,               0x045c }, /* CYRILLIC SMALL LETTER KJE */
00388 #if defined(XK_Ukrainian_ghe_with_upturn)
00389 { XK_Ukrainian_ghe_with_upturn,   0x0491 }, /* CYRILLIC SMALL LETTER GHE WITH UPTURN */
00390 #endif
00391 { XK_Byelorussian_shortu,         0x045e }, /* CYRILLIC SMALL LETTER SHORT U */
00392 { XK_Cyrillic_dzhe,               0x045f }, /* CYRILLIC SMALL LETTER DZHE */
00393 { XK_numerosign,                  0x2116 }, /* NUMERO SIGN */
00394 { XK_Serbian_DJE,                 0x0402 }, /* CYRILLIC CAPITAL LETTER DJE */
00395 { XK_Macedonia_GJE,               0x0403 }, /* CYRILLIC CAPITAL LETTER GJE */
00396 { XK_Cyrillic_IO,                 0x0401 }, /* CYRILLIC CAPITAL LETTER IO */
00397 { XK_Ukrainian_IE,                0x0404 }, /* CYRILLIC CAPITAL LETTER UKRAINIAN IE */
00398 { XK_Macedonia_DSE,               0x0405 }, /* CYRILLIC CAPITAL LETTER DZE */
00399 { XK_Ukrainian_I,                 0x0406 }, /* CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
00400 { XK_Ukrainian_YI,                0x0407 }, /* CYRILLIC CAPITAL LETTER YI */
00401 { XK_Cyrillic_JE,                 0x0408 }, /* CYRILLIC CAPITAL LETTER JE */
00402 { XK_Cyrillic_LJE,                0x0409 }, /* CYRILLIC CAPITAL LETTER LJE */
00403 { XK_Cyrillic_NJE,                0x040a }, /* CYRILLIC CAPITAL LETTER NJE */
00404 { XK_Serbian_TSHE,                0x040b }, /* CYRILLIC CAPITAL LETTER TSHE */
00405 { XK_Macedonia_KJE,               0x040c }, /* CYRILLIC CAPITAL LETTER KJE */
00406 #if defined(XK_Ukrainian_GHE_WITH_UPTURN)
00407 { XK_Ukrainian_GHE_WITH_UPTURN,   0x0490 }, /* CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
00408 #endif
00409 { XK_Byelorussian_SHORTU,         0x040e }, /* CYRILLIC CAPITAL LETTER SHORT U */
00410 { XK_Cyrillic_DZHE,               0x040f }, /* CYRILLIC CAPITAL LETTER DZHE */
00411 { XK_Cyrillic_yu,                 0x044e }, /* CYRILLIC SMALL LETTER YU */
00412 { XK_Cyrillic_a,                  0x0430 }, /* CYRILLIC SMALL LETTER A */
00413 { XK_Cyrillic_be,                 0x0431 }, /* CYRILLIC SMALL LETTER BE */
00414 { XK_Cyrillic_tse,                0x0446 }, /* CYRILLIC SMALL LETTER TSE */
00415 { XK_Cyrillic_de,                 0x0434 }, /* CYRILLIC SMALL LETTER DE */
00416 { XK_Cyrillic_ie,                 0x0435 }, /* CYRILLIC SMALL LETTER IE */
00417 { XK_Cyrillic_ef,                 0x0444 }, /* CYRILLIC SMALL LETTER EF */
00418 { XK_Cyrillic_ghe,                0x0433 }, /* CYRILLIC SMALL LETTER GHE */
00419 { XK_Cyrillic_ha,                 0x0445 }, /* CYRILLIC SMALL LETTER HA */
00420 { XK_Cyrillic_i,                  0x0438 }, /* CYRILLIC SMALL LETTER I */
00421 { XK_Cyrillic_shorti,             0x0439 }, /* CYRILLIC SMALL LETTER SHORT I */
00422 { XK_Cyrillic_ka,                 0x043a }, /* CYRILLIC SMALL LETTER KA */
00423 { XK_Cyrillic_el,                 0x043b }, /* CYRILLIC SMALL LETTER EL */
00424 { XK_Cyrillic_em,                 0x043c }, /* CYRILLIC SMALL LETTER EM */
00425 { XK_Cyrillic_en,                 0x043d }, /* CYRILLIC SMALL LETTER EN */
00426 { XK_Cyrillic_o,                  0x043e }, /* CYRILLIC SMALL LETTER O */
00427 { XK_Cyrillic_pe,                 0x043f }, /* CYRILLIC SMALL LETTER PE */
00428 { XK_Cyrillic_ya,                 0x044f }, /* CYRILLIC SMALL LETTER YA */
00429 { XK_Cyrillic_er,                 0x0440 }, /* CYRILLIC SMALL LETTER ER */
00430 { XK_Cyrillic_es,                 0x0441 }, /* CYRILLIC SMALL LETTER ES */
00431 { XK_Cyrillic_te,                 0x0442 }, /* CYRILLIC SMALL LETTER TE */
00432 { XK_Cyrillic_u,                  0x0443 }, /* CYRILLIC SMALL LETTER U */
00433 { XK_Cyrillic_zhe,                0x0436 }, /* CYRILLIC SMALL LETTER ZHE */
00434 { XK_Cyrillic_ve,                 0x0432 }, /* CYRILLIC SMALL LETTER VE */
00435 { XK_Cyrillic_softsign,           0x044c }, /* CYRILLIC SMALL LETTER SOFT SIGN */
00436 { XK_Cyrillic_yeru,               0x044b }, /* CYRILLIC SMALL LETTER YERU */
00437 { XK_Cyrillic_ze,                 0x0437 }, /* CYRILLIC SMALL LETTER ZE */
00438 { XK_Cyrillic_sha,                0x0448 }, /* CYRILLIC SMALL LETTER SHA */
00439 { XK_Cyrillic_e,                  0x044d }, /* CYRILLIC SMALL LETTER E */
00440 { XK_Cyrillic_shcha,              0x0449 }, /* CYRILLIC SMALL LETTER SHCHA */
00441 { XK_Cyrillic_che,                0x0447 }, /* CYRILLIC SMALL LETTER CHE */
00442 { XK_Cyrillic_hardsign,           0x044a }, /* CYRILLIC SMALL LETTER HARD SIGN */
00443 { XK_Cyrillic_YU,                 0x042e }, /* CYRILLIC CAPITAL LETTER YU */
00444 { XK_Cyrillic_A,                  0x0410 }, /* CYRILLIC CAPITAL LETTER A */
00445 { XK_Cyrillic_BE,                 0x0411 }, /* CYRILLIC CAPITAL LETTER BE */
00446 { XK_Cyrillic_TSE,                0x0426 }, /* CYRILLIC CAPITAL LETTER TSE */
00447 { XK_Cyrillic_DE,                 0x0414 }, /* CYRILLIC CAPITAL LETTER DE */
00448 { XK_Cyrillic_IE,                 0x0415 }, /* CYRILLIC CAPITAL LETTER IE */
00449 { XK_Cyrillic_EF,                 0x0424 }, /* CYRILLIC CAPITAL LETTER EF */
00450 { XK_Cyrillic_GHE,                0x0413 }, /* CYRILLIC CAPITAL LETTER GHE */
00451 { XK_Cyrillic_HA,                 0x0425 }, /* CYRILLIC CAPITAL LETTER HA */
00452 { XK_Cyrillic_I,                  0x0418 }, /* CYRILLIC CAPITAL LETTER I */
00453 { XK_Cyrillic_SHORTI,             0x0419 }, /* CYRILLIC CAPITAL LETTER SHORT I */
00454 { XK_Cyrillic_KA,                 0x041a }, /* CYRILLIC CAPITAL LETTER KA */
00455 { XK_Cyrillic_EL,                 0x041b }, /* CYRILLIC CAPITAL LETTER EL */
00456 { XK_Cyrillic_EM,                 0x041c }, /* CYRILLIC CAPITAL LETTER EM */
00457 { XK_Cyrillic_EN,                 0x041d }, /* CYRILLIC CAPITAL LETTER EN */
00458 { XK_Cyrillic_O,                  0x041e }, /* CYRILLIC CAPITAL LETTER O */
00459 { XK_Cyrillic_PE,                 0x041f }, /* CYRILLIC CAPITAL LETTER PE */
00460 { XK_Cyrillic_YA,                 0x042f }, /* CYRILLIC CAPITAL LETTER YA */
00461 { XK_Cyrillic_ER,                 0x0420 }, /* CYRILLIC CAPITAL LETTER ER */
00462 { XK_Cyrillic_ES,                 0x0421 }, /* CYRILLIC CAPITAL LETTER ES */
00463 { XK_Cyrillic_TE,                 0x0422 }, /* CYRILLIC CAPITAL LETTER TE */
00464 { XK_Cyrillic_U,                  0x0423 }, /* CYRILLIC CAPITAL LETTER U */
00465 { XK_Cyrillic_ZHE,                0x0416 }, /* CYRILLIC CAPITAL LETTER ZHE */
00466 { XK_Cyrillic_VE,                 0x0412 }, /* CYRILLIC CAPITAL LETTER VE */
00467 { XK_Cyrillic_SOFTSIGN,           0x042c }, /* CYRILLIC CAPITAL LETTER SOFT SIGN */
00468 { XK_Cyrillic_YERU,               0x042b }, /* CYRILLIC CAPITAL LETTER YERU */
00469 { XK_Cyrillic_ZE,                 0x0417 }, /* CYRILLIC CAPITAL LETTER ZE */
00470 { XK_Cyrillic_SHA,                0x0428 }, /* CYRILLIC CAPITAL LETTER SHA */
00471 { XK_Cyrillic_E,                  0x042d }, /* CYRILLIC CAPITAL LETTER E */
00472 { XK_Cyrillic_SHCHA,              0x0429 }, /* CYRILLIC CAPITAL LETTER SHCHA */
00473 { XK_Cyrillic_CHE,                0x0427 }, /* CYRILLIC CAPITAL LETTER CHE */
00474 { XK_Cyrillic_HARDSIGN,           0x042a }, /* CYRILLIC CAPITAL LETTER HARD SIGN */
00475 #endif // defined(XK_Serbian_dje)
00476 #if defined(XK_Greek_ALPHAaccent)
00477 { XK_Greek_ALPHAaccent,           0x0386 }, /* GREEK CAPITAL LETTER ALPHA WITH TONOS */
00478 { XK_Greek_EPSILONaccent,         0x0388 }, /* GREEK CAPITAL LETTER EPSILON WITH TONOS */
00479 { XK_Greek_ETAaccent,             0x0389 }, /* GREEK CAPITAL LETTER ETA WITH TONOS */
00480 { XK_Greek_IOTAaccent,            0x038a }, /* GREEK CAPITAL LETTER IOTA WITH TONOS */
00481 { XK_Greek_IOTAdiaeresis,         0x03aa }, /* GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
00482 { XK_Greek_OMICRONaccent,         0x038c }, /* GREEK CAPITAL LETTER OMICRON WITH TONOS */
00483 { XK_Greek_UPSILONaccent,         0x038e }, /* GREEK CAPITAL LETTER UPSILON WITH TONOS */
00484 { XK_Greek_UPSILONdieresis,       0x03ab }, /* GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
00485 { XK_Greek_OMEGAaccent,           0x038f }, /* GREEK CAPITAL LETTER OMEGA WITH TONOS */
00486 { XK_Greek_accentdieresis,        0x0385 }, /* GREEK DIALYTIKA TONOS */
00487 { XK_Greek_horizbar,              0x2015 }, /* HORIZONTAL BAR */
00488 { XK_Greek_alphaaccent,           0x03ac }, /* GREEK SMALL LETTER ALPHA WITH TONOS */
00489 { XK_Greek_epsilonaccent,         0x03ad }, /* GREEK SMALL LETTER EPSILON WITH TONOS */
00490 { XK_Greek_etaaccent,             0x03ae }, /* GREEK SMALL LETTER ETA WITH TONOS */
00491 { XK_Greek_iotaaccent,            0x03af }, /* GREEK SMALL LETTER IOTA WITH TONOS */
00492 { XK_Greek_iotadieresis,          0x03ca }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA */
00493 { XK_Greek_iotaaccentdieresis,    0x0390 }, /* GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
00494 { XK_Greek_omicronaccent,         0x03cc }, /* GREEK SMALL LETTER OMICRON WITH TONOS */
00495 { XK_Greek_upsilonaccent,         0x03cd }, /* GREEK SMALL LETTER UPSILON WITH TONOS */
00496 { XK_Greek_upsilondieresis,       0x03cb }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
00497 { XK_Greek_upsilonaccentdieresis, 0x03b0 }, /* GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
00498 { XK_Greek_omegaaccent,           0x03ce }, /* GREEK SMALL LETTER OMEGA WITH TONOS */
00499 { XK_Greek_ALPHA,                 0x0391 }, /* GREEK CAPITAL LETTER ALPHA */
00500 { XK_Greek_BETA,                  0x0392 }, /* GREEK CAPITAL LETTER BETA */
00501 { XK_Greek_GAMMA,                 0x0393 }, /* GREEK CAPITAL LETTER GAMMA */
00502 { XK_Greek_DELTA,                 0x0394 }, /* GREEK CAPITAL LETTER DELTA */
00503 { XK_Greek_EPSILON,               0x0395 }, /* GREEK CAPITAL LETTER EPSILON */
00504 { XK_Greek_ZETA,                  0x0396 }, /* GREEK CAPITAL LETTER ZETA */
00505 { XK_Greek_ETA,                   0x0397 }, /* GREEK CAPITAL LETTER ETA */
00506 { XK_Greek_THETA,                 0x0398 }, /* GREEK CAPITAL LETTER THETA */
00507 { XK_Greek_IOTA,                  0x0399 }, /* GREEK CAPITAL LETTER IOTA */
00508 { XK_Greek_KAPPA,                 0x039a }, /* GREEK CAPITAL LETTER KAPPA */
00509 { XK_Greek_LAMBDA,                0x039b }, /* GREEK CAPITAL LETTER LAMDA */
00510 { XK_Greek_MU,                    0x039c }, /* GREEK CAPITAL LETTER MU */
00511 { XK_Greek_NU,                    0x039d }, /* GREEK CAPITAL LETTER NU */
00512 { XK_Greek_XI,                    0x039e }, /* GREEK CAPITAL LETTER XI */
00513 { XK_Greek_OMICRON,               0x039f }, /* GREEK CAPITAL LETTER OMICRON */
00514 { XK_Greek_PI,                    0x03a0 }, /* GREEK CAPITAL LETTER PI */
00515 { XK_Greek_RHO,                   0x03a1 }, /* GREEK CAPITAL LETTER RHO */
00516 { XK_Greek_SIGMA,                 0x03a3 }, /* GREEK CAPITAL LETTER SIGMA */
00517 { XK_Greek_TAU,                   0x03a4 }, /* GREEK CAPITAL LETTER TAU */
00518 { XK_Greek_UPSILON,               0x03a5 }, /* GREEK CAPITAL LETTER UPSILON */
00519 { XK_Greek_PHI,                   0x03a6 }, /* GREEK CAPITAL LETTER PHI */
00520 { XK_Greek_CHI,                   0x03a7 }, /* GREEK CAPITAL LETTER CHI */
00521 { XK_Greek_PSI,                   0x03a8 }, /* GREEK CAPITAL LETTER PSI */
00522 { XK_Greek_OMEGA,                 0x03a9 }, /* GREEK CAPITAL LETTER OMEGA */
00523 { XK_Greek_alpha,                 0x03b1 }, /* GREEK SMALL LETTER ALPHA */
00524 { XK_Greek_beta,                  0x03b2 }, /* GREEK SMALL LETTER BETA */
00525 { XK_Greek_gamma,                 0x03b3 }, /* GREEK SMALL LETTER GAMMA */
00526 { XK_Greek_delta,                 0x03b4 }, /* GREEK SMALL LETTER DELTA */
00527 { XK_Greek_epsilon,               0x03b5 }, /* GREEK SMALL LETTER EPSILON */
00528 { XK_Greek_zeta,                  0x03b6 }, /* GREEK SMALL LETTER ZETA */
00529 { XK_Greek_eta,                   0x03b7 }, /* GREEK SMALL LETTER ETA */
00530 { XK_Greek_theta,                 0x03b8 }, /* GREEK SMALL LETTER THETA */
00531 { XK_Greek_iota,                  0x03b9 }, /* GREEK SMALL LETTER IOTA */
00532 { XK_Greek_kappa,                 0x03ba }, /* GREEK SMALL LETTER KAPPA */
00533 { XK_Greek_lambda,                0x03bb }, /* GREEK SMALL LETTER LAMDA */
00534 { XK_Greek_mu,                    0x03bc }, /* GREEK SMALL LETTER MU */
00535 { XK_Greek_nu,                    0x03bd }, /* GREEK SMALL LETTER NU */
00536 { XK_Greek_xi,                    0x03be }, /* GREEK SMALL LETTER XI */
00537 { XK_Greek_omicron,               0x03bf }, /* GREEK SMALL LETTER OMICRON */
00538 { XK_Greek_pi,                    0x03c0 }, /* GREEK SMALL LETTER PI */
00539 { XK_Greek_rho,                   0x03c1 }, /* GREEK SMALL LETTER RHO */
00540 { XK_Greek_sigma,                 0x03c3 }, /* GREEK SMALL LETTER SIGMA */
00541 { XK_Greek_finalsmallsigma,       0x03c2 }, /* GREEK SMALL LETTER FINAL SIGMA */
00542 { XK_Greek_tau,                   0x03c4 }, /* GREEK SMALL LETTER TAU */
00543 { XK_Greek_upsilon,               0x03c5 }, /* GREEK SMALL LETTER UPSILON */
00544 { XK_Greek_phi,                   0x03c6 }, /* GREEK SMALL LETTER PHI */
00545 { XK_Greek_chi,                   0x03c7 }, /* GREEK SMALL LETTER CHI */
00546 { XK_Greek_psi,                   0x03c8 }, /* GREEK SMALL LETTER PSI */
00547 { XK_Greek_omega,                 0x03c9 }, /* GREEK SMALL LETTER OMEGA */
00548 #endif // defined(XK_Greek_ALPHAaccent)
00549 { XK_leftradical,                 0x23b7 }, /* ??? */
00550 { XK_topleftradical,              0x250c }, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
00551 { XK_horizconnector,              0x2500 }, /* BOX DRAWINGS LIGHT HORIZONTAL */
00552 { XK_topintegral,                 0x2320 }, /* TOP HALF INTEGRAL */
00553 { XK_botintegral,                 0x2321 }, /* BOTTOM HALF INTEGRAL */
00554 { XK_vertconnector,               0x2502 }, /* BOX DRAWINGS LIGHT VERTICAL */
00555 { XK_topleftsqbracket,            0x23a1 }, /* ??? */
00556 { XK_botleftsqbracket,            0x23a3 }, /* ??? */
00557 { XK_toprightsqbracket,           0x23a4 }, /* ??? */
00558 { XK_botrightsqbracket,           0x23a6 }, /* ??? */
00559 { XK_topleftparens,               0x239b }, /* ??? */
00560 { XK_botleftparens,               0x239d }, /* ??? */
00561 { XK_toprightparens,              0x239e }, /* ??? */
00562 { XK_botrightparens,              0x23a0 }, /* ??? */
00563 { XK_leftmiddlecurlybrace,        0x23a8 }, /* ??? */
00564 { XK_rightmiddlecurlybrace,       0x23ac }, /* ??? */
00565 { XK_lessthanequal,               0x2264 }, /* LESS-THAN OR EQUAL TO */
00566 { XK_notequal,                    0x2260 }, /* NOT EQUAL TO */
00567 { XK_greaterthanequal,            0x2265 }, /* GREATER-THAN OR EQUAL TO */
00568 { XK_integral,                    0x222b }, /* INTEGRAL */
00569 { XK_therefore,                   0x2234 }, /* THEREFORE */
00570 { XK_variation,                   0x221d }, /* PROPORTIONAL TO */
00571 { XK_infinity,                    0x221e }, /* INFINITY */
00572 { XK_nabla,                       0x2207 }, /* NABLA */
00573 { XK_approximate,                 0x223c }, /* TILDE OPERATOR */
00574 { XK_similarequal,                0x2243 }, /* ASYMPTOTICALLY EQUAL TO */
00575 { XK_ifonlyif,                    0x21d4 }, /* LEFT RIGHT DOUBLE ARROW */
00576 { XK_implies,                     0x21d2 }, /* RIGHTWARDS DOUBLE ARROW */
00577 { XK_identical,                   0x2261 }, /* IDENTICAL TO */
00578 { XK_radical,                     0x221a }, /* SQUARE ROOT */
00579 { XK_includedin,                  0x2282 }, /* SUBSET OF */
00580 { XK_includes,                    0x2283 }, /* SUPERSET OF */
00581 { XK_intersection,                0x2229 }, /* INTERSECTION */
00582 { XK_union,                       0x222a }, /* UNION */
00583 { XK_logicaland,                  0x2227 }, /* LOGICAL AND */
00584 { XK_logicalor,                   0x2228 }, /* LOGICAL OR */
00585 { XK_partialderivative,           0x2202 }, /* PARTIAL DIFFERENTIAL */
00586 { XK_function,                    0x0192 }, /* LATIN SMALL LETTER F WITH HOOK */
00587 { XK_leftarrow,                   0x2190 }, /* LEFTWARDS ARROW */
00588 { XK_uparrow,                     0x2191 }, /* UPWARDS ARROW */
00589 { XK_rightarrow,                  0x2192 }, /* RIGHTWARDS ARROW */
00590 { XK_downarrow,                   0x2193 }, /* DOWNWARDS ARROW */
00591 /*{ XK_blank,                        ??? }, */
00592 { XK_soliddiamond,                0x25c6 }, /* BLACK DIAMOND */
00593 { XK_checkerboard,                0x2592 }, /* MEDIUM SHADE */
00594 { XK_ht,                          0x2409 }, /* SYMBOL FOR HORIZONTAL TABULATION */
00595 { XK_ff,                          0x240c }, /* SYMBOL FOR FORM FEED */
00596 { XK_cr,                          0x240d }, /* SYMBOL FOR CARRIAGE RETURN */
00597 { XK_lf,                          0x240a }, /* SYMBOL FOR LINE FEED */
00598 { XK_nl,                          0x2424 }, /* SYMBOL FOR NEWLINE */
00599 { XK_vt,                          0x240b }, /* SYMBOL FOR VERTICAL TABULATION */
00600 { XK_lowrightcorner,              0x2518 }, /* BOX DRAWINGS LIGHT UP AND LEFT */
00601 { XK_uprightcorner,               0x2510 }, /* BOX DRAWINGS LIGHT DOWN AND LEFT */
00602 { XK_upleftcorner,                0x250c }, /* BOX DRAWINGS LIGHT DOWN AND RIGHT */
00603 { XK_lowleftcorner,               0x2514 }, /* BOX DRAWINGS LIGHT UP AND RIGHT */
00604 { XK_crossinglines,               0x253c }, /* BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
00605 { XK_horizlinescan1,              0x23ba }, /* HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */
00606 { XK_horizlinescan3,              0x23bb }, /* HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */
00607 { XK_horizlinescan5,              0x2500 }, /* BOX DRAWINGS LIGHT HORIZONTAL */
00608 { XK_horizlinescan7,              0x23bc }, /* HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */
00609 { XK_horizlinescan9,              0x23bd }, /* HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */
00610 { XK_leftt,                       0x251c }, /* BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
00611 { XK_rightt,                      0x2524 }, /* BOX DRAWINGS LIGHT VERTICAL AND LEFT */
00612 { XK_bott,                        0x2534 }, /* BOX DRAWINGS LIGHT UP AND HORIZONTAL */
00613 { XK_topt,                        0x252c }, /* BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
00614 { XK_vertbar,                     0x2502 }, /* BOX DRAWINGS LIGHT VERTICAL */
00615 { XK_emspace,                     0x2003 }, /* EM SPACE */
00616 { XK_enspace,                     0x2002 }, /* EN SPACE */
00617 { XK_em3space,                    0x2004 }, /* THREE-PER-EM SPACE */
00618 { XK_em4space,                    0x2005 }, /* FOUR-PER-EM SPACE */
00619 { XK_digitspace,                  0x2007 }, /* FIGURE SPACE */
00620 { XK_punctspace,                  0x2008 }, /* PUNCTUATION SPACE */
00621 { XK_thinspace,                   0x2009 }, /* THIN SPACE */
00622 { XK_hairspace,                   0x200a }, /* HAIR SPACE */
00623 { XK_emdash,                      0x2014 }, /* EM DASH */
00624 { XK_endash,                      0x2013 }, /* EN DASH */
00625 /*{ XK_signifblank,                  ??? }, */
00626 { XK_ellipsis,                    0x2026 }, /* HORIZONTAL ELLIPSIS */
00627 { XK_doubbaselinedot,             0x2025 }, /* TWO DOT LEADER */
00628 { XK_onethird,                    0x2153 }, /* VULGAR FRACTION ONE THIRD */
00629 { XK_twothirds,                   0x2154 }, /* VULGAR FRACTION TWO THIRDS */
00630 { XK_onefifth,                    0x2155 }, /* VULGAR FRACTION ONE FIFTH */
00631 { XK_twofifths,                   0x2156 }, /* VULGAR FRACTION TWO FIFTHS */
00632 { XK_threefifths,                 0x2157 }, /* VULGAR FRACTION THREE FIFTHS */
00633 { XK_fourfifths,                  0x2158 }, /* VULGAR FRACTION FOUR FIFTHS */
00634 { XK_onesixth,                    0x2159 }, /* VULGAR FRACTION ONE SIXTH */
00635 { XK_fivesixths,                  0x215a }, /* VULGAR FRACTION FIVE SIXTHS */
00636 { XK_careof,                      0x2105 }, /* CARE OF */
00637 { XK_figdash,                     0x2012 }, /* FIGURE DASH */
00638 { XK_leftanglebracket,            0x2329 }, /* LEFT-POINTING ANGLE BRACKET */
00639 /*{ XK_decimalpoint,                 ??? }, */
00640 { XK_rightanglebracket,           0x232a }, /* RIGHT-POINTING ANGLE BRACKET */
00641 /*{ XK_marker,                       ??? }, */
00642 { XK_oneeighth,                   0x215b }, /* VULGAR FRACTION ONE EIGHTH */
00643 { XK_threeeighths,                0x215c }, /* VULGAR FRACTION THREE EIGHTHS */
00644 { XK_fiveeighths,                 0x215d }, /* VULGAR FRACTION FIVE EIGHTHS */
00645 { XK_seveneighths,                0x215e }, /* VULGAR FRACTION SEVEN EIGHTHS */
00646 { XK_trademark,                   0x2122 }, /* TRADE MARK SIGN */
00647 { XK_signaturemark,               0x2613 }, /* SALTIRE */
00648 /*{ XK_trademarkincircle,            ??? }, */
00649 { XK_leftopentriangle,            0x25c1 }, /* WHITE LEFT-POINTING TRIANGLE */
00650 { XK_rightopentriangle,           0x25b7 }, /* WHITE RIGHT-POINTING TRIANGLE */
00651 { XK_emopencircle,                0x25cb }, /* WHITE CIRCLE */
00652 { XK_emopenrectangle,             0x25af }, /* WHITE VERTICAL RECTANGLE */
00653 { XK_leftsinglequotemark,         0x2018 }, /* LEFT SINGLE QUOTATION MARK */
00654 { XK_rightsinglequotemark,        0x2019 }, /* RIGHT SINGLE QUOTATION MARK */
00655 { XK_leftdoublequotemark,         0x201c }, /* LEFT DOUBLE QUOTATION MARK */
00656 { XK_rightdoublequotemark,        0x201d }, /* RIGHT DOUBLE QUOTATION MARK */
00657 { XK_prescription,                0x211e }, /* PRESCRIPTION TAKE */
00658 { XK_minutes,                     0x2032 }, /* PRIME */
00659 { XK_seconds,                     0x2033 }, /* DOUBLE PRIME */
00660 { XK_latincross,                  0x271d }, /* LATIN CROSS */
00661 /*{ XK_hexagram,                     ??? }, */
00662 { XK_filledrectbullet,            0x25ac }, /* BLACK RECTANGLE */
00663 { XK_filledlefttribullet,         0x25c0 }, /* BLACK LEFT-POINTING TRIANGLE */
00664 { XK_filledrighttribullet,        0x25b6 }, /* BLACK RIGHT-POINTING TRIANGLE */
00665 { XK_emfilledcircle,              0x25cf }, /* BLACK CIRCLE */
00666 { XK_emfilledrect,                0x25ae }, /* BLACK VERTICAL RECTANGLE */
00667 { XK_enopencircbullet,            0x25e6 }, /* WHITE BULLET */
00668 { XK_enopensquarebullet,          0x25ab }, /* WHITE SMALL SQUARE */
00669 { XK_openrectbullet,              0x25ad }, /* WHITE RECTANGLE */
00670 { XK_opentribulletup,             0x25b3 }, /* WHITE UP-POINTING TRIANGLE */
00671 { XK_opentribulletdown,           0x25bd }, /* WHITE DOWN-POINTING TRIANGLE */
00672 { XK_openstar,                    0x2606 }, /* WHITE STAR */
00673 { XK_enfilledcircbullet,          0x2022 }, /* BULLET */
00674 { XK_enfilledsqbullet,            0x25aa }, /* BLACK SMALL SQUARE */
00675 { XK_filledtribulletup,           0x25b2 }, /* BLACK UP-POINTING TRIANGLE */
00676 { XK_filledtribulletdown,         0x25bc }, /* BLACK DOWN-POINTING TRIANGLE */
00677 { XK_leftpointer,                 0x261c }, /* WHITE LEFT POINTING INDEX */
00678 { XK_rightpointer,                0x261e }, /* WHITE RIGHT POINTING INDEX */
00679 { XK_club,                        0x2663 }, /* BLACK CLUB SUIT */
00680 { XK_diamond,                     0x2666 }, /* BLACK DIAMOND SUIT */
00681 { XK_heart,                       0x2665 }, /* BLACK HEART SUIT */
00682 { XK_maltesecross,                0x2720 }, /* MALTESE CROSS */
00683 { XK_dagger,                      0x2020 }, /* DAGGER */
00684 { XK_doubledagger,                0x2021 }, /* DOUBLE DAGGER */
00685 { XK_checkmark,                   0x2713 }, /* CHECK MARK */
00686 { XK_ballotcross,                 0x2717 }, /* BALLOT X */
00687 { XK_musicalsharp,                0x266f }, /* MUSIC SHARP SIGN */
00688 { XK_musicalflat,                 0x266d }, /* MUSIC FLAT SIGN */
00689 { XK_malesymbol,                  0x2642 }, /* MALE SIGN */
00690 { XK_femalesymbol,                0x2640 }, /* FEMALE SIGN */
00691 { XK_telephone,                   0x260e }, /* BLACK TELEPHONE */
00692 { XK_telephonerecorder,           0x2315 }, /* TELEPHONE RECORDER */
00693 { XK_phonographcopyright,         0x2117 }, /* SOUND RECORDING COPYRIGHT */
00694 { XK_caret,                       0x2038 }, /* CARET */
00695 { XK_singlelowquotemark,          0x201a }, /* SINGLE LOW-9 QUOTATION MARK */
00696 { XK_doublelowquotemark,          0x201e }, /* DOUBLE LOW-9 QUOTATION MARK */
00697 /*{ XK_cursor,                       ??? }, */
00698 { XK_leftcaret,                   0x003c }, /* LESS-THAN SIGN */
00699 { XK_rightcaret,                  0x003e }, /* GREATER-THAN SIGN */
00700 { XK_downcaret,                   0x2228 }, /* LOGICAL OR */
00701 { XK_upcaret,                     0x2227 }, /* LOGICAL AND */
00702 { XK_overbar,                     0x00af }, /* MACRON */
00703 { XK_downtack,                    0x22a5 }, /* UP TACK */
00704 { XK_upshoe,                      0x2229 }, /* INTERSECTION */
00705 { XK_downstile,                   0x230a }, /* LEFT FLOOR */
00706 { XK_underbar,                    0x005f }, /* LOW LINE */
00707 { XK_jot,                         0x2218 }, /* RING OPERATOR */
00708 { XK_quad,                        0x2395 }, /* APL FUNCTIONAL SYMBOL QUAD */
00709 { XK_uptack,                      0x22a4 }, /* DOWN TACK */
00710 { XK_circle,                      0x25cb }, /* WHITE CIRCLE */
00711 { XK_upstile,                     0x2308 }, /* LEFT CEILING */
00712 { XK_downshoe,                    0x222a }, /* UNION */
00713 { XK_rightshoe,                   0x2283 }, /* SUPERSET OF */
00714 { XK_leftshoe,                    0x2282 }, /* SUBSET OF */
00715 { XK_lefttack,                    0x22a2 }, /* RIGHT TACK */
00716 { XK_righttack,                   0x22a3 }, /* LEFT TACK */
00717 #if defined(XK_hebrew_doublelowline)
00718 { XK_hebrew_doublelowline,        0x2017 }, /* DOUBLE LOW LINE */
00719 { XK_hebrew_aleph,                0x05d0 }, /* HEBREW LETTER ALEF */
00720 { XK_hebrew_bet,                  0x05d1 }, /* HEBREW LETTER BET */
00721 { XK_hebrew_gimel,                0x05d2 }, /* HEBREW LETTER GIMEL */
00722 { XK_hebrew_dalet,                0x05d3 }, /* HEBREW LETTER DALET */
00723 { XK_hebrew_he,                   0x05d4 }, /* HEBREW LETTER HE */
00724 { XK_hebrew_waw,                  0x05d5 }, /* HEBREW LETTER VAV */
00725 { XK_hebrew_zain,                 0x05d6 }, /* HEBREW LETTER ZAYIN */
00726 { XK_hebrew_chet,                 0x05d7 }, /* HEBREW LETTER HET */
00727 { XK_hebrew_tet,                  0x05d8 }, /* HEBREW LETTER TET */
00728 { XK_hebrew_yod,                  0x05d9 }, /* HEBREW LETTER YOD */
00729 { XK_hebrew_finalkaph,            0x05da }, /* HEBREW LETTER FINAL KAF */
00730 { XK_hebrew_kaph,                 0x05db }, /* HEBREW LETTER KAF */
00731 { XK_hebrew_lamed,                0x05dc }, /* HEBREW LETTER LAMED */
00732 { XK_hebrew_finalmem,             0x05dd }, /* HEBREW LETTER FINAL MEM */
00733 { XK_hebrew_mem,                  0x05de }, /* HEBREW LETTER MEM */
00734 { XK_hebrew_finalnun,             0x05df }, /* HEBREW LETTER FINAL NUN */
00735 { XK_hebrew_nun,                  0x05e0 }, /* HEBREW LETTER NUN */
00736 { XK_hebrew_samech,               0x05e1 }, /* HEBREW LETTER SAMEKH */
00737 { XK_hebrew_ayin,                 0x05e2 }, /* HEBREW LETTER AYIN */
00738 { XK_hebrew_finalpe,              0x05e3 }, /* HEBREW LETTER FINAL PE */
00739 { XK_hebrew_pe,                   0x05e4 }, /* HEBREW LETTER PE */
00740 { XK_hebrew_finalzade,            0x05e5 }, /* HEBREW LETTER FINAL TSADI */
00741 { XK_hebrew_zade,                 0x05e6 }, /* HEBREW LETTER TSADI */
00742 { XK_hebrew_qoph,                 0x05e7 }, /* HEBREW LETTER QOF */
00743 { XK_hebrew_resh,                 0x05e8 }, /* HEBREW LETTER RESH */
00744 { XK_hebrew_shin,                 0x05e9 }, /* HEBREW LETTER SHIN */
00745 { XK_hebrew_taw,                  0x05ea }, /* HEBREW LETTER TAV */
00746 #endif // defined(XK_hebrew_doublelowline)
00747 #if defined(XK_Thai_kokai)
00748 { XK_Thai_kokai,                  0x0e01 }, /* THAI CHARACTER KO KAI */
00749 { XK_Thai_khokhai,                0x0e02 }, /* THAI CHARACTER KHO KHAI */
00750 { XK_Thai_khokhuat,               0x0e03 }, /* THAI CHARACTER KHO KHUAT */
00751 { XK_Thai_khokhwai,               0x0e04 }, /* THAI CHARACTER KHO KHWAI */
00752 { XK_Thai_khokhon,                0x0e05 }, /* THAI CHARACTER KHO KHON */
00753 { XK_Thai_khorakhang,             0x0e06 }, /* THAI CHARACTER KHO RAKHANG */
00754 { XK_Thai_ngongu,                 0x0e07 }, /* THAI CHARACTER NGO NGU */
00755 { XK_Thai_chochan,                0x0e08 }, /* THAI CHARACTER CHO CHAN */
00756 { XK_Thai_choching,               0x0e09 }, /* THAI CHARACTER CHO CHING */
00757 { XK_Thai_chochang,               0x0e0a }, /* THAI CHARACTER CHO CHANG */
00758 { XK_Thai_soso,                   0x0e0b }, /* THAI CHARACTER SO SO */
00759 { XK_Thai_chochoe,                0x0e0c }, /* THAI CHARACTER CHO CHOE */
00760 { XK_Thai_yoying,                 0x0e0d }, /* THAI CHARACTER YO YING */
00761 { XK_Thai_dochada,                0x0e0e }, /* THAI CHARACTER DO CHADA */
00762 { XK_Thai_topatak,                0x0e0f }, /* THAI CHARACTER TO PATAK */
00763 { XK_Thai_thothan,                0x0e10 }, /* THAI CHARACTER THO THAN */
00764 { XK_Thai_thonangmontho,          0x0e11 }, /* THAI CHARACTER THO NANGMONTHO */
00765 { XK_Thai_thophuthao,             0x0e12 }, /* THAI CHARACTER THO PHUTHAO */
00766 { XK_Thai_nonen,                  0x0e13 }, /* THAI CHARACTER NO NEN */
00767 { XK_Thai_dodek,                  0x0e14 }, /* THAI CHARACTER DO DEK */
00768 { XK_Thai_totao,                  0x0e15 }, /* THAI CHARACTER TO TAO */
00769 { XK_Thai_thothung,               0x0e16 }, /* THAI CHARACTER THO THUNG */
00770 { XK_Thai_thothahan,              0x0e17 }, /* THAI CHARACTER THO THAHAN */
00771 { XK_Thai_thothong,               0x0e18 }, /* THAI CHARACTER THO THONG */
00772 { XK_Thai_nonu,                   0x0e19 }, /* THAI CHARACTER NO NU */
00773 { XK_Thai_bobaimai,               0x0e1a }, /* THAI CHARACTER BO BAIMAI */
00774 { XK_Thai_popla,                  0x0e1b }, /* THAI CHARACTER PO PLA */
00775 { XK_Thai_phophung,               0x0e1c }, /* THAI CHARACTER PHO PHUNG */
00776 { XK_Thai_fofa,                   0x0e1d }, /* THAI CHARACTER FO FA */
00777 { XK_Thai_phophan,                0x0e1e }, /* THAI CHARACTER PHO PHAN */
00778 { XK_Thai_fofan,                  0x0e1f }, /* THAI CHARACTER FO FAN */
00779 { XK_Thai_phosamphao,             0x0e20 }, /* THAI CHARACTER PHO SAMPHAO */
00780 { XK_Thai_moma,                   0x0e21 }, /* THAI CHARACTER MO MA */
00781 { XK_Thai_yoyak,                  0x0e22 }, /* THAI CHARACTER YO YAK */
00782 { XK_Thai_rorua,                  0x0e23 }, /* THAI CHARACTER RO RUA */
00783 { XK_Thai_ru,                     0x0e24 }, /* THAI CHARACTER RU */
00784 { XK_Thai_loling,                 0x0e25 }, /* THAI CHARACTER LO LING */
00785 { XK_Thai_lu,                     0x0e26 }, /* THAI CHARACTER LU */
00786 { XK_Thai_wowaen,                 0x0e27 }, /* THAI CHARACTER WO WAEN */
00787 { XK_Thai_sosala,                 0x0e28 }, /* THAI CHARACTER SO SALA */
00788 { XK_Thai_sorusi,                 0x0e29 }, /* THAI CHARACTER SO RUSI */
00789 { XK_Thai_sosua,                  0x0e2a }, /* THAI CHARACTER SO SUA */
00790 { XK_Thai_hohip,                  0x0e2b }, /* THAI CHARACTER HO HIP */
00791 { XK_Thai_lochula,                0x0e2c }, /* THAI CHARACTER LO CHULA */
00792 { XK_Thai_oang,                   0x0e2d }, /* THAI CHARACTER O ANG */
00793 { XK_Thai_honokhuk,               0x0e2e }, /* THAI CHARACTER HO NOKHUK */
00794 { XK_Thai_paiyannoi,              0x0e2f }, /* THAI CHARACTER PAIYANNOI */
00795 { XK_Thai_saraa,                  0x0e30 }, /* THAI CHARACTER SARA A */
00796 { XK_Thai_maihanakat,             0x0e31 }, /* THAI CHARACTER MAI HAN-AKAT */
00797 { XK_Thai_saraaa,                 0x0e32 }, /* THAI CHARACTER SARA AA */
00798 { XK_Thai_saraam,                 0x0e33 }, /* THAI CHARACTER SARA AM */
00799 { XK_Thai_sarai,                  0x0e34 }, /* THAI CHARACTER SARA I */
00800 { XK_Thai_saraii,                 0x0e35 }, /* THAI CHARACTER SARA II */
00801 { XK_Thai_saraue,                 0x0e36 }, /* THAI CHARACTER SARA UE */
00802 { XK_Thai_sarauee,                0x0e37 }, /* THAI CHARACTER SARA UEE */
00803 { XK_Thai_sarau,                  0x0e38 }, /* THAI CHARACTER SARA U */
00804 { XK_Thai_sarauu,                 0x0e39 }, /* THAI CHARACTER SARA UU */
00805 { XK_Thai_phinthu,                0x0e3a }, /* THAI CHARACTER PHINTHU */
00806 /*{ XK_Thai_maihanakat_maitho,       ??? }, */
00807 { XK_Thai_baht,                   0x0e3f }, /* THAI CURRENCY SYMBOL BAHT */
00808 { XK_Thai_sarae,                  0x0e40 }, /* THAI CHARACTER SARA E */
00809 { XK_Thai_saraae,                 0x0e41 }, /* THAI CHARACTER SARA AE */
00810 { XK_Thai_sarao,                  0x0e42 }, /* THAI CHARACTER SARA O */
00811 { XK_Thai_saraaimaimuan,          0x0e43 }, /* THAI CHARACTER SARA AI MAIMUAN */
00812 { XK_Thai_saraaimaimalai,         0x0e44 }, /* THAI CHARACTER SARA AI MAIMALAI */
00813 { XK_Thai_lakkhangyao,            0x0e45 }, /* THAI CHARACTER LAKKHANGYAO */
00814 { XK_Thai_maiyamok,               0x0e46 }, /* THAI CHARACTER MAIYAMOK */
00815 { XK_Thai_maitaikhu,              0x0e47 }, /* THAI CHARACTER MAITAIKHU */
00816 { XK_Thai_maiek,                  0x0e48 }, /* THAI CHARACTER MAI EK */
00817 { XK_Thai_maitho,                 0x0e49 }, /* THAI CHARACTER MAI THO */
00818 { XK_Thai_maitri,                 0x0e4a }, /* THAI CHARACTER MAI TRI */
00819 { XK_Thai_maichattawa,            0x0e4b }, /* THAI CHARACTER MAI CHATTAWA */
00820 { XK_Thai_thanthakhat,            0x0e4c }, /* THAI CHARACTER THANTHAKHAT */
00821 { XK_Thai_nikhahit,               0x0e4d }, /* THAI CHARACTER NIKHAHIT */
00822 { XK_Thai_leksun,                 0x0e50 }, /* THAI DIGIT ZERO */
00823 { XK_Thai_leknung,                0x0e51 }, /* THAI DIGIT ONE */
00824 { XK_Thai_leksong,                0x0e52 }, /* THAI DIGIT TWO */
00825 { XK_Thai_leksam,                 0x0e53 }, /* THAI DIGIT THREE */
00826 { XK_Thai_leksi,                  0x0e54 }, /* THAI DIGIT FOUR */
00827 { XK_Thai_lekha,                  0x0e55 }, /* THAI DIGIT FIVE */
00828 { XK_Thai_lekhok,                 0x0e56 }, /* THAI DIGIT SIX */
00829 { XK_Thai_lekchet,                0x0e57 }, /* THAI DIGIT SEVEN */
00830 { XK_Thai_lekpaet,                0x0e58 }, /* THAI DIGIT EIGHT */
00831 { XK_Thai_lekkao,                 0x0e59 }, /* THAI DIGIT NINE */
00832 #endif // defined(XK_Thai_kokai)
00833 #if defined(XK_Hangul_Kiyeog)
00834 { XK_Hangul_Kiyeog,               0x3131 }, /* HANGUL LETTER KIYEOK */
00835 { XK_Hangul_SsangKiyeog,          0x3132 }, /* HANGUL LETTER SSANGKIYEOK */
00836 { XK_Hangul_KiyeogSios,           0x3133 }, /* HANGUL LETTER KIYEOK-SIOS */
00837 { XK_Hangul_Nieun,                0x3134 }, /* HANGUL LETTER NIEUN */
00838 { XK_Hangul_NieunJieuj,           0x3135 }, /* HANGUL LETTER NIEUN-CIEUC */
00839 { XK_Hangul_NieunHieuh,           0x3136 }, /* HANGUL LETTER NIEUN-HIEUH */
00840 { XK_Hangul_Dikeud,               0x3137 }, /* HANGUL LETTER TIKEUT */
00841 { XK_Hangul_SsangDikeud,          0x3138 }, /* HANGUL LETTER SSANGTIKEUT */
00842 { XK_Hangul_Rieul,                0x3139 }, /* HANGUL LETTER RIEUL */
00843 { XK_Hangul_RieulKiyeog,          0x313a }, /* HANGUL LETTER RIEUL-KIYEOK */
00844 { XK_Hangul_RieulMieum,           0x313b }, /* HANGUL LETTER RIEUL-MIEUM */
00845 { XK_Hangul_RieulPieub,           0x313c }, /* HANGUL LETTER RIEUL-PIEUP */
00846 { XK_Hangul_RieulSios,            0x313d }, /* HANGUL LETTER RIEUL-SIOS */
00847 { XK_Hangul_RieulTieut,           0x313e }, /* HANGUL LETTER RIEUL-THIEUTH */
00848 { XK_Hangul_RieulPhieuf,          0x313f }, /* HANGUL LETTER RIEUL-PHIEUPH */
00849 { XK_Hangul_RieulHieuh,           0x3140 }, /* HANGUL LETTER RIEUL-HIEUH */
00850 { XK_Hangul_Mieum,                0x3141 }, /* HANGUL LETTER MIEUM */
00851 { XK_Hangul_Pieub,                0x3142 }, /* HANGUL LETTER PIEUP */
00852 { XK_Hangul_SsangPieub,           0x3143 }, /* HANGUL LETTER SSANGPIEUP */
00853 { XK_Hangul_PieubSios,            0x3144 }, /* HANGUL LETTER PIEUP-SIOS */
00854 { XK_Hangul_Sios,                 0x3145 }, /* HANGUL LETTER SIOS */
00855 { XK_Hangul_SsangSios,            0x3146 }, /* HANGUL LETTER SSANGSIOS */
00856 { XK_Hangul_Ieung,                0x3147 }, /* HANGUL LETTER IEUNG */
00857 { XK_Hangul_Jieuj,                0x3148 }, /* HANGUL LETTER CIEUC */
00858 { XK_Hangul_SsangJieuj,           0x3149 }, /* HANGUL LETTER SSANGCIEUC */
00859 { XK_Hangul_Cieuc,                0x314a }, /* HANGUL LETTER CHIEUCH */
00860 { XK_Hangul_Khieuq,               0x314b }, /* HANGUL LETTER KHIEUKH */
00861 { XK_Hangul_Tieut,                0x314c }, /* HANGUL LETTER THIEUTH */
00862 { XK_Hangul_Phieuf,               0x314d }, /* HANGUL LETTER PHIEUPH */
00863 { XK_Hangul_Hieuh,                0x314e }, /* HANGUL LETTER HIEUH */
00864 { XK_Hangul_A,                    0x314f }, /* HANGUL LETTER A */
00865 { XK_Hangul_AE,                   0x3150 }, /* HANGUL LETTER AE */
00866 { XK_Hangul_YA,                   0x3151 }, /* HANGUL LETTER YA */
00867 { XK_Hangul_YAE,                  0x3152 }, /* HANGUL LETTER YAE */
00868 { XK_Hangul_EO,                   0x3153 }, /* HANGUL LETTER EO */
00869 { XK_Hangul_E,                    0x3154 }, /* HANGUL LETTER E */
00870 { XK_Hangul_YEO,                  0x3155 }, /* HANGUL LETTER YEO */
00871 { XK_Hangul_YE,                   0x3156 }, /* HANGUL LETTER YE */
00872 { XK_Hangul_O,                    0x3157 }, /* HANGUL LETTER O */
00873 { XK_Hangul_WA,                   0x3158 }, /* HANGUL LETTER WA */
00874 { XK_Hangul_WAE,                  0x3159 }, /* HANGUL LETTER WAE */
00875 { XK_Hangul_OE,                   0x315a }, /* HANGUL LETTER OE */
00876 { XK_Hangul_YO,                   0x315b }, /* HANGUL LETTER YO */
00877 { XK_Hangul_U,                    0x315c }, /* HANGUL LETTER U */
00878 { XK_Hangul_WEO,                  0x315d }, /* HANGUL LETTER WEO */
00879 { XK_Hangul_WE,                   0x315e }, /* HANGUL LETTER WE */
00880 { XK_Hangul_WI,                   0x315f }, /* HANGUL LETTER WI */
00881 { XK_Hangul_YU,                   0x3160 }, /* HANGUL LETTER YU */
00882 { XK_Hangul_EU,                   0x3161 }, /* HANGUL LETTER EU */
00883 { XK_Hangul_YI,                   0x3162 }, /* HANGUL LETTER YI */
00884 { XK_Hangul_I,                    0x3163 }, /* HANGUL LETTER I */
00885 { XK_Hangul_J_Kiyeog,             0x11a8 }, /* HANGUL JONGSEONG KIYEOK */
00886 { XK_Hangul_J_SsangKiyeog,        0x11a9 }, /* HANGUL JONGSEONG SSANGKIYEOK */
00887 { XK_Hangul_J_KiyeogSios,         0x11aa }, /* HANGUL JONGSEONG KIYEOK-SIOS */
00888 { XK_Hangul_J_Nieun,              0x11ab }, /* HANGUL JONGSEONG NIEUN */
00889 { XK_Hangul_J_NieunJieuj,         0x11ac }, /* HANGUL JONGSEONG NIEUN-CIEUC */
00890 { XK_Hangul_J_NieunHieuh,         0x11ad }, /* HANGUL JONGSEONG NIEUN-HIEUH */
00891 { XK_Hangul_J_Dikeud,             0x11ae }, /* HANGUL JONGSEONG TIKEUT */
00892 { XK_Hangul_J_Rieul,              0x11af }, /* HANGUL JONGSEONG RIEUL */
00893 { XK_Hangul_J_RieulKiyeog,        0x11b0 }, /* HANGUL JONGSEONG RIEUL-KIYEOK */
00894 { XK_Hangul_J_RieulMieum,         0x11b1 }, /* HANGUL JONGSEONG RIEUL-MIEUM */
00895 { XK_Hangul_J_RieulPieub,         0x11b2 }, /* HANGUL JONGSEONG RIEUL-PIEUP */
00896 { XK_Hangul_J_RieulSios,          0x11b3 }, /* HANGUL JONGSEONG RIEUL-SIOS */
00897 { XK_Hangul_J_RieulTieut,         0x11b4 }, /* HANGUL JONGSEONG RIEUL-THIEUTH */
00898 { XK_Hangul_J_RieulPhieuf,        0x11b5 }, /* HANGUL JONGSEONG RIEUL-PHIEUPH */
00899 { XK_Hangul_J_RieulHieuh,         0x11b6 }, /* HANGUL JONGSEONG RIEUL-HIEUH */
00900 { XK_Hangul_J_Mieum,              0x11b7 }, /* HANGUL JONGSEONG MIEUM */
00901 { XK_Hangul_J_Pieub,              0x11b8 }, /* HANGUL JONGSEONG PIEUP */
00902 { XK_Hangul_J_PieubSios,          0x11b9 }, /* HANGUL JONGSEONG PIEUP-SIOS */
00903 { XK_Hangul_J_Sios,               0x11ba }, /* HANGUL JONGSEONG SIOS */
00904 { XK_Hangul_J_SsangSios,          0x11bb }, /* HANGUL JONGSEONG SSANGSIOS */
00905 { XK_Hangul_J_Ieung,              0x11bc }, /* HANGUL JONGSEONG IEUNG */
00906 { XK_Hangul_J_Jieuj,              0x11bd }, /* HANGUL JONGSEONG CIEUC */
00907 { XK_Hangul_J_Cieuc,              0x11be }, /* HANGUL JONGSEONG CHIEUCH */
00908 { XK_Hangul_J_Khieuq,             0x11bf }, /* HANGUL JONGSEONG KHIEUKH */
00909 { XK_Hangul_J_Tieut,              0x11c0 }, /* HANGUL JONGSEONG THIEUTH */
00910 { XK_Hangul_J_Phieuf,             0x11c1 }, /* HANGUL JONGSEONG PHIEUPH */
00911 { XK_Hangul_J_Hieuh,              0x11c2 }, /* HANGUL JONGSEONG HIEUH */
00912 { XK_Hangul_RieulYeorinHieuh,     0x316d }, /* HANGUL LETTER RIEUL-YEORINHIEUH */
00913 { XK_Hangul_SunkyeongeumMieum,    0x3171 }, /* HANGUL LETTER KAPYEOUNMIEUM */
00914 { XK_Hangul_SunkyeongeumPieub,    0x3178 }, /* HANGUL LETTER KAPYEOUNPIEUP */
00915 { XK_Hangul_PanSios,              0x317f }, /* HANGUL LETTER PANSIOS */
00916 { XK_Hangul_KkogjiDalrinIeung,    0x3181 }, /* HANGUL LETTER YESIEUNG */
00917 { XK_Hangul_SunkyeongeumPhieuf,   0x3184 }, /* HANGUL LETTER KAPYEOUNPHIEUPH */
00918 { XK_Hangul_YeorinHieuh,          0x3186 }, /* HANGUL LETTER YEORINHIEUH */
00919 { XK_Hangul_AraeA,                0x318d }, /* HANGUL LETTER ARAEA */
00920 { XK_Hangul_AraeAE,               0x318e }, /* HANGUL LETTER ARAEAE */
00921 { XK_Hangul_J_PanSios,            0x11eb }, /* HANGUL JONGSEONG PANSIOS */
00922 { XK_Hangul_J_KkogjiDalrinIeung,  0x11f0 }, /* HANGUL JONGSEONG YESIEUNG */
00923 { XK_Hangul_J_YeorinHieuh,        0x11f9 }, /* HANGUL JONGSEONG YEORINHIEUH */
00924 { XK_Korean_Won,                  0x20a9 }, /* WON SIGN */
00925 #endif // defined(XK_Hangul_Kiyeog)
00926 { XK_OE,                          0x0152 }, /* LATIN CAPITAL LIGATURE OE */
00927 { XK_oe,                          0x0153 }, /* LATIN SMALL LIGATURE OE */
00928 { XK_Ydiaeresis,                  0x0178 }, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */
00929 { XK_EuroSign,                    0x20ac }, /* EURO SIGN */
00930 
00931 /* combining dead keys */
00932 { XK_dead_abovedot,               0x0307 }, /* COMBINING DOT ABOVE */
00933 { XK_dead_abovering,              0x030a }, /* COMBINING RING ABOVE */
00934 { XK_dead_acute,                  0x0301 }, /* COMBINING ACUTE ACCENT */
00935 { XK_dead_breve,                  0x0306 }, /* COMBINING BREVE */
00936 { XK_dead_caron,                  0x030c }, /* COMBINING CARON */
00937 { XK_dead_cedilla,                0x0327 }, /* COMBINING CEDILLA */
00938 { XK_dead_circumflex,             0x0302 }, /* COMBINING CIRCUMFLEX ACCENT */
00939 { XK_dead_diaeresis,              0x0308 }, /* COMBINING DIAERESIS */
00940 { XK_dead_doubleacute,            0x030b }, /* COMBINING DOUBLE ACUTE ACCENT */
00941 { XK_dead_grave,                  0x0300 }, /* COMBINING GRAVE ACCENT */
00942 { XK_dead_macron,                 0x0304 }, /* COMBINING MACRON */
00943 { XK_dead_ogonek,                 0x0328 }, /* COMBINING OGONEK */
00944 { XK_dead_tilde,                  0x0303 }  /* COMBINING TILDE */
00945 };
00946 /* XXX -- map these too
00947 XK_Cyrillic_GHE_bar
00948 XK_Cyrillic_ZHE_descender
00949 XK_Cyrillic_KA_descender
00950 XK_Cyrillic_KA_vertstroke
00951 XK_Cyrillic_EN_descender
00952 XK_Cyrillic_U_straight
00953 XK_Cyrillic_U_straight_bar
00954 XK_Cyrillic_HA_descender
00955 XK_Cyrillic_CHE_descender
00956 XK_Cyrillic_CHE_vertstroke
00957 XK_Cyrillic_SHHA
00958 XK_Cyrillic_SCHWA
00959 XK_Cyrillic_I_macron
00960 XK_Cyrillic_O_bar
00961 XK_Cyrillic_U_macron
00962 XK_Cyrillic_ghe_bar
00963 XK_Cyrillic_zhe_descender
00964 XK_Cyrillic_ka_descender
00965 XK_Cyrillic_ka_vertstroke
00966 XK_Cyrillic_en_descender
00967 XK_Cyrillic_u_straight
00968 XK_Cyrillic_u_straight_bar
00969 XK_Cyrillic_ha_descender
00970 XK_Cyrillic_che_descender
00971 XK_Cyrillic_che_vertstroke
00972 XK_Cyrillic_shha
00973 XK_Cyrillic_schwa
00974 XK_Cyrillic_i_macron
00975 XK_Cyrillic_o_bar
00976 XK_Cyrillic_u_macron
00977 
00978 XK_Armenian_eternity
00979 XK_Armenian_ligature_ew
00980 XK_Armenian_full_stop
00981 XK_Armenian_verjaket
00982 XK_Armenian_parenright
00983 XK_Armenian_parenleft
00984 XK_Armenian_guillemotright
00985 XK_Armenian_guillemotleft
00986 XK_Armenian_em_dash
00987 XK_Armenian_dot
00988 XK_Armenian_mijaket
00989 XK_Armenian_but
00990 XK_Armenian_separation_mark
00991 XK_Armenian_comma
00992 XK_Armenian_en_dash
00993 XK_Armenian_hyphen
00994 XK_Armenian_yentamna
00995 XK_Armenian_ellipsis
00996 XK_Armenian_amanak
00997 XK_Armenian_exclam
00998 XK_Armenian_accent
00999 XK_Armenian_shesht
01000 XK_Armenian_paruyk
01001 XK_Armenian_question
01002 XK_Armenian_AYB
01003 XK_Armenian_ayb
01004 XK_Armenian_BEN
01005 XK_Armenian_ben
01006 XK_Armenian_GIM
01007 XK_Armenian_gim
01008 XK_Armenian_DA
01009 XK_Armenian_da
01010 XK_Armenian_YECH
01011 XK_Armenian_yech
01012 XK_Armenian_ZA
01013 XK_Armenian_za
01014 XK_Armenian_E
01015 XK_Armenian_e
01016 XK_Armenian_AT
01017 XK_Armenian_at
01018 XK_Armenian_TO
01019 XK_Armenian_to
01020 XK_Armenian_ZHE
01021 XK_Armenian_zhe
01022 XK_Armenian_INI
01023 XK_Armenian_ini
01024 XK_Armenian_LYUN
01025 XK_Armenian_lyun
01026 XK_Armenian_KHE
01027 XK_Armenian_khe
01028 XK_Armenian_TSA
01029 XK_Armenian_tsa
01030 XK_Armenian_KEN
01031 XK_Armenian_ken
01032 XK_Armenian_HO
01033 XK_Armenian_ho
01034 XK_Armenian_DZA
01035 XK_Armenian_dza
01036 XK_Armenian_GHAT
01037 XK_Armenian_ghat
01038 XK_Armenian_TCHE
01039 XK_Armenian_tche
01040 XK_Armenian_MEN
01041 XK_Armenian_men
01042 XK_Armenian_HI
01043 XK_Armenian_hi
01044 XK_Armenian_NU
01045 XK_Armenian_nu
01046 XK_Armenian_SHA
01047 XK_Armenian_sha
01048 XK_Armenian_VO
01049 XK_Armenian_vo
01050 XK_Armenian_CHA
01051 XK_Armenian_cha
01052 XK_Armenian_PE
01053 XK_Armenian_pe
01054 XK_Armenian_JE
01055 XK_Armenian_je
01056 XK_Armenian_RA
01057 XK_Armenian_ra
01058 XK_Armenian_SE
01059 XK_Armenian_se
01060 XK_Armenian_VEV
01061 XK_Armenian_vev
01062 XK_Armenian_TYUN
01063 XK_Armenian_tyun
01064 XK_Armenian_RE
01065 XK_Armenian_re
01066 XK_Armenian_TSO
01067 XK_Armenian_tso
01068 XK_Armenian_VYUN
01069 XK_Armenian_vyun
01070 XK_Armenian_PYUR
01071 XK_Armenian_pyur
01072 XK_Armenian_KE
01073 XK_Armenian_ke
01074 XK_Armenian_O
01075 XK_Armenian_o
01076 XK_Armenian_FE
01077 XK_Armenian_fe
01078 XK_Armenian_apostrophe
01079 XK_Armenian_section_sign
01080 
01081 XK_Georgian_an
01082 XK_Georgian_ban
01083 XK_Georgian_gan
01084 XK_Georgian_don
01085 XK_Georgian_en
01086 XK_Georgian_vin
01087 XK_Georgian_zen
01088 XK_Georgian_tan
01089 XK_Georgian_in
01090 XK_Georgian_kan
01091 XK_Georgian_las
01092 XK_Georgian_man
01093 XK_Georgian_nar
01094 XK_Georgian_on
01095 XK_Georgian_par
01096 XK_Georgian_zhar
01097 XK_Georgian_rae
01098 XK_Georgian_san
01099 XK_Georgian_tar
01100 XK_Georgian_un
01101 XK_Georgian_phar
01102 XK_Georgian_khar
01103 XK_Georgian_ghan
01104 XK_Georgian_qar
01105 XK_Georgian_shin
01106 XK_Georgian_chin
01107 XK_Georgian_can
01108 XK_Georgian_jil
01109 XK_Georgian_cil
01110 XK_Georgian_char
01111 XK_Georgian_xan
01112 XK_Georgian_jhan
01113 XK_Georgian_hae
01114 XK_Georgian_he
01115 XK_Georgian_hie
01116 XK_Georgian_we
01117 XK_Georgian_har
01118 XK_Georgian_hoe
01119 XK_Georgian_fi
01120 
01121 XK_Ccedillaabovedot
01122 XK_Xabovedot
01123 XK_Qabovedot
01124 XK_Ibreve
01125 XK_IE
01126 XK_UO
01127 XK_Zstroke
01128 XK_Gcaron
01129 XK_Obarred
01130 XK_ccedillaabovedot
01131 XK_xabovedot
01132 XK_Ocaron
01133 XK_qabovedot
01134 XK_ibreve
01135 XK_ie
01136 XK_uo
01137 XK_zstroke
01138 XK_gcaron
01139 XK_ocaron
01140 XK_obarred
01141 XK_SCHWA
01142 XK_Lbelowdot
01143 XK_Lstrokebelowdot
01144 XK_Gtilde
01145 XK_lbelowdot
01146 XK_lstrokebelowdot
01147 XK_gtilde
01148 XK_schwa
01149 
01150 XK_Abelowdot
01151 XK_abelowdot
01152 XK_Ahook
01153 XK_ahook
01154 XK_Acircumflexacute
01155 XK_acircumflexacute
01156 XK_Acircumflexgrave
01157 XK_acircumflexgrave
01158 XK_Acircumflexhook
01159 XK_acircumflexhook
01160 XK_Acircumflextilde
01161 XK_acircumflextilde
01162 XK_Acircumflexbelowdot
01163 XK_acircumflexbelowdot
01164 XK_Abreveacute
01165 XK_abreveacute
01166 XK_Abrevegrave
01167 XK_abrevegrave
01168 XK_Abrevehook
01169 XK_abrevehook
01170 XK_Abrevetilde
01171 XK_abrevetilde
01172 XK_Abrevebelowdot
01173 XK_abrevebelowdot
01174 XK_Ebelowdot
01175 XK_ebelowdot
01176 XK_Ehook
01177 XK_ehook
01178 XK_Etilde
01179 XK_etilde
01180 XK_Ecircumflexacute
01181 XK_ecircumflexacute
01182 XK_Ecircumflexgrave
01183 XK_ecircumflexgrave
01184 XK_Ecircumflexhook
01185 XK_ecircumflexhook
01186 XK_Ecircumflextilde
01187 XK_ecircumflextilde
01188 XK_Ecircumflexbelowdot
01189 XK_ecircumflexbelowdot
01190 XK_Ihook
01191 XK_ihook
01192 XK_Ibelowdot
01193 XK_ibelowdot
01194 XK_Obelowdot
01195 XK_obelowdot
01196 XK_Ohook
01197 XK_ohook
01198 XK_Ocircumflexacute
01199 XK_ocircumflexacute
01200 XK_Ocircumflexgrave
01201 XK_ocircumflexgrave
01202 XK_Ocircumflexhook
01203 XK_ocircumflexhook
01204 XK_Ocircumflextilde
01205 XK_ocircumflextilde
01206 XK_Ocircumflexbelowdot
01207 XK_ocircumflexbelowdot
01208 XK_Ohornacute
01209 XK_ohornacute
01210 XK_Ohorngrave
01211 XK_ohorngrave
01212 XK_Ohornhook
01213 XK_ohornhook
01214 XK_Ohorntilde
01215 XK_ohorntilde
01216 XK_Ohornbelowdot
01217 XK_ohornbelowdot
01218 XK_Ubelowdot
01219 XK_ubelowdot
01220 XK_Uhook
01221 XK_uhook
01222 XK_Uhornacute
01223 XK_uhornacute
01224 XK_Uhorngrave
01225 XK_uhorngrave
01226 XK_Uhornhook
01227 XK_uhornhook
01228 XK_Uhorntilde
01229 XK_uhorntilde
01230 XK_Uhornbelowdot
01231 XK_uhornbelowdot
01232 XK_Ybelowdot
01233 XK_ybelowdot
01234 XK_Yhook
01235 XK_yhook
01236 XK_Ytilde
01237 XK_ytilde
01238 XK_Ohorn
01239 XK_ohorn
01240 XK_Uhorn
01241 XK_uhorn
01242 */
01243 
01244 // map "Internet" keys to KeyIDs
01245 static const KeySym s_map1008FF[] =
01246 {
01247     /* 0x00 */ 0, 0, 0, 0, 0, 0, 0, 0,
01248     /* 0x08 */ 0, 0, 0, 0, 0, 0, 0, 0,
01249     /* 0x10 */ 0, kKeyAudioDown, kKeyAudioMute, kKeyAudioUp,
01250     /* 0x14 */ kKeyAudioPlay, kKeyAudioStop, kKeyAudioPrev, kKeyAudioNext,
01251     /* 0x18 */ kKeyWWWHome, kKeyAppMail, 0, kKeyWWWSearch, 0, 0, 0, 0,
01252     /* 0x20 */ 0, 0, 0, 0, 0, 0, kKeyWWWBack, kKeyWWWForward,
01253     /* 0x28 */ kKeyWWWStop, kKeyWWWRefresh, 0, 0, kKeyEject, 0, 0, 0,
01254     /* 0x30 */ kKeyWWWFavorites, 0, kKeyAppMedia, 0, 0, 0, 0, 0,
01255     /* 0x38 */ 0, 0, 0, 0, 0, 0, 0, 0,
01256     /* 0x40 */ kKeyAppUser1, kKeyAppUser2, 0, 0, 0, 0, 0, 0,
01257     /* 0x48 */ 0, 0, 0, 0, 0, 0, 0, 0,
01258     /* 0x50 */ 0, 0, 0, 0, 0, 0, 0, 0,
01259     /* 0x58 */ 0, 0, 0, 0, 0, 0, 0, 0,
01260     /* 0x60 */ 0, 0, 0, 0, 0, 0, 0, 0,
01261     /* 0x68 */ 0, 0, 0, 0, 0, 0, 0, 0,
01262     /* 0x70 */ 0, 0, 0, 0, 0, 0, 0, 0,
01263     /* 0x78 */ 0, 0, 0, 0, 0, 0, 0, 0,
01264     /* 0x80 */ 0, 0, 0, 0, 0, 0, 0, 0,
01265     /* 0x88 */ 0, 0, 0, 0, 0, 0, 0, 0,
01266     /* 0x90 */ 0, 0, 0, 0, 0, 0, 0, 0,
01267     /* 0x98 */ 0, 0, 0, 0, 0, 0, 0, 0,
01268     /* 0xa0 */ 0, 0, 0, 0, 0, 0, 0, 0,
01269     /* 0xa8 */ 0, 0, 0, 0, 0, 0, 0, 0,
01270     /* 0xb0 */ 0, 0, 0, 0, 0, 0, 0, 0,
01271     /* 0xb8 */ 0, 0, 0, 0, 0, 0, 0, 0,
01272     /* 0xc0 */ 0, 0, 0, 0, 0, 0, 0, 0,
01273     /* 0xc8 */ 0, 0, 0, 0, 0, 0, 0, 0,
01274     /* 0xd0 */ 0, 0, 0, 0, 0, 0, 0, 0,
01275     /* 0xd8 */ 0, 0, 0, 0, 0, 0, 0, 0,
01276     /* 0xe0 */ 0, 0, 0, 0, 0, 0, 0, 0,
01277     /* 0xe8 */ 0, 0, 0, 0, 0, 0, 0, 0,
01278     /* 0xf0 */ 0, 0, 0, 0, 0, 0, 0, 0,
01279     /* 0xf8 */ 0, 0, 0, 0, 0, 0, 0, 0
01280 };
01281 
01282 
01283 //
01284 // CXWindowsUtil
01285 //
01286 
01287 CXWindowsUtil::CKeySymMap   CXWindowsUtil::s_keySymToUCS4;
01288 
01289 bool
01290 CXWindowsUtil::getWindowProperty(Display* display, Window window,
01291                 Atom property, CString* data, Atom* type,
01292                 SInt32* format, bool deleteProperty)
01293 {
01294     assert(display != NULL);
01295 
01296     Atom actualType;
01297     int actualDatumSize;
01298 
01299     // ignore errors.  XGetWindowProperty() will report failure.
01300     CXWindowsUtil::CErrorLock lock(display);
01301 
01302     // read the property
01303     bool okay = true;
01304     const long length = XMaxRequestSize(display);
01305     long offset = 0;
01306     unsigned long bytesLeft = 1;
01307     while (bytesLeft != 0) {
01308         // get more data
01309         unsigned long numItems;
01310         unsigned char* rawData;
01311         if (XGetWindowProperty(display, window, property,
01312                                 offset, length, False, AnyPropertyType,
01313                                 &actualType, &actualDatumSize,
01314                                 &numItems, &bytesLeft, &rawData) != Success ||
01315             actualType == None || actualDatumSize == 0) {
01316             // failed
01317             okay = false;
01318             break;
01319         }
01320 
01321         // compute bytes read and advance offset
01322         unsigned long numBytes;
01323         switch (actualDatumSize) {
01324         case 8:
01325         default:
01326             numBytes = numItems;
01327             offset  += numItems / 4;
01328             break;
01329 
01330         case 16:
01331             numBytes = 2 * numItems;
01332             offset  += numItems / 2;
01333             break;
01334 
01335         case 32:
01336             numBytes = 4 * numItems;
01337             offset  += numItems;
01338             break;
01339         }
01340 
01341         // append data
01342         if (data != NULL) {
01343             data->append((char*)rawData, numBytes);
01344         }
01345         else {
01346             // data is not required so don't try to get any more
01347             bytesLeft = 0;
01348         }
01349 
01350         // done with returned data
01351         XFree(rawData);
01352     }
01353 
01354     // delete the property if requested
01355     if (deleteProperty) {
01356         XDeleteProperty(display, window, property);
01357     }
01358 
01359     // save property info
01360     if (type != NULL) {
01361         *type = actualType;
01362     }
01363     if (format != NULL) {
01364         *format = static_cast<SInt32>(actualDatumSize);
01365     }
01366 
01367     if (okay) {
01368         LOG((CLOG_DEBUG2 "read property %d on window 0x%08x: bytes=%d", property, window, (data == NULL) ? 0 : data->size()));
01369         return true;
01370     }
01371     else {
01372         LOG((CLOG_DEBUG2 "can't read property %d on window 0x%08x", property, window));
01373         return false;
01374     }
01375 }
01376 
01377 bool
01378 CXWindowsUtil::setWindowProperty(Display* display, Window window,
01379                 Atom property, const void* vdata, UInt32 size,
01380                 Atom type, SInt32 format)
01381 {
01382     const UInt32 length       = 4 * XMaxRequestSize(display);
01383     const unsigned char* data = reinterpret_cast<const unsigned char*>(vdata);
01384     UInt32 datumSize    = static_cast<UInt32>(format / 8);
01385     // format 32 on 64bit systems is 8 bytes not 4.
01386     if (format == 32) {
01387         datumSize = sizeof(Atom);
01388     }
01389 
01390     // save errors
01391     bool error = false;
01392     CXWindowsUtil::CErrorLock lock(display, &error);
01393 
01394     // how much data to send in first chunk?
01395     UInt32 chunkSize = size;
01396     if (chunkSize > length) {
01397         chunkSize = length;
01398     }
01399 
01400     // send first chunk
01401     XChangeProperty(display, window, property,
01402                                 type, format, PropModeReplace,
01403                                 data, chunkSize / datumSize);
01404 
01405     // append remaining chunks
01406     data += chunkSize;
01407     size -= chunkSize;
01408     while (!error && size > 0) {
01409         chunkSize = size;
01410         if (chunkSize > length) {
01411             chunkSize = length;
01412         }
01413         XChangeProperty(display, window, property,
01414                                 type, format, PropModeAppend,
01415                                 data, chunkSize / datumSize);
01416         data += chunkSize;
01417         size -= chunkSize;
01418     }
01419 
01420     return !error;
01421 }
01422 
01423 Time
01424 CXWindowsUtil::getCurrentTime(Display* display, Window window)
01425 {
01426     // select property events on window
01427     XWindowAttributes attr;
01428     XGetWindowAttributes(display, window, &attr);
01429     XSelectInput(display, window, attr.your_event_mask | PropertyChangeMask);
01430 
01431     // make a property name to receive dummy change
01432     Atom atom = XInternAtom(display, "TIMESTAMP", False);
01433 
01434     // do a zero-length append to get the current time
01435     unsigned char dummy;
01436     XChangeProperty(display, window, atom,
01437                                 XA_INTEGER, 8,
01438                                 PropModeAppend,
01439                                 &dummy, 0);
01440 
01441     // look for property notify events with the following
01442     CPropertyNotifyPredicateInfo filter;
01443     filter.m_window   = window;
01444     filter.m_property = atom;
01445 
01446     // wait for reply
01447     XEvent xevent;
01448     XIfEvent(display, &xevent, &CXWindowsUtil::propertyNotifyPredicate,
01449                                 (XPointer)&filter);
01450     assert(xevent.type             == PropertyNotify);
01451     assert(xevent.xproperty.window == window);
01452     assert(xevent.xproperty.atom   == atom);
01453 
01454     // restore event mask
01455     XSelectInput(display, window, attr.your_event_mask);
01456 
01457     return xevent.xproperty.time;
01458 }
01459 
01460 KeyID
01461 CXWindowsUtil::mapKeySymToKeyID(KeySym k)
01462 {
01463     initKeyMaps();
01464 
01465     switch (k & 0xffffff00) {
01466     case 0x0000:
01467         // Latin-1
01468         return static_cast<KeyID>(k);
01469 
01470     case 0xfe00:
01471         // ISO 9995 Function and Modifier Keys
01472         switch (k) {
01473         case XK_ISO_Left_Tab:
01474             return kKeyLeftTab;
01475 
01476         case XK_ISO_Level3_Shift:
01477             return kKeyAltGr;
01478 
01479         case XK_ISO_Next_Group:
01480             return kKeyNextGroup;
01481 
01482         case XK_ISO_Prev_Group:
01483             return kKeyPrevGroup;
01484 
01485         case XK_dead_grave:
01486             return kKeyDeadGrave;
01487 
01488         case XK_dead_acute:
01489             return kKeyDeadAcute;
01490 
01491         case XK_dead_circumflex:
01492             return kKeyDeadCircumflex;
01493 
01494         case XK_dead_tilde:
01495             return kKeyDeadTilde;
01496 
01497         case XK_dead_macron:
01498             return kKeyDeadMacron;
01499 
01500         case XK_dead_breve:
01501             return kKeyDeadBreve;
01502 
01503         case XK_dead_abovedot:
01504             return kKeyDeadAbovedot;
01505 
01506         case XK_dead_diaeresis:
01507             return kKeyDeadDiaeresis;
01508 
01509         case XK_dead_abovering:
01510             return kKeyDeadAbovering;
01511 
01512         case XK_dead_doubleacute:
01513             return kKeyDeadDoubleacute;
01514 
01515         case XK_dead_caron:
01516             return kKeyDeadCaron;
01517 
01518         case XK_dead_cedilla:
01519             return kKeyDeadCedilla;
01520 
01521         case XK_dead_ogonek:
01522             return kKeyDeadOgonek;
01523 
01524         default:
01525             return kKeyNone;
01526         }
01527 
01528     case 0xff00:
01529         // MISCELLANY
01530         return static_cast<KeyID>(k - 0xff00 + 0xef00);
01531 
01532     case 0x1008ff00:
01533         // "Internet" keys
01534         return s_map1008FF[k & 0xff];
01535 
01536     default: {
01537         // lookup character in table
01538         CKeySymMap::const_iterator index = s_keySymToUCS4.find(k);
01539         if (index != s_keySymToUCS4.end()) {
01540             return static_cast<KeyID>(index->second);
01541         }
01542 
01543         // unknown character
01544         return kKeyNone;
01545     }
01546     }
01547 }
01548 
01549 UInt32
01550 CXWindowsUtil::getModifierBitForKeySym(KeySym keysym)
01551 {
01552     switch (keysym) {
01553     case XK_Shift_L:
01554     case XK_Shift_R:
01555         return kKeyModifierBitShift;
01556 
01557     case XK_Control_L:
01558     case XK_Control_R:
01559         return kKeyModifierBitControl;
01560 
01561     case XK_Alt_L:
01562     case XK_Alt_R:
01563         return kKeyModifierBitAlt;
01564 
01565     case XK_Meta_L:
01566     case XK_Meta_R:
01567         return kKeyModifierBitMeta;
01568 
01569     case XK_Super_L:
01570     case XK_Super_R:
01571     case XK_Hyper_L:
01572     case XK_Hyper_R:
01573         return kKeyModifierBitSuper;
01574 
01575     case XK_Mode_switch:
01576     case XK_ISO_Level3_Shift:
01577         return kKeyModifierBitAltGr;
01578 
01579     case XK_Caps_Lock:
01580         return kKeyModifierBitCapsLock;
01581 
01582     case XK_Num_Lock:
01583         return kKeyModifierBitNumLock;
01584 
01585     case XK_Scroll_Lock:
01586         return kKeyModifierBitScrollLock;
01587 
01588     default:
01589         return kKeyModifierBitNone;
01590     }
01591 }
01592 
01593 CString
01594 CXWindowsUtil::atomToString(Display* display, Atom atom)
01595 {
01596     if (atom == 0) {
01597         return "None";
01598     }
01599 
01600     bool error = false;
01601     CXWindowsUtil::CErrorLock lock(display, &error);
01602     char* name = XGetAtomName(display, atom);
01603     if (error) {
01604         return CStringUtil::print("<UNKNOWN> (%d)", (int)atom);
01605     }
01606     else {
01607         CString msg = CStringUtil::print("%s (%d)", name, (int)atom);
01608         XFree(name);
01609         return msg;
01610     }
01611 }
01612 
01613 CString
01614 CXWindowsUtil::atomsToString(Display* display, const Atom* atom, UInt32 num)
01615 {
01616     char** names = new char*[num];
01617     bool error = false;
01618     CXWindowsUtil::CErrorLock lock(display, &error);
01619     XGetAtomNames(display, const_cast<Atom*>(atom), (int)num, names);
01620     CString msg;
01621     if (error) {
01622         for (UInt32 i = 0; i < num; ++i) {
01623             msg += CStringUtil::print("<UNKNOWN> (%d), ", (int)atom[i]);
01624         }
01625     }
01626     else {
01627         for (UInt32 i = 0; i < num; ++i) {
01628             msg += CStringUtil::print("%s (%d), ", names[i], (int)atom[i]);
01629             XFree(names[i]);
01630         }
01631     }
01632     delete[] names;
01633     if (msg.size() > 2) {
01634         msg.erase(msg.size() - 2);
01635     }
01636     return msg;
01637 }
01638 
01639 void
01640 CXWindowsUtil::convertAtomProperty(CString& data)
01641 {
01642     // as best i can tell, 64-bit systems don't pack Atoms into properties
01643     // as 32-bit numbers but rather as the 64-bit numbers they are.  that
01644     // seems wrong but we have to cope.  sometimes we'll get a list of
01645     // atoms that's 8*n+4 bytes long, missing the trailing 4 bytes which
01646     // should all be 0.  since we're going to reference the Atoms as
01647     // 64-bit numbers we have to ensure the last number is a full 64 bits.
01648     if (sizeof(Atom) != 4 && ((data.size() / 4) & 1) != 0) {
01649         UInt32 zero = 0;
01650         data.append(reinterpret_cast<char*>(&zero), sizeof(zero));
01651     }
01652 }
01653 
01654 void
01655 CXWindowsUtil::appendAtomData(CString& data, Atom atom)
01656 {
01657     data.append(reinterpret_cast<char*>(&atom), sizeof(Atom));
01658 }
01659 
01660 void
01661 CXWindowsUtil::replaceAtomData(CString& data, UInt32 index, Atom atom)
01662 {
01663     data.replace(index * sizeof(Atom), sizeof(Atom),
01664                                 reinterpret_cast<const char*>(&atom),
01665                                 sizeof(Atom));
01666 }
01667 
01668 void
01669 CXWindowsUtil::appendTimeData(CString& data, Time time)
01670 {
01671     data.append(reinterpret_cast<char*>(&time), sizeof(Time));
01672 }
01673 
01674 Bool
01675 CXWindowsUtil::propertyNotifyPredicate(Display*, XEvent* xevent, XPointer arg)
01676 {
01677     CPropertyNotifyPredicateInfo* filter =
01678                         reinterpret_cast<CPropertyNotifyPredicateInfo*>(arg);
01679     return (xevent->type             == PropertyNotify &&
01680             xevent->xproperty.window == filter->m_window &&
01681             xevent->xproperty.atom   == filter->m_property &&
01682             xevent->xproperty.state  == PropertyNewValue) ? True : False;
01683 }
01684 
01685 void
01686 CXWindowsUtil::initKeyMaps()
01687 {
01688     if (s_keySymToUCS4.empty()) {
01689         for (size_t i =0; i < sizeof(s_keymap) / sizeof(s_keymap[0]); ++i) {
01690             s_keySymToUCS4[s_keymap[i].keysym] = s_keymap[i].ucs4;
01691         }
01692     }
01693 }
01694 
01695 
01696 //
01697 // CXWindowsUtil::CErrorLock
01698 //
01699 
01700 CXWindowsUtil::CErrorLock*  CXWindowsUtil::CErrorLock::s_top = NULL;
01701 
01702 CXWindowsUtil::CErrorLock::CErrorLock(Display* display) :
01703     m_display(display)
01704 {
01705     install(&CXWindowsUtil::CErrorLock::ignoreHandler, NULL);
01706 }
01707 
01708 CXWindowsUtil::CErrorLock::CErrorLock(Display* display, bool* flag) :
01709     m_display(display)
01710 {
01711     install(&CXWindowsUtil::CErrorLock::saveHandler, flag);
01712 }
01713 
01714 CXWindowsUtil::CErrorLock::CErrorLock(Display* display,
01715                 ErrorHandler handler, void* data) :
01716     m_display(display)
01717 {
01718     install(handler, data);
01719 }
01720 
01721 CXWindowsUtil::CErrorLock::~CErrorLock()
01722 {
01723     // make sure everything finishes before uninstalling handler
01724     if (m_display != NULL) {
01725         XSync(m_display, False);
01726     }
01727 
01728     // restore old handler
01729     XSetErrorHandler(m_oldXHandler);
01730     s_top = m_next;
01731 }
01732 
01733 void
01734 CXWindowsUtil::CErrorLock::install(ErrorHandler handler, void* data)
01735 {
01736     // make sure everything finishes before installing handler
01737     if (m_display != NULL) {
01738         XSync(m_display, False);
01739     }
01740 
01741     // install handler
01742     m_handler     = handler;
01743     m_userData    = data;
01744     m_oldXHandler = XSetErrorHandler(
01745                                 &CXWindowsUtil::CErrorLock::internalHandler);
01746     m_next        = s_top;
01747     s_top         = this;
01748 }
01749 
01750 int
01751 CXWindowsUtil::CErrorLock::internalHandler(Display* display, XErrorEvent* event)
01752 {
01753     if (s_top != NULL && s_top->m_handler != NULL) {
01754         s_top->m_handler(display, event, s_top->m_userData);
01755     }
01756     return 0;
01757 }
01758 
01759 void
01760 CXWindowsUtil::CErrorLock::ignoreHandler(Display*, XErrorEvent* e, void*)
01761 {
01762     LOG((CLOG_DEBUG1 "ignoring X error: %d", e->error_code));
01763 }
01764 
01765 void
01766 CXWindowsUtil::CErrorLock::saveHandler(Display*, XErrorEvent* e, void* flag)
01767 {
01768     LOG((CLOG_DEBUG1 "flagging X error: %d", e->error_code));
01769     *reinterpret_cast<bool*>(flag) = true;
01770 }

Generated on Fri Nov 6 00:18:46 2009 for synergy-plus by  doxygen 1.4.7