16e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
26e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
36e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// found in the LICENSE file.
46e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
56e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "ui/events/x/keysym_to_unicode.h"
66e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
76e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// Define XK_xxx before the #include of <X11/keysym.h> so that <X11/keysym.h>
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// defines all KeySyms we need.
96e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_MISCELLANY
106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_LATIN1
116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_LATIN2
126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_LATIN3
136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_LATIN4
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_LATIN8
156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_LATIN9
166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_KATAKANA
176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_ARABIC
186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_CYRILLIC
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_GREEK
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_TECHNICAL
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_SPECIAL
226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_PUBLISHING
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_APL
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_HEBREW
256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_THAI
266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_KOREAN
276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_ARMENIAN
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_GEORGIAN
296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_CAUCASUS
306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_VIETNAMESE
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_CURRENCY
326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_MATHEMATICAL
336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_BRAILLE
346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#define XK_SINHALA
356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <X11/X.h>
366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <X11/keysym.h>
376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include <unordered_map>
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/lazy_instance.h"
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/macros.h"
426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace ui {
446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const struct {
466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  KeySym keysym;
476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  uint16_t unicode;
486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} g_keysym_to_unicode_table[] = {
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Control characters
506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_BackSpace,                   0x0008},
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Tab,                         0x0009},
526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Linefeed,                    0x000a},
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Clear,                       0x000b},
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Return,                      0x000d},
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Escape,                      0x001b},
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Delete,                      0x007f},
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Numeric keypad
596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Space,                    0x0020},
606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Tab,                      0x0009},
616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Enter,                    0x000d},
626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Equal,                    0x003d},
636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Multiply,                 0x002a},
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Add,                      0x002b},
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Separator,                0x002c},
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Subtract,                 0x002d},
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Decimal,                  0x002e},
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_Divide,                   0x002f},
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_0,                        0x0030},
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_1,                        0x0031},
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_2,                        0x0032},
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_3,                        0x0033},
736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_4,                        0x0034},
746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_5,                        0x0035},
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_6,                        0x0036},
766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_7,                        0x0037},
776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_8,                        0x0038},
786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_KP_9,                        0x0039},
796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Latin 1 KeySyms map 1:1 to Unicode
816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Latin 2
836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Aogonek,                     0x0104},  // LATIN CAPITAL LETTER A WITH OGONEK
846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_breve,                       0x02D8},  // BREVE
856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Lstroke,                     0x0141},  // LATIN CAPITAL LETTER L WITH STROKE
866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Lcaron,                      0x013D},  // LATIN CAPITAL LETTER L WITH CARON
876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Sacute,                      0x015A},  // LATIN CAPITAL LETTER S WITH ACUTE
886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Scaron,                      0x0160},  // LATIN CAPITAL LETTER S WITH CARON
896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Scedilla,                    0x015E},  // LATIN CAPITAL LETTER S WITH CEDILLA
906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Tcaron,                      0x0164},  // LATIN CAPITAL LETTER T WITH CARON
916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Zacute,                      0x0179},  // LATIN CAPITAL LETTER Z WITH ACUTE
926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Zcaron,                      0x017D},  // LATIN CAPITAL LETTER Z WITH CARON
936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Zabovedot,                   0x017B},  // LATIN CAPITAL LETTER Z WITH DOT ABOVE
946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_aogonek,                     0x0105},  // LATIN SMALL LETTER A WITH OGONEK
956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ogonek,                      0x02DB},  // OGONEK
966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_lstroke,                     0x0142},  // LATIN SMALL LETTER L WITH STROKE
976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_lcaron,                      0x013E},  // LATIN SMALL LETTER L WITH CARON
986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_sacute,                      0x015B},  // LATIN SMALL LETTER S WITH ACUTE
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_caron,                       0x02C7},  // CARON
1006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_scaron,                      0x0161},  // LATIN SMALL LETTER S WITH CARON
1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_scedilla,                    0x015F},  // LATIN SMALL LETTER S WITH CEDILLA
1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_tcaron,                      0x0165},  // LATIN SMALL LETTER T WITH CARON
1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_zacute,                      0x017A},  // LATIN SMALL LETTER Z WITH ACUTE
1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_doubleacute,                 0x02DD},  // DOUBLE ACUTE ACCENT
1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_zcaron,                      0x017E},  // LATIN SMALL LETTER Z WITH CARON
1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_zabovedot,                   0x017C},  // LATIN SMALL LETTER Z WITH DOT ABOVE
1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Racute,                      0x0154},  // LATIN CAPITAL LETTER R WITH ACUTE
1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Abreve,                      0x0102},  // LATIN CAPITAL LETTER A WITH BREVE
1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Lacute,                      0x0139},  // LATIN CAPITAL LETTER L WITH ACUTE
1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cacute,                      0x0106},  // LATIN CAPITAL LETTER C WITH ACUTE
1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ccaron,                      0x010C},  // LATIN CAPITAL LETTER C WITH CARON
1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Eogonek,                     0x0118},  // LATIN CAPITAL LETTER E WITH OGONEK
1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ecaron,                      0x011A},  // LATIN CAPITAL LETTER E WITH CARON
1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Dcaron,                      0x010E},  // LATIN CAPITAL LETTER D WITH CARON
1156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Dstroke,                     0x0110},  // LATIN CAPITAL LETTER D WITH STROKE
1166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Nacute,                      0x0143},  // LATIN CAPITAL LETTER N WITH ACUTE
1176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ncaron,                      0x0147},  // LATIN CAPITAL LETTER N WITH CARON
1186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Odoubleacute,                0x0150},  // LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
1196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Rcaron,                      0x0158},  // LATIN CAPITAL LETTER R WITH CARON
1206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Uring,                       0x016E},  // LATIN CAPITAL LETTER U WITH RING ABOVE
1216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Udoubleacute,                0x0170},  // LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
1226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Tcedilla,                    0x0162},  // LATIN CAPITAL LETTER T WITH CEDILLA
1236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_racute,                      0x0155},  // LATIN SMALL LETTER R WITH ACUTE
1246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_abreve,                      0x0103},  // LATIN SMALL LETTER A WITH BREVE
1256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_lacute,                      0x013A},  // LATIN SMALL LETTER L WITH ACUTE
1266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_cacute,                      0x0107},  // LATIN SMALL LETTER C WITH ACUTE
1276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ccaron,                      0x010D},  // LATIN SMALL LETTER C WITH CARON
1286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_eogonek,                     0x0119},  // LATIN SMALL LETTER E WITH OGONEK
1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ecaron,                      0x011B},  // LATIN SMALL LETTER E WITH CARON
1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_dcaron,                      0x010F},  // LATIN SMALL LETTER D WITH CARON
1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_dstroke,                     0x0111},  // LATIN SMALL LETTER D WITH STROKE
1326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_nacute,                      0x0144},  // LATIN SMALL LETTER N WITH ACUTE
1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ncaron,                      0x0148},  // LATIN SMALL LETTER N WITH CARON
1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_odoubleacute,                0x0151},  // LATIN SMALL LETTER O WITH DOUBLE ACUTE
1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rcaron,                      0x0159},  // LATIN SMALL LETTER R WITH CARON
1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_uring,                       0x016F},  // LATIN SMALL LETTER U WITH RING ABOVE
1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_udoubleacute,                0x0171},  // LATIN SMALL LETTER U WITH DOUBLE ACUTE
1386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_tcedilla,                    0x0163},  // LATIN SMALL LETTER T WITH CEDILLA
1396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_abovedot,                    0x02D9},  // DOT ABOVE
1406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Latin 3
1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Hstroke,                     0x0126},  // LATIN CAPITAL LETTER H WITH STROKE
1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Hcircumflex,                 0x0124},  // LATIN CAPITAL LETTER H WITH CIRCUMFLEX
1446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Iabovedot,                   0x0130},  // LATIN CAPITAL LETTER I WITH DOT ABOVE
1456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Gbreve,                      0x011E},  // LATIN CAPITAL LETTER G WITH BREVE
1466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Jcircumflex,                 0x0134},  // LATIN CAPITAL LETTER J WITH CIRCUMFLEX
1476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hstroke,                     0x0127},  // LATIN SMALL LETTER H WITH STROKE
1486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hcircumflex,                 0x0125},  // LATIN SMALL LETTER H WITH CIRCUMFLEX
1496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_idotless,                    0x0131},  // LATIN SMALL LETTER DOTLESS I
1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_gbreve,                      0x011F},  // LATIN SMALL LETTER G WITH BREVE
1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_jcircumflex,                 0x0135},  // LATIN SMALL LETTER J WITH CIRCUMFLEX
1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cabovedot,                   0x010A},  // LATIN CAPITAL LETTER C WITH DOT ABOVE
1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ccircumflex,                 0x0108},  // LATIN CAPITAL LETTER C WITH CIRCUMFLEX
1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Gabovedot,                   0x0120},  // LATIN CAPITAL LETTER G WITH DOT ABOVE
1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Gcircumflex,                 0x011C},  // LATIN CAPITAL LETTER G WITH CIRCUMFLEX
1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ubreve,                      0x016C},  // LATIN CAPITAL LETTER U WITH BREVE
1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Scircumflex,                 0x015C},  // LATIN CAPITAL LETTER S WITH CIRCUMFLEX
1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_cabovedot,                   0x010B},  // LATIN SMALL LETTER C WITH DOT ABOVE
1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ccircumflex,                 0x0109},  // LATIN SMALL LETTER C WITH CIRCUMFLEX
1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_gabovedot,                   0x0121},  // LATIN SMALL LETTER G WITH DOT ABOVE
1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_gcircumflex,                 0x011D},  // LATIN SMALL LETTER G WITH CIRCUMFLEX
1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ubreve,                      0x016D},  // LATIN SMALL LETTER U WITH BREVE
1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_scircumflex,                 0x015D},  // LATIN SMALL LETTER S WITH CIRCUMFLEX
1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Latin 4
1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kra,                         0x0138},  // LATIN SMALL LETTER KRA
1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Rcedilla,                    0x0156},  // LATIN CAPITAL LETTER R WITH CEDILLA
1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Itilde,                      0x0128},  // LATIN CAPITAL LETTER I WITH TILDE
1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Lcedilla,                    0x013B},  // LATIN CAPITAL LETTER L WITH CEDILLA
1706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Emacron,                     0x0112},  // LATIN CAPITAL LETTER E WITH MACRON
1716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Gcedilla,                    0x0122},  // LATIN CAPITAL LETTER G WITH CEDILLA
1726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Tslash,                      0x0166},  // LATIN CAPITAL LETTER T WITH STROKE
1736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rcedilla,                    0x0157},  // LATIN SMALL LETTER R WITH CEDILLA
1746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_itilde,                      0x0129},  // LATIN SMALL LETTER I WITH TILDE
1756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_lcedilla,                    0x013C},  // LATIN SMALL LETTER L WITH CEDILLA
1766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_emacron,                     0x0113},  // LATIN SMALL LETTER E WITH MACRON
1776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_gcedilla,                    0x0123},  // LATIN SMALL LETTER G WITH CEDILLA
1786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_tslash,                      0x0167},  // LATIN SMALL LETTER T WITH STROKE
1796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ENG,                         0x014A},  // LATIN CAPITAL LETTER ENG
1806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_eng,                         0x014B},  // LATIN SMALL LETTER ENG
1816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Amacron,                     0x0100},  // LATIN CAPITAL LETTER A WITH MACRON
1826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Iogonek,                     0x012E},  // LATIN CAPITAL LETTER I WITH OGONEK
1836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Eabovedot,                   0x0116},  // LATIN CAPITAL LETTER E WITH DOT ABOVE
1846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Imacron,                     0x012A},  // LATIN CAPITAL LETTER I WITH MACRON
1856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ncedilla,                    0x0145},  // LATIN CAPITAL LETTER N WITH CEDILLA
1866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Omacron,                     0x014C},  // LATIN CAPITAL LETTER O WITH MACRON
1876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Kcedilla,                    0x0136},  // LATIN CAPITAL LETTER K WITH CEDILLA
1886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Uogonek,                     0x0172},  // LATIN CAPITAL LETTER U WITH OGONEK
1896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Utilde,                      0x0168},  // LATIN CAPITAL LETTER U WITH TILDE
1906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Umacron,                     0x016A},  // LATIN CAPITAL LETTER U WITH MACRON
1916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_amacron,                     0x0101},  // LATIN SMALL LETTER A WITH MACRON
1926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_iogonek,                     0x012F},  // LATIN SMALL LETTER I WITH OGONEK
1936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_eabovedot,                   0x0117},  // LATIN SMALL LETTER E WITH DOT ABOVE
1946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_imacron,                     0x012B},  // LATIN SMALL LETTER I WITH MACRON
1956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ncedilla,                    0x0146},  // LATIN SMALL LETTER N WITH CEDILLA
1966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_omacron,                     0x014D},  // LATIN SMALL LETTER O WITH MACRON
1976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kcedilla,                    0x0137},  // LATIN SMALL LETTER K WITH CEDILLA
1986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_uogonek,                     0x0173},  // LATIN SMALL LETTER U WITH OGONEK
1996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_utilde,                      0x0169},  // LATIN SMALL LETTER U WITH TILDE
2006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_umacron,                     0x016B},  // LATIN SMALL LETTER U WITH MACRON
2016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Latin 8 KeySyms map 1:1 to Unicode
2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Latin 9
2056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_OE,                          0x0152},  // LATIN CAPITAL LIGATURE OE
2066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_oe,                          0x0153},  // LATIN SMALL LIGATURE OE
2076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ydiaeresis,                  0x0178},  // LATIN CAPITAL LETTER Y WITH DIAERESIS
2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Katakana
2106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_overline,                    0x203E},  // OVERLINE
2116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_fullstop,               0x3002},  // IDEOGRAPHIC FULL STOP
2126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_openingbracket,         0x300C},  // LEFT CORNER BRACKET
2136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_closingbracket,         0x300D},  // RIGHT CORNER BRACKET
2146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_comma,                  0x3001},  // IDEOGRAPHIC COMMA
2156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_conjunctive,            0x30FB},  // KATAKANA MIDDLE DOT
2166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_WO,                     0x30F2},  // KATAKANA LETTER WO
2176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_a,                      0x30A1},  // KATAKANA LETTER SMALL A
2186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_i,                      0x30A3},  // KATAKANA LETTER SMALL I
2196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_u,                      0x30A5},  // KATAKANA LETTER SMALL U
2206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_e,                      0x30A7},  // KATAKANA LETTER SMALL E
2216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_o,                      0x30A9},  // KATAKANA LETTER SMALL O
2226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_ya,                     0x30E3},  // KATAKANA LETTER SMALL YA
2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_yu,                     0x30E5},  // KATAKANA LETTER SMALL YU
2246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_yo,                     0x30E7},  // KATAKANA LETTER SMALL YO
2256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_tsu,                    0x30C3},  // KATAKANA LETTER SMALL TU
2266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_prolongedsound,              0x30FC},  // KATAKANA-HIRAGANA PROLONGED SOUND MARK
2276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_A,                      0x30A2},  // KATAKANA LETTER A
2286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_I,                      0x30A4},  // KATAKANA LETTER I
2296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_U,                      0x30A6},  // KATAKANA LETTER U
2306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_E,                      0x30A8},  // KATAKANA LETTER E
2316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_O,                      0x30AA},  // KATAKANA LETTER O
2326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_KA,                     0x30AB},  // KATAKANA LETTER KA
2336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_KI,                     0x30AD},  // KATAKANA LETTER KI
2346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_KU,                     0x30AF},  // KATAKANA LETTER KU
2356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_KE,                     0x30B1},  // KATAKANA LETTER KE
2366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_KO,                     0x30B3},  // KATAKANA LETTER KO
2376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_SA,                     0x30B5},  // KATAKANA LETTER SA
2386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_SHI,                    0x30B7},  // KATAKANA LETTER SI
2396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_SU,                     0x30B9},  // KATAKANA LETTER SU
2406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_SE,                     0x30BB},  // KATAKANA LETTER SE
2416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_SO,                     0x30BD},  // KATAKANA LETTER SO
2426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_TA,                     0x30BF},  // KATAKANA LETTER TA
2436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_CHI,                    0x30C1},  // KATAKANA LETTER TI
2446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_TSU,                    0x30C4},  // KATAKANA LETTER TU
2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_TE,                     0x30C6},  // KATAKANA LETTER TE
2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_TO,                     0x30C8},  // KATAKANA LETTER TO
2476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_NA,                     0x30CA},  // KATAKANA LETTER NA
2486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_NI,                     0x30CB},  // KATAKANA LETTER NI
2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_NU,                     0x30CC},  // KATAKANA LETTER NU
2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_NE,                     0x30CD},  // KATAKANA LETTER NE
2516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_NO,                     0x30CE},  // KATAKANA LETTER NO
2526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_HA,                     0x30CF},  // KATAKANA LETTER HA
2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_HI,                     0x30D2},  // KATAKANA LETTER HI
2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_FU,                     0x30D5},  // KATAKANA LETTER HU
2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_HE,                     0x30D8},  // KATAKANA LETTER HE
2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_HO,                     0x30DB},  // KATAKANA LETTER HO
2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_MA,                     0x30DE},  // KATAKANA LETTER MA
2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_MI,                     0x30DF},  // KATAKANA LETTER MI
2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_MU,                     0x30E0},  // KATAKANA LETTER MU
2606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_ME,                     0x30E1},  // KATAKANA LETTER ME
2616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_MO,                     0x30E2},  // KATAKANA LETTER MO
2626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_YA,                     0x30E4},  // KATAKANA LETTER YA
2636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_YU,                     0x30E6},  // KATAKANA LETTER YU
2646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_YO,                     0x30E8},  // KATAKANA LETTER YO
2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_RA,                     0x30E9},  // KATAKANA LETTER RA
2666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_RI,                     0x30EA},  // KATAKANA LETTER RI
2676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_RU,                     0x30EB},  // KATAKANA LETTER RU
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_RE,                     0x30EC},  // KATAKANA LETTER RE
2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_RO,                     0x30ED},  // KATAKANA LETTER RO
2706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_WA,                     0x30EF},  // KATAKANA LETTER WA
2716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_kana_N,                      0x30F3},  // KATAKANA LETTER N
2726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_voicedsound,                 0x309B},  // KATAKANA-HIRAGANA VOICED SOUND MARK
2736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_semivoicedsound,             0x309C},  // KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
2746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Arabic KeySyms partially map 1:1 to Unicode
2766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_comma,                0x060C},  // ARABIC COMMA
2776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_semicolon,            0x061B},  // ARABIC SEMICOLON
2786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_question_mark,        0x061F},  // ARABIC QUESTION MARK
2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_hamza,                0x0621},  // ARABIC LETTER HAMZA
2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_maddaonalef,          0x0622},  // ARABIC LETTER ALEF WITH MADDA ABOVE
2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_hamzaonalef,          0x0623},  // ARABIC LETTER ALEF WITH HAMZA ABOVE
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_hamzaonwaw,           0x0624},  // ARABIC LETTER WAW WITH HAMZA ABOVE
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_hamzaunderalef,       0x0625},  // ARABIC LETTER ALEF WITH HAMZA BELOW
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_hamzaonyeh,           0x0626},  // ARABIC LETTER YEH WITH HAMZA ABOVE
2856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_alef,                 0x0627},  // ARABIC LETTER ALEF
2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_beh,                  0x0628},  // ARABIC LETTER BEH
2876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_tehmarbuta,           0x0629},  // ARABIC LETTER TEH MARBUTA
2886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_teh,                  0x062A},  // ARABIC LETTER TEH
2896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_theh,                 0x062B},  // ARABIC LETTER THEH
2906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_jeem,                 0x062C},  // ARABIC LETTER JEEM
2916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_hah,                  0x062D},  // ARABIC LETTER HAH
2926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_khah,                 0x062E},  // ARABIC LETTER KHAH
2936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_dal,                  0x062F},  // ARABIC LETTER DAL
2946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_thal,                 0x0630},  // ARABIC LETTER THAL
2956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_ra,                   0x0631},  // ARABIC LETTER REH
2966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_zain,                 0x0632},  // ARABIC LETTER ZAIN
2976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_seen,                 0x0633},  // ARABIC LETTER SEEN
2986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_sheen,                0x0634},  // ARABIC LETTER SHEEN
2996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_sad,                  0x0635},  // ARABIC LETTER SAD
3006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_dad,                  0x0636},  // ARABIC LETTER DAD
3016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_tah,                  0x0637},  // ARABIC LETTER TAH
3026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_zah,                  0x0638},  // ARABIC LETTER ZAH
3036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_ain,                  0x0639},  // ARABIC LETTER AIN
3046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_ghain,                0x063A},  // ARABIC LETTER GHAIN
3056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_tatweel,              0x0640},  // ARABIC TATWEEL
3066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_feh,                  0x0641},  // ARABIC LETTER FEH
3076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_qaf,                  0x0642},  // ARABIC LETTER QAF
3086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_kaf,                  0x0643},  // ARABIC LETTER KAF
3096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_lam,                  0x0644},  // ARABIC LETTER LAM
3106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_meem,                 0x0645},  // ARABIC LETTER MEEM
3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_noon,                 0x0646},  // ARABIC LETTER NOON
3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_ha,                   0x0647},  // ARABIC LETTER HEH
3136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_waw,                  0x0648},  // ARABIC LETTER WAW
3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_alefmaksura,          0x0649},  // ARABIC LETTER ALEF MAKSURA
3156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_yeh,                  0x064A},  // ARABIC LETTER YEH
3166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_fathatan,             0x064B},  // ARABIC FATHATAN
3176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_dammatan,             0x064C},  // ARABIC DAMMATAN
3186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_kasratan,             0x064D},  // ARABIC KASRATAN
3196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_fatha,                0x064E},  // ARABIC FATHA
3206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_damma,                0x064F},  // ARABIC DAMMA
3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_kasra,                0x0650},  // ARABIC KASRA
3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_shadda,               0x0651},  // ARABIC SHADDA
3236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Arabic_sukun,                0x0652},  // ARABIC SUKUN
3246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
3256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Cyrillic KeySyms partially map 1:1 to Unicode
3266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Serbian_dje,                 0x0452},  // CYRILLIC SMALL LETTER DJE
3276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Macedonia_gje,               0x0453},  // CYRILLIC SMALL LETTER GJE
3286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_io,                 0x0451},  // CYRILLIC SMALL LETTER IO
3296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ukrainian_ie,                0x0454},  // CYRILLIC SMALL LETTER UKRAINIAN IE
3306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Macedonia_dse,               0x0455},  // CYRILLIC SMALL LETTER DZE
3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ukrainian_i,                 0x0456},  // CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I
3326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ukrainian_yi,                0x0457},  // CYRILLIC SMALL LETTER YI
3336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_je,                 0x0458},  // CYRILLIC SMALL LETTER JE
3346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_lje,                0x0459},  // CYRILLIC SMALL LETTER LJE
3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_nje,                0x045A},  // CYRILLIC SMALL LETTER NJE
3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Serbian_tshe,                0x045B},  // CYRILLIC SMALL LETTER TSHE
3376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Macedonia_kje,               0x045C},  // CYRILLIC SMALL LETTER KJE
3386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ukrainian_ghe_with_upturn,   0x0491},  // CYRILLIC SMALL LETTER GHE WITH UPTURN
3396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Byelorussian_shortu,         0x045E},  // CYRILLIC SMALL LETTER SHORT U
3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_dzhe,               0x045F},  // CYRILLIC SMALL LETTER DZHE
3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_numerosign,                  0x2116},  // NUMERO SIGN
3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Serbian_DJE,                 0x0402},  // CYRILLIC CAPITAL LETTER DJE
3436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Macedonia_GJE,               0x0403},  // CYRILLIC CAPITAL LETTER GJE
3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_IO,                 0x0401},  // CYRILLIC CAPITAL LETTER IO
3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ukrainian_IE,                0x0404},  // CYRILLIC CAPITAL LETTER UKRAINIAN IE
3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Macedonia_DSE,               0x0405},  // CYRILLIC CAPITAL LETTER DZE
3476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ukrainian_I,                 0x0406},  // CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I
3486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ukrainian_YI,                0x0407},  // CYRILLIC CAPITAL LETTER YI
3496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_JE,                 0x0408},  // CYRILLIC CAPITAL LETTER JE
3506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_LJE,                0x0409},  // CYRILLIC CAPITAL LETTER LJE
3516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_NJE,                0x040A},  // CYRILLIC CAPITAL LETTER NJE
3526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Serbian_TSHE,                0x040B},  // CYRILLIC CAPITAL LETTER TSHE
3536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Macedonia_KJE,               0x040C},  // CYRILLIC CAPITAL LETTER KJE
3546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Ukrainian_GHE_WITH_UPTURN,   0x0490},  // CYRILLIC CAPITAL LETTER GHE WITH UPTURN
3556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Byelorussian_SHORTU,         0x040E},  // CYRILLIC CAPITAL LETTER SHORT U
3566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_DZHE,               0x040F},  // CYRILLIC CAPITAL LETTER DZHE
3576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_yu,                 0x044E},  // CYRILLIC SMALL LETTER YU
3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_a,                  0x0430},  // CYRILLIC SMALL LETTER A
3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_be,                 0x0431},  // CYRILLIC SMALL LETTER BE
3606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_tse,                0x0446},  // CYRILLIC SMALL LETTER TSE
3616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_de,                 0x0434},  // CYRILLIC SMALL LETTER DE
3626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ie,                 0x0435},  // CYRILLIC SMALL LETTER IE
3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ef,                 0x0444},  // CYRILLIC SMALL LETTER EF
3646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ghe,                0x0433},  // CYRILLIC SMALL LETTER GHE
3656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ha,                 0x0445},  // CYRILLIC SMALL LETTER HA
3666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_i,                  0x0438},  // CYRILLIC SMALL LETTER I
3676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_shorti,             0x0439},  // CYRILLIC SMALL LETTER SHORT I
3686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ka,                 0x043A},  // CYRILLIC SMALL LETTER KA
3696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_el,                 0x043B},  // CYRILLIC SMALL LETTER EL
3706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_em,                 0x043C},  // CYRILLIC SMALL LETTER EM
3716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_en,                 0x043D},  // CYRILLIC SMALL LETTER EN
3726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_o,                  0x043E},  // CYRILLIC SMALL LETTER O
3736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_pe,                 0x043F},  // CYRILLIC SMALL LETTER PE
3746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ya,                 0x044F},  // CYRILLIC SMALL LETTER YA
3756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_er,                 0x0440},  // CYRILLIC SMALL LETTER ER
3766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_es,                 0x0441},  // CYRILLIC SMALL LETTER ES
3776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_te,                 0x0442},  // CYRILLIC SMALL LETTER TE
3786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_u,                  0x0443},  // CYRILLIC SMALL LETTER U
3796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_zhe,                0x0436},  // CYRILLIC SMALL LETTER ZHE
3806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ve,                 0x0432},  // CYRILLIC SMALL LETTER VE
3816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_softsign,           0x044C},  // CYRILLIC SMALL LETTER SOFT SIGN
3826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_yeru,               0x044B},  // CYRILLIC SMALL LETTER YERU
3836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ze,                 0x0437},  // CYRILLIC SMALL LETTER ZE
3846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_sha,                0x0448},  // CYRILLIC SMALL LETTER SHA
3856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_e,                  0x044D},  // CYRILLIC SMALL LETTER E
3866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_shcha,              0x0449},  // CYRILLIC SMALL LETTER SHCHA
3876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_che,                0x0447},  // CYRILLIC SMALL LETTER CHE
3886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_hardsign,           0x044A},  // CYRILLIC SMALL LETTER HARD SIGN
3896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_YU,                 0x042E},  // CYRILLIC CAPITAL LETTER YU
3906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_A,                  0x0410},  // CYRILLIC CAPITAL LETTER A
3916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_BE,                 0x0411},  // CYRILLIC CAPITAL LETTER BE
3926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_TSE,                0x0426},  // CYRILLIC CAPITAL LETTER TSE
3936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_DE,                 0x0414},  // CYRILLIC CAPITAL LETTER DE
3946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_IE,                 0x0415},  // CYRILLIC CAPITAL LETTER IE
3956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_EF,                 0x0424},  // CYRILLIC CAPITAL LETTER EF
3966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_GHE,                0x0413},  // CYRILLIC CAPITAL LETTER GHE
3976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_HA,                 0x0425},  // CYRILLIC CAPITAL LETTER HA
3986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_I,                  0x0418},  // CYRILLIC CAPITAL LETTER I
3996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_SHORTI,             0x0419},  // CYRILLIC CAPITAL LETTER SHORT I
4006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_KA,                 0x041A},  // CYRILLIC CAPITAL LETTER KA
4016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_EL,                 0x041B},  // CYRILLIC CAPITAL LETTER EL
4026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_EM,                 0x041C},  // CYRILLIC CAPITAL LETTER EM
4036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_EN,                 0x041D},  // CYRILLIC CAPITAL LETTER EN
4046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_O,                  0x041E},  // CYRILLIC CAPITAL LETTER O
4056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_PE,                 0x041F},  // CYRILLIC CAPITAL LETTER PE
4066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_YA,                 0x042F},  // CYRILLIC CAPITAL LETTER YA
4076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ER,                 0x0420},  // CYRILLIC CAPITAL LETTER ER
4086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ES,                 0x0421},  // CYRILLIC CAPITAL LETTER ES
4096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_TE,                 0x0422},  // CYRILLIC CAPITAL LETTER TE
4106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_U,                  0x0423},  // CYRILLIC CAPITAL LETTER U
4116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ZHE,                0x0416},  // CYRILLIC CAPITAL LETTER ZHE
4126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_VE,                 0x0412},  // CYRILLIC CAPITAL LETTER VE
4136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_SOFTSIGN,           0x042C},  // CYRILLIC CAPITAL LETTER SOFT SIGN
4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_YERU,               0x042B},  // CYRILLIC CAPITAL LETTER YERU
4156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_ZE,                 0x0417},  // CYRILLIC CAPITAL LETTER ZE
4166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_SHA,                0x0428},  // CYRILLIC CAPITAL LETTER SHA
4176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_E,                  0x042D},  // CYRILLIC CAPITAL LETTER E
4186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_SHCHA,              0x0429},  // CYRILLIC CAPITAL LETTER SHCHA
4196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_CHE,                0x0427},  // CYRILLIC CAPITAL LETTER CHE
4206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Cyrillic_HARDSIGN,           0x042A},  // CYRILLIC CAPITAL LETTER HARD SIGN
4216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Greek
4236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_ALPHAaccent,           0x0386},  // GREEK CAPITAL LETTER ALPHA WITH TONOS
4246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_EPSILONaccent,         0x0388},  // GREEK CAPITAL LETTER EPSILON WITH TONOS
4256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_ETAaccent,             0x0389},  // GREEK CAPITAL LETTER ETA WITH TONOS
4266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_IOTAaccent,            0x038A},  // GREEK CAPITAL LETTER IOTA WITH TONOS
4276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_IOTAdieresis,          0x03AA},  // GREEK CAPITAL LETTER IOTA WITH DIALYTIKA
4286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_OMICRONaccent,         0x038C},  // GREEK CAPITAL LETTER OMICRON WITH TONOS
4296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_UPSILONaccent,         0x038E},  // GREEK CAPITAL LETTER UPSILON WITH TONOS
4306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_UPSILONdieresis,       0x03AB},  // GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
4316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_OMEGAaccent,           0x038F},  // GREEK CAPITAL LETTER OMEGA WITH TONOS
4326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_accentdieresis,        0x0385},  // GREEK DIALYTIKA TONOS
4336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_horizbar,              0x2015},  // HORIZONTAL BAR
4346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_alphaaccent,           0x03AC},  // GREEK SMALL LETTER ALPHA WITH TONOS
4356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_epsilonaccent,         0x03AD},  // GREEK SMALL LETTER EPSILON WITH TONOS
4366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_etaaccent,             0x03AE},  // GREEK SMALL LETTER ETA WITH TONOS
4376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_iotaaccent,            0x03AF},  // GREEK SMALL LETTER IOTA WITH TONOS
4386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_iotadieresis,          0x03CA},  // GREEK SMALL LETTER IOTA WITH DIALYTIKA
4396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_iotaaccentdieresis,    0x0390},  // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
4406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_omicronaccent,         0x03CC},  // GREEK SMALL LETTER OMICRON WITH TONOS
4416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_upsilonaccent,         0x03CD},  // GREEK SMALL LETTER UPSILON WITH TONOS
4426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_upsilondieresis,       0x03CB},  // GREEK SMALL LETTER UPSILON WITH DIALYTIKA
4436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_upsilonaccentdieresis, 0x03B0},  // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
4446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_omegaaccent,           0x03CE},  // GREEK SMALL LETTER OMEGA WITH TONOS
4456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_ALPHA,                 0x0391},  // GREEK CAPITAL LETTER ALPHA
4466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_BETA,                  0x0392},  // GREEK CAPITAL LETTER BETA
4476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_GAMMA,                 0x0393},  // GREEK CAPITAL LETTER GAMMA
4486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_DELTA,                 0x0394},  // GREEK CAPITAL LETTER DELTA
4496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_EPSILON,               0x0395},  // GREEK CAPITAL LETTER EPSILON
4506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_ZETA,                  0x0396},  // GREEK CAPITAL LETTER ZETA
4516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_ETA,                   0x0397},  // GREEK CAPITAL LETTER ETA
4526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_THETA,                 0x0398},  // GREEK CAPITAL LETTER THETA
4536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_IOTA,                  0x0399},  // GREEK CAPITAL LETTER IOTA
4546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_KAPPA,                 0x039A},  // GREEK CAPITAL LETTER KAPPA
4556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_LAMDA,                 0x039B},  // GREEK CAPITAL LETTER LAMDA
4566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_LAMBDA,                0x039B},  // GREEK CAPITAL LETTER LAMDA
4576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_MU,                    0x039C},  // GREEK CAPITAL LETTER MU
4586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_NU,                    0x039D},  // GREEK CAPITAL LETTER NU
4596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_XI,                    0x039E},  // GREEK CAPITAL LETTER XI
4606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_OMICRON,               0x039F},  // GREEK CAPITAL LETTER OMICRON
4616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_PI,                    0x03A0},  // GREEK CAPITAL LETTER PI
4626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_RHO,                   0x03A1},  // GREEK CAPITAL LETTER RHO
4636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_SIGMA,                 0x03A3},  // GREEK CAPITAL LETTER SIGMA
4646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_TAU,                   0x03A4},  // GREEK CAPITAL LETTER TAU
4656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_UPSILON,               0x03A5},  // GREEK CAPITAL LETTER UPSILON
4666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_PHI,                   0x03A6},  // GREEK CAPITAL LETTER PHI
4676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_CHI,                   0x03A7},  // GREEK CAPITAL LETTER CHI
4686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_PSI,                   0x03A8},  // GREEK CAPITAL LETTER PSI
4696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_OMEGA,                 0x03A9},  // GREEK CAPITAL LETTER OMEGA
4706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_alpha,                 0x03B1},  // GREEK SMALL LETTER ALPHA
4716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_beta,                  0x03B2},  // GREEK SMALL LETTER BETA
4726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_gamma,                 0x03B3},  // GREEK SMALL LETTER GAMMA
4736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_delta,                 0x03B4},  // GREEK SMALL LETTER DELTA
4746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_epsilon,               0x03B5},  // GREEK SMALL LETTER EPSILON
4756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_zeta,                  0x03B6},  // GREEK SMALL LETTER ZETA
4766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_eta,                   0x03B7},  // GREEK SMALL LETTER ETA
4776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_theta,                 0x03B8},  // GREEK SMALL LETTER THETA
4786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_iota,                  0x03B9},  // GREEK SMALL LETTER IOTA
4796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_kappa,                 0x03BA},  // GREEK SMALL LETTER KAPPA
4806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_lamda,                 0x03BB},  // GREEK SMALL LETTER LAMDA
4816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_lambda,                0x03BB},  // GREEK SMALL LETTER LAMDA
4826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_mu,                    0x03BC},  // GREEK SMALL LETTER MU
4836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_nu,                    0x03BD},  // GREEK SMALL LETTER NU
4846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_xi,                    0x03BE},  // GREEK SMALL LETTER XI
4856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_omicron,               0x03BF},  // GREEK SMALL LETTER OMICRON
4866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_pi,                    0x03C0},  // GREEK SMALL LETTER PI
4876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_rho,                   0x03C1},  // GREEK SMALL LETTER RHO
4886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_sigma,                 0x03C3},  // GREEK SMALL LETTER SIGMA
4896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_finalsmallsigma,       0x03C2},  // GREEK SMALL LETTER FINAL SIGMA
4906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_tau,                   0x03C4},  // GREEK SMALL LETTER TAU
4916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_upsilon,               0x03C5},  // GREEK SMALL LETTER UPSILON
4926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_phi,                   0x03C6},  // GREEK SMALL LETTER PHI
4936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_chi,                   0x03C7},  // GREEK SMALL LETTER CHI
4946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_psi,                   0x03C8},  // GREEK SMALL LETTER PSI
4956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Greek_omega,                 0x03C9},  // GREEK SMALL LETTER OMEGA
4966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
4976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Technical
4986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftradical,                 0x23B7},  // RADICAL SYMBOL BOTTOM
4996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_topleftradical,              0x250C},  // BOX DRAWINGS LIGHT DOWN AND RIGHT
5006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_horizconnector,              0x2500},  // BOX DRAWINGS LIGHT HORIZONTAL
5016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_topintegral,                 0x2320},  // TOP HALF INTEGRAL
5026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_botintegral,                 0x2321},  // BOTTOM HALF INTEGRAL
5036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_vertconnector,               0x2502},  // BOX DRAWINGS LIGHT VERTICAL
5046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_topleftsqbracket,            0x23A1},  // LEFT SQUARE BRACKET UPPER CORNER
5056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_botleftsqbracket,            0x23A3},  // LEFT SQUARE BRACKET LOWER CORNER
5066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_toprightsqbracket,           0x23A4},  // RIGHT SQUARE BRACKET UPPER CORNER
5076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_botrightsqbracket,           0x23A6},  // RIGHT SQUARE BRACKET LOWER CORNER
5086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_topleftparens,               0x239B},  // LEFT PARENTHESIS UPPER HOOK
5096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_botleftparens,               0x239D},  // LEFT PARENTHESIS LOWER HOOK
5106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_toprightparens,              0x239E},  // RIGHT PARENTHESIS UPPER HOOK
5116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_botrightparens,              0x23A0},  // RIGHT PARENTHESIS LOWER HOOK
5126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftmiddlecurlybrace,        0x23A8},  // LEFT CURLY BRACKET MIDDLE PIECE
5136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightmiddlecurlybrace,       0x23AC},  // RIGHT CURLY BRACKET MIDDLE PIECE
5146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_lessthanequal,               0x2264},  // LESS-THAN OR EQUAL TO
5156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_notequal,                    0x2260},  // NOT EQUAL TO
5166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_greaterthanequal,            0x2265},  // GREATER-THAN OR EQUAL TO
5176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_integral,                    0x222B},  // INTEGRAL
5186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_therefore,                   0x2234},  // THEREFORE
5196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_variation,                   0x221D},  // PROPORTIONAL TO
5206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_infinity,                    0x221E},  // INFINITY
5216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_nabla,                       0x2207},  // NABLA
5226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_approximate,                 0x223C},  // TILDE OPERATOR
5236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_similarequal,                0x2243},  // ASYMPTOTICALLY EQUAL TO
5246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ifonlyif,                    0x21D4},  // LEFT RIGHT DOUBLE ARROW
5256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_implies,                     0x21D2},  // RIGHTWARDS DOUBLE ARROW
5266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_identical,                   0x2261},  // IDENTICAL TO
5276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_radical,                     0x221A},  // SQUARE ROOT
5286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_includedin,                  0x2282},  // SUBSET OF
5296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_includes,                    0x2283},  // SUPERSET OF
5306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_intersection,                0x2229},  // INTERSECTION
5316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_union,                       0x222A},  // UNION
5326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_logicaland,                  0x2227},  // LOGICAL AND
5336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_logicalor,                   0x2228},  // LOGICAL OR
5346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_partialderivative,           0x2202},  // PARTIAL DIFFERENTIAL
5356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_function,                    0x0192},  // LATIN SMALL LETTER F WITH HOOK
5366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftarrow,                   0x2190},  // LEFTWARDS ARROW
5376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_uparrow,                     0x2191},  // UPWARDS ARROW
5386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightarrow,                  0x2192},  // RIGHTWARDS ARROW
5396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_downarrow,                   0x2193},  // DOWNWARDS ARROW
5406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Special
5426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_soliddiamond,                0x25C6},  // BLACK DIAMOND
5436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_checkerboard,                0x2592},  // MEDIUM SHADE
5446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ht,                          0x2409},  // SYMBOL FOR HORIZONTAL TABULATION
5456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ff,                          0x240C},  // SYMBOL FOR FORM FEED
5466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_cr,                          0x240D},  // SYMBOL FOR CARRIAGE RETURN
5476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_lf,                          0x240A},  // SYMBOL FOR LINE FEED
5486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_nl,                          0x2424},  // SYMBOL FOR NEWLINE
5496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_vt,                          0x240B},  // SYMBOL FOR VERTICAL TABULATION
5506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_lowrightcorner,              0x2518},  // BOX DRAWINGS LIGHT UP AND LEFT
5516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_uprightcorner,               0x2510},  // BOX DRAWINGS LIGHT DOWN AND LEFT
5526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_upleftcorner,                0x250C},  // BOX DRAWINGS LIGHT DOWN AND RIGHT
5536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_lowleftcorner,               0x2514},  // BOX DRAWINGS LIGHT UP AND RIGHT
5546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_crossinglines,               0x253C},  // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
5556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_horizlinescan1,              0x23BA},  // HORIZONTAL SCAN LINE-1
5566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_horizlinescan3,              0x23BB},  // HORIZONTAL SCAN LINE-3
5576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_horizlinescan5,              0x2500},  // BOX DRAWINGS LIGHT HORIZONTAL
5586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_horizlinescan7,              0x23BC},  // HORIZONTAL SCAN LINE-7
5596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_horizlinescan9,              0x23BD},  // HORIZONTAL SCAN LINE-9
5606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftt,                       0x251C},  // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
5616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightt,                      0x2524},  // BOX DRAWINGS LIGHT VERTICAL AND LEFT
5626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_bott,                        0x2534},  // BOX DRAWINGS LIGHT UP AND HORIZONTAL
5636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_topt,                        0x252C},  // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
5646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_vertbar,                     0x2502},  // BOX DRAWINGS LIGHT VERTICAL
5656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
5666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Publishing
5676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_emspace,                     0x2003},  // EM SPACE
5686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_enspace,                     0x2002},  // EN SPACE
5696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_em3space,                    0x2004},  // THREE-PER-EM SPACE
5706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_em4space,                    0x2005},  // FOUR-PER-EM SPACE
5716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_digitspace,                  0x2007},  // FIGURE SPACE
5726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_punctspace,                  0x2008},  // PUNCTUATION SPACE
5736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_thinspace,                   0x2009},  // THIN SPACE
5746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hairspace,                   0x200A},  // HAIR SPACE
5756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_emdash,                      0x2014},  // EM DASH
5766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_endash,                      0x2013},  // EN DASH
5776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_signifblank,                 0x2423},  // OPEN BOX
5786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ellipsis,                    0x2026},  // HORIZONTAL ELLIPSIS
5796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_doubbaselinedot,             0x2025},  // TWO DOT LEADER
5806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_onethird,                    0x2153},  // VULGAR FRACTION ONE THIRD
5816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_twothirds,                   0x2154},  // VULGAR FRACTION TWO THIRDS
5826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_onefifth,                    0x2155},  // VULGAR FRACTION ONE FIFTH
5836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_twofifths,                   0x2156},  // VULGAR FRACTION TWO FIFTHS
5846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_threefifths,                 0x2157},  // VULGAR FRACTION THREE FIFTHS
5856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_fourfifths,                  0x2158},  // VULGAR FRACTION FOUR FIFTHS
5866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_onesixth,                    0x2159},  // VULGAR FRACTION ONE SIXTH
5876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_fivesixths,                  0x215A},  // VULGAR FRACTION FIVE SIXTHS
5886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_careof,                      0x2105},  // CARE OF
5896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_figdash,                     0x2012},  // FIGURE DASH
5906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftanglebracket,            0x27E8},  // MATHEMATICAL LEFT ANGLE BRACKET
5916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_decimalpoint,                0x002E},  // FULL STOP
5926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightanglebracket,           0x27E9},  // MATHEMATICAL RIGHT ANGLE BRACKET
5936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_oneeighth,                   0x215B},  // VULGAR FRACTION ONE EIGHTH
5946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_threeeighths,                0x215C},  // VULGAR FRACTION THREE EIGHTHS
5956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_fiveeighths,                 0x215D},  // VULGAR FRACTION FIVE EIGHTHS
5966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_seveneighths,                0x215E},  // VULGAR FRACTION SEVEN EIGHTHS
5976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_trademark,                   0x2122},  // TRADE MARK SIGN
5986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_signaturemark,               0x2613},  // SALTIRE
5996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftopentriangle,            0x25C1},  // WHITE LEFT-POINTING TRIANGLE
6006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightopentriangle,           0x25B7},  // WHITE RIGHT-POINTING TRIANGLE
6016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_emopencircle,                0x25CB},  // WHITE CIRCLE
6026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_emopenrectangle,             0x25AF},  // WHITE VERTICAL RECTANGLE
6036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftsinglequotemark,         0x2018},  // LEFT SINGLE QUOTATION MARK
6046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightsinglequotemark,        0x2019},  // RIGHT SINGLE QUOTATION MARK
6056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftdoublequotemark,         0x201C},  // LEFT DOUBLE QUOTATION MARK
6066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightdoublequotemark,        0x201D},  // RIGHT DOUBLE QUOTATION MARK
6076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_prescription,                0x211E},  // PRESCRIPTION TAKE
6086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_minutes,                     0x2032},  // PRIME
6096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_seconds,                     0x2033},  // DOUBLE PRIME
6106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_latincross,                  0x271D},  // LATIN CROSS
6116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_filledrectbullet,            0x25AC},  // BLACK RECTANGLE
6126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_filledlefttribullet,         0x25C0},  // BLACK LEFT-POINTING TRIANGLE
6136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_filledrighttribullet,        0x25B6},  // BLACK RIGHT-POINTING TRIANGLE
6146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_emfilledcircle,              0x25CF},  // BLACK CIRCLE
6156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_emfilledrect,                0x25AE},  // BLACK VERTICAL RECTANGLE
6166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_enopencircbullet,            0x25E6},  // WHITE BULLET
6176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_enopensquarebullet,          0x25AB},  // WHITE SMALL SQUARE
6186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_openrectbullet,              0x25AD},  // WHITE RECTANGLE
6196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_opentribulletup,             0x25B3},  // WHITE UP-POINTING TRIANGLE
6206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_opentribulletdown,           0x25BD},  // WHITE DOWN-POINTING TRIANGLE
6216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_openstar,                    0x2606},  // WHITE STAR
6226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_enfilledcircbullet,          0x2022},  // BULLET
6236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_enfilledsqbullet,            0x25AA},  // BLACK SMALL SQUARE
6246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_filledtribulletup,           0x25B2},  // BLACK UP-POINTING TRIANGLE
6256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_filledtribulletdown,         0x25BC},  // BLACK DOWN-POINTING TRIANGLE
6266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftpointer,                 0x261C},  // WHITE LEFT POINTING INDEX
6276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightpointer,                0x261E},  // WHITE RIGHT POINTING INDEX
6286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_club,                        0x2663},  // BLACK CLUB SUIT
6296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_diamond,                     0x2666},  // BLACK DIAMOND SUIT
6306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_heart,                       0x2665},  // BLACK HEART SUIT
6316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_maltesecross,                0x2720},  // MALTESE CROSS
6326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_dagger,                      0x2020},  // DAGGER
6336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_doubledagger,                0x2021},  // DOUBLE DAGGER
6346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_checkmark,                   0x2713},  // CHECK MARK
6356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_ballotcross,                 0x2717},  // BALLOT X
6366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_musicalsharp,                0x266F},  // MUSIC SHARP SIGN
6376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_musicalflat,                 0x266D},  // MUSIC FLAT SIGN
6386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_malesymbol,                  0x2642},  // MALE SIGN
6396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_femalesymbol,                0x2640},  // FEMALE SIGN
6406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_telephone,                   0x260E},  // BLACK TELEPHONE
6416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_telephonerecorder,           0x2315},  // TELEPHONE RECORDER
6426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_phonographcopyright,         0x2117},  // SOUND RECORDING COPYRIGHT
6436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_caret,                       0x2038},  // CARET
6446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_singlelowquotemark,          0x201A},  // SINGLE LOW-9 QUOTATION MARK
6456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_doublelowquotemark,          0x201E},  // DOUBLE LOW-9 QUOTATION MARK
6466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // APL
6486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftcaret,                   0x003C},  // LESS-THAN SIGN
6496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightcaret,                  0x003E},  // GREATER-THAN SIGN
6506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_downcaret,                   0x2228},  // LOGICAL OR
6516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_upcaret,                     0x2227},  // LOGICAL AND
6526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_overbar,                     0x00AF},  // MACRON
6536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_downtack,                    0x22A4},  // DOWN TACK
6546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_upshoe,                      0x2229},  // INTERSECTION
6556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_downstile,                   0x230A},  // LEFT FLOOR
6566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_underbar,                    0x005F},  // LOW LINE
6576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_jot,                         0x2218},  // RING OPERATOR
6586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_quad,                        0x2395},  // APL FUNCTIONAL SYMBOL QUAD
6596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_uptack,                      0x22A5},  // UP TACK
6606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_circle,                      0x25CB},  // WHITE CIRCLE
6616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_upstile,                     0x2308},  // LEFT CEILING
6626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_downshoe,                    0x222A},  // UNION
6636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_rightshoe,                   0x2283},  // SUPERSET OF
6646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_leftshoe,                    0x2282},  // SUBSET OF
6656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_lefttack,                    0x22A3},  // LEFT TACK
6666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_righttack,                   0x22A2},  // RIGHT TACK
6676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Hebrew
6696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_doublelowline,        0x2017},  // DOUBLE LOW LINE
6706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_aleph,                0x05D0},  // HEBREW LETTER ALEF
6716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_bet,                  0x05D1},  // HEBREW LETTER BET
6726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_gimel,                0x05D2},  // HEBREW LETTER GIMEL
6736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_dalet,                0x05D3},  // HEBREW LETTER DALET
6746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_he,                   0x05D4},  // HEBREW LETTER HE
6756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_waw,                  0x05D5},  // HEBREW LETTER VAV
6766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_zain,                 0x05D6},  // HEBREW LETTER ZAYIN
6776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_chet,                 0x05D7},  // HEBREW LETTER HET
6786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_tet,                  0x05D8},  // HEBREW LETTER TET
6796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_yod,                  0x05D9},  // HEBREW LETTER YOD
6806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_finalkaph,            0x05DA},  // HEBREW LETTER FINAL KAF
6816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_kaph,                 0x05DB},  // HEBREW LETTER KAF
6826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_lamed,                0x05DC},  // HEBREW LETTER LAMED
6836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_finalmem,             0x05DD},  // HEBREW LETTER FINAL MEM
6846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_mem,                  0x05DE},  // HEBREW LETTER MEM
6856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_finalnun,             0x05DF},  // HEBREW LETTER FINAL NUN
6866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_nun,                  0x05E0},  // HEBREW LETTER NUN
6876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_samech,               0x05E1},  // HEBREW LETTER SAMEKH
6886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_ayin,                 0x05E2},  // HEBREW LETTER AYIN
6896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_finalpe,              0x05E3},  // HEBREW LETTER FINAL PE
6906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_pe,                   0x05E4},  // HEBREW LETTER PE
6916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_finalzade,            0x05E5},  // HEBREW LETTER FINAL TSADI
6926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_zade,                 0x05E6},  // HEBREW LETTER TSADI
6936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_qoph,                 0x05E7},  // HEBREW LETTER QOF
6946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_resh,                 0x05E8},  // HEBREW LETTER RESH
6956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_shin,                 0x05E9},  // HEBREW LETTER SHIN
6966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_hebrew_taw,                  0x05EA},  // HEBREW LETTER TAV
6976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
6986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Thai
6996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_kokai,                  0x0E01},  // THAI CHARACTER KO KAI
7006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_khokhai,                0x0E02},  // THAI CHARACTER KHO KHAI
7016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_khokhuat,               0x0E03},  // THAI CHARACTER KHO KHUAT
7026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_khokhwai,               0x0E04},  // THAI CHARACTER KHO KHWAI
7036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_khokhon,                0x0E05},  // THAI CHARACTER KHO KHON
7046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_khorakhang,             0x0E06},  // THAI CHARACTER KHO RAKHANG
7056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_ngongu,                 0x0E07},  // THAI CHARACTER NGO NGU
7066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_chochan,                0x0E08},  // THAI CHARACTER CHO CHAN
7076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_choching,               0x0E09},  // THAI CHARACTER CHO CHING
7086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_chochang,               0x0E0A},  // THAI CHARACTER CHO CHANG
7096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_soso,                   0x0E0B},  // THAI CHARACTER SO SO
7106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_chochoe,                0x0E0C},  // THAI CHARACTER CHO CHOE
7116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_yoying,                 0x0E0D},  // THAI CHARACTER YO YING
7126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_dochada,                0x0E0E},  // THAI CHARACTER DO CHADA
7136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_topatak,                0x0E0F},  // THAI CHARACTER TO PATAK
7146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_thothan,                0x0E10},  // THAI CHARACTER THO THAN
7156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_thonangmontho,          0x0E11},  // THAI CHARACTER THO NANGMONTHO
7166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_thophuthao,             0x0E12},  // THAI CHARACTER THO PHUTHAO
7176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_nonen,                  0x0E13},  // THAI CHARACTER NO NEN
7186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_dodek,                  0x0E14},  // THAI CHARACTER DO DEK
7196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_totao,                  0x0E15},  // THAI CHARACTER TO TAO
7206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_thothung,               0x0E16},  // THAI CHARACTER THO THUNG
7216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_thothahan,              0x0E17},  // THAI CHARACTER THO THAHAN
7226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_thothong,               0x0E18},  // THAI CHARACTER THO THONG
7236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_nonu,                   0x0E19},  // THAI CHARACTER NO NU
7246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_bobaimai,               0x0E1A},  // THAI CHARACTER BO BAIMAI
7256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_popla,                  0x0E1B},  // THAI CHARACTER PO PLA
7266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_phophung,               0x0E1C},  // THAI CHARACTER PHO PHUNG
7276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_fofa,                   0x0E1D},  // THAI CHARACTER FO FA
7286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_phophan,                0x0E1E},  // THAI CHARACTER PHO PHAN
7296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_fofan,                  0x0E1F},  // THAI CHARACTER FO FAN
7306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_phosamphao,             0x0E20},  // THAI CHARACTER PHO SAMPHAO
7316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_moma,                   0x0E21},  // THAI CHARACTER MO MA
7326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_yoyak,                  0x0E22},  // THAI CHARACTER YO YAK
7336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_rorua,                  0x0E23},  // THAI CHARACTER RO RUA
7346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_ru,                     0x0E24},  // THAI CHARACTER RU
7356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_loling,                 0x0E25},  // THAI CHARACTER LO LING
7366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_lu,                     0x0E26},  // THAI CHARACTER LU
7376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_wowaen,                 0x0E27},  // THAI CHARACTER WO WAEN
7386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_sosala,                 0x0E28},  // THAI CHARACTER SO SALA
7396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_sorusi,                 0x0E29},  // THAI CHARACTER SO RUSI
7406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_sosua,                  0x0E2A},  // THAI CHARACTER SO SUA
7416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_hohip,                  0x0E2B},  // THAI CHARACTER HO HIP
7426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_lochula,                0x0E2C},  // THAI CHARACTER LO CHULA
7436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_oang,                   0x0E2D},  // THAI CHARACTER O ANG
7446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_honokhuk,               0x0E2E},  // THAI CHARACTER HO NOKHUK
7456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_paiyannoi,              0x0E2F},  // THAI CHARACTER PAIYANNOI
7466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_saraa,                  0x0E30},  // THAI CHARACTER SARA A
7476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_maihanakat,             0x0E31},  // THAI CHARACTER MAI HAN-AKAT
7486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_saraaa,                 0x0E32},  // THAI CHARACTER SARA AA
7496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_saraam,                 0x0E33},  // THAI CHARACTER SARA AM
7506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_sarai,                  0x0E34},  // THAI CHARACTER SARA I
7516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_saraii,                 0x0E35},  // THAI CHARACTER SARA II
7526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_saraue,                 0x0E36},  // THAI CHARACTER SARA UE
7536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_sarauee,                0x0E37},  // THAI CHARACTER SARA UEE
7546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_sarau,                  0x0E38},  // THAI CHARACTER SARA U
7556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_sarauu,                 0x0E39},  // THAI CHARACTER SARA UU
7566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_phinthu,                0x0E3A},  // THAI CHARACTER PHINTHU
7576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_baht,                   0x0E3F},  // THAI CURRENCY SYMBOL BAHT
7586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_sarae,                  0x0E40},  // THAI CHARACTER SARA E
7596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_saraae,                 0x0E41},  // THAI CHARACTER SARA AE
7606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_sarao,                  0x0E42},  // THAI CHARACTER SARA O
7616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_saraaimaimuan,          0x0E43},  // THAI CHARACTER SARA AI MAIMUAN
7626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_saraaimaimalai,         0x0E44},  // THAI CHARACTER SARA AI MAIMALAI
7636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_lakkhangyao,            0x0E45},  // THAI CHARACTER LAKKHANGYAO
7646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_maiyamok,               0x0E46},  // THAI CHARACTER MAIYAMOK
7656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_maitaikhu,              0x0E47},  // THAI CHARACTER MAITAIKHU
7666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_maiek,                  0x0E48},  // THAI CHARACTER MAI EK
7676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_maitho,                 0x0E49},  // THAI CHARACTER MAI THO
7686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_maitri,                 0x0E4A},  // THAI CHARACTER MAI TRI
7696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_maichattawa,            0x0E4B},  // THAI CHARACTER MAI CHATTAWA
7706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_thanthakhat,            0x0E4C},  // THAI CHARACTER THANTHAKHAT
7716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_nikhahit,               0x0E4D},  // THAI CHARACTER NIKHAHIT
7726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_leksun,                 0x0E50},  // THAI DIGIT ZERO
7736e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_leknung,                0x0E51},  // THAI DIGIT ONE
7746e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_leksong,                0x0E52},  // THAI DIGIT TWO
7756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_leksam,                 0x0E53},  // THAI DIGIT THREE
7766e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_leksi,                  0x0E54},  // THAI DIGIT FOUR
7776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_lekha,                  0x0E55},  // THAI DIGIT FIVE
7786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_lekhok,                 0x0E56},  // THAI DIGIT SIX
7796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_lekchet,                0x0E57},  // THAI DIGIT SEVEN
7806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_lekpaet,                0x0E58},  // THAI DIGIT EIGHT
7816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Thai_lekkao,                 0x0E59},  // THAI DIGIT NINE
7826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Korean
7846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_Korean_Won,                  0x20A9},  // WON SIGN
7856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Armenian KeySyms map 1:1 to Unicode
7876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7886e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Georgian KeySyms map 1:1 to Unicode
7896e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7906e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Azeri KeySyms map 1:1 to Unicode
7916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Vietnamese KeySyms map 1:1 to Unicode
7936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Currency KeySyms partially map 1:1 to Unicode
7956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  {XK_EuroSign,                    0x20AC},  // EURO SIGN
7966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Mathematical KeySyms map 1:1 to Unicode
7986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
7996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Braille KeySyms map 1:1 to Unicode
8006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Sinhala KeySyms map 1:1 to Unicode
8026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
8036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class KeySymToUnicode {
8056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
8066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  KeySymToUnicode()
8076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      : keysym_to_unicode_map_(arraysize(g_keysym_to_unicode_table)) {
8086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    for (size_t i = 0; i < arraysize(g_keysym_to_unicode_table); ++i) {
8096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      keysym_to_unicode_map_[g_keysym_to_unicode_table[i].keysym] =
8106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)          g_keysym_to_unicode_table[i].unicode;
8116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
8126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
8136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  uint16_t UnicodeFromKeySym(KeySym keysym) const {
8156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Latin-1 characters have the same representation.
8166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if ((0x0020 <= keysym && keysym <= 0x007e) ||
8176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        (0x00a0 <= keysym && keysym <= 0x00ff))
8186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return static_cast<uint16_t>(keysym);
8196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Unicode-style KeySyms.
8216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    if ((keysym & 0xffe00000) == 0x01000000) {
8226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      uint32_t unicode = static_cast<uint32_t>(keysym & 0x1fffff);
8236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      if (unicode & ~0xffff)
8246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        return 0;  // We don't support characters outside the Basic Plane.
8256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      return static_cast<uint16_t>(unicode);
8266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    }
8276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    // Other KeySyms which are not Unicode-style.
8296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    KeySymToUnicodeMap::const_iterator i =
8306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)        keysym_to_unicode_map_.find(keysym);
8316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return i != keysym_to_unicode_map_.end() ? i->second : 0;
8326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
8336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
8356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  typedef std::unordered_map<KeySym, uint16_t> KeySymToUnicodeMap;
8366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  KeySymToUnicodeMap keysym_to_unicode_map_;
8376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(KeySymToUnicode);
8396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
8406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)static base::LazyInstance<KeySymToUnicode>::Leaky g_keysym_to_unicode =
8426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    LAZY_INSTANCE_INITIALIZER;
8436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)uint16_t GetUnicodeCharacterFromXKeySym(unsigned long keysym) {
8456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  return g_keysym_to_unicode.Get().UnicodeFromKeySym(
8466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      static_cast<KeySym>(keysym));
8476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}
8486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
8496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)}  // namespace ui
850