Інструмент для автоматичного застосування конфігурації RandR при включенні зовнішнього дисплея


54

чи є інструмент, який дозволяє:

  • пам'ятайте поточну конфігурацію RandR (положення, орієнтацію, роздільну здатність тощо) на основі монітора,
  • автоматично застосувати останню відому гарну конфігурацію, як тільки дисплей підключений, без необхідності гнатися за допомогою аплетів чи xrandr (1)?

Конфігурації повинні застосовуватися на основі кожного користувача, на дисплеї.

Якщо в дикій природі немає такого інструменту, я хотів би сам зібрати один, але, наскільки я бачу, немає способу сказати, що монітор підключений. Чи потрібно опитуватись за допомогою xrandr -q час від часу з’ясовувати, що вихід був підключений чи відключений, чи існує більш ефективний спосіб зробити це? Чи можна налаштувати удев робити саме це?


Ви впевнені, що немає можливості сказати, що до вашої картки підключено монітор. Спробуйте запустити udevadm monitor --propertyз терміналу і підключити монітор. На моїй картці я бачу подію, коли вона підключена. Можливо, ви зможете скористатися правилом + RUN в udev і деяким сценарієм bash, щоб отримати те, що ви хочете. Однак я не впевнений, як ви могли б реалізувати це на основі кожного користувача, використовуючи udev.
Стівен Д

@Steven: Ваш коментар повинен бути відповіддю. Це не є повною відповіддю, але вона суттєво просувається. Якщо udev дійсно бачить апаратну подію, він повинен повідомити hal, який надсилає подію dbus, яку можна побачити за кодом користувача.
Жил 'ТАК - перестань бути злим'

Відповіді:


19

Я використовую цей простий (саморобний) сценарій, який продовжує опитувати RandR і перемикається між LVDS1 і VGA1, коли VGA підключається / відключається. (Для виходів HDMI у наступному файлі скриптів змініть все VGA1на HDMI1)

Це брудне рішення, але воно працює чудово.

Це налаштовано для моєї настройки: вам, швидше за все, знадобиться змінити вихідні імена RandR ( LVDS1і VGA1), і на відміну від мене, ви, ймовірно, буде добре з вашим режимом RandR за замовчуванням для VGA.

#!/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

Відповідаючи на "[a] спосіб сказати, що монітор підключений", частина запитання:

Підтримка все ще досить різниться, але з останніми ядрами є певна підтримка для генерування подій 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. Ви не отримаєте жодних подій удеву.


19

Що стосується інструменту, який може зберігати профілі конфігурації монітора на основі кожного користувача та на дисплеї, то авторndr зробить саме це. https://github.com/wertarbyte/autorandr .

Мій ноутбук має NVIDIA-карту, тому я використовую дисперсний бекенд замість xrandr: http://willem.engen.nl/projects/disper/ . Autorandr використовуватиме дисперс як резервний сервер для керування вашими моніторами, якщо ви називаєте це як autodisper. Щодо решти цієї публікації, я буду вважати її autorandrпослідовністю.

Ви можете зберігати профілі за допомогою autorandr --save profile_name. Запуск autorandrсам по собі дасть вам список профілів та визначить, який з них виявлений як поточна конфігурація.

Наприклад:

$ autorandr
laptop
syncmaster19 (detected)

Ви можете сказати йому, що автоматично завантажує відповідний профіль для поточної конфігурації autorandr --change. Ця команда, поєднана з правилом udev, щоб запустити її під час підключення до гарячої мережі, зробить те, що ви просили.

В якості додаткового застереження я додав --default laptopцю команду, яка зробить її за замовчуванням на дисплеї ноутбука, якщо немає збереженого профілю, який відповідає поточній конфігурації. Отже, повна команда, яку я використовую для перемикання дисплеїв:

autorandr --change --default laptop

На жаль, моя машина не дає жодного результату, коли я підключаю монітор. Я використовую власні драйвери 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 є важливою, як і експорт DISPLAY, ви можете використовувати ехо, $DISPLAYщоб побачити, якому номеру воно дорівнює. Використовуйте xrandr -qдля перегляду зовнішніх моніторів. Останнє ще одне твердження - це просто переконатися, що ви ніколи не застряєте без дисплея.


6

Невелика програма, яка чекає, коли X-сервер сповістить його про змінену конфігурацію монітора, а потім виконає задану команду (наприклад, autorandrзгадану в іншій відповіді), доступна за адресою: https://bitbucket.org/portix/srandrd/overview

Це, здається, є більш чистим рішенням для використання udev(там, де вам доведеться турбуватися про пошук правильного X-сервера тощо)


5

Якщо вам потрібно, щоб він автоматично розпізнавав дисплей під час його підключення, здається, що найчистішим рішенням є додавання правила UDEV для запуску сценарію, що містить ваші команди xrandr. Ось приклад рішення 1 для одного користувача :

Контроль (вихід) подій UDEV за допомогоюudevadm
цього кроку буде найважливішим для кожного користувача. Біжи 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:

#! / бін / баш

SCREEN_LEFT = DP2
SCREEN_RIGHT = eDP1
START_DELAY = 5

renice +19 $$> / dev / null

сон $ START_DELAY

OLD_DUAL = "манекен"

поки [1]; робити
    DUAL = $ (cat / sys / class / drm / card0-DP-2 / status)

    if ["$ OLD_DUAL"! = "$ DUAL"]; тоді
        if ["$ DUAL" == "підключено"]; тоді
            echo "Налаштування подвійного монітора"
            xrandr - вихід $ SCREEN_LEFT --auto - повернути нормально --pos 0x0 --output $ SCREEN_RIGHT --auto - повернути нормально - нижче $ SCREEN_LEFT
        ще
            echo "Один параметр монітора"
            xrandr --auto
        фі

        OLD_DUAL = "$ DUAL"
    фі

    inotifywait -q -e закрити / sys / class / drm / card0-DP-2 / status> / dev / null
зроблено

Опитування з xrandr спричинило серйозні проблеми в користуванні на моєму абсолютно новому ноутбуці (миша періодично буде зупинятися).


1

Під час використання розчину пеоро я отримав додатковий вихід від xrandr, тому я використав опцію -c для grep, яка підраховує кількість збігів. Я адаптував його для 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, а ті, хто використовує GNOME, не повинні дивитись на це питання, а в інтересах повноти:

У GNOME вбудована ця функціональність. Якщо ви змінили налаштування через gnome-control-center, gnome-settings-daemon запам'ятовує його (in .config/monitors.xml) і автоматично застосовує його, коли монітор підключається або вимикається.

На жаль, конфігурація у файлі monitors.xml недостатньо задокументована. Дивіться тут питання . Інструмент дисплея gnome також не має можливості налаштування панорамування, масштабування на монітор, і це не дозволяє зменшити масштаб. Оскільки багато людей використовують екран ноутбука HiDPI разом із звичайним екраном DPI, інструментів недостатньо для отримання ефективного рішення.

Я бачив, що це згадується як пункт дорожньої карти для Wayland, хоча так, коли він нарешті приходить, ми можемо побачити виправлення зазначених проблем. До цього часу на Gnome я просто запускаю сценарій запуску після затримки для установки xrandr вручну.


1

Наприклад, для спрощення в Xfce, будь-ласка, встановіть "arandr", який повинен бути доступний у ваших дистрибутивах. Налаштуйте ваш дисплей за допомогою "arandr", а потім збережіть його як "displayLayout". Arandr повинен додати для вас розширення.

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

Щоб використовувати механізм відключення, додайте у верхній частині сценарію трохи нижче "#! / Bin / bash", наприклад:

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

xrandr виявить дисплей і передасть висновок awk, який буде фільтрувати його, грунтуючись на регулярному виразі "підключений", а потім цифрою, що по суті є тим, що ми хочемо. На мою думку, не обов'язково співставляти точну роздільну здатність у регулярному вираженні, оскільки первинний дисплей повідомляється як "з'єднаний первинний" з наступним числом, тобто роздільною здатністю. Тоді awk "print $ 1" надрукує лише перший стовпець, який у цьому випадку є ім'ям зовнішнього монітора, і він буде збережений у змінній PLUGGED_EXTERNAL. Далі замість фіксованого відображуваного імені "HDMI1" у сценарії $ PLUGGED_EXTERNAL можна використовувати так:

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

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

0

Редагування моєї відповіді, щоб спростити налаштування.

Встановіть autorandr для автоматизації розміщення екрана в xrandr, перейдіть останнє .deb з https://github.com/nalipaz/autorandr/release та запустіть:

dpkg -i [file]

Налаштування autorandr із збереженими макетами екрана

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

Наприклад, на своєму ноутбуці без будь-яких підключених моніторів я встановив арандр так, як мені хочеться, а потім побіг:

autorandr --save mobile

Потім підключив мій hdmi і переналаштував арандр, потім побіг:

autorandr --save docked

Після налаштування кожного з ваших макетів ви можете запустити (замінивши "мобільний" попереднім прізвищем, я використовував мобільний):

autorandr --default mobile

Тепер, коли авторndr все налаштований, ви можете автоматизувати процес, встановивши пакет, який опитатиме підключені дисплеї та працюватиме autorandr --changeпри виявленні. Так, я знаю про udev, і ви можете встановити це, якщо він працює для вас, але в моєму тестуванні udev не працював для мого hdmi послідовно. Він працював лише 1 з кожні 20 штепсельних вилок / роз'єднань, а іноді й зовсім зупинявся.

Завантажте останню версію .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) &

Крім того, ви, ймовірно, захочете додати авторів і опитувальник-xrandr до своїх стартапів, як-от такі дві команди:

autorandr --change &
poll-xrandr &

Відключіть чи підключіть до монітора та спостерігайте за чарами!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.