Configuring Linux
8 July 2014

Автоматическое определение подключения\отключения второго монитора

Всем, доброго времени суток.


По сути, к реализации этой маленькой автоматизации меня сподвигла лень.

Собственно, с чего все началось.


У меня есть ноутбук с установленной gentoo, и i3wm оконным менеджером. Так же есть несколько мониторов(дома, на работе и т д). Разрешения на всех мониторах разные, способы подключения тоже (VGA, HDMI, DVI) разные. Активно, использую первые два.

Раньше, при подключении второго монитора, приходилось вызывать команды, которые инициализировали этот самый монитор. Запуск команды с автоматическим ключом, не всегда давал, желаемого результата(не угадывал разрешение).

xrandr --auto


Потому, приходилось запускать эту же команду, но с набором других ключей, разрешение например.

--mode

И хотя, в xrandr для каждого монитора у меня есть несколько вариантов разрешений, есть одно (максимальное для данного монитора, которое удовлетворяет), но на каждом мониторе оно разное(так как сами мониторы разные).

Потому пришлось искать решение…



Первым делом, мне нужно было как то решить вопрос, с выявлением ситуации подключения\отключения второго монитора.
Как оказалось, тут сложного ничего не было.

Все, что нам нужно, это заглянуть в директорию /etc/udev/rules.d, где собственно и будут храниться наши правила для монитора.

Далее нужно создать там файл. Создание файлов в этой директории, подчиняются парочке маленьких правил. А именно, то, что имена файлов должны иметь расширение .rules. И второе, не столь важное в данной ситуации. Все файлы расположены в алфавитном порядке, что влияет на порядок выполнения файла.

Я назвал свой файл так — 70-persistent-monitor.rules — лишь по аналогии с файлами, что уже были в этой папке.
Содержимое файла следующее
KERNEL=="card0", SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/bin/change_monitor.sh"


Для получения значений KERNEL и SUBSYSTEM выполните команду:

 sudo udevadm monitor


И подключите \отключите второй монитор



ACTION — указывает на какие действия реагировать, в данном случае на оба включение и отключение. И собственно RUN — тот скрипт который мы будем запускать. Из примера видно, что файл называется change_monitor.sh и находится в /usr/bin/. Хотя расположение, может быть и другим. Например /home/user/bin

Ну и собственно сам файл

#!/bin/sh

#export Display for output
export DISPLAY=:0.0

#some scripts for work
xrandr_command="/usr/bin/xrandr"
awk_command="/bin/awk"

#get max  resolution of connected devises

resolution_VGA=`${xrandr_command} | $awk_command '/VGA1 connected/ { getline; print  $1}'`

resolution_HDMI=`${xrandr_command} | $awk_command '/HDMI1 connected/ { getline; print  $1}'`

#if resolution exist we get true
if [ -n "$resolution_VGA" ]; then

#notify-send $resolution_VGA
xrandr --output VGA1 --above LVDS1 --mode $resolution_VGA

elif [ -n "$resolution_HDMI" ]; then

#notify-send $resolution_HDMI
xrandr --output HDMI1 --above LVDS1 --mode $resolution_HDMI

else

xrandr --auto

fi


Возможно, реализация не очень и красивая, но рабочая. Мы стараемся получить максимально установленное разрешение для подключенного монитора из output команды xrandr. В том случае, если монитор подключен, то строка /VGA1 connected будет найдена. Если нет то она будет VGA1 disconnected и ничего найдено не будет.

P.S на разных системах именование устройств (VGA1 HDMI1) — могут отличаться. для того, что бы увидеть, достаточно набрать в консоли xrandr


Тут я думаю, все понятно.

+35
26.1k 193
Comments 23