Unityでフルウィンドウサイズ(装飾を含む)を取得する

Unityでフルウィンドウサイズ(装飾を含む)を取得する

私は答えを使用しました正確なウィンドウサイズと位置(トリムを含む)をどのように知ることができますか?私のbashスクリプトで良い成功を収めました。無声放送Xfceにアプリケーションを適用しましたが、他の人がそれを使用しているので、Ubuntu 14.04、Unityでいくつかの問題を発見しています。これは出力によって引き起こされる問題です。

xwininfo -id $(xdotool getactivewindow)

示す:

Relative upper-left X:  0  
Relative upper-left Y:  0

境界線の幅とタイトルバーの高さを計算するために使用します。 0ではないはずです。

Ubuntu 14.04のUnityでウィンドウ枠の幅とタイトルバーの高さを取得する方法を知っている人はいますか?

または、全体のウィンドウサイズを直接取得するにはどうすればよいですか?

xwininfoパッケージのxorgのバグを提出しました。https://bugs.freedesktop.org/show_bug.cgi?id=84348

また、Ubuntu 14.04では、Unityで独自のテーマを作成する方法に関する情報も見つけました。https://wiki.ubuntu.com/Unity/Theming

答えはトピックページのどこかにあるようですが、まだ理解していません。特に私はUbuntuやUnityを使わないので、もっとそうです。

答え1

私もstackoverflowにこの質問を投稿し、良い答えを得ました。正解で表示して親指を立てました。https://stackoverflow.com/a/26060527/1707904

これはコンフィスにも当てはまります。この情報はいくつかの方法で得ることができる。

wnckprop --xid=$(xdotool getactivewindow)

それ以外の場合は、xwininfoから得られた絶対値と、次のアクセス可能な装飾のサイズを混在させることができます。

xprop _NET_FRAME_EXTENTS -id $(xdotool getactivewindow)

参考までに、ウィンドウの周りの入力領域を含む全体のフレームサイズを取得するには、以下を使用できます。xwininfo -frame

実験を通して、Ubuntuの「入力領域」が何を意味するのかをよりよく理解することができました。枠のデフォルトサイズは0なので、ウィンドウの周りに10ピクセルの領域があり、ウィンドウをつかんでサイズを変更できます。他の目的に使用することもできますが、入力領域は基本的には見えない10pxボーダーと同じです。したがって、xwininfoのAbsoluteは内部ウィンドウを提供し、xwininfo -frameはタイトルバーとその周囲の追加10px(入力領域が10pxの場合)を含むウィンドウ全体を提供します。 xprop...入力領域を除いて装飾のサイズのみを提供します。したがって、ウィンドウの幾何学的構造を完全に理解するには、3つのコマンドすべてが必要です。

これは私が使用したコードです(見えない入力領域を無視します)。

eval $(xwininfo -id "$aw" |
      sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
             -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
             -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
             -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
if [ "$entire" = true ]
then
    extents=$(xprop _NET_FRAME_EXTENTS -id "$aw" | grep "NET_FRAME_EXTENTS" | cut -d '=' -f 2 | tr -d ' ')
    bl=$(echo $extents | cut -d ',' -f 1) # width of left border
    br=$(echo $extents | cut -d ',' -f 2) # width of right border
    t=$(echo $extents | cut -d ',' -f 3)  # height of title bar
    bb=$(echo $extents | cut -d ',' -f 4) # height of bottom border

    let x=$x-$bl
    let y=$y-$t
    let w=$w+$bl+$br
    let h=$h+$t+$bb
fi

答え2

以下は、_GTK_FRAME_EXTENTSを使用するより詳細なコードです。

#!/bin/bash
# get window coordinates and width and height
# inspired by:
# https://unix.stackexchange.com/questions/14159/how-do-i-find-the-window-dimensions-and-position-accurately-including-decoration
window=$(xwininfo |  awk '/xwininfo: Window id:/{print $4}')
entire=true
set - $(xwininfo -id "$window" | awk '
   /Absolute upper-left X:/{ print $4 } \
   /Absolute upper-left Y:/{ print $4 } \
   /Width:/ { print $2 } \
   /Height:/{ print $2}')
x="$1"
y="$2"
w="$3"
h="$4"
if [ "$entire" = true ]; then
   set - $( xprop -id "$window" | awk ' BEGIN { set=0 } \
   /_..._FRAME_EXTENTS/{ print $1,$3,$4,$5,$6; set=1} \
   END { if (!set) print "none" }' | sed 's/(.*)//;s/,//g')
   prop="$1"
   if [ "$prop" != none ]; then
      bl="$2"
      br="$3"
      t="$4"
      bb="$5"
      case "$prop" in
     *NET*)
        (( x=x-bl    ))
        (( y=y-t     ))
        (( w=w+bl+br ))
        (( h=h+t+bb  ))
        ;;
     *GTK*)
        (( x=x+bl    ))
        (( y=y+t     ))
        (( w=w-bl-br ))
        (( h=h-t-bb  ))
        ;;
      esac
   fi
fi
echo "window: $window"
echo "property: $prop"
echo $x $y $w $h

関連情報