외부 모니터를 연결할 때 RandR 구성을 자동으로 적용하는 도구

외부 모니터를 연결할 때 RandR 구성을 자동으로 적용하는 도구

사람들이 다음을 수행할 수 있는 도구가 있습니까?

  • 각 디스플레이의 현재 RandR 구성(위치, 방향, 해상도 등)을 기억하세요.
  • 모니터가 연결되면 애플릿이나 xrandr(1)을 사용하여 처리할 필요 없이 마지막으로 알려진 양호한 구성이 자동으로 적용됩니다.

이러한 구성은 사용자별, 모니터별로 적용되어야 합니다.

그런 도구가 없다면 직접 만들어보고 싶지만, 제가 아는 한 모니터가 연결되어 있는지 알 수 있는 방법이 없습니다. 출력이 연결되었는지 또는 연결이 끊어졌는지 확인하기 위해 가끔 폴링하기 위해 xrandr -q를 사용해야 합니까, 아니면 이를 수행하는 더 효율적인 방법이 있습니까? udev가 이를 수행하도록 조정할 수 있습니까?

답변1

사용자별, 모니터별 모니터 구성 프로필을 저장할 수 있는 도구와 관련하여,자동 정렬그것이 바로 그것이 할 일입니다.

내 노트북에는 NVIDIA 카드가 있으므로 다음을 사용합니다.분산형 백엔드xrandr 대신. 그렇게 부르면 Autorandr는 Scatter를 백엔드로 사용하여 모니터를 관리합니다 autodisper. 하지만 이 글의 나머지 부분에서는 일관성을 위해 이를 " autorandr일관성"이라고 부르겠습니다.

를 사용하여 구성 파일을 저장할 수 있습니다 autorandr --save profile_name. autorandr단독으로 실행하면 프로필 목록이 제공되고 현재 구성으로 감지되는 프로필이 결정됩니다.

예를 들어:

$ autorandr
laptop
syncmaster19 (detected)

현재 구성에 적합한 구성 파일을 자동으로 로드하도록 지시할 수 있습니다 autorandr --change. 핫플러그에서 실행하기 위해 udev 규칙과 쌍을 이루는 이 명령은 요청한 작업을 수행합니다.

--default laptop추가 예방 조치로 현재 구성과 일치하는 저장된 프로필이 없는 경우 노트북의 디스플레이를 기본값으로 설정하는 명령을 추가했습니다 . 따라서 디스플레이를 전환하는 데 사용하는 전체 명령은 다음과 같습니다.

autorandr --change --default laptop

불행하게도 모니터를 핫 플러그하면 내 컴퓨터에서 udev 출력이 제공되지 않습니다. 저는 NVIDIA 독점 드라이버를 사용하고 있으므로 이는 놀라운 일이 아닙니다. 그래서 이제 XF68디스플레이 키(Fn-F8)에 바인딩했는데 거의 비슷합니다.

답변2

저는 VGA가 연결/연결 해제될 때 RandR을 계속 폴링하고 LVDS1과 VGA1 사이를 전환하는 간단한(직접 만든) 스크립트를 사용하고 있습니다. (을 위한HDMI출력은 다음 스크립트 파일에서 모두 ) VGA1로 변경됩니다.HDMI1

이것은 더러운 솔루션이지만 잘 작동합니다.

내 설정에 맞게 사용자 정의되었습니다. RandR 출력 이름 ( LVDS1VGA1나랑은 달라VGA의 RandR 기본 모드에 만족하실 수 있습니다.

#!/bin/bash

# setting up new mode for my VGA
xrandr --newmode "1920x1080" 148.5 1920 2008 2052 2200 1080 1089 1095 1125 +hsync +vsync
xrandr --addmode VGA1 1920x1080

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to VGA and vice versa
function ActivateVGA {
    echo "Switching to VGA1"
    xrandr --output VGA1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    MONITOR=VGA1
}
function DeactivateVGA {
    echo "Switching to LVDS1"
    xrandr --output VGA1 --off --output LVDS1 --auto
    MONITOR=LVDS1
}

# functions to check if VGA is connected and in use
function VGAActive {
    [ $MONITOR = "VGA1" ]
}
function VGAConnected {
    ! xrandr | grep "^VGA1" | grep disconnected
}

# actual script
while true
do
    if ! VGAActive && VGAConnected
    then
        ActivateVGA
    fi

    if VGAActive && ! VGAConnected
    then
        DeactivateVGA
    fi

    sleep 1s
done

전체 단계:

  1. 위 스크립트( homemadeMonitor.sh)를 원하는 디렉토리에 배치하세요.

  2. 터미널에 다음 명령을 입력하여 .sh 파일을 실행 가능하게 만듭니다.

    chmod +x homemadeMonitor.sh

  3. .sh 파일 실행

    ./homemadeMonitor.sh

답변3

질문의 "모니터가 연결되어 있는지 확인하는 [한 가지] 방법" 부분에 대답하려면 다음을 수행하십시오.

지원은 여전히 ​​다양하지만 최근 커널은 명시적 핫플러그가 발생할 때 udev 이벤트 생성을 지원합니다. 커널 2.6.38 및 ATI X1400 하드웨어를 사용하여 VGA 모니터를 처음 연결할 때 이벤트가 수신되지만 이후에 모니터 연결을 끊거나 다시 연결하면 이벤트가 발생하지 않습니다.Intel 하드웨어는 더 나은 지원을 제공할 수 있습니다.NVIDIA 독점 드라이버는 현재 KMS를 지원하지 않습니다. NVIDIA 하드웨어에서 핫플러그 이벤트를 찾아보진 않았지만 작동할지는 의문입니다.

udev를 사용해 보고 싶다면 다음 단계를 시도해 보세요.

  • 최신 커널로 업데이트
  • 커널 모드 설정(KMS)이 활성화되어 있는지 확인하세요. 활성화된 경우 커널 출력에 보고되어야 합니다. 나의 [drm] radeon kernel modesetting enabled평화[drm] initializing kernel modesetting
  • udevadm monitor --property모니터 연결을 (분리)할 때 이벤트가 보고되는지 실행 하고 확인하세요.

모니터 핫플러그에서 udev 이벤트를 수신하는 경우 udev 규칙을 사용하여 스크립트를 트리거할 수 있습니다. 예:

ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"

노트:이것은 것이다아니요독점 바이너리 드라이버와 함께 nVIDIA GPU를 사용하는 경우 KMS를 사용하지 않으므로 작동합니다. 당신은 할 수 있습니다아니요udev 이벤트를 가져옵니다.

답변4

위에서 제안한 udev 규칙을 다음과 같은 쉘 스크립트와 함께 사용했습니다.

#!/bin/sh

dmode="$(cat /sys/class/drm/card0-VGA-1/status)"
export DISPLAY=:0
export XAUTHORITY=/home/yourusername/.Xauthority

if [ "${dmode}" = disconnected ]; then
     /usr/bin/xrandr --auto
elif [ "${dmode}" = connected ];then
     /usr/bin/xrandr --output VGA1 --auto --right-of LVDS1
else /usr/bin/xrandr --auto
fi

Xauthority 부분은 내보내기만큼 중요합니다 . echo를 사용하여 어느 숫자가 같은지 확인할 DISPLAY수 있습니다 . 외부 디스플레이를 보려면 가지고 있습니다 $DISPLAY. xrandr -q마지막에 있는 else 문은 표시할 내용이 없어 막히지 않도록 하기 위한 것입니다.

관련 정보