Как получить список открытых окон из xserver

Кто-нибудь понял, как получить из Xserver список всех открытых окон?

2 ответа

Решение

Из CLI вы можете использовать

xwininfo -tree -root

Если вам нужно сделать это в вашем собственном коде, то вам нужно использовать XQueryTree функция от Xlib библиотека.

Вы также можете взглянуть на _NET_CLIENT_LIST значение корневого окна. Это устанавливается большинством современных оконных менеджеров:

xprop -root|grep ^_NET_CLIENT_LIST

Это значение можно легко получить программным способом, см. Документацию Xlib!

Строительство прочь ответа Мартена, (предполагая, что ваш оконный менеджер поддерживает E Xtended W indow M anager H INTS) вы можете подать этот список оконных идентификаторов обратно в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))
Другие вопросы по тегам