
Я пробовал xdotool
, xwininfo
и xprop
, но все они, похоже, возвращают размер содержимого окна, который не включает ширину границы. Есть ли какие-либо инструменты командной строки, которые могут найти эту ширину границы? И надеюсь, что инструмент будет работать на различных оконных менеджерах, совместимых с EWMH.
решение1
В зависимости от вашего оконного менеджера вы можете использовать его xwininfo -tree -root
для вывода списка всей иерархии окон, а затем двигаться вверх по дереву от целевого окна до оконной рамки, которую оконный менеджер разместил вокруг цели.
Следующий скрипт делает это итеративно, запускаясь xwininfo -tree
только на вашем целевом окне, чтобы найти родительское окно, затем повторяя процесс, двигаясь вверх по дереву шаг за шагом, пока родитель не станет корнем ( Parent window id: ...(the root window)
). Он предполагает, что окно, которое имеет корнем в качестве родителя, является желаемым фреймом.
Добавляя, -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"
Он печатает total border w and h 18 18
, и вам нужно разделить их на 2, чтобы получить ширину границы, предполагая симметрию. Если это не так, например, с большой строкой заголовка, вам также нужно использовать разницу в смещениях x и y для вычисления верхней, нижней, левой, правой отдельных границ.
решение2
обходной путь — выгрузить содержимое с помощью xwd, а затем измерить полученное изображение.
xwd -frame | xwdtopnm | head -2
xwdtppnm
из пакета netpbm