xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

keysym2ucs.c (22720B)


      1 /*
      2  *
      3  * This module converts keysym values into the corresponding ISO 10646
      4  * (UCS, Unicode) values.
      5  *
      6  * The array keysymtab[] contains pairs of X11 keysym values for graphical
      7  * characters and the corresponding Unicode value. The function
      8  * keysym2ucs() maps a keysym onto a Unicode value using a binary search,
      9  * therefore keysymtab[] must remain SORTED by keysym value.
     10  *
     11  * The keysym -> UTF-8 conversion will hopefully one day be provided
     12  * by Xlib via XmbLookupString() and should ideally not have to be
     13  * done in X applications. But we are not there yet.
     14  *
     15  * We allow to represent any UCS character in the range U-00000000 to
     16  * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.
     17  * This admittedly does not cover the entire 31-bit space of UCS, but
     18  * it does cover all of the characters up to U-10FFFF, which can be
     19  * represented by UTF-16, and more, and it is very unlikely that higher
     20  * UCS codes will ever be assigned by ISO. So to get Unicode character
     21  * U+ABCD you can directly use keysym 0x0100abcd.
     22  *
     23  * NOTE: The comments in the table below contain the actual character
     24  * encoded in UTF-8, so for viewing and editing best use an editor in
     25  * UTF-8 mode.
     26  *
     27  * Author: Markus G. Kuhn <mkuhn@acm.org>, University of Cambridge, April 2001
     28  *
     29  * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing
     30  * an initial draft of the mapping table.
     31  *
     32  * This software is in the public domain. Share and enjoy!
     33  *
     34  * AUTOMATICALLY GENERATED FILE, DO NOT EDIT !!! (unicode/convmap.pl)
     35  */
     36 
     37 #include "keysym2ucs.h"
     38 
     39 #include <stdlib.h>
     40 #include <string.h>
     41 
     42 struct codepair {
     43     unsigned short keysym;
     44     unsigned short ucs;
     45 };
     46 
     47 const static struct codepair keysymtab[] = {
     48     { 0x01a1, 0x0104 },
     49     { 0x01a2, 0x02d8 },
     50     { 0x01a3, 0x0141 },
     51     { 0x01a5, 0x013d },
     52     { 0x01a6, 0x015a },
     53     { 0x01a9, 0x0160 },
     54     { 0x01aa, 0x015e },
     55     { 0x01ab, 0x0164 },
     56     { 0x01ac, 0x0179 },
     57     { 0x01ae, 0x017d },
     58     { 0x01af, 0x017b },
     59     { 0x01b1, 0x0105 },
     60     { 0x01b2, 0x02db },
     61     { 0x01b3, 0x0142 },
     62     { 0x01b5, 0x013e },
     63     { 0x01b6, 0x015b },
     64     { 0x01b7, 0x02c7 },
     65     { 0x01b9, 0x0161 },
     66     { 0x01ba, 0x015f },
     67     { 0x01bb, 0x0165 },
     68     { 0x01bc, 0x017a },
     69     { 0x01bd, 0x02dd },
     70     { 0x01be, 0x017e },
     71     { 0x01bf, 0x017c },
     72     { 0x01c0, 0x0154 },
     73     { 0x01c3, 0x0102 },
     74     { 0x01c5, 0x0139 },
     75     { 0x01c6, 0x0106 },
     76     { 0x01c8, 0x010c },
     77     { 0x01ca, 0x0118 },
     78     { 0x01cc, 0x011a },
     79     { 0x01cf, 0x010e },
     80     { 0x01d0, 0x0110 },
     81     { 0x01d1, 0x0143 },
     82     { 0x01d2, 0x0147 },
     83     { 0x01d5, 0x0150 },
     84     { 0x01d8, 0x0158 },
     85     { 0x01d9, 0x016e },
     86     { 0x01db, 0x0170 },
     87     { 0x01de, 0x0162 },
     88     { 0x01e0, 0x0155 },
     89     { 0x01e3, 0x0103 },
     90     { 0x01e5, 0x013a },
     91     { 0x01e6, 0x0107 },
     92     { 0x01e8, 0x010d },
     93     { 0x01ea, 0x0119 },
     94     { 0x01ec, 0x011b },
     95     { 0x01ef, 0x010f },
     96     { 0x01f0, 0x0111 },
     97     { 0x01f1, 0x0144 },
     98     { 0x01f2, 0x0148 },
     99     { 0x01f5, 0x0151 },
    100     { 0x01f8, 0x0159 },
    101     { 0x01f9, 0x016f },
    102     { 0x01fb, 0x0171 },
    103     { 0x01fe, 0x0163 },
    104     { 0x01ff, 0x02d9 },
    105     { 0x02a1, 0x0126 },
    106     { 0x02a6, 0x0124 },
    107     { 0x02a9, 0x0130 },
    108     { 0x02ab, 0x011e },
    109     { 0x02ac, 0x0134 },
    110     { 0x02b1, 0x0127 },
    111     { 0x02b6, 0x0125 },
    112     { 0x02b9, 0x0131 },
    113     { 0x02bb, 0x011f },
    114     { 0x02bc, 0x0135 },
    115     { 0x02c5, 0x010a },
    116     { 0x02c6, 0x0108 },
    117     { 0x02d5, 0x0120 },
    118     { 0x02d8, 0x011c },
    119     { 0x02dd, 0x016c },
    120     { 0x02de, 0x015c },
    121     { 0x02e5, 0x010b },
    122     { 0x02e6, 0x0109 },
    123     { 0x02f5, 0x0121 },
    124     { 0x02f8, 0x011d },
    125     { 0x02fd, 0x016d },
    126     { 0x02fe, 0x015d },
    127     { 0x03a2, 0x0138 },
    128     { 0x03a3, 0x0156 },
    129     { 0x03a5, 0x0128 },
    130     { 0x03a6, 0x013b },
    131     { 0x03aa, 0x0112 },
    132     { 0x03ab, 0x0122 },
    133     { 0x03ac, 0x0166 },
    134     { 0x03b3, 0x0157 },
    135     { 0x03b5, 0x0129 },
    136     { 0x03b6, 0x013c },
    137     { 0x03ba, 0x0113 },
    138     { 0x03bb, 0x0123 },
    139     { 0x03bc, 0x0167 },
    140     { 0x03bd, 0x014a },
    141     { 0x03bf, 0x014b },
    142     { 0x03c0, 0x0100 },
    143     { 0x03c7, 0x012e },
    144     { 0x03cc, 0x0116 },
    145     { 0x03cf, 0x012a },
    146     { 0x03d1, 0x0145 },
    147     { 0x03d2, 0x014c },
    148     { 0x03d3, 0x0136 },
    149     { 0x03d9, 0x0172 },
    150     { 0x03dd, 0x0168 },
    151     { 0x03de, 0x016a },
    152     { 0x03e0, 0x0101 },
    153     { 0x03e7, 0x012f },
    154     { 0x03ec, 0x0117 },
    155     { 0x03ef, 0x012b },
    156     { 0x03f1, 0x0146 },
    157     { 0x03f2, 0x014d },
    158     { 0x03f3, 0x0137 },
    159     { 0x03f9, 0x0173 },
    160     { 0x03fd, 0x0169 },
    161     { 0x03fe, 0x016b },
    162     { 0x047e, 0x203e },
    163     { 0x04a1, 0x3002 },
    164     { 0x04a2, 0x300c },
    165     { 0x04a3, 0x300d },
    166     { 0x04a4, 0x3001 },
    167     { 0x04a5, 0x30fb },
    168     { 0x04a6, 0x30f2 },
    169     { 0x04a7, 0x30a1 },
    170     { 0x04a8, 0x30a3 },
    171     { 0x04a9, 0x30a5 },
    172     { 0x04aa, 0x30a7 },
    173     { 0x04ab, 0x30a9 },
    174     { 0x04ac, 0x30e3 },
    175     { 0x04ad, 0x30e5 },
    176     { 0x04ae, 0x30e7 },
    177     { 0x04af, 0x30c3 },
    178     { 0x04b0, 0x30fc },
    179     { 0x04b1, 0x30a2 },
    180     { 0x04b2, 0x30a4 },
    181     { 0x04b3, 0x30a6 },
    182     { 0x04b4, 0x30a8 },
    183     { 0x04b5, 0x30aa },
    184     { 0x04b6, 0x30ab },
    185     { 0x04b7, 0x30ad },
    186     { 0x04b8, 0x30af },
    187     { 0x04b9, 0x30b1 },
    188     { 0x04ba, 0x30b3 },
    189     { 0x04bb, 0x30b5 },
    190     { 0x04bc, 0x30b7 },
    191     { 0x04bd, 0x30b9 },
    192     { 0x04be, 0x30bb },
    193     { 0x04bf, 0x30bd },
    194     { 0x04c0, 0x30bf },
    195     { 0x04c1, 0x30c1 },
    196     { 0x04c2, 0x30c4 },
    197     { 0x04c3, 0x30c6 },
    198     { 0x04c4, 0x30c8 },
    199     { 0x04c5, 0x30ca },
    200     { 0x04c6, 0x30cb },
    201     { 0x04c7, 0x30cc },
    202     { 0x04c8, 0x30cd },
    203     { 0x04c9, 0x30ce },
    204     { 0x04ca, 0x30cf },
    205     { 0x04cb, 0x30d2 },
    206     { 0x04cc, 0x30d5 },
    207     { 0x04cd, 0x30d8 },
    208     { 0x04ce, 0x30db },
    209     { 0x04cf, 0x30de },
    210     { 0x04d0, 0x30df },
    211     { 0x04d1, 0x30e0 },
    212     { 0x04d2, 0x30e1 },
    213     { 0x04d3, 0x30e2 },
    214     { 0x04d4, 0x30e4 },
    215     { 0x04d5, 0x30e6 },
    216     { 0x04d6, 0x30e8 },
    217     { 0x04d7, 0x30e9 },
    218     { 0x04d8, 0x30ea },
    219     { 0x04d9, 0x30eb },
    220     { 0x04da, 0x30ec },
    221     { 0x04db, 0x30ed },
    222     { 0x04dc, 0x30ef },
    223     { 0x04dd, 0x30f3 },
    224     { 0x04de, 0x309b },
    225     { 0x04df, 0x309c },
    226     { 0x05ac, 0x060c },
    227     { 0x05bb, 0x061b },
    228     { 0x05bf, 0x061f },
    229     { 0x05c1, 0x0621 },
    230     { 0x05c2, 0x0622 },
    231     { 0x05c3, 0x0623 },
    232     { 0x05c4, 0x0624 },
    233     { 0x05c5, 0x0625 },
    234     { 0x05c6, 0x0626 },
    235     { 0x05c7, 0x0627 },
    236     { 0x05c8, 0x0628 },
    237     { 0x05c9, 0x0629 },
    238     { 0x05ca, 0x062a },
    239     { 0x05cb, 0x062b },
    240     { 0x05cc, 0x062c },
    241     { 0x05cd, 0x062d },
    242     { 0x05ce, 0x062e },
    243     { 0x05cf, 0x062f },
    244     { 0x05d0, 0x0630 },
    245     { 0x05d1, 0x0631 },
    246     { 0x05d2, 0x0632 },
    247     { 0x05d3, 0x0633 },
    248     { 0x05d4, 0x0634 },
    249     { 0x05d5, 0x0635 },
    250     { 0x05d6, 0x0636 },
    251     { 0x05d7, 0x0637 },
    252     { 0x05d8, 0x0638 },
    253     { 0x05d9, 0x0639 },
    254     { 0x05da, 0x063a },
    255     { 0x05e0, 0x0640 },
    256     { 0x05e1, 0x0641 },
    257     { 0x05e2, 0x0642 },
    258     { 0x05e3, 0x0643 },
    259     { 0x05e4, 0x0644 },
    260     { 0x05e5, 0x0645 },
    261     { 0x05e6, 0x0646 },
    262     { 0x05e7, 0x0647 },
    263     { 0x05e8, 0x0648 },
    264     { 0x05e9, 0x0649 },
    265     { 0x05ea, 0x064a },
    266     { 0x05eb, 0x064b },
    267     { 0x05ec, 0x064c },
    268     { 0x05ed, 0x064d },
    269     { 0x05ee, 0x064e },
    270     { 0x05ef, 0x064f },
    271     { 0x05f0, 0x0650 },
    272     { 0x05f1, 0x0651 },
    273     { 0x05f2, 0x0652 },
    274     { 0x06a1, 0x0452 },
    275     { 0x06a2, 0x0453 },
    276     { 0x06a3, 0x0451 },
    277     { 0x06a4, 0x0454 },
    278     { 0x06a5, 0x0455 },
    279     { 0x06a6, 0x0456 },
    280     { 0x06a7, 0x0457 },
    281     { 0x06a8, 0x0458 },
    282     { 0x06a9, 0x0459 },
    283     { 0x06aa, 0x045a },
    284     { 0x06ab, 0x045b },
    285     { 0x06ac, 0x045c },
    286     { 0x06ae, 0x045e },
    287     { 0x06af, 0x045f },
    288     { 0x06b0, 0x2116 },
    289     { 0x06b1, 0x0402 },
    290     { 0x06b2, 0x0403 },
    291     { 0x06b3, 0x0401 },
    292     { 0x06b4, 0x0404 },
    293     { 0x06b5, 0x0405 },
    294     { 0x06b6, 0x0406 },
    295     { 0x06b7, 0x0407 },
    296     { 0x06b8, 0x0408 },
    297     { 0x06b9, 0x0409 },
    298     { 0x06ba, 0x040a },
    299     { 0x06bb, 0x040b },
    300     { 0x06bc, 0x040c },
    301     { 0x06be, 0x040e },
    302     { 0x06bf, 0x040f },
    303     { 0x06c0, 0x044e },
    304     { 0x06c1, 0x0430 },
    305     { 0x06c2, 0x0431 },
    306     { 0x06c3, 0x0446 },
    307     { 0x06c4, 0x0434 },
    308     { 0x06c5, 0x0435 },
    309     { 0x06c6, 0x0444 },
    310     { 0x06c7, 0x0433 },
    311     { 0x06c8, 0x0445 },
    312     { 0x06c9, 0x0438 },
    313     { 0x06ca, 0x0439 },
    314     { 0x06cb, 0x043a },
    315     { 0x06cc, 0x043b },
    316     { 0x06cd, 0x043c },
    317     { 0x06ce, 0x043d },
    318     { 0x06cf, 0x043e },
    319     { 0x06d0, 0x043f },
    320     { 0x06d1, 0x044f },
    321     { 0x06d2, 0x0440 },
    322     { 0x06d3, 0x0441 },
    323     { 0x06d4, 0x0442 },
    324     { 0x06d5, 0x0443 },
    325     { 0x06d6, 0x0436 },
    326     { 0x06d7, 0x0432 },
    327     { 0x06d8, 0x044c },
    328     { 0x06d9, 0x044b },
    329     { 0x06da, 0x0437 },
    330     { 0x06db, 0x0448 },
    331     { 0x06dc, 0x044d },
    332     { 0x06dd, 0x0449 },
    333     { 0x06de, 0x0447 },
    334     { 0x06df, 0x044a },
    335     { 0x06e0, 0x042e },
    336     { 0x06e1, 0x0410 },
    337     { 0x06e2, 0x0411 },
    338     { 0x06e3, 0x0426 },
    339     { 0x06e4, 0x0414 },
    340     { 0x06e5, 0x0415 },
    341     { 0x06e6, 0x0424 },
    342     { 0x06e7, 0x0413 },
    343     { 0x06e8, 0x0425 },
    344     { 0x06e9, 0x0418 },
    345     { 0x06ea, 0x0419 },
    346     { 0x06eb, 0x041a },
    347     { 0x06ec, 0x041b },
    348     { 0x06ed, 0x041c },
    349     { 0x06ee, 0x041d },
    350     { 0x06ef, 0x041e },
    351     { 0x06f0, 0x041f },
    352     { 0x06f1, 0x042f },
    353     { 0x06f2, 0x0420 },
    354     { 0x06f3, 0x0421 },
    355     { 0x06f4, 0x0422 },
    356     { 0x06f5, 0x0423 },
    357     { 0x06f6, 0x0416 },
    358     { 0x06f7, 0x0412 },
    359     { 0x06f8, 0x042c },
    360     { 0x06f9, 0x042b },
    361     { 0x06fa, 0x0417 },
    362     { 0x06fb, 0x0428 },
    363     { 0x06fc, 0x042d },
    364     { 0x06fd, 0x0429 },
    365     { 0x06fe, 0x0427 },
    366     { 0x06ff, 0x042a },
    367     { 0x07a1, 0x0386 },
    368     { 0x07a2, 0x0388 },
    369     { 0x07a3, 0x0389 },
    370     { 0x07a4, 0x038a },
    371     { 0x07a5, 0x03aa },
    372     { 0x07a7, 0x038c },
    373     { 0x07a8, 0x038e },
    374     { 0x07a9, 0x03ab },
    375     { 0x07ab, 0x038f },
    376     { 0x07ae, 0x0385 },
    377     { 0x07af, 0x2015 },
    378     { 0x07b1, 0x03ac },
    379     { 0x07b2, 0x03ad },
    380     { 0x07b3, 0x03ae },
    381     { 0x07b4, 0x03af },
    382     { 0x07b5, 0x03ca },
    383     { 0x07b6, 0x0390 },
    384     { 0x07b7, 0x03cc },
    385     { 0x07b8, 0x03cd },
    386     { 0x07b9, 0x03cb },
    387     { 0x07ba, 0x03b0 },
    388     { 0x07bb, 0x03ce },
    389     { 0x07c1, 0x0391 },
    390     { 0x07c2, 0x0392 },
    391     { 0x07c3, 0x0393 },
    392     { 0x07c4, 0x0394 },
    393     { 0x07c5, 0x0395 },
    394     { 0x07c6, 0x0396 },
    395     { 0x07c7, 0x0397 },
    396     { 0x07c8, 0x0398 },
    397     { 0x07c9, 0x0399 },
    398     { 0x07ca, 0x039a },
    399     { 0x07cb, 0x039b },
    400     { 0x07cc, 0x039c },
    401     { 0x07cd, 0x039d },
    402     { 0x07ce, 0x039e },
    403     { 0x07cf, 0x039f },
    404     { 0x07d0, 0x03a0 },
    405     { 0x07d1, 0x03a1 },
    406     { 0x07d2, 0x03a3 },
    407     { 0x07d4, 0x03a4 },
    408     { 0x07d5, 0x03a5 },
    409     { 0x07d6, 0x03a6 },
    410     { 0x07d7, 0x03a7 },
    411     { 0x07d8, 0x03a8 },
    412     { 0x07d9, 0x03a9 },
    413     { 0x07e1, 0x03b1 },
    414     { 0x07e2, 0x03b2 },
    415     { 0x07e3, 0x03b3 },
    416     { 0x07e4, 0x03b4 },
    417     { 0x07e5, 0x03b5 },
    418     { 0x07e6, 0x03b6 },
    419     { 0x07e7, 0x03b7 },
    420     { 0x07e8, 0x03b8 },
    421     { 0x07e9, 0x03b9 },
    422     { 0x07ea, 0x03ba },
    423     { 0x07eb, 0x03bb },
    424     { 0x07ec, 0x03bc },
    425     { 0x07ed, 0x03bd },
    426     { 0x07ee, 0x03be },
    427     { 0x07ef, 0x03bf },
    428     { 0x07f0, 0x03c0 },
    429     { 0x07f1, 0x03c1 },
    430     { 0x07f2, 0x03c3 },
    431     { 0x07f3, 0x03c2 },
    432     { 0x07f4, 0x03c4 },
    433     { 0x07f5, 0x03c5 },
    434     { 0x07f6, 0x03c6 },
    435     { 0x07f7, 0x03c7 },
    436     { 0x07f8, 0x03c8 },
    437     { 0x07f9, 0x03c9 },
    438     { 0x08a1, 0x23b7 },
    439     { 0x08a2, 0x250c },
    440     { 0x08a3, 0x2500 },
    441     { 0x08a4, 0x2320 },
    442     { 0x08a5, 0x2321 },
    443     { 0x08a6, 0x2502 },
    444     { 0x08a7, 0x23a1 },
    445     { 0x08a8, 0x23a3 },
    446     { 0x08a9, 0x23a4 },
    447     { 0x08aa, 0x23a6 },
    448     { 0x08ab, 0x239b },
    449     { 0x08ac, 0x239d },
    450     { 0x08ad, 0x239e },
    451     { 0x08ae, 0x23a0 },
    452     { 0x08af, 0x23a8 },
    453     { 0x08b0, 0x23ac },
    454     { 0x08bc, 0x2264 },
    455     { 0x08bd, 0x2260 },
    456     { 0x08be, 0x2265 },
    457     { 0x08bf, 0x222b },
    458     { 0x08c0, 0x2234 },
    459     { 0x08c1, 0x221d },
    460     { 0x08c2, 0x221e },
    461     { 0x08c5, 0x2207 },
    462     { 0x08c8, 0x223c },
    463     { 0x08c9, 0x2243 },
    464     { 0x08cd, 0x21d4 },
    465     { 0x08ce, 0x21d2 },
    466     { 0x08cf, 0x2261 },
    467     { 0x08d6, 0x221a },
    468     { 0x08da, 0x2282 },
    469     { 0x08db, 0x2283 },
    470     { 0x08dc, 0x2229 },
    471     { 0x08dd, 0x222a },
    472     { 0x08de, 0x2227 },
    473     { 0x08df, 0x2228 },
    474     { 0x08ef, 0x2202 },
    475     { 0x08f6, 0x0192 },
    476     { 0x08fb, 0x2190 },
    477     { 0x08fc, 0x2191 },
    478     { 0x08fd, 0x2192 },
    479     { 0x08fe, 0x2193 },
    480     { 0x09e0, 0x25c6 },
    481     { 0x09e1, 0x2592 },
    482     { 0x09e2, 0x2409 },
    483     { 0x09e3, 0x240c },
    484     { 0x09e4, 0x240d },
    485     { 0x09e5, 0x240a },
    486     { 0x09e8, 0x2424 },
    487     { 0x09e9, 0x240b },
    488     { 0x09ea, 0x2518 },
    489     { 0x09eb, 0x2510 },
    490     { 0x09ec, 0x250c },
    491     { 0x09ed, 0x2514 },
    492     { 0x09ee, 0x253c },
    493     { 0x09ef, 0x23ba },
    494     { 0x09f0, 0x23bb },
    495     { 0x09f1, 0x2500 },
    496     { 0x09f2, 0x23bc },
    497     { 0x09f3, 0x23bd },
    498     { 0x09f4, 0x251c },
    499     { 0x09f5, 0x2524 },
    500     { 0x09f6, 0x2534 },
    501     { 0x09f7, 0x252c },
    502     { 0x09f8, 0x2502 },
    503     { 0x0aa1, 0x2003 },
    504     { 0x0aa2, 0x2002 },
    505     { 0x0aa3, 0x2004 },
    506     { 0x0aa4, 0x2005 },
    507     { 0x0aa5, 0x2007 },
    508     { 0x0aa6, 0x2008 },
    509     { 0x0aa7, 0x2009 },
    510     { 0x0aa8, 0x200a },
    511     { 0x0aa9, 0x2014 },
    512     { 0x0aaa, 0x2013 },
    513     { 0x0aae, 0x2026 },
    514     { 0x0aaf, 0x2025 },
    515     { 0x0ab0, 0x2153 },
    516     { 0x0ab1, 0x2154 },
    517     { 0x0ab2, 0x2155 },
    518     { 0x0ab3, 0x2156 },
    519     { 0x0ab4, 0x2157 },
    520     { 0x0ab5, 0x2158 },
    521     { 0x0ab6, 0x2159 },
    522     { 0x0ab7, 0x215a },
    523     { 0x0ab8, 0x2105 },
    524     { 0x0abb, 0x2012 },
    525     { 0x0abc, 0x2329 },
    526     { 0x0abe, 0x232a },
    527     { 0x0ac3, 0x215b },
    528     { 0x0ac4, 0x215c },
    529     { 0x0ac5, 0x215d },
    530     { 0x0ac6, 0x215e },
    531     { 0x0ac9, 0x2122 },
    532     { 0x0aca, 0x2613 },
    533     { 0x0acc, 0x25c1 },
    534     { 0x0acd, 0x25b7 },
    535     { 0x0ace, 0x25cb },
    536     { 0x0acf, 0x25af },
    537     { 0x0ad0, 0x2018 },
    538     { 0x0ad1, 0x2019 },
    539     { 0x0ad2, 0x201c },
    540     { 0x0ad3, 0x201d },
    541     { 0x0ad4, 0x211e },
    542     { 0x0ad6, 0x2032 },
    543     { 0x0ad7, 0x2033 },
    544     { 0x0ad9, 0x271d },
    545     { 0x0adb, 0x25ac },
    546     { 0x0adc, 0x25c0 },
    547     { 0x0add, 0x25b6 },
    548     { 0x0ade, 0x25cf },
    549     { 0x0adf, 0x25ae },
    550     { 0x0ae0, 0x25e6 },
    551     { 0x0ae1, 0x25ab },
    552     { 0x0ae2, 0x25ad },
    553     { 0x0ae3, 0x25b3 },
    554     { 0x0ae4, 0x25bd },
    555     { 0x0ae5, 0x2606 },
    556     { 0x0ae6, 0x2022 },
    557     { 0x0ae7, 0x25aa },
    558     { 0x0ae8, 0x25b2 },
    559     { 0x0ae9, 0x25bc },
    560     { 0x0aea, 0x261c },
    561     { 0x0aeb, 0x261e },
    562     { 0x0aec, 0x2663 },
    563     { 0x0aed, 0x2666 },
    564     { 0x0aee, 0x2665 },
    565     { 0x0af0, 0x2720 },
    566     { 0x0af1, 0x2020 },
    567     { 0x0af2, 0x2021 },
    568     { 0x0af3, 0x2713 },
    569     { 0x0af4, 0x2717 },
    570     { 0x0af5, 0x266f },
    571     { 0x0af6, 0x266d },
    572     { 0x0af7, 0x2642 },
    573     { 0x0af8, 0x2640 },
    574     { 0x0af9, 0x260e },
    575     { 0x0afa, 0x2315 },
    576     { 0x0afb, 0x2117 },
    577     { 0x0afc, 0x2038 },
    578     { 0x0afd, 0x201a },
    579     { 0x0afe, 0x201e },
    580     { 0x0ba3, 0x003c },
    581     { 0x0ba6, 0x003e },
    582     { 0x0ba8, 0x2228 },
    583     { 0x0ba9, 0x2227 },
    584     { 0x0bc0, 0x00af },
    585     { 0x0bc2, 0x22a5 },
    586     { 0x0bc3, 0x2229 },
    587     { 0x0bc4, 0x230a },
    588     { 0x0bc6, 0x005f },
    589     { 0x0bca, 0x2218 },
    590     { 0x0bcc, 0x2395 },
    591     { 0x0bce, 0x22a4 },
    592     { 0x0bcf, 0x25cb },
    593     { 0x0bd3, 0x2308 },
    594     { 0x0bd6, 0x222a },
    595     { 0x0bd8, 0x2283 },
    596     { 0x0bda, 0x2282 },
    597     { 0x0bdc, 0x22a2 },
    598     { 0x0bfc, 0x22a3 },
    599     { 0x0cdf, 0x2017 },
    600     { 0x0ce0, 0x05d0 },
    601     { 0x0ce1, 0x05d1 },
    602     { 0x0ce2, 0x05d2 },
    603     { 0x0ce3, 0x05d3 },
    604     { 0x0ce4, 0x05d4 },
    605     { 0x0ce5, 0x05d5 },
    606     { 0x0ce6, 0x05d6 },
    607     { 0x0ce7, 0x05d7 },
    608     { 0x0ce8, 0x05d8 },
    609     { 0x0ce9, 0x05d9 },
    610     { 0x0cea, 0x05da },
    611     { 0x0ceb, 0x05db },
    612     { 0x0cec, 0x05dc },
    613     { 0x0ced, 0x05dd },
    614     { 0x0cee, 0x05de },
    615     { 0x0cef, 0x05df },
    616     { 0x0cf0, 0x05e0 },
    617     { 0x0cf1, 0x05e1 },
    618     { 0x0cf2, 0x05e2 },
    619     { 0x0cf3, 0x05e3 },
    620     { 0x0cf4, 0x05e4 },
    621     { 0x0cf5, 0x05e5 },
    622     { 0x0cf6, 0x05e6 },
    623     { 0x0cf7, 0x05e7 },
    624     { 0x0cf8, 0x05e8 },
    625     { 0x0cf9, 0x05e9 },
    626     { 0x0cfa, 0x05ea },
    627     { 0x0da1, 0x0e01 },
    628     { 0x0da2, 0x0e02 },
    629     { 0x0da3, 0x0e03 },
    630     { 0x0da4, 0x0e04 },
    631     { 0x0da5, 0x0e05 },
    632     { 0x0da6, 0x0e06 },
    633     { 0x0da7, 0x0e07 },
    634     { 0x0da8, 0x0e08 },
    635     { 0x0da9, 0x0e09 },
    636     { 0x0daa, 0x0e0a },
    637     { 0x0dab, 0x0e0b },
    638     { 0x0dac, 0x0e0c },
    639     { 0x0dad, 0x0e0d },
    640     { 0x0dae, 0x0e0e },
    641     { 0x0daf, 0x0e0f },
    642     { 0x0db0, 0x0e10 },
    643     { 0x0db1, 0x0e11 },
    644     { 0x0db2, 0x0e12 },
    645     { 0x0db3, 0x0e13 },
    646     { 0x0db4, 0x0e14 },
    647     { 0x0db5, 0x0e15 },
    648     { 0x0db6, 0x0e16 },
    649     { 0x0db7, 0x0e17 },
    650     { 0x0db8, 0x0e18 },
    651     { 0x0db9, 0x0e19 },
    652     { 0x0dba, 0x0e1a },
    653     { 0x0dbb, 0x0e1b },
    654     { 0x0dbc, 0x0e1c },
    655     { 0x0dbd, 0x0e1d },
    656     { 0x0dbe, 0x0e1e },
    657     { 0x0dbf, 0x0e1f },
    658     { 0x0dc0, 0x0e20 },
    659     { 0x0dc1, 0x0e21 },
    660     { 0x0dc2, 0x0e22 },
    661     { 0x0dc3, 0x0e23 },
    662     { 0x0dc4, 0x0e24 },
    663     { 0x0dc5, 0x0e25 },
    664     { 0x0dc6, 0x0e26 },
    665     { 0x0dc7, 0x0e27 },
    666     { 0x0dc8, 0x0e28 },
    667     { 0x0dc9, 0x0e29 },
    668     { 0x0dca, 0x0e2a },
    669     { 0x0dcb, 0x0e2b },
    670     { 0x0dcc, 0x0e2c },
    671     { 0x0dcd, 0x0e2d },
    672     { 0x0dce, 0x0e2e },
    673     { 0x0dcf, 0x0e2f },
    674     { 0x0dd0, 0x0e30 },
    675     { 0x0dd1, 0x0e31 },
    676     { 0x0dd2, 0x0e32 },
    677     { 0x0dd3, 0x0e33 },
    678     { 0x0dd4, 0x0e34 },
    679     { 0x0dd5, 0x0e35 },
    680     { 0x0dd6, 0x0e36 },
    681     { 0x0dd7, 0x0e37 },
    682     { 0x0dd8, 0x0e38 },
    683     { 0x0dd9, 0x0e39 },
    684     { 0x0dda, 0x0e3a },
    685     { 0x0ddf, 0x0e3f },
    686     { 0x0de0, 0x0e40 },
    687     { 0x0de1, 0x0e41 },
    688     { 0x0de2, 0x0e42 },
    689     { 0x0de3, 0x0e43 },
    690     { 0x0de4, 0x0e44 },
    691     { 0x0de5, 0x0e45 },
    692     { 0x0de6, 0x0e46 },
    693     { 0x0de7, 0x0e47 },
    694     { 0x0de8, 0x0e48 },
    695     { 0x0de9, 0x0e49 },
    696     { 0x0dea, 0x0e4a },
    697     { 0x0deb, 0x0e4b },
    698     { 0x0dec, 0x0e4c },
    699     { 0x0ded, 0x0e4d },
    700     { 0x0df0, 0x0e50 },
    701     { 0x0df1, 0x0e51 },
    702     { 0x0df2, 0x0e52 },
    703     { 0x0df3, 0x0e53 },
    704     { 0x0df4, 0x0e54 },
    705     { 0x0df5, 0x0e55 },
    706     { 0x0df6, 0x0e56 },
    707     { 0x0df7, 0x0e57 },
    708     { 0x0df8, 0x0e58 },
    709     { 0x0df9, 0x0e59 },
    710     { 0x0ea1, 0x3131 },
    711     { 0x0ea2, 0x3132 },
    712     { 0x0ea3, 0x3133 },
    713     { 0x0ea4, 0x3134 },
    714     { 0x0ea5, 0x3135 },
    715     { 0x0ea6, 0x3136 },
    716     { 0x0ea7, 0x3137 },
    717     { 0x0ea8, 0x3138 },
    718     { 0x0ea9, 0x3139 },
    719     { 0x0eaa, 0x313a },
    720     { 0x0eab, 0x313b },
    721     { 0x0eac, 0x313c },
    722     { 0x0ead, 0x313d },
    723     { 0x0eae, 0x313e },
    724     { 0x0eaf, 0x313f },
    725     { 0x0eb0, 0x3140 },
    726     { 0x0eb1, 0x3141 },
    727     { 0x0eb2, 0x3142 },
    728     { 0x0eb3, 0x3143 },
    729     { 0x0eb4, 0x3144 },
    730     { 0x0eb5, 0x3145 },
    731     { 0x0eb6, 0x3146 },
    732     { 0x0eb7, 0x3147 },
    733     { 0x0eb8, 0x3148 },
    734     { 0x0eb9, 0x3149 },
    735     { 0x0eba, 0x314a },
    736     { 0x0ebb, 0x314b },
    737     { 0x0ebc, 0x314c },
    738     { 0x0ebd, 0x314d },
    739     { 0x0ebe, 0x314e },
    740     { 0x0ebf, 0x314f },
    741     { 0x0ec0, 0x3150 },
    742     { 0x0ec1, 0x3151 },
    743     { 0x0ec2, 0x3152 },
    744     { 0x0ec3, 0x3153 },
    745     { 0x0ec4, 0x3154 },
    746     { 0x0ec5, 0x3155 },
    747     { 0x0ec6, 0x3156 },
    748     { 0x0ec7, 0x3157 },
    749     { 0x0ec8, 0x3158 },
    750     { 0x0ec9, 0x3159 },
    751     { 0x0eca, 0x315a },
    752     { 0x0ecb, 0x315b },
    753     { 0x0ecc, 0x315c },
    754     { 0x0ecd, 0x315d },
    755     { 0x0ece, 0x315e },
    756     { 0x0ecf, 0x315f },
    757     { 0x0ed0, 0x3160 },
    758     { 0x0ed1, 0x3161 },
    759     { 0x0ed2, 0x3162 },
    760     { 0x0ed3, 0x3163 },
    761     { 0x0ed4, 0x11a8 },
    762     { 0x0ed5, 0x11a9 },
    763     { 0x0ed6, 0x11aa },
    764     { 0x0ed7, 0x11ab },
    765     { 0x0ed8, 0x11ac },
    766     { 0x0ed9, 0x11ad },
    767     { 0x0eda, 0x11ae },
    768     { 0x0edb, 0x11af },
    769     { 0x0edc, 0x11b0 },
    770     { 0x0edd, 0x11b1 },
    771     { 0x0ede, 0x11b2 },
    772     { 0x0edf, 0x11b3 },
    773     { 0x0ee0, 0x11b4 },
    774     { 0x0ee1, 0x11b5 },
    775     { 0x0ee2, 0x11b6 },
    776     { 0x0ee3, 0x11b7 },
    777     { 0x0ee4, 0x11b8 },
    778     { 0x0ee5, 0x11b9 },
    779     { 0x0ee6, 0x11ba },
    780     { 0x0ee7, 0x11bb },
    781     { 0x0ee8, 0x11bc },
    782     { 0x0ee9, 0x11bd },
    783     { 0x0eea, 0x11be },
    784     { 0x0eeb, 0x11bf },
    785     { 0x0eec, 0x11c0 },
    786     { 0x0eed, 0x11c1 },
    787     { 0x0eee, 0x11c2 },
    788     { 0x0eef, 0x316d },
    789     { 0x0ef0, 0x3171 },
    790     { 0x0ef1, 0x3178 },
    791     { 0x0ef2, 0x317f },
    792     { 0x0ef3, 0x3181 },
    793     { 0x0ef4, 0x3184 },
    794     { 0x0ef5, 0x3186 },
    795     { 0x0ef6, 0x318d },
    796     { 0x0ef7, 0x318e },
    797     { 0x0ef8, 0x11eb },
    798     { 0x0ef9, 0x11f0 },
    799     { 0x0efa, 0x11f9 },
    800     { 0x0eff, 0x20a9 },
    801 #if 0
    802     /* FIXME: there is no keysym 0x13a4? But 0x20ac is EuroSign in both
    803        keysym and Unicode */
    804     { 0x13a4, 0x20ac },
    805 #endif
    806     { 0x13bc, 0x0152 },
    807     { 0x13bd, 0x0153 },
    808     { 0x13be, 0x0178 },
    809     { 0x20ac, 0x20ac },
    810 
    811     /* Special function keys. */
    812 
    813     { 0xff08, 0x0008 }, /* XK_BackSpace */
    814     { 0xff09, 0x0009 }, /* XK_Tab */
    815     { 0xff0a, 0x000a }, /* XK_Linefeed */
    816     { 0xff0d, 0x000d }, /* XK_Return */
    817     { 0xff13, 0x0013 }, /* XK_Pause */
    818     { 0xff1b, 0x001b }, /* XK_Escape */
    819     { 0xff50, 0x0001 }, /* XK_Home */
    820     { 0xff51, 0x001c }, /* XK_Left */
    821     { 0xff52, 0x001e }, /* XK_Up */
    822     { 0xff53, 0x001d }, /* XK_Right */
    823     { 0xff54, 0x001f }, /* XK_Down */
    824     { 0xff55, 0x000b }, /* XK_Prior */
    825     { 0xff56, 0x000c }, /* XK_Next */
    826     { 0xff57, 0x0004 }, /* XK_End */
    827     { 0xff6a, 0x0005 }, /* XK_Help */
    828     { 0xffff, 0x007f }, /* XK_Delete */
    829 };
    830 
    831 long
    832 keysym2ucs(int keysym)
    833 {
    834     int min = 0;
    835     int max = ARRAY_SIZE(keysymtab) - 1;
    836     int mid;
    837 
    838     /* first check for Latin-1 characters (1:1 mapping) */
    839     if ((keysym >= 0x0020 && keysym <= 0x007e) ||
    840         (keysym >= 0x00a0 && keysym <= 0x00ff))
    841         return keysym;
    842 
    843     /* also check for directly encoded 24-bit UCS characters */
    844     if ((keysym & 0xff000000) == 0x01000000)
    845         return keysym & 0x00ffffff;
    846 
    847     /* binary search in table */
    848     while (max >= min) {
    849         mid = (min + max) / 2;
    850         if (keysymtab[mid].keysym < keysym)
    851             min = mid + 1;
    852         else if (keysymtab[mid].keysym > keysym)
    853             max = mid - 1;
    854         else {
    855             /* found it */
    856             return keysymtab[mid].ucs;
    857         }
    858     }
    859 
    860     /* no matching Unicode value found */
    861     return -1;
    862 }
    863 
    864 static int
    865 reverse_compare(const void *a, const void *b)
    866 {
    867     const struct codepair *ca = a, *cb = b;
    868 
    869     return ca->ucs - cb->ucs;
    870 }
    871 
    872 int
    873 ucs2keysym(long ucs)
    874 {
    875     static struct codepair *reverse_keysymtab;
    876 
    877     int min = 0;
    878     int max = ARRAY_SIZE(keysymtab) - 1;
    879     int mid;
    880 
    881     if (reverse_keysymtab == NULL) {
    882         reverse_keysymtab = malloc(sizeof(keysymtab));
    883         memcpy(reverse_keysymtab, keysymtab, sizeof(keysymtab));
    884 
    885         qsort(reverse_keysymtab,
    886               ARRAY_SIZE(keysymtab),
    887               sizeof(struct codepair),
    888               reverse_compare);
    889     }
    890 
    891     /* first check for Latin-1 characters (1:1 mapping) */
    892     if ((ucs >= 0x0020 && ucs <= 0x007e) ||
    893         (ucs >= 0x00a0 && ucs <= 0x00ff))
    894         return ucs;
    895 
    896     /* binary search in table */
    897     while (max >= min) {
    898         mid = (min + max) / 2;
    899         if (reverse_keysymtab[mid].ucs < ucs)
    900             min = mid + 1;
    901         else if (reverse_keysymtab[mid].ucs > ucs)
    902             max = mid - 1;
    903         else {
    904             /* found it */
    905             return reverse_keysymtab[mid].keysym;
    906         }
    907     }
    908 
    909     /* finally, assume a directly encoded 24-bit UCS character */
    910     return ucs | 0x01000000;
    911 }