如何从命令行获取X窗口边框宽度?

如何从命令行获取X窗口边框宽度?

我已经尝试过xdotoolxwininfoxprop,但它们似乎都返回窗口的内容大小,其中不包括边框宽度。有没有可以找到这个边框宽度的命令行工具?希望该工具能够在不同的 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

xwdtppnm来自 netpbm 包

相关内容