Co powoduje odchylenie w poleceniu przesuwania okna wmctrl

13

Informacje o wmctrl

Za pomocą wmctrl(domyślnie nie instalowanego) możemy uzyskać informacje na temat okien, ich identyfikatora, geometrii, pid, do którego należą itp. Możemy także przenosić lub zmieniać rozmiar okien za pomocą kilku poleceń. Jednak pod niektórymi względami jego zachowanie nie wydaje się logiczne. Moje pytanie dotyczy przenoszenia okien przez wmctrl:

Zbierać informacje

Po uruchomieniu polecenia:

wmctrl -lG

Otrzymuję (ao) następujące informacje o oknie na poniższych obrazkach:

0x04200085  0 746  443  468  205  jacob-System-Product-Name Niet-opgeslagen document 1 - gedit

W kolumnie 3-5 informacje o geometrii mówią nam o współrzędnych x / y oraz szerokości / wysokości.

Przenoszenie / zmiana rozmiaru okna

Kiedy wstawię te współrzędne do wmctrlpolecenia przesunięcia / zmiany rozmiaru okna, nie powinno to nic robić, ponieważ współrzędne pozostają niezmienione:

wmctrl -ir 0x04200085 -e 0,746,443,468,205

Odchylenie

Jednak poniższe zdjęcia pokazują, że okno jest przesuwane w dół (a dokładniej 28 pikseli). Założyłem, że powodem było to, że polecenie wmctrl przesunięcia okna obliczono na podstawie obszaru roboczego (ekran minus wysokość panelu), a wmctrl -lGpolecenie obliczono na podstawie całkowitego rozmiaru ekranu . Jednak nadal 4px nie jest wyjaśnione (panel ma 24px wysokości).

Chociaż odchylenie można bardzo dobrze zrekompensować w skryptach, fakt, że nie rozumiem przyczyny, nie jest satysfakcjonujący, więc pytanie brzmi:

Co jest dokładnie przyczyną tego odchylenia?


Przesunięcie okna o dokładnych współrzędnych na wyjściu wmctrl -lGnie powinno przesuwać okna, ale tak się dzieje

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Jacob Vlijm
źródło
Moje „zbędne” rozwiązanie polegało na zapisaniu bieżących współrzędnych, przejściu do tych współrzędnych, uzyskaniu nowych współrzędnych, odjęciu zapisanych współrzędnych, aby uzyskać różnice. Następnie zastosuj różnice do pierwotnych współrzędnych i przejdź do skorygowanych współrzędnych. To łatwiejsze niż się wydaje.
WinEunuuchs2Unix,

Odpowiedzi:

18

To, co się dzieje, polega na tym, że wmctrl zwraca geometrię okna wewnątrz dekoracji (tj. Bez paska tytułu i obramowań), ale używa do przesunięcia większej pozycji okna.

(Niektóre linie wyjściowe poleceń zostały usunięte: xdotoolmoże nie być zainstalowane)

$ 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

Następne polecenie wyświetla monit o okno zainteresowania i zwraca okno nadrzędne, które zawiera wszystkie dekoracje i różni się w zależności od używanego motywu okna.

$ xdotool selectwindow
25166060

$ xdotool getwindowgeometry 0x18000ec
Window 25166060
  Position: 700,0 (screen: 0)
  Geometry: 904x977

Jak widać, jest to inne okno; pozycja X zaczyna się 2px w lewo (702-2), a całkowita szerokość jest większa o 4px (900 + 2 + 2), ponieważ prawa ramka ma również 2px. Y jest wyższe (powyżej górnej granicy, jeśli istnieje, i paska tytułu); wysokość jest większa z tego powodu plus dolna ramka.

wmctrl przenosi okno nadrzędne do żądanej pozycji [X, Y] okna podrzędnego; szerokość i wysokość są prawidłowo stosowane do dziecka, jak pokazano w „przed i po” poniżej.

$ 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

Edycja: dodatkowe informacje.

Geometria pulpitu, rzutnia i 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

Odp: Wskazówka @Sneetsher w komentarzach

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4
Daxx
źródło
To wygląda na doskonałą odpowiedź! Dziś wieczorem przyjrzę się jej szczegółom.
Jacob Vlijm
dla mojego zrozumienia wynik xdotool selectwindowjest 25166060, ale jaki jest krok do osiągnięcia 0x18000ec? Próbowałem konwersji z systemu szesnastkowego, ale tak nie jest.
Jacob Vlijm
Wyjście z xdotool getwindowgeometry 0x18000eczwraca identyfikator dziesiętnego okna 25166060 (rodzic). Właśnie wprowadziłem wartość szesnastkową 0x18000ec, aby pokazać, że nie była to 0x04000040 (dziecko). Nawiasem mówiąc, właśnie wznowiłem cały test z łatwiejszymi liczbami w nadziei, że nie patrzyłeś. Zobacz poprzednią wersję edycji, jeśli coś było w środku.
Daxx
2
@JacobVlijm, xpropwydaje się pokazywać podkładkę dekoracyjną: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6i _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Może to pomóc sprawdzić.
user.dz
Czy to możliwe, że xdotool selectwindowpolecenie zachowuje się inaczej w KDE i Unity? Dane wyjściowe xdotool selectwindowpolecenia odnoszą się dokładnie do tego samego okna (-id) i (w ten sposób) xdotool getwindowgeometrygenerują te same dane, co wmctrl -lG. xpropKomenda jednak, jak sugeruje @Sneetsher pokazuje _NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0, co jest dokładnie to, co mierzy się ręcznie, i udowadnia istotą odpowiedź jest prawidłowa i jest doskonałą odpowiedzią na moje pytanie. Jestem pod wrażeniem twojej dokładności. Dzięki!
Jacob Vlijm
0

Miałem ten sam problem i mogłem znaleźć obejście.


Sytuacja

Moja sytuacja oparta jest na Mate 16.04 z zainstalowanym Compizem (który aktywuje menedżera okien GTK)

Korzystam ze skryptu połączonego z powiązaniami klawiszy, aby umieszczać okna w predefiniowanych miejscach. Ten skrypt kończy się niepowodzeniem, jeśli nie korzystam z opcji zmaksymalizowanej.


Analiza

Problem można włączyć i wyłączyć, włączając i dekorując okna w ustawieniach (compiz).


Obejście

Dekoracje okien można włączać i wyłączać za pomocą Pythona dla określonego okna (za pomocą skrótów klawiszowych wygodnie jest używać aktywnego okna).

#!/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()

Następnie możesz wyłączyć dekoracje okna, przesunąć okno i włączyć dekoracje okna.

Sextus Empiricus
źródło