
Ich habe xdotool
, xwininfo
und ausprobiert xprop
, aber alle scheinen die Inhaltsgröße des Fensters zurückzugeben, die die Rahmenbreite nicht einschließt. Gibt es Befehlszeilentools, die diese Rahmenbreite ermitteln können? Und hoffentlich funktioniert das Tool auf verschiedenen EWMH-kompatiblen Fenstermanagern.
Antwort1
Abhängig von Ihrem Fenstermanager können Sie damit xwininfo -tree -root
die gesamte Fensterhierarchie auflisten und sich dann von Ihrem Zielfenster aus im Baum nach oben bis zum Fensterrahmen arbeiten, den der Fenstermanager um das Ziel herum platziert hat.
Das folgende Skript führt dies iterativ aus, indem es xwininfo -tree
nur in Ihrem Zielfenster ausgeführt wird, um das übergeordnete Fenster zu finden. Anschließend wird der Vorgang wiederholt, indem es sich Schritt für Schritt im Baum nach oben bewegt, bis das übergeordnete Fenster die Wurzel ist ( Parent window id: ...(the root window)
). Es nimmt an, dass das Fenster mit der Wurzel als übergeordnetes Fenster der gewünschte Frame ist.
Durch das Hinzufügen -stats
können Sie einfach auf die Breite und Höhe des Fensters zugreifen. Beispielsweise xterm
erhalten wir in einem 724 x 1069 Pixel großen Fenster einen Rahmen von 742 x 1087 Pixel:
$ xwininfo -tree -stats -id $WINDOWID
Parent window id: 0x8002ff (has no name)
...
Width: 724
Height: 1069
$ xwininfo -tree -stats -id 0x8002ff
Parent window id: 0x8002fe (has no name)
...
Width: 724
Height: 1069
$ xwininfo -tree -stats -id 0x8002fe
Parent window id: 0xc1 (the root window) (has no name)
...
Width: 742
Height: 1087
Hier ist das Skript, das eine Fenster-ID-Nummer als Argument verwendet:
#!/bin/bash
# http://unix.stackexchange.com/a/331516/119298
getwh(){
xwininfo -tree -stats -id "$id" |
awk '/Parent window id:/{ parent = ($0~/the root window/)?0:$4; }
/ Width:/ { w = $2 }
/ Height:/ { h = $2 }
END { printf "%s %d %d\n",parent,w,h }'
}
id=${1:-${WINDOWID?}}
set -- $(getwh "$id")
w=$2 h=$3
while id=$1
[ "$id" != 0 ]
do set -- $(getwh "$id")
done
let bw=$2-w bh=$3-h
echo "total border w and h $bw $bh"
Es wird gedruckt total border w and h 18 18
, und Sie müssen diese durch 2 teilen, um die Rahmenbreite unter der Annahme einer Symmetrie zu erhalten. Wenn dies nicht der Fall ist, z. B. bei einer großen Titelleiste, müssen Sie auch den Unterschied in den X- und Y-Offsets verwenden, um die einzelnen oberen, unteren, linken und rechten Rahmen zu berechnen.
Antwort2
Eine Umwegmethode besteht darin, den Inhalt mithilfe von xwd zu dumpen und dann das erzeugte Bild zu messen.
xwd -frame | xwdtopnm | head -2
xwdtppnm
stammt aus dem netpbm-Paket