Per quanto riguarda uno strumento in grado di memorizzare i profili di configurazione del monitor in base all'utente e al display, autorandr farà esattamente questo.
Il mio laptop ha una scheda NVIDIA, quindi utilizzo il backend disper invece di xrandr. Autorandr utilizzerà disper come backend per gestire i tuoi monitor se lo chiami come autodisper
. Per il resto di questo post, però, lo chiamerò autorandr
per coerenza.
Puoi salvare i profili con autorandr --save profile_name
. Esecuzione autorandr
da solo ti fornirà quindi un elenco di profili e identificherà quale viene rilevato come configurazione corrente.
Ad esempio:
$ autorandr
laptop
syncmaster19 (detected)
Puoi dirgli di caricare automaticamente il profilo appropriato per la configurazione corrente con autorandr --change
. Questo comando, abbinato a una regola udev per eseguirlo quando è collegato a caldo, farebbe ciò che hai richiesto.
Come ulteriore precauzione ho aggiunto --default laptop
a quel comando, che lo renderà predefinito per il display del laptop se non esiste un profilo salvato che corrisponda alla configurazione corrente. Quindi il comando completo che uso per cambiare display è:
autorandr --change --default laptop
Sfortunatamente la mia macchina non fornisce alcun output udev quando collego a caldo il mio monitor. Sto usando i driver proprietari NVIDIA, quindi non è sorprendente. Quindi per ora l'ho associato al tasto XF68Display (Fn-F8), che è quasi altrettanto buono.
Sto usando questo semplice script (fatto in casa) che continua a eseguire il polling di RandR e passa da LVDS1 a VGA1 quando VGA viene connesso/disconnesso. (Per HDMI output, nel seguente file di script, cambia tutto il VGA1
a HDMI1
)
È una soluzione sporca, eppure funziona bene.
È personalizzato per la mia configurazione:molto probabilmente dovrai modificare i nomi di output di RandR (LVDS1
e VGA1
) e, diversamente da me, probabilmente starai bene con la tua modalità RandR predefinita per 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
Passaggi completi:
-
Metti sopra lo script (
homemadeMonitor.sh
) nella tua directory preferita -
Rendi eseguibile il file .sh digitando il seguente comando nel terminale
chmod +x homemadeMonitor.sh
-
Esegui il file .sh
./homemadeMonitor.sh
Rispondendo alla parte della domanda "[un] modo per sapere che un monitor è stato collegato":
Il supporto varia ancora un po', ma con i kernel recenti c'è un certo supporto per la generazione di eventi udev quando si verifica un hotplug del display. Con il kernel 2.6.38 e l'hardware ATI X1400, ottengo un evento la prima volta che collego uno schermo VGA ma nessun evento alle successive disconnessioni o riconnessioni dello schermo. L'hardware Intel potrebbe avere un supporto migliore. Il driver proprietario NVIDIA attualmente non supporta KMS; Non ho provato a cercare eventi hotplug su hardware NVIDIA, ma dubito che funzionerebbe.
Se vuoi sperimentare con udev puoi provare i seguenti passi:
- aggiorna al kernel più recente
- assicurati che l'impostazione della modalità kernel (KMS) sia abilitata. Se abilitato, dovrebbe essere segnalato nell'output del kernel. Il mio dice
[drm] radeon kernel modesetting enabled
e[drm] initializing kernel modesetting
- esegui
udevadm monitor --property
e verifica se gli eventi vengono segnalati quando (s-)connetti i display
Se ricevi eventi udev su display hotplug, puoi attivare uno script con una regola udev come:
ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"
Nota: Questo non funziona se utilizzi una GPU nVIDIA con il driver binario proprietario, poiché non utilizza KMS. No ottenere qualsiasi evento udev.