循环通过 X11 windows python-xlib

问题描述

我正在尝试遍历 python-xlib 窗口对象列表,以便在显示器上设置它们的相对堆叠顺序。我的目标是通过抓取窗口的选择列表,然后相对于某个顺序堆叠它们,为彼此堆叠的窗口呈现一种轮播查看键盘快捷键。但是到目前为止,我只能向前/向后推动当前活动窗口。

Q: 如何遍历这些窗口以设置它们的相对顺序,然后将这些窗口绘制到显示器上?备用解决方案可能是将活动焦点推送到这些窗口之一,但我也无法使其正常工作。

以下是相关的代码片段。可以在 https://github.com/1mikegrn/snappyzones/tree/cycle_windows/src/snappyzones

找到完整的项目源代码
def active_window(display,window_id=None):
    if not window_id:
        window_id = (
            display.screen()
            .root.get_full_property(
                display.intern_atom("_NET_ACTIVE_WINDOW"),X.AnyPropertyType
            )
            .value[0]
        )
    try:
        return display.create_resource_object("window",window_id)
    except XError:
        return None


def cycle_windows(self,keysym):
    try:
        display = display()
        window = active_window(display).query_tree().parent.query_tree().parent
        root = display.screen().root
        tree = root.query_tree()

        stack = [
            item
            for item in tree.children
            if all(
                getattr(item.get_geometry(),x) == getattr(window.get_geometry(),x)
                for x in ("x","y","width","height")
            )
        ]

        if keysym == XK.XK_Up:
            item = active_window(display,stack[0].id)
            item.configure(stack_mode=X.Below)
            display.set_input_focus(stack[1],X.RevertToParent,X.CurrentTime)

        elif keysym == XK.XK_Down:
            item = active_window(display,stack[-1].id)
            item.configure(stack_mode=X.Above)

        display.sync()
    except BadWindow as e:
        print(e)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)