【发布时间】:2010-09-20 03:43:48
【问题描述】:
有人知道如何从 Xserver 中获取所有打开窗口的列表吗?
【问题讨论】:
有人知道如何从 Xserver 中获取所有打开窗口的列表吗?
【问题讨论】:
您可以在 CLI 中使用
xwininfo -tree -root
如果您需要在自己的代码中执行此操作,则需要使用 Xlib 库中的 XQueryTree 函数。
【讨论】:
如果您的窗口管理器实现了 EWMH 规范,您还可以查看根窗口的 _NET_CLIENT_LIST 值。这是由大多数现代窗口管理器设置的:
xprop -root|grep ^_NET_CLIENT_LIST
该值可以通过编程轻松获得,请参阅您的 Xlib 文档!
【讨论】:
基于Marten's answer,(假设您的窗口管理器支持E扩展Window Manager Hints) 您可以将该窗口 ID 列表反馈回 xprop 以获取 _NET_WM_NAME 属性:
$ xprop -root _NET_CLIENT_LIST |
pcregrep -o1 '# (.*)' |
sed 's/, /\n/g' |
xargs -I{} -n1 xprop -id {} _NET_WM_NAME
但是在命令行中,使用wmctrl会更容易:
$ wmctrl -l
以编程方式,使用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)
或者,更好的是,使用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))
【讨论】:
window_manager_manager 对象名称缩写为 wm。此外,我在 xlib 示例行 property_type=AnyPropertyType 上收到一个错误,该错误为:TypeError: get_full_property() got an unexpected keyword argument 'property_type'
python-xlib?在任何情况下,如果您只是删除 property_type= 部分,它应该可以用作位置参数。