2016-04-27 7 views
0

Кто-нибудь знает, как определить, какие окна в приложении GTK являются «окнами верхнего уровня». Я имею в виду, что это окна, которые обычно приходят вместе с рамкой (которая включает заголовок и кнопку «Свернуть/максимизировать», а также красную кнопку «x»/закрыть) в любом общем диспетчере окон, например. подсказки текстовых инструментов не были бы окнами верхнего уровня, потому что они никогда не получат границы, тем не менее они все еще считаются окнами в x11 (или, по крайней мере, в GTK). У меня есть приложение GTK, работающее поверх xvfb без каких-либо оконных менеджеров, и я заметил, что каждое окно является прямым дочерним элементом корневого окна, по какой-то причине затрудняет поиск «окон верхнего уровня».Определить, является ли окно GTK в xlib подведомственным окном или окном верхнего уровня.

Спасибо!

+0

Во-первых, вы можете просто отслеживать, какое окно находится на верхнем уровне, или вы могли бы получить родительский вид любого виджета/окна, пока вы не достигнете последнего объекта окна. – oldtechaa

ответ

1

Всплывающее окно, как вы описываете, является окном верхнего уровня именно потому, что оно плавает над окном, которое генерирует всплывающее окно. Он не может быть ребенком, с тех пор он будет обрезаться.

То, что вы должны проверить, - это подсказки, данные диспетчеру окон, в частности, атом (ы) _NET_WM_WINDOW_TYPE. (см. this link at freedesktop.org или this one at gnome.org). То, что каждое приложение в эти дни делает (или должно делать), говорит диспетчеру окна «Эй, я окно типа X, пожалуйста, убедитесь, что я правильно оформлен». «Нормальное» окно для приложения должно установить свойство _NET_WM_WINDOW_TYPE_NORMAL, тогда как в меню будет _NET_WM_TYPE_POPUP_MENU, подсказка _NET_WM_TYPE_TOOLTIP и т. Д.

Несмотря на то, что вы не используете диспетчер окон, приложение по-прежнему будет устанавливать свойство, и вы все равно можете запросить его.

Обратите внимание, что окно может иметь несколько типов, хотя на практике это редко делается; цель заключалась в том, чтобы иметь предпочтительный тип окна, за которым следуют резервные типы (ы), если оконный менеджер не поддерживает ваш тип окна. Поэтому, если вы получаете список типов, вы должны проверить их все. Я не уверен, что есть способ определить, какой тип оконный менеджер использует в конечном итоге. По крайней мере, ваше «нормальное» окно должно иметь поддерживаемый тип.