def do_key_press(keys, target=None): """ executes a keypress :param keys: argument tuple containing one or several modifier keys, and the key to press :param target: list containing name(s) of the target window the key to pass as a parameter has to be taken from Xlib.XK library """ log.debug("do_key_press") root = disp.screen().root keys = map( lambda k: XK.string_to_keysym(k) if isinstance(k, basestring) else k, keys) for key in keys: if not key in XK.__dict__.values(): return False pointer_info = request.QueryPointer(display=disp.display, window=root) root_xpos, root_ypos = (pointer_info._data['root_x'], pointer_info._data['root_y']) targetwindow = disp.get_input_focus().focus if targetwindow.get_wm_name() is None and targetwindow.get_wm_class( ) is None: targetwindow = targetwindow.query_tree().parent ret = targetwindow.translate_coords(root, root_xpos, root_ypos) target_xpos = ret.x target_ypos = ret.y if target and targetwindow.get_wm_class(): for t in target: if t in targetwindow.get_wm_class(): break else: log.info("Window '%s' not found in target(s) %s" % (targetwindow.get_wm_class(), target)) return False def send_key(display, window, keycodes): '''Send a KeyPress and KeyRelease event''' if not type(keycodes) in (tuple, list): keycodes = (keycodes, ) # send with modifier for keycode in keycodes: xtest.fake_input(window, X.KeyPress, display.keysym_to_keycode(keycode)) for keycode in reversed(keycodes): xtest.fake_input(window, X.KeyRelease, display.keysym_to_keycode(keycode)) display.sync() send_key(disp, root, keys) return True
def query_pointer(self): return request.QueryPointer(display=self.display, window=self.id)
def do_mouse_click(button, target=None): """ executes mouse button click :param button: X.Button1, X.Button2 or X.Button3 depending on which button to be triggered :param target: list containing name(s) of the target window """ log.debug("do_mouse_click") root = disp.screen().root pointer_info = request.QueryPointer(display=disp.display, window=root) root_xpos, root_ypos = (pointer_info._data['root_x'], pointer_info._data['root_y']) targetwindow = disp.get_input_focus().focus if isinstance(button, basestring): if button is "Button1": button = X.Button1 elif button is "Button2": button = X.Button2 elif button is "Button3": button = X.Button3 else: return False elif not button in (X.Button1, X.Button2, X.Button3): return False if targetwindow.get_wm_name() is None and targetwindow.get_wm_class( ) is None: targetwindow = targetwindow.query_tree().parent ret = targetwindow.translate_coords(root, root_xpos, root_ypos) target_xpos = ret.x target_ypos = ret.y if target: for target in target: if target in targetwindow.get_wm_class(): break else: return False myevent_press = protocol.event.ButtonPress(detail=button, root=root, root_x=root_xpos, root_y=root_ypos, window=targetwindow.id, event_x=target_xpos, event_y=target_ypos, same_screen=1, state=0, time=X.CurrentTime, child=0) myevent_release = protocol.event.ButtonRelease(detail=button, root=root, root_x=root_xpos, root_y=root_ypos, window=targetwindow.id, event_x=target_xpos, event_y=target_ypos, same_screen=1, state=0, time=X.CurrentTime, child=0) # use window instead of display (xobject/drawable.py:send_event) disp.send_event(X.InputFocus, myevent_press, event_mask=0, propagate=1) # use window instead of display (xobject/drawable.py:send_event) disp.send_event(X.InputFocus, myevent_release, event_mask=0, propagate=1) disp.sync() return True