장식물을 포함하여 창 크기와 위치를 정확히 찾으려면 어떻게합니까?


37

작은 스크립트에서 사용할 창 크기를 알아 내려고 노력했습니다. 현재의 기술은 wmctrl -lG치수를 찾기 위해 사용 하고 있습니다. 그러나 문제는 다음과 같습니다.

x와 y 숫자는 창 장식의 왼쪽 상단에 대한 것이고, 높이와 너비는 내용 영역에 대한 것입니다. 즉, 창 장식에 높이 20px와 너비 2px를 추가하면 wmctrl은 화면에서 660x482를 차지하더라도 창을 640x480으로보고합니다. 내 스크립트의 다음 단계는 해당 영역을 사용하여 ffmpeg에 화면을 기록하도록 지시하기 때문에 문제가됩니다. 현재 설정에서 창 장식의 크기로 하드 코딩을 피하고 싶습니다.

적합한 것은 창 장식의 크기를 얻는 방법이므로 640x480 컨텐츠 영역의 위치를 ​​알아내는 데 사용할 수 있습니다. 또는 창 장식의 위치가 아닌 컨텐츠 영역의 위치를 ​​직접 얻는 방법입니다. .


1
다이어그램의 그림에서 높이와 너비를 섞었습니다.
Macha


답변:


36

다음 스크립트는 왼쪽 상단의 화면 좌표와 창의 크기를 보여줍니다 (장식 없음). . . . 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"
#

xdotool getactivewindow내부에 포함 된 클라이언트 창 대신 창 관리자 프레임 (장식 포함)의 창 ID를 반환 하기 때문에 작동하는 것으로 보입니다 .
Adam Spiers

2
아니요, 장식이 없는 기하학 반환합니다 .이 질문은 분명히 질문하지 않습니다. 장식을 포함하고 싶지 않다면 더 쉬운 방법이 있습니다. 예를 들어xdotool getactivewindow getwindowgeometry
slinkp

1
이것은 나에게 잘 작동하지 않습니다 (즉, 장식은 포함되지 않습니다). 답변이 더 좋습니다.
Jan Warchoł

7

허용되는 답변을 확장하여 전체 창을 얻을 수 있습니다.

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

이 두 번째 방법은 Unity와 Xfce에서 모두 작동하며 그놈에서도 작동합니다.


Ubuntu의 Unity 외부에서도 왼쪽, 오른쪽 및 아래쪽 테두리의 너비가 모두 같고이를 보장 할 수 없기 때문에 상단 접근 방식이 잘못되었습니다. 두 번째 접근 방식이 더 좋아 보입니다.
Adam Spiers 1

방금 두 번째 접근 방식을 확인 aw=`xdotool getactivewindow`했습니다 .xwininfo 호출에 매달리지 않도록 추가해야했습니다. 이것은 내가 segfaulting없이 wmiface를 실행할 수없는 Unity 로의 전환을 고려하고 있기 때문에 알아두면 좋습니다.
slinkp

@slinkp, 누락 된 aw정의 를 지적 해 주셔서 감사합니다 . 그 줄을 추가하기 위해 지금 답변을 편집하겠습니다.
콜린 키넌

이것의 두 번째 부분은 훌륭하게 작동합니다! Gnome 3에서 변경해야 할 사항 만 제목 표시 줄 높이를 추가하지 않았습니다 h. 제목 표시 줄이에서 다시 높이에 이미 포함 된 것 같습니다 xwininfo.
Jonny Asmar

6

창 크기와 위치를 얻는 훨씬 간단한 방법 :

xdotool getwindowfocus getwindowgeometry

3

허용 된 답변에는 명시 적으로 창 장식이 포함되지 않습니다. 이 질문의 제목에 따라 모든 장식을 포함 하여 지오메트리를 얻는 방법을 여전히 찾고있는 사람들 은이 다른 질문에 따라 wmiface 를 사용할 수 있습니다 https://superuser.com/questions/164047/how-to-get-accurate-window -정보-차원 -etc-in-linux-x . 예:

wmiface frameGeometry `wmiface activeWindow`

이렇게하면 왼쪽 상단을 기준으로 형상과 위치가 반환됩니다.

650x437+0+1003

wmiface에 모든 리눅스 배포판이 포함되어 있지는 않지만 (Mint 또는 Ubuntu에서 제공하는 패키지를 찾지 못했습니다) 다음 패키지에서 설치할 수 있습니다 : http://kde-apps.org/content/show .php? content = 40425

그리고 그것은 문서 나조차도 포함되어 있지 --help않지만 README는 다음과 같습니다.

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


죄송합니다. 승인 된 답변에 댓글에 따라 창 장식 포함되어 있기 때문에 이에 대한 찬사를 드려 죄송합니다 .
Adam Spiers

나는 그것이 사실이기를 바란다. 그러나 불행히도 그 의견은 틀렸다. 그들은 활성 창 ID에 동의합니다. wmiface가 창 장식을 포함하고 xdotool을 포함하지 않는 screenruler. 직접 해보십시오. $ wmiface frameGeometry wmiface activeWindow570x434 + 870 + 31 $ xdotool getwindowgeometry xdotool getactivewindow창 6291772 위치 : 878,77 (화면 : 0) 기하학 : 562x407
slinkp

죄송합니다, 내가 의미하는 바를 퍼즐로 풀 수 있기를 바랍니다. stackoverflow가 주석 코드 블록 샘플을 허용하길 바랍니다.
slinkp

3

xdotool 사용 :

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

sleep 3s && xdotool getactivewindow창을 열려면 3 초가 걸립니다

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

0

이 페이지에 대한 답변을 결합하여 이것을 사용했습니다.

$ sleep 3 && xdotool getwindowfocus getwindowgeometry

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

하나의 라이너를 실행 한 다음 3 초 이내에 위치와 형상을 원하는 창을 클릭하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.