diff options
author | William Holland <william.holland@codethink.co.uk> | 2015-05-28 20:45:55 +0100 |
---|---|---|
committer | William Holland <william.holland@codethink.co.uk> | 2015-05-28 23:03:48 +0100 |
commit | 3b811b1bfbfd806473f106dc20f124008e566858 (patch) | |
tree | 48cbbaeebf6ca4106ce1f134e8123f05f41746d7 | |
parent | 5b640d7d74003e98dbe09c822bb8135d3efa44c6 (diff) | |
download | keyboard-python-3b811b1bfbfd806473f106dc20f124008e566858.tar.bz2 |
Add Key object and related functions
-rw-r--r-- | key.py | 108 |
1 files changed, 108 insertions, 0 deletions
@@ -0,0 +1,108 @@ +ESC = '\x1b' + +def assert_type(thing,_type): + ''' if thing is not of type _type raise an exception ''' + if type(thing) is not _type: + raise TypeError, + "%s is of %s, should be of %s" % + (str(thing),type(thing),_type) + +class Key: + ''' a keyboard keypress object ''' + + def __init__(self,name,*modifiers): + assert_type(name,str) + for m in modifiers: + assert isinstance(m,Key), + "Modifiers expected to be instances of Key" + self.name = name + self.modifiers = list(modifiers) + self.modifiers.sort() + + def __eq__(self,other): + if not isinstance(Key,other): return False + return str(self) == str(other) + + def __ne__(self,other): + if isinstance(Key,other): return True + return str(self) != str(other) + + def __str__(self): + to_return = str() + for m in self.modifiers: + to_return += '%s ' % str(m) + to_return += self.name + return to_return + + def has_modifier(self,modifier): + ''' does this object have the modifier? ''' + if modifier in self.modifiers: + return True + return False + + def modify(self,modifier): + ''' add a modifier ''' + if modifier not in self.modifiers: + self.modifiers.append(modifier) + self.modifiers.sort() + return self + +ALT = Key('Alt') +CTRL = Key('Control') + +table = { + ESC : Key('Escape'), + '\t': Key('Tab'), + ' ': Key('Space'), + '\n': Key('Enter'), + '\x7f' : Key('Backspace'), + '%sOF' % ESC: Key('End'), + '%sOH' % ESC: Key('Home'), + '%s[3~' % ESC: Key('Del'), + '%s[2~' % ESC: Key('Insert'), + '%s[5~' % ESC: Key('PageUp'), + '%s[6~' % ESC: Key('PageDown'), + '%sOP' % ESC: Key('F1'), + '%sOQ' % ESC: Key('F2'), + '%sOR' % ESC: Key('F3'), + '%sOS' % ESC: Key('F4'), + '%s[15~' % ESC: Key('F5'), + '%s[17~' % ESC: Key('F6'), + '%s[18~' % ESC: Key('F7'), + '%s[19~' % ESC: Key('F8'), + '%s[20~' % ESC: Key('F9'), + '%s[21~' % ESC: Key('F10'), + '%s[23~' % ESC: Key('F11'), + '%s[24~' % ESC: Key('F12'), + '%s[A' % ESC: Key('Up'), + '%s[B' % ESC: Key('Down'), + '%s[D' % ESC: Key('Left'), + '%s[C' % ESC: Key('Right'), + } + +def is_alt(code): + ''' is this the code of a combination modified by Alt? ''' + assert_type(name,str) + if len(code) == 2 and code[0] == ESC: + return True + return False + +def is_ctrl_alpha(code): + ''' is this the code of a combination modified by Ctrl? ''' + assert_type(name,str) + if code < '\x20': return True + return False + +def get_ctrl_alpha(code): + ''' get alphabetic key modified by Ctrl ''' + assert_type(name,str) + letter = chr(ord(code) + 0x40) + return Key(letter,CTRL) + +def parse_code(code): + ''' get Key object from code ''' + assert_type(name,str) + if code in table.keys(): return table[code] + elif is_alt(code): return from_keycode(code[1:]).modify(ALT) + elif is_ctrl_alpha(code): return get_ctrl_alpha(code) + else: return Key(code) |