Creé mi primera regla udev para configurar automáticamente mi pantalla externa cuando conecto mi computadora portátil a la estación de acoplamiento. Resulta que las cosas no funcionan (qué sorpresa). Primero, verifiqué qué eventos se envían cuando desconecto y conecto mi pantalla externa a la estación de acoplamiento (los mismos eventos suceden cuando conecto y desconecto la estación de acoplamiento de la computadora portátil con la pantalla externa conectada). Aquí está el resultado de *monitor udevadm:
### CONNECTING EXTERNAL DISPLAY ###
KERNEL[12586.516063] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV [12586.520032] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
KERNEL[12588.090123] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV [12588.094088] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
### DISCONNECTING EXTERNAL DISPLAY ###
KERNEL[12577.885860] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
KERNEL[12577.885951] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV [12577.894562] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
UDEV [12577.900236] change /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1 (drm)
Aquí está mi regla udev:
KERNEL=="card1", SUBSYSTEM=="drm", ACTION=="change", RUN+="su vllblvck -c /usr/bin/setup-ext-display.sh"
Y aquí está el script que se supone que debe ejecutar:
#!/bin/sh
# PLACE THIS SCRIPT INSIDE /usr/bin
# Automatically setup external monitor
xrandr_command="/usr/bin/xrandr"
sed_command="/bin/sed"
is_hdmi_connected=`DISPLAY=:0 $xrandr_command | $sed_command -n '/DP-1-2.3 connected/p'`
echo is_hdmi_connected: $is_hdmi_connected
if [ -n "$is_hdmi_connected" ]; then
DISPLAY=:0 xrandr --output DP-1-2.3 --auto --right-of eDP-1
echo connecting
else
DISPLAY=:0 $xrandr_command --output DP-1-2.3 --off
echo disconnecting
fi
El script en sí funciona bien y hace lo que quiero que haga. Incluso he cambiado al usuario root para comprobar sisu vllblvck -cLa pieza funciona correctamente y sí. Ejecuté el siguiente comando para verificar si la regla se ejecutaría y supuestamente lo haría, pero en realidad no funciona o funciona mal de alguna manera y mi pantalla externa nunca se configura.
udevadm test --action="change" /devices/pci0000:00/0000:00:01.1/0000:01:00.0/drm/card1
Agradecería cualquier consejo sobre cómo solucionar este problema o depurarlo aún más, ya que el tema de las reglas de udev es nuevo para mí y me he quedado sin ideas y sin búsquedas en Google. Y si eso importa, estoy ejecutando ArcoLinux con el kernel 5.14.14-arch1-1.
Respuesta1
Logré arreglar mi regla udev después de muchos intentos. Aquí hay uno que funciona:
KERNEL=="card1", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/vllblvck/.Xauthority", RUN+="/usr/bin/setup-ext-display.sh"
No me pregunten por qué funciona y el anterior no porque no tengo idea. Quizás alguien con más experiencia con las reglas de udev pueda decirnos.