답변:
당신은 조합하여이 작업을 수행 할 수 있어야 xrandr
하고 xwininfo
.
화면, 해상도 및 오프셋을 가져옵니다.
$ xrandr | grep -w connected | awk -F'[ \+]' '{print $1,$3,$4}'
VGA-0 1440x900 1600
DP-3 1600x900 0
현재 창의 위치를 가져옵니다
$ xwininfo -id $(xdotool getactivewindow) | grep Absolute
Absolute upper-left X: 1927
Absolute upper-left Y: 70
따라서 두 가지를 결합하면 현재 화면의 해상도를 얻을 수 있습니다.
#!/usr/bin/env bash
## Get screen info
screen1=($(xrandr | grep -w connected | awk -F'[ +]' '{print $1,$3,$4}' |
head -n 1))
screen2=($(xrandr | grep -w connected | awk -F'[ +]' '{print $1,$3,$4}' |
tail -n 1))
## Figure out which screen is to the right of which
if [ ${screen1[2]} -eq 0 ]
then
right=(${screen2[@]});
left=(${screen1[@]});
else
right=(${screen1[@]});
left=(${screen2[@]});
fi
## Get window position
pos=$(xwininfo -id $(xdotool getactivewindow) | grep "Absolute upper-left X" |
awk '{print $NF}')
## Which screen is this window displayed in? If $pos
## is greater than the offset of the rightmost screen,
## then the window is on the right hand one
if [ "$pos" -gt "${right[2]}" ]
then
echo "${right[0]} : ${right[1]}"
else
echo "${left[0]} : ${left[1]}"
fi
스크립트는 현재 화면의 이름과 해상도를 인쇄합니다.
xrandr
기본 하나로서 화면의 라벨 하나,이 오프가 발생합니다 awk
필드 추출. sed
기본 레이블을 삭제 하는 명령을 포함하면 다음과 같이 수정됩니다.xrandr | grep -w connected | sed 's/primary //' | awk -F'[ +]' '{print $1,$3,$4}'
@terdon의 (우수한) 솔루션을 수정하여 수평 및 / 또는 수직으로 쌓인 여러 모니터에서 작동하고 오프셋이 xrandr에서 잡히는 방식을 변경했습니다 (내 설정에서 작동하지 않았을 수 있습니다. xrandr 출력 형식의 변경).
#!/usr/bin/env bash
OFFSET_RE="\+([-0-9]+)\+([-0-9]+)"
# Get the window position
pos=($(xwininfo -id $(xdotool getactivewindow) |
sed -nr "s/^.*geometry .*$OFFSET_RE.*$/\1 \2/p"))
# Loop through each screen and compare the offset with the window
# coordinates.
while read name width height xoff yoff
do
if [ "${pos[0]}" -ge "$xoff" \
-a "${pos[1]}" -ge "$yoff" \
-a "${pos[0]}" -lt "$(($xoff+$width))" \
-a "${pos[1]}" -lt "$(($yoff+$height))" ]
then
monitor=$name
fi
done < <(xrandr | grep -w connected |
sed -r "s/^([^ ]*).*\b([-0-9]+)x([-0-9]+)$OFFSET_RE.*$/\1 \2 \3 \4 \5/" |
sort -nk4,5)
# If we found a monitor, echo it out, otherwise print an error.
if [ ! -z "$monitor" ]
then
echo $monitor
exit 0
else
echo "Couldn't find any monitor for the current window." >&2
exit 1
fi
xdotool
창이있는 화면을 출력 할 수도 있지만 Xinerama를 사용하는 경우 모든 모니터를 하나의 큰 화면으로 표시하면 0 만 출력됩니다.
어떤 이유로 나는 타일링 창 관리자와 함께 작동하는 @ adam-bowen의 대답을 얻을 수 없었지만 마우스 좌표를 사용하기위한 약간의 편집 작업이 효과적이었습니다.
#!/usr/bin/env bash
#
# Print's the current screen index (zero based).
#
# Modified from:
# https://superuser.com/a/992924/240907
OFFSET_RE="\+([-0-9]+)\+([-0-9]+)"
# Get the window position
eval "$(xdotool getmouselocation --shell)"
# Loop through each screen and compare the offset with the window
# coordinates.
monitor_index=0
while read name width height xoff yoff
do
if [ "${X}" -ge "$xoff" \
-a "${Y}" -ge "$yoff" \
-a "${X}" -lt "$(($xoff+$width))" \
-a "${Y}" -lt "$(($yoff+$height))" ]
then
monitor=$name
break
fi
((monitor_index++))
done < <(xrandr | grep -w connected |
sed -r "s/^([^ ]*).*\b([-0-9]+)x([-0-9]+)$OFFSET_RE.*$/\1 \2 \3 \4 \5/" |
sort -nk4,5)
# If we found a monitor, echo it out, otherwise print an error.
if [ ! -z "$monitor" ]
then
# echo $monitor
echo $monitor_index
exit 0
else
echo "Couldn't find any monitor for the current window." >&2
exit 1
fi
eval $(xdotool getmouselocation --shell)
의지는 트릭을 수행합니다. 다시 감사합니다.