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

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

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

Responder1

Dependendo do seu gerenciador de janelas, você pode usar xwininfo -tree -rootpara listar toda a hierarquia de janelas e, em seguida, subir a árvore da janela de destino até o enquadramento da janela que o gerenciador de janelas colocou ao redor do destino.

O script a seguir faz isso iterativamente, executando xwininfo -treeapenas na janela de destino para encontrar a janela pai e, em seguida, repetindo o processo subindo na árvore passo a passo até que o pai seja a raiz ( Parent window id: ...(the root window)). Ele assume que a janela que tem a raiz como pai é o quadro desejado.

Ao adicionar -statsvocê obtém acesso fácil à largura e altura da janela. Por exemplo, em um xtermquadro de 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, usando 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"

Ele imprime total border w and h 18 18e você precisa dividi-los por 2 para que a largura da borda assuma simetria. Se este não for o caso, por exemplo, com uma barra de título grande, você também precisará usar a diferença nos deslocamentos x e y para calcular as bordas individuais superior, inferior, esquerda e direita.

Responder2

um método indireto é despejar o conteúdo usando xwd e depois medir a imagem produzida.

xwd -frame | xwdtopnm | head -2

xwdtppnmé do pacote netpbm

informação relacionada