¿Cómo obtener el ancho del borde de la ventana X desde la línea de comando?

¿Cómo obtener el ancho del borde de la ventana X desde la línea de comando?

Lo intenté xdotooly , pero todos parecen devolver el tamaño del contenido de la ventana, que no incluye el ancho del borde xwininfo. xprop¿Existe alguna herramienta de línea de comandos que pueda encontrar este ancho de borde? Y es de esperar que la herramienta funcione en diferentes administradores de ventanas compatibles con EWMH.

Respuesta1

Dependiendo de su administrador de ventanas, puede usar xwininfo -tree -rootpara enumerar toda la jerarquía de ventanas y luego ascender en el árbol desde su ventana de destino hasta el marco de ventana que el administrador de ventanas ha colocado alrededor del objetivo.

El siguiente script hace esto de forma iterativa, ejecutándose xwininfo -treesolo en la ventana de destino para encontrar la ventana principal y luego repitiendo el proceso subiendo en el árbol paso a paso hasta que la ventana principal sea la raíz ( Parent window id: ...(the root window)). Se supone que la ventana que tiene la raíz como padre es el marco deseado.

Al agregar, -statsobtiene fácil acceso al ancho y alto de la ventana. Por ejemplo, en un xtermcuadro de 724 por 1069 píxeles, obtenemos un fotograma de 742 por 1087 píxeles:

$ 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

Aquí está el script, tomando un número de identificación de ventana 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 18y debes dividirlos por 2 para que el ancho del borde asuma simetría. Si este no es el caso, por ejemplo con una barra de título grande, también necesitará usar la diferencia en los desplazamientos x e y para calcular los bordes individuales superior, inferior, izquierdo y derecho.

Respuesta2

Un método indirecto es volcar el contenido usando xwd y luego medir la imagen producida.

xwd -frame | xwdtopnm | head -2

xwdtppnmes del paquete netpbm

información relacionada