Инструмент для того, чтобы автоматически применить конфигурацию RandR, когда внешний дисплей включается

Обратите внимание, что этими условиями не является Linux определенная но конкретная файловая система. Большинство файловых систем, используемых текущим Unix и Unix как системы, или получено или вдохновлено исходной файловой системой Unix, которая определила суперблок и inode идиомы. Linux может также смонтировать несколько файловых систем, с которыми нет никакого понятия суперблока и/или inode, при этом наиболее распространенным является FAT. Другой, ZFS, не использует суперблоки, но überblocks.

55
02.12.2010, 16:12
11 ответов

Я использую этот простой (самодельный) сценарий, который продолжает опрашивать 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. Помещенный выше сценария (homemadeMonitor.sh) в Вас предпочтенный каталог

  2. Сделайте .sh исполняемый файл файла путем ввода следующей команды в терминале

    chmod +x homemadeMonitor.sh

  3. Выполните .sh файл

    ./homemadeMonitor.sh

19
27.01.2020, 19:33
  • 1
    Хороший сценарий! Спасибо, мне было нужно что-то вроде этого. Я просто скопировал его и настроил его для выполнения автоматически.Спасибо! –  Linuxios 01.02.2012, 01:20

Ответ к" способ сказать, что монитор был включен в" части вопроса:

Поддержка все еще варьируется вполне немного, но с недавними ядрами существует некоторая поддержка генерации 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"

Примечание: Это не будет работать при использовании GPU NVIDIA с собственным двоичным драйвером так как он не использует KMS. Вы не получите udev событий.

21
27.01.2020, 19:33

Относительно инструмента, который может сохранить профили конфигурации монитора на основе на дисплей и в расчете на пользователя, autorandr сделает точно это. https://github.com/wertarbyte/autorandr.

Мой ноутбук имеет карту NVIDIA, таким образом, я использую disper бэкенд вместо xrandr: http://willem.engen.nl/projects/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) на данный момент, который является почти как хороший.

19
27.01.2020, 19:33
  • 1
    autorandr был пустой тратой времени, плохо зарегистрированные, случайные мигания монитора, никакие инструкции по установке/удалению. Мог решить его использование udev –  Leo Gallucci 26.01.2014, 17:38
  • 2
    На всякий случай, существует хорошее сохраняемое переписанное в Python ветвление autorandr: github.com/phillipberndt/autorandr –  Olegs Jeremejevs 17.11.2017, 15:14

Я использовал правило 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 для наблюдения внешних мониторов, Вы имеете. Последнее еще оператор должен только удостовериться, что Вы никогда не застреваете без дисплея.

7
27.01.2020, 19:33

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

Похоже, это более чистое решение, использующее udev (где нужно беспокоиться о поиске подходящего X-сервера и т.д.)

.
6
27.01.2020, 19:33

Полагаю, что люди, смотрящие на этот вопрос, не те, кто хочет использовать GNOME, и тем, кто использует GNOME, не пришлось бы смотреть на этот вопрос, но в интересах полноты:

GNOME имеет эту функциональность встроенную. Если вы измените настройку через gnome-control-center, gnome-settings-daemon запомнит её (в .config/monitors.xml) и автоматически применит её, когда монитор будет подключён или отключён.

К сожалению, конфигурация в файле monitors.xml плохо документирована. См. вопрос здесь . Инструментарий отображения гномов также не имеет средств настройки панорамирования, масштабирования для каждого монитора и не выполняет масштабирование. Поскольку многие люди используют экран ноутбука HiDPI вместе с обычным экраном DPI, этих инструментов недостаточно для получения работоспособного решения.

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

1
27.01.2020, 19:33

При использовании решения PEORO у меня есть дополнительный вывод из 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
27.01.2020, 19:33

Если у вас, должно быть, он, должно быть, он автоматически определяет отображение, когда он подключен, кажется, что самое чистое решение состоит в том, чтобы добавить правило 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 Script 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
27.01.2020, 19:33

Редактирование моего ответа, чтобы сделать его проще для настройки.

Установите AUTORANDR для автоматизации макета экрана в Xrandr, захватите последнюю .deb из https://github.com/nalipaz/autplestrandr/reluses и Run:

dpkg -i [file]

Установка AutoRandr с сохраненными макетами экрана

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

В качестве примера, на моем ноутбуке без каких-либо мониторов подключил, я настроил Arandr так, как я так хочу, а затем запустил:

autorandr --save mobile

затем подключил мой HDMI и перенастроить Arandr, затем RAN:

autorandr --save docked

после настройки каждого из ваших Макеты Вы можете запустить (заменить «мобильный» с предыдущим любимым именем, я использовал Mobile):

autorandr --default mobile

Теперь, когда AutoRandr - это все настройки, вы можете автоматизировать процесс, установив пакет, который будет опросить для подключенных дисплеев и запустить AutoRandr - -майте при обнаружении. Да, я знаю о UDEV, и вы можете установить это, если это работает для вас, но в моем тестировании UDEV не работал на моем HDMI последовательно. Он работал только 1 из каждых 20 заглушек / отключений или около того, а иногда он просто остановился вообще.

Скачать последний .deb отсюда: https://github.com/nalipaz/poll-xrandr/relestest/ Затем установить с

dpkg -i [file]

, скорее всего, необходимо, чтобы вы запустили больше задач на Завершение AutoRandr --Change , AutoRandr позволяет вставлять эти команды в файл, называемый ~ / .auTorandr / postswitch. Делайте следующим образом:

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

Теперь отредактируйте файл PostWitch, чтобы иметь что-то похожее на следующее:

#!/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
27.01.2020, 19:33

Для тех, кто по какой-либо причине не хочет использовать маршрут горячего подключения, все еще можно не проводить опрос в сценарии с помощью inotifywait:

#!/bin/bash

SCREEN_LEFT=DP2
SCREEN_RIGHT=eDP1
START_DELAY=5

renice +19 $$ >/dev/null

sleep $START_DELAY

OLD_DUAL="dummy"

while [ 1 ]; do
    DUAL=$(cat /sys/class/drm/card0-DP-2/status)

    if [ "$OLD_DUAL" != "$DUAL" ]; then
        if [ "$DUAL" == "connected" ]; then
            echo 'Dual monitor setup'
            xrandr --output $SCREEN_LEFT --auto --rotate normal --pos 0x0 --output $SCREEN_RIGHT --auto --rotate normal --below $SCREEN_LEFT
        else
            echo 'Single monitor setup'
            xrandr --auto
        fi

        OLD_DUAL="$DUAL"
    fi

    inotifywait -q -e close /sys/class/drm/card0-DP-2/status >/dev/null
done

Опрос с помощью xrandr вызвал серьезные проблемы с удобством использования на моем новом ноутбуке ( мышь периодически глохнет).

3
27.01.2020, 19:33

Например, для упрощения в Xfce установите "arandr", который должен быть доступен в пакетах вашего дистрибутива. Настройте свой дисплей с помощью «arandr», а затем сохраните его, например, как «displayLayout». Arandr должен добавить для вас расширение ".sh", чтобы его можно было напрямую использовать в "function connect ()", как написано в сценарии "hotplug_monitor.sh", упомянутом iyrin выше, например:

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. Далее вместо фиксированного отображаемого имени "HDMI1" в скрипте можно использовать $ PLUGGED_EXTERNAL так:

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

xrandr | grep "$PLUGGED_EXTERNAL connected" &> /dev/null && connect || disconnect
1
27.01.2020, 19:33

Теги

Похожие вопросы