123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- # -*- coding: utf-8 -*-
- from time import time as now
- try:
- basestring
- except NameError:
- basestring = str
- KEY_DOWN = 'down'
- KEY_UP = 'up'
- class KeyboardEvent(object):
- event_type = None
- scan_code = None
- name = None
- time = None
- def __init__(self, event_type, scan_code, name=None, time=None, device=None, is_keypad=None):
- self.event_type = event_type
- self.scan_code = scan_code
- self.time = now() if time is None else time
- self.device = device
- self.is_keypad = is_keypad
- if name:
- self.name = normalize_name(name)
- def __repr__(self):
- return 'KeyboardEvent({} {})'.format(self.name or 'Unknown {}'.format(self.scan_code), self.event_type)
- # TODO: add values from https://svn.apache.org/repos/asf/xmlgraphics/commons/tags/commons-1_0/src/java/org/apache/xmlgraphics/fonts/Glyphs.java
- canonical_names = {
- 'escape': 'esc',
- 'return': 'enter',
- 'del': 'delete',
- 'control': 'ctrl',
- 'altgr': 'alt gr',
- 'left arrow': 'left',
- 'up arrow': 'up',
- 'down arrow': 'down',
- 'right arrow': 'right',
- ' ': 'space', # Prefer to spell out keys that would be hard to read.
- '\x1b': 'esc',
- '\x08': 'backspace',
- '\n': 'enter',
- '\t': 'tab',
- '\r': 'enter',
- 'scrlk': 'scroll lock',
- 'prtscn': 'print screen',
- 'prnt scrn': 'print screen',
- 'snapshot': 'print screen',
- 'ins': 'insert',
- 'pause break': 'pause',
- 'ctrll lock': 'caps lock',
- 'capslock': 'caps lock',
- 'number lock': 'num lock',
- 'numlock:': 'num lock',
- 'space bar': 'space',
- 'spacebar': 'space',
- 'linefeed': 'enter',
- 'win': 'windows',
- # Mac keys
- 'command': 'windows',
- 'control': 'ctrl',
- 'option': 'alt',
- 'app': 'menu',
- 'apps': 'menu',
- 'application': 'menu',
- 'applications': 'menu',
- 'pagedown': 'page down',
- 'pageup': 'page up',
- 'pgdown': 'page down',
- 'pgup': 'page up',
- 'next': 'page down', # This looks wrong, but this is how Linux reports.
- 'prior': 'page up',
- 'underscore': '_',
- 'equal': '=',
- 'minplus': '+',
- 'plus': '+',
- 'add': '+',
- 'subtract': '-',
- 'minus': '-',
- 'multiply': '*',
- 'asterisk': '*',
- 'divide': '/',
- 'question': '?',
- 'exclam': '!',
- 'slash': '/',
- 'bar': '|',
- 'backslash': '\\',
- 'braceleft': '{',
- 'braceright': '}',
- 'bracketleft': '[',
- 'bracketright': ']',
- 'parenleft': '(',
- 'parenright': ')',
- 'period': '.',
- 'dot': '.',
- 'comma': ',',
- 'semicolon': ';',
- 'colon': ':',
- 'less': '<',
- 'greater': '>',
- 'ampersand': '&',
- 'at': '@',
- 'numbersign': '#',
- 'hash': '#',
- 'hashtag': '#',
- 'dollar': '$',
- 'sterling': '£',
- 'pound': '£',
- 'yen': '¥',
- 'euro': '€',
- 'cent': '¢',
- 'currency': '¤',
- 'registered': '®',
- 'copyright': '©',
- 'notsign': '¬',
- 'percent': '%',
- 'diaeresis': '"',
- 'quotedbl': '"',
- 'onesuperior': '¹',
- 'twosuperior': '²',
- 'threesuperior': '³',
- 'onehalf': '½',
- 'onequarter': '¼',
- 'threequarters': '¾',
- 'paragraph': '¶',
- 'section': '§',
- 'ssharp': '§',
- 'division': '÷',
- 'questiondown': '¿',
- 'exclamdown': '¡',
- 'degree': '°',
- 'guillemotright': '»',
- 'guillemotleft': '«',
-
- 'acute': '´',
- 'agudo': '´',
- 'grave': '`',
- 'tilde': '~',
- 'asciitilde': '~',
- 'til': '~',
- 'cedilla': ',',
- 'circumflex': '^',
- 'apostrophe': '\'',
-
- 'adiaeresis': 'ä',
- 'udiaeresis': 'ü',
- 'odiaeresis': 'ö',
- 'oe': 'Œ',
- 'oslash': 'ø',
- 'ooblique': 'Ø',
- 'ccedilla': 'ç',
- 'ntilde': 'ñ',
- 'eacute': 'é',
- 'uacute': 'ú',
- 'oacute': 'ó',
- 'thorn': 'þ',
- 'ae': 'æ',
- 'eth': 'ð',
- 'masculine': 'º',
- 'feminine': 'ª',
- 'iacute': 'í',
- 'aacute': 'á',
- 'mu': 'Μ',
- 'aring': 'å',
- 'zero': '0',
- 'one': '1',
- 'two': '2',
- 'three': '3',
- 'four': '4',
- 'five': '5',
- 'six': '6',
- 'seven': '7',
- 'eight': '8',
- 'nine': '9',
- 'play/pause': 'play/pause media',
- 'num multiply': '*',
- 'num divide': '/',
- 'num add': '+',
- 'num plus': '+',
- 'num minus': '-',
- 'num sub': '-',
- 'num enter': 'enter',
- 'num 0': '0',
- 'num 1': '1',
- 'num 2': '2',
- 'num 3': '3',
- 'num 4': '4',
- 'num 5': '5',
- 'num 6': '6',
- 'num 7': '7',
- 'num 8': '8',
- 'num 9': '9',
- 'left win': 'left windows',
- 'right win': 'right windows',
- 'left control': 'left ctrl',
- 'right control': 'right ctrl',
- 'left menu': 'left alt', # Windows...
- }
- def normalize_name(name):
- if not name:
- return 'unknown'
- if not isinstance(name, basestring):
- raise ValueError('Can only normalize string names. Unexpected '+ repr(name))
- name = name.lower()
- if name != '_':
- name = name.replace('_', ' ')
- return canonical_names.get(name, name)
|