현재 모니터 해상도 또는 모니터 이름을 얻는 방법 (LVDS, VGA1 등)


4

현재 모니터의 해상도 (스크립트를 실행 한 화면) 또는 화면 이름 (LVDS, VGA1 등)을 얻고 싶습니다.

해상도를 얻을 수 없지만 모니터 이름 만 얻는다면 'xrandr -q'출력을 grep하여 현재 해상도를 얻을 수 있습니다.

미리 감사드립니다.

답변:


4

당신은 조합하여이 작업을 수행 할 수 있어야 xrandr하고 xwininfo.

  1. 화면, 해상도 및 오프셋을 가져옵니다.

    $ xrandr | grep -w connected  | awk -F'[ \+]' '{print $1,$3,$4}'
    VGA-0 1440x900 1600
    DP-3 1600x900 0
    
  2. 현재 창의 위치를 ​​가져옵니다

    $ 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

스크립트는 현재 화면의 이름과 해상도를 인쇄합니다.


1
좋아 고마워! 이 xdotool을 몰랐습니다. 불행히도 내 창 관리자는 'getactivewindow'를 지원하지 않지만 eval $(xdotool getmouselocation --shell)의지는 트릭을 수행합니다. 다시 감사합니다.
멀린 Gaillard

경우 xrandr기본 하나로서 화면의 라벨 하나,이 오프가 발생합니다 awk필드 추출. sed기본 레이블을 삭제 하는 명령을 포함하면 다음과 같이 수정됩니다.xrandr | grep -w connected | sed 's/primary //' | awk -F'[ +]' '{print $1,$3,$4}'
mapeters

1

@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 만 출력됩니다.


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