2007-11-24
Gotchas with dual-headed X with RandR on ATI cards
Xinerama is the old general way to set up multi-headed X so that things
actually knew that you had more than one display. In Fedora 8, many card
drivers (including radeon
, the driver for ATI cards) have switched to
using the XRandR extension.
The Fedora 8 GUI configuration tools don't know anything about
RandR-based dual-head configuration; if you try to use them anyways,
nothing helpful happens. In theory you can do all of it on the fly with
xrandr
; in practice this didn't work for me and I needed to modify my
/etc/X11/xorg.conf
by hand, following the general directions in the
Intel documentation.
(To simplify, xrandr
operates by placing your physical screens within
an overall virtual display. My specific problem was that the default
virtual display was too small to fit in two 1280x1024 screens, and you
can't change this after the server has started.)
Now, Xinerama is two things: how the X server operates internally, and an X extension that programs can use to find out if you have multiple displays and how they're organized. Roughly speaking, when a program queries the extension, it gets back a list of screen numbers, their dimensions, and the coordinates of the top left of what they're displaying. While XRandR replaces the internal bits, it emulates the extension so that lots of programs don't break. Unfortunately, its Xinerama emulation has some issues:
- you get one Xinerama screen per lit output, even if the outputs are
operating in 'clone' mode (where they display the same thing).
In the same situation, real Xinerama will either tell you it's
not active or that you have only one screen.
(What they should do is adjust the Xinerama results on the fly to merge multiple cloned displays into a single Xinerama screen.)
- real Xinerama always assigns screen numbers in ascending order of
their overall position, with the result that screen 0 is always
the top left screen.
XRandR instead assigns screen numbers statically based on which lit output they are being displayed by. For example, if I am using both VGA and DVI out on my ATI X300, the VGA output is always screen 0 and the DVI output is always screen 1, regardless of whether the DVI screen is left or right of the VGA screen. (The top left coordinates are correct, of course.)
The problem with the former is that anything that just counts how many screens a Xinerama query returns will believe that you have multiple displays when you really only have one.
The problem with the latter is that there are some programs which place their windows on specific screens by screen number, counting on the Xinerama behavior (especially for the meaning of screen 0). Since one of these programs is my window manager, I wound up physically rewiring my displays to match XRandR's hardcoded numbering, which is less convenient for various things.
(It turns out I could fiddle with fvwm
's configuration to fix things,
but I don't want to find out the next program to do this.)