Über wmctrl
Mit wmctrl
(nicht standardmäßig installiert) können wir Informationen zu Fenstern, ihrer ID, ihrer Geometrie, der PID, zu der sie gehören usw. abrufen. Wir können Fenster auch mit mehreren Befehlen verschieben oder ihre Größe ändern . In mancher Hinsicht scheint sein Verhalten jedoch nicht logisch zu sein. Meine Frage bezieht sich auf das Verschieben von Fenstern durch wmctrl
:
Informationen erhalten
Wenn ich den Befehl ausführe:
wmctrl -lG
Ich erhalte (ao) die folgenden Informationen über das Fenster in den Bildern unten:
0x04200085 0 746 443 468 205 jacob-System-Product-Name Niet-opgeslagen document 1 - gedit
In Spalte 3-5 geben die Geometrieinformationen die x / y-Koordinaten und die Breite / Höhe an.
Fenster verschieben / in der Größe ändern
Wenn ich diese Koordinaten in den wmctrl
Befehl zum Verschieben / Ändern der Größe eines Fensters einfüge , sollte dies nichts bewirken , da die Koordinaten unverändert bleiben:
wmctrl -ir 0x04200085 -e 0,746,443,468,205
Abweichung
Die Bilder unten zeigen jedoch, dass das Fenster nach unten verschoben ist (28px um genau zu sein). Ich nahm an, dass der Grund dafür war, dass der Befehl zum wmctrl
Verschieben des Fensters mit dem Arbeitsbereich (Bildschirm minus Panelhöhe) wmctrl -lG
berechnet wurde , während der Befehl mit der Gesamtbildschirmgröße berechnet wurde . Dann ist immer noch 4px ungeklärt (das Panel ist 24px hoch).
Obwohl die Abweichung in Skripten sehr gut kompensiert werden kann, ist die Tatsache, dass ich die Ursache nicht verstehe, nicht zufriedenstellend, daher lautet die Frage:
Was genau ist die Ursache für diese Abweichung?
Das Verschieben eines Fensters mit den genauen Koordinaten in der Ausgabe von wmctrl -lG
sollte das Fenster nicht verschieben, tut es aber
quelle
Antworten:
Was passiert ist, dass wmctrl die Geometrie des Fensters innerhalb der Dekorationen zurückgibt (dh ohne Titelleiste und Rahmen), aber die größere Fensterposition für die Verschiebung verwendet.
(Einige Befehlsausgabezeilen wurden entfernt:
xdotool
möglicherweise nicht installiert)Der nächste Befehl fordert zur Eingabe des gewünschten Fensters auf und gibt das übergeordnete Fenster zurück, das alle Dekorationen enthält und je nach verwendetem Fensterthema variiert.
Wie Sie sehen können, ist es ein anderes Fenster; Die X-Position beginnt 2 Pixel nach links (702-2) und die Gesamtbreite ist um 4 Pixel (900 + 2 + 2) größer, da der rechte Rand ebenfalls 2 Pixel beträgt. Y ist höher (über dem oberen Rand, falls vorhanden, und der Titelleiste); Die Höhe ist deshalb größer und der untere Rand.
wmctrl verschiebt das übergeordnete Fenster an die gewünschte [X, Y] Position des untergeordneten Fensters. Breite und Höhe werden korrekt auf das Kind angewendet, wie im Abschnitt "Vorher und Nachher" unten gezeigt.
Bearbeiten: zusätzliche Infos.
Desktop-Geometrie, Ansichtsfenster und Arbeitsbereich
https://github.com/jordansissel/xdotool
Betreff: @Sneetsher Tipp in Kommentaren
quelle
xdotool selectwindow
ist25166060
, aber was ist der Schritt zu bekommen0x18000ec
? Ich habe die Konvertierung von hexadezimal versucht, aber das scheint es nicht zu sein.xdotool getwindowgeometry 0x18000ec
gibt die Dezimalfenster-ID 25166060 (übergeordnet) zurück. Ich habe gerade den Hex-Wert von 0x18000ec eingegeben, um zu zeigen, dass es nicht 0x04000040 (das Kind) war. Übrigens habe ich den ganzen Test mit einfacheren Zahlen wiederholt, in der Hoffnung, dass Sie nicht hinschauten. Siehe vorherige Bearbeitungsrevision, wenn Sie sich mitten in etwas befanden.xprop
scheint Dekoration Polsterung zu zeigen:_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6
und_NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6
. Es kann hilfreich sein, dies zu überprüfen.xdotool selectwindow
Befehl in KDE und Unity unterschiedlich verhält? Die Ausgabe desxdotool selectwindow
Befehls bezieht sich auf genau dasselbe Fenster (-id) und gibt (somit)xdotool getwindowgeometry
dieselben Daten aus wiewmctrl -lG
. Derxprop
von @Sneetsher vorgeschlagene Befehl zeigt jedoch_NET_FRAME_EXTENTS(CARDINAL) = 0, 0, 28, 0
, was genau das ist, was ich manuell gemessen habe, und beweist, dass das Wesentliche Ihrer Antwort korrekt ist, und es ist die perfekte Antwort auf meine Frage. Ich bin beeindruckt von Ihrer Gründlichkeit. Vielen Dank!Ich hatte das gleiche Problem und konnte eine Problemumgehung finden.
Situation
Meine Situation basiert auf Mate 16.04 mit installiertem Compiz (das den GTK-Fenstermanager aktiviert).
Ich verwende ein Skript, das mit Tastenkombinationen verbunden ist, um Fenster an vordefinierten Stellen zu platzieren. Dieses Skript schlägt fehl, wenn ich die maximierte Option nicht verwende.
Analyse
Das Problem kann durch Ein- und Ausschalten der Fensterdekorationen in den Einstellungen (compiz) ein- und ausgeschaltet werden.
Problemumgehung
Die Fensterdekorationen können mit Python für ein bestimmtes Fenster ein- und ausgeschaltet werden (mithilfe von Tastenkombinationen ist es praktisch, das aktive Fenster zu verwenden).
Dann können Sie Fensterdekorationen deaktivieren, das Fenster verschieben und Fensterdekorationen aktivieren.
quelle