Léa-Linux & amis :   LinuxFR   GCU-Squad   Zarb.Org   GNU
Utiliser plusieurs écrans

Multi-Head ou Utiliser plusieurs écrans et/ou cartes graphiques

par Fred

Installer et configurer plusieurs cartes graphiques (PCI et/ou AGP) et plusieurs écrans et bénéficier de leurs services.


Introduction

Depuis l'avènement de XFree86 4.0.x, il est possible de profiter pleinement de plusieurs écrans en même temps. Pour cela il existe plusieurs possibilités :

  • La première : vous avez plusieurs serveurs X en même temps et passez de l'un à l'autre en déplaçant votre souris (ceci fonctionne avec tous les Window Managers).
  • La seconde, peut-être la plus intéressante : vos multiples écrans se comportent comme un seul écran dont la résolution est la somme des résolutions des écrans que vous juxtaposez.

Dans tous les cas, vous aurez besoin d'un gestionnaire de fenêtres capable de gérer correctement les deux écrans : c'est le Xinerama. Le seul que je connaisse est Enlightenment. Ni Kwm, ni Sawfish n'étant à l'heure où j'écris ce document capables de fonctionner correctement avec deux écrans (c'est à dire qu'ils fonctionnent mais ne permettent pas de bénéficier réellement des possibilités offertes par cette option). Donc, dans un premier temps, je vous conseille d'installer et de configurer Enlightenment (un rpm -i enlightenment-xxx.rpm devrait suffire sur une Mandrake / RedHat / SuSE). Je n'expliquerai pas ici comment procéder, et je me placerai dans le cadre de l'utilisation de ce WM à l'exclusion des autres (sauf mention contraire).
Je supposerai aussi que vous avez réussi à faire fonctionner individuellement chacune des cartes graphiques que vous souhaitez installer en même temps (et que vous ne comptez pas utiliser 2 cartes AGP en même temps ;-) et que vous avez installé XFree86 4.0.x (la version que j'utilise pour rédiger cet article est la 4.0.1).
Bon, passons aux choses sérieuses.

Configuration du serveur X

C'est relativement simple. Comme vous le savez certainement (voir rubrique [x.php3 X Window]), la configuration du serveur X passe par l'écriture (toujours laborieuse) d'un fichier /etc/X11/XF86Config (ou /etc/X11/XF86Config-4). Ce fichier est divisé en multiples sections, chaque section commençant par Section "NomDeLaSection" et se finissant par EndSection. Nous partirons d'un fichier /etc/X11/XF86Config qui fonctionne pour l'une de vos cartes graphiques (n'importe laquelle) : dans la suite nous allons le modifier, prenez le temps d'en faire un copie (juste au cas où...).
Si vous avez édité les version 3.3.x et 4.0.x de ces fichier vous avez remarqué qu'ils ont légèrement changé, les plus grandes modifications (en plus de la syntaxe) sont certainement l'ajout de sections concernant la gestion du multihead. Celles qui nous intéressent sont les sections "Monitor", "Device", "Screen" et "ServerLayout".

Les sections "Monitor"

Jusqu'à maintenant, dans votre /etc/X11/XF86Config, il n'y avait besoin que d'une seule section "Monitor". Maintenant il vous en faut une par écran de type différent que vous comptez installer (c'est à dire : si tous vous écrans sont identiques, nous n'avez pas besoin d'en écrire plusieurs, par contre si vos écrans sont différents il vous faut une section par type).
Moi j'ai deux écrans : un 17 pouces IIYAMA Vision Master Pro 411 et un 15 pouces de chez ADI Corp. sans référence particulières, les deux sont Plug and Play sous X (je n'ai pas à m'occuper des lignes ModeLine). Mes sections "Monitor" sont :

Section "Monitor"
    Identifier "IIYAMA"
    VendorName "IIYAMA"
    ModelName  "Vision Master Pro 411"
 

# HorizSync is in kHz unless units are specified.
# HorizSync may be a comma separated list of discrete values, or a
# comma separated list of ranges of values.
# NOTE: THE VALUES HERE ARE EXAMPLES ONLY.  REFER TO YOUR MONITOR'S
# USER MANUAL FOR THE CORRECT NUMBERS.
    HorizSync  30-86
 

# VertRefresh is in Hz unless units are specified.
# VertRefresh may be a comma separated list of discrete values, or a
# comma separated list of ranges of values.
# NOTE: THE VALUES HERE ARE EXAMPLES ONLY.  REFER TO YOUR MONITOR'S
# USER MANUAL FOR THE CORRECT NUMBERS.
    VertRefresh 50-180

EndSection

Pour mon IIYAMA et :

Section "Monitor"
    Identifier "ADI"
    VendorName "ADI Corp."
    ModelName  "15pouces"
 

# HorizSync is in kHz unless units are specified.
# HorizSync may be a comma separated list of discrete values, or a
# comma separated list of ranges of values.
# NOTE: THE VALUES HERE ARE EXAMPLES ONLY.  REFER TO YOUR MONITOR'S
# USER MANUAL FOR THE CORRECT NUMBERS.
    HorizSync  30-60
 

# VertRefresh is in Hz unless units are specified.
# VertRefresh may be a comma separated list of discrete values, or a
# comma separated list of ranges of values.
# NOTE: THE VALUES HERE ARE EXAMPLES ONLY.  REFER TO YOUR MONITOR'S
# USER MANUAL FOR THE CORRECT NUMBERS.
    VertRefresh 50-100

EndSection

pour mon ADI ; tout cela étant bien entendu dans le même fichier XF86Config.
Il est possible de mettre n'importe quoi pour les variables Identifier, VendorName et ModelName, du moment que chaque moniteur a une variable Identifier différente. Par contre les valeurs à mettre pour HorizSync (synchronisation horizontale) et VertRefresh (rafraîchissement vertical) doivent être celles de vos moniteurs (si vous ne les connaissez pas, pour HorizSync commencez par 30-40 et pour VertRefresh commencez par 50-60 puis augmentez petit à petit les valeurs extrêmes, mais ceci à vos risques et périls : le mieux est quand même de lire la documentation de votre moniteur).

Paramétrons ensuite :

Les sections "Device"

Comme pour les moniteurs il vous faut une section par carte graphique, mais à la différence des moniteurs, si vous avez deux cartes identiques (par exemple 2  TNT PCI) il faut faudra quand même deux sections "Device" : une pour chaque carte. Le problème va être de trouver quelle valeur mettre pour la variable "BusID" de ces sections. Mais ce n'est pas très complexe, tapez (en mode console, et en tant que root) :

# X -scanpci -verbose

Et vous devriez voir quelque chose comme :

Probing for PCI devices (Bus:Device:Function)

(0:0:0) unknown chip (DeviceId 0x0305) from VIA
(0:1:0) unknown chip (DeviceId 0x8305) from VIA
(0:3:0) Realtek unknown card (0x8029) using a Realtek 8029
(0:4:0) S3 ViRGE
(0:20:0) VIA card using a VIA VT 82C686 MVP4 ISA Bridge
(0:20:1) VIA card using a VIA VT 82C586 MVP3 IDE Bridge
(0:20:2) unknown card (0x0925/0x1234) using a VIA VT 82C586 MVP3 USB Controller
(0:20:3) unknown card (0x0925/0x1234) using a VIA VT 82C586 MVP3 USB Controller
(0:20:4) VIA card using a VIA VT 8501 MVP4 ACPI Bridge
(0:20:5) VIA card using a VIA VT 8501 MVP4 MultiMedia
(1:0:0) unknown card (0x1569/0x002d) using a NVidia Riva Ultra 64

C'est la liste de tous vos périphériques PCI/AGP. Mes carte graphiques sont une S3 Virge dont le paramètre BusID sera donc (cf. paramètre en rouge) : "0:4:0" et une TNT2 dont le paramètre BusID sera (cf. paramètre en vert) : "1:0:0". Mes sections "device" sont donc :

Section "Device"
    Identifier  "RIVA TNT2"
    VendorName  "Unknown"
    BoardName   "Unknown"
    BusID       "1:0:0"
    Driver      "nvidia"

    # Uncomment following option if you see a big white block
    # instead of the cursor!
    #    Option      "sw_cursor"

    Option      "DPMS"
EndSection

pour ma TNT2 et :

Section "Device"
    Identifier  "S3 Virge"
    VendorName  "Unknown"
    BoardName   "Unknown"
    BusID       "0:4:0"
    Driver      "s3virge"

    # Uncomment following option if you see a big white block
    # instead of the cursor!
    #    Option      "sw_cursor"

    Option      "DPMS"
EndSection

pour ma S3 Virge. Comme pour les moniteurs, les variables Identifier doivent être différentes pour chacune des cartes graphiques.

Note : Si votre carte graphique est une GeForce2MX, vous pouvez utiliser les fonctionnalités TwinView (deux écrans sur la même carte graphique), voici un exemple de lignes à ajouter dans la section "Device" de cette carte :

Option "TwinView"
Option "SecondMonitorHorizSync" "30-38"
Option "SecondMonitorVertRefresh" "50-100"
Option "TwinViewOrientation" "Below"
Option "MetaModes" "1152x864, 800x600; 1152x864, NULL"
Option "ConnectedMonitor" "crt, crt"
Si vous avez connecté un moniteur en analogique et le second en DVI, il faut remplacer
"crt, crt" par "crt, dfp"
.

Configurons maintenant :

Les sections "Screen"

A la différence des sections "Monitor", il vous faut une section "Screen" par écran (et pas par type d'écran). Ce qui me donne les sections suivantes :

Section "Screen"
    Identifier "Principal"
    Device      "RIVA TNT2"
    Monitor     "IIYAMA"
    DefaultColorDepth 24
    Subsection "Display"
        Depth       8
        Modes       "1088x816" "1024x768" "800x600" "640x400"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       16
        Modes       "1088x816" "1024x768" "800x600" "640x400"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       24
        Modes       "1088x816" "1024x768" "800x600" "640x400"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       32
        Modes       "1088x816" "1024x768" "800x600" "640x400"
        ViewPort    0 0
    EndSubsection
EndSection

pour mon écran IIYAMA que j'ai relié à ma TNT2 et :

Section "Screen"
    Identifier "Secondaire"
    Device      "S3 Virge"
    Monitor     "ADI"
    DefaultColorDepth 24
    Subsection "Display"
        Depth       8
        Modes       "1024x768" "800x600" "640x400"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       16
        Modes       "1024x768" "800x600" "640x480"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       24
        Modes       "1024x768" "800x600" "640x480"
        ViewPort    0 0
    EndSubsection
    Subsection "Display"
        Depth       32
        Modes       "1024x768" "800x600" "640x480"
        ViewPort    0 0
   EndSubsection
EndSection

pour mon ADI Corp. que j'ai relié à ma S3 Virge. Pour chaque écran, les variables "Device" et "Monitor" doivent correspondre à un Identifier des sections "Device" et "Monitor" (voir les lignes en gras dans les sections précités). Une nouvelle fois les variables Identifier doivent être différentes pour les deux (ou plus) sections "Screen". Il ne nous reste plus qu'à dire au serveur X comment sont disposés nos écrans, et pour cela à configurer :

La section "ServerLayout"

J'ai mis mon écran "Secondaire" à droite de (RightOf) mon écran "Principal" donc ma section ServerLayout est :

Section "ServerLayout"
    Identifier "layout1"
    Screen     "Principal"
    Screen     "Secondaire" RightOf "Principal"

    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

A la place de "RightOf" vous pouvez mettre :

  • LeftOf : à gauche,
  • Above : au-dessus,
  • Below : en-dessous,
  • Relative : pour placer un écran relativement à un autre (exemple : "Secondaire" Relative "Principal" 1088 216),
  • Absolute : pour dire que les coordonnées du coin supérieur gauche de cet écran sont (x,y) (exemple : Absolute 800 600).
"Note:" Il est préférable d'omettre la seconde ligne
Screen
dans la Section Layout. Le positionnement relatif des écrans a été fait dans la Section Device.

Premier essai

Voilà, notre fichier /etc/X11/XF86Config est correctement écrit, vous avez vérifié trois fois chaque paramètre et c. Lançons nous et tapons (en mode console) :

X

Normalement le serveur X doit démarrer et vos deux écrans doivent s'allumer, vous devez pouvoir passer la souris d'un écran sur l'autre, comme s'ils ne formaient qu'une seule surface. Ca marche ? Passons à la suite. Ca ne marche pas ? Relisez tout ce qui précède...

Maintenant vous pouvez travailler avec vos deux écrans.

Le Xinerama

La manière la plus simple de travailler avec deux écrans est d'activer le mode Xinerama de votre serveur X (disponible depuis XFree86 4.0.x). Le mode Xinerama est un mode de fonctionnement dans lequel les multiples écrans connectés à votre ordinateur ne semblent plus n'en faire qu'un : leurs résolutions s'additionnent. Pour configurer ce mode de fonctionnement, c'est vraiment très simple : il suffit de passer "+xinerama" au serveur X. Mais, en fait on n'appelle jamais soi-même le serveur X, on passe soit par le script startx, dans ce cas il faut taper :

startx -- +xinerama

soit on utilise un "Display Manager" (kdm, gdm, xdm, et c.). Dans le cas de kdm ou xdm il faut éditer le fichier /etc/X11/xdm/Xserver pour que la ligne d'appel du serveur X devienne :

:0 local /usr/X11R6/bin/X +xinerama


Dans le cas de gdm il faut éditer le fichier /etc/X11/gdm/gdm.conf pour que la ligne d'appel du serveur X devienne :

0=/usr/bin/X11/X +xinerama

(dans la section : servers). Puis vous redémarrez votre "Display Manager" :

init 3

Attendez 5 secondes, puis :

init 5

Et voilà, votre "Display Manager" s'étale sur vos multiples écrans. Si vous vous loguez, vous devez voir le changement. Pour que votre écran MultiHead soit le plus facilement utilisable je vous conseille d'utiliser Enlightenment qui permet, entre autre, la maximisation limitée à une seul écran (ce que vous voudrez sans doute faire). Il parait que Sawfish en est aussi capable, mais je n'ai pas pu le voir fonctionner...

Sans Xinerama

Il est inutile d'utiliser Xinerama avec une carte nVidia qui gère le TwinView.

Pour les autres, ce qui suit est obsolète, tous les gestionnaires de fenêtres modernes gérent sans problème le fonctionnement de Xinerama.

Pour utiliser le multihead sans Xinerama je vous conseille d'utiliser (une nouvelle fois) Enlightenment, car lorsque vous n'êtes pas en mode xinerama vous avez deux displays : :0.0 et :0.1 et il faut lancer un window manager sur chacun des deux displays. Mais par défaut seul premier des deux displays se voit pourvu, vous pouvez alors lancer le window manager de votre choix sur le second display par :

DISPLAY=:0.1 sawfish

pour lancer sawfish sur le second display (quelque soit le window manager lancé sur le premier display, sauf Enlightenment). L'avantage de Enlightenment : vous n'avez pas à taper cette commande, Enlightenment détectant automatiquement votre second display et se lançant alors sur celui-ci.
Il faut savoir que dans ce mode de fonctionnement, les deux serveurs X sont (presque) indépendants (exemple : l'accélération 3D via Mesa fonctionnera !), mais vous ne pourrez pas passez une fenêtre d'un écran sur l'autre, à vous de choisir ce qui vous intéresse le plus.

Conclusion

A vous les murs d'écrans LCD pour voir Matrix sur un écran 200 pouces... ;-)

Postface

Configurations testées :

  1. 2 Matrox G200 (une AGP + une PCI) : Lilian Parmentier me signale qu'il a eu des problèmes avec WindowMaker.
  2. 1 Riva TNT2 (32 Mo) + 1 S3 Virge (2 Mo) : aucun problème particulier.
  3. 1 GeForce2MX en mode TwinView : Waba n'a eu aucun problème pour faire fonctionner cette configuration en utilisant la documentation du site de nvidia.
  4. 1 (ou 2) Matrox G400 : Matthieu Foillard me signale qu'il n'a pas réussi a faire fonctionner ces cartes en mode DRI. Mis à part ce détail, il n'a eu aucun problème.
  5. 1 GeForce 2 GTS 32MB (AGP) + 1 Banshee 16MB (PCI) : utopiah@utopiah.com utilise les drivers NVidia et TDFX_DFI sans aucun problème (je cite : "ça marche nickel!" ;)
  6. 1 ATI Radeon 8500 LE (AGP) + 1 S3Virdre (PCI) : utiliser le driver "radeon" ou "ati" pour l'ATI et "s3virge" pour la S3. Il faut la version 4.2.1 de X Free (pour la radeon). Ça ne fonctionne plus avec X Free 4.2.99.x : problème avec le DRI semble-t-il, ou avec le DPMS.



@ Retour à la rubrique Environnement graphique


Cette page est issue de la documentation 'pré-wiki' de Léa a été convertie avec HTML::WikiConverter. Elle fut créée par Frédéric Bonnaud le 22/03/2001.


Copyright

© 22/03/2001 Frédéric Bonnaud

Creative Commons License
Creative Commons Attribution iconCreative Commons Share Alike icon
Ce document est publié sous licence Creative Commons
Attribution, Partage à l'identique 3.0 :
http://creativecommons.org/licenses/by-sa/3.0/
Affichages
(Redirigé depuis Multihead)

Serveur hébergé par ST-Hebergement et Lost-Oasis / IRC hébergé par FreeNode / NS secondaire hébergé par XName
Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons CC-BY-SA