Как узнать ширину границы окна X из командной строки?

Как узнать ширину границы окна X из командной строки?

Я пробовал xdotool, xwininfoи xprop, но все они, похоже, возвращают размер содержимого окна, который не включает ширину границы. Есть ли какие-либо инструменты командной строки, которые могут найти эту ширину границы? И надеюсь, что инструмент будет работать на различных оконных менеджерах, совместимых с EWMH.

решение1

В зависимости от вашего оконного менеджера вы можете использовать его xwininfo -tree -rootдля вывода списка всей иерархии окон, а затем двигаться вверх по дереву от целевого окна до оконной рамки, которую оконный менеджер разместил вокруг цели.

Следующий скрипт делает это итеративно, запускаясь xwininfo -treeтолько на вашем целевом окне, чтобы найти родительское окно, затем повторяя процесс, двигаясь вверх по дереву шаг за шагом, пока родитель не станет корнем ( Parent window id: ...(the root window)). Он предполагает, что окно, которое имеет корнем в качестве родителя, является желаемым фреймом.

Добавляя, -statsвы получаете легкий доступ к ширине и высоте окна. Например, в xterm724 на 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

Связанный контент