Como obter largura da borda da janela X a partir da linha de comando?

3

Eu tentei xdotool , xwininfo e xprop , mas todos eles parecem retornar o tamanho do conteúdo da janela, que não inclui a largura da borda. Existe alguma ferramenta de linha de comando que pode encontrar essa largura de borda? E esperamos que a ferramenta funcione em diferentes gerenciadores de janelas compatíveis com o EWMH.

    
por Cyker 18.12.2016 / 22:30

2 respostas

3

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.

    
por 19.12.2016 / 22:55
0

um método round-about é despejar o conteúdo usando xwd e, em seguida, medir a imagem produzida.

xwd -frame | xwdtopnm | head -2

xwdtppnm é do pacote netpbm

    
por 19.12.2016 / 02:20