
xdotool
、xwininfo
、を試してみましたxprop
が、いずれもウィンドウのコンテンツ サイズを返すようで、境界の幅は含まれていません。この境界の幅を見つけることができるコマンドライン ツールはありますか? また、このツールがさまざまな EWMH 互換ウィンドウ マネージャーで動作することを期待しています。
答え1
ウィンドウ マネージャーによっては、 を使用してxwininfo -tree -root
すべてのウィンドウ階層を一覧表示し、ターゲット ウィンドウからウィンドウ マネージャーがターゲットの周囲に配置したウィンドウ フレーミングまでツリーを上に進むことができます。
次のスクリプトはこれを反復的に実行し、xwininfo -tree
親ウィンドウを見つけるためにターゲット ウィンドウのみで実行し、親がルート ( Parent window id: ...(the root window)
) になるまでツリーを段階的に上へ移動するプロセスを繰り返します。ルートを親とするウィンドウが必要なフレームであると想定しています。
追加すると、-stats
ウィンドウの幅と高さに簡単にアクセスできるようになります。たとえば、xterm
724 x 1069 ピクセルの場合、742 x 1087 ピクセルのフレームが得られます。
$ 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
以下は、ウィンドウ ID 番号を引数として取るスクリプトです。
#!/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"
と印刷されますがtotal border w and h 18 18
、対称性を前提とした境界線の幅を得るには、これを 2 で割る必要があります。そうでない場合 (たとえば、大きなタイトル バーの場合) は、x オフセットと y オフセットの差を使用して、上、下、左、右の個々の境界線を計算する必要もあります。
答え2
回りくどい方法としては、xwd を使用してコンテンツをダンプし、生成されたイメージを測定することです。
xwd -frame | xwdtopnm | head -2
xwdtppnm
netpbmパッケージからのものです