Eu tenho em /etc/udev/rules.d/80-monitor.rules
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", ENV{DEVNAME}=="dri/card0", RUN+="/etc/udev/monitors.sh"
Em seguida, em /etc/udev/monitors.sh
(executável marcado):
#!/bin/sh
set -e
export DISPLAY=:0
export XAUTHORITY=$(getent passwd $(w -h -s|awk '$3==":0"{print $1}'|sed 1q)|cut -d: -f6)/.Xauthority
desktop() {
xrandr --output LVDS1 --off || true
xrandr --output HDMI3 --auto --primary --output HDMI2 --auto --right-of HDMI3
}
laptop() {
xrandr --output HDMI3 --off || true
xrandr --output HDMI2 --off || true
xrandr --output LVDS1 --auto
}
if xrandr|grep -q 'HDMI2 connected'; then
desktop
else
laptop
fi
Algumas dicas e capturas com este exemplo:
- Funciona apenas para o primeiro usuário conectado graficamente.
- Você precisará ajustar o script para corresponder à configuração do seu monitor. Veja o xrandr manpage para ajuda com isto.
- Não tenho certeza se a regra do udev corresponderá ao evento de mudança de status do monitor de todos. Eu usei
udevadm monitor --property
para descobrir o que usar. - Eu tive que usar
--off
para desativar todos os displays explicitamente antes de reconfigurar antes que o xrandr permitisse que eu configurasse novos. Acho que isso depende do motorista e não está bem documentado. - Estou usando a presença da tela externa para decidir o caminho a ser reconfigurado. Isso pode não funcionar para todos.
- xrandr define algumas resoluções por padrão, o que foi ótimo para mim. Consulte a página de manual para obter detalhes sobre como definir resoluções personalizadas, se precisar.