web-dev-qa-db-ja.com

装飾を含めてウィンドウの寸法と位置を正確に見つけるにはどうすればよいですか?

小さなスクリプトで使用するウィンドウのサイズを把握しようとしています。私の現在のテクニックはwmctrl -lGで寸法を確認します。しかし、問題はこれです:

表示されるxとyの数値はウィンドウ装飾の左上を示し、高さと幅はコンテンツ領域のみを示します。これは、ウィンドウの装飾が高さ20px、幅2pxを追加する場合、画面上で660x482を占める場合でも、wmctrlはウィンドウを640x480として報告することを意味します。私のスクリプトの次のステップは、その領域を使用してffmpegに画面を記録するように指示することになるため、これは問題です。現在の設定からウィンドウ装飾のサイズをハードコーディングしないようにしたいと思います。

適切なのは、ウィンドウ装飾のサイズを取得して640x480のコンテンツ領域の位置を把握する方法、またはウィンドウ装飾ではなくコンテンツ領域の位置を直接取得する方法のいずれかです。 。

37
Macha

次のスクリプトは、画面の左上の座標とウィンドウのサイズ(装飾なし)を示します。 。 。 。 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"
#
37
Peter.O

ウィンドウのサイズと位置を取得するはるかに簡単な方法:

xdotool getwindowfocus getwindowgeometry
7
radara

受け入れられた回答は、ウィンドウ全体を取得するように拡張できます。

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

簡単ではありますが、相対情報がすべて0であるため、Ubuntu 14.04で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でも機能するはずです。

7
Colin Keenan

Xdotoolの使用:

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

sleep 3s && xdotool getactivewindow、ウィンドウを開くには3秒かかります

  • 次に、使用する必要があります:
    1. 出力で情報を取得するには、これを使用します:xdotool getwindowgeometry $WINDOW_ID
    2. または、シェルパラメータが必要な場合は、これを使用します:xdotool getwindowgeometry -Shell $WINDOW_ID
3
LyndaOlexandr

受け入れられた回答には、ウィンドウの装飾は含まれていません。この質問のタイトルに従って、すべての装飾includeを取得する方法をまだ探している人は、wmifaceこの他の質問に従って https://superuser.com/questions/164047/how-to-get-accurate-window-information-dimensions-etc-in-linux-x 。例:

wmiface frameGeometry `wmiface activeWindow`

次のように、左上を基準としたジオメトリと位置が返されます。

650x437+0+1003

wmifaceがすべてのLinuxディストリビューションに付属しているようには見えません(MintまたはUbuntuでそれを提供するパッケージを見つけられませんでした)が、ここからパッケージからインストールできました http://kde-apps.org /content/show.php?content=40425

そして、ドキュメントも--help、しかしREADMEはここにあります:

https://gitorious.org/wmiface/wmiface/source/ea941eeb2076124734f6a3d3079326c826b462d7:README

3
slinkp

このページの回答を組み合わせて使用​​しました:

$ sleep 3 && xdotool getwindowfocus getwindowgeometry

Window 88080400
  Position: 4565,2345 (screen: 0)
  Geometry: 1186x885

ワンライナーを実行してから、3秒以内に、位置とジオメトリが必要なウィンドウをクリックします。

0