如何从xserver获取打开的窗口列表

ken*_*der 38 x11 xserver

任何人都知道如何从Xserver获取所有打开的窗口列表?

Aln*_*tak 87

从CLI可以使用

xwininfo -tree -root
Run Code Online (Sandbox Code Playgroud)

如果你需要在你自己的代码中做到这一点,那么你需要使用XQueryTree函数从Xlib库.


Mar*_*ten 17

您还可以查看_NET_CLIENT_LIST根窗口的值.这是由大多数现代窗口管理器设置的:

xprop -root|grep ^_NET_CLIENT_LIST
Run Code Online (Sandbox Code Playgroud)

可以通过编程方式轻松获取该值,请参阅Xlib文档!

  • 我喜欢这个; 它始终比xwininfo或xdotool快(尽管xdotool可以轻松排除可见窗口)。 (2认同)

Chr*_*rty 8

建设关貂的回答,(假设你的窗口管理器支持Ë xtended W¯¯ indow中号anager ^ h整数),你可以喂窗口ID的该列表返回到xprop拿到_NET_WM_NAME属性:

$ xprop -root _NET_CLIENT_LIST |
    pcregrep -o1 '# (.*)' |
    sed 's/, /\n/g' |
    xargs -I{} -n1 xprop -id {} _NET_WM_NAME
Run Code Online (Sandbox Code Playgroud)

但是在命令行中,使用起来会更容易wmctrl

$ wmctrl -l
Run Code Online (Sandbox Code Playgroud)

以编程方式,使用python-xlib,您可以执行相同的操作:

#!/usr/bin/env python
from Xlib.display import Display
from Xlib.X import AnyPropertyType

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

_NET_CLIENT_LIST = display.get_atom('_NET_CLIENT_LIST')
_NET_WM_NAME = display.get_atom('_NET_WM_NAME')

client_list = root.get_full_property(
    _NET_CLIENT_LIST,
    property_type=AnyPropertyType,
).value

for window_id in client_list:
    window = display.create_resource_object('window', window_id)
    window_name = window.get_full_property(
        _NET_WM_NAME,
        property_type=AnyPropertyType,
    ).value
    print(window_name)
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,使用EWMH库:

#!/usr/bin/env python
from ewmh import EWMH

window_manager_manager = EWMH()
client_list = window_manager_manager.getClientList()

for window in client_list:
    print(window_manager_manager.getWmName(window))
Run Code Online (Sandbox Code Playgroud)