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()