From eedf4bfffb47b42baa54ea012815a204f6c9ce84 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Wed, 23 Feb 2022 07:26:31 -0500 Subject: [PATCH] rules: use local file for conversion from key names to keysyms --- lib/keysyms/generate.py | 39 + lib/keysyms/keysymdef.py | 2279 ++++++++++++++++++++++++++++ lib/logitech_receiver/diversion.py | 74 +- lib/solaar/ui/diversion_rules.py | 12 +- 4 files changed, 2369 insertions(+), 35 deletions(-) create mode 100755 lib/keysyms/generate.py create mode 100644 lib/keysyms/keysymdef.py diff --git a/lib/keysyms/generate.py b/lib/keysyms/generate.py new file mode 100755 index 00000000..757587bc --- /dev/null +++ b/lib/keysyms/generate.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +from pathlib import Path +from pprint import pprint +from re import findall +from subprocess import run +from tempfile import TemporaryDirectory + +repo = 'https://github.com/freedesktop/xorg-proto-x11proto.git' +pattern = r'#define XK_(\w+)\s+0x(\w+)(?:\s+/\*\s+U\+(\w+))?' +xf86pattern = r'#define XF86XK_(\w+)\s+0x(\w+)(?:\s+/\*\s+U\+(\w+))?' + + +def main(): + keysymdef = {} + + with TemporaryDirectory() as temp: + run(['git', 'clone', repo, '.'], cwd=temp) + text = Path(temp, 'keysymdef.h').read_text() + for name, sym, uni in findall(pattern, text): + sym = int(sym, 16) + uni = int(uni, 16) if uni else None + if keysymdef.get(name, None): + print('KEY DUP', name) + keysymdef[name] = sym + text = Path(temp, 'XF86keysym.h').read_text() + for name, sym, uni in findall(xf86pattern, text): + sym = int(sym, 16) + uni = int(uni, 16) if uni else None + if keysymdef.get('XF86_' + name, None): + print('KEY DUP', 'XF86_' + name) + keysymdef['XF86_' + name] = sym + + with open('keysymdef.py', 'w') as f: + f.write('# flake8: noqa\nkeysymdef = \\\n') + pprint(keysymdef, f) + + +if __name__ == '__main__': + main() diff --git a/lib/keysyms/keysymdef.py b/lib/keysyms/keysymdef.py new file mode 100644 index 00000000..89a1471b --- /dev/null +++ b/lib/keysyms/keysymdef.py @@ -0,0 +1,2279 @@ +# flake8: noqa E122 +# flake8: noqa E127 +keysymdef = \ +{'0': 48, + '1': 49, + '2': 50, + '3': 51, + '3270_AltCursor': 64784, + '3270_Attn': 64782, + '3270_BackTab': 64773, + '3270_ChangeScreen': 64793, + '3270_Copy': 64789, + '3270_CursorBlink': 64783, + '3270_CursorSelect': 64796, + '3270_DeleteWord': 64794, + '3270_Duplicate': 64769, + '3270_Enter': 64798, + '3270_EraseEOF': 64774, + '3270_EraseInput': 64775, + '3270_ExSelect': 64795, + '3270_FieldMark': 64770, + '3270_Ident': 64787, + '3270_Jump': 64786, + '3270_KeyClick': 64785, + '3270_Left2': 64772, + '3270_PA1': 64778, + '3270_PA2': 64779, + '3270_PA3': 64780, + '3270_Play': 64790, + '3270_PrintScreen': 64797, + '3270_Quit': 64777, + '3270_Record': 64792, + '3270_Reset': 64776, + '3270_Right2': 64771, + '3270_Rule': 64788, + '3270_Setup': 64791, + '3270_Test': 64781, + '4': 52, + '5': 53, + '6': 54, + '7': 55, + '8': 56, + '9': 57, + 'A': 65, + 'AE': 198, + 'Aacute': 193, + 'Abelowdot': 16785056, + 'Abreve': 451, + 'Abreveacute': 16785070, + 'Abrevebelowdot': 16785078, + 'Abrevegrave': 16785072, + 'Abrevehook': 16785074, + 'Abrevetilde': 16785076, + 'AccessX_Enable': 65136, + 'AccessX_Feedback_Enable': 65137, + 'Acircumflex': 194, + 'Acircumflexacute': 16785060, + 'Acircumflexbelowdot': 16785068, + 'Acircumflexgrave': 16785062, + 'Acircumflexhook': 16785064, + 'Acircumflextilde': 16785066, + 'Adiaeresis': 196, + 'Agrave': 192, + 'Ahook': 16785058, + 'Alt_L': 65513, + 'Alt_R': 65514, + 'Amacron': 960, + 'Aogonek': 417, + 'Arabic_0': 16778848, + 'Arabic_1': 16778849, + 'Arabic_2': 16778850, + 'Arabic_3': 16778851, + 'Arabic_4': 16778852, + 'Arabic_5': 16778853, + 'Arabic_6': 16778854, + 'Arabic_7': 16778855, + 'Arabic_8': 16778856, + 'Arabic_9': 16778857, + 'Arabic_ain': 1497, + 'Arabic_alef': 1479, + 'Arabic_alefmaksura': 1513, + 'Arabic_beh': 1480, + 'Arabic_comma': 1452, + 'Arabic_dad': 1494, + 'Arabic_dal': 1487, + 'Arabic_damma': 1519, + 'Arabic_dammatan': 1516, + 'Arabic_ddal': 16778888, + 'Arabic_farsi_yeh': 16778956, + 'Arabic_fatha': 1518, + 'Arabic_fathatan': 1515, + 'Arabic_feh': 1505, + 'Arabic_fullstop': 16778964, + 'Arabic_gaf': 16778927, + 'Arabic_ghain': 1498, + 'Arabic_ha': 1511, + 'Arabic_hah': 1485, + 'Arabic_hamza': 1473, + 'Arabic_hamza_above': 16778836, + 'Arabic_hamza_below': 16778837, + 'Arabic_hamzaonalef': 1475, + 'Arabic_hamzaonwaw': 1476, + 'Arabic_hamzaonyeh': 1478, + 'Arabic_hamzaunderalef': 1477, + 'Arabic_heh': 1511, + 'Arabic_heh_doachashmee': 16778942, + 'Arabic_heh_goal': 16778945, + 'Arabic_jeem': 1484, + 'Arabic_jeh': 16778904, + 'Arabic_kaf': 1507, + 'Arabic_kasra': 1520, + 'Arabic_kasratan': 1517, + 'Arabic_keheh': 16778921, + 'Arabic_khah': 1486, + 'Arabic_lam': 1508, + 'Arabic_madda_above': 16778835, + 'Arabic_maddaonalef': 1474, + 'Arabic_meem': 1509, + 'Arabic_noon': 1510, + 'Arabic_noon_ghunna': 16778938, + 'Arabic_peh': 16778878, + 'Arabic_percent': 16778858, + 'Arabic_qaf': 1506, + 'Arabic_question_mark': 1471, + 'Arabic_ra': 1489, + 'Arabic_rreh': 16778897, + 'Arabic_sad': 1493, + 'Arabic_seen': 1491, + 'Arabic_semicolon': 1467, + 'Arabic_shadda': 1521, + 'Arabic_sheen': 1492, + 'Arabic_sukun': 1522, + 'Arabic_superscript_alef': 16778864, + 'Arabic_switch': 65406, + 'Arabic_tah': 1495, + 'Arabic_tatweel': 1504, + 'Arabic_tcheh': 16778886, + 'Arabic_teh': 1482, + 'Arabic_tehmarbuta': 1481, + 'Arabic_thal': 1488, + 'Arabic_theh': 1483, + 'Arabic_tteh': 16778873, + 'Arabic_veh': 16778916, + 'Arabic_waw': 1512, + 'Arabic_yeh': 1514, + 'Arabic_yeh_baree': 16778962, + 'Arabic_zah': 1496, + 'Arabic_zain': 1490, + 'Aring': 197, + 'Armenian_AT': 16778552, + 'Armenian_AYB': 16778545, + 'Armenian_BEN': 16778546, + 'Armenian_CHA': 16778569, + 'Armenian_DA': 16778548, + 'Armenian_DZA': 16778561, + 'Armenian_E': 16778551, + 'Armenian_FE': 16778582, + 'Armenian_GHAT': 16778562, + 'Armenian_GIM': 16778547, + 'Armenian_HI': 16778565, + 'Armenian_HO': 16778560, + 'Armenian_INI': 16778555, + 'Armenian_JE': 16778571, + 'Armenian_KE': 16778580, + 'Armenian_KEN': 16778559, + 'Armenian_KHE': 16778557, + 'Armenian_LYUN': 16778556, + 'Armenian_MEN': 16778564, + 'Armenian_NU': 16778566, + 'Armenian_O': 16778581, + 'Armenian_PE': 16778570, + 'Armenian_PYUR': 16778579, + 'Armenian_RA': 16778572, + 'Armenian_RE': 16778576, + 'Armenian_SE': 16778573, + 'Armenian_SHA': 16778567, + 'Armenian_TCHE': 16778563, + 'Armenian_TO': 16778553, + 'Armenian_TSA': 16778558, + 'Armenian_TSO': 16778577, + 'Armenian_TYUN': 16778575, + 'Armenian_VEV': 16778574, + 'Armenian_VO': 16778568, + 'Armenian_VYUN': 16778578, + 'Armenian_YECH': 16778549, + 'Armenian_ZA': 16778550, + 'Armenian_ZHE': 16778554, + 'Armenian_accent': 16778587, + 'Armenian_amanak': 16778588, + 'Armenian_apostrophe': 16778586, + 'Armenian_at': 16778600, + 'Armenian_ayb': 16778593, + 'Armenian_ben': 16778594, + 'Armenian_but': 16778589, + 'Armenian_cha': 16778617, + 'Armenian_da': 16778596, + 'Armenian_dza': 16778609, + 'Armenian_e': 16778599, + 'Armenian_exclam': 16778588, + 'Armenian_fe': 16778630, + 'Armenian_full_stop': 16778633, + 'Armenian_ghat': 16778610, + 'Armenian_gim': 16778595, + 'Armenian_hi': 16778613, + 'Armenian_ho': 16778608, + 'Armenian_hyphen': 16778634, + 'Armenian_ini': 16778603, + 'Armenian_je': 16778619, + 'Armenian_ke': 16778628, + 'Armenian_ken': 16778607, + 'Armenian_khe': 16778605, + 'Armenian_ligature_ew': 16778631, + 'Armenian_lyun': 16778604, + 'Armenian_men': 16778612, + 'Armenian_nu': 16778614, + 'Armenian_o': 16778629, + 'Armenian_paruyk': 16778590, + 'Armenian_pe': 16778618, + 'Armenian_pyur': 16778627, + 'Armenian_question': 16778590, + 'Armenian_ra': 16778620, + 'Armenian_re': 16778624, + 'Armenian_se': 16778621, + 'Armenian_separation_mark': 16778589, + 'Armenian_sha': 16778615, + 'Armenian_shesht': 16778587, + 'Armenian_tche': 16778611, + 'Armenian_to': 16778601, + 'Armenian_tsa': 16778606, + 'Armenian_tso': 16778625, + 'Armenian_tyun': 16778623, + 'Armenian_verjaket': 16778633, + 'Armenian_vev': 16778622, + 'Armenian_vo': 16778616, + 'Armenian_vyun': 16778626, + 'Armenian_yech': 16778597, + 'Armenian_yentamna': 16778634, + 'Armenian_za': 16778598, + 'Armenian_zhe': 16778602, + 'Atilde': 195, + 'AudibleBell_Enable': 65146, + 'B': 66, + 'Babovedot': 16784898, + 'BackSpace': 65288, + 'Begin': 65368, + 'BounceKeys_Enable': 65140, + 'Break': 65387, + 'Byelorussian_SHORTU': 1726, + 'Byelorussian_shortu': 1710, + 'C': 67, + 'CH': 65186, + 'C_H': 65189, + 'C_h': 65188, + 'Cabovedot': 709, + 'Cacute': 454, + 'Cancel': 65385, + 'Caps_Lock': 65509, + 'Ccaron': 456, + 'Ccedilla': 199, + 'Ccircumflex': 710, + 'Ch': 65185, + 'Clear': 65291, + 'Codeinput': 65335, + 'ColonSign': 16785569, + 'Control_L': 65507, + 'Control_R': 65508, + 'CruzeiroSign': 16785570, + 'Cyrillic_A': 1761, + 'Cyrillic_BE': 1762, + 'Cyrillic_CHE': 1790, + 'Cyrillic_CHE_descender': 16778422, + 'Cyrillic_CHE_vertstroke': 16778424, + 'Cyrillic_DE': 1764, + 'Cyrillic_DZHE': 1727, + 'Cyrillic_E': 1788, + 'Cyrillic_EF': 1766, + 'Cyrillic_EL': 1772, + 'Cyrillic_EM': 1773, + 'Cyrillic_EN': 1774, + 'Cyrillic_EN_descender': 16778402, + 'Cyrillic_ER': 1778, + 'Cyrillic_ES': 1779, + 'Cyrillic_GHE': 1767, + 'Cyrillic_GHE_bar': 16778386, + 'Cyrillic_HA': 1768, + 'Cyrillic_HARDSIGN': 1791, + 'Cyrillic_HA_descender': 16778418, + 'Cyrillic_I': 1769, + 'Cyrillic_IE': 1765, + 'Cyrillic_IO': 1715, + 'Cyrillic_I_macron': 16778466, + 'Cyrillic_JE': 1720, + 'Cyrillic_KA': 1771, + 'Cyrillic_KA_descender': 16778394, + 'Cyrillic_KA_vertstroke': 16778396, + 'Cyrillic_LJE': 1721, + 'Cyrillic_NJE': 1722, + 'Cyrillic_O': 1775, + 'Cyrillic_O_bar': 16778472, + 'Cyrillic_PE': 1776, + 'Cyrillic_SCHWA': 16778456, + 'Cyrillic_SHA': 1787, + 'Cyrillic_SHCHA': 1789, + 'Cyrillic_SHHA': 16778426, + 'Cyrillic_SHORTI': 1770, + 'Cyrillic_SOFTSIGN': 1784, + 'Cyrillic_TE': 1780, + 'Cyrillic_TSE': 1763, + 'Cyrillic_U': 1781, + 'Cyrillic_U_macron': 16778478, + 'Cyrillic_U_straight': 16778414, + 'Cyrillic_U_straight_bar': 16778416, + 'Cyrillic_VE': 1783, + 'Cyrillic_YA': 1777, + 'Cyrillic_YERU': 1785, + 'Cyrillic_YU': 1760, + 'Cyrillic_ZE': 1786, + 'Cyrillic_ZHE': 1782, + 'Cyrillic_ZHE_descender': 16778390, + 'Cyrillic_a': 1729, + 'Cyrillic_be': 1730, + 'Cyrillic_che': 1758, + 'Cyrillic_che_descender': 16778423, + 'Cyrillic_che_vertstroke': 16778425, + 'Cyrillic_de': 1732, + 'Cyrillic_dzhe': 1711, + 'Cyrillic_e': 1756, + 'Cyrillic_ef': 1734, + 'Cyrillic_el': 1740, + 'Cyrillic_em': 1741, + 'Cyrillic_en': 1742, + 'Cyrillic_en_descender': 16778403, + 'Cyrillic_er': 1746, + 'Cyrillic_es': 1747, + 'Cyrillic_ghe': 1735, + 'Cyrillic_ghe_bar': 16778387, + 'Cyrillic_ha': 1736, + 'Cyrillic_ha_descender': 16778419, + 'Cyrillic_hardsign': 1759, + 'Cyrillic_i': 1737, + 'Cyrillic_i_macron': 16778467, + 'Cyrillic_ie': 1733, + 'Cyrillic_io': 1699, + 'Cyrillic_je': 1704, + 'Cyrillic_ka': 1739, + 'Cyrillic_ka_descender': 16778395, + 'Cyrillic_ka_vertstroke': 16778397, + 'Cyrillic_lje': 1705, + 'Cyrillic_nje': 1706, + 'Cyrillic_o': 1743, + 'Cyrillic_o_bar': 16778473, + 'Cyrillic_pe': 1744, + 'Cyrillic_schwa': 16778457, + 'Cyrillic_sha': 1755, + 'Cyrillic_shcha': 1757, + 'Cyrillic_shha': 16778427, + 'Cyrillic_shorti': 1738, + 'Cyrillic_softsign': 1752, + 'Cyrillic_te': 1748, + 'Cyrillic_tse': 1731, + 'Cyrillic_u': 1749, + 'Cyrillic_u_macron': 16778479, + 'Cyrillic_u_straight': 16778415, + 'Cyrillic_u_straight_bar': 16778417, + 'Cyrillic_ve': 1751, + 'Cyrillic_ya': 1745, + 'Cyrillic_yeru': 1753, + 'Cyrillic_yu': 1728, + 'Cyrillic_ze': 1754, + 'Cyrillic_zhe': 1750, + 'Cyrillic_zhe_descender': 16778391, + 'D': 68, + 'Dabovedot': 16784906, + 'Dcaron': 463, + 'Delete': 65535, + 'DongSign': 16785579, + 'Down': 65364, + 'Dstroke': 464, + 'E': 69, + 'ENG': 957, + 'ETH': 208, + 'EZH': 16777655, + 'Eabovedot': 972, + 'Eacute': 201, + 'Ebelowdot': 16785080, + 'Ecaron': 460, + 'Ecircumflex': 202, + 'Ecircumflexacute': 16785086, + 'Ecircumflexbelowdot': 16785094, + 'Ecircumflexgrave': 16785088, + 'Ecircumflexhook': 16785090, + 'Ecircumflextilde': 16785092, + 'EcuSign': 16785568, + 'Ediaeresis': 203, + 'Egrave': 200, + 'Ehook': 16785082, + 'Eisu_Shift': 65327, + 'Eisu_toggle': 65328, + 'Emacron': 938, + 'End': 65367, + 'Eogonek': 458, + 'Escape': 65307, + 'Eth': 208, + 'Etilde': 16785084, + 'EuroSign': 8364, + 'Execute': 65378, + 'F': 70, + 'F1': 65470, + 'F10': 65479, + 'F11': 65480, + 'F12': 65481, + 'F13': 65482, + 'F14': 65483, + 'F15': 65484, + 'F16': 65485, + 'F17': 65486, + 'F18': 65487, + 'F19': 65488, + 'F2': 65471, + 'F20': 65489, + 'F21': 65490, + 'F22': 65491, + 'F23': 65492, + 'F24': 65493, + 'F25': 65494, + 'F26': 65495, + 'F27': 65496, + 'F28': 65497, + 'F29': 65498, + 'F3': 65472, + 'F30': 65499, + 'F31': 65500, + 'F32': 65501, + 'F33': 65502, + 'F34': 65503, + 'F35': 65504, + 'F4': 65473, + 'F5': 65474, + 'F6': 65475, + 'F7': 65476, + 'F8': 65477, + 'F9': 65478, + 'FFrancSign': 16785571, + 'Fabovedot': 16784926, + 'Farsi_0': 16778992, + 'Farsi_1': 16778993, + 'Farsi_2': 16778994, + 'Farsi_3': 16778995, + 'Farsi_4': 16778996, + 'Farsi_5': 16778997, + 'Farsi_6': 16778998, + 'Farsi_7': 16778999, + 'Farsi_8': 16779000, + 'Farsi_9': 16779001, + 'Farsi_yeh': 16778956, + 'Find': 65384, + 'First_Virtual_Screen': 65232, + 'G': 71, + 'Gabovedot': 725, + 'Gbreve': 683, + 'Gcaron': 16777702, + 'Gcedilla': 939, + 'Gcircumflex': 728, + 'Georgian_an': 16781520, + 'Georgian_ban': 16781521, + 'Georgian_can': 16781546, + 'Georgian_char': 16781549, + 'Georgian_chin': 16781545, + 'Georgian_cil': 16781548, + 'Georgian_don': 16781523, + 'Georgian_en': 16781524, + 'Georgian_fi': 16781558, + 'Georgian_gan': 16781522, + 'Georgian_ghan': 16781542, + 'Georgian_hae': 16781552, + 'Georgian_har': 16781556, + 'Georgian_he': 16781553, + 'Georgian_hie': 16781554, + 'Georgian_hoe': 16781557, + 'Georgian_in': 16781528, + 'Georgian_jhan': 16781551, + 'Georgian_jil': 16781547, + 'Georgian_kan': 16781529, + 'Georgian_khar': 16781541, + 'Georgian_las': 16781530, + 'Georgian_man': 16781531, + 'Georgian_nar': 16781532, + 'Georgian_on': 16781533, + 'Georgian_par': 16781534, + 'Georgian_phar': 16781540, + 'Georgian_qar': 16781543, + 'Georgian_rae': 16781536, + 'Georgian_san': 16781537, + 'Georgian_shin': 16781544, + 'Georgian_tan': 16781527, + 'Georgian_tar': 16781538, + 'Georgian_un': 16781539, + 'Georgian_vin': 16781525, + 'Georgian_we': 16781555, + 'Georgian_xan': 16781550, + 'Georgian_zen': 16781526, + 'Georgian_zhar': 16781535, + 'Greek_ALPHA': 1985, + 'Greek_ALPHAaccent': 1953, + 'Greek_BETA': 1986, + 'Greek_CHI': 2007, + 'Greek_DELTA': 1988, + 'Greek_EPSILON': 1989, + 'Greek_EPSILONaccent': 1954, + 'Greek_ETA': 1991, + 'Greek_ETAaccent': 1955, + 'Greek_GAMMA': 1987, + 'Greek_IOTA': 1993, + 'Greek_IOTAaccent': 1956, + 'Greek_IOTAdiaeresis': 1957, + 'Greek_IOTAdieresis': 1957, + 'Greek_KAPPA': 1994, + 'Greek_LAMBDA': 1995, + 'Greek_LAMDA': 1995, + 'Greek_MU': 1996, + 'Greek_NU': 1997, + 'Greek_OMEGA': 2009, + 'Greek_OMEGAaccent': 1963, + 'Greek_OMICRON': 1999, + 'Greek_OMICRONaccent': 1959, + 'Greek_PHI': 2006, + 'Greek_PI': 2000, + 'Greek_PSI': 2008, + 'Greek_RHO': 2001, + 'Greek_SIGMA': 2002, + 'Greek_TAU': 2004, + 'Greek_THETA': 1992, + 'Greek_UPSILON': 2005, + 'Greek_UPSILONaccent': 1960, + 'Greek_UPSILONdieresis': 1961, + 'Greek_XI': 1998, + 'Greek_ZETA': 1990, + 'Greek_accentdieresis': 1966, + 'Greek_alpha': 2017, + 'Greek_alphaaccent': 1969, + 'Greek_beta': 2018, + 'Greek_chi': 2039, + 'Greek_delta': 2020, + 'Greek_epsilon': 2021, + 'Greek_epsilonaccent': 1970, + 'Greek_eta': 2023, + 'Greek_etaaccent': 1971, + 'Greek_finalsmallsigma': 2035, + 'Greek_gamma': 2019, + 'Greek_horizbar': 1967, + 'Greek_iota': 2025, + 'Greek_iotaaccent': 1972, + 'Greek_iotaaccentdieresis': 1974, + 'Greek_iotadieresis': 1973, + 'Greek_kappa': 2026, + 'Greek_lambda': 2027, + 'Greek_lamda': 2027, + 'Greek_mu': 2028, + 'Greek_nu': 2029, + 'Greek_omega': 2041, + 'Greek_omegaaccent': 1979, + 'Greek_omicron': 2031, + 'Greek_omicronaccent': 1975, + 'Greek_phi': 2038, + 'Greek_pi': 2032, + 'Greek_psi': 2040, + 'Greek_rho': 2033, + 'Greek_sigma': 2034, + 'Greek_switch': 65406, + 'Greek_tau': 2036, + 'Greek_theta': 2024, + 'Greek_upsilon': 2037, + 'Greek_upsilonaccent': 1976, + 'Greek_upsilonaccentdieresis': 1978, + 'Greek_upsilondieresis': 1977, + 'Greek_xi': 2030, + 'Greek_zeta': 2022, + 'H': 72, + 'Hangul': 65329, + 'Hangul_A': 3775, + 'Hangul_AE': 3776, + 'Hangul_AraeA': 3830, + 'Hangul_AraeAE': 3831, + 'Hangul_Banja': 65337, + 'Hangul_Cieuc': 3770, + 'Hangul_Codeinput': 65335, + 'Hangul_Dikeud': 3751, + 'Hangul_E': 3780, + 'Hangul_EO': 3779, + 'Hangul_EU': 3793, + 'Hangul_End': 65331, + 'Hangul_Hanja': 65332, + 'Hangul_Hieuh': 3774, + 'Hangul_I': 3795, + 'Hangul_Ieung': 3767, + 'Hangul_J_Cieuc': 3818, + 'Hangul_J_Dikeud': 3802, + 'Hangul_J_Hieuh': 3822, + 'Hangul_J_Ieung': 3816, + 'Hangul_J_Jieuj': 3817, + 'Hangul_J_Khieuq': 3819, + 'Hangul_J_Kiyeog': 3796, + 'Hangul_J_KiyeogSios': 3798, + 'Hangul_J_KkogjiDalrinIeung': 3833, + 'Hangul_J_Mieum': 3811, + 'Hangul_J_Nieun': 3799, + 'Hangul_J_NieunHieuh': 3801, + 'Hangul_J_NieunJieuj': 3800, + 'Hangul_J_PanSios': 3832, + 'Hangul_J_Phieuf': 3821, + 'Hangul_J_Pieub': 3812, + 'Hangul_J_PieubSios': 3813, + 'Hangul_J_Rieul': 3803, + 'Hangul_J_RieulHieuh': 3810, + 'Hangul_J_RieulKiyeog': 3804, + 'Hangul_J_RieulMieum': 3805, + 'Hangul_J_RieulPhieuf': 3809, + 'Hangul_J_RieulPieub': 3806, + 'Hangul_J_RieulSios': 3807, + 'Hangul_J_RieulTieut': 3808, + 'Hangul_J_Sios': 3814, + 'Hangul_J_SsangKiyeog': 3797, + 'Hangul_J_SsangSios': 3815, + 'Hangul_J_Tieut': 3820, + 'Hangul_J_YeorinHieuh': 3834, + 'Hangul_Jamo': 65333, + 'Hangul_Jeonja': 65336, + 'Hangul_Jieuj': 3768, + 'Hangul_Khieuq': 3771, + 'Hangul_Kiyeog': 3745, + 'Hangul_KiyeogSios': 3747, + 'Hangul_KkogjiDalrinIeung': 3827, + 'Hangul_Mieum': 3761, + 'Hangul_MultipleCandidate': 65341, + 'Hangul_Nieun': 3748, + 'Hangul_NieunHieuh': 3750, + 'Hangul_NieunJieuj': 3749, + 'Hangul_O': 3783, + 'Hangul_OE': 3786, + 'Hangul_PanSios': 3826, + 'Hangul_Phieuf': 3773, + 'Hangul_Pieub': 3762, + 'Hangul_PieubSios': 3764, + 'Hangul_PostHanja': 65339, + 'Hangul_PreHanja': 65338, + 'Hangul_PreviousCandidate': 65342, + 'Hangul_Rieul': 3753, + 'Hangul_RieulHieuh': 3760, + 'Hangul_RieulKiyeog': 3754, + 'Hangul_RieulMieum': 3755, + 'Hangul_RieulPhieuf': 3759, + 'Hangul_RieulPieub': 3756, + 'Hangul_RieulSios': 3757, + 'Hangul_RieulTieut': 3758, + 'Hangul_RieulYeorinHieuh': 3823, + 'Hangul_Romaja': 65334, + 'Hangul_SingleCandidate': 65340, + 'Hangul_Sios': 3765, + 'Hangul_Special': 65343, + 'Hangul_SsangDikeud': 3752, + 'Hangul_SsangJieuj': 3769, + 'Hangul_SsangKiyeog': 3746, + 'Hangul_SsangPieub': 3763, + 'Hangul_SsangSios': 3766, + 'Hangul_Start': 65330, + 'Hangul_SunkyeongeumMieum': 3824, + 'Hangul_SunkyeongeumPhieuf': 3828, + 'Hangul_SunkyeongeumPieub': 3825, + 'Hangul_Tieut': 3772, + 'Hangul_U': 3788, + 'Hangul_WA': 3784, + 'Hangul_WAE': 3785, + 'Hangul_WE': 3790, + 'Hangul_WEO': 3789, + 'Hangul_WI': 3791, + 'Hangul_YA': 3777, + 'Hangul_YAE': 3778, + 'Hangul_YE': 3782, + 'Hangul_YEO': 3781, + 'Hangul_YI': 3794, + 'Hangul_YO': 3787, + 'Hangul_YU': 3792, + 'Hangul_YeorinHieuh': 3829, + 'Hangul_switch': 65406, + 'Hankaku': 65321, + 'Hcircumflex': 678, + 'Hebrew_switch': 65406, + 'Help': 65386, + 'Henkan': 65315, + 'Henkan_Mode': 65315, + 'Hiragana': 65317, + 'Hiragana_Katakana': 65319, + 'Home': 65360, + 'Hstroke': 673, + 'Hyper_L': 65517, + 'Hyper_R': 65518, + 'I': 73, + 'ISO_Center_Object': 65075, + 'ISO_Continuous_Underline': 65072, + 'ISO_Discontinuous_Underline': 65073, + 'ISO_Emphasize': 65074, + 'ISO_Enter': 65076, + 'ISO_Fast_Cursor_Down': 65071, + 'ISO_Fast_Cursor_Left': 65068, + 'ISO_Fast_Cursor_Right': 65069, + 'ISO_Fast_Cursor_Up': 65070, + 'ISO_First_Group': 65036, + 'ISO_First_Group_Lock': 65037, + 'ISO_Group_Latch': 65030, + 'ISO_Group_Lock': 65031, + 'ISO_Group_Shift': 65406, + 'ISO_Last_Group': 65038, + 'ISO_Last_Group_Lock': 65039, + 'ISO_Left_Tab': 65056, + 'ISO_Level2_Latch': 65026, + 'ISO_Level3_Latch': 65028, + 'ISO_Level3_Lock': 65029, + 'ISO_Level3_Shift': 65027, + 'ISO_Level5_Latch': 65042, + 'ISO_Level5_Lock': 65043, + 'ISO_Level5_Shift': 65041, + 'ISO_Lock': 65025, + 'ISO_Move_Line_Down': 65058, + 'ISO_Move_Line_Up': 65057, + 'ISO_Next_Group': 65032, + 'ISO_Next_Group_Lock': 65033, + 'ISO_Partial_Line_Down': 65060, + 'ISO_Partial_Line_Up': 65059, + 'ISO_Partial_Space_Left': 65061, + 'ISO_Partial_Space_Right': 65062, + 'ISO_Prev_Group': 65034, + 'ISO_Prev_Group_Lock': 65035, + 'ISO_Release_Both_Margins': 65067, + 'ISO_Release_Margin_Left': 65065, + 'ISO_Release_Margin_Right': 65066, + 'ISO_Set_Margin_Left': 65063, + 'ISO_Set_Margin_Right': 65064, + 'Iabovedot': 681, + 'Iacute': 205, + 'Ibelowdot': 16785098, + 'Ibreve': 16777516, + 'Icircumflex': 206, + 'Idiaeresis': 207, + 'Igrave': 204, + 'Ihook': 16785096, + 'Imacron': 975, + 'Insert': 65379, + 'Iogonek': 967, + 'Itilde': 933, + 'J': 74, + 'Jcircumflex': 684, + 'K': 75, + 'KP_0': 65456, + 'KP_1': 65457, + 'KP_2': 65458, + 'KP_3': 65459, + 'KP_4': 65460, + 'KP_5': 65461, + 'KP_6': 65462, + 'KP_7': 65463, + 'KP_8': 65464, + 'KP_9': 65465, + 'KP_Add': 65451, + 'KP_Begin': 65437, + 'KP_Decimal': 65454, + 'KP_Delete': 65439, + 'KP_Divide': 65455, + 'KP_Down': 65433, + 'KP_End': 65436, + 'KP_Enter': 65421, + 'KP_Equal': 65469, + 'KP_F1': 65425, + 'KP_F2': 65426, + 'KP_F3': 65427, + 'KP_F4': 65428, + 'KP_Home': 65429, + 'KP_Insert': 65438, + 'KP_Left': 65430, + 'KP_Multiply': 65450, + 'KP_Next': 65435, + 'KP_Page_Down': 65435, + 'KP_Page_Up': 65434, + 'KP_Prior': 65434, + 'KP_Right': 65432, + 'KP_Separator': 65452, + 'KP_Space': 65408, + 'KP_Subtract': 65453, + 'KP_Tab': 65417, + 'KP_Up': 65431, + 'Kana_Lock': 65325, + 'Kana_Shift': 65326, + 'Kanji': 65313, + 'Kanji_Bangou': 65335, + 'Katakana': 65318, + 'Kcedilla': 979, + 'Korean_Won': 3839, + 'L': 76, + 'L1': 65480, + 'L10': 65489, + 'L2': 65481, + 'L3': 65482, + 'L4': 65483, + 'L5': 65484, + 'L6': 65485, + 'L7': 65486, + 'L8': 65487, + 'L9': 65488, + 'Lacute': 453, + 'Last_Virtual_Screen': 65236, + 'Lbelowdot': 16784950, + 'Lcaron': 421, + 'Lcedilla': 934, + 'Left': 65361, + 'Linefeed': 65290, + 'LiraSign': 16785572, + 'Lstroke': 419, + 'M': 77, + 'Mabovedot': 16784960, + 'Macedonia_DSE': 1717, + 'Macedonia_GJE': 1714, + 'Macedonia_KJE': 1724, + 'Macedonia_dse': 1701, + 'Macedonia_gje': 1698, + 'Macedonia_kje': 1708, + 'Mae_Koho': 65342, + 'Massyo': 65324, + 'Menu': 65383, + 'Meta_L': 65511, + 'Meta_R': 65512, + 'MillSign': 16785573, + 'Mode_switch': 65406, + 'MouseKeys_Accel_Enable': 65143, + 'MouseKeys_Enable': 65142, + 'Muhenkan': 65314, + 'Multi_key': 65312, + 'MultipleCandidate': 65341, + 'N': 78, + 'Nacute': 465, + 'NairaSign': 16785574, + 'Ncaron': 466, + 'Ncedilla': 977, + 'NewSheqelSign': 16785578, + 'Next': 65366, + 'Next_Virtual_Screen': 65234, + 'Ntilde': 209, + 'Num_Lock': 65407, + 'O': 79, + 'OE': 5052, + 'Oacute': 211, + 'Obarred': 16777631, + 'Obelowdot': 16785100, + 'Ocaron': 16777681, + 'Ocircumflex': 212, + 'Ocircumflexacute': 16785104, + 'Ocircumflexbelowdot': 16785112, + 'Ocircumflexgrave': 16785106, + 'Ocircumflexhook': 16785108, + 'Ocircumflextilde': 16785110, + 'Odiaeresis': 214, + 'Odoubleacute': 469, + 'Ograve': 210, + 'Ohook': 16785102, + 'Ohorn': 16777632, + 'Ohornacute': 16785114, + 'Ohornbelowdot': 16785122, + 'Ohorngrave': 16785116, + 'Ohornhook': 16785118, + 'Ohorntilde': 16785120, + 'Omacron': 978, + 'Ooblique': 216, + 'Oslash': 216, + 'Otilde': 213, + 'Overlay1_Enable': 65144, + 'Overlay2_Enable': 65145, + 'P': 80, + 'Pabovedot': 16784982, + 'Page_Down': 65366, + 'Page_Up': 65365, + 'Pause': 65299, + 'PesetaSign': 16785575, + 'Pointer_Accelerate': 65274, + 'Pointer_Button1': 65257, + 'Pointer_Button2': 65258, + 'Pointer_Button3': 65259, + 'Pointer_Button4': 65260, + 'Pointer_Button5': 65261, + 'Pointer_Button_Dflt': 65256, + 'Pointer_DblClick1': 65263, + 'Pointer_DblClick2': 65264, + 'Pointer_DblClick3': 65265, + 'Pointer_DblClick4': 65266, + 'Pointer_DblClick5': 65267, + 'Pointer_DblClick_Dflt': 65262, + 'Pointer_DfltBtnNext': 65275, + 'Pointer_DfltBtnPrev': 65276, + 'Pointer_Down': 65251, + 'Pointer_DownLeft': 65254, + 'Pointer_DownRight': 65255, + 'Pointer_Drag1': 65269, + 'Pointer_Drag2': 65270, + 'Pointer_Drag3': 65271, + 'Pointer_Drag4': 65272, + 'Pointer_Drag5': 65277, + 'Pointer_Drag_Dflt': 65268, + 'Pointer_EnableKeys': 65273, + 'Pointer_Left': 65248, + 'Pointer_Right': 65249, + 'Pointer_Up': 65250, + 'Pointer_UpLeft': 65252, + 'Pointer_UpRight': 65253, + 'Prev_Virtual_Screen': 65233, + 'PreviousCandidate': 65342, + 'Print': 65377, + 'Prior': 65365, + 'Q': 81, + 'R': 82, + 'R1': 65490, + 'R10': 65499, + 'R11': 65500, + 'R12': 65501, + 'R13': 65502, + 'R14': 65503, + 'R15': 65504, + 'R2': 65491, + 'R3': 65492, + 'R4': 65493, + 'R5': 65494, + 'R6': 65495, + 'R7': 65496, + 'R8': 65497, + 'R9': 65498, + 'Racute': 448, + 'Rcaron': 472, + 'Rcedilla': 931, + 'Redo': 65382, + 'RepeatKeys_Enable': 65138, + 'Return': 65293, + 'Right': 65363, + 'Romaji': 65316, + 'RupeeSign': 16785576, + 'S': 83, + 'SCHWA': 16777615, + 'Sabovedot': 16784992, + 'Sacute': 422, + 'Scaron': 425, + 'Scedilla': 426, + 'Scircumflex': 734, + 'Scroll_Lock': 65300, + 'Select': 65376, + 'Serbian_DJE': 1713, + 'Serbian_DZE': 1727, + 'Serbian_JE': 1720, + 'Serbian_LJE': 1721, + 'Serbian_NJE': 1722, + 'Serbian_TSHE': 1723, + 'Serbian_dje': 1697, + 'Serbian_dze': 1711, + 'Serbian_je': 1704, + 'Serbian_lje': 1705, + 'Serbian_nje': 1706, + 'Serbian_tshe': 1707, + 'Shift_L': 65505, + 'Shift_Lock': 65510, + 'Shift_R': 65506, + 'SingleCandidate': 65340, + 'Sinh_a': 16780677, + 'Sinh_aa': 16780678, + 'Sinh_aa2': 16780751, + 'Sinh_ae': 16780679, + 'Sinh_ae2': 16780752, + 'Sinh_aee': 16780680, + 'Sinh_aee2': 16780753, + 'Sinh_ai': 16780691, + 'Sinh_ai2': 16780763, + 'Sinh_al': 16780746, + 'Sinh_au': 16780694, + 'Sinh_au2': 16780766, + 'Sinh_ba': 16780726, + 'Sinh_bha': 16780727, + 'Sinh_ca': 16780704, + 'Sinh_cha': 16780705, + 'Sinh_dda': 16780713, + 'Sinh_ddha': 16780714, + 'Sinh_dha': 16780719, + 'Sinh_dhha': 16780720, + 'Sinh_e': 16780689, + 'Sinh_e2': 16780761, + 'Sinh_ee': 16780690, + 'Sinh_ee2': 16780762, + 'Sinh_fa': 16780742, + 'Sinh_ga': 16780700, + 'Sinh_gha': 16780701, + 'Sinh_h2': 16780675, + 'Sinh_ha': 16780740, + 'Sinh_i': 16780681, + 'Sinh_i2': 16780754, + 'Sinh_ii': 16780682, + 'Sinh_ii2': 16780755, + 'Sinh_ja': 16780706, + 'Sinh_jha': 16780707, + 'Sinh_jnya': 16780709, + 'Sinh_ka': 16780698, + 'Sinh_kha': 16780699, + 'Sinh_kunddaliya': 16780788, + 'Sinh_la': 16780733, + 'Sinh_lla': 16780741, + 'Sinh_lu': 16780687, + 'Sinh_lu2': 16780767, + 'Sinh_luu': 16780688, + 'Sinh_luu2': 16780787, + 'Sinh_ma': 16780728, + 'Sinh_mba': 16780729, + 'Sinh_na': 16780721, + 'Sinh_ndda': 16780716, + 'Sinh_ndha': 16780723, + 'Sinh_ng': 16780674, + 'Sinh_ng2': 16780702, + 'Sinh_nga': 16780703, + 'Sinh_nja': 16780710, + 'Sinh_nna': 16780715, + 'Sinh_nya': 16780708, + 'Sinh_o': 16780692, + 'Sinh_o2': 16780764, + 'Sinh_oo': 16780693, + 'Sinh_oo2': 16780765, + 'Sinh_pa': 16780724, + 'Sinh_pha': 16780725, + 'Sinh_ra': 16780731, + 'Sinh_ri': 16780685, + 'Sinh_rii': 16780686, + 'Sinh_ru2': 16780760, + 'Sinh_ruu2': 16780786, + 'Sinh_sa': 16780739, + 'Sinh_sha': 16780737, + 'Sinh_ssha': 16780738, + 'Sinh_tha': 16780717, + 'Sinh_thha': 16780718, + 'Sinh_tta': 16780711, + 'Sinh_ttha': 16780712, + 'Sinh_u': 16780683, + 'Sinh_u2': 16780756, + 'Sinh_uu': 16780684, + 'Sinh_uu2': 16780758, + 'Sinh_va': 16780736, + 'Sinh_ya': 16780730, + 'SlowKeys_Enable': 65139, + 'StickyKeys_Enable': 65141, + 'Super_L': 65515, + 'Super_R': 65516, + 'Sys_Req': 65301, + 'T': 84, + 'THORN': 222, + 'Tab': 65289, + 'Tabovedot': 16785002, + 'Tcaron': 427, + 'Tcedilla': 478, + 'Terminate_Server': 65237, + 'Thai_baht': 3551, + 'Thai_bobaimai': 3514, + 'Thai_chochan': 3496, + 'Thai_chochang': 3498, + 'Thai_choching': 3497, + 'Thai_chochoe': 3500, + 'Thai_dochada': 3502, + 'Thai_dodek': 3508, + 'Thai_fofa': 3517, + 'Thai_fofan': 3519, + 'Thai_hohip': 3531, + 'Thai_honokhuk': 3534, + 'Thai_khokhai': 3490, + 'Thai_khokhon': 3493, + 'Thai_khokhuat': 3491, + 'Thai_khokhwai': 3492, + 'Thai_khorakhang': 3494, + 'Thai_kokai': 3489, + 'Thai_lakkhangyao': 3557, + 'Thai_lekchet': 3575, + 'Thai_lekha': 3573, + 'Thai_lekhok': 3574, + 'Thai_lekkao': 3577, + 'Thai_leknung': 3569, + 'Thai_lekpaet': 3576, + 'Thai_leksam': 3571, + 'Thai_leksi': 3572, + 'Thai_leksong': 3570, + 'Thai_leksun': 3568, + 'Thai_lochula': 3532, + 'Thai_loling': 3525, + 'Thai_lu': 3526, + 'Thai_maichattawa': 3563, + 'Thai_maiek': 3560, + 'Thai_maihanakat': 3537, + 'Thai_maihanakat_maitho': 3550, + 'Thai_maitaikhu': 3559, + 'Thai_maitho': 3561, + 'Thai_maitri': 3562, + 'Thai_maiyamok': 3558, + 'Thai_moma': 3521, + 'Thai_ngongu': 3495, + 'Thai_nikhahit': 3565, + 'Thai_nonen': 3507, + 'Thai_nonu': 3513, + 'Thai_oang': 3533, + 'Thai_paiyannoi': 3535, + 'Thai_phinthu': 3546, + 'Thai_phophan': 3518, + 'Thai_phophung': 3516, + 'Thai_phosamphao': 3520, + 'Thai_popla': 3515, + 'Thai_rorua': 3523, + 'Thai_ru': 3524, + 'Thai_saraa': 3536, + 'Thai_saraaa': 3538, + 'Thai_saraae': 3553, + 'Thai_saraaimaimalai': 3556, + 'Thai_saraaimaimuan': 3555, + 'Thai_saraam': 3539, + 'Thai_sarae': 3552, + 'Thai_sarai': 3540, + 'Thai_saraii': 3541, + 'Thai_sarao': 3554, + 'Thai_sarau': 3544, + 'Thai_saraue': 3542, + 'Thai_sarauee': 3543, + 'Thai_sarauu': 3545, + 'Thai_sorusi': 3529, + 'Thai_sosala': 3528, + 'Thai_soso': 3499, + 'Thai_sosua': 3530, + 'Thai_thanthakhat': 3564, + 'Thai_thonangmontho': 3505, + 'Thai_thophuthao': 3506, + 'Thai_thothahan': 3511, + 'Thai_thothan': 3504, + 'Thai_thothong': 3512, + 'Thai_thothung': 3510, + 'Thai_topatak': 3503, + 'Thai_totao': 3509, + 'Thai_wowaen': 3527, + 'Thai_yoyak': 3522, + 'Thai_yoying': 3501, + 'Thorn': 222, + 'Touroku': 65323, + 'Tslash': 940, + 'U': 85, + 'Uacute': 218, + 'Ubelowdot': 16785124, + 'Ubreve': 733, + 'Ucircumflex': 219, + 'Udiaeresis': 220, + 'Udoubleacute': 475, + 'Ugrave': 217, + 'Uhook': 16785126, + 'Uhorn': 16777647, + 'Uhornacute': 16785128, + 'Uhornbelowdot': 16785136, + 'Uhorngrave': 16785130, + 'Uhornhook': 16785132, + 'Uhorntilde': 16785134, + 'Ukrainian_GHE_WITH_UPTURN': 1725, + 'Ukrainian_I': 1718, + 'Ukrainian_IE': 1716, + 'Ukrainian_YI': 1719, + 'Ukrainian_ghe_with_upturn': 1709, + 'Ukrainian_i': 1702, + 'Ukrainian_ie': 1700, + 'Ukrainian_yi': 1703, + 'Ukranian_I': 1718, + 'Ukranian_JE': 1716, + 'Ukranian_YI': 1719, + 'Ukranian_i': 1702, + 'Ukranian_je': 1700, + 'Ukranian_yi': 1703, + 'Umacron': 990, + 'Undo': 65381, + 'Uogonek': 985, + 'Up': 65362, + 'Uring': 473, + 'Utilde': 989, + 'V': 86, + 'VoidSymbol': 16777215, + 'W': 87, + 'Wacute': 16785026, + 'Wcircumflex': 16777588, + 'Wdiaeresis': 16785028, + 'Wgrave': 16785024, + 'WonSign': 16785577, + 'X': 88, + 'XF86_AddFavorite': 269025081, + 'XF86_ApplicationLeft': 269025104, + 'XF86_ApplicationRight': 269025105, + 'XF86_AudioCycleTrack': 269025179, + 'XF86_AudioForward': 269025175, + 'XF86_AudioLowerVolume': 269025041, + 'XF86_AudioMedia': 269025074, + 'XF86_AudioMicMute': 269025202, + 'XF86_AudioMute': 269025042, + 'XF86_AudioNext': 269025047, + 'XF86_AudioPause': 269025073, + 'XF86_AudioPlay': 269025044, + 'XF86_AudioPrev': 269025046, + 'XF86_AudioRaiseVolume': 269025043, + 'XF86_AudioRandomPlay': 269025177, + 'XF86_AudioRecord': 269025052, + 'XF86_AudioRepeat': 269025176, + 'XF86_AudioRewind': 269025086, + 'XF86_AudioStop': 269025045, + 'XF86_Away': 269025165, + 'XF86_Back': 269025062, + 'XF86_BackForward': 269025087, + 'XF86_Battery': 269025171, + 'XF86_Blue': 269025190, + 'XF86_Bluetooth': 269025172, + 'XF86_Book': 269025106, + 'XF86_BrightnessAdjust': 269025083, + 'XF86_CD': 269025107, + 'XF86_Calculater': 269025108, + 'XF86_Calculator': 269025053, + 'XF86_Calendar': 269025056, + 'XF86_Clear': 269025109, + 'XF86_ClearGrab': 269024801, + 'XF86_Close': 269025110, + 'XF86_Community': 269025085, + 'XF86_ContrastAdjust': 269025058, + 'XF86_Copy': 269025111, + 'XF86_Cut': 269025112, + 'XF86_CycleAngle': 269025180, + 'XF86_DOS': 269025114, + 'XF86_Display': 269025113, + 'XF86_Documents': 269025115, + 'XF86_Eject': 269025068, + 'XF86_Excel': 269025116, + 'XF86_Explorer': 269025117, + 'XF86_Favorites': 269025072, + 'XF86_Finance': 269025084, + 'XF86_Forward': 269025063, + 'XF86_FrameBack': 269025181, + 'XF86_FrameForward': 269025182, + 'XF86_Game': 269025118, + 'XF86_Go': 269025119, + 'XF86_Green': 269025188, + 'XF86_Hibernate': 269025192, + 'XF86_History': 269025079, + 'XF86_HomePage': 269025048, + 'XF86_HotLinks': 269025082, + 'XF86_KbdBrightnessDown': 269025030, + 'XF86_KbdBrightnessUp': 269025029, + 'XF86_KbdLightOnOff': 269025028, + 'XF86_Launch0': 269025088, + 'XF86_Launch1': 269025089, + 'XF86_Launch2': 269025090, + 'XF86_Launch3': 269025091, + 'XF86_Launch4': 269025092, + 'XF86_Launch5': 269025093, + 'XF86_Launch6': 269025094, + 'XF86_Launch7': 269025095, + 'XF86_Launch8': 269025096, + 'XF86_Launch9': 269025097, + 'XF86_LaunchA': 269025098, + 'XF86_LaunchB': 269025099, + 'XF86_LaunchC': 269025100, + 'XF86_LaunchD': 269025101, + 'XF86_LaunchE': 269025102, + 'XF86_LaunchF': 269025103, + 'XF86_LightBulb': 269025077, + 'XF86_LogGrabInfo': 269024805, + 'XF86_LogOff': 269025121, + 'XF86_LogWindowTree': 269024804, + 'XF86_Mail': 269025049, + 'XF86_MailForward': 269025168, + 'XF86_Market': 269025122, + 'XF86_Meeting': 269025123, + 'XF86_Memo': 269025054, + 'XF86_MenuKB': 269025125, + 'XF86_MenuPB': 269025126, + 'XF86_Messenger': 269025166, + 'XF86_ModeLock': 269025025, + 'XF86_MonBrightnessDown': 269025027, + 'XF86_MonBrightnessUp': 269025026, + 'XF86_Music': 269025170, + 'XF86_MyComputer': 269025075, + 'XF86_MySites': 269025127, + 'XF86_New': 269025128, + 'XF86_News': 269025129, + 'XF86_Next_VMode': 269024802, + 'XF86_OfficeHome': 269025130, + 'XF86_Open': 269025131, + 'XF86_OpenURL': 269025080, + 'XF86_Option': 269025132, + 'XF86_Paste': 269025133, + 'XF86_Phone': 269025134, + 'XF86_Pictures': 269025169, + 'XF86_PowerDown': 269025057, + 'XF86_PowerOff': 269025066, + 'XF86_Prev_VMode': 269024803, + 'XF86_Q': 269025136, + 'XF86_Red': 269025187, + 'XF86_Refresh': 269025065, + 'XF86_Reload': 269025139, + 'XF86_Reply': 269025138, + 'XF86_RockerDown': 269025060, + 'XF86_RockerEnter': 269025061, + 'XF86_RockerUp': 269025059, + 'XF86_RotateWindows': 269025140, + 'XF86_RotationKB': 269025142, + 'XF86_RotationPB': 269025141, + 'XF86_Save': 269025143, + 'XF86_ScreenSaver': 269025069, + 'XF86_ScrollClick': 269025146, + 'XF86_ScrollDown': 269025145, + 'XF86_ScrollUp': 269025144, + 'XF86_Search': 269025051, + 'XF86_Select': 269025184, + 'XF86_Send': 269025147, + 'XF86_Shop': 269025078, + 'XF86_Sleep': 269025071, + 'XF86_Spell': 269025148, + 'XF86_SplitScreen': 269025149, + 'XF86_Standby': 269025040, + 'XF86_Start': 269025050, + 'XF86_Stop': 269025064, + 'XF86_Subtitle': 269025178, + 'XF86_Support': 269025150, + 'XF86_Suspend': 269025191, + 'XF86_Switch_VT_1': 269024769, + 'XF86_Switch_VT_10': 269024778, + 'XF86_Switch_VT_11': 269024779, + 'XF86_Switch_VT_12': 269024780, + 'XF86_Switch_VT_2': 269024770, + 'XF86_Switch_VT_3': 269024771, + 'XF86_Switch_VT_4': 269024772, + 'XF86_Switch_VT_5': 269024773, + 'XF86_Switch_VT_6': 269024774, + 'XF86_Switch_VT_7': 269024775, + 'XF86_Switch_VT_8': 269024776, + 'XF86_Switch_VT_9': 269024777, + 'XF86_TaskPane': 269025151, + 'XF86_Terminal': 269025152, + 'XF86_Time': 269025183, + 'XF86_ToDoList': 269025055, + 'XF86_Tools': 269025153, + 'XF86_TopMenu': 269025186, + 'XF86_TouchpadOff': 269025201, + 'XF86_TouchpadOn': 269025200, + 'XF86_TouchpadToggle': 269025193, + 'XF86_Travel': 269025154, + 'XF86_UWB': 269025174, + 'XF86_Ungrab': 269024800, + 'XF86_User1KB': 269025157, + 'XF86_User2KB': 269025158, + 'XF86_UserPB': 269025156, + 'XF86_VendorHome': 269025076, + 'XF86_Video': 269025159, + 'XF86_View': 269025185, + 'XF86_WLAN': 269025173, + 'XF86_WWW': 269025070, + 'XF86_WakeUp': 269025067, + 'XF86_WebCam': 269025167, + 'XF86_WheelButton': 269025160, + 'XF86_Word': 269025161, + 'XF86_Xfer': 269025162, + 'XF86_Yellow': 269025189, + 'XF86_ZoomIn': 269025163, + 'XF86_ZoomOut': 269025164, + 'XF86_iTouch': 269025120, + 'Xabovedot': 16785034, + 'Y': 89, + 'Yacute': 221, + 'Ybelowdot': 16785140, + 'Ycircumflex': 16777590, + 'Ydiaeresis': 5054, + 'Ygrave': 16785138, + 'Yhook': 16785142, + 'Ytilde': 16785144, + 'Z': 90, + 'Zabovedot': 431, + 'Zacute': 428, + 'Zcaron': 430, + 'Zen_Koho': 65341, + 'Zenkaku': 65320, + 'Zenkaku_Hankaku': 65322, + 'Zstroke': 16777653, + 'a': 97, + 'aacute': 225, + 'abelowdot': 16785057, + 'abovedot': 511, + 'abreve': 483, + 'abreveacute': 16785071, + 'abrevebelowdot': 16785079, + 'abrevegrave': 16785073, + 'abrevehook': 16785075, + 'abrevetilde': 16785077, + 'acircumflex': 226, + 'acircumflexacute': 16785061, + 'acircumflexbelowdot': 16785069, + 'acircumflexgrave': 16785063, + 'acircumflexhook': 16785065, + 'acircumflextilde': 16785067, + 'acute': 180, + 'adiaeresis': 228, + 'ae': 230, + 'agrave': 224, + 'ahook': 16785059, + 'amacron': 992, + 'ampersand': 38, + 'aogonek': 433, + 'apostrophe': 39, + 'approxeq': 16785992, + 'approximate': 2248, + 'aring': 229, + 'asciicircum': 94, + 'asciitilde': 126, + 'asterisk': 42, + 'at': 64, + 'atilde': 227, + 'b': 98, + 'babovedot': 16784899, + 'backslash': 92, + 'ballotcross': 2804, + 'bar': 124, + 'because': 16785973, + 'blank': 2527, + 'botintegral': 2213, + 'botleftparens': 2220, + 'botleftsqbracket': 2216, + 'botleftsummation': 2226, + 'botrightparens': 2222, + 'botrightsqbracket': 2218, + 'botrightsummation': 2230, + 'bott': 2550, + 'botvertsummationconnector': 2228, + 'braceleft': 123, + 'braceright': 125, + 'bracketleft': 91, + 'bracketright': 93, + 'braille_blank': 16787456, + 'braille_dot_1': 65521, + 'braille_dot_10': 65530, + 'braille_dot_2': 65522, + 'braille_dot_3': 65523, + 'braille_dot_4': 65524, + 'braille_dot_5': 65525, + 'braille_dot_6': 65526, + 'braille_dot_7': 65527, + 'braille_dot_8': 65528, + 'braille_dot_9': 65529, + 'braille_dots_1': 16787457, + 'braille_dots_12': 16787459, + 'braille_dots_123': 16787463, + 'braille_dots_1234': 16787471, + 'braille_dots_12345': 16787487, + 'braille_dots_123456': 16787519, + 'braille_dots_1234567': 16787583, + 'braille_dots_12345678': 16787711, + 'braille_dots_1234568': 16787647, + 'braille_dots_123457': 16787551, + 'braille_dots_1234578': 16787679, + 'braille_dots_123458': 16787615, + 'braille_dots_12346': 16787503, + 'braille_dots_123467': 16787567, + 'braille_dots_1234678': 16787695, + 'braille_dots_123468': 16787631, + 'braille_dots_12347': 16787535, + 'braille_dots_123478': 16787663, + 'braille_dots_12348': 16787599, + 'braille_dots_1235': 16787479, + 'braille_dots_12356': 16787511, + 'braille_dots_123567': 16787575, + 'braille_dots_1235678': 16787703, + 'braille_dots_123568': 16787639, + 'braille_dots_12357': 16787543, + 'braille_dots_123578': 16787671, + 'braille_dots_12358': 16787607, + 'braille_dots_1236': 16787495, + 'braille_dots_12367': 16787559, + 'braille_dots_123678': 16787687, + 'braille_dots_12368': 16787623, + 'braille_dots_1237': 16787527, + 'braille_dots_12378': 16787655, + 'braille_dots_1238': 16787591, + 'braille_dots_124': 16787467, + 'braille_dots_1245': 16787483, + 'braille_dots_12456': 16787515, + 'braille_dots_124567': 16787579, + 'braille_dots_1245678': 16787707, + 'braille_dots_124568': 16787643, + 'braille_dots_12457': 16787547, + 'braille_dots_124578': 16787675, + 'braille_dots_12458': 16787611, + 'braille_dots_1246': 16787499, + 'braille_dots_12467': 16787563, + 'braille_dots_124678': 16787691, + 'braille_dots_12468': 16787627, + 'braille_dots_1247': 16787531, + 'braille_dots_12478': 16787659, + 'braille_dots_1248': 16787595, + 'braille_dots_125': 16787475, + 'braille_dots_1256': 16787507, + 'braille_dots_12567': 16787571, + 'braille_dots_125678': 16787699, + 'braille_dots_12568': 16787635, + 'braille_dots_1257': 16787539, + 'braille_dots_12578': 16787667, + 'braille_dots_1258': 16787603, + 'braille_dots_126': 16787491, + 'braille_dots_1267': 16787555, + 'braille_dots_12678': 16787683, + 'braille_dots_1268': 16787619, + 'braille_dots_127': 16787523, + 'braille_dots_1278': 16787651, + 'braille_dots_128': 16787587, + 'braille_dots_13': 16787461, + 'braille_dots_134': 16787469, + 'braille_dots_1345': 16787485, + 'braille_dots_13456': 16787517, + 'braille_dots_134567': 16787581, + 'braille_dots_1345678': 16787709, + 'braille_dots_134568': 16787645, + 'braille_dots_13457': 16787549, + 'braille_dots_134578': 16787677, + 'braille_dots_13458': 16787613, + 'braille_dots_1346': 16787501, + 'braille_dots_13467': 16787565, + 'braille_dots_134678': 16787693, + 'braille_dots_13468': 16787629, + 'braille_dots_1347': 16787533, + 'braille_dots_13478': 16787661, + 'braille_dots_1348': 16787597, + 'braille_dots_135': 16787477, + 'braille_dots_1356': 16787509, + 'braille_dots_13567': 16787573, + 'braille_dots_135678': 16787701, + 'braille_dots_13568': 16787637, + 'braille_dots_1357': 16787541, + 'braille_dots_13578': 16787669, + 'braille_dots_1358': 16787605, + 'braille_dots_136': 16787493, + 'braille_dots_1367': 16787557, + 'braille_dots_13678': 16787685, + 'braille_dots_1368': 16787621, + 'braille_dots_137': 16787525, + 'braille_dots_1378': 16787653, + 'braille_dots_138': 16787589, + 'braille_dots_14': 16787465, + 'braille_dots_145': 16787481, + 'braille_dots_1456': 16787513, + 'braille_dots_14567': 16787577, + 'braille_dots_145678': 16787705, + 'braille_dots_14568': 16787641, + 'braille_dots_1457': 16787545, + 'braille_dots_14578': 16787673, + 'braille_dots_1458': 16787609, + 'braille_dots_146': 16787497, + 'braille_dots_1467': 16787561, + 'braille_dots_14678': 16787689, + 'braille_dots_1468': 16787625, + 'braille_dots_147': 16787529, + 'braille_dots_1478': 16787657, + 'braille_dots_148': 16787593, + 'braille_dots_15': 16787473, + 'braille_dots_156': 16787505, + 'braille_dots_1567': 16787569, + 'braille_dots_15678': 16787697, + 'braille_dots_1568': 16787633, + 'braille_dots_157': 16787537, + 'braille_dots_1578': 16787665, + 'braille_dots_158': 16787601, + 'braille_dots_16': 16787489, + 'braille_dots_167': 16787553, + 'braille_dots_1678': 16787681, + 'braille_dots_168': 16787617, + 'braille_dots_17': 16787521, + 'braille_dots_178': 16787649, + 'braille_dots_18': 16787585, + 'braille_dots_2': 16787458, + 'braille_dots_23': 16787462, + 'braille_dots_234': 16787470, + 'braille_dots_2345': 16787486, + 'braille_dots_23456': 16787518, + 'braille_dots_234567': 16787582, + 'braille_dots_2345678': 16787710, + 'braille_dots_234568': 16787646, + 'braille_dots_23457': 16787550, + 'braille_dots_234578': 16787678, + 'braille_dots_23458': 16787614, + 'braille_dots_2346': 16787502, + 'braille_dots_23467': 16787566, + 'braille_dots_234678': 16787694, + 'braille_dots_23468': 16787630, + 'braille_dots_2347': 16787534, + 'braille_dots_23478': 16787662, + 'braille_dots_2348': 16787598, + 'braille_dots_235': 16787478, + 'braille_dots_2356': 16787510, + 'braille_dots_23567': 16787574, + 'braille_dots_235678': 16787702, + 'braille_dots_23568': 16787638, + 'braille_dots_2357': 16787542, + 'braille_dots_23578': 16787670, + 'braille_dots_2358': 16787606, + 'braille_dots_236': 16787494, + 'braille_dots_2367': 16787558, + 'braille_dots_23678': 16787686, + 'braille_dots_2368': 16787622, + 'braille_dots_237': 16787526, + 'braille_dots_2378': 16787654, + 'braille_dots_238': 16787590, + 'braille_dots_24': 16787466, + 'braille_dots_245': 16787482, + 'braille_dots_2456': 16787514, + 'braille_dots_24567': 16787578, + 'braille_dots_245678': 16787706, + 'braille_dots_24568': 16787642, + 'braille_dots_2457': 16787546, + 'braille_dots_24578': 16787674, + 'braille_dots_2458': 16787610, + 'braille_dots_246': 16787498, + 'braille_dots_2467': 16787562, + 'braille_dots_24678': 16787690, + 'braille_dots_2468': 16787626, + 'braille_dots_247': 16787530, + 'braille_dots_2478': 16787658, + 'braille_dots_248': 16787594, + 'braille_dots_25': 16787474, + 'braille_dots_256': 16787506, + 'braille_dots_2567': 16787570, + 'braille_dots_25678': 16787698, + 'braille_dots_2568': 16787634, + 'braille_dots_257': 16787538, + 'braille_dots_2578': 16787666, + 'braille_dots_258': 16787602, + 'braille_dots_26': 16787490, + 'braille_dots_267': 16787554, + 'braille_dots_2678': 16787682, + 'braille_dots_268': 16787618, + 'braille_dots_27': 16787522, + 'braille_dots_278': 16787650, + 'braille_dots_28': 16787586, + 'braille_dots_3': 16787460, + 'braille_dots_34': 16787468, + 'braille_dots_345': 16787484, + 'braille_dots_3456': 16787516, + 'braille_dots_34567': 16787580, + 'braille_dots_345678': 16787708, + 'braille_dots_34568': 16787644, + 'braille_dots_3457': 16787548, + 'braille_dots_34578': 16787676, + 'braille_dots_3458': 16787612, + 'braille_dots_346': 16787500, + 'braille_dots_3467': 16787564, + 'braille_dots_34678': 16787692, + 'braille_dots_3468': 16787628, + 'braille_dots_347': 16787532, + 'braille_dots_3478': 16787660, + 'braille_dots_348': 16787596, + 'braille_dots_35': 16787476, + 'braille_dots_356': 16787508, + 'braille_dots_3567': 16787572, + 'braille_dots_35678': 16787700, + 'braille_dots_3568': 16787636, + 'braille_dots_357': 16787540, + 'braille_dots_3578': 16787668, + 'braille_dots_358': 16787604, + 'braille_dots_36': 16787492, + 'braille_dots_367': 16787556, + 'braille_dots_3678': 16787684, + 'braille_dots_368': 16787620, + 'braille_dots_37': 16787524, + 'braille_dots_378': 16787652, + 'braille_dots_38': 16787588, + 'braille_dots_4': 16787464, + 'braille_dots_45': 16787480, + 'braille_dots_456': 16787512, + 'braille_dots_4567': 16787576, + 'braille_dots_45678': 16787704, + 'braille_dots_4568': 16787640, + 'braille_dots_457': 16787544, + 'braille_dots_4578': 16787672, + 'braille_dots_458': 16787608, + 'braille_dots_46': 16787496, + 'braille_dots_467': 16787560, + 'braille_dots_4678': 16787688, + 'braille_dots_468': 16787624, + 'braille_dots_47': 16787528, + 'braille_dots_478': 16787656, + 'braille_dots_48': 16787592, + 'braille_dots_5': 16787472, + 'braille_dots_56': 16787504, + 'braille_dots_567': 16787568, + 'braille_dots_5678': 16787696, + 'braille_dots_568': 16787632, + 'braille_dots_57': 16787536, + 'braille_dots_578': 16787664, + 'braille_dots_58': 16787600, + 'braille_dots_6': 16787488, + 'braille_dots_67': 16787552, + 'braille_dots_678': 16787680, + 'braille_dots_68': 16787616, + 'braille_dots_7': 16787520, + 'braille_dots_78': 16787648, + 'braille_dots_8': 16787584, + 'breve': 418, + 'brokenbar': 166, + 'c': 99, + 'c_h': 65187, + 'cabovedot': 741, + 'cacute': 486, + 'careof': 2744, + 'caret': 2812, + 'caron': 439, + 'ccaron': 488, + 'ccedilla': 231, + 'ccircumflex': 742, + 'cedilla': 184, + 'cent': 162, + 'ch': 65184, + 'checkerboard': 2529, + 'checkmark': 2803, + 'circle': 3023, + 'club': 2796, + 'colon': 58, + 'comma': 44, + 'containsas': 16785931, + 'copyright': 169, + 'cr': 2532, + 'crossinglines': 2542, + 'cuberoot': 16785947, + 'currency': 164, + 'cursor': 2815, + 'd': 100, + 'dabovedot': 16784907, + 'dagger': 2801, + 'dcaron': 495, + 'dead_A': 65153, + 'dead_E': 65155, + 'dead_I': 65157, + 'dead_O': 65159, + 'dead_U': 65161, + 'dead_a': 65152, + 'dead_abovecomma': 65124, + 'dead_abovedot': 65110, + 'dead_abovereversedcomma': 65125, + 'dead_abovering': 65112, + 'dead_aboveverticalline': 65169, + 'dead_acute': 65105, + 'dead_belowbreve': 65131, + 'dead_belowcircumflex': 65129, + 'dead_belowcomma': 65134, + 'dead_belowdiaeresis': 65132, + 'dead_belowdot': 65120, + 'dead_belowmacron': 65128, + 'dead_belowring': 65127, + 'dead_belowtilde': 65130, + 'dead_belowverticalline': 65170, + 'dead_breve': 65109, + 'dead_capital_schwa': 65163, + 'dead_caron': 65114, + 'dead_cedilla': 65115, + 'dead_circumflex': 65106, + 'dead_currency': 65135, + 'dead_dasia': 65125, + 'dead_diaeresis': 65111, + 'dead_doubleacute': 65113, + 'dead_doublegrave': 65126, + 'dead_e': 65154, + 'dead_grave': 65104, + 'dead_greek': 65164, + 'dead_hook': 65121, + 'dead_horn': 65122, + 'dead_i': 65156, + 'dead_invertedbreve': 65133, + 'dead_iota': 65117, + 'dead_longsolidusoverlay': 65171, + 'dead_lowline': 65168, + 'dead_macron': 65108, + 'dead_o': 65158, + 'dead_ogonek': 65116, + 'dead_perispomeni': 65107, + 'dead_psili': 65124, + 'dead_semivoiced_sound': 65119, + 'dead_small_schwa': 65162, + 'dead_stroke': 65123, + 'dead_tilde': 65107, + 'dead_u': 65160, + 'dead_voiced_sound': 65118, + 'decimalpoint': 2749, + 'degree': 176, + 'diaeresis': 168, + 'diamond': 2797, + 'digitspace': 2725, + 'dintegral': 16785964, + 'division': 247, + 'dollar': 36, + 'doubbaselinedot': 2735, + 'doubleacute': 445, + 'doubledagger': 2802, + 'doublelowquotemark': 2814, + 'downarrow': 2302, + 'downcaret': 2984, + 'downshoe': 3030, + 'downstile': 3012, + 'downtack': 3010, + 'dstroke': 496, + 'e': 101, + 'eabovedot': 1004, + 'eacute': 233, + 'ebelowdot': 16785081, + 'ecaron': 492, + 'ecircumflex': 234, + 'ecircumflexacute': 16785087, + 'ecircumflexbelowdot': 16785095, + 'ecircumflexgrave': 16785089, + 'ecircumflexhook': 16785091, + 'ecircumflextilde': 16785093, + 'ediaeresis': 235, + 'egrave': 232, + 'ehook': 16785083, + 'eightsubscript': 16785544, + 'eightsuperior': 16785528, + 'elementof': 16785928, + 'ellipsis': 2734, + 'em3space': 2723, + 'em4space': 2724, + 'emacron': 954, + 'emdash': 2729, + 'emfilledcircle': 2782, + 'emfilledrect': 2783, + 'emopencircle': 2766, + 'emopenrectangle': 2767, + 'emptyset': 16785925, + 'emspace': 2721, + 'endash': 2730, + 'enfilledcircbullet': 2790, + 'enfilledsqbullet': 2791, + 'eng': 959, + 'enopencircbullet': 2784, + 'enopensquarebullet': 2785, + 'enspace': 2722, + 'eogonek': 490, + 'equal': 61, + 'eth': 240, + 'etilde': 16785085, + 'exclam': 33, + 'exclamdown': 161, + 'ezh': 16777874, + 'f': 102, + 'fabovedot': 16784927, + 'femalesymbol': 2808, + 'ff': 2531, + 'figdash': 2747, + 'filledlefttribullet': 2780, + 'filledrectbullet': 2779, + 'filledrighttribullet': 2781, + 'filledtribulletdown': 2793, + 'filledtribulletup': 2792, + 'fiveeighths': 2757, + 'fivesixths': 2743, + 'fivesubscript': 16785541, + 'fivesuperior': 16785525, + 'fourfifths': 2741, + 'foursubscript': 16785540, + 'foursuperior': 16785524, + 'fourthroot': 16785948, + 'function': 2294, + 'g': 103, + 'gabovedot': 757, + 'gbreve': 699, + 'gcaron': 16777703, + 'gcedilla': 955, + 'gcircumflex': 760, + 'grave': 96, + 'greater': 62, + 'greaterthanequal': 2238, + 'guillemotleft': 171, + 'guillemotright': 187, + 'h': 104, + 'hairspace': 2728, + 'hcircumflex': 694, + 'heart': 2798, + 'hebrew_aleph': 3296, + 'hebrew_ayin': 3314, + 'hebrew_bet': 3297, + 'hebrew_beth': 3297, + 'hebrew_chet': 3303, + 'hebrew_dalet': 3299, + 'hebrew_daleth': 3299, + 'hebrew_doublelowline': 3295, + 'hebrew_finalkaph': 3306, + 'hebrew_finalmem': 3309, + 'hebrew_finalnun': 3311, + 'hebrew_finalpe': 3315, + 'hebrew_finalzade': 3317, + 'hebrew_finalzadi': 3317, + 'hebrew_gimel': 3298, + 'hebrew_gimmel': 3298, + 'hebrew_he': 3300, + 'hebrew_het': 3303, + 'hebrew_kaph': 3307, + 'hebrew_kuf': 3319, + 'hebrew_lamed': 3308, + 'hebrew_mem': 3310, + 'hebrew_nun': 3312, + 'hebrew_pe': 3316, + 'hebrew_qoph': 3319, + 'hebrew_resh': 3320, + 'hebrew_samech': 3313, + 'hebrew_samekh': 3313, + 'hebrew_shin': 3321, + 'hebrew_taf': 3322, + 'hebrew_taw': 3322, + 'hebrew_tet': 3304, + 'hebrew_teth': 3304, + 'hebrew_waw': 3301, + 'hebrew_yod': 3305, + 'hebrew_zade': 3318, + 'hebrew_zadi': 3318, + 'hebrew_zain': 3302, + 'hebrew_zayin': 3302, + 'hexagram': 2778, + 'horizconnector': 2211, + 'horizlinescan1': 2543, + 'horizlinescan3': 2544, + 'horizlinescan5': 2545, + 'horizlinescan7': 2546, + 'horizlinescan9': 2547, + 'hstroke': 689, + 'ht': 2530, + 'hyphen': 173, + 'i': 105, + 'iacute': 237, + 'ibelowdot': 16785099, + 'ibreve': 16777517, + 'icircumflex': 238, + 'identical': 2255, + 'idiaeresis': 239, + 'idotless': 697, + 'ifonlyif': 2253, + 'igrave': 236, + 'ihook': 16785097, + 'imacron': 1007, + 'implies': 2254, + 'includedin': 2266, + 'includes': 2267, + 'infinity': 2242, + 'integral': 2239, + 'intersection': 2268, + 'iogonek': 999, + 'itilde': 949, + 'j': 106, + 'jcircumflex': 700, + 'jot': 3018, + 'k': 107, + 'kana_A': 1201, + 'kana_CHI': 1217, + 'kana_E': 1204, + 'kana_FU': 1228, + 'kana_HA': 1226, + 'kana_HE': 1229, + 'kana_HI': 1227, + 'kana_HO': 1230, + 'kana_HU': 1228, + 'kana_I': 1202, + 'kana_KA': 1206, + 'kana_KE': 1209, + 'kana_KI': 1207, + 'kana_KO': 1210, + 'kana_KU': 1208, + 'kana_MA': 1231, + 'kana_ME': 1234, + 'kana_MI': 1232, + 'kana_MO': 1235, + 'kana_MU': 1233, + 'kana_N': 1245, + 'kana_NA': 1221, + 'kana_NE': 1224, + 'kana_NI': 1222, + 'kana_NO': 1225, + 'kana_NU': 1223, + 'kana_O': 1205, + 'kana_RA': 1239, + 'kana_RE': 1242, + 'kana_RI': 1240, + 'kana_RO': 1243, + 'kana_RU': 1241, + 'kana_SA': 1211, + 'kana_SE': 1214, + 'kana_SHI': 1212, + 'kana_SO': 1215, + 'kana_SU': 1213, + 'kana_TA': 1216, + 'kana_TE': 1219, + 'kana_TI': 1217, + 'kana_TO': 1220, + 'kana_TSU': 1218, + 'kana_TU': 1218, + 'kana_U': 1203, + 'kana_WA': 1244, + 'kana_WO': 1190, + 'kana_YA': 1236, + 'kana_YO': 1238, + 'kana_YU': 1237, + 'kana_a': 1191, + 'kana_closingbracket': 1187, + 'kana_comma': 1188, + 'kana_conjunctive': 1189, + 'kana_e': 1194, + 'kana_fullstop': 1185, + 'kana_i': 1192, + 'kana_middledot': 1189, + 'kana_o': 1195, + 'kana_openingbracket': 1186, + 'kana_switch': 65406, + 'kana_tsu': 1199, + 'kana_tu': 1199, + 'kana_u': 1193, + 'kana_ya': 1196, + 'kana_yo': 1198, + 'kana_yu': 1197, + 'kappa': 930, + 'kcedilla': 1011, + 'kra': 930, + 'l': 108, + 'lacute': 485, + 'latincross': 2777, + 'lbelowdot': 16784951, + 'lcaron': 437, + 'lcedilla': 950, + 'leftanglebracket': 2748, + 'leftarrow': 2299, + 'leftcaret': 2979, + 'leftdoublequotemark': 2770, + 'leftmiddlecurlybrace': 2223, + 'leftopentriangle': 2764, + 'leftpointer': 2794, + 'leftradical': 2209, + 'leftshoe': 3034, + 'leftsinglequotemark': 2768, + 'leftt': 2548, + 'lefttack': 3036, + 'less': 60, + 'lessthanequal': 2236, + 'lf': 2533, + 'logicaland': 2270, + 'logicalor': 2271, + 'lowleftcorner': 2541, + 'lowrightcorner': 2538, + 'lstroke': 435, + 'm': 109, + 'mabovedot': 16784961, + 'macron': 175, + 'malesymbol': 2807, + 'maltesecross': 2800, + 'marker': 2751, + 'masculine': 186, + 'minus': 45, + 'minutes': 2774, + 'mu': 181, + 'multiply': 215, + 'musicalflat': 2806, + 'musicalsharp': 2805, + 'n': 110, + 'nabla': 2245, + 'nacute': 497, + 'ncaron': 498, + 'ncedilla': 1009, + 'ninesubscript': 16785545, + 'ninesuperior': 16785529, + 'nl': 2536, + 'nobreakspace': 160, + 'notapproxeq': 16785991, + 'notelementof': 16785929, + 'notequal': 2237, + 'notidentical': 16786018, + 'notsign': 172, + 'ntilde': 241, + 'numbersign': 35, + 'numerosign': 1712, + 'o': 111, + 'oacute': 243, + 'obarred': 16777845, + 'obelowdot': 16785101, + 'ocaron': 16777682, + 'ocircumflex': 244, + 'ocircumflexacute': 16785105, + 'ocircumflexbelowdot': 16785113, + 'ocircumflexgrave': 16785107, + 'ocircumflexhook': 16785109, + 'ocircumflextilde': 16785111, + 'odiaeresis': 246, + 'odoubleacute': 501, + 'oe': 5053, + 'ogonek': 434, + 'ograve': 242, + 'ohook': 16785103, + 'ohorn': 16777633, + 'ohornacute': 16785115, + 'ohornbelowdot': 16785123, + 'ohorngrave': 16785117, + 'ohornhook': 16785119, + 'ohorntilde': 16785121, + 'omacron': 1010, + 'oneeighth': 2755, + 'onefifth': 2738, + 'onehalf': 189, + 'onequarter': 188, + 'onesixth': 2742, + 'onesubscript': 16785537, + 'onesuperior': 185, + 'onethird': 2736, + 'ooblique': 248, + 'openrectbullet': 2786, + 'openstar': 2789, + 'opentribulletdown': 2788, + 'opentribulletup': 2787, + 'ordfeminine': 170, + 'oslash': 248, + 'otilde': 245, + 'overbar': 3008, + 'overline': 1150, + 'p': 112, + 'pabovedot': 16784983, + 'paragraph': 182, + 'parenleft': 40, + 'parenright': 41, + 'partdifferential': 16785922, + 'partialderivative': 2287, + 'percent': 37, + 'period': 46, + 'periodcentered': 183, + 'permille': 2773, + 'phonographcopyright': 2811, + 'plus': 43, + 'plusminus': 177, + 'prescription': 2772, + 'prolongedsound': 1200, + 'punctspace': 2726, + 'q': 113, + 'quad': 3020, + 'question': 63, + 'questiondown': 191, + 'quotedbl': 34, + 'quoteleft': 96, + 'quoteright': 39, + 'r': 114, + 'racute': 480, + 'radical': 2262, + 'rcaron': 504, + 'rcedilla': 947, + 'registered': 174, + 'rightanglebracket': 2750, + 'rightarrow': 2301, + 'rightcaret': 2982, + 'rightdoublequotemark': 2771, + 'rightmiddlecurlybrace': 2224, + 'rightmiddlesummation': 2231, + 'rightopentriangle': 2765, + 'rightpointer': 2795, + 'rightshoe': 3032, + 'rightsinglequotemark': 2769, + 'rightt': 2549, + 'righttack': 3068, + 's': 115, + 'sabovedot': 16784993, + 'sacute': 438, + 'scaron': 441, + 'scedilla': 442, + 'schwa': 16777817, + 'scircumflex': 766, + 'script_switch': 65406, + 'seconds': 2775, + 'section': 167, + 'semicolon': 59, + 'semivoicedsound': 1247, + 'seveneighths': 2758, + 'sevensubscript': 16785543, + 'sevensuperior': 16785527, + 'signaturemark': 2762, + 'signifblank': 2732, + 'similarequal': 2249, + 'singlelowquotemark': 2813, + 'sixsubscript': 16785542, + 'sixsuperior': 16785526, + 'slash': 47, + 'soliddiamond': 2528, + 'space': 32, + 'squareroot': 16785946, + 'ssharp': 223, + 'sterling': 163, + 'stricteq': 16786019, + 't': 116, + 'tabovedot': 16785003, + 'tcaron': 443, + 'tcedilla': 510, + 'telephone': 2809, + 'telephonerecorder': 2810, + 'therefore': 2240, + 'thinspace': 2727, + 'thorn': 254, + 'threeeighths': 2756, + 'threefifths': 2740, + 'threequarters': 190, + 'threesubscript': 16785539, + 'threesuperior': 179, + 'tintegral': 16785965, + 'topintegral': 2212, + 'topleftparens': 2219, + 'topleftradical': 2210, + 'topleftsqbracket': 2215, + 'topleftsummation': 2225, + 'toprightparens': 2221, + 'toprightsqbracket': 2217, + 'toprightsummation': 2229, + 'topt': 2551, + 'topvertsummationconnector': 2227, + 'trademark': 2761, + 'trademarkincircle': 2763, + 'tslash': 956, + 'twofifths': 2739, + 'twosubscript': 16785538, + 'twosuperior': 178, + 'twothirds': 2737, + 'u': 117, + 'uacute': 250, + 'ubelowdot': 16785125, + 'ubreve': 765, + 'ucircumflex': 251, + 'udiaeresis': 252, + 'udoubleacute': 507, + 'ugrave': 249, + 'uhook': 16785127, + 'uhorn': 16777648, + 'uhornacute': 16785129, + 'uhornbelowdot': 16785137, + 'uhorngrave': 16785131, + 'uhornhook': 16785133, + 'uhorntilde': 16785135, + 'umacron': 1022, + 'underbar': 3014, + 'underscore': 95, + 'union': 2269, + 'uogonek': 1017, + 'uparrow': 2300, + 'upcaret': 2985, + 'upleftcorner': 2540, + 'uprightcorner': 2539, + 'upshoe': 3011, + 'upstile': 3027, + 'uptack': 3022, + 'uring': 505, + 'utilde': 1021, + 'v': 118, + 'variation': 2241, + 'vertbar': 2552, + 'vertconnector': 2214, + 'voicedsound': 1246, + 'vt': 2537, + 'w': 119, + 'wacute': 16785027, + 'wcircumflex': 16777589, + 'wdiaeresis': 16785029, + 'wgrave': 16785025, + 'x': 120, + 'xabovedot': 16785035, + 'y': 121, + 'yacute': 253, + 'ybelowdot': 16785141, + 'ycircumflex': 16777591, + 'ydiaeresis': 255, + 'yen': 165, + 'ygrave': 16785139, + 'yhook': 16785143, + 'ytilde': 16785145, + 'z': 122, + 'zabovedot': 447, + 'zacute': 444, + 'zcaron': 446, + 'zerosubscript': 16785536, + 'zerosuperior': 16785520, + 'zstroke': 16777654} diff --git a/lib/logitech_receiver/diversion.py b/lib/logitech_receiver/diversion.py index 7de236f5..284c702b 100644 --- a/lib/logitech_receiver/diversion.py +++ b/lib/logitech_receiver/diversion.py @@ -25,6 +25,7 @@ from logging import INFO as _INFO from logging import getLogger from math import sqrt as _sqrt +import keysyms.keysymdef as _keysymdef import psutil from gi.repository import Gdk, GLib @@ -44,18 +45,38 @@ del getLogger # # See docs/rules.md for documentation # +# Several capabilities of rules depend on aspects of GDK, X11, or XKB +# As the Solaar GUI uses GTK, Glib and GDK are always available and are obtained from gi.repository +# +# Process condition depends on X11 from python-xlib, and is probably not possible at all in Wayland +# MouseProcess condition depends on X11 from python-xlib, and is probably not possible at all in Wayland +# Modifiers condition depends only on GDK +# KeyPress action currently only works in X11, and is not currently available under Wayland +# KeyPress action determines whether a keysym is a currently-down modifier using get_modifier_mapping from python-xlib; +# under Wayland no modifier keys are considered down so all modifier keys are pressed, potentially leading to problems +# KeyPress action translates key names to keysysms using the local file described for GUI keyname determination +# KeyPress action gets the current keyboard group using XkbGetState from libX11.so using ctypes definitions +# under Wayland the keyboard group is None resulting in using the first keyboard group +# KeyPress action translates keysyms to keycodes using the GDK keymap +# KeyPress action simulates keyboard input with X11 XTest from python-xlib +# MouseScroll and MouseClick actions currently only work in X11, and are not currently available under Wayland +# MouseScroll and MouseClick actions simulate mouse input with X11 XTest from python-xlib +# +# Rule GUI keyname determination uses a local file generated +# from http://cgit.freedesktop.org/xorg/proto/x11proto/plain/keysymdef.h +# and http://cgit.freedesktop.org/xorg/proto/x11proto/plain/XF86keysym.h +# because there does not seem to be a non-X11 file for this set of key names + +XK_KEYS = _keysymdef.keysymdef -XK_KEYS = {} try: import Xlib from Xlib import X from Xlib.display import Display - from Xlib import XK as _XK - _XK.load_keysym_group('xf86') - XK_KEYS = vars(_XK) xdisplay = Display() modifier_keycodes = xdisplay.get_modifier_mapping() # there should be a way to do this in Gdk x11 = True + NET_ACTIVE_WINDOW = xdisplay.intern_atom('_NET_ACTIVE_WINDOW') NET_WM_PID = xdisplay.intern_atom('_NET_WM_PID') WM_CLASS = xdisplay.intern_atom('WM_CLASS') @@ -80,8 +101,7 @@ try: display = X11Lib.XOpenDisplay(None) except Exception: _log.warn( - 'X11 not available - rules cannot access current process or modifier key state nor can they simulate input', - # 'X11 not available - rules cannot access current process nor can they simulate input', + 'X11 not available - rules cannot access current process or keyboard group and cannot simulate input. %s', exc_info=_sys.exc_info() ) modifier_keycodes = [] @@ -417,7 +437,6 @@ class Modifiers(Condition): return 'Modifiers: ' + str(self.desired) def evaluate(self, feature, notification, device, status, last_result): - ## (_, _, _, current) = gdisplay.get_pointer() # get the current keyboard modifier current = gkeymap.get_modifier_state() # get the current keyboard modifier return self.desired == (current & MODIFIER_MASK) @@ -573,20 +592,17 @@ class KeyPress(Action): def __init__(self, keys): if isinstance(keys, str): keys = [keys] - self.key_symbols = keys - if x11: - key_from_string = lambda s: (displayt.keysym_to_keycode(Xlib.XK.string_to_keysym(s))) - self.keys = [isinstance(k, str) and key_from_string(k) for k in keys] - if not all(self.keys): - _log.warn('rule KeyPress argument not sequence of current key names %s', keys) - self.keys = [] - else: - self.keys = [] - _log.warn('X11 not available - rules cannot simulate keyboard input - %s', self) + self.key_names = keys + self.key_symbols = [XK_KEYS.get(k, None) for k in keys] + if not all(self.key_symbols): + _log.warn('rule KeyPress not sequence of key names %s', keys) + self.key_symbols = [] + if not x11: + _log.warn('rule KeyPress action only available in X11 %s', keys) + self.key_symbols = [] - def string_to_keycode(self, s, modifiers): # should take group and shift into account - group = kbdgroup() - keysym = Xlib.XK.string_to_keysym(s) + def keysym_to_keycode(self, keysym, modifiers): # maybe should take shift into account + group = kbdgroup() or 0 keycodes = gkeymap.get_entries_for_keyval(keysym) if len(keycodes.keys) == 1: k = keycodes.keys[0] @@ -595,24 +611,24 @@ class KeyPress(Action): for k in keycodes.keys: if group == k.group: return k.keycode - _log.warn('rule KeyPress key name not currently available %s', self) + _log.warn('rule KeyPress key symbol not currently available %s', self) def __str__(self): - return 'KeyPress: ' + ' '.join(self.key_symbols) + return 'KeyPress: ' + ' '.join(self.key_names) def needed(self, k, modifiers): code = modifier_code(k) return not (code is not None and modifiers & (1 << code)) - def keyDown(self, keys, modifiers): - for k in keys: - keycode = self.string_to_keycode(k, modifiers) + def keyDown(self, keysyms, modifiers): + for k in keysyms: + keycode = self.keysym_to_keycode(k, modifiers) if self.needed(keycode, modifiers) and x11 and keycode: Xlib.ext.xtest.fake_input(displayt, X.KeyPress, keycode) - def keyUp(self, keys, modifiers): - for k in keys: - keycode = self.string_to_keycode(k, modifiers) + def keyUp(self, keysyms, modifiers): + for k in keysyms: + keycode = self.keysym_to_keycode(k, modifiers) if self.needed(keycode, modifiers) and x11 and keycode: Xlib.ext.xtest.fake_input(displayt, X.KeyRelease, keycode) @@ -627,7 +643,7 @@ class KeyPress(Action): return None def data(self): - return {'KeyPress': [str(k) for k in self.key_symbols]} + return {'KeyPress': [str(k) for k in self.key_names]} # KeyDown is dangerous as the key can auto-repeat and make your system unusable diff --git a/lib/solaar/ui/diversion_rules.py b/lib/solaar/ui/diversion_rules.py index 8b2803eb..fc665822 100644 --- a/lib/solaar/ui/diversion_rules.py +++ b/lib/solaar/ui/diversion_rules.py @@ -1521,7 +1521,7 @@ class KeyPressUI(ActionUI): def _clicked_add(self, _btn): self.component.__init__(self.collect_value() + ['']) self.show(self.component) - self.fields[len(self.component.key_symbols) - 1].grab_focus() + self.fields[len(self.component.key_names) - 1].grab_focus() def _clicked_del(self, _btn, pos): v = self.collect_value() @@ -1534,12 +1534,12 @@ class KeyPressUI(ActionUI): super()._on_update(*args) for i, f in enumerate(self.fields): if f.get_visible(): - icon = 'dialog-warning' if i < len(self.component.key_symbols - ) and self.component.key_symbols[i] not in self.KEY_NAMES else '' + icon = 'dialog-warning' if i < len(self.component.key_names + ) and self.component.key_names[i] not in self.KEY_NAMES else '' f.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, icon) def show(self, component, editable=True): - n = len(component.key_symbols) + n = len(component.key_names) while len(self.fields) < n: self._create_field() self._create_del_btn() @@ -1548,7 +1548,7 @@ class KeyPressUI(ActionUI): for i in range(n): field = self.fields[i] with self.ignore_changes(): - field.set_text(component.key_symbols[i]) + field.set_text(component.key_names[i]) field.set_size_request(int(0.3 * self.panel.get_toplevel().get_size()[0]), 0) field.show_all() self.del_btns[i].show() @@ -1566,7 +1566,7 @@ class KeyPressUI(ActionUI): @classmethod def right_label(cls, component): - return ' + '.join(component.key_symbols) + return ' + '.join(component.key_names) class MouseScrollUI(ActionUI):