В зависимости от вашего оконного менеджера, вы можете использовать xwininfo -tree -root
, чтобы перечислить всю иерархию окон, а затем обработать дерево от вашего целевого окна до окна, обрамляющего оконный менеджер. цель.
Следующий скрипт делает это итеративно, выполняя xwininfo -tree
только в целевом окне, чтобы найти родительское окно, затем повторяя процесс, шаг за шагом двигаясь вверх по дереву, пока родителем не станет корень. ( Идентификатор родительского окна: ... (корневое окно)
). Предполагается, что окно, имеющее корень в качестве родителя, является желаемым фреймом.
Добавляя -stats
, вы легко получаете доступ к ширине и высоте окна.
Например, в xterm
, который составляет 724 на 1069 пикселей, мы получаем кадр размером 742 на 1087 пикселей:
$ 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
Вот сценарий, принимающий номер окна в качестве аргумента:
#!/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"
Он печатает общих границ w и h 18 18
, и вам нужно разделить их на 2, чтобы ширина границы предполагала симметрию. Если это не так, например с большой строкой заголовка вам также необходимо использовать разницу в смещениях x и y для вычисления верхней, нижней, левой и правой отдельных границ.
Метод обхода - это выгрузить содержимое с помощью xwd и затем измерить полученное изображение.
xwd -frame | xwdtopnm | head -2
xwdtppnm
взят из пакета netpbm