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

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


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

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


    У меня есть ноутбук с установленной 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


    Тут я думаю, все понятно.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 23

      +1
      sudo udevadm monitor ничего не показал =( (debian 7).
      Но KDE'шный диалог настройки разрешения экрана вылез. Т.е. само событие где-то генерится.
        0
        Странно. только что проверил, еще на паре машин — все работает… дома гляну на дебиане, скажу.
          0
          Насколько я понимаю, это зависит не от ОС, а от карты и драйвера. Некоторые просто не посылают никаких сигналов в udev. В таком случае можно мониторить по всяким /sys/class/drm/CARD_name/status или по самому xrandr на худой конец.
          зы. debian 7/intel hd 3000. в udevadm ничего нет.
            0
            В /sys/class у меня почему-то нету drm.
            xrandr запускать периодически что ли? От него всё тормозит секунду.
              0
              nVidia blob?
              0
              Возможно, на днях потестирую и отпишусь.
            +6
            Скажите, а почему у вас картинки в BMP? Так, ради интереса…
              0
              Если честно проморгал. Сбилась конфигурация shuttera. Как раз его использую для создания скриншотов.
                +4
                Скажите, а как вы заметили, что у него картинки в bmp? Так, ради интереса…
                  +12
                  Они грузились снизу вверх. Да, чему только меня не научило время, когда я использовал dial-up…
                +1
                Вы сталкивались с проблемой, когда многократный вызов xrandr блокирует экран? У меня Lubuntu и LXDE, и раз в 5-6 вызовов xrandr делает экран тёмным, ничего не отображается, при этом показываются высплывающие уведомления.
                  +3
                  "xrandr -s 0" — всегда выставит максимально возможное разрешение. Вам останется только дописать нужный порт.
                  "xrandr -s 1" — соответственно второе разрешение и т.д.
                    0
                    Спасибо. На днях перепишу немного.
                    +1
                    Первые два упоминания «расширения» исправьте на «разрешение», пожалуйста. Глаза режет.
                    • UFO just landed and posted this here
                        0
                        Этим занимается DE или специальный софт. В данном случае человек сам себе это ПО и сделал.

                          +1
                          А теперь представьте, что у вас стоит какой-нибудь тайловый оконный менеджер типа xMonad и настроить оптимальное разрешение каждый раз через GUI очень утомительно. Поэтому вы пишите скриптик, который бы выполнялся каждый раз при подключении.
                          • UFO just landed and posted this here
                              +1
                              Лично для меня удобное управление окнами и рабочими столами с помощью горячих клавиш.
                          0
                          Очень неприятно, что при подключении внешнего монитора не выстреливает ACPI событие.
                            0
                            У меня в Убунту 14.04 не запускался xrandr из скрипта ни в какую. Решение описано здесь: bbs.archlinux.org/viewtopic.php?id=170294
                            Просто добавьте в начало скрипта
                            export XAUTHORITY=/home/username/.Xauthority

                            К сожалению, теряем универсальность, то есть будет работать только из-под одного пользователя
                              0
                              Ну почему же? Есть команда
                              whoami
                              

                              Которая вернет текущего пользователя системы.
                                0
                                К сожалению, скрипт выполняется от имени пользователя root

                            Only users with full accounts can post comments. Log in, please.