/* * This file is part of Xpra. * Copyright (C) 2010 Antoine Martin * Licensed under MPL 2.0, see: * http://www.mozilla.org/MPL/2.0/ * */ /** * Map javascript key names to the X11 naming convention the server expects: */ const KEY_TO_NAME = { Escape: "Escape", Tab: "Tab", CapsLock: "Caps_Lock", ShiftLeft: "Shift_L", ControlLeft: "Control_L", MetaLeft: "Meta_L", AltLeft: "Alt_L", Space: "space", AltRight: "Alt_R", MetaRight: "Meta_R", ContextMenu: "Menu_R", ControlRight: "Control_L", ShiftRight: "Shift_R", Enter: "Return", Backspace: "BackSpace", //special keys: ScrollLock: "Scroll_Lock", Pause: "Pause", NumLock: "Num_Lock", //Arrow pad: Insert: "Insert", Home: "Home", PageUp: "Prior", Delete: "Delete", End: "End", PageDown: "Next", }; const DEAD_KEYS = { "`": "dead_grave", "'": "dead_acute", }; const NUMPAD_TO_NAME = { //Num pad: NumpadDivide: "KP_Divide", NumpadMultiply: "KP_Multiply", NumpadSubstract: "KP_Substract", NumpadAdd: "KP_Add", NumpadEnter: "KP_Enter", NumpadDecimal: "KP_Decimal", //TODO: send KP_Delete when Num_Lock is off //Num_Lock off: Insert: "KP_Insert", End: "KP_End", ArrowDown: "KP_Down", PageDown: "KP_Next", ArrowLeft: "KP_Left", Clear: "KP_Begin", ArrowRight: "KP_Right", Home: "KP_Home", ArrowUp: "KP_Up", PageUp: "KP_Prior", }; for (let index = 0; index <= 9; index++) { KEY_TO_NAME[`Numpad${index}`] = `${index}`; KEY_TO_NAME[`KP${index}`] = `KP${index}`; } for (let index = 1; index <= 20; index++) { KEY_TO_NAME[`F${index}`] = `F${index}`; } /** * This table was generated using: * grep "#define XKB_KEY_" /usr/include/xkbcommon/xkbcommon-keysyms.h | \ * grep "/* U+" | grep -v "A-Z" | \ * sed 's/#define XKB_KEY_//g; s/ *0x.*U+/ 0x/g' | \ * awk '{print "\""$1"\" : "$2","}' */ const KEYSYM_TO_UNICODE = { space: 0x00_20, exclam: 0x00_21, quotedbl: 0x00_22, numbersign: 0x00_23, dollar: 0x00_24, percent: 0x00_25, ampersand: 0x00_26, apostrophe: 0x00_27, parenleft: 0x00_28, parenright: 0x00_29, asterisk: 0x00_2a, plus: 0x00_2b, comma: 0x00_2c, minus: 0x00_2d, period: 0x00_2e, slash: 0x00_2f, 0: 0x00_30, 1: 0x00_31, 2: 0x00_32, 3: 0x00_33, 4: 0x00_34, 5: 0x00_35, 6: 0x00_36, 7: 0x00_37, 8: 0x00_38, 9: 0x00_39, colon: 0x00_3a, semicolon: 0x00_3b, less: 0x00_3c, equal: 0x00_3d, greater: 0x00_3e, question: 0x00_3f, at: 0x00_40, A: 0x00_41, B: 0x00_42, C: 0x00_43, D: 0x00_44, E: 0x00_45, F: 0x00_46, G: 0x00_47, H: 0x00_48, I: 0x00_49, J: 0x00_4a, K: 0x00_4b, L: 0x00_4c, M: 0x00_4d, N: 0x00_4e, O: 0x00_4f, P: 0x00_50, Q: 0x00_51, R: 0x00_52, S: 0x00_53, T: 0x00_54, U: 0x00_55, V: 0x00_56, W: 0x00_57, X: 0x00_58, Y: 0x00_59, Z: 0x00_5a, bracketleft: 0x00_5b, backslash: 0x00_5c, bracketright: 0x00_5d, asciicircum: 0x00_5e, underscore: 0x00_5f, grave: 0x00_60, a: 0x00_61, b: 0x00_62, c: 0x00_63, d: 0x00_64, e: 0x00_65, f: 0x00_66, g: 0x00_67, h: 0x00_68, i: 0x00_69, j: 0x00_6a, k: 0x00_6b, l: 0x00_6c, m: 0x00_6d, n: 0x00_6e, o: 0x00_6f, p: 0x00_70, q: 0x00_71, r: 0x00_72, s: 0x00_73, t: 0x00_74, u: 0x00_75, v: 0x00_76, w: 0x00_77, x: 0x00_78, y: 0x00_79, z: 0x00_7a, braceleft: 0x00_7b, bar: 0x00_7c, braceright: 0x00_7d, asciitilde: 0x00_7e, nobreakspace: 0x00_a0, exclamdown: 0x00_a1, cent: 0x00_a2, sterling: 0x00_a3, currency: 0x00_a4, yen: 0x00_a5, brokenbar: 0x00_a6, section: 0x00_a7, diaeresis: 0x00_a8, copyright: 0x00_a9, ordfeminine: 0x00_aa, guillemotleft: 0x00_ab, notsign: 0x00_ac, hyphen: 0x00_ad, registered: 0x00_ae, macron: 0x00_af, degree: 0x00_b0, plusminus: 0x00_b1, twosuperior: 0x00_b2, threesuperior: 0x00_b3, acute: 0x00_b4, mu: 0x00_b5, paragraph: 0x00_b6, periodcentered: 0x00_b7, cedilla: 0x00_b8, onesuperior: 0x00_b9, masculine: 0x00_ba, guillemotright: 0x00_bb, onequarter: 0x00_bc, onehalf: 0x00_bd, threequarters: 0x00_be, questiondown: 0x00_bf, Agrave: 0x00_c0, Aacute: 0x00_c1, Acircumflex: 0x00_c2, Atilde: 0x00_c3, Adiaeresis: 0x00_c4, Aring: 0x00_c5, AE: 0x00_c6, Ccedilla: 0x00_c7, Egrave: 0x00_c8, Eacute: 0x00_c9, Ecircumflex: 0x00_ca, Ediaeresis: 0x00_cb, Igrave: 0x00_cc, Iacute: 0x00_cd, Icircumflex: 0x00_ce, Idiaeresis: 0x00_cf, ETH: 0x00_d0, Ntilde: 0x00_d1, Ograve: 0x00_d2, Oacute: 0x00_d3, Ocircumflex: 0x00_d4, Otilde: 0x00_d5, Odiaeresis: 0x00_d6, multiply: 0x00_d7, Ooblique: 0x00_d8, Oslash: 0x00_d8, Ugrave: 0x00_d9, Uacute: 0x00_da, Ucircumflex: 0x00_db, Udiaeresis: 0x00_dc, Yacute: 0x00_dd, THORN: 0x00_de, ssharp: 0x00_df, agrave: 0x00_e0, aacute: 0x00_e1, acircumflex: 0x00_e2, atilde: 0x00_e3, adiaeresis: 0x00_e4, aring: 0x00_e5, ae: 0x00_e6, ccedilla: 0x00_e7, egrave: 0x00_e8, eacute: 0x00_e9, ecircumflex: 0x00_ea, ediaeresis: 0x00_eb, igrave: 0x00_ec, iacute: 0x00_ed, icircumflex: 0x00_ee, idiaeresis: 0x00_ef, eth: 0x00_f0, ntilde: 0x00_f1, ograve: 0x00_f2, oacute: 0x00_f3, ocircumflex: 0x00_f4, otilde: 0x00_f5, odiaeresis: 0x00_f6, division: 0x00_f7, oslash: 0x00_f8, ooblique: 0x00_f8, ugrave: 0x00_f9, uacute: 0x00_fa, ucircumflex: 0x00_fb, udiaeresis: 0x00_fc, yacute: 0x00_fd, thorn: 0x00_fe, ydiaeresis: 0x00_ff, Aogonek: 0x01_04, breve: 0x02_d8, Lstroke: 0x01_41, Lcaron: 0x01_3d, Sacute: 0x01_5a, Scaron: 0x01_60, Scedilla: 0x01_5e, Tcaron: 0x01_64, Zacute: 0x01_79, Zcaron: 0x01_7d, Zabovedot: 0x01_7b, aogonek: 0x01_05, ogonek: 0x02_db, lstroke: 0x01_42, lcaron: 0x01_3e, sacute: 0x01_5b, caron: 0x02_c7, scaron: 0x01_61, scedilla: 0x01_5f, tcaron: 0x01_65, zacute: 0x01_7a, doubleacute: 0x02_dd, zcaron: 0x01_7e, zabovedot: 0x01_7c, Racute: 0x01_54, Abreve: 0x01_02, Lacute: 0x01_39, Cacute: 0x01_06, Ccaron: 0x01_0c, Eogonek: 0x01_18, Ecaron: 0x01_1a, Dcaron: 0x01_0e, Dstroke: 0x01_10, Nacute: 0x01_43, Ncaron: 0x01_47, Odoubleacute: 0x01_50, Rcaron: 0x01_58, Uring: 0x01_6e, Udoubleacute: 0x01_70, Tcedilla: 0x01_62, racute: 0x01_55, abreve: 0x01_03, lacute: 0x01_3a, cacute: 0x01_07, ccaron: 0x01_0d, eogonek: 0x01_19, ecaron: 0x01_1b, dcaron: 0x01_0f, dstroke: 0x01_11, nacute: 0x01_44, ncaron: 0x01_48, odoubleacute: 0x01_51, rcaron: 0x01_59, uring: 0x01_6f, udoubleacute: 0x01_71, tcedilla: 0x01_63, abovedot: 0x02_d9, Hstroke: 0x01_26, Hcircumflex: 0x01_24, Iabovedot: 0x01_30, Gbreve: 0x01_1e, Jcircumflex: 0x01_34, hstroke: 0x01_27, hcircumflex: 0x01_25, idotless: 0x01_31, gbreve: 0x01_1f, jcircumflex: 0x01_35, Cabovedot: 0x01_0a, Ccircumflex: 0x01_08, Gabovedot: 0x01_20, Gcircumflex: 0x01_1c, Ubreve: 0x01_6c, Scircumflex: 0x01_5c, cabovedot: 0x01_0b, ccircumflex: 0x01_09, gabovedot: 0x01_21, gcircumflex: 0x01_1d, ubreve: 0x01_6d, scircumflex: 0x01_5d, kra: 0x01_38, Rcedilla: 0x01_56, Itilde: 0x01_28, Lcedilla: 0x01_3b, Emacron: 0x01_12, Gcedilla: 0x01_22, Tslash: 0x01_66, rcedilla: 0x01_57, itilde: 0x01_29, lcedilla: 0x01_3c, emacron: 0x01_13, gcedilla: 0x01_23, tslash: 0x01_67, ENG: 0x01_4a, eng: 0x01_4b, Amacron: 0x01_00, Iogonek: 0x01_2e, Eabovedot: 0x01_16, Imacron: 0x01_2a, Ncedilla: 0x01_45, Omacron: 0x01_4c, Kcedilla: 0x01_36, Uogonek: 0x01_72, Utilde: 0x01_68, Umacron: 0x01_6a, amacron: 0x01_01, iogonek: 0x01_2f, eabovedot: 0x01_17, imacron: 0x01_2b, ncedilla: 0x01_46, omacron: 0x01_4d, kcedilla: 0x01_37, uogonek: 0x01_73, utilde: 0x01_69, umacron: 0x01_6b, Wcircumflex: 0x01_74, wcircumflex: 0x01_75, Ycircumflex: 0x01_76, ycircumflex: 0x01_77, Babovedot: 0x1e_02, babovedot: 0x1e_03, Dabovedot: 0x1e_0a, dabovedot: 0x1e_0b, Fabovedot: 0x1e_1e, fabovedot: 0x1e_1f, Mabovedot: 0x1e_40, mabovedot: 0x1e_41, Pabovedot: 0x1e_56, pabovedot: 0x1e_57, Sabovedot: 0x1e_60, sabovedot: 0x1e_61, Tabovedot: 0x1e_6a, tabovedot: 0x1e_6b, Wgrave: 0x1e_80, wgrave: 0x1e_81, Wacute: 0x1e_82, wacute: 0x1e_83, Wdiaeresis: 0x1e_84, wdiaeresis: 0x1e_85, Ygrave: 0x1e_f2, ygrave: 0x1e_f3, OE: 0x01_52, oe: 0x01_53, Ydiaeresis: 0x01_78, overline: 0x20_3e, kana_fullstop: 0x30_02, kana_openingbracket: 0x30_0c, kana_closingbracket: 0x30_0d, kana_comma: 0x30_01, kana_conjunctive: 0x30_fb, kana_WO: 0x30_f2, kana_a: 0x30_a1, kana_i: 0x30_a3, kana_u: 0x30_a5, kana_e: 0x30_a7, kana_o: 0x30_a9, kana_ya: 0x30_e3, kana_yu: 0x30_e5, kana_yo: 0x30_e7, kana_tsu: 0x30_c3, prolongedsound: 0x30_fc, kana_A: 0x30_a2, kana_I: 0x30_a4, kana_U: 0x30_a6, kana_E: 0x30_a8, kana_O: 0x30_aa, kana_KA: 0x30_ab, kana_KI: 0x30_ad, kana_KU: 0x30_af, kana_KE: 0x30_b1, kana_KO: 0x30_b3, kana_SA: 0x30_b5, kana_SHI: 0x30_b7, kana_SU: 0x30_b9, kana_SE: 0x30_bb, kana_SO: 0x30_bd, kana_TA: 0x30_bf, kana_CHI: 0x30_c1, kana_TSU: 0x30_c4, kana_TE: 0x30_c6, kana_TO: 0x30_c8, kana_NA: 0x30_ca, kana_NI: 0x30_cb, kana_NU: 0x30_cc, kana_NE: 0x30_cd, kana_NO: 0x30_ce, kana_HA: 0x30_cf, kana_HI: 0x30_d2, kana_FU: 0x30_d5, kana_HE: 0x30_d8, kana_HO: 0x30_db, kana_MA: 0x30_de, kana_MI: 0x30_df, kana_MU: 0x30_e0, kana_ME: 0x30_e1, kana_MO: 0x30_e2, kana_YA: 0x30_e4, kana_YU: 0x30_e6, kana_YO: 0x30_e8, kana_RA: 0x30_e9, kana_RI: 0x30_ea, kana_RU: 0x30_eb, kana_RE: 0x30_ec, kana_RO: 0x30_ed, kana_WA: 0x30_ef, kana_N: 0x30_f3, voicedsound: 0x30_9b, semivoicedsound: 0x30_9c, Farsi_0: 0x06_f0, Farsi_1: 0x06_f1, Farsi_2: 0x06_f2, Farsi_3: 0x06_f3, Farsi_4: 0x06_f4, Farsi_5: 0x06_f5, Farsi_6: 0x06_f6, Farsi_7: 0x06_f7, Farsi_8: 0x06_f8, Farsi_9: 0x06_f9, Arabic_percent: 0x06_6a, Arabic_superscript_alef: 0x06_70, Arabic_tteh: 0x06_79, Arabic_peh: 0x06_7e, Arabic_tcheh: 0x06_86, Arabic_ddal: 0x06_88, Arabic_rreh: 0x06_91, Arabic_comma: 0x06_0c, Arabic_fullstop: 0x06_d4, Arabic_0: 0x06_60, Arabic_1: 0x06_61, Arabic_2: 0x06_62, Arabic_3: 0x06_63, Arabic_4: 0x06_64, Arabic_5: 0x06_65, Arabic_6: 0x06_66, Arabic_7: 0x06_67, Arabic_8: 0x06_68, Arabic_9: 0x06_69, Arabic_semicolon: 0x06_1b, Arabic_question_mark: 0x06_1f, Arabic_hamza: 0x06_21, Arabic_maddaonalef: 0x06_22, Arabic_hamzaonalef: 0x06_23, Arabic_hamzaonwaw: 0x06_24, Arabic_hamzaunderalef: 0x06_25, Arabic_hamzaonyeh: 0x06_26, Arabic_alef: 0x06_27, Arabic_beh: 0x06_28, Arabic_tehmarbuta: 0x06_29, Arabic_teh: 0x06_2a, Arabic_theh: 0x06_2b, Arabic_jeem: 0x06_2c, Arabic_hah: 0x06_2d, Arabic_khah: 0x06_2e, Arabic_dal: 0x06_2f, Arabic_thal: 0x06_30, Arabic_ra: 0x06_31, Arabic_zain: 0x06_32, Arabic_seen: 0x06_33, Arabic_sheen: 0x06_34, Arabic_sad: 0x06_35, Arabic_dad: 0x06_36, Arabic_tah: 0x06_37, Arabic_zah: 0x06_38, Arabic_ain: 0x06_39, Arabic_ghain: 0x06_3a, Arabic_tatweel: 0x06_40, Arabic_feh: 0x06_41, Arabic_qaf: 0x06_42, Arabic_kaf: 0x06_43, Arabic_lam: 0x06_44, Arabic_meem: 0x06_45, Arabic_noon: 0x06_46, Arabic_ha: 0x06_47, Arabic_waw: 0x06_48, Arabic_alefmaksura: 0x06_49, Arabic_yeh: 0x06_4a, Arabic_fathatan: 0x06_4b, Arabic_dammatan: 0x06_4c, Arabic_kasratan: 0x06_4d, Arabic_fatha: 0x06_4e, Arabic_damma: 0x06_4f, Arabic_kasra: 0x06_50, Arabic_shadda: 0x06_51, Arabic_sukun: 0x06_52, Arabic_madda_above: 0x06_53, Arabic_hamza_above: 0x06_54, Arabic_hamza_below: 0x06_55, Arabic_jeh: 0x06_98, Arabic_veh: 0x06_a4, Arabic_keheh: 0x06_a9, Arabic_gaf: 0x06_af, Arabic_noon_ghunna: 0x06_ba, Arabic_heh_doachashmee: 0x06_be, Farsi_yeh: 0x06_cc, Arabic_farsi_yeh: 0x06_cc, Arabic_yeh_baree: 0x06_d2, Arabic_heh_goal: 0x06_c1, Cyrillic_GHE_bar: 0x04_92, Cyrillic_ghe_bar: 0x04_93, Cyrillic_ZHE_descender: 0x04_96, Cyrillic_zhe_descender: 0x04_97, Cyrillic_KA_descender: 0x04_9a, Cyrillic_ka_descender: 0x04_9b, Cyrillic_KA_vertstroke: 0x04_9c, Cyrillic_ka_vertstroke: 0x04_9d, Cyrillic_EN_descender: 0x04_a2, Cyrillic_en_descender: 0x04_a3, Cyrillic_U_straight: 0x04_ae, Cyrillic_u_straight: 0x04_af, Cyrillic_U_straight_bar: 0x04_b0, Cyrillic_u_straight_bar: 0x04_b1, Cyrillic_HA_descender: 0x04_b2, Cyrillic_ha_descender: 0x04_b3, Cyrillic_CHE_descender: 0x04_b6, Cyrillic_che_descender: 0x04_b7, Cyrillic_CHE_vertstroke: 0x04_b8, Cyrillic_che_vertstroke: 0x04_b9, Cyrillic_SHHA: 0x04_ba, Cyrillic_shha: 0x04_bb, Cyrillic_SCHWA: 0x04_d8, Cyrillic_schwa: 0x04_d9, Cyrillic_I_macron: 0x04_e2, Cyrillic_i_macron: 0x04_e3, Cyrillic_O_bar: 0x04_e8, Cyrillic_o_bar: 0x04_e9, Cyrillic_U_macron: 0x04_ee, Cyrillic_u_macron: 0x04_ef, Serbian_dje: 0x04_52, Macedonia_gje: 0x04_53, Cyrillic_io: 0x04_51, Ukrainian_ie: 0x04_54, Macedonia_dse: 0x04_55, Ukrainian_i: 0x04_56, Ukrainian_yi: 0x04_57, Cyrillic_je: 0x04_58, Cyrillic_lje: 0x04_59, Cyrillic_nje: 0x04_5a, Serbian_tshe: 0x04_5b, Macedonia_kje: 0x04_5c, Ukrainian_ghe_with_upturn: 0x04_91, Byelorussian_shortu: 0x04_5e, Cyrillic_dzhe: 0x04_5f, numerosign: 0x21_16, Serbian_DJE: 0x04_02, Macedonia_GJE: 0x04_03, Cyrillic_IO: 0x04_01, Ukrainian_IE: 0x04_04, Macedonia_DSE: 0x04_05, Ukrainian_I: 0x04_06, Ukrainian_YI: 0x04_07, Cyrillic_JE: 0x04_08, Cyrillic_LJE: 0x04_09, Cyrillic_NJE: 0x04_0a, Serbian_TSHE: 0x04_0b, Macedonia_KJE: 0x04_0c, Ukrainian_GHE_WITH_UPTURN: 0x04_90, Byelorussian_SHORTU: 0x04_0e, Cyrillic_DZHE: 0x04_0f, Cyrillic_yu: 0x04_4e, Cyrillic_a: 0x04_30, Cyrillic_be: 0x04_31, Cyrillic_tse: 0x04_46, Cyrillic_de: 0x04_34, Cyrillic_ie: 0x04_35, Cyrillic_ef: 0x04_44, Cyrillic_ghe: 0x04_33, Cyrillic_ha: 0x04_45, Cyrillic_i: 0x04_38, Cyrillic_shorti: 0x04_39, Cyrillic_ka: 0x04_3a, Cyrillic_el: 0x04_3b, Cyrillic_em: 0x04_3c, Cyrillic_en: 0x04_3d, Cyrillic_o: 0x04_3e, Cyrillic_pe: 0x04_3f, Cyrillic_ya: 0x04_4f, Cyrillic_er: 0x04_40, Cyrillic_es: 0x04_41, Cyrillic_te: 0x04_42, Cyrillic_u: 0x04_43, Cyrillic_zhe: 0x04_36, Cyrillic_ve: 0x04_32, Cyrillic_softsign: 0x04_4c, Cyrillic_yeru: 0x04_4b, Cyrillic_ze: 0x04_37, Cyrillic_sha: 0x04_48, Cyrillic_e: 0x04_4d, Cyrillic_shcha: 0x04_49, Cyrillic_che: 0x04_47, Cyrillic_hardsign: 0x04_4a, Cyrillic_YU: 0x04_2e, Cyrillic_A: 0x04_10, Cyrillic_BE: 0x04_11, Cyrillic_TSE: 0x04_26, Cyrillic_DE: 0x04_14, Cyrillic_IE: 0x04_15, Cyrillic_EF: 0x04_24, Cyrillic_GHE: 0x04_13, Cyrillic_HA: 0x04_25, Cyrillic_I: 0x04_18, Cyrillic_SHORTI: 0x04_19, Cyrillic_KA: 0x04_1a, Cyrillic_EL: 0x04_1b, Cyrillic_EM: 0x04_1c, Cyrillic_EN: 0x04_1d, Cyrillic_O: 0x04_1e, Cyrillic_PE: 0x04_1f, Cyrillic_YA: 0x04_2f, Cyrillic_ER: 0x04_20, Cyrillic_ES: 0x04_21, Cyrillic_TE: 0x04_22, Cyrillic_U: 0x04_23, Cyrillic_ZHE: 0x04_16, Cyrillic_VE: 0x04_12, Cyrillic_SOFTSIGN: 0x04_2c, Cyrillic_YERU: 0x04_2b, Cyrillic_ZE: 0x04_17, Cyrillic_SHA: 0x04_28, Cyrillic_E: 0x04_2d, Cyrillic_SHCHA: 0x04_29, Cyrillic_CHE: 0x04_27, Cyrillic_HARDSIGN: 0x04_2a, Greek_ALPHAaccent: 0x03_86, Greek_EPSILONaccent: 0x03_88, Greek_ETAaccent: 0x03_89, Greek_IOTAaccent: 0x03_8a, Greek_IOTAdieresis: 0x03_aa, Greek_OMICRONaccent: 0x03_8c, Greek_UPSILONaccent: 0x03_8e, Greek_UPSILONdieresis: 0x03_ab, Greek_OMEGAaccent: 0x03_8f, Greek_accentdieresis: 0x03_85, Greek_horizbar: 0x20_15, Greek_alphaaccent: 0x03_ac, Greek_epsilonaccent: 0x03_ad, Greek_etaaccent: 0x03_ae, Greek_iotaaccent: 0x03_af, Greek_iotadieresis: 0x03_ca, Greek_iotaaccentdieresis: 0x03_90, Greek_omicronaccent: 0x03_cc, Greek_upsilonaccent: 0x03_cd, Greek_upsilondieresis: 0x03_cb, Greek_upsilonaccentdieresis: 0x03_b0, Greek_omegaaccent: 0x03_ce, Greek_ALPHA: 0x03_91, Greek_BETA: 0x03_92, Greek_GAMMA: 0x03_93, Greek_DELTA: 0x03_94, Greek_EPSILON: 0x03_95, Greek_ZETA: 0x03_96, Greek_ETA: 0x03_97, Greek_THETA: 0x03_98, Greek_IOTA: 0x03_99, Greek_KAPPA: 0x03_9a, Greek_LAMDA: 0x03_9b, Greek_LAMBDA: 0x03_9b, Greek_MU: 0x03_9c, Greek_NU: 0x03_9d, Greek_XI: 0x03_9e, Greek_OMICRON: 0x03_9f, Greek_PI: 0x03_a0, Greek_RHO: 0x03_a1, Greek_SIGMA: 0x03_a3, Greek_TAU: 0x03_a4, Greek_UPSILON: 0x03_a5, Greek_PHI: 0x03_a6, Greek_CHI: 0x03_a7, Greek_PSI: 0x03_a8, Greek_OMEGA: 0x03_a9, Greek_alpha: 0x03_b1, Greek_beta: 0x03_b2, Greek_gamma: 0x03_b3, Greek_delta: 0x03_b4, Greek_epsilon: 0x03_b5, Greek_zeta: 0x03_b6, Greek_eta: 0x03_b7, Greek_theta: 0x03_b8, Greek_iota: 0x03_b9, Greek_kappa: 0x03_ba, Greek_lamda: 0x03_bb, Greek_lambda: 0x03_bb, Greek_mu: 0x03_bc, Greek_nu: 0x03_bd, Greek_xi: 0x03_be, Greek_omicron: 0x03_bf, Greek_pi: 0x03_c0, Greek_rho: 0x03_c1, Greek_sigma: 0x03_c3, Greek_finalsmallsigma: 0x03_c2, Greek_tau: 0x03_c4, Greek_upsilon: 0x03_c5, Greek_phi: 0x03_c6, Greek_chi: 0x03_c7, Greek_psi: 0x03_c8, Greek_omega: 0x03_c9, leftradical: 0x23_b7, topintegral: 0x23_20, botintegral: 0x23_21, topleftsqbracket: 0x23_a1, botleftsqbracket: 0x23_a3, toprightsqbracket: 0x23_a4, botrightsqbracket: 0x23_a6, topleftparens: 0x23_9b, botleftparens: 0x23_9d, toprightparens: 0x23_9e, botrightparens: 0x23_a0, leftmiddlecurlybrace: 0x23_a8, rightmiddlecurlybrace: 0x23_ac, lessthanequal: 0x22_64, notequal: 0x22_60, greaterthanequal: 0x22_65, integral: 0x22_2b, therefore: 0x22_34, variation: 0x22_1d, infinity: 0x22_1e, nabla: 0x22_07, approximate: 0x22_3c, similarequal: 0x22_43, ifonlyif: 0x21_d4, implies: 0x21_d2, identical: 0x22_61, radical: 0x22_1a, includedin: 0x22_82, includes: 0x22_83, intersection: 0x22_29, union: 0x22_2a, logicaland: 0x22_27, logicalor: 0x22_28, partialderivative: 0x22_02, function: 0x01_92, leftarrow: 0x21_90, uparrow: 0x21_91, rightarrow: 0x21_92, downarrow: 0x21_93, soliddiamond: 0x25_c6, checkerboard: 0x25_92, ht: 0x24_09, ff: 0x24_0c, cr: 0x24_0d, lf: 0x24_0a, nl: 0x24_24, vt: 0x24_0b, lowrightcorner: 0x25_18, uprightcorner: 0x25_10, upleftcorner: 0x25_0c, lowleftcorner: 0x25_14, crossinglines: 0x25_3c, horizlinescan1: 0x23_ba, horizlinescan3: 0x23_bb, horizlinescan5: 0x25_00, horizlinescan7: 0x23_bc, horizlinescan9: 0x23_bd, leftt: 0x25_1c, rightt: 0x25_24, bott: 0x25_34, topt: 0x25_2c, vertbar: 0x25_02, emspace: 0x20_03, enspace: 0x20_02, em3space: 0x20_04, em4space: 0x20_05, digitspace: 0x20_07, punctspace: 0x20_08, thinspace: 0x20_09, hairspace: 0x20_0a, emdash: 0x20_14, endash: 0x20_13, ellipsis: 0x20_26, doubbaselinedot: 0x20_25, onethird: 0x21_53, twothirds: 0x21_54, onefifth: 0x21_55, twofifths: 0x21_56, threefifths: 0x21_57, fourfifths: 0x21_58, onesixth: 0x21_59, fivesixths: 0x21_5a, careof: 0x21_05, figdash: 0x20_12, oneeighth: 0x21_5b, threeeighths: 0x21_5c, fiveeighths: 0x21_5d, seveneighths: 0x21_5e, trademark: 0x21_22, leftsinglequotemark: 0x20_18, rightsinglequotemark: 0x20_19, leftdoublequotemark: 0x20_1c, rightdoublequotemark: 0x20_1d, prescription: 0x21_1e, permille: 0x20_30, minutes: 0x20_32, seconds: 0x20_33, latincross: 0x27_1d, club: 0x26_63, diamond: 0x26_66, heart: 0x26_65, maltesecross: 0x27_20, dagger: 0x20_20, doubledagger: 0x20_21, checkmark: 0x27_13, ballotcross: 0x27_17, musicalsharp: 0x26_6f, musicalflat: 0x26_6d, malesymbol: 0x26_42, femalesymbol: 0x26_40, telephone: 0x26_0e, telephonerecorder: 0x23_15, phonographcopyright: 0x21_17, caret: 0x20_38, singlelowquotemark: 0x20_1a, doublelowquotemark: 0x20_1e, downtack: 0x22_a4, downstile: 0x23_0a, jot: 0x22_18, quad: 0x23_95, uptack: 0x22_a5, circle: 0x25_cb, upstile: 0x23_08, lefttack: 0x22_a3, righttack: 0x22_a2, hebrew_doublelowline: 0x20_17, hebrew_aleph: 0x05_d0, hebrew_bet: 0x05_d1, hebrew_gimel: 0x05_d2, hebrew_dalet: 0x05_d3, hebrew_he: 0x05_d4, hebrew_waw: 0x05_d5, hebrew_zain: 0x05_d6, hebrew_chet: 0x05_d7, hebrew_tet: 0x05_d8, hebrew_yod: 0x05_d9, hebrew_finalkaph: 0x05_da, hebrew_kaph: 0x05_db, hebrew_lamed: 0x05_dc, hebrew_finalmem: 0x05_dd, hebrew_mem: 0x05_de, hebrew_finalnun: 0x05_df, hebrew_nun: 0x05_e0, hebrew_samech: 0x05_e1, hebrew_ayin: 0x05_e2, hebrew_finalpe: 0x05_e3, hebrew_pe: 0x05_e4, hebrew_finalzade: 0x05_e5, hebrew_zade: 0x05_e6, hebrew_qoph: 0x05_e7, hebrew_resh: 0x05_e8, hebrew_shin: 0x05_e9, hebrew_taw: 0x05_ea, Thai_kokai: 0x0e_01, Thai_khokhai: 0x0e_02, Thai_khokhuat: 0x0e_03, Thai_khokhwai: 0x0e_04, Thai_khokhon: 0x0e_05, Thai_khorakhang: 0x0e_06, Thai_ngongu: 0x0e_07, Thai_chochan: 0x0e_08, Thai_choching: 0x0e_09, Thai_chochang: 0x0e_0a, Thai_soso: 0x0e_0b, Thai_chochoe: 0x0e_0c, Thai_yoying: 0x0e_0d, Thai_dochada: 0x0e_0e, Thai_topatak: 0x0e_0f, Thai_thothan: 0x0e_10, Thai_thonangmontho: 0x0e_11, Thai_thophuthao: 0x0e_12, Thai_nonen: 0x0e_13, Thai_dodek: 0x0e_14, Thai_totao: 0x0e_15, Thai_thothung: 0x0e_16, Thai_thothahan: 0x0e_17, Thai_thothong: 0x0e_18, Thai_nonu: 0x0e_19, Thai_bobaimai: 0x0e_1a, Thai_popla: 0x0e_1b, Thai_phophung: 0x0e_1c, Thai_fofa: 0x0e_1d, Thai_phophan: 0x0e_1e, Thai_fofan: 0x0e_1f, Thai_phosamphao: 0x0e_20, Thai_moma: 0x0e_21, Thai_yoyak: 0x0e_22, Thai_rorua: 0x0e_23, Thai_ru: 0x0e_24, Thai_loling: 0x0e_25, Thai_lu: 0x0e_26, Thai_wowaen: 0x0e_27, Thai_sosala: 0x0e_28, Thai_sorusi: 0x0e_29, Thai_sosua: 0x0e_2a, Thai_hohip: 0x0e_2b, Thai_lochula: 0x0e_2c, Thai_oang: 0x0e_2d, Thai_honokhuk: 0x0e_2e, Thai_paiyannoi: 0x0e_2f, Thai_saraa: 0x0e_30, Thai_maihanakat: 0x0e_31, Thai_saraaa: 0x0e_32, Thai_saraam: 0x0e_33, Thai_sarai: 0x0e_34, Thai_saraii: 0x0e_35, Thai_saraue: 0x0e_36, Thai_sarauee: 0x0e_37, Thai_sarau: 0x0e_38, Thai_sarauu: 0x0e_39, Thai_phinthu: 0x0e_3a, Thai_baht: 0x0e_3f, Thai_sarae: 0x0e_40, Thai_saraae: 0x0e_41, Thai_sarao: 0x0e_42, Thai_saraaimaimuan: 0x0e_43, Thai_saraaimaimalai: 0x0e_44, Thai_lakkhangyao: 0x0e_45, Thai_maiyamok: 0x0e_46, Thai_maitaikhu: 0x0e_47, Thai_maiek: 0x0e_48, Thai_maitho: 0x0e_49, Thai_maitri: 0x0e_4a, Thai_maichattawa: 0x0e_4b, Thai_thanthakhat: 0x0e_4c, Thai_nikhahit: 0x0e_4d, Thai_leksun: 0x0e_50, Thai_leknung: 0x0e_51, Thai_leksong: 0x0e_52, Thai_leksam: 0x0e_53, Thai_leksi: 0x0e_54, Thai_lekha: 0x0e_55, Thai_lekhok: 0x0e_56, Thai_lekchet: 0x0e_57, Thai_lekpaet: 0x0e_58, Thai_lekkao: 0x0e_59, Armenian_ligature_ew: 0x05_87, Armenian_full_stop: 0x05_89, Armenian_verjaket: 0x05_89, Armenian_separation_mark: 0x05_5d, Armenian_but: 0x05_5d, Armenian_hyphen: 0x05_8a, Armenian_yentamna: 0x05_8a, Armenian_exclam: 0x05_5c, Armenian_amanak: 0x05_5c, Armenian_accent: 0x05_5b, Armenian_shesht: 0x05_5b, Armenian_question: 0x05_5e, Armenian_paruyk: 0x05_5e, Armenian_AYB: 0x05_31, Armenian_ayb: 0x05_61, Armenian_BEN: 0x05_32, Armenian_ben: 0x05_62, Armenian_GIM: 0x05_33, Armenian_gim: 0x05_63, Armenian_DA: 0x05_34, Armenian_da: 0x05_64, Armenian_YECH: 0x05_35, Armenian_yech: 0x05_65, Armenian_ZA: 0x05_36, Armenian_za: 0x05_66, Armenian_E: 0x05_37, Armenian_e: 0x05_67, Armenian_AT: 0x05_38, Armenian_at: 0x05_68, Armenian_TO: 0x05_39, Armenian_to: 0x05_69, Armenian_ZHE: 0x05_3a, Armenian_zhe: 0x05_6a, Armenian_INI: 0x05_3b, Armenian_ini: 0x05_6b, Armenian_LYUN: 0x05_3c, Armenian_lyun: 0x05_6c, Armenian_KHE: 0x05_3d, Armenian_khe: 0x05_6d, Armenian_TSA: 0x05_3e, Armenian_tsa: 0x05_6e, Armenian_KEN: 0x05_3f, Armenian_ken: 0x05_6f, Armenian_HO: 0x05_40, Armenian_ho: 0x05_70, Armenian_DZA: 0x05_41, Armenian_dza: 0x05_71, Armenian_GHAT: 0x05_42, Armenian_ghat: 0x05_72, Armenian_TCHE: 0x05_43, Armenian_tche: 0x05_73, Armenian_MEN: 0x05_44, Armenian_men: 0x05_74, Armenian_HI: 0x05_45, Armenian_hi: 0x05_75, Armenian_NU: 0x05_46, Armenian_nu: 0x05_76, Armenian_SHA: 0x05_47, Armenian_sha: 0x05_77, Armenian_VO: 0x05_48, Armenian_vo: 0x05_78, Armenian_CHA: 0x05_49, Armenian_cha: 0x05_79, Armenian_PE: 0x05_4a, Armenian_pe: 0x05_7a, Armenian_JE: 0x05_4b, Armenian_je: 0x05_7b, Armenian_RA: 0x05_4c, Armenian_ra: 0x05_7c, Armenian_SE: 0x05_4d, Armenian_se: 0x05_7d, Armenian_VEV: 0x05_4e, Armenian_vev: 0x05_7e, Armenian_TYUN: 0x05_4f, Armenian_tyun: 0x05_7f, Armenian_RE: 0x05_50, Armenian_re: 0x05_80, Armenian_TSO: 0x05_51, Armenian_tso: 0x05_81, Armenian_VYUN: 0x05_52, Armenian_vyun: 0x05_82, Armenian_PYUR: 0x05_53, Armenian_pyur: 0x05_83, Armenian_KE: 0x05_54, Armenian_ke: 0x05_84, Armenian_O: 0x05_55, Armenian_o: 0x05_85, Armenian_FE: 0x05_56, Armenian_fe: 0x05_86, Armenian_apostrophe: 0x05_5a, Georgian_an: 0x10_d0, Georgian_ban: 0x10_d1, Georgian_gan: 0x10_d2, Georgian_don: 0x10_d3, Georgian_en: 0x10_d4, Georgian_vin: 0x10_d5, Georgian_zen: 0x10_d6, Georgian_tan: 0x10_d7, Georgian_in: 0x10_d8, Georgian_kan: 0x10_d9, Georgian_las: 0x10_da, Georgian_man: 0x10_db, Georgian_nar: 0x10_dc, Georgian_on: 0x10_dd, Georgian_par: 0x10_de, Georgian_zhar: 0x10_df, Georgian_rae: 0x10_e0, Georgian_san: 0x10_e1, Georgian_tar: 0x10_e2, Georgian_un: 0x10_e3, Georgian_phar: 0x10_e4, Georgian_khar: 0x10_e5, Georgian_ghan: 0x10_e6, Georgian_qar: 0x10_e7, Georgian_shin: 0x10_e8, Georgian_chin: 0x10_e9, Georgian_can: 0x10_ea, Georgian_jil: 0x10_eb, Georgian_cil: 0x10_ec, Georgian_char: 0x10_ed, Georgian_xan: 0x10_ee, Georgian_jhan: 0x10_ef, Georgian_hae: 0x10_f0, Georgian_he: 0x10_f1, Georgian_hie: 0x10_f2, Georgian_we: 0x10_f3, Georgian_har: 0x10_f4, Georgian_hoe: 0x10_f5, Georgian_fi: 0x10_f6, Xabovedot: 0x1e_8a, Ibreve: 0x01_2c, Zstroke: 0x01_b5, Gcaron: 0x01_e6, Ocaron: 0x01_d2, Obarred: 0x01_9f, xabovedot: 0x1e_8b, ibreve: 0x01_2d, zstroke: 0x01_b6, gcaron: 0x01_e7, ocaron: 0x01_d2, obarred: 0x02_75, SCHWA: 0x01_8f, schwa: 0x02_59, EZH: 0x01_b7, ezh: 0x02_92, Lbelowdot: 0x1e_36, lbelowdot: 0x1e_37, Abelowdot: 0x1e_a0, abelowdot: 0x1e_a1, Ahook: 0x1e_a2, ahook: 0x1e_a3, Acircumflexacute: 0x1e_a4, acircumflexacute: 0x1e_a5, Acircumflexgrave: 0x1e_a6, acircumflexgrave: 0x1e_a7, Acircumflexhook: 0x1e_a8, acircumflexhook: 0x1e_a9, Acircumflextilde: 0x1e_aa, acircumflextilde: 0x1e_ab, Acircumflexbelowdot: 0x1e_ac, acircumflexbelowdot: 0x1e_ad, Abreveacute: 0x1e_ae, abreveacute: 0x1e_af, Abrevegrave: 0x1e_b0, abrevegrave: 0x1e_b1, Abrevehook: 0x1e_b2, abrevehook: 0x1e_b3, Abrevetilde: 0x1e_b4, abrevetilde: 0x1e_b5, Abrevebelowdot: 0x1e_b6, abrevebelowdot: 0x1e_b7, Ebelowdot: 0x1e_b8, ebelowdot: 0x1e_b9, Ehook: 0x1e_ba, ehook: 0x1e_bb, Etilde: 0x1e_bc, etilde: 0x1e_bd, Ecircumflexacute: 0x1e_be, ecircumflexacute: 0x1e_bf, Ecircumflexgrave: 0x1e_c0, ecircumflexgrave: 0x1e_c1, Ecircumflexhook: 0x1e_c2, ecircumflexhook: 0x1e_c3, Ecircumflextilde: 0x1e_c4, ecircumflextilde: 0x1e_c5, Ecircumflexbelowdot: 0x1e_c6, ecircumflexbelowdot: 0x1e_c7, Ihook: 0x1e_c8, ihook: 0x1e_c9, Ibelowdot: 0x1e_ca, ibelowdot: 0x1e_cb, Obelowdot: 0x1e_cc, obelowdot: 0x1e_cd, Ohook: 0x1e_ce, ohook: 0x1e_cf, Ocircumflexacute: 0x1e_d0, ocircumflexacute: 0x1e_d1, Ocircumflexgrave: 0x1e_d2, ocircumflexgrave: 0x1e_d3, Ocircumflexhook: 0x1e_d4, ocircumflexhook: 0x1e_d5, Ocircumflextilde: 0x1e_d6, ocircumflextilde: 0x1e_d7, Ocircumflexbelowdot: 0x1e_d8, ocircumflexbelowdot: 0x1e_d9, Ohornacute: 0x1e_da, ohornacute: 0x1e_db, Ohorngrave: 0x1e_dc, ohorngrave: 0x1e_dd, Ohornhook: 0x1e_de, ohornhook: 0x1e_df, Ohorntilde: 0x1e_e0, ohorntilde: 0x1e_e1, Ohornbelowdot: 0x1e_e2, ohornbelowdot: 0x1e_e3, Ubelowdot: 0x1e_e4, ubelowdot: 0x1e_e5, Uhook: 0x1e_e6, uhook: 0x1e_e7, Uhornacute: 0x1e_e8, uhornacute: 0x1e_e9, Uhorngrave: 0x1e_ea, uhorngrave: 0x1e_eb, Uhornhook: 0x1e_ec, uhornhook: 0x1e_ed, Uhorntilde: 0x1e_ee, uhorntilde: 0x1e_ef, Uhornbelowdot: 0x1e_f0, uhornbelowdot: 0x1e_f1, Ybelowdot: 0x1e_f4, ybelowdot: 0x1e_f5, Yhook: 0x1e_f6, yhook: 0x1e_f7, Ytilde: 0x1e_f8, ytilde: 0x1e_f9, Ohorn: 0x01_a0, ohorn: 0x01_a1, Uhorn: 0x01_af, uhorn: 0x01_b0, EcuSign: 0x20_a0, ColonSign: 0x20_a1, CruzeiroSign: 0x20_a2, FFrancSign: 0x20_a3, LiraSign: 0x20_a4, MillSign: 0x20_a5, NairaSign: 0x20_a6, PesetaSign: 0x20_a7, RupeeSign: 0x20_a8, WonSign: 0x20_a9, NewSheqelSign: 0x20_aa, DongSign: 0x20_ab, EuroSign: 0x20_ac, zerosuperior: 0x20_70, foursuperior: 0x20_74, fivesuperior: 0x20_75, sixsuperior: 0x20_76, sevensuperior: 0x20_77, eightsuperior: 0x20_78, ninesuperior: 0x20_79, zerosubscript: 0x20_80, onesubscript: 0x20_81, twosubscript: 0x20_82, threesubscript: 0x20_83, foursubscript: 0x20_84, fivesubscript: 0x20_85, sixsubscript: 0x20_86, sevensubscript: 0x20_87, eightsubscript: 0x20_88, ninesubscript: 0x20_89, partdifferential: 0x22_02, emptyset: 0x22_05, elementof: 0x22_08, notelementof: 0x22_09, containsas: 0x22_0b, squareroot: 0x22_1a, cuberoot: 0x22_1b, fourthroot: 0x22_1c, dintegral: 0x22_2c, tintegral: 0x22_2d, because: 0x22_35, approxeq: 0x22_45, notapproxeq: 0x22_47, notidentical: 0x22_62, stricteq: 0x22_63, braille_blank: 0x28_00, braille_dots_1: 0x28_01, braille_dots_2: 0x28_02, braille_dots_12: 0x28_03, braille_dots_3: 0x28_04, braille_dots_13: 0x28_05, braille_dots_23: 0x28_06, braille_dots_123: 0x28_07, braille_dots_4: 0x28_08, braille_dots_14: 0x28_09, braille_dots_24: 0x28_0a, braille_dots_124: 0x28_0b, braille_dots_34: 0x28_0c, braille_dots_134: 0x28_0d, braille_dots_234: 0x28_0e, braille_dots_1234: 0x28_0f, braille_dots_5: 0x28_10, braille_dots_15: 0x28_11, braille_dots_25: 0x28_12, braille_dots_125: 0x28_13, braille_dots_35: 0x28_14, braille_dots_135: 0x28_15, braille_dots_235: 0x28_16, braille_dots_1235: 0x28_17, braille_dots_45: 0x28_18, braille_dots_145: 0x28_19, braille_dots_245: 0x28_1a, braille_dots_1245: 0x28_1b, braille_dots_345: 0x28_1c, braille_dots_1345: 0x28_1d, braille_dots_2345: 0x28_1e, braille_dots_12345: 0x28_1f, braille_dots_6: 0x28_20, braille_dots_16: 0x28_21, braille_dots_26: 0x28_22, braille_dots_126: 0x28_23, braille_dots_36: 0x28_24, braille_dots_136: 0x28_25, braille_dots_236: 0x28_26, braille_dots_1236: 0x28_27, braille_dots_46: 0x28_28, braille_dots_146: 0x28_29, braille_dots_246: 0x28_2a, braille_dots_1246: 0x28_2b, braille_dots_346: 0x28_2c, braille_dots_1346: 0x28_2d, braille_dots_2346: 0x28_2e, braille_dots_12346: 0x28_2f, braille_dots_56: 0x28_30, braille_dots_156: 0x28_31, braille_dots_256: 0x28_32, braille_dots_1256: 0x28_33, braille_dots_356: 0x28_34, braille_dots_1356: 0x28_35, braille_dots_2356: 0x28_36, braille_dots_12356: 0x28_37, braille_dots_456: 0x28_38, braille_dots_1456: 0x28_39, braille_dots_2456: 0x28_3a, braille_dots_12456: 0x28_3b, braille_dots_3456: 0x28_3c, braille_dots_13456: 0x28_3d, braille_dots_23456: 0x28_3e, braille_dots_123456: 0x28_3f, braille_dots_7: 0x28_40, braille_dots_17: 0x28_41, braille_dots_27: 0x28_42, braille_dots_127: 0x28_43, braille_dots_37: 0x28_44, braille_dots_137: 0x28_45, braille_dots_237: 0x28_46, braille_dots_1237: 0x28_47, braille_dots_47: 0x28_48, braille_dots_147: 0x28_49, braille_dots_247: 0x28_4a, braille_dots_1247: 0x28_4b, braille_dots_347: 0x28_4c, braille_dots_1347: 0x28_4d, braille_dots_2347: 0x28_4e, braille_dots_12347: 0x28_4f, braille_dots_57: 0x28_50, braille_dots_157: 0x28_51, braille_dots_257: 0x28_52, braille_dots_1257: 0x28_53, braille_dots_357: 0x28_54, braille_dots_1357: 0x28_55, braille_dots_2357: 0x28_56, braille_dots_12357: 0x28_57, braille_dots_457: 0x28_58, braille_dots_1457: 0x28_59, braille_dots_2457: 0x28_5a, braille_dots_12457: 0x28_5b, braille_dots_3457: 0x28_5c, braille_dots_13457: 0x28_5d, braille_dots_23457: 0x28_5e, braille_dots_123457: 0x28_5f, braille_dots_67: 0x28_60, braille_dots_167: 0x28_61, braille_dots_267: 0x28_62, braille_dots_1267: 0x28_63, braille_dots_367: 0x28_64, braille_dots_1367: 0x28_65, braille_dots_2367: 0x28_66, braille_dots_12367: 0x28_67, braille_dots_467: 0x28_68, braille_dots_1467: 0x28_69, braille_dots_2467: 0x28_6a, braille_dots_12467: 0x28_6b, braille_dots_3467: 0x28_6c, braille_dots_13467: 0x28_6d, braille_dots_23467: 0x28_6e, braille_dots_123467: 0x28_6f, braille_dots_567: 0x28_70, braille_dots_1567: 0x28_71, braille_dots_2567: 0x28_72, braille_dots_12567: 0x28_73, braille_dots_3567: 0x28_74, braille_dots_13567: 0x28_75, braille_dots_23567: 0x28_76, braille_dots_123567: 0x28_77, braille_dots_4567: 0x28_78, braille_dots_14567: 0x28_79, braille_dots_24567: 0x28_7a, braille_dots_124567: 0x28_7b, braille_dots_34567: 0x28_7c, braille_dots_134567: 0x28_7d, braille_dots_234567: 0x28_7e, braille_dots_1234567: 0x28_7f, braille_dots_8: 0x28_80, braille_dots_18: 0x28_81, braille_dots_28: 0x28_82, braille_dots_128: 0x28_83, braille_dots_38: 0x28_84, braille_dots_138: 0x28_85, braille_dots_238: 0x28_86, braille_dots_1238: 0x28_87, braille_dots_48: 0x28_88, braille_dots_148: 0x28_89, braille_dots_248: 0x28_8a, braille_dots_1248: 0x28_8b, braille_dots_348: 0x28_8c, braille_dots_1348: 0x28_8d, braille_dots_2348: 0x28_8e, braille_dots_12348: 0x28_8f, braille_dots_58: 0x28_90, braille_dots_158: 0x28_91, braille_dots_258: 0x28_92, braille_dots_1258: 0x28_93, braille_dots_358: 0x28_94, braille_dots_1358: 0x28_95, braille_dots_2358: 0x28_96, braille_dots_12358: 0x28_97, braille_dots_458: 0x28_98, braille_dots_1458: 0x28_99, braille_dots_2458: 0x28_9a, braille_dots_12458: 0x28_9b, braille_dots_3458: 0x28_9c, braille_dots_13458: 0x28_9d, braille_dots_23458: 0x28_9e, braille_dots_123458: 0x28_9f, braille_dots_68: 0x28_a0, braille_dots_168: 0x28_a1, braille_dots_268: 0x28_a2, braille_dots_1268: 0x28_a3, braille_dots_368: 0x28_a4, braille_dots_1368: 0x28_a5, braille_dots_2368: 0x28_a6, braille_dots_12368: 0x28_a7, braille_dots_468: 0x28_a8, braille_dots_1468: 0x28_a9, braille_dots_2468: 0x28_aa, braille_dots_12468: 0x28_ab, braille_dots_3468: 0x28_ac, braille_dots_13468: 0x28_ad, braille_dots_23468: 0x28_ae, braille_dots_123468: 0x28_af, braille_dots_568: 0x28_b0, braille_dots_1568: 0x28_b1, braille_dots_2568: 0x28_b2, braille_dots_12568: 0x28_b3, braille_dots_3568: 0x28_b4, braille_dots_13568: 0x28_b5, braille_dots_23568: 0x28_b6, braille_dots_123568: 0x28_b7, braille_dots_4568: 0x28_b8, braille_dots_14568: 0x28_b9, braille_dots_24568: 0x28_ba, braille_dots_124568: 0x28_bb, braille_dots_34568: 0x28_bc, braille_dots_134568: 0x28_bd, braille_dots_234568: 0x28_be, braille_dots_1234568: 0x28_bf, braille_dots_78: 0x28_c0, braille_dots_178: 0x28_c1, braille_dots_278: 0x28_c2, braille_dots_1278: 0x28_c3, braille_dots_378: 0x28_c4, braille_dots_1378: 0x28_c5, braille_dots_2378: 0x28_c6, braille_dots_12378: 0x28_c7, braille_dots_478: 0x28_c8, braille_dots_1478: 0x28_c9, braille_dots_2478: 0x28_ca, braille_dots_12478: 0x28_cb, braille_dots_3478: 0x28_cc, braille_dots_13478: 0x28_cd, braille_dots_23478: 0x28_ce, braille_dots_123478: 0x28_cf, braille_dots_578: 0x28_d0, braille_dots_1578: 0x28_d1, braille_dots_2578: 0x28_d2, braille_dots_12578: 0x28_d3, braille_dots_3578: 0x28_d4, braille_dots_13578: 0x28_d5, braille_dots_23578: 0x28_d6, braille_dots_123578: 0x28_d7, braille_dots_4578: 0x28_d8, braille_dots_14578: 0x28_d9, braille_dots_24578: 0x28_da, braille_dots_124578: 0x28_db, braille_dots_34578: 0x28_dc, braille_dots_134578: 0x28_dd, braille_dots_234578: 0x28_de, braille_dots_1234578: 0x28_df, braille_dots_678: 0x28_e0, braille_dots_1678: 0x28_e1, braille_dots_2678: 0x28_e2, braille_dots_12678: 0x28_e3, braille_dots_3678: 0x28_e4, braille_dots_13678: 0x28_e5, braille_dots_23678: 0x28_e6, braille_dots_123678: 0x28_e7, braille_dots_4678: 0x28_e8, braille_dots_14678: 0x28_e9, braille_dots_24678: 0x28_ea, braille_dots_124678: 0x28_eb, braille_dots_34678: 0x28_ec, braille_dots_134678: 0x28_ed, braille_dots_234678: 0x28_ee, braille_dots_1234678: 0x28_ef, braille_dots_5678: 0x28_f0, braille_dots_15678: 0x28_f1, braille_dots_25678: 0x28_f2, braille_dots_125678: 0x28_f3, braille_dots_35678: 0x28_f4, braille_dots_135678: 0x28_f5, braille_dots_235678: 0x28_f6, braille_dots_1235678: 0x28_f7, braille_dots_45678: 0x28_f8, braille_dots_145678: 0x28_f9, braille_dots_245678: 0x28_fa, braille_dots_1245678: 0x28_fb, braille_dots_345678: 0x28_fc, braille_dots_1345678: 0x28_fd, braille_dots_2345678: 0x28_fe, braille_dots_12345678: 0x28_ff, Sinh_ng: 0x0d_82, Sinh_h2: 0x0d_83, Sinh_a: 0x0d_85, Sinh_aa: 0x0d_86, Sinh_ae: 0x0d_87, Sinh_aee: 0x0d_88, Sinh_i: 0x0d_89, Sinh_ii: 0x0d_8a, Sinh_u: 0x0d_8b, Sinh_uu: 0x0d_8c, Sinh_ri: 0x0d_8d, Sinh_rii: 0x0d_8e, Sinh_lu: 0x0d_8f, Sinh_luu: 0x0d_90, Sinh_e: 0x0d_91, Sinh_ee: 0x0d_92, Sinh_ai: 0x0d_93, Sinh_o: 0x0d_94, Sinh_oo: 0x0d_95, Sinh_au: 0x0d_96, Sinh_ka: 0x0d_9a, Sinh_kha: 0x0d_9b, Sinh_ga: 0x0d_9c, Sinh_gha: 0x0d_9d, Sinh_ng2: 0x0d_9e, Sinh_nga: 0x0d_9f, Sinh_ca: 0x0d_a0, Sinh_cha: 0x0d_a1, Sinh_ja: 0x0d_a2, Sinh_jha: 0x0d_a3, Sinh_nya: 0x0d_a4, Sinh_jnya: 0x0d_a5, Sinh_nja: 0x0d_a6, Sinh_tta: 0x0d_a7, Sinh_ttha: 0x0d_a8, Sinh_dda: 0x0d_a9, Sinh_ddha: 0x0d_aa, Sinh_nna: 0x0d_ab, Sinh_ndda: 0x0d_ac, Sinh_tha: 0x0d_ad, Sinh_thha: 0x0d_ae, Sinh_dha: 0x0d_af, Sinh_dhha: 0x0d_b0, Sinh_na: 0x0d_b1, Sinh_ndha: 0x0d_b3, Sinh_pa: 0x0d_b4, Sinh_pha: 0x0d_b5, Sinh_ba: 0x0d_b6, Sinh_bha: 0x0d_b7, Sinh_ma: 0x0d_b8, Sinh_mba: 0x0d_b9, Sinh_ya: 0x0d_ba, Sinh_ra: 0x0d_bb, Sinh_la: 0x0d_bd, Sinh_va: 0x0d_c0, Sinh_sha: 0x0d_c1, Sinh_ssha: 0x0d_c2, Sinh_sa: 0x0d_c3, Sinh_ha: 0x0d_c4, Sinh_lla: 0x0d_c5, Sinh_fa: 0x0d_c6, Sinh_al: 0x0d_ca, Sinh_aa2: 0x0d_cf, Sinh_ae2: 0x0d_d0, Sinh_aee2: 0x0d_d1, Sinh_i2: 0x0d_d2, Sinh_ii2: 0x0d_d3, Sinh_u2: 0x0d_d4, Sinh_uu2: 0x0d_d6, Sinh_ru2: 0x0d_d8, Sinh_e2: 0x0d_d9, Sinh_ee2: 0x0d_da, Sinh_ai2: 0x0d_db, Sinh_o2: 0x0d_dc, Sinh_oo2: 0x0d_dd, Sinh_au2: 0x0d_de, Sinh_lu2: 0x0d_df, Sinh_ruu2: 0x0d_f2, Sinh_luu2: 0x0d_f3, Sinh_kunddaliya: 0x0d_f4, }; const CHAR_TO_NAME = { " ": "space", }; for (const keysym in KEYSYM_TO_UNICODE) { const u = KEYSYM_TO_UNICODE[keysym]; const character = String.fromCharCode(u); CHAR_TO_NAME[character] = keysym; } //some keysyms require specific layouts const KEYSYM_TO_LAYOUT = { kana: "jp", Farsi: "ir", Arabic: "ar", Cyrillic: "ru", Ukrainian: "ua", Macedonia: "mk", Greek: "gr", hebrew: "he", Thai: "th", Armenian: "am", Georgian: "ge", braille: "brai", }; /** * Maps web keycodes to the corresponding X11 keysym: * * TODO: some values are missing.. */ const CHARCODE_TO_NAME = { 8: "BackSpace", 9: "Tab", 12: "KP_Begin", 13: "Return", 16: "Shift_L", 17: "Control_L", 18: "Alt_L", 19: "Pause", //pause/break 20: "Caps_Lock", 27: "Escape", 31: "Mode_switch", 32: "space", 33: "Prior", //Page Up 34: "Next", //Page Down 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 42: "Print", 45: "Insert", 46: "Delete", 58: "colon", 59: "semicolon", 60: "less", 61: "equal", 62: "greater", 63: "question", 64: "at", 91: "Menu", //Left Window Key 92: "Menu", //Right Window Key 93: "KP_Enter", //"select key"? 106: "KP_Multiply", 107: "KP_Add", 109: "KP_Subtract", 110: "KP_Delete", 111: "KP_Divide", 144: "Num_Lock", 145: "Scroll_Lock", 160: "dead_circumflex", 161: "exclam", 162: "quotedbl", 163: "numbersign", 164: "dollar", 165: "percent", 166: "ampersand", 167: "underscore", 168: "parenleft", 169: "parenright", 170: "asterisk", 171: "plus", 172: "bar", 173: "minus", 174: "braceleft", 175: "braceright", 176: "asciitilde", 186: "semicolon", 187: "equal", 188: "comma", 189: "minus", 190: "period", 191: "slash", 192: "grave", 219: "bracketleft", 220: "backslash", 221: "bracketright", 222: "apostrophe", }; for (let index = 0; index < 26; index++) { CHARCODE_TO_NAME[65 + index] = "abcdefghijklmnopqrstuvwxyz" [index]; } for (let index = 0; index < 10; index++) { CHARCODE_TO_NAME[48 + index] = `${index}`; CHARCODE_TO_NAME[96 + index] = `${index}`; //fix for OSX numpad?: CHARCODE_TO_NAME[96+i] = "KP_"+i; } for (let index = 1; index <= 24; index++) { CHARCODE_TO_NAME[111 + index] = `F${index}`; } //overrides: only for 'de' layout? CHARCODE_TO_NAME[192] = "dead_circumflex"; CHARCODE_TO_NAME[219] = "backtick"; CHARCODE_TO_NAME[221] = "dead_acute"; CHARCODE_TO_NAME[220] = "dead_circumflex"; CHARCODE_TO_NAME[187] = "dead_acute"; CHARCODE_TO_NAME_SHIFTED = {}; CHARCODE_TO_NAME_SHIFTED[187] = "dead_grave"; CHARCODE_TO_NAME_SHIFTED[221] = "dead_grave"; /** * Converts an event into a list of modifiers. * * @param event * @returns {Array} of strings */ function get_event_modifiers(event) { const modifiers = []; if (event.getModifierState) { if (event.getModifierState("Control")) modifiers.push("control"); if (event.getModifierState("Alt")) modifiers.push("alt"); if (event.getModifierState("Meta")) modifiers.push("meta"); if (event.getModifierState("Shift")) modifiers.push("shift"); if (event.getModifierState("CapsLock")) modifiers.push("capslock"); if (event.getModifierState("NumLock")) modifiers.push("numlock"); //ScrollLock //Fn //AltGraph } else if (event.modifiers) { if (event.modifiers & Event.ALT_MASK) modifiers.push("alt"); if (event.modifiers & Event.CONTROL_MASK) modifiers.push("control"); if (event.modifiers & Event.SHIFT_MASK) modifiers.push("shift"); if (event.modifiers & Event.META_MASK) modifiers.push("meta"); } else { if (event.altKey) modifiers.push("alt"); if (event.ctrlKey) modifiers.push("control"); if (event.metaKey) modifiers.push("meta"); if (event.shiftKey) modifiers.push("shift"); } return modifiers; }