Python:如何使用Xlib切换工作区?

5 投票
1 回答
3060 浏览
提问于 2025-04-15 20:11

我想知道怎么用Python和Xlib模块在我的窗口管理器的工作区之间切换。

这是我目前最有希望的尝试:

#!/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应用程序。

1 个回答

5

显然,你需要在同一个显示对象上进行操作,然后在最后使用flush来刷新它。大概是这样的:

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

# ...

sendEvent(root, display.intern_atom("_NET_CURRENT_DESKTOP"), [1, X.CurrentTime])
display.flush()

致谢:这个想法来自于一个非常相似的讨论(几乎可以用)。

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

撰写回答