正確なウィンドウサイズと位置(トリムを含む)をどのように知ることができますか?

正確なウィンドウサイズと位置(トリムを含む)をどのように知ることができますか?

私は小さなスクリプトで使用するためにウィンドウのサイズを見つけようとしました。私の現在の技術はwmctrl -lG寸法を調べることです。しかし問題はこうです。

与えられた x と y の数字はウィンドウ装飾の左上隅に適用され、高さと幅はコンテンツ領域にのみ適用されます。つまり、ウィンドウの装飾が高さ20ピクセルと幅2ピクセルを追加すると、画面で660x482を占めますが、wmctrlはウィンドウを640x480と報告します。私のスクリプトの次のステップは、この領域を使用してffmpegに画面を記録するように指示することです。現在の設定でウィンドウ装飾のサイズをハードコードすることを避けたいです。

適切なアプローチは、ウィンドウ装飾のサイズを取得し、それを使用して640x480コンテンツ領域の位置を決定するか、ウィンドウ装飾の代わりにコンテンツ領域の位置を直接インポートすることです。

答え1

次のスクリプトは、左上隅の画面座標とウィンドウサイズ(装飾なし)を提供します。 。 。 。 xwininfo -id $(xdotool getactivewindow)あなたのための十分な情報が含まれています。


#!/bin/bash
# Get the coordinates of the active window's
#    top-left corner, and the window's size.
#    This excludes the window decoration.
  unset x y w h
  eval $(xwininfo -id $(xdotool getactivewindow) |
    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" )
  echo -n "$x $y $w $h"
#

答え2

現在のウィンドウサイズと位置を取得するより簡単な方法:

xdotool getwindowfocus getwindowgeometry

選択したウィンドウのサイズと位置を取得します。

xdotool selectwindow getwindowgeometry

答え3

許可された回答を拡張してウィンドウ全体を取得できます。

entire=false
x=0
y=0
w=0
h=0
b=0  # b for border
t=0  # t for title (or top)

# ... find out what user wants then 

eval $(xwininfo -id $(xdotool getactivewindow) |
  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" \
         -e "s/^ \+Relative upper-left X: \+\([0-9]\+\).*/b=\1/p" \
         -e "s/^ \+Relative upper-left Y: \+\([0-9]\+\).*/t=\1/p" )
if [ "$entire" = true ]
then                     # if user wanted entire window, adjust x,y,w and h
    let x=$x-$b
    let y=$y-$t
    let w=$w+2*$b
    let h=$h+$t+$b
fi
echo "$w"x"$h" $x,$y

単純ですが、Ubuntu 14.04では相対情報がすべて0であるため、Unityでは動作しないことがわかりました。私は尋ねたUnityでフルウィンドウサイズ(装飾を含む)を取得するそして素晴らしい答えを得ました。その答えを使用する方法は次のとおりです。

aw=$(xdotool getactivewindow)
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番目の方法はUnityとXfceで動作し、Gnomeでも動作するはずです。

答え4

xdotoolを使用してください:

  • まず、ウィンドウIDを取得する必要があります。

sleep 3s && xdotool getactivewindow、3秒以内に窓を開けなければなりません

  • 次に、次を使用する必要があります。
    1. 出力から情報を取得するには、次のコマンドを使用します。 xdotool getwindowgeometry $WINDOW_ID
    2. または、シェル・パラメーターが必要な場合は、次のコマンドを使用します。xdotool getwindowgeometry -shell $WINDOW_ID

関連情報