diff --git a/README.md b/README.md index 461c571..c940102 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,12 @@ PyUserInput =========== +**PyUserInput is a group project so we've moved the project over to a group +organization: https://github.com/PyUserInput/PyUserInput . That is now the +active development repository and I'll be phasing this one out, so please go +there for the latest code and to post new issues. This should be corrected on +PyPI in the next version update of PyUserInput.** + A module for cross-platform control of the mouse and keyboard in python that is simple to use. diff --git a/pykeyboard/base.py b/pykeyboard/base.py index be714de..f51bde4 100644 --- a/pykeyboard/base.py +++ b/pykeyboard/base.py @@ -26,6 +26,8 @@ class PyKeyboardMeta(object): """ The base class for PyKeyboard. Represents basic operational model. """ + #: We add this named character for convenience + space = ' ' def press_key(self, character=''): """Press a given character key.""" @@ -48,7 +50,7 @@ def press_keys(self,characters=[]): self.press_key(character) for character in characters: self.release_key(character) - + def type_string(self, char_string, interval=0): """ A convenience method for typing longer strings of characters. Generates @@ -196,4 +198,4 @@ def configure_keys(self): structures for simplified key access. Does nothing in this base implementation. """ - pass \ No newline at end of file + pass diff --git a/pykeyboard/windows.py b/pykeyboard/windows.py index 04fc4a9..b5199bb 100644 --- a/pykeyboard/windows.py +++ b/pykeyboard/windows.py @@ -90,6 +90,7 @@ def special_key_assignment(self): self.menu_key = VK_MENU self.alt_l_key = VK_LMENU self.alt_r_key = VK_RMENU + self.altgr_key = VK_RMENU self.alt_key = self.alt_l_key self.pause_key = VK_PAUSE self.caps_lock_key = VK_CAPITAL @@ -228,7 +229,7 @@ class PyKeyboardEvent(PyKeyboardEventMeta): def __init__(self, diagnostic=False): self.diagnostic = diagnostic - import pyHook + import pyWinhook as pyHook PyKeyboardEventMeta.__init__(self) self.hm = pyHook.HookManager() diff --git a/pykeyboard/x11.py b/pykeyboard/x11.py index 68a0f14..fe2f8bc 100644 --- a/pykeyboard/x11.py +++ b/pykeyboard/x11.py @@ -19,51 +19,17 @@ from Xlib.ext import record from Xlib.protocol import rq import Xlib.XK +import Xlib.keysymdef.xkb from .base import PyKeyboardMeta, PyKeyboardEventMeta import time import string -special_X_keysyms = { - ' ': "space", - '\t': "Tab", - '\n': "Return", # for some reason this needs to be cr, not lf - '\r': "Return", - '\e': "Escape", - '!': "exclam", - '#': "numbersign", - '%': "percent", - '$': "dollar", - '&': "ampersand", - '"': "quotedbl", - '\'': "apostrophe", - '(': "parenleft", - ')': "parenright", - '*': "asterisk", - '=': "equal", - '+': "plus", - ',': "comma", - '-': "minus", - '.': "period", - '/': "slash", - ':': "colon", - ';': "semicolon", - '<': "less", - '>': "greater", - '?': "question", - '@': "at", - '[': "bracketleft", - ']': "bracketright", - '\\': "backslash", - '^': "asciicircum", - '_': "underscore", - '`': "grave", - '{': "braceleft", - '|': "bar", - '}': "braceright", - '~': "asciitilde" - } +from pymouse.x11 import display_manager + +from .x11_keysyms import KEYSYMS + class PyKeyboard(PyKeyboardMeta): """ @@ -76,39 +42,42 @@ def __init__(self, display=None): self.display2 = Display(display) self.special_key_assignment() + def _handle_key(self, character, event): + """Handles either a key press or release, depending on ``event``. + + :param character: The key to handle. See :meth:`press_key` and + :meth:`release_key` for information about this parameter. + + :param event: The *Xlib* event. This should be either + :attr:`Xlib.X.KeyPress` or :attr:`Xlib.X.KeyRelease` + """ + try: + # Detect uppercase or shifted character + shifted = self.is_char_shifted(character) + except AttributeError: + # Handle the case of integer keycode argument + with display_manager(self.display) as d: + fake_input(d, event, character) + else: + with display_manager(self.display) as d: + if shifted: + fake_input(d, event, self.shift_key) + keycode = self.lookup_character_keycode(character) + fake_input(d, event, keycode) + def press_key(self, character=''): """ Press a given character key. Also works with character keycodes as integers, but not keysyms. """ - try: # Detect uppercase or shifted character - shifted = self.is_char_shifted(character) - except AttributeError: # Handle the case of integer keycode argument - fake_input(self.display, X.KeyPress, character) - self.display.sync() - else: - if shifted: - fake_input(self.display, X.KeyPress, self.shift_key) - keycode = self.lookup_character_keycode(character) - fake_input(self.display, X.KeyPress, keycode) - self.display.sync() + self._handle_key(character, X.KeyPress) def release_key(self, character=''): """ Release a given character key. Also works with character keycodes as integers, but not keysyms. """ - try: # Detect uppercase or shifted character - shifted = self.is_char_shifted(character) - except AttributeError: # Handle the case of integer keycode argument - fake_input(self.display, X.KeyRelease, character) - self.display.sync() - else: - if shifted: - fake_input(self.display, X.KeyRelease, self.shift_key) - keycode = self.lookup_character_keycode(character) - fake_input(self.display, X.KeyRelease, keycode) - self.display.sync() + self._handle_key(character, X.KeyRelease) def special_key_assignment(self): """ @@ -138,6 +107,7 @@ def special_key_assignment(self): self.shift_key = self.shift_l_key # Default Shift is left Shift self.alt_l_key = self.lookup_character_keycode('Alt_L') self.alt_r_key = self.lookup_character_keycode('Alt_R') + self.altgr_key = self.lookup_character_keycode('ISO_Level3_Shift') self.alt_key = self.alt_l_key # Default Alt is left Alt self.control_l_key = self.lookup_character_keycode('Control_L') self.control_r_key = self.lookup_character_keycode('Control_R') @@ -219,8 +189,13 @@ def lookup_character_keycode(self, character): for that keysym. """ keysym = Xlib.XK.string_to_keysym(character) - if keysym == 0: - keysym = Xlib.XK.string_to_keysym(special_X_keysyms[character]) + if not keysym: + try: + keysym = getattr(Xlib.keysymdef.xkb, 'XK_' + character, 0) + except: + keysym = 0 + if not keysym: + keysym = Xlib.XK.string_to_keysym(KEYSYMS[character]) return self.display.keysym_to_keycode(keysym) @@ -229,7 +204,7 @@ class PyKeyboardEvent(PyKeyboardEventMeta): The PyKeyboardEvent implementation for X11 systems (mostly linux). This allows one to listen for keyboard input. """ - def __init__(self, display=None): + def __init__(self, capture=False, display=None): self.display = Display(display) self.display2 = Display(display) self.ctx = self.display2.record_create_context( @@ -263,13 +238,13 @@ def __init__(self, display=None): #for i in range(len(self.display._keymap_codes)): # print('{0}: {1}'.format(i, self.display._keymap_codes[i])) - PyKeyboardEventMeta.__init__(self) + PyKeyboardEventMeta.__init__(self, capture) def run(self): """Begin listening for keyboard input events.""" self.state = True if self.capture: - self.display2.screen().root.grab_keyboard(True, X.KeyPressMask | X.KeyReleaseMask, X.GrabModeAsync, X.GrabModeAsync, 0, 0, X.CurrentTime) + self.display2.screen().root.grab_keyboard(X.KeyPressMask | X.KeyReleaseMask, X.GrabModeAsync, X.GrabModeAsync, X.CurrentTime) self.display2.record_enable_context(self.ctx, self.handler) self.display2.record_free_context(self.ctx) @@ -277,12 +252,12 @@ def run(self): def stop(self): """Stop listening for keyboard input events.""" self.state = False - self.display.record_disable_context(self.ctx) - self.display.ungrab_keyboard(X.CurrentTime) - self.display.flush() - self.display2.record_disable_context(self.ctx) - self.display2.ungrab_keyboard(X.CurrentTime) - self.display2.flush() + with display_manager(self.display) as d: + d.record_disable_context(self.ctx) + d.ungrab_keyboard(X.CurrentTime) + with display_manager(self.display2): + d.record_disable_context(self.ctx) + d.ungrab_keyboard(X.CurrentTime) def handler(self, reply): """Upper level handler of keyboard events.""" @@ -482,7 +457,7 @@ def lookup_character_keycode(self, character): """ keysym = self.string_to_keysym.get(character, 0) if keysym == 0: - keysym = self.string_to_keysym.get(special_X_keysyms[character], 0) + keysym = self.string_to_keysym.get(KEYSYMS[character], 0) return self.display.keysym_to_keycode(keysym) def get_translation_dicts(self): diff --git a/pykeyboard/x11_keysyms.py b/pykeyboard/x11_keysyms.py new file mode 100644 index 0000000..969dc2f --- /dev/null +++ b/pykeyboard/x11_keysyms.py @@ -0,0 +1,855 @@ +# coding: utf-8 +# Copyright 2015 Moses Palmér +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program. If not, see . + +KEYSYMS = { + u'\u0020': 'space', + u'\u0021': 'exclam', + u'\u0022': 'quotedbl', + u'\u0023': 'numbersign', + u'\u0024': 'dollar', + u'\u0025': 'percent', + u'\u0026': 'ampersand', + u'\u0027': 'apostrophe', + u'\u0027': 'quoteright', + u'\u0028': 'parenleft', + u'\u0029': 'parenright', + u'\u002a': 'asterisk', + u'\u002b': 'plus', + u'\u002c': 'comma', + u'\u002d': 'minus', + u'\u002e': 'period', + u'\u002f': 'slash', + u'\u0030': '0', + u'\u0031': '1', + u'\u0032': '2', + u'\u0033': '3', + u'\u0034': '4', + u'\u0035': '5', + u'\u0036': '6', + u'\u0037': '7', + u'\u0038': '8', + u'\u0039': '9', + u'\u003a': 'colon', + u'\u003b': 'semicolon', + u'\u003c': 'less', + u'\u003d': 'equal', + u'\u003e': 'greater', + u'\u003f': 'question', + u'\u0040': 'at', + u'\u0041': 'A', + u'\u0042': 'B', + u'\u0043': 'C', + u'\u0044': 'D', + u'\u0045': 'E', + u'\u0046': 'F', + u'\u0047': 'G', + u'\u0048': 'H', + u'\u0049': 'I', + u'\u004a': 'J', + u'\u004b': 'K', + u'\u004c': 'L', + u'\u004d': 'M', + u'\u004e': 'N', + u'\u004f': 'O', + u'\u0050': 'P', + u'\u0051': 'Q', + u'\u0052': 'R', + u'\u0053': 'S', + u'\u0054': 'T', + u'\u0055': 'U', + u'\u0056': 'V', + u'\u0057': 'W', + u'\u0058': 'X', + u'\u0059': 'Y', + u'\u005a': 'Z', + u'\u005b': 'bracketleft', + u'\u005c': 'backslash', + u'\u005d': 'bracketright', + u'\u005e': 'asciicircum', + u'\u005f': 'underscore', + u'\u0060': 'grave', + u'\u0060': 'quoteleft', + u'\u0061': 'a', + u'\u0062': 'b', + u'\u0063': 'c', + u'\u0064': 'd', + u'\u0065': 'e', + u'\u0066': 'f', + u'\u0067': 'g', + u'\u0068': 'h', + u'\u0069': 'i', + u'\u006a': 'j', + u'\u006b': 'k', + u'\u006c': 'l', + u'\u006d': 'm', + u'\u006e': 'n', + u'\u006f': 'o', + u'\u0070': 'p', + u'\u0071': 'q', + u'\u0072': 'r', + u'\u0073': 's', + u'\u0074': 't', + u'\u0075': 'u', + u'\u0076': 'v', + u'\u0077': 'w', + u'\u0078': 'x', + u'\u0079': 'y', + u'\u007a': 'z', + u'\u007b': 'braceleft', + u'\u007c': 'bar', + u'\u007d': 'braceright', + u'\u007e': 'asciitilde', + u'\u00a0': 'nobreakspace', + u'\u00a1': 'exclamdown', + u'\u00a2': 'cent', + u'\u00a3': 'sterling', + u'\u00a4': 'currency', + u'\u00a5': 'yen', + u'\u00a6': 'brokenbar', + u'\u00a7': 'section', + u'\u00a8': 'diaeresis', + u'\u00a9': 'copyright', + u'\u00aa': 'ordfeminine', + u'\u00ab': 'guillemotleft', + u'\u00ac': 'notsign', + u'\u00ad': 'hyphen', + u'\u00ae': 'registered', + u'\u00af': 'macron', + u'\u00b0': 'degree', + u'\u00b1': 'plusminus', + u'\u00b2': 'twosuperior', + u'\u00b3': 'threesuperior', + u'\u00b4': 'acute', + u'\u00b5': 'mu', + u'\u00b6': 'paragraph', + u'\u00b7': 'periodcentered', + u'\u00b8': 'cedilla', + u'\u00b9': 'onesuperior', + u'\u00ba': 'masculine', + u'\u00bb': 'guillemotright', + u'\u00bc': 'onequarter', + u'\u00bd': 'onehalf', + u'\u00be': 'threequarters', + u'\u00bf': 'questiondown', + u'\u00c0': 'Agrave', + u'\u00c1': 'Aacute', + u'\u00c2': 'Acircumflex', + u'\u00c3': 'Atilde', + u'\u00c4': 'Adiaeresis', + u'\u00c5': 'Aring', + u'\u00c6': 'AE', + u'\u00c7': 'Ccedilla', + u'\u00c8': 'Egrave', + u'\u00c9': 'Eacute', + u'\u00ca': 'Ecircumflex', + u'\u00cb': 'Ediaeresis', + u'\u00cc': 'Igrave', + u'\u00cd': 'Iacute', + u'\u00ce': 'Icircumflex', + u'\u00cf': 'Idiaeresis', + u'\u00d0': 'ETH', + u'\u00d0': 'Eth', + u'\u00d1': 'Ntilde', + u'\u00d2': 'Ograve', + u'\u00d3': 'Oacute', + u'\u00d4': 'Ocircumflex', + u'\u00d5': 'Otilde', + u'\u00d6': 'Odiaeresis', + u'\u00d7': 'multiply', + u'\u00d8': 'Ooblique', + u'\u00d9': 'Ugrave', + u'\u00da': 'Uacute', + u'\u00db': 'Ucircumflex', + u'\u00dc': 'Udiaeresis', + u'\u00dd': 'Yacute', + u'\u00de': 'THORN', + u'\u00de': 'Thorn', + u'\u00df': 'ssharp', + u'\u00e0': 'agrave', + u'\u00e1': 'aacute', + u'\u00e2': 'acircumflex', + u'\u00e3': 'atilde', + u'\u00e4': 'adiaeresis', + u'\u00e5': 'aring', + u'\u00e6': 'ae', + u'\u00e7': 'ccedilla', + u'\u00e8': 'egrave', + u'\u00e9': 'eacute', + u'\u00ea': 'ecircumflex', + u'\u00eb': 'ediaeresis', + u'\u00ec': 'igrave', + u'\u00ed': 'iacute', + u'\u00ee': 'icircumflex', + u'\u00ef': 'idiaeresis', + u'\u00f0': 'eth', + u'\u00f1': 'ntilde', + u'\u00f2': 'ograve', + u'\u00f3': 'oacute', + u'\u00f4': 'ocircumflex', + u'\u00f5': 'otilde', + u'\u00f6': 'odiaeresis', + u'\u00f7': 'division', + u'\u00f8': 'oslash', + u'\u00f9': 'ugrave', + u'\u00fa': 'uacute', + u'\u00fb': 'ucircumflex', + u'\u00fc': 'udiaeresis', + u'\u00fd': 'yacute', + u'\u00fe': 'thorn', + u'\u00ff': 'ydiaeresis', + u'\u0104': 'Aogonek', + u'\u02d8': 'breve', + u'\u0141': 'Lstroke', + u'\u013d': 'Lcaron', + u'\u015a': 'Sacute', + u'\u0160': 'Scaron', + u'\u015e': 'Scedilla', + u'\u0164': 'Tcaron', + u'\u0179': 'Zacute', + u'\u017d': 'Zcaron', + u'\u017b': 'Zabovedot', + u'\u0105': 'aogonek', + u'\u02db': 'ogonek', + u'\u0142': 'lstroke', + u'\u013e': 'lcaron', + u'\u015b': 'sacute', + u'\u02c7': 'caron', + u'\u0161': 'scaron', + u'\u015f': 'scedilla', + u'\u0165': 'tcaron', + u'\u017a': 'zacute', + u'\u02dd': 'doubleacute', + u'\u017e': 'zcaron', + u'\u017c': 'zabovedot', + u'\u0154': 'Racute', + u'\u0102': 'Abreve', + u'\u0139': 'Lacute', + u'\u0106': 'Cacute', + u'\u010c': 'Ccaron', + u'\u0118': 'Eogonek', + u'\u011a': 'Ecaron', + u'\u010e': 'Dcaron', + u'\u0110': 'Dstroke', + u'\u0143': 'Nacute', + u'\u0147': 'Ncaron', + u'\u0150': 'Odoubleacute', + u'\u0158': 'Rcaron', + u'\u016e': 'Uring', + u'\u0170': 'Udoubleacute', + u'\u0162': 'Tcedilla', + u'\u0155': 'racute', + u'\u0103': 'abreve', + u'\u013a': 'lacute', + u'\u0107': 'cacute', + u'\u010d': 'ccaron', + u'\u0119': 'eogonek', + u'\u011b': 'ecaron', + u'\u010f': 'dcaron', + u'\u0111': 'dstroke', + u'\u0144': 'nacute', + u'\u0148': 'ncaron', + u'\u0151': 'odoubleacute', + u'\u0159': 'rcaron', + u'\u016f': 'uring', + u'\u0171': 'udoubleacute', + u'\u0163': 'tcedilla', + u'\u02d9': 'abovedot', + u'\u0126': 'Hstroke', + u'\u0124': 'Hcircumflex', + u'\u0130': 'Iabovedot', + u'\u011e': 'Gbreve', + u'\u0134': 'Jcircumflex', + u'\u0127': 'hstroke', + u'\u0125': 'hcircumflex', + u'\u0131': 'idotless', + u'\u011f': 'gbreve', + u'\u0135': 'jcircumflex', + u'\u010a': 'Cabovedot', + u'\u0108': 'Ccircumflex', + u'\u0120': 'Gabovedot', + u'\u011c': 'Gcircumflex', + u'\u016c': 'Ubreve', + u'\u015c': 'Scircumflex', + u'\u010b': 'cabovedot', + u'\u0109': 'ccircumflex', + u'\u0121': 'gabovedot', + u'\u011d': 'gcircumflex', + u'\u016d': 'ubreve', + u'\u015d': 'scircumflex', + u'\u0138': 'kra', + u'\u0156': 'Rcedilla', + u'\u0128': 'Itilde', + u'\u013b': 'Lcedilla', + u'\u0112': 'Emacron', + u'\u0122': 'Gcedilla', + u'\u0166': 'Tslash', + u'\u0157': 'rcedilla', + u'\u0129': 'itilde', + u'\u013c': 'lcedilla', + u'\u0113': 'emacron', + u'\u0123': 'gcedilla', + u'\u0167': 'tslash', + u'\u014a': 'ENG', + u'\u014b': 'eng', + u'\u0100': 'Amacron', + u'\u012e': 'Iogonek', + u'\u0116': 'Eabovedot', + u'\u012a': 'Imacron', + u'\u0145': 'Ncedilla', + u'\u014c': 'Omacron', + u'\u0136': 'Kcedilla', + u'\u0172': 'Uogonek', + u'\u0168': 'Utilde', + u'\u016a': 'Umacron', + u'\u0101': 'amacron', + u'\u012f': 'iogonek', + u'\u0117': 'eabovedot', + u'\u012b': 'imacron', + u'\u0146': 'ncedilla', + u'\u014d': 'omacron', + u'\u0137': 'kcedilla', + u'\u0173': 'uogonek', + u'\u0169': 'utilde', + u'\u016b': 'umacron', + u'\u203e': 'overline', + u'\u3002': 'kana_fullstop', + u'\u300c': 'kana_openingbracket', + u'\u300d': 'kana_closingbracket', + u'\u3001': 'kana_comma', + u'\u30fb': 'kana_conjunctive', + u'\u30f2': 'kana_WO', + u'\u30a1': 'kana_a', + u'\u30a3': 'kana_i', + u'\u30a5': 'kana_u', + u'\u30a7': 'kana_e', + u'\u30a9': 'kana_o', + u'\u30e3': 'kana_ya', + u'\u30e5': 'kana_yu', + u'\u30e7': 'kana_yo', + u'\u30c3': 'kana_tsu', + u'\u30fc': 'prolongedsound', + u'\u30a2': 'kana_A', + u'\u30a4': 'kana_I', + u'\u30a6': 'kana_U', + u'\u30a8': 'kana_E', + u'\u30aa': 'kana_O', + u'\u30ab': 'kana_KA', + u'\u30ad': 'kana_KI', + u'\u30af': 'kana_KU', + u'\u30b1': 'kana_KE', + u'\u30b3': 'kana_KO', + u'\u30b5': 'kana_SA', + u'\u30b7': 'kana_SHI', + u'\u30b9': 'kana_SU', + u'\u30bb': 'kana_SE', + u'\u30bd': 'kana_SO', + u'\u30bf': 'kana_TA', + u'\u30c1': 'kana_CHI', + u'\u30c4': 'kana_TSU', + u'\u30c6': 'kana_TE', + u'\u30c8': 'kana_TO', + u'\u30ca': 'kana_NA', + u'\u30cb': 'kana_NI', + u'\u30cc': 'kana_NU', + u'\u30cd': 'kana_NE', + u'\u30ce': 'kana_NO', + u'\u30cf': 'kana_HA', + u'\u30d2': 'kana_HI', + u'\u30d5': 'kana_FU', + u'\u30d8': 'kana_HE', + u'\u30db': 'kana_HO', + u'\u30de': 'kana_MA', + u'\u30df': 'kana_MI', + u'\u30e0': 'kana_MU', + u'\u30e1': 'kana_ME', + u'\u30e2': 'kana_MO', + u'\u30e4': 'kana_YA', + u'\u30e6': 'kana_YU', + u'\u30e8': 'kana_YO', + u'\u30e9': 'kana_RA', + u'\u30ea': 'kana_RI', + u'\u30eb': 'kana_RU', + u'\u30ec': 'kana_RE', + u'\u30ed': 'kana_RO', + u'\u30ef': 'kana_WA', + u'\u30f3': 'kana_N', + u'\u309b': 'voicedsound', + u'\u309c': 'semivoicedsound', + u'\u060c': 'Arabic_comma', + u'\u061b': 'Arabic_semicolon', + u'\u061f': 'Arabic_question_mark', + u'\u0621': 'Arabic_hamza', + u'\u0622': 'Arabic_maddaonalef', + u'\u0623': 'Arabic_hamzaonalef', + u'\u0624': 'Arabic_hamzaonwaw', + u'\u0625': 'Arabic_hamzaunderalef', + u'\u0626': 'Arabic_hamzaonyeh', + u'\u0627': 'Arabic_alef', + u'\u0628': 'Arabic_beh', + u'\u0629': 'Arabic_tehmarbuta', + u'\u062a': 'Arabic_teh', + u'\u062b': 'Arabic_theh', + u'\u062c': 'Arabic_jeem', + u'\u062d': 'Arabic_hah', + u'\u062e': 'Arabic_khah', + u'\u062f': 'Arabic_dal', + u'\u0630': 'Arabic_thal', + u'\u0631': 'Arabic_ra', + u'\u0632': 'Arabic_zain', + u'\u0633': 'Arabic_seen', + u'\u0634': 'Arabic_sheen', + u'\u0635': 'Arabic_sad', + u'\u0636': 'Arabic_dad', + u'\u0637': 'Arabic_tah', + u'\u0638': 'Arabic_zah', + u'\u0639': 'Arabic_ain', + u'\u063a': 'Arabic_ghain', + u'\u0640': 'Arabic_tatweel', + u'\u0641': 'Arabic_feh', + u'\u0642': 'Arabic_qaf', + u'\u0643': 'Arabic_kaf', + u'\u0644': 'Arabic_lam', + u'\u0645': 'Arabic_meem', + u'\u0646': 'Arabic_noon', + u'\u0647': 'Arabic_ha', + u'\u0648': 'Arabic_waw', + u'\u0649': 'Arabic_alefmaksura', + u'\u064a': 'Arabic_yeh', + u'\u064b': 'Arabic_fathatan', + u'\u064c': 'Arabic_dammatan', + u'\u064d': 'Arabic_kasratan', + u'\u064e': 'Arabic_fatha', + u'\u064f': 'Arabic_damma', + u'\u0650': 'Arabic_kasra', + u'\u0651': 'Arabic_shadda', + u'\u0652': 'Arabic_sukun', + u'\u0452': 'Serbian_dje', + u'\u0453': 'Macedonia_gje', + u'\u0451': 'Cyrillic_io', + u'\u0454': 'Ukrainian_ie', + u'\u0455': 'Macedonia_dse', + u'\u0456': 'Ukrainian_i', + u'\u0457': 'Ukrainian_yi', + u'\u0458': 'Cyrillic_je', + u'\u0459': 'Cyrillic_lje', + u'\u045a': 'Cyrillic_nje', + u'\u045b': 'Serbian_tshe', + u'\u045c': 'Macedonia_kje', + u'\u045e': 'Byelorussian_shortu', + u'\u045f': 'Cyrillic_dzhe', + u'\u2116': 'numerosign', + u'\u0402': 'Serbian_DJE', + u'\u0403': 'Macedonia_GJE', + u'\u0401': 'Cyrillic_IO', + u'\u0404': 'Ukrainian_IE', + u'\u0405': 'Macedonia_DSE', + u'\u0406': 'Ukrainian_I', + u'\u0407': 'Ukrainian_YI', + u'\u0408': 'Cyrillic_JE', + u'\u0409': 'Cyrillic_LJE', + u'\u040a': 'Cyrillic_NJE', + u'\u040b': 'Serbian_TSHE', + u'\u040c': 'Macedonia_KJE', + u'\u040e': 'Byelorussian_SHORTU', + u'\u040f': 'Cyrillic_DZHE', + u'\u044e': 'Cyrillic_yu', + u'\u0430': 'Cyrillic_a', + u'\u0431': 'Cyrillic_be', + u'\u0446': 'Cyrillic_tse', + u'\u0434': 'Cyrillic_de', + u'\u0435': 'Cyrillic_ie', + u'\u0444': 'Cyrillic_ef', + u'\u0433': 'Cyrillic_ghe', + u'\u0445': 'Cyrillic_ha', + u'\u0438': 'Cyrillic_i', + u'\u0439': 'Cyrillic_shorti', + u'\u043a': 'Cyrillic_ka', + u'\u043b': 'Cyrillic_el', + u'\u043c': 'Cyrillic_em', + u'\u043d': 'Cyrillic_en', + u'\u043e': 'Cyrillic_o', + u'\u043f': 'Cyrillic_pe', + u'\u044f': 'Cyrillic_ya', + u'\u0440': 'Cyrillic_er', + u'\u0441': 'Cyrillic_es', + u'\u0442': 'Cyrillic_te', + u'\u0443': 'Cyrillic_u', + u'\u0436': 'Cyrillic_zhe', + u'\u0432': 'Cyrillic_ve', + u'\u044c': 'Cyrillic_softsign', + u'\u044b': 'Cyrillic_yeru', + u'\u0437': 'Cyrillic_ze', + u'\u0448': 'Cyrillic_sha', + u'\u044d': 'Cyrillic_e', + u'\u0449': 'Cyrillic_shcha', + u'\u0447': 'Cyrillic_che', + u'\u044a': 'Cyrillic_hardsign', + u'\u042e': 'Cyrillic_YU', + u'\u0410': 'Cyrillic_A', + u'\u0411': 'Cyrillic_BE', + u'\u0426': 'Cyrillic_TSE', + u'\u0414': 'Cyrillic_DE', + u'\u0415': 'Cyrillic_IE', + u'\u0424': 'Cyrillic_EF', + u'\u0413': 'Cyrillic_GHE', + u'\u0425': 'Cyrillic_HA', + u'\u0418': 'Cyrillic_I', + u'\u0419': 'Cyrillic_SHORTI', + u'\u041a': 'Cyrillic_KA', + u'\u041b': 'Cyrillic_EL', + u'\u041c': 'Cyrillic_EM', + u'\u041d': 'Cyrillic_EN', + u'\u041e': 'Cyrillic_O', + u'\u041f': 'Cyrillic_PE', + u'\u042f': 'Cyrillic_YA', + u'\u0420': 'Cyrillic_ER', + u'\u0421': 'Cyrillic_ES', + u'\u0422': 'Cyrillic_TE', + u'\u0423': 'Cyrillic_U', + u'\u0416': 'Cyrillic_ZHE', + u'\u0412': 'Cyrillic_VE', + u'\u042c': 'Cyrillic_SOFTSIGN', + u'\u042b': 'Cyrillic_YERU', + u'\u0417': 'Cyrillic_ZE', + u'\u0428': 'Cyrillic_SHA', + u'\u042d': 'Cyrillic_E', + u'\u0429': 'Cyrillic_SHCHA', + u'\u0427': 'Cyrillic_CHE', + u'\u042a': 'Cyrillic_HARDSIGN', + u'\u0386': 'Greek_ALPHAaccent', + u'\u0388': 'Greek_EPSILONaccent', + u'\u0389': 'Greek_ETAaccent', + u'\u038a': 'Greek_IOTAaccent', + u'\u03aa': 'Greek_IOTAdiaeresis', + u'\u038c': 'Greek_OMICRONaccent', + u'\u038e': 'Greek_UPSILONaccent', + u'\u03ab': 'Greek_UPSILONdieresis', + u'\u038f': 'Greek_OMEGAaccent', + u'\u0385': 'Greek_accentdieresis', + u'\u2015': 'Greek_horizbar', + u'\u03ac': 'Greek_alphaaccent', + u'\u03ad': 'Greek_epsilonaccent', + u'\u03ae': 'Greek_etaaccent', + u'\u03af': 'Greek_iotaaccent', + u'\u03ca': 'Greek_iotadieresis', + u'\u0390': 'Greek_iotaaccentdieresis', + u'\u03cc': 'Greek_omicronaccent', + u'\u03cd': 'Greek_upsilonaccent', + u'\u03cb': 'Greek_upsilondieresis', + u'\u03b0': 'Greek_upsilonaccentdieresis', + u'\u03ce': 'Greek_omegaaccent', + u'\u0391': 'Greek_ALPHA', + u'\u0392': 'Greek_BETA', + u'\u0393': 'Greek_GAMMA', + u'\u0394': 'Greek_DELTA', + u'\u0395': 'Greek_EPSILON', + u'\u0396': 'Greek_ZETA', + u'\u0397': 'Greek_ETA', + u'\u0398': 'Greek_THETA', + u'\u0399': 'Greek_IOTA', + u'\u039a': 'Greek_KAPPA', + u'\u039b': 'Greek_LAMBDA', + u'\u039b': 'Greek_LAMDA', + u'\u039c': 'Greek_MU', + u'\u039d': 'Greek_NU', + u'\u039e': 'Greek_XI', + u'\u039f': 'Greek_OMICRON', + u'\u03a0': 'Greek_PI', + u'\u03a1': 'Greek_RHO', + u'\u03a3': 'Greek_SIGMA', + u'\u03a4': 'Greek_TAU', + u'\u03a5': 'Greek_UPSILON', + u'\u03a6': 'Greek_PHI', + u'\u03a7': 'Greek_CHI', + u'\u03a8': 'Greek_PSI', + u'\u03a9': 'Greek_OMEGA', + u'\u03b1': 'Greek_alpha', + u'\u03b2': 'Greek_beta', + u'\u03b3': 'Greek_gamma', + u'\u03b4': 'Greek_delta', + u'\u03b5': 'Greek_epsilon', + u'\u03b6': 'Greek_zeta', + u'\u03b7': 'Greek_eta', + u'\u03b8': 'Greek_theta', + u'\u03b9': 'Greek_iota', + u'\u03ba': 'Greek_kappa', + u'\u03bb': 'Greek_lambda', + u'\u03bc': 'Greek_mu', + u'\u03bd': 'Greek_nu', + u'\u03be': 'Greek_xi', + u'\u03bf': 'Greek_omicron', + u'\u03c0': 'Greek_pi', + u'\u03c1': 'Greek_rho', + u'\u03c3': 'Greek_sigma', + u'\u03c2': 'Greek_finalsmallsigma', + u'\u03c4': 'Greek_tau', + u'\u03c5': 'Greek_upsilon', + u'\u03c6': 'Greek_phi', + u'\u03c7': 'Greek_chi', + u'\u03c8': 'Greek_psi', + u'\u03c9': 'Greek_omega', + u'\u23b7': 'leftradical', + u'\u2320': 'topintegral', + u'\u2321': 'botintegral', + u'\u23a1': 'topleftsqbracket', + u'\u23a3': 'botleftsqbracket', + u'\u23a4': 'toprightsqbracket', + u'\u23a6': 'botrightsqbracket', + u'\u239b': 'topleftparens', + u'\u239d': 'botleftparens', + u'\u239e': 'toprightparens', + u'\u23a0': 'botrightparens', + u'\u23a8': 'leftmiddlecurlybrace', + u'\u23ac': 'rightmiddlecurlybrace', + u'\u2264': 'lessthanequal', + u'\u2260': 'notequal', + u'\u2265': 'greaterthanequal', + u'\u222b': 'integral', + u'\u2234': 'therefore', + u'\u221d': 'variation', + u'\u221e': 'infinity', + u'\u2207': 'nabla', + u'\u223c': 'approximate', + u'\u2243': 'similarequal', + u'\u21d4': 'ifonlyif', + u'\u21d2': 'implies', + u'\u2261': 'identical', + u'\u221a': 'radical', + u'\u2282': 'includedin', + u'\u2283': 'includes', + u'\u2229': 'intersection', + u'\u222a': 'union', + u'\u2227': 'logicaland', + u'\u2228': 'logicalor', + u'\u2202': 'partialderivative', + u'\u0192': 'function', + u'\u2190': 'leftarrow', + u'\u2191': 'uparrow', + u'\u2192': 'rightarrow', + u'\u2193': 'downarrow', + u'\u25c6': 'soliddiamond', + u'\u2592': 'checkerboard', + u'\u2409': 'ht', + u'\u240c': 'ff', + u'\u240d': 'cr', + u'\u240a': 'lf', + u'\u2424': 'nl', + u'\u240b': 'vt', + u'\u2518': 'lowrightcorner', + u'\u2510': 'uprightcorner', + u'\u250c': 'upleftcorner', + u'\u2514': 'lowleftcorner', + u'\u253c': 'crossinglines', + u'\u23ba': 'horizlinescan1', + u'\u23bb': 'horizlinescan3', + u'\u2500': 'horizlinescan5', + u'\u23bc': 'horizlinescan7', + u'\u23bd': 'horizlinescan9', + u'\u251c': 'leftt', + u'\u2524': 'rightt', + u'\u2534': 'bott', + u'\u252c': 'topt', + u'\u2502': 'vertbar', + u'\u2003': 'emspace', + u'\u2002': 'enspace', + u'\u2004': 'em3space', + u'\u2005': 'em4space', + u'\u2007': 'digitspace', + u'\u2008': 'punctspace', + u'\u2009': 'thinspace', + u'\u200a': 'hairspace', + u'\u2014': 'emdash', + u'\u2013': 'endash', + u'\u2026': 'ellipsis', + u'\u2025': 'doubbaselinedot', + u'\u2153': 'onethird', + u'\u2154': 'twothirds', + u'\u2155': 'onefifth', + u'\u2156': 'twofifths', + u'\u2157': 'threefifths', + u'\u2158': 'fourfifths', + u'\u2159': 'onesixth', + u'\u215a': 'fivesixths', + u'\u2105': 'careof', + u'\u2012': 'figdash', + u'\u215b': 'oneeighth', + u'\u215c': 'threeeighths', + u'\u215d': 'fiveeighths', + u'\u215e': 'seveneighths', + u'\u2122': 'trademark', + u'\u2018': 'leftsinglequotemark', + u'\u2019': 'rightsinglequotemark', + u'\u201c': 'leftdoublequotemark', + u'\u201d': 'rightdoublequotemark', + u'\u211e': 'prescription', + u'\u2032': 'minutes', + u'\u2033': 'seconds', + u'\u271d': 'latincross', + u'\u2663': 'club', + u'\u2666': 'diamond', + u'\u2665': 'heart', + u'\u2720': 'maltesecross', + u'\u2020': 'dagger', + u'\u2021': 'doubledagger', + u'\u2713': 'checkmark', + u'\u2717': 'ballotcross', + u'\u266f': 'musicalsharp', + u'\u266d': 'musicalflat', + u'\u2642': 'malesymbol', + u'\u2640': 'femalesymbol', + u'\u260e': 'telephone', + u'\u2315': 'telephonerecorder', + u'\u2117': 'phonographcopyright', + u'\u2038': 'caret', + u'\u201a': 'singlelowquotemark', + u'\u201e': 'doublelowquotemark', + u'\u22a5': 'downtack', + u'\u230a': 'downstile', + u'\u2218': 'jot', + u'\u2395': 'quad', + u'\u22a4': 'uptack', + u'\u25cb': 'circle', + u'\u2308': 'upstile', + u'\u22a2': 'lefttack', + u'\u22a3': 'righttack', + u'\u2017': 'hebrew_doublelowline', + u'\u05d0': 'hebrew_aleph', + u'\u05d1': 'hebrew_bet', + u'\u05d1': 'hebrew_beth', + u'\u05d2': 'hebrew_gimel', + u'\u05d2': 'hebrew_gimmel', + u'\u05d3': 'hebrew_dalet', + u'\u05d3': 'hebrew_daleth', + u'\u05d4': 'hebrew_he', + u'\u05d5': 'hebrew_waw', + u'\u05d6': 'hebrew_zain', + u'\u05d6': 'hebrew_zayin', + u'\u05d7': 'hebrew_chet', + u'\u05d7': 'hebrew_het', + u'\u05d8': 'hebrew_tet', + u'\u05d8': 'hebrew_teth', + u'\u05d9': 'hebrew_yod', + u'\u05da': 'hebrew_finalkaph', + u'\u05db': 'hebrew_kaph', + u'\u05dc': 'hebrew_lamed', + u'\u05dd': 'hebrew_finalmem', + u'\u05de': 'hebrew_mem', + u'\u05df': 'hebrew_finalnun', + u'\u05e0': 'hebrew_nun', + u'\u05e1': 'hebrew_samech', + u'\u05e1': 'hebrew_samekh', + u'\u05e2': 'hebrew_ayin', + u'\u05e3': 'hebrew_finalpe', + u'\u05e4': 'hebrew_pe', + u'\u05e5': 'hebrew_finalzade', + u'\u05e5': 'hebrew_finalzadi', + u'\u05e6': 'hebrew_zade', + u'\u05e6': 'hebrew_zadi', + u'\u05e7': 'hebrew_kuf', + u'\u05e7': 'hebrew_qoph', + u'\u05e8': 'hebrew_resh', + u'\u05e9': 'hebrew_shin', + u'\u05ea': 'hebrew_taf', + u'\u05ea': 'hebrew_taw', + u'\u0e01': 'Thai_kokai', + u'\u0e02': 'Thai_khokhai', + u'\u0e03': 'Thai_khokhuat', + u'\u0e04': 'Thai_khokhwai', + u'\u0e05': 'Thai_khokhon', + u'\u0e06': 'Thai_khorakhang', + u'\u0e07': 'Thai_ngongu', + u'\u0e08': 'Thai_chochan', + u'\u0e09': 'Thai_choching', + u'\u0e0a': 'Thai_chochang', + u'\u0e0b': 'Thai_soso', + u'\u0e0c': 'Thai_chochoe', + u'\u0e0d': 'Thai_yoying', + u'\u0e0e': 'Thai_dochada', + u'\u0e0f': 'Thai_topatak', + u'\u0e10': 'Thai_thothan', + u'\u0e11': 'Thai_thonangmontho', + u'\u0e12': 'Thai_thophuthao', + u'\u0e13': 'Thai_nonen', + u'\u0e14': 'Thai_dodek', + u'\u0e15': 'Thai_totao', + u'\u0e16': 'Thai_thothung', + u'\u0e17': 'Thai_thothahan', + u'\u0e18': 'Thai_thothong', + u'\u0e19': 'Thai_nonu', + u'\u0e1a': 'Thai_bobaimai', + u'\u0e1b': 'Thai_popla', + u'\u0e1c': 'Thai_phophung', + u'\u0e1d': 'Thai_fofa', + u'\u0e1e': 'Thai_phophan', + u'\u0e1f': 'Thai_fofan', + u'\u0e20': 'Thai_phosamphao', + u'\u0e21': 'Thai_moma', + u'\u0e22': 'Thai_yoyak', + u'\u0e23': 'Thai_rorua', + u'\u0e24': 'Thai_ru', + u'\u0e25': 'Thai_loling', + u'\u0e26': 'Thai_lu', + u'\u0e27': 'Thai_wowaen', + u'\u0e28': 'Thai_sosala', + u'\u0e29': 'Thai_sorusi', + u'\u0e2a': 'Thai_sosua', + u'\u0e2b': 'Thai_hohip', + u'\u0e2c': 'Thai_lochula', + u'\u0e2d': 'Thai_oang', + u'\u0e2e': 'Thai_honokhuk', + u'\u0e2f': 'Thai_paiyannoi', + u'\u0e30': 'Thai_saraa', + u'\u0e31': 'Thai_maihanakat', + u'\u0e32': 'Thai_saraaa', + u'\u0e33': 'Thai_saraam', + u'\u0e34': 'Thai_sarai', + u'\u0e35': 'Thai_saraii', + u'\u0e36': 'Thai_saraue', + u'\u0e37': 'Thai_sarauee', + u'\u0e38': 'Thai_sarau', + u'\u0e39': 'Thai_sarauu', + u'\u0e3a': 'Thai_phinthu', + u'\u0e3f': 'Thai_baht', + u'\u0e40': 'Thai_sarae', + u'\u0e41': 'Thai_saraae', + u'\u0e42': 'Thai_sarao', + u'\u0e43': 'Thai_saraaimaimuan', + u'\u0e44': 'Thai_saraaimaimalai', + u'\u0e45': 'Thai_lakkhangyao', + u'\u0e46': 'Thai_maiyamok', + u'\u0e47': 'Thai_maitaikhu', + u'\u0e48': 'Thai_maiek', + u'\u0e49': 'Thai_maitho', + u'\u0e4a': 'Thai_maitri', + u'\u0e4b': 'Thai_maichattawa', + u'\u0e4c': 'Thai_thanthakhat', + u'\u0e4d': 'Thai_nikhahit', + u'\u0e50': 'Thai_leksun', + u'\u0e51': 'Thai_leknung', + u'\u0e52': 'Thai_leksong', + u'\u0e53': 'Thai_leksam', + u'\u0e54': 'Thai_leksi', + u'\u0e55': 'Thai_lekha', + u'\u0e56': 'Thai_lekhok', + u'\u0e57': 'Thai_lekchet', + u'\u0e58': 'Thai_lekpaet', + u'\u0e59': 'Thai_lekkao', + u'\u0152': 'OE', + u'\u0153': 'oe', + u'\u0178': 'Ydiaeresis', + u'\u20ac': 'EuroSign', + u'\u0491': 'Ukrainian_ghe_with_upturn', + u'\u0490': 'Ukrainian_GHE_WITH_UPTURN'} diff --git a/pymouse/base.py b/pymouse/base.py index bfae8cb..a013296 100644 --- a/pymouse/base.py +++ b/pymouse/base.py @@ -122,3 +122,11 @@ def click(self, x, y, button, press): def move(self, x, y): """Subclass this method with your move event handler""" pass + + def scroll(self, x, y, vertical, horizontal): + """ + Subclass this method with your scroll event handler + Vertical: + Up, - Down + Horizontal: + Right, - Left + """ + pass diff --git a/pymouse/windows.py b/pymouse/windows.py index ecfc9fa..b08f4f7 100644 --- a/pymouse/windows.py +++ b/pymouse/windows.py @@ -90,7 +90,7 @@ def screen_size(self): class PyMouseEvent(PyMouseEventMeta): def __init__(self, capture=False, capture_move=False): - import pyHook + import pyWinhook as pyHook PyMouseEventMeta.__init__(self, capture=capture, capture_move=capture_move) self.hm = pyHook.HookManager() @@ -107,11 +107,12 @@ def stop(self): self.state = False def _action(self, event): - import pyHook + import pyWinhook as pyHook x, y = event.Position if event.Message == pyHook.HookConstants.WM_MOUSEMOVE: self.move(x,y) + return not self.capture_move elif event.Message == pyHook.HookConstants.WM_LBUTTONDOWN: self.click(x, y, 1, True) @@ -125,9 +126,9 @@ def _action(self, event): self.click(x, y, 3, True) elif event.Message == pyHook.HookConstants.WM_MBUTTONUP: self.click(x, y, 3, False) - + elif event.Message == pyHook.HookConstants.WM_MOUSEWHEEL: # event.Wheel is -1 when scrolling down, 1 when scrolling up - self.scroll(x,y,event.Wheel) - + self.scroll(x, y, event.Wheel, 0) + return not self.capture diff --git a/pymouse/x11.py b/pymouse/x11.py index 51704b4..524ba77 100644 --- a/pymouse/x11.py +++ b/pymouse/x11.py @@ -21,7 +21,63 @@ from .base import PyMouseMeta, PyMouseEventMeta, ScrollSupportError -button_ids = [None, 1, 3, 2, 4, 5, 6, 7] + +class X11Error(Exception): + """An error that is thrown at the end of a code block managed by a + :func:`display_manager` if an *X11* error occurred. + """ + pass + + +def display_manager(display): + """Traps *X* errors and raises an :class:``X11Error`` at the end if any + error occurred. + + This handler also ensures that the :class:`Xlib.display.Display` being + managed is sync'd. + + :param Xlib.display.Display display: The *X* display. + + :return: the display + :rtype: Xlib.display.Display + """ + from contextlib import contextmanager + + @contextmanager + def manager(): + errors = [] + + def handler(*args): + errors.append(args) + + old_handler = display.set_error_handler(handler) + yield display + display.sync() + display.set_error_handler(old_handler) + if errors: + raise X11Error(errors) + + return manager() + + +def translate_button_code(button): + # In X11, the button numbers are: + # leftclick=1, middleclick=2, rightclick=3 + # For the purposes of the cross-platform interface of PyMouse, we + # invert the button number values of the right and middle buttons + if button in [1, 2, 3]: + return (None, 1, 3, 2)[button] + else: + return button + +def button_code_to_scroll_direction(button): + # scrollup=4, scrolldown=5, scrollleft=6, scrollright=7 + return { + 4: (1, 0), + 5: (-1, 0), + 6: (0, 1), + 7: (0, -1), + }[button] class PyMouse(PyMouseMeta): @@ -32,13 +88,15 @@ def __init__(self, display=None): def press(self, x, y, button=1): self.move(x, y) - fake_input(self.display, X.ButtonPress, button_ids[button]) - self.display.sync() + + with display_manager(self.display) as d: + fake_input(d, X.ButtonPress, translate_button_code(button)) def release(self, x, y, button=1): self.move(x, y) - fake_input(self.display, X.ButtonRelease, button_ids[button]) - self.display.sync() + + with display_manager(self.display) as d: + fake_input(d, X.ButtonRelease, translate_button_code(button)) def scroll(self, vertical=None, horizontal=None, depth=None): #Xlib supports only vertical and horizontal scrolling @@ -66,14 +124,14 @@ def scroll(self, vertical=None, horizontal=None, depth=None): def move(self, x, y): if (x, y) != self.position(): - fake_input(self.display, X.MotionNotify, x=x, y=y) - self.display.sync() + with display_manager(self.display) as d: + fake_input(d, X.MotionNotify, x=x, y=y) def drag(self, x, y): - fake_input(self.display, X.ButtonPress, button_ids[1]) - fake_input(self.display, X.MotionNotify, x=x, y=y) - fake_input(self.display, X.ButtonRelease, button_ids[1]) - self.display.sync() + with display_manager(self.display) as d: + fake_input(d, X.ButtonPress, 1) + fake_input(d, X.MotionNotify, x=x, y=y) + fake_input(d, X.ButtonRelease, 1) def position(self): coord = self.display.screen().root.query_pointer()._data @@ -137,26 +195,24 @@ def run(self): def stop(self): self.state = False - self.display.flush() - self.display.record_disable_context(self.ctx) - self.display.ungrab_pointer(X.CurrentTime) - self.display2.flush() - self.display2.record_disable_context(self.ctx) - self.display2.ungrab_pointer(X.CurrentTime) + with display_manager(self.display) as d: + d.ungrab_pointer(X.CurrentTime) + d.record_disable_context(self.ctx) + with display_manager(self.display2) as d: + d.ungrab_pointer(X.CurrentTime) + d.record_disable_context(self.ctx) def handler(self, reply): data = reply.data while len(data): event, data = rq.EventField(None).parse_binary_value(data, self.display.display, None, None) - #In X11, the button numbers are: leftclick=1, middleclick=2, - # rightclick=3, scrollup=4, scrolldown=5, scrollleft=6, - # scrollright=7 - # For the purposes of the cross-platform interface of PyMouse, we - # invert the button number values of the right and middle buttons - if event.type == X.ButtonPress: - self.click(event.root_x, event.root_y, (None, 1, 3, 2, 4, 5, 6, 7)[event.detail], True) + if event.detail in [4, 5, 6, 7]: + if event.type == X.ButtonPress: + self.scroll(event.root_x, event.root_y, *button_code_to_scroll_direction(event.detail)) + elif event.type == X.ButtonPress: + self.click(event.root_x, event.root_y, translate_button_code(event.detail), True) elif event.type == X.ButtonRelease: - self.click(event.root_x, event.root_y, (None, 1, 3, 2, 4, 5, 6, 7)[event.detail], False) + self.click(event.root_x, event.root_y, translate_button_code(event.detail), False) else: self.move(event.root_x, event.root_y) diff --git a/reference_materials/xlib-keysyms-to-python.py b/reference_materials/xlib-keysyms-to-python.py new file mode 100644 index 0000000..48b0e8b --- /dev/null +++ b/reference_materials/xlib-keysyms-to-python.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python +# coding: utf-8 +# Copyright 2015 Moses Palmér +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program. If not, see . +""" +Converts the file xlib-keysyms.txt to a Python mapping from character to +symbol name. +""" + +import os + +#: The path to the input file +INPUT_PATH = os.path.join( + os.path.dirname(__file__), + 'xlib-keysyms.txt') + +#: The path to the output file +OUTPUT_PATH = os.path.join( + os.path.dirname(__file__), + os.path.pardir, + 'pykeyboard', + 'x11_keysyms.py') + + +def lines(): + """Yields all lines in the input file. + """ + with open(INPUT_PATH) as f: + for line in f: + yield line.rstrip() + + +def keysym_lines(): + """Yields all lines in the input file containing a keysym definition. + """ + for line in lines(): + if not line: + # Ignore empty lines + continue + elif line[0] == '#': + # Ignore lines starting with '#'; it is also used to separate + # keysym information from its name, but in the first position it is + # used to mark comments + continue + else: + yield line + + +def keysym_definitions(): + """Yields all keysym definitions parsed as tuples. + """ + for keysym_line in keysym_lines(): + # As described in the input text, the format of a line is: + # 0x20 U0020 . # space /* optional comment */ + keysym_number, codepoint, status, _, name_part = [ + p.strip() for p in keysym_line.split(None, 4)] + name = name_part.split()[0] + + yield (int(keysym_number, 16), codepoint[1:], status, name) + + +def keysyms_from_strings(): + """Yields the tuple ``(character, symbol name)`` for all keysyms. + """ + for number, codepoint, status, name in keysym_definitions(): + # Ignore keysyms that do not map to unicode characters + if all(c == '0' for c in codepoint): + continue + + # Ignore keysyms that are not well established + if status != '.': + continue + + yield (codepoint, name) + + +if __name__ == '__main__': + with open(OUTPUT_PATH, 'w') as f: + f.write('''# coding: utf-8 +# Copyright 2015 Moses Palmér +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# this program. If not, see . + +KEYSYMS = { +%s} +''' % ',\n'.join( + ' u\'\\u%s\': \'%s\'' % (codepoint, name) + for codepoint, name in keysyms_from_strings())) diff --git a/reference_materials/xlib-keysyms.txt b/reference_materials/xlib-keysyms.txt new file mode 100644 index 0000000..d1f0c13 --- /dev/null +++ b/reference_materials/xlib-keysyms.txt @@ -0,0 +1,1801 @@ +# Mapping of X11 keysyms to ISO 10646 / Unicode +# +# The "X11 Window System Protocol" standard (Release 6.4) defines in +# Appendix A the keysym codes. These 29-bit integer values identify +# characters or functions associated with each key (e.g., via the +# visible engraving) of a keyboard layout. In addition, mnemonic macro +# names are provided for the keysyms in the C header file +# . These are compiled (by xc/lib/X11/util/ +# makekeys.c) into a hash table that can be accessed with X11 library +# functions such as XStringToKeysym() and XKeysymToString(). +# +# The creation of the keysym codes predates ISO 10646 / Unicode, but +# they represent a similar attempt to merge several existing coded +# character sets (mostly early drafts of ISO 8859, as well as some -- +# long since forgotten -- DEC font encodings). X.Org and XFree86 have +# agreed that for any future extension of the keysyms with characters +# already found in ISO 10646 / Unicode, the following algorithm will +# be used. The new keysym code position will simply be the character's +# Unicode number plus 0x01000000. The keysym codes in the range +# 0x01000100 0x0110ffff are now reserved to represent Unicode +# characters in the range U0100 to U10FFFF. (Note that the ISO 8859-1 +# characters that make up Unicode positions below U0100 are excluded +# from this rule, as they are already covered by the keysyms of the +# same value.) +# +# While most newer Unicode-based X11 clients do already accept +# Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it +# will remain necessary for clients -- in the interest of +# compatibility with existing servers -- to also understand the +# existing keysym values. Clients can use the table below to map the +# pre-Unicode keysym values (0x0100 to 0x20ff) to the corresponding +# Unicode characters for further processing. +# +# The following fields are used in this mapping table: +# +# 1 The hexadecimal X11 keysym number (as defined in Appendix A of +# the X11 protocol specification and as listed in ) +# +# 2 The corresponding Unicode position +# (U0000 means that there is no equivalent Unicode character) +# +# 3 Status of this keysym and its Unicode mapping +# +# . regular -- This is a regular well-established keysym with +# a straightforward Unicode equivalent (e.g., any keysym +# derived from ISO 8859). There can be at most one regular +# keysym associated with each Unicode character. +# +# d duplicate -- This keysym has the same Unicode mapping as +# another one with status 'regular'. It represents a case +# where keysyms distinguish between several characters that +# Unicode has unified into a single one (examples are +# several APL symbols) +# +# o obsolete -- While it may be possible to find a Unicode of +# similar name, the exact semantics of this keysym are +# unclear, because the font or character set from which it +# came has never been widely used. Examples are various +# symbols from the DEC Publishing character set, which may +# have been used in a special font shipped with the +# DECwrite product. Where no similar Unicode character +# can be identified, U0000 is used in column 2. +# +# f function -- While it may be possible to find a Unicode +# of similar name, this keysym differs semantically +# substantially from the corresponding Unicode character, +# because it describes a particular function key or will +# first have to be processed by an input method that will +# translate it into a proper stream of Unicode characters. +# +# r remove -- This is a bogus keysym that was added in error, +# is not used in any known keyboard layout, and should be +# removed from both and the standard. +# +# u unicode-remap -- This keysym was added rather recently to +# the of XFree86, but into a number range +# reserved for future extensions of the standard by +# X.Org. It is not widely used at present, but its name +# appears to be sufficiently useful and it should therefore +# be directly mapped to Unicode in the 0x1xxxxxx range in +# future versions of . This way, the macro +# name will be preserved, but the standard will not have to +# be extended. +# +# Recommendations for using the keysym status: +# +# - All keysyms with status regular, duplicate, obsolete and +# function should be listed in Appendix A of the X11 protocol +# spec. +# +# - All keysyms except for those with status remove should be +# listed in . +# +# - Keysyms with status duplicate, obsolete, and remove should +# not be used in future keyboard layouts, as there are other +# keysyms with status regular, function and unicode-remap +# that give access to the same Unicode characters. +# +# - Keysym to Unicode conversion tables in clients should include +# all mappings except those with status function and those +# with U0000. +# +# # comment marker +# +# 4 the name of the X11 keysym macro without the leading XK_, +# as defined in +# +# The last columns may be followed by comments copied from . +# A keysym may be listed several times, if there are several macro names +# associated with it in . +# +# Author: Markus Kuhn +# Date: 2004-08-08 +# +# This table evolved out of an earlier one by Richard Verhoeven, TU Eindhoven. +# +# We begin with the original keysyms found in X11R6.4 +# +0x0020 U0020 . # space +0x0021 U0021 . # exclam +0x0022 U0022 . # quotedbl +0x0023 U0023 . # numbersign +0x0024 U0024 . # dollar +0x0025 U0025 . # percent +0x0026 U0026 . # ampersand +0x0027 U0027 . # apostrophe +0x0027 U0027 . # quoteright /* deprecated */ +0x0028 U0028 . # parenleft +0x0029 U0029 . # parenright +0x002a U002a . # asterisk +0x002b U002b . # plus +0x002c U002c . # comma +0x002d U002d . # minus +0x002e U002e . # period +0x002f U002f . # slash +0x0030 U0030 . # 0 +0x0031 U0031 . # 1 +0x0032 U0032 . # 2 +0x0033 U0033 . # 3 +0x0034 U0034 . # 4 +0x0035 U0035 . # 5 +0x0036 U0036 . # 6 +0x0037 U0037 . # 7 +0x0038 U0038 . # 8 +0x0039 U0039 . # 9 +0x003a U003a . # colon +0x003b U003b . # semicolon +0x003c U003c . # less +0x003d U003d . # equal +0x003e U003e . # greater +0x003f U003f . # question +0x0040 U0040 . # at +0x0041 U0041 . # A +0x0042 U0042 . # B +0x0043 U0043 . # C +0x0044 U0044 . # D +0x0045 U0045 . # E +0x0046 U0046 . # F +0x0047 U0047 . # G +0x0048 U0048 . # H +0x0049 U0049 . # I +0x004a U004a . # J +0x004b U004b . # K +0x004c U004c . # L +0x004d U004d . # M +0x004e U004e . # N +0x004f U004f . # O +0x0050 U0050 . # P +0x0051 U0051 . # Q +0x0052 U0052 . # R +0x0053 U0053 . # S +0x0054 U0054 . # T +0x0055 U0055 . # U +0x0056 U0056 . # V +0x0057 U0057 . # W +0x0058 U0058 . # X +0x0059 U0059 . # Y +0x005a U005a . # Z +0x005b U005b . # bracketleft +0x005c U005c . # backslash +0x005d U005d . # bracketright +0x005e U005e . # asciicircum +0x005f U005f . # underscore +0x0060 U0060 . # grave +0x0060 U0060 . # quoteleft /* deprecated */ +0x0061 U0061 . # a +0x0062 U0062 . # b +0x0063 U0063 . # c +0x0064 U0064 . # d +0x0065 U0065 . # e +0x0066 U0066 . # f +0x0067 U0067 . # g +0x0068 U0068 . # h +0x0069 U0069 . # i +0x006a U006a . # j +0x006b U006b . # k +0x006c U006c . # l +0x006d U006d . # m +0x006e U006e . # n +0x006f U006f . # o +0x0070 U0070 . # p +0x0071 U0071 . # q +0x0072 U0072 . # r +0x0073 U0073 . # s +0x0074 U0074 . # t +0x0075 U0075 . # u +0x0076 U0076 . # v +0x0077 U0077 . # w +0x0078 U0078 . # x +0x0079 U0079 . # y +0x007a U007a . # z +0x007b U007b . # braceleft +0x007c U007c . # bar +0x007d U007d . # braceright +0x007e U007e . # asciitilde +0x00a0 U00a0 . # nobreakspace +0x00a1 U00a1 . # exclamdown +0x00a2 U00a2 . # cent +0x00a3 U00a3 . # sterling +0x00a4 U00a4 . # currency +0x00a5 U00a5 . # yen +0x00a6 U00a6 . # brokenbar +0x00a7 U00a7 . # section +0x00a8 U00a8 . # diaeresis +0x00a9 U00a9 . # copyright +0x00aa U00aa . # ordfeminine +0x00ab U00ab . # guillemotleft /* left angle quotation mark */ +0x00ac U00ac . # notsign +0x00ad U00ad . # hyphen +0x00ae U00ae . # registered +0x00af U00af . # macron +0x00b0 U00b0 . # degree +0x00b1 U00b1 . # plusminus +0x00b2 U00b2 . # twosuperior +0x00b3 U00b3 . # threesuperior +0x00b4 U00b4 . # acute +0x00b5 U00b5 . # mu +0x00b6 U00b6 . # paragraph +0x00b7 U00b7 . # periodcentered +0x00b8 U00b8 . # cedilla +0x00b9 U00b9 . # onesuperior +0x00ba U00ba . # masculine +0x00bb U00bb . # guillemotright /* right angle quotation mark */ +0x00bc U00bc . # onequarter +0x00bd U00bd . # onehalf +0x00be U00be . # threequarters +0x00bf U00bf . # questiondown +0x00c0 U00c0 . # Agrave +0x00c1 U00c1 . # Aacute +0x00c2 U00c2 . # Acircumflex +0x00c3 U00c3 . # Atilde +0x00c4 U00c4 . # Adiaeresis +0x00c5 U00c5 . # Aring +0x00c6 U00c6 . # AE +0x00c7 U00c7 . # Ccedilla +0x00c8 U00c8 . # Egrave +0x00c9 U00c9 . # Eacute +0x00ca U00ca . # Ecircumflex +0x00cb U00cb . # Ediaeresis +0x00cc U00cc . # Igrave +0x00cd U00cd . # Iacute +0x00ce U00ce . # Icircumflex +0x00cf U00cf . # Idiaeresis +0x00d0 U00d0 . # ETH +0x00d0 U00d0 . # Eth /* deprecated */ +0x00d1 U00d1 . # Ntilde +0x00d2 U00d2 . # Ograve +0x00d3 U00d3 . # Oacute +0x00d4 U00d4 . # Ocircumflex +0x00d5 U00d5 . # Otilde +0x00d6 U00d6 . # Odiaeresis +0x00d7 U00d7 . # multiply +0x00d8 U00d8 . # Ooblique +0x00d9 U00d9 . # Ugrave +0x00da U00da . # Uacute +0x00db U00db . # Ucircumflex +0x00dc U00dc . # Udiaeresis +0x00dd U00dd . # Yacute +0x00de U00de . # THORN +0x00de U00de . # Thorn /* deprecated */ +0x00df U00df . # ssharp +0x00e0 U00e0 . # agrave +0x00e1 U00e1 . # aacute +0x00e2 U00e2 . # acircumflex +0x00e3 U00e3 . # atilde +0x00e4 U00e4 . # adiaeresis +0x00e5 U00e5 . # aring +0x00e6 U00e6 . # ae +0x00e7 U00e7 . # ccedilla +0x00e8 U00e8 . # egrave +0x00e9 U00e9 . # eacute +0x00ea U00ea . # ecircumflex +0x00eb U00eb . # ediaeresis +0x00ec U00ec . # igrave +0x00ed U00ed . # iacute +0x00ee U00ee . # icircumflex +0x00ef U00ef . # idiaeresis +0x00f0 U00f0 . # eth +0x00f1 U00f1 . # ntilde +0x00f2 U00f2 . # ograve +0x00f3 U00f3 . # oacute +0x00f4 U00f4 . # ocircumflex +0x00f5 U00f5 . # otilde +0x00f6 U00f6 . # odiaeresis +0x00f7 U00f7 . # division +0x00f8 U00f8 . # oslash +0x00f9 U00f9 . # ugrave +0x00fa U00fa . # uacute +0x00fb U00fb . # ucircumflex +0x00fc U00fc . # udiaeresis +0x00fd U00fd . # yacute +0x00fe U00fe . # thorn +0x00ff U00ff . # ydiaeresis +0x01a1 U0104 . # Aogonek +0x01a2 U02d8 . # breve +0x01a3 U0141 . # Lstroke +0x01a5 U013d . # Lcaron +0x01a6 U015a . # Sacute +0x01a9 U0160 . # Scaron +0x01aa U015e . # Scedilla +0x01ab U0164 . # Tcaron +0x01ac U0179 . # Zacute +0x01ae U017d . # Zcaron +0x01af U017b . # Zabovedot +0x01b1 U0105 . # aogonek +0x01b2 U02db . # ogonek +0x01b3 U0142 . # lstroke +0x01b5 U013e . # lcaron +0x01b6 U015b . # sacute +0x01b7 U02c7 . # caron +0x01b9 U0161 . # scaron +0x01ba U015f . # scedilla +0x01bb U0165 . # tcaron +0x01bc U017a . # zacute +0x01bd U02dd . # doubleacute +0x01be U017e . # zcaron +0x01bf U017c . # zabovedot +0x01c0 U0154 . # Racute +0x01c3 U0102 . # Abreve +0x01c5 U0139 . # Lacute +0x01c6 U0106 . # Cacute +0x01c8 U010c . # Ccaron +0x01ca U0118 . # Eogonek +0x01cc U011a . # Ecaron +0x01cf U010e . # Dcaron +0x01d0 U0110 . # Dstroke +0x01d1 U0143 . # Nacute +0x01d2 U0147 . # Ncaron +0x01d5 U0150 . # Odoubleacute +0x01d8 U0158 . # Rcaron +0x01d9 U016e . # Uring +0x01db U0170 . # Udoubleacute +0x01de U0162 . # Tcedilla +0x01e0 U0155 . # racute +0x01e3 U0103 . # abreve +0x01e5 U013a . # lacute +0x01e6 U0107 . # cacute +0x01e8 U010d . # ccaron +0x01ea U0119 . # eogonek +0x01ec U011b . # ecaron +0x01ef U010f . # dcaron +0x01f0 U0111 . # dstroke +0x01f1 U0144 . # nacute +0x01f2 U0148 . # ncaron +0x01f5 U0151 . # odoubleacute +0x01f8 U0159 . # rcaron +0x01f9 U016f . # uring +0x01fb U0171 . # udoubleacute +0x01fe U0163 . # tcedilla +0x01ff U02d9 . # abovedot +0x02a1 U0126 . # Hstroke +0x02a6 U0124 . # Hcircumflex +0x02a9 U0130 . # Iabovedot +0x02ab U011e . # Gbreve +0x02ac U0134 . # Jcircumflex +0x02b1 U0127 . # hstroke +0x02b6 U0125 . # hcircumflex +0x02b9 U0131 . # idotless +0x02bb U011f . # gbreve +0x02bc U0135 . # jcircumflex +0x02c5 U010a . # Cabovedot +0x02c6 U0108 . # Ccircumflex +0x02d5 U0120 . # Gabovedot +0x02d8 U011c . # Gcircumflex +0x02dd U016c . # Ubreve +0x02de U015c . # Scircumflex +0x02e5 U010b . # cabovedot +0x02e6 U0109 . # ccircumflex +0x02f5 U0121 . # gabovedot +0x02f8 U011d . # gcircumflex +0x02fd U016d . # ubreve +0x02fe U015d . # scircumflex +0x03a2 U0138 . # kra +0x03a3 U0156 . # Rcedilla +0x03a5 U0128 . # Itilde +0x03a6 U013b . # Lcedilla +0x03aa U0112 . # Emacron +0x03ab U0122 . # Gcedilla +0x03ac U0166 . # Tslash +0x03b3 U0157 . # rcedilla +0x03b5 U0129 . # itilde +0x03b6 U013c . # lcedilla +0x03ba U0113 . # emacron +0x03bb U0123 . # gcedilla +0x03bc U0167 . # tslash +0x03bd U014a . # ENG +0x03bf U014b . # eng +0x03c0 U0100 . # Amacron +0x03c7 U012e . # Iogonek +0x03cc U0116 . # Eabovedot +0x03cf U012a . # Imacron +0x03d1 U0145 . # Ncedilla +0x03d2 U014c . # Omacron +0x03d3 U0136 . # Kcedilla +0x03d9 U0172 . # Uogonek +0x03dd U0168 . # Utilde +0x03de U016a . # Umacron +0x03e0 U0101 . # amacron +0x03e7 U012f . # iogonek +0x03ec U0117 . # eabovedot +0x03ef U012b . # imacron +0x03f1 U0146 . # ncedilla +0x03f2 U014d . # omacron +0x03f3 U0137 . # kcedilla +0x03f9 U0173 . # uogonek +0x03fd U0169 . # utilde +0x03fe U016b . # umacron +0x047e U203e . # overline +0x04a1 U3002 . # kana_fullstop +0x04a2 U300c . # kana_openingbracket +0x04a3 U300d . # kana_closingbracket +0x04a4 U3001 . # kana_comma +0x04a5 U30fb . # kana_conjunctive +0x04a6 U30f2 . # kana_WO +0x04a7 U30a1 . # kana_a +0x04a8 U30a3 . # kana_i +0x04a9 U30a5 . # kana_u +0x04aa U30a7 . # kana_e +0x04ab U30a9 . # kana_o +0x04ac U30e3 . # kana_ya +0x04ad U30e5 . # kana_yu +0x04ae U30e7 . # kana_yo +0x04af U30c3 . # kana_tsu +0x04b0 U30fc . # prolongedsound +0x04b1 U30a2 . # kana_A +0x04b2 U30a4 . # kana_I +0x04b3 U30a6 . # kana_U +0x04b4 U30a8 . # kana_E +0x04b5 U30aa . # kana_O +0x04b6 U30ab . # kana_KA +0x04b7 U30ad . # kana_KI +0x04b8 U30af . # kana_KU +0x04b9 U30b1 . # kana_KE +0x04ba U30b3 . # kana_KO +0x04bb U30b5 . # kana_SA +0x04bc U30b7 . # kana_SHI +0x04bd U30b9 . # kana_SU +0x04be U30bb . # kana_SE +0x04bf U30bd . # kana_SO +0x04c0 U30bf . # kana_TA +0x04c1 U30c1 . # kana_CHI +0x04c2 U30c4 . # kana_TSU +0x04c3 U30c6 . # kana_TE +0x04c4 U30c8 . # kana_TO +0x04c5 U30ca . # kana_NA +0x04c6 U30cb . # kana_NI +0x04c7 U30cc . # kana_NU +0x04c8 U30cd . # kana_NE +0x04c9 U30ce . # kana_NO +0x04ca U30cf . # kana_HA +0x04cb U30d2 . # kana_HI +0x04cc U30d5 . # kana_FU +0x04cd U30d8 . # kana_HE +0x04ce U30db . # kana_HO +0x04cf U30de . # kana_MA +0x04d0 U30df . # kana_MI +0x04d1 U30e0 . # kana_MU +0x04d2 U30e1 . # kana_ME +0x04d3 U30e2 . # kana_MO +0x04d4 U30e4 . # kana_YA +0x04d5 U30e6 . # kana_YU +0x04d6 U30e8 . # kana_YO +0x04d7 U30e9 . # kana_RA +0x04d8 U30ea . # kana_RI +0x04d9 U30eb . # kana_RU +0x04da U30ec . # kana_RE +0x04db U30ed . # kana_RO +0x04dc U30ef . # kana_WA +0x04dd U30f3 . # kana_N +0x04de U309b . # voicedsound +0x04df U309c . # semivoicedsound +0x05ac U060c . # Arabic_comma +0x05bb U061b . # Arabic_semicolon +0x05bf U061f . # Arabic_question_mark +0x05c1 U0621 . # Arabic_hamza +0x05c2 U0622 . # Arabic_maddaonalef +0x05c3 U0623 . # Arabic_hamzaonalef +0x05c4 U0624 . # Arabic_hamzaonwaw +0x05c5 U0625 . # Arabic_hamzaunderalef +0x05c6 U0626 . # Arabic_hamzaonyeh +0x05c7 U0627 . # Arabic_alef +0x05c8 U0628 . # Arabic_beh +0x05c9 U0629 . # Arabic_tehmarbuta +0x05ca U062a . # Arabic_teh +0x05cb U062b . # Arabic_theh +0x05cc U062c . # Arabic_jeem +0x05cd U062d . # Arabic_hah +0x05ce U062e . # Arabic_khah +0x05cf U062f . # Arabic_dal +0x05d0 U0630 . # Arabic_thal +0x05d1 U0631 . # Arabic_ra +0x05d2 U0632 . # Arabic_zain +0x05d3 U0633 . # Arabic_seen +0x05d4 U0634 . # Arabic_sheen +0x05d5 U0635 . # Arabic_sad +0x05d6 U0636 . # Arabic_dad +0x05d7 U0637 . # Arabic_tah +0x05d8 U0638 . # Arabic_zah +0x05d9 U0639 . # Arabic_ain +0x05da U063a . # Arabic_ghain +0x05e0 U0640 . # Arabic_tatweel +0x05e1 U0641 . # Arabic_feh +0x05e2 U0642 . # Arabic_qaf +0x05e3 U0643 . # Arabic_kaf +0x05e4 U0644 . # Arabic_lam +0x05e5 U0645 . # Arabic_meem +0x05e6 U0646 . # Arabic_noon +0x05e7 U0647 . # Arabic_ha +0x05e8 U0648 . # Arabic_waw +0x05e9 U0649 . # Arabic_alefmaksura +0x05ea U064a . # Arabic_yeh +0x05eb U064b . # Arabic_fathatan +0x05ec U064c . # Arabic_dammatan +0x05ed U064d . # Arabic_kasratan +0x05ee U064e . # Arabic_fatha +0x05ef U064f . # Arabic_damma +0x05f0 U0650 . # Arabic_kasra +0x05f1 U0651 . # Arabic_shadda +0x05f2 U0652 . # Arabic_sukun +0x06a1 U0452 . # Serbian_dje +0x06a2 U0453 . # Macedonia_gje +0x06a3 U0451 . # Cyrillic_io +0x06a4 U0454 . # Ukrainian_ie +0x06a5 U0455 . # Macedonia_dse +0x06a6 U0456 . # Ukrainian_i +0x06a7 U0457 . # Ukrainian_yi +0x06a8 U0458 . # Cyrillic_je +0x06a9 U0459 . # Cyrillic_lje +0x06aa U045a . # Cyrillic_nje +0x06ab U045b . # Serbian_tshe +0x06ac U045c . # Macedonia_kje +0x06ae U045e . # Byelorussian_shortu +0x06af U045f . # Cyrillic_dzhe +0x06b0 U2116 . # numerosign +0x06b1 U0402 . # Serbian_DJE +0x06b2 U0403 . # Macedonia_GJE +0x06b3 U0401 . # Cyrillic_IO +0x06b4 U0404 . # Ukrainian_IE +0x06b5 U0405 . # Macedonia_DSE +0x06b6 U0406 . # Ukrainian_I +0x06b7 U0407 . # Ukrainian_YI +0x06b8 U0408 . # Cyrillic_JE +0x06b9 U0409 . # Cyrillic_LJE +0x06ba U040a . # Cyrillic_NJE +0x06bb U040b . # Serbian_TSHE +0x06bc U040c . # Macedonia_KJE +0x06be U040e . # Byelorussian_SHORTU +0x06bf U040f . # Cyrillic_DZHE +0x06c0 U044e . # Cyrillic_yu +0x06c1 U0430 . # Cyrillic_a +0x06c2 U0431 . # Cyrillic_be +0x06c3 U0446 . # Cyrillic_tse +0x06c4 U0434 . # Cyrillic_de +0x06c5 U0435 . # Cyrillic_ie +0x06c6 U0444 . # Cyrillic_ef +0x06c7 U0433 . # Cyrillic_ghe +0x06c8 U0445 . # Cyrillic_ha +0x06c9 U0438 . # Cyrillic_i +0x06ca U0439 . # Cyrillic_shorti +0x06cb U043a . # Cyrillic_ka +0x06cc U043b . # Cyrillic_el +0x06cd U043c . # Cyrillic_em +0x06ce U043d . # Cyrillic_en +0x06cf U043e . # Cyrillic_o +0x06d0 U043f . # Cyrillic_pe +0x06d1 U044f . # Cyrillic_ya +0x06d2 U0440 . # Cyrillic_er +0x06d3 U0441 . # Cyrillic_es +0x06d4 U0442 . # Cyrillic_te +0x06d5 U0443 . # Cyrillic_u +0x06d6 U0436 . # Cyrillic_zhe +0x06d7 U0432 . # Cyrillic_ve +0x06d8 U044c . # Cyrillic_softsign +0x06d9 U044b . # Cyrillic_yeru +0x06da U0437 . # Cyrillic_ze +0x06db U0448 . # Cyrillic_sha +0x06dc U044d . # Cyrillic_e +0x06dd U0449 . # Cyrillic_shcha +0x06de U0447 . # Cyrillic_che +0x06df U044a . # Cyrillic_hardsign +0x06e0 U042e . # Cyrillic_YU +0x06e1 U0410 . # Cyrillic_A +0x06e2 U0411 . # Cyrillic_BE +0x06e3 U0426 . # Cyrillic_TSE +0x06e4 U0414 . # Cyrillic_DE +0x06e5 U0415 . # Cyrillic_IE +0x06e6 U0424 . # Cyrillic_EF +0x06e7 U0413 . # Cyrillic_GHE +0x06e8 U0425 . # Cyrillic_HA +0x06e9 U0418 . # Cyrillic_I +0x06ea U0419 . # Cyrillic_SHORTI +0x06eb U041a . # Cyrillic_KA +0x06ec U041b . # Cyrillic_EL +0x06ed U041c . # Cyrillic_EM +0x06ee U041d . # Cyrillic_EN +0x06ef U041e . # Cyrillic_O +0x06f0 U041f . # Cyrillic_PE +0x06f1 U042f . # Cyrillic_YA +0x06f2 U0420 . # Cyrillic_ER +0x06f3 U0421 . # Cyrillic_ES +0x06f4 U0422 . # Cyrillic_TE +0x06f5 U0423 . # Cyrillic_U +0x06f6 U0416 . # Cyrillic_ZHE +0x06f7 U0412 . # Cyrillic_VE +0x06f8 U042c . # Cyrillic_SOFTSIGN +0x06f9 U042b . # Cyrillic_YERU +0x06fa U0417 . # Cyrillic_ZE +0x06fb U0428 . # Cyrillic_SHA +0x06fc U042d . # Cyrillic_E +0x06fd U0429 . # Cyrillic_SHCHA +0x06fe U0427 . # Cyrillic_CHE +0x06ff U042a . # Cyrillic_HARDSIGN +0x07a1 U0386 . # Greek_ALPHAaccent +0x07a2 U0388 . # Greek_EPSILONaccent +0x07a3 U0389 . # Greek_ETAaccent +0x07a4 U038a . # Greek_IOTAaccent +0x07a5 U03aa . # Greek_IOTAdiaeresis +0x07a7 U038c . # Greek_OMICRONaccent +0x07a8 U038e . # Greek_UPSILONaccent +0x07a9 U03ab . # Greek_UPSILONdieresis +0x07ab U038f . # Greek_OMEGAaccent +0x07ae U0385 . # Greek_accentdieresis +0x07af U2015 . # Greek_horizbar +0x07b1 U03ac . # Greek_alphaaccent +0x07b2 U03ad . # Greek_epsilonaccent +0x07b3 U03ae . # Greek_etaaccent +0x07b4 U03af . # Greek_iotaaccent +0x07b5 U03ca . # Greek_iotadieresis +0x07b6 U0390 . # Greek_iotaaccentdieresis +0x07b7 U03cc . # Greek_omicronaccent +0x07b8 U03cd . # Greek_upsilonaccent +0x07b9 U03cb . # Greek_upsilondieresis +0x07ba U03b0 . # Greek_upsilonaccentdieresis +0x07bb U03ce . # Greek_omegaaccent +0x07c1 U0391 . # Greek_ALPHA +0x07c2 U0392 . # Greek_BETA +0x07c3 U0393 . # Greek_GAMMA +0x07c4 U0394 . # Greek_DELTA +0x07c5 U0395 . # Greek_EPSILON +0x07c6 U0396 . # Greek_ZETA +0x07c7 U0397 . # Greek_ETA +0x07c8 U0398 . # Greek_THETA +0x07c9 U0399 . # Greek_IOTA +0x07ca U039a . # Greek_KAPPA +0x07cb U039b . # Greek_LAMBDA +0x07cb U039b . # Greek_LAMDA +0x07cc U039c . # Greek_MU +0x07cd U039d . # Greek_NU +0x07ce U039e . # Greek_XI +0x07cf U039f . # Greek_OMICRON +0x07d0 U03a0 . # Greek_PI +0x07d1 U03a1 . # Greek_RHO +0x07d2 U03a3 . # Greek_SIGMA +0x07d4 U03a4 . # Greek_TAU +0x07d5 U03a5 . # Greek_UPSILON +0x07d6 U03a6 . # Greek_PHI +0x07d7 U03a7 . # Greek_CHI +0x07d8 U03a8 . # Greek_PSI +0x07d9 U03a9 . # Greek_OMEGA +0x07e1 U03b1 . # Greek_alpha +0x07e2 U03b2 . # Greek_beta +0x07e3 U03b3 . # Greek_gamma +0x07e4 U03b4 . # Greek_delta +0x07e5 U03b5 . # Greek_epsilon +0x07e6 U03b6 . # Greek_zeta +0x07e7 U03b7 . # Greek_eta +0x07e8 U03b8 . # Greek_theta +0x07e9 U03b9 . # Greek_iota +0x07ea U03ba . # Greek_kappa +0x07eb U03bb . # Greek_lambda +0x07ec U03bc . # Greek_mu +0x07ed U03bd . # Greek_nu +0x07ee U03be . # Greek_xi +0x07ef U03bf . # Greek_omicron +0x07f0 U03c0 . # Greek_pi +0x07f1 U03c1 . # Greek_rho +0x07f2 U03c3 . # Greek_sigma +0x07f3 U03c2 . # Greek_finalsmallsigma +0x07f4 U03c4 . # Greek_tau +0x07f5 U03c5 . # Greek_upsilon +0x07f6 U03c6 . # Greek_phi +0x07f7 U03c7 . # Greek_chi +0x07f8 U03c8 . # Greek_psi +0x07f9 U03c9 . # Greek_omega +0x08a1 U23b7 . # leftradical +0x08a2 U250c d # topleftradical +0x08a3 U2500 d # horizconnector +0x08a4 U2320 . # topintegral +0x08a5 U2321 . # botintegral +0x08a6 U2502 d # vertconnector +0x08a7 U23a1 . # topleftsqbracket +0x08a8 U23a3 . # botleftsqbracket +0x08a9 U23a4 . # toprightsqbracket +0x08aa U23a6 . # botrightsqbracket +0x08ab U239b . # topleftparens +0x08ac U239d . # botleftparens +0x08ad U239e . # toprightparens +0x08ae U23a0 . # botrightparens +0x08af U23a8 . # leftmiddlecurlybrace +0x08b0 U23ac . # rightmiddlecurlybrace +0x08b1 U0000 o # topleftsummation +0x08b2 U0000 o # botleftsummation +0x08b3 U0000 o # topvertsummationconnector +0x08b4 U0000 o # botvertsummationconnector +0x08b5 U0000 o # toprightsummation +0x08b6 U0000 o # botrightsummation +0x08b7 U0000 o # rightmiddlesummation +0x08bc U2264 . # lessthanequal +0x08bd U2260 . # notequal +0x08be U2265 . # greaterthanequal +0x08bf U222b . # integral +0x08c0 U2234 . # therefore +0x08c1 U221d . # variation +0x08c2 U221e . # infinity +0x08c5 U2207 . # nabla +0x08c8 U223c . # approximate +0x08c9 U2243 . # similarequal +0x08cd U21d4 . # ifonlyif +0x08ce U21d2 . # implies +0x08cf U2261 . # identical +0x08d6 U221a . # radical +0x08da U2282 . # includedin +0x08db U2283 . # includes +0x08dc U2229 . # intersection +0x08dd U222a . # union +0x08de U2227 . # logicaland +0x08df U2228 . # logicalor +0x08ef U2202 . # partialderivative +0x08f6 U0192 . # function +0x08fb U2190 . # leftarrow +0x08fc U2191 . # uparrow +0x08fd U2192 . # rightarrow +0x08fe U2193 . # downarrow +0x09df U0000 o # blank +0x09e0 U25c6 . # soliddiamond +0x09e1 U2592 . # checkerboard +0x09e2 U2409 . # ht +0x09e3 U240c . # ff +0x09e4 U240d . # cr +0x09e5 U240a . # lf +0x09e8 U2424 . # nl +0x09e9 U240b . # vt +0x09ea U2518 . # lowrightcorner +0x09eb U2510 . # uprightcorner +0x09ec U250c . # upleftcorner +0x09ed U2514 . # lowleftcorner +0x09ee U253c . # crossinglines +0x09ef U23ba . # horizlinescan1 +0x09f0 U23bb . # horizlinescan3 +0x09f1 U2500 . # horizlinescan5 +0x09f2 U23bc . # horizlinescan7 +0x09f3 U23bd . # horizlinescan9 +0x09f4 U251c . # leftt +0x09f5 U2524 . # rightt +0x09f6 U2534 . # bott +0x09f7 U252c . # topt +0x09f8 U2502 . # vertbar +0x0aa1 U2003 . # emspace +0x0aa2 U2002 . # enspace +0x0aa3 U2004 . # em3space +0x0aa4 U2005 . # em4space +0x0aa5 U2007 . # digitspace +0x0aa6 U2008 . # punctspace +0x0aa7 U2009 . # thinspace +0x0aa8 U200a . # hairspace +0x0aa9 U2014 . # emdash +0x0aaa U2013 . # endash +0x0aac U2423 o # signifblank +0x0aae U2026 . # ellipsis +0x0aaf U2025 . # doubbaselinedot +0x0ab0 U2153 . # onethird +0x0ab1 U2154 . # twothirds +0x0ab2 U2155 . # onefifth +0x0ab3 U2156 . # twofifths +0x0ab4 U2157 . # threefifths +0x0ab5 U2158 . # fourfifths +0x0ab6 U2159 . # onesixth +0x0ab7 U215a . # fivesixths +0x0ab8 U2105 . # careof +0x0abb U2012 . # figdash +0x0abc U27e8 o # leftanglebracket +0x0abd U002e o # decimalpoint +0x0abe U27e9 o # rightanglebracket +0x0abf U0000 o # marker +0x0ac3 U215b . # oneeighth +0x0ac4 U215c . # threeeighths +0x0ac5 U215d . # fiveeighths +0x0ac6 U215e . # seveneighths +0x0ac9 U2122 . # trademark +0x0aca U2613 o # signaturemark +0x0acb U0000 o # trademarkincircle +0x0acc U25c1 o # leftopentriangle +0x0acd U25b7 o # rightopentriangle +0x0ace U25cb o # emopencircle +0x0acf U25af o # emopenrectangle +0x0ad0 U2018 . # leftsinglequotemark +0x0ad1 U2019 . # rightsinglequotemark +0x0ad2 U201c . # leftdoublequotemark +0x0ad3 U201d . # rightdoublequotemark +0x0ad4 U211e . # prescription +0x0ad6 U2032 . # minutes +0x0ad7 U2033 . # seconds +0x0ad9 U271d . # latincross +0x0ada U0000 o # hexagram +0x0adb U25ac o # filledrectbullet +0x0adc U25c0 o # filledlefttribullet +0x0add U25b6 o # filledrighttribullet +0x0ade U25cf o # emfilledcircle +0x0adf U25ae o # emfilledrect +0x0ae0 U25e6 o # enopencircbullet +0x0ae1 U25ab o # enopensquarebullet +0x0ae2 U25ad o # openrectbullet +0x0ae3 U25b3 o # opentribulletup +0x0ae4 U25bd o # opentribulletdown +0x0ae5 U2606 o # openstar +0x0ae6 U2022 o # enfilledcircbullet +0x0ae7 U25aa o # enfilledsqbullet +0x0ae8 U25b2 o # filledtribulletup +0x0ae9 U25bc o # filledtribulletdown +0x0aea U261c o # leftpointer +0x0aeb U261e o # rightpointer +0x0aec U2663 . # club +0x0aed U2666 . # diamond +0x0aee U2665 . # heart +0x0af0 U2720 . # maltesecross +0x0af1 U2020 . # dagger +0x0af2 U2021 . # doubledagger +0x0af3 U2713 . # checkmark +0x0af4 U2717 . # ballotcross +0x0af5 U266f . # musicalsharp +0x0af6 U266d . # musicalflat +0x0af7 U2642 . # malesymbol +0x0af8 U2640 . # femalesymbol +0x0af9 U260e . # telephone +0x0afa U2315 . # telephonerecorder +0x0afb U2117 . # phonographcopyright +0x0afc U2038 . # caret +0x0afd U201a . # singlelowquotemark +0x0afe U201e . # doublelowquotemark +0x0aff U0000 o # cursor +0x0ba3 U003c d # leftcaret +0x0ba6 U003e d # rightcaret +0x0ba8 U2228 d # downcaret +0x0ba9 U2227 d # upcaret +0x0bc0 U00af d # overbar +0x0bc2 U22a5 . # downtack +0x0bc3 U2229 d # upshoe +0x0bc4 U230a . # downstile +0x0bc6 U005f d # underbar +0x0bca U2218 . # jot +0x0bcc U2395 . # quad +0x0bce U22a4 . # uptack +0x0bcf U25cb . # circle +0x0bd3 U2308 . # upstile +0x0bd6 U222a d # downshoe +0x0bd8 U2283 d # rightshoe +0x0bda U2282 d # leftshoe +0x0bdc U22a2 . # lefttack +0x0bfc U22a3 . # righttack +0x0cdf U2017 . # hebrew_doublelowline +0x0ce0 U05d0 . # hebrew_aleph +0x0ce1 U05d1 . # hebrew_bet +0x0ce1 U05d1 . # hebrew_beth /* deprecated */ +0x0ce2 U05d2 . # hebrew_gimel +0x0ce2 U05d2 . # hebrew_gimmel /* deprecated */ +0x0ce3 U05d3 . # hebrew_dalet +0x0ce3 U05d3 . # hebrew_daleth /* deprecated */ +0x0ce4 U05d4 . # hebrew_he +0x0ce5 U05d5 . # hebrew_waw +0x0ce6 U05d6 . # hebrew_zain +0x0ce6 U05d6 . # hebrew_zayin /* deprecated */ +0x0ce7 U05d7 . # hebrew_chet +0x0ce7 U05d7 . # hebrew_het /* deprecated */ +0x0ce8 U05d8 . # hebrew_tet +0x0ce8 U05d8 . # hebrew_teth /* deprecated */ +0x0ce9 U05d9 . # hebrew_yod +0x0cea U05da . # hebrew_finalkaph +0x0ceb U05db . # hebrew_kaph +0x0cec U05dc . # hebrew_lamed +0x0ced U05dd . # hebrew_finalmem +0x0cee U05de . # hebrew_mem +0x0cef U05df . # hebrew_finalnun +0x0cf0 U05e0 . # hebrew_nun +0x0cf1 U05e1 . # hebrew_samech +0x0cf1 U05e1 . # hebrew_samekh /* deprecated */ +0x0cf2 U05e2 . # hebrew_ayin +0x0cf3 U05e3 . # hebrew_finalpe +0x0cf4 U05e4 . # hebrew_pe +0x0cf5 U05e5 . # hebrew_finalzade +0x0cf5 U05e5 . # hebrew_finalzadi /* deprecated */ +0x0cf6 U05e6 . # hebrew_zade +0x0cf6 U05e6 . # hebrew_zadi /* deprecated */ +0x0cf7 U05e7 . # hebrew_kuf /* deprecated */ +0x0cf7 U05e7 . # hebrew_qoph +0x0cf8 U05e8 . # hebrew_resh +0x0cf9 U05e9 . # hebrew_shin +0x0cfa U05ea . # hebrew_taf /* deprecated */ +0x0cfa U05ea . # hebrew_taw +0x0da1 U0e01 . # Thai_kokai +0x0da2 U0e02 . # Thai_khokhai +0x0da3 U0e03 . # Thai_khokhuat +0x0da4 U0e04 . # Thai_khokhwai +0x0da5 U0e05 . # Thai_khokhon +0x0da6 U0e06 . # Thai_khorakhang +0x0da7 U0e07 . # Thai_ngongu +0x0da8 U0e08 . # Thai_chochan +0x0da9 U0e09 . # Thai_choching +0x0daa U0e0a . # Thai_chochang +0x0dab U0e0b . # Thai_soso +0x0dac U0e0c . # Thai_chochoe +0x0dad U0e0d . # Thai_yoying +0x0dae U0e0e . # Thai_dochada +0x0daf U0e0f . # Thai_topatak +0x0db0 U0e10 . # Thai_thothan +0x0db1 U0e11 . # Thai_thonangmontho +0x0db2 U0e12 . # Thai_thophuthao +0x0db3 U0e13 . # Thai_nonen +0x0db4 U0e14 . # Thai_dodek +0x0db5 U0e15 . # Thai_totao +0x0db6 U0e16 . # Thai_thothung +0x0db7 U0e17 . # Thai_thothahan +0x0db8 U0e18 . # Thai_thothong +0x0db9 U0e19 . # Thai_nonu +0x0dba U0e1a . # Thai_bobaimai +0x0dbb U0e1b . # Thai_popla +0x0dbc U0e1c . # Thai_phophung +0x0dbd U0e1d . # Thai_fofa +0x0dbe U0e1e . # Thai_phophan +0x0dbf U0e1f . # Thai_fofan +0x0dc0 U0e20 . # Thai_phosamphao +0x0dc1 U0e21 . # Thai_moma +0x0dc2 U0e22 . # Thai_yoyak +0x0dc3 U0e23 . # Thai_rorua +0x0dc4 U0e24 . # Thai_ru +0x0dc5 U0e25 . # Thai_loling +0x0dc6 U0e26 . # Thai_lu +0x0dc7 U0e27 . # Thai_wowaen +0x0dc8 U0e28 . # Thai_sosala +0x0dc9 U0e29 . # Thai_sorusi +0x0dca U0e2a . # Thai_sosua +0x0dcb U0e2b . # Thai_hohip +0x0dcc U0e2c . # Thai_lochula +0x0dcd U0e2d . # Thai_oang +0x0dce U0e2e . # Thai_honokhuk +0x0dcf U0e2f . # Thai_paiyannoi +0x0dd0 U0e30 . # Thai_saraa +0x0dd1 U0e31 . # Thai_maihanakat +0x0dd2 U0e32 . # Thai_saraaa +0x0dd3 U0e33 . # Thai_saraam +0x0dd4 U0e34 . # Thai_sarai +0x0dd5 U0e35 . # Thai_saraii +0x0dd6 U0e36 . # Thai_saraue +0x0dd7 U0e37 . # Thai_sarauee +0x0dd8 U0e38 . # Thai_sarau +0x0dd9 U0e39 . # Thai_sarauu +0x0dda U0e3a . # Thai_phinthu +0x0dde U0000 o # Thai_maihanakat_maitho +0x0ddf U0e3f . # Thai_baht +0x0de0 U0e40 . # Thai_sarae +0x0de1 U0e41 . # Thai_saraae +0x0de2 U0e42 . # Thai_sarao +0x0de3 U0e43 . # Thai_saraaimaimuan +0x0de4 U0e44 . # Thai_saraaimaimalai +0x0de5 U0e45 . # Thai_lakkhangyao +0x0de6 U0e46 . # Thai_maiyamok +0x0de7 U0e47 . # Thai_maitaikhu +0x0de8 U0e48 . # Thai_maiek +0x0de9 U0e49 . # Thai_maitho +0x0dea U0e4a . # Thai_maitri +0x0deb U0e4b . # Thai_maichattawa +0x0dec U0e4c . # Thai_thanthakhat +0x0ded U0e4d . # Thai_nikhahit +0x0df0 U0e50 . # Thai_leksun +0x0df1 U0e51 . # Thai_leknung +0x0df2 U0e52 . # Thai_leksong +0x0df3 U0e53 . # Thai_leksam +0x0df4 U0e54 . # Thai_leksi +0x0df5 U0e55 . # Thai_lekha +0x0df6 U0e56 . # Thai_lekhok +0x0df7 U0e57 . # Thai_lekchet +0x0df8 U0e58 . # Thai_lekpaet +0x0df9 U0e59 . # Thai_lekkao +0x0ea1 U3131 f # Hangul_Kiyeog +0x0ea2 U3132 f # Hangul_SsangKiyeog +0x0ea3 U3133 f # Hangul_KiyeogSios +0x0ea4 U3134 f # Hangul_Nieun +0x0ea5 U3135 f # Hangul_NieunJieuj +0x0ea6 U3136 f # Hangul_NieunHieuh +0x0ea7 U3137 f # Hangul_Dikeud +0x0ea8 U3138 f # Hangul_SsangDikeud +0x0ea9 U3139 f # Hangul_Rieul +0x0eaa U313a f # Hangul_RieulKiyeog +0x0eab U313b f # Hangul_RieulMieum +0x0eac U313c f # Hangul_RieulPieub +0x0ead U313d f # Hangul_RieulSios +0x0eae U313e f # Hangul_RieulTieut +0x0eaf U313f f # Hangul_RieulPhieuf +0x0eb0 U3140 f # Hangul_RieulHieuh +0x0eb1 U3141 f # Hangul_Mieum +0x0eb2 U3142 f # Hangul_Pieub +0x0eb3 U3143 f # Hangul_SsangPieub +0x0eb4 U3144 f # Hangul_PieubSios +0x0eb5 U3145 f # Hangul_Sios +0x0eb6 U3146 f # Hangul_SsangSios +0x0eb7 U3147 f # Hangul_Ieung +0x0eb8 U3148 f # Hangul_Jieuj +0x0eb9 U3149 f # Hangul_SsangJieuj +0x0eba U314a f # Hangul_Cieuc +0x0ebb U314b f # Hangul_Khieuq +0x0ebc U314c f # Hangul_Tieut +0x0ebd U314d f # Hangul_Phieuf +0x0ebe U314e f # Hangul_Hieuh +0x0ebf U314f f # Hangul_A +0x0ec0 U3150 f # Hangul_AE +0x0ec1 U3151 f # Hangul_YA +0x0ec2 U3152 f # Hangul_YAE +0x0ec3 U3153 f # Hangul_EO +0x0ec4 U3154 f # Hangul_E +0x0ec5 U3155 f # Hangul_YEO +0x0ec6 U3156 f # Hangul_YE +0x0ec7 U3157 f # Hangul_O +0x0ec8 U3158 f # Hangul_WA +0x0ec9 U3159 f # Hangul_WAE +0x0eca U315a f # Hangul_OE +0x0ecb U315b f # Hangul_YO +0x0ecc U315c f # Hangul_U +0x0ecd U315d f # Hangul_WEO +0x0ece U315e f # Hangul_WE +0x0ecf U315f f # Hangul_WI +0x0ed0 U3160 f # Hangul_YU +0x0ed1 U3161 f # Hangul_EU +0x0ed2 U3162 f # Hangul_YI +0x0ed3 U3163 f # Hangul_I +0x0ed4 U11a8 f # Hangul_J_Kiyeog +0x0ed5 U11a9 f # Hangul_J_SsangKiyeog +0x0ed6 U11aa f # Hangul_J_KiyeogSios +0x0ed7 U11ab f # Hangul_J_Nieun +0x0ed8 U11ac f # Hangul_J_NieunJieuj +0x0ed9 U11ad f # Hangul_J_NieunHieuh +0x0eda U11ae f # Hangul_J_Dikeud +0x0edb U11af f # Hangul_J_Rieul +0x0edc U11b0 f # Hangul_J_RieulKiyeog +0x0edd U11b1 f # Hangul_J_RieulMieum +0x0ede U11b2 f # Hangul_J_RieulPieub +0x0edf U11b3 f # Hangul_J_RieulSios +0x0ee0 U11b4 f # Hangul_J_RieulTieut +0x0ee1 U11b5 f # Hangul_J_RieulPhieuf +0x0ee2 U11b6 f # Hangul_J_RieulHieuh +0x0ee3 U11b7 f # Hangul_J_Mieum +0x0ee4 U11b8 f # Hangul_J_Pieub +0x0ee5 U11b9 f # Hangul_J_PieubSios +0x0ee6 U11ba f # Hangul_J_Sios +0x0ee7 U11bb f # Hangul_J_SsangSios +0x0ee8 U11bc f # Hangul_J_Ieung +0x0ee9 U11bd f # Hangul_J_Jieuj +0x0eea U11be f # Hangul_J_Cieuc +0x0eeb U11bf f # Hangul_J_Khieuq +0x0eec U11c0 f # Hangul_J_Tieut +0x0eed U11c1 f # Hangul_J_Phieuf +0x0eee U11c2 f # Hangul_J_Hieuh +0x0eef U316d f # Hangul_RieulYeorinHieuh +0x0ef0 U3171 f # Hangul_SunkyeongeumMieum +0x0ef1 U3178 f # Hangul_SunkyeongeumPieub +0x0ef2 U317f f # Hangul_PanSios +0x0ef3 U3181 f # Hangul_KkogjiDalrinIeung +0x0ef4 U3184 f # Hangul_SunkyeongeumPhieuf +0x0ef5 U3186 f # Hangul_YeorinHieuh +0x0ef6 U318d f # Hangul_AraeA +0x0ef7 U318e f # Hangul_AraeAE +0x0ef8 U11eb f # Hangul_J_PanSios +0x0ef9 U11f0 f # Hangul_J_KkogjiDalrinIeung +0x0efa U11f9 f # Hangul_J_YeorinHieuh +0x0eff U20a9 o # Korean_Won +0x13bc U0152 . # OE +0x13bd U0153 . # oe +0x13be U0178 . # Ydiaeresis +0x20a0 U20a0 u # EcuSign +0x20a1 U20a1 u # ColonSign +0x20a2 U20a2 u # CruzeiroSign +0x20a3 U20a3 u # FFrancSign +0x20a4 U20a4 u # LiraSign +0x20a5 U20a5 u # MillSign +0x20a6 U20a6 u # NairaSign +0x20a7 U20a7 u # PesetaSign +0x20a8 U20a8 u # RupeeSign +0x20a9 U20a9 u # WonSign +0x20aa U20aa u # NewSheqelSign +0x20ab U20ab u # DongSign +0x20ac U20ac . # EuroSign +0xfd01 U0000 f # 3270_Duplicate +0xfd02 U0000 f # 3270_FieldMark +0xfd03 U0000 f # 3270_Right2 +0xfd04 U0000 f # 3270_Left2 +0xfd05 U0000 f # 3270_BackTab +0xfd06 U0000 f # 3270_EraseEOF +0xfd07 U0000 f # 3270_EraseInput +0xfd08 U0000 f # 3270_Reset +0xfd09 U0000 f # 3270_Quit +0xfd0a U0000 f # 3270_PA1 +0xfd0b U0000 f # 3270_PA2 +0xfd0c U0000 f # 3270_PA3 +0xfd0d U0000 f # 3270_Test +0xfd0e U0000 f # 3270_Attn +0xfd0f U0000 f # 3270_CursorBlink +0xfd10 U0000 f # 3270_AltCursor +0xfd11 U0000 f # 3270_KeyClick +0xfd12 U0000 f # 3270_Jump +0xfd13 U0000 f # 3270_Ident +0xfd14 U0000 f # 3270_Rule +0xfd15 U0000 f # 3270_Copy +0xfd16 U0000 f # 3270_Play +0xfd17 U0000 f # 3270_Setup +0xfd18 U0000 f # 3270_Record +0xfd19 U0000 f # 3270_ChangeScreen +0xfd1a U0000 f # 3270_DeleteWord +0xfd1b U0000 f # 3270_ExSelect +0xfd1c U0000 f # 3270_CursorSelect +0xfd1d U0000 f # 3270_PrintScreen +0xfd1e U0000 f # 3270_Enter +0xfe01 U0000 f # ISO_Lock +0xfe02 U0000 f # ISO_Level2_Latch +0xfe03 U0000 f # ISO_Level3_Shift +0xfe04 U0000 f # ISO_Level3_Latch +0xfe05 U0000 f # ISO_Level3_Lock +0xfe06 U0000 f # ISO_Group_Latch +0xfe07 U0000 f # ISO_Group_Lock +0xfe08 U0000 f # ISO_Next_Group +0xfe09 U0000 f # ISO_Next_Group_Lock +0xfe0a U0000 f # ISO_Prev_Group +0xfe0b U0000 f # ISO_Prev_Group_Lock +0xfe0c U0000 f # ISO_First_Group +0xfe0d U0000 f # ISO_First_Group_Lock +0xfe0e U0000 f # ISO_Last_Group +0xfe0f U0000 f # ISO_Last_Group_Lock +0xfe20 U0000 f # ISO_Left_Tab +0xfe21 U0000 f # ISO_Move_Line_Up +0xfe22 U0000 f # ISO_Move_Line_Down +0xfe23 U0000 f # ISO_Partial_Line_Up +0xfe24 U0000 f # ISO_Partial_Line_Down +0xfe25 U0000 f # ISO_Partial_Space_Left +0xfe26 U0000 f # ISO_Partial_Space_Right +0xfe27 U0000 f # ISO_Set_Margin_Left +0xfe28 U0000 f # ISO_Set_Margin_Right +0xfe29 U0000 f # ISO_Release_Margin_Left +0xfe2a U0000 f # ISO_Release_Margin_Right +0xfe2b U0000 f # ISO_Release_Both_Margins +0xfe2c U0000 f # ISO_Fast_Cursor_Left +0xfe2d U0000 f # ISO_Fast_Cursor_Right +0xfe2e U0000 f # ISO_Fast_Cursor_Up +0xfe2f U0000 f # ISO_Fast_Cursor_Down +0xfe30 U0000 f # ISO_Continuous_Underline +0xfe31 U0000 f # ISO_Discontinuous_Underline +0xfe32 U0000 f # ISO_Emphasize +0xfe33 U0000 f # ISO_Center_Object +0xfe34 U0000 f # ISO_Enter +0xfe50 U0300 f # dead_grave +0xfe51 U0301 f # dead_acute +0xfe52 U0302 f # dead_circumflex +0xfe53 U0303 f # dead_tilde +0xfe54 U0304 f # dead_macron +0xfe55 U0306 f # dead_breve +0xfe56 U0307 f # dead_abovedot +0xfe57 U0308 f # dead_diaeresis +0xfe58 U030a f # dead_abovering +0xfe59 U030b f # dead_doubleacute +0xfe5a U030c f # dead_caron +0xfe5b U0327 f # dead_cedilla +0xfe5c U0328 f # dead_ogonek +0xfe5d U0345 f # dead_iota +0xfe5e U3099 f # dead_voiced_sound +0xfe5f U309a f # dead_semivoiced_sound +0xfe70 U0000 f # AccessX_Enable +0xfe71 U0000 f # AccessX_Feedback_Enable +0xfe72 U0000 f # RepeatKeys_Enable +0xfe73 U0000 f # SlowKeys_Enable +0xfe74 U0000 f # BounceKeys_Enable +0xfe75 U0000 f # StickyKeys_Enable +0xfe76 U0000 f # MouseKeys_Enable +0xfe77 U0000 f # MouseKeys_Accel_Enable +0xfe78 U0000 f # Overlay1_Enable +0xfe79 U0000 f # Overlay2_Enable +0xfe7a U0000 f # AudibleBell_Enable +0xfed0 U0000 f # First_Virtual_Screen +0xfed1 U0000 f # Prev_Virtual_Screen +0xfed2 U0000 f # Next_Virtual_Screen +0xfed4 U0000 f # Last_Virtual_Screen +0xfed5 U0000 f # Terminate_Server +0xfee0 U0000 f # Pointer_Left +0xfee1 U0000 f # Pointer_Right +0xfee2 U0000 f # Pointer_Up +0xfee3 U0000 f # Pointer_Down +0xfee4 U0000 f # Pointer_UpLeft +0xfee5 U0000 f # Pointer_UpRight +0xfee6 U0000 f # Pointer_DownLeft +0xfee7 U0000 f # Pointer_DownRight +0xfee8 U0000 f # Pointer_Button_Dflt +0xfee9 U0000 f # Pointer_Button1 +0xfeea U0000 f # Pointer_Button2 +0xfeeb U0000 f # Pointer_Button3 +0xfeec U0000 f # Pointer_Button4 +0xfeed U0000 f # Pointer_Button5 +0xfeee U0000 f # Pointer_DblClick_Dflt +0xfeef U0000 f # Pointer_DblClick1 +0xfef0 U0000 f # Pointer_DblClick2 +0xfef1 U0000 f # Pointer_DblClick3 +0xfef2 U0000 f # Pointer_DblClick4 +0xfef3 U0000 f # Pointer_DblClick5 +0xfef4 U0000 f # Pointer_Drag_Dflt +0xfef5 U0000 f # Pointer_Drag1 +0xfef6 U0000 f # Pointer_Drag2 +0xfef7 U0000 f # Pointer_Drag3 +0xfef8 U0000 f # Pointer_Drag4 +0xfef9 U0000 f # Pointer_EnableKeys +0xfefa U0000 f # Pointer_Accelerate +0xfefb U0000 f # Pointer_DfltBtnNext +0xfefc U0000 f # Pointer_DfltBtnPrev +0xfefd U0000 f # Pointer_Drag5 +0xff08 U0008 f # BackSpace /* back space, back char */ +0xff09 U0009 f # Tab +0xff0a U000a f # Linefeed /* Linefeed, LF */ +0xff0b U000b f # Clear +0xff0d U000d f # Return /* Return, enter */ +0xff13 U0013 f # Pause /* Pause, hold */ +0xff14 U0014 f # Scroll_Lock +0xff15 U0015 f # Sys_Req +0xff1b U001b f # Escape +0xff20 U0000 f # Multi_key +0xff21 U0000 f # Kanji +0xff22 U0000 f # Muhenkan +0xff23 U0000 f # Henkan_Mode +0xff24 U0000 f # Romaji +0xff25 U0000 f # Hiragana +0xff26 U0000 f # Katakana +0xff27 U0000 f # Hiragana_Katakana +0xff28 U0000 f # Zenkaku +0xff29 U0000 f # Hankaku +0xff2a U0000 f # Zenkaku_Hankaku +0xff2b U0000 f # Touroku +0xff2c U0000 f # Massyo +0xff2d U0000 f # Kana_Lock +0xff2e U0000 f # Kana_Shift +0xff2f U0000 f # Eisu_Shift +0xff30 U0000 f # Eisu_toggle +0xff31 U0000 f # Hangul +0xff32 U0000 f # Hangul_Start +0xff33 U0000 f # Hangul_End +0xff34 U0000 f # Hangul_Hanja +0xff35 U0000 f # Hangul_Jamo +0xff36 U0000 f # Hangul_Romaja +0xff37 U0000 f # Codeinput +0xff38 U0000 f # Hangul_Jeonja +0xff39 U0000 f # Hangul_Banja +0xff3a U0000 f # Hangul_PreHanja +0xff3b U0000 f # Hangul_PostHanja +0xff3c U0000 f # SingleCandidate +0xff3d U0000 f # MultipleCandidate +0xff3e U0000 f # PreviousCandidate +0xff3f U0000 f # Hangul_Special +0xff50 U0000 f # Home +0xff51 U0000 f # Left +0xff52 U0000 f # Up +0xff53 U0000 f # Right +0xff54 U0000 f # Down +0xff55 U0000 f # Prior +0xff56 U0000 f # Next +0xff57 U0000 f # End +0xff58 U0000 f # Begin +0xff60 U0000 f # Select +0xff61 U0000 f # Print +0xff62 U0000 f # Execute +0xff63 U0000 f # Insert +0xff65 U0000 f # Undo +0xff66 U0000 f # Redo +0xff67 U0000 f # Menu +0xff68 U0000 f # Find +0xff69 U0000 f # Cancel +0xff6a U0000 f # Help +0xff6b U0000 f # Break +0xff7e U0000 f # Mode_switch +0xff7f U0000 f # Num_Lock +0xff80 U0020 f # KP_Space /* space */ +0xff89 U0009 f # KP_Tab +0xff8d U000d f # KP_Enter /* enter */ +0xff91 U0000 f # KP_F1 +0xff92 U0000 f # KP_F2 +0xff93 U0000 f # KP_F3 +0xff94 U0000 f # KP_F4 +0xff95 U0000 f # KP_Home +0xff96 U0000 f # KP_Left +0xff97 U0000 f # KP_Up +0xff98 U0000 f # KP_Right +0xff99 U0000 f # KP_Down +0xff9a U0000 f # KP_Prior +0xff9b U0000 f # KP_Next +0xff9c U0000 f # KP_End +0xff9d U0000 f # KP_Begin +0xff9e U0000 f # KP_Insert +0xff9f U0000 f # KP_Delete +0xffaa U002a f # KP_Multiply +0xffab U002b f # KP_Add +0xffac U002c f # KP_Separator /* separator, often comma */ +0xffad U002d f # KP_Subtract +0xffae U002e f # KP_Decimal +0xffaf U002f f # KP_Divide +0xffb0 U0030 f # KP_0 +0xffb1 U0031 f # KP_1 +0xffb2 U0032 f # KP_2 +0xffb3 U0033 f # KP_3 +0xffb4 U0034 f # KP_4 +0xffb5 U0035 f # KP_5 +0xffb6 U0036 f # KP_6 +0xffb7 U0037 f # KP_7 +0xffb8 U0038 f # KP_8 +0xffb9 U0039 f # KP_9 +0xffbd U003d f # KP_Equal /* equals */ +0xffbe U0000 f # F1 +0xffbf U0000 f # F2 +0xffc0 U0000 f # F3 +0xffc1 U0000 f # F4 +0xffc2 U0000 f # F5 +0xffc3 U0000 f # F6 +0xffc4 U0000 f # F7 +0xffc5 U0000 f # F8 +0xffc6 U0000 f # F9 +0xffc7 U0000 f # F10 +0xffc8 U0000 f # F11 +0xffc9 U0000 f # F12 +0xffca U0000 f # F13 +0xffcb U0000 f # F14 +0xffcc U0000 f # F15 +0xffcd U0000 f # F16 +0xffce U0000 f # F17 +0xffcf U0000 f # F18 +0xffd0 U0000 f # F19 +0xffd1 U0000 f # F20 +0xffd2 U0000 f # F21 +0xffd3 U0000 f # F22 +0xffd4 U0000 f # F23 +0xffd5 U0000 f # F24 +0xffd6 U0000 f # F25 +0xffd7 U0000 f # F26 +0xffd8 U0000 f # F27 +0xffd9 U0000 f # F28 +0xffda U0000 f # F29 +0xffdb U0000 f # F30 +0xffdc U0000 f # F31 +0xffdd U0000 f # F32 +0xffde U0000 f # F33 +0xffdf U0000 f # F34 +0xffe0 U0000 f # F35 +0xffe1 U0000 f # Shift_L +0xffe2 U0000 f # Shift_R +0xffe3 U0000 f # Control_L +0xffe4 U0000 f # Control_R +0xffe5 U0000 f # Caps_Lock +0xffe6 U0000 f # Shift_Lock +0xffe7 U0000 f # Meta_L +0xffe8 U0000 f # Meta_R +0xffe9 U0000 f # Alt_L +0xffea U0000 f # Alt_R +0xffeb U0000 f # Super_L +0xffec U0000 f # Super_R +0xffed U0000 f # Hyper_L +0xffee U0000 f # Hyper_R +0xffff U0000 f # Delete +0xffffff U0000 f # VoidSymbol + +# Various XFree86 extensions since X11R6.4 +# http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h + +# KOI8-U support (Aleksey Novodvorsky, 1999-05-30) +# http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h.diff?r1=1.4&r2=1.5 +# Used in XFree86's /usr/lib/X11/xkb/symbols/ua mappings + +0x06ad U0491 . # Ukrainian_ghe_with_upturn +0x06bd U0490 . # Ukrainian_GHE_WITH_UPTURN + +# Support for armscii-8, ibm-cp1133, mulelao-1, viscii1.1-1, +# tcvn-5712, georgian-academy, georgian-ps +# (#2843, Pablo Saratxaga , 1999-06-06) +# http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h.diff?r1=1.6&r2=1.7 + +# Armenian +# (not used in any XFree86 4.4 kbd layouts, where /usr/lib/X11/xkb/symbols/am +# uses directly Unicode-mapped hexadecimal values instead) +0x14a1 U0000 r # Armenian_eternity +0x14a2 U0587 u # Armenian_ligature_ew +0x14a3 U0589 u # Armenian_verjaket +0x14a4 U0029 r # Armenian_parenright +0x14a5 U0028 r # Armenian_parenleft +0x14a6 U00bb r # Armenian_guillemotright +0x14a7 U00ab r # Armenian_guillemotleft +0x14a8 U2014 r # Armenian_em_dash +0x14a9 U002e r # Armenian_mijaket +0x14aa U055d u # Armenian_but +0x14ab U002c r # Armenian_comma +0x14ac U2013 r # Armenian_en_dash +0x14ad U058a u # Armenian_yentamna +0x14ae U2026 r # Armenian_ellipsis +0x14af U055c u # Armenian_amanak +0x14b0 U055b u # Armenian_shesht +0x14b1 U055e u # Armenian_paruyk +0x14b2 U0531 u # Armenian_AYB +0x14b3 U0561 u # Armenian_ayb +0x14b4 U0532 u # Armenian_BEN +0x14b5 U0562 u # Armenian_ben +0x14b6 U0533 u # Armenian_GIM +0x14b7 U0563 u # Armenian_gim +0x14b8 U0534 u # Armenian_DA +0x14b9 U0564 u # Armenian_da +0x14ba U0535 u # Armenian_YECH +0x14bb U0565 u # Armenian_yech +0x14bc U0536 u # Armenian_ZA +0x14bd U0566 u # Armenian_za +0x14be U0537 u # Armenian_E +0x14bf U0567 u # Armenian_e +0x14c0 U0538 u # Armenian_AT +0x14c1 U0568 u # Armenian_at +0x14c2 U0539 u # Armenian_TO +0x14c3 U0569 u # Armenian_to +0x14c4 U053a u # Armenian_ZHE +0x14c5 U056a u # Armenian_zhe +0x14c6 U053b u # Armenian_INI +0x14c7 U056b u # Armenian_ini +0x14c8 U053c u # Armenian_LYUN +0x14c9 U056c u # Armenian_lyun +0x14ca U053d u # Armenian_KHE +0x14cb U056d u # Armenian_khe +0x14cc U053e u # Armenian_TSA +0x14cd U056e u # Armenian_tsa +0x14ce U053f u # Armenian_KEN +0x14cf U056f u # Armenian_ken +0x14d0 U0540 u # Armenian_HO +0x14d1 U0570 u # Armenian_ho +0x14d2 U0541 u # Armenian_DZA +0x14d3 U0571 u # Armenian_dza +0x14d4 U0542 u # Armenian_GHAT +0x14d5 U0572 u # Armenian_ghat +0x14d6 U0543 u # Armenian_TCHE +0x14d7 U0573 u # Armenian_tche +0x14d8 U0544 u # Armenian_MEN +0x14d9 U0574 u # Armenian_men +0x14da U0545 u # Armenian_HI +0x14db U0575 u # Armenian_hi +0x14dc U0546 u # Armenian_NU +0x14dd U0576 u # Armenian_nu +0x14de U0547 u # Armenian_SHA +0x14df U0577 u # Armenian_sha +0x14e0 U0548 u # Armenian_VO +0x14e1 U0578 u # Armenian_vo +0x14e2 U0549 u # Armenian_CHA +0x14e3 U0579 u # Armenian_cha +0x14e4 U054a u # Armenian_PE +0x14e5 U057a u # Armenian_pe +0x14e6 U054b u # Armenian_JE +0x14e7 U057b u # Armenian_je +0x14e8 U054c u # Armenian_RA +0x14e9 U057c u # Armenian_ra +0x14ea U054d u # Armenian_SE +0x14eb U057d u # Armenian_se +0x14ec U054e u # Armenian_VEV +0x14ed U057e u # Armenian_vev +0x14ee U054f u # Armenian_TYUN +0x14ef U057f u # Armenian_tyun +0x14f0 U0550 u # Armenian_RE +0x14f1 U0580 u # Armenian_re +0x14f2 U0551 u # Armenian_TSO +0x14f3 U0581 u # Armenian_tso +0x14f4 U0552 u # Armenian_VYUN +0x14f5 U0582 u # Armenian_vyun +0x14f6 U0553 u # Armenian_PYUR +0x14f7 U0583 u # Armenian_pyur +0x14f8 U0554 u # Armenian_KE +0x14f9 U0584 u # Armenian_ke +0x14fa U0555 u # Armenian_O +0x14fb U0585 u # Armenian_o +0x14fc U0556 u # Armenian_FE +0x14fd U0586 u # Armenian_fe +0x14fe U055a u # Armenian_apostrophe +0x14ff U00a7 r # Armenian_section_sign + +# Gregorian +# (not used in any XFree86 4.4 kbd layouts, were /usr/lib/X11/xkb/symbols/ge_* +# uses directly Unicode-mapped hexadecimal values instead) +0x15d0 U10d0 u # Georgian_an +0x15d1 U10d1 u # Georgian_ban +0x15d2 U10d2 u # Georgian_gan +0x15d3 U10d3 u # Georgian_don +0x15d4 U10d4 u # Georgian_en +0x15d5 U10d5 u # Georgian_vin +0x15d6 U10d6 u # Georgian_zen +0x15d7 U10d7 u # Georgian_tan +0x15d8 U10d8 u # Georgian_in +0x15d9 U10d9 u # Georgian_kan +0x15da U10da u # Georgian_las +0x15db U10db u # Georgian_man +0x15dc U10dc u # Georgian_nar +0x15dd U10dd u # Georgian_on +0x15de U10de u # Georgian_par +0x15df U10df u # Georgian_zhar +0x15e0 U10e0 u # Georgian_rae +0x15e1 U10e1 u # Georgian_san +0x15e2 U10e2 u # Georgian_tar +0x15e3 U10e3 u # Georgian_un +0x15e4 U10e4 u # Georgian_phar +0x15e5 U10e5 u # Georgian_khar +0x15e6 U10e6 u # Georgian_ghan +0x15e7 U10e7 u # Georgian_qar +0x15e8 U10e8 u # Georgian_shin +0x15e9 U10e9 u # Georgian_chin +0x15ea U10ea u # Georgian_can +0x15eb U10eb u # Georgian_jil +0x15ec U10ec u # Georgian_cil +0x15ed U10ed u # Georgian_char +0x15ee U10ee u # Georgian_xan +0x15ef U10ef u # Georgian_jhan +0x15f0 U10f0 u # Georgian_hae +0x15f1 U10f1 u # Georgian_he +0x15f2 U10f2 u # Georgian_hie +0x15f3 U10f3 u # Georgian_we +0x15f4 U10f4 u # Georgian_har +0x15f5 U10f5 u # Georgian_hoe +0x15f6 U10f6 u # Georgian_fi + +# Pablo Saratxaga's i18n updates for XFree86 that are used in Mandrake 7.2. +# (#4195, Pablo Saratxaga , 2000-10-27) +# http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h.diff?r1=1.9&r2=1.10 + +# Latin-8 +# (the *abovedot keysyms are used in /usr/lib/X11/xkb/symbols/ie) +0x12a1 U1e02 u # Babovedot +0x12a2 U1e03 u # babovedot +0x12a6 U1e0a u # Dabovedot +0x12a8 U1e80 u # Wgrave +0x12aa U1e82 u # Wacute +0x12ab U1e0b u # dabovedot +0x12ac U1ef2 u # Ygrave +0x12b0 U1e1e u # Fabovedot +0x12b1 U1e1f u # fabovedot +0x12b4 U1e40 u # Mabovedot +0x12b5 U1e41 u # mabovedot +0x12b7 U1e56 u # Pabovedot +0x12b8 U1e81 u # wgrave +0x12b9 U1e57 u # pabovedot +0x12ba U1e83 u # wacute +0x12bb U1e60 u # Sabovedot +0x12bc U1ef3 u # ygrave +0x12bd U1e84 u # Wdiaeresis +0x12be U1e85 u # wdiaeresis +0x12bf U1e61 u # sabovedot +0x12d0 U0174 u # Wcircumflex +0x12d7 U1e6a u # Tabovedot +0x12de U0176 u # Ycircumflex +0x12f0 U0175 u # wcircumflex +0x12f7 U1e6b u # tabovedot +0x12fe U0177 u # ycircumflex + +# Arabic +# (of these, in XFree86 4.4 only Arabic_superscript_alef, Arabic_madda_above, +# Arabic_hamza_* are actually used, e.g. in /usr/lib/X11/xkb/symbols/syr) +0x0590 U06f0 u # Farsi_0 +0x0591 U06f1 u # Farsi_1 +0x0592 U06f2 u # Farsi_2 +0x0593 U06f3 u # Farsi_3 +0x0594 U06f4 u # Farsi_4 +0x0595 U06f5 u # Farsi_5 +0x0596 U06f6 u # Farsi_6 +0x0597 U06f7 u # Farsi_7 +0x0598 U06f8 u # Farsi_8 +0x0599 U06f9 u # Farsi_9 +0x05a5 U066a u # Arabic_percent +0x05a6 U0670 u # Arabic_superscript_alef +0x05a7 U0679 u # Arabic_tteh +0x05a8 U067e u # Arabic_peh +0x05a9 U0686 u # Arabic_tcheh +0x05aa U0688 u # Arabic_ddal +0x05ab U0691 u # Arabic_rreh +0x05ae U06d4 u # Arabic_fullstop +0x05b0 U0660 u # Arabic_0 +0x05b1 U0661 u # Arabic_1 +0x05b2 U0662 u # Arabic_2 +0x05b3 U0663 u # Arabic_3 +0x05b4 U0664 u # Arabic_4 +0x05b5 U0665 u # Arabic_5 +0x05b6 U0666 u # Arabic_6 +0x05b7 U0667 u # Arabic_7 +0x05b8 U0668 u # Arabic_8 +0x05b9 U0669 u # Arabic_9 +0x05f3 U0653 u # Arabic_madda_above +0x05f4 U0654 u # Arabic_hamza_above +0x05f5 U0655 u # Arabic_hamza_below +0x05f6 U0698 u # Arabic_jeh +0x05f7 U06a4 u # Arabic_veh +0x05f8 U06a9 u # Arabic_keheh +0x05f9 U06af u # Arabic_gaf +0x05fa U06ba u # Arabic_noon_ghunna +0x05fb U06be u # Arabic_heh_doachashmee +0x05fc U06cc u # Farsi_yeh +0x05fd U06d2 u # Arabic_yeh_baree +0x05fe U06c1 u # Arabic_heh_goal + +# Cyrillic +# (none of these are actually used in any XFree86 4.4 kbd layouts) +0x0680 U0492 u # Cyrillic_GHE_bar +0x0681 U0496 u # Cyrillic_ZHE_descender +0x0682 U049a u # Cyrillic_KA_descender +0x0683 U049c u # Cyrillic_KA_vertstroke +0x0684 U04a2 u # Cyrillic_EN_descender +0x0685 U04ae u # Cyrillic_U_straight +0x0686 U04b0 u # Cyrillic_U_straight_bar +0x0687 U04b2 u # Cyrillic_HA_descender +0x0688 U04b6 u # Cyrillic_CHE_descender +0x0689 U04b8 u # Cyrillic_CHE_vertstroke +0x068a U04ba u # Cyrillic_SHHA +0x068c U04d8 u # Cyrillic_SCHWA +0x068d U04e2 u # Cyrillic_I_macron +0x068e U04e8 u # Cyrillic_O_bar +0x068f U04ee u # Cyrillic_U_macron +0x0690 U0493 u # Cyrillic_ghe_bar +0x0691 U0497 u # Cyrillic_zhe_descender +0x0692 U049b u # Cyrillic_ka_descender +0x0693 U049d u # Cyrillic_ka_vertstroke +0x0694 U04a3 u # Cyrillic_en_descender +0x0695 U04af u # Cyrillic_u_straight +0x0696 U04b1 u # Cyrillic_u_straight_bar +0x0697 U04b3 u # Cyrillic_ha_descender +0x0698 U04b7 u # Cyrillic_che_descender +0x0699 U04b9 u # Cyrillic_che_vertstroke +0x069a U04bb u # Cyrillic_shha +0x069c U04d9 u # Cyrillic_schwa +0x069d U04e3 u # Cyrillic_i_macron +0x069e U04e9 u # Cyrillic_o_bar +0x069f U04ef u # Cyrillic_u_macron + +# Caucasus +# (of these, in XFree86 4.4 only Gcaron, gcaron are actually used, +# e.g. in /usr/lib/X11/xkb/symbols/sapmi; the lack of Unicode +# equivalents for the others suggests that they are bogus) +0x16a2 U0000 r # Ccedillaabovedot +0x16a3 U1e8a u # Xabovedot +0x16a5 U0000 r # Qabovedot +0x16a6 U012c u # Ibreve +0x16a7 U0000 r # IE +0x16a8 U0000 r # UO +0x16a9 U01b5 u # Zstroke +0x16aa U01e6 u # Gcaron +0x16af U019f u # Obarred +0x16b2 U0000 r # ccedillaabovedot +0x16b3 U1e8b u # xabovedot +0x16b4 U0000 r # Ocaron +0x16b5 U0000 r # qabovedot +0x16b6 U012d u # ibreve +0x16b7 U0000 r # ie +0x16b8 U0000 r # uo +0x16b9 U01b6 u # zstroke +0x16ba U01e7 u # gcaron +0x16bd U01d2 u # ocaron +0x16bf U0275 u # obarred +0x16c6 U018f u # SCHWA +0x16f6 U0259 u # schwa + +# Inupiak, Guarani +# (none of these are actually used in any XFree86 4.4 kbd layouts, +# and the lack of Unicode equivalents suggests that they are bogus) +0x16d1 U1e36 u # Lbelowdot +0x16d2 U0000 r # Lstrokebelowdot +0x16d3 U0000 r # Gtilde +0x16e1 U1e37 u # lbelowdot +0x16e2 U0000 r # lstrokebelowdot +0x16e3 U0000 r # gtilde + +# Vietnamese +# (none of these are actually used in any XFree86 4.4 kbd layouts; they are +# also pointless, as Vietnamese input methods use dead accent keys + ASCII keys) +0x1ea0 U1ea0 u # Abelowdot +0x1ea1 U1ea1 u # abelowdot +0x1ea2 U1ea2 u # Ahook +0x1ea3 U1ea3 u # ahook +0x1ea4 U1ea4 u # Acircumflexacute +0x1ea5 U1ea5 u # acircumflexacute +0x1ea6 U1ea6 u # Acircumflexgrave +0x1ea7 U1ea7 u # acircumflexgrave +0x1ea8 U1ea8 u # Acircumflexhook +0x1ea9 U1ea9 u # acircumflexhook +0x1eaa U1eaa u # Acircumflextilde +0x1eab U1eab u # acircumflextilde +0x1eac U1eac u # Acircumflexbelowdot +0x1ead U1ead u # acircumflexbelowdot +0x1eae U1eae u # Abreveacute +0x1eaf U1eaf u # abreveacute +0x1eb0 U1eb0 u # Abrevegrave +0x1eb1 U1eb1 u # abrevegrave +0x1eb2 U1eb2 u # Abrevehook +0x1eb3 U1eb3 u # abrevehook +0x1eb4 U1eb4 u # Abrevetilde +0x1eb5 U1eb5 u # abrevetilde +0x1eb6 U1eb6 u # Abrevebelowdot +0x1eb7 U1eb7 u # abrevebelowdot +0x1eb8 U1eb8 u # Ebelowdot +0x1eb9 U1eb9 u # ebelowdot +0x1eba U1eba u # Ehook +0x1ebb U1ebb u # ehook +0x1ebc U1ebc u # Etilde +0x1ebd U1ebd u # etilde +0x1ebe U1ebe u # Ecircumflexacute +0x1ebf U1ebf u # ecircumflexacute +0x1ec0 U1ec0 u # Ecircumflexgrave +0x1ec1 U1ec1 u # ecircumflexgrave +0x1ec2 U1ec2 u # Ecircumflexhook +0x1ec3 U1ec3 u # ecircumflexhook +0x1ec4 U1ec4 u # Ecircumflextilde +0x1ec5 U1ec5 u # ecircumflextilde +0x1ec6 U1ec6 u # Ecircumflexbelowdot +0x1ec7 U1ec7 u # ecircumflexbelowdot +0x1ec8 U1ec8 u # Ihook +0x1ec9 U1ec9 u # ihook +0x1eca U1eca u # Ibelowdot +0x1ecb U1ecb u # ibelowdot +0x1ecc U1ecc u # Obelowdot +0x1ecd U1ecd u # obelowdot +0x1ece U1ece u # Ohook +0x1ecf U1ecf u # ohook +0x1ed0 U1ed0 u # Ocircumflexacute +0x1ed1 U1ed1 u # ocircumflexacute +0x1ed2 U1ed2 u # Ocircumflexgrave +0x1ed3 U1ed3 u # ocircumflexgrave +0x1ed4 U1ed4 u # Ocircumflexhook +0x1ed5 U1ed5 u # ocircumflexhook +0x1ed6 U1ed6 u # Ocircumflextilde +0x1ed7 U1ed7 u # ocircumflextilde +0x1ed8 U1ed8 u # Ocircumflexbelowdot +0x1ed9 U1ed9 u # ocircumflexbelowdot +0x1eda U1eda u # Ohornacute +0x1edb U1edb u # ohornacute +0x1edc U1edc u # Ohorngrave +0x1edd U1edd u # ohorngrave +0x1ede U1ede u # Ohornhook +0x1edf U1edf u # ohornhook +0x1ee0 U1ee0 u # Ohorntilde +0x1ee1 U1ee1 u # ohorntilde +0x1ee2 U1ee2 u # Ohornbelowdot +0x1ee3 U1ee3 u # ohornbelowdot +0x1ee4 U1ee4 u # Ubelowdot +0x1ee5 U1ee5 u # ubelowdot +0x1ee6 U1ee6 u # Uhook +0x1ee7 U1ee7 u # uhook +0x1ee8 U1ee8 u # Uhornacute +0x1ee9 U1ee9 u # uhornacute +0x1eea U1eea u # Uhorngrave +0x1eeb U1eeb u # uhorngrave +0x1eec U1eec u # Uhornhook +0x1eed U1eed u # uhornhook +0x1eee U1eee u # Uhorntilde +0x1eef U1eef u # uhorntilde +0x1ef0 U1ef0 u # Uhornbelowdot +0x1ef1 U1ef1 u # uhornbelowdot +0x1ef4 U1ef4 u # Ybelowdot +0x1ef5 U1ef5 u # ybelowdot +0x1ef6 U1ef6 u # Yhook +0x1ef7 U1ef7 u # yhook +0x1ef8 U1ef8 u # Ytilde +0x1ef9 U1ef9 u # ytilde + +0x1efa U01a0 u # Ohorn +0x1efb U01a1 u # ohorn +0x1efc U01af u # Uhorn +0x1efd U01b0 u # uhorn + +# (Unicode combining characters have no direct equivalence with +# keysyms, where dead keys are defined instead) +0x1e9f U0303 r # combining_tilde +0x1ef2 U0300 r # combining_grave +0x1ef3 U0301 r # combining_acute +0x1efe U0309 r # combining_hook +0x1eff U0323 r # combining_belowdot + +# These probably should be added to the X11 standard properly, +# as they could be of use for Vietnamese input methods. +0xfe60 U0323 f # dead_belowdot +0xfe61 U0309 f # dead_hook +0xfe62 U031b f # dead_horn diff --git a/setup.py b/setup.py index 1ef559c..136be9f 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ def long_description(): return(readme_text) setup(name='PyUserInput', - version='0.1.9', + version='0.1.10', description='A simple, cross-platform module for mouse and keyboard control', long_description=long_description(), author='Paul Barton', @@ -37,6 +37,6 @@ def dependency_check(dep_list): if sys.platform == 'darwin': # Mac dependency_check(['Quartz', 'AppKit']) elif sys.platform == 'win32': # Windows - dependency_check(['win32api', 'win32con', 'pythoncom', 'pyHook']) + dependency_check(['win32api', 'win32con', 'pythoncom', 'pyWinhook']) else: # X11 (LInux) dependency_check(['Xlib']) diff --git a/tests/basic.py b/tests/basic.py index 55024fa..93b37da 100644 --- a/tests/basic.py +++ b/tests/basic.py @@ -20,31 +20,31 @@ class event(PyMouseEvent): def move(self, x, y): - print "Mouse moved to", x, y + print("Mouse moved to", x, y) def click(self, x, y, button, press): if press: - print "Mouse pressed at", x, y, "with button", button + print("Mouse pressed at", x, y, "with button", button) else: - print "Mouse released at", x, y, "with button", button + print("Mouse released at", x, y, "with button", button) e = event() #e.capture = True e.start() except ImportError: - print "Mouse events are not yet supported on your platform" + print("Mouse events are not yet supported on your platform") m = PyMouse() try: size = m.screen_size() - print "size: %s" % (str(size)) + print("size: %s" % (str(size))) pos = (random.randint(0, size[0]), random.randint(0, size[1])) except: pos = (random.randint(0, 250), random.randint(0, 250)) -print "Position: %s" % (str(pos)) +print("Position: %s" % (str(pos))) m.move(pos[0], pos[1]) diff --git a/tests/test_unix.py b/tests/test_unix.py index 9e58109..00a60f7 100644 --- a/tests/test_unix.py +++ b/tests/test_unix.py @@ -6,7 +6,7 @@ on Ubuntu: sudo apt-get install python-nose - sudo apt-get install xvfb + sudo apt-get install xvfb sudo apt-get install xserver-xephyr sudo apt-get install python-setuptools sudo easy_install PyVirtualDisplay @@ -36,22 +36,36 @@ (0, 0), (10, 20), (-10, -20), - (5, 0), (2222, 2222), + (5, 0), (9, 19), ] +buttons = [1, 2, 3, 10] # 10 = mouse btn6 class Event(PyMouseEvent): + def reset(self): + self.pos = None + self.button = None + self.press = None + self.scroll_vertical = None + self.scroll_horizontal = None + def move(self, x, y): - print "Mouse moved to", x, y + print("Mouse moved to", x, y) self.pos = (x, y) def click(self, x, y, button, press): if press: - print "Mouse pressed at", x, y, "with button", button + print("Mouse pressed at", x, y, "with button", button) else: - print "Mouse released at", x, y, "with button", button + print("Mouse released at", x, y, "with button", button) + self.button = button + self.press = press + + def scroll(self, x, y, vertical, horizontal): + self.scroll_vertical = vertical + self.scroll_horizontal = horizontal def expect_pos(pos, size): def expect(x, m): @@ -79,14 +93,48 @@ def test_move(self): def test_event(self): for size in screen_sizes: with Display(visible=VISIBLE, size=size): - time.sleep(3) # TODO: how long should we wait? + time.sleep(1.0) # TODO: how long should we wait? mouse = PyMouse() event = Event() event.start() + # check move for p in positions: - event.pos = None + event.reset() mouse.move(*p) - time.sleep(0.1) # TODO: how long should we wait? - print 'check ', expect_pos(p, size), '=', event.pos + time.sleep(0.01) + print('check ', expect_pos(p, size), '=', event.pos) eq_(expect_pos(p, size), event.pos) - event.stop() + # check buttons + for btn in buttons: + # press + event.reset() + mouse.press(0, 0, btn) + time.sleep(0.01) + print("check button", btn, "pressed") + eq_(btn, event.button) + eq_(True, event.press) + # release + event.reset() + mouse.release(0, 0, btn) + time.sleep(0.01) + print("check button", btn, "released") + eq_(btn, event.button) + eq_(False, event.press) + # check scroll + def check_scroll(btn, vertical=None, horizontal=None): + event.reset() + mouse.press(0, 0, btn) + time.sleep(0.01) + if vertical: + eq_(vertical, event.scroll_vertical) + elif horizontal: + eq_(horizontal, event.scroll_horizontal) + print("check scroll up") + check_scroll(4, 1, 0) + print("check scroll down") + check_scroll(5, -1, 0) + print("check scroll left") + check_scroll(6, 0, 1) + print("check scroll right") + check_scroll(7, 0, -1) + event.stop()