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 wmctrl
polecenia 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 -lG
polecenie 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 -lG
nie powinno przesuwać okna, ale tak się dzieje
źródło
Odpowiedzi:
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:
xdotool
może nie być zainstalowane)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.
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.
Edycja: dodatkowe informacje.
Geometria pulpitu, rzutnia i Workarea
https://github.com/jordansissel/xdotool
Odp: Wskazówka @Sneetsher w komentarzach
źródło
xdotool selectwindow
jest25166060
, ale jaki jest krok do osiągnięcia0x18000ec
? Próbowałem konwersji z systemu szesnastkowego, ale tak nie jest.xdotool getwindowgeometry 0x18000ec
zwraca 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.xprop
wydaje się pokazywać podkładkę dekoracyjną:_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6
i_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6
. Może to pomóc sprawdzić.xdotool selectwindow
polecenie zachowuje się inaczej w KDE i Unity? Dane wyjściowexdotool selectwindow
polecenia odnoszą się dokładnie do tego samego okna (-id) i (w ten sposób)xdotool getwindowgeometry
generują te same dane, cowmctrl -lG
.xprop
Komenda 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!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).
Następnie możesz wyłączyć dekoracje okna, przesunąć okno i włączyć dekoracje okna.
źródło