Exemples d'affichage sous deux écrans avec Linux

Troumad alias Bernard SIAUD

xorg.conf avec 2 cartes écrans différentes / xorg.conf sur un portable (chipset i915)

- Titre : Exemples d'affichage sous deux écrans avec Linux

- Auteur : Troumad alias Bernard SIAUD

- Parution : 28 octobre 2006

- Mise à jour : 23 juin 2007

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2013 Bernard SIAUD. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- Avant-Propos

- 1. Avec deux cartes écrans différentes

- 1-1. Exemple de xorg.conf

- 1-2. Section spécifique

- 1-3. La gestion de l'affichage

- 1-4. Xinerama

- 2. Double écran sur un portable ou une carte écran avec deux sorties

- 2-1. xorg.conf

- 2-2. Les sections Device

- 2-3. Les sections ServerLayout

- 2-3-1. Pourquoi différents ServerLayout

- 2-3-2. Choix d'un ServerLayout

- 3. Les essais

- 3-1. xorg.conf

- 3-2. Place des écrans

- 3-2-1. Extrait de man xorg.conf

- 3-2-2. La zone écran

- 3-3. /var/log/Xorg.0.log

- 4. L'utilisation xrandr

- 4-1. Présentation de xrandr

- 4-2. utilisation de xrandr

- 4-2-1. État d'origine

- 4-2-2. Placement des écrans

- 4-3. La sortie svideo

- 4-4. Les GUI de xrandr

- 4-5. Conclusion sur xrandr

- 5. Les utilitaires NVidia

- 6. L'utilisation de plusieurs écrans

- 6-1. Vidéo

- 6-2. KDE

- 6-3. Gnome

- 6-4. iceWM

- 6-5. xfce4

- 6-6. enlightenment

- 6-6-1. e16

- 6-6-2. e17

- 6-7. FluxBox

- 6-8. Ion3

- 7. Améliorations possibles

- 8. Remerciements

Avant-Propos

Il y a quelques années déjà, ma possibilité de migrer sous Linux était suspendue au fait de pouvoir avoir deux écrans : un pour programmer, l'autre pour tester la page Internet générée avec le code sous les yeux, Mandrake 8.0 n'était pas encore sortie...

Avec l'aide de Mandrake 8.X, j'y suis arrivé, depuis je suis sous Linux et j'aime ça !

Quand le boulot m'a donné un portable sous Windows, il va de soit que j'ai aussitôt voulu y faire tourner Linux avec deux écrans. J'y suis arrivé toujours avec Mandriva (2005 à l'époque) et avec des documents trouvés sur Internet. Les fichiers de configuration qui fonctionnaient sous Mandriva m'ont servi à faire du double écran sur ce même PC avec Ubuntu (5.10 et 6.06) ainsi qu'avec Debian sid.

Je vais commencer à vous faire partager mes fichiers de configuration avec deux cartes écran puis celui de mon portable.

1 - Avec deux cartes écrans différentes

Vous avez récupéré une vieille carte écran PCI et un écran inutilisé.

Vous avez un peu de place sur votre bureau et un slot PCI libre au fond de votre PC.

Vous avez décidé de profiter de tout ça pour mettre deux écrans sur vote PC, allez-y. J'espère vous guider !

Attention : les très vieilles cartes ISA ne sont pas concernées par cette manipulation, elles ne supportent pas l'affichage en duo (Linux et Windows => je pense que c'est un problème matériel).

1-1 - Exemple de xorg.conf

C'est un exemple tiré d'une mandriva 2006, mais mon expérience m'a montré qu'on peut récupérer la partie affichage sur Debian ou Ubuntu.

#Partie spécifique à la distribution et même à la version
Section "Files"
# Multiple FontPath entries are allowed (they are concatenated together)
# By default, Mandrake 6.0 and later now use a font server independent of
# the X server to render fonts.
FontPath "unix/:-1"
EndSection

Section "ServerFlags"
AllowMouseOpenFail # allows the server to start up even if the mouse does not work
EndSection

Section "Module"
Load "dbe" # Double-Buffering Extension
Load "v4l" # Video for Linux
Load "extmod"
Load "type1"
Load "freetype"
Load "glx" # 3D layer
EndSection

Section "InputDevice"
Identifier "Keyboard1"
Driver "keyboard"
Option "XkbModel" "pc105"
Option "XkbLayout" "fr"
Option "XkbOptions" "compose:rwin"
EndSection

Section "InputDevice"
Identifier "Mouse1"
Driver "mouse"
Option "Protocol" "ExplorerPS/2"
Option "Device" "/dev/mouse"
Option "ZAxisMapping" "6 7"
EndSection

# gestion de l'affichage qu'on peut copier d'une distribution à l'autre
Section "Monitor"
Identifier "monitor1"
VendorName "Plug'n Play"
ModelName "SONY HMD-A200"
HorizSync 30-70
VertRefresh 48-120

# TV fullscreen mode or DVD fullscreen output.
# 768x576 @ 79 Hz, 50 kHz hsync
ModeLine "768x576"     50.00  768  832  846 1000   576  590  595  630

# 768x576 @ 100 Hz, 61.6 kHz hsync
ModeLine "768x576"     63.07  768  800  960 1024   576  578  590  616
EndSection

Section "Monitor"
Identifier "monitor2"

# TV fullscreen mode or DVD fullscreen output.
# 768x576 @ 79 Hz, 50 kHz hsync
ModeLine "768x576"     50.00  768  832  846 1000   576  590  595  630

# 768x576 @ 100 Hz, 61.6 kHz hsync
ModeLine "768x576"     63.07  768  800  960 1024   576  578  590  616
EndSection

Section "Device"
Identifier "device1"
VendorName "S3 Inc."
BoardName "S3 Savage4"
Driver "savage"
VideoRam 4096
Screen 0
BusID "PCI:0:5:0"
Option "DPMS"
Option "no_accel"   # You may enable this if there are timeouts when starting X
EndSection

Section "Device"
Identifier "device2"
VendorName "VIA Technologies Inc"
BoardName "S3 UniChrome"
Driver "via"
Screen 0
BusID "PCI:1:0:0"
Option "DPMS"
EndSection

Section "Screen"
Identifier "screen1"
Device "device1"
Monitor "monitor1"
DefaultColorDepth 16

Subsection "Display"
Depth 16
Virtual 1024 768
EndSubsection

EndSection

Section "Screen"
Identifier "screen2"
Device "device2"
Monitor "monitor2"
DefaultColorDepth 16

Subsection "Display"
Depth 8
Virtual 1024 768
EndSubsection

Subsection "Display"
Depth 15
Virtual 1024 768
EndSubsection

Subsection "Display"
Depth 16
Virtual 1024 768
EndSubsection

Subsection "Display"
Depth 24
Virtual 1024 768
EndSubsection
EndSection

Section "ServerLayout"
Identifier "layout1"
InputDevice "Keyboard1" "CoreKeyboard"
InputDevice "Mouse1" "CorePointer"
Screen "screen1"
Screen "screen2" RightOf "screen1"
Option "Xinerama"
EndSection

1-2 - Section spécifique

Cette section, je vous conseille de la laisser générer par votre distribution.

Cependant, vous pouvez ajouter des polices de caractères en indiquant leur emplacement qui dépend de votre version de Linux. Pour une Mandriva 2006 ou précédente :

FontPath "/usr/share/fonts/misc:unscaled"

Pour une Mandriva 2007 :

FontPath "/usr/X11R6/lib/X11/fonts/75dpi:unscaled"
FontPath "/usr/X11R6/lib/X11/fonts/TTF"

Pour une Debian sid en 2006 :

FontPath        "/usr/share/fonts/X11/75dpi"
FontPath        "/usr/lib/X11/fonts/75dpi"

Ajouter une police de caractères m'a déjà permis de sauver une mise à jour plantée qui empêchait de lancer X car la font fixed manquait. J'ai rajouté la police TTF et le serveur X a enfin pu repartir.

La section qui semble vraiment dépendante de la distribution est la section module.

1-3 - La gestion de l'affichage

Cette partie informe sur les cartes écrans (section Device), les écrans (section Monitor), les couples carte/écran (section Screen) et comment on met tout ça ensemble avec clavier + souris définis dans la première partie (section ServerLayout).
Comme elle est indépendante de la distribution, vous pouvez la faire générer par Mandriva et la conserver sur votre distribution.

La section la plus critique est la section Device : elle doit définir le driver utilisé (Driver) pour la carte ainsi que son emplacement dans le fond de panier (BusID). Un changement de place de la carte PCI changera son BusID, donc la configuration de cette partie. Toujours sur les cartes écrans, j'ai deux remarques à faire. La première, c'est que je ne suis pas arrivé à faire en tourner deux avec les mêmes drivers (je n'ai guère essayé car j'ai toujours eu des cartes cartes ISA en stock) et si j'avais une nVidia, en prenant le noyau nvidia de Mandrake (pas testé sous Mandriva), je ne pouvais plus faire fonctionner l'autre (problème de configuration noyau sûrement, mais pas testé).

La section que l'on doit configurer soi même, c'est ServerLayout : je n'ai pas trouvé de logiciel pour faire le placement relatif des écrans. J'ai bien essayé de faire un programme copiant un peu l'interface de Windows, mais je me suis arrêté faute de tests suffisants http://troumad.info/Linux/mon_essai_mode.zip. Cette section comporte aussi l'option xinerama, pour qu'elle soit valide, il faut que la profondeur (nombre de couleurs) soit la même sur les écrans. Elle se règle dans la section Screen (paramètre DefaultColorDepth).

1-4 - Xinerama

L'option Xinerama du ServerLayout n'est pas obligatoire. Son but est d'unifier les deux écrans en un grand écran. Elle permet de passer les fenêtres d'une application d'une fenêtre à l'autre, d'étendre une fenêtre sur deux écrans (ou plus). Cependant, il est tout à fait possible de ne pas vouloir cette option.

La désactivation de cette option rend les deux écrans indépendants, même si on ne se logge que sur un des deux pour accéder aux deux. Cette desactivation permet de beneficier de l'acceleration 3d de chacune des cartes avec leur driver respectif. Ceci peut permettre, quand on utilise plusieurs bureaux virtuels de changer de bureaux que sur un seul des deux écrans.

2 - Double écran sur un portable ou une carte écran avec deux sorties

Mon portable était un DELL LATITUDE D510 avec une carte vidéo intel i915GM dont le driver est le i810, maintenant, c'est un DELL LATITUDE E5500 toujours avec un chipset intel. Donc un "man i810" vous aidera beaucoup pour améliorer votre configuration. Le double écran était géré comme ceci avec les anciens drivers NVidia, j'ai aussi un PC fixe avec une carte" Nvidia deux sortie (VGA et HDMI). Les nouveaux drivers NVidia, sortis pour le grand public avec Mandriva 2009.1 par exemple, ne marche plus comme ça.

2-1 - xorg.conf

Section "Files"
# font server independent of the X server to render fonts.
FontPath "unix/:-1"
EndSection

Section "Extensions"
Option "Composite"
EndSection

Section "ServerFlags"
AllowMouseOpenFail # allows the server to start up even if the mouse does not work
EndSection

Section "Module"
Load "dbe" # Double-Buffering Extension
Load "v4l" # Video for Linux
Load "extmod"
Load "type1"
Load "freetype"
Load "glx" # 3D layer
Load "dri" # direct rendering
EndSection

Section "InputDevice"
Identifier "Keyboard1"
Driver "kbd"
Option "XkbModel" "pc105"
Option "XkbLayout" "fr"
Option "XkbOptions" "compose:rwin"
EndSection

Section "InputDevice"
Identifier "Mouse1"
Driver "mouse"
Option "Protocol" "ExplorerPS/2"
Option "Device" "/dev/mouse"
EndSection

Section "InputDevice"
Identifier "SynapticsMouse1"
Driver "synaptics"
Option "EdgeMotionMinSpeed" "200"
Option "MinSpeed" "0.8"
Option "MaxSpeed" "1.00"
Option "BottomEdge" "650"
Option "EdgeMotionMaxSpeed" "200"
Option "UpDownScrolling" "0"
Option "CircScrollTrigger" "2"
Option "SHMConfig" "on"
Option "LeftEdge" "120"
Option "FingerLow" "14"
Option "HorizScrollDelta" "20"
Option "MaxTapMove" "110"
Option "FingerHigh" "15"
Option "VertScrollDelta" "20"
Option "CircularScrolling" "1"
Option "AccelFactor" "0.015"
Option "TopEdge" "120"
Option "RightEdge" "830"
EndSection

Section "Monitor"
Identifier "monitor1"
VendorName "Dell"
ModelName "Dell 1024x768 Laptop Display Panel"
HorizSync 31.5-48.5
VertRefresh 59.0-75.0
EndSection

Section "Monitor"
Identifier "monitor2"
VendorName "Plug'n Play"
ModelName "SAMTRON"
HorizSync 30-81
VertRefresh 56-75

# Monitor preferred modeline (60.0 Hz vsync, 64.0 kHz hsync, ratio 5/4)
ModeLine "1280x1024" 108 1280 1328 1440 1688 1024 1025 1028 1066 +hsync +vsync

# TV fullscreen mode or DVD fullscreen output.
# 768x576 @ 79 Hz, 50 kHz hsync
ModeLine "768x576"     50.00  768  832  846 1000   576  590  595  630

# 768x576 @ 100 Hz, 61.6 kHz hsync
ModeLine "768x576"     63.07  768  800  960 1024   576  578  590  616
EndSection

Section "Monitor"
Identifier "TV1"
ModelName "Svideo"
EndSection

Section "Device"
Identifier "device1"
VendorName "Intel Corp."
BoardName "Intel 915"
Driver "i810"
Screen 0
BusID "PCI:0:2:0"
Option "DPMS"
Option "May_Need_ForceBIOS" "1"
Option "XaaNoOffscreenPixmaps" "1"
Option "AccelMethod" "EXA"
Option "MonitorLayout" "CRT,LFP"
EndSection

Section "Device"
Identifier "device2"

# ecran ext
Driver "i810"
Screen 1
BusID "PCI:0:2:0"
Option "DPMS"
Option "May_Need_ForceBIOS" "1"
Option "XaaNoOffscreenPixmaps" "1"
Option "AccelMethod" "EXA"
EndSection

Section "Device"
Identifier "device-seul"
VendorName "Intel Corp."
BoardName "Intel 915"
Driver "i810"
BusID "PCI:0:2:0"
Option "DPMS"
Option "May_Need_ForceBIOS" "1"
Option "XaaNoOffscreenPixmaps" "1"
Option "MonitorLayout" "CRT,LFP"
Option "Clone" "TRUE"
Option "SWCursor"
EndSection

Section "Device"
Identifier "Card-TV"
VendorName "Intel Corp."
BoardName "Intel 915"
Driver "i810"
BusID "PCI:0:2:0"
Option "MonitorLayout" "TV"
EndSection

Section "Screen"
Identifier "screenTV1"
Device "Card-TV"
Monitor "TV1"
DefaultColorDepth 16

Subsection "Display"
Depth 16
Virtual 1366 768
EndSubsection
EndSection

Section "Screen"
Identifier "screen2"
Device "device2"
Monitor "monitor2"

# ecran extérieur
DefaultColorDepth 16

Subsection "Display"
Depth 16
Virtual 1280 1024
EndSubsection

EndSection

Section "Screen"
Identifier "screen-seul"
Device "device-seul"
Monitor "monitor2"
DefaultColorDepth 16

Subsection "Display"
Depth 16
Virtual 1024 768
EndSubsection

EndSection

Section "Screen"
Identifier "screen1"
Device "device1"
Monitor "monitor1"
DefaultColorDepth 16

Subsection "Display"
Depth 16
Modes "1024x768" "832x624" "800x600" "640x480" "480x360" "320x240"
EndSubsection

EndSection

Section "ServerLayout"
Identifier "double"
InputDevice "Keyboard1" "CoreKeyboard"
InputDevice "Mouse1" "CorePointer"
InputDevice "SynapticsMouse1" "AlwaysCore"
Screen "screen1"
Screen "screen2" RightOf "screen1"
Option "Xinerama" "on"
EndSection

Section "ServerLayout"
Identifier "seul"
InputDevice "Keyboard1" "CoreKeyboard"
InputDevice "Mouse1" "CorePointer"
InputDevice "SynapticsMouse1" "AlwaysCore"
Screen "screen-seul"
EndSection

Section "ServerLayout"
Identifier "TV"
InputDevice "Keyboard1" "CoreKeyboard"
InputDevice "Mouse1" "CorePointer"
Screen "screenTV1"
EndSection

2-2 - Les sections Device

C'est sur ces sections que j'ai dû intervenir. Que ce soit Mandriva ou Ubuntu, personne n'était arrivé à me faire l'affichage sur les deux écrans alors qu'un essai sous l'OS concurent trop connu m'a montré que c'était possible.

Ce sont les deux lignes suivantes que j'ai du rajouter dans la partie device. La première indiquant de quelle sortie je parle (la 0 ou la 1), la seconde indiquant la nature des écrans. Cette seconde est aussi indispensable pour l'envoi simultané du même affichage sur l'écran du portable (ou la première sortie d'une carte avec deux sorties - HDMI régulièrement ) et sa sortie VGA. C'est encore elle que l'on doit modifier pour avoir la sortie TV (PAL indisponible sous Linux avec le chipset Intel à l'instant où j'écris cet article).

Screen 0
Option "MonitorLayout" "CRT,LFP"

2-3 - Les sections ServerLayout

Dans cet exemple, contrairement à l'exemple précédent, plusieurs sections ServerLayout sont présentes. Ceci est assez rare et parfois bien utile.

2-3-1 - Pourquoi différents ServerLayout

Avec un portable, on peut être dans plusieurs environnements suivant où on est. Il faut donc les prévoir, c'est pour cela que j'ai mis plusieurs ServerLayout. En effet, chacun défini un environnement de travail différent.

Le premier définit un affichage différent sur l'écran du portable et sur un écran extérieur, le mode double écran habituel. Ce mode, bien qu'utilisable avec un vidéo projecteur, n'est pas très pratique dans un tel environnement de travail.

Comme on n'a pas toujours d'écran extérieur disponible, le second défini un affichage uniquement sur l'écran du portable et comme ça ne demande rien de plus, j'impose en même temps une duplication sur la sortie extérieure afin de penser à un vidéo projecteur possible.

Le dernier active la sortie TV du portable afin de sortir sur la TV en mode SVideo.

2-3-2 - Choix d'un ServerLayout

Par défaut, c'est le premier ServerLayout qui est choisi. Mais, dans la section ServerFlags, on peut en choisir un particulier avec Option "DefaultServerLayout" "layout-id". Mais ces options étant en dur dans le fichier xorg.conf, ceci ne permet pas de changer facilement de configuration d'affichage !

Sous Mandriva, mon portable ne lance pas X au boot, je le fais moi-même à la main. Comme ça, je peux donc choisir la configuration graphique. Voici les commandes qui me servent à lancer le serveur X avec mon utilisateur lambda une fois logué en ligne de commande :

alias seul="Ice -layout seul"
alias loin="Xfce -layout seul"
alias TV='Ice -layout TV'
alias Ice="startx /etc/X11/xdm/Xsession IceWM -- "
alias Gn="startx /etc/X11/xdm/Xsession GNOME -- "
alias Win="startx /etc/X11/xdm/Xsession WindowMaker -- "
alias En="startx /etc/X11/xdm/Xsession Enlightenment -- "
alias Black="startx /etc/X11/xdm/Xsession BlackBox -- "
alias Saw="startx /etc/X11/xdm/Xsession Sawfish -- "
alias Xfce="startx /etc/X11/xdm/Xsession xfce4 -- "
alias Kde="startx /etc/X11/xdm/Xsession KDE -- "

Les interfaces graphiques disponibles sous Mandriva sont visibles dans /etc/X11/wmsession.d/ .

Par défaut, je lance Ice, quand je souhaite un affichage unique, je choisi seul. Je peux même choisir loin afin de ne pas lancer le startup de IceWM qui râle quand je n'ai pas de connexion internet avec firefox et surtout thunderbird. À vous d'adapter ces alias si iceWM n'est pas votre interface graphique préférée !

Je suis sans voie pour les autres distributions. Je peux juste dire que pour Debian, ça ne marche pas et que je serais heureux que l'on me donne la solution !

Remarques : ceci devient heureusement inutile avec le nouveau xorg qui pourra s'adapter automatiquement aux nouvelles configurations sans avoir à choisir un ServerLayout particulier.

3 - Les essais

Il est rare que tout soit bon du premier coup !

3-1 - xorg.conf

Je conseille fortement avec toute modification manuelle du fichier /etc/X/xorg.conf de le copier dans un répertoire dédié en rajoutant à son nom un suffixe pour mieux l'identifier.

Le point important à savoir quand on lance le gestionnaire de connexion, c'est que si dans le répertoire de lancement, il trouve un fichier de configuration de xorg, alors ce sera celui-ci qui sera utilisé. Donc, si vous modifiez le fichier /etc/X/xorg.conf et qu'il ne se passe rien, regardez ce qui se trouve dans le répertoire à partir du quel vous lancer X !

3-2 - Place des écrans

La place relative des écrans se gère dans la section ServerLayout. Ce qui suit est une traduction personnelle du "man xorg.conf", juste la partie qui définit la position relative des écrans.

3-2-1 - Extrait de man xorg.conf

Screen screen-num "screen-id" position-information

Chaque écran utilisé doit être défini comme ceci. Le champ screen-id est obligatoire, et indique de quel écran (section screen) il s'agit. Le champ "screen-num" est facultatif, et peut être employé pour indiquer le numéro de l'écran dans des configurations multi-tête. Quand ce champ est omis, les écrans seront numérotés dans l'ordre d'apparition. Les numéros d'écran devront être des entiers en 0 et le nombre d'écran moins un (tous les nombres de 0 au plus grand devront être pris). Le champ "position-information" décrit la position relative des écrans. On peut fournir cette information de différentes manières :

- x y

- Absolute x y

- RightOf "screen-id"

- LeftOf "screen-id"

- Above "screen-id"

- Below "screen-id"

- Relative "screen-id" x y

3-2-2 - La zone écran

->Zoom sur le coin noir->

3-3 - /var/log/Xorg.0.log

Le parcours du fichier de log peut être très intéressant en cas d'essais de modifications manuelles du fichier de configuration de xorg. Un grep EE /var/log/Xorg.0.log vous donnera la liste des options défectueuses et un grep WW /var/log/Xorg.0.log vous informera des petits défauts. Ceci peut permettre plus facilement de trouver d'où vient l'origine de votre problème et peut indiquer que des paramètres ne sont pas valables avec le driver que vous utilisez bien que vous les ayez crus universels. Je donnerais l'exemple de Option "TV" "PAL-N" qui n'existe pas avec le driver i810.

4 - L'utilisation xrandr

Pour une explication plus complète de xrandr, voir xrandr par l'exemple.

4-1 - Présentation de xrandr

Il semblerait que la configuration par xorg.conf deviendra assez vite désuète. En effet, il est déjà possible d'utiliser les fonctionnalités RandR de xorg en utilisant la commande xrandr. Un des gros avantages de cette dernière est de pouvoir reconfigurer l'affichage sans avoir à relancer le serveur X. C'est donc très pratique dès que l'environnement est variable, comme avec un ordinateur portable.

La meilleure façon d'appréhender les possibilités de xrandr est de regarder man xrandr qui est traduit en français. Attention, seules les versions de RandR (composante de xorg) supérieures ou égales à 1.2 peuvent configurer un affichage sur deux écrans. Ceci est valable à partir de la version 1.2 de xorg.

Le double écran n'est plus géré par le fichier de configuration /etc/X11/xorg.conf, mais il est géré par l'utilisateur final qui peut l'adapter à ses besoins. Au début, xorg.conf ne devait générer qu'un écran virtuel englobant l'affichage qu'on voulait avoir. Ce xorg.conf sera donc simplifié pour les dernières versions. Voici la partie spécifique à l'affichage :

Section "Monitor"
Identifier "monitor1"
VendorName "Plug'n Play"
ModelName ""

HorizSync 28.0 - 81.0
VertRefresh 56.0 - 75.0
Modeline "1360x768_60.00"  85.86  1366 1460 1604 1800  768 769 772 795  -HSync +Vsync
Option "DPMS"
EndSection

Section "Device"
Identifier "device1"
VendorName "Intel Corp."
BoardName "Intel 915"
Driver "intel"
BusID "PCI:0:2:0"
Option "DPMS"
Option "XaaNoOffscreenPixmaps" #"1"
Option "SWCursor"
EndSection

Section "Screen"
Identifier "screen1"
Device "device1"
Monitor "monitor1"
DefaultColorDepth 16

Subsection "Display"
Virtual 2304 1536
# je pourrais mettre côte à côte un écran de 1024 de large et un autre de 1280
# ou l'un sur l'autre 2 écrans de 768 de haut
EndSubsection
EndSection

Section "ServerLayout"
Identifier "xrandr"
InputDevice "Keyboard1" "CoreKeyboard"
InputDevice "Mouse1" "CorePointer"
InputDevice "SynapticsMouse1" "AlwaysCore"
Screen "screen1"
EndSection

Avec la dernière version (xrandr 1.3), la sous partie Subsection "Display" de la Section "Screen" est devenue inutile.

4-2 - utilisation de xrandr

Toutes les explications ici présentées n'ont été testées qu'avec le driver intel sur des chipsets intel. Si vous avez des retours sur d'autres chipsets, je serai heureux de les avoir.

4-2-1 - État d'origine

Par defaut, il y a le même affichage sur les deux écrans, même si parfois, ils ont une taille différente. Dans ce cas, le petit écran ne va afficher qu'une partie de l'écran. L'utilisateur verra sur le total de ces deux écrans l'image ci-dessous :

Alors que l'écran virtuel ne sera que le plus grand des écrans.

Il vous restera alors à configurer votre affichage : la place d'un écran par rapport à l'autre.

C'est encore avec xrandr qu'on va identifier nos écrans ainsi que leurs modes disponibles. xrandr --prop pourra apporter plus de renseignements.

[troumad@portable][~]$ xrandr
Screen 0: minimum 320 x 200, current 2304 x 1024, maximum 2304 x 1536
VGA connected 1280x1024+1024+0 (normal left inverted right) 376mm x 301mm
1280x1024      60.0*+   59.9
1360x768_60.00   60.0
1152x864       75.0     74.8
1024x768       70.1     60.0
832x624        74.6
800x600        72.2     75.0     60.3     56.2
640x480        75.0     72.8     66.7     60.0
720x400        70.1
LVDS connected 1024x768+0+0 (normal left inverted right) 304mm x 228mm
1024x768       60.0*+
800x600        60.3
640x480        59.9
TMDS-1 disconnected (normal left inverted right)
TV disconnected (normal left inverted right)

Je repère avec cette instruction que j'ai quatre sorties écran (malheureusement, je n'en ai que 3 réellement). La première : la sortie VGA, la seconde : l'écran du portable, la troisième : inconnue et la quatrième, la sortie TV. Au début, je voyais que mon écran plat n'était pas entièrement reconnu : il manquait le mode 1280x1024 ! Ceci était dû au mauvais paramétrage des paramètres HorizSync et VertRefresh. Je repère aussi les modes conseillés avec le "*" et le mode actuel avec le "+".

4-2-2 - Placement des écrans

Pour la mise en place du double écran, l'écran virtuel maximal défini dans la section Screen : Virtual 2304 1536 doit contenir l'ensemble des deux écrans. xrandr pourra utiliser simplement comme ceci : xrandr --output VGA --above LVDS ou comme ceci : randr --output LVDS --left-of VGA. Au démarrage, l'affichage se fait en mode clone sur les deux écrans, cette dernière instruction leur permet d'afficher chacun une partie différente de l'écran virtuel et d'étendre l'écran virtuel sur le rectangle minimal couvrant notre affichage. Si on place juste les écrans dessus, dessous, à gauche ou à droite, les écrans sont alignés par défaut comme avec l'ancienne version de xorg : par le haut et la droite.

Si vous voulez modifier un réglage précédent, je vous conseille de revenir à zéro avant de le faire :

[troumad@portable][~]$ xrandr --output LVDS --pos 0x0
[troumad@portable][~]$ xrandr --output LVDS --pos 0x0
[troumad@portable][~]$ xrandr --output VGA --pos 1026x-230
[troumad@portable][~]$ xrandr
Screen 0: minimum 320 x 200, current 2306 x 1024, maximum 2390 x 1536
VGA connected 1280x1024+1026+0 (normal left inverted right) 376mm x 301mm
1280x1024      60.0*+   59.9
1360x768_60.00   60.0
1152x864       75.0     74.8
1024x768       70.1     60.0
832x624        74.6
800x600        72.2     75.0     60.3     56.2
640x480        75.0     72.8     66.7     60.0
720x400        70.1
LVDS connected 1024x768+0+230 (normal left inverted right) 304mm x 228mm
1024x768       60.0*+
800x600        60.3
640x480        59.9
TMDS-1 disconnected (normal left inverted right)
TV disconnected (normal left inverted right)

J'ai fait un réglage avec un nombre négatif : au lieu de descendre l'écran VGA, ce réglage a monté l'écran LVDS. On voit ceci avec le xrandr que j'ai fait juste après : les coordonnées de l'écran VGA sont 1026+0 et celle du LVDS sont 0+230. Il faut donc faire attention avec l'utilisation d'une coordonnée négative sur un écran car pour l'annuler, il faut intervenir sur celles de tous les autres. Voici le résultat final :

../icewm/ecrans/double.png

Copie d'écran éffectuée sous iceWM.

4-3 - La sortie svideo

Dès que la sortie svideo est branchée, l'affichage se fait aussi dessus. La commande xrandr nous montre que la sortie TV est active et on peut donc adapter comme précédement l'affichage de la sortie svideo à la TV qui est en 1024x768 par défaut ainsi que placer la TV par rapport à l'écran de l'ordinateur selon notre disposition locale. Je fais donc un xrandr --output TV --mode 848x480 --above LVDS pour avoir ma configuration finale.

./ecran/TV.png

Vous pouvez remarquer sur
cette copie d'écran l'alignement
à gauche qui se fait naturellement
lors de l'empilement vertical
d'écrans.

4-4 - Les GUI de xrandr

Les GUI de xrandr sont grandr_applet sous gnome et krandr(tary) sous KDE, lxrandr. Mais pour le moment, ils ne gèrent pas tout.

Il y a aussi des logiciels qui n'ont pas encore leur rpm pour Mandriva arandr et zarfy. Eux non plus ne gèrent pas les options de xrandr 1.3 .

Par manque de GUI, j'ai fait un petit programme pour gérer des options de la version 1.3 de xrandr : optimise.c.

4-5 - Conclusion sur xrandr

xrandr permet de gérer plusieurs configurations d'affichage différentes sans avoir à passer par une modification du fichier de configuration /etc/X11/xorg.conf. Le grand avantage de cette nouveauté est de pouvoir s'adapter à son environnement graphique sans avoir accès aux droits administrateurs pour modifier un fichier de configuration. Ceci est d'autant plus intéressant que les ordinateurs portables se démocratisent en même temps que les vidéoprojecteurs, donc les utilisateurs sont de plus en plus souvent confrontés à des configurations différentes avec le même matériel. Pour une explication plus complète de xrandr, voir xrandr par l'exemple.

5 - Les utilitaires NVidia

Les utilitaires Nvidia prennent en compte les différentes sorties de leur carte et peuvent gérer le multiécran (officiellement au moins). Comme les dernières versions des drivers Nvidia ne supportent pas très bien l'ancien mode de configuration du multiécran, il faut soit passer par là, soit récupérer un xorg.conf bien généré par ces utilitaires. Pour ma part, j'ai dû utiliser la seconde méthode, car nvidia-settings ne voulait pas me générer un bon xorg.conf.

La principale différence est que cette fois, on ne met plus qu'une seule entrée device, le ServerLayout ne définit qu'un seul écran. La définition du double écran se fait dans la section screen avec la ligne (les sauts de lignes ont été rajoutés pour la lisibilité du document) :

Option "metamodes" "CRT: 1440x900 +0+0, DFP: nvidia-auto-select +1440+0; CRT: 1152x864 +0+0, DFP: nvidia-auto-select +1152+0;
CRT: 1024x768 +0+0, DFP: nvidia-auto-select +1024+0; CRT: 832x624 +0+0, DFP: nvidia-auto-select +832+0;
CRT: 800x600 +0+0, DFP: nvidia-auto-select +800+0; CRT: 640x480 +0+0, DFP: nvidia-auto-select +640+0; CRT: 320x240 +0+0, DFP: nvidia-auto-select +320+0"

Dans cet exemple, on a une multitude de modes définis. Chaque fois on prend en compte deux sorties : CRT (sortie VGA) et DFP (sortie HDMI). Pour chacune des deux sorties, on donne la taille largeurxhauteur, puis la position x y. Donc dans le premier mode, l'écran sur la prise VGA fait 1440x900 et est placé à l'origine du repère +0+0. Le second écran a un mode choisi automatiquement nvidia-auto-select et placé en +1440+0, donc à droite du premier.

Finalement, le xorg.cong s'en sort bien simplifié (les mêmes sauts de lignes que précédemment ont été rajoutés ) :

# File generated by XFdrake (rev 256990)

# nvidia-settings: X configuration file generated by nvidia-settings
# nvidia-settings:  version 1.0  (buildmeister@builder63)  Thu Apr 16 19:37:21 PDT 2009

# File generated by XFdrake (rev 256990)
# **********************************************************************
# Refer to the xorg.conf man page for details about the format of
# this file.
# **********************************************************************

Section "ServerLayout"
Identifier "layout1"
InputDevice "Keyboard1" "CoreKeyboard"
InputDevice "Mouse1" "CorePointer"
InputDevice "Mouse2" "SendCoreEvents"
Screen 0  "Screen0" 0 0
EndSection

Section "Module"
Load "dbe" # Double-Buffering Extension
Load "v4l" # Video for Linux
Load "extmod"
Load "glx" # 3D layer
EndSection

Section "ServerFlags"
Option "Xinerama" "0"

# allows the server to start up even if the mouse does not work
Option "allowmouseopenfail"
EndSection

Section "InputDevice"
Identifier "Keyboard1"
Driver "kbd"
Option "XkbModel" "pc105"
Option "XkbLayout" "fr"
Option "XkbOptions" "compose:rwin"
EndSection

Section "InputDevice"
Identifier "Mouse1"
Driver "mouse"
Option "Protocol" "ExplorerPS/2"
Option "Device" "/dev/input/mice"
EndSection

Section "InputDevice"
Identifier "Mouse2"
Driver "evdev"
Option "device" "/dev/input/by-id/usb-413c_Dell_Premium_USB_Optical_Mouse-event-mouse"
Option "HWheelRelativeAxisButtons" "7 6"
EndSection

Section "Monitor"
Identifier "Monitor0"
VendorName "Unknown"
ModelName "DELL 1908FP"
#HorizSync 30.0 - 81.0
HorizSync 31.0 - 61.0
#VertRefresh 56.0 - 76.0
VertRefresh 60.0 - 75.0
EndSection

Section "Device"
Identifier "Device0"
VendorName "NVIDIA Corporation"
BoardName "GeForce 7300 GT"
Driver "nvidia"
EndSection

Section "Screen"
Identifier "Screen0"
Device "Device0"
Monitor "Monitor0"
DefaultDepth 24

Subsection "Display"
Depth 24
EndSubsection
Option "TwinViewXineramaInfoOrder" "CRT-0"
Option "TwinView" "1"
#Option "metamodes" "CRT: 1280x1024 +0+0, DFP: nvidia-auto-select +1280+0; CRT: 1152x864 +0+0, DFP: nvidia-auto-select +1152+0;
# CRT: 1024x768 +0+0, DFP: nvidia-auto-select +1024+0; CRT: 832x624 +0+0, DFP: nvidia-auto-select +832+0;
# CRT: 800x600 +0+0, DFP: nvidia-auto-select +800+0; CRT: 640x480 +0+0, DFP: nvidia-auto-select +640+0; CRT: 320x240 +0+0, DFP: nvidia-auto-select +320+0"
Option "metamodes" "CRT: 1440x900 +0+0, DFP: nvidia-auto-select +1440+0; CRT: 1152x864 +0+0, DFP: nvidia-auto-select +1152+0;
CRT: 1024x768 +0+0, DFP: nvidia-auto-select +1024+0; CRT: 832x624 +0+0, DFP: nvidia-auto-select +832+0;
CRT: 800x600 +0+0, DFP: nvidia-auto-select +800+0; CRT: 640x480 +0+0, DFP: nvidia-auto-select +640+0; CRT: 320x240 +0+0, DFP: nvidia-auto-select +320+0"
EndSection

6 - L'utilisation de plusieurs écrans

6-1 - Vidéo

Au moins sous Mandriva 2007.X (pas avec la nouvelle version de xorg), j'ai un problème d'affichage des vidéos avec l'affichage sur plusieurs écrans. Je viens de trouver le remède sur Mandriva Linux 2007 Errata : j'applique les correctifs pour les Bureaux 3D ! Est-ce dû à Mandriva ? À xinerama ? Au couple Xinerama chipset i915GM ?

6-2 - KDE

Sous KDE, la gestion des deux écrans est automatique. On peut tout simplement avec la souris placer la barre des tâches où on souhaite en la faisant glisser à l'emplacement souhaité.

Il est aussi possible de régler KDE pour l'utilisation personnalisée des deux écrans avec le centre de configuration de KDE dans périphérique affichage.

Vous pouvez par exemple choisir en désactivant la "maximisation avec plusieurs moniteurs" qu'une maximisation d'une fenêtre se fasse sur l'ensemble des écrans, la zone écran. On peut aussi bloquer les fenêtres maximisées sur leur écran en déactivant l'option kcontrol > bureau > comportement des fenêtres > Déplacement > permettre le déplacement et le redimentionnement des fenêtres maximisées.

6-3 - Gnome

Comme sous KDE l'emplacement des barres de tâche se gérait simplement à la souris. Mais lors de mes derniers essais, ce n'est plus le cas. Les barres de tâches sont indéplaçables. Par contre, elles apparaissent dans un ordre précis lorsqu'on demande d'en rajouter une nouvelle : haut bas droite gauche sur le premier écran, puis de même sur le second. À la fin, on ne garde les barres qu'on souhaite après avoir supprimé les autres. Ce point est indispensable car le gestionnaire des tâches d'un écran ne montre que les applications ouvertes sur cet écran.

6-4 - iceWM

L'emplacement de la barre de tâche se gère sur le fichier de configuration ~/.icewm/preferences avec l'option XineramaPrimaryScreen=1 (0 pour le premier écran définit dans le ServerLayout). Bien que l'affichage de la barre se fasse sur un seul écran, la maximisation des écrans sur l'écran sans la barre de tache ne prend pas la place occupée par cette barre sur l'autre écran.

6-5 - xfce4

L'emplacement des barres de menu se gère avec clic-droit sur le panneau de configuration > Configurer le panneau. Tout en bas, on choisit le moniteur. Juste en dessus on choisit la place de la barre sur le moniteur.

Un avantage de xfce4, c'est que si on veut bouger une fenêtre maximisée, celle-ci diminue ("se démaximise").

6-6 - enlightenment

6-6-1 - e16

Les miniatures des bureaux virtuels peuvent poser un problème si le coin bas à gauche de la zone écran n'est pas visible. Par défaut, ces miniatures y sont placées, alors elles sont inaccessibles et invisibles ! Il faudra les mettre ailleurs grâce à une autre configuration.

6-6-2 - e17

e17 présente une originalité par rapport aux autres interfaces. En effet, les bureaux virtuels des deux écrans sont gérés séparément. C'est à dire que si on change de bureau virtuel sur un écran, ceci n'affecte pas l'autre. Donc, pour pouvoir gérer les bureaux virtuels séparément sur les deux écrans, il faut avoir une barre des taches (gondole sous enlightenment) par écran pour avoir un pager de chaque côté.

Toujours au niveau des bureaux virtuels, sous e17, ils sont placés dans l'espace afin de pouvoir passer d'un à l'autre d'un simple mouvement de souris. C'est à dire que si on a un écran virtuel sur la gauche, il suffit de bouger la souris vers la gauche pour y accéder, on fait de même pour la droite, le haut ou le bas. Ce placement est configurable. Par défaut, on a 4 écrans placés horizontalement. Mais si nos écrans réels sont aussi placés horizontalement, le scrolling d'un écran virtuel vers un autre se trouve annulé et remplacé par le passage d'un écran vers un autre. Donc, dans le cas où les écrans réels sont placés horizontalement, il faut placer les écrans virtuels verticalement pour bénéficier de cette possibilité pleinement.

Un autre problème rencontré avec le scrolling : il ne se fait pas si la souris doit passer par une partie invisible (voir zone noire).

Documentation sur http://fr.enlightenment.org/documentation/ ou http://wiki.mandriva.com/fr/Enlightenment_DR17.

6-7 - FluxBox

Pas génial, je dirais. En effet, la barre de menu ne se fixe pas sur un écran en position vertical, mais déborde toujours sur le voisin ! En plus, elle se met sans problème (pour elle) dans la zone morte de mon écran.

Vous me direz, de la mettre verticalement cette barre ! Et bien, je n'y arrive pas avec ma version...

6-8 - Ion3

Pas fait pour le double écran. En effet, ion3 ne prend en compte que la zone écran et ne gère pas du tout le coin noir en cas de non recouvrement complet de cette zone !

Voir http://dev.nozav.org/intro_ion.html pour plus d'informations sur cet environnement vraiment différent.

7 - Améliorations possibles

Si vous avez lu mon document, vous êtes sûrement tombés sur des questions que je me pose, je suis bien sur preneur de toute réponse. Vous avez aussi vu que j'ai testé très peu de distributions : Ubuntu (que je n'utilise plus), Mandriva (que j'utilise principalement en version power pack ou cooker) ou Debian. Si vous testez sur d'autres distributions, dites-le moi !

Je ne suis pas un expert en la matière, j'ai juste passé du temps à tester la configuration de xorg pour arriver à mes fins. Comme j'y suis arrivé, j'ai fait ce texte pour vous aider à y arriver aussi, pour informer que c'est faisable si vous n'y pensiez pas, pour dire que, aussi, sous Linux c'est faisable. Donc, si vous pensez que je dois rajouter des informations qui vous semblent importantes, faites-les moi parvenir pour que tous puissent en bénéficier.

Commentez

8 - Remerciements

Pour les relectures, je remercie Gorgonite, Miles, trotters213 et mlny84.