Pokud jde o nástroj, který může ukládat profily konfigurace monitoru na základě jednotlivých uživatelů a jednotlivých zobrazení, autorandr udělá přesně to.
Můj notebook má kartu NVIDIA, takže místo xrandr používám backend disper. Autorandr použije disper jako backend pro správu vašich monitorů, pokud to nazvete jako autodisper
. Pro zbytek tohoto příspěvku jej však budu označovat jako autorandr
pro konzistenci.
Profily můžete uložit pomocí autorandr --save profile_name
. Spuštěn autorandr
sám vám pak poskytne seznam profilů a identifikuje, který z nich je detekován jako aktuální konfigurace.
Například:
$ autorandr
laptop
syncmaster19 (detected)
Pomocí autorandr --change
mu můžete říci, aby automaticky načetl vhodný profil pro aktuální konfiguraci . Tento příkaz, spárovaný s udev pravidlem pro jeho spuštění, když je hotplugged, udělá to, co požadujete.
Jako další opatření jsem přidal --default laptop
na tento příkaz, který jej nastaví jako výchozí na displej notebooku, pokud není uložen žádný profil, který by odpovídal aktuální konfiguraci. Takže úplný příkaz, který používám k přepínání zobrazení, je:
autorandr --change --default laptop
Bohužel můj počítač nedává žádný udev výstup, když zapojím monitor. Používám proprietární ovladače NVIDIA, takže to není překvapivé. Takže jsem to zatím svázal s XF68Display key (Fn-F8), což je skoro stejně dobré.
Používám tento jednoduchý (domácí) skript, který neustále dotazuje RandR a přepíná mezi LVDS1 a VGA1, když se VGA připojí/odpojí. (Pro HDMI výstupy, v následujícím souboru skriptu změňte všechny VGA1
na HDMI1
)
Je to špinavé řešení, ale funguje dobře.
Je přizpůsoben mému nastavení:s největší pravděpodobností budete muset změnit názvy výstupů RandR (LVDS1
a VGA1
) a na rozdíl ode mě si pravděpodobně vystačíte s výchozím režimem RandR pro 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
Úplné kroky:
-
Vložte výše skript (
homemadeMonitor.sh
) do vámi preferovaného adresáře -
Udělejte soubor .sh spustitelným zadáním následujícího příkazu do terminálu
chmod +x homemadeMonitor.sh
-
Spusťte soubor .sh
./homemadeMonitor.sh
Odpověď na část otázky „[a] způsob, jak zjistit, že byl připojen monitor“:
Podpora se stále dost liší, ale s nedávnými jádry existuje určitá podpora pro generování událostí udev, když se objeví hotplug display. S jádrem 2.6.38 a hardwarem ATI X1400 se při prvním připojení displeje VGA zobrazí událost, ale žádné události při následném odpojení nebo opětovném připojení displeje. Hardware Intel může mít lepší podporu. Proprietární ovladač NVIDIA aktuálně nepodporuje KMS; Nezkoušel jsem hledat události hotplug na hardwaru NVIDIA, ale pochybuji, že by to fungovalo.
Pokud chcete experimentovat s udev, můžete zkusit následující kroky:
- aktualizovat na nejnovější jádro
- ujistěte se, že je povoleno nastavení režimu jádra (KMS). Pokud je povoleno, mělo by být hlášeno ve výstupu vašeho jádra. Můj říká
[drm] radeon kernel modesetting enabled
a[drm] initializing kernel modesetting
- spusťte
udevadm monitor --property
a uvidíte, zda jsou události hlášeny, když (odpojíte) displeje
Pokud dostáváte události udev na hotplug displeje, můžete spustit skript pomocí pravidla udev, jako je:
ACTION=="change", SUBSYSTEM=="drm", HOTPLUG=="1", RUN+="/path/to/hotplug.sh"
Poznámka: Toto nebude fungovat, pokud používáte GPU nVIDIA s proprietárním binárním ovladačem, protože nepoužívá KMS. nebudete získat všechny události udev.