  Using the Xinerama Extensions to MultiHead XFree86 V. 4.0+
  Dennis Baker drbaker@softhome.net
  v2.0 Revised November 2, 2000

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

  Table of Contents


  1. Introduction Many changes made based input from Nico Schottelius

     1.1 What is Xinerama?
     1.2 Guidelines

  2. Planning

     2.1 What you need
     2.2 Design considerations
     2.3 Layout

  3. Video Card set up.

  4. Scan the PCI Bus

  5. Editing your XConfig File

     5.1 Adding all of your video cards
     5.2 Identifying Your Video Cards
     5.3 Configuring the ServerLayout Section

  6. Testing Your Configuration

  7. Editing your startup files

  8. Window Managers and Xinerama

     8.1 Enlightenment
     8.2 Sawfish

  9. Sample XF86Config Files

  10. Credits



  ______________________________________________________________________

  1.  Many changes made based input from Nico Schottelius nicos@pcsys­
  tems.de Introduction

  1.1.  What is Xinerama?

  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.2.  Guidelines

  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.


  2.  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.


  2.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:/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.



       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.


  2.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 the section on ``'') 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.


  2.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.


  3.  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



  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 ``''
  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...


  4.  Scan the PCI Bus

  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.

  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.

  5.  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



  5.1.  Adding all of 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 the sample ``'' I have included at the end.  You did read the
  manpage right?


  5.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 the
  ``''.  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.


  5.3.  Configuring the ServerLayout Section

  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 the ``'' section.

  6.  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.


  7.  Editing your startup files

  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.



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



  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.


  To Configure gdm to start with the xinerama extentions look for
  [servers] section at the bottom of /etc/X11/gdm/gdm.conf.  Add the
  +xinerama extension to the end of the line that starts with 0=.  It
  should look like this :



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



  I have never set up kdm, or xdm for Xinerama,  but I got the following
  tip from Dalibor "dali@dali.net.nz".



       ______________________________________________________________________
       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
       ______________________________________________________________________



  8.  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.


  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.

  8.1.  Enlightenment

  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.

  8.2.  Sawfish

  From the Sawfish mailing list I have discovered that they are actively
  developing Xinerama support.  Features which are currently in the
  development version include :

  ______________________________________________________________________
    * Preventing Windows from being mapped across heads
    * Preventing Windows from being mapped in dead spots
    * Edge resistance moving between heads
    * Centered and Random placement modes place windows on the current Head
  ______________________________________________________________________


  I have not tested this functionality.


  9.  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"

  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
  ______________________________________________________________________



  10.  Credits

  Much of the introduction and first sections are based loosely on a
  document submitted to me from  Nico Schottelius nicos@pcsystems.de>.
  As mentioned, KDM and xdm configuration included based on an email
  from Dalibor dali@dali.net.nz>.


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



