Utilisation de l'extension Xinerama pour le multi-écran avec XFree86 V. 4.0+

Dennis Baker <drbaker at softhome dot net>.
Traduction française de Xavier Serpaggi <xavier dot serpaggi at free dot fr>.

Révision v2.0, 2 Novembre 2000
Ce document décrit comment configurer XFree86 version 4.0 ou plus, pour utiliser plusieurs moniteurs avec l'extension Xinerama.

1. IntroductionDe nombreuses améliorations sont dues à Nico Schottelius nicos@pcsystems.de.

1.1 Xinerama, c'est quoi ?

Pourquoi auriez-vous besoin de Xinerama ? Et qu'est ce que c'est ? Les extensions Xinerama ont-été ajoutées à XFree86 à la version 4.0. Xinerama est une extension de XFree86 Release 6 Version 4 (X4.0) qui permet aux applications et aux gestionnaires de fenêtres de disposer de deux écrans physiques (ou plus), comme un seul grand écran virtuel.

La beauté des extensions Xinerama est qu'elles sont complètement transparentes à l'utilisateur. Avant cela, les applications ne pouvaient occuper qu'un seul affichage (display) et ne pouvaient pas être déplacées de l'un à l'autre. Les gestionnaires de fenêtres devaient gérer explicitement les deux affichages. Avec Xinerama, les gestionnaires de fenêtres et les applications ne doivent pas être écrits spécialement dans le but de supporter l'écran virtuel de plus grande taille ainsi créé.

1.2 Directives

Ce document ne prétend pas être un guide sur la mise en service de votre moniteur ou de votre carte graphique. En réalité, je fais l'hypothèse que vous disposez déjà d'un environnement X Window qui fonctionne pour votre configuration. Je vous conseille de vous plonger dans le documentation de XF86 pour plus d'informations.

Autant que je saches il n'y a pas de limite au nombre de cartes graphiques que vous pouvez configurer de cette manière. Il ne semble pas non plus y avoir de problème à mélanger différents types de cartes graphiques dans une même configuration. La configuration de test que j'utilise pour cette documentation comporte deux cartes graphiques : une Fire GL 1000 AGP et une Matrox Millenium II PCI. Quel effet cela a-t-il sur l'accélération 3D, je n'en sait rien vu que je ne l'utilise sur aucune de mes cartes.

Pour ce HowTo je fais les hypothèses que vous savez éditer un fichier, configurer une carte graphique avec X Window, ajouter et enlever des cartes de votre ordinateur, démarrer et arrêter des services et suivre des instructions simples. Si vous pensez ne pas pouvoir faire l'une de ces actions, je vous en prie, demandez de l'aide. Je ne suis pas responsable des éventuels dommages subis par votre ordinateur.

2. Prévoir

Prévoir une configuration Xinerama est un processus assez immédiat. Il y a principalement trois chose qu'il faut prendre en compte : la résolution, le nombre de couleurs et le positionnement de l'écran.

2.1 Ce dont vous avez besoin

Vous aurez besoin d'au moins deux cartes graphiques (une carte dual head devrait également faire l'affaire) et de deux moniteurs. Il vous faudra également un système qui supporte XFree86 (par exemple Linux ou Solaris) et XFree86 version 4.0. Je fais l'hypothèse que votre configuration fonctionne et que vos deux cartes graphiques sont supportées par XFree86.

À moins que vous ayez fait une mise à jour ou installé Linux récemment, vous disposez certainement d'une ancienne version de X. Vérifiez que vous utilisez bien une version 4.0 ou plus récente en entrant la commande suivante :

papel:/home/nico/X/bin # X -version

Vous devriez obtenir quelque chose dans ce genre :


  XFree86 Version 4.0 / X Window System
  (protocol Version 11, revision 0, vendor release 6400)
  Release Date: 8 March 2000
         If the server is older than 6-12 months, or if your card is newer
         than the above date, look for a newer version before reporting
         problems.  (see http://www.XFree86.Org/FAQ)
  Operating System: Linux 2.3.46 i686 [ELF] 
  Module Loader present
  

Si la version n'est pas au moins 4.0 (la première ligne), vous devez procéder à une mise à jour. Pour cela vous pouvez, soit utiliser le gestionnaire de paquetages de votre distributions, soit télécharger directement la dernière version depuis le site de XFree86 et l'installer, ou mieux, utiliser un des miroirs.

Une fois les fichiers téléchargés, installez la nouvelle version avec le script Xinstall.sh. Remarquez que si vous installez X de cette manière, il ne sera pas pris en compte par le gestionnaire de paquetages de votre système (si ce dernier en a un).

2.2 À-propos de la mise en place

Il est possible que chacun des écran de votre configuration Xinerama ait une résolution différente. Ceci présente certains avantages. Par exemple, cela m'a permis d'utiliser un vieux moniteur qui ne peut afficher que du 640×480 avec un 17" affichant du 1280×1024. J'ai également entendu parler de développeurs web et de graphistes qui utilisent un grand écran pour la prévisualisation, plus un ou deux autres plus petits. Je pense que cette flexibilité représente un des grands avantages des extensions Xinerama.

Quelques problèmes d'interface, spécifiques à Xinerama, demeurent avec certains gestionnaires de fenêtres (reportez-vous à la section Gestionnaires de fenêtres et Xinerama). Le plus ennuyeux étant la gestion des zones mortes.

Les gestionnaires de fenêtres font l'hypothèse que la zone affichable est un rectangle dont la taille est égale à la largeur et à la hauteur totale de votre bureau. Si vous n'utilisez pas la même résolution sur tous les écrans, votre zone affichable ne sera pas rectangulaire. Ceci fait apparaître des zones morte qui n'ont pas d'existence au niveau de votre affichage, mais que votre gestionnaire de fenêtres va interpréter comme vides. Nombreux sont les gestionnaires de fenêtres qui vont tenter d'utiliser ces zones mortes pour placer les nouvelles fenêtres. Les fenêtres ainsi placées seront alors inaccessibles. Avec le temps, les gestionnaires de fenêtres prennent en compte les extensions Xinerama et ces limitations disparaissent rapidement.

Les gestionnaires de fenêtres ne savent pas non plus comment maximiser une fenêtre quand on utilise Xinerama. Ce qui se passe en général c'est que les fenêtres sont maximisées sur tous les écrans disponibles. Netscape étalé sur deux écrans n'est pas la disposition idéale pour naviguer sur l'Internet.

Contrairement à ce qu'il est possible de faire pour les résolutions, Xinerama n'accepte qu'une seule profondeur d'écran pour l'intégralité de l'écran virtuel. C'est un point à bien garder en tête au moment de ressortir sa vieille carte graphique. Si cette dernière ne peut afficher que 8 bits, vous aurez un grand écran, mais avec seulement 256 couleurs.

2.3 Agencement

La décision de comment tout cela va être agencé est assez simple à prendre. Vous devez uniquement savoir comment vont être physiquement disposés vos moniteurs. La plupart des gens mettront simplement leurs moniteurs côte-à-côte et disposeront d'un bureau étalé sur les deux. Il est également possible que les affichages se superposent par endroits, ou encore, il est possible de les disposer de manière plus compliquée. Gardez cependant en tête ce que j'ai dit plus haut au sujet des gestionnaires de fenêtres : ils s'attendent à avoir un affichage rectangulaire.

3. Configuration de la carte graphique

Voici venu le moment idéal pour faire une sauvegarde de votre configuration existante.

J'ai personnellement procédé de la sorte :

root# > cp /etc/X11/XF86Config /etc/X11/XFree86Config.working

Avant de s'attaquer à la partie multi-écrans, il faut vous assurer que toutes vos cartes graphiques fonctionnent parfaitement avec la résolution qu'elles auront dans la configuration finale. Si ce n'est pas déjà fait, installez et configurez chaque combinaison de carte/moniteur tels qu'ils seront dans la configuration finale. Si vous disposez de plusieurs cartes graphiques identiques vous pouvez en configurer une et recopier le résultat pour les autres.

Remarquez qu'il est possible de configurer et tester vos cartes graphiques sans les changer physiquement de place. Pour cela il vous faudra utiliser la technique de scan, décrite dans la section Identifiant et bus PCI ci-dessous, en précisant l'ID sur le bus PCI.

Une fois que toutes vos cartes sont configurées, faites une sauvegarde ou bien imprimez leur fichier de configuration. Vous en aurez besoin plus tard. J'ai procédé comme suit :

root# > cp /etc/X11/XF86Config /etc/X11/XFree86Config.Matrox

Il se peut que le fichier de configuration soit stocké dans /etc et voici alors ce qu'il faudra faire :

root# > cp /etc/XF86Config /etc/XFree86Config.Matrox

Si vos cartes graphiques sont identiques vous pouvez certainement vous en sortir avec une seule copie. Cependant, ne sautez pas cette étape. Si les instructions que je vous donne mettent votre système sans dessus dessous, ce sont ces copies de sauvegarde qui vous sauveront.

Une fois les affichages configurés, tout est pratiquement fait...

4. Identifiant et bus PCI

C'est le moment, il faut mettre toutes vos cartes graphiques dans la boite et brancher vos moniteurs. Mettez tout en place comme vous le désirez dès à présent sinon vous devrez répéter ces étapes plus tard.

Ce qui suit devra être fait depuis la console, sans que X ne tourne. Si vous êtes sous X, quittez le. Si vous utilisez un gestionnaire comme xdm ou gdm, vous devez arrêter le service qui lui est associé. Sous une RedHat, le plus simple est de faire :

root# > telinit 3

Pour Debian, Storm ou Corel :

root# > /etc/init.d/xdm stop

Si aucune de ces méthode ne fonctionne, relancez votre ordinateur et démarrez en mode single (mono utilisateur).

Dans le cadre du multi-écrans vous devez, dans le fichier de configuration, explicitement identifier chaque carte graphique. Ceci se fait en utilisant l'identifiant (ID), que le système donne à votre carte, sur le bus PCI. Pour cela, toutes les cartes graphiques doivent être enfichées.

Pour connaître les ID sur le bus PCI, faites :

root# > XFree86 -scanpci

X vous donnera un code pour chaque périphérique sur le bus PCI.


(0:0:0) Intel 82443BX Host
(0:1:0) Intel 82443BX AGP
(0:7:0) Intel 82371AB PIIX4 ISA
(0:7:1) Intel 82371AB PIIX4 IDE
(0:7:2) Intel 82371AB PIIX4 USB
(0:7:3) Intel 82371AB PIIX4 ACPI
(0:9:0) Adaptec 2940U/UW
(0:11:0) 3COM 3C900 10b Combo
(0:12:0) Matrox unknown card (0x2007) using a Matrox MGA 2164W
(1:0:0) unknown card (0x1092/0x0152) using a Texas Instruments Permedia 2

Le 0 du début identifie les cartes et périphériques PCI, alors que le 1 est réservé aux cartes AGP. Dans mon cas il y a une Matrox Millenium II (0:12:0) et une Diamond FireGL (1:0:0). Relevez les numéros associés à vos cartes graphiques. Il est important que vous sachiez quel numéro est affecté à quelle carte.

5. Éditer votre fichier XF86Config

Si vous n'êtes pas encore perdu, rentrons dans le vif du sujet. Cette section peut être assez déroutante, je vous suggère donc de lire la page de manuel de XF86Config, ou du moins de la parcourir. Faites-le ! J'attendrai...

root# > man XF86Config

5.1 Ajout de toutes les cartes graphiques

Ouvrez le fichier XF86Config et descendez jusqu'à la section traitant de moniteur (Section "Monitor"). Il faut copier les sections Monitor, Device et Screen des différents fichiers XF86Config de sauvegarde créés plus haut. Ces sections doivent être reportées dans votre fichier XF86Config après les sections correspondantes dans le fichier que vous avez ouvert. Assurez-vous que l'identifiant (Identifier) est unique pour chaque section; vous y ferez référence plus tard.

Comment ça c'est, pas clair ! Vous devez avoir, en définitive, une section Monitor, Device et Screen pour chacune des combinaison carte graphique/moniteur. Si vous êtes toujours embrouillé, relisez le paragraphe précédent. Si cela ne vous aide pas, jetez un oeil au fichier XF86Config d'exemple à la fin de ces quelques pages. Vous avez bien lu la page de manuel, hein ?

5.2 Identifier vos cartes graphiques

Il faut à présent ajouter les ID du bus PCI à la fin de chaque section Device. C'est une option de la section. La ligne devra ressembler à ça : BusID "PCI:0:12:0", avec votre identifiant, recherché à la section Identifiant et bus PCI, en lieu et place de 0:12:0. Ci-dessous, un exemple de section Device d'une de mes cartes graphiques.


Section "Device"
    Identifier  "FireGL"
    Driver      "glint"
    BusID      "PCI:1:0:0"
EndSection

Remarquez que même les cartes AGP utilisent ce format.

5.3 Configurer la section ServerLayout

À présent, il faut éditer la section ServerLayout située à la fin de votre fichier XF86Config. La section ServerLayout permet de décrire les écrans utilisés, leur positionnement relatifs et les unités qui leur sont attachées. Actuellement vous devez avoir une disposition ne contenant qu'un écran, un clavier et une souris. Vous devez ajouter chacune des sections Screen que vous avez créées auparavant pour qu'elles fassent partie de votre écran.

Ajoutez les nouvelles références à vos écrans en vous basant sur ce qui existe déjà. Une référence se présente sous la forme :

Screen "Screen 2" position "Screen 1"

Cela décrit le positionnement relatif de Screen 2 et Screen 1. position peut prendre les valeurs RightOf (à droite de), Below (en-dessous de), Above (au-dessus de), LeftOf (à gauche de), Absolute X Y, Relative. Les quatres premières se comprennent d'elles mêmes comme on peut le voir sur l'exemple suivant :


Section "ServerLayout"
    Identifier  "Simple Layout"
    Screen "Screen 2"
    Screen "Screen 1" RightOf "Screen 2"
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

Vous pouvez retrouver d'autres exemples dans la section Exemples de fichiers XF86Config.

6. Tester votre configuration

Une fois que votre fichier XF86Config a été modifié, sauvegardez-le. Vous pouvez à présent tester votre configuration :

root# > startx -- +xinerama

Vous pouvez à présent vous réjouir de plusieurs partenaires X... pardon, je voulais dire moniteurs !

7. Éditer vos fichiers de démarrage

Si cela a fonctionné vous voudrez probablement modifier votre configuration X pour qu'il démarre directement sous ce mode. Il existe une multitude de façons de faire ça et probablement de bien meilleures que celles que je vais vous proposer. Voici les méthodes que j'ai utilisées pour modifier startx et gdm.

Si vous lancez X depuis une ligne de commande, ajoutez simplement l'option +xinerama au script startx.

root# > vi /usr/X11R6/bin/startx

Tout à la fin du fichier, le script lance X à l'aide de la commande xinit. Ajoutez l'option +xinerama à la fin de cette ligne.

Pour que gdm se lance avec l'option xinerama, recherchez la section [servers] à la fin du fichier /etc/X11/gdm/gdm.conf. Ajoutez l'option +xinerama à la fin de la ligne qui commence avec 0=. Ca devrait ressembler à ça :

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

Je n'ai jamais essayé d'utiliser kdm ou xdm avec Xinerama, mais j'ai eu l'astuce suivante de la part de Dalibor <dali at dali dot net dot nz>.


Voici les modifications faites à mes fichiers de démarrage pour une
slackware 7.x (j'utilise KDM et x4.01)

éditez /var/X11R6/lib/xdm/Xservers
ajoutez +xinerama à la fin de la dernière ligne
soit :
:0 local /usr/X11R6/bin/X +xinerama

Il se trouve que KDM utilise les fichiers standard XFree de xdm, du coup
cela devrait également fonctionner avec xdm.

8. Gestionnaires des fenêtres et Xinerama

Comme je l'ai dit précédemment, un gestionnaire de fenêtres n'a pas besoin d'être spécialement écrit pour supporter Xinerama. Cependant, certaines petites améliorations apportées par les développeurs peuvent faciliter l'utilisation de Xinerama. Les fonctionnalités souhaitées sont :

- Positionnement intelligent des fenêtres. Les gestionnaires de fenêtres ne doivent pas placer ces dernières dans les zones mortes ou à la jonction de deux écrans. Les nouvelles fenêtres doivent être ouvertes sur le bureau courant.

- Maximiser une fenêtre doit uniquement la maximiser sur l'écran courant.

- Le déplacement des fenêtres doit être sujet à résistance à la limite de deux écrans (de la même manière qu'il y a une résistance entre deux fenêtres).

- Les fenêtres de dialogue et d'information ne doivent pas apparaître sur un autre écran.

J'ai cherché dans leur liste de diffusion, leurs FAQ et j'ai également envoyé des messages aux développeurs des principaux gestionnaires de fenêtres, pour savoir s'ils fonctionnaient avec les extensions Xinerama ou assimilées. Les gestionnaires de fenêtres que j'ai testés sont Blackbox, Enlightenment, Sawfish, KDE, WindowMaker et XFCE. Enlightenment et Sawfish sont les deux seuls pour lesquels j'ai trouvé des améliorations, relatives à Xinerama, significatives (NdT : ce n'est plus le cas à l'heure actuelle. Par exemple kdwm, le gestionnaire de fenêtres de KDE, sait prendre en compte Xinerama de manière élégante). Je donne ci-dessous une description détaillée de ce que j'ai trouvé.

8.1 Enlightenment

Tiré de leur page de nouvelles : dimanche 26 mars 2000

E et Xinerama

Nous avons juste terminé l'intégration du support Xinerama cette semaine. Vous pouvez à présent disposer de la résistance au déplacement à la frontières des écrans, les fenêtres apparaîtront toujours sur l'écran courant (sauf si vous voulez qu'elles aillent ailleurs, soit par modification de geometry soit parce que vous avez sauvegardé leur position), maximiser (à part le mode absolute) se fait également sur l'écran courant. Si vous disposez de Xinerama et que vous faites tourner un E CVS, testez-ça et donnez-en des nouvelles.

8.2 Sawfish

J'ai découvert, en lisant la liste de diffusion de Sawfish, qu'ils développent activement la prise en compte Xinerama. Les fonctionnalités en train d'être écrites sont :

- Empêcher que les fenêtres soient ouvertes sur plusieurs écrans.

- Empêcher que les fenêtres soient ouvertes dans les zones mortes.

- Résistance au déplacement entre les écrans.

- Les mode de placement de fenêtres Ramdom et Centered positionnent ces dernières sur l'écran courant.

Ce n'ai pas testé ces fonctionnalités.

9. Exemples de fichiers XF86Config

Voici mon fichier XF86Config actuel :


Section "Module"
    Load        "dbe"   # extension pour le double buffer
    SubSection  "extmod"
      Option    "omit xfree86-dga"   # ne pas initialiser l'extension DGA
    EndSubSection
    Load        "type1"
    Load        "freetype"
# Chargement du module GLX
#    Load       "glx"
EndSection

Section "Files"
    RgbPath     "/usr/X11R6/lib/X11/rgb"
    FontPath   "/usr/X11R6/lib/X11/fonts/local/"
    FontPath   "/usr/X11R6/lib/X11/fonts/misc/"
    FontPath   "/usr/X11R6/lib/X11/fonts/75dpi/:unscaled"
    FontPath   "/usr/X11R6/lib/X11/fonts/100dpi/:unscaled"
    FontPath   "/usr/X11R6/lib/X11/fonts/Type1/"
    FontPath   "/usr/X11R6/lib/X11/fonts/Speedo/"
    FontPath   "/usr/X11R6/lib/X11/fonts/75dpi/"
    FontPath   "/usr/X11R6/lib/X11/fonts/100dpi/"
# Chemin de recherche des modules. Ceci est le chemin par défaut
#    ModulePath "/usr/X11R6/lib/modules"
EndSection

Section "ServerFlags"

EndSection

Section "InputDevice"
    Identifier  "Keyboard1"
    Driver      "Keyboard"
    Option "AutoRepeat" "500 30"
    Option "XkbRules"   "xfree86"
    Option "XkbModel"   "pc101"
    Option "XkbLayout"  "us"
EndSection

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

Section "Monitor"
    Identifier  "Mini"
    HorizSync   31.5
    VertRefresh 50-90
EndSection

Section "Monitor"
    Identifier  "Impression"
    HorizSync   31.5 - 82.0
    VertRefresh 50-100
EndSection

# Carte graphique N1, Matrox Millenium II PCI
Section "Device"
    Identifier  "Matrox"
    Driver      "mga"
    VideoRam 8192
    BusID      "PCI:0:12:0"
EndSection

# Carte graphique N2, Fire GL 1000 AGP
Section "Device"
    Identifier  "FireGL"
    Driver      "glint"
    #VideoRam    8192
    BusID      "PCI:1:0:0"

EndSection

Section "Screen"
    Identifier  "Screen 2"
    Device      "FireGL"
    Monitor     "Impression"
    DefaultDepth 16

    Subsection "Display"
        Depth       16
        Modes       "1280x1024" "640x480"
        ViewPort    0 0
    EndSubsection
EndSection

# Mon moniteur miniature. Remarquez que j'ai utilisé l'option virtual, de
# ce fait, la hauteur sera la même que celle du moniteur le plus grand.
# Ceci n'est pas indispensable.
Section "Screen"
    Identifier  "Screen 1"
    Device      "Matrox"
    Monitor     "Mini"
    DefaultDepth 16

    Subsection "Display"
        Depth       16
        Modes       "640x480"
        ViewPort    0 0
        Virtual     640 1024
    EndSubsection
EndSection

Section "ServerLayout"
    Identifier  "Simple Layout"
    Screen "Screen 2"  
    Screen "Screen 1" Rightof "Screen 2" 
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

Un autre exemple de section ServerLayout, avec un moniteur au-dessous de l'autre.


Section "ServerLayout"
    Identifier  "Simple Layout"
    Screen "Screen 2"
    Screen "Screen 1" Below "Screen 2"
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

Il est également possible que les écrans se superposent. Dans cet exemple, les deux écrans ont un recouvrement de 80 pixels...


Section "ServerLayout"
    Identifier  "Simple Layout"
    Screen "Screen 2"
    Screen "Screen 1" Relative "Screen 2" 1200 0
    InputDevice "Mouse1" "CorePointer"
    InputDevice "Keyboard1" "CoreKeyboard"
EndSection

10. Crédits

La majeure partie de l'introduction et de la première section sont basées sur un document qui m'a été proposé par Nico Schottelius <nicos at pcsystems dot de>. Comme cela a déjà été mentionné, les configurations de KDM et xdm m'ont été fournies par Dalibor <dali at dali dot net dot nz>.

Je remercie également les nombreuses personnes qui m'ont aidé à corriger les fautes d'othographe et qui m'ont donné des idées. J'ai, autant que possible, essayé de prendre en compte ces remarques.