====== Toggle an external HDMI display using udev ======
Use **udevadm monitor** to detect udev events when connecting or disconnecting the display:
$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
KERNEL[549920.709264] change /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV [549920.712808] change /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
KERNEL[549932.063215] change /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV [549932.067059] change /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
Use **xrandr** to automatically extend the desktop to the new display:
$ xrandr --output HDMI1 --auto --above LVDS1
Or remove the HDMI display:
$ xrandr --output HDMI1 --off
Now put all that into a udev rules:
$ sudo -s
# cat /etc/udev/rules.d/hdmi.rules
SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/hdmi_toggle"
and create the script at **/usr/local/bin/hdmi_toggle**:
#!/usr/bin/env bash
# grab the display and xauthority cookie
export DISPLAY=$(w -h -s | grep ":[0-9]\W" | head -1 | awk '{print $2}')
X_USER=$(w -h -s | grep ":[0-9]\W" | head -1 | awk '{print $1}')
export XAUTHORITY=/home/$X_USER/.Xauthority
# get the status of the external display
status=$(cat /var/run/hdmi1_status)
case $status in
connected)
#disconnect
/usr/bin/su $X_USER -c '/bin/xrandr --output HDMI1 --off'
echo disconnected > /var/run/hdmi1_status
/usr/bin/logger "disabled hdmi output"
;;
*)
#connect
/usr/bin/su $X_USER -c '/bin/xrandr --output HDMI1 --auto --above LVDS1'
echo connected > /var/run/hdmi1_status
/usr/bin/logger "enabled hdmi output"
;;
esac
Make it executable:
# chmod +x /usr/local/bin/hdmi_toggle
And that's it. Enjoy connecting and disconnecting your display at will. If you want another display layout, replace the **--above** part of the xrandr command with {--left-of, --right-of, --below}.