xbacklight power outputs notebook management laptop keys icon have arch linux intel xorg udev

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:

  1. Encuesta sobre una entrada específica en sysfs.
  2. Utilice inotify para detectar cambios en sysfs.
  3. 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: