Xrandr e udev: configurare un monitor esterno in automatico

Versione del 22 set 2012 alle 14:31 di Gmc (discussione | contributi) (Creata pagina con '{{stub}} {{Versioni compatibili|Wheezy}} ==Introduzione== Questa guida si propone di spiegare come usare udev e xrandr per configurare in automatico uno o più monitor quando si ...')
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Document-page-setup.png Attenzione: questo articolo è ancora incompleto e in fase di scrittura da parte del suo autore.

Sentitevi liberi di contribuire, proponendo modifiche alla guida tramite l'apposita pagina di discussione, in modo da non interferire con il lavoro portato avanti sulla voce. Per altre informazioni si rimanda al template.



Edit-clear-history.png Attenzione. Questa guida è da considerarsi abbandonata, per via del tempo trascorso dall'ultima verifica.

Potrà essere resa obsoleta, previa segnalazione sul forum, se nessuno si propone per l'adozione.


Debian-swirl.png Versioni Compatibili

Debian 7 "wheezy"

Introduzione

Questa guida si propone di spiegare come usare udev e xrandr per configurare in automatico uno o più monitor quando si collegano alla vga, dvi o hdmi.

Normalmente per configurare un monitor esterno si utilizza xrandr. Seguendo le seguenti istruzioni sarete in grado di farlo una tantum e dalla volta successiva in poi in maniera automatica, possibilmente scegliendo la configurazione a seconda del monitor che si attacca.

Per raggiungere questo scopo, si userà udev, che attiverà uno script al collegamento (o scollegamento) di un monitor. Questo script, tramite l'edid riconosce univocamente il monitor esterno. A questo punto con una serie di if, possiamo configurare a piacere il nostro monitor.

Xrandr

Prima di tutto, bisogna capire che configurazione si ha. Lanciando da terminale $ xrandr si avrà un output simile al seguente

Screen 0: minimum 320 x 200, current 1366 x 768, maximum 8192 x 8192
LVDS1 connected 1366x768+0+0 (normal left inverted right x axis y axis) 270mm x 150mm
   1366x768       60.0*+
   1360x768       59.8     60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)

Qui, LVDS1 è il monitor del portatile, VGA1 è una porta vga, <DP1> è un porta DisplayPort, probabilmente presente nel chipset grafico, ma nel caso in questione non fisicamente collegata ad una porta. Generalmente altri possibili output sono HDMI, <DVI> con ovvia interpretazione.

Prendere nota dei propri dati. Serviranno successivamente.

Ora collegare un monitor esterno e configurarlo, secondo le proprie necessità, con xrandr. Ad esempio

xrandr --output LVDS1 --pos 1280x256 --primary --output VGA1 --pos 0x0 --auto

che rende primario l'output sul monitor del portatile, e affianca a sinistra un mointor collegato alla porta vga. In questo caso, dato che il monitor esterno ha una risoluzione verticale maggiore del portatile, si è scelto di allineare i due monitor in basso.

Se si hanno più monitor esterni, configurare ogni monitor.

Edid

Come detto in precedenza, tramite l'edid avremo un modo univoco per riconoscere un monitor esterno. Per trovare l'edid del monitor, bisogna prima di tutto collegarlo e attivarlo tramite xorg. A questo punto dare

$ cat /sys/class/drm/card0-VGA-1/edid | hexdump -v -e '"" "%X" '

Si otterrà una stringa esadecimale. Ricordarsi di cambiare "VGA-1" a seconda dell'output avuto in precedenza da xrandr. Copiare questa stringa.

Regola udev

Il punto interessante è che udev si accorge quando si collega (o scollega) un monitor ad una porta (per esempio vga). A questo punto si crea una regola udev che lancia uno script. Quindi bisogna creare il file /etc/udev/rules.d/90-monitor.rules

ACTION=="change", SUBSYSTEM=="drm", RUN+="/path/to/script/monitor.sh"

Questa regola attiverà lo script /path/to/script/monitor.sh ad ogni collegamento o scollegamento di un cavo esterno

Script principale

Creare e rendere eseguibile il seguente file /path/to/script/monitor.sh

export DISPLAY=:0.0

if [[ `cat $VGA\status` == "connected" ]]
then
  xrandr --output LVDS1 --primary --output VGA1 --auto;
  EDID=`cat $VGA\edid | hexdump -v -e '"" "%X" '`;
  if [[ $UNI == $EDID ]]
  then
    xrandr --output LVDS1 --pos 1280x256 --primary --output VGA1 --pos 0x0 --auto
  fi
else
  xrandr --output VGA1 --off
fi


Guida scritta da: Gmc 16:31, 22 set 2012 (CEST)   Debianized 20%
Estesa da:
Verificata da:

Verificare ed estendere la guida | Cos'è una guida Debianized