X11: список окон верхнего уровня

Пока я нашел два подхода:

  1. Для каждого корневого окна (экран по умолчанию, определенный экран, все экраны и т. Д.) Перечислите каждого непосредственного дочернего элемента. Поиск каждого непосредственного ребенка рекурсивно для окна с WM_STATE имущество; это окно становится окном приложения верхнего уровня непосредственного потомка, и вся рекурсия может быть остановлена. Если ни одно окно в иерархии непосредственного потомка не имеет WM_STATE свойство, предположим, что непосредственный потомок сам является окном приложения верхнего уровня.

    • использование xcb_get_property, а также xcb_query_tree (который, несмотря на название, перечисляет только непосредственных детей).

    • Это то, что xlsclients использует через XCB (тот же алгоритм, что и выше, более или менее).

    • Требования: требуется поддержка ICCCM (оконного менеджера) для WM_STATE,

  2. Для каждого корневого окна (экран по умолчанию, определенный экран, все экраны и т. Д.) Получите свойство "_NET_CLIENT_LIST", в котором перечислены все окна приложений верхнего уровня, управляемые диспетчером окон.

    • использование xcb_get_property,

    • Это то, что использует wmctrl через Xlib.

    • Требуется оконный менеджер для ведения списка. Некоторые окна, кажется, выходят из списка.

    • Требования: поддержка EWMH (оконный менеджер) для _NET_CLIENT_LIST или же _WIN_CLIENT_LIST (Я понятия не имею, что такое второй; я не могу найти никакой документации).

Вопросы:

  1. Есть ли другие подходы? Существуют ли какие-либо подходы, которые не зависят от внешних механизмов, таких как ICCCM или EWMH?

  2. Какой подход является наиболее устойчивым?

    1. EWMH. Я нашел несколько отчетов (ссылка выше) о том, что некоторые приложения не отображаются в списке _NET_CLIENT_LIST, Почему это?
    2. ICCCM. Этот подход кажется более гибким, но в противном случае приложения без окон не будут сопоставлены, если предположить, что непосредственный дочерний элемент иерархии отсутствует WM_STATE такое окно приложения верхнего уровня? Хуже того, разве он не сломается ужасно под виртуальными корневыми окнами? Например, виртуальное корневое окно становится единственным непосредственным дочерним элементом, и рекурсия остановится в первом окне приложения с WM_STATE; будет сопоставлено только одно окно. Против этой возможности, xlsclients не включает никаких проверок для виртуальных корневых окон... так почему он работает с GNOME (который использует виртуальные корневые окна)?

0 ответов

Другие вопросы по тегам