<!-- title: Configuration de XFCE avec deux écrans -->
<!-- category: GNU/Linux -->
<!-- tag: planet -->

J'ai un portable fraîchement installé sous Debian Jessie avec l'environnement
de bureau XFCE<!-- more --> que j'utilise soit en itinérance, soit en poste fixe avec un
moniteur externe en configuration *double écran*. La configuration brute des
écrans sous GNU/Linux passe par l'utilisation de la commande **xrandr** pour
définir leur nombre, la résolution de chacun et leur position respective. Pour
se faciliter la vie, on peut installer **arand** qui fournit une interface
pour définir ces réglages et les sauvegarder sous forme de shell script dans
un fichier.

Voici une capture d'écran de arandr :

![alt text](/images/2015/arandr.png "Arandr")

Et un exemple de script généré pour une configuration en double écran avec le
moniteur externe à droite de l'écran LCD du portable :

    xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 --rotate normal
          --output DP1 --off --output VGA1 --mode 1920x1080 --pos 1366x0 --rotate normal

En utilisant arand je vais facilement générer les deux scripts dont j'ai besoin :

- une configuration simple avec l'écran du portable
- une configuration en double écran

Pour savoir lequel appliquer, on va tester si le moniteur externe est connecté
en analysant le résultat de la commande xrandr. Au démarrage du portable, le
gestionnaire de connexions **lightdm** clone l'affichage des deux moniteurs
connectés. On peut corriger cela en appliquant notre joli script qui teste si
le moniteur externe est connecté et applique la bonne commande xrandr. Pour
cela, on édite le fichier de configuration **/etc/lightdm/lightdm.conf** et on
ajoute la directive *display-setup-script* dans la section SeatDefaults :

    [SeatDefaults]
    ...
    display-setup-script=/usr/local/bin/lightdm-monitor.sh

et voici le script **lightdm-monitor.sh** :

```shell
if (xrandr | grep "VGA1 disconnected"); then
    xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 \
            --rotate normal --output DP1 --off --output VGA1 --off
else    
    xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 \
            --rotate normal --output DP1 --off --output VGA1 \
            --mode 1920x1080 --pos 1366x0 --rotate normal
fi
```

Le réglage est valable pour lightdm mais quand on ouvre une session XFCE, il
est perdu et on revient à la configuration par défaut à savoir l'affichage
cloné sur les deux écrans. On pourrait appliquer le même script pour la
session, en utilisant la directive *session-setup-script* prévu par ligthdm ou
en mettant le script en démarrage automatique dans la configuration **Session
et démarrage** de XFCE. Dans mon cas, je souhaite ajouter quelque chose au
script de session : déplacer le tableau de bord XFCE sur le moniteur externe,
quand il connecté. C'est possible grâce à la commande **xfconf-query** (le
programme en ligne de commande de configurationde XFCE) adéquate.

Finalement, cela donne le script **xfce-monitor.sh** au démarrage de la session:

```shell
sleep 3
if (xrandr | grep "VGA1 disconnected"); then
    xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 \
            --rotate normal --output DP1 --off --output VGA1 --off
    xfconf-query -c xfce4-panel -p /panels/panel-1/output-name -s LVDS1
else    
    xrandr --output HDMI1 --off --output LVDS1 --mode 1366x768 --pos 0x0 \
            --rotate normal --output DP1 --off --output VGA1 \
            --mode 1920x1080 --pos 1366x0 --rotate normal
    xfconf-query -c xfce4-panel -p /panels/panel-1/output-name -s VGA1
fi
```

Le *sleep* en début de script n'est pas élégant. Sans lui, l'exécution du
script intervient avant que la session XFCE soit initialisée et les commandes
xfconf-query ne sont pas appliquées. Si quelqu'un a une solution plus
élégante, je suis intéressé.

Si la connexion / déconnection des écrans a lieu pendant qu'une session est
ouverte, il suffit de relancer le script depuis un terminal pour reconfigurer
l'affichage.

![XFCE](/images/2015/xfce.png)
