it-swarm-ko.tech

외부 디스플레이가 연결될 때 RandR 구성을 자동으로 적용하기위한 도구

다음을 수행 할 수있는 도구가 있습니까?

  • 모니터별로 현재 RandR 구성 (위치, 방향, 해상도 등)을 기억하십시오.
  • 애플릿이나 xrandr (1)를 사용하지 않고 디스플레이를 연결하자마자 마지막으로 성공한 구성을 자동으로 적용합니까?

구성은 사용자별로, 디스플레이별로 적용되어야합니다.

야생에 그러한 도구가 없다면 직접 도구를 던지고 싶지만 볼 수있는 한 모니터가 연결되었다는 것을 알 수있는 방법이 없습니다. xrandr -q로 폴링해야합니까? 가끔씩 출력이 연결되거나 연결이 끊어진 것을 알아 내거나 더 효율적인 방법이 있습니까? udev가 바로 그렇게 할 수 있습니까?

58
Yaroslav Fedevych

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

20
peoro

질문의 "모니터가 연결되어 있는지 확인하는 방법"에 응답 :

지원은 여전히 ​​상당히 다양하지만 최근 커널에서는 디스플레이 핫 플러그가 발생할 때 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를 사용하지 않으면 작동합니다 not KMS. not udev 이벤트를받습니다.

21
Andy

사용자 별 및 디스플레이별로 모니터 구성 프로파일을 저장할 수있는 도구와 관련하여 autorandr 는 정확히 그렇게합니다.

내 노트북에는 NVIDIA 카드가 있으므로 xrandr 대신 disper backend 를 사용합니다. Autorandr는 모니터를 autodisper라고 부르면 모니터를 관리하기 위해 백엔드로 disper를 사용합니다. 이 게시물의 나머지 부분에서는 일관성을 위해 autorandr라고합니다.

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

예를 들어 :

$ autorandr
laptop
syncmaster19 (detected)

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

추가 예방 조치로 --default laptop를 해당 명령에 추가했습니다. 현재 구성과 일치하는 저장된 프로파일이없는 경우 랩톱의 디스플레이가 기본값이됩니다. 따라서 디스플레이를 전환하는 데 사용하는 전체 명령은 다음과 같습니다.

autorandr --change --default laptop

불행히도 내 컴퓨터는 모니터를 핫 플러그 ​​할 때 udev 출력을 제공하지 않습니다. NVIDIA 독점 드라이버를 사용하고 있으므로 놀랍지 않습니다. 그래서 지금은 XF68Display 키 (Fn-F8)에 바인딩했습니다.

19
Jack Senechal

위에서 제안한 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

내보내기 DISPLAY뿐만 아니라 Xauthority 부분은 필수입니다. echo $DISPLAY 같은 숫자를 확인하십시오. 사용하다 xrandr -q 가지고있는 외부 모니터를 봅니다. 마지막 else 문은 디스플레이 없이는 절대 멈추지 않도록하는 것입니다.

7
Cappie

X 서버가 변경된 모니터 구성에 대해 알릴 때까지 기다렸다가 주어진 명령 (예 : 다른 답변에서 언급 된 autorandr)을 실행하는 작은 프로그램은 다음 위치에서 사용할 수 있습니다. https : // bitbucket .org/portix/srandrd/overview

이것은 udev (올바른 X 서버 등을 찾는 것에 대해 걱정 해야하는 곳)를 사용하는보다 깨끗한 솔루션 인 것 같습니다.

6
Joachim Breitner

플러그를 꽂을 때 디스플레이를 자동으로 감지해야하는 경우 가장 깨끗한 해결책은 xrandr 명령이 포함 된 스크립트를 실행하기 위해 UDEV 규칙을 추가하는 것 같습니다. 다음은 한 사용자 솔루션의 예입니다 .- 1 :

udevadm을 사용하여 UDEV 이벤트 모니터링 (출력)
이 단계는 각 사용자에게 가장 중요합니다. 운영 udevadm monitor --environment --udev. 그런 다음 HDMI 케이블을 연결하십시오.

DEV 규칙
위 명령의 출력을 기반으로 사용자는 /etc/udev/rules.d/95-monitor-hotplug.rules.

KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/dan/.Xauthority", RUN+="/usr/local/bin/hotplug_monitor.sh"

Xrandr이 사용자 프로파일 하에서 실행되도록 사용 된 환경 변수에 유의하십시오.

xrandr 스크립트 hotplug_monitor.sh

필요에 따라 xrandr 옵션을 조정할 수 있습니다.

#! /usr/bin/bash

export DISPLAY=:0
export XAUTHORITY=/home/dan/.Xauthority

function connect(){
    xrandr --output HDMI1 --right-of LVDS1 --preferred --primary --output LVDS1 --preferred 
}

function disconnect(){
      xrandr --output HDMI1 --off
}

xrandr | grep "HDMI1 connected" &> /dev/null && connect || disconnect
5
iyrin

어떤 이유로 든 핫 플러그 ​​경로를 사용하지 않으려는 경우 inotifywait를 사용하여 스크립트 내에서 폴링하지 않을 수 있습니다.

 #!/bin/bash 
 
 SCREEN_LEFT = DP2 
 SCREEN_RIGHT = eDP1 
 START_DELAY = 5 
 
 renice +19 $$>/dev/null 
 
 sleep $ START_DELAY 
 
 OLD_DUAL = "dummy"
 
 동안 [ 1 ]; do 
 DUAL = $ (cat /sys/class/drm/card0-DP-2/status)

 if [ "$$ _ DUAL"! = "$ DUAL"]; 그런 다음 
 if [ "$ DUAL"== "connected"]; 그런 다음 
 echo '듀얼 모니터 설정'
 xrandr --output $ SCREEN_LEFT --auto-정상 회전 --pos 0x0 --output $ SCREEN_RIGHT --auto-정상 회전-아래 $ SCREEN_LEFT 
 else 
 echo '단일 모니터 설정'
 xrandr --auto 
 fi 
 
 OLD_DUAL = "$ DUAL"
 fi 
 
 inotifywait -q -e 닫기/sys/class/drm/card0-DP-2/status>/dev/null 
 완료 
 

Xrandr와의 폴링은 내 새로운 랩톱에서 심각한 사용성 문제를 일으켰습니다 (마우스가 주기적으로 정지합니다).

3
Balzola

예를 들어 Xfce를 단순화하려면 배포판에서 사용할 수있는 "arandr"을 설치하십시오. 예를 들어 "arandr"을 사용하여 디스플레이를 구성한 다음 "displayLayout"으로 저장하십시오. Arandr는 ".sh"확장자를 추가하여 위의 iyrin이 언급 한 "hotplug_monitor.sh"스크립트에 작성된대로 "function connect ()"에서 직접 사용할 수 있도록합니다. 예를 들면 다음과 같습니다.

function connect(){
 /path/to/displayLayout.sh
}

연결 해제 메커니즘을 사용하려면 다음과 같이 "#!/bin/bash"바로 아래에 스크립트 맨 위에 추가하십시오.

#!/bin/bash
#
PLUGGED_EXTERNAL=`xrandr | awk /"connected [0-9]"/'{print $1}'`

xrandr은 디스플레이를 감지하고 출력을 awk로 전달하여 정규식 "connected"와 그 뒤에 본질적으로 원하는 숫자를 기준으로 필터링합니다. 제 생각에는 기본 디스플레이가 "연결된 기본"과 숫자, 즉 해상도와 같이보고되기 때문에 정규 표현식에서 정확한 해상도와 일치시킬 필요는 없습니다. 그런 다음 awk "print $ 1"은이 경우 외부 모니터의 이름 인 첫 번째 열만 인쇄하며 PLUGGED_EXTERNAL 변수에 저장됩니다. 다음 스크립트 $ PLUGGED_EXTERNAL에서 고정 표시 이름 "HDMI1"대신 다음과 같이 사용할 수 있습니다.

function disconnect(){
  xrandr --output $PLUGGED_EXTERNAL --off
}

xrandr | grep "$PLUGGED_EXTERNAL connected" &> /dev/null && connect || disconnect
1
user180381

이 질문을 보는 사람들은 그놈을 사용하려는 사람들이 아니고 그놈을 사용하는 사람들은이 질문을 볼 필요는 없지만 완전성을 위해 관심을 가질 것입니다.

그놈에는이 기능이 내장되어 있습니다. gnome-control-center를 통해 설정을 변경하면 gnome-settings-daemon이이를 기억합니다 (.config/monitors.xml) 모니터를 꽂거나 뺄 때 자동으로 적용됩니다.

안타깝게도 monitors.xml 파일의 구성은 잘 문서화되어 있지 않습니다. 질문 여기 를 참조하십시오. 그놈 디스플레이 툴링은 또한 패닝, 모니터 당 스케일링을 설정하는 수단이 없으며 축소하지 않습니다. 많은 사람들이 일반 DPI 화면과 함께 HiDPI 랩톱 화면을 사용함에 따라 도구로는 실행 가능한 솔루션을 얻는 데 충분하지 않습니다.

나는 이것을 Wayland에 대한 로드맵 항목으로 언급 을 보았지만 마침내 올 때 언급 한 문제에 대한 수정 사항을 볼 수 있습니다. 그때까지 Gnome에서 xrandr를 수동으로 설정하기 위해 지연된 후 시작 스크립트를 실행했습니다.

1
Joachim Breitner

Peoro의 솔루션을 사용할 때 xrandr에서 추가 출력을 얻었으므로 grep에 -c 옵션을 사용하여 일치 횟수를 계산했습니다. HDMI에 맞게 조정하고 오디오 스위치도 추가했습니다.

#!/bin/bash
# adapted from http://unix.stackexchange.com/questions/4489/

# default monitor is LVDS1
MONITOR=LVDS1

# functions to switch from LVDS1 to HDMI1
function ActivateHDMI {
    xrandr --output HDMI1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
    pactl set-card-profile 0 output:hdmi-stereo-extra1
    MONITOR=HDMI1
}
function DeactivateHDMI {
    xrandr --output HDMI1 --off --output LVDS1 --auto
    pactl set-card-profile 0 output:analog-stereo
    MONITOR=LVDS1
}

# functions to check if HDMI is connected and in use
function HDMIActive {
    [ $MONITOR = "HDMI1" ]
}
function HDMIConnected {
    [[ `xrandr | grep "^HDMI1" | grep -c disconnected` -eq 0 ]]
}

# actual script
while true
do
    if ! HDMIActive && HDMIConnected
    then
        ActivateHDMI
    fi

    if HDMIActive && ! HDMIConnected
    then
        DeactivateHDMI
    fi

    sleep 1s
done
1
Aaros

설정을보다 간단하게하기 위해 내 답변을 편집합니다.

Xrandr에서 화면 레이아웃을 자동화하기 위해 autorandr를 설치하고 https://github.com/nalipaz/autorandr/releases 에서 최신 .deb를 가져 와서 다음을 실행하십시오.

dpkg -i [file]

저장된 화면 레이아웃으로 자동 랜 설정

autorandr --save [docked|mobile|home|etc]

예를 들어, 모니터가 연결되지 않은 랩톱에서 원하는 방식으로 설정하고 실행했습니다.

autorandr --save mobile

그런 다음 hdmi를 연결하고 arandr를 재구성 한 후 다음을 실행했습니다.

autorandr --save docked

각 레이아웃을 설정 한 후 실행할 수 있습니다 ( 'mobile'을 이전에 선호하는 이름으로 바꾸고 mobile을 사용했습니다).

autorandr --default mobile

이제 autorandr가 모두 설정되었으므로 연결된 디스플레이를 폴링하고 감지시 autorandr --change를 실행하는 패키지를 설치하여 프로세스를 자동화 할 수 있습니다. 그렇습니다, 나는 udev에 대해 알고 있으며 그것이 당신에게 효과가 있다면 그것을 설정할 수 있지만, 내 테스트에서 udev는 hdmi에서 일관되게 작동하지 않았습니다. 그것은 20 개의 플러그/언 플러그마다 1 개만 작동했고 때로는 중단되었습니다.

여기에서 최신 .deb를 다운로드하십시오 : https://github.com/nalipaz/poll-xrandr/releases/

dpkg -i [file]

autorandr --change 완료시 더 많은 작업을 실행해야 할 가능성이 가장 높습니다. autorandr를 사용하면 이러한 명령을 ~/.autorandr/postswitch라는 파일에 삽입 할 수 있습니다. 다음과 같이하십시오 :

cd ~/.autorandr/ && touch postswitch && chmod +x postswitch

이제 postswitch 파일을 편집하여 다음과 비슷한 내용을 갖습니다.

#!/bin/bash
if pidof conky > /dev/null 2>&1; then
  killall conky
fi
(sleep 2s && xrandr-adjust-brightness restore -q) &
(sleep 2s && nitrogen --restore) &
(sleep 3s && conky -q) &

또한 autorandr 및 poll-xrandr를 다음 두 명령과 같은 스타트 업에 추가 할 수 있습니다.

autorandr --change &
poll-xrandr &

모니터의 플러그를 뽑거나 꽂고 마술을보십시오!

0
nicholas.alipaz