def grab_mouse(self, modifiers, button, owner_events=False, window=None): # http://www.x.org/archive/X11R7.7/doc/man/man3/xcb_grab_button.3.xhtml wid = (window or self.root).wid event_mask = xcffib.xproto.EventMask.ButtonPress | \ xcffib.xproto.EventMask.ButtonRelease | \ xcffib.xproto.EventMask.Button1Motion modmask = get_modmask(modifiers) pointer_mode = xproto.GrabMode.Async # I don't know what it is keyboard_mode = xproto.GrabMode.Async # do not block other keyboard events confine_to = xcffib.xproto.Atom._None # do not restrict cursor movements cursor = xcffib.xproto.Atom._None # do not change cursor event = ("on_mouse", modmask, button) # event to be used in hooks self._conn.core.GrabButton( owner_events, wid, event_mask, pointer_mode, keyboard_mode, confine_to, cursor, button, modmask, ) self.flush() # TODO: do we need this? return event
def grab_key(self, modifiers, key, owner_events=False, window=None): """ Intercept this key when it is pressed. If owner_events=False then the window in focus will not receive it. This is useful from WM hotkeys. """ # TODO: check if key already grabbed? # Here is how X works with keys: # key => keysym => keycode # where `key' is something like 'a', 'b' or 'Enter', # `keysum' is what should be written on they key cap (physical keyboard) # and `keycode' is a number reported by the keyboard when the key is pressed. # Modifiers are keys like Shift, Alt, Win and some other buttons. self.log.grab_key.debug("intercept keys: %s %s" % (modifiers, key)) if window is None: window = self.root keycode = self.kbd.key_to_code(key) modmask = get_modmask(modifiers) # TODO: move to Keyboard event = ("on_key_press", modmask, keycode) pointer_mode = xproto.GrabMode.Async keyboard_mode = xproto.GrabMode.Async self._conn.core.GrabKey( owner_events, window.wid, modmask, keycode, pointer_mode, keyboard_mode ) self.flush() # TODO: do we need this? return event