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

실험을 통해 우분투에서 "입력 영역"이 무엇을 의미하는지 더 잘 이해하게 되었습니다. 테두리 기본 크기는 0이므로 창 주위에 10픽셀 영역이 있어 창을 잡고 크기를 조정할 수 있습니다. 다른 용도로 사용될 수도 있지만 입력 영역은 기본적으로 보이지 않는 10px 테두리와 같습니다. 따라서 xwininfo의 Absolute는 내부 창을 제공하는 반면, xwininfo -frame은 제목 표시줄과 그 주위의 추가 10px(입력 영역이 10px인 경우)을 포함하여 전체 창을 제공합니다. xprop... 입력 영역을 제외하고 장식의 크기만 제공합니다. 따라서 창의 기하학적 구조를 완전히 이해하려면 세 가지 명령이 모두 필요합니다.

이것은 내가 사용한 코드입니다(보이지 않는 입력 영역을 무시합니다).

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

관련 정보