# -*- coding: utf-8 -*- #***************************************************************************** # Copyright (C) 2003-2006 Gary Bishop. # Copyright (C) 2006 Jorgen Stenarson. # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #***************************************************************************** # table for translating virtual keys to X windows key symbols try: set except NameError: from sets import Set as set validkey =set(['cancel', 'backspace', 'tab', 'clear', 'return', 'shift_l', 'control_l', 'alt_l', 'pause', 'caps_lock', 'escape', 'space', 'prior', 'next', 'end', 'home', 'left', 'up', 'right', 'down', 'select', 'print', 'execute', 'snapshot', 'insert', 'delete', 'help', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f20', 'f21', 'f22', 'f23', 'f24', 'num_lock', 'scroll_lock', 'vk_apps', 'vk_processkey','vk_attn', 'vk_crsel', 'vk_exsel', 'vk_ereof', 'vk_play', 'vk_zoom', 'vk_noname', 'vk_pa1', 'vk_oem_clear', 'numpad0', 'numpad1', 'numpad2', 'numpad3', 'numpad4', 'numpad5', 'numpad6', 'numpad7', 'numpad8', 'numpad9', 'divide', 'multiply', 'add', 'subtract', 'vk_decimal']) escape_sequence_to_special_key={"\\e[a":"up","\\e[b":"down","del":"delete"} class KeyPress(object): def __init__(self,char="",shift=False,control=False,meta=False,keyname=""): if control or meta or shift: char=char.upper() self.info=dict(char=char, shift=shift, control=control, meta=meta, keyname=keyname) def create(name): def get(self): return self.info[name] def set(self,value): self.info[name]=value return property(get,set) char=create("char") shift=create("shift") control=create("control") meta=create("meta") keyname=create("keyname") def __repr__(self): return "(%s,%s,%s,%s)"%self.tuple() def tuple(self): if self.keyname: return (self.control,self.meta,self.shift,self.keyname) else: if self.control or self.meta or self.shift: return (self.control,self.meta,self.shift,self.char.upper()) else: return (self.control,self.meta,self.shift,self.char) def make_KeyPress_from_keydescr(keydescr): keyinfo=KeyPress() if len(keydescr)>2 and keydescr[:1]=='"' and keydescr[-1:]=='"': keydescr=keydescr[1:-1] while 1: lkeyname = keydescr.lower() if lkeyname.startswith('control-'): keyinfo.control = True keydescr = keydescr[8:] elif lkeyname.startswith('ctrl-'): keyinfo.control = True keydescr = keydescr[5:] elif keydescr.lower().startswith('\\c-'): keyinfo.control = True keydescr = keydescr[3:] elif keydescr.lower().startswith('\\m-'): keyinfo.meta = True keydescr = keydescr[3:] elif keydescr in escape_sequence_to_special_key: keydescr = escape_sequence_to_special_key[keydescr] elif lkeyname.startswith('meta-'): keyinfo.meta = True keydescr = keydescr[5:] elif lkeyname.startswith('alt-'): keyinfo.meta = True keydescr = keydescr[4:] elif lkeyname.startswith('shift-'): keyinfo.shift = True keydescr = keydescr[6:] else: if len(keydescr) > 1: if keydescr.strip().lower() in validkey: keyinfo.keyname=keydescr.strip().lower() keyinfo.char="" else: raise IndexError("Not a valid key: '%s'"%keydescr) else: keyinfo.char=keydescr return keyinfo if __name__=="__main__": import startup