En ce qui concerne un outil qui peut stocker des profils de configuration de moniteur par utilisateur et par affichage, autorandr fera exactement cela.
Mon ordinateur portable a une carte NVIDIA, j'utilise donc le backend disper au lieu de xrandr. Autorandr utilisera disper comme backend pour gérer vos moniteurs si vous l'appelez autodisper
. Pour le reste de cet article, je l'appellerai autorandr
pour plus de cohérence.
Vous pouvez enregistrer des profils avec autorandr --save profile_name
. Exécution de autorandr
par lui-même vous donnera alors une liste de profils, et identifiera celui qui est détecté comme la configuration actuelle.
Par exemple :
$ autorandr
laptop
syncmaster19 (detected)
Vous pouvez lui dire de charger automatiquement le profil approprié pour la configuration actuelle avec autorandr --change
. Cette commande, associée à une règle udev pour l'exécuter lorsqu'elle est branchée à chaud, ferait ce que vous avez demandé.
Par mesure de précaution supplémentaire, j'ai ajouté --default laptop
à cette commande, ce qui en fera l'affichage par défaut de l'ordinateur portable s'il n'y a pas de profil enregistré correspondant à la configuration actuelle. Donc la commande complète que j'utilise pour changer d'affichage est :
autorandr --change --default laptop
Malheureusement, ma machine ne donne aucune sortie udev lorsque je connecte mon moniteur à chaud. J'utilise les pilotes propriétaires NVIDIA, ce n'est donc pas surprenant. Je l'ai donc lié à la touche XF68Display (Fn-F8) pour l'instant, ce qui est presque aussi bon.
J'utilise ce script simple (fait maison) qui continue d'interroger RandR et bascule entre LVDS1 et VGA1 lorsque VGA est connecté/déconnecté. (Pour HDMI sorties, dans le fichier de script suivant, modifiez tous les VGA1
à HDMI1
)
C'est une sale solution, mais elle fonctionne très bien.
Il est personnalisé pour ma configuration :vous devrez probablement modifier les noms de sortie RandR (LVDS1
et VGA1
) et contrairement à moi, vous serez probablement d'accord avec votre mode par défaut RandR pour 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
Étapes complètes :
-
Mettez le script ci-dessus (
homemadeMonitor.sh
) dans votre répertoire préféré -
Rendez le fichier .sh exécutable en tapant la commande suivante dans le terminal
chmod +x homemadeMonitor.sh
-
Exécutez le fichier .sh
./homemadeMonitor.sh
Réponse à la partie "[une] façon de dire qu'un moniteur a été branché" de la question :
La prise en charge varie encore un peu, mais avec les noyaux récents, il existe une prise en charge de la génération d'événements udev lorsqu'un hotplug d'affichage se produit. Avec le noyau 2.6.38 et le matériel ATI X1400, j'obtiens un événement la première fois que je connecte un écran VGA, mais aucun événement lors des déconnexions ou reconnexions ultérieures de l'écran. Le matériel Intel peut avoir un meilleur support. Le pilote propriétaire NVIDIA ne prend actuellement pas en charge KMS; Je n'ai pas essayé de rechercher des événements hotplug sur le matériel NVIDIA, mais je doute que cela fonctionne.
Si vous souhaitez expérimenter avec udev, vous pouvez essayer les étapes suivantes :
- mettre à jour le noyau le plus récent
- Assurez-vous que le paramètre du mode noyau (KMS) est activé. S'il est activé, il doit être signalé dans la sortie de votre noyau. Le mien dit
[drm] radeon kernel modesetting enabled
et[drm] initializing kernel modesetting
- exécuter
udevadm monitor --property
et voyez si des événements sont signalés lorsque vous (dé)connectez des écrans
Si vous obtenez des événements udev sur display hotplug, vous pouvez déclencher un script avec une règle udev comme :
ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"
Remarque : Cela ne sera pas fonctionner si vous utilisez un GPU nVIDIA avec le pilote binaire propriétaire, car il n'utilise pas KMS. Vous ne serez pas obtenir tous les événements udev.