Gebruik van de Xinerama extensies voor een MultiHead XFree86 V. 4.0+

Dennis Baker drbaker@softhome.net
Vertaald door: Ellen Bokhorst bokkie@nl.linux.org

v2.0 gereviseerd 2 november 2000


In dit document wordt beschreven hoe XFree86 Versie 4.0+ met meerdere monitors en de Xinerama extensies te configureren.

1. Introductie

Veel wijzigingen aangebracht gebaseerd op bijdragen van Nico Schottelius nicos@pcsystems.de

1.1 Wat is Xinerama?

Waar heb je Xinerama voor nodig? En wat is het? De Xinerama extensies werden geïntroduceerd in het XFree86 systeem versie 4.0. Xinerama is een extensie van XFree86 Release 6 versie 4.0 (X4.0) waarmee het mogelijk is applicaties en window managers met twee (of meer) fysieke displays als één virtueel display te laten gebruiken.

Het mooie van de Xinerama extensies is dat het totaal transparant is voor de gebruiker. Voorheen konden applicaties alleen op één van de displays voorkomen en kon niet tussen de twee worden verplaatst. Window managers moesten speciaal zo worden geschreven dat ze de twee displays ondersteunden. Met Xinerama, hoeven window managers en applicaties niet speciaal te worden geschreven dat ze de grotere "Virtuele Desktop" ondersteunen die Xinerama creërt.

1.2 Richtlijnen

Dit is niet bedoeld als een leidraad over hoe je je specifieke monitor of videokaart instelt. In feite ga ik ervan uit dat je X Window reeds draaiend hebt voor je setup. Raadpleeg alsjeblieft de XF86 Documentatie voor meer informatie.

Zover ik weet zijn er geen beperkingen welke videokaarten je op deze manier kunt configureren, noch schijnt het uit te maken of je verschillende typen videokaarten in een setup mengt. Bij de voorbeeldconfiguratie die ik in dit document toepas, wordt van twee verschillende videokaarten gebruik gemaakt, een AGP Fire GL 1000 en een PCI Matrox Millenium II. Ik weet niet wat voor effect dit heeft op 3d Accelleratie, aangezien ik thans geen van mijn videokaarten accelereer.

In deze Howto wordt ervan uitgegaan dat je weet hoe je een tekstbestand moet bewerken, de basisconfiguratie voor X Window in kunt stellen, hardware aan je systeem toe kunt voegen en eruit kunt verwijderen, systeemservices kunt starten en stoppen, en simpele instructies op kunt volgen. Zoek alsjeblieft hulp als je denkt hier ergens problemen mee te zullen ondervinden. Ik ben er niet verantwoordelijk voor als je iets aan je spullen beschadigt.

2. Planning

Het plannen van een Xinerama setup is nogal eenvoudig. Er zijn essentieel drie dingen waar je rekening mee moet houden, de schermresolutie, kleurdiepte en schermlayout.

2.1 Wat je nodig hebt

Je hebt minstens 2 grafische kaarten nodig (een dual headed kaart zou ook moeten werken), twee monitors, een besturingssysteem waaronder XFree draait (bijvoorbeeld Linux of Solaris) en XFree86 versie 4.0. Ik veronderstel dat je setup werkt, en dat je twee videokaarten door XFree86 worden ondersteund.

Tenzij je onlangs linux hebt geïnstalleerd of een upgrade hebt toegepast, draai je waarschijnlijk een oudere X-versie. Verifieer of je versie 4.0 of hoger draait door het intikken van de volgende opdracht:

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

Je zou nu iets als het volgende te zien moeten krijgen:


  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
  

Als het versienummer niet 4.0 of hoger is ( eerste regel ), dan zal je moeten upgraden. Gebruik de package manager van je distributie om het tot versie 4.0 of beter te upgraden of download het direct van XFree86 en installeer het.

ftp://ftp.xfree86.org/pub/XFree86/4.0/

of nog beter, maak gebruik van één van de mirrors te vinden op

http://www.xfree86.org/4.0/ftp.html

Installeer na het downloaden van de bestanden de nieuwe X met het Xinstall.sh shellscript. Denk er alsjeblieft om dat wanneer je X op deze wijze installeert je je package management systeem overslaat.

2.2 Ontwerpoverwegingen

Het is mogelijk voor ieder fysiek scherm in je Xinerama setup een andere resolutie te gebruiken. Er zijn hieraan een aantal voordelen verbonden, het lukte mij in mijn setup een oude monitor te gebruiken die alleen in 640x480 werkt, en een grotere 17" in 1280x1024. Ik heb tevens gehoord dat er webontwikkelaars en grafische ontwerpers zijn die één "preview" scherm gebruiken en het met één of twee kleinere schermen terzijde staan. Ik denk dat deze flexibliteit één van de grootse dingen is betreft de Xinerama extensies.

Er zijn verscheidene UI issues die specifiek zijn voor Xinerama die met de meest huidige generatie window managers (zie de sectie over Window Managers ) niet goed zijn aan te spreken. Het meest hinderlijke is de povere afhandeling van dode gebieden.

Window managers gaan ervan uit dat het displaygebied een rechthoek is dat evengroot is als de hoogte en breedte van je totale desktop. Als je in een Xinerama setup van meer dan één displayresolutie gebruik maakt, zal je desktop geen rechthoek zijn. Dit resulteert in "dode gebieden", gebieden die niet bestaan op je display, maar de window manager interpreteert ze als "Leeg". Veel windowmanagers zullen proberen dit dode gebied voor nieuwe vensters te benutten. Het resultaat hiervan is ontoegankelijke vensters. Aangezien windowmanagers in de toekomst met de mogelijkheid Xinerama rekening zullen houden, zal dit probleem spoedig tot het verleden horen.

Window managers zorgen ook niet voor de afhandeling van het concept het tot maximale grootte aanpassen van een venster als je Xinerama draait. Wat er gewoonlijk gebeurt is dat het je vensters over alle beschikbare schermen heen maximaliseert. Netscape over 2 displays verspreid is in het algemeen niet de beste wijze om over het net te surfen.

Anders dan met de schermresolutie, beperkt Xinerama je gehele virtuele scherm tot één kleurdiepte. Als je van plan was er een goedkope videokaart voor je tweede display uit te halen, moet je dit in gedachten houden. Als je oude videokaart slechts 8 bit kleuren ondersteunt, krijg je dan misschien wel een groter display, maar de meeste nieuwere programma's zien er in 256 kleuren beroerd uit.

2.3 Layout

Layout besluiten zijn tamelijk simpel, je hoeft alleen een besluit te nemen hoe je je fysieke layout van je monitors wilt. De meeste mensen zullen eenvoudigweg hun monitors in een rij plaatsen en hun desktop als één reusachtige monitor bekijken. Het is tevens mogelijk displays te laten overlappen, of ze in complexere layouts te plaatsen. Houd echter in gedachten wat ik zei over window managers die rechthoekige displays verwachten.

3. Videokaart setup

Dit is een goed moment een backup te maken van je bestaande config bestand

Ik deed het als volgt:

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

Voordat we aan het multihead gedeelte van dit proces beginnen, moet je zorgen dat al je bestaande kaarten goed met het display, dat ze in de uiteindelijke configuratie zullen hebben, werken. Als je dit nog niet hebt gedaan, moet je iedere verschillende videokaart/monitor combinatie voor je uiteindelijke setup configureren en installeren. Als je verscheidene identieke videokaarten hebt, kun je er één configureren en de configuratie voor de andere kaarten kopiëren.

Het is mogelijk je videokaarten te testen zonder ze fysiek om te wisselen, als je de techniek in de sectie PCI Bus gebruikt en de bus ID specificeert.

Maak een backup van het configuratiebestand na het maken van de instellingen van elke kaart, aangezien je dit later nodig zult hebben. Zo deed ik het:

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

In een aantal setups is het XF86Config bestand opgeslagen in /etc, dus dan doe je het ongeveer zo:

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

Als je videokaarten identiek zijn, kom je er waarschijnlijk vanaf door gewoon te kopiëren. Sla deze stap echter niet over. Als al het andere niet werkt dan zal dit je backup zijn van je configuratiebestand voor het geval mijn instructies je op een dwaalspoor brengen.

Zodra je al je displays hebt geconfigureerd ben je bijna zover...

4. Scan de PCI Bus

Dit is een goed moment om al je videokaarten in je systeem te plaatsen en je monitors in te stellen. Stel alles zo in zoals je wilt dat het is wanneer je klaar bent, aangezien je later stappen zult moeten herhalen als je iets wijzigt.

De volgende stap moet onder de console zonder dat X actief is worden uitgevoerd. Als je je in X bevindt, ga daar dan nu uit. Als je systeem een displaymanager, zoals xdm of gdm gebruikt, dan moet je deze service stoppen. De eenvoudigste manier om vanuit RedHat een display manager te stoppen is met:

root# > telinit 3

voor Debian, Storm of Corel :

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

Herstart je computer en start op in de single user modus als geen van deze methoden werkt.

In een multi-head setup moet je iedere videokaart in je config bestand expliciet identificeren. Hier heb je de PCI Bus Identifier voor nodig die je systeem aan je kaart toekent. Op dit moment moeten alle videokaarten zich in je systeem bevinden.

Om erachter te komen wat de ID's zijn van je PCI bus:

root# > XFree86 -scanpci

X zal voor elk device op je PCI bus een code als uitvoer geven.


(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

PCI kaarten en devices worden geïdentificeerd door een voorafgaande 0, AGP kaarten door een 1. In mijn geval heb ik een Matrox Millenium II (0:12:0) en een Diamond FireGL(1:0:0). Zoek naar je videokaarten en schrijf de nummers op die ermee zijn geassocieerd. Het is van belang dat je weet welk nummer bij de kaart hoort.

5. Wijzigen van het XConfig bestand

Deze sectie is nogal verwarrend, dus ik raad je aan ook de manpage van XF86Config te lezen, of het op z'n minst vluchtig door te nemen. Doe het nu... ik wacht wel.

root# > man XF86Config

5.1 Alle videokaarten toevoegen

Open je huidige XF86Config bestand en scroll naar beneden naar de Monitor Section. Kopieer de volgende secties vanuit de device specifieke XF86Config backupbestanden die je eerder aanmaakte : Monitor, Device, Screen. Deze secties komen in je XF86Config bestand na de corresponderende sectie in het geopende bestand. Als je iedere sectie kopieert, let er dan op dat de Identifier voor iedere sectie uniek is, je zal later naar deze Identifiers refereren.

Zo klaar als een klontje, nietwaar? Als het goed is heb je nu een Monitor Sectie, een Device Sectie, en een Screen Sectie voor IEDERE videokaart/monitor combinatie, en iedere Sectie heeft een unieke Identifier. Als je er nog steeds niet uitkomt, lees de vorige paragraaf dan nog eens door. Kijk naar het voorbeeld van XF86Config dat ik aan het einde van het document heb opgenomen. Je hebt de manpage toch wel gelezen?

5.2 Je videokaarten identificeren

Nu moet je de corresponderende PCI BusID als een optie aan het einde van iedere Device Sectie toevoegen. Deze regel moet er ongeveer zo uit komen te zien: BusID "PCI:0:12:0", waarbij de drie nummers worden vervangen door de PCI bus ID welke je videokaart identificeert. Als het goed is ben je aan deze ID gekomen in de sectie PCI Bus . Hier is een voorbeeld van een Device Sectie voor één van mijn videokaarten:


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

Let alsjeblieft op, zelfs AGP kaarten maken gebruik van deze layout.

5.3 Configureren van de ServerLayout Sectie

Nu moet je de ServerLayout Sectie aan het einde van het XF86Config bestand wijzigen. De ServerLayout Sectie is exact dat, Het vertelt je welke schermen te gebruiken, de logische layout, en welke invoerdevices eraan toe te kennen. Je huidige layout is voor één scherm, toetsenbord en muis. Voor iedere Screen sectie die je hiervoor hebt aangemaakt, moet je daarnaar in deze sectie refereren om ze in je display te laten verschijnen.

Gebruik van de bestaande screen referentie als uitgangspunt, maak je extra referenties voor je andere Screen Secties. De referentie ziet er ongeveer zo uit:

Screen "Screen 2" Relationship "Screen 1"
Hiermee wordt de relatie gedefinieerd tussen "Screen 2" en "Screen 1". Geldige relaties zijn onder andere: RightOf, Below, Above, LeftOf, Absolute X Y, Relative. Gebruik van de eerste 4 relaties is nogal vanzelfsprekend zoals in mijn voorbeeld geïllustreerd:

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

Andere voorbeelden staan in de sectie voorbeeld XF86Config .

6. Test je configuratie

Zodra je klaar bent met het wijzigen van het XF86Config bestand, sla je het op en kun je je configuratie gaan testen:

root# > startx -- +xinerama

Hopelijk kun je nu van X plezier hebben met meerdere partners... dat wil zeggen, Monitors.

7. Wijzigen van je opstartbestanden

Als dit werkte dan zal je waarschijnlijk je X-configuratie wensen te wijzigen zodat X automatisch op deze wijze opstart. Er zijn hier heel veel manieren voor en mogelijk zijn er betere manieren voor dan die ik hier hieronder laat zien. Dit zijn de methoden die ik gebruikte voor het wijzigen van startx en gdm.

Als je X vanaf de opdrachtprompt opstart voeg je de +xinerama optie toe aan het startx script.

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

Geheel aan het einde van het bestand begint het script X met de opdracht xinit. Voeg de optie +xinirama geheel aan het einde van die regel toe.

Zoek naar de [servers] sectie onderaan /etc/X11/gdm/gdm.conf om gdm te configueren het met de xinerama extensies te starten. Voeg de +xinerama extensie toe aan het einde van de regel welke begint met 0=. Het zou er ongeveer zo uit moeten zien:

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

Ik heb kdm, of xdm nog nooit voor Xinerama ingesteld, maar ik kreeg de volgende tip van Dalibor "dali@dali.net.nz".


Hier zijn mijn wijzigingen voor opstartbestanden onder slackware 7.x
(ik gebruik KDM en x4.01)

wijzig /var/X11R6/lib/xdm/Xservers
voeg +xinerama toe aan het einde van de laatste regel
dwz.
:0 local /usr/X11R6/bin/X +xinerama

Het schijnt dat KDM van standaard XFree xdm bestanden gebruik maakt,
dus het zou ook moeten werken als je xdm gebruikt.

8. Window Managers en Xinerama

Zoals ik eerder al aangaf, hoeft een window manager niet zo geschreven te zijn dat het Xinerama ondersteunt. Er zijn echter bepaalde uitbreidingen die ontwikkelaars van een window manager kunnen implementeren waarmee het leven van Xinerama gebruikers vereenvoudigd wordt. Mogelijkheden waarvan ik dacht dat ze wenselijk zouden zijn:

* Intelligente plaatsing van vensters. Window managers zouden vensters niet op dode plekken moeten plaatsen of over de randen van twee monitors. Nieuwe vensters zouden op de huidige desktop geplaatst moeten worden.

* Het maximaliseren van vensters zou het venster alleen op de huidige monitor moeten maximaliseren.

* Bij het verplaatsen van vensters zou er een vertraging moeten zijn bij het overspringen tussen de monitors. (Net zoals er een vertraging is bij het verspringen naar andere vensters).

* Dialogen en informatieve meldingen zouden niet tussen twee monitors tevoorschijn moeten komen.

Ik doorzocht de mailinglists, FAQ's en mailde de ontwikkelaars van de belangrijkste windowmanagers om te bezien of ze werken aan eventuele aan Xinerama gerelateerde uitbreidingen. De Window Managers/ Desktop omgevingen die ik bekeek zijn onder andere Blackbox, Enlightenment, KDE, WindowMaker, en XFCE. Enlightenment en Sawfish waren de enige twee waarin ik veelbetekenende uitbreidingen aantrof voor Xinerama. Ik heb hieronder in detail beschreven wat ik ontdekte:

8.1 Enlightenment

Van hun nieuwspagina: zo 26 mrt 2000

E met Xinerama ondersteuning

We hebben het dit weekend voor elkaar gekregen echte xinerama ondersteuning voor E toe te voegen. Nu treedt er een vertraging op wanneer vensters tussen monitors worden verplaatst, vensters zullen altijd op de monitor waarop thans de focus rust, verschijnen (tenzij je het elders wilt door geom instellingen of je hebt het bewaard voor op een andere plaats), bij maximalizeren (tenzij je gebruik maakt van "absolute" maximize) blijft ook op de huidige monitor. Als je xinerama hebt en je draait E vanuit CVS, test dit dan en geef ons feedback.

8.2 Sawfish

Op de Sawfish mailing list kwam ik erachter dat ze ondersteuning voor Xinerama actief aan het ontwikkelen zijn. Mogelijkheden die thans in de ontwikkelaarsversie voorkomen zijn:


  * Het voorkomen dat vensters over monitoren worden verdeeld
  * Het voorkomen dat vensters op dode plekken worden ingedeeld
  * Een vertraging bij het overspringen tussen monitors
  * Gecentreerde en willekeurige plaatsingsmodes plaatsen vensters
    op de huidige monitor

Ik heb deze functionaliteit niet getest.

9. Voorbeeld XF86Config bestanden

Mijn huidige XF86Config bestand :



Section "Module"
    Load        "dbe"   # Dubbele buffer extensie
    SubSection  "extmod"
      Option    "omit xfree86-dga"   # DGA extensie niet initialiseren
    EndSubSection
    Load        "type1"
    Load        "freetype"
# Hiermee wordt de GLX module geladen
#    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/"
# Het module zoekpad. Het standaardpad wordt hieronder weergegeven.
#    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

# Videokaart #1, Matrox Millenium II PCI videokaart
Section "Device"
    Identifier  "Matrox"
    Driver      "mga"
    VideoRam 8192
    BusID      "PCI:0:12:0"
EndSection

# Videokaart # 2, Fire GL 1000 AGP videokaart
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

# Mijn Miniatuur monitor, merk op dat ik van de virtuele optie gebruik maak
# zodat het dezelfde hoogte heeft als de grotere monitor, dit is niet
# noodzakelijk
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

Een alternatieve ServerLayout Sectie met één Monitor over de andere.


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

Schermen kunnen elkaar ook overlappen. In deze configuratie zorg ik dat de twee monitors elkaar met 80 pixels overlappen.


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

10. Krediet

Veel van het introductiemateriaal en de eerste secties zijn vaag gebaseerd op een document dat ik kreeg van Nico Schottelius nicos@pcsystems.de>. Zoals vermeld zijn de opgenomen KDM en xdm configuraties gebaseerd op een email van Dalibor dali@dali.net.nz>.

Tevens dank aan de vele mensen die me hebben gemaild en spellingstips en suggesties gaven. Ik heb ze daar waar ik maar kon doorgevoerd.