Salut,
J'ai écrit un petit script qui, allié à une configuration xorg.conf qui va bien, permet d'activer / désactiver un écran supplémentaire en mode bureau étendu, à la volée (sans fermer la session graphique ni X), en utilisant la commande xrandr.
si vous souhaitez utiliser plus avant cette commande: (rtfm!)
man xrandr
voici la partie xorg.conf:
Section "Screen"
Identifier "Screen0"
Device "Videocard0"
DefaultDepth 16
## Multi screen horizontal
# SubSection "Display"
# Viewport 0 0
# Depth 24
# Modes "1024x768" "800x600" "640x480"
# Virtual 2048 768 # 2 monitors 1024x768 horizontally (No DRI)
# EndSubSection
SubSection "Display"
Viewport 0 0
Depth 24
Modes "1280x1024" "1024x768" "800x600" "640x480"
Virtual 2304 1024 # 2 monitors horizontally with one at 1280x1024 (No DRI)
EndSubSection
# SubSection "Display"
# Viewport 0 0
# Depth 16
# Modes "1024x768" "800x600" "640x480"
# Virtual 2048 768 # 2 monitors 1024x768 horiz with DRI enabled
# EndSubSection
# SubSection "Display"
# Viewport 0 0
# Depth 16
# Modes "1280x1024" "1024x768" "800x600" "640x480"
# Virtual 2304 1024 # 2 monitors horizontally with one at 1280x1024 (DRI only for the main screen and part of the 2nd)
# EndSubSection
## Multiscreen vertical
# SubSection "Display"
# Viewport 0 0
# Depth 24
# Modes "1024x768" "800x600" "640x480"
# Virtual 1024 1536 # 2 monitors 1024x768 vertically (No DRI)
# EndSubSection
# SubSection "Display"
# Viewport 0 0
# Depth 24
# Modes "1280x1024" "1024x768" "800x600" "640x480"
# Virtual 1280 1792 # 2 monitors vertically with one at 1280x1024 (No DRI)
# EndSubSection
EndSection
C'est juste la "section screen", car les autres sections ne changent pas, notez plutôt l'instruction "Virtual" suivie de la taille, en pixels, de l'écran virtuel utilisable.
L'écran virtuel c'est la taille affichable par le serveur X, qui englobe la définition des écrans que l'on veut activer, un exemple:
Mon écran de protable a une définition de 1024x768, et mon écran VGA externe est un 1280x1024.
Je souhaite utiliser ces deux écrans dans le sens de la largeur (l'un à côté de l'autre), donc je vais avoir une surface d'affichage de 1024+1280=2304pixels (horizontal) et un maximum de 1024 en vertical.
J'ai aussi modifié les "modes" pour correspondre à la résolution maximale du meilleur de mes écrans.
Cette surface virtuelle d'affichage dépend de la quantité de mémoire graphique disponible pour votre carte graphique (chez moi 16Mo, c'est petit, donc je dois choisir entre affichage grand et 24bit sans 3D -DRI - ou affichage grand et 16 avec 3D, ...).
Il faut donc décommenter l'une de ces "subsections display" en accord avec ce que vous voulez faire.
Il vous est aussi possible, si vous avez plein de mémoire graphique, de définr une grande surface virtuelle qui vous permettra de faire à loisir une disposition horizontale ou verticale sans redémarrer Xorg, voire même plus de 2 écrans.
N'oubliez pas aussi de changer le "DefaultDepth" pour correspondre avec votre "subsection display", elle est à 16bits pour moi, et pour vous elle sera certainement à 24 voire 32.
Enfin, voici le script que j'ai écrit pour mon IBM X31, il sera certainement à adapter pour vous, je l'ai associé à la touche d'activation d'écran externe (Fn + F7).
Ce script regarde d'abord quels écrans sont connectés et utilisables (xrandr -q), puis si deux écrans sont utilisables dont un VGA déconnecté, il le connecte en posant la question. Sinon il déconnecte le VGA.
#!/bin/bash
N_ACTIV=`xrandr -q | grep '*' | wc -l`;
CON_MON=`xrandr -q | grep ' connected' | awk '{print $1}'`
UNCON_MON=`xrandr -q | grep 'disconnected' | awk '{print $1}'`
N_MON=0
for i in $CON_MON
do
N_MON=$(($N_MON + 1))
echo "Connected monitor: $i"
done
echo "Found $N_MON connected monitor(s)."
NC_MON=0
for i in $UNCON_MON
do
NC_MON=$(($NC_MON + 1))
echo "Disconnected monitor: $i"
done
echo "Found $NC_MON disconnected monitor(s)."
if [ $N_MON -lt 2 ]
then
zenity --question --title "Erreur" --text "Il semble qu'un seul écran soit utilisable.\n- Branchez le deuxième écran puis réessayez.\n- $NC_MON Prise(s) disponible(s):\n $UNCON_MON \n\nEssayer d'éteindre quand même l'écran secondaire ?"
case $? in
0) echo yes
xrandr --output VGA-0 --off;;
1) echo no;;
255) echo echap;;
esac
exit 1
fi
if [ $N_MON -gt 2 ]
then
zenity --error --title "Erreur" --text "Il semble que plus de 2 écrans soient utilisables.\nCe cas n'est pas pris en charge.\nDétecté $N_MON:\n$CON_MON"
exit 1
fi
if [ $N_ACTIV -eq 1 ]
then
zenity --question --title "Activation écran secondaire?" --text "Activer l'écran sur prise VGA ?"
case $? in
0) echo yes
xrandr --output VGA-0 --auto --right-of LVDS;;
1) echo no;;
255) echo echap;;
esac
else
if [ $N_ACTIV -eq 2 ]
then
zenity --question --title "Désactivation écran secondaire?" --text "Désactiver l'écran sur prise VGA ?"
case $? in
0) echo yes
xrandr --output VGA-0 --off;;
1) echo no;;
255) echo echap;;
esac
else
zenity --error --title "Erreur" --text "Il semble que plus de 2 écrans soient déjà activés.\n Ce cas n'est pas pris en charge."
fi
fi
Voilà, c'est certainement loin d'être parfait, mais c'est opensource, et GPL donc modifiez, améliorez, ...
à+