您需要使用python-xlib并调用.circulate(Xlib.X.RaiseLowest)window 对象(可以通过许多不同的方式识别它——无法从 Q 中关于它的零信息中猜测哪一个适合您;-) . 对于使用 的一个很好的例子python-xlib,请查看tinywm窗口管理器——在 C 版本之后,作者给出了一个 Python 版本,它需要大约 30 行非空白、非注释行(对于一个可用的,如果很小的窗口管理器.. .!-)
要激活另一个窗口,在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的库可以让你激活windows(除其他外),但不幸的是它增加了很多开销,因为它总是跟踪任何应用程序中的所有打开的窗口,即使你不需要这样做.但是,如果你想跟踪从其他应用程序窗口无论如何,然后libwnck具有的功能,以激活那些做正确的事的窗口和将是一个不错的选择.
严格正确的方法是检查EWMH _NET_ACTIVE_WINDOW支持(EWMH文档如何执行此操作),如果WM没有_NET_ACTIVE_WINDOW,则回退到XRaiseWindow.但是,由于过去多年来积极开展工作的任何WM都有EWMH,很多人都对传统WM的后备很懒.
小智 5
你可以看看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()
Run Code Online (Sandbox Code Playgroud)