Dependendo do seu gerenciador de janelas, você pode usar xwininfo -tree -root
para listar toda a hierarquia de janelas e, em seguida, desenvolver a árvore de sua janela de destino para a janela que o gerenciador de janelas colocou em torno do destino.
O script a seguir faz isso iterativamente, executando xwininfo -tree
apenas na janela de destino para localizar a janela pai e, em seguida, repetindo o processo subindo a árvore passo a passo até que o pai seja a raiz ( Parent window id: ...(the root window)
). Ele assume que a janela que possui a raiz como pai é o quadro desejado.
Ao adicionar -stats
, você obtém acesso fácil à largura e à altura da janela.
Por exemplo, em um xterm
que é 724 por 1069 pixels, obtemos um quadro de 742 por 1087 pixels:
$ 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
Aqui está o script, pegando um número de identificação de janela como argumento:
#!/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"
Imprime total border w and h 18 18
e você precisa dividir por 2 para ter a largura da borda assumindo simetria. Se este não for o caso, e. Com uma barra de título grande, você também precisa usar a diferença nos deslocamentos X e Y para calcular as bordas individuais superior, inferior, esquerda e direita.