X11: список окон верхнего уровня
Пока я нашел два подхода:
Для каждого корневого окна (экран по умолчанию, определенный экран, все экраны и т. Д.) Перечислите каждого непосредственного дочернего элемента. Поиск каждого непосредственного ребенка рекурсивно для окна с
WM_STATE
имущество; это окно становится окном приложения верхнего уровня непосредственного потомка, и вся рекурсия может быть остановлена. Если ни одно окно в иерархии непосредственного потомка не имеетWM_STATE
свойство, предположим, что непосредственный потомок сам является окном приложения верхнего уровня.использование
xcb_get_property
, а такжеxcb_query_tree
(который, несмотря на название, перечисляет только непосредственных детей).Это то, что xlsclients использует через XCB (тот же алгоритм, что и выше, более или менее).
Требования: требуется поддержка ICCCM (оконного менеджера) для
WM_STATE
,
Для каждого корневого окна (экран по умолчанию, определенный экран, все экраны и т. Д.) Получите свойство "_NET_CLIENT_LIST", в котором перечислены все окна приложений верхнего уровня, управляемые диспетчером окон.
использование
xcb_get_property
,Это то, что использует wmctrl через Xlib.
Требуется оконный менеджер для ведения списка. Некоторые окна, кажется, выходят из списка.
Требования: поддержка EWMH (оконный менеджер) для
_NET_CLIENT_LIST
или же_WIN_CLIENT_LIST
(Я понятия не имею, что такое второй; я не могу найти никакой документации).
Вопросы:
Есть ли другие подходы? Существуют ли какие-либо подходы, которые не зависят от внешних механизмов, таких как ICCCM или EWMH?
Какой подход является наиболее устойчивым?
- EWMH. Я нашел несколько отчетов (ссылка выше) о том, что некоторые приложения не отображаются в списке
_NET_CLIENT_LIST
, Почему это? - ICCCM. Этот подход кажется более гибким, но в противном случае приложения без окон не будут сопоставлены, если предположить, что непосредственный дочерний элемент иерархии отсутствует
WM_STATE
такое окно приложения верхнего уровня? Хуже того, разве он не сломается ужасно под виртуальными корневыми окнами? Например, виртуальное корневое окно становится единственным непосредственным дочерним элементом, и рекурсия остановится в первом окне приложения сWM_STATE
; будет сопоставлено только одно окно. Против этой возможности,xlsclients
не включает никаких проверок для виртуальных корневых окон... так почему он работает с GNOME (который использует виртуальные корневые окна)?
- EWMH. Я нашел несколько отчетов (ссылка выше) о том, что некоторые приложения не отображаются в списке