О wmctrl
С помощью wmctrl
(не установлено по умолчанию) мы можем получить информацию об окнах, их идентификаторе, их геометрии, pid, к которому они принадлежат и т. Д. Мы также можем перемещать или изменять размеры окон с помощью нескольких команд. Однако в некоторых отношениях его поведение кажется нелогичным. Мой вопрос о перемещении окон wmctrl
:
Получение информации
Когда я запускаю команду:
wmctrl -lG
Я получаю (ао) следующую информацию об окне на картинке (-ах) ниже:
0x04200085 0 746 443 468 205 jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
В столбце 3-5 информация о геометрии сообщает нам координаты x / y и ширину / высоту.
Перемещение / изменение размера окна
Когда я помещаю эти координаты в wmctrl
команду для перемещения / изменения размера окна, это ничего не должно делать, так как координаты неизменны:
wmctrl -ir 0x04200085 -e 0,746,443,468,205
Отклонение
Тем не менее, на рисунках ниже показано, что окно перемещено вниз (если быть точным, 28 пикселей). Я предположил, что причина была в том, что команда wmctrl
перемещения окна рассчитывалась по рабочей области (экран минус высота панели), а wmctrl -lG
команда рассчитывалась по общему размеру экрана . Тогда все еще 4px необъяснимо однако (панель 24px высотой).
Хотя в сценариях отклонение вполне можно компенсировать, тот факт, что я не понимаю причину, не удовлетворяет, поэтому возникает вопрос:
В чем именно причина этого отклонения?
Перемещение окна с точными координатами в выходных данных wmctrl -lG
не должно перемещать окно, но это делает
источник
Ответы:
Что происходит, так это то, что wmctrl возвращает геометрию окна внутри декораций (т.е. не включая строку заголовка и границы), но использует для перемещения большую позицию окна.
(Некоторые строки вывода команд удалены:
xdotool
возможно, не установлены)Следующая команда запрашивает интересующее окно и возвращает родительское окно, которое включает в себя все декорации и изменяется в зависимости от используемой темы окна.
Как видите, это другое окно; позиция X начинается на 2 пикселя влево (702-2), а общая ширина увеличивается на 4 пикселя (900 + 2 + 2), потому что правая граница также составляет 2 пикселя. Y выше (выше верхней границы, если есть, и строки заголовка); высота больше из-за всего этого плюс нижняя граница.
wmctrl перемещает родительское окно в желаемую позицию [X, Y] дочернего окна; Ширина и высота правильно применяются к ребенку, как показано в разделе «до и после» ниже.
Редактировать: дополнительная информация.
Геометрия рабочего стола, область просмотра и рабочая область
https://github.com/jordansissel/xdotool
Re: @Sneetsher совет в комментариях
источник
xdotool selectwindow
есть25166060
, но какой шаг, чтобы добраться0x18000ec
? Я попытался преобразование из шестнадцатеричного, но это не так.xdotool getwindowgeometry 0x18000ec
возвращают десятичный идентификатор окна 25166060 (родительский). Я просто ввел шестнадцатеричное значение 0x18000ec, чтобы показать, что это не 0x04000040 (дочерний элемент). Кстати, я просто перезапустил весь тест с более простыми цифрами в надежде, что вы не искали. Смотрите предыдущую правку редактирования, если вы были в середине чего-то.xprop
кажется, показывает декоративную прокладку:_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6
и_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6
. Это может помочь проверить.xdotool selectwindow
команда ведет себя по-разному в KDE и Unity? Выводxdotool selectwindow
команды относится к точно такому же окну (-id) и (таким образом)xdotool getwindowgeometry
выводит те же данные, что иwmctrl -lG
. Однакоxprop
команда, как предлагает @Sneetsher, показывает_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
, что это именно то, что я измерил вручную, и доказывает, что суть вашего ответа верна, и это идеальный ответ на мой вопрос. Я впечатлен вашей тщательностью. Спасибо!У меня была такая же проблема, и я мог найти обходной путь.
ситуация
Моя ситуация основана на Mate 16.04 с установленным Compiz (который активирует оконный менеджер gtk)
Я использую сценарий, связанный с привязками клавиш, чтобы разместить окна в предопределенных местах. Этот скрипт завершается ошибкой, если я не использую опцию максимизации.
Анализ
Проблема может быть включена и выключена включением и украшением окон в настройках (compiz).
Временное решение
Оформление окна можно включать и выключать, используя python для конкретного окна (при использовании сочетаний клавиш удобно использовать активное окно).
Затем вы можете отключить оформление окон, переместить окно и включить оформление окон.
источник