나는 대답을 사용했다정확한 창 크기와 위치(트림 포함)를 어떻게 알 수 있나요?내 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