Xrandr e udev: configurare un monitor esterno in automatico: differenze tra le versioni

verificata, più modifiche minori
Nessun oggetto della modifica
(verificata, più modifiche minori)
Riga 1: Riga 1:
{{Versioni compatibili|Wheezy}}
{{Versioni compatibili|Wheezy|Jessie}}
==Introduzione==
==Introduzione==
Questa guida si propone di spiegare come usare <code>udev</code> e <code>xrandr</code> per configurare in automatico uno o più monitor quando si collegano alla VGA, DVI o HDMI.
Questa guida si propone di spiegare come usare <code>udev</code> e <code>xrandr</code> per configurare in automatico uno o più monitor quando si collegano alla VGA, DVI o HDMI.
Riga 6: Riga 6:


Per raggiungere questo scopo, si userà [[Udev_e_Debian|udev]], che attiverà uno [[script]] al collegamento (o scollegamento) di un monitor. Questo script, tramite l'[http://en.wikipedia.org/wiki/Extended_display_identification_data edid] riconosce univocamente il monitor esterno. A questo punto con una serie di if, possiamo configurare a piacere il nostro monitor.
Per raggiungere questo scopo, si userà [[Udev_e_Debian|udev]], che attiverà uno [[script]] al collegamento (o scollegamento) di un monitor. Questo script, tramite l'[http://en.wikipedia.org/wiki/Extended_display_identification_data edid] riconosce univocamente il monitor esterno. A questo punto con una serie di if, possiamo configurare a piacere il nostro monitor.
==Xrandr==
==Xrandr==
Prima di tutto, bisogna capire che configurazione si ha. Lanciando da terminale <code>xrandr</code> si avrà un output simile al seguente:
Prima di tutto, bisogna capire che configurazione si ha. Lanciando da terminale <code>xrandr</code> si avrà un output simile al seguente:
Riga 31: Riga 32:


Se si hanno più monitor esterni, configurare ogni monitor.
Se si hanno più monitor esterni, configurare ogni monitor.
==Edid==
==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:
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:
Riga 37: Riga 39:
</pre>
</pre>
Si otterrà una stringa esadecimale. Ricordarsi di cambiare "VGA-1" a seconda dell'output avuto in precedenza da <code>xrandr</code>. Copiare questa stringa.
Si otterrà una stringa esadecimale. Ricordarsi di cambiare "VGA-1" a seconda dell'output avuto in precedenza da <code>xrandr</code>. Copiare questa stringa.
==Regola udev==
==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 <code>/etc/udev/rules.d/90-monitor.rules</code>
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 <code>/etc/udev/rules.d/90-monitor.rules</code>
<pre>
<pre>
ACTION=="change", SUBSYSTEM=="drm", RUN+="/path/to/script/monitor.sh"
ACTION=="change", SUBSYSTEM=="drm", RUN+="/usr/local/sbin/monitor.sh"
</pre>
</pre>
Questa regola attiverà lo script <code>/path/to/script/monitor.sh</code> ad ogni collegamento o scollegamento di un cavo esterno.
Questa regola attiverà lo script <code>/usr/local/sbin/monitor.sh</code> ad ogni collegamento o scollegamento di un cavo esterno.
 
==Script principale==
==Script principale==
Creare e rendere eseguibile il seguente file <code>/path/to/script/monitor.sh</code>
Creare il seguente file con percorso e nome <code>/usr/local/sbin/monitor.sh</code>
<pre>
<pre>
#! /bin/bash
UNI=stringa esadecimale contenente l'edid dello schermo
UNI=stringa esadecimale contenente l'edid dello schermo
VGA=/sys/class/drm/card0/card0-VGA-1/
VGA=/sys/class/drm/card0/card0-VGA-1/


export DISPLAY=:0.0


export DISPLAY=:0.0
# esci se Xorg non è attivo
pidof /usr/bin/X > /dev/null 2>&1 || exit 0


if [[ `cat $VGA\status` == "connected" ]]
if [[ "`cat $VGA\status`" == "connected" ]]
then
then
   xrandr --output LVDS1 --primary --output VGA1 --auto;
   xrandr --output LVDS1 --primary --output VGA1 --auto;
   EDID=`cat $VGA\edid | hexdump -v -e '"" "%X" '`;
   EDID=`cat $VGA\edid | hexdump -v -e '"" "%X" '`;
   if [[ $UNI == $EDID ]]
   if [[ "$UNI" == "$EDID" ]]
   then
   then
     xrandr --output LVDS1 --pos 1280x256 --primary --output VGA1 --pos 0x0 --auto
     xrandr --output LVDS1 --primary --output VGA1 --pos 0x0 --auto
   fi
   fi
else
else
Riga 64: Riga 72:
fi
fi
</pre>
</pre>
Spieghiamo cosa fa lo script.


<code>UNI</code> è una costante, l'edid dello schermo esterno, ottenuto come detto in precedenza. La variabile <code>VGA</code> è il  [[path]] nel syfs della porta VGA (ricordarsi che può cambiare a seconda della propria configurazione).
Poi renderlo eseguibile, assegnandogli i giusti permessi e utente/gruppo riservati:
<pre>
# chmod 754 /usr/local/sbin/monitor.sh
# chown root:staff /usr/local/sbin/monitor.sh
</pre>
 
Spieghiamo ora cosa fa lo script:
* <code>UNI</code> è una costante, l'edid dello schermo esterno, ottenuto come detto in precedenza;
* <code>VGA</code> è il  [[path]] nel syfs della porta VGA (ricordarsi che può cambiare a seconda della propria configurazione);
* <code>DISPLAY</code> identifica il server <code>Xorg</code> attivo, e il primo (e in genere unico) presente è identificabile con <code>:0[.0]</code>; se si è in dubbio è sufficiente stampare il contenuto di questa variabile:<pre>$ echo $DISPLAY</pre> in modo che sia utilizzata da udev.


Se lo schermo risulta connesso (primo if) si abilita tramite <code>xrandr</code> lo schermo esterno (necessario altrimenti non si riesce a prendere l'edid). Dopodiché se l'edid è uguale a quello della costante UNI si configura <code>xrandr</code> in una certa maniera (in questo caso alla stessa maniera della sezione [[#Xrandr|Xrandr]], altrimenti si lascia tutto come in precendenza.
Se lo schermo risulta connesso (primo if) si abilita tramite <code>xrandr</code> lo schermo esterno (necessario altrimenti non si riesce a prendere l'edid). Dopodiché se l'edid è uguale a quello della costante UNI si configura <code>xrandr</code> in una certa maniera (in questo caso alla stessa maniera della sezione [[#Xrandr|Xrandr]], altrimenti si lascia tutto come in precedenza.


Se lo schermo non è attaccato si deconfigura il secondo monitor.
Se lo schermo non è attaccato si deconfigura il secondo monitor.
Riga 79: Riga 95:
Ovviamente le possibilità sono solo limitate dalla fantasia.
Ovviamente le possibilità sono solo limitate dalla fantasia.


{{Autori | Autore = [[Utente:Gmc|Gmc]] 16:31, 22 set 2012 (CEST) }}
{{Autori
|Autore= [[Utente:Gmc|Gmc]] 16:31, 22 set 2012 (CEST)
|Estesa_da=
|Verificata_da=
: [[Utente:HAL 9000|HAL 9000]] 17:05, 10 mag 2015 (CEST)
|Numero_revisori=1
}}


[[Categoria: Xorg]]
[[Categoria: Xorg]]
3 581

contributi