X11 - 如何使用Python引发另一个应用程序的窗口

时间:2010-04-20 15:33:12

标签: python x11

我希望能够使用Python提升另一个应用程序的窗口。

我确实看到了这一点,我想我可以尝试一下:

X11: raise an existing window via command line?

但是,如果可能的话,我宁愿用Python来做。

3 个答案:

答案 0 :(得分:6)

要激活另一个窗口,在Xlib协议层上正确的做法是发送_NET_ACTIVE_WINDOW消息,如EWMH规范中所述 http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html

这可以通过python-xlib(推测)或gdk_window_focus()在外国GdkWindow上使用GDK通过pygtk来完成

_NET_ACTIVE_WINDOW优于XRaiseWindow(),多年来一直在所有重要的WM中。

你应该避免XSetInputFocus(),这会导致问题(特别是如果你的时间戳错误)。问题是WM无法拦截SetInputFocus(),因此会导致奇怪的竞争条件和UI不一致。

真的只有_NET_ACTIVE_WINDOW正常工作,这就是为什么它被发明了,因为以前的黑客攻击都很糟糕。

有一个名为libwnck的库可以让你激活windows(除其他外),但不幸的是它增加了很多开销,因为它总是跟踪任何应用程序中的所有打开的窗口,即使你不需要这样做。但是,如果你想跟踪来自其他应用的窗口,那么libwnck有一个功能来激活那些做正确事情的窗口,并且是一个不错的选择。

严格正确的方法是检查EWMH _NET_ACTIVE_WINDOW支持(EWMH文档如何执行此操作),如果WM没有_NET_ACTIVE_WINDOW,则回退到XRaiseWindow。但是,由于过去多年来积极开展工作的任何WM都有EWMH,很多人对遗留WM的后备很懒惰。

答案 1 :(得分:5)

您可以查看the python ewmh packageDocumentation包含示例,但以下是如何实现您的目标:

from ewmh import EWMH
import random
ewmh = EWMH()

# get every displayed windows
wins = ewmh.getClientList()

# let's active one window randomly
ewmh.setActiveWindow(random.choice(wins))

# flush requests - that's actually do the real job
ewmh.display.flush()

答案 2 :(得分:4)

您需要使用python-xlib并在窗口对象上调用.circulate(Xlib.X.RaiseLowest)(可以通过许多不同方式识别 - 无法从零数量中猜出哪一个适合您关于它的信息在你的Q ;-)。有关使用python-xlib的一个很好的示例,请查看tinywm窗口管理器 - 在C版本之后,作者提供了一个Python版本,该版本需要大约30个非空白,非注释行(用于可用,如果很小,窗口管理器 ......! - )。