
Lo intenté xdotool
y , 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 -root
para 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 -tree
solo 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, -stats
obtiene fácil acceso al ancho y alto de la ventana. Por ejemplo, en un xterm
cuadro 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 18
y 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
xwdtppnm
es del paquete netpbm