コマンドラインから X ウィンドウの境界の幅を取得するにはどうすればよいでしょうか?

コマンドラインから X ウィンドウの境界の幅を取得するにはどうすればよいでしょうか?

xdotoolxwininfo、を試してみましたxpropが、いずれもウィンドウのコンテンツ サイズを返すようで、境界の幅は含まれていません。この境界の幅を見つけることができるコマンドライン ツールはありますか? また、このツールがさまざまな EWMH 互換ウィンドウ マネージャーで動作することを期待しています。

答え1

ウィンドウ マネージャーによっては、 を使用してxwininfo -tree -rootすべてのウィンドウ階層を一覧表示し、ターゲット ウィンドウからウィンドウ マネージャーがターゲットの周囲に配置したウィンドウ フレーミングまでツリーを上に進むことができます。

次のスクリプトはこれを反復的に実行し、xwininfo -tree親ウィンドウを見つけるためにターゲット ウィンドウのみで実行し、親がルート ( Parent window id: ...(the root window)) になるまでツリーを段階的に上へ移動するプロセスを繰り返します。ルートを親とするウィンドウが必要なフレームであると想定しています。

追加すると、-statsウィンドウの幅と高さに簡単にアクセスできるようになります。たとえば、xterm724 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

xwdtppnmnetpbmパッケージからのものです

関連情報