Using the Xinerama Extensions to !MultiHead? XFree86 V. 4.0+
****1.1 What is Xinerama?
****2.1 What you need
****2.2 Design considerations
****5.1 Adding all of your video cards
****5.2 Identifying Your Video Cards
****5.3 Configuring the !ServerLayout? Section
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.
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.
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.
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.
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:/home/nico/X/bin # 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.
or better use one of the mirrors found at
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.
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 the section on Window Managers ) 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.
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.
I did it like this:
root# > cp /etc/X11/XF86Config /etc/X11/XFree86Config.working
Before we start the multihead portion of this process you need to have ALL of your existing cards working properly with the display they will have in the final configuration. If you haven't already, configure and install each different 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 the scan PCI Bus Section 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
On Some setups the XF86Config file is stored in /etc so you would do it like this:
root# > cp /etc/XF86Config /etc/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...
This is a good time to 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.
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.
You can also find these numbers without having to shut your X server down as long as you have /proc enabled. Simply look at the contents of /proc/pci which will have the appropriate information. The three numbers you are looking for are the Bus, Device, and Function. For example, The last few lines of my /proc/pci read:
As you can see, my S3 card is on Bus 0, device 9 and function 0 which would correspond to (0:9:0) from a XFree86 -scanpci output. My Geforce card would be listed as (1:5:0)
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.
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 the sample XF86Config I have included at the end. You did read the manpage right?
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 the PCI Bus Section . Here is a sample Device Section for one of my video cards.
Please note, even AGP cards use this 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:
Hopefully you can now enjoy X with multiple partners... er that is, Monitors.
If this worked you will probably want to change your X configuration to start X this way automatically. There are lots of ways to do this and there are probably better ways than what I've shown below. Here are the methods I used for changing startx and gdm.
If you run X from the command prompt add the +xinerama option to the startx script.
At the very end of the file the script starts X with the command xinit. Add the +xinerama option to the very end of that line.
I have never set up kdm, or xdm for Xinerama, but I got the following tip from Dalibor "firstname.lastname@example.org".
Here's my changes to startup files for slackware 7.x (i use KDM and x4.01) edit /var/X11R6/lib/xdm/Xservers add +xinerama to the end of last line ie. :0 local /usr/X11R6/bin/X +xinerama It appears that KDM uses standard XFree xdm files, so this should work if you use xdm as well
If you use kde3.2 edit /usr/kde/3.2/share/config/kdm/Xservers as above.
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:
I searched the mailing lists, FAQs, and emailed the developers of most of the major window managers to see if they were working on any Xinerama related extensions. The Window Managers/ Desktop environments I reviewed included Blackbox, Enlightenment, KDE, !WindowMaker, and XFCE. Enlightenment and Sawfish were the only two which I found significant enhancements for Xinerama. I have detailed what I discovered below.
From their news page: Sun Mar 26 2000
E with Xinerama support
We just got done adding real xinerama support to E this weekend. Now you have edge resistance moving windows between heads, windows will always pop up on the currently focused head (unless it wants to go someplace else by geom settings or you have it saved to go someplace else), maximize (unless you use "absolute" maximize) stays on the current head also. If you have xinerama and you run E out of CVS, test this and give us feedback.
I have not tested this functionality.
Much of the introduction and first sections are based loosely on a document submitted to me from Nico Schottelius email@example.com>. As mentioned, KDM and xdm configuration included based on an email from Dalibor firstname.lastname@example.org>.
Also thanks to the many people who have emailed me with spelling tips, and suggestions. I have incorporated them whenever I could.