Пример #1
0
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
Пример #2
0
 def query_pointer(self):
     return request.QueryPointer(display=self.display, window=self.id)
Пример #3
0
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