정확한 창 크기와 위치(트림 포함)를 어떻게 알 수 있나요?

정확한 창 크기와 위치(트림 포함)를 어떻게 알 수 있나요?

나는 작은 스크립트에 사용하기 위해 창의 크기를 알아내려고 노력해 왔습니다. 나의 현재 기술은 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

간단하지만 우분투 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

두 번째 방법은 Unity 및 Xfce에서 작동하며 Gnome에서도 작동해야 합니다.

답변4

xdotool을 사용하세요:

  • 먼저 창 ID를 가져와야 합니다.

sleep 3s && xdotool getactivewindow, 3초 안에 창문을 열어야 합니다

  • 그런 다음 다음을 사용해야 합니다.
    1. 출력에서 정보를 얻으려면 다음 명령을 사용하십시오. xdotool getwindowgeometry $WINDOW_ID
    2. 또는 쉘 매개변수를 원하는 경우 다음 명령을 사용하십시오.xdotool getwindowgeometry -shell $WINDOW_ID

관련 정보