Skip to content

Instantly share code, notes, and snippets.

@kanaka
Created December 6, 2010 18:39
Show Gist options
  • Save kanaka/2e7f20be852a4527df63 to your computer and use it in GitHub Desktop.
Save kanaka/2e7f20be852a4527df63 to your computer and use it in GitHub Desktop.
noVNC keyboard layout modified patch from Colin Dean
diff --git a/include/canvas.js b/include/canvas.js
index e3a2e23..7749d46 100644
--- a/include/canvas.js
+++ b/include/canvas.js
@@ -8,7 +8,7 @@
"use strict";
/*jslint browser: true, white: false, bitwise: false */
-/*global window, Util, Base64 */
+/*global window, Util, Base64, KeySym */
function Canvas(conf) {
@@ -215,99 +215,6 @@ function constructor() {
return that ;
}
-/* Translate DOM key event to keysym value */
-function getKeysym(e) {
- var evt, keysym;
- evt = (e ? e : window.event);
-
- /* Remap modifier and special keys */
- switch ( evt.keyCode ) {
- case 8 : keysym = 0xFF08; break; // BACKSPACE
- case 9 : keysym = 0xFF09; break; // TAB
- case 13 : keysym = 0xFF0D; break; // ENTER
- case 27 : keysym = 0xFF1B; break; // ESCAPE
- case 45 : keysym = 0xFF63; break; // INSERT
- case 46 : keysym = 0xFFFF; break; // DELETE
- case 36 : keysym = 0xFF50; break; // HOME
- case 35 : keysym = 0xFF57; break; // END
- case 33 : keysym = 0xFF55; break; // PAGE_UP
- case 34 : keysym = 0xFF56; break; // PAGE_DOWN
- case 37 : keysym = 0xFF51; break; // LEFT
- case 38 : keysym = 0xFF52; break; // UP
- case 39 : keysym = 0xFF53; break; // RIGHT
- case 40 : keysym = 0xFF54; break; // DOWN
- case 112 : keysym = 0xFFBE; break; // F1
- case 113 : keysym = 0xFFBF; break; // F2
- case 114 : keysym = 0xFFC0; break; // F3
- case 115 : keysym = 0xFFC1; break; // F4
- case 116 : keysym = 0xFFC2; break; // F5
- case 117 : keysym = 0xFFC3; break; // F6
- case 118 : keysym = 0xFFC4; break; // F7
- case 119 : keysym = 0xFFC5; break; // F8
- case 120 : keysym = 0xFFC6; break; // F9
- case 121 : keysym = 0xFFC7; break; // F10
- case 122 : keysym = 0xFFC8; break; // F11
- case 123 : keysym = 0xFFC9; break; // F12
- case 16 : keysym = 0xFFE1; break; // SHIFT
- case 17 : keysym = 0xFFE3; break; // CONTROL
- //case 18 : keysym = 0xFFE7; break; // Left Meta (Mac Option)
- case 18 : keysym = 0xFFE9; break; // Left ALT (Mac Command)
- default : keysym = evt.keyCode; break;
- }
-
- /* Remap symbols */
- switch (keysym) {
- case 186 : keysym = 59; break; // ; (IE)
- case 187 : keysym = 61; break; // = (IE)
- case 188 : keysym = 44; break; // , (Mozilla, IE)
- case 109 : // - (Mozilla)
- if (Util.Engine.gecko) {
- keysym = 45; }
- break;
- case 189 : keysym = 45; break; // - (IE)
- case 190 : keysym = 46; break; // . (Mozilla, IE)
- case 191 : keysym = 47; break; // / (Mozilla, IE)
- case 192 : keysym = 96; break; // ` (Mozilla, IE)
- case 219 : keysym = 91; break; // [ (Mozilla, IE)
- case 220 : keysym = 92; break; // \ (Mozilla, IE)
- case 221 : keysym = 93; break; // ] (Mozilla, IE)
- case 222 : keysym = 39; break; // ' (Mozilla, IE)
- }
-
- /* Remap shifted and unshifted keys */
- if (!!evt.shiftKey) {
- switch (keysym) {
- case 48 : keysym = 41 ; break; // ) (shifted 0)
- case 49 : keysym = 33 ; break; // ! (shifted 1)
- case 50 : keysym = 64 ; break; // @ (shifted 2)
- case 51 : keysym = 35 ; break; // # (shifted 3)
- case 52 : keysym = 36 ; break; // $ (shifted 4)
- case 53 : keysym = 37 ; break; // % (shifted 5)
- case 54 : keysym = 94 ; break; // ^ (shifted 6)
- case 55 : keysym = 38 ; break; // & (shifted 7)
- case 56 : keysym = 42 ; break; // * (shifted 8)
- case 57 : keysym = 40 ; break; // ( (shifted 9)
-
- case 59 : keysym = 58 ; break; // : (shifted `)
- case 61 : keysym = 43 ; break; // + (shifted ;)
- case 44 : keysym = 60 ; break; // < (shifted ,)
- case 45 : keysym = 95 ; break; // _ (shifted -)
- case 46 : keysym = 62 ; break; // > (shifted .)
- case 47 : keysym = 63 ; break; // ? (shifted /)
- case 96 : keysym = 126; break; // ~ (shifted `)
- case 91 : keysym = 123; break; // { (shifted [)
- case 92 : keysym = 124; break; // | (shifted \)
- case 93 : keysym = 125; break; // } (shifted ])
- case 39 : keysym = 34 ; break; // " (shifted ')
- }
- } else if ((keysym >= 65) && (keysym <=90)) {
- /* Remap unshifted A-Z */
- keysym += 32;
- }
-
- return keysym;
-}
-
function onMouseButton(e, down) {
var evt, pos, bmask;
if (! conf.focused) {
@@ -362,29 +269,76 @@ function onMouseMove(e) {
}
function onKeyDown(e) {
- //Util.Debug("keydown: " + getKeysym(e));
if (! conf.focused) {
return true;
}
+ var evt = (e ? e : window.event),
+ ks = KeySym.fromCode(evt.keyCode, evt.ctrlKey, evt.altKey);
+
+ if (ks === null) {
+ Util.Debug("onKeyDown: handled as keypress");
+ return true; // handled as keypress instead
+ }
+
+ //Util.Debug("keydown: " + ks + " 0x" + ks.toString(16));
if (c_keyPress) {
- c_keyPress(getKeysym(e), 1);
+ c_keyPress(ks, 1);
}
Util.stopEvent(e);
return false;
}
function onKeyUp(e) {
- //Util.Debug("keyup: " + getKeysym(e));
if (! conf.focused) {
return true;
}
+ var evt = (e ? e : window.event),
+ ks = KeySym.fromCode(evt.keyCode, evt.ctrlKey, evt.altKey);
+
+ if (ks === null) {
+ return true; // handled as keypress instead
+ }
+
+ //Util.Debug("keyup: " + ks + " 0x" + ks.toString(16));
if (c_keyPress) {
- c_keyPress(getKeysym(e), 0);
+ c_keyPress(ks, 0);
}
Util.stopEvent(e);
return false;
}
+function onKeyPress(e) {
+ if (! conf.focused) {
+ return true;
+ }
+ var code;
+ if (e.ctrlKey && !e.altKey) {
+ code = 0; // Prevent Gecko sending these again
+ } else if (typeof e.which === 'undefined' && typeof e.charCode === 'undefined') {
+ code = e.keyCode; // IE, normal key
+ } else {
+ code = e.charCode;
+ }
+
+ if (code > 255) {
+ // Map Unicode outside Latin 1 to X11 keysyms
+ code = KeySym.unicodeTable[code];
+ if (typeof code === 'undefined')
+ code = 0;
+ }
+
+ if (code != 0) {
+ //Util.Debug("keypress: " + code + " 0x" + code.toString(16));
+ if (c_keyPress) {
+ c_keyPress(code, 1);
+ c_keyPress(code, 0);
+ }
+ }
+
+ Util.stopEvent(e);
+ return false;
+}
+
function onMouseDisable(e) {
var evt, pos;
if (! conf.focused) {
@@ -422,6 +376,7 @@ that.start = function(keyPressFunc, mouseButtonFunc, mouseMoveFunc) {
Util.addEvent(conf.focusContainer, 'keydown', onKeyDown);
Util.addEvent(conf.focusContainer, 'keyup', onKeyUp);
+ Util.addEvent(conf.focusContainer, 'keypress', onKeyPress);
Util.addEvent(c, 'mousedown', onMouseDown);
Util.addEvent(c, 'mouseup', onMouseUp);
Util.addEvent(c, 'mousemove', onMouseMove);
diff --git a/include/keysym.js b/include/keysym.js
new file mode 100644
index 0000000..c05ca44
--- /dev/null
+++ b/include/keysym.js
@@ -0,0 +1,1390 @@
+/*
+ * noVNC: HTML5 VNC client
+ * Copyright (C) 2010 Joel Martin & Colin Dean
+ * Licensed under LGPL-3 (see LICENSE.txt)
+ *
+ * The data in the Unicode Table below was derived from the X.Org
+ * Foundation's X11R7.4 /usr/include/X11/keysymdef.h.
+ *
+ * See README.md for usage and integration instructions.
+ */
+
+"use strict";
+/*jslint browser: true, white: false, bitwise: false */
+
+var KeySym = {
+
+ //
+ // Translate DOM key code to keysym value
+ //
+ fromCode : function (keyCode, ctrlKey, altKey) {
+ var keysym;
+
+ // remap special keys like BACKSPACE, ENTER, SHIFT, CONTROL, ...
+ keysym = KeySym.specialTable[keyCode];
+ if (typeof keysym !== 'undefined') {
+ return keysym;
+ }
+
+ // Remap ASCII control keys (e.g. Ctrl-C, Ctrl-]) but not Ctrl-Alt keys
+ if (ctrlKey && !altKey) {
+ keysym = KeySym.controlTable[keyCode];
+ if (typeof keysym !== 'undefined') {
+ return keysym;
+ }
+ return keyCode; // in hope rather than anticipation
+ }
+
+ //
+ // For normal keys, we cannot deduce anything like ASCII or Unicode
+ // character value from keyCode, because this is dependent on the
+ // keyboard layout, which we don't know. For example, Shift-2 on
+ // a US keyboard is character '@', but on UK keyboard it's '"', and
+ // many European keyboards use Ctrl-Alt to enter what would be standard
+ // keys on US keyboard (e.g. Ctrl-Alt-0 is '@' on French keyboard and
+ // Ctrl-Alt-x is '#' on Czech).
+ //
+ // These would therefore all be better handled as keypress events
+ // rather than keydown + keyup, so return null to indicate this.
+ //
+ return null;
+
+ },
+
+ //
+ // Browser keycode to X11 keysym for special non-alphanumeric keys
+ //
+ specialTable : {
+ 8 : 0xFF08, // BACKSPACE
+ 9 : 0xFF09, // TAB
+ 13 : 0xFF0D, // ENTER
+ 27 : 0xFF1B, // ESCAPE
+ 45 : 0xFF63, // INSERT
+ 46 : 0xFFFF, // DELETE
+ 36 : 0xFF50, // HOME
+ 35 : 0xFF57, // END
+ 33 : 0xFF55, // PAGE_UP
+ 34 : 0xFF56, // PAGE_DOWN
+ 37 : 0xFF51, // LEFT
+ 38 : 0xFF52, // UP
+ 39 : 0xFF53, // RIGHT
+ 40 : 0xFF54, // DOWN
+ 112 : 0xFFBE, // F1
+ 113 : 0xFFBF, // F2
+ 114 : 0xFFC0, // F3
+ 115 : 0xFFC1, // F4
+ 116 : 0xFFC2, // F5
+ 117 : 0xFFC3, // F6
+ 118 : 0xFFC4, // F7
+ 119 : 0xFFC5, // F8
+ 120 : 0xFFC6, // F9
+ 121 : 0xFFC7, // F10
+ 122 : 0xFFC8, // F11
+ 123 : 0xFFC9, // F12
+ 16 : 0xFFE1, // SHIFT
+ 17 : 0xFFE3, // CONTROL
+ //18 : 0xFFE7, // Left Meta (Mac Option)
+ 18 : 0xFFE9 // Left ALT (Mac Command)
+ },
+
+ //
+ // Browser keycode to X11 keysym for ASII control characters 0-31
+ //
+ controlTable : {
+ 65 : 97, // Ctrl-a
+ 66 : 98, // Ctrl-b
+ 67 : 99, // Ctrl-c
+ 68 : 100, // Ctrl-d
+ 69 : 101, // Ctrl-e
+ 70 : 102, // Ctrl-f
+ 71 : 103, // Ctrl-g
+ 72 : 104, // Ctrl-h
+ 73 : 105, // Ctrl-i
+ 74 : 106, // Ctrl-j
+ 75 : 107, // Ctrl-k
+ 76 : 108, // Ctrl-l
+ 77 : 109, // Ctrl-m
+ 78 : 110, // Ctrl-n
+ 79 : 111, // Ctrl-o
+ 80 : 112, // Ctrl-p
+ 81 : 113, // Ctrl-q
+ 82 : 114, // Ctrl-r
+ 83 : 115, // Ctrl-s
+ 84 : 116, // Ctrl-t
+ 85 : 117, // Ctrl-u
+ 86 : 118, // Ctrl-v
+ 87 : 119, // Ctrl-w
+ 88 : 120, // Ctrl-x
+ 89 : 121, // Ctrl-y
+ 90 : 122, // Ctrl-z
+ // The following may not all work using non-US keyboard layouts
+ 32 : 0x0020, // Ctrl-SPACE
+ 50 : 0x0040, // Ctrl-@
+ 219 : 0x005B, // Ctrl-[
+ 220 : 0x005C, // Ctrl-\
+ 221 : 0x005D, // Ctrl-]
+ 94 : 0x005E, // Ctrl-^
+ 95 : 0x005F // Ctrl-_
+ },
+
+ //
+ // Browser keypress to X11 keysym for Unicode characters > U+00FF
+ //
+ unicodeTable : {
+ 0x0104 : 0x01A1,
+ 0x02D8 : 0x01A2,
+ 0x0141 : 0x01A3,
+ 0x013D : 0x01A5,
+ 0x015A : 0x01A6,
+ 0x0160 : 0x01A9,
+ 0x015E : 0x01AA,
+ 0x0164 : 0x01AB,
+ 0x0179 : 0x01AC,
+ 0x017D : 0x01AE,
+ 0x017B : 0x01AF,
+ 0x0105 : 0x01B1,
+ 0x02DB : 0x01B2,
+ 0x0142 : 0x01B3,
+ 0x013E : 0x01B5,
+ 0x015B : 0x01B6,
+ 0x02C7 : 0x01B7,
+ 0x0161 : 0x01B9,
+ 0x015F : 0x01BA,
+ 0x0165 : 0x01BB,
+ 0x017A : 0x01BC,
+ 0x02DD : 0x01BD,
+ 0x017E : 0x01BE,
+ 0x017C : 0x01BF,
+ 0x0154 : 0x01C0,
+ 0x0102 : 0x01C3,
+ 0x0139 : 0x01C5,
+ 0x0106 : 0x01C6,
+ 0x010C : 0x01C8,
+ 0x0118 : 0x01CA,
+ 0x011A : 0x01CC,
+ 0x010E : 0x01CF,
+ 0x0110 : 0x01D0,
+ 0x0143 : 0x01D1,
+ 0x0147 : 0x01D2,
+ 0x0150 : 0x01D5,
+ 0x0158 : 0x01D8,
+ 0x016E : 0x01D9,
+ 0x0170 : 0x01DB,
+ 0x0162 : 0x01DE,
+ 0x0155 : 0x01E0,
+ 0x0103 : 0x01E3,
+ 0x013A : 0x01E5,
+ 0x0107 : 0x01E6,
+ 0x010D : 0x01E8,
+ 0x0119 : 0x01EA,
+ 0x011B : 0x01EC,
+ 0x010F : 0x01EF,
+ 0x0111 : 0x01F0,
+ 0x0144 : 0x01F1,
+ 0x0148 : 0x01F2,
+ 0x0151 : 0x01F5,
+ 0x0171 : 0x01FB,
+ 0x0159 : 0x01F8,
+ 0x016F : 0x01F9,
+ 0x0163 : 0x01FE,
+ 0x02D9 : 0x01FF,
+ 0x0126 : 0x02A1,
+ 0x0124 : 0x02A6,
+ 0x0130 : 0x02A9,
+ 0x011E : 0x02AB,
+ 0x0134 : 0x02AC,
+ 0x0127 : 0x02B1,
+ 0x0125 : 0x02B6,
+ 0x0131 : 0x02B9,
+ 0x011F : 0x02BB,
+ 0x0135 : 0x02BC,
+ 0x010A : 0x02C5,
+ 0x0108 : 0x02C6,
+ 0x0120 : 0x02D5,
+ 0x011C : 0x02D8,
+ 0x016C : 0x02DD,
+ 0x015C : 0x02DE,
+ 0x010B : 0x02E5,
+ 0x0109 : 0x02E6,
+ 0x0121 : 0x02F5,
+ 0x011D : 0x02F8,
+ 0x016D : 0x02FD,
+ 0x015D : 0x02FE,
+ 0x0138 : 0x03A2,
+ 0x0156 : 0x03A3,
+ 0x0128 : 0x03A5,
+ 0x013B : 0x03A6,
+ 0x0112 : 0x03AA,
+ 0x0122 : 0x03AB,
+ 0x0166 : 0x03AC,
+ 0x0157 : 0x03B3,
+ 0x0129 : 0x03B5,
+ 0x013C : 0x03B6,
+ 0x0113 : 0x03BA,
+ 0x0123 : 0x03BB,
+ 0x0167 : 0x03BC,
+ 0x014A : 0x03BD,
+ 0x014B : 0x03BF,
+ 0x0100 : 0x03C0,
+ 0x012E : 0x03C7,
+ 0x0116 : 0x03CC,
+ 0x012A : 0x03CF,
+ 0x0145 : 0x03D1,
+ 0x014C : 0x03D2,
+ 0x0136 : 0x03D3,
+ 0x0172 : 0x03D9,
+ 0x0168 : 0x03DD,
+ 0x016A : 0x03DE,
+ 0x0101 : 0x03E0,
+ 0x012F : 0x03E7,
+ 0x0117 : 0x03EC,
+ 0x012B : 0x03EF,
+ 0x0146 : 0x03F1,
+ 0x014D : 0x03F2,
+ 0x0137 : 0x03F3,
+ 0x0173 : 0x03F9,
+ 0x0169 : 0x03FD,
+ 0x016B : 0x03FE,
+ 0x1E02 : 0x1001E02,
+ 0x1E03 : 0x1001E03,
+ 0x1E0A : 0x1001E0A,
+ 0x1E80 : 0x1001E80,
+ 0x1E82 : 0x1001E82,
+ 0x1E0B : 0x1001E0B,
+ 0x1EF2 : 0x1001EF2,
+ 0x1E1E : 0x1001E1E,
+ 0x1E1F : 0x1001E1F,
+ 0x1E40 : 0x1001E40,
+ 0x1E41 : 0x1001E41,
+ 0x1E56 : 0x1001E56,
+ 0x1E81 : 0x1001E81,
+ 0x1E57 : 0x1001E57,
+ 0x1E83 : 0x1001E83,
+ 0x1E60 : 0x1001E60,
+ 0x1EF3 : 0x1001EF3,
+ 0x1E84 : 0x1001E84,
+ 0x1E85 : 0x1001E85,
+ 0x1E61 : 0x1001E61,
+ 0x0174 : 0x1000174,
+ 0x1E6A : 0x1001E6A,
+ 0x0176 : 0x1000176,
+ 0x0175 : 0x1000175,
+ 0x1E6B : 0x1001E6B,
+ 0x0177 : 0x1000177,
+ 0x0152 : 0x13BC,
+ 0x0153 : 0x13BD,
+ 0x0178 : 0x13BE,
+ 0x203E : 0x047E,
+ 0x3002 : 0x04A1,
+ 0x300C : 0x04A2,
+ 0x300D : 0x04A3,
+ 0x3001 : 0x04A4,
+ 0x30FB : 0x04A5,
+ 0x30F2 : 0x04A6,
+ 0x30A1 : 0x04A7,
+ 0x30A3 : 0x04A8,
+ 0x30A5 : 0x04A9,
+ 0x30A7 : 0x04AA,
+ 0x30A9 : 0x04AB,
+ 0x30E3 : 0x04AC,
+ 0x30E5 : 0x04AD,
+ 0x30E7 : 0x04AE,
+ 0x30C3 : 0x04AF,
+ 0x30FC : 0x04B0,
+ 0x30A2 : 0x04B1,
+ 0x30A4 : 0x04B2,
+ 0x30A6 : 0x04B3,
+ 0x30A8 : 0x04B4,
+ 0x30AA : 0x04B5,
+ 0x30AB : 0x04B6,
+ 0x30AD : 0x04B7,
+ 0x30AF : 0x04B8,
+ 0x30B1 : 0x04B9,
+ 0x30B3 : 0x04BA,
+ 0x30B5 : 0x04BB,
+ 0x30B7 : 0x04BC,
+ 0x30B9 : 0x04BD,
+ 0x30BB : 0x04BE,
+ 0x30BD : 0x04BF,
+ 0x30BF : 0x04C0,
+ 0x30C1 : 0x04C1,
+ 0x30C4 : 0x04C2,
+ 0x30C6 : 0x04C3,
+ 0x30C8 : 0x04C4,
+ 0x30CA : 0x04C5,
+ 0x30CB : 0x04C6,
+ 0x30CC : 0x04C7,
+ 0x30CD : 0x04C8,
+ 0x30CE : 0x04C9,
+ 0x30CF : 0x04CA,
+ 0x30D2 : 0x04CB,
+ 0x30D5 : 0x04CC,
+ 0x30D8 : 0x04CD,
+ 0x30DB : 0x04CE,
+ 0x30DE : 0x04CF,
+ 0x30DF : 0x04D0,
+ 0x30E0 : 0x04D1,
+ 0x30E1 : 0x04D2,
+ 0x30E2 : 0x04D3,
+ 0x30E4 : 0x04D4,
+ 0x30E6 : 0x04D5,
+ 0x30E8 : 0x04D6,
+ 0x30E9 : 0x04D7,
+ 0x30EA : 0x04D8,
+ 0x30EB : 0x04D9,
+ 0x30EC : 0x04DA,
+ 0x30ED : 0x04DB,
+ 0x30EF : 0x04DC,
+ 0x30F3 : 0x04DD,
+ 0x309B : 0x04DE,
+ 0x309C : 0x04DF,
+ 0x06F0 : 0x10006F0,
+ 0x06F1 : 0x10006F1,
+ 0x06F2 : 0x10006F2,
+ 0x06F3 : 0x10006F3,
+ 0x06F4 : 0x10006F4,
+ 0x06F5 : 0x10006F5,
+ 0x06F6 : 0x10006F6,
+ 0x06F7 : 0x10006F7,
+ 0x06F8 : 0x10006F8,
+ 0x06F9 : 0x10006F9,
+ 0x066A : 0x100066A,
+ 0x0670 : 0x1000670,
+ 0x0679 : 0x1000679,
+ 0x067E : 0x100067E,
+ 0x0686 : 0x1000686,
+ 0x0688 : 0x1000688,
+ 0x0691 : 0x1000691,
+ 0x060C : 0x05AC,
+ 0x06D4 : 0x10006D4,
+ 0x0660 : 0x1000660,
+ 0x0661 : 0x1000661,
+ 0x0662 : 0x1000662,
+ 0x0663 : 0x1000663,
+ 0x0664 : 0x1000664,
+ 0x0665 : 0x1000665,
+ 0x0666 : 0x1000666,
+ 0x0667 : 0x1000667,
+ 0x0668 : 0x1000668,
+ 0x0669 : 0x1000669,
+ 0x061B : 0x05BB,
+ 0x061F : 0x05BF,
+ 0x0621 : 0x05C1,
+ 0x0622 : 0x05C2,
+ 0x0623 : 0x05C3,
+ 0x0624 : 0x05C4,
+ 0x0625 : 0x05C5,
+ 0x0626 : 0x05C6,
+ 0x0627 : 0x05C7,
+ 0x0628 : 0x05C8,
+ 0x0629 : 0x05C9,
+ 0x062A : 0x05CA,
+ 0x062B : 0x05CB,
+ 0x062C : 0x05CC,
+ 0x062D : 0x05CD,
+ 0x062E : 0x05CE,
+ 0x062F : 0x05CF,
+ 0x0630 : 0x05D0,
+ 0x0631 : 0x05D1,
+ 0x0632 : 0x05D2,
+ 0x0633 : 0x05D3,
+ 0x0634 : 0x05D4,
+ 0x0635 : 0x05D5,
+ 0x0636 : 0x05D6,
+ 0x0637 : 0x05D7,
+ 0x0638 : 0x05D8,
+ 0x0639 : 0x05D9,
+ 0x063A : 0x05DA,
+ 0x0640 : 0x05E0,
+ 0x0641 : 0x05E1,
+ 0x0642 : 0x05E2,
+ 0x0643 : 0x05E3,
+ 0x0644 : 0x05E4,
+ 0x0645 : 0x05E5,
+ 0x0646 : 0x05E6,
+ 0x0647 : 0x05E7,
+ 0x0648 : 0x05E8,
+ 0x0649 : 0x05E9,
+ 0x064A : 0x05EA,
+ 0x064B : 0x05EB,
+ 0x064C : 0x05EC,
+ 0x064D : 0x05ED,
+ 0x064E : 0x05EE,
+ 0x064F : 0x05EF,
+ 0x0650 : 0x05F0,
+ 0x0651 : 0x05F1,
+ 0x0652 : 0x05F2,
+ 0x0653 : 0x1000653,
+ 0x0654 : 0x1000654,
+ 0x0655 : 0x1000655,
+ 0x0698 : 0x1000698,
+ 0x06A4 : 0x10006A4,
+ 0x06A9 : 0x10006A9,
+ 0x06AF : 0x10006AF,
+ 0x06BA : 0x10006BA,
+ 0x06BE : 0x10006BE,
+ 0x06CC : 0x10006CC,
+ 0x06D2 : 0x10006D2,
+ 0x06C1 : 0x10006C1,
+ 0x0492 : 0x1000492,
+ 0x0493 : 0x1000493,
+ 0x0496 : 0x1000496,
+ 0x0497 : 0x1000497,
+ 0x049A : 0x100049A,
+ 0x049B : 0x100049B,
+ 0x049C : 0x100049C,
+ 0x049D : 0x100049D,
+ 0x04A2 : 0x10004A2,
+ 0x04A3 : 0x10004A3,
+ 0x04AE : 0x10004AE,
+ 0x04AF : 0x10004AF,
+ 0x04B0 : 0x10004B0,
+ 0x04B1 : 0x10004B1,
+ 0x04B2 : 0x10004B2,
+ 0x04B3 : 0x10004B3,
+ 0x04B6 : 0x10004B6,
+ 0x04B7 : 0x10004B7,
+ 0x04B8 : 0x10004B8,
+ 0x04B9 : 0x10004B9,
+ 0x04BA : 0x10004BA,
+ 0x04BB : 0x10004BB,
+ 0x04D8 : 0x10004D8,
+ 0x04D9 : 0x10004D9,
+ 0x04E2 : 0x10004E2,
+ 0x04E3 : 0x10004E3,
+ 0x04E8 : 0x10004E8,
+ 0x04E9 : 0x10004E9,
+ 0x04EE : 0x10004EE,
+ 0x04EF : 0x10004EF,
+ 0x0452 : 0x06A1,
+ 0x0453 : 0x06A2,
+ 0x0451 : 0x06A3,
+ 0x0454 : 0x06A4,
+ 0x0455 : 0x06A5,
+ 0x0456 : 0x06A6,
+ 0x0457 : 0x06A7,
+ 0x0458 : 0x06A8,
+ 0x0459 : 0x06A9,
+ 0x045A : 0x06AA,
+ 0x045B : 0x06AB,
+ 0x045C : 0x06AC,
+ 0x0491 : 0x06AD,
+ 0x045E : 0x06AE,
+ 0x045F : 0x06AF,
+ 0x2116 : 0x06B0,
+ 0x0402 : 0x06B1,
+ 0x0403 : 0x06B2,
+ 0x0401 : 0x06B3,
+ 0x0404 : 0x06B4,
+ 0x0405 : 0x06B5,
+ 0x0406 : 0x06B6,
+ 0x0407 : 0x06B7,
+ 0x0408 : 0x06B8,
+ 0x0409 : 0x06B9,
+ 0x040A : 0x06BA,
+ 0x040B : 0x06BB,
+ 0x040C : 0x06BC,
+ 0x0490 : 0x06BD,
+ 0x040E : 0x06BE,
+ 0x040F : 0x06BF,
+ 0x044E : 0x06C0,
+ 0x0430 : 0x06C1,
+ 0x0431 : 0x06C2,
+ 0x0446 : 0x06C3,
+ 0x0434 : 0x06C4,
+ 0x0435 : 0x06C5,
+ 0x0444 : 0x06C6,
+ 0x0433 : 0x06C7,
+ 0x0445 : 0x06C8,
+ 0x0438 : 0x06C9,
+ 0x0439 : 0x06CA,
+ 0x043A : 0x06CB,
+ 0x043B : 0x06CC,
+ 0x043C : 0x06CD,
+ 0x043D : 0x06CE,
+ 0x043E : 0x06CF,
+ 0x043F : 0x06D0,
+ 0x044F : 0x06D1,
+ 0x0440 : 0x06D2,
+ 0x0441 : 0x06D3,
+ 0x0442 : 0x06D4,
+ 0x0443 : 0x06D5,
+ 0x0436 : 0x06D6,
+ 0x0432 : 0x06D7,
+ 0x044C : 0x06D8,
+ 0x044B : 0x06D9,
+ 0x0437 : 0x06DA,
+ 0x0448 : 0x06DB,
+ 0x044D : 0x06DC,
+ 0x0449 : 0x06DD,
+ 0x0447 : 0x06DE,
+ 0x044A : 0x06DF,
+ 0x042E : 0x06E0,
+ 0x0410 : 0x06E1,
+ 0x0411 : 0x06E2,
+ 0x0426 : 0x06E3,
+ 0x0414 : 0x06E4,
+ 0x0415 : 0x06E5,
+ 0x0424 : 0x06E6,
+ 0x0413 : 0x06E7,
+ 0x0425 : 0x06E8,
+ 0x0418 : 0x06E9,
+ 0x0419 : 0x06EA,
+ 0x041A : 0x06EB,
+ 0x041B : 0x06EC,
+ 0x041C : 0x06ED,
+ 0x041D : 0x06EE,
+ 0x041E : 0x06EF,
+ 0x041F : 0x06F0,
+ 0x042F : 0x06F1,
+ 0x0420 : 0x06F2,
+ 0x0421 : 0x06F3,
+ 0x0422 : 0x06F4,
+ 0x0423 : 0x06F5,
+ 0x0416 : 0x06F6,
+ 0x0412 : 0x06F7,
+ 0x042C : 0x06F8,
+ 0x042B : 0x06F9,
+ 0x0417 : 0x06FA,
+ 0x0428 : 0x06FB,
+ 0x042D : 0x06FC,
+ 0x0429 : 0x06FD,
+ 0x0427 : 0x06FE,
+ 0x042A : 0x06FF,
+ 0x0386 : 0x07A1,
+ 0x0388 : 0x07A2,
+ 0x0389 : 0x07A3,
+ 0x038A : 0x07A4,
+ 0x03AA : 0x07A5,
+ 0x038C : 0x07A7,
+ 0x038E : 0x07A8,
+ 0x03AB : 0x07A9,
+ 0x038F : 0x07AB,
+ 0x0385 : 0x07AE,
+ 0x2015 : 0x07AF,
+ 0x03AC : 0x07B1,
+ 0x03AD : 0x07B2,
+ 0x03AE : 0x07B3,
+ 0x03AF : 0x07B4,
+ 0x03CA : 0x07B5,
+ 0x0390 : 0x07B6,
+ 0x03CC : 0x07B7,
+ 0x03CD : 0x07B8,
+ 0x03CB : 0x07B9,
+ 0x03B0 : 0x07BA,
+ 0x03CE : 0x07BB,
+ 0x0391 : 0x07C1,
+ 0x0392 : 0x07C2,
+ 0x0393 : 0x07C3,
+ 0x0394 : 0x07C4,
+ 0x0395 : 0x07C5,
+ 0x0396 : 0x07C6,
+ 0x0397 : 0x07C7,
+ 0x0398 : 0x07C8,
+ 0x0399 : 0x07C9,
+ 0x039A : 0x07CA,
+ 0x039B : 0x07CB,
+ 0x039C : 0x07CC,
+ 0x039D : 0x07CD,
+ 0x039E : 0x07CE,
+ 0x039F : 0x07CF,
+ 0x03A0 : 0x07D0,
+ 0x03A1 : 0x07D1,
+ 0x03A3 : 0x07D2,
+ 0x03A4 : 0x07D4,
+ 0x03A5 : 0x07D5,
+ 0x03A6 : 0x07D6,
+ 0x03A7 : 0x07D7,
+ 0x03A8 : 0x07D8,
+ 0x03A9 : 0x07D9,
+ 0x03B1 : 0x07E1,
+ 0x03B2 : 0x07E2,
+ 0x03B3 : 0x07E3,
+ 0x03B4 : 0x07E4,
+ 0x03B5 : 0x07E5,
+ 0x03B6 : 0x07E6,
+ 0x03B7 : 0x07E7,
+ 0x03B8 : 0x07E8,
+ 0x03B9 : 0x07E9,
+ 0x03BA : 0x07EA,
+ 0x03BB : 0x07EB,
+ 0x03BC : 0x07EC,
+ 0x03BD : 0x07ED,
+ 0x03BE : 0x07EE,
+ 0x03BF : 0x07EF,
+ 0x03C0 : 0x07F0,
+ 0x03C1 : 0x07F1,
+ 0x03C3 : 0x07F2,
+ 0x03C2 : 0x07F3,
+ 0x03C4 : 0x07F4,
+ 0x03C5 : 0x07F5,
+ 0x03C6 : 0x07F6,
+ 0x03C7 : 0x07F7,
+ 0x03C8 : 0x07F8,
+ 0x03C9 : 0x07F9,
+ 0x23B7 : 0x08A1,
+ 0x2320 : 0x08A4,
+ 0x2321 : 0x08A5,
+ 0x23A1 : 0x08A7,
+ 0x23A3 : 0x08A8,
+ 0x23A4 : 0x08A9,
+ 0x23A6 : 0x08AA,
+ 0x239B : 0x08AB,
+ 0x239D : 0x08AC,
+ 0x239E : 0x08AD,
+ 0x23A0 : 0x08AE,
+ 0x23A8 : 0x08AF,
+ 0x23AC : 0x08B0,
+ 0x2264 : 0x08BC,
+ 0x2260 : 0x08BD,
+ 0x2265 : 0x08BE,
+ 0x222B : 0x08BF,
+ 0x2234 : 0x08C0,
+ 0x221D : 0x08C1,
+ 0x221E : 0x08C2,
+ 0x2207 : 0x08C5,
+ 0x223C : 0x08C8,
+ 0x2243 : 0x08C9,
+ 0x21D4 : 0x08CD,
+ 0x21D2 : 0x08CE,
+ 0x2261 : 0x08CF,
+ 0x221A : 0x08D6,
+ 0x2282 : 0x08DA,
+ 0x2283 : 0x08DB,
+ 0x2229 : 0x08DC,
+ 0x222A : 0x08DD,
+ 0x2227 : 0x08DE,
+ 0x2228 : 0x08DF,
+ 0x2202 : 0x08EF,
+ 0x0192 : 0x08F6,
+ 0x2190 : 0x08FB,
+ 0x2191 : 0x08FC,
+ 0x2192 : 0x08FD,
+ 0x2193 : 0x08FE,
+ 0x25C6 : 0x09E0,
+ 0x2592 : 0x09E1,
+ 0x2409 : 0x09E2,
+ 0x240C : 0x09E3,
+ 0x240D : 0x09E4,
+ 0x240A : 0x09E5,
+ 0x2424 : 0x09E8,
+ 0x240B : 0x09E9,
+ 0x2518 : 0x09EA,
+ 0x2510 : 0x09EB,
+ 0x250C : 0x09EC,
+ 0x2514 : 0x09ED,
+ 0x253C : 0x09EE,
+ 0x23BA : 0x09EF,
+ 0x23BB : 0x09F0,
+ 0x2500 : 0x09F1,
+ 0x23BC : 0x09F2,
+ 0x23BD : 0x09F3,
+ 0x251C : 0x09F4,
+ 0x2524 : 0x09F5,
+ 0x2534 : 0x09F6,
+ 0x252C : 0x09F7,
+ 0x2502 : 0x09F8,
+ 0x2003 : 0x0AA1,
+ 0x2002 : 0x0AA2,
+ 0x2004 : 0x0AA3,
+ 0x2005 : 0x0AA4,
+ 0x2007 : 0x0AA5,
+ 0x2008 : 0x0AA6,
+ 0x2009 : 0x0AA7,
+ 0x200A : 0x0AA8,
+ 0x2014 : 0x0AA9,
+ 0x2013 : 0x0AAA,
+ 0x2026 : 0x0AAE,
+ 0x2025 : 0x0AAF,
+ 0x2153 : 0x0AB0,
+ 0x2154 : 0x0AB1,
+ 0x2155 : 0x0AB2,
+ 0x2156 : 0x0AB3,
+ 0x2157 : 0x0AB4,
+ 0x2158 : 0x0AB5,
+ 0x2159 : 0x0AB6,
+ 0x215A : 0x0AB7,
+ 0x2105 : 0x0AB8,
+ 0x2012 : 0x0ABB,
+ 0x215B : 0x0AC3,
+ 0x215C : 0x0AC4,
+ 0x215D : 0x0AC5,
+ 0x215E : 0x0AC6,
+ 0x2122 : 0x0AC9,
+ 0x2018 : 0x0AD0,
+ 0x2019 : 0x0AD1,
+ 0x201C : 0x0AD2,
+ 0x201D : 0x0AD3,
+ 0x211E : 0x0AD4,
+ 0x2032 : 0x0AD6,
+ 0x2033 : 0x0AD7,
+ 0x271D : 0x0AD9,
+ 0x2663 : 0x0AEC,
+ 0x2666 : 0x0AED,
+ 0x2665 : 0x0AEE,
+ 0x2720 : 0x0AF0,
+ 0x2020 : 0x0AF1,
+ 0x2021 : 0x0AF2,
+ 0x2713 : 0x0AF3,
+ 0x2717 : 0x0AF4,
+ 0x266F : 0x0AF5,
+ 0x266D : 0x0AF6,
+ 0x2642 : 0x0AF7,
+ 0x2640 : 0x0AF8,
+ 0x260E : 0x0AF9,
+ 0x2315 : 0x0AFA,
+ 0x2117 : 0x0AFB,
+ 0x2038 : 0x0AFC,
+ 0x201A : 0x0AFD,
+ 0x201E : 0x0AFE,
+ 0x22A4 : 0x0BC2,
+ 0x230A : 0x0BC4,
+ 0x2218 : 0x0BCA,
+ 0x2395 : 0x0BCC,
+ 0x22A5 : 0x0BCE,
+ 0x25CB : 0x0BCF,
+ 0x2308 : 0x0BD3,
+ 0x22A3 : 0x0BDC,
+ 0x22A2 : 0x0BFC,
+ 0x2017 : 0x0CDF,
+ 0x05D0 : 0x0CE0,
+ 0x05D1 : 0x0CE1,
+ 0x05D2 : 0x0CE2,
+ 0x05D3 : 0x0CE3,
+ 0x05D4 : 0x0CE4,
+ 0x05D5 : 0x0CE5,
+ 0x05D6 : 0x0CE6,
+ 0x05D7 : 0x0CE7,
+ 0x05D8 : 0x0CE8,
+ 0x05D9 : 0x0CE9,
+ 0x05DA : 0x0CEA,
+ 0x05DB : 0x0CEB,
+ 0x05DC : 0x0CEC,
+ 0x05DD : 0x0CED,
+ 0x05DE : 0x0CEE,
+ 0x05DF : 0x0CEF,
+ 0x05E0 : 0x0CF0,
+ 0x05E1 : 0x0CF1,
+ 0x05E2 : 0x0CF2,
+ 0x05E3 : 0x0CF3,
+ 0x05E4 : 0x0CF4,
+ 0x05E5 : 0x0CF5,
+ 0x05E6 : 0x0CF6,
+ 0x05E7 : 0x0CF7,
+ 0x05E8 : 0x0CF8,
+ 0x05E9 : 0x0CF9,
+ 0x05EA : 0x0CFA,
+ 0x0E01 : 0x0DA1,
+ 0x0E02 : 0x0DA2,
+ 0x0E03 : 0x0DA3,
+ 0x0E04 : 0x0DA4,
+ 0x0E05 : 0x0DA5,
+ 0x0E06 : 0x0DA6,
+ 0x0E07 : 0x0DA7,
+ 0x0E08 : 0x0DA8,
+ 0x0E09 : 0x0DA9,
+ 0x0E0A : 0x0DAA,
+ 0x0E0B : 0x0DAB,
+ 0x0E0C : 0x0DAC,
+ 0x0E0D : 0x0DAD,
+ 0x0E0E : 0x0DAE,
+ 0x0E0F : 0x0DAF,
+ 0x0E10 : 0x0DB0,
+ 0x0E11 : 0x0DB1,
+ 0x0E12 : 0x0DB2,
+ 0x0E13 : 0x0DB3,
+ 0x0E14 : 0x0DB4,
+ 0x0E15 : 0x0DB5,
+ 0x0E16 : 0x0DB6,
+ 0x0E17 : 0x0DB7,
+ 0x0E18 : 0x0DB8,
+ 0x0E19 : 0x0DB9,
+ 0x0E1A : 0x0DBA,
+ 0x0E1B : 0x0DBB,
+ 0x0E1C : 0x0DBC,
+ 0x0E1D : 0x0DBD,
+ 0x0E1E : 0x0DBE,
+ 0x0E1F : 0x0DBF,
+ 0x0E20 : 0x0DC0,
+ 0x0E21 : 0x0DC1,
+ 0x0E22 : 0x0DC2,
+ 0x0E23 : 0x0DC3,
+ 0x0E24 : 0x0DC4,
+ 0x0E25 : 0x0DC5,
+ 0x0E26 : 0x0DC6,
+ 0x0E27 : 0x0DC7,
+ 0x0E28 : 0x0DC8,
+ 0x0E29 : 0x0DC9,
+ 0x0E2A : 0x0DCA,
+ 0x0E2B : 0x0DCB,
+ 0x0E2C : 0x0DCC,
+ 0x0E2D : 0x0DCD,
+ 0x0E2E : 0x0DCE,
+ 0x0E2F : 0x0DCF,
+ 0x0E30 : 0x0DD0,
+ 0x0E31 : 0x0DD1,
+ 0x0E32 : 0x0DD2,
+ 0x0E33 : 0x0DD3,
+ 0x0E34 : 0x0DD4,
+ 0x0E35 : 0x0DD5,
+ 0x0E36 : 0x0DD6,
+ 0x0E37 : 0x0DD7,
+ 0x0E38 : 0x0DD8,
+ 0x0E39 : 0x0DD9,
+ 0x0E3A : 0x0DDA,
+ 0x0E3F : 0x0DDF,
+ 0x0E40 : 0x0DE0,
+ 0x0E41 : 0x0DE1,
+ 0x0E42 : 0x0DE2,
+ 0x0E43 : 0x0DE3,
+ 0x0E44 : 0x0DE4,
+ 0x0E45 : 0x0DE5,
+ 0x0E46 : 0x0DE6,
+ 0x0E47 : 0x0DE7,
+ 0x0E48 : 0x0DE8,
+ 0x0E49 : 0x0DE9,
+ 0x0E4A : 0x0DEA,
+ 0x0E4B : 0x0DEB,
+ 0x0E4C : 0x0DEC,
+ 0x0E4D : 0x0DED,
+ 0x0E50 : 0x0DF0,
+ 0x0E51 : 0x0DF1,
+ 0x0E52 : 0x0DF2,
+ 0x0E53 : 0x0DF3,
+ 0x0E54 : 0x0DF4,
+ 0x0E55 : 0x0DF5,
+ 0x0E56 : 0x0DF6,
+ 0x0E57 : 0x0DF7,
+ 0x0E58 : 0x0DF8,
+ 0x0E59 : 0x0DF9,
+ 0x0587 : 0x1000587,
+ 0x0589 : 0x1000589,
+ 0x055D : 0x100055D,
+ 0x058A : 0x100058A,
+ 0x055C : 0x100055C,
+ 0x055B : 0x100055B,
+ 0x055E : 0x100055E,
+ 0x0531 : 0x1000531,
+ 0x0561 : 0x1000561,
+ 0x0532 : 0x1000532,
+ 0x0562 : 0x1000562,
+ 0x0533 : 0x1000533,
+ 0x0563 : 0x1000563,
+ 0x0534 : 0x1000534,
+ 0x0564 : 0x1000564,
+ 0x0535 : 0x1000535,
+ 0x0565 : 0x1000565,
+ 0x0536 : 0x1000536,
+ 0x0566 : 0x1000566,
+ 0x0537 : 0x1000537,
+ 0x0567 : 0x1000567,
+ 0x0538 : 0x1000538,
+ 0x0568 : 0x1000568,
+ 0x0539 : 0x1000539,
+ 0x0569 : 0x1000569,
+ 0x053A : 0x100053A,
+ 0x056A : 0x100056A,
+ 0x053B : 0x100053B,
+ 0x056B : 0x100056B,
+ 0x053C : 0x100053C,
+ 0x056C : 0x100056C,
+ 0x053D : 0x100053D,
+ 0x056D : 0x100056D,
+ 0x053E : 0x100053E,
+ 0x056E : 0x100056E,
+ 0x053F : 0x100053F,
+ 0x056F : 0x100056F,
+ 0x0540 : 0x1000540,
+ 0x0570 : 0x1000570,
+ 0x0541 : 0x1000541,
+ 0x0571 : 0x1000571,
+ 0x0542 : 0x1000542,
+ 0x0572 : 0x1000572,
+ 0x0543 : 0x1000543,
+ 0x0573 : 0x1000573,
+ 0x0544 : 0x1000544,
+ 0x0574 : 0x1000574,
+ 0x0545 : 0x1000545,
+ 0x0575 : 0x1000575,
+ 0x0546 : 0x1000546,
+ 0x0576 : 0x1000576,
+ 0x0547 : 0x1000547,
+ 0x0577 : 0x1000577,
+ 0x0548 : 0x1000548,
+ 0x0578 : 0x1000578,
+ 0x0549 : 0x1000549,
+ 0x0579 : 0x1000579,
+ 0x054A : 0x100054A,
+ 0x057A : 0x100057A,
+ 0x054B : 0x100054B,
+ 0x057B : 0x100057B,
+ 0x054C : 0x100054C,
+ 0x057C : 0x100057C,
+ 0x054D : 0x100054D,
+ 0x057D : 0x100057D,
+ 0x054E : 0x100054E,
+ 0x057E : 0x100057E,
+ 0x054F : 0x100054F,
+ 0x057F : 0x100057F,
+ 0x0550 : 0x1000550,
+ 0x0580 : 0x1000580,
+ 0x0551 : 0x1000551,
+ 0x0581 : 0x1000581,
+ 0x0552 : 0x1000552,
+ 0x0582 : 0x1000582,
+ 0x0553 : 0x1000553,
+ 0x0583 : 0x1000583,
+ 0x0554 : 0x1000554,
+ 0x0584 : 0x1000584,
+ 0x0555 : 0x1000555,
+ 0x0585 : 0x1000585,
+ 0x0556 : 0x1000556,
+ 0x0586 : 0x1000586,
+ 0x055A : 0x100055A,
+ 0x10D0 : 0x10010D0,
+ 0x10D1 : 0x10010D1,
+ 0x10D2 : 0x10010D2,
+ 0x10D3 : 0x10010D3,
+ 0x10D4 : 0x10010D4,
+ 0x10D5 : 0x10010D5,
+ 0x10D6 : 0x10010D6,
+ 0x10D7 : 0x10010D7,
+ 0x10D8 : 0x10010D8,
+ 0x10D9 : 0x10010D9,
+ 0x10DA : 0x10010DA,
+ 0x10DB : 0x10010DB,
+ 0x10DC : 0x10010DC,
+ 0x10DD : 0x10010DD,
+ 0x10DE : 0x10010DE,
+ 0x10DF : 0x10010DF,
+ 0x10E0 : 0x10010E0,
+ 0x10E1 : 0x10010E1,
+ 0x10E2 : 0x10010E2,
+ 0x10E3 : 0x10010E3,
+ 0x10E4 : 0x10010E4,
+ 0x10E5 : 0x10010E5,
+ 0x10E6 : 0x10010E6,
+ 0x10E7 : 0x10010E7,
+ 0x10E8 : 0x10010E8,
+ 0x10E9 : 0x10010E9,
+ 0x10EA : 0x10010EA,
+ 0x10EB : 0x10010EB,
+ 0x10EC : 0x10010EC,
+ 0x10ED : 0x10010ED,
+ 0x10EE : 0x10010EE,
+ 0x10EF : 0x10010EF,
+ 0x10F0 : 0x10010F0,
+ 0x10F1 : 0x10010F1,
+ 0x10F2 : 0x10010F2,
+ 0x10F3 : 0x10010F3,
+ 0x10F4 : 0x10010F4,
+ 0x10F5 : 0x10010F5,
+ 0x10F6 : 0x10010F6,
+ 0x1E8A : 0x1001E8A,
+ 0x012C : 0x100012C,
+ 0x01B5 : 0x10001B5,
+ 0x01E6 : 0x10001E6,
+ 0x019F : 0x100019F,
+ 0x1E8B : 0x1001E8B,
+ 0x012D : 0x100012D,
+ 0x01B6 : 0x10001B6,
+ 0x01E7 : 0x10001E7,
+ 0x01D2 : 0x10001D2,
+ 0x0275 : 0x1000275,
+ 0x018F : 0x100018F,
+ 0x0259 : 0x1000259,
+ 0x1E36 : 0x1001E36,
+ 0x1E37 : 0x1001E37,
+ 0x1EA0 : 0x1001EA0,
+ 0x1EA1 : 0x1001EA1,
+ 0x1EA2 : 0x1001EA2,
+ 0x1EA3 : 0x1001EA3,
+ 0x1EA4 : 0x1001EA4,
+ 0x1EA5 : 0x1001EA5,
+ 0x1EA6 : 0x1001EA6,
+ 0x1EA7 : 0x1001EA7,
+ 0x1EA8 : 0x1001EA8,
+ 0x1EA9 : 0x1001EA9,
+ 0x1EAA : 0x1001EAA,
+ 0x1EAB : 0x1001EAB,
+ 0x1EAC : 0x1001EAC,
+ 0x1EAD : 0x1001EAD,
+ 0x1EAE : 0x1001EAE,
+ 0x1EAF : 0x1001EAF,
+ 0x1EB0 : 0x1001EB0,
+ 0x1EB1 : 0x1001EB1,
+ 0x1EB2 : 0x1001EB2,
+ 0x1EB3 : 0x1001EB3,
+ 0x1EB4 : 0x1001EB4,
+ 0x1EB5 : 0x1001EB5,
+ 0x1EB6 : 0x1001EB6,
+ 0x1EB7 : 0x1001EB7,
+ 0x1EB8 : 0x1001EB8,
+ 0x1EB9 : 0x1001EB9,
+ 0x1EBA : 0x1001EBA,
+ 0x1EBB : 0x1001EBB,
+ 0x1EBC : 0x1001EBC,
+ 0x1EBD : 0x1001EBD,
+ 0x1EBE : 0x1001EBE,
+ 0x1EBF : 0x1001EBF,
+ 0x1EC0 : 0x1001EC0,
+ 0x1EC1 : 0x1001EC1,
+ 0x1EC2 : 0x1001EC2,
+ 0x1EC3 : 0x1001EC3,
+ 0x1EC4 : 0x1001EC4,
+ 0x1EC5 : 0x1001EC5,
+ 0x1EC6 : 0x1001EC6,
+ 0x1EC7 : 0x1001EC7,
+ 0x1EC8 : 0x1001EC8,
+ 0x1EC9 : 0x1001EC9,
+ 0x1ECA : 0x1001ECA,
+ 0x1ECB : 0x1001ECB,
+ 0x1ECC : 0x1001ECC,
+ 0x1ECD : 0x1001ECD,
+ 0x1ECE : 0x1001ECE,
+ 0x1ECF : 0x1001ECF,
+ 0x1ED0 : 0x1001ED0,
+ 0x1ED1 : 0x1001ED1,
+ 0x1ED2 : 0x1001ED2,
+ 0x1ED3 : 0x1001ED3,
+ 0x1ED4 : 0x1001ED4,
+ 0x1ED5 : 0x1001ED5,
+ 0x1ED6 : 0x1001ED6,
+ 0x1ED7 : 0x1001ED7,
+ 0x1ED8 : 0x1001ED8,
+ 0x1ED9 : 0x1001ED9,
+ 0x1EDA : 0x1001EDA,
+ 0x1EDB : 0x1001EDB,
+ 0x1EDC : 0x1001EDC,
+ 0x1EDD : 0x1001EDD,
+ 0x1EDE : 0x1001EDE,
+ 0x1EDF : 0x1001EDF,
+ 0x1EE0 : 0x1001EE0,
+ 0x1EE1 : 0x1001EE1,
+ 0x1EE2 : 0x1001EE2,
+ 0x1EE3 : 0x1001EE3,
+ 0x1EE4 : 0x1001EE4,
+ 0x1EE5 : 0x1001EE5,
+ 0x1EE6 : 0x1001EE6,
+ 0x1EE7 : 0x1001EE7,
+ 0x1EE8 : 0x1001EE8,
+ 0x1EE9 : 0x1001EE9,
+ 0x1EEA : 0x1001EEA,
+ 0x1EEB : 0x1001EEB,
+ 0x1EEC : 0x1001EEC,
+ 0x1EED : 0x1001EED,
+ 0x1EEE : 0x1001EEE,
+ 0x1EEF : 0x1001EEF,
+ 0x1EF0 : 0x1001EF0,
+ 0x1EF1 : 0x1001EF1,
+ 0x1EF4 : 0x1001EF4,
+ 0x1EF5 : 0x1001EF5,
+ 0x1EF6 : 0x1001EF6,
+ 0x1EF7 : 0x1001EF7,
+ 0x1EF8 : 0x1001EF8,
+ 0x1EF9 : 0x1001EF9,
+ 0x01A0 : 0x10001A0,
+ 0x01A1 : 0x10001A1,
+ 0x01AF : 0x10001AF,
+ 0x01B0 : 0x10001B0,
+ 0x20A0 : 0x10020A0,
+ 0x20A1 : 0x10020A1,
+ 0x20A2 : 0x10020A2,
+ 0x20A3 : 0x10020A3,
+ 0x20A4 : 0x10020A4,
+ 0x20A5 : 0x10020A5,
+ 0x20A6 : 0x10020A6,
+ 0x20A7 : 0x10020A7,
+ 0x20A8 : 0x10020A8,
+ 0x20A9 : 0x10020A9,
+ 0x20AA : 0x10020AA,
+ 0x20AB : 0x10020AB,
+ 0x20AC : 0x20AC,
+ 0x2070 : 0x1002070,
+ 0x2074 : 0x1002074,
+ 0x2075 : 0x1002075,
+ 0x2076 : 0x1002076,
+ 0x2077 : 0x1002077,
+ 0x2078 : 0x1002078,
+ 0x2079 : 0x1002079,
+ 0x2080 : 0x1002080,
+ 0x2081 : 0x1002081,
+ 0x2082 : 0x1002082,
+ 0x2083 : 0x1002083,
+ 0x2084 : 0x1002084,
+ 0x2085 : 0x1002085,
+ 0x2086 : 0x1002086,
+ 0x2087 : 0x1002087,
+ 0x2088 : 0x1002088,
+ 0x2089 : 0x1002089,
+ 0x2205 : 0x1002205,
+ 0x2208 : 0x1002208,
+ 0x2209 : 0x1002209,
+ 0x220B : 0x100220B,
+ 0x221B : 0x100221B,
+ 0x221C : 0x100221C,
+ 0x222C : 0x100222C,
+ 0x222D : 0x100222D,
+ 0x2235 : 0x1002235,
+ 0x2245 : 0x1002248,
+ 0x2247 : 0x1002247,
+ 0x2262 : 0x1002262,
+ 0x2263 : 0x1002263,
+ 0x2800 : 0x1002800,
+ 0x2801 : 0x1002801,
+ 0x2802 : 0x1002802,
+ 0x2803 : 0x1002803,
+ 0x2804 : 0x1002804,
+ 0x2805 : 0x1002805,
+ 0x2806 : 0x1002806,
+ 0x2807 : 0x1002807,
+ 0x2808 : 0x1002808,
+ 0x2809 : 0x1002809,
+ 0x280A : 0x100280A,
+ 0x280B : 0x100280B,
+ 0x280C : 0x100280C,
+ 0x280D : 0x100280D,
+ 0x280E : 0x100280E,
+ 0x280F : 0x100280F,
+ 0x2810 : 0x1002810,
+ 0x2811 : 0x1002811,
+ 0x2812 : 0x1002812,
+ 0x2813 : 0x1002813,
+ 0x2814 : 0x1002814,
+ 0x2815 : 0x1002815,
+ 0x2816 : 0x1002816,
+ 0x2817 : 0x1002817,
+ 0x2818 : 0x1002818,
+ 0x2819 : 0x1002819,
+ 0x281A : 0x100281A,
+ 0x281B : 0x100281B,
+ 0x281C : 0x100281C,
+ 0x281D : 0x100281D,
+ 0x281E : 0x100281E,
+ 0x281F : 0x100281F,
+ 0x2820 : 0x1002820,
+ 0x2821 : 0x1002821,
+ 0x2822 : 0x1002822,
+ 0x2823 : 0x1002823,
+ 0x2824 : 0x1002824,
+ 0x2825 : 0x1002825,
+ 0x2826 : 0x1002826,
+ 0x2827 : 0x1002827,
+ 0x2828 : 0x1002828,
+ 0x2829 : 0x1002829,
+ 0x282A : 0x100282A,
+ 0x282B : 0x100282B,
+ 0x282C : 0x100282C,
+ 0x282D : 0x100282D,
+ 0x282E : 0x100282E,
+ 0x282F : 0x100282F,
+ 0x2830 : 0x1002830,
+ 0x2831 : 0x1002831,
+ 0x2832 : 0x1002832,
+ 0x2833 : 0x1002833,
+ 0x2834 : 0x1002834,
+ 0x2835 : 0x1002835,
+ 0x2836 : 0x1002836,
+ 0x2837 : 0x1002837,
+ 0x2838 : 0x1002838,
+ 0x2839 : 0x1002839,
+ 0x283A : 0x100283A,
+ 0x283B : 0x100283B,
+ 0x283C : 0x100283C,
+ 0x283D : 0x100283D,
+ 0x283E : 0x100283E,
+ 0x283F : 0x100283F,
+ 0x2840 : 0x1002840,
+ 0x2841 : 0x1002841,
+ 0x2842 : 0x1002842,
+ 0x2843 : 0x1002843,
+ 0x2844 : 0x1002844,
+ 0x2845 : 0x1002845,
+ 0x2846 : 0x1002846,
+ 0x2847 : 0x1002847,
+ 0x2848 : 0x1002848,
+ 0x2849 : 0x1002849,
+ 0x284A : 0x100284A,
+ 0x284B : 0x100284B,
+ 0x284C : 0x100284C,
+ 0x284D : 0x100284D,
+ 0x284E : 0x100284E,
+ 0x284F : 0x100284F,
+ 0x2850 : 0x1002850,
+ 0x2851 : 0x1002851,
+ 0x2852 : 0x1002852,
+ 0x2853 : 0x1002853,
+ 0x2854 : 0x1002854,
+ 0x2855 : 0x1002855,
+ 0x2856 : 0x1002856,
+ 0x2857 : 0x1002857,
+ 0x2858 : 0x1002858,
+ 0x2859 : 0x1002859,
+ 0x285A : 0x100285A,
+ 0x285B : 0x100285B,
+ 0x285C : 0x100285C,
+ 0x285D : 0x100285D,
+ 0x285E : 0x100285E,
+ 0x285F : 0x100285F,
+ 0x2860 : 0x1002860,
+ 0x2861 : 0x1002861,
+ 0x2862 : 0x1002862,
+ 0x2863 : 0x1002863,
+ 0x2864 : 0x1002864,
+ 0x2865 : 0x1002865,
+ 0x2866 : 0x1002866,
+ 0x2867 : 0x1002867,
+ 0x2868 : 0x1002868,
+ 0x2869 : 0x1002869,
+ 0x286A : 0x100286A,
+ 0x286B : 0x100286B,
+ 0x286C : 0x100286C,
+ 0x286D : 0x100286D,
+ 0x286E : 0x100286E,
+ 0x286F : 0x100286F,
+ 0x2870 : 0x1002870,
+ 0x2871 : 0x1002871,
+ 0x2872 : 0x1002872,
+ 0x2873 : 0x1002873,
+ 0x2874 : 0x1002874,
+ 0x2875 : 0x1002875,
+ 0x2876 : 0x1002876,
+ 0x2877 : 0x1002877,
+ 0x2878 : 0x1002878,
+ 0x2879 : 0x1002879,
+ 0x287A : 0x100287A,
+ 0x287B : 0x100287B,
+ 0x287C : 0x100287C,
+ 0x287D : 0x100287D,
+ 0x287E : 0x100287E,
+ 0x287F : 0x100287F,
+ 0x2880 : 0x1002880,
+ 0x2881 : 0x1002881,
+ 0x2882 : 0x1002882,
+ 0x2883 : 0x1002883,
+ 0x2884 : 0x1002884,
+ 0x2885 : 0x1002885,
+ 0x2886 : 0x1002886,
+ 0x2887 : 0x1002887,
+ 0x2888 : 0x1002888,
+ 0x2889 : 0x1002889,
+ 0x288A : 0x100288A,
+ 0x288B : 0x100288B,
+ 0x288C : 0x100288C,
+ 0x288D : 0x100288D,
+ 0x288E : 0x100288E,
+ 0x288F : 0x100288F,
+ 0x2890 : 0x1002890,
+ 0x2891 : 0x1002891,
+ 0x2892 : 0x1002892,
+ 0x2893 : 0x1002893,
+ 0x2894 : 0x1002894,
+ 0x2895 : 0x1002895,
+ 0x2896 : 0x1002896,
+ 0x2897 : 0x1002897,
+ 0x2898 : 0x1002898,
+ 0x2899 : 0x1002899,
+ 0x289A : 0x100289A,
+ 0x289B : 0x100289B,
+ 0x289C : 0x100289C,
+ 0x289D : 0x100289D,
+ 0x289E : 0x100289E,
+ 0x289F : 0x100289F,
+ 0x28A0 : 0x10028A0,
+ 0x28A1 : 0x10028A1,
+ 0x28A2 : 0x10028A2,
+ 0x28A3 : 0x10028A3,
+ 0x28A4 : 0x10028A4,
+ 0x28A5 : 0x10028A5,
+ 0x28A6 : 0x10028A6,
+ 0x28A7 : 0x10028A7,
+ 0x28A8 : 0x10028A8,
+ 0x28A9 : 0x10028A9,
+ 0x28AA : 0x10028AA,
+ 0x28AB : 0x10028AB,
+ 0x28AC : 0x10028AC,
+ 0x28AD : 0x10028AD,
+ 0x28AE : 0x10028AE,
+ 0x28AF : 0x10028AF,
+ 0x28B0 : 0x10028B0,
+ 0x28B1 : 0x10028B1,
+ 0x28B2 : 0x10028B2,
+ 0x28B3 : 0x10028B3,
+ 0x28B4 : 0x10028B4,
+ 0x28B5 : 0x10028B5,
+ 0x28B6 : 0x10028B6,
+ 0x28B7 : 0x10028B7,
+ 0x28B8 : 0x10028B8,
+ 0x28B9 : 0x10028B9,
+ 0x28BA : 0x10028BA,
+ 0x28BB : 0x10028BB,
+ 0x28BC : 0x10028BC,
+ 0x28BD : 0x10028BD,
+ 0x28BE : 0x10028BE,
+ 0x28BF : 0x10028BF,
+ 0x28C0 : 0x10028C0,
+ 0x28C1 : 0x10028C1,
+ 0x28C2 : 0x10028C2,
+ 0x28C3 : 0x10028C3,
+ 0x28C4 : 0x10028C4,
+ 0x28C5 : 0x10028C5,
+ 0x28C6 : 0x10028C6,
+ 0x28C7 : 0x10028C7,
+ 0x28C8 : 0x10028C8,
+ 0x28C9 : 0x10028C9,
+ 0x28CA : 0x10028CA,
+ 0x28CB : 0x10028CB,
+ 0x28CC : 0x10028CC,
+ 0x28CD : 0x10028CD,
+ 0x28CE : 0x10028CE,
+ 0x28CF : 0x10028CF,
+ 0x28D0 : 0x10028D0,
+ 0x28D1 : 0x10028D1,
+ 0x28D2 : 0x10028D2,
+ 0x28D3 : 0x10028D3,
+ 0x28D4 : 0x10028D4,
+ 0x28D5 : 0x10028D5,
+ 0x28D6 : 0x10028D6,
+ 0x28D7 : 0x10028D7,
+ 0x28D8 : 0x10028D8,
+ 0x28D9 : 0x10028D9,
+ 0x28DA : 0x10028DA,
+ 0x28DB : 0x10028DB,
+ 0x28DC : 0x10028DC,
+ 0x28DD : 0x10028DD,
+ 0x28DE : 0x10028DE,
+ 0x28DF : 0x10028DF,
+ 0x28E0 : 0x10028E0,
+ 0x28E1 : 0x10028E1,
+ 0x28E2 : 0x10028E2,
+ 0x28E3 : 0x10028E3,
+ 0x28E4 : 0x10028E4,
+ 0x28E5 : 0x10028E5,
+ 0x28E6 : 0x10028E6,
+ 0x28E7 : 0x10028E7,
+ 0x28E8 : 0x10028E8,
+ 0x28E9 : 0x10028E9,
+ 0x28EA : 0x10028EA,
+ 0x28EB : 0x10028EB,
+ 0x28EC : 0x10028EC,
+ 0x28ED : 0x10028ED,
+ 0x28EE : 0x10028EE,
+ 0x28EF : 0x10028EF,
+ 0x28F0 : 0x10028F0,
+ 0x28F1 : 0x10028F1,
+ 0x28F2 : 0x10028F2,
+ 0x28F3 : 0x10028F3,
+ 0x28F4 : 0x10028F4,
+ 0x28F5 : 0x10028F5,
+ 0x28F6 : 0x10028F6,
+ 0x28F7 : 0x10028F7,
+ 0x28F8 : 0x10028F8,
+ 0x28F9 : 0x10028F9,
+ 0x28FA : 0x10028FA,
+ 0x28FB : 0x10028FB,
+ 0x28FC : 0x10028FC,
+ 0x28FD : 0x10028FD,
+ 0x28FE : 0x10028FE,
+ 0x28FF : 0x10028FF
+ }
+}
diff --git a/include/rfb.js b/include/rfb.js
index a460f1c..c51d76b 100644
--- a/include/rfb.js
+++ b/include/rfb.js
@@ -709,6 +709,7 @@ init_msg = function() {
case "003.006": rfb_version = 3.3; break; // UltraVNC
case "003.007": rfb_version = 3.7; break;
case "003.008": rfb_version = 3.8; break;
+ case "004.001": rfb_version = 4.1; break; // recent RealVNC
default:
return fail("Invalid server version " + sversion);
}
diff --git a/include/vnc.js b/include/vnc.js
index a11f28d..040265b 100644
--- a/include/vnc.js
+++ b/include/vnc.js
@@ -34,6 +34,7 @@ function get_VNC_uri_prefix() {
extra += start + "webutil.js" + end;
extra += start + "base64.js" + end;
extra += start + "des.js" + end;
+ extra += start + "keysym.js" + end;
extra += start + "canvas.js" + end;
extra += start + "rfb.js" + end;
diff --git a/tests/input.html b/tests/input.html
index b3fc8ed..6e634eb 100644
--- a/tests/input.html
+++ b/tests/input.html
@@ -21,6 +21,7 @@
<script src="include/util.js"></script>
<script src="include/webutil.js"></script>
<script src="include/base64.js"></script>
+ <script src="include/keysym.js"></script>
<script src="include/canvas.js"></script>
<script>
var msg_cnt = 0;
diff --git a/utils/u2x11 b/utils/u2x11
new file mode 100755
index 0000000..86c69de
--- /dev/null
+++ b/utils/u2x11
@@ -0,0 +1,28 @@
+#!/bin/bash
+#
+# Convert "U+..." commented entries in /usr/include/X11/keysymdef.h
+# into JavaScript for use by noVNC. Note this is likely to produce
+# a few duplicate properties with clashing values, that will need
+# resolving manually.
+#
+# Colin Dean <colin@xvpsource.org>
+#
+
+regex="^#define[ \t]+XK_[A-Za-z0-9_]+[ \t]+0x([0-9a-fA-F]+)[ \t]+\/\*[ \t]+U\+([0-9a-fA-F]+)[ \t]+[^*]+.[ \t]+\*\/[ \t]*$"
+echo " unicodeTable : {"
+while read line; do
+ if echo "${line}" | egrep -qs "${regex}"; then
+
+ x11=$(echo "${line}" | sed -r "s/${regex}/\1/")
+ vnc=$(echo "${line}" | sed -r "s/${regex}/\2/")
+
+ if echo "${vnc}" | egrep -qs "^00[2-9A-F][0-9A-F]$"; then
+ : # skip ISO Latin-1 (U+0020 to U+00FF) as 1-to-1 mapping
+ else
+ # note 1-to-1 is possible (e.g. for Euro symbol, U+20AC)
+ echo " 0x${vnc} : 0x${x11},"
+ fi
+ fi
+done < /usr/include/X11/keysymdef.h | uniq
+echo " }"
+
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment