Автоматическое определение подключения\отключения второго монитора
Всем, доброго времени суток. По сути, к реализации этой маленькой автоматизации меня сподвигла лень.Собственно, с чего все началось. У меня есть ноутбук с установленной 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
Тут я думаю, все понятно.