Linux. wmctrl возвращает неверный размер gedit
Я нашел странную вещь, используя wmctrl
утилита, чтобы получить размер окна, запустив wmctrl -lG
, Я обнаружил, что размер окна Gedit неверен. Я равнял размеры Терминала и окна Гедит, однако wmctrl
показал разные размеры для этих окон.
Я использую Ubuntu 16.04 с xfce DE, но ту же проблему я заметил в Centos 7. Не могли бы вы объяснить, почему wmctrl
показывает неверный размер окна Gedit?
1 ответ
GEdit использует клиентские "оконные декорации", где заголовок окна и границы рисуются самой программой, а GNOME Terminal использует "традиционные" серверные декорации, которые применяются оконным менеджером. (Обратите внимание, что в заголовке GEdit есть необычные дополнительные кнопки; у Nautilus также есть панель пути; у Epiphany даже есть редактируемая адресная строка; и т. Д. Это все окна CSD.)
Это вводит два различия:
Декорации на стороне клиента, т.е. заголовок и границы GEdit, являются неотъемлемой частью окна и соответственно расширяют его границы, но декорации на стороне сервера Терминала - нет, они представляют собой особый вид "окна" сами по себе и просто окружите окно приложения. Чтобы учесть это, всякий раз, когда оконный менеджер добавляет украшения к окну, он также устанавливает свойство _NET_FRAME_EXTENTS, содержащее их измерения.
Но wmctrl не проверяет это свойство и не добавляет экстенты оформления окна на стороне сервера к указанному размеру окна, поэтому приложение, использующее SSD (Терминал), перечислено меньше, чем оно есть на самом деле.
В архитектуре CSD, используемой GNOME, окружающие тени также рисуются самим приложением, и границы окна соответственно расширяются. Области, содержащие тени, являются сквозными и полупрозрачными, но они все еще являются частью окна и не могут быть легко различимы. Чтобы учесть это, само приложение устанавливает другое свойство окна, _GTK_FRAME_EXTENTS.
$ xprop | grep EXTENT<щелкните окно GEdit>_GTK_FRAME_EXTENTS (CARDINAL) = 26, 26, 23, 29
Когда приложение, использующее CSD (GEdit), запускается в GNOME Shell и рисует эти дополнительные тени, оконный менеджер считывает эти значения, чтобы оставаться в состоянии правильно "привязать" и "разложить" окно, несмотря на его увеличенные размеры.
Но wmctrl не вычитает их экстенты из показанного размера окна, поэтому окно отображается больше, чем оно есть на самом деле.
(Обратите внимание, что это не единственная возможная реализация CSD. Например, Chrome также использует клиентские декорации, но не добавляет теней и не должен указывать "экстенты", как GTK3. Вместо этого окна надевают вообще не имеет альфа-канала, что позволяет оконному менеджеру применять его самостоятельно.)