X11

如何從命令行獲取 X 視窗邊框寬度?

  • December 19, 2016

我試過xdotool,xwininfoxprop,但它們似乎都返回了視窗的內容大小,不包括邊框寬度。有沒有可以找到這個邊框寬度的命令行工具?並且希望該工具可以在不同的 EWMH 兼容視窗管理器上執行。

根據您的視窗管理器,您可以使用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 偏移的差異來計算上、下、左、右各個邊框。

引用自:https://unix.stackexchange.com/questions/331291