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

8
3个回答

9
为了激活另一个窗口,在Xlib协议层上正确的做法是发送_NET_ACTIVE_WINDOW消息,如EWMH规范所述。 http://standards.freedesktop.org/wm-spec/wm-spec-1.3.html 这可以通过python-xlib(可能)或使用GDK通过pygtk在外部GdkWindow上使用gdk_window_focus()来完成。
_NET_ACTIVE_WINDOW优于XRaiseWindow(),并且已经存在于所有重要的WM中多年。
应避免使用XSetInputFocus(),因为它会导致问题(特别是如果您的时间戳不正确)。问题在于WM无法拦截SetInputFocus(),因此会导致奇怪的竞争条件和UI不一致性。
真正有效的方法只有_NET_ACTIVE_WINDOW,这就是为什么它被发明的原因,因为以前的黑客攻击很糟糕。
有一个名为libwnck的库,可以让您激活窗口(以及其他事情),但不幸的是它会增加相当多的开销,因为它始终跟踪来自任何应用程序的所有打开窗口,即使您不需要这样做。但是,如果您想要跟踪其他应用程序的窗口,那么libwnck具有激活这些窗口的函数,可以做正确的事情,并且是一个很好的选择。
严格正确的方法是检查EWMH _NET_ACTIVE_WINDOW支持(EWMH文档如何执行此操作),并在WM没有_NET_ACTIVE_WINDOW时回退到XRaiseWindow。但是,由于过去许多年来一直在积极开发的任何WM都具有EWMH,因此许多人对传统WM的回退不太关心。

这个链接实际上并没有展示如何在Python中使用_NET_ACTIVE_WINDOW... - WinEunuuchs2Unix

7
您可以查看Python EWMH包文档中包含示例,但这是您可以实现您想要的方式:
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()

6
你需要使用python-xlib,并在窗口对象上调用.circulate(Xlib.X.RaiseLowest)(可以通过许多不同的方式来识别窗口对象--无法从你的问题中获得任何关于它的信息,因此无法猜测哪一个是适合你的;-)。如果想要了解如何使用python-xlib,请查看tinywm窗口管理器的示例--作者在C版之后提供了一个Python版本,只需大约30行非空白、非注释代码(用于一个可用的、虽小但却有用的窗口管理器...!-)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接