linux - power - volume keys arch
¿Cómo crear una devolución de llamada para "monitor enchufado" en gráficos Intel? (5)
Como una solución cruda, es posible que pueda sondear en sysfs. En mi portátil tengo:
$ cat /sys/class/drm/card0-LVDS-1/status
connected
$ cat /sys/class/drm/card0-VGA-1/status
disconnected
Supongo que esto requiere DRM del kernel y posiblemente KMS.
Para ver si puede activar algo automáticamente, puede ejecutar udevadm monitor --property
y observar mientras está (des-) conectando el monitor para ver si se informan eventos.
Con mi radeon, recibo un evento la primera vez que conecto un monitor VGA, pero no hay eventos en las siguientes desconexiones y reconexiones. El evento debería verse como (usando el tuyo como ejemplo):
KERNEL[1303765357.560848] change /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV_LOG=0
ACTION=change
DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
SUBSYSTEM=drm
HOTPLUG=1
DEVNAME=dri/card0
DEVTYPE=drm_minor
SEQNUM=2943
MAJOR=226
MINOR=0
Desafortunadamente, no hay muchas opciones para igualar, pero siempre que haya una sola tarjeta de video en la imagen no es demasiado importante. Encuentre de dónde obtiene udev las reglas en su sistema (probablemente /etc/udev/rules.d/
), y cree un archivo 99-monitor-hotplug.rules
con:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/root/hotplug.sh"
udev
ejecutará hotplug.sh
cuando se hotplug.sh
una pantalla. Como prueba, puse lo siguiente en /root/hotplug.sh
(no olvide hacer este script ejecutable):
#!/bin/sh
for output in DVI-I-1 LVDS-1 VGA-1; do
echo $output >> /root/hotplug.log
cat /sys/class/drm/card0-$output/status >> /root/hotplug.log
done
Con eso, obtuve una entrada en hotplug.log
después de conectar una pantalla externa. Incluso al filtrar por ACTION=="change"
, todavía tengo algunos eventos en el arranque, por lo que es posible que desee tenerlo en cuenta de alguna manera en su script.
Tengo un eeepc con una gráfica de Intel. Me gustaría conectar un script al evento de un monitor conectado a través de VGA. ¿Como hacer eso?
Gracias sebastianwagner!
Con esta información, he podido iniciar con éxito mi centro de medios Kodi con el televisor apagado. De hecho, cuando el televisor está apagado, el controlador Intel no desea configurar un modo y tengo una pantalla en blanco cuando más tarde lo encendí.
El registro de Kodi mostraba la siguiente línea:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/sbin/hotplugtv.sh"
Así que creé la siguiente línea en /etc/udev/rules.d/99-monitor-hotplug.rules:
#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/root/.Xauthority
/bin/date 2>&1 >> /var/log/hotplugtv.log;
if [[ $(cat /sys/class/drm/card0-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
echo "TV connected!" >> /var/log/hotplugtv.log;
/bin/sleep 2s;
/usr/bin/xrandr --verbose --output HDMI1 --auto 2>&1 >> /var/log/hotplugtv.log;
else
echo "TV disconnected!" >> /var/log/hotplugtv.log;
fi
Contenido de /usr/sbin/hotplugtv.sh (mi servidor X se ejecuta como root):
udevadm control --reload-rules
No te olvides de volver a cargar las reglas de udev cuando realices algún cambio en tu script (¡esto me estaba volviendo loco!):
#!/usr/bin/env python3
import pyudev
def udev_event_received(device):
... # Your code here!
context = pyudev.Context()
monitor_drm = pyudev.Monitor.from_netlink(context)
monitor_drm.filter_by(subsystem=''drm'')
observer_drm = pyudev.MonitorObserver(monitor_drm, callback=udev_event_received, daemon=False)
observer_drm.start()
# This will prevent the program from finishing:
observer_drm.join()
Tenga cuidado de desactivar cualquier protector de pantalla en Kodi, ya que permanecen activados para siempre cuando finalmente enciende el televisor. Por otro lado, el ahorro de energía / DPMS parece funcionar bien.
Suponiendo que está ejecutando X, un script puede analizar la salida de xrandr para ver qué monitores están conectados. Esto debería funcionar con cualquier tarjeta gráfica. Esta es la misma herramienta que probablemente usará para hacer uso del cambio en su script.
No resuelve el problema con las notificaciones para ejecutar automáticamente un script. Si bien no tengo una gran solución genérica, un caso común es detectar cuando un monitor externo está presente porque una computadora portátil está conectada a una estación de acoplamiento. En este caso, puede hacer que el script se desencadene de otra cosa que se active cuando se conecte a la estación de acoplamiento, como la adición o extracción de un teclado USB o Ethernet.
Tienes tres opciones:
- Encuesta sobre una entrada específica en sysfs.
- Utilice inotify para detectar cambios en sysfs.
- Use un socket de enlace de red con NETLINK_KOBJECT_UEVENT y escuche un
change
para el dispositivo que desea.
En cualquiera de las formas mencionadas, todavía tendrá que hacer una encuesta de una forma u otra, así que solo me quedaría con la primera opción.
share está en el camino correcto: desea escuchar los eventos DRM de udev
.
He implementado un script de Python que ejecuta algún código cuando los dispositivos USB o las pantallas externas están (des) conectados. Incluyo a continuación una versión mínima de ese script (sin probar):
WARNING: CXRandR::Query - output HDMI1 has no current mode, assuming disconnected
Ver también: