Con respecto a una herramienta que puede almacenar perfiles de configuración de monitor por usuario y por pantalla, autorandr hará exactamente eso.
Mi computadora portátil tiene una tarjeta NVIDIA, por lo que uso el backend dispersor en lugar de xrandr. Autorandr usará disper como backend para administrar sus monitores si lo llama como autodisper
. Sin embargo, para el resto de esta publicación, me referiré a ella como autorandr
por consistencia.
Puedes guardar perfiles con autorandr --save profile_name
. Ejecutando autorandr
por sí solo le dará una lista de perfiles e identificará cuál se detecta como la configuración actual.
Por ejemplo:
$ autorandr
laptop
syncmaster19 (detected)
Puede indicarle que cargue automáticamente el perfil apropiado para la configuración actual con autorandr --change
. Este comando, junto con una regla udev para ejecutarlo cuando está conectado en caliente, haría lo que solicitó.
Como precaución adicional, he agregado --default laptop
a ese comando, que lo hará predeterminado en la pantalla de la computadora portátil si no hay un perfil guardado que coincida con la configuración actual. Así que el comando completo que uso para cambiar de pantalla es:
autorandr --change --default laptop
Desafortunadamente, mi máquina no da ninguna salida udev cuando conecto mi monitor en caliente. Estoy usando los controladores patentados de NVIDIA, por lo que no es sorprendente. Así que lo he vinculado a la tecla XF68Display (Fn-F8) por ahora, que es casi igual de bueno.
Estoy usando este script simple (casero) que sigue sondeando RandR y cambia entre LVDS1 y VGA1 cuando VGA se conecta/desconecta. (Para HDMI salidas, en el siguiente archivo de script, cambie todos los VGA1
a HDMI1
)
Es una solución sucia, pero funciona bien.
Está personalizado para mi configuración:lo más probable es que necesite cambiar los nombres de salida de RandR (LVDS1
y VGA1
) y, a diferencia de mí, probablemente estará bien con su modo predeterminado RandR para VGA.
#!/bin/bash
# setting up new mode for my VGA
xrandr --newmode "1920x1080" 148.5 1920 2008 2052 2200 1080 1089 1095 1125 +hsync +vsync
xrandr --addmode VGA1 1920x1080
# default monitor is LVDS1
MONITOR=LVDS1
# functions to switch from LVDS1 to VGA and vice versa
function ActivateVGA {
echo "Switching to VGA1"
xrandr --output VGA1 --mode 1920x1080 --dpi 160 --output LVDS1 --off
MONITOR=VGA1
}
function DeactivateVGA {
echo "Switching to LVDS1"
xrandr --output VGA1 --off --output LVDS1 --auto
MONITOR=LVDS1
}
# functions to check if VGA is connected and in use
function VGAActive {
[ $MONITOR = "VGA1" ]
}
function VGAConnected {
! xrandr | grep "^VGA1" | grep disconnected
}
# actual script
while true
do
if ! VGAActive && VGAConnected
then
ActivateVGA
fi
if VGAActive && ! VGAConnected
then
DeactivateVGA
fi
sleep 1s
done
Pasos completos:
-
Coloque el script anterior (
homemadeMonitor.sh
) en su directorio preferido -
Haga que el archivo .sh sea ejecutable escribiendo el siguiente comando en la terminal
chmod +x homemadeMonitor.sh
-
Ejecute el archivo .sh
./homemadeMonitor.sh
Respondiendo a la parte de la pregunta "[una] forma de saber que se ha conectado un monitor":
El soporte todavía varía un poco, pero con kernels recientes hay cierto soporte para generar eventos udev cuando ocurre una conexión en caliente de la pantalla. Con el kernel 2.6.38 y el hardware ATI X1400, obtengo un evento la primera vez que conecto una pantalla VGA, pero no hay eventos en desconexiones o reconexiones posteriores de la pantalla. El hardware Intel puede tener un mejor soporte. El controlador patentado de NVIDIA actualmente no es compatible con KMS; No he intentado buscar eventos hotplug en el hardware de NVIDIA, pero dudo que funcione.
Si desea experimentar con udev, puede probar los siguientes pasos:
- actualizar al núcleo más nuevo
- asegúrese de que la configuración del modo kernel (KMS) esté habilitada. Si está habilitado, debe informarse en la salida de su kernel. El mio dice
[drm] radeon kernel modesetting enabled
y[drm] initializing kernel modesetting
- ejecutar
udevadm monitor --property
y vea si se informan eventos cuando (des)conecta pantallas
Si obtiene eventos de udev en pantalla hotplug, puede activar un script con una regla de udev como:
ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"