Wie erhält man die Breite des X-Fensterrahmens über die Befehlszeile?

Wie erhält man die Breite des X-Fensterrahmens über die Befehlszeile?

Ich habe xdotool, xwininfound 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 -rootdie 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 -treenur 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 -statskönnen Sie einfach auf die Breite und Höhe des Fensters zugreifen. Beispielsweise xtermerhalten 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

xwdtppnmstammt aus dem netpbm-Paket

verwandte Informationen