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


53

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

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

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

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


모니터에 카드가 연결되어 있는지 알 수있는 방법이 없습니까? udevadm monitor --property터미널에서 실행 하고 모니터를 연결해 보십시오 . 카드를 연결하면 이벤트가 표시됩니다. udev에서 + RUN 규칙과 일부 bash 스크립팅을 사용하여 원하는 것을 얻을 수 있습니다. 그러나 udev를 사용하여 사용자별로 어떻게 이것을 구현할 수 있는지 잘 모르겠습니다.
Steven D

@Steven : 귀하의 의견은 답변이되어야합니다. 완전한 답변은 아니지만 상당한 진전을 이루었습니다. udev에 하드웨어 이벤트가 표시되면 사용자 코드에서 볼 수있는 dbus 이벤트를 보내는 hal을 통지해야합니다.
Gilles

답변:


18

VGA가 연결 / 연결 해제 될 때 RandR을 폴링하고 LVDS1과 VGA1 사이를 전환하는이 간단한 (수제) 스크립트를 사용하고 있습니다. (들어 HDMI의 출력, 다음 스크립트 파일에 변경 모든 VGA1HDMI1)

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

내 설정에 맞게 사용자 정의되었습니다. 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. 눌러 터미널 열기 Ctrl+Alt+t
  2. 자동 전환 쉘 스크립트를 작성하고 저장하기에 적합한 위치로 이동하십시오. 예

    cd ./Desktop/

  3. 원하는 텍스트 편집기로 .sh 파일을 만들고 편집하십시오 (여기서는 pluma를 사용했습니다. nano, vim 등을 사용해 볼 수 있습니다). 편의상 이름을 지정하십시오. 예

    sudo pluma homemadeMonitor.sh

  4. 파일을 편집하고 위에서 언급 한 스크립트 (#! / bin / bash가있는 스크립트)의 모든 내용을 복사하여 붙여 넣기

  5. 터미널에 다음 명령을 입력하여 .sh 파일을 실행 가능하게하십시오.

    sudo chmod +x homemadeMonitor.sh

  6. .sh 파일을 실행하십시오.

    ./homemadeMonitor.sh


좋은 대본! 고마워, 나는 이런 것이 필요했다. 방금 복사하여 자동 실행되도록 설정했습니다. 감사!
Linuxios

21

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

지원은 여전히 ​​다양하지만 최근 커널에서는 디스플레이 핫 플러그가 발생할 때 udev 이벤트를 생성 할 수 있습니다. 커널 2.6.38 및 ATI X1400 하드웨어를 사용하면 VGA 디스플레이를 처음 연결할 때 이벤트가 발생하지만 디스플레이의 연결을 끊거나 다시 연결하면 이벤트가 발생하지 않습니다. 인텔 하드웨어가 더 잘 지원 될 수 있습니다. 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"

참고 : 이 것 없는 당신은 독점적 인 바이너리 드라이버와 엔비디아 GPU를 사용하는 경우는 KMS를 사용하지 않기 때문에, 작동합니다. udev 이벤트 는 받지 않습니다 .


19

사용자 별 및 디스플레이별로 모니터 구성 프로파일을 저장할 수있는 도구와 관련하여 autorandr는이를 정확하게 수행합니다. https://github.com/wertarbyte/autorandr .

내 노트북에는 NVIDIA 카드가 있으므로 xrandr 대신 http://willem.engen.nl/projects/disper/ 대신 disper 백엔드를 사용합니다 . Autorandr는로 전화하면 모니터를 관리하기 위해 백엔드로 disper를 사용합니다 autodisper. 이 게시물의 나머지 부분 autorandr에서는 일관성에 대해 언급하겠습니다 .

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

예를 들어 :

$ autorandr
laptop
syncmaster19 (detected)

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

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

autorandr --change --default laptop

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


1
autorandr는 시간 낭비, 문서화 불량, 임의 모니터 깜박임, 설치 / 제거 지침이 없었습니다. 사용하여 해결할 수udev
레오 갈루치에게

5
이런 경우에, 재기의-파이썬의 포크 유지 멋진있다 autorandr: github.com/phillipberndt/autorandr
Olegs Jeremejevs

7

위에서 제안한 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 부분은 export뿐만 아니라 필수적이며 DISPLAYecho $DISPLAY를 사용 하여 같은 숫자를 확인할 수 있습니다 . xrandr -q가지고있는 외부 모니터를 보는 데 사용 하십시오. 마지막 else 문은 디스플레이 없이는 절대 멈추지 않도록하는 것입니다.



5

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

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

UDEV 규칙
위 명령의 출력에 따라 사용자는이 UDEV 규칙을에 만들었습니다 /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

3

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

#! / bin / bash

SCREEN_LEFT = DP2
SCREEN_RIGHT = eDP1
START_DELAY = 5

레 니체 +19 $$> / dev / null

수면 $ START_DELAY

OLD_DUAL = "더미"

[1] 동안; 하다
    듀얼 = $ (고양이 / sys / class / drm / card0-DP-2 / 상태)

    [ "$ OLD_DUAL"! = "$ DUAL"] 인 경우; 그때
        [ "$ DUAL"== "connected"] 인 경우; 그때
            에코 '듀얼 모니터 설정'
            xrandr-출력 $ SCREEN_LEFT-자동-일반 회전 --pos 0x0-출력 $ SCREEN_RIGHT-자동-정상 회전-$ SCREEN_LEFT 이하
        그밖에
            에코 '단일 모니터 설정'
            xrandr-자동
        fi

        OLD_DUAL = "$ DUAL"
    fi

    inotifywait -q -e 닫기 / sys / class / drm / card0-DP-2 / status> / dev / null
끝난

xrandr와의 폴링은 새로운 랩탑에서 사용성에 심각한 문제를 일으켰습니다 (마우스는 주기적으로 멈춤).


1

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

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

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

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

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


1

예를 들어 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

0

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

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 개만 작동했고 때로는 중단되었습니다.

https://github.com/nalipaz/poll-xrandr/releases/ 에서 최신 .deb를 다운로드 한 다음

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 &

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

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