【问题标题】:Python: how to switch between workspaces using Xlib?Python:如何使用 Xlib 在工作区之间切换?
【发布时间】:2010-03-09 00:10:23
【问题描述】:

如何使用带有 Xlib 模块的 Python 在窗口管理器的工作区之间切换?

这是我最有希望的尝试:

#!/usr/bin/python

from Xlib import X, display, error, Xatom, Xutil
import Xlib.protocol.event

screen = Xlib.display.Display().screen()
root   = screen.root


def sendEvent(win, ctype, data, mask=None):
        """ Send a ClientMessage event to the root """
        data = (data+[0]*(5-len(data)))[:5]
        ev = Xlib.protocol.event.ClientMessage(window=win, client_type=ctype, data=(32,(data)))

        if not mask:
            mask = (X.SubstructureRedirectMask|X.SubstructureNotifyMask)
        root.send_event(ev, event_mask=mask)


# switch to desktop 2
sendEvent(root, Xlib.display.Display().intern_atom("_NET_CURRENT_DESKTOP"), [2])

上面的代码是从PyPanel源码的各个地方无耻盗用的;不幸的是,它没有做任何事情,甚至没有产生警告/异常。我在这里遗漏了什么吗?

我正在使用 Python 和 PyGTK。 Xlib 似乎是切换桌面的正确选择。我不打算使用 wnck(有缺陷的 Python 模块)或类似的东西,但无论如何我都会很感激任何指针。

我可以补充一点,这是我第一次尝试使用 Xlib(或 PyGTK)编写 Python 应用程序。

【问题讨论】:

    标签: python window pygtk xlib


    【解决方案1】:

    显然您需要处理同一个 Display 对象,然后在最后处理 flush 它。比如:

    display = Xlib.display.Display()
    screen = display.screen()
    root = screen.root
    
    # ...
    
    sendEvent(root, display.intern_atom("_NET_CURRENT_DESKTOP"), [1, X.CurrentTime])
    display.flush()
    

    信用:a very similar thread 的想法(几乎可行)。

    附:顺便说一下,桌面编号是从0开始的。

    【讨论】:

    • 链接失效了,有没有关于这些的好纪录片?
    • @haxor789:对于这个特定的问题,请从EWMH spec 部分“根窗口属性(和相关消息)”开始。阅读该部分的开头段落(重要!),然后跳转到_NET_CURRENT_DESKTOP;这些解释了您需要做的什么怎么做python-xlib documentation,主要是“发送事件”和“事件类型→ClientMessage”部分。
    猜你喜欢
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    相关资源
    最近更新 更多