]> source.dussan.org Git - tigervnc.git/commitdiff
Refactoring and implementation changes to keyboard and mouse handling
authorBrian P. Hinz <bphinz@users.sf.net>
Sun, 12 Nov 2017 20:36:31 +0000 (15:36 -0500)
committerBrian P. Hinz <bphinz@users.sf.net>
Mon, 13 Nov 2017 23:21:15 +0000 (18:21 -0500)
See issue #505

12 files changed:
java/com/tigervnc/rfb/Keysym2ucs.java [new file with mode: 0644]
java/com/tigervnc/rfb/Keysymdef.java [new file with mode: 0644]
java/com/tigervnc/rfb/Keysyms.java [deleted file]
java/com/tigervnc/rfb/UnicodeToKeysym.java [deleted file]
java/com/tigervnc/vncviewer/CConn.java
java/com/tigervnc/vncviewer/DesktopWindow.java
java/com/tigervnc/vncviewer/F8Menu.java [deleted file]
java/com/tigervnc/vncviewer/KeyMap.java [new file with mode: 0644]
java/com/tigervnc/vncviewer/MenuKey.java
java/com/tigervnc/vncviewer/ServerDialog.java
java/com/tigervnc/vncviewer/Viewport.java
java/com/tigervnc/vncviewer/VncViewer.java

diff --git a/java/com/tigervnc/rfb/Keysym2ucs.java b/java/com/tigervnc/rfb/Keysym2ucs.java
new file mode 100644 (file)
index 0000000..907f3fe
--- /dev/null
@@ -0,0 +1,958 @@
+/* Copyright (C) 2017 Brian P. Hinz
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ *
+ * This module converts keysym values into the corresponding ISO 10646
+ * (UCS, Unicode) values.
+ *
+ * The array keysymtab[] contains pairs of X11 keysym values for graphical
+ * characters and the corresponding Unicode value. The function
+ * keysym2ucs() maps a keysym onto a Unicode value using a binary search,
+ * therefore keysymtab[] must remain SORTED by keysym value.
+ *
+ * The keysym -> UTF-8 conversion will hopefully one day be provided
+ * by Xlib via XmbLookupString() and should ideally not have to be
+ * done in X applications. But we are not there yet.
+ *
+ * We allow to represent any UCS character in the range U-00000000 to
+ * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.
+ * This admittedly does not cover the entire 31-bit space of UCS, but
+ * it does cover all of the characters up to U-10FFFF, which can be
+ * represented by UTF-16, and more, and it is very unlikely that higher
+ * UCS codes will ever be assigned by ISO. So to get Unicode character
+ * U+ABCD you can directly use keysym 0x0100abcd.
+ *
+ * NOTE: The comments in the table below contain the actual character
+ * encoded in UTF-8, so for viewing and editing best use an editor in
+ * UTF-8 mode.
+ *
+ * Derived from keysym2ucs.c, originally authored by Markus G, Kuhn
+ *
+ */
+
+package com.tigervnc.rfb;
+
+public class Keysym2ucs {
+
+  private static class codepair {
+    public codepair(int keysym_, int ucs_) {
+      keysym = keysym_;
+      ucs = ucs_;
+    }
+    int keysym;
+    int ucs;
+  }
+
+  private static class combiningpair {
+    public combiningpair(int spacing_, int combining_) {
+      spacing = spacing_;
+      combining = combining_;
+    }
+    int spacing;
+    int combining;
+  }
+
+  public static codepair[] keysymtab = {
+    new codepair(0x01a1, 0x0104), /*                     Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */
+    new codepair(0x01a2, 0x02d8), /*                       breve ˘ BREVE */
+    new codepair(0x01a3, 0x0141), /*                     Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */
+    new codepair(0x01a5, 0x013d), /*                      Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */
+    new codepair(0x01a6, 0x015a), /*                      Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */
+    new codepair(0x01a9, 0x0160), /*                      Scaron Š LATIN CAPITAL LETTER S WITH CARON */
+    new codepair(0x01aa, 0x015e), /*                    Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */
+    new codepair(0x01ab, 0x0164), /*                      Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */
+    new codepair(0x01ac, 0x0179), /*                      Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */
+    new codepair(0x01ae, 0x017d), /*                      Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */
+    new codepair(0x01af, 0x017b), /*                   Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+    new codepair(0x01b1, 0x0105), /*                     aogonek ą LATIN SMALL LETTER A WITH OGONEK */
+    new codepair(0x01b2, 0x02db), /*                      ogonek ˛ OGONEK */
+    new codepair(0x01b3, 0x0142), /*                     lstroke ł LATIN SMALL LETTER L WITH STROKE */
+    new codepair(0x01b5, 0x013e), /*                      lcaron ľ LATIN SMALL LETTER L WITH CARON */
+    new codepair(0x01b6, 0x015b), /*                      sacute ś LATIN SMALL LETTER S WITH ACUTE */
+    new codepair(0x01b7, 0x02c7), /*                       caron ˇ CARON */
+    new codepair(0x01b9, 0x0161), /*                      scaron š LATIN SMALL LETTER S WITH CARON */
+    new codepair(0x01ba, 0x015f), /*                    scedilla ş LATIN SMALL LETTER S WITH CEDILLA */
+    new codepair(0x01bb, 0x0165), /*                      tcaron ť LATIN SMALL LETTER T WITH CARON */
+    new codepair(0x01bc, 0x017a), /*                      zacute ź LATIN SMALL LETTER Z WITH ACUTE */
+    new codepair(0x01bd, 0x02dd), /*                 doubleacute ˝ DOUBLE ACUTE ACCENT */
+    new codepair(0x01be, 0x017e), /*                      zcaron ž LATIN SMALL LETTER Z WITH CARON */
+    new codepair(0x01bf, 0x017c), /*                   zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */
+    new codepair(0x01c0, 0x0154), /*                      Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */
+    new codepair(0x01c3, 0x0102), /*                      Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */
+    new codepair(0x01c5, 0x0139), /*                      Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */
+    new codepair(0x01c6, 0x0106), /*                      Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */
+    new codepair(0x01c8, 0x010c), /*                      Ccaron Č LATIN CAPITAL LETTER C WITH CARON */
+    new codepair(0x01ca, 0x0118), /*                     Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */
+    new codepair(0x01cc, 0x011a), /*                      Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */
+    new codepair(0x01cf, 0x010e), /*                      Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */
+    new codepair(0x01d0, 0x0110), /*                     Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */
+    new codepair(0x01d1, 0x0143), /*                      Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */
+    new codepair(0x01d2, 0x0147), /*                      Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */
+    new codepair(0x01d5, 0x0150), /*                Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+    new codepair(0x01d8, 0x0158), /*                      Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */
+    new codepair(0x01d9, 0x016e), /*                       Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */
+    new codepair(0x01db, 0x0170), /*                Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+    new codepair(0x01de, 0x0162), /*                    Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */
+    new codepair(0x01e0, 0x0155), /*                      racute ŕ LATIN SMALL LETTER R WITH ACUTE */
+    new codepair(0x01e3, 0x0103), /*                      abreve ă LATIN SMALL LETTER A WITH BREVE */
+    new codepair(0x01e5, 0x013a), /*                      lacute ĺ LATIN SMALL LETTER L WITH ACUTE */
+    new codepair(0x01e6, 0x0107), /*                      cacute ć LATIN SMALL LETTER C WITH ACUTE */
+    new codepair(0x01e8, 0x010d), /*                      ccaron č LATIN SMALL LETTER C WITH CARON */
+    new codepair(0x01ea, 0x0119), /*                     eogonek ę LATIN SMALL LETTER E WITH OGONEK */
+    new codepair(0x01ec, 0x011b), /*                      ecaron ě LATIN SMALL LETTER E WITH CARON */
+    new codepair(0x01ef, 0x010f), /*                      dcaron ď LATIN SMALL LETTER D WITH CARON */
+    new codepair(0x01f0, 0x0111), /*                     dstroke đ LATIN SMALL LETTER D WITH STROKE */
+    new codepair(0x01f1, 0x0144), /*                      nacute ń LATIN SMALL LETTER N WITH ACUTE */
+    new codepair(0x01f2, 0x0148), /*                      ncaron ň LATIN SMALL LETTER N WITH CARON */
+    new codepair(0x01f5, 0x0151), /*                odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */
+    new codepair(0x01f8, 0x0159), /*                      rcaron ř LATIN SMALL LETTER R WITH CARON */
+    new codepair(0x01f9, 0x016f), /*                       uring ů LATIN SMALL LETTER U WITH RING ABOVE */
+    new codepair(0x01fb, 0x0171), /*                udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */
+    new codepair(0x01fe, 0x0163), /*                    tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */
+    new codepair(0x01ff, 0x02d9), /*                    abovedot ˙ DOT ABOVE */
+    new codepair(0x02a1, 0x0126), /*                     Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */
+    new codepair(0x02a6, 0x0124), /*                 Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
+    new codepair(0x02a9, 0x0130), /*                   Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */
+    new codepair(0x02ab, 0x011e), /*                      Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */
+    new codepair(0x02ac, 0x0134), /*                 Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
+    new codepair(0x02b1, 0x0127), /*                     hstroke ħ LATIN SMALL LETTER H WITH STROKE */
+    new codepair(0x02b6, 0x0125), /*                 hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */
+    new codepair(0x02b9, 0x0131), /*                    idotless ı LATIN SMALL LETTER DOTLESS I */
+    new codepair(0x02bb, 0x011f), /*                      gbreve ğ LATIN SMALL LETTER G WITH BREVE */
+    new codepair(0x02bc, 0x0135), /*                 jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */
+    new codepair(0x02c5, 0x010a), /*                   Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */
+    new codepair(0x02c6, 0x0108), /*                 Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
+    new codepair(0x02d5, 0x0120), /*                   Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */
+    new codepair(0x02d8, 0x011c), /*                 Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
+    new codepair(0x02dd, 0x016c), /*                      Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */
+    new codepair(0x02de, 0x015c), /*                 Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
+    new codepair(0x02e5, 0x010b), /*                   cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */
+    new codepair(0x02e6, 0x0109), /*                 ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */
+    new codepair(0x02f5, 0x0121), /*                   gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */
+    new codepair(0x02f8, 0x011d), /*                 gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */
+    new codepair(0x02fd, 0x016d), /*                      ubreve ŭ LATIN SMALL LETTER U WITH BREVE */
+    new codepair(0x02fe, 0x015d), /*                 scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */
+    new codepair(0x03a2, 0x0138), /*                         kra ĸ LATIN SMALL LETTER KRA */
+    new codepair(0x03a3, 0x0156), /*                    Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */
+    new codepair(0x03a5, 0x0128), /*                      Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */
+    new codepair(0x03a6, 0x013b), /*                    Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */
+    new codepair(0x03aa, 0x0112), /*                     Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */
+    new codepair(0x03ab, 0x0122), /*                    Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */
+    new codepair(0x03ac, 0x0166), /*                      Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */
+    new codepair(0x03b3, 0x0157), /*                    rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */
+    new codepair(0x03b5, 0x0129), /*                      itilde ĩ LATIN SMALL LETTER I WITH TILDE */
+    new codepair(0x03b6, 0x013c), /*                    lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */
+    new codepair(0x03ba, 0x0113), /*                     emacron ē LATIN SMALL LETTER E WITH MACRON */
+    new codepair(0x03bb, 0x0123), /*                    gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */
+    new codepair(0x03bc, 0x0167), /*                      tslash ŧ LATIN SMALL LETTER T WITH STROKE */
+    new codepair(0x03bd, 0x014a), /*                         ENG Ŋ LATIN CAPITAL LETTER ENG */
+    new codepair(0x03bf, 0x014b), /*                         eng ŋ LATIN SMALL LETTER ENG */
+    new codepair(0x03c0, 0x0100), /*                     Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */
+    new codepair(0x03c7, 0x012e), /*                     Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */
+    new codepair(0x03cc, 0x0116), /*                   Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */
+    new codepair(0x03cf, 0x012a), /*                     Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */
+    new codepair(0x03d1, 0x0145), /*                    Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */
+    new codepair(0x03d2, 0x014c), /*                     Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */
+    new codepair(0x03d3, 0x0136), /*                    Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */
+    new codepair(0x03d9, 0x0172), /*                     Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */
+    new codepair(0x03dd, 0x0168), /*                      Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */
+    new codepair(0x03de, 0x016a), /*                     Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */
+    new codepair(0x03e0, 0x0101), /*                     amacron ā LATIN SMALL LETTER A WITH MACRON */
+    new codepair(0x03e7, 0x012f), /*                     iogonek į LATIN SMALL LETTER I WITH OGONEK */
+    new codepair(0x03ec, 0x0117), /*                   eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */
+    new codepair(0x03ef, 0x012b), /*                     imacron ī LATIN SMALL LETTER I WITH MACRON */
+    new codepair(0x03f1, 0x0146), /*                    ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */
+    new codepair(0x03f2, 0x014d), /*                     omacron ō LATIN SMALL LETTER O WITH MACRON */
+    new codepair(0x03f3, 0x0137), /*                    kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */
+    new codepair(0x03f9, 0x0173), /*                     uogonek ų LATIN SMALL LETTER U WITH OGONEK */
+    new codepair(0x03fd, 0x0169), /*                      utilde ũ LATIN SMALL LETTER U WITH TILDE */
+    new codepair(0x03fe, 0x016b), /*                     umacron ū LATIN SMALL LETTER U WITH MACRON */
+    new codepair(0x047e, 0x203e), /*                    overline ‾ OVERLINE */
+    new codepair(0x04a1, 0x3002), /*               kana_fullstop 。 IDEOGRAPHIC FULL STOP */
+    new codepair(0x04a2, 0x300c), /*         kana_openingbracket 「 LEFT CORNER BRACKET */
+    new codepair(0x04a3, 0x300d), /*         kana_closingbracket 」 RIGHT CORNER BRACKET */
+    new codepair(0x04a4, 0x3001), /*                  kana_comma 、 IDEOGRAPHIC COMMA */
+    new codepair(0x04a5, 0x30fb), /*            kana_conjunctive ・ KATAKANA MIDDLE DOT */
+    new codepair(0x04a6, 0x30f2), /*                     kana_WO ヲ KATAKANA LETTER WO */
+    new codepair(0x04a7, 0x30a1), /*                      kana_a ァ KATAKANA LETTER SMALL A */
+    new codepair(0x04a8, 0x30a3), /*                      kana_i ィ KATAKANA LETTER SMALL I */
+    new codepair(0x04a9, 0x30a5), /*                      kana_u ゥ KATAKANA LETTER SMALL U */
+    new codepair(0x04aa, 0x30a7), /*                      kana_e ェ KATAKANA LETTER SMALL E */
+    new codepair(0x04ab, 0x30a9), /*                      kana_o ォ KATAKANA LETTER SMALL O */
+    new codepair(0x04ac, 0x30e3), /*                     kana_ya ャ KATAKANA LETTER SMALL YA */
+    new codepair(0x04ad, 0x30e5), /*                     kana_yu ュ KATAKANA LETTER SMALL YU */
+    new codepair(0x04ae, 0x30e7), /*                     kana_yo ョ KATAKANA LETTER SMALL YO */
+    new codepair(0x04af, 0x30c3), /*                    kana_tsu ッ KATAKANA LETTER SMALL TU */
+    new codepair(0x04b0, 0x30fc), /*              prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+    new codepair(0x04b1, 0x30a2), /*                      kana_A ア KATAKANA LETTER A */
+    new codepair(0x04b2, 0x30a4), /*                      kana_I イ KATAKANA LETTER I */
+    new codepair(0x04b3, 0x30a6), /*                      kana_U ウ KATAKANA LETTER U */
+    new codepair(0x04b4, 0x30a8), /*                      kana_E エ KATAKANA LETTER E */
+    new codepair(0x04b5, 0x30aa), /*                      kana_O オ KATAKANA LETTER O */
+    new codepair(0x04b6, 0x30ab), /*                     kana_KA カ KATAKANA LETTER KA */
+    new codepair(0x04b7, 0x30ad), /*                     kana_KI キ KATAKANA LETTER KI */
+    new codepair(0x04b8, 0x30af), /*                     kana_KU ク KATAKANA LETTER KU */
+    new codepair(0x04b9, 0x30b1), /*                     kana_KE ケ KATAKANA LETTER KE */
+    new codepair(0x04ba, 0x30b3), /*                     kana_KO コ KATAKANA LETTER KO */
+    new codepair(0x04bb, 0x30b5), /*                     kana_SA サ KATAKANA LETTER SA */
+    new codepair(0x04bc, 0x30b7), /*                    kana_SHI シ KATAKANA LETTER SI */
+    new codepair(0x04bd, 0x30b9), /*                     kana_SU ス KATAKANA LETTER SU */
+    new codepair(0x04be, 0x30bb), /*                     kana_SE セ KATAKANA LETTER SE */
+    new codepair(0x04bf, 0x30bd), /*                     kana_SO ソ KATAKANA LETTER SO */
+    new codepair(0x04c0, 0x30bf), /*                     kana_TA タ KATAKANA LETTER TA */
+    new codepair(0x04c1, 0x30c1), /*                    kana_CHI チ KATAKANA LETTER TI */
+    new codepair(0x04c2, 0x30c4), /*                    kana_TSU ツ KATAKANA LETTER TU */
+    new codepair(0x04c3, 0x30c6), /*                     kana_TE テ KATAKANA LETTER TE */
+    new codepair(0x04c4, 0x30c8), /*                     kana_TO ト KATAKANA LETTER TO */
+    new codepair(0x04c5, 0x30ca), /*                     kana_NA ナ KATAKANA LETTER NA */
+    new codepair(0x04c6, 0x30cb), /*                     kana_NI ニ KATAKANA LETTER NI */
+    new codepair(0x04c7, 0x30cc), /*                     kana_NU ヌ KATAKANA LETTER NU */
+    new codepair(0x04c8, 0x30cd), /*                     kana_NE ネ KATAKANA LETTER NE */
+    new codepair(0x04c9, 0x30ce), /*                     kana_NO ノ KATAKANA LETTER NO */
+    new codepair(0x04ca, 0x30cf), /*                     kana_HA ハ KATAKANA LETTER HA */
+    new codepair(0x04cb, 0x30d2), /*                     kana_HI ヒ KATAKANA LETTER HI */
+    new codepair(0x04cc, 0x30d5), /*                     kana_FU フ KATAKANA LETTER HU */
+    new codepair(0x04cd, 0x30d8), /*                     kana_HE ヘ KATAKANA LETTER HE */
+    new codepair(0x04ce, 0x30db), /*                     kana_HO ホ KATAKANA LETTER HO */
+    new codepair(0x04cf, 0x30de), /*                     kana_MA マ KATAKANA LETTER MA */
+    new codepair(0x04d0, 0x30df), /*                     kana_MI ミ KATAKANA LETTER MI */
+    new codepair(0x04d1, 0x30e0), /*                     kana_MU ム KATAKANA LETTER MU */
+    new codepair(0x04d2, 0x30e1), /*                     kana_ME メ KATAKANA LETTER ME */
+    new codepair(0x04d3, 0x30e2), /*                     kana_MO モ KATAKANA LETTER MO */
+    new codepair(0x04d4, 0x30e4), /*                     kana_YA ヤ KATAKANA LETTER YA */
+    new codepair(0x04d5, 0x30e6), /*                     kana_YU ユ KATAKANA LETTER YU */
+    new codepair(0x04d6, 0x30e8), /*                     kana_YO ヨ KATAKANA LETTER YO */
+    new codepair(0x04d7, 0x30e9), /*                     kana_RA ラ KATAKANA LETTER RA */
+    new codepair(0x04d8, 0x30ea), /*                     kana_RI リ KATAKANA LETTER RI */
+    new codepair(0x04d9, 0x30eb), /*                     kana_RU ル KATAKANA LETTER RU */
+    new codepair(0x04da, 0x30ec), /*                     kana_RE レ KATAKANA LETTER RE */
+    new codepair(0x04db, 0x30ed), /*                     kana_RO ロ KATAKANA LETTER RO */
+    new codepair(0x04dc, 0x30ef), /*                     kana_WA ワ KATAKANA LETTER WA */
+    new codepair(0x04dd, 0x30f3), /*                      kana_N ン KATAKANA LETTER N */
+    new codepair(0x04de, 0x309b), /*                 voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */
+    new codepair(0x04df, 0x309c), /*             semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+    new codepair(0x05ac, 0x060c), /*                Arabic_comma ، ARABIC COMMA */
+    new codepair(0x05bb, 0x061b), /*            Arabic_semicolon ؛ ARABIC SEMICOLON */
+    new codepair(0x05bf, 0x061f), /*        Arabic_question_mark ؟ ARABIC QUESTION MARK */
+    new codepair(0x05c1, 0x0621), /*                Arabic_hamza ء ARABIC LETTER HAMZA */
+    new codepair(0x05c2, 0x0622), /*          Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */
+    new codepair(0x05c3, 0x0623), /*          Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */
+    new codepair(0x05c4, 0x0624), /*           Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */
+    new codepair(0x05c5, 0x0625), /*       Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */
+    new codepair(0x05c6, 0x0626), /*           Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */
+    new codepair(0x05c7, 0x0627), /*                 Arabic_alef ا ARABIC LETTER ALEF */
+    new codepair(0x05c8, 0x0628), /*                  Arabic_beh ب ARABIC LETTER BEH */
+    new codepair(0x05c9, 0x0629), /*           Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */
+    new codepair(0x05ca, 0x062a), /*                  Arabic_teh ت ARABIC LETTER TEH */
+    new codepair(0x05cb, 0x062b), /*                 Arabic_theh ث ARABIC LETTER THEH */
+    new codepair(0x05cc, 0x062c), /*                 Arabic_jeem ج ARABIC LETTER JEEM */
+    new codepair(0x05cd, 0x062d), /*                  Arabic_hah ح ARABIC LETTER HAH */
+    new codepair(0x05ce, 0x062e), /*                 Arabic_khah خ ARABIC LETTER KHAH */
+    new codepair(0x05cf, 0x062f), /*                  Arabic_dal د ARABIC LETTER DAL */
+    new codepair(0x05d0, 0x0630), /*                 Arabic_thal ذ ARABIC LETTER THAL */
+    new codepair(0x05d1, 0x0631), /*                   Arabic_ra ر ARABIC LETTER REH */
+    new codepair(0x05d2, 0x0632), /*                 Arabic_zain ز ARABIC LETTER ZAIN */
+    new codepair(0x05d3, 0x0633), /*                 Arabic_seen س ARABIC LETTER SEEN */
+    new codepair(0x05d4, 0x0634), /*                Arabic_sheen ش ARABIC LETTER SHEEN */
+    new codepair(0x05d5, 0x0635), /*                  Arabic_sad ص ARABIC LETTER SAD */
+    new codepair(0x05d6, 0x0636), /*                  Arabic_dad ض ARABIC LETTER DAD */
+    new codepair(0x05d7, 0x0637), /*                  Arabic_tah ط ARABIC LETTER TAH */
+    new codepair(0x05d8, 0x0638), /*                  Arabic_zah ظ ARABIC LETTER ZAH */
+    new codepair(0x05d9, 0x0639), /*                  Arabic_ain ع ARABIC LETTER AIN */
+    new codepair(0x05da, 0x063a), /*                Arabic_ghain غ ARABIC LETTER GHAIN */
+    new codepair(0x05e0, 0x0640), /*              Arabic_tatweel ـ ARABIC TATWEEL */
+    new codepair(0x05e1, 0x0641), /*                  Arabic_feh ف ARABIC LETTER FEH */
+    new codepair(0x05e2, 0x0642), /*                  Arabic_qaf ق ARABIC LETTER QAF */
+    new codepair(0x05e3, 0x0643), /*                  Arabic_kaf ك ARABIC LETTER KAF */
+    new codepair(0x05e4, 0x0644), /*                  Arabic_lam ل ARABIC LETTER LAM */
+    new codepair(0x05e5, 0x0645), /*                 Arabic_meem م ARABIC LETTER MEEM */
+    new codepair(0x05e6, 0x0646), /*                 Arabic_noon ن ARABIC LETTER NOON */
+    new codepair(0x05e7, 0x0647), /*                   Arabic_ha ه ARABIC LETTER HEH */
+    new codepair(0x05e8, 0x0648), /*                  Arabic_waw و ARABIC LETTER WAW */
+    new codepair(0x05e9, 0x0649), /*          Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */
+    new codepair(0x05ea, 0x064a), /*                  Arabic_yeh ي ARABIC LETTER YEH */
+    new codepair(0x05eb, 0x064b), /*             Arabic_fathatan ً ARABIC FATHATAN */
+    new codepair(0x05ec, 0x064c), /*             Arabic_dammatan ٌ ARABIC DAMMATAN */
+    new codepair(0x05ed, 0x064d), /*             Arabic_kasratan ٍ ARABIC KASRATAN */
+    new codepair(0x05ee, 0x064e), /*                Arabic_fatha َ ARABIC FATHA */
+    new codepair(0x05ef, 0x064f), /*                Arabic_damma ُ ARABIC DAMMA */
+    new codepair(0x05f0, 0x0650), /*                Arabic_kasra ِ ARABIC KASRA */
+    new codepair(0x05f1, 0x0651), /*               Arabic_shadda ّ ARABIC SHADDA */
+    new codepair(0x05f2, 0x0652), /*                Arabic_sukun ْ ARABIC SUKUN */
+    new codepair(0x06a1, 0x0452), /*                 Serbian_dje ђ CYRILLIC SMALL LETTER DJE */
+    new codepair(0x06a2, 0x0453), /*               Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */
+    new codepair(0x06a3, 0x0451), /*                 Cyrillic_io ё CYRILLIC SMALL LETTER IO */
+    new codepair(0x06a4, 0x0454), /*                Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */
+    new codepair(0x06a5, 0x0455), /*               Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */
+    new codepair(0x06a6, 0x0456), /*                 Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
+    new codepair(0x06a7, 0x0457), /*                Ukrainian_yi ї CYRILLIC SMALL LETTER YI */
+    new codepair(0x06a8, 0x0458), /*                 Cyrillic_je ј CYRILLIC SMALL LETTER JE */
+    new codepair(0x06a9, 0x0459), /*                Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */
+    new codepair(0x06aa, 0x045a), /*                Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */
+    new codepair(0x06ab, 0x045b), /*                Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */
+    new codepair(0x06ac, 0x045c), /*               Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */
+    new codepair(0x06ae, 0x045e), /*         Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */
+    new codepair(0x06af, 0x045f), /*               Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */
+    new codepair(0x06b0, 0x2116), /*                  numerosign № NUMERO SIGN */
+    new codepair(0x06b1, 0x0402), /*                 Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */
+    new codepair(0x06b2, 0x0403), /*               Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */
+    new codepair(0x06b3, 0x0401), /*                 Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */
+    new codepair(0x06b4, 0x0404), /*                Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */
+    new codepair(0x06b5, 0x0405), /*               Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */
+    new codepair(0x06b6, 0x0406), /*                 Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
+    new codepair(0x06b7, 0x0407), /*                Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */
+    new codepair(0x06b8, 0x0408), /*                 Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */
+    new codepair(0x06b9, 0x0409), /*                Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */
+    new codepair(0x06ba, 0x040a), /*                Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */
+    new codepair(0x06bb, 0x040b), /*                Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */
+    new codepair(0x06bc, 0x040c), /*               Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */
+    new codepair(0x06be, 0x040e), /*         Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */
+    new codepair(0x06bf, 0x040f), /*               Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */
+    new codepair(0x06c0, 0x044e), /*                 Cyrillic_yu ю CYRILLIC SMALL LETTER YU */
+    new codepair(0x06c1, 0x0430), /*                  Cyrillic_a а CYRILLIC SMALL LETTER A */
+    new codepair(0x06c2, 0x0431), /*                 Cyrillic_be б CYRILLIC SMALL LETTER BE */
+    new codepair(0x06c3, 0x0446), /*                Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */
+    new codepair(0x06c4, 0x0434), /*                 Cyrillic_de д CYRILLIC SMALL LETTER DE */
+    new codepair(0x06c5, 0x0435), /*                 Cyrillic_ie е CYRILLIC SMALL LETTER IE */
+    new codepair(0x06c6, 0x0444), /*                 Cyrillic_ef ф CYRILLIC SMALL LETTER EF */
+    new codepair(0x06c7, 0x0433), /*                Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */
+    new codepair(0x06c8, 0x0445), /*                 Cyrillic_ha х CYRILLIC SMALL LETTER HA */
+    new codepair(0x06c9, 0x0438), /*                  Cyrillic_i и CYRILLIC SMALL LETTER I */
+    new codepair(0x06ca, 0x0439), /*             Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */
+    new codepair(0x06cb, 0x043a), /*                 Cyrillic_ka к CYRILLIC SMALL LETTER KA */
+    new codepair(0x06cc, 0x043b), /*                 Cyrillic_el л CYRILLIC SMALL LETTER EL */
+    new codepair(0x06cd, 0x043c), /*                 Cyrillic_em м CYRILLIC SMALL LETTER EM */
+    new codepair(0x06ce, 0x043d), /*                 Cyrillic_en н CYRILLIC SMALL LETTER EN */
+    new codepair(0x06cf, 0x043e), /*                  Cyrillic_o о CYRILLIC SMALL LETTER O */
+    new codepair(0x06d0, 0x043f), /*                 Cyrillic_pe п CYRILLIC SMALL LETTER PE */
+    new codepair(0x06d1, 0x044f), /*                 Cyrillic_ya я CYRILLIC SMALL LETTER YA */
+    new codepair(0x06d2, 0x0440), /*                 Cyrillic_er р CYRILLIC SMALL LETTER ER */
+    new codepair(0x06d3, 0x0441), /*                 Cyrillic_es с CYRILLIC SMALL LETTER ES */
+    new codepair(0x06d4, 0x0442), /*                 Cyrillic_te т CYRILLIC SMALL LETTER TE */
+    new codepair(0x06d5, 0x0443), /*                  Cyrillic_u у CYRILLIC SMALL LETTER U */
+    new codepair(0x06d6, 0x0436), /*                Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */
+    new codepair(0x06d7, 0x0432), /*                 Cyrillic_ve в CYRILLIC SMALL LETTER VE */
+    new codepair(0x06d8, 0x044c), /*           Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */
+    new codepair(0x06d9, 0x044b), /*               Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */
+    new codepair(0x06da, 0x0437), /*                 Cyrillic_ze з CYRILLIC SMALL LETTER ZE */
+    new codepair(0x06db, 0x0448), /*                Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */
+    new codepair(0x06dc, 0x044d), /*                  Cyrillic_e э CYRILLIC SMALL LETTER E */
+    new codepair(0x06dd, 0x0449), /*              Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */
+    new codepair(0x06de, 0x0447), /*                Cyrillic_che ч CYRILLIC SMALL LETTER CHE */
+    new codepair(0x06df, 0x044a), /*           Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */
+    new codepair(0x06e0, 0x042e), /*                 Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */
+    new codepair(0x06e1, 0x0410), /*                  Cyrillic_A А CYRILLIC CAPITAL LETTER A */
+    new codepair(0x06e2, 0x0411), /*                 Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */
+    new codepair(0x06e3, 0x0426), /*                Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */
+    new codepair(0x06e4, 0x0414), /*                 Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */
+    new codepair(0x06e5, 0x0415), /*                 Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */
+    new codepair(0x06e6, 0x0424), /*                 Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */
+    new codepair(0x06e7, 0x0413), /*                Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */
+    new codepair(0x06e8, 0x0425), /*                 Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */
+    new codepair(0x06e9, 0x0418), /*                  Cyrillic_I И CYRILLIC CAPITAL LETTER I */
+    new codepair(0x06ea, 0x0419), /*             Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */
+    new codepair(0x06eb, 0x041a), /*                 Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */
+    new codepair(0x06ec, 0x041b), /*                 Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */
+    new codepair(0x06ed, 0x041c), /*                 Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */
+    new codepair(0x06ee, 0x041d), /*                 Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */
+    new codepair(0x06ef, 0x041e), /*                  Cyrillic_O О CYRILLIC CAPITAL LETTER O */
+    new codepair(0x06f0, 0x041f), /*                 Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */
+    new codepair(0x06f1, 0x042f), /*                 Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */
+    new codepair(0x06f2, 0x0420), /*                 Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */
+    new codepair(0x06f3, 0x0421), /*                 Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */
+    new codepair(0x06f4, 0x0422), /*                 Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */
+    new codepair(0x06f5, 0x0423), /*                  Cyrillic_U У CYRILLIC CAPITAL LETTER U */
+    new codepair(0x06f6, 0x0416), /*                Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */
+    new codepair(0x06f7, 0x0412), /*                 Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */
+    new codepair(0x06f8, 0x042c), /*           Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */
+    new codepair(0x06f9, 0x042b), /*               Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */
+    new codepair(0x06fa, 0x0417), /*                 Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */
+    new codepair(0x06fb, 0x0428), /*                Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */
+    new codepair(0x06fc, 0x042d), /*                  Cyrillic_E Э CYRILLIC CAPITAL LETTER E */
+    new codepair(0x06fd, 0x0429), /*              Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */
+    new codepair(0x06fe, 0x0427), /*                Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */
+    new codepair(0x06ff, 0x042a), /*           Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */
+    new codepair(0x07a1, 0x0386), /*           Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */
+    new codepair(0x07a2, 0x0388), /*         Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */
+    new codepair(0x07a3, 0x0389), /*             Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */
+    new codepair(0x07a4, 0x038a), /*            Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */
+    new codepair(0x07a5, 0x03aa), /*         Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+    new codepair(0x07a7, 0x038c), /*         Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */
+    new codepair(0x07a8, 0x038e), /*         Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */
+    new codepair(0x07a9, 0x03ab), /*       Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+    new codepair(0x07ab, 0x038f), /*           Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */
+    new codepair(0x07ae, 0x0385), /*        Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */
+    new codepair(0x07af, 0x2015), /*              Greek_horizbar ― HORIZONTAL BAR */
+    new codepair(0x07b1, 0x03ac), /*           Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */
+    new codepair(0x07b2, 0x03ad), /*         Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */
+    new codepair(0x07b3, 0x03ae), /*             Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */
+    new codepair(0x07b4, 0x03af), /*            Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */
+    new codepair(0x07b5, 0x03ca), /*          Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+    new codepair(0x07b6, 0x0390), /*    Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+    new codepair(0x07b7, 0x03cc), /*         Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */
+    new codepair(0x07b8, 0x03cd), /*         Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */
+    new codepair(0x07b9, 0x03cb), /*       Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+    new codepair(0x07ba, 0x03b0), /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
+    new codepair(0x07bb, 0x03ce), /*           Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */
+    new codepair(0x07c1, 0x0391), /*                 Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */
+    new codepair(0x07c2, 0x0392), /*                  Greek_BETA Β GREEK CAPITAL LETTER BETA */
+    new codepair(0x07c3, 0x0393), /*                 Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */
+    new codepair(0x07c4, 0x0394), /*                 Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */
+    new codepair(0x07c5, 0x0395), /*               Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */
+    new codepair(0x07c6, 0x0396), /*                  Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */
+    new codepair(0x07c7, 0x0397), /*                   Greek_ETA Η GREEK CAPITAL LETTER ETA */
+    new codepair(0x07c8, 0x0398), /*                 Greek_THETA Θ GREEK CAPITAL LETTER THETA */
+    new codepair(0x07c9, 0x0399), /*                  Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */
+    new codepair(0x07ca, 0x039a), /*                 Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */
+    new codepair(0x07cb, 0x039b), /*                Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */
+    new codepair(0x07cc, 0x039c), /*                    Greek_MU Μ GREEK CAPITAL LETTER MU */
+    new codepair(0x07cd, 0x039d), /*                    Greek_NU Ν GREEK CAPITAL LETTER NU */
+    new codepair(0x07ce, 0x039e), /*                    Greek_XI Ξ GREEK CAPITAL LETTER XI */
+    new codepair(0x07cf, 0x039f), /*               Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */
+    new codepair(0x07d0, 0x03a0), /*                    Greek_PI Π GREEK CAPITAL LETTER PI */
+    new codepair(0x07d1, 0x03a1), /*                   Greek_RHO Ρ GREEK CAPITAL LETTER RHO */
+    new codepair(0x07d2, 0x03a3), /*                 Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */
+    new codepair(0x07d4, 0x03a4), /*                   Greek_TAU Τ GREEK CAPITAL LETTER TAU */
+    new codepair(0x07d5, 0x03a5), /*               Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */
+    new codepair(0x07d6, 0x03a6), /*                   Greek_PHI Φ GREEK CAPITAL LETTER PHI */
+    new codepair(0x07d7, 0x03a7), /*                   Greek_CHI Χ GREEK CAPITAL LETTER CHI */
+    new codepair(0x07d8, 0x03a8), /*                   Greek_PSI Ψ GREEK CAPITAL LETTER PSI */
+    new codepair(0x07d9, 0x03a9), /*                 Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */
+    new codepair(0x07e1, 0x03b1), /*                 Greek_alpha α GREEK SMALL LETTER ALPHA */
+    new codepair(0x07e2, 0x03b2), /*                  Greek_beta β GREEK SMALL LETTER BETA */
+    new codepair(0x07e3, 0x03b3), /*                 Greek_gamma γ GREEK SMALL LETTER GAMMA */
+    new codepair(0x07e4, 0x03b4), /*                 Greek_delta δ GREEK SMALL LETTER DELTA */
+    new codepair(0x07e5, 0x03b5), /*               Greek_epsilon ε GREEK SMALL LETTER EPSILON */
+    new codepair(0x07e6, 0x03b6), /*                  Greek_zeta ζ GREEK SMALL LETTER ZETA */
+    new codepair(0x07e7, 0x03b7), /*                   Greek_eta η GREEK SMALL LETTER ETA */
+    new codepair(0x07e8, 0x03b8), /*                 Greek_theta θ GREEK SMALL LETTER THETA */
+    new codepair(0x07e9, 0x03b9), /*                  Greek_iota ι GREEK SMALL LETTER IOTA */
+    new codepair(0x07ea, 0x03ba), /*                 Greek_kappa κ GREEK SMALL LETTER KAPPA */
+    new codepair(0x07eb, 0x03bb), /*                Greek_lambda λ GREEK SMALL LETTER LAMDA */
+    new codepair(0x07ec, 0x03bc), /*                    Greek_mu μ GREEK SMALL LETTER MU */
+    new codepair(0x07ed, 0x03bd), /*                    Greek_nu ν GREEK SMALL LETTER NU */
+    new codepair(0x07ee, 0x03be), /*                    Greek_xi ξ GREEK SMALL LETTER XI */
+    new codepair(0x07ef, 0x03bf), /*               Greek_omicron ο GREEK SMALL LETTER OMICRON */
+    new codepair(0x07f0, 0x03c0), /*                    Greek_pi π GREEK SMALL LETTER PI */
+    new codepair(0x07f1, 0x03c1), /*                   Greek_rho ρ GREEK SMALL LETTER RHO */
+    new codepair(0x07f2, 0x03c3), /*                 Greek_sigma σ GREEK SMALL LETTER SIGMA */
+    new codepair(0x07f3, 0x03c2), /*       Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */
+    new codepair(0x07f4, 0x03c4), /*                   Greek_tau τ GREEK SMALL LETTER TAU */
+    new codepair(0x07f5, 0x03c5), /*               Greek_upsilon υ GREEK SMALL LETTER UPSILON */
+    new codepair(0x07f6, 0x03c6), /*                   Greek_phi φ GREEK SMALL LETTER PHI */
+    new codepair(0x07f7, 0x03c7), /*                   Greek_chi χ GREEK SMALL LETTER CHI */
+    new codepair(0x07f8, 0x03c8), /*                   Greek_psi ψ GREEK SMALL LETTER PSI */
+    new codepair(0x07f9, 0x03c9), /*                 Greek_omega ω GREEK SMALL LETTER OMEGA */
+    new codepair(0x08a1, 0x23b7), /*                 leftradical ⎷ ??? */
+    new codepair(0x08a2, 0x250c), /*              topleftradical ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */
+    new codepair(0x08a3, 0x2500), /*              horizconnector ─ BOX DRAWINGS LIGHT HORIZONTAL */
+    new codepair(0x08a4, 0x2320), /*                 topintegral ⌠ TOP HALF INTEGRAL */
+    new codepair(0x08a5, 0x2321), /*                 botintegral ⌡ BOTTOM HALF INTEGRAL */
+    new codepair(0x08a6, 0x2502), /*               vertconnector │ BOX DRAWINGS LIGHT VERTICAL */
+    new codepair(0x08a7, 0x23a1), /*            topleftsqbracket ⎡ ??? */
+    new codepair(0x08a8, 0x23a3), /*            botleftsqbracket ⎣ ??? */
+    new codepair(0x08a9, 0x23a4), /*           toprightsqbracket ⎤ ??? */
+    new codepair(0x08aa, 0x23a6), /*           botrightsqbracket ⎦ ??? */
+    new codepair(0x08ab, 0x239b), /*               topleftparens ⎛ ??? */
+    new codepair(0x08ac, 0x239d), /*               botleftparens ⎝ ??? */
+    new codepair(0x08ad, 0x239e), /*              toprightparens ⎞ ??? */
+    new codepair(0x08ae, 0x23a0), /*              botrightparens ⎠ ??? */
+    new codepair(0x08af, 0x23a8), /*        leftmiddlecurlybrace ⎨ ??? */
+    new codepair(0x08b0, 0x23ac), /*       rightmiddlecurlybrace ⎬ ??? */
+  /*  0x08b1                          topleftsummation ? ??? */
+  /*  0x08b2                          botleftsummation ? ??? */
+  /*  0x08b3                 topvertsummationconnector ? ??? */
+  /*  0x08b4                 botvertsummationconnector ? ??? */
+  /*  0x08b5                         toprightsummation ? ??? */
+  /*  0x08b6                         botrightsummation ? ??? */
+  /*  0x08b7                      rightmiddlesummation ? ??? */
+    new codepair(0x08bc, 0x2264), /*               lessthanequal ≤ LESS-THAN OR EQUAL TO */
+    new codepair(0x08bd, 0x2260), /*                    notequal ≠ NOT EQUAL TO */
+    new codepair(0x08be, 0x2265), /*            greaterthanequal ≥ GREATER-THAN OR EQUAL TO */
+    new codepair(0x08bf, 0x222b), /*                    integral ∫ INTEGRAL */
+    new codepair(0x08c0, 0x2234), /*                   therefore ∴ THEREFORE */
+    new codepair(0x08c1, 0x221d), /*                   variation ∝ PROPORTIONAL TO */
+    new codepair(0x08c2, 0x221e), /*                    infinity ∞ INFINITY */
+    new codepair(0x08c5, 0x2207), /*                       nabla ∇ NABLA */
+    new codepair(0x08c8, 0x223c), /*                 approximate ∼ TILDE OPERATOR */
+    new codepair(0x08c9, 0x2243), /*                similarequal ≃ ASYMPTOTICALLY EQUAL TO */
+    new codepair(0x08cd, 0x21d4), /*                    ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */
+    new codepair(0x08ce, 0x21d2), /*                     implies ⇒ RIGHTWARDS DOUBLE ARROW */
+    new codepair(0x08cf, 0x2261), /*                   identical ≡ IDENTICAL TO */
+    new codepair(0x08d6, 0x221a), /*                     radical √ SQUARE ROOT */
+    new codepair(0x08da, 0x2282), /*                  includedin ⊂ SUBSET OF */
+    new codepair(0x08db, 0x2283), /*                    includes ⊃ SUPERSET OF */
+    new codepair(0x08dc, 0x2229), /*                intersection ∩ INTERSECTION */
+    new codepair(0x08dd, 0x222a), /*                       union ∪ UNION */
+    new codepair(0x08de, 0x2227), /*                  logicaland ∧ LOGICAL AND */
+    new codepair(0x08df, 0x2228), /*                   logicalor ∨ LOGICAL OR */
+    new codepair(0x08ef, 0x2202), /*           partialderivative ∂ PARTIAL DIFFERENTIAL */
+    new codepair(0x08f6, 0x0192), /*                    function ƒ LATIN SMALL LETTER F WITH HOOK */
+    new codepair(0x08fb, 0x2190), /*                   leftarrow ← LEFTWARDS ARROW */
+    new codepair(0x08fc, 0x2191), /*                     uparrow ↑ UPWARDS ARROW */
+    new codepair(0x08fd, 0x2192), /*                  rightarrow → RIGHTWARDS ARROW */
+    new codepair(0x08fe, 0x2193), /*                   downarrow ↓ DOWNWARDS ARROW */
+  /*  0x09df                                     blank ? ??? */
+    new codepair(0x09e0, 0x25c6), /*                soliddiamond ◆ BLACK DIAMOND */
+    new codepair(0x09e1, 0x2592), /*                checkerboard ▒ MEDIUM SHADE */
+    new codepair(0x09e2, 0x2409), /*                          ht ␉ SYMBOL FOR HORIZONTAL TABULATION */
+    new codepair(0x09e3, 0x240c), /*                          ff ␌ SYMBOL FOR FORM FEED */
+    new codepair(0x09e4, 0x240d), /*                          cr ␍ SYMBOL FOR CARRIAGE RETURN */
+    new codepair(0x09e5, 0x240a), /*                          lf ␊ SYMBOL FOR LINE FEED */
+    new codepair(0x09e8, 0x2424), /*                          nl ␤ SYMBOL FOR NEWLINE */
+    new codepair(0x09e9, 0x240b), /*                          vt ␋ SYMBOL FOR VERTICAL TABULATION */
+    new codepair(0x09ea, 0x2518), /*              lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */
+    new codepair(0x09eb, 0x2510), /*               uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */
+    new codepair(0x09ec, 0x250c), /*                upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */
+    new codepair(0x09ed, 0x2514), /*               lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */
+    new codepair(0x09ee, 0x253c), /*               crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+    new codepair(0x09ef, 0x23ba), /*              horizlinescan1 ⎺ HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */
+    new codepair(0x09f0, 0x23bb), /*              horizlinescan3 ⎻ HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */
+    new codepair(0x09f1, 0x2500), /*              horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */
+    new codepair(0x09f2, 0x23bc), /*              horizlinescan7 ⎼ HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */
+    new codepair(0x09f3, 0x23bd), /*              horizlinescan9 ⎽ HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */
+    new codepair(0x09f4, 0x251c), /*                       leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+    new codepair(0x09f5, 0x2524), /*                      rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+    new codepair(0x09f6, 0x2534), /*                        bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+    new codepair(0x09f7, 0x252c), /*                        topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+    new codepair(0x09f8, 0x2502), /*                     vertbar │ BOX DRAWINGS LIGHT VERTICAL */
+    new codepair(0x0aa1, 0x2003), /*                     emspace   EM SPACE */
+    new codepair(0x0aa2, 0x2002), /*                     enspace   EN SPACE */
+    new codepair(0x0aa3, 0x2004), /*                    em3space   THREE-PER-EM SPACE */
+    new codepair(0x0aa4, 0x2005), /*                    em4space   FOUR-PER-EM SPACE */
+    new codepair(0x0aa5, 0x2007), /*                  digitspace   FIGURE SPACE */
+    new codepair(0x0aa6, 0x2008), /*                  punctspace   PUNCTUATION SPACE */
+    new codepair(0x0aa7, 0x2009), /*                   thinspace   THIN SPACE */
+    new codepair(0x0aa8, 0x200a), /*                   hairspace   HAIR SPACE */
+    new codepair(0x0aa9, 0x2014), /*                      emdash — EM DASH */
+    new codepair(0x0aaa, 0x2013), /*                      endash – EN DASH */
+  /*  0x0aac                               signifblank ? ??? */
+    new codepair(0x0aae, 0x2026), /*                    ellipsis … HORIZONTAL ELLIPSIS */
+    new codepair(0x0aaf, 0x2025), /*             doubbaselinedot ‥ TWO DOT LEADER */
+    new codepair(0x0ab0, 0x2153), /*                    onethird ⅓ VULGAR FRACTION ONE THIRD */
+    new codepair(0x0ab1, 0x2154), /*                   twothirds ⅔ VULGAR FRACTION TWO THIRDS */
+    new codepair(0x0ab2, 0x2155), /*                    onefifth ⅕ VULGAR FRACTION ONE FIFTH */
+    new codepair(0x0ab3, 0x2156), /*                   twofifths ⅖ VULGAR FRACTION TWO FIFTHS */
+    new codepair(0x0ab4, 0x2157), /*                 threefifths ⅗ VULGAR FRACTION THREE FIFTHS */
+    new codepair(0x0ab5, 0x2158), /*                  fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */
+    new codepair(0x0ab6, 0x2159), /*                    onesixth ⅙ VULGAR FRACTION ONE SIXTH */
+    new codepair(0x0ab7, 0x215a), /*                  fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */
+    new codepair(0x0ab8, 0x2105), /*                      careof ℅ CARE OF */
+    new codepair(0x0abb, 0x2012), /*                     figdash ‒ FIGURE DASH */
+    new codepair(0x0abc, 0x2329), /*            leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */
+  /*  0x0abd                              decimalpoint ? ??? */
+    new codepair(0x0abe, 0x232a), /*           rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */
+  /*  0x0abf                                    marker ? ??? */
+    new codepair(0x0ac3, 0x215b), /*                   oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */
+    new codepair(0x0ac4, 0x215c), /*                threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */
+    new codepair(0x0ac5, 0x215d), /*                 fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */
+    new codepair(0x0ac6, 0x215e), /*                seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */
+    new codepair(0x0ac9, 0x2122), /*                   trademark ™ TRADE MARK SIGN */
+    new codepair(0x0aca, 0x2613), /*               signaturemark ☓ SALTIRE */
+  /*  0x0acb                         trademarkincircle ? ??? */
+    new codepair(0x0acc, 0x25c1), /*            leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */
+    new codepair(0x0acd, 0x25b7), /*           rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */
+    new codepair(0x0ace, 0x25cb), /*                emopencircle ○ WHITE CIRCLE */
+    new codepair(0x0acf, 0x25af), /*             emopenrectangle ▯ WHITE VERTICAL RECTANGLE */
+    new codepair(0x0ad0, 0x2018), /*         leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */
+    new codepair(0x0ad1, 0x2019), /*        rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */
+    new codepair(0x0ad2, 0x201c), /*         leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */
+    new codepair(0x0ad3, 0x201d), /*        rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */
+    new codepair(0x0ad4, 0x211e), /*                prescription ℞ PRESCRIPTION TAKE */
+    new codepair(0x0ad6, 0x2032), /*                     minutes ′ PRIME */
+    new codepair(0x0ad7, 0x2033), /*                     seconds ″ DOUBLE PRIME */
+    new codepair(0x0ad9, 0x271d), /*                  latincross ✝ LATIN CROSS */
+  /*  0x0ada                                  hexagram ? ??? */
+    new codepair(0x0adb, 0x25ac), /*            filledrectbullet ▬ BLACK RECTANGLE */
+    new codepair(0x0adc, 0x25c0), /*         filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */
+    new codepair(0x0add, 0x25b6), /*        filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */
+    new codepair(0x0ade, 0x25cf), /*              emfilledcircle ● BLACK CIRCLE */
+    new codepair(0x0adf, 0x25ae), /*                emfilledrect ▮ BLACK VERTICAL RECTANGLE */
+    new codepair(0x0ae0, 0x25e6), /*            enopencircbullet ◦ WHITE BULLET */
+    new codepair(0x0ae1, 0x25ab), /*          enopensquarebullet ▫ WHITE SMALL SQUARE */
+    new codepair(0x0ae2, 0x25ad), /*              openrectbullet ▭ WHITE RECTANGLE */
+    new codepair(0x0ae3, 0x25b3), /*             opentribulletup △ WHITE UP-POINTING TRIANGLE */
+    new codepair(0x0ae4, 0x25bd), /*           opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */
+    new codepair(0x0ae5, 0x2606), /*                    openstar ☆ WHITE STAR */
+    new codepair(0x0ae6, 0x2022), /*          enfilledcircbullet • BULLET */
+    new codepair(0x0ae7, 0x25aa), /*            enfilledsqbullet ▪ BLACK SMALL SQUARE */
+    new codepair(0x0ae8, 0x25b2), /*           filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */
+    new codepair(0x0ae9, 0x25bc), /*         filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */
+    new codepair(0x0aea, 0x261c), /*                 leftpointer ☜ WHITE LEFT POINTING INDEX */
+    new codepair(0x0aeb, 0x261e), /*                rightpointer ☞ WHITE RIGHT POINTING INDEX */
+    new codepair(0x0aec, 0x2663), /*                        club ♣ BLACK CLUB SUIT */
+    new codepair(0x0aed, 0x2666), /*                     diamond ♦ BLACK DIAMOND SUIT */
+    new codepair(0x0aee, 0x2665), /*                       heart ♥ BLACK HEART SUIT */
+    new codepair(0x0af0, 0x2720), /*                maltesecross ✠ MALTESE CROSS */
+    new codepair(0x0af1, 0x2020), /*                      dagger † DAGGER */
+    new codepair(0x0af2, 0x2021), /*                doubledagger ‡ DOUBLE DAGGER */
+    new codepair(0x0af3, 0x2713), /*                   checkmark ✓ CHECK MARK */
+    new codepair(0x0af4, 0x2717), /*                 ballotcross ✗ BALLOT X */
+    new codepair(0x0af5, 0x266f), /*                musicalsharp ♯ MUSIC SHARP SIGN */
+    new codepair(0x0af6, 0x266d), /*                 musicalflat ♭ MUSIC FLAT SIGN */
+    new codepair(0x0af7, 0x2642), /*                  malesymbol ♂ MALE SIGN */
+    new codepair(0x0af8, 0x2640), /*                femalesymbol ♀ FEMALE SIGN */
+    new codepair(0x0af9, 0x260e), /*                   telephone ☎ BLACK TELEPHONE */
+    new codepair(0x0afa, 0x2315), /*           telephonerecorder ⌕ TELEPHONE RECORDER */
+    new codepair(0x0afb, 0x2117), /*         phonographcopyright ℗ SOUND RECORDING COPYRIGHT */
+    new codepair(0x0afc, 0x2038), /*                       caret ‸ CARET */
+    new codepair(0x0afd, 0x201a), /*          singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */
+    new codepair(0x0afe, 0x201e), /*          doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */
+  /*  0x0aff                                    cursor ? ??? */
+    new codepair(0x0ba3, 0x003c), /*                   leftcaret < LESS-THAN SIGN */
+    new codepair(0x0ba6, 0x003e), /*                  rightcaret > GREATER-THAN SIGN */
+    new codepair(0x0ba8, 0x2228), /*                   downcaret ∨ LOGICAL OR */
+    new codepair(0x0ba9, 0x2227), /*                     upcaret ∧ LOGICAL AND */
+    new codepair(0x0bc0, 0x00af), /*                     overbar ¯ MACRON */
+    new codepair(0x0bc2, 0x22a5), /*                    downtack ⊥ UP TACK */
+    new codepair(0x0bc3, 0x2229), /*                      upshoe ∩ INTERSECTION */
+    new codepair(0x0bc4, 0x230a), /*                   downstile ⌊ LEFT FLOOR */
+    new codepair(0x0bc6, 0x005f), /*                    underbar _ LOW LINE */
+    new codepair(0x0bca, 0x2218), /*                         jot ∘ RING OPERATOR */
+    new codepair(0x0bcc, 0x2395), /*                        quad ⎕ APL FUNCTIONAL SYMBOL QUAD */
+    new codepair(0x0bce, 0x22a4), /*                      uptack ⊤ DOWN TACK */
+    new codepair(0x0bcf, 0x25cb), /*                      circle ○ WHITE CIRCLE */
+    new codepair(0x0bd3, 0x2308), /*                     upstile ⌈ LEFT CEILING */
+    new codepair(0x0bd6, 0x222a), /*                    downshoe ∪ UNION */
+    new codepair(0x0bd8, 0x2283), /*                   rightshoe ⊃ SUPERSET OF */
+    new codepair(0x0bda, 0x2282), /*                    leftshoe ⊂ SUBSET OF */
+    new codepair(0x0bdc, 0x22a2), /*                    lefttack ⊢ RIGHT TACK */
+    new codepair(0x0bfc, 0x22a3), /*                   righttack ⊣ LEFT TACK */
+    new codepair(0x0cdf, 0x2017), /*        hebrew_doublelowline ‗ DOUBLE LOW LINE */
+    new codepair(0x0ce0, 0x05d0), /*                hebrew_aleph א HEBREW LETTER ALEF */
+    new codepair(0x0ce1, 0x05d1), /*                  hebrew_bet ב HEBREW LETTER BET */
+    new codepair(0x0ce2, 0x05d2), /*                hebrew_gimel ג HEBREW LETTER GIMEL */
+    new codepair(0x0ce3, 0x05d3), /*                hebrew_dalet ד HEBREW LETTER DALET */
+    new codepair(0x0ce4, 0x05d4), /*                   hebrew_he ה HEBREW LETTER HE */
+    new codepair(0x0ce5, 0x05d5), /*                  hebrew_waw ו HEBREW LETTER VAV */
+    new codepair(0x0ce6, 0x05d6), /*                 hebrew_zain ז HEBREW LETTER ZAYIN */
+    new codepair(0x0ce7, 0x05d7), /*                 hebrew_chet ח HEBREW LETTER HET */
+    new codepair(0x0ce8, 0x05d8), /*                  hebrew_tet ט HEBREW LETTER TET */
+    new codepair(0x0ce9, 0x05d9), /*                  hebrew_yod י HEBREW LETTER YOD */
+    new codepair(0x0cea, 0x05da), /*            hebrew_finalkaph ך HEBREW LETTER FINAL KAF */
+    new codepair(0x0ceb, 0x05db), /*                 hebrew_kaph כ HEBREW LETTER KAF */
+    new codepair(0x0cec, 0x05dc), /*                hebrew_lamed ל HEBREW LETTER LAMED */
+    new codepair(0x0ced, 0x05dd), /*             hebrew_finalmem ם HEBREW LETTER FINAL MEM */
+    new codepair(0x0cee, 0x05de), /*                  hebrew_mem מ HEBREW LETTER MEM */
+    new codepair(0x0cef, 0x05df), /*             hebrew_finalnun ן HEBREW LETTER FINAL NUN */
+    new codepair(0x0cf0, 0x05e0), /*                  hebrew_nun נ HEBREW LETTER NUN */
+    new codepair(0x0cf1, 0x05e1), /*               hebrew_samech ס HEBREW LETTER SAMEKH */
+    new codepair(0x0cf2, 0x05e2), /*                 hebrew_ayin ע HEBREW LETTER AYIN */
+    new codepair(0x0cf3, 0x05e3), /*              hebrew_finalpe ף HEBREW LETTER FINAL PE */
+    new codepair(0x0cf4, 0x05e4), /*                   hebrew_pe פ HEBREW LETTER PE */
+    new codepair(0x0cf5, 0x05e5), /*            hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */
+    new codepair(0x0cf6, 0x05e6), /*                 hebrew_zade צ HEBREW LETTER TSADI */
+    new codepair(0x0cf7, 0x05e7), /*                 hebrew_qoph ק HEBREW LETTER QOF */
+    new codepair(0x0cf8, 0x05e8), /*                 hebrew_resh ר HEBREW LETTER RESH */
+    new codepair(0x0cf9, 0x05e9), /*                 hebrew_shin ש HEBREW LETTER SHIN */
+    new codepair(0x0cfa, 0x05ea), /*                  hebrew_taw ת HEBREW LETTER TAV */
+    new codepair(0x0da1, 0x0e01), /*                  Thai_kokai ก THAI CHARACTER KO KAI */
+    new codepair(0x0da2, 0x0e02), /*                Thai_khokhai ข THAI CHARACTER KHO KHAI */
+    new codepair(0x0da3, 0x0e03), /*               Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */
+    new codepair(0x0da4, 0x0e04), /*               Thai_khokhwai ค THAI CHARACTER KHO KHWAI */
+    new codepair(0x0da5, 0x0e05), /*                Thai_khokhon ฅ THAI CHARACTER KHO KHON */
+    new codepair(0x0da6, 0x0e06), /*             Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */
+    new codepair(0x0da7, 0x0e07), /*                 Thai_ngongu ง THAI CHARACTER NGO NGU */
+    new codepair(0x0da8, 0x0e08), /*                Thai_chochan จ THAI CHARACTER CHO CHAN */
+    new codepair(0x0da9, 0x0e09), /*               Thai_choching ฉ THAI CHARACTER CHO CHING */
+    new codepair(0x0daa, 0x0e0a), /*               Thai_chochang ช THAI CHARACTER CHO CHANG */
+    new codepair(0x0dab, 0x0e0b), /*                   Thai_soso ซ THAI CHARACTER SO SO */
+    new codepair(0x0dac, 0x0e0c), /*                Thai_chochoe ฌ THAI CHARACTER CHO CHOE */
+    new codepair(0x0dad, 0x0e0d), /*                 Thai_yoying ญ THAI CHARACTER YO YING */
+    new codepair(0x0dae, 0x0e0e), /*                Thai_dochada ฎ THAI CHARACTER DO CHADA */
+    new codepair(0x0daf, 0x0e0f), /*                Thai_topatak ฏ THAI CHARACTER TO PATAK */
+    new codepair(0x0db0, 0x0e10), /*                Thai_thothan ฐ THAI CHARACTER THO THAN */
+    new codepair(0x0db1, 0x0e11), /*          Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */
+    new codepair(0x0db2, 0x0e12), /*             Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */
+    new codepair(0x0db3, 0x0e13), /*                  Thai_nonen ณ THAI CHARACTER NO NEN */
+    new codepair(0x0db4, 0x0e14), /*                  Thai_dodek ด THAI CHARACTER DO DEK */
+    new codepair(0x0db5, 0x0e15), /*                  Thai_totao ต THAI CHARACTER TO TAO */
+    new codepair(0x0db6, 0x0e16), /*               Thai_thothung ถ THAI CHARACTER THO THUNG */
+    new codepair(0x0db7, 0x0e17), /*              Thai_thothahan ท THAI CHARACTER THO THAHAN */
+    new codepair(0x0db8, 0x0e18), /*               Thai_thothong ธ THAI CHARACTER THO THONG */
+    new codepair(0x0db9, 0x0e19), /*                   Thai_nonu น THAI CHARACTER NO NU */
+    new codepair(0x0dba, 0x0e1a), /*               Thai_bobaimai บ THAI CHARACTER BO BAIMAI */
+    new codepair(0x0dbb, 0x0e1b), /*                  Thai_popla ป THAI CHARACTER PO PLA */
+    new codepair(0x0dbc, 0x0e1c), /*               Thai_phophung ผ THAI CHARACTER PHO PHUNG */
+    new codepair(0x0dbd, 0x0e1d), /*                   Thai_fofa ฝ THAI CHARACTER FO FA */
+    new codepair(0x0dbe, 0x0e1e), /*                Thai_phophan พ THAI CHARACTER PHO PHAN */
+    new codepair(0x0dbf, 0x0e1f), /*                  Thai_fofan ฟ THAI CHARACTER FO FAN */
+    new codepair(0x0dc0, 0x0e20), /*             Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */
+    new codepair(0x0dc1, 0x0e21), /*                   Thai_moma ม THAI CHARACTER MO MA */
+    new codepair(0x0dc2, 0x0e22), /*                  Thai_yoyak ย THAI CHARACTER YO YAK */
+    new codepair(0x0dc3, 0x0e23), /*                  Thai_rorua ร THAI CHARACTER RO RUA */
+    new codepair(0x0dc4, 0x0e24), /*                     Thai_ru ฤ THAI CHARACTER RU */
+    new codepair(0x0dc5, 0x0e25), /*                 Thai_loling ล THAI CHARACTER LO LING */
+    new codepair(0x0dc6, 0x0e26), /*                     Thai_lu ฦ THAI CHARACTER LU */
+    new codepair(0x0dc7, 0x0e27), /*                 Thai_wowaen ว THAI CHARACTER WO WAEN */
+    new codepair(0x0dc8, 0x0e28), /*                 Thai_sosala ศ THAI CHARACTER SO SALA */
+    new codepair(0x0dc9, 0x0e29), /*                 Thai_sorusi ษ THAI CHARACTER SO RUSI */
+    new codepair(0x0dca, 0x0e2a), /*                  Thai_sosua ส THAI CHARACTER SO SUA */
+    new codepair(0x0dcb, 0x0e2b), /*                  Thai_hohip ห THAI CHARACTER HO HIP */
+    new codepair(0x0dcc, 0x0e2c), /*                Thai_lochula ฬ THAI CHARACTER LO CHULA */
+    new codepair(0x0dcd, 0x0e2d), /*                   Thai_oang อ THAI CHARACTER O ANG */
+    new codepair(0x0dce, 0x0e2e), /*               Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */
+    new codepair(0x0dcf, 0x0e2f), /*              Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */
+    new codepair(0x0dd0, 0x0e30), /*                  Thai_saraa ะ THAI CHARACTER SARA A */
+    new codepair(0x0dd1, 0x0e31), /*             Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */
+    new codepair(0x0dd2, 0x0e32), /*                 Thai_saraaa า THAI CHARACTER SARA AA */
+    new codepair(0x0dd3, 0x0e33), /*                 Thai_saraam ำ THAI CHARACTER SARA AM */
+    new codepair(0x0dd4, 0x0e34), /*                  Thai_sarai ิ THAI CHARACTER SARA I */
+    new codepair(0x0dd5, 0x0e35), /*                 Thai_saraii ี THAI CHARACTER SARA II */
+    new codepair(0x0dd6, 0x0e36), /*                 Thai_saraue ึ THAI CHARACTER SARA UE */
+    new codepair(0x0dd7, 0x0e37), /*                Thai_sarauee ื THAI CHARACTER SARA UEE */
+    new codepair(0x0dd8, 0x0e38), /*                  Thai_sarau ุ THAI CHARACTER SARA U */
+    new codepair(0x0dd9, 0x0e39), /*                 Thai_sarauu ู THAI CHARACTER SARA UU */
+    new codepair(0x0dda, 0x0e3a), /*                Thai_phinthu ฺ THAI CHARACTER PHINTHU */
+  /*  0x0dde                    Thai_maihanakat_maitho ? ??? */
+    new codepair(0x0ddf, 0x0e3f), /*                   Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */
+    new codepair(0x0de0, 0x0e40), /*                  Thai_sarae เ THAI CHARACTER SARA E */
+    new codepair(0x0de1, 0x0e41), /*                 Thai_saraae แ THAI CHARACTER SARA AE */
+    new codepair(0x0de2, 0x0e42), /*                  Thai_sarao โ THAI CHARACTER SARA O */
+    new codepair(0x0de3, 0x0e43), /*          Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */
+    new codepair(0x0de4, 0x0e44), /*         Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */
+    new codepair(0x0de5, 0x0e45), /*            Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */
+    new codepair(0x0de6, 0x0e46), /*               Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */
+    new codepair(0x0de7, 0x0e47), /*              Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */
+    new codepair(0x0de8, 0x0e48), /*                  Thai_maiek ่ THAI CHARACTER MAI EK */
+    new codepair(0x0de9, 0x0e49), /*                 Thai_maitho ้ THAI CHARACTER MAI THO */
+    new codepair(0x0dea, 0x0e4a), /*                 Thai_maitri ๊ THAI CHARACTER MAI TRI */
+    new codepair(0x0deb, 0x0e4b), /*            Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */
+    new codepair(0x0dec, 0x0e4c), /*            Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */
+    new codepair(0x0ded, 0x0e4d), /*               Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */
+    new codepair(0x0df0, 0x0e50), /*                 Thai_leksun ๐ THAI DIGIT ZERO */
+    new codepair(0x0df1, 0x0e51), /*                Thai_leknung ๑ THAI DIGIT ONE */
+    new codepair(0x0df2, 0x0e52), /*                Thai_leksong ๒ THAI DIGIT TWO */
+    new codepair(0x0df3, 0x0e53), /*                 Thai_leksam ๓ THAI DIGIT THREE */
+    new codepair(0x0df4, 0x0e54), /*                  Thai_leksi ๔ THAI DIGIT FOUR */
+    new codepair(0x0df5, 0x0e55), /*                  Thai_lekha ๕ THAI DIGIT FIVE */
+    new codepair(0x0df6, 0x0e56), /*                 Thai_lekhok ๖ THAI DIGIT SIX */
+    new codepair(0x0df7, 0x0e57), /*                Thai_lekchet ๗ THAI DIGIT SEVEN */
+    new codepair(0x0df8, 0x0e58), /*                Thai_lekpaet ๘ THAI DIGIT EIGHT */
+    new codepair(0x0df9, 0x0e59), /*                 Thai_lekkao ๙ THAI DIGIT NINE */
+    new codepair(0x0ea1, 0x3131), /*               Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */
+    new codepair(0x0ea2, 0x3132), /*          Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */
+    new codepair(0x0ea3, 0x3133), /*           Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */
+    new codepair(0x0ea4, 0x3134), /*                Hangul_Nieun ㄴ HANGUL LETTER NIEUN */
+    new codepair(0x0ea5, 0x3135), /*           Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */
+    new codepair(0x0ea6, 0x3136), /*           Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */
+    new codepair(0x0ea7, 0x3137), /*               Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */
+    new codepair(0x0ea8, 0x3138), /*          Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */
+    new codepair(0x0ea9, 0x3139), /*                Hangul_Rieul ㄹ HANGUL LETTER RIEUL */
+    new codepair(0x0eaa, 0x313a), /*          Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */
+    new codepair(0x0eab, 0x313b), /*           Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */
+    new codepair(0x0eac, 0x313c), /*           Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */
+    new codepair(0x0ead, 0x313d), /*            Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */
+    new codepair(0x0eae, 0x313e), /*           Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */
+    new codepair(0x0eaf, 0x313f), /*          Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */
+    new codepair(0x0eb0, 0x3140), /*           Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */
+    new codepair(0x0eb1, 0x3141), /*                Hangul_Mieum ㅁ HANGUL LETTER MIEUM */
+    new codepair(0x0eb2, 0x3142), /*                Hangul_Pieub ㅂ HANGUL LETTER PIEUP */
+    new codepair(0x0eb3, 0x3143), /*           Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */
+    new codepair(0x0eb4, 0x3144), /*            Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */
+    new codepair(0x0eb5, 0x3145), /*                 Hangul_Sios ㅅ HANGUL LETTER SIOS */
+    new codepair(0x0eb6, 0x3146), /*            Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */
+    new codepair(0x0eb7, 0x3147), /*                Hangul_Ieung ㅇ HANGUL LETTER IEUNG */
+    new codepair(0x0eb8, 0x3148), /*                Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */
+    new codepair(0x0eb9, 0x3149), /*           Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */
+    new codepair(0x0eba, 0x314a), /*                Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */
+    new codepair(0x0ebb, 0x314b), /*               Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */
+    new codepair(0x0ebc, 0x314c), /*                Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */
+    new codepair(0x0ebd, 0x314d), /*               Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */
+    new codepair(0x0ebe, 0x314e), /*                Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */
+    new codepair(0x0ebf, 0x314f), /*                    Hangul_A ㅏ HANGUL LETTER A */
+    new codepair(0x0ec0, 0x3150), /*                   Hangul_AE ㅐ HANGUL LETTER AE */
+    new codepair(0x0ec1, 0x3151), /*                   Hangul_YA ㅑ HANGUL LETTER YA */
+    new codepair(0x0ec2, 0x3152), /*                  Hangul_YAE ㅒ HANGUL LETTER YAE */
+    new codepair(0x0ec3, 0x3153), /*                   Hangul_EO ㅓ HANGUL LETTER EO */
+    new codepair(0x0ec4, 0x3154), /*                    Hangul_E ㅔ HANGUL LETTER E */
+    new codepair(0x0ec5, 0x3155), /*                  Hangul_YEO ㅕ HANGUL LETTER YEO */
+    new codepair(0x0ec6, 0x3156), /*                   Hangul_YE ㅖ HANGUL LETTER YE */
+    new codepair(0x0ec7, 0x3157), /*                    Hangul_O ㅗ HANGUL LETTER O */
+    new codepair(0x0ec8, 0x3158), /*                   Hangul_WA ㅘ HANGUL LETTER WA */
+    new codepair(0x0ec9, 0x3159), /*                  Hangul_WAE ㅙ HANGUL LETTER WAE */
+    new codepair(0x0eca, 0x315a), /*                   Hangul_OE ㅚ HANGUL LETTER OE */
+    new codepair(0x0ecb, 0x315b), /*                   Hangul_YO ㅛ HANGUL LETTER YO */
+    new codepair(0x0ecc, 0x315c), /*                    Hangul_U ㅜ HANGUL LETTER U */
+    new codepair(0x0ecd, 0x315d), /*                  Hangul_WEO ㅝ HANGUL LETTER WEO */
+    new codepair(0x0ece, 0x315e), /*                   Hangul_WE ㅞ HANGUL LETTER WE */
+    new codepair(0x0ecf, 0x315f), /*                   Hangul_WI ㅟ HANGUL LETTER WI */
+    new codepair(0x0ed0, 0x3160), /*                   Hangul_YU ㅠ HANGUL LETTER YU */
+    new codepair(0x0ed1, 0x3161), /*                   Hangul_EU ㅡ HANGUL LETTER EU */
+    new codepair(0x0ed2, 0x3162), /*                   Hangul_YI ㅢ HANGUL LETTER YI */
+    new codepair(0x0ed3, 0x3163), /*                    Hangul_I ㅣ HANGUL LETTER I */
+    new codepair(0x0ed4, 0x11a8), /*             Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */
+    new codepair(0x0ed5, 0x11a9), /*        Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */
+    new codepair(0x0ed6, 0x11aa), /*         Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */
+    new codepair(0x0ed7, 0x11ab), /*              Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */
+    new codepair(0x0ed8, 0x11ac), /*         Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */
+    new codepair(0x0ed9, 0x11ad), /*         Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */
+    new codepair(0x0eda, 0x11ae), /*             Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */
+    new codepair(0x0edb, 0x11af), /*              Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */
+    new codepair(0x0edc, 0x11b0), /*        Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */
+    new codepair(0x0edd, 0x11b1), /*         Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */
+    new codepair(0x0ede, 0x11b2), /*         Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */
+    new codepair(0x0edf, 0x11b3), /*          Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */
+    new codepair(0x0ee0, 0x11b4), /*         Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */
+    new codepair(0x0ee1, 0x11b5), /*        Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */
+    new codepair(0x0ee2, 0x11b6), /*         Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */
+    new codepair(0x0ee3, 0x11b7), /*              Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */
+    new codepair(0x0ee4, 0x11b8), /*              Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */
+    new codepair(0x0ee5, 0x11b9), /*          Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */
+    new codepair(0x0ee6, 0x11ba), /*               Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */
+    new codepair(0x0ee7, 0x11bb), /*          Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */
+    new codepair(0x0ee8, 0x11bc), /*              Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */
+    new codepair(0x0ee9, 0x11bd), /*              Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */
+    new codepair(0x0eea, 0x11be), /*              Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */
+    new codepair(0x0eeb, 0x11bf), /*             Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */
+    new codepair(0x0eec, 0x11c0), /*              Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */
+    new codepair(0x0eed, 0x11c1), /*             Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */
+    new codepair(0x0eee, 0x11c2), /*              Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */
+    new codepair(0x0eef, 0x316d), /*     Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */
+    new codepair(0x0ef0, 0x3171), /*    Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */
+    new codepair(0x0ef1, 0x3178), /*    Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */
+    new codepair(0x0ef2, 0x317f), /*              Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */
+    new codepair(0x0ef3, 0x3181), /*    Hangul_KkogjiDalrinIeung ㆁ HANGUL LETTER YESIEUNG */
+    new codepair(0x0ef4, 0x3184), /*   Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */
+    new codepair(0x0ef5, 0x3186), /*          Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */
+    new codepair(0x0ef6, 0x318d), /*                Hangul_AraeA ㆍ HANGUL LETTER ARAEA */
+    new codepair(0x0ef7, 0x318e), /*               Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */
+    new codepair(0x0ef8, 0x11eb), /*            Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */
+    new codepair(0x0ef9, 0x11f0), /*  Hangul_J_KkogjiDalrinIeung ᇰ HANGUL JONGSEONG YESIEUNG */
+    new codepair(0x0efa, 0x11f9), /*        Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */
+    new codepair(0x0eff, 0x20a9), /*                  Korean_Won ₩ WON SIGN */
+    new codepair(0x13bc, 0x0152), /*                          OE Œ LATIN CAPITAL LIGATURE OE */
+    new codepair(0x13bd, 0x0153), /*                          oe œ LATIN SMALL LIGATURE OE */
+    new codepair(0x13be, 0x0178), /*                  Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */
+    new codepair(0x20ac, 0x20ac), /*                    EuroSign € EURO SIGN */
+    new codepair(0xfe50, 0x0300), /*                               COMBINING GRAVE ACCENT */
+    new codepair(0xfe51, 0x0301), /*                               COMBINING ACUTE ACCENT */
+    new codepair(0xfe52, 0x0302), /*                               COMBINING CIRCUMFLEX ACCENT */
+    new codepair(0xfe53, 0x0303), /*                               COMBINING TILDE */
+    new codepair(0xfe54, 0x0304), /*                               COMBINING MACRON */
+    new codepair(0xfe55, 0x0306), /*                               COMBINING BREVE */
+    new codepair(0xfe56, 0x0307), /*                               COMBINING DOT ABOVE */
+    new codepair(0xfe57, 0x0308), /*                               COMBINING DIAERESIS */
+    new codepair(0xfe58, 0x030a), /*                               COMBINING RING ABOVE */
+    new codepair(0xfe59, 0x030b), /*                               COMBINING DOUBLE ACUTE ACCENT */
+    new codepair(0xfe5a, 0x030c), /*                               COMBINING CARON */
+    new codepair(0xfe5b, 0x0327), /*                               COMBINING CEDILLA */
+    new codepair(0xfe5c, 0x0328), /*                               COMBINING OGONEK */
+    new codepair(0xfe5d, 0x1da5), /*                               MODIFIER LETTER SMALL IOTA */
+    new codepair(0xfe5e, 0x3099), /*                               COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK */
+    new codepair(0xfe5f, 0x309a), /*                               COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+    new codepair(0xfe60, 0x0323), /*                               COMBINING DOT BELOW */
+  };
+
+  public static combiningpair[] combinetab = {
+    new combiningpair(0x0060, 0x0300), /*                GRAVE ACCENT ` COMBINING GRAVE ACCENT */
+    new combiningpair(0x00b4, 0x0301), /*                ACUTE ACCENT ´ COMBINING ACUTE ACCENT */
+    new combiningpair(0x0027, 0x0301), /*                  APOSTROPHE ' COMBINING ACUTE ACCENT */
+    new combiningpair(0x0384, 0x0301), /*                 GREEK TONOS ΄ COMBINING ACUTE ACCENT */
+    new combiningpair(0x005e, 0x0302), /*           CIRCUMFLEX ACCENT ^ COMBINING CIRCUMFLEX ACCENT */
+    new combiningpair(0x007e, 0x0303), /*                       TILDE ~ COMBINING TILDE */
+    new combiningpair(0x00af, 0x0304), /*                      MACRON ¯ COMBINING MACRON */
+    new combiningpair(0x02d8, 0x0306), /*                       BREVE ˘ COMBINING BREVE */
+    new combiningpair(0x02d9, 0x0307), /*                   DOT ABOVE ˙ COMBINING DOT ABOVE */
+    new combiningpair(0x00a8, 0x0308), /*                   DIAERESIS ¨ COMBINING DIAERESIS */
+    new combiningpair(0x0022, 0x0308), /*              QUOTATION MARK " COMBINING DIAERESIS */
+    new combiningpair(0x02da, 0x030a), /*                  RING ABOVE ˚ COMBINING RING ABOVE */
+    new combiningpair(0x00b0, 0x030a), /*                 DEGREE SIGN ° COMBINING RING ABOVE */
+    new combiningpair(0x02dd, 0x030b), /*         DOUBLE ACUTE ACCENT ˝ COMBINING DOUBLE ACUTE ACCENT */
+    new combiningpair(0x02c7, 0x030c), /*                       CARON ˇ COMBINING CARON */
+    new combiningpair(0x00b8, 0x0327), /*                     CEDILLA ¸ COMBINING CEDILLA */
+    new combiningpair(0x02db, 0x0328), /*                      OGONEK ¸ COMBINING OGONEK */
+    new combiningpair(0x037a, 0x0345), /*         GREEK YPOGEGRAMMENI ͺ COMBINING GREEK YPOGEGRAMMENI */
+    new combiningpair(0x309b, 0x3099), /* KATAKANA-HIRAGANA VOICED SOUND MARK ゛COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK */
+    new combiningpair(0x309c, 0x309a), /* KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK ゜COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+    new combiningpair(0x002e, 0x0323), /*                   FULL STOP . COMBINING DOT BELOW */
+    new combiningpair(0x0385, 0x0344), /*       GREEK DIALYTIKA TONOS ΅ COMBINING GREEK DIALYTIKA TONOS */
+  };
+
+  public static int keysym2ucs(int keysym)
+  {
+    int min = 0;
+    int max = keysymtab.length - 1;
+    int mid;
+
+    /* first check for Latin-1 characters (1:1 mapping) */
+    if ((keysym >= 0x0020 && keysym <= 0x007e) ||
+        (keysym >= 0x00a0 && keysym <= 0x00ff))
+      return keysym;
+
+    /* also check for directly encoded 24-bit UCS characters */
+    if ((keysym & 0xff000000) == 0x01000000)
+      return keysym & 0x00ffffff;
+
+    /* binary search in table */
+    while (max >= min) {
+      mid = (min + max) / 2;
+      if (keysymtab[mid].keysym < keysym)
+        min = mid + 1;
+      else if (keysymtab[mid].keysym > keysym)
+        max = mid - 1;
+      else {
+        /* found it */
+        return keysymtab[mid].ucs;
+      }
+    }
+
+    /* no matching Unicode value found */
+    return -1;
+  }
+
+  public static int ucs2keysym(int ucs) {
+    int cur = 0;
+    int max = keysymtab.length - 1;
+
+    /* first check for Latin-1 characters (1:1 mapping) */
+    if ((ucs >= 0x0020 && ucs <= 0x007e) ||
+        (ucs >= 0x00a0 && ucs <= 0x00ff))
+      return ucs;
+
+    /* linear search in table */
+    while (cur <= max) {
+      if (keysymtab[cur].ucs == ucs)
+        return keysymtab[cur].keysym;
+      cur++;
+    }
+
+    /* use the directly encoded 24-bit UCS character */
+    if ((ucs & 0xff000000) == 0)
+      return ucs | 0x01000000;
+
+    /* no matching Unicode value found */
+    return NoSymbol;
+  }
+
+  public static int ucs2combining(int spacing)
+  {
+    int cur = 0;
+    int max = combinetab.length - 1;
+
+    /* linear search in table */
+    while (cur <= max) {
+      if (combinetab[cur].spacing == spacing)
+        return combinetab[cur].combining;
+      cur++;
+    }
+
+    /* no matching Unicode value found */
+    return -1;
+  }
+
+  private static final int NoSymbol = 0;
+}
diff --git a/java/com/tigervnc/rfb/Keysymdef.java b/java/com/tigervnc/rfb/Keysymdef.java
new file mode 100644 (file)
index 0000000..164e791
--- /dev/null
@@ -0,0 +1,1526 @@
+/* Copyright (C) 2017 Brian P. Hinz
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+package com.tigervnc.rfb;
+
+public class Keysymdef {
+
+  public static final int XK_VoidSymbol = 0xFFFFFF; /* void symbol */
+
+  /*
+   * TTY Functions, cleverly chosen to map to ascii, for convenience of
+   * programming, but could have been arbitrary (at the cost of lookup
+   * tables in client code.
+   */
+
+  public static final int XK_BackSpace = 0xFF08; /* back space, back char */
+  public static final int XK_Tab = 0xFF09;
+  public static final int XK_Linefeed = 0xFF0A; /* Linefeed, LF */
+  public static final int XK_Clear = 0xFF0B;
+  public static final int XK_Return = 0xFF0D; /* Return, enter */
+  public static final int XK_Pause = 0xFF13; /* Pause, hold */
+  public static final int XK_Scroll_Lock = 0xFF14;
+  public static final int XK_Sys_Req = 0xFF15;
+  public static final int XK_Escape = 0xFF1B;
+  public static final int XK_Delete = 0xFFFF; /* Delete, rubout */
+
+  /* International & multi-key character composition */
+
+  public static final int XK_Multi_key = 0xFF20;  /* Multi-key character compose */
+  public static final int XK_Codeinput = 0xFF37;
+  public static final int XK_SingleCandidate = 0xFF3C;
+  public static final int XK_MultipleCandidate = 0xFF3D;
+  public static final int XK_PreviousCandidate = 0xFF3E;
+
+  /* Japanese keyboard support */
+
+  public static final int XK_Kanji = 0xFF21; /* Kanji, Kanji convert */
+  public static final int XK_Muhenkan = 0xFF22;  /* Cancel Conversion */
+  public static final int XK_Henkan_Mode = 0xFF23;  /* Start/Stop Conversion */
+  public static final int XK_Henkan = 0xFF23;  /* Alias for Henkan_Mode */
+  public static final int XK_Romaji = 0xFF24;  /* to Romaji */
+  public static final int XK_Hiragana = 0xFF25;  /* to Hiragana */
+  public static final int XK_Katakana = 0xFF26;  /* to Katakana */
+  public static final int XK_Hiragana_Katakana = 0xFF27;  /* Hiragana/Katakana toggle */
+  public static final int XK_Zenkaku = 0xFF28;  /* to Zenkaku */
+  public static final int XK_Hankaku = 0xFF29;  /* to Hankaku */
+  public static final int XK_Zenkaku_Hankaku = 0xFF2A;  /* Zenkaku/Hankaku toggle */
+  public static final int XK_Touroku = 0xFF2B;  /* Add to Dictionary */
+  public static final int XK_Massyo = 0xFF2C;  /* Delete from Dictionary */
+  public static final int XK_Kana_Lock = 0xFF2D;  /* Kana Lock */
+  public static final int XK_Kana_Shift = 0xFF2E;  /* Kana Shift */
+  public static final int XK_Eisu_Shift = 0xFF2F;  /* Alphanumeric Shift */
+  public static final int XK_Eisu_toggle = 0xFF30;  /* Alphanumeric toggle */
+  public static final int XK_Kanji_Bangou = 0xFF37;  /* Codeinput */
+  public static final int XK_Zen_Koho = 0xFF3D; /* Multiple/All Candidate(s) */
+  public static final int XK_Mae_Koho = 0xFF3E; /* Previous Candidate */
+
+  /* 0xFF31 thru 0xFF3F are under XK_KOREAN */
+
+  /* Cursor control & motion */
+
+  public static final int XK_Home = 0xFF50;
+  public static final int XK_Left = 0xFF51; /* Move left, left arrow */
+  public static final int XK_Up = 0xFF52; /* Move up, up arrow */
+  public static final int XK_Right = 0xFF53; /* Move right, right arrow */
+  public static final int XK_Down = 0xFF54; /* Move down, down arrow */
+  public static final int XK_Prior = 0xFF55; /* Prior, previous */
+  public static final int XK_Page_Up = 0xFF55;
+  public static final int XK_Next = 0xFF56; /* Next */
+  public static final int XK_Page_Down = 0xFF56;
+  public static final int XK_End = 0xFF57; /* EOL */
+  public static final int XK_Begin = 0xFF58; /* BOL */
+
+
+  /* Misc Functions */
+
+  public static final int XK_Select = 0xFF60; /* Select, mark */
+  public static final int XK_Print = 0xFF61;
+  public static final int XK_Execute = 0xFF62; /* Execute, run, do */
+  public static final int XK_Insert = 0xFF63; /* Insert, insert here */
+  public static final int XK_Undo = 0xFF65; /* Undo, oops */
+  public static final int XK_Redo = 0xFF66; /* redo, again */
+  public static final int XK_Menu = 0xFF67;
+  public static final int XK_Find = 0xFF68; /* Find, search */
+  public static final int XK_Cancel = 0xFF69; /* Cancel, stop, abort, exit */
+  public static final int XK_Help = 0xFF6A; /* Help */
+  public static final int XK_Break = 0xFF6B;
+  public static final int XK_Mode_switch = 0xFF7E; /* Character set switch */
+  public static final int XK_script_switch = 0xFF7E;  /* Alias for mode_switch */
+  public static final int XK_Num_Lock = 0xFF7F;
+
+  /* Keypad Functions, keypad numbers cleverly chosen to map to ascii */
+
+  public static final int XK_KP_Space = 0xFF80; /* space */
+  public static final int XK_KP_Tab = 0xFF89;
+  public static final int XK_KP_Enter = 0xFF8D; /* enter */
+  public static final int XK_KP_F1 = 0xFF91; /* PF1, KP_A, ... */
+  public static final int XK_KP_F2 = 0xFF92;
+  public static final int XK_KP_F3 = 0xFF93;
+  public static final int XK_KP_F4 = 0xFF94;
+  public static final int XK_KP_Home = 0xFF95;
+  public static final int XK_KP_Left = 0xFF96;
+  public static final int XK_KP_Up = 0xFF97;
+  public static final int XK_KP_Right = 0xFF98;
+  public static final int XK_KP_Down = 0xFF99;
+  public static final int XK_KP_Prior = 0xFF9A;
+  public static final int XK_KP_Page_Up = 0xFF9A;
+  public static final int XK_KP_Next = 0xFF9B;
+  public static final int XK_KP_Page_Down = 0xFF9B;
+  public static final int XK_KP_End = 0xFF9C;
+  public static final int XK_KP_Begin = 0xFF9D;
+  public static final int XK_KP_Insert = 0xFF9E;
+  public static final int XK_KP_Delete = 0xFF9F;
+  public static final int XK_KP_Equal = 0xFFBD; /* equals */
+  public static final int XK_KP_Multiply = 0xFFAA;
+  public static final int XK_KP_Add = 0xFFAB;
+  public static final int XK_KP_Separator = 0xFFAC; /* separator, often comma */
+  public static final int XK_KP_Subtract = 0xFFAD;
+  public static final int XK_KP_Decimal = 0xFFAE;
+  public static final int XK_KP_Divide = 0xFFAF;
+
+  public static final int XK_KP_0 = 0xFFB0;
+  public static final int XK_KP_1 = 0xFFB1;
+  public static final int XK_KP_2 = 0xFFB2;
+  public static final int XK_KP_3 = 0xFFB3;
+  public static final int XK_KP_4 = 0xFFB4;
+  public static final int XK_KP_5 = 0xFFB5;
+  public static final int XK_KP_6 = 0xFFB6;
+  public static final int XK_KP_7 = 0xFFB7;
+  public static final int XK_KP_8 = 0xFFB8;
+  public static final int XK_KP_9 = 0xFFB9;
+
+  /*
+   * Auxiliary Functions; note the duplicate definitions for left and right;
+   * function keys;  Sun keyboards and a few other manufactures have such;
+   * function key groups on the left and/or right sides of the keyboard.
+   * We've not found a keyboard with more than 35 function keys total.
+   */
+
+  public static final int XK_F1 = 0xFFBE;
+  public static final int XK_F2 = 0xFFBF;
+  public static final int XK_F3 = 0xFFC0;
+  public static final int XK_F4 = 0xFFC1;
+  public static final int XK_F5 = 0xFFC2;
+  public static final int XK_F6 = 0xFFC3;
+  public static final int XK_F7 = 0xFFC4;
+  public static final int XK_F8 = 0xFFC5;
+  public static final int XK_F9 = 0xFFC6;
+  public static final int XK_F10 = 0xFFC7;
+  public static final int XK_F11 = 0xFFC8;
+  public static final int XK_L1 = 0xFFC8;
+  public static final int XK_F12 = 0xFFC9;
+  public static final int XK_L2 = 0xFFC9;
+  public static final int XK_F13 = 0xFFCA;
+  public static final int XK_L3 = 0xFFCA;
+  public static final int XK_F14 = 0xFFCB;
+  public static final int XK_L4 = 0xFFCB;
+  public static final int XK_F15 = 0xFFCC;
+  public static final int XK_L5 = 0xFFCC;
+  public static final int XK_F16 = 0xFFCD;
+  public static final int XK_L6 = 0xFFCD;
+  public static final int XK_F17 = 0xFFCE;
+  public static final int XK_L7 = 0xFFCE;
+  public static final int XK_F18 = 0xFFCF;
+  public static final int XK_L8 = 0xFFCF;
+  public static final int XK_F19 = 0xFFD0;
+  public static final int XK_L9 = 0xFFD0;
+  public static final int XK_F20 = 0xFFD1;
+  public static final int XK_L10 = 0xFFD1;
+  public static final int XK_F21 = 0xFFD2;
+  public static final int XK_R1 = 0xFFD2;
+  public static final int XK_F22 = 0xFFD3;
+  public static final int XK_R2 = 0xFFD3;
+  public static final int XK_F23 = 0xFFD4;
+  public static final int XK_R3 = 0xFFD4;
+  public static final int XK_F24 = 0xFFD5;
+  public static final int XK_R4 = 0xFFD5;
+  public static final int XK_F25 = 0xFFD6;
+  public static final int XK_R5 = 0xFFD6;
+  public static final int XK_F26 = 0xFFD7;
+  public static final int XK_R6 = 0xFFD7;
+  public static final int XK_F27 = 0xFFD8;
+  public static final int XK_R7 = 0xFFD8;
+  public static final int XK_F28 = 0xFFD9;
+  public static final int XK_R8 = 0xFFD9;
+  public static final int XK_F29 = 0xFFDA;
+  public static final int XK_R9 = 0xFFDA;
+  public static final int XK_F30 = 0xFFDB;
+  public static final int XK_R10 = 0xFFDB;
+  public static final int XK_F31 = 0xFFDC;
+  public static final int XK_R11 = 0xFFDC;
+  public static final int XK_F32 = 0xFFDD;
+  public static final int XK_R12 = 0xFFDD;
+  public static final int XK_F33 = 0xFFDE;
+  public static final int XK_R13 = 0xFFDE;
+  public static final int XK_F34 = 0xFFDF;
+  public static final int XK_R14 = 0xFFDF;
+  public static final int XK_F35 = 0xFFE0;
+  public static final int XK_R15 = 0xFFE0;
+
+  /* Modifiers */
+
+  public static final int XK_Shift_L = 0xFFE1; /* Left shift */
+  public static final int XK_Shift_R = 0xFFE2; /* Right shift */
+  public static final int XK_Control_L = 0xFFE3; /* Left control */
+  public static final int XK_Control_R = 0xFFE4; /* Right control */
+  public static final int XK_Caps_Lock = 0xFFE5; /* Caps lock */
+  public static final int XK_Shift_Lock = 0xFFE6; /* Shift lock */
+
+  public static final int XK_Meta_L = 0xFFE7; /* Left meta */
+  public static final int XK_Meta_R = 0xFFE8; /* Right meta */
+  public static final int XK_Alt_L = 0xFFE9; /* Left alt */
+  public static final int XK_Alt_R = 0xFFEA; /* Right alt */
+  public static final int XK_Super_L = 0xFFEB; /* Left super */
+  public static final int XK_Super_R = 0xFFEC; /* Right super */
+  public static final int XK_Hyper_L = 0xFFED; /* Left hyper */
+  public static final int XK_Hyper_R = 0xFFEE; /* Right hyper */
+
+  /*
+   * ISO 9995 Function and Modifier Keys;
+   * Byte 3 = 0xFE;
+   */
+
+  public static final int XK_ISO_Lock = 0xFE01;
+  public static final int XK_ISO_Level2_Latch = 0xFE02;
+  public static final int XK_ISO_Level3_Shift = 0xFE03;
+  public static final int XK_ISO_Level3_Latch = 0xFE04;
+  public static final int XK_ISO_Level3_Lock = 0xFE05;
+  public static final int XK_ISO_Group_Shift = 0xFF7E; /* Alias for mode_switch */
+  public static final int XK_ISO_Group_Latch = 0xFE06;
+  public static final int XK_ISO_Group_Lock = 0xFE07;
+  public static final int XK_ISO_Next_Group = 0xFE08;
+  public static final int XK_ISO_Next_Group_Lock = 0xFE09;
+  public static final int XK_ISO_Prev_Group = 0xFE0A;
+  public static final int XK_ISO_Prev_Group_Lock = 0xFE0B;
+  public static final int XK_ISO_First_Group = 0xFE0C;
+  public static final int XK_ISO_First_Group_Lock = 0xFE0D;
+  public static final int XK_ISO_Last_Group = 0xFE0E;
+  public static final int XK_ISO_Last_Group_Lock = 0xFE0F;
+
+  public static final int XK_ISO_Left_Tab = 0xFE20;
+  public static final int XK_ISO_Move_Line_Up = 0xFE21;
+  public static final int XK_ISO_Move_Line_Down = 0xFE22;
+  public static final int XK_ISO_Partial_Line_Up = 0xFE23;
+  public static final int XK_ISO_Partial_Line_Down = 0xFE24;
+  public static final int XK_ISO_Partial_Space_Left = 0xFE25;
+  public static final int XK_ISO_Partial_Space_Right = 0xFE26;
+  public static final int XK_ISO_Set_Margin_Left = 0xFE27;
+  public static final int XK_ISO_Set_Margin_Right = 0xFE28;
+  public static final int XK_ISO_Release_Margin_Left = 0xFE29;
+  public static final int XK_ISO_Release_Margin_Right = 0xFE2A;
+  public static final int XK_ISO_Release_Both_Margins = 0xFE2B;
+  public static final int XK_ISO_Fast_Cursor_Left = 0xFE2C;
+  public static final int XK_ISO_Fast_Cursor_Right = 0xFE2D;
+  public static final int XK_ISO_Fast_Cursor_Up = 0xFE2E;
+  public static final int XK_ISO_Fast_Cursor_Down = 0xFE2F;
+  public static final int XK_ISO_Continuous_Underline = 0xFE30;
+  public static final int XK_ISO_Discontinuous_Underline = 0xFE31;
+  public static final int XK_ISO_Emphasize = 0xFE32;
+  public static final int XK_ISO_Center_Object = 0xFE33;
+  public static final int XK_ISO_Enter = 0xFE34;
+
+  public static final int XK_dead_grave = 0xFE50;
+  public static final int XK_dead_acute = 0xFE51;
+  public static final int XK_dead_circumflex = 0xFE52;
+  public static final int XK_dead_tilde = 0xFE53;
+  public static final int XK_dead_macron = 0xFE54;
+  public static final int XK_dead_breve = 0xFE55;
+  public static final int XK_dead_abovedot = 0xFE56;
+  public static final int XK_dead_diaeresis = 0xFE57;
+  public static final int XK_dead_abovering = 0xFE58;
+  public static final int XK_dead_doubleacute = 0xFE59;
+  public static final int XK_dead_caron = 0xFE5A;
+  public static final int XK_dead_cedilla = 0xFE5B;
+  public static final int XK_dead_ogonek = 0xFE5C;
+  public static final int XK_dead_iota = 0xFE5D;
+  public static final int XK_dead_voiced_sound = 0xFE5E;
+  public static final int XK_dead_semivoiced_sound = 0xFE5F;
+  public static final int XK_dead_belowdot = 0xFE60;
+
+  public static final int XK_First_Virtual_Screen = 0xFED0;
+  public static final int XK_Prev_Virtual_Screen = 0xFED1;
+  public static final int XK_Next_Virtual_Screen = 0xFED2;
+  public static final int XK_Last_Virtual_Screen = 0xFED4;
+  public static final int XK_Terminate_Server = 0xFED5;
+
+  public static final int XK_AccessX_Enable = 0xFE70;
+  public static final int XK_AccessX_Feedback_Enable = 0xFE71;
+  public static final int XK_RepeatKeys_Enable = 0xFE72;
+  public static final int XK_SlowKeys_Enable = 0xFE73;
+  public static final int XK_BounceKeys_Enable = 0xFE74;
+  public static final int XK_StickyKeys_Enable = 0xFE75;
+  public static final int XK_MouseKeys_Enable = 0xFE76;
+  public static final int XK_MouseKeys_Accel_Enable = 0xFE77;
+  public static final int XK_Overlay1_Enable = 0xFE78;
+  public static final int XK_Overlay2_Enable = 0xFE79;
+  public static final int XK_AudibleBell_Enable = 0xFE7A;
+
+  public static final int XK_Pointer_Left = 0xFEE0;
+  public static final int XK_Pointer_Right = 0xFEE1;
+  public static final int XK_Pointer_Up = 0xFEE2;
+  public static final int XK_Pointer_Down = 0xFEE3;
+  public static final int XK_Pointer_UpLeft = 0xFEE4;
+  public static final int XK_Pointer_UpRight = 0xFEE5;
+  public static final int XK_Pointer_DownLeft = 0xFEE6;
+  public static final int XK_Pointer_DownRight = 0xFEE7;
+  public static final int XK_Pointer_Button_Dflt = 0xFEE8;
+  public static final int XK_Pointer_Button1 = 0xFEE9;
+  public static final int XK_Pointer_Button2 = 0xFEEA;
+  public static final int XK_Pointer_Button3 = 0xFEEB;
+  public static final int XK_Pointer_Button4 = 0xFEEC;
+  public static final int XK_Pointer_Button5 = 0xFEED;
+  public static final int XK_Pointer_DblClick_Dflt = 0xFEEE;
+  public static final int XK_Pointer_DblClick1 = 0xFEEF;
+  public static final int XK_Pointer_DblClick2 = 0xFEF0;
+  public static final int XK_Pointer_DblClick3 = 0xFEF1;
+  public static final int XK_Pointer_DblClick4 = 0xFEF2;
+  public static final int XK_Pointer_DblClick5 = 0xFEF3;
+  public static final int XK_Pointer_Drag_Dflt = 0xFEF4;
+  public static final int XK_Pointer_Drag1 = 0xFEF5;
+  public static final int XK_Pointer_Drag2 = 0xFEF6;
+  public static final int XK_Pointer_Drag3 = 0xFEF7;
+  public static final int XK_Pointer_Drag4 = 0xFEF8;
+  public static final int XK_Pointer_Drag5 = 0xFEFD;
+
+  public static final int XK_Pointer_EnableKeys = 0xFEF9;
+  public static final int XK_Pointer_Accelerate = 0xFEFA;
+  public static final int XK_Pointer_DfltBtnNext = 0xFEFB;
+  public static final int XK_Pointer_DfltBtnPrev = 0xFEFC;
+
+  /*
+   * 3270 Terminal Keys;
+   * Byte 3 = 0xFD;
+   */
+
+  public static final int XK_3270_Duplicate = 0xFD01;
+  public static final int XK_3270_FieldMark = 0xFD02;
+  public static final int XK_3270_Right2 = 0xFD03;
+  public static final int XK_3270_Left2 = 0xFD04;
+  public static final int XK_3270_BackTab = 0xFD05;
+  public static final int XK_3270_EraseEOF = 0xFD06;
+  public static final int XK_3270_EraseInput = 0xFD07;
+  public static final int XK_3270_Reset = 0xFD08;
+  public static final int XK_3270_Quit = 0xFD09;
+  public static final int XK_3270_PA1 = 0xFD0A;
+  public static final int XK_3270_PA2 = 0xFD0B;
+  public static final int XK_3270_PA3 = 0xFD0C;
+  public static final int XK_3270_Test = 0xFD0D;
+  public static final int XK_3270_Attn = 0xFD0E;
+  public static final int XK_3270_CursorBlink = 0xFD0F;
+  public static final int XK_3270_AltCursor = 0xFD10;
+  public static final int XK_3270_KeyClick = 0xFD11;
+  public static final int XK_3270_Jump = 0xFD12;
+  public static final int XK_3270_Ident = 0xFD13;
+  public static final int XK_3270_Rule = 0xFD14;
+  public static final int XK_3270_Copy = 0xFD15;
+  public static final int XK_3270_Play = 0xFD16;
+  public static final int XK_3270_Setup = 0xFD17;
+  public static final int XK_3270_Record = 0xFD18;
+  public static final int XK_3270_ChangeScreen = 0xFD19;
+  public static final int XK_3270_DeleteWord = 0xFD1A;
+  public static final int XK_3270_ExSelect = 0xFD1B;
+  public static final int XK_3270_CursorSelect = 0xFD1C;
+  public static final int XK_3270_PrintScreen = 0xFD1D;
+  public static final int XK_3270_Enter = 0xFD1E;
+
+  /*
+   *  Latin 1;
+   *  Byte 3 = 0;
+   */
+  public static final int XK_space = 0x020;
+  public static final int XK_exclam = 0x021;
+  public static final int XK_quotedbl = 0x022;
+  public static final int XK_numbersign = 0x023;
+  public static final int XK_dollar = 0x024;
+  public static final int XK_percent = 0x025;
+  public static final int XK_ampersand = 0x026;
+  public static final int XK_apostrophe = 0x027;
+  public static final int XK_quoteright = 0x027; /* deprecated */
+  public static final int XK_parenleft = 0x028;
+  public static final int XK_parenright = 0x029;
+  public static final int XK_asterisk = 0x02a;
+  public static final int XK_plus = 0x02b;
+  public static final int XK_comma = 0x02c;
+  public static final int XK_minus = 0x02d;
+  public static final int XK_period = 0x02e;
+  public static final int XK_slash = 0x02f;
+  public static final int XK_0 = 0x030;
+  public static final int XK_1 = 0x031;
+  public static final int XK_2 = 0x032;
+  public static final int XK_3 = 0x033;
+  public static final int XK_4 = 0x034;
+  public static final int XK_5 = 0x035;
+  public static final int XK_6 = 0x036;
+  public static final int XK_7 = 0x037;
+  public static final int XK_8 = 0x038;
+  public static final int XK_9 = 0x039;
+  public static final int XK_colon = 0x03a;
+  public static final int XK_semicolon = 0x03b;
+  public static final int XK_less = 0x03c;
+  public static final int XK_equal = 0x03d;
+  public static final int XK_greater = 0x03e;
+  public static final int XK_question = 0x03f;
+  public static final int XK_at = 0x040;
+  public static final int XK_A = 0x041;
+  public static final int XK_B = 0x042;
+  public static final int XK_C = 0x043;
+  public static final int XK_D = 0x044;
+  public static final int XK_E = 0x045;
+  public static final int XK_F = 0x046;
+  public static final int XK_G = 0x047;
+  public static final int XK_H = 0x048;
+  public static final int XK_I = 0x049;
+  public static final int XK_J = 0x04a;
+  public static final int XK_K = 0x04b;
+  public static final int XK_L = 0x04c;
+  public static final int XK_M = 0x04d;
+  public static final int XK_N = 0x04e;
+  public static final int XK_O = 0x04f;
+  public static final int XK_P = 0x050;
+  public static final int XK_Q = 0x051;
+  public static final int XK_R = 0x052;
+  public static final int XK_S = 0x053;
+  public static final int XK_T = 0x054;
+  public static final int XK_U = 0x055;
+  public static final int XK_V = 0x056;
+  public static final int XK_W = 0x057;
+  public static final int XK_X = 0x058;
+  public static final int XK_Y = 0x059;
+  public static final int XK_Z = 0x05a;
+  public static final int XK_bracketleft = 0x05b;
+  public static final int XK_backslash = 0x05c;
+  public static final int XK_bracketright = 0x05d;
+  public static final int XK_asciicircum = 0x05e;
+  public static final int XK_underscore = 0x05f;
+  public static final int XK_grave = 0x060;
+  public static final int XK_quoteleft = 0x060; /* deprecated */
+  public static final int XK_a = 0x061;
+  public static final int XK_b = 0x062;
+  public static final int XK_c = 0x063;
+  public static final int XK_d = 0x064;
+  public static final int XK_e = 0x065;
+  public static final int XK_f = 0x066;
+  public static final int XK_g = 0x067;
+  public static final int XK_h = 0x068;
+  public static final int XK_i = 0x069;
+  public static final int XK_j = 0x06a;
+  public static final int XK_k = 0x06b;
+  public static final int XK_l = 0x06c;
+  public static final int XK_m = 0x06d;
+  public static final int XK_n = 0x06e;
+  public static final int XK_o = 0x06f;
+  public static final int XK_p = 0x070;
+  public static final int XK_q = 0x071;
+  public static final int XK_r = 0x072;
+  public static final int XK_s = 0x073;
+  public static final int XK_t = 0x074;
+  public static final int XK_u = 0x075;
+  public static final int XK_v = 0x076;
+  public static final int XK_w = 0x077;
+  public static final int XK_x = 0x078;
+  public static final int XK_y = 0x079;
+  public static final int XK_z = 0x07a;
+  public static final int XK_braceleft = 0x07b;
+  public static final int XK_bar = 0x07c;
+  public static final int XK_braceright = 0x07d;
+  public static final int XK_asciitilde = 0x07e;
+
+  public static final int XK_nobreakspace = 0x0a0;
+  public static final int XK_exclamdown = 0x0a1;
+  public static final int XK_cent = 0x0a2;
+  public static final int XK_sterling = 0x0a3;
+  public static final int XK_currency = 0x0a4;
+  public static final int XK_yen = 0x0a5;
+  public static final int XK_brokenbar = 0x0a6;
+  public static final int XK_section = 0x0a7;
+  public static final int XK_diaeresis = 0x0a8;
+  public static final int XK_copyright = 0x0a9;
+  public static final int XK_ordfeminine = 0x0aa;
+  public static final int XK_guillemotleft = 0x0ab; /* left angle quotation mark */
+  public static final int XK_notsign = 0x0ac;
+  public static final int XK_hyphen = 0x0ad;
+  public static final int XK_registered = 0x0ae;
+  public static final int XK_macron = 0x0af;
+  public static final int XK_degree = 0x0b0;
+  public static final int XK_plusminus = 0x0b1;
+  public static final int XK_twosuperior = 0x0b2;
+  public static final int XK_threesuperior = 0x0b3;
+  public static final int XK_acute = 0x0b4;
+  public static final int XK_mu = 0x0b5;
+  public static final int XK_paragraph = 0x0b6;
+  public static final int XK_periodcentered = 0x0b7;
+  public static final int XK_cedilla = 0x0b8;
+  public static final int XK_onesuperior = 0x0b9;
+  public static final int XK_masculine = 0x0ba;
+  public static final int XK_guillemotright = 0x0bb; /* right angle quotation mark */
+  public static final int XK_onequarter = 0x0bc;
+  public static final int XK_onehalf = 0x0bd;
+  public static final int XK_threequarters = 0x0be;
+  public static final int XK_questiondown = 0x0bf;
+  public static final int XK_Agrave = 0x0c0;
+  public static final int XK_Aacute = 0x0c1;
+  public static final int XK_Acircumflex = 0x0c2;
+  public static final int XK_Atilde = 0x0c3;
+  public static final int XK_Adiaeresis = 0x0c4;
+  public static final int XK_Aring = 0x0c5;
+  public static final int XK_AE = 0x0c6;
+  public static final int XK_Ccedilla = 0x0c7;
+  public static final int XK_Egrave = 0x0c8;
+  public static final int XK_Eacute = 0x0c9;
+  public static final int XK_Ecircumflex = 0x0ca;
+  public static final int XK_Ediaeresis = 0x0cb;
+  public static final int XK_Igrave = 0x0cc;
+  public static final int XK_Iacute = 0x0cd;
+  public static final int XK_Icircumflex = 0x0ce;
+  public static final int XK_Idiaeresis = 0x0cf;
+  public static final int XK_ETH = 0x0d0;
+  public static final int XK_Eth = 0x0d0; /* deprecated */
+  public static final int XK_Ntilde = 0x0d1;
+  public static final int XK_Ograve = 0x0d2;
+  public static final int XK_Oacute = 0x0d3;
+  public static final int XK_Ocircumflex = 0x0d4;
+  public static final int XK_Otilde = 0x0d5;
+  public static final int XK_Odiaeresis = 0x0d6;
+  public static final int XK_multiply = 0x0d7;
+  public static final int XK_Ooblique = 0x0d8;
+  public static final int XK_Ugrave = 0x0d9;
+  public static final int XK_Uacute = 0x0da;
+  public static final int XK_Ucircumflex = 0x0db;
+  public static final int XK_Udiaeresis = 0x0dc;
+  public static final int XK_Yacute = 0x0dd;
+  public static final int XK_THORN = 0x0de;
+  public static final int XK_Thorn = 0x0de; /* deprecated */
+  public static final int XK_ssharp = 0x0df;
+  public static final int XK_agrave = 0x0e0;
+  public static final int XK_aacute = 0x0e1;
+  public static final int XK_acircumflex = 0x0e2;
+  public static final int XK_atilde = 0x0e3;
+  public static final int XK_adiaeresis = 0x0e4;
+  public static final int XK_aring = 0x0e5;
+  public static final int XK_ae = 0x0e6;
+  public static final int XK_ccedilla = 0x0e7;
+  public static final int XK_egrave = 0x0e8;
+  public static final int XK_eacute = 0x0e9;
+  public static final int XK_ecircumflex = 0x0ea;
+  public static final int XK_ediaeresis = 0x0eb;
+  public static final int XK_igrave = 0x0ec;
+  public static final int XK_iacute = 0x0ed;
+  public static final int XK_icircumflex = 0x0ee;
+  public static final int XK_idiaeresis = 0x0ef;
+  public static final int XK_eth = 0x0f0;
+  public static final int XK_ntilde = 0x0f1;
+  public static final int XK_ograve = 0x0f2;
+  public static final int XK_oacute = 0x0f3;
+  public static final int XK_ocircumflex = 0x0f4;
+  public static final int XK_otilde = 0x0f5;
+  public static final int XK_odiaeresis = 0x0f6;
+  public static final int XK_division = 0x0f7;
+  public static final int XK_oslash = 0x0f8;
+  public static final int XK_ugrave = 0x0f9;
+  public static final int XK_uacute = 0x0fa;
+  public static final int XK_ucircumflex = 0x0fb;
+  public static final int XK_udiaeresis = 0x0fc;
+  public static final int XK_yacute = 0x0fd;
+  public static final int XK_thorn = 0x0fe;
+  public static final int XK_ydiaeresis = 0x0ff;
+
+  /*
+   *   Latin 2;
+   *   Byte 3 = 1;
+   */
+
+  public static final int XK_Aogonek = 0x1a1;
+  public static final int XK_breve = 0x1a2;
+  public static final int XK_Lstroke = 0x1a3;
+  public static final int XK_Lcaron = 0x1a5;
+  public static final int XK_Sacute = 0x1a6;
+  public static final int XK_Scaron = 0x1a9;
+  public static final int XK_Scedilla = 0x1aa;
+  public static final int XK_Tcaron = 0x1ab;
+  public static final int XK_Zacute = 0x1ac;
+  public static final int XK_Zcaron = 0x1ae;
+  public static final int XK_Zabovedot = 0x1af;
+  public static final int XK_aogonek = 0x1b1;
+  public static final int XK_ogonek = 0x1b2;
+  public static final int XK_lstroke = 0x1b3;
+  public static final int XK_lcaron = 0x1b5;
+  public static final int XK_sacute = 0x1b6;
+  public static final int XK_caron = 0x1b7;
+  public static final int XK_scaron = 0x1b9;
+  public static final int XK_scedilla = 0x1ba;
+  public static final int XK_tcaron = 0x1bb;
+  public static final int XK_zacute = 0x1bc;
+  public static final int XK_doubleacute = 0x1bd;
+  public static final int XK_zcaron = 0x1be;
+  public static final int XK_zabovedot = 0x1bf;
+  public static final int XK_Racute = 0x1c0;
+  public static final int XK_Abreve = 0x1c3;
+  public static final int XK_Lacute = 0x1c5;
+  public static final int XK_Cacute = 0x1c6;
+  public static final int XK_Ccaron = 0x1c8;
+  public static final int XK_Eogonek = 0x1ca;
+  public static final int XK_Ecaron = 0x1cc;
+  public static final int XK_Dcaron = 0x1cf;
+  public static final int XK_Dstroke = 0x1d0;
+  public static final int XK_Nacute = 0x1d1;
+  public static final int XK_Ncaron = 0x1d2;
+  public static final int XK_Odoubleacute = 0x1d5;
+  public static final int XK_Rcaron = 0x1d8;
+  public static final int XK_Uring = 0x1d9;
+  public static final int XK_Udoubleacute = 0x1db;
+  public static final int XK_Tcedilla = 0x1de;
+  public static final int XK_racute = 0x1e0;
+  public static final int XK_abreve = 0x1e3;
+  public static final int XK_lacute = 0x1e5;
+  public static final int XK_cacute = 0x1e6;
+  public static final int XK_ccaron = 0x1e8;
+  public static final int XK_eogonek = 0x1ea;
+  public static final int XK_ecaron = 0x1ec;
+  public static final int XK_dcaron = 0x1ef;
+  public static final int XK_dstroke = 0x1f0;
+  public static final int XK_nacute = 0x1f1;
+  public static final int XK_ncaron = 0x1f2;
+  public static final int XK_odoubleacute = 0x1f5;
+  public static final int XK_udoubleacute = 0x1fb;
+  public static final int XK_rcaron = 0x1f8;
+  public static final int XK_uring = 0x1f9;
+  public static final int XK_tcedilla = 0x1fe;
+  public static final int XK_abovedot = 0x1ff;
+
+  /*
+   *   Latin 3;
+   *   Byte 3 = 2;
+   */
+
+  public static final int XK_Hstroke = 0x2a1;
+  public static final int XK_Hcircumflex = 0x2a6;
+  public static final int XK_Iabovedot = 0x2a9;
+  public static final int XK_Gbreve = 0x2ab;
+  public static final int XK_Jcircumflex = 0x2ac;
+  public static final int XK_hstroke = 0x2b1;
+  public static final int XK_hcircumflex = 0x2b6;
+  public static final int XK_idotless = 0x2b9;
+  public static final int XK_gbreve = 0x2bb;
+  public static final int XK_jcircumflex = 0x2bc;
+  public static final int XK_Cabovedot = 0x2c5;
+  public static final int XK_Ccircumflex = 0x2c6;
+  public static final int XK_Gabovedot = 0x2d5;
+  public static final int XK_Gcircumflex = 0x2d8;
+  public static final int XK_Ubreve = 0x2dd;
+  public static final int XK_Scircumflex = 0x2de;
+  public static final int XK_cabovedot = 0x2e5;
+  public static final int XK_ccircumflex = 0x2e6;
+  public static final int XK_gabovedot = 0x2f5;
+  public static final int XK_gcircumflex = 0x2f8;
+  public static final int XK_ubreve = 0x2fd;
+  public static final int XK_scircumflex = 0x2fe;
+
+
+  /*
+   *   Latin 4;
+   *   Byte 3 = 3;
+   */
+
+  public static final int XK_kra = 0x3a2;
+  public static final int XK_kappa = 0x3a2; /* deprecated */
+  public static final int XK_Rcedilla = 0x3a3;
+  public static final int XK_Itilde = 0x3a5;
+  public static final int XK_Lcedilla = 0x3a6;
+  public static final int XK_Emacron = 0x3aa;
+  public static final int XK_Gcedilla = 0x3ab;
+  public static final int XK_Tslash = 0x3ac;
+  public static final int XK_rcedilla = 0x3b3;
+  public static final int XK_itilde = 0x3b5;
+  public static final int XK_lcedilla = 0x3b6;
+  public static final int XK_emacron = 0x3ba;
+  public static final int XK_gcedilla = 0x3bb;
+  public static final int XK_tslash = 0x3bc;
+  public static final int XK_ENG = 0x3bd;
+  public static final int XK_eng = 0x3bf;
+  public static final int XK_Amacron = 0x3c0;
+  public static final int XK_Iogonek = 0x3c7;
+  public static final int XK_Eabovedot = 0x3cc;
+  public static final int XK_Imacron = 0x3cf;
+  public static final int XK_Ncedilla = 0x3d1;
+  public static final int XK_Omacron = 0x3d2;
+  public static final int XK_Kcedilla = 0x3d3;
+  public static final int XK_Uogonek = 0x3d9;
+  public static final int XK_Utilde = 0x3dd;
+  public static final int XK_Umacron = 0x3de;
+  public static final int XK_amacron = 0x3e0;
+  public static final int XK_iogonek = 0x3e7;
+  public static final int XK_eabovedot = 0x3ec;
+  public static final int XK_imacron = 0x3ef;
+  public static final int XK_ncedilla = 0x3f1;
+  public static final int XK_omacron = 0x3f2;
+  public static final int XK_kcedilla = 0x3f3;
+  public static final int XK_uogonek = 0x3f9;
+  public static final int XK_utilde = 0x3fd;
+  public static final int XK_umacron = 0x3fe;
+
+  /*
+   * Latin-9 (a.k.a. Latin-0)
+   * Byte 3 = 19;
+   */
+
+  public static final int XK_OE = 0x13bc;
+  public static final int XK_oe = 0x13bd;
+  public static final int XK_Ydiaeresis = 0x13be;
+
+  /*
+   * Katakana;
+   * Byte 3 = 4;
+   */
+
+  public static final int XK_overline = 0x47e;
+  public static final int XK_kana_fullstop = 0x4a1;
+  public static final int XK_kana_openingbracket = 0x4a2;
+  public static final int XK_kana_closingbracket = 0x4a3;
+  public static final int XK_kana_comma = 0x4a4;
+  public static final int XK_kana_conjunctive = 0x4a5;
+  public static final int XK_kana_middledot = 0x4a5;  /* deprecated */
+  public static final int XK_kana_WO = 0x4a6;
+  public static final int XK_kana_a = 0x4a7;
+  public static final int XK_kana_i = 0x4a8;
+  public static final int XK_kana_u = 0x4a9;
+  public static final int XK_kana_e = 0x4aa;
+  public static final int XK_kana_o = 0x4ab;
+  public static final int XK_kana_ya = 0x4ac;
+  public static final int XK_kana_yu = 0x4ad;
+  public static final int XK_kana_yo = 0x4ae;
+  public static final int XK_kana_tsu = 0x4af;
+  public static final int XK_kana_tu = 0x4af;  /* deprecated */
+  public static final int XK_prolongedsound = 0x4b0;
+  public static final int XK_kana_A = 0x4b1;
+  public static final int XK_kana_I = 0x4b2;
+  public static final int XK_kana_U = 0x4b3;
+  public static final int XK_kana_E = 0x4b4;
+  public static final int XK_kana_O = 0x4b5;
+  public static final int XK_kana_KA = 0x4b6;
+  public static final int XK_kana_KI = 0x4b7;
+  public static final int XK_kana_KU = 0x4b8;
+  public static final int XK_kana_KE = 0x4b9;
+  public static final int XK_kana_KO = 0x4ba;
+  public static final int XK_kana_SA = 0x4bb;
+  public static final int XK_kana_SHI = 0x4bc;
+  public static final int XK_kana_SU = 0x4bd;
+  public static final int XK_kana_SE = 0x4be;
+  public static final int XK_kana_SO = 0x4bf;
+  public static final int XK_kana_TA = 0x4c0;
+  public static final int XK_kana_CHI = 0x4c1;
+  public static final int XK_kana_TI = 0x4c1;  /* deprecated */
+  public static final int XK_kana_TSU = 0x4c2;
+  public static final int XK_kana_TU = 0x4c2;  /* deprecated */
+  public static final int XK_kana_TE = 0x4c3;
+  public static final int XK_kana_TO = 0x4c4;
+  public static final int XK_kana_NA = 0x4c5;
+  public static final int XK_kana_NI = 0x4c6;
+  public static final int XK_kana_NU = 0x4c7;
+  public static final int XK_kana_NE = 0x4c8;
+  public static final int XK_kana_NO = 0x4c9;
+  public static final int XK_kana_HA = 0x4ca;
+  public static final int XK_kana_HI = 0x4cb;
+  public static final int XK_kana_FU = 0x4cc;
+  public static final int XK_kana_HU = 0x4cc;  /* deprecated */
+  public static final int XK_kana_HE = 0x4cd;
+  public static final int XK_kana_HO = 0x4ce;
+  public static final int XK_kana_MA = 0x4cf;
+  public static final int XK_kana_MI = 0x4d0;
+  public static final int XK_kana_MU = 0x4d1;
+  public static final int XK_kana_ME = 0x4d2;
+  public static final int XK_kana_MO = 0x4d3;
+  public static final int XK_kana_YA = 0x4d4;
+  public static final int XK_kana_YU = 0x4d5;
+  public static final int XK_kana_YO = 0x4d6;
+  public static final int XK_kana_RA = 0x4d7;
+  public static final int XK_kana_RI = 0x4d8;
+  public static final int XK_kana_RU = 0x4d9;
+  public static final int XK_kana_RE = 0x4da;
+  public static final int XK_kana_RO = 0x4db;
+  public static final int XK_kana_WA = 0x4dc;
+  public static final int XK_kana_N = 0x4dd;
+  public static final int XK_voicedsound = 0x4de;
+  public static final int XK_semivoicedsound = 0x4df;
+  public static final int XK_kana_switch = 0xFF7E;  /* Alias for mode_switch */
+
+  /*
+   *  Arabic;
+   *  Byte 3 = 5;
+   */
+
+  public static final int XK_Arabic_comma = 0x5ac;
+  public static final int XK_Arabic_semicolon = 0x5bb;
+  public static final int XK_Arabic_question_mark = 0x5bf;
+  public static final int XK_Arabic_hamza = 0x5c1;
+  public static final int XK_Arabic_maddaonalef = 0x5c2;
+  public static final int XK_Arabic_hamzaonalef = 0x5c3;
+  public static final int XK_Arabic_hamzaonwaw = 0x5c4;
+  public static final int XK_Arabic_hamzaunderalef = 0x5c5;
+  public static final int XK_Arabic_hamzaonyeh = 0x5c6;
+  public static final int XK_Arabic_alef = 0x5c7;
+  public static final int XK_Arabic_beh = 0x5c8;
+  public static final int XK_Arabic_tehmarbuta = 0x5c9;
+  public static final int XK_Arabic_teh = 0x5ca;
+  public static final int XK_Arabic_theh = 0x5cb;
+  public static final int XK_Arabic_jeem = 0x5cc;
+  public static final int XK_Arabic_hah = 0x5cd;
+  public static final int XK_Arabic_khah = 0x5ce;
+  public static final int XK_Arabic_dal = 0x5cf;
+  public static final int XK_Arabic_thal = 0x5d0;
+  public static final int XK_Arabic_ra = 0x5d1;
+  public static final int XK_Arabic_zain = 0x5d2;
+  public static final int XK_Arabic_seen = 0x5d3;
+  public static final int XK_Arabic_sheen = 0x5d4;
+  public static final int XK_Arabic_sad = 0x5d5;
+  public static final int XK_Arabic_dad = 0x5d6;
+  public static final int XK_Arabic_tah = 0x5d7;
+  public static final int XK_Arabic_zah = 0x5d8;
+  public static final int XK_Arabic_ain = 0x5d9;
+  public static final int XK_Arabic_ghain = 0x5da;
+  public static final int XK_Arabic_tatweel = 0x5e0;
+  public static final int XK_Arabic_feh = 0x5e1;
+  public static final int XK_Arabic_qaf = 0x5e2;
+  public static final int XK_Arabic_kaf = 0x5e3;
+  public static final int XK_Arabic_lam = 0x5e4;
+  public static final int XK_Arabic_meem = 0x5e5;
+  public static final int XK_Arabic_noon = 0x5e6;
+  public static final int XK_Arabic_ha = 0x5e7;
+  public static final int XK_Arabic_heh = 0x5e7;  /* deprecated */
+  public static final int XK_Arabic_waw = 0x5e8;
+  public static final int XK_Arabic_alefmaksura = 0x5e9;
+  public static final int XK_Arabic_yeh = 0x5ea;
+  public static final int XK_Arabic_fathatan = 0x5eb;
+  public static final int XK_Arabic_dammatan = 0x5ec;
+  public static final int XK_Arabic_kasratan = 0x5ed;
+  public static final int XK_Arabic_fatha = 0x5ee;
+  public static final int XK_Arabic_damma = 0x5ef;
+  public static final int XK_Arabic_kasra = 0x5f0;
+  public static final int XK_Arabic_shadda = 0x5f1;
+  public static final int XK_Arabic_sukun = 0x5f2;
+  public static final int XK_Arabic_switch = 0xFF7E;  /* Alias for mode_switch */
+
+  /*
+   * Cyrillic;
+   * Byte 3 = 6;
+   */
+  public static final int XK_Serbian_dje = 0x6a1;
+  public static final int XK_Macedonia_gje = 0x6a2;
+  public static final int XK_Cyrillic_io = 0x6a3;
+  public static final int XK_Ukrainian_ie = 0x6a4;
+  public static final int XK_Ukranian_je = 0x6a4;  /* deprecated */
+  public static final int XK_Macedonia_dse = 0x6a5;
+  public static final int XK_Ukrainian_i = 0x6a6;
+  public static final int XK_Ukranian_i = 0x6a6;  /* deprecated */
+  public static final int XK_Ukrainian_yi = 0x6a7;
+  public static final int XK_Ukranian_yi = 0x6a7;  /* deprecated */
+  public static final int XK_Cyrillic_je = 0x6a8;
+  public static final int XK_Serbian_je = 0x6a8;  /* deprecated */
+  public static final int XK_Cyrillic_lje = 0x6a9;
+  public static final int XK_Serbian_lje = 0x6a9;  /* deprecated */
+  public static final int XK_Cyrillic_nje = 0x6aa;
+  public static final int XK_Serbian_nje = 0x6aa;  /* deprecated */
+  public static final int XK_Serbian_tshe = 0x6ab;
+  public static final int XK_Macedonia_kje = 0x6ac;
+  public static final int XK_Byelorussian_shortu = 0x6ae;
+  public static final int XK_Cyrillic_dzhe = 0x6af;
+  public static final int XK_Serbian_dze = 0x6af;  /* deprecated */
+  public static final int XK_numerosign = 0x6b0;
+  public static final int XK_Serbian_DJE = 0x6b1;
+  public static final int XK_Macedonia_GJE = 0x6b2;
+  public static final int XK_Cyrillic_IO = 0x6b3;
+  public static final int XK_Ukrainian_IE = 0x6b4;
+  public static final int XK_Ukranian_JE = 0x6b4;  /* deprecated */
+  public static final int XK_Macedonia_DSE = 0x6b5;
+  public static final int XK_Ukrainian_I = 0x6b6;
+  public static final int XK_Ukranian_I = 0x6b6;  /* deprecated */
+  public static final int XK_Ukrainian_YI = 0x6b7;
+  public static final int XK_Ukranian_YI = 0x6b7;  /* deprecated */
+  public static final int XK_Cyrillic_JE = 0x6b8;
+  public static final int XK_Serbian_JE = 0x6b8;  /* deprecated */
+  public static final int XK_Cyrillic_LJE = 0x6b9;
+  public static final int XK_Serbian_LJE = 0x6b9;  /* deprecated */
+  public static final int XK_Cyrillic_NJE = 0x6ba;
+  public static final int XK_Serbian_NJE = 0x6ba;  /* deprecated */
+  public static final int XK_Serbian_TSHE = 0x6bb;
+  public static final int XK_Macedonia_KJE = 0x6bc;
+  public static final int XK_Byelorussian_SHORTU = 0x6be;
+  public static final int XK_Cyrillic_DZHE = 0x6bf;
+  public static final int XK_Serbian_DZE = 0x6bf;  /* deprecated */
+  public static final int XK_Cyrillic_yu = 0x6c0;
+  public static final int XK_Cyrillic_a = 0x6c1;
+  public static final int XK_Cyrillic_be = 0x6c2;
+  public static final int XK_Cyrillic_tse = 0x6c3;
+  public static final int XK_Cyrillic_de = 0x6c4;
+  public static final int XK_Cyrillic_ie = 0x6c5;
+  public static final int XK_Cyrillic_ef = 0x6c6;
+  public static final int XK_Cyrillic_ghe = 0x6c7;
+  public static final int XK_Cyrillic_ha = 0x6c8;
+  public static final int XK_Cyrillic_i = 0x6c9;
+  public static final int XK_Cyrillic_shorti = 0x6ca;
+  public static final int XK_Cyrillic_ka = 0x6cb;
+  public static final int XK_Cyrillic_el = 0x6cc;
+  public static final int XK_Cyrillic_em = 0x6cd;
+  public static final int XK_Cyrillic_en = 0x6ce;
+  public static final int XK_Cyrillic_o = 0x6cf;
+  public static final int XK_Cyrillic_pe = 0x6d0;
+  public static final int XK_Cyrillic_ya = 0x6d1;
+  public static final int XK_Cyrillic_er = 0x6d2;
+  public static final int XK_Cyrillic_es = 0x6d3;
+  public static final int XK_Cyrillic_te = 0x6d4;
+  public static final int XK_Cyrillic_u = 0x6d5;
+  public static final int XK_Cyrillic_zhe = 0x6d6;
+  public static final int XK_Cyrillic_ve = 0x6d7;
+  public static final int XK_Cyrillic_softsign = 0x6d8;
+  public static final int XK_Cyrillic_yeru = 0x6d9;
+  public static final int XK_Cyrillic_ze = 0x6da;
+  public static final int XK_Cyrillic_sha = 0x6db;
+  public static final int XK_Cyrillic_e = 0x6dc;
+  public static final int XK_Cyrillic_shcha = 0x6dd;
+  public static final int XK_Cyrillic_che = 0x6de;
+  public static final int XK_Cyrillic_hardsign = 0x6df;
+  public static final int XK_Cyrillic_YU = 0x6e0;
+  public static final int XK_Cyrillic_A = 0x6e1;
+  public static final int XK_Cyrillic_BE = 0x6e2;
+  public static final int XK_Cyrillic_TSE = 0x6e3;
+  public static final int XK_Cyrillic_DE = 0x6e4;
+  public static final int XK_Cyrillic_IE = 0x6e5;
+  public static final int XK_Cyrillic_EF = 0x6e6;
+  public static final int XK_Cyrillic_GHE = 0x6e7;
+  public static final int XK_Cyrillic_HA = 0x6e8;
+  public static final int XK_Cyrillic_I = 0x6e9;
+  public static final int XK_Cyrillic_SHORTI = 0x6ea;
+  public static final int XK_Cyrillic_KA = 0x6eb;
+  public static final int XK_Cyrillic_EL = 0x6ec;
+  public static final int XK_Cyrillic_EM = 0x6ed;
+  public static final int XK_Cyrillic_EN = 0x6ee;
+  public static final int XK_Cyrillic_O = 0x6ef;
+  public static final int XK_Cyrillic_PE = 0x6f0;
+  public static final int XK_Cyrillic_YA = 0x6f1;
+  public static final int XK_Cyrillic_ER = 0x6f2;
+  public static final int XK_Cyrillic_ES = 0x6f3;
+  public static final int XK_Cyrillic_TE = 0x6f4;
+  public static final int XK_Cyrillic_U = 0x6f5;
+  public static final int XK_Cyrillic_ZHE = 0x6f6;
+  public static final int XK_Cyrillic_VE = 0x6f7;
+  public static final int XK_Cyrillic_SOFTSIGN = 0x6f8;
+  public static final int XK_Cyrillic_YERU = 0x6f9;
+  public static final int XK_Cyrillic_ZE = 0x6fa;
+  public static final int XK_Cyrillic_SHA = 0x6fb;
+  public static final int XK_Cyrillic_E = 0x6fc;
+  public static final int XK_Cyrillic_SHCHA = 0x6fd;
+  public static final int XK_Cyrillic_CHE = 0x6fe;
+  public static final int XK_Cyrillic_HARDSIGN = 0x6ff;
+
+  /*
+   * Greek;
+   * Byte 3 = 7;
+   */
+
+  public static final int XK_Greek_ALPHAaccent = 0x7a1;
+  public static final int XK_Greek_EPSILONaccent = 0x7a2;
+  public static final int XK_Greek_ETAaccent = 0x7a3;
+  public static final int XK_Greek_IOTAaccent = 0x7a4;
+  public static final int XK_Greek_IOTAdiaeresis = 0x7a5;
+  public static final int XK_Greek_OMICRONaccent = 0x7a7;
+  public static final int XK_Greek_UPSILONaccent = 0x7a8;
+  public static final int XK_Greek_UPSILONdieresis = 0x7a9;
+  public static final int XK_Greek_OMEGAaccent = 0x7ab;
+  public static final int XK_Greek_accentdieresis = 0x7ae;
+  public static final int XK_Greek_horizbar = 0x7af;
+  public static final int XK_Greek_alphaaccent = 0x7b1;
+  public static final int XK_Greek_epsilonaccent = 0x7b2;
+  public static final int XK_Greek_etaaccent = 0x7b3;
+  public static final int XK_Greek_iotaaccent = 0x7b4;
+  public static final int XK_Greek_iotadieresis = 0x7b5;
+  public static final int XK_Greek_iotaaccentdieresis = 0x7b6;
+  public static final int XK_Greek_omicronaccent = 0x7b7;
+  public static final int XK_Greek_upsilonaccent = 0x7b8;
+  public static final int XK_Greek_upsilondieresis = 0x7b9;
+  public static final int XK_Greek_upsilonaccentdieresis = 0x7ba;
+  public static final int XK_Greek_omegaaccent = 0x7bb;
+  public static final int XK_Greek_ALPHA = 0x7c1;
+  public static final int XK_Greek_BETA = 0x7c2;
+  public static final int XK_Greek_GAMMA = 0x7c3;
+  public static final int XK_Greek_DELTA = 0x7c4;
+  public static final int XK_Greek_EPSILON = 0x7c5;
+  public static final int XK_Greek_ZETA = 0x7c6;
+  public static final int XK_Greek_ETA = 0x7c7;
+  public static final int XK_Greek_THETA = 0x7c8;
+  public static final int XK_Greek_IOTA = 0x7c9;
+  public static final int XK_Greek_KAPPA = 0x7ca;
+  public static final int XK_Greek_LAMDA = 0x7cb;
+  public static final int XK_Greek_LAMBDA = 0x7cb;
+  public static final int XK_Greek_MU = 0x7cc;
+  public static final int XK_Greek_NU = 0x7cd;
+  public static final int XK_Greek_XI = 0x7ce;
+  public static final int XK_Greek_OMICRON = 0x7cf;
+  public static final int XK_Greek_PI = 0x7d0;
+  public static final int XK_Greek_RHO = 0x7d1;
+  public static final int XK_Greek_SIGMA = 0x7d2;
+  public static final int XK_Greek_TAU = 0x7d4;
+  public static final int XK_Greek_UPSILON = 0x7d5;
+  public static final int XK_Greek_PHI = 0x7d6;
+  public static final int XK_Greek_CHI = 0x7d7;
+  public static final int XK_Greek_PSI = 0x7d8;
+  public static final int XK_Greek_OMEGA = 0x7d9;
+  public static final int XK_Greek_alpha = 0x7e1;
+  public static final int XK_Greek_beta = 0x7e2;
+  public static final int XK_Greek_gamma = 0x7e3;
+  public static final int XK_Greek_delta = 0x7e4;
+  public static final int XK_Greek_epsilon = 0x7e5;
+  public static final int XK_Greek_zeta = 0x7e6;
+  public static final int XK_Greek_eta = 0x7e7;
+  public static final int XK_Greek_theta = 0x7e8;
+  public static final int XK_Greek_iota = 0x7e9;
+  public static final int XK_Greek_kappa = 0x7ea;
+  public static final int XK_Greek_lamda = 0x7eb;
+  public static final int XK_Greek_lambda = 0x7eb;
+  public static final int XK_Greek_mu = 0x7ec;
+  public static final int XK_Greek_nu = 0x7ed;
+  public static final int XK_Greek_xi = 0x7ee;
+  public static final int XK_Greek_omicron = 0x7ef;
+  public static final int XK_Greek_pi = 0x7f0;
+  public static final int XK_Greek_rho = 0x7f1;
+  public static final int XK_Greek_sigma = 0x7f2;
+  public static final int XK_Greek_finalsmallsigma = 0x7f3;
+  public static final int XK_Greek_tau = 0x7f4;
+  public static final int XK_Greek_upsilon = 0x7f5;
+  public static final int XK_Greek_phi = 0x7f6;
+  public static final int XK_Greek_chi = 0x7f7;
+  public static final int XK_Greek_psi = 0x7f8;
+  public static final int XK_Greek_omega = 0x7f9;
+  public static final int XK_Greek_switch = 0xFF7E;  /* Alias for mode_switch */
+
+  /*
+   * Technical;
+   * Byte 3 = 8;
+   */
+
+  public static final int XK_leftradical = 0x8a1;
+  public static final int XK_topleftradical = 0x8a2;
+  public static final int XK_horizconnector = 0x8a3;
+  public static final int XK_topintegral = 0x8a4;
+  public static final int XK_botintegral = 0x8a5;
+  public static final int XK_vertconnector = 0x8a6;
+  public static final int XK_topleftsqbracket = 0x8a7;
+  public static final int XK_botleftsqbracket = 0x8a8;
+  public static final int XK_toprightsqbracket = 0x8a9;
+  public static final int XK_botrightsqbracket = 0x8aa;
+  public static final int XK_topleftparens = 0x8ab;
+  public static final int XK_botleftparens = 0x8ac;
+  public static final int XK_toprightparens = 0x8ad;
+  public static final int XK_botrightparens = 0x8ae;
+  public static final int XK_leftmiddlecurlybrace = 0x8af;
+  public static final int XK_rightmiddlecurlybrace = 0x8b0;
+  public static final int XK_topleftsummation = 0x8b1;
+  public static final int XK_botleftsummation = 0x8b2;
+  public static final int XK_topvertsummationconnector = 0x8b3;
+  public static final int XK_botvertsummationconnector = 0x8b4;
+  public static final int XK_toprightsummation = 0x8b5;
+  public static final int XK_botrightsummation = 0x8b6;
+  public static final int XK_rightmiddlesummation = 0x8b7;
+  public static final int XK_lessthanequal = 0x8bc;
+  public static final int XK_notequal = 0x8bd;
+  public static final int XK_greaterthanequal = 0x8be;
+  public static final int XK_integral = 0x8bf;
+  public static final int XK_therefore = 0x8c0;
+  public static final int XK_variation = 0x8c1;
+  public static final int XK_infinity = 0x8c2;
+  public static final int XK_nabla = 0x8c5;
+  public static final int XK_approximate = 0x8c8;
+  public static final int XK_similarequal = 0x8c9;
+  public static final int XK_ifonlyif = 0x8cd;
+  public static final int XK_implies = 0x8ce;
+  public static final int XK_identical = 0x8cf;
+  public static final int XK_radical = 0x8d6;
+  public static final int XK_includedin = 0x8da;
+  public static final int XK_includes = 0x8db;
+  public static final int XK_intersection = 0x8dc;
+  public static final int XK_union = 0x8dd;
+  public static final int XK_logicaland = 0x8de;
+  public static final int XK_logicalor = 0x8df;
+  public static final int XK_partialderivative = 0x8ef;
+  public static final int XK_function = 0x8f6;
+  public static final int XK_leftarrow = 0x8fb;
+  public static final int XK_uparrow = 0x8fc;
+  public static final int XK_rightarrow = 0x8fd;
+  public static final int XK_downarrow = 0x8fe;
+
+  /*
+   *  Special;
+   *  Byte 3 = 9;
+   */
+
+  public static final int XK_blank = 0x9df;
+  public static final int XK_soliddiamond = 0x9e0;
+  public static final int XK_checkerboard = 0x9e1;
+  public static final int XK_ht = 0x9e2;
+  public static final int XK_ff = 0x9e3;
+  public static final int XK_cr = 0x9e4;
+  public static final int XK_lf = 0x9e5;
+  public static final int XK_nl = 0x9e8;
+  public static final int XK_vt = 0x9e9;
+  public static final int XK_lowrightcorner = 0x9ea;
+  public static final int XK_uprightcorner = 0x9eb;
+  public static final int XK_upleftcorner = 0x9ec;
+  public static final int XK_lowleftcorner = 0x9ed;
+  public static final int XK_crossinglines = 0x9ee;
+  public static final int XK_horizlinescan1 = 0x9ef;
+  public static final int XK_horizlinescan3 = 0x9f0;
+  public static final int XK_horizlinescan5 = 0x9f1;
+  public static final int XK_horizlinescan7 = 0x9f2;
+  public static final int XK_horizlinescan9 = 0x9f3;
+  public static final int XK_leftt = 0x9f4;
+  public static final int XK_rightt = 0x9f5;
+  public static final int XK_bott = 0x9f6;
+  public static final int XK_topt = 0x9f7;
+  public static final int XK_vertbar = 0x9f8;
+
+  /*
+   *  Publishing;
+   *  Byte 3 = a;
+   */
+
+  public static final int XK_emspace = 0xaa1;
+  public static final int XK_enspace = 0xaa2;
+  public static final int XK_em3space = 0xaa3;
+  public static final int XK_em4space = 0xaa4;
+  public static final int XK_digitspace = 0xaa5;
+  public static final int XK_punctspace = 0xaa6;
+  public static final int XK_thinspace = 0xaa7;
+  public static final int XK_hairspace = 0xaa8;
+  public static final int XK_emdash = 0xaa9;
+  public static final int XK_endash = 0xaaa;
+  public static final int XK_signifblank = 0xaac;
+  public static final int XK_ellipsis = 0xaae;
+  public static final int XK_doubbaselinedot = 0xaaf;
+  public static final int XK_onethird = 0xab0;
+  public static final int XK_twothirds = 0xab1;
+  public static final int XK_onefifth = 0xab2;
+  public static final int XK_twofifths = 0xab3;
+  public static final int XK_threefifths = 0xab4;
+  public static final int XK_fourfifths = 0xab5;
+  public static final int XK_onesixth = 0xab6;
+  public static final int XK_fivesixths = 0xab7;
+  public static final int XK_careof = 0xab8;
+  public static final int XK_figdash = 0xabb;
+  public static final int XK_leftanglebracket = 0xabc;
+  public static final int XK_decimalpoint = 0xabd;
+  public static final int XK_rightanglebracket = 0xabe;
+  public static final int XK_marker = 0xabf;
+  public static final int XK_oneeighth = 0xac3;
+  public static final int XK_threeeighths = 0xac4;
+  public static final int XK_fiveeighths = 0xac5;
+  public static final int XK_seveneighths = 0xac6;
+  public static final int XK_trademark = 0xac9;
+  public static final int XK_signaturemark = 0xaca;
+  public static final int XK_trademarkincircle = 0xacb;
+  public static final int XK_leftopentriangle = 0xacc;
+  public static final int XK_rightopentriangle = 0xacd;
+  public static final int XK_emopencircle = 0xace;
+  public static final int XK_emopenrectangle = 0xacf;
+  public static final int XK_leftsinglequotemark = 0xad0;
+  public static final int XK_rightsinglequotemark = 0xad1;
+  public static final int XK_leftdoublequotemark = 0xad2;
+  public static final int XK_rightdoublequotemark = 0xad3;
+  public static final int XK_prescription = 0xad4;
+  public static final int XK_minutes = 0xad6;
+  public static final int XK_seconds = 0xad7;
+  public static final int XK_latincross = 0xad9;
+  public static final int XK_hexagram = 0xada;
+  public static final int XK_filledrectbullet = 0xadb;
+  public static final int XK_filledlefttribullet = 0xadc;
+  public static final int XK_filledrighttribullet = 0xadd;
+  public static final int XK_emfilledcircle = 0xade;
+  public static final int XK_emfilledrect = 0xadf;
+  public static final int XK_enopencircbullet = 0xae0;
+  public static final int XK_enopensquarebullet = 0xae1;
+  public static final int XK_openrectbullet = 0xae2;
+  public static final int XK_opentribulletup = 0xae3;
+  public static final int XK_opentribulletdown = 0xae4;
+  public static final int XK_openstar = 0xae5;
+  public static final int XK_enfilledcircbullet = 0xae6;
+  public static final int XK_enfilledsqbullet = 0xae7;
+  public static final int XK_filledtribulletup = 0xae8;
+  public static final int XK_filledtribulletdown = 0xae9;
+  public static final int XK_leftpointer = 0xaea;
+  public static final int XK_rightpointer = 0xaeb;
+  public static final int XK_club = 0xaec;
+  public static final int XK_diamond = 0xaed;
+  public static final int XK_heart = 0xaee;
+  public static final int XK_maltesecross = 0xaf0;
+  public static final int XK_dagger = 0xaf1;
+  public static final int XK_doubledagger = 0xaf2;
+  public static final int XK_checkmark = 0xaf3;
+  public static final int XK_ballotcross = 0xaf4;
+  public static final int XK_musicalsharp = 0xaf5;
+  public static final int XK_musicalflat = 0xaf6;
+  public static final int XK_malesymbol = 0xaf7;
+  public static final int XK_femalesymbol = 0xaf8;
+  public static final int XK_telephone = 0xaf9;
+  public static final int XK_telephonerecorder = 0xafa;
+  public static final int XK_phonographcopyright = 0xafb;
+  public static final int XK_caret = 0xafc;
+  public static final int XK_singlelowquotemark = 0xafd;
+  public static final int XK_doublelowquotemark = 0xafe;
+  public static final int XK_cursor = 0xaff;
+
+  /*
+   *  APL;
+   *  Byte 3 = b;
+   */
+
+  public static final int XK_leftcaret = 0xba3;
+  public static final int XK_rightcaret = 0xba6;
+  public static final int XK_downcaret = 0xba8;
+  public static final int XK_upcaret = 0xba9;
+  public static final int XK_overbar = 0xbc0;
+  public static final int XK_downtack = 0xbc2;
+  public static final int XK_upshoe = 0xbc3;
+  public static final int XK_downstile = 0xbc4;
+  public static final int XK_underbar = 0xbc6;
+  public static final int XK_jot = 0xbca;
+  public static final int XK_quad = 0xbcc;
+  public static final int XK_uptack = 0xbce;
+  public static final int XK_circle = 0xbcf;
+  public static final int XK_upstile = 0xbd3;
+  public static final int XK_downshoe = 0xbd6;
+  public static final int XK_rightshoe = 0xbd8;
+  public static final int XK_leftshoe = 0xbda;
+  public static final int XK_lefttack = 0xbdc;
+  public static final int XK_righttack = 0xbfc;
+
+  /*
+   * Hebrew;
+   * Byte 3 = c;
+   */
+
+  public static final int XK_hebrew_doublelowline = 0xcdf;
+  public static final int XK_hebrew_aleph = 0xce0;
+  public static final int XK_hebrew_bet = 0xce1;
+  public static final int XK_hebrew_beth = 0xce1;  /* deprecated */
+  public static final int XK_hebrew_gimel = 0xce2;
+  public static final int XK_hebrew_gimmel = 0xce2;  /* deprecated */
+  public static final int XK_hebrew_dalet = 0xce3;
+  public static final int XK_hebrew_daleth = 0xce3;  /* deprecated */
+  public static final int XK_hebrew_he = 0xce4;
+  public static final int XK_hebrew_waw = 0xce5;
+  public static final int XK_hebrew_zain = 0xce6;
+  public static final int XK_hebrew_zayin = 0xce6;  /* deprecated */
+  public static final int XK_hebrew_chet = 0xce7;
+  public static final int XK_hebrew_het = 0xce7;  /* deprecated */
+  public static final int XK_hebrew_tet = 0xce8;
+  public static final int XK_hebrew_teth = 0xce8;  /* deprecated */
+  public static final int XK_hebrew_yod = 0xce9;
+  public static final int XK_hebrew_finalkaph = 0xcea;
+  public static final int XK_hebrew_kaph = 0xceb;
+  public static final int XK_hebrew_lamed = 0xcec;
+  public static final int XK_hebrew_finalmem = 0xced;
+  public static final int XK_hebrew_mem = 0xcee;
+  public static final int XK_hebrew_finalnun = 0xcef;
+  public static final int XK_hebrew_nun = 0xcf0;
+  public static final int XK_hebrew_samech = 0xcf1;
+  public static final int XK_hebrew_samekh = 0xcf1;  /* deprecated */
+  public static final int XK_hebrew_ayin = 0xcf2;
+  public static final int XK_hebrew_finalpe = 0xcf3;
+  public static final int XK_hebrew_pe = 0xcf4;
+  public static final int XK_hebrew_finalzade = 0xcf5;
+  public static final int XK_hebrew_finalzadi = 0xcf5;  /* deprecated */
+  public static final int XK_hebrew_zade = 0xcf6;
+  public static final int XK_hebrew_zadi = 0xcf6;  /* deprecated */
+  public static final int XK_hebrew_qoph = 0xcf7;
+  public static final int XK_hebrew_kuf = 0xcf7;  /* deprecated */
+  public static final int XK_hebrew_resh = 0xcf8;
+  public static final int XK_hebrew_shin = 0xcf9;
+  public static final int XK_hebrew_taw = 0xcfa;
+  public static final int XK_hebrew_taf = 0xcfa;  /* deprecated */
+  public static final int XK_Hebrew_switch = 0xFF7E;  /* Alias for mode_switch */
+
+  /*
+   * Thai;
+   * Byte 3 = d;
+   */
+
+  public static final int XK_Thai_kokai = 0xda1;
+  public static final int XK_Thai_khokhai = 0xda2;
+  public static final int XK_Thai_khokhuat = 0xda3;
+  public static final int XK_Thai_khokhwai = 0xda4;
+  public static final int XK_Thai_khokhon = 0xda5;
+  public static final int XK_Thai_khorakhang = 0xda6;
+  public static final int XK_Thai_ngongu = 0xda7;
+  public static final int XK_Thai_chochan = 0xda8;
+  public static final int XK_Thai_choching = 0xda9;
+  public static final int XK_Thai_chochang = 0xdaa;
+  public static final int XK_Thai_soso = 0xdab;
+  public static final int XK_Thai_chochoe = 0xdac;
+  public static final int XK_Thai_yoying = 0xdad;
+  public static final int XK_Thai_dochada = 0xdae;
+  public static final int XK_Thai_topatak = 0xdaf;
+  public static final int XK_Thai_thothan = 0xdb0;
+  public static final int XK_Thai_thonangmontho = 0xdb1;
+  public static final int XK_Thai_thophuthao = 0xdb2;
+  public static final int XK_Thai_nonen = 0xdb3;
+  public static final int XK_Thai_dodek = 0xdb4;
+  public static final int XK_Thai_totao = 0xdb5;
+  public static final int XK_Thai_thothung = 0xdb6;
+  public static final int XK_Thai_thothahan = 0xdb7;
+  public static final int XK_Thai_thothong = 0xdb8;
+  public static final int XK_Thai_nonu = 0xdb9;
+  public static final int XK_Thai_bobaimai = 0xdba;
+  public static final int XK_Thai_popla = 0xdbb;
+  public static final int XK_Thai_phophung = 0xdbc;
+  public static final int XK_Thai_fofa = 0xdbd;
+  public static final int XK_Thai_phophan = 0xdbe;
+  public static final int XK_Thai_fofan = 0xdbf;
+  public static final int XK_Thai_phosamphao = 0xdc0;
+  public static final int XK_Thai_moma = 0xdc1;
+  public static final int XK_Thai_yoyak = 0xdc2;
+  public static final int XK_Thai_rorua = 0xdc3;
+  public static final int XK_Thai_ru = 0xdc4;
+  public static final int XK_Thai_loling = 0xdc5;
+  public static final int XK_Thai_lu = 0xdc6;
+  public static final int XK_Thai_wowaen = 0xdc7;
+  public static final int XK_Thai_sosala = 0xdc8;
+  public static final int XK_Thai_sorusi = 0xdc9;
+  public static final int XK_Thai_sosua = 0xdca;
+  public static final int XK_Thai_hohip = 0xdcb;
+  public static final int XK_Thai_lochula = 0xdcc;
+  public static final int XK_Thai_oang = 0xdcd;
+  public static final int XK_Thai_honokhuk = 0xdce;
+  public static final int XK_Thai_paiyannoi = 0xdcf;
+  public static final int XK_Thai_saraa = 0xdd0;
+  public static final int XK_Thai_maihanakat = 0xdd1;
+  public static final int XK_Thai_saraaa = 0xdd2;
+  public static final int XK_Thai_saraam = 0xdd3;
+  public static final int XK_Thai_sarai = 0xdd4;
+  public static final int XK_Thai_saraii = 0xdd5;
+  public static final int XK_Thai_saraue = 0xdd6;
+  public static final int XK_Thai_sarauee = 0xdd7;
+  public static final int XK_Thai_sarau = 0xdd8;
+  public static final int XK_Thai_sarauu = 0xdd9;
+  public static final int XK_Thai_phinthu = 0xdda;
+  public static final int XK_Thai_maihanakat_maitho = 0xdde;
+  public static final int XK_Thai_baht = 0xddf;
+  public static final int XK_Thai_sarae = 0xde0;
+  public static final int XK_Thai_saraae = 0xde1;
+  public static final int XK_Thai_sarao = 0xde2;
+  public static final int XK_Thai_saraaimaimuan = 0xde3;
+  public static final int XK_Thai_saraaimaimalai = 0xde4;
+  public static final int XK_Thai_lakkhangyao = 0xde5;
+  public static final int XK_Thai_maiyamok = 0xde6;
+  public static final int XK_Thai_maitaikhu = 0xde7;
+  public static final int XK_Thai_maiek = 0xde8;
+  public static final int XK_Thai_maitho = 0xde9;
+  public static final int XK_Thai_maitri = 0xdea;
+  public static final int XK_Thai_maichattawa = 0xdeb;
+  public static final int XK_Thai_thanthakhat = 0xdec;
+  public static final int XK_Thai_nikhahit = 0xded;
+  public static final int XK_Thai_leksun = 0xdf0;
+  public static final int XK_Thai_leknung = 0xdf1;
+  public static final int XK_Thai_leksong = 0xdf2;
+  public static final int XK_Thai_leksam = 0xdf3;
+  public static final int XK_Thai_leksi = 0xdf4;
+  public static final int XK_Thai_lekha = 0xdf5;
+  public static final int XK_Thai_lekhok = 0xdf6;
+  public static final int XK_Thai_lekchet = 0xdf7;
+  public static final int XK_Thai_lekpaet = 0xdf8;
+  public static final int XK_Thai_lekkao = 0xdf9;
+
+  /*
+   *   Korean;
+   *   Byte 3 = e;
+   */
+
+  public static final int XK_Hangul = 0xff31;    /* Hangul start/stop(toggle) */
+  public static final int XK_Hangul_Start = 0xff32;    /* Hangul start */
+  public static final int XK_Hangul_End = 0xff33;    /* Hangul end, English start */
+  public static final int XK_Hangul_Hanja = 0xff34;    /* Start Hangul->Hanja Conversion */
+  public static final int XK_Hangul_Jamo = 0xff35;    /* Hangul Jamo mode */
+  public static final int XK_Hangul_Romaja = 0xff36;    /* Hangul Romaja mode */
+  public static final int XK_Hangul_Codeinput = 0xff37;    /* Hangul code input mode */
+  public static final int XK_Hangul_Jeonja = 0xff38;    /* Jeonja mode */
+  public static final int XK_Hangul_Banja = 0xff39;    /* Banja mode */
+  public static final int XK_Hangul_PreHanja = 0xff3a;    /* Pre Hanja conversion */
+  public static final int XK_Hangul_PostHanja = 0xff3b;    /* Post Hanja conversion */
+  public static final int XK_Hangul_SingleCandidate = 0xff3c;    /* Single candidate */
+  public static final int XK_Hangul_MultipleCandidate = 0xff3d;    /* Multiple candidate */
+  public static final int XK_Hangul_PreviousCandidate = 0xff3e;    /* Previous candidate */
+  public static final int XK_Hangul_Special = 0xff3f;    /* Special symbols */
+  public static final int XK_Hangul_switch = 0xFF7E;    /* Alias for mode_switch */
+
+  /* Hangul Consonant Characters */
+  public static final int XK_Hangul_Kiyeog = 0xea1;
+  public static final int XK_Hangul_SsangKiyeog = 0xea2;
+  public static final int XK_Hangul_KiyeogSios = 0xea3;
+  public static final int XK_Hangul_Nieun = 0xea4;
+  public static final int XK_Hangul_NieunJieuj = 0xea5;
+  public static final int XK_Hangul_NieunHieuh = 0xea6;
+  public static final int XK_Hangul_Dikeud = 0xea7;
+  public static final int XK_Hangul_SsangDikeud = 0xea8;
+  public static final int XK_Hangul_Rieul = 0xea9;
+  public static final int XK_Hangul_RieulKiyeog = 0xeaa;
+  public static final int XK_Hangul_RieulMieum = 0xeab;
+  public static final int XK_Hangul_RieulPieub = 0xeac;
+  public static final int XK_Hangul_RieulSios = 0xead;
+  public static final int XK_Hangul_RieulTieut = 0xeae;
+  public static final int XK_Hangul_RieulPhieuf = 0xeaf;
+  public static final int XK_Hangul_RieulHieuh = 0xeb0;
+  public static final int XK_Hangul_Mieum = 0xeb1;
+  public static final int XK_Hangul_Pieub = 0xeb2;
+  public static final int XK_Hangul_SsangPieub = 0xeb3;
+  public static final int XK_Hangul_PieubSios = 0xeb4;
+  public static final int XK_Hangul_Sios = 0xeb5;
+  public static final int XK_Hangul_SsangSios = 0xeb6;
+  public static final int XK_Hangul_Ieung = 0xeb7;
+  public static final int XK_Hangul_Jieuj = 0xeb8;
+  public static final int XK_Hangul_SsangJieuj = 0xeb9;
+  public static final int XK_Hangul_Cieuc = 0xeba;
+  public static final int XK_Hangul_Khieuq = 0xebb;
+  public static final int XK_Hangul_Tieut = 0xebc;
+  public static final int XK_Hangul_Phieuf = 0xebd;
+  public static final int XK_Hangul_Hieuh = 0xebe;
+
+  /* Hangul Vowel Characters */
+  public static final int XK_Hangul_A = 0xebf;
+  public static final int XK_Hangul_AE = 0xec0;
+  public static final int XK_Hangul_YA = 0xec1;
+  public static final int XK_Hangul_YAE = 0xec2;
+  public static final int XK_Hangul_EO = 0xec3;
+  public static final int XK_Hangul_E = 0xec4;
+  public static final int XK_Hangul_YEO = 0xec5;
+  public static final int XK_Hangul_YE = 0xec6;
+  public static final int XK_Hangul_O = 0xec7;
+  public static final int XK_Hangul_WA = 0xec8;
+  public static final int XK_Hangul_WAE = 0xec9;
+  public static final int XK_Hangul_OE = 0xeca;
+  public static final int XK_Hangul_YO = 0xecb;
+  public static final int XK_Hangul_U = 0xecc;
+  public static final int XK_Hangul_WEO = 0xecd;
+  public static final int XK_Hangul_WE = 0xece;
+  public static final int XK_Hangul_WI = 0xecf;
+  public static final int XK_Hangul_YU = 0xed0;
+  public static final int XK_Hangul_EU = 0xed1;
+  public static final int XK_Hangul_YI = 0xed2;
+  public static final int XK_Hangul_I = 0xed3;
+
+  /* Hangul syllable-final (JongSeong) Characters */
+  public static final int XK_Hangul_J_Kiyeog = 0xed4;
+  public static final int XK_Hangul_J_SsangKiyeog = 0xed5;
+  public static final int XK_Hangul_J_KiyeogSios = 0xed6;
+  public static final int XK_Hangul_J_Nieun = 0xed7;
+  public static final int XK_Hangul_J_NieunJieuj = 0xed8;
+  public static final int XK_Hangul_J_NieunHieuh = 0xed9;
+  public static final int XK_Hangul_J_Dikeud = 0xeda;
+  public static final int XK_Hangul_J_Rieul = 0xedb;
+  public static final int XK_Hangul_J_RieulKiyeog = 0xedc;
+  public static final int XK_Hangul_J_RieulMieum = 0xedd;
+  public static final int XK_Hangul_J_RieulPieub = 0xede;
+  public static final int XK_Hangul_J_RieulSios = 0xedf;
+  public static final int XK_Hangul_J_RieulTieut = 0xee0;
+  public static final int XK_Hangul_J_RieulPhieuf = 0xee1;
+  public static final int XK_Hangul_J_RieulHieuh = 0xee2;
+  public static final int XK_Hangul_J_Mieum = 0xee3;
+  public static final int XK_Hangul_J_Pieub = 0xee4;
+  public static final int XK_Hangul_J_PieubSios = 0xee5;
+  public static final int XK_Hangul_J_Sios = 0xee6;
+  public static final int XK_Hangul_J_SsangSios = 0xee7;
+  public static final int XK_Hangul_J_Ieung = 0xee8;
+  public static final int XK_Hangul_J_Jieuj = 0xee9;
+  public static final int XK_Hangul_J_Cieuc = 0xeea;
+  public static final int XK_Hangul_J_Khieuq = 0xeeb;
+  public static final int XK_Hangul_J_Tieut = 0xeec;
+  public static final int XK_Hangul_J_Phieuf = 0xeed;
+  public static final int XK_Hangul_J_Hieuh = 0xeee;
+
+  /* Ancient Hangul Consonant Characters */
+  public static final int XK_Hangul_RieulYeorinHieuh = 0xeef;
+  public static final int XK_Hangul_SunkyeongeumMieum = 0xef0;
+  public static final int XK_Hangul_SunkyeongeumPieub = 0xef1;
+  public static final int XK_Hangul_PanSios = 0xef2;
+  public static final int XK_Hangul_KkogjiDalrinIeung = 0xef3;
+  public static final int XK_Hangul_SunkyeongeumPhieuf = 0xef4;
+  public static final int XK_Hangul_YeorinHieuh = 0xef5;
+
+  /* Ancient Hangul Vowel Characters */
+  public static final int XK_Hangul_AraeA = 0xef6;
+  public static final int XK_Hangul_AraeAE = 0xef7;
+
+  /* Ancient Hangul syllable-final (JongSeong) Characters */
+  public static final int XK_Hangul_J_PanSios = 0xef8;
+  public static final int XK_Hangul_J_KkogjiDalrinIeung = 0xef9;
+  public static final int XK_Hangul_J_YeorinHieuh = 0xefa;
+
+  /* Korean currency symbol */
+  public static final int XK_Korean_Won = 0xeff;
+
+  public static final int XK_EcuSign = 0x20a0;
+  public static final int XK_ColonSign = 0x20a1;
+  public static final int XK_CruzeiroSign = 0x20a2;
+  public static final int XK_FFrancSign = 0x20a3;
+  public static final int XK_LiraSign = 0x20a4;
+  public static final int XK_MillSign = 0x20a5;
+  public static final int XK_NairaSign = 0x20a6;
+  public static final int XK_PesetaSign = 0x20a7;
+  public static final int XK_RupeeSign = 0x20a8;
+  public static final int XK_WonSign = 0x20a9;
+  public static final int XK_NewSheqelSign = 0x20aa;
+  public static final int XK_DongSign = 0x20ab;
+  public static final int XK_EuroSign = 0x20ac;
+
+}
diff --git a/java/com/tigervnc/rfb/Keysyms.java b/java/com/tigervnc/rfb/Keysyms.java
deleted file mode 100644 (file)
index 05f4682..0000000
+++ /dev/null
@@ -1,391 +0,0 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright (C) 2012-2013 D. R. Commander.  All Rights Reserved.
- * Copyright (C) 2013 Brian P. Hinz
- * Copyright (C) 2013 Pierre Ossman <ossman@cendio.se> for Cendio AB
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-//
-// Keysyms - defines X keysyms for non-character keys.  All keysyms
-// corresponding to characters should be generated by calling
-// UnicodeToKeysym.ucs2keysym().
-//
-
-package com.tigervnc.rfb;
-
-import java.awt.event.KeyEvent;
-import com.tigervnc.vncviewer.VncViewer;
-
-public class Keysyms {
-
-  public static final int VoidSymbol = 0xffffff;
-  /*
-   * TTY Functions, cleverly chosen to map to ascii, for convenience of
-   * programming, but could have been arbitrary (at the cost of lookup
-   * tables in client code.
-   */
-  public static final int BackSpace = 0xFF08;
-  public static final int Tab = 0xFF09;
-  public static final int Linefeed = 0xFF0A;
-  public static final int Clear = 0xFF0B;
-  public static final int Return = 0xFF0D;
-  public static final int Pause = 0xFF13;
-  public static final int Scroll_Lock = 0xFF14;
-  public static final int Sys_Req = 0xFF15;
-  public static final int Escape = 0xFF1B;
-  public static final int Delete = 0xFFFF;
-
-  /* International & multi-key character composition */
-  public static final int Multi_key = 0xFF20;  /* Multi-key character compose */
-  public static final int Codeinput = 0xFF37;
-  public static final int SingleCandidate = 0xFF3C;
-  public static final int MultipleCandidate = 0xFF3D;
-  public static final int PreviousCandidate = 0xFF3E;
-
-  /* Japanese keyboard support */
-  public static final int Kanji = 0xFF21;  /* Kanji, Kanji convert */
-  public static final int Muhenkan = 0xFF22;  /* Cancel Conversion */
-  public static final int Henkan_Mode = 0xFF23;  /* Start/Stop Conversion */
-  public static final int Henkan = 0xFF23;  /* Alias for Henkan_Mode */
-  public static final int Romaji = 0xFF24;  /* to Romaji */
-  public static final int Hiragana = 0xFF25;  /* to Hiragana */
-  public static final int Katakana = 0xFF26;  /* to Katakana */
-  public static final int Hiragana_Katakana = 0xFF27;  /* Hiragana/Katakana toggle */
-  public static final int Zenkaku = 0xFF28;  /* to Zenkaku */
-  public static final int Hankaku = 0xFF29;  /* to Hankaku */
-  public static final int Zenkaku_Hankaku = 0xFF2A;  /* Zenkaku/Hankaku toggle */
-  public static final int Touroku = 0xFF2B;  /* Add to Dictionary */
-  public static final int Massyo = 0xFF2C;  /* Delete from Dictionary */
-  public static final int Kana_Lock = 0xFF2D;  /* Kana Lock */
-  public static final int Kana_Shift = 0xFF2E;  /* Kana Shift */
-  public static final int Eisu_Shift = 0xFF2F;  /* Alphanumeric Shift */
-  public static final int Eisu_toggle = 0xFF30;  /* Alphanumeric toggle */
-  public static final int Kanji_Bangou = 0xFF37;  /* Codeinput */
-  public static final int Zen_Koho = 0xFF3D;  /* Multiple/All Candidate(s) */
-  public static final int Mae_Koho = 0xFF3E;  /* Previous Candidate */
-
-  /* Cursor control & motion */
-  public static final int Home = 0xFF50;
-  public static final int Left = 0xFF51;
-  public static final int Up = 0xFF52;
-  public static final int Right = 0xFF53;
-  public static final int Down = 0xFF54;
-  public static final int Prior = 0xFF55;
-  public static final int Page_Up = 0xFF55;
-  public static final int Next = 0xFF56;
-  public static final int Page_Down = 0xFF56;
-  public static final int End = 0xFF57;
-  public static final int Begin = 0xFF58;
-
-  /* Misc Functions */
-  public static final int Select = 0xFF60;
-  public static final int Print = 0xFF61;
-  public static final int Execute = 0xFF62;
-  public static final int Insert = 0xFF63;
-  public static final int Undo = 0xFF65;
-  public static final int Redo = 0xFF66;
-  public static final int Menu = 0xFF67;
-  public static final int Find = 0xFF68;
-  public static final int Cancel = 0xFF69;
-  public static final int Help = 0xFF6A;
-  public static final int Break = 0xFF6B;
-  public static final int Mode_switch = 0xFF7E;
-  public static final int script_switch = 0xFF7E;
-  public static final int Num_Lock = 0xFF7F;
-
-  /* Keypad Functions, keypad numbers cleverly chosen to map to ascii */
-  public static final int KP_Enter = 0xFF8D;
-  public static final int KP_Home = 0xFF95;
-  public static final int KP_Left = 0xFF96;
-  public static final int KP_Up = 0xFF97;
-  public static final int KP_Right = 0xFF98;
-  public static final int KP_Down = 0xFF99;
-  public static final int KP_Page_Up = 0xFF9A;
-  public static final int KP_Page_Down = 0xFF9B;
-  public static final int KP_End = 0xFF9C;
-  public static final int KP_Begin = 0xFF9D;
-  public static final int KP_Insert = 0xFF9E;
-  public static final int KP_Delete = 0xFF9F;
-  public static final int KP_Equal = 0xFFBD;
-  public static final int KP_0 = 0xFFB0;
-  public static final int KP_1 = 0xFFB1;
-  public static final int KP_2 = 0xFFB2;
-  public static final int KP_3 = 0xFFB3;
-  public static final int KP_4 = 0xFFB4;
-  public static final int KP_5 = 0xFFB5;
-  public static final int KP_6 = 0xFFB6;
-  public static final int KP_7 = 0xFFB7;
-  public static final int KP_8 = 0xFFB8;
-  public static final int KP_9 = 0xFFB9;
-  public static final int KP_Decimal = 0xFFAE;
-  public static final int KP_Add = 0xFFAB;
-  public static final int KP_Subtract = 0xFFAD;
-  public static final int KP_Multiply = 0xFFAA;
-  public static final int KP_Divide = 0xFFAF;
-
-  /*
-   * Auxilliary Functions; note the duplicate definitions for left and right
-   * function keys;  Sun keyboards and a few other manufactures have such
-   * function key groups on the left and/or right sides of the keyboard.
-   * We've not found a keyboard with more than 35 function keys total.
-   */
-  public static final int F1 = 0xFFBE;
-  public static final int F2 = 0xFFBF;
-  public static final int F3 = 0xFFC0;
-  public static final int F4 = 0xFFC1;
-  public static final int F5 = 0xFFC2;
-  public static final int F6 = 0xFFC3;
-  public static final int F7 = 0xFFC4;
-  public static final int F8 = 0xFFC5;
-  public static final int F9 = 0xFFC6;
-  public static final int F10 = 0xFFC7;
-  public static final int F11 = 0xFFC8;
-  public static final int F12 = 0xFFC9;
-  public static final int F13 = 0xFFCA;
-  public static final int F14 = 0xFFCB;
-  public static final int F15 = 0xFFCC;
-  public static final int F16 = 0xFFCD;
-  public static final int F17 = 0xFFCE;
-  public static final int F18 = 0xFFCF;
-  public static final int F19 = 0xFFD0;
-  public static final int F20 = 0xFFD1;
-  public static final int F21 = 0xFFD2;
-  public static final int F22 = 0xFFD3;
-  public static final int F23 = 0xFFD4;
-  public static final int F24 = 0xFFD5;
-
-  /* Modifiers */
-  public static final int Shift_L = 0xFFE1;
-  public static final int Shift_R = 0xFFE2;
-  public static final int Control_L = 0xFFE3;
-  public static final int Control_R = 0xFFE4;
-  public static final int Caps_Lock = 0xFFE5;
-  public static final int Shift_Lock = 0xFFE6;
-
-  public static final int Meta_L = 0xFFE7;
-  public static final int Meta_R = 0xFFE8;
-  public static final int Alt_L = 0xFFE9;
-  public static final int Alt_R = 0xFFEA;
-  public static final int Super_L = 0xFFEB;
-  public static final int Super_R = 0xFFEC;
-  public static final int Hyper_L = 0xFFED;
-  public static final int Hyper_R = 0xFFEE;
-
-  /*
-   * ISO 9995 Function and Modifier Keys
-   * Byte 3 = 0xFE
-   */
-  public static final int ISO_Level3_Shift = 0xFE03;
-
-  /*
-   * Dead Modifier Keys
-   */
-  public static final int Dead_Grave = 0xfe50; /*                               COMBINING GRAVE ACCENT */
-  public static final int Dead_Acute = 0xfe51; /*                               COMBINING ACUTE ACCENT */
-  public static final int Dead_Circumflex = 0xfe52; /*                               COMBINING CIRCUMFLEX ACCENT */
-  public static final int Dead_Tilde = 0xfe53; /*                               COMBINING TILDE */
-  public static final int Dead_Macron = 0xfe54; /*                               COMBINING MACRON */
-  public static final int Dead_Breve = 0xfe55; /*                               COMBINING BREVE */
-  public static final int Dead_AboveDot = 0xfe56; /*                               COMBINING DOT ABOVE */
-  public static final int Dead_Diaeresis = 0xfe57; /*                               COMBINING DIAERESIS */
-  public static final int Dead_AboveRing = 0xfe58; /*                               COMBINING RING ABOVE */
-  public static final int Dead_DoubleAcute = 0xfe59; /*                               COMBINING DOUBLE ACUTE ACCENT */
-  public static final int Dead_Caron = 0xfe5a; /*                               COMBINING CARON */
-  public static final int Dead_Cedilla = 0xfe5b; /*                               COMBINING CEDILLA */
-  public static final int Dead_Ogonek = 0xfe5c; /*                               COMBINING OGONEK */
-  public static final int Dead_Iota = 0xfe5d; /*                               MODIFIER LETTER SMALL IOTA */
-  public static final int Dead_Voiced_Sound = 0xfe5e; /*                               COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK */
-  public static final int Dead_SemiVoiced_Sound = 0xfe5f; /*                               COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
-  public static final int Dead_BelowDot = 0xfe60; /*                               COMBINING DOT BELOW */
-
-  private static class KeySymbol {
-    public KeySymbol(int keycode_, int[] keysym_) {
-      keycode = keycode_;
-      keysym = new int[5];
-      System.arraycopy(keysym_, 0, keysym, 0, 5);
-    }
-    int keycode;
-    int[] keysym;
-  }
-
-  private static KeySymbol[] keySymbols = {
-    /*                 KEYCODE                                                    LOCATION                          */
-    /*                                                UNKNOWN     STANDARD          LEFT        RIGHT       NUMPAD  */
-    new KeySymbol(KeyEvent.VK_BACK_SPACE,   new int[]{VoidSymbol, BackSpace,        VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_TAB,          new int[]{VoidSymbol, Tab,              VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_ENTER,        new int[]{VoidSymbol, Return,           VoidSymbol, VoidSymbol, KP_Enter}),
-    new KeySymbol(KeyEvent.VK_ESCAPE,       new int[]{VoidSymbol, Escape,           VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_CONTROL,      new int[]{VoidSymbol, Control_L,        Control_L,  Control_R,  VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_ALT_GRAPH,    new int[]{VoidSymbol, ISO_Level3_Shift, VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_ALT,          new int[]{VoidSymbol, ISO_Level3_Shift, Alt_L,      Alt_R,      VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_SHIFT,        new int[]{VoidSymbol, Shift_L,          Shift_L,    Shift_R,    VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_META,         new int[]{VoidSymbol, Meta_L,           Meta_L,     Meta_R,     VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_NUMPAD0,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_0}),
-    new KeySymbol(KeyEvent.VK_NUMPAD1,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_1}),
-    new KeySymbol(KeyEvent.VK_NUMPAD2,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_2}),
-    new KeySymbol(KeyEvent.VK_NUMPAD3,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_3}),
-    new KeySymbol(KeyEvent.VK_NUMPAD4,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_4}),
-    new KeySymbol(KeyEvent.VK_NUMPAD5,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_5}),
-    new KeySymbol(KeyEvent.VK_NUMPAD6,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_6}),
-    new KeySymbol(KeyEvent.VK_NUMPAD7,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_7}),
-    new KeySymbol(KeyEvent.VK_NUMPAD8,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_8}),
-    new KeySymbol(KeyEvent.VK_NUMPAD9,      new int[]{VoidSymbol, VoidSymbol,       VoidSymbol, VoidSymbol, KP_9}),
-    new KeySymbol(KeyEvent.VK_DECIMAL,      new int[]{VoidSymbol, KP_Decimal,       VoidSymbol, VoidSymbol, KP_Decimal}),
-    new KeySymbol(KeyEvent.VK_ADD,          new int[]{VoidSymbol, KP_Add,           VoidSymbol, VoidSymbol, KP_Add}),
-    new KeySymbol(KeyEvent.VK_SUBTRACT,     new int[]{VoidSymbol, KP_Subtract,      VoidSymbol, VoidSymbol, KP_Subtract}),
-    new KeySymbol(KeyEvent.VK_MULTIPLY,     new int[]{VoidSymbol, KP_Multiply,      VoidSymbol, VoidSymbol, KP_Multiply}),
-    new KeySymbol(KeyEvent.VK_DIVIDE,       new int[]{VoidSymbol, KP_Divide,        VoidSymbol, VoidSymbol, KP_Divide}),
-    new KeySymbol(KeyEvent.VK_DELETE,       new int[]{VoidSymbol, Delete,           VoidSymbol, VoidSymbol, KP_Delete}),
-    new KeySymbol(KeyEvent.VK_CLEAR,        new int[]{VoidSymbol, Clear,            VoidSymbol, VoidSymbol, KP_Begin}),
-    new KeySymbol(KeyEvent.VK_HOME,         new int[]{VoidSymbol, Home,             VoidSymbol, VoidSymbol, KP_Home}),
-    new KeySymbol(KeyEvent.VK_END,          new int[]{VoidSymbol, End,              VoidSymbol, VoidSymbol, KP_End}),
-    new KeySymbol(KeyEvent.VK_PAGE_UP,      new int[]{VoidSymbol, Page_Up,          VoidSymbol, VoidSymbol, KP_Page_Up}),
-    new KeySymbol(KeyEvent.VK_PAGE_DOWN,    new int[]{VoidSymbol, Page_Down,        VoidSymbol, VoidSymbol, KP_Page_Down}),
-    new KeySymbol(KeyEvent.VK_UP,           new int[]{VoidSymbol, Up,               VoidSymbol, VoidSymbol, KP_Up}),
-    new KeySymbol(KeyEvent.VK_DOWN,         new int[]{VoidSymbol, Down,             VoidSymbol, VoidSymbol, KP_Down}),
-    new KeySymbol(KeyEvent.VK_LEFT,         new int[]{VoidSymbol, Left,             VoidSymbol, VoidSymbol, KP_Left}),
-    new KeySymbol(KeyEvent.VK_RIGHT,        new int[]{VoidSymbol, Right,            VoidSymbol, VoidSymbol, KP_Right}),
-    new KeySymbol(KeyEvent.VK_BEGIN,        new int[]{VoidSymbol, Begin,            VoidSymbol, VoidSymbol, KP_Begin}),
-    new KeySymbol(KeyEvent.VK_KP_LEFT,      new int[]{VoidSymbol, KP_Left,          VoidSymbol, VoidSymbol, KP_Left}),
-    new KeySymbol(KeyEvent.VK_KP_UP,        new int[]{VoidSymbol, KP_Up,            VoidSymbol, VoidSymbol, KP_Up}),
-    new KeySymbol(KeyEvent.VK_KP_RIGHT,     new int[]{VoidSymbol, KP_Right,         VoidSymbol, VoidSymbol, KP_Right}),
-    new KeySymbol(KeyEvent.VK_KP_DOWN,      new int[]{VoidSymbol, KP_Down,          VoidSymbol, VoidSymbol, KP_Down}),
-    new KeySymbol(KeyEvent.VK_PRINTSCREEN,  new int[]{VoidSymbol, Print,            VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_SCROLL_LOCK,  new int[]{VoidSymbol, Scroll_Lock,      VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_CAPS_LOCK,    new int[]{VoidSymbol, Caps_Lock,        VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_NUM_LOCK,     new int[]{VoidSymbol, Num_Lock,         VoidSymbol, VoidSymbol, Num_Lock}),
-    new KeySymbol(KeyEvent.VK_INSERT,       new int[]{VoidSymbol, Insert,           VoidSymbol, VoidSymbol, KP_Insert}),
-    new KeySymbol(KeyEvent.VK_AGAIN,        new int[]{VoidSymbol, Redo,             VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_UNDO,         new int[]{VoidSymbol, Undo,             VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_FIND,         new int[]{VoidSymbol, Find,             VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_STOP,         new int[]{VoidSymbol, Cancel,           VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_HELP,         new int[]{VoidSymbol, Help,             VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_WINDOWS,      new int[]{VoidSymbol, Super_L,          Super_L,    Super_R,    VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_CONTEXT_MENU, new int[]{VoidSymbol, Menu,             VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_KANJI,        new int[]{VoidSymbol, Kanji,            VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_KATAKANA,     new int[]{VoidSymbol, Katakana,         VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_HIRAGANA,     new int[]{VoidSymbol, Hiragana,         VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_PREVIOUS_CANDIDATE, 
-                                            new int[]{VoidSymbol, PreviousCandidate,VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_CODE_INPUT,   new int[]{VoidSymbol, Codeinput,        VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_JAPANESE_ROMAN, 
-                                            new int[]{VoidSymbol, Romaji,           VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_KANA_LOCK,    new int[]{VoidSymbol, Kana_Lock,        VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_ABOVEDOT,new int[]{VoidSymbol, Dead_AboveDot,    VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_ABOVERING,
-                                            new int[]{VoidSymbol, Dead_AboveRing,   VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_ACUTE,   new int[]{VoidSymbol, Dead_Acute,       VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_BREVE,   new int[]{VoidSymbol, Dead_Breve,       VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_CARON,   new int[]{VoidSymbol, Dead_Caron,       VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_CIRCUMFLEX,
-                                            new int[]{VoidSymbol, Dead_Circumflex,  VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_DIAERESIS,
-                                            new int[]{VoidSymbol, Dead_Diaeresis,   VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_DOUBLEACUTE,
-                                            new int[]{VoidSymbol, Dead_DoubleAcute, VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_GRAVE,   new int[]{VoidSymbol, Dead_Grave,       VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_IOTA,    new int[]{VoidSymbol, Dead_Iota,        VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_MACRON,  new int[]{VoidSymbol, Dead_Macron,      VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_OGONEK,  new int[]{VoidSymbol, Dead_Ogonek,      VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_SEMIVOICED_SOUND,
-                                            new int[]{VoidSymbol, Dead_SemiVoiced_Sound,VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_TILDE,   new int[]{VoidSymbol, Dead_Tilde,       VoidSymbol, VoidSymbol, VoidSymbol}),
-    new KeySymbol(KeyEvent.VK_DEAD_VOICED_SOUND,
-                                            new int[]{VoidSymbol, Dead_Voiced_Sound, VoidSymbol, VoidSymbol, VoidSymbol}),
-  };
-
-  public static int translateKeyEvent(KeyEvent ev) {
-    int location = ev.getKeyLocation();
-    int keyCode = ev.getKeyCode();
-
-    // First check for function keys
-    if (keyCode >= KeyEvent.VK_F1 && keyCode <= KeyEvent.VK_F12)
-      return Keysyms.F1 + keyCode - KeyEvent.VK_F1;
-    if (keyCode >= KeyEvent.VK_F13 && keyCode <= KeyEvent.VK_F24)
-      return Keysyms.F13 + keyCode - KeyEvent.VK_F13;
-
-    // Numpad numbers
-    if (keyCode >= KeyEvent.VK_0 && keyCode <= KeyEvent.VK_9 &&
-        location == KeyEvent.KEY_LOCATION_NUMPAD)
-      return Keysyms.KP_0 + keyCode - KeyEvent.VK_0;
-
-    if (VncViewer.os.startsWith("mac os x")) {
-      // Alt on OS X behaves more like AltGr on other systems, and to get
-      // sane behaviour we should translate things in that manner for the
-      // remote VNC server. However that means we lose the ability to use
-      // Alt as a shortcut modifier. Do what RealVNC does and hijack the
-      // left command key as an Alt replacement.
-      switch (keyCode) {
-      case KeyEvent.VK_META:
-        if (location == KeyEvent.KEY_LOCATION_LEFT)
-          return Alt_L;
-        else
-          return Super_L;
-      case KeyEvent.VK_ALT:
-        if (location == KeyEvent.KEY_LOCATION_LEFT)
-          return Alt_L;
-        else
-          return ISO_Level3_Shift;
-      }
-    }
-
-    // Then other special keys
-    if (keyCode == KeyEvent.VK_PAUSE)
-      return (ev.isControlDown() ? Break : Pause);
-    else if (keyCode == KeyEvent.VK_PRINTSCREEN)
-      return (ev.isControlDown() ? Sys_Req : Print);
-    else
-      for(int i = 0; i < keySymbols.length; i++)
-        if (keySymbols[i].keycode == keyCode)
-          return (keySymbols[i].keysym)[location];
-
-    // Unknown special key?
-    if (KeyEvent.getKeyText(keyCode).isEmpty()) {
-      vlog.error("Unknown key code:");
-      String fmt = ev.paramString().replaceAll("%","%%");
-      vlog.error(String.format(fmt.replaceAll(",","%n       ")));
-      return VoidSymbol;
-    }
-
-    char keyChar = ev.getKeyChar();
-    if (!ev.isControlDown() && keyChar != KeyEvent.CHAR_UNDEFINED)
-      return UnicodeToKeysym.ucs2keysym(Character.toString(keyChar).codePointAt(0));
-
-    int key = keyChar;
-    if (ev.isControlDown()) {
-      // For CTRL-<letter>, CTRL is sent separately, so just send <letter>.
-      if ((key >= 1 && key <= 26 && !ev.isShiftDown()) ||
-          // CTRL-{, CTRL-|, CTRL-} also map to ASCII 96-127
-          (key >= 27 && key <= 29 && ev.isShiftDown()))
-        key += 96;
-      // For CTRL-SHIFT-<letter>, send capital <letter> to emulate behavior
-      // of Linux.  For CTRL-@, send @.  For CTRL-_, send _.  For CTRL-^,
-      // send ^.
-      else if (key < 32)
-        key += 64;
-      // Windows and Mac sometimes return CHAR_UNDEFINED with CTRL-SHIFT
-      // combinations, so best we can do is send the key code if it is
-      // a valid ASCII symbol.
-      else if (ev.getKeyChar() == KeyEvent.CHAR_UNDEFINED && keyCode >= 0 &&
-               keyCode <= 127)
-        key = keyCode;
-    }
-    return UnicodeToKeysym.ucs2keysym(key);
-  }
-
-  static LogWriter vlog = new LogWriter("Keysyms");
-}
diff --git a/java/com/tigervnc/rfb/UnicodeToKeysym.java b/java/com/tigervnc/rfb/UnicodeToKeysym.java
deleted file mode 100644 (file)
index 72b8896..0000000
+++ /dev/null
@@ -1,852 +0,0 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright (C) 2013 Brian P. Hinz
- * Copyright (C) 2001 Markus G. Kuhn, University of Cambridge
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-//
-// Derived from keysym2ucs.c, originally authored by Markus G, Kuhn
-//
-
-package com.tigervnc.rfb;
-
-public class UnicodeToKeysym {
-
-  private static class codepair {
-    public codepair(int keysym_, int ucs_) {
-      keysym = keysym_;
-      ucs = ucs_;
-    }
-    int keysym;
-    int ucs;
-  }
-
-  public static codepair[] keysymtab = {
-    new codepair(0x01a1, 0x0104), /*                     Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */
-    new codepair(0x01a2, 0x02d8), /*                       breve ˘ BREVE */
-    new codepair(0x01a3, 0x0141), /*                     Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */
-    new codepair(0x01a5, 0x013d), /*                      Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */
-    new codepair(0x01a6, 0x015a), /*                      Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */
-    new codepair(0x01a9, 0x0160), /*                      Scaron Š LATIN CAPITAL LETTER S WITH CARON */
-    new codepair(0x01aa, 0x015e), /*                    Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */
-    new codepair(0x01ab, 0x0164), /*                      Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */
-    new codepair(0x01ac, 0x0179), /*                      Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */
-    new codepair(0x01ae, 0x017d), /*                      Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */
-    new codepair(0x01af, 0x017b), /*                   Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */
-    new codepair(0x01b1, 0x0105), /*                     aogonek ą LATIN SMALL LETTER A WITH OGONEK */
-    new codepair(0x01b2, 0x02db), /*                      ogonek ˛ OGONEK */
-    new codepair(0x01b3, 0x0142), /*                     lstroke ł LATIN SMALL LETTER L WITH STROKE */
-    new codepair(0x01b5, 0x013e), /*                      lcaron ľ LATIN SMALL LETTER L WITH CARON */
-    new codepair(0x01b6, 0x015b), /*                      sacute ś LATIN SMALL LETTER S WITH ACUTE */
-    new codepair(0x01b7, 0x02c7), /*                       caron ˇ CARON */
-    new codepair(0x01b9, 0x0161), /*                      scaron š LATIN SMALL LETTER S WITH CARON */
-    new codepair(0x01ba, 0x015f), /*                    scedilla ş LATIN SMALL LETTER S WITH CEDILLA */
-    new codepair(0x01bb, 0x0165), /*                      tcaron ť LATIN SMALL LETTER T WITH CARON */
-    new codepair(0x01bc, 0x017a), /*                      zacute ź LATIN SMALL LETTER Z WITH ACUTE */
-    new codepair(0x01bd, 0x02dd), /*                 doubleacute ˝ DOUBLE ACUTE ACCENT */
-    new codepair(0x01be, 0x017e), /*                      zcaron ž LATIN SMALL LETTER Z WITH CARON */
-    new codepair(0x01bf, 0x017c), /*                   zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */
-    new codepair(0x01c0, 0x0154), /*                      Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */
-    new codepair(0x01c3, 0x0102), /*                      Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */
-    new codepair(0x01c5, 0x0139), /*                      Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */
-    new codepair(0x01c6, 0x0106), /*                      Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */
-    new codepair(0x01c8, 0x010c), /*                      Ccaron Č LATIN CAPITAL LETTER C WITH CARON */
-    new codepair(0x01ca, 0x0118), /*                     Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */
-    new codepair(0x01cc, 0x011a), /*                      Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */
-    new codepair(0x01cf, 0x010e), /*                      Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */
-    new codepair(0x01d0, 0x0110), /*                     Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */
-    new codepair(0x01d1, 0x0143), /*                      Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */
-    new codepair(0x01d2, 0x0147), /*                      Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */
-    new codepair(0x01d5, 0x0150), /*                Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
-    new codepair(0x01d8, 0x0158), /*                      Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */
-    new codepair(0x01d9, 0x016e), /*                       Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */
-    new codepair(0x01db, 0x0170), /*                Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
-    new codepair(0x01de, 0x0162), /*                    Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */
-    new codepair(0x01e0, 0x0155), /*                      racute ŕ LATIN SMALL LETTER R WITH ACUTE */
-    new codepair(0x01e3, 0x0103), /*                      abreve ă LATIN SMALL LETTER A WITH BREVE */
-    new codepair(0x01e5, 0x013a), /*                      lacute ĺ LATIN SMALL LETTER L WITH ACUTE */
-    new codepair(0x01e6, 0x0107), /*                      cacute ć LATIN SMALL LETTER C WITH ACUTE */
-    new codepair(0x01e8, 0x010d), /*                      ccaron č LATIN SMALL LETTER C WITH CARON */
-    new codepair(0x01ea, 0x0119), /*                     eogonek ę LATIN SMALL LETTER E WITH OGONEK */
-    new codepair(0x01ec, 0x011b), /*                      ecaron ě LATIN SMALL LETTER E WITH CARON */
-    new codepair(0x01ef, 0x010f), /*                      dcaron ď LATIN SMALL LETTER D WITH CARON */
-    new codepair(0x01f0, 0x0111), /*                     dstroke đ LATIN SMALL LETTER D WITH STROKE */
-    new codepair(0x01f1, 0x0144), /*                      nacute ń LATIN SMALL LETTER N WITH ACUTE */
-    new codepair(0x01f2, 0x0148), /*                      ncaron ň LATIN SMALL LETTER N WITH CARON */
-    new codepair(0x01f5, 0x0151), /*                odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */
-    new codepair(0x01f8, 0x0159), /*                      rcaron ř LATIN SMALL LETTER R WITH CARON */
-    new codepair(0x01f9, 0x016f), /*                       uring ů LATIN SMALL LETTER U WITH RING ABOVE */
-    new codepair(0x01fb, 0x0171), /*                udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */
-    new codepair(0x01fe, 0x0163), /*                    tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */
-    new codepair(0x01ff, 0x02d9), /*                    abovedot ˙ DOT ABOVE */
-    new codepair(0x02a1, 0x0126), /*                     Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */
-    new codepair(0x02a6, 0x0124), /*                 Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
-    new codepair(0x02a9, 0x0130), /*                   Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */
-    new codepair(0x02ab, 0x011e), /*                      Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */
-    new codepair(0x02ac, 0x0134), /*                 Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
-    new codepair(0x02b1, 0x0127), /*                     hstroke ħ LATIN SMALL LETTER H WITH STROKE */
-    new codepair(0x02b6, 0x0125), /*                 hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */
-    new codepair(0x02b9, 0x0131), /*                    idotless ı LATIN SMALL LETTER DOTLESS I */
-    new codepair(0x02bb, 0x011f), /*                      gbreve ğ LATIN SMALL LETTER G WITH BREVE */
-    new codepair(0x02bc, 0x0135), /*                 jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */
-    new codepair(0x02c5, 0x010a), /*                   Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */
-    new codepair(0x02c6, 0x0108), /*                 Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
-    new codepair(0x02d5, 0x0120), /*                   Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */
-    new codepair(0x02d8, 0x011c), /*                 Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
-    new codepair(0x02dd, 0x016c), /*                      Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */
-    new codepair(0x02de, 0x015c), /*                 Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
-    new codepair(0x02e5, 0x010b), /*                   cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */
-    new codepair(0x02e6, 0x0109), /*                 ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */
-    new codepair(0x02f5, 0x0121), /*                   gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */
-    new codepair(0x02f8, 0x011d), /*                 gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */
-    new codepair(0x02fd, 0x016d), /*                      ubreve ŭ LATIN SMALL LETTER U WITH BREVE */
-    new codepair(0x02fe, 0x015d), /*                 scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */
-    new codepair(0x03a2, 0x0138), /*                         kra ĸ LATIN SMALL LETTER KRA */
-    new codepair(0x03a3, 0x0156), /*                    Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */
-    new codepair(0x03a5, 0x0128), /*                      Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */
-    new codepair(0x03a6, 0x013b), /*                    Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */
-    new codepair(0x03aa, 0x0112), /*                     Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */
-    new codepair(0x03ab, 0x0122), /*                    Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */
-    new codepair(0x03ac, 0x0166), /*                      Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */
-    new codepair(0x03b3, 0x0157), /*                    rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */
-    new codepair(0x03b5, 0x0129), /*                      itilde ĩ LATIN SMALL LETTER I WITH TILDE */
-    new codepair(0x03b6, 0x013c), /*                    lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */
-    new codepair(0x03ba, 0x0113), /*                     emacron ē LATIN SMALL LETTER E WITH MACRON */
-    new codepair(0x03bb, 0x0123), /*                    gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */
-    new codepair(0x03bc, 0x0167), /*                      tslash ŧ LATIN SMALL LETTER T WITH STROKE */
-    new codepair(0x03bd, 0x014a), /*                         ENG Ŋ LATIN CAPITAL LETTER ENG */
-    new codepair(0x03bf, 0x014b), /*                         eng ŋ LATIN SMALL LETTER ENG */
-    new codepair(0x03c0, 0x0100), /*                     Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */
-    new codepair(0x03c7, 0x012e), /*                     Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */
-    new codepair(0x03cc, 0x0116), /*                   Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */
-    new codepair(0x03cf, 0x012a), /*                     Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */
-    new codepair(0x03d1, 0x0145), /*                    Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */
-    new codepair(0x03d2, 0x014c), /*                     Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */
-    new codepair(0x03d3, 0x0136), /*                    Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */
-    new codepair(0x03d9, 0x0172), /*                     Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */
-    new codepair(0x03dd, 0x0168), /*                      Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */
-    new codepair(0x03de, 0x016a), /*                     Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */
-    new codepair(0x03e0, 0x0101), /*                     amacron ā LATIN SMALL LETTER A WITH MACRON */
-    new codepair(0x03e7, 0x012f), /*                     iogonek į LATIN SMALL LETTER I WITH OGONEK */
-    new codepair(0x03ec, 0x0117), /*                   eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */
-    new codepair(0x03ef, 0x012b), /*                     imacron ī LATIN SMALL LETTER I WITH MACRON */
-    new codepair(0x03f1, 0x0146), /*                    ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */
-    new codepair(0x03f2, 0x014d), /*                     omacron ō LATIN SMALL LETTER O WITH MACRON */
-    new codepair(0x03f3, 0x0137), /*                    kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */
-    new codepair(0x03f9, 0x0173), /*                     uogonek ų LATIN SMALL LETTER U WITH OGONEK */
-    new codepair(0x03fd, 0x0169), /*                      utilde ũ LATIN SMALL LETTER U WITH TILDE */
-    new codepair(0x03fe, 0x016b), /*                     umacron ū LATIN SMALL LETTER U WITH MACRON */
-    new codepair(0x047e, 0x203e), /*                    overline ‾ OVERLINE */
-    new codepair(0x04a1, 0x3002), /*               kana_fullstop 。 IDEOGRAPHIC FULL STOP */
-    new codepair(0x04a2, 0x300c), /*         kana_openingbracket 「 LEFT CORNER BRACKET */
-    new codepair(0x04a3, 0x300d), /*         kana_closingbracket 」 RIGHT CORNER BRACKET */
-    new codepair(0x04a4, 0x3001), /*                  kana_comma 、 IDEOGRAPHIC COMMA */
-    new codepair(0x04a5, 0x30fb), /*            kana_conjunctive ・ KATAKANA MIDDLE DOT */
-    new codepair(0x04a6, 0x30f2), /*                     kana_WO ヲ KATAKANA LETTER WO */
-    new codepair(0x04a7, 0x30a1), /*                      kana_a ァ KATAKANA LETTER SMALL A */
-    new codepair(0x04a8, 0x30a3), /*                      kana_i ィ KATAKANA LETTER SMALL I */
-    new codepair(0x04a9, 0x30a5), /*                      kana_u ゥ KATAKANA LETTER SMALL U */
-    new codepair(0x04aa, 0x30a7), /*                      kana_e ェ KATAKANA LETTER SMALL E */
-    new codepair(0x04ab, 0x30a9), /*                      kana_o ォ KATAKANA LETTER SMALL O */
-    new codepair(0x04ac, 0x30e3), /*                     kana_ya ャ KATAKANA LETTER SMALL YA */
-    new codepair(0x04ad, 0x30e5), /*                     kana_yu ュ KATAKANA LETTER SMALL YU */
-    new codepair(0x04ae, 0x30e7), /*                     kana_yo ョ KATAKANA LETTER SMALL YO */
-    new codepair(0x04af, 0x30c3), /*                    kana_tsu ッ KATAKANA LETTER SMALL TU */
-    new codepair(0x04b0, 0x30fc), /*              prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */
-    new codepair(0x04b1, 0x30a2), /*                      kana_A ア KATAKANA LETTER A */
-    new codepair(0x04b2, 0x30a4), /*                      kana_I イ KATAKANA LETTER I */
-    new codepair(0x04b3, 0x30a6), /*                      kana_U ウ KATAKANA LETTER U */
-    new codepair(0x04b4, 0x30a8), /*                      kana_E エ KATAKANA LETTER E */
-    new codepair(0x04b5, 0x30aa), /*                      kana_O オ KATAKANA LETTER O */
-    new codepair(0x04b6, 0x30ab), /*                     kana_KA カ KATAKANA LETTER KA */
-    new codepair(0x04b7, 0x30ad), /*                     kana_KI キ KATAKANA LETTER KI */
-    new codepair(0x04b8, 0x30af), /*                     kana_KU ク KATAKANA LETTER KU */
-    new codepair(0x04b9, 0x30b1), /*                     kana_KE ケ KATAKANA LETTER KE */
-    new codepair(0x04ba, 0x30b3), /*                     kana_KO コ KATAKANA LETTER KO */
-    new codepair(0x04bb, 0x30b5), /*                     kana_SA サ KATAKANA LETTER SA */
-    new codepair(0x04bc, 0x30b7), /*                    kana_SHI シ KATAKANA LETTER SI */
-    new codepair(0x04bd, 0x30b9), /*                     kana_SU ス KATAKANA LETTER SU */
-    new codepair(0x04be, 0x30bb), /*                     kana_SE セ KATAKANA LETTER SE */
-    new codepair(0x04bf, 0x30bd), /*                     kana_SO ソ KATAKANA LETTER SO */
-    new codepair(0x04c0, 0x30bf), /*                     kana_TA タ KATAKANA LETTER TA */
-    new codepair(0x04c1, 0x30c1), /*                    kana_CHI チ KATAKANA LETTER TI */
-    new codepair(0x04c2, 0x30c4), /*                    kana_TSU ツ KATAKANA LETTER TU */
-    new codepair(0x04c3, 0x30c6), /*                     kana_TE テ KATAKANA LETTER TE */
-    new codepair(0x04c4, 0x30c8), /*                     kana_TO ト KATAKANA LETTER TO */
-    new codepair(0x04c5, 0x30ca), /*                     kana_NA ナ KATAKANA LETTER NA */
-    new codepair(0x04c6, 0x30cb), /*                     kana_NI ニ KATAKANA LETTER NI */
-    new codepair(0x04c7, 0x30cc), /*                     kana_NU ヌ KATAKANA LETTER NU */
-    new codepair(0x04c8, 0x30cd), /*                     kana_NE ネ KATAKANA LETTER NE */
-    new codepair(0x04c9, 0x30ce), /*                     kana_NO ノ KATAKANA LETTER NO */
-    new codepair(0x04ca, 0x30cf), /*                     kana_HA ハ KATAKANA LETTER HA */
-    new codepair(0x04cb, 0x30d2), /*                     kana_HI ヒ KATAKANA LETTER HI */
-    new codepair(0x04cc, 0x30d5), /*                     kana_FU フ KATAKANA LETTER HU */
-    new codepair(0x04cd, 0x30d8), /*                     kana_HE ヘ KATAKANA LETTER HE */
-    new codepair(0x04ce, 0x30db), /*                     kana_HO ホ KATAKANA LETTER HO */
-    new codepair(0x04cf, 0x30de), /*                     kana_MA マ KATAKANA LETTER MA */
-    new codepair(0x04d0, 0x30df), /*                     kana_MI ミ KATAKANA LETTER MI */
-    new codepair(0x04d1, 0x30e0), /*                     kana_MU ム KATAKANA LETTER MU */
-    new codepair(0x04d2, 0x30e1), /*                     kana_ME メ KATAKANA LETTER ME */
-    new codepair(0x04d3, 0x30e2), /*                     kana_MO モ KATAKANA LETTER MO */
-    new codepair(0x04d4, 0x30e4), /*                     kana_YA ヤ KATAKANA LETTER YA */
-    new codepair(0x04d5, 0x30e6), /*                     kana_YU ユ KATAKANA LETTER YU */
-    new codepair(0x04d6, 0x30e8), /*                     kana_YO ヨ KATAKANA LETTER YO */
-    new codepair(0x04d7, 0x30e9), /*                     kana_RA ラ KATAKANA LETTER RA */
-    new codepair(0x04d8, 0x30ea), /*                     kana_RI リ KATAKANA LETTER RI */
-    new codepair(0x04d9, 0x30eb), /*                     kana_RU ル KATAKANA LETTER RU */
-    new codepair(0x04da, 0x30ec), /*                     kana_RE レ KATAKANA LETTER RE */
-    new codepair(0x04db, 0x30ed), /*                     kana_RO ロ KATAKANA LETTER RO */
-    new codepair(0x04dc, 0x30ef), /*                     kana_WA ワ KATAKANA LETTER WA */
-    new codepair(0x04dd, 0x30f3), /*                      kana_N ン KATAKANA LETTER N */
-    new codepair(0x04de, 0x309b), /*                 voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */
-    new codepair(0x04df, 0x309c), /*             semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
-    new codepair(0x05ac, 0x060c), /*                Arabic_comma ، ARABIC COMMA */
-    new codepair(0x05bb, 0x061b), /*            Arabic_semicolon ؛ ARABIC SEMICOLON */
-    new codepair(0x05bf, 0x061f), /*        Arabic_question_mark ؟ ARABIC QUESTION MARK */
-    new codepair(0x05c1, 0x0621), /*                Arabic_hamza ء ARABIC LETTER HAMZA */
-    new codepair(0x05c2, 0x0622), /*          Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */
-    new codepair(0x05c3, 0x0623), /*          Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */
-    new codepair(0x05c4, 0x0624), /*           Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */
-    new codepair(0x05c5, 0x0625), /*       Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */
-    new codepair(0x05c6, 0x0626), /*           Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */
-    new codepair(0x05c7, 0x0627), /*                 Arabic_alef ا ARABIC LETTER ALEF */
-    new codepair(0x05c8, 0x0628), /*                  Arabic_beh ب ARABIC LETTER BEH */
-    new codepair(0x05c9, 0x0629), /*           Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */
-    new codepair(0x05ca, 0x062a), /*                  Arabic_teh ت ARABIC LETTER TEH */
-    new codepair(0x05cb, 0x062b), /*                 Arabic_theh ث ARABIC LETTER THEH */
-    new codepair(0x05cc, 0x062c), /*                 Arabic_jeem ج ARABIC LETTER JEEM */
-    new codepair(0x05cd, 0x062d), /*                  Arabic_hah ح ARABIC LETTER HAH */
-    new codepair(0x05ce, 0x062e), /*                 Arabic_khah خ ARABIC LETTER KHAH */
-    new codepair(0x05cf, 0x062f), /*                  Arabic_dal د ARABIC LETTER DAL */
-    new codepair(0x05d0, 0x0630), /*                 Arabic_thal ذ ARABIC LETTER THAL */
-    new codepair(0x05d1, 0x0631), /*                   Arabic_ra ر ARABIC LETTER REH */
-    new codepair(0x05d2, 0x0632), /*                 Arabic_zain ز ARABIC LETTER ZAIN */
-    new codepair(0x05d3, 0x0633), /*                 Arabic_seen س ARABIC LETTER SEEN */
-    new codepair(0x05d4, 0x0634), /*                Arabic_sheen ش ARABIC LETTER SHEEN */
-    new codepair(0x05d5, 0x0635), /*                  Arabic_sad ص ARABIC LETTER SAD */
-    new codepair(0x05d6, 0x0636), /*                  Arabic_dad ض ARABIC LETTER DAD */
-    new codepair(0x05d7, 0x0637), /*                  Arabic_tah ط ARABIC LETTER TAH */
-    new codepair(0x05d8, 0x0638), /*                  Arabic_zah ظ ARABIC LETTER ZAH */
-    new codepair(0x05d9, 0x0639), /*                  Arabic_ain ع ARABIC LETTER AIN */
-    new codepair(0x05da, 0x063a), /*                Arabic_ghain غ ARABIC LETTER GHAIN */
-    new codepair(0x05e0, 0x0640), /*              Arabic_tatweel ـ ARABIC TATWEEL */
-    new codepair(0x05e1, 0x0641), /*                  Arabic_feh ف ARABIC LETTER FEH */
-    new codepair(0x05e2, 0x0642), /*                  Arabic_qaf ق ARABIC LETTER QAF */
-    new codepair(0x05e3, 0x0643), /*                  Arabic_kaf ك ARABIC LETTER KAF */
-    new codepair(0x05e4, 0x0644), /*                  Arabic_lam ل ARABIC LETTER LAM */
-    new codepair(0x05e5, 0x0645), /*                 Arabic_meem م ARABIC LETTER MEEM */
-    new codepair(0x05e6, 0x0646), /*                 Arabic_noon ن ARABIC LETTER NOON */
-    new codepair(0x05e7, 0x0647), /*                   Arabic_ha ه ARABIC LETTER HEH */
-    new codepair(0x05e8, 0x0648), /*                  Arabic_waw و ARABIC LETTER WAW */
-    new codepair(0x05e9, 0x0649), /*          Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */
-    new codepair(0x05ea, 0x064a), /*                  Arabic_yeh ي ARABIC LETTER YEH */
-    new codepair(0x05eb, 0x064b), /*             Arabic_fathatan ً ARABIC FATHATAN */
-    new codepair(0x05ec, 0x064c), /*             Arabic_dammatan ٌ ARABIC DAMMATAN */
-    new codepair(0x05ed, 0x064d), /*             Arabic_kasratan ٍ ARABIC KASRATAN */
-    new codepair(0x05ee, 0x064e), /*                Arabic_fatha َ ARABIC FATHA */
-    new codepair(0x05ef, 0x064f), /*                Arabic_damma ُ ARABIC DAMMA */
-    new codepair(0x05f0, 0x0650), /*                Arabic_kasra ِ ARABIC KASRA */
-    new codepair(0x05f1, 0x0651), /*               Arabic_shadda ّ ARABIC SHADDA */
-    new codepair(0x05f2, 0x0652), /*                Arabic_sukun ْ ARABIC SUKUN */
-    new codepair(0x06a1, 0x0452), /*                 Serbian_dje ђ CYRILLIC SMALL LETTER DJE */
-    new codepair(0x06a2, 0x0453), /*               Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */
-    new codepair(0x06a3, 0x0451), /*                 Cyrillic_io ё CYRILLIC SMALL LETTER IO */
-    new codepair(0x06a4, 0x0454), /*                Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */
-    new codepair(0x06a5, 0x0455), /*               Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */
-    new codepair(0x06a6, 0x0456), /*                 Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
-    new codepair(0x06a7, 0x0457), /*                Ukrainian_yi ї CYRILLIC SMALL LETTER YI */
-    new codepair(0x06a8, 0x0458), /*                 Cyrillic_je ј CYRILLIC SMALL LETTER JE */
-    new codepair(0x06a9, 0x0459), /*                Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */
-    new codepair(0x06aa, 0x045a), /*                Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */
-    new codepair(0x06ab, 0x045b), /*                Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */
-    new codepair(0x06ac, 0x045c), /*               Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */
-    new codepair(0x06ae, 0x045e), /*         Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */
-    new codepair(0x06af, 0x045f), /*               Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */
-    new codepair(0x06b0, 0x2116), /*                  numerosign № NUMERO SIGN */
-    new codepair(0x06b1, 0x0402), /*                 Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */
-    new codepair(0x06b2, 0x0403), /*               Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */
-    new codepair(0x06b3, 0x0401), /*                 Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */
-    new codepair(0x06b4, 0x0404), /*                Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */
-    new codepair(0x06b5, 0x0405), /*               Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */
-    new codepair(0x06b6, 0x0406), /*                 Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
-    new codepair(0x06b7, 0x0407), /*                Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */
-    new codepair(0x06b8, 0x0408), /*                 Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */
-    new codepair(0x06b9, 0x0409), /*                Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */
-    new codepair(0x06ba, 0x040a), /*                Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */
-    new codepair(0x06bb, 0x040b), /*                Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */
-    new codepair(0x06bc, 0x040c), /*               Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */
-    new codepair(0x06be, 0x040e), /*         Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */
-    new codepair(0x06bf, 0x040f), /*               Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */
-    new codepair(0x06c0, 0x044e), /*                 Cyrillic_yu ю CYRILLIC SMALL LETTER YU */
-    new codepair(0x06c1, 0x0430), /*                  Cyrillic_a а CYRILLIC SMALL LETTER A */
-    new codepair(0x06c2, 0x0431), /*                 Cyrillic_be б CYRILLIC SMALL LETTER BE */
-    new codepair(0x06c3, 0x0446), /*                Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */
-    new codepair(0x06c4, 0x0434), /*                 Cyrillic_de д CYRILLIC SMALL LETTER DE */
-    new codepair(0x06c5, 0x0435), /*                 Cyrillic_ie е CYRILLIC SMALL LETTER IE */
-    new codepair(0x06c6, 0x0444), /*                 Cyrillic_ef ф CYRILLIC SMALL LETTER EF */
-    new codepair(0x06c7, 0x0433), /*                Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */
-    new codepair(0x06c8, 0x0445), /*                 Cyrillic_ha х CYRILLIC SMALL LETTER HA */
-    new codepair(0x06c9, 0x0438), /*                  Cyrillic_i и CYRILLIC SMALL LETTER I */
-    new codepair(0x06ca, 0x0439), /*             Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */
-    new codepair(0x06cb, 0x043a), /*                 Cyrillic_ka к CYRILLIC SMALL LETTER KA */
-    new codepair(0x06cc, 0x043b), /*                 Cyrillic_el л CYRILLIC SMALL LETTER EL */
-    new codepair(0x06cd, 0x043c), /*                 Cyrillic_em м CYRILLIC SMALL LETTER EM */
-    new codepair(0x06ce, 0x043d), /*                 Cyrillic_en н CYRILLIC SMALL LETTER EN */
-    new codepair(0x06cf, 0x043e), /*                  Cyrillic_o о CYRILLIC SMALL LETTER O */
-    new codepair(0x06d0, 0x043f), /*                 Cyrillic_pe п CYRILLIC SMALL LETTER PE */
-    new codepair(0x06d1, 0x044f), /*                 Cyrillic_ya я CYRILLIC SMALL LETTER YA */
-    new codepair(0x06d2, 0x0440), /*                 Cyrillic_er р CYRILLIC SMALL LETTER ER */
-    new codepair(0x06d3, 0x0441), /*                 Cyrillic_es с CYRILLIC SMALL LETTER ES */
-    new codepair(0x06d4, 0x0442), /*                 Cyrillic_te т CYRILLIC SMALL LETTER TE */
-    new codepair(0x06d5, 0x0443), /*                  Cyrillic_u у CYRILLIC SMALL LETTER U */
-    new codepair(0x06d6, 0x0436), /*                Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */
-    new codepair(0x06d7, 0x0432), /*                 Cyrillic_ve в CYRILLIC SMALL LETTER VE */
-    new codepair(0x06d8, 0x044c), /*           Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */
-    new codepair(0x06d9, 0x044b), /*               Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */
-    new codepair(0x06da, 0x0437), /*                 Cyrillic_ze з CYRILLIC SMALL LETTER ZE */
-    new codepair(0x06db, 0x0448), /*                Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */
-    new codepair(0x06dc, 0x044d), /*                  Cyrillic_e э CYRILLIC SMALL LETTER E */
-    new codepair(0x06dd, 0x0449), /*              Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */
-    new codepair(0x06de, 0x0447), /*                Cyrillic_che ч CYRILLIC SMALL LETTER CHE */
-    new codepair(0x06df, 0x044a), /*           Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */
-    new codepair(0x06e0, 0x042e), /*                 Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */
-    new codepair(0x06e1, 0x0410), /*                  Cyrillic_A А CYRILLIC CAPITAL LETTER A */
-    new codepair(0x06e2, 0x0411), /*                 Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */
-    new codepair(0x06e3, 0x0426), /*                Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */
-    new codepair(0x06e4, 0x0414), /*                 Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */
-    new codepair(0x06e5, 0x0415), /*                 Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */
-    new codepair(0x06e6, 0x0424), /*                 Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */
-    new codepair(0x06e7, 0x0413), /*                Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */
-    new codepair(0x06e8, 0x0425), /*                 Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */
-    new codepair(0x06e9, 0x0418), /*                  Cyrillic_I И CYRILLIC CAPITAL LETTER I */
-    new codepair(0x06ea, 0x0419), /*             Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */
-    new codepair(0x06eb, 0x041a), /*                 Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */
-    new codepair(0x06ec, 0x041b), /*                 Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */
-    new codepair(0x06ed, 0x041c), /*                 Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */
-    new codepair(0x06ee, 0x041d), /*                 Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */
-    new codepair(0x06ef, 0x041e), /*                  Cyrillic_O О CYRILLIC CAPITAL LETTER O */
-    new codepair(0x06f0, 0x041f), /*                 Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */
-    new codepair(0x06f1, 0x042f), /*                 Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */
-    new codepair(0x06f2, 0x0420), /*                 Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */
-    new codepair(0x06f3, 0x0421), /*                 Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */
-    new codepair(0x06f4, 0x0422), /*                 Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */
-    new codepair(0x06f5, 0x0423), /*                  Cyrillic_U У CYRILLIC CAPITAL LETTER U */
-    new codepair(0x06f6, 0x0416), /*                Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */
-    new codepair(0x06f7, 0x0412), /*                 Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */
-    new codepair(0x06f8, 0x042c), /*           Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */
-    new codepair(0x06f9, 0x042b), /*               Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */
-    new codepair(0x06fa, 0x0417), /*                 Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */
-    new codepair(0x06fb, 0x0428), /*                Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */
-    new codepair(0x06fc, 0x042d), /*                  Cyrillic_E Э CYRILLIC CAPITAL LETTER E */
-    new codepair(0x06fd, 0x0429), /*              Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */
-    new codepair(0x06fe, 0x0427), /*                Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */
-    new codepair(0x06ff, 0x042a), /*           Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */
-    new codepair(0x07a1, 0x0386), /*           Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */
-    new codepair(0x07a2, 0x0388), /*         Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */
-    new codepair(0x07a3, 0x0389), /*             Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */
-    new codepair(0x07a4, 0x038a), /*            Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */
-    new codepair(0x07a5, 0x03aa), /*         Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
-    new codepair(0x07a7, 0x038c), /*         Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */
-    new codepair(0x07a8, 0x038e), /*         Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */
-    new codepair(0x07a9, 0x03ab), /*       Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
-    new codepair(0x07ab, 0x038f), /*           Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */
-    new codepair(0x07ae, 0x0385), /*        Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */
-    new codepair(0x07af, 0x2015), /*              Greek_horizbar ― HORIZONTAL BAR */
-    new codepair(0x07b1, 0x03ac), /*           Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */
-    new codepair(0x07b2, 0x03ad), /*         Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */
-    new codepair(0x07b3, 0x03ae), /*             Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */
-    new codepair(0x07b4, 0x03af), /*            Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */
-    new codepair(0x07b5, 0x03ca), /*          Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */
-    new codepair(0x07b6, 0x0390), /*    Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
-    new codepair(0x07b7, 0x03cc), /*         Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */
-    new codepair(0x07b8, 0x03cd), /*         Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */
-    new codepair(0x07b9, 0x03cb), /*       Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
-    new codepair(0x07ba, 0x03b0), /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
-    new codepair(0x07bb, 0x03ce), /*           Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */
-    new codepair(0x07c1, 0x0391), /*                 Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */
-    new codepair(0x07c2, 0x0392), /*                  Greek_BETA Β GREEK CAPITAL LETTER BETA */
-    new codepair(0x07c3, 0x0393), /*                 Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */
-    new codepair(0x07c4, 0x0394), /*                 Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */
-    new codepair(0x07c5, 0x0395), /*               Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */
-    new codepair(0x07c6, 0x0396), /*                  Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */
-    new codepair(0x07c7, 0x0397), /*                   Greek_ETA Η GREEK CAPITAL LETTER ETA */
-    new codepair(0x07c8, 0x0398), /*                 Greek_THETA Θ GREEK CAPITAL LETTER THETA */
-    new codepair(0x07c9, 0x0399), /*                  Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */
-    new codepair(0x07ca, 0x039a), /*                 Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */
-    new codepair(0x07cb, 0x039b), /*                Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */
-    new codepair(0x07cc, 0x039c), /*                    Greek_MU Μ GREEK CAPITAL LETTER MU */
-    new codepair(0x07cd, 0x039d), /*                    Greek_NU Ν GREEK CAPITAL LETTER NU */
-    new codepair(0x07ce, 0x039e), /*                    Greek_XI Ξ GREEK CAPITAL LETTER XI */
-    new codepair(0x07cf, 0x039f), /*               Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */
-    new codepair(0x07d0, 0x03a0), /*                    Greek_PI Π GREEK CAPITAL LETTER PI */
-    new codepair(0x07d1, 0x03a1), /*                   Greek_RHO Ρ GREEK CAPITAL LETTER RHO */
-    new codepair(0x07d2, 0x03a3), /*                 Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */
-    new codepair(0x07d4, 0x03a4), /*                   Greek_TAU Τ GREEK CAPITAL LETTER TAU */
-    new codepair(0x07d5, 0x03a5), /*               Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */
-    new codepair(0x07d6, 0x03a6), /*                   Greek_PHI Φ GREEK CAPITAL LETTER PHI */
-    new codepair(0x07d7, 0x03a7), /*                   Greek_CHI Χ GREEK CAPITAL LETTER CHI */
-    new codepair(0x07d8, 0x03a8), /*                   Greek_PSI Ψ GREEK CAPITAL LETTER PSI */
-    new codepair(0x07d9, 0x03a9), /*                 Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */
-    new codepair(0x07e1, 0x03b1), /*                 Greek_alpha α GREEK SMALL LETTER ALPHA */
-    new codepair(0x07e2, 0x03b2), /*                  Greek_beta β GREEK SMALL LETTER BETA */
-    new codepair(0x07e3, 0x03b3), /*                 Greek_gamma γ GREEK SMALL LETTER GAMMA */
-    new codepair(0x07e4, 0x03b4), /*                 Greek_delta δ GREEK SMALL LETTER DELTA */
-    new codepair(0x07e5, 0x03b5), /*               Greek_epsilon ε GREEK SMALL LETTER EPSILON */
-    new codepair(0x07e6, 0x03b6), /*                  Greek_zeta ζ GREEK SMALL LETTER ZETA */
-    new codepair(0x07e7, 0x03b7), /*                   Greek_eta η GREEK SMALL LETTER ETA */
-    new codepair(0x07e8, 0x03b8), /*                 Greek_theta θ GREEK SMALL LETTER THETA */
-    new codepair(0x07e9, 0x03b9), /*                  Greek_iota ι GREEK SMALL LETTER IOTA */
-    new codepair(0x07ea, 0x03ba), /*                 Greek_kappa κ GREEK SMALL LETTER KAPPA */
-    new codepair(0x07eb, 0x03bb), /*                Greek_lambda λ GREEK SMALL LETTER LAMDA */
-    new codepair(0x07ec, 0x03bc), /*                    Greek_mu μ GREEK SMALL LETTER MU */
-    new codepair(0x07ed, 0x03bd), /*                    Greek_nu ν GREEK SMALL LETTER NU */
-    new codepair(0x07ee, 0x03be), /*                    Greek_xi ξ GREEK SMALL LETTER XI */
-    new codepair(0x07ef, 0x03bf), /*               Greek_omicron ο GREEK SMALL LETTER OMICRON */
-    new codepair(0x07f0, 0x03c0), /*                    Greek_pi π GREEK SMALL LETTER PI */
-    new codepair(0x07f1, 0x03c1), /*                   Greek_rho ρ GREEK SMALL LETTER RHO */
-    new codepair(0x07f2, 0x03c3), /*                 Greek_sigma σ GREEK SMALL LETTER SIGMA */
-    new codepair(0x07f3, 0x03c2), /*       Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */
-    new codepair(0x07f4, 0x03c4), /*                   Greek_tau τ GREEK SMALL LETTER TAU */
-    new codepair(0x07f5, 0x03c5), /*               Greek_upsilon υ GREEK SMALL LETTER UPSILON */
-    new codepair(0x07f6, 0x03c6), /*                   Greek_phi φ GREEK SMALL LETTER PHI */
-    new codepair(0x07f7, 0x03c7), /*                   Greek_chi χ GREEK SMALL LETTER CHI */
-    new codepair(0x07f8, 0x03c8), /*                   Greek_psi ψ GREEK SMALL LETTER PSI */
-    new codepair(0x07f9, 0x03c9), /*                 Greek_omega ω GREEK SMALL LETTER OMEGA */
-    new codepair(0x08a1, 0x23b7), /*                 leftradical ⎷ ??? */
-    new codepair(0x08a2, 0x250c), /*              topleftradical ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */
-    new codepair(0x08a3, 0x2500), /*              horizconnector ─ BOX DRAWINGS LIGHT HORIZONTAL */
-    new codepair(0x08a4, 0x2320), /*                 topintegral ⌠ TOP HALF INTEGRAL */
-    new codepair(0x08a5, 0x2321), /*                 botintegral ⌡ BOTTOM HALF INTEGRAL */
-    new codepair(0x08a6, 0x2502), /*               vertconnector │ BOX DRAWINGS LIGHT VERTICAL */
-    new codepair(0x08a7, 0x23a1), /*            topleftsqbracket ⎡ ??? */
-    new codepair(0x08a8, 0x23a3), /*            botleftsqbracket ⎣ ??? */
-    new codepair(0x08a9, 0x23a4), /*           toprightsqbracket ⎤ ??? */
-    new codepair(0x08aa, 0x23a6), /*           botrightsqbracket ⎦ ??? */
-    new codepair(0x08ab, 0x239b), /*               topleftparens ⎛ ??? */
-    new codepair(0x08ac, 0x239d), /*               botleftparens ⎝ ??? */
-    new codepair(0x08ad, 0x239e), /*              toprightparens ⎞ ??? */
-    new codepair(0x08ae, 0x23a0), /*              botrightparens ⎠ ??? */
-    new codepair(0x08af, 0x23a8), /*        leftmiddlecurlybrace ⎨ ??? */
-    new codepair(0x08b0, 0x23ac), /*       rightmiddlecurlybrace ⎬ ??? */
-  /*  0x08b1                          topleftsummation ? ??? */
-  /*  0x08b2                          botleftsummation ? ??? */
-  /*  0x08b3                 topvertsummationconnector ? ??? */
-  /*  0x08b4                 botvertsummationconnector ? ??? */
-  /*  0x08b5                         toprightsummation ? ??? */
-  /*  0x08b6                         botrightsummation ? ??? */
-  /*  0x08b7                      rightmiddlesummation ? ??? */
-    new codepair(0x08bc, 0x2264), /*               lessthanequal ≤ LESS-THAN OR EQUAL TO */
-    new codepair(0x08bd, 0x2260), /*                    notequal ≠ NOT EQUAL TO */
-    new codepair(0x08be, 0x2265), /*            greaterthanequal ≥ GREATER-THAN OR EQUAL TO */
-    new codepair(0x08bf, 0x222b), /*                    integral ∫ INTEGRAL */
-    new codepair(0x08c0, 0x2234), /*                   therefore ∴ THEREFORE */
-    new codepair(0x08c1, 0x221d), /*                   variation ∝ PROPORTIONAL TO */
-    new codepair(0x08c2, 0x221e), /*                    infinity ∞ INFINITY */
-    new codepair(0x08c5, 0x2207), /*                       nabla ∇ NABLA */
-    new codepair(0x08c8, 0x223c), /*                 approximate ∼ TILDE OPERATOR */
-    new codepair(0x08c9, 0x2243), /*                similarequal ≃ ASYMPTOTICALLY EQUAL TO */
-    new codepair(0x08cd, 0x21d4), /*                    ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */
-    new codepair(0x08ce, 0x21d2), /*                     implies ⇒ RIGHTWARDS DOUBLE ARROW */
-    new codepair(0x08cf, 0x2261), /*                   identical ≡ IDENTICAL TO */
-    new codepair(0x08d6, 0x221a), /*                     radical √ SQUARE ROOT */
-    new codepair(0x08da, 0x2282), /*                  includedin ⊂ SUBSET OF */
-    new codepair(0x08db, 0x2283), /*                    includes ⊃ SUPERSET OF */
-    new codepair(0x08dc, 0x2229), /*                intersection ∩ INTERSECTION */
-    new codepair(0x08dd, 0x222a), /*                       union ∪ UNION */
-    new codepair(0x08de, 0x2227), /*                  logicaland ∧ LOGICAL AND */
-    new codepair(0x08df, 0x2228), /*                   logicalor ∨ LOGICAL OR */
-    new codepair(0x08ef, 0x2202), /*           partialderivative ∂ PARTIAL DIFFERENTIAL */
-    new codepair(0x08f6, 0x0192), /*                    function ƒ LATIN SMALL LETTER F WITH HOOK */
-    new codepair(0x08fb, 0x2190), /*                   leftarrow ← LEFTWARDS ARROW */
-    new codepair(0x08fc, 0x2191), /*                     uparrow ↑ UPWARDS ARROW */
-    new codepair(0x08fd, 0x2192), /*                  rightarrow → RIGHTWARDS ARROW */
-    new codepair(0x08fe, 0x2193), /*                   downarrow ↓ DOWNWARDS ARROW */
-  /*  0x09df                                     blank ? ??? */
-    new codepair(0x09e0, 0x25c6), /*                soliddiamond ◆ BLACK DIAMOND */
-    new codepair(0x09e1, 0x2592), /*                checkerboard ▒ MEDIUM SHADE */
-    new codepair(0x09e2, 0x2409), /*                          ht ␉ SYMBOL FOR HORIZONTAL TABULATION */
-    new codepair(0x09e3, 0x240c), /*                          ff ␌ SYMBOL FOR FORM FEED */
-    new codepair(0x09e4, 0x240d), /*                          cr ␍ SYMBOL FOR CARRIAGE RETURN */
-    new codepair(0x09e5, 0x240a), /*                          lf ␊ SYMBOL FOR LINE FEED */
-    new codepair(0x09e8, 0x2424), /*                          nl ␤ SYMBOL FOR NEWLINE */
-    new codepair(0x09e9, 0x240b), /*                          vt ␋ SYMBOL FOR VERTICAL TABULATION */
-    new codepair(0x09ea, 0x2518), /*              lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */
-    new codepair(0x09eb, 0x2510), /*               uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */
-    new codepair(0x09ec, 0x250c), /*                upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */
-    new codepair(0x09ed, 0x2514), /*               lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */
-    new codepair(0x09ee, 0x253c), /*               crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
-    new codepair(0x09ef, 0x23ba), /*              horizlinescan1 ⎺ HORIZONTAL SCAN LINE-1 (Unicode 3.2 draft) */
-    new codepair(0x09f0, 0x23bb), /*              horizlinescan3 ⎻ HORIZONTAL SCAN LINE-3 (Unicode 3.2 draft) */
-    new codepair(0x09f1, 0x2500), /*              horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */
-    new codepair(0x09f2, 0x23bc), /*              horizlinescan7 ⎼ HORIZONTAL SCAN LINE-7 (Unicode 3.2 draft) */
-    new codepair(0x09f3, 0x23bd), /*              horizlinescan9 ⎽ HORIZONTAL SCAN LINE-9 (Unicode 3.2 draft) */
-    new codepair(0x09f4, 0x251c), /*                       leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
-    new codepair(0x09f5, 0x2524), /*                      rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */
-    new codepair(0x09f6, 0x2534), /*                        bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */
-    new codepair(0x09f7, 0x252c), /*                        topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
-    new codepair(0x09f8, 0x2502), /*                     vertbar │ BOX DRAWINGS LIGHT VERTICAL */
-    new codepair(0x0aa1, 0x2003), /*                     emspace   EM SPACE */
-    new codepair(0x0aa2, 0x2002), /*                     enspace   EN SPACE */
-    new codepair(0x0aa3, 0x2004), /*                    em3space   THREE-PER-EM SPACE */
-    new codepair(0x0aa4, 0x2005), /*                    em4space   FOUR-PER-EM SPACE */
-    new codepair(0x0aa5, 0x2007), /*                  digitspace   FIGURE SPACE */
-    new codepair(0x0aa6, 0x2008), /*                  punctspace   PUNCTUATION SPACE */
-    new codepair(0x0aa7, 0x2009), /*                   thinspace   THIN SPACE */
-    new codepair(0x0aa8, 0x200a), /*                   hairspace   HAIR SPACE */
-    new codepair(0x0aa9, 0x2014), /*                      emdash — EM DASH */
-    new codepair(0x0aaa, 0x2013), /*                      endash – EN DASH */
-  /*  0x0aac                               signifblank ? ??? */
-    new codepair(0x0aae, 0x2026), /*                    ellipsis … HORIZONTAL ELLIPSIS */
-    new codepair(0x0aaf, 0x2025), /*             doubbaselinedot ‥ TWO DOT LEADER */
-    new codepair(0x0ab0, 0x2153), /*                    onethird ⅓ VULGAR FRACTION ONE THIRD */
-    new codepair(0x0ab1, 0x2154), /*                   twothirds ⅔ VULGAR FRACTION TWO THIRDS */
-    new codepair(0x0ab2, 0x2155), /*                    onefifth ⅕ VULGAR FRACTION ONE FIFTH */
-    new codepair(0x0ab3, 0x2156), /*                   twofifths ⅖ VULGAR FRACTION TWO FIFTHS */
-    new codepair(0x0ab4, 0x2157), /*                 threefifths ⅗ VULGAR FRACTION THREE FIFTHS */
-    new codepair(0x0ab5, 0x2158), /*                  fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */
-    new codepair(0x0ab6, 0x2159), /*                    onesixth ⅙ VULGAR FRACTION ONE SIXTH */
-    new codepair(0x0ab7, 0x215a), /*                  fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */
-    new codepair(0x0ab8, 0x2105), /*                      careof ℅ CARE OF */
-    new codepair(0x0abb, 0x2012), /*                     figdash ‒ FIGURE DASH */
-    new codepair(0x0abc, 0x2329), /*            leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */
-  /*  0x0abd                              decimalpoint ? ??? */
-    new codepair(0x0abe, 0x232a), /*           rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */
-  /*  0x0abf                                    marker ? ??? */
-    new codepair(0x0ac3, 0x215b), /*                   oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */
-    new codepair(0x0ac4, 0x215c), /*                threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */
-    new codepair(0x0ac5, 0x215d), /*                 fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */
-    new codepair(0x0ac6, 0x215e), /*                seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */
-    new codepair(0x0ac9, 0x2122), /*                   trademark ™ TRADE MARK SIGN */
-    new codepair(0x0aca, 0x2613), /*               signaturemark ☓ SALTIRE */
-  /*  0x0acb                         trademarkincircle ? ??? */
-    new codepair(0x0acc, 0x25c1), /*            leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */
-    new codepair(0x0acd, 0x25b7), /*           rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */
-    new codepair(0x0ace, 0x25cb), /*                emopencircle ○ WHITE CIRCLE */
-    new codepair(0x0acf, 0x25af), /*             emopenrectangle ▯ WHITE VERTICAL RECTANGLE */
-    new codepair(0x0ad0, 0x2018), /*         leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */
-    new codepair(0x0ad1, 0x2019), /*        rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */
-    new codepair(0x0ad2, 0x201c), /*         leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */
-    new codepair(0x0ad3, 0x201d), /*        rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */
-    new codepair(0x0ad4, 0x211e), /*                prescription ℞ PRESCRIPTION TAKE */
-    new codepair(0x0ad6, 0x2032), /*                     minutes ′ PRIME */
-    new codepair(0x0ad7, 0x2033), /*                     seconds ″ DOUBLE PRIME */
-    new codepair(0x0ad9, 0x271d), /*                  latincross ✝ LATIN CROSS */
-  /*  0x0ada                                  hexagram ? ??? */
-    new codepair(0x0adb, 0x25ac), /*            filledrectbullet ▬ BLACK RECTANGLE */
-    new codepair(0x0adc, 0x25c0), /*         filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */
-    new codepair(0x0add, 0x25b6), /*        filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */
-    new codepair(0x0ade, 0x25cf), /*              emfilledcircle ● BLACK CIRCLE */
-    new codepair(0x0adf, 0x25ae), /*                emfilledrect ▮ BLACK VERTICAL RECTANGLE */
-    new codepair(0x0ae0, 0x25e6), /*            enopencircbullet ◦ WHITE BULLET */
-    new codepair(0x0ae1, 0x25ab), /*          enopensquarebullet ▫ WHITE SMALL SQUARE */
-    new codepair(0x0ae2, 0x25ad), /*              openrectbullet ▭ WHITE RECTANGLE */
-    new codepair(0x0ae3, 0x25b3), /*             opentribulletup △ WHITE UP-POINTING TRIANGLE */
-    new codepair(0x0ae4, 0x25bd), /*           opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */
-    new codepair(0x0ae5, 0x2606), /*                    openstar ☆ WHITE STAR */
-    new codepair(0x0ae6, 0x2022), /*          enfilledcircbullet • BULLET */
-    new codepair(0x0ae7, 0x25aa), /*            enfilledsqbullet ▪ BLACK SMALL SQUARE */
-    new codepair(0x0ae8, 0x25b2), /*           filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */
-    new codepair(0x0ae9, 0x25bc), /*         filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */
-    new codepair(0x0aea, 0x261c), /*                 leftpointer ☜ WHITE LEFT POINTING INDEX */
-    new codepair(0x0aeb, 0x261e), /*                rightpointer ☞ WHITE RIGHT POINTING INDEX */
-    new codepair(0x0aec, 0x2663), /*                        club ♣ BLACK CLUB SUIT */
-    new codepair(0x0aed, 0x2666), /*                     diamond ♦ BLACK DIAMOND SUIT */
-    new codepair(0x0aee, 0x2665), /*                       heart ♥ BLACK HEART SUIT */
-    new codepair(0x0af0, 0x2720), /*                maltesecross ✠ MALTESE CROSS */
-    new codepair(0x0af1, 0x2020), /*                      dagger † DAGGER */
-    new codepair(0x0af2, 0x2021), /*                doubledagger ‡ DOUBLE DAGGER */
-    new codepair(0x0af3, 0x2713), /*                   checkmark ✓ CHECK MARK */
-    new codepair(0x0af4, 0x2717), /*                 ballotcross ✗ BALLOT X */
-    new codepair(0x0af5, 0x266f), /*                musicalsharp ♯ MUSIC SHARP SIGN */
-    new codepair(0x0af6, 0x266d), /*                 musicalflat ♭ MUSIC FLAT SIGN */
-    new codepair(0x0af7, 0x2642), /*                  malesymbol ♂ MALE SIGN */
-    new codepair(0x0af8, 0x2640), /*                femalesymbol ♀ FEMALE SIGN */
-    new codepair(0x0af9, 0x260e), /*                   telephone ☎ BLACK TELEPHONE */
-    new codepair(0x0afa, 0x2315), /*           telephonerecorder ⌕ TELEPHONE RECORDER */
-    new codepair(0x0afb, 0x2117), /*         phonographcopyright ℗ SOUND RECORDING COPYRIGHT */
-    new codepair(0x0afc, 0x2038), /*                       caret ‸ CARET */
-    new codepair(0x0afd, 0x201a), /*          singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */
-    new codepair(0x0afe, 0x201e), /*          doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */
-  /*  0x0aff                                    cursor ? ??? */
-    new codepair(0x0ba3, 0x003c), /*                   leftcaret < LESS-THAN SIGN */
-    new codepair(0x0ba6, 0x003e), /*                  rightcaret > GREATER-THAN SIGN */
-    new codepair(0x0ba8, 0x2228), /*                   downcaret ∨ LOGICAL OR */
-    new codepair(0x0ba9, 0x2227), /*                     upcaret ∧ LOGICAL AND */
-    new codepair(0x0bc0, 0x00af), /*                     overbar ¯ MACRON */
-    new codepair(0x0bc2, 0x22a5), /*                    downtack ⊥ UP TACK */
-    new codepair(0x0bc3, 0x2229), /*                      upshoe ∩ INTERSECTION */
-    new codepair(0x0bc4, 0x230a), /*                   downstile ⌊ LEFT FLOOR */
-    new codepair(0x0bc6, 0x005f), /*                    underbar _ LOW LINE */
-    new codepair(0x0bca, 0x2218), /*                         jot ∘ RING OPERATOR */
-    new codepair(0x0bcc, 0x2395), /*                        quad ⎕ APL FUNCTIONAL SYMBOL QUAD */
-    new codepair(0x0bce, 0x22a4), /*                      uptack ⊤ DOWN TACK */
-    new codepair(0x0bcf, 0x25cb), /*                      circle ○ WHITE CIRCLE */
-    new codepair(0x0bd3, 0x2308), /*                     upstile ⌈ LEFT CEILING */
-    new codepair(0x0bd6, 0x222a), /*                    downshoe ∪ UNION */
-    new codepair(0x0bd8, 0x2283), /*                   rightshoe ⊃ SUPERSET OF */
-    new codepair(0x0bda, 0x2282), /*                    leftshoe ⊂ SUBSET OF */
-    new codepair(0x0bdc, 0x22a2), /*                    lefttack ⊢ RIGHT TACK */
-    new codepair(0x0bfc, 0x22a3), /*                   righttack ⊣ LEFT TACK */
-    new codepair(0x0cdf, 0x2017), /*        hebrew_doublelowline ‗ DOUBLE LOW LINE */
-    new codepair(0x0ce0, 0x05d0), /*                hebrew_aleph א HEBREW LETTER ALEF */
-    new codepair(0x0ce1, 0x05d1), /*                  hebrew_bet ב HEBREW LETTER BET */
-    new codepair(0x0ce2, 0x05d2), /*                hebrew_gimel ג HEBREW LETTER GIMEL */
-    new codepair(0x0ce3, 0x05d3), /*                hebrew_dalet ד HEBREW LETTER DALET */
-    new codepair(0x0ce4, 0x05d4), /*                   hebrew_he ה HEBREW LETTER HE */
-    new codepair(0x0ce5, 0x05d5), /*                  hebrew_waw ו HEBREW LETTER VAV */
-    new codepair(0x0ce6, 0x05d6), /*                 hebrew_zain ז HEBREW LETTER ZAYIN */
-    new codepair(0x0ce7, 0x05d7), /*                 hebrew_chet ח HEBREW LETTER HET */
-    new codepair(0x0ce8, 0x05d8), /*                  hebrew_tet ט HEBREW LETTER TET */
-    new codepair(0x0ce9, 0x05d9), /*                  hebrew_yod י HEBREW LETTER YOD */
-    new codepair(0x0cea, 0x05da), /*            hebrew_finalkaph ך HEBREW LETTER FINAL KAF */
-    new codepair(0x0ceb, 0x05db), /*                 hebrew_kaph כ HEBREW LETTER KAF */
-    new codepair(0x0cec, 0x05dc), /*                hebrew_lamed ל HEBREW LETTER LAMED */
-    new codepair(0x0ced, 0x05dd), /*             hebrew_finalmem ם HEBREW LETTER FINAL MEM */
-    new codepair(0x0cee, 0x05de), /*                  hebrew_mem מ HEBREW LETTER MEM */
-    new codepair(0x0cef, 0x05df), /*             hebrew_finalnun ן HEBREW LETTER FINAL NUN */
-    new codepair(0x0cf0, 0x05e0), /*                  hebrew_nun נ HEBREW LETTER NUN */
-    new codepair(0x0cf1, 0x05e1), /*               hebrew_samech ס HEBREW LETTER SAMEKH */
-    new codepair(0x0cf2, 0x05e2), /*                 hebrew_ayin ע HEBREW LETTER AYIN */
-    new codepair(0x0cf3, 0x05e3), /*              hebrew_finalpe ף HEBREW LETTER FINAL PE */
-    new codepair(0x0cf4, 0x05e4), /*                   hebrew_pe פ HEBREW LETTER PE */
-    new codepair(0x0cf5, 0x05e5), /*            hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */
-    new codepair(0x0cf6, 0x05e6), /*                 hebrew_zade צ HEBREW LETTER TSADI */
-    new codepair(0x0cf7, 0x05e7), /*                 hebrew_qoph ק HEBREW LETTER QOF */
-    new codepair(0x0cf8, 0x05e8), /*                 hebrew_resh ר HEBREW LETTER RESH */
-    new codepair(0x0cf9, 0x05e9), /*                 hebrew_shin ש HEBREW LETTER SHIN */
-    new codepair(0x0cfa, 0x05ea), /*                  hebrew_taw ת HEBREW LETTER TAV */
-    new codepair(0x0da1, 0x0e01), /*                  Thai_kokai ก THAI CHARACTER KO KAI */
-    new codepair(0x0da2, 0x0e02), /*                Thai_khokhai ข THAI CHARACTER KHO KHAI */
-    new codepair(0x0da3, 0x0e03), /*               Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */
-    new codepair(0x0da4, 0x0e04), /*               Thai_khokhwai ค THAI CHARACTER KHO KHWAI */
-    new codepair(0x0da5, 0x0e05), /*                Thai_khokhon ฅ THAI CHARACTER KHO KHON */
-    new codepair(0x0da6, 0x0e06), /*             Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */
-    new codepair(0x0da7, 0x0e07), /*                 Thai_ngongu ง THAI CHARACTER NGO NGU */
-    new codepair(0x0da8, 0x0e08), /*                Thai_chochan จ THAI CHARACTER CHO CHAN */
-    new codepair(0x0da9, 0x0e09), /*               Thai_choching ฉ THAI CHARACTER CHO CHING */
-    new codepair(0x0daa, 0x0e0a), /*               Thai_chochang ช THAI CHARACTER CHO CHANG */
-    new codepair(0x0dab, 0x0e0b), /*                   Thai_soso ซ THAI CHARACTER SO SO */
-    new codepair(0x0dac, 0x0e0c), /*                Thai_chochoe ฌ THAI CHARACTER CHO CHOE */
-    new codepair(0x0dad, 0x0e0d), /*                 Thai_yoying ญ THAI CHARACTER YO YING */
-    new codepair(0x0dae, 0x0e0e), /*                Thai_dochada ฎ THAI CHARACTER DO CHADA */
-    new codepair(0x0daf, 0x0e0f), /*                Thai_topatak ฏ THAI CHARACTER TO PATAK */
-    new codepair(0x0db0, 0x0e10), /*                Thai_thothan ฐ THAI CHARACTER THO THAN */
-    new codepair(0x0db1, 0x0e11), /*          Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */
-    new codepair(0x0db2, 0x0e12), /*             Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */
-    new codepair(0x0db3, 0x0e13), /*                  Thai_nonen ณ THAI CHARACTER NO NEN */
-    new codepair(0x0db4, 0x0e14), /*                  Thai_dodek ด THAI CHARACTER DO DEK */
-    new codepair(0x0db5, 0x0e15), /*                  Thai_totao ต THAI CHARACTER TO TAO */
-    new codepair(0x0db6, 0x0e16), /*               Thai_thothung ถ THAI CHARACTER THO THUNG */
-    new codepair(0x0db7, 0x0e17), /*              Thai_thothahan ท THAI CHARACTER THO THAHAN */
-    new codepair(0x0db8, 0x0e18), /*               Thai_thothong ธ THAI CHARACTER THO THONG */
-    new codepair(0x0db9, 0x0e19), /*                   Thai_nonu น THAI CHARACTER NO NU */
-    new codepair(0x0dba, 0x0e1a), /*               Thai_bobaimai บ THAI CHARACTER BO BAIMAI */
-    new codepair(0x0dbb, 0x0e1b), /*                  Thai_popla ป THAI CHARACTER PO PLA */
-    new codepair(0x0dbc, 0x0e1c), /*               Thai_phophung ผ THAI CHARACTER PHO PHUNG */
-    new codepair(0x0dbd, 0x0e1d), /*                   Thai_fofa ฝ THAI CHARACTER FO FA */
-    new codepair(0x0dbe, 0x0e1e), /*                Thai_phophan พ THAI CHARACTER PHO PHAN */
-    new codepair(0x0dbf, 0x0e1f), /*                  Thai_fofan ฟ THAI CHARACTER FO FAN */
-    new codepair(0x0dc0, 0x0e20), /*             Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */
-    new codepair(0x0dc1, 0x0e21), /*                   Thai_moma ม THAI CHARACTER MO MA */
-    new codepair(0x0dc2, 0x0e22), /*                  Thai_yoyak ย THAI CHARACTER YO YAK */
-    new codepair(0x0dc3, 0x0e23), /*                  Thai_rorua ร THAI CHARACTER RO RUA */
-    new codepair(0x0dc4, 0x0e24), /*                     Thai_ru ฤ THAI CHARACTER RU */
-    new codepair(0x0dc5, 0x0e25), /*                 Thai_loling ล THAI CHARACTER LO LING */
-    new codepair(0x0dc6, 0x0e26), /*                     Thai_lu ฦ THAI CHARACTER LU */
-    new codepair(0x0dc7, 0x0e27), /*                 Thai_wowaen ว THAI CHARACTER WO WAEN */
-    new codepair(0x0dc8, 0x0e28), /*                 Thai_sosala ศ THAI CHARACTER SO SALA */
-    new codepair(0x0dc9, 0x0e29), /*                 Thai_sorusi ษ THAI CHARACTER SO RUSI */
-    new codepair(0x0dca, 0x0e2a), /*                  Thai_sosua ส THAI CHARACTER SO SUA */
-    new codepair(0x0dcb, 0x0e2b), /*                  Thai_hohip ห THAI CHARACTER HO HIP */
-    new codepair(0x0dcc, 0x0e2c), /*                Thai_lochula ฬ THAI CHARACTER LO CHULA */
-    new codepair(0x0dcd, 0x0e2d), /*                   Thai_oang อ THAI CHARACTER O ANG */
-    new codepair(0x0dce, 0x0e2e), /*               Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */
-    new codepair(0x0dcf, 0x0e2f), /*              Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */
-    new codepair(0x0dd0, 0x0e30), /*                  Thai_saraa ะ THAI CHARACTER SARA A */
-    new codepair(0x0dd1, 0x0e31), /*             Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */
-    new codepair(0x0dd2, 0x0e32), /*                 Thai_saraaa า THAI CHARACTER SARA AA */
-    new codepair(0x0dd3, 0x0e33), /*                 Thai_saraam ำ THAI CHARACTER SARA AM */
-    new codepair(0x0dd4, 0x0e34), /*                  Thai_sarai ิ THAI CHARACTER SARA I */
-    new codepair(0x0dd5, 0x0e35), /*                 Thai_saraii ี THAI CHARACTER SARA II */
-    new codepair(0x0dd6, 0x0e36), /*                 Thai_saraue ึ THAI CHARACTER SARA UE */
-    new codepair(0x0dd7, 0x0e37), /*                Thai_sarauee ื THAI CHARACTER SARA UEE */
-    new codepair(0x0dd8, 0x0e38), /*                  Thai_sarau ุ THAI CHARACTER SARA U */
-    new codepair(0x0dd9, 0x0e39), /*                 Thai_sarauu ู THAI CHARACTER SARA UU */
-    new codepair(0x0dda, 0x0e3a), /*                Thai_phinthu ฺ THAI CHARACTER PHINTHU */
-  /*  0x0dde                    Thai_maihanakat_maitho ? ??? */
-    new codepair(0x0ddf, 0x0e3f), /*                   Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */
-    new codepair(0x0de0, 0x0e40), /*                  Thai_sarae เ THAI CHARACTER SARA E */
-    new codepair(0x0de1, 0x0e41), /*                 Thai_saraae แ THAI CHARACTER SARA AE */
-    new codepair(0x0de2, 0x0e42), /*                  Thai_sarao โ THAI CHARACTER SARA O */
-    new codepair(0x0de3, 0x0e43), /*          Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */
-    new codepair(0x0de4, 0x0e44), /*         Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */
-    new codepair(0x0de5, 0x0e45), /*            Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */
-    new codepair(0x0de6, 0x0e46), /*               Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */
-    new codepair(0x0de7, 0x0e47), /*              Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */
-    new codepair(0x0de8, 0x0e48), /*                  Thai_maiek ่ THAI CHARACTER MAI EK */
-    new codepair(0x0de9, 0x0e49), /*                 Thai_maitho ้ THAI CHARACTER MAI THO */
-    new codepair(0x0dea, 0x0e4a), /*                 Thai_maitri ๊ THAI CHARACTER MAI TRI */
-    new codepair(0x0deb, 0x0e4b), /*            Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */
-    new codepair(0x0dec, 0x0e4c), /*            Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */
-    new codepair(0x0ded, 0x0e4d), /*               Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */
-    new codepair(0x0df0, 0x0e50), /*                 Thai_leksun ๐ THAI DIGIT ZERO */
-    new codepair(0x0df1, 0x0e51), /*                Thai_leknung ๑ THAI DIGIT ONE */
-    new codepair(0x0df2, 0x0e52), /*                Thai_leksong ๒ THAI DIGIT TWO */
-    new codepair(0x0df3, 0x0e53), /*                 Thai_leksam ๓ THAI DIGIT THREE */
-    new codepair(0x0df4, 0x0e54), /*                  Thai_leksi ๔ THAI DIGIT FOUR */
-    new codepair(0x0df5, 0x0e55), /*                  Thai_lekha ๕ THAI DIGIT FIVE */
-    new codepair(0x0df6, 0x0e56), /*                 Thai_lekhok ๖ THAI DIGIT SIX */
-    new codepair(0x0df7, 0x0e57), /*                Thai_lekchet ๗ THAI DIGIT SEVEN */
-    new codepair(0x0df8, 0x0e58), /*                Thai_lekpaet ๘ THAI DIGIT EIGHT */
-    new codepair(0x0df9, 0x0e59), /*                 Thai_lekkao ๙ THAI DIGIT NINE */
-    new codepair(0x0ea1, 0x3131), /*               Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */
-    new codepair(0x0ea2, 0x3132), /*          Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */
-    new codepair(0x0ea3, 0x3133), /*           Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */
-    new codepair(0x0ea4, 0x3134), /*                Hangul_Nieun ㄴ HANGUL LETTER NIEUN */
-    new codepair(0x0ea5, 0x3135), /*           Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */
-    new codepair(0x0ea6, 0x3136), /*           Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */
-    new codepair(0x0ea7, 0x3137), /*               Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */
-    new codepair(0x0ea8, 0x3138), /*          Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */
-    new codepair(0x0ea9, 0x3139), /*                Hangul_Rieul ㄹ HANGUL LETTER RIEUL */
-    new codepair(0x0eaa, 0x313a), /*          Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */
-    new codepair(0x0eab, 0x313b), /*           Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */
-    new codepair(0x0eac, 0x313c), /*           Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */
-    new codepair(0x0ead, 0x313d), /*            Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */
-    new codepair(0x0eae, 0x313e), /*           Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */
-    new codepair(0x0eaf, 0x313f), /*          Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */
-    new codepair(0x0eb0, 0x3140), /*           Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */
-    new codepair(0x0eb1, 0x3141), /*                Hangul_Mieum ㅁ HANGUL LETTER MIEUM */
-    new codepair(0x0eb2, 0x3142), /*                Hangul_Pieub ㅂ HANGUL LETTER PIEUP */
-    new codepair(0x0eb3, 0x3143), /*           Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */
-    new codepair(0x0eb4, 0x3144), /*            Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */
-    new codepair(0x0eb5, 0x3145), /*                 Hangul_Sios ㅅ HANGUL LETTER SIOS */
-    new codepair(0x0eb6, 0x3146), /*            Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */
-    new codepair(0x0eb7, 0x3147), /*                Hangul_Ieung ㅇ HANGUL LETTER IEUNG */
-    new codepair(0x0eb8, 0x3148), /*                Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */
-    new codepair(0x0eb9, 0x3149), /*           Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */
-    new codepair(0x0eba, 0x314a), /*                Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */
-    new codepair(0x0ebb, 0x314b), /*               Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */
-    new codepair(0x0ebc, 0x314c), /*                Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */
-    new codepair(0x0ebd, 0x314d), /*               Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */
-    new codepair(0x0ebe, 0x314e), /*                Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */
-    new codepair(0x0ebf, 0x314f), /*                    Hangul_A ㅏ HANGUL LETTER A */
-    new codepair(0x0ec0, 0x3150), /*                   Hangul_AE ㅐ HANGUL LETTER AE */
-    new codepair(0x0ec1, 0x3151), /*                   Hangul_YA ㅑ HANGUL LETTER YA */
-    new codepair(0x0ec2, 0x3152), /*                  Hangul_YAE ㅒ HANGUL LETTER YAE */
-    new codepair(0x0ec3, 0x3153), /*                   Hangul_EO ㅓ HANGUL LETTER EO */
-    new codepair(0x0ec4, 0x3154), /*                    Hangul_E ㅔ HANGUL LETTER E */
-    new codepair(0x0ec5, 0x3155), /*                  Hangul_YEO ㅕ HANGUL LETTER YEO */
-    new codepair(0x0ec6, 0x3156), /*                   Hangul_YE ㅖ HANGUL LETTER YE */
-    new codepair(0x0ec7, 0x3157), /*                    Hangul_O ㅗ HANGUL LETTER O */
-    new codepair(0x0ec8, 0x3158), /*                   Hangul_WA ㅘ HANGUL LETTER WA */
-    new codepair(0x0ec9, 0x3159), /*                  Hangul_WAE ㅙ HANGUL LETTER WAE */
-    new codepair(0x0eca, 0x315a), /*                   Hangul_OE ㅚ HANGUL LETTER OE */
-    new codepair(0x0ecb, 0x315b), /*                   Hangul_YO ㅛ HANGUL LETTER YO */
-    new codepair(0x0ecc, 0x315c), /*                    Hangul_U ㅜ HANGUL LETTER U */
-    new codepair(0x0ecd, 0x315d), /*                  Hangul_WEO ㅝ HANGUL LETTER WEO */
-    new codepair(0x0ece, 0x315e), /*                   Hangul_WE ㅞ HANGUL LETTER WE */
-    new codepair(0x0ecf, 0x315f), /*                   Hangul_WI ㅟ HANGUL LETTER WI */
-    new codepair(0x0ed0, 0x3160), /*                   Hangul_YU ㅠ HANGUL LETTER YU */
-    new codepair(0x0ed1, 0x3161), /*                   Hangul_EU ㅡ HANGUL LETTER EU */
-    new codepair(0x0ed2, 0x3162), /*                   Hangul_YI ㅢ HANGUL LETTER YI */
-    new codepair(0x0ed3, 0x3163), /*                    Hangul_I ㅣ HANGUL LETTER I */
-    new codepair(0x0ed4, 0x11a8), /*             Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */
-    new codepair(0x0ed5, 0x11a9), /*        Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */
-    new codepair(0x0ed6, 0x11aa), /*         Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */
-    new codepair(0x0ed7, 0x11ab), /*              Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */
-    new codepair(0x0ed8, 0x11ac), /*         Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */
-    new codepair(0x0ed9, 0x11ad), /*         Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */
-    new codepair(0x0eda, 0x11ae), /*             Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */
-    new codepair(0x0edb, 0x11af), /*              Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */
-    new codepair(0x0edc, 0x11b0), /*        Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */
-    new codepair(0x0edd, 0x11b1), /*         Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */
-    new codepair(0x0ede, 0x11b2), /*         Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */
-    new codepair(0x0edf, 0x11b3), /*          Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */
-    new codepair(0x0ee0, 0x11b4), /*         Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */
-    new codepair(0x0ee1, 0x11b5), /*        Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */
-    new codepair(0x0ee2, 0x11b6), /*         Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */
-    new codepair(0x0ee3, 0x11b7), /*              Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */
-    new codepair(0x0ee4, 0x11b8), /*              Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */
-    new codepair(0x0ee5, 0x11b9), /*          Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */
-    new codepair(0x0ee6, 0x11ba), /*               Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */
-    new codepair(0x0ee7, 0x11bb), /*          Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */
-    new codepair(0x0ee8, 0x11bc), /*              Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */
-    new codepair(0x0ee9, 0x11bd), /*              Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */
-    new codepair(0x0eea, 0x11be), /*              Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */
-    new codepair(0x0eeb, 0x11bf), /*             Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */
-    new codepair(0x0eec, 0x11c0), /*              Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */
-    new codepair(0x0eed, 0x11c1), /*             Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */
-    new codepair(0x0eee, 0x11c2), /*              Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */
-    new codepair(0x0eef, 0x316d), /*     Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */
-    new codepair(0x0ef0, 0x3171), /*    Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */
-    new codepair(0x0ef1, 0x3178), /*    Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */
-    new codepair(0x0ef2, 0x317f), /*              Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */
-    new codepair(0x0ef3, 0x3181), /*    Hangul_KkogjiDalrinIeung ㆁ HANGUL LETTER YESIEUNG */
-    new codepair(0x0ef4, 0x3184), /*   Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */
-    new codepair(0x0ef5, 0x3186), /*          Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */
-    new codepair(0x0ef6, 0x318d), /*                Hangul_AraeA ㆍ HANGUL LETTER ARAEA */
-    new codepair(0x0ef7, 0x318e), /*               Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */
-    new codepair(0x0ef8, 0x11eb), /*            Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */
-    new codepair(0x0ef9, 0x11f0), /*  Hangul_J_KkogjiDalrinIeung ᇰ HANGUL JONGSEONG YESIEUNG */
-    new codepair(0x0efa, 0x11f9), /*        Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */
-    new codepair(0x0eff, 0x20a9), /*                  Korean_Won ₩ WON SIGN */
-    new codepair(0x13bc, 0x0152), /*                          OE Œ LATIN CAPITAL LIGATURE OE */
-    new codepair(0x13bd, 0x0153), /*                          oe œ LATIN SMALL LIGATURE OE */
-    new codepair(0x13be, 0x0178), /*                  Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */
-    new codepair(0x20ac, 0x20ac), /*                    EuroSign € EURO SIGN */
-    new codepair(0xfe50, 0x0300), /*                               COMBINING GRAVE ACCENT */
-    new codepair(0xfe51, 0x0301), /*                               COMBINING ACUTE ACCENT */
-    new codepair(0xfe52, 0x0302), /*                               COMBINING CIRCUMFLEX ACCENT */
-    new codepair(0xfe53, 0x0303), /*                               COMBINING TILDE */
-    new codepair(0xfe54, 0x0304), /*                               COMBINING MACRON */
-    new codepair(0xfe55, 0x0306), /*                               COMBINING BREVE */
-    new codepair(0xfe56, 0x0307), /*                               COMBINING DOT ABOVE */
-    new codepair(0xfe57, 0x0308), /*                               COMBINING DIAERESIS */
-    new codepair(0xfe58, 0x030a), /*                               COMBINING RING ABOVE */
-    new codepair(0xfe59, 0x030b), /*                               COMBINING DOUBLE ACUTE ACCENT */
-    new codepair(0xfe5a, 0x030c), /*                               COMBINING CARON */
-    new codepair(0xfe5b, 0x0327), /*                               COMBINING CEDILLA */
-    new codepair(0xfe5c, 0x0328), /*                               COMBINING OGONEK */
-    new codepair(0xfe5d, 0x1da5), /*                               MODIFIER LETTER SMALL IOTA */
-    new codepair(0xfe5e, 0x3099), /*                               COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK */
-    new codepair(0xfe5f, 0x309a), /*                               COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
-    new codepair(0xfe60, 0x0323), /*                               COMBINING DOT BELOW */
-  };
-
-  public static int ucs2keysym(int ucs) {
-    int cur = 0;
-    int max = keysymtab.length - 1;
-
-    /* first check for Latin-1 characters (1:1 mapping) */
-    if ((ucs >= 0x0020 && ucs <= 0x007e) ||
-        (ucs >= 0x00a0 && ucs <= 0x00ff))
-      return ucs;
-
-    /* linear search in table */
-    while (cur <= max) {
-      if (keysymtab[cur].ucs == ucs)
-        return keysymtab[cur].keysym;
-      cur++;
-    }
-
-    /* use the directly encoded 24-bit UCS character */
-    if ((ucs & 0xff000000) == 0)
-      return ucs | 0x01000000;
-
-    /* no matching Unicode value found */
-    return 0xffffff;
-  }
-}
index 398ba9d01c008e8b9b4dadeafcb49935d0aab56a..d71c307f929e8a3b5d43c37cd2668a51e2825621 100644 (file)
@@ -1,7 +1,7 @@
 /* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
  * Copyright 2009-2013 Pierre Ossman <ossman@cendio.se> for Cendio AB
  * Copyright (C) 2011-2013 D. R. Commander.  All Rights Reserved.
- * Copyright (C) 2011-2015 Brian P. Hinz
+ * Copyright (C) 2011-2017 Brian P. Hinz
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -77,10 +77,6 @@ public class CConn extends CConnection implements
   static final PixelFormat mediumColorPF =
     new PixelFormat(8, 8, false, true, 7, 7, 3, 5, 2, 0);
 
-  static final int KEY_LOC_SHIFT_R = 0;
-  static final int KEY_LOC_SHIFT_L = 16;
-  static final int SUPER_MASK = 1<<15;
-
   ////////////////////////////////////////////////////////////////////
   // The following methods are all called from the RFB thread
 
@@ -95,7 +91,6 @@ public class CConn extends CConnection implements
 
     setShared(shared.getValue());
     sock = socket;
-    downKeySym = new HashMap<Integer, Integer>();
 
     upg = this;
 
@@ -706,47 +701,6 @@ public class CConn extends CConnection implements
     }
   }
 
-  void showInfo() {
-    Window fullScreenWindow = DesktopWindow.getFullScreenWindow();
-    if (fullScreenWindow != null)
-      DesktopWindow.setFullScreenWindow(null);
-    String info = new String("Desktop name: %s%n"+
-                             "Host: %s:%d%n"+
-                             "Size: %dx%d%n"+
-                             "Pixel format: %s%n"+
-                             "  (server default: %s)%n"+
-                             "Requested encoding: %s%n"+
-                             "Last used encoding: %s%n"+
-                             "Line speed estimate: %d kbit/s%n"+
-                             "Protocol version: %d.%d%n"+
-                             "Security method: %s [%s]%n");
-    String msg =
-      String.format(info, cp.name(),
-                    sock.getPeerName(), sock.getPeerPort(),
-                    cp.width, cp.height,
-                    cp.pf().print(),
-                    serverPF.print(),
-                    Encodings.encodingName(currentEncoding),
-                    Encodings.encodingName(lastServerEncoding),
-                    sock.inStream().kbitsPerSecond(),
-                    cp.majorVersion, cp.minorVersion,
-                    Security.secTypeName(csecurity.getType()),
-                    csecurity.description());
-    JOptionPane op = new JOptionPane(msg, JOptionPane.PLAIN_MESSAGE,
-                                     JOptionPane.DEFAULT_OPTION);
-    JDialog dlg = op.createDialog(desktop, "VNC connection info");
-    dlg.setIconImage(VncViewer.frameIcon);
-    dlg.setAlwaysOnTop(true);
-    dlg.setVisible(true);
-    if (fullScreenWindow != null)
-      DesktopWindow.setFullScreenWindow(fullScreenWindow);
-  }
-
-  public void refresh() {
-    writer().writeFramebufferUpdateRequest(new Rect(0,0,cp.width,cp.height), false);
-    pendingUpdate = true;
-  }
-
   // writeClientCutText() is called from the clipboard dialog
   public void writeClientCutText(String str, int len) {
     if (state() != RFBSTATE_NORMAL || shuttingDown)
@@ -754,147 +708,6 @@ public class CConn extends CConnection implements
     writer().writeClientCutText(str, len);
   }
 
-  public void writeKeyEvent(int keysym, boolean down) {
-    if (state() != RFBSTATE_NORMAL || shuttingDown)
-      return;
-    writer().keyEvent(keysym, down);
-  }
-
-  public void writeKeyEvent(KeyEvent ev) {
-    if (viewOnly.getValue() || shuttingDown)
-      return;
-
-    boolean down = (ev.getID() == KeyEvent.KEY_PRESSED);
-
-    int keySym, keyCode = ev.getKeyCode();
-
-    // If neither the keyCode or keyChar are defined, then there's
-    // really nothing that we can do with this.  The fn key on OS-X
-    // fires events like this when pressed but does not fire a
-    // corresponding release event.
-    if (keyCode == 0 && ev.getKeyChar() == KeyEvent.CHAR_UNDEFINED)
-      return;
-
-    if (!down) {
-      Integer iter = downKeySym.get(keyCode);
-      if (iter == null) {
-        // Note that dead keys will raise this sort of error falsely
-        // See https://bugs.openjdk.java.net/browse/JDK-6534883 
-        vlog.debug("Unexpected key release of keyCode "+keyCode);
-        String fmt = ev.paramString().replaceAll("%","%%");
-        vlog.debug(String.format(fmt.replaceAll(",","%n       ")));
-
-        return;
-      }
-
-      vlog.debug(String.format("Key released: 0x%04x => 0x%04x",
-                 keyCode, iter));
-
-      writeKeyEvent(iter, false);
-      downKeySym.remove(keyCode);
-
-      return;
-    }
-
-    keySym = Keysyms.translateKeyEvent(ev);
-    if (keySym == Keysyms.VoidSymbol)
-      return;
-
-    boolean need_cheat = true;
-    if (VncViewer.os.startsWith("windows")) {
-      // Windows doesn't have a proper AltGr, but handles it using fake
-      // Ctrl+Alt. Unfortunately X11 doesn't generally like the combination
-      // Ctrl+Alt+AltGr, which we usually end up with when Xvnc tries to
-      // get everything in the correct state. Cheat and temporarily release
-      // Ctrl and Alt whenever we get a key with a symbol.
-      if (KeyEvent.getKeyText(keyCode).isEmpty())
-        need_cheat = false;
-      else if (!downKeySym.containsValue(Keysyms.Control_L) &&
-               !downKeySym.containsValue(Keysyms.Control_R))
-        need_cheat = false;
-      else if (!downKeySym.containsValue(Keysyms.Alt_L) &&
-               !downKeySym.containsValue(Keysyms.Alt_R))
-        need_cheat = false;
-
-      if (need_cheat) {
-        vlog.info("Faking release of AltGr (Ctrl+Alt)");
-        if (downKeySym.containsValue(Keysyms.Control_L))
-          writeKeyEvent(Keysyms.Control_L, false);
-        if (downKeySym.containsValue(Keysyms.Control_R))
-          writeKeyEvent(Keysyms.Control_R, false);
-        if (downKeySym.containsValue(Keysyms.Alt_L))
-          writeKeyEvent(Keysyms.Alt_L, false);
-        if (downKeySym.containsValue(Keysyms.Alt_R))
-          writeKeyEvent(Keysyms.Alt_R, false);
-      }
-    }
-
-    vlog.debug(String.format("Key pressed: 0x%04x '%s' => 0x%04x",
-               keyCode, Character.toString(ev.getKeyChar()), keySym));
-
-    downKeySym.put(keyCode, keySym);
-
-    writeKeyEvent(keySym, down);
-
-    if (VncViewer.os.startsWith("windows")) {
-      if (need_cheat) {
-        vlog.debug("Restoring AltGr state");
-        if (downKeySym.containsValue(Keysyms.Control_L))
-          writeKeyEvent(Keysyms.Control_L, true);
-        if (downKeySym.containsValue(Keysyms.Control_R))
-          writeKeyEvent(Keysyms.Control_R, true);
-        if (downKeySym.containsValue(Keysyms.Alt_L))
-          writeKeyEvent(Keysyms.Alt_L, true);
-        if (downKeySym.containsValue(Keysyms.Alt_R))
-          writeKeyEvent(Keysyms.Alt_R, true);
-      }
-    }
-  }
-
-  public void writePointerEvent(MouseEvent ev) {
-    if (state() != RFBSTATE_NORMAL || shuttingDown)
-      return;
-
-    switch (ev.getID()) {
-    case MouseEvent.MOUSE_PRESSED:
-      buttonMask = 1;
-      if ((ev.getModifiers() & KeyEvent.ALT_MASK) != 0) buttonMask = 2;
-      if ((ev.getModifiers() & KeyEvent.META_MASK) != 0) buttonMask = 4;
-      break;
-    case MouseEvent.MOUSE_RELEASED:
-      buttonMask = 0;
-      break;
-    }
-
-    writer().pointerEvent(new Point(ev.getX(), ev.getY()), buttonMask);
-  }
-
-  public void writeWheelEvent(MouseWheelEvent ev) {
-    if (state() != RFBSTATE_NORMAL || shuttingDown)
-      return;
-    int x, y;
-    int clicks = ev.getWheelRotation();
-    if (clicks < 0) {
-      buttonMask = 8;
-    } else {
-      buttonMask = 16;
-    }
-    for (int i = 0; i < Math.abs(clicks); i++) {
-      x = ev.getX();
-      y = ev.getY();
-      writer().pointerEvent(new Point(x, y), buttonMask);
-      buttonMask = 0;
-      writer().pointerEvent(new Point(x, y), buttonMask);
-    }
-
-  }
-
-  synchronized void releaseDownKeys() {
-    for (Map.Entry<Integer, Integer> entry : downKeySym.entrySet())
-      writeKeyEvent(entry.getValue(), false);
-    downKeySym.clear();
-  }
-
   // this is a special ActionListener passed in by the
   // Java Plug-in software to control applet's close behavior
   public void setCloseListener(ActionListener cl) {
@@ -930,8 +743,6 @@ public class CConn extends CConnection implements
   // from when constructed).
 
   // the following are only ever accessed by the GUI thread:
-  int buttonMask;
-
   private String serverHost;
   private int serverPort;
   private Socket sock;
@@ -957,7 +768,6 @@ public class CConn extends CConnection implements
 
   private boolean supportsSyncFence;
 
-  private HashMap<Integer, Integer> downKeySym;
   public ActionListener closeListener = null;
 
   static LogWriter vlog = new LogWriter("CConn");
index 4169c76925abb38fa2e480621dbd93c6b1e755c4..42ecad8a0c313fa30414be1c22cd33e128516a87 100644 (file)
@@ -81,7 +81,7 @@ public class DesktopWindow extends JFrame
             scroll.getViewport().getView().requestFocusInWindow();
       }
       public void windowLostFocus(WindowEvent e) {
-        cc.releaseDownKeys();
+        viewport.releaseDownKeys();
       }
     });
 
diff --git a/java/com/tigervnc/vncviewer/F8Menu.java b/java/com/tigervnc/vncviewer/F8Menu.java
deleted file mode 100644 (file)
index 0c67305..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-/* Copyright (C) 2002-2005 RealVNC Ltd.  All Rights Reserved.
- * Copyright (C) 2011-2014 Brian P. Hinz
- *
- * This is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this software; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
- * USA.
- */
-
-package com.tigervnc.vncviewer;
-
-import java.awt.*;
-import java.awt.Cursor;
-import java.awt.event.*;
-import java.io.File;
-import javax.swing.filechooser.*;
-import javax.swing.JCheckBoxMenuItem;
-import javax.swing.JDialog;
-import javax.swing.JFrame;
-import javax.swing.JFileChooser;
-import javax.swing.JMenuItem;
-import javax.swing.JOptionPane;
-import javax.swing.JPopupMenu;
-
-import com.tigervnc.rfb.*;
-
-import static com.tigervnc.vncviewer.Parameters.*;
-
-public class F8Menu extends JPopupMenu implements ActionListener {
-  public F8Menu(CConn cc) {
-    super("VNC Menu");
-    setLightWeightPopupEnabled(false);
-    String os = System.getProperty("os.name");
-    if (os.startsWith("Windows"))
-      com.sun.java.swing.plaf.windows.WindowsLookAndFeel.setMnemonicHidden(false);
-    this.cc = cc;
-    restore    = addMenuItem("Restore",KeyEvent.VK_R);
-    restore.setEnabled(!embed.getValue());
-    move       = addMenuItem("Move");
-    move.setEnabled(false);
-    size       = addMenuItem("Size");
-    size.setEnabled(false);
-    minimize   = addMenuItem("Minimize", KeyEvent.VK_N);
-    minimize.setEnabled(!embed.getValue());
-    maximize   = addMenuItem("Maximize", KeyEvent.VK_X);
-    maximize.setEnabled(!embed.getValue());
-    addSeparator();
-    exit       = addMenuItem("Close Viewer", KeyEvent.VK_C);
-    addSeparator();
-    fullScreenCheckbox = new JCheckBoxMenuItem("Full Screen");
-    fullScreenCheckbox.setMnemonic(KeyEvent.VK_F);
-    fullScreenCheckbox.setSelected(fullScreen.getValue());
-    fullScreenCheckbox.addActionListener(this);
-    fullScreenCheckbox.setEnabled(!embed.getValue());
-    add(fullScreenCheckbox);
-    addSeparator();
-    clipboard  = addMenuItem("Clipboard...");
-    addSeparator();
-    int keyCode = MenuKey.getMenuKeyCode();
-    String keyText = KeyEvent.getKeyText(keyCode);
-    f8 = addMenuItem("Send "+keyText, keyCode);
-    ctrlAltDel = addMenuItem("Send Ctrl-Alt-Del");
-    addSeparator();
-    refresh    = addMenuItem("Refresh Screen", KeyEvent.VK_H);
-    addSeparator();
-    newConn    = addMenuItem("New connection...", KeyEvent.VK_W);
-    newConn.setEnabled(!embed.getValue());
-    options    = addMenuItem("Options...", KeyEvent.VK_O);
-    save       = addMenuItem("Save connection info as...", KeyEvent.VK_S);
-    info       = addMenuItem("Connection info...", KeyEvent.VK_I);
-    about      = addMenuItem("About VncViewer...", KeyEvent.VK_A);
-    addSeparator();
-    dismiss    = addMenuItem("Dismiss menu");
-    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
-  }
-
-  JMenuItem addMenuItem(String str, int mnemonic) {
-    JMenuItem item = new JMenuItem(str, mnemonic);
-    item.addActionListener(this);
-    add(item);
-    return item;
-  }
-
-  JMenuItem addMenuItem(String str) {
-    JMenuItem item = new JMenuItem(str);
-    item.addActionListener(this);
-    add(item);
-    return item;
-  }
-
-  boolean actionMatch(ActionEvent ev, JMenuItem item) {
-    return ev.getActionCommand().equals(item.getActionCommand());
-  }
-
-  public void actionPerformed(ActionEvent ev) {
-    if (actionMatch(ev, exit)) {
-      cc.close();
-    } else if (actionMatch(ev, fullScreenCheckbox)) {
-      if (fullScreenCheckbox.isSelected())
-        cc.desktop.fullscreen_on();
-      else
-        cc.desktop.fullscreen_off();
-    } else if (actionMatch(ev, restore)) {
-      if (cc.desktop.fullscreen_active())
-        cc.desktop.fullscreen_off();
-      cc.desktop.setExtendedState(JFrame.NORMAL);
-    } else if (actionMatch(ev, minimize)) {
-      if (cc.desktop.fullscreen_active())
-        cc.desktop.fullscreen_off();
-      cc.desktop.setExtendedState(JFrame.ICONIFIED);
-    } else if (actionMatch(ev, maximize)) {
-      if (cc.desktop.fullscreen_active())
-        cc.desktop.fullscreen_off();
-      cc.desktop.setExtendedState(JFrame.MAXIMIZED_BOTH);
-    } else if (actionMatch(ev, clipboard)) {
-      ClipboardDialog.showDialog(cc.desktop);
-    } else if (actionMatch(ev, f8)) {
-      cc.writeKeyEvent(MenuKey.getMenuKeySym(), true);
-      cc.writeKeyEvent(MenuKey.getMenuKeySym(), false);
-    } else if (actionMatch(ev, ctrlAltDel)) {
-      cc.writeKeyEvent(Keysyms.Control_L, true);
-      cc.writeKeyEvent(Keysyms.Alt_L, true);
-      cc.writeKeyEvent(Keysyms.Delete, true);
-      cc.writeKeyEvent(Keysyms.Delete, false);
-      cc.writeKeyEvent(Keysyms.Alt_L, false);
-      cc.writeKeyEvent(Keysyms.Control_L, false);
-    } else if (actionMatch(ev, refresh)) {
-      cc.refresh();
-    } else if (actionMatch(ev, newConn)) {
-      VncViewer.newViewer();
-    } else if (actionMatch(ev, options)) {
-      OptionsDialog.showDialog(cc.desktop);
-    } else if (actionMatch(ev, save)) {
-           String title = "Save the TigerVNC configuration to file";
-           File dflt = new File(FileUtils.getVncHomeDir().concat("default.tigervnc"));
-           if (!dflt.exists() || !dflt.isFile())
-             dflt = new File(FileUtils.getVncHomeDir());
-      FileNameExtensionFilter filter =
-        new FileNameExtensionFilter("TigerVNC configuration (*.tigervnc)", "tigervnc");
-           File f = Dialog.showChooser(title, dflt, this, filter);
-           while (f != null && f.exists() && f.isFile()) {
-             String msg = f.getAbsolutePath();
-             msg = msg.concat(" already exists. Do you want to overwrite?");
-             Object[] options = {"Overwrite", "No  \u21B5"};
-             JOptionPane op =
-               new JOptionPane(msg, JOptionPane.QUESTION_MESSAGE,
-                               JOptionPane.OK_CANCEL_OPTION, null, options, options[1]);
-             JDialog dlg = op.createDialog(this, "TigerVNC Viewer");
-             dlg.setIconImage(VncViewer.frameIcon);
-             dlg.setAlwaysOnTop(true);
-             dlg.setVisible(true);
-             if (op.getValue() == options[0])
-               break;
-             else
-               f = Dialog.showChooser(title, f, this, filter);
-           }
-           if (f != null && (!f.exists() || f.canWrite()))
-             saveViewerParameters(f.getAbsolutePath(), vncServerName.getValue());
-    } else if (actionMatch(ev, info)) {
-      cc.showInfo();
-    } else if (actionMatch(ev, about)) {
-      VncViewer.showAbout(cc.desktop);
-    } else if (actionMatch(ev, dismiss)) {
-      firePopupMenuCanceled();
-    }
-  }
-
-  public void show(Component invoker, int x, int y) {
-    // lightweight components can't show in FullScreen Exclusive mode
-    /*
-    Window fsw = DesktopWindow.getFullScreenWindow();
-    GraphicsDevice gd = null;
-    if (fsw != null) {
-      gd = fsw.getGraphicsConfiguration().getDevice();
-      if (gd.isFullScreenSupported())
-        DesktopWindow.setFullScreenWindow(null);
-    }
-    */
-    super.show(invoker, x, y);
-    /*
-    if (fsw != null && gd.isFullScreenSupported())
-      DesktopWindow.setFullScreenWindow(fsw);
-      */
-  }
-
-  CConn cc;
-  JMenuItem restore, move, size, minimize, maximize;
-  JMenuItem exit, clipboard, ctrlAltDel, refresh;
-  JMenuItem newConn, options, save, info, about, dismiss;
-  static JMenuItem f8;
-  JCheckBoxMenuItem fullScreenCheckbox;
-  static LogWriter vlog = new LogWriter("F8Menu");
-}
diff --git a/java/com/tigervnc/vncviewer/KeyMap.java b/java/com/tigervnc/vncviewer/KeyMap.java
new file mode 100644 (file)
index 0000000..b307d1d
--- /dev/null
@@ -0,0 +1,235 @@
+/* Copyright (C) 2017 Brian P. Hinz
+ *
+ * This is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this software; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA.
+ */
+
+package com.tigervnc.vncviewer;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.*;
+import javax.swing.*;
+
+import com.tigervnc.rfb.*;
+
+import static java.awt.event.KeyEvent.*;
+import static com.tigervnc.rfb.Keysymdef.*;
+
+public class KeyMap {
+
+  public final static int NoSymbol = 0;
+
+  private static final HashMap<Integer, Character> code_map_java_to_char;
+  static {
+    // Certain KeyStrokes fail to produce a valid character (CTRL+ALT+...
+    // on Windows and Mac almost never does).  For these cases, the best
+    // we can try to do is to map to the ASCII symbol from the keyCode.
+    code_map_java_to_char = new HashMap<Integer, Character>();
+    for (int c=32; c<0x7f; c++) {
+      int keyCode = KeyEvent.getExtendedKeyCodeForChar(c);
+      if (keyCode != KeyEvent.VK_UNDEFINED)
+        // Not all ASCII characters have VK_ constants, see vk_to_ascii()
+        code_map_java_to_char.put(keyCode, (char)c);
+    }
+  }
+
+  private static int[][] vkey_map = {
+    /* KEYCODE                                                LOCATION                                      */
+    /*                          UNKNOWN       STANDARD                  LEFT          RIGHT         NUMPAD  */
+    { VK_BACK_SPACE,            NoSymbol,     XK_BackSpace,             NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_TAB,                   NoSymbol,     XK_Tab,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_CANCEL,                NoSymbol,     XK_Cancel,                NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_ENTER,                 NoSymbol,     XK_Return,                NoSymbol,     NoSymbol,     XK_KP_Enter },
+    { VK_SHIFT,                 NoSymbol,     XK_Shift_L,               XK_Shift_L,   XK_Shift_R,   NoSymbol },
+    { VK_CONTROL,               NoSymbol,     XK_Control_L,             XK_Control_L, XK_Control_R, NoSymbol },
+    { VK_ALT,                   NoSymbol,     XK_Alt_L,                 XK_Alt_L,     XK_Alt_R,     NoSymbol },
+    /* VK_PAUSE left out on purpose because interpretation depends on state of CTRL. See further down. */
+    { VK_CAPS_LOCK,             NoSymbol,     XK_Caps_Lock,             NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_ESCAPE,                NoSymbol,     XK_Escape,                NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_END,                   NoSymbol,     XK_End,                   NoSymbol,     NoSymbol,     XK_KP_End },
+    { VK_HOME,                  NoSymbol,     XK_Home,                  NoSymbol,     NoSymbol,     XK_KP_Home },
+    { VK_LEFT,                  NoSymbol,     XK_Left,                  NoSymbol,     NoSymbol,     XK_KP_Left },
+    { VK_UP,                    NoSymbol,     XK_Up,                    NoSymbol,     NoSymbol,     XK_KP_Up },
+    { VK_RIGHT,                 NoSymbol,     XK_Right,                 NoSymbol,     NoSymbol,     XK_KP_Right },
+    { VK_DOWN,                  NoSymbol,     XK_Down,                  NoSymbol,     NoSymbol,     XK_KP_Down },
+    /* VK_PRINTSCREEN left out on purpose because interpretation depends on state of CTRL. See further down. */
+    { VK_PAGE_UP,               NoSymbol,     XK_Page_Up,               NoSymbol,     NoSymbol,     XK_KP_Page_Up },
+    { VK_PAGE_DOWN,             NoSymbol,     XK_Page_Down,             NoSymbol,     NoSymbol,     XK_KP_Page_Down },
+    { VK_BEGIN,                 NoSymbol,     XK_Begin,                 NoSymbol,     NoSymbol,     XK_KP_Begin },
+    { VK_KP_LEFT,               NoSymbol,     XK_KP_Left,               NoSymbol,     NoSymbol,     XK_KP_Left },
+    { VK_KP_UP,                 NoSymbol,     XK_KP_Up,                 NoSymbol,     NoSymbol,     XK_KP_Up },
+    { VK_KP_RIGHT,              NoSymbol,     XK_KP_Right,              NoSymbol,     NoSymbol,     XK_KP_Right },
+    { VK_KP_DOWN,               NoSymbol,     XK_KP_Down,               NoSymbol,     NoSymbol,     XK_KP_Down },
+    { VK_INSERT,                NoSymbol,     XK_Insert,                NoSymbol,     NoSymbol,     XK_KP_Insert },
+    { VK_DELETE,                NoSymbol,     XK_Delete,                NoSymbol,     NoSymbol,     XK_KP_Delete },
+    { VK_WINDOWS,               NoSymbol,     NoSymbol,                 XK_Super_L,   XK_Super_R,   NoSymbol },
+    { VK_CONTEXT_MENU,          NoSymbol,     XK_Menu,                  NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_NUMPAD0,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_0 },
+    { VK_NUMPAD1,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_1 },
+    { VK_NUMPAD2,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_2 },
+    { VK_NUMPAD3,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_3 },
+    { VK_NUMPAD4,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_4 },
+    { VK_NUMPAD5,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_5 },
+    { VK_NUMPAD6,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_6 },
+    { VK_NUMPAD7,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_7 },
+    { VK_NUMPAD8,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_8 },
+    { VK_NUMPAD9,               NoSymbol,     NoSymbol,                 NoSymbol,     NoSymbol,     XK_KP_9 },
+    { VK_MULTIPLY,              NoSymbol,     XK_KP_Multiply,           NoSymbol,     NoSymbol,     XK_KP_Multiply },
+    { VK_ADD,                   NoSymbol,     XK_KP_Add,                NoSymbol,     NoSymbol,     XK_KP_Add },
+    { VK_SUBTRACT,              NoSymbol,     XK_KP_Subtract,           NoSymbol,     NoSymbol,     XK_KP_Subtract },
+    { VK_DIVIDE,                NoSymbol,     XK_KP_Divide,             NoSymbol,     NoSymbol,     XK_KP_Divide },
+    { VK_SEPARATER,             NoSymbol,     XK_KP_Separator,          NoSymbol,     NoSymbol,     XK_KP_Separator },
+    { VK_DECIMAL,               NoSymbol,     XK_KP_Decimal,            NoSymbol,     NoSymbol,     XK_KP_Decimal },
+    { VK_F1,                    NoSymbol,     XK_F1,                    XK_L1,        XK_R1,        NoSymbol },
+    { VK_F2,                    NoSymbol,     XK_F2,                    XK_L2,        XK_R2,        NoSymbol },
+    { VK_F3,                    NoSymbol,     XK_F3,                    XK_L3,        XK_R3,        NoSymbol },
+    { VK_F4,                    NoSymbol,     XK_F4,                    XK_L4,        XK_R4,        NoSymbol },
+    { VK_F5,                    NoSymbol,     XK_F5,                    XK_L5,        XK_R5,        NoSymbol },
+    { VK_F6,                    NoSymbol,     XK_F6,                    XK_L6,        XK_R6,        NoSymbol },
+    { VK_F7,                    NoSymbol,     XK_F7,                    XK_L7,        XK_R7,        NoSymbol },
+    { VK_F8,                    NoSymbol,     XK_F8,                    XK_L8,        XK_R8,        NoSymbol },
+    { VK_F9,                    NoSymbol,     XK_F9,                    XK_L9,        XK_R9,        NoSymbol },
+    { VK_F10,                   NoSymbol,     XK_F10,                   XK_L10,       XK_R10,       NoSymbol },
+    { VK_F11,                   NoSymbol,     XK_F11,                   NoSymbol,     XK_R11,       NoSymbol },
+    { VK_F12,                   NoSymbol,     XK_F12,                   NoSymbol,     XK_R12,       NoSymbol },
+    { VK_F13,                   NoSymbol,     XK_F13,                   NoSymbol,     XK_R13,       NoSymbol },
+    { VK_F14,                   NoSymbol,     XK_F14,                   NoSymbol,     XK_R14,       NoSymbol },
+    { VK_F15,                   NoSymbol,     XK_F15,                   NoSymbol,     XK_R15,       NoSymbol },
+    { VK_F16,                   NoSymbol,     XK_F16,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_F17,                   NoSymbol,     XK_F17,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_F18,                   NoSymbol,     XK_F18,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_F19,                   NoSymbol,     XK_F19,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_F20,                   NoSymbol,     XK_F20,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_F21,                   NoSymbol,     XK_F21,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_F22,                   NoSymbol,     XK_F22,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_F23,                   NoSymbol,     XK_F23,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_F24,                   NoSymbol,     XK_F24,                   NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_NUM_LOCK,              NoSymbol,     XK_Num_Lock,              NoSymbol,     NoSymbol,     XK_Num_Lock },
+    { VK_SCROLL_LOCK,           NoSymbol,     XK_Scroll_Lock,           NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_ALT_GRAPH,             NoSymbol,     XK_ISO_Level3_Shift,      NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_META,                  NoSymbol,     NoSymbol,                 XK_Meta_L,    XK_Meta_R,    NoSymbol },
+    { VK_MODECHANGE,            NoSymbol,     XK_Mode_switch,           NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_CLEAR,                 NoSymbol,     XK_Clear,                 NoSymbol,     NoSymbol,     XK_KP_Begin },
+    { VK_AGAIN,                 NoSymbol,     XK_Redo,                  NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_UNDO,                  NoSymbol,     XK_Undo,                  NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_FIND,                  NoSymbol,     XK_Find,                  NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_STOP,                  NoSymbol,     XK_Cancel,                NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_HELP,                  NoSymbol,     XK_Help,                  NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_KANJI,                 NoSymbol,     XK_Kanji,                 NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_KATAKANA,              NoSymbol,     XK_Katakana,              NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_HIRAGANA,              NoSymbol,     XK_Hiragana,              NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_PREVIOUS_CANDIDATE,    NoSymbol,     XK_PreviousCandidate,     NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_CODE_INPUT,            NoSymbol,     XK_Codeinput,             NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_JAPANESE_ROMAN,        NoSymbol,     XK_Romaji,                NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_KANA_LOCK,             NoSymbol,     XK_Kana_Lock,             NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_ABOVEDOT,         NoSymbol,     XK_dead_abovedot,         NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_ABOVERING,        NoSymbol,     XK_dead_abovering,        NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_ACUTE,            NoSymbol,     XK_dead_acute,            NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_BREVE,            NoSymbol,     XK_dead_breve,            NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_CARON,            NoSymbol,     XK_dead_caron,            NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_CEDILLA,          NoSymbol,     XK_dead_cedilla,          NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_CIRCUMFLEX,       NoSymbol,     XK_dead_circumflex,       NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_DIAERESIS,        NoSymbol,     XK_dead_diaeresis,        NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_DOUBLEACUTE,      NoSymbol,     XK_dead_doubleacute,      NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_GRAVE,            NoSymbol,     XK_dead_grave,            NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_IOTA,             NoSymbol,     XK_dead_iota,             NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_MACRON,           NoSymbol,     XK_dead_macron,           NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_OGONEK,           NoSymbol,     XK_dead_ogonek,           NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_SEMIVOICED_SOUND, NoSymbol,     XK_dead_semivoiced_sound, NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_TILDE,            NoSymbol,     XK_dead_tilde,            NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_DEAD_VOICED_SOUND,     NoSymbol,     XK_dead_voiced_sound,     NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_ALPHANUMERIC,          NoSymbol,     XK_Eisu_Shift,            NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_ALL_CANDIDATES,        NoSymbol,     XK_MultipleCandidate,     NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_KANA,                  NoSymbol,     XK_Kana_Shift,            NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_JAPANESE_KATAKANA,     NoSymbol,     XK_Katakana,              NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_JAPANESE_HIRAGANA,     NoSymbol,     XK_Hiragana,              NoSymbol,     NoSymbol,     NoSymbol },
+    { VK_COMPOSE,               NoSymbol,     XK_Multi_key,             NoSymbol,     NoSymbol,     NoSymbol },
+  };
+
+  public static int vkey_to_keysym(KeyEvent ev)
+  {
+    int keyCode = ev.getKeyCode();
+
+    // Start with keys that either don't generate a symbol, or
+    // generate the same symbol as some other key.
+    if (keyCode == KeyEvent.VK_PAUSE)
+      return (ev.isControlDown() ? XK_Break : XK_Pause);
+    else if (keyCode == KeyEvent.VK_PRINTSCREEN)
+      return (ev.isControlDown() ? XK_Sys_Req : XK_Print);
+    else
+      for(int i = 0; i < vkey_map.length; i++)
+        if (keyCode == vkey_map[i][0])
+          return vkey_map[i][ev.getKeyLocation()+1];
+
+    // Unknown special key?
+    if (KeyEvent.getKeyText(keyCode).isEmpty()) {
+      vlog.error("Unknown key code: 0x%04x", keyCode);
+      return NoSymbol;
+    }
+
+    // Pressing Ctrl wreaks havoc with the symbol lookup...
+    int ucs = (int)ev.getKeyChar();
+    if (ev.isControlDown()) {
+      // For CTRL-<letter>, CTRL is sent separately, so just send <letter>.
+      if ((ucs >= 1 && ucs <= 26 && !ev.isShiftDown()) ||
+          // CTRL-{, CTRL-|, CTRL-} also map to ASCII 96-127
+          (ucs >= 27 && ucs <= 29 && ev.isShiftDown()))
+        ucs += 96;
+      // For CTRL-SHIFT-<letter>, send capital <letter> to emulate behavior
+      // of Linux.  For CTRL-@, send @.  For CTRL-_, send _.  For CTRL-^,
+      // send ^.
+      else if (ucs < 32)
+        ucs += 64;
+      // If it's still undefined, map the keyCode to ASCII symbol
+      else if (keyCode >= 0 && keyCode <= 127)
+        if (ucs == CHAR_UNDEFINED || ev.isAltDown())
+          ucs = vk_to_ascii(keyCode, ev.isShiftDown());
+        else if (VncViewer.os.startsWith("mac os x") && ev.isMetaDown()) 
+        // Alt on OS X behaves more like AltGr on other systems, and to get
+        // sane behaviour we should translate things in that manner for the
+        // remote VNC server. However that means we lose the ability to use
+        // Alt as a shortcut modifier. Do what RealVNC does and hijack the
+        // left command key as an Alt replacement.
+          ucs = vk_to_ascii(keyCode, ev.isShiftDown());
+    }
+
+    // Dead keys are represented by their spacing equivalent
+    // (or something similar depending on the layout)
+    if (Character.getType(ucs) == Character.COMBINING_SPACING_MARK)
+      return Keysym2ucs.ucs2keysym(Keysym2ucs.ucs2combining(ucs));
+
+    if (Character.isDefined(ucs))
+      return Keysym2ucs.ucs2keysym(ucs);
+
+    return NoSymbol;
+  }
+
+  private static int vk_to_ascii(int vk, boolean shift) {
+    char c = 0;
+    if (code_map_java_to_char.containsKey(vk))
+      c = code_map_java_to_char.get(vk);
+    // 0x25 (%) and 0x3F (?) do not have VK_ constants
+    if (vk == VK_5)
+      c = shift ? '%' : c;
+    else if (vk == VK_SLASH)
+      c = shift ? '?' : c;
+    if (Character.isLetter(c))
+      c = shift ? Character.toUpperCase(c) : Character.toLowerCase(c);
+    return (int)c;
+  }
+
+  static LogWriter vlog = new LogWriter("KeyMap");
+}
index 071c00405699e45cca93921fa102463735fb2017..3fd6345614df399a6652af47e2d823bebaa05186 100644 (file)
@@ -1,6 +1,6 @@
 /* Copyright 2011 Martin Koegler <mkoegler@auto.tuwien.ac.at>
  * Copyright 2011 Pierre Ossman <ossman@cendio.se> for Cendio AB
- * Copyright 2012 Brian P. Hinz
+ * Copyright 2012-2017 Brian P. Hinz
  *
  * This is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -24,42 +24,47 @@ import java.awt.event.KeyEvent;
 
 import com.tigervnc.rfb.*;
 
+import static java.awt.event.KeyEvent.*;
+import static com.tigervnc.rfb.Keysymdef.*;
+
 public class MenuKey
 {
   static class MenuKeySymbol {
-    public MenuKeySymbol(String name_, int keycode_, int keysym_) {
+    public MenuKeySymbol(String name_, int javacode_,
+                         int keycode_, int keysym_) {
       name = name_;
+      javacode = javacode_;
       keycode = keycode_;
       keysym = keysym_;
     }
     String name;
+    int javacode;
     int keycode;
     int keysym;
   }
 
   private static final MenuKeySymbol[] menuSymbols = {
-    new MenuKeySymbol("F1", KeyEvent.VK_F1, Keysyms.F1),
-    new MenuKeySymbol("F2", KeyEvent.VK_F2, Keysyms.F2),
-    new MenuKeySymbol("F3", KeyEvent.VK_F3, Keysyms.F3),
-    new MenuKeySymbol("F4", KeyEvent.VK_F4, Keysyms.F4),
-    new MenuKeySymbol("F5", KeyEvent.VK_F5, Keysyms.F5),
-    new MenuKeySymbol("F6", KeyEvent.VK_F6, Keysyms.F6),
-    new MenuKeySymbol("F7", KeyEvent.VK_F7, Keysyms.F7),
-    new MenuKeySymbol("F8", KeyEvent.VK_F8, Keysyms.F8),
-    new MenuKeySymbol("F9", KeyEvent.VK_F9, Keysyms.F9),
-    new MenuKeySymbol("F10", KeyEvent.VK_F10, Keysyms.F10),
-    new MenuKeySymbol("F11", KeyEvent.VK_F11, Keysyms.F11),
-    new MenuKeySymbol("F12", KeyEvent.VK_F12, Keysyms.F12),
-    new MenuKeySymbol("Pause", KeyEvent.VK_PAUSE, Keysyms.Pause),
-    new MenuKeySymbol("Print", KeyEvent.VK_PRINTSCREEN, Keysyms.Print),
-    new MenuKeySymbol("Scroll_Lock", KeyEvent.VK_SCROLL_LOCK,
-                      Keysyms.Scroll_Lock),
-    new MenuKeySymbol("Escape", KeyEvent.VK_ESCAPE, Keysyms.Escape),
-    new MenuKeySymbol("Insert", KeyEvent.VK_INSERT, Keysyms.Insert),
-    new MenuKeySymbol("Delete", KeyEvent.VK_DELETE, Keysyms.Delete),
-    new MenuKeySymbol("Home", KeyEvent.VK_HOME, Keysyms.Home),
-    new MenuKeySymbol("Page_Up", KeyEvent.VK_PAGE_UP, Keysyms.Page_Up),
-    new MenuKeySymbol("Page_Down", KeyEvent.VK_PAGE_DOWN, Keysyms.Page_Down)
+    new MenuKeySymbol("F1", VK_F1, 0x3b, XK_F1),
+    new MenuKeySymbol("F2", VK_F2, 0x3c, XK_F2),
+    new MenuKeySymbol("F3", VK_F3, 0x3d, XK_F3),
+    new MenuKeySymbol("F4", VK_F4, 0x3e, XK_F4),
+    new MenuKeySymbol("F5", VK_F5, 0x3f, XK_F5),
+    new MenuKeySymbol("F6", VK_F6, 0x40, XK_F6),
+    new MenuKeySymbol("F7", VK_F7, 0x41, XK_F7),
+    new MenuKeySymbol("F8", VK_F8, 0x42, XK_F8),
+    new MenuKeySymbol("F9", VK_F9, 0x43, XK_F9),
+    new MenuKeySymbol("F10", VK_F10, 0x44, XK_F10),
+    new MenuKeySymbol("F11", VK_F11, 0x57, XK_F11),
+    new MenuKeySymbol("F12", VK_F12, 0x58, XK_F12),
+    new MenuKeySymbol("Pause", VK_PAUSE, 0xc6, XK_Pause),
+    new MenuKeySymbol("Scroll_Lock", VK_SCROLL_LOCK,
+                      0x46, XK_Scroll_Lock),
+    new MenuKeySymbol("Escape", VK_ESCAPE, 0x01, XK_Escape),
+    new MenuKeySymbol("Insert", VK_INSERT, 0xd2, XK_Insert),
+    new MenuKeySymbol("Delete", VK_DELETE, 0xd3, XK_Delete),
+    new MenuKeySymbol("Home", VK_HOME, 0xc7, XK_Home),
+    new MenuKeySymbol("Page_Up", VK_PAGE_UP, 0xc9, XK_Page_Up),
+    new MenuKeySymbol("Page_Down", VK_PAGE_DOWN, 0xd1, XK_Page_Down)
   };
 
   static int getMenuKeySymbolCount() {
@@ -87,8 +92,21 @@ public class MenuKey
     return s;
   }
 
+  static int getMenuKeyJavaCode() {
+    int menuKeyCode = VK_F8;
+
+    @SuppressWarnings({"static"})
+    String menuKeyStr =
+      Configuration.global().getParam("menuKey").getValueStr();
+    for(int i = 0; i < getMenuKeySymbolCount(); i++)
+      if (menuSymbols[i].name.equals(menuKeyStr))
+        menuKeyCode = menuSymbols[i].javacode;
+
+    return menuKeyCode;
+  }
+
   static int getMenuKeyCode() {
-    int menuKeyCode = KeyEvent.VK_F8;
+    int menuKeyCode = VK_F8;
 
     @SuppressWarnings({"static"})
     String menuKeyStr =
@@ -101,7 +119,7 @@ public class MenuKey
   }
 
   static int getMenuKeySym() {
-    int menuKeySym = Keysyms.F8;
+    int menuKeySym = XK_F8;
 
     @SuppressWarnings({"static"})
     String menuKeyStr =
index 001e231784a573c6857a55efc1be6f316125055d..99b0f7af39a4272e52e5874c8f291c6ac92b5c46 100644 (file)
@@ -269,7 +269,7 @@ class ServerDialog extends Dialog implements Runnable {
   }
 
   private void handleAbout() {
-    VncViewer.showAbout(this);
+    VncViewer.about_vncviewer(this);
   }
 
   private void handleCancel() {
index 62b027f79301ed3a0819c7f6f725dd22d3b7ed4f..72d61605da87780241c14e7e69ea8a37b23d5162 100644 (file)
 package com.tigervnc.vncviewer;
 
 import java.awt.*;
-import java.awt.Color;
-import java.awt.color.ColorSpace;
 import java.awt.event.*;
 import java.awt.geom.AffineTransform;
 import java.awt.image.*;
-import java.awt.datatransfer.DataFlavor;
-import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.Clipboard;
-import java.io.BufferedReader;
 import java.nio.*;
+import java.util.*;
 import javax.swing.*;
 
 import javax.imageio.*;
@@ -48,46 +43,76 @@ import java.io.*;
 
 import com.tigervnc.rfb.*;
 import com.tigervnc.rfb.Cursor;
+import com.tigervnc.rfb.Exception;
 import com.tigervnc.rfb.Point;
 
+import static java.awt.event.KeyEvent.*;
 import static com.tigervnc.vncviewer.Parameters.*;
+import static com.tigervnc.rfb.Keysymdef.*;
 
-class Viewport extends JPanel implements MouseListener,
-  MouseMotionListener, MouseWheelListener, KeyListener {
+class Viewport extends JPanel implements ActionListener {
 
   static LogWriter vlog = new LogWriter("Viewport");
 
+  enum ID { EXIT, FULLSCREEN, MINIMIZE, RESIZE, NEWVIEWER,
+            CTRL, ALT, MENUKEY, CTRLALTDEL, CLIPBOARD,
+            REFRESH, OPTIONS, INFO, ABOUT, DISMISS }
+
+  enum MENU { INACTIVE, TOGGLE, VALUE, RADIO,
+              INVISIBLE, SUBMENU_POINTER, SUBMENU, DIVIDER }
+
   public Viewport(int w, int h, PixelFormat serverPF, CConn cc_)
   {
     cc = cc_;
-    setScaledSize(cc.cp.width, cc.cp.height);
+    setScaledSize(w, h);
     frameBuffer = createFramebuffer(serverPF, w, h);
     assert(frameBuffer != null);
     setBackground(Color.BLACK);
 
     cc.setFramebuffer(frameBuffer);
+
+    contextMenu = new JPopupMenu();
+
     OptionsDialog.addCallback("handleOptions", this);
 
-    addMouseListener(this);
-    addMouseWheelListener(this);
-    addMouseMotionListener(this);
-    addKeyListener(this);
+    addMouseListener(new MouseAdapter() {
+      public void mouseClicked(MouseEvent e) { }
+      public void mouseEntered(MouseEvent e) { handle(e); }
+      public void mouseExited(MouseEvent e) { handle(e); }
+      public void mouseReleased(MouseEvent e) { handle(e); }
+      public void mousePressed(MouseEvent e) { handle(e); }
+    });
+    addMouseWheelListener(new MouseAdapter() {
+      public void mouseWheelMoved(MouseWheelEvent e) { handle(e); }
+    });
+    addMouseMotionListener(new MouseMotionAdapter() {
+      public void mouseDragged(MouseEvent e) { handle(e); }
+      public void mouseMoved(MouseEvent e) { handle(e); }
+    });
+    addKeyListener(new KeyAdapter() {
+      public void keyTyped(KeyEvent e) { }
+      public void keyPressed(KeyEvent e) { handleSystemEvent(e); }
+      public void keyReleased(KeyEvent e) { handleSystemEvent(e); }
+    });
     addFocusListener(new FocusAdapter() {
       public void focusGained(FocusEvent e) {
         ClipboardDialog.clientCutText();
       }
       public void focusLost(FocusEvent e) {
-        cc.releaseDownKeys();
+        releaseDownKeys();
       }
     });
+
     setFocusTraversalKeysEnabled(false);
     setFocusable(true);
 
+    setMenuKey();
+
     // Send a fake pointer event so that the server will stop rendering
     // a server-side cursor. Ideally we'd like to send the actual pointer
     // position, but we can't really tell when the window manager is done
     // placing us so we don't have a good time for that.
-    cc.writer().pointerEvent(new Point(w/2, h/2), 0);
+    handlePointerEvent(new Point(w/2, h/2), 0);
   }
 
   // Most efficient format (from Viewport's point of view)
@@ -127,6 +152,9 @@ class Viewport extends JPanel implements MouseListener,
   {
     int i;
 
+    if (cursor != null)
+      cursor.flush();
+
     for (i = 0; i < width*height; i++)
       if (data[i*4 + 3] != 0) break;
 
@@ -148,7 +176,6 @@ class Viewport extends JPanel implements MouseListener,
           new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);
         cursor.setRGB(0, 0, width, height, buffer.array(), 0, width);
         cursorHotspot = hotspot;
-
       }
     }
 
@@ -158,35 +185,32 @@ class Viewport extends JPanel implements MouseListener,
     int x = (int)Math.floor((float)cursorHotspot.x * scaleRatioX);
     int y = (int)Math.floor((float)cursorHotspot.y * scaleRatioY);
 
-    java.awt.Cursor softCursor;
-
     Dimension cs = tk.getBestCursorSize(cw, ch);
     if (cs.width != cw && cs.height != ch) {
       cw = Math.min(cw, cs.width);
       ch = Math.min(ch, cs.height);
       x = (int)Math.min(x, Math.max(cs.width - 1, 0));
       y = (int)Math.min(y, Math.max(cs.height - 1, 0));
-      BufferedImage scaledImage = 
-        new BufferedImage(cs.width, cs.height, BufferedImage.TYPE_INT_ARGB);
-      Graphics2D g2 = scaledImage.createGraphics();
-      g2.setRenderingHint(RenderingHints.KEY_RENDERING,
-                          RenderingHints.VALUE_RENDER_QUALITY);
-      g2.drawImage(cursor,
-                   0, 0, cw, ch,
-                   0, 0, cursor.getWidth(), cursor.getHeight(), null);
+      BufferedImage tmp =
+        new BufferedImage(cs.width, cs.height, BufferedImage.TYPE_INT_ARGB_PRE);
+      Graphics2D g2 = tmp.createGraphics();
+      g2.drawImage(cursor, 0, 0, cw, ch, 0, 0, width, height, null);
       g2.dispose();
-      java.awt.Point hs = new java.awt.Point(x, y);
-      softCursor = tk.createCustomCursor(scaledImage, hs, "softCursor");
-      scaledImage.flush();
-    } else {
-      java.awt.Point hs = new java.awt.Point(x, y);
-      softCursor = tk.createCustomCursor(cursor, hs, "softCursor");
+      cursor = tmp;
     }
 
-    cursor.flush();
+    setCursor(cursor, x, y);
+  }
 
-    setCursor(softCursor);
+  private void setCursor(Image img, int x, int y)
+  {
+    java.awt.Point hotspot;
+    java.awt.Cursor softCursor;
+    String name = "rfb cursor";
 
+    hotspot = new java.awt.Point(x, y);
+    softCursor = tk.createCustomCursor(img, hotspot, name);
+    setCursor(softCursor);
   }
 
   public void resize(int x, int y, int w, int h) {
@@ -200,6 +224,54 @@ class Viewport extends JPanel implements MouseListener,
     setScaledSize(w, h);
   }
 
+  public int handle(MouseEvent e)
+  {
+    int buttonMask, wheelMask;
+    switch (e.getID()) {
+    case MouseEvent.MOUSE_ENTERED:
+      if (cursor != null)
+        setCursor(cursor, cursorHotspot.x, cursorHotspot.y);
+      if (embed.getValue())
+        requestFocus();
+      return 1;
+    case MouseEvent.MOUSE_EXITED:
+      setCursor(java.awt.Cursor.getDefaultCursor());
+      return 1;
+    case MouseEvent.MOUSE_PRESSED:
+    case MouseEvent.MOUSE_RELEASED:
+    case MouseEvent.MOUSE_DRAGGED:
+    case MouseEvent.MOUSE_MOVED:
+    case MouseEvent.MOUSE_WHEEL:
+      buttonMask = 0;
+      if ((e.getModifiersEx() & MouseEvent.BUTTON1_DOWN_MASK) != 0)
+        buttonMask |= 1;
+      if ((e.getModifiersEx() & MouseEvent.BUTTON2_DOWN_MASK) != 0)
+        buttonMask |= 2;
+      if ((e.getModifiersEx() & MouseEvent.BUTTON3_DOWN_MASK) != 0)
+        buttonMask |= 4;
+
+      if (e.getID() == MouseEvent.MOUSE_WHEEL) {
+        wheelMask = 0;
+        int clicks = ((MouseWheelEvent)e).getWheelRotation();
+        if (clicks < 0)
+          wheelMask |= e.isShiftDown() ? 32 : 8;
+        else
+          wheelMask |= e.isShiftDown() ? 64 : 16;
+        Point pt = new Point(e.getX(), e.getY());
+        for (int i = 0; i < Math.abs(clicks); i++) {
+          handlePointerEvent(pt, buttonMask|wheelMask);
+          handlePointerEvent(pt, buttonMask);
+        }
+        return 1;
+      }
+
+      handlePointerEvent(new Point(e.getX(), e.getY()), buttonMask);
+      return 1;
+    }
+
+    return -1;
+  }
+
   private PlatformPixelBuffer createFramebuffer(PixelFormat pf, int w, int h)
   {
     PlatformPixelBuffer fb;
@@ -241,116 +313,6 @@ class Viewport extends JPanel implements MouseListener,
     g2.dispose();
   }
 
-  // Mouse-Motion callback function
-  private void mouseMotionCB(MouseEvent e) {
-    if (!viewOnly.getValue() &&
-        e.getX() >= 0 && e.getX() <= scaledWidth &&
-        e.getY() >= 0 && e.getY() <= scaledHeight)
-      cc.writePointerEvent(translateMouseEvent(e));
-  }
-  public void mouseDragged(MouseEvent e) { mouseMotionCB(e); }
-  public void mouseMoved(MouseEvent e) { mouseMotionCB(e); }
-
-  // Mouse callback function
-  private void mouseCB(MouseEvent e) {
-    if (!viewOnly.getValue())
-      if ((e.getID() == MouseEvent.MOUSE_RELEASED) ||
-          (e.getX() >= 0 && e.getX() <= scaledWidth &&
-           e.getY() >= 0 && e.getY() <= scaledHeight))
-        cc.writePointerEvent(translateMouseEvent(e));
-  }
-  public void mouseReleased(MouseEvent e) { mouseCB(e); }
-  public void mousePressed(MouseEvent e) { mouseCB(e); }
-  public void mouseClicked(MouseEvent e) {}
-  public void mouseEntered(MouseEvent e) {
-    if (embed.getValue())
-      requestFocus();
-  }
-  public void mouseExited(MouseEvent e) {}
-
-  // MouseWheel callback function
-  private void mouseWheelCB(MouseWheelEvent e) {
-    if (!viewOnly.getValue())
-      cc.writeWheelEvent(e);
-  }
-
-  public void mouseWheelMoved(MouseWheelEvent e) {
-    mouseWheelCB(e);
-  }
-
-  private static final Integer keyEventLock = 0; 
-
-  // Handle the key-typed event.
-  public void keyTyped(KeyEvent e) { }
-
-  // Handle the key-released event.
-  public void keyReleased(KeyEvent e) {
-    synchronized(keyEventLock) {
-      cc.writeKeyEvent(e);
-    }
-  }
-
-  // Handle the key-pressed event.
-  public void keyPressed(KeyEvent e)
-  {
-    if (e.getKeyCode() == MenuKey.getMenuKeyCode()) {
-      java.awt.Point pt = e.getComponent().getMousePosition();
-      if (pt != null) {
-        F8Menu menu = new F8Menu(cc);
-        menu.show(e.getComponent(), (int)pt.getX(), (int)pt.getY());
-      }
-      return;
-    }
-    int ctrlAltShiftMask = Event.SHIFT_MASK | Event.CTRL_MASK | Event.ALT_MASK;
-    if ((e.getModifiers() & ctrlAltShiftMask) == ctrlAltShiftMask) {
-      switch (e.getKeyCode()) {
-        case KeyEvent.VK_A:
-          VncViewer.showAbout(this);
-          return;
-        case KeyEvent.VK_F:
-          if (cc.desktop.fullscreen_active())
-            cc.desktop.fullscreen_on();
-          else
-            cc.desktop.fullscreen_off();
-          return;
-        case KeyEvent.VK_H:
-          cc.refresh();
-          return;
-        case KeyEvent.VK_I:
-          cc.showInfo();
-          return;
-        case KeyEvent.VK_O:
-            OptionsDialog.showDialog(this);
-          return;
-        case KeyEvent.VK_W:
-          VncViewer.newViewer();
-          return;
-        case KeyEvent.VK_LEFT:
-        case KeyEvent.VK_RIGHT:
-        case KeyEvent.VK_UP:
-        case KeyEvent.VK_DOWN:
-          return;
-      }
-    }
-    if ((e.getModifiers() & Event.META_MASK) == Event.META_MASK) {
-      switch (e.getKeyCode()) {
-        case KeyEvent.VK_COMMA:
-        case KeyEvent.VK_N:
-        case KeyEvent.VK_W:
-        case KeyEvent.VK_I:
-        case KeyEvent.VK_R:
-        case KeyEvent.VK_L:
-        case KeyEvent.VK_F:
-        case KeyEvent.VK_Z:
-        case KeyEvent.VK_T:
-          return;
-      }
-    }
-    synchronized(keyEventLock) {
-      cc.writeKeyEvent(e);
-    }
-  }
-
   public void setScaledSize(int width, int height)
   {
     assert(width != 0 && height != 0);
@@ -384,21 +346,417 @@ class Viewport extends JPanel implements MouseListener,
       setSize(new Dimension(scaledWidth, scaledHeight));
   }
 
-  private MouseEvent translateMouseEvent(MouseEvent e)
+  private void handlePointerEvent(Point pos, int buttonMask)
   {
-    if (cc.cp.width != scaledWidth ||
-        cc.cp.height != scaledHeight) {
-      int sx = (scaleRatioX == 1.00) ?
-        e.getX() : (int)Math.floor(e.getX() / scaleRatioX);
-      int sy = (scaleRatioY == 1.00) ?
-        e.getY() : (int)Math.floor(e.getY() / scaleRatioY);
-      e.translatePoint(sx - e.getX(), sy - e.getY());
+    if (!viewOnly.getValue()) {
+      if (buttonMask != lastButtonMask || !pos.equals(lastPointerPos)) {
+        try {
+          if (cc.cp.width != scaledWidth ||
+              cc.cp.height != scaledHeight) {
+            int sx = (scaleRatioX == 1.00) ?
+              pos.x : (int)Math.floor(pos.x / scaleRatioX);
+            int sy = (scaleRatioY == 1.00) ?
+              pos.y : (int)Math.floor(pos.y / scaleRatioY);
+            pos = pos.translate(new Point(sx - pos.x, sy - pos.y));
+          }
+          cc.writer().pointerEvent(pos, buttonMask);
+        } catch (Exception e) {
+          vlog.error("%s", e.getMessage());
+          cc.close();
+        }
+      }
+      lastPointerPos = pos;
+      lastButtonMask = buttonMask;
     }
-    return e;
+  }
+
+  public void handleKeyPress(int keyCode, int keySym)
+  {
+    // Prevent recursion if the menu wants to send it's own
+    // activation key.
+    if ((menuKeySym != 0) && keySym == menuKeySym && !menuRecursion) {
+      popupContextMenu();
+      return;
+    }
+
+    if (viewOnly.getValue())
+      return;
+
+    if (keyCode == 0) {
+      vlog.error("No key code specified on key press");
+      return;
+    }
+
+    if (VncViewer.os.startsWith("mac os x")) {
+      // Alt on OS X behaves more like AltGr on other systems, and to get
+      // sane behaviour we should translate things in that manner for the
+      // remote VNC server. However that means we lose the ability to use
+      // Alt as a shortcut modifier. Do what RealVNC does and hijack the
+      // left command key as an Alt replacement.
+      switch (keySym) {
+      case XK_Meta_L:
+        keySym = XK_Alt_L;
+        break;
+      case XK_Meta_R:
+        keySym = XK_Super_L;
+        break;
+      case XK_Alt_L:
+        keySym = XK_Mode_switch;
+        break;
+      case XK_Alt_R:
+        keySym = XK_ISO_Level3_Shift;
+        break;
+      }
+    }
+
+    if (VncViewer.os.startsWith("windows")) {
+      // Ugly hack alert!
+      //
+      // Windows doesn't have a proper AltGr, but handles it using fake
+      // Ctrl+Alt. Unfortunately X11 doesn't generally like the combination
+      // Ctrl+Alt+AltGr, which we usually end up with when Xvnc tries to
+      // get everything in the correct state. Cheat and temporarily release
+      // Ctrl and Alt when we send some other symbol.
+      if (downKeySym.containsValue(XK_Control_L) &&
+          downKeySym.containsValue(XK_Alt_R)) {
+        vlog.debug("Faking release of AltGr (Ctrl_L+Alt_R)");
+        try {
+          cc.writer().keyEvent(XK_Control_L, false);
+          cc.writer().keyEvent(XK_Alt_R, false);
+        } catch (Exception e) {
+          vlog.error("%s", e.getMessage());
+          cc.close();
+        }
+      }
+    }
+
+    // Because of the way keyboards work, we cannot expect to have the same
+    // symbol on release as when pressed. This breaks the VNC protocol however,
+    // so we need to keep track of what keysym a key _code_ generated on press
+    // and send the same on release.
+    downKeySym.put(keyCode, keySym);
+
+    vlog.debug("Key pressed: 0x%04x => 0x%04x", keyCode, keySym);
+
+    try {
+      // Fake keycode?
+      if (keyCode > 0xffff)
+        cc.writer().keyEvent(keySym, true);
+      else
+        cc.writer().keyEvent(keySym, true);
+    } catch (Exception e) {
+      vlog.error("%s", e.getMessage());
+      cc.close();
+    }
+
+    if (VncViewer.os.startsWith("windows")) {
+      // Ugly hack continued...
+      if (downKeySym.containsValue(XK_Control_L) &&
+          downKeySym.containsValue(XK_Alt_R)) {
+        vlog.debug("Restoring AltGr state");
+        try {
+          cc.writer().keyEvent(XK_Control_L, true);
+          cc.writer().keyEvent(XK_Alt_R, true);
+        } catch (Exception e) {
+          vlog.error("%s", e.getMessage());
+          cc.close();
+        }
+      }
+    }
+  }
+
+  public void handleKeyRelease(int keyCode)
+  {
+    Integer iter;
+
+    if (viewOnly.getValue())
+      return;
+
+    iter = downKeySym.get(keyCode);
+    if (iter == null) {
+      // These occur somewhat frequently so let's not spam them unless
+      // logging is turned up.
+      vlog.debug("Unexpected release of key code %d", keyCode);
+      return;
+    }
+
+    vlog.debug("Key released: 0x%04x => 0x%04x", keyCode, iter);
+
+    try {
+      if (keyCode > 0xffff)
+        cc.writer().keyEvent(iter, false);
+      else
+        cc.writer().keyEvent(iter, false);
+    } catch (Exception e) {
+      vlog.error("%s", e.getMessage());
+      cc.close();
+    }
+
+    downKeySym.remove(keyCode);
+  }
+
+  private int handleSystemEvent(AWTEvent event)
+  {
+
+    if (event instanceof KeyEvent) {
+      KeyEvent ev = (KeyEvent)event;
+      if (ev.getKeyCode() == 0) {
+        // Not much we can do with this...
+        vlog.debug("Ignoring KeyEvent with unknown Java keycode");
+        return 0;
+      }
+
+      if (ev.getID() == KeyEvent.KEY_PRESSED) {
+        // Generate a fake keycode just for tracking if we can't figure
+        // out the proper one.  Java virtual key codes aren't unique 
+        // between left/right versions of keys, so we can't use them as
+        // indexes to the downKeySym map. There should not be any key 
+        // codes > 0xFFFF so we can use the high nibble to make a unique
+        // pseudo-key code.
+        int keyCode = ev.getKeyCode() | ev.getKeyLocation()<<16;
+
+        // Pressing Ctrl wreaks havoc with the symbol lookup, so turn
+        // that off. But AltGr shows up as Ctrl_L+Alt_R in Windows, so
+        // construct a new KeyEvent that uses a proper AltGraph for the
+        // symbol lookup.
+        if (VncViewer.os.startsWith("windows")) {
+          if (downKeySym.containsValue(XK_Control_L) &&
+              downKeySym.containsValue(XK_Alt_R)) {
+            int mask = ev.getModifiers();
+            mask &= ~CTRL_MASK;
+            mask &= ~ALT_MASK;
+            mask |= ALT_GRAPH_MASK;
+            AWTKeyStroke ks =
+              AWTKeyStroke.getAWTKeyStroke(ev.getKeyCode(), mask);
+            ev = new KeyEvent((JComponent)ev.getSource(), ev.getID(),
+                              ev.getWhen(), mask, ev.getKeyCode(),
+                              ks.getKeyChar(), ev.getKeyLocation());
+          }
+        }
+
+        int keySym = KeyMap.vkey_to_keysym(ev);
+
+        if (keySym == KeyMap.NoSymbol)
+          vlog.error("No symbol for virtual key 0x%02x", keyCode);
+
+        if (VncViewer.os.startsWith("linux")) {
+          switch (keySym) {
+          // For the first few years, there wasn't a good consensus on what the
+          // Windows keys should be mapped to for X11. So we need to help out a
+          // bit and map all variants to the same key...
+          case XK_Hyper_L:
+            keySym = XK_Super_L;
+            break;
+          case XK_Hyper_R:
+            keySym = XK_Super_R;
+            break;
+          // There has been several variants for Shift-Tab over the years.
+          // RFB states that we should always send a normal tab.
+          case XK_ISO_Left_Tab:
+            keySym = XK_Tab;
+            break;
+          }
+        }
+
+        handleKeyPress(keyCode, keySym);
+
+        if (VncViewer.os.startsWith("mac os x")) {
+          // We don't get any release events for CapsLock, so we have to
+          // send the release right away.
+          if (keySym == XK_Caps_Lock)
+            handleKeyRelease(keyCode);
+        }
+
+        return 1;
+      } else if (ev.getID() == KeyEvent.KEY_RELEASED) {
+        int keyCode = keyCode = ev.getKeyCode() | ev.getKeyLocation()<<16;
+        handleKeyRelease(keyCode);
+        return 1;
+      }
+    }
+
+    return 0;
+  }
+
+  private void initContextMenu()
+  {
+    contextMenu.setLightWeightPopupEnabled(false);
+
+    contextMenu.removeAll();
+
+    menu_add(contextMenu, "Exit viewer", KeyEvent.VK_X,
+             this, ID.EXIT, EnumSet.of(MENU.DIVIDER));
+
+    menu_add(contextMenu, "Full screen", KeyEvent.VK_F, this, ID.FULLSCREEN,
+             window().fullscreen_active() ?
+             EnumSet.of(MENU.TOGGLE, MENU.VALUE) : EnumSet.of(MENU.TOGGLE));
+    menu_add(contextMenu, "Minimize", KeyEvent.VK_Z,
+             this, ID.MINIMIZE, EnumSet.noneOf(MENU.class));
+    menu_add(contextMenu, "Resize window to session", KeyEvent.VK_W,
+             this, ID.RESIZE,
+             window().fullscreen_active() ?
+             EnumSet.of(MENU.INACTIVE, MENU.DIVIDER) : EnumSet.of(MENU.DIVIDER));
+
+    menu_add(contextMenu, "Clipboard viewer...", KeyEvent.VK_UNDEFINED,
+             this, ID.CLIPBOARD, EnumSet.of(MENU.DIVIDER));
+
+    menu_add(contextMenu, "Ctrl", KeyEvent.VK_C,
+             this, ID.CTRL,
+             menuCtrlKey ? EnumSet.of(MENU.TOGGLE, MENU.VALUE) : EnumSet.of(MENU.TOGGLE));
+    menu_add(contextMenu, "Alt", KeyEvent.VK_A,
+             this, ID.ALT,
+             menuAltKey ? EnumSet.of(MENU.TOGGLE, MENU.VALUE) : EnumSet.of(MENU.TOGGLE));
+
+    menu_add(contextMenu, "Send Ctrl-Alt-Del", KeyEvent.VK_D,
+             this, ID.CTRLALTDEL, EnumSet.of(MENU.DIVIDER));
+
+    menu_add(contextMenu, "Refresh screen", KeyEvent.VK_R,
+             this, ID.REFRESH, EnumSet.of(MENU.DIVIDER));
+
+    menu_add(contextMenu, "New connection...", KeyEvent.VK_N,
+             this, ID.NEWVIEWER,
+             embed.getValue() ? EnumSet.of(MENU.INACTIVE, MENU.DIVIDER) : EnumSet.of(MENU.DIVIDER));
+
+    menu_add(contextMenu, "Options...", KeyEvent.VK_O,
+             this, ID.OPTIONS, EnumSet.noneOf(MENU.class));
+    menu_add(contextMenu, "Connection info...", KeyEvent.VK_I,
+             this, ID.INFO, EnumSet.noneOf(MENU.class));
+    menu_add(contextMenu, "About TigerVNC viewer...", KeyEvent.VK_T,
+             this, ID.ABOUT, EnumSet.of(MENU.DIVIDER));
+
+    menu_add(contextMenu, "Dismiss menu", KeyEvent.VK_M,
+             this, ID.DISMISS, EnumSet.noneOf(MENU.class));
+  }
+
+  static void menu_add(JPopupMenu menu, String text,
+                       int shortcut, ActionListener cb,
+                       ID data, EnumSet<MENU> flags)
+  {
+    JMenuItem item;
+    if (flags.contains(MENU.TOGGLE)) {
+      item = new JCheckBoxMenuItem(text, flags.contains(MENU.VALUE));
+    } else {
+      if (shortcut != 0)
+        item = new JMenuItem(text, shortcut);
+      else
+        item = new JMenuItem(text);
+    }
+    item.setActionCommand(data.toString());
+    item.addActionListener(cb);
+    item.setEnabled(!flags.contains(MENU.INACTIVE));
+    menu.add(item);
+    if (flags.contains(MENU.DIVIDER))
+      menu.addSeparator();
+  }
+
+  void popupContextMenu()
+  {
+    // initialize context menu before display
+    initContextMenu();
+
+    contextMenu.setCursor(java.awt.Cursor.getDefaultCursor());
+
+    contextMenu.show(this, lastPointerPos.x, lastPointerPos.y);
+  }
+
+  public void actionPerformed(ActionEvent ev)
+  {
+    switch(ID.valueOf(ev.getActionCommand())) {
+    case EXIT:
+      cc.close();
+      break;
+    case FULLSCREEN:
+      if (window().fullscreen_active())
+        window().fullscreen_off();
+      else
+        window().fullscreen_on();
+      break;
+    case MINIMIZE:
+      if (window().fullscreen_active())
+        window().fullscreen_off();
+      window().setExtendedState(JFrame.ICONIFIED);
+      break;
+    case RESIZE:
+      if (window().fullscreen_active())
+        break;
+      int dx = window().getInsets().left + window().getInsets().right;
+      int dy = window().getInsets().top + window().getInsets().bottom;
+      window().setSize(getWidth()+dx, getHeight()+dy);
+      break;
+    case CLIPBOARD:
+      ClipboardDialog.showDialog(window());
+      break;
+    case CTRL:
+      if (((JMenuItem)ev.getSource()).isSelected())
+        handleKeyPress(0x1d, XK_Control_L);
+      else
+        handleKeyRelease(0x1d);
+      menuCtrlKey = !menuCtrlKey;
+      break;
+    case ALT:
+      if (((JMenuItem)ev.getSource()).isSelected())
+        handleKeyPress(0x38, XK_Alt_L);
+      else
+        handleKeyRelease(0x38);
+      menuAltKey = !menuAltKey;
+      break;
+    case MENUKEY:
+      menuRecursion = true;
+      handleKeyPress(menuKeyCode, menuKeySym);
+      menuRecursion = false;
+      handleKeyRelease(menuKeyCode);
+      break;
+    case CTRLALTDEL:
+      handleKeyPress(0x1d, XK_Control_L);
+      handleKeyPress(0x38, XK_Alt_L);
+      handleKeyPress(0xd3, XK_Delete);
+
+      handleKeyRelease(0xd3);
+      handleKeyRelease(0x38);
+      handleKeyRelease(0x1d);
+      break;
+    case REFRESH:
+      cc.refreshFramebuffer();
+      break;
+    case NEWVIEWER:
+      VncViewer.newViewer();
+      break;
+    case OPTIONS:
+      OptionsDialog.showDialog(cc.desktop);
+      break;
+    case INFO:
+      Window fullScreenWindow =
+        DesktopWindow.getFullScreenWindow();
+      if (fullScreenWindow != null)
+        DesktopWindow.setFullScreenWindow(null);
+      JOptionPane op = new JOptionPane(cc.connectionInfo(),
+                                       JOptionPane.PLAIN_MESSAGE,
+                                       JOptionPane.DEFAULT_OPTION);
+      JDialog dlg = op.createDialog(window(), "VNC connection info");
+      dlg.setIconImage(VncViewer.frameIcon);
+      dlg.setAlwaysOnTop(true);
+      dlg.setVisible(true);
+      if (fullScreenWindow != null)
+        DesktopWindow.setFullScreenWindow(fullScreenWindow);
+      break;
+    case ABOUT:
+      VncViewer.about_vncviewer(cc.desktop);
+      break;
+    case DISMISS:
+      break;
+    }
+  }
+
+  private void setMenuKey()
+  {
+    menuKeyJava = MenuKey.getMenuKeyJavaCode();
+    menuKeyCode = MenuKey.getMenuKeyCode();
+    menuKeySym = MenuKey.getMenuKeySym();
   }
 
   public void handleOptions()
   {
+    setMenuKey();
     /*
     setScaledSize(cc.cp.width, cc.cp.height);
     if (!oldSize.equals(new Dimension(scaledWidth, scaledHeight))) {
@@ -414,18 +772,48 @@ class Viewport extends JPanel implements MouseListener,
     */
   }
 
+  public void releaseDownKeys() {
+    while (!downKeySym.isEmpty())
+      handleKeyRelease(downKeySym.keySet().iterator().next());
+  }
+
+  private DesktopWindow window() {
+    return (DesktopWindow)getTopLevelAncestor();
+  }
+  private int x() { return getX(); }
+  private int y() { return getY(); }
+  private int w() { return getWidth(); }
+  private int h() { return getHeight(); }
   // access to cc by different threads is specified in CConn
   private CConn cc;
 
   // access to the following must be synchronized:
-  public PlatformPixelBuffer frameBuffer;
+  private PlatformPixelBuffer frameBuffer;
+
+  Point lastPointerPos = new Point(0, 0);
+  int lastButtonMask = 0;
+
+  private class DownMap extends HashMap<Integer, Integer> {
+    public DownMap(int capacity) {
+      super(capacity);
+    }
+  }
+  DownMap downKeySym = new DownMap(256);
+
+  int menuKeySym;
+  int menuKeyCode, menuKeyJava;
+  JPopupMenu contextMenu;
+  boolean menuRecursion = false;
+
+  boolean menuCtrlKey = false;
+  boolean menuAltKey = false;
 
   static Toolkit tk = Toolkit.getDefaultToolkit();
 
   public int scaledWidth = 0, scaledHeight = 0;
   float scaleRatioX, scaleRatioY;
 
-  BufferedImage cursor;
+  static BufferedImage cursor;
   Point cursorHotspot = new Point();
 
 }
index d6a3930b688c6a8b731e4cdcae72fcfc77299339..8786c11d62215e58658677c70f8da72f5293e982 100644 (file)
@@ -394,7 +394,7 @@ public class VncViewer extends javax.swing.JApplet
       }
       public void windowDeactivated(WindowEvent e) {
         if (cc != null)
-          cc.releaseDownKeys();
+          cc.desktop.viewport.releaseDownKeys();
       }
     });
   }
@@ -412,7 +412,7 @@ public class VncViewer extends javax.swing.JApplet
     }
   }
 
-  public static void showAbout(Container parent) {
+  public static void about_vncviewer(Container parent) {
     String pkgDate = "";
     String pkgTime = "";
     try {