from main import KeyboardHandler import threading import thread import pyatspi def parse(s): """parse a string like control+f into (modifier, key). Unknown modifiers will return ValueError.""" m = 0 lst = s.split('+') if not len(lst): return (0, s) #Are these right? d = { "shift": 1< 1: #more than one key, parse error raise ValueError, 'unknown modifier %s' % lst[0] return (m, lst[0].lower()) class AtspiThread(threading.Thread): def run(self): pyatspi.Registry.registerKeystrokeListener(handler, kind=(pyatspi.KEY_PRESSED_EVENT,), mask=pyatspi.allModifiers()) pyatspi.Registry.start() #the keys we registered keys = {} def handler(e): m,k = e.modifiers,e.event_string.lower() #not sure why we can't catch control+f. Try to fix it. if (not e.is_text) and e.id >= 97 <= 126: k = chr(e.id) if (m,k) not in keys: return False thread.start_new(keys[(m,k)], ()) return True #don't pass it on class LinuxKeyboardHandler(KeyboardHandler): def __init__(self, *args, **kwargs): KeyboardHandler.__init__(self, *args, **kwargs) t = AtspiThread() t.start() def register_key(self, key, function): """key will be a string, such as control+shift+f. We need to convert that, using parse_key, into modifier and key to put into our dictionary.""" #register key so we know if we have it on event receive. t = parse(key) keys[t] = function #if we got this far, the key is valid. KeyboardHandler.register_key(self, key, function) def unregister_key (self, key, function): KeyboardHandler.unregister_key(self, key, function) del keys[parse(key)]