class Keymap(object): bindings = {} def __init__(self, conn, keys=None): if keys is None: keys = {} self.numlockmask = get_numlock_mask(conn) self.syms = Keysyms(conn) for keystr in keys: self.bind(keystr, keys[keystr]) def bind(self, keystr, action): key = parse(keystr) self.bindings[key] = action print "bound %s" % keystr def grab(self, conn, root): modifiers = [ 0, ModMask.Lock, self.numlockmask, self.numlockmask | ModMask.Lock ] for key in self.bindings: for mod in modifiers: keycode = self.syms.get_keycode(key[1]) conn.core.GrabKey(True, root, key[0] | mod, keycode, GrabMode.Async, GrabMode.Async) def ungrab(self, conn, root): modifiers = [ 0, ModMask.Lock, self.numlockmask, self.numlockmask | ModMask.Lock ] for key in self.bindings: for mod in modifiers: conn.core.UngrabKey(key[1], root, key[0] | mod) def handle(self, **kw): keypress = kw['event'] keysym = self.syms.get_keysym(keypress.detail, 0) mask = self.cleanmask(keypress.state) for key in self.bindings: if mask == self.cleanmask(key[0]) and keysym == key[1]: self.bindings[key]() def cleanmask(self, mask): return mask & ~(self.numlockmask | ModMask.Lock)
class Keymap(object): bindings = {} def __init__(self, conn, keys=None): if keys is None: keys = {} self.numlockmask = get_numlock_mask(conn) self.syms = Keysyms(conn) for keystr in keys: self.bind(keystr, keys[keystr]) def bind(self, keystr, action): key = parse(keystr) self.bindings[key] = action print "bound %s" % keystr def grab(self, conn, root): modifiers = [0, ModMask.Lock, self.numlockmask, self.numlockmask | ModMask.Lock] for key in self.bindings: for mod in modifiers: keycode = self.syms.get_keycode(key[1]) conn.core.GrabKey(True, root, key[0] | mod, keycode, GrabMode.Async, GrabMode.Async) def ungrab(self, conn, root): modifiers = [0, ModMask.Lock, self.numlockmask, self.numlockmask | ModMask.Lock] for key in self.bindings: for mod in modifiers: conn.core.UngrabKey(key[1], root, key[0] | mod) def handle(self, **kw): keypress = kw['event'] keysym = self.syms.get_keysym(keypress.detail, 0) mask = self.cleanmask(keypress.state) for key in self.bindings: if mask == self.cleanmask(key[0]) and keysym == key[1]: self.bindings[key]() def cleanmask(self, mask): return mask & ~(self.numlockmask | ModMask.Lock)