Что вызывает отклонение в команде перемещения окна wmctrl
О wmctrl
С wmctrl
(не устанавливается по умолчанию), мы можем получить информацию об окнах, их идентификаторе, их геометрии, pid, к которому они принадлежат и т. д. Мы также можем перемещать или изменять размеры окон с помощью нескольких команд. Однако в некоторых отношениях его поведение кажется нелогичным. Мой вопрос о перемещении окон wmctrl
:
Получение информации
Когда я запускаю команду:
wmctrl -lG
Я получаю (ao) следующую информацию об окне на картинке (-ах) ниже:
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
не должен двигать окно, но это делает
2 ответа
Что происходит, так это то, что wmctrl возвращает геометрию окна внутри декораций (т.е. не включая строку заголовка и границы), но использует для перемещения более крупную позицию окна.
(Некоторые строки вывода команд удалены: xdotool
может не быть установлен)
$ wmctrl -lG
0x04000040 0 702 23 900 950 KMatrix dave@KMatrix: test – Konsole
$ xdotool getwindowgeometry 0x04000040
Window 67108928
Position: 702,23 (screen: 0)
Geometry: 900x950
Следующая команда запрашивает интересующее окно и возвращает родительское окно, которое включает в себя все декорации и изменяется в зависимости от используемой темы окна.
$ xdotool selectwindow
25166060
$ xdotool getwindowgeometry 0x18000ec
Window 25166060
Position: 700,0 (screen: 0)
Geometry: 904x977
Как видите, это другое окно; позиция X начинается на 2 пикселя влево (702-2), а общая ширина увеличивается на 4 пикселя (900+2+2), потому что правая граница также составляет 2 пикселя. Y выше (выше верхней границы, если есть, и строки заголовка); высота больше из-за всего этого плюс нижняя граница.
wmctrl перемещает родительское окно в желаемую позицию [X,Y] дочернего окна; Ширина и высота правильно применяются к ребенку, как показано в разделе "до и после" ниже.
$ wmctrl -lG
0x04000040 0 702 23 900 950 KMatrix dave@KMatrix: test – Konsole
$ xdotool getwindowgeometry 0x18000ec # (PARENT)
Window 25166060
Position: 700,0 (screen: 0)
Geometry: 904x977
$ xdotool getwindowgeometry 0x04000040 # (CHILD)
Window 67108928
Position: 702,23 (screen: 0)
Geometry: 900x950
$ wmctrl -ir 0x04000040 -e 0,702,23,900,950 # <----- "MOVE/RESIZE" *****
$ wmctrl -lG
0x04000040 0 704 46 900 950 KMatrix dave@KMatrix: test – Konsole
$ xdotool getwindowgeometry 0x18000ec # (PARENT)
Window 25166060
Position: 702,23 (screen: 0) <----- Desired [X,Y] applied to parent
Geometry: 904x977
$ xdotool getwindowgeometry 0x04000040 # (CHILD)
Window 67108928
Position: 704,46 (screen: 0)
Geometry: 900x950 <----- Desired [W,H] applied to child
Редактировать: дополнительная информация.
Геометрия рабочего стола, область просмотра и рабочая область
$ wmctrl -d # (KDE)
0 * DG: 1680x1050 VP: 0,0 WA: 0,0 1680x1015 Desktop 1
$ xdotool -v
xdotool version 3.20140217.1
https://github.com/jordansissel/xdotool
Re: @Sneetsher tip в комментариях
$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4
У меня была такая же проблема, и я мог найти обходной путь.
ситуация
Моя ситуация основана на Mate 16.04 с установленным Compiz (который активирует оконный менеджер gtk)
Я использую скрипт, связанный с привязками клавиш, чтобы разместить окна в предопределенных местах. Этот скрипт завершается ошибкой, если я не использую опцию максимизации.
Анализ
Проблема может быть включена и выключена включением и украшением окон в настройках (compiz).
Временное решение
Оформление окна можно включать и выключать с помощью python для конкретного окна (при использовании сочетаний клавиш удобно использовать активное окно).
#!/usr/bin/python
from gtk.gdk import *
import gtk.gdk
import time
import sys
w = gtk.gdk.get_default_root_window().get_screen().get_active_window()
w.set_decorations(0) #use 1 to turn on decorations
window_process_all_updates()
gtk.gdk.flush()
Затем вы можете отключить оформление окон, переместить окно и включить оформление окон.