Що викликає відхилення в команді переміщення вікна wmctrl


13

Про wmctrl

За допомогою wmctrl(не встановлено за замовчуванням) ми можемо отримати інформацію про вікна, їх ідентифікатор, їх геометрію, номер, до якого вони належать тощо. Ми також можемо переміщувати або змінювати розмір вікон за допомогою кількох команд. Однак в деяких аспектах його поведінка здається не логічною. Моє запитання щодо переміщення вікон за допомогою 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 незрозуміло (панель високою 24 пікселів).

Хоча відхилення дуже добре можна компенсувати в сценаріях, той факт, що я не розумію причини, не задовольняє, тому питання:

Яка саме причина цього відхилення?


Переміщення вікна з точними координатами у висновку 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

Редагувати: додаткова інформація.

Геометрія робочого столу, Viewport & Workarea

$ 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

Це виглядає як відмінна відповідь! Я вивчу його деталі сьогодні ввечері.
Яків Влійм

на моє розуміння, результат xdotool selectwindowє 25166060, але який крок потрібно досягти 0x18000ec? Я спробував перетворення з шістнадцяткової, але, здається, це не так.
Яків Влійм

Вихід з xdotool getwindowgeometry 0x18000ecповертає ідентифікатор десяткового вікна 25166060 (батьківський). Я просто ввожу шістнадцяткове значення 0x18000ec, щоб показати, що це не 0x04000040 (дитина). До речі, я просто повторно пройшов цілий тест із легшими цифрами, сподіваючись, що ти не дивився. Дивіться попередню редакцію редагування, якщо ви опинилися в середині чогось.
Daxx

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()

Потім можна вимкнути прикраси вікон, перемістити вікно та увімкнути прикраси вікон.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.