Monitor HotPlug

2017/06/19

HotPlug Monitor

Use Case

Das Arbeiten mit dem Notebook Mobil und im Office via Dockingstation mit zwei Monitoren. Hier möchte ich, dass der zweite Monitor via Hotplug ein- und ausgeschaltet wird.

Durchführung

udev Rule erstellen

Mit dem Befehl udevadm monitor können wir schauen welchen Trigger es beim einstecken in die Dockingstation gibt. Ein anschließender Querry zeigt uns die für die rule benötigten variablen.

➜  ~ udevadm info --query=all --path=/devices/pci0000:00/0000:00:02.0/drm/card0
P: /devices/pci0000:00/0000:00:02.0/drm/card0
N: dri/card0
E: DEVNAME=/dev/dri/card0
E: DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
E: DEVTYPE=drm_minor
E: DISPLAY=:0
E: ID_FOR_SEAT=drm-pci-0000_00_02_0
E: ID_PATH=pci-0000:00:02.0
E: ID_PATH_TAG=pci-0000_00_02_0
E: MAJOR=226
E: MINOR=0
E: SUBSYSTEM=drm
E: TAGS=:seat:master-of-seat:uaccess:
E: USEC_INITIALIZED=14565022

jetzt können wir die entsprechende Rule erstellen.

sudo vim /etc/udev/rules.d/20-dockingstation.rules
KERNEL=="card0", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/andreas/.Xauthority", RUN+="/usr/bin/systemctl start hotplug_monitor"

Systemd erzeugen

Theoretisch können wir den entsprechenden xrandr Befehl auch in die Udev Rule legen. Da xrandr einige Sekunden benötigt um den neuen Monitor zu erkennen, ist dies für udev zu langsam.

sudo vim /etc/systemd/system/hotplug_monitor.service
[Unit]
Description=Monitor hotplug

[Service]
Type=simple
RemainAfterExit=no
User=andreas
ExecStart=/usr/local/bin/hotplug_monitor.sh

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable hotplug_monitor

Hotplug Script

Was noch fehlt ist das entsprechende Hotplug Script. Hier müssen die Parameter **** und **** angepasst werden. Ich gehe auch davon aus, dass Euer Monitor nicht unbedingt VGA-1 heisst. Kurz um, dass Script muss auf jedenfall Euren Bedürfnissen angepasst werden.

#!/bin/bash

######################################
## /usr/local/bin/hotplug_monitor.sh
######################################
X_USER=<USERNAME>
export DISPLAY=:0
export XAUTHORITY=/home/$X_USER/.Xauthority
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/<USERID>/bus

function connect()
{   
    /usr/bin/xrandr --output VIRTUAL1 --off --output DP3 --off --output DP2 --off --output DP1 --off --output HDMI3 --off --output HDMI2 --off --output HDMI1 --off --output LVDS1 --primary --mode 1366x768 --pos 0x0 --rotate normal --output VGA1 --pos 1366x0 --rotate normal --auto

}

function disconnect(){
    /usr/bin/xrandr --output VGA1 --off
}

if [ $(cat /sys/class/drm/card0-VGA-1/status) == "connected" ] ; then
  connect
elif [ $(cat /sys/class/drm/card0-VGA-1/status) == "disconnected" ] ; then
  disconnect
else
  exit
fi