In Bezug auf ein Tool, das Monitorkonfigurationsprofile pro Benutzer und pro Display speichern kann, wird autorandr genau das tun.
Mein Laptop hat eine NVIDIA-Karte, daher verwende ich das disper-Backend anstelle von xrandr. Autorandr verwendet disper als Backend, um Ihre Monitore zu verwalten, wenn Sie es als autodisper
bezeichnen . Für den Rest dieses Beitrags bezeichne ich ihn jedoch als autorandr
für Konsistenz.
Mit autorandr --save profile_name
können Sie Profile speichern . Ausführen von autorandr
von selbst gibt Ihnen dann eine Liste von Profilen und identifiziert, welches als aktuelle Konfiguration erkannt wird.
Zum Beispiel:
$ autorandr
laptop
syncmaster19 (detected)
Mit autorandr --change
können Sie ihn anweisen, automatisch das passende Profil für die aktuelle Konfiguration zu laden . Dieser Befehl, gepaart mit einer udev-Regel, um ihn auszuführen, wenn er Hotplug ist, würde das tun, was Sie angefordert haben.
Als zusätzliche Vorsichtsmaßnahme habe ich --default laptop
angehängt zu diesem Befehl, wodurch es standardmäßig auf die Anzeige des Laptops gesetzt wird, wenn kein gespeichertes Profil vorhanden ist, das der aktuellen Konfiguration entspricht. Der vollständige Befehl, den ich zum Wechseln der Anzeige verwende, lautet also:
autorandr --change --default laptop
Leider gibt mein Rechner keine udev-Ausgabe aus, wenn ich meinen Monitor hotplug. Ich verwende die proprietären NVIDIA-Treiber, das ist also nicht überraschend. Also habe ich es vorerst an die XF68Display-Taste (Fn-F8) gebunden, was fast genauso gut ist.
Ich verwende dieses einfache (hausgemachte) Skript, das RandR abfragt und zwischen LVDS1 und VGA1 wechselt, wenn VGA verbunden/getrennt wird. (Für HDMI Ausgaben ändern Sie in der folgenden Skriptdatei alle VGA1
bis HDMI1
)
Es ist eine unsaubere Lösung, aber sie funktioniert einwandfrei.
Es ist für mein Setup angepasst:Sie müssen höchstwahrscheinlich die RandR-Ausgabenamen ändern (LVDS1
und VGA1
) und im Gegensatz zu mir werden Sie wahrscheinlich mit Ihrem RandR-Standardmodus für VGA zurechtkommen.
#!/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
Vollständige Schritte:
-
Fügen Sie das obige Skript ein (
homemadeMonitor.sh
) in Ihr bevorzugtes Verzeichnis -
Machen Sie die .sh-Datei ausführbar, indem Sie im Terminal den folgenden Befehl eingeben
chmod +x homemadeMonitor.sh
-
Führen Sie die .sh-Datei
aus./homemadeMonitor.sh
Antwort auf den Teil der Frage „[a] Möglichkeit, festzustellen, dass ein Monitor angeschlossen wurde“:
Die Unterstützung variiert immer noch ziemlich, aber neuere Kernel unterstützen teilweise das Generieren von udev-Ereignissen, wenn ein Anzeige-Hotplug auftritt. Mit Kernel 2.6.38 und ATI X1400-Hardware erhalte ich ein Ereignis, wenn ich zum ersten Mal ein VGA-Display anschließe, aber keine Ereignisse bei nachfolgenden Trennungen oder Wiederverbindungen des Displays. Intel-Hardware bietet möglicherweise eine bessere Unterstützung. Der proprietäre NVIDIA-Treiber unterstützt derzeit kein KMS; Ich habe nicht versucht, auf NVIDIA-Hardware nach Hotplug-Ereignissen zu suchen, aber ich bezweifle, dass es funktionieren würde.
Wenn Sie mit udev experimentieren möchten, können Sie die folgenden Schritte ausprobieren:
- auf den neusten Kernel aktualisieren
- Stellen Sie sicher, dass die Kernelmoduseinstellung (KMS) aktiviert ist. Wenn aktiviert, sollte es in Ihrer Kernel-Ausgabe gemeldet werden. Bei mir steht
[drm] radeon kernel modesetting enabled
und[drm] initializing kernel modesetting
- führen Sie
udevadm monitor --property
aus und sehen Sie, ob Ereignisse gemeldet werden, wenn Sie Displays (trennen) verbinden
Wenn Sie udev-Ereignisse beim Anzeige-Hotplug erhalten, können Sie ein Skript mit einer udev-Regel auslösen wie:
ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"
Hinweis: Dies wird nicht funktionieren, wenn Sie eine nVIDIA-GPU mit dem proprietären Binärtreiber verwenden, da KMS nicht verwendet wird. Das werden Sie nicht erhalten Sie alle udev-Ereignisse.