Configuration de XFCE avec deux écrans

J’ai un portable fraîchement installé sous Debian Jessie avec l’environnement de bureau XFCE 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

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 :

    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:

    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.

alt text

Elessar - 2015-09-03 16:45:33

Il y a plus simple : plutôt que de configurer ton gestionnaire de connexion graphique Lightdm pour lancer un script qui modifie la disposition graphique, tu peux configurer le serveur graphique X.Org pour appliquer directement la configuration que tu souhaites. Cela présente trois avantages : c’est de la vraie configuration et non un script, c’est indépendant du gestionnaire d’affichage — tu peux vouloir en changer un jour, ou te connecter depuis une session non graphique avec startx ou xinit — et ça s’applique dès le lancement du système graphique et non juste après.

Ça se fait dans un /etc/X11/xorg.conf.d/monitors.conf (désolé, il va falloir remettre les retours à la ligne à la main, Markdown ne fournissant rien pou rles blocs de code, ce qui est tout de même un comble :

Section “Device” Identifier “Carte graphique” Option “Monitor-LVDS1” “Intégré” Option “Monitor-VGA1” “Externe” EndSection

Section “Monitor” Identifier “Intégré” Option “Primary” “true” Option “PreferredMode” “1366x768” # je doute que ce soit nécessaire, ça devrait être la résolution par défaut EndSection

Section “Monitor” Identifier “Externe” Option “PreferredMode” “1920x1080” # je doute que ce soit nécessaire, ça devrait être la résolution par défaut Option “RightOf” “Intégré” EndSection

Pour ce qui est de déplacer le tableau de bord d’Xfce, je me demande si ce n’est pas possible en marquant l’écran externe comme primaire, à essayer.

Yax - 2015-09-03 17:01:37

@Elessar Je ne savais pas que la configuration de moniteur avait des options avancées pour le placement. Je vais tester pour voir si cela fonctionne dynamiquement quand on connecte et reconnecte le moniteur externe. Merci pour le tuyau.

En Markdown les blocs de code sont reconnus si les lignes commencent par 4 espaces.

Section "Device" 
    Identifier "Carte graphique" 
    Option "Monitor-LVDS1" "Intégré" 
    Option "Monitor-VGA1" "Externe" 
EndSection

Section "Monitor" 
    Identifier "Intégré" 
    Option "Primary" "true" 
    Option "PreferredMode" "1366x768" 
EndSection

Section "Monitor" 
    Identifier "Externe" 
    Option "PreferredMode" "1920x1080" 
    Option "RightOf" "Intégré" 
EndSection

Elessar - 2015-09-03 17:17:40

Ah, d’accord pour les blocs de code, au temps pour moi. Pour la peine, revoici mon exemple, correctement formaté cette fois-ci :

Section "Device"
    Identifier "Carte graphique"
    Option "Monitor-LVDS1" "Intégré"
    Option "Monitor-VGA1" "Externe"
EndSection

Section "Monitor"
    Identifier "Intégré" Option "Primary" "true"
    Option "PreferredMode" "1366x768" # je doute que ce soit nécessaire, ça devrait être la résolution par défaut
EndSection

Section "Monitor"
    Identifier "Externe"
    Option "PreferredMode" "1920x1080" # je doute que ce soit nécessaire, ça devrait être la résolution par défaut
    Option "RightOf" "Intégré"
EndSection

Pour info, l’équivalent du RightOf existe aussi comme option pour la commande xrandr : --right-of. C’est à mon avis plus pratique que de spécifier des positions absolues, et c’est par ailleurs indépendant des résolutions appliquées. Par exemple :

$ xrandr --output VGA1 --right-of LVDS1

Sciurus - 2015-09-11 11:24:17

Bonjour,

j’ai lu ton article sur ta configuration de XFCE avec 2 écrans. Dans ton dernier script tu souhaitais remplacer le “sleep 3” car un truc plus élégant. J’ai eu la même problématique avec mon script pour lancer Conky à chaque session: il me fallait que Conky attende que le bureau de XFCE soit chargé avant de lancer Conky, faute de quoi Conky se lançait avant l’affichage du bureau et alors restait chargé “sous le bureau”.

Donc, à la place du “sleep XX”, j’ai donc demandé au début de mon script d’attendre que la disponibilité du CPU de ma machine remonte à plus de 95% avant de lancer la suite du script. Pourquoi 95% ? Parce que quand mon PC est au “repos”, il affiche dispo de CPU entre 99% et 97%. Donc, à ajuster en fonction de la machine.

Voici donc, le bout de script qui remplace “sleep XX”.

dispo_cpu=$(top -b -n3 | grep Cpu | tail -n 1 | sed -e 's/.*ni,//' -e 's/id.*//' -e 's/,.*//' -e 's/ //g')

while  (( $dispo_cpu < 95 )) ; do
    dispo_cpu=$(top -b -n3 | grep Cpu | tail -n 1 | sed -e 's/.*ni,//' -e 's/id.*//' -e 's/,.*//' -e 's/ //g')
done

J’espère que ça pourra t’aider.

A+

Yax - 2015-09-11 11:30:21

@Sciurus Testé et approuvé. C’est mieux qu’un sleep. Merci

Votre commentaire
Le site Web est optionel
Le message peut être rédigé au format Markdown