Что вызывает отклонение в команде перемещения окна wmctrl

13

О 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не должно перемещать окно, но это делает

введите описание изображения здесь

введите описание изображения здесь

Якоб Влейм
источник
Моим «нелепым» решением было сохранить текущие координаты, перейти к этим координатам, получить новые координаты, вычесть сохраненные координаты, чтобы получить различия. Затем примените различия к исходным координатам и перейдите к скорректированным координатам. Это проще, чем кажется.
WinEunuuchs2Unix

Ответы:

18

Что происходит, так это то, что 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 совет в комментариях

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4
Daxx
источник
Это выглядит как отличный ответ! Я рассмотрю его детали сегодня вечером.
Джейкоб Влейм
Насколько я понимаю, вывод xdotool selectwindowесть 25166060, но какой шаг, чтобы добраться 0x18000ec? Я попытался преобразование из шестнадцатеричного, но это не так.
Джейкоб Влейм
Выходные данные xdotool getwindowgeometry 0x18000ecвозвращают десятичный идентификатор окна 25166060 (родительский). Я просто ввел шестнадцатеричное значение 0x18000ec, чтобы показать, что это не 0x04000040 (дочерний элемент). Кстати, я просто перезапустил весь тест с более простыми цифрами в надежде, что вы не искали. Смотрите предыдущую правку редактирования, если вы были в середине чего-то.
Дакс
2
@JacobVlijm, xpropкажется, показывает декоративную прокладку: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6и _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Это может помочь проверить.
user.dz
Возможно ли, что xdotool selectwindowкоманда ведет себя по-разному в KDE и Unity? Вывод xdotool selectwindowкоманды относится к точно такому же окну (-id) и (таким образом) xdotool getwindowgeometryвыводит те же данные, что и wmctrl -lG. Однако xpropкоманда, как предлагает @Sneetsher, показывает _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0, что это именно то, что я измерил вручную, и доказывает, что суть вашего ответа верна, и это идеальный ответ на мой вопрос. Я впечатлен вашей тщательностью. Спасибо!
Якоб Влейм
0

У меня была такая же проблема, и я мог найти обходной путь.


ситуация

Моя ситуация основана на 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()

Затем вы можете отключить оформление окон, переместить окно и включить оформление окон.

Секст Эмпирик
источник