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 get_numlock_mask(conn): syms = Keysyms(conn) numlock = syms.get_keycode(keysyms['Num_Lock']) modmap = conn.core.GetModifierMapping().reply() for i in range(8): for j in range(modmap.keycodes_per_modifier): keycode = modmap.keycodes[i * modmap.keycodes_per_modifier + j] if keycode == numlock: return MASKS[i] return 0
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)