Was verursacht die Abweichung im Befehl zum Verschieben des Fensters wmctrl?

13

Ü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 wmctrlBefehl 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 -lGberechnet 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 -lGsollte das Fenster nicht verschieben, tut es aber

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Jacob Vlijm
quelle
Meine "fudgy" Lösung bestand darin, die aktuellen Koordinaten zu speichern, zu diesen Koordinaten zu wechseln, die neuen Koordinaten zu erhalten und die gespeicherten Koordinaten zu subtrahieren, um die Unterschiede zu erhalten. Wenden Sie dann die Differenzen auf die ursprünglichen Koordinaten an und bewegen Sie sich zu den angepassten Koordinaten. Es ist einfacher als es klingt.
WinEunuuchs2Unix

Antworten:

18

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: xdotoolmöglicherweise nicht installiert)

$ 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

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.

$ xdotool selectwindow
25166060

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

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.

$ 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

Bearbeiten: zusätzliche Infos.

Desktop-Geometrie, Ansichtsfenster und Arbeitsbereich

$ 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

Betreff: @Sneetsher Tipp in Kommentaren

$ xprop | grep FRAME
_KDE_NET_WM_FRAME_STRUT(CARDINAL) = 2, 2, 23, 4
_NET_FRAME_EXTENTS(CARDINAL) = 2, 2, 23, 4
Daxx
quelle
Das sieht nach einer hervorragenden Antwort aus! Ich werde heute Abend die Details untersuchen.
Jacob Vlijm
für mein Verständnis, der Ausgang xdotool selectwindowist 25166060, aber was ist der Schritt zu bekommen 0x18000ec? Ich habe die Konvertierung von hexadezimal versucht, aber das scheint es nicht zu sein.
Jacob Vlijm
Die Ausgabe von xdotool getwindowgeometry 0x18000ecgibt 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.
Daxx
2
@JacobVlijm, xpropscheint Dekoration Polsterung zu zeigen: _KDE_NET_WM_FRAME_STRUT(CARDINAL) = 1, 1, 24, 6und _NET_FRAME_EXTENTS(CARDINAL) = 1, 1, 24, 6. Es kann hilfreich sein, dies zu überprüfen.
user.dz
Ist es möglich, dass sich der xdotool selectwindowBefehl in KDE und Unity unterschiedlich verhält? Die Ausgabe des xdotool selectwindowBefehls bezieht sich auf genau dasselbe Fenster (-id) und gibt (somit) xdotool getwindowgeometrydieselben Daten aus wie wmctrl -lG. Der xpropvon @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!
Jacob Vlijm
0

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

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

Dann können Sie Fensterdekorationen deaktivieren, das Fenster verschieben und Fensterdekorationen aktivieren.

Sextus Empiricus
quelle