Using Xinerama to MultiHead XFree86 V. 4.0+

Dennis Baker

<xinerama@ogrehut.com>
Revision History                                                             
Revision 3.0           2002-11-15            Revised by: drb                 
Major revision                                                               


This document describes how to configure XFree86 Version 4.0+ with Multiple
monitors and the Xinerama extentions.

-----------------------------------------------------------------------------
Table of Contents
1. Introduction
    1.1. Copyright
    1.2. Disclaimer
    1.3. Credits
   
   
2. Getting Started
3. Planning
    3.1. What you need
    3.2. Design Considerations
    3.3. Layout
   
   
4. AutoMagic Video Card Set Up
5. Manual Video Card Set Up
6. Scan the PCI Bus
7. Editing your XConfig File
    7.1. Adding your video cards
    7.2. Identifying Your Video Cards
    7.3. Configuring the Server Layout
   
   
8. Testing Your Configuration
    8.1. Configuring X to Start Xinerama Automatically
   
   
9. Window Managers and Xinerama
10. Sample XF86Config Files

1. Introduction

Why do you need Xinerama ? And what is it ? The Xinerama extensions were
introduced to the XFree86 system in version 4.0. Xinerama is an extension to
XFree86 Release 6 Version 4.0 (X4.0) which allows applications and window
managers to use the two (or more) physical displays as one large virtual
display.

The beauty of the Xinerama extensions is that they are totally transparent to
user space. Previously, applications could only reside on one of the displays
and could not be moved between the two. Window managers had to be specially
written to support the two displays. With Xinerama, window managers and
applications don't have to be specially written to support the larger
"Virtual Desktop" which Xinerama creates.
-----------------------------------------------------------------------------

1.1. Copyright

This document is copyrighted (c) 2000 Dennis Baker and is distributed under
the terms of the Linux Documentation Project (LDP) license, stated below.

Unless otherwise stated, Linux HOWTO documents are copyrighted by their
respective authors. Linux HOWTO documents may be reproduced and distributed
in whole or in part, in any medium physical or electronic, as long as this
copyright notice is retained on all copies. Commercial redistribution is
allowed and encouraged; however, the author would like to be notified of any
such distributions.

All translations, derivative works, or aggregate works incorporating any
Linux HOWTO documents must be covered under this copyright notice. That is,
you may not produce a derivative work from a HOWTO and impose additional
restrictions on its distribution. Exceptions to these rules may be granted
under certain conditions; please contact the Linux HOWTO coordinator at the
address given below. 

In short, we wish to promote dissemination of this information through as
many channels as possible. However, we do wish to retain copyright on the
HOWTO documents, and would like to be notified of any plans to redistribute
the HOWTOs.

If you have any questions, please contact <xinerama@ogrehut.com>
-----------------------------------------------------------------------------

1.2. Disclaimer

No liability for the contents of this documents can be accepted. Use the
concepts, examples and other content at your own risk. As this is a new
edition of this document, there may be errors and inaccuracies, that may of
course be damaging to your system. Proceed with caution, and although this is
highly unlikely, the author(s) do not take any responsibility for that.

All copyrights are held by their by their respective owners, unless
specifically noted otherwise. Use of a term in this document should not be
regarded as affecting the validity of any trademark or service mark.

Naming of particular products or brands should not be seen as endorsements.

You are strongly recommended to take a backup of your system before major
installation and backups at regular intervals.
-----------------------------------------------------------------------------

1.3. Credits

Much of the introduction and first sections are based loosely on a document
submitted to me from Nico Schottelius <nico-linux-xinerama -at-
schottelius.org>.

Also thanks to the many people who have emailed me with spelling tips, and
suggestions. I have incorporated them whenever I could.

The wonderful disclaimer on the prior page is brought to us courtesy of the
thousands of lawyers in this wonderful country who put their own greed over
common sense.
-----------------------------------------------------------------------------

2. Getting Started

This is not meant to be a guide on how to set up your specific monitor, or
videocard. In fact, I assume that you already have X Window running for your
setup. Please refer to the XF86 Documentation for more information.

If you are using a single multiheaded card you will need to refer to your
video card manufacturers instructions. I know that both nVidia and Matrox
support Linux multihead setups. nVidia includes some documentation with their
drivers, but I don't have one of these cards to test with so I don't have any
specific details.

As far as I know, there are no limits to which video cards you can configure
this way, nor does it seem to matter if you mix different types of video
cards in a setup, The sample configuration I use in this documentation uses
two different video cards, an AGP Fire GL 1000 and a PCI Matrox Millenium II.
What effect this has on 3d Accelleration I don't know as I don't currently
accellerate either of my video cards.

This Howto assumes that you know how to edit text files, do basic video card
configuration for X Window, add and remove hardware from your system, start
and stop system services, and follow simple instructions. If feel you will
have trouble with any of these things, please seek help. I am not responsible
if you damage any of your stuff.
-----------------------------------------------------------------------------

3. Planning

Planning a Xinerama setup is pretty straight forward. There as essentially
three things you need to take into account, screen resolution, color depth,
and screen layout.
-----------------------------------------------------------------------------

3.1. What you need

You will need at least 2 graphics cards (a dual headed one should work, too)
and two monitors, an operating system on which XFree runs (for instance Linux
or Solaris) and XFree86 version 4.0. I assume your setup works, and that your
two video cards are supported by XFree86.

Unless you recently upgraded or installed linux you are probably running an
older version of X. Verify that you are running version 4.0 or better by
typing the following command:
+---------------------------------------------------------------------------+
|papel:/ # X -version                                                       |
+---------------------------------------------------------------------------+

You should now see something like this:
+---------------------------------------------------------------------------+
|  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                                                    |
|                                                                           |
+---------------------------------------------------------------------------+

If the version is not 4.0 or higher ( first line ), you will need to upgrade.
Use your distributions package manager to upgrade to version 4.0 or better or
download it directly from XFree86 and install it.
+---------------------------------------------------------------------------+
|ftp://ftp.xfree86.org/pub/XFree86/4.0/                                     |
+---------------------------------------------------------------------------+

or better use one of the mirrors found at
+---------------------------------------------------------------------------+
|http://www.xfree86.org/4.0/ftp.html                                        |
+---------------------------------------------------------------------------+

After download the files install the new X with the Xinstall.sh shellscript.
Please note, if you install X this way it is bypassing any package management
your system has.
-----------------------------------------------------------------------------

3.2. Design Considerations

It is possible to have each physical screen in your Xinerama setup to have a
different resolution. There are some advantages to this, I was able to use an
old monitor which only operates at 640x480, and a bigger 17" at 1280x1024 in
my setup. I have also heard of web developers and graphics designed who use
one big "preview" screen and flank it with one or two smaller screens. I
think this flexibility is one of the great things about the Xinerama
extensions.

There are several UI issues which are specific to Xinerama with most current
generation window managers (see Section 9) do not address well. The most
anoying is the poor handling of dead areas.

Window managers assume the display area is a rectangle equal in size to the
heighth and width of your total desktop. If you use more than one display
resolution in a Xinerama setup your desktop will be non-rectangular. This
results in "dead areas", areas which do not exist on your display, but window
manager interpret as "Empty". Many window managers will try to utilize this
dead area for new windows. The result is windows which are inaccessable. As
window managers become Xinerama aware and this problem will go away quickly.

Window managers also don't handle the concept of maximizing a window when you
are running Xinerama. Usually what happens is it maximizes your window across
all available screens. Having Netscape spread across 2 displays is generally
not the best way to surf the net.

Unlike with screen resolotion, Xinerama limits your entire virtual screen to
one color depth. If you were planning on pulling out a cheap video card for
your second display you need to keep this in mind. If your old video card
only supports 8 bit color you might get a bigger display but most newer
programs look lousy in 256 colors.
-----------------------------------------------------------------------------

3.3. Layout

Layout decisions are fairly simple, you just need to decide how you want to
physically lay out your monitors. Most people will simply place their
monitors in a row and view their desktop as one giant monitor. It is also
possible to overlap displays, or place them in more complex layouts. Keep in
mind though what I said above about window managers expecting rectangular
displays.
-----------------------------------------------------------------------------

4. AutoMagic Video Card Set Up

This is a good time to back up your existing config file

I did it like this:
+---------------------------------------------------------------------------+
|root# > cp /etc/X11/XF86Config /etc/X11/XFree86Config.working              |
+---------------------------------------------------------------------------+

Note: If your system may have two sets of config files XF86Config and
XF86Config-4. You can either work with the XF86Config-4 files, or rename
XF86Config-4 to somthing else and work with the XF86Config file. I will
assume that you are working with the XF86Config file from here out. If you
are working with XF86Config-4 or if your XF86Config file is located somewhere
other than /etc/X11 you will need to adjust the commands accordingly.

The newer versions of X support automatic config file generation and it works
very well. If this works for you you should be able to skip the next couple
steps.

Put all of your video cards into your system and set up your monitors. Set
everything up the way you want it when you are done, as you will have to
repeat steps later if you change things.

This next step needs to be done from the console with-out X running. If you
are in X, exit now. If your system uses a display manager such as xdm or gdm
exit you need to stop that service.

If you need to stop a display manager from RedHat the easiest way is like
this:
+---------------------------------------------------------------------------+
|root# > telinit 3                                                          |
+---------------------------------------------------------------------------+

for Debian or Libranet :
+---------------------------------------------------------------------------+
|root# > /etc/init.d/xdm stop                                               |
+---------------------------------------------------------------------------+

If neither of these methods work you, reboot your computer and start up in
single user mode.

Once you are at the console prompt and logged in as root run X with the
configure option:
+---------------------------------------------------------------------------+
|root# > X -configure                                                       |
+---------------------------------------------------------------------------+

Once you have done this X will normally generate a configuration file called
XF86Config.new in the home directory of the root user. Test out the
configuration file to see if it starts X windows properly:
+---------------------------------------------------------------------------+
|root# > X -xf86config /root/XF86Config.new                                 |
+---------------------------------------------------------------------------+

Chances are that your displays will come up with the generic X Windows
startup screen. If so, you are golden and just need to do a little fine
tuning. Exit X by pressing Control-Alt-Backspace and copy the new config file
to the /etc/X11 directory:
+---------------------------------------------------------------------------+
|root# > cp /root/XF86Config.new /etc/X11/XF86Config                        |
+---------------------------------------------------------------------------+

Then continue to Section 7.3.

If your displays didn't come up properly continue to the next section to
manually configure your cards.
-----------------------------------------------------------------------------

5. Manual Video Card Set Up

If you didn't back up your XF86Config file in the previous section, do it
now. For example:
+---------------------------------------------------------------------------+
|root# > cp /etc/X11/XF86Config /etc/X11/XFree86Config.working              |
+---------------------------------------------------------------------------+

One card at a time manually configure and install each video card/ monitor
combination you are going to have in your final setup. If you have several
identical video cards you can get away with configuring one and copying the
configuration for the other cards.

Note, it is possible configure and test your video cards without physically
swapping them. If you use the technique in Section 6 below and specify the
bus ID.

After you have each card set up, back up or print it's config file as you
will need it later. Here's how I did it:
+---------------------------------------------------------------------------+
|root# > cp /etc/X11/XF86Config /etc/X11/XFree86Config.Matrox               |
+---------------------------------------------------------------------------+

If your video cards are identical you can probably get away with just one
copy. However don't skip this step, If all else fails this will be you backup
config file incase my instructions lead you astray.

Once you have all of your displays configured you are almost there...
-----------------------------------------------------------------------------

6. Scan the PCI Bus

For this portion you need all of your video cards in your system and your
monitors plugged in appropriately. Set everything up the way you want it when
you are done, as you will have to repeat steps later if you change things.

This next step needs to be done from the console with-out X running. If you
are in X, exit now. If your system uses a display manager such as xdm or gdm
exit you need to stop that service.

If you need to stop a display manager from RedHat the easiest way is like
this:
+---------------------------------------------------------------------------+
|root# > telinit 3                                                          |
+---------------------------------------------------------------------------+

for Debian, Storm or Corel :
+---------------------------------------------------------------------------+
|root# > /etc/init.d/xdm stop                                               |
+---------------------------------------------------------------------------+

If neither of these methods work you, reboot your computer and start up in
single user mode.

In a multi-head setup you need to explicitly identify each video card in your
config file. To do this you need to use the PCI Bus Identifier your system
assigns the card. At this time, all video cards need to be in your system.

To find out what your PCI bus IDs are:
+---------------------------------------------------------------------------+
|root# > XFree86 -scanpci                                                   |
+---------------------------------------------------------------------------+

X will then output a code for each device on your PCI bus.
+---------------------------------------------------------------------------+
|(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 cards and devices are identified with a leading 0, AGP cards with a 1. In
my case I have a Matrox Millenium II (0:12:0) and a Diamond FireGL(1:0:0).
Find your video cards and write down the numbers associated with them. It is
important that you know which number goes with which card.
-----------------------------------------------------------------------------

7. Editing your XConfig File

If I haven't lost you so far, we are in the home stretch now. This section is
pretty confusiing so I suggest you also read the manpage for XF86Config, or
at least skim it. Do it now... I'll wait.
+---------------------------------------------------------------------------+
| root# > man XF86Config                                                    |
+---------------------------------------------------------------------------+
-----------------------------------------------------------------------------

7.1. Adding your video cards

Open your current XF86Config file and scroll down to the Monitor Section. You
want to copy the following sections from the device specific XF86Config
backup files you created above : Monitor, Device, Screen. These sections
should go in your XF86Config file after the coresponding section in the file
you have open. As you copy each section make certain that the Identifier is
unique for each section, you will reference these Identifiers later.

Clear as Mud Right? You should now have a Monitor Section, a Device Section,
and a Screen Section for EACH video card/monitor combination, each Section
should have a unique Identifier. If you are still confused reread the prior
paragraph. If that doesn't help, look at Section 10 I have included at the
end. You did read the manpage right?
-----------------------------------------------------------------------------

7.2. Identifying Your Video Cards

Now you need to add the coresponding PCI BusID as an option at the end of
each Device Section. The entry should look like this: BusID "PCI:0:12:0",
substituting the three numbers with the PCI bus ID which identifies YOUR
video card you should have this ID from Section 6. Here is a sample Device
Section for one of my video cards.
+---------------------------------------------------------------------------+
|Section "Device"                                                           |
|    Identifier  "FireGL"                                                   |
|    Driver      "glint"                                                    |
|    BusID      "PCI:1:0:0"                                                 |
|EndSection                                                                 |
+---------------------------------------------------------------------------+

Please note, even AGP cards use this layout.
-----------------------------------------------------------------------------

7.3. Configuring the Server Layout

Now you need to edit the ServerLayout Section at the end of the XF86Config
File. The ServerLayour Section is exactally that, it tells you what Screens
to use, how to lay them out logically, and what input devices to assign to
them. Your current layout is for one screen, keyboard, and mouse. For each
Screen section you have created about you need reference in this section for
them to appear in your display.

Using the existing screen reference as a starting point, create additional
references for your other Screen Sections. The reference looks like this:
+---------------------------------------------------------------------------+
|Screen "Screen 2" Relationship "Screen 1"                                  |
+---------------------------------------------------------------------------+

This defines the relationship between the "Screen 2" and "Screen 1". Valid
Relationships include: RightOf, Below, Above, LeftOf, Absolute X Y, Relative.
Use of the first four relationships is pretty obvious as illustrated in my
sample:
+---------------------------------------------------------------------------+
|Section "ServerLayout"                                                     |
|    Identifier  "Simple Layout"                                            |
|    Screen "Screen 2"                                                      |
|    Screen "Screen 1" RightOf "Screen 2"                                   |
|    InputDevice "Mouse1" "CorePointer"                                     |
|    InputDevice "Keyboard1" "CoreKeyboard"                                 |
|EndSection                                                                 |
+---------------------------------------------------------------------------+

I have other examples in Section 10.
-----------------------------------------------------------------------------

8. Testing Your Configuration

Once you have completed changing your XF86Config file, save it and your can
now test your configuration :
+---------------------------------------------------------------------------+
| root# > startx -- +xinerama                                               |
+---------------------------------------------------------------------------+

Hopefully you can now enjoy X with multiple partners... er that is, Monitors.
-----------------------------------------------------------------------------

8.1. Configuring X to Start Xinerama Automatically

The easiest way to have X start up with the Xinerama extentions is to add an
option in the "ServerFlags section. as follows:
+---------------------------------------------------------------------------+
|Section "ServerFlags"                                                      |
|  Option "Xinerama" "true"                                                 |
|                                                                           |
|EndSection                                                                 |
+---------------------------------------------------------------------------+

Now Xinerama should start every time you start X.
-----------------------------------------------------------------------------

9. Window Managers and Xinerama

As I mentioned above, a window manager does not need to be written to support
Xinerama. However there are certain enhancements which window manager
developers can do to make Xinerama users lives easier. Features which I
thought were desireable include:

* Intelligent placement of windows.

- Window managers should not place windows in dead areas or across the
borders of two heads.

- New windows should be placed in the current desktop.

* Maximizing windows should maximize the window to the current head only.

* Window Movements should have edge resistance between heads (Much like they
have resistance to other windows).

* Dialogs and informative messages should not pop up Between Heads.

In my older howto I had listed a lot of Window Managers and their level of
support for Xinerama. But most of that information is obsolete now. Most
modern window managers support Xinerama to some extent.
-----------------------------------------------------------------------------

10. Sample XF86Config Files

My current XF86Config File :
+---------------------------------------------------------------------------+
|Section "Module"                                                           |
|    Load        "dbe"   # Double buffer extension                          |
|    SubSection  "extmod"                                                   |
|      Option    "omit xfree86-dga"   # don't initialise the DGA extension  |
|    EndSubSection                                                          |
|    Load        "type1"                                                    |
|    Load        "freetype"                                                 |
|# This loads the GLX module                                                |
|#    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/"                          |
|# The module search path.  The default path is shown here.                 |
|#    ModulePath "/usr/X11R6/lib/modules"                                   |
|EndSection                                                                 |
|                                                                           |
|Section "ServerFlags"                                                      |
|  Option "Xinerama" "true"                                                 |
|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                                                                 |
|                                                                           |
|# Video Card #1, Matrox Millenium II PCI Video Card                        |
|Section "Device"                                                           |
|    Identifier  "Matrox"                                                   |
|    Driver      "mga"                                                      |
|    VideoRam 8192                                                          |
|    BusID      "PCI:0:12:0"                                                |
|EndSection                                                                 |
|                                                                           |
|# Video Card # 2, Fire GL 1000 AGP video card.                             |
|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                                                                 |
|                                                                           |
|# My Miniature monitor,  notice that I used the virtual option so it is    |
|#   the same heighth as the larger monitor,  this is not necessary.        |
|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                                                                 |
+---------------------------------------------------------------------------+

An alternate ServerLayout Section with one Monitor above the other.
+---------------------------------------------------------------------------+
|Section "ServerLayout"                                                     |
|    Identifier  "Simple Layout"                                            |
|    Screen "Screen 2"                                                      |
|    Screen "Screen 1" Below "Screen 2"                                     |
|    InputDevice "Mouse1" "CorePointer"                                     |
|    InputDevice "Keyboard1" "CoreKeyboard"                                 |
|EndSection                                                                 |
+---------------------------------------------------------------------------+

Screens can overlap too. In this configuration I make the two monitors
overlap by 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                                                                 |
+---------------------------------------------------------------------------+
