xserver: Branch 'XACE-SELINUX' - 429 commits

Eamon Walsh ewalsh at kemper.freedesktop.org
Thu Nov 30 05:11:57 EET 2006


 .gitignore                                 |    1 
 GL/glx/Makefile.am                         |   10 
 GL/glx/glxdri.c                            |    7 
 GL/glx/glxext.c                            |    2 
 GL/glx/indirect_dispatch.c                 |  444 
 GL/glx/indirect_dispatch.h                 |   62 
 GL/glx/indirect_dispatch_swap.c            |  458 
 GL/glx/indirect_reqsize.c                  |    2 
 GL/glx/indirect_size_get.c                 | 1852 +-
 GL/glx/indirect_size_get.h                 |   11 
 GL/glx/indirect_table.c                    |  343 
 GL/glx/indirect_util.c                     |    2 
 GL/glx/singlepix.c                         |  167 
 GL/glx/singlepixswap.c                     |  142 
 GL/mesa/main/Makefile.am                   |    1 
 GL/symlink-mesa.sh                         |    6 
 Makefile.am                                |    8 
 Xext/security.c                            |   12 
 Xext/xace.c                                |    4 
 Xi/chgdctl.c                               |  146 
 Xi/chgkbd.c                                |  102 
 Xi/chgkbd.h                                |    5 
 Xi/chgptr.c                                |  132 
 Xi/chgptr.h                                |    5 
 Xi/exevents.c                              |   53 
 Xi/exglobals.h                             |    7 
 Xi/extinit.c                               |   46 
 Xi/getdctl.c                               |  128 
 Xi/getdctl.h                               |   18 
 Xi/listdev.c                               |   15 
 Xi/selectev.c                              |   54 
 Xi/stubs.c                                 |   99 
 cfb/cfbteblt8.c                            |    2 
 config/Makefile.am                         |   10 
 config/config.c                            |  351 
 config/dbus-api                            |   35 
 config/xorg-server.conf                    |   13 
 configure.ac                               |  403 
 dix/Makefile.am                            |   21 
 dix/Xserver-dtrace.h.in                    |  100 
 dix/Xserver.d                              |   59 
 dix/devices.c                              |  949 -
 dix/dispatch.c                             |  126 
 dix/dixfonts.c                             |   65 
 dix/events.c                               |   96 
 dix/extension.c                            |   14 
 dix/ffs.c                                  |    8 
 dix/getevents.c                            |  786 +
 dix/globals.c                              |    2 
 dix/main.c                                 |   45 
 dix/resource.c                             |   56 
 dix/window.c                               |   23 
 doc/Xserver.man.pre                        |    4 
 doc/c-extensions                           |   32 
 fb/fb.h                                    |    3 
 fb/fbpict.c                                |   40 
 fb/fbpict.h                                |   47 
 hw/darwin/darwinKeyboard.c                 |    2 
 hw/dmx/config/Makefile.am                  |    2 
 hw/dmx/dmxinput.c                          |    2 
 hw/dmx/glxProxy/Makefile.am                |    2 
 hw/dmx/input/Makefile.am                   |    2 
 hw/kdrive/Makefile.am                      |   14 
 hw/kdrive/ati/Makefile.am                  |   10 
 hw/kdrive/ati/ati_stub.c                   |   10 
 hw/kdrive/chips/Makefile.am                |    4 
 hw/kdrive/chips/chipsstub.c                |    3 
 hw/kdrive/ephyr/Makefile.am                |    5 
 hw/kdrive/ephyr/ephyr.c                    |  145 
 hw/kdrive/ephyr/ephyr.h                    |    9 
 hw/kdrive/ephyr/ephyrinit.c                |   19 
 hw/kdrive/ephyr/hostx.c                    |   32 
 hw/kdrive/ephyr/hostx.h                    |   17 
 hw/kdrive/ephyr/os.c                       |   30 
 hw/kdrive/epson/Makefile.am                |    2 
 hw/kdrive/epson/epson13806stub.c           |    6 
 hw/kdrive/fake/Makefile.am                 |    9 
 hw/kdrive/fake/fake.c                      |    6 
 hw/kdrive/fake/fake.h                      |    4 
 hw/kdrive/fake/fakeinit.c                  |   17 
 hw/kdrive/fake/kbd.c                       |   48 
 hw/kdrive/fake/mouse.c                     |   26 
 hw/kdrive/fbdev/Makefile.am                |   11 
 hw/kdrive/fbdev/fbdev.c                    |    6 
 hw/kdrive/fbdev/fbinit.c                   |   14 
 hw/kdrive/i810/Makefile.am                 |    2 
 hw/kdrive/i810/i810stub.c                  |    3 
 hw/kdrive/igs/igsstub.c                    |    3 
 hw/kdrive/itsy/kbd.c                       |   51 
 hw/kdrive/itsy/ts.c                        |    7 
 hw/kdrive/linux/Makefile.am                |   13 
 hw/kdrive/linux/bus.c                      |   77 
 hw/kdrive/linux/evdev.c                    |  386 
 hw/kdrive/linux/keyboard.c                 |  487 
 hw/kdrive/linux/linux.c                    |   52 
 hw/kdrive/linux/mouse.c                    |  238 
 hw/kdrive/linux/ms.c                       |   61 
 hw/kdrive/linux/ps2.c                      |   84 
 hw/kdrive/linux/ts.c                       |  138 
 hw/kdrive/linux/tslib.c                    |  351 
 hw/kdrive/mach64/Makefile.am               |    6 
 hw/kdrive/mach64/mach64stub.c              |    3 
 hw/kdrive/mga/Makefile.am                  |   11 
 hw/kdrive/mga/mgastub.c                    |    3 
 hw/kdrive/neomagic/Makefile.am             |    6 
 hw/kdrive/neomagic/neomagic.h              |    8 
 hw/kdrive/neomagic/neomagicstub.c          |    6 
 hw/kdrive/nvidia/Makefile.am               |    8 
 hw/kdrive/nvidia/nvidiastub.c              |    3 
 hw/kdrive/pcmcia/pcmciastub.c              |    3 
 hw/kdrive/pm2/Makefile.am                  |    5 
 hw/kdrive/pm2/pm2stub.c                    |    3 
 hw/kdrive/r128/Makefile.am                 |    5 
 hw/kdrive/r128/r128stub.c                  |    3 
 hw/kdrive/savage/s3stub.c                  |    8 
 hw/kdrive/sdl/Makefile.am                  |    5 
 hw/kdrive/sdl/sdl.c                        |  144 
 hw/kdrive/sis300/Makefile.am               |    6 
 hw/kdrive/sis300/sis_stub.c                |    3 
 hw/kdrive/sis530/sisstub.c                 |    3 
 hw/kdrive/smi/Makefile.am                  |    6 
 hw/kdrive/smi/smistub.c                    |    3 
 hw/kdrive/src/Makefile.am                  |    3 
 hw/kdrive/src/kdrive.c                     |  190 
 hw/kdrive/src/kdrive.h                     |  246 
 hw/kdrive/src/kinfo.c                      |   81 
 hw/kdrive/src/kinput.c                     | 1861 +-
 hw/kdrive/src/kkeymap.c                    |   66 
 hw/kdrive/src/kloadmap.c                   |    1 
 hw/kdrive/trident/tridentstub.c            |    3 
 hw/kdrive/trio/s3stub.c                    |    3 
 hw/kdrive/vesa/Makefile.am                 |    4 
 hw/kdrive/vesa/vbe.c                       |    2 
 hw/kdrive/vesa/vesa.c                      |    8 
 hw/kdrive/vesa/vesainit.c                  |   11 
 hw/kdrive/vesa/vm86.c                      |   31 
 hw/kdrive/via/Makefile.am                  |    9 
 hw/kdrive/via/viastub.c                    |    3 
 hw/kdrive/vxworks/vxkbd.c                  |    4 
 hw/kdrive/vxworks/vxworks.c                |   33 
 hw/vfb/InitInput.c                         |   13 
 hw/vfb/Makefile.am                         |    4 
 hw/xfree86/Makefile.am                     |   23 
 hw/xfree86/common/Makefile.am              |   15 
 hw/xfree86/common/vesamodes                |    6 
 hw/xfree86/common/xf86.h                   |   13 
 hw/xfree86/common/xf86AutoConfig.c         |    3 
 hw/xfree86/common/xf86Config.c             |  403 
 hw/xfree86/common/xf86Configure.c          |    6 
 hw/xfree86/common/xf86Cursor.c             |   11 
 hw/xfree86/common/xf86DGA.c                |   48 
 hw/xfree86/common/xf86Debug.c              |    2 
 hw/xfree86/common/xf86Events.c             |  951 -
 hw/xfree86/common/xf86Globals.c            |   39 
 hw/xfree86/common/xf86Helper.c             |  184 
 hw/xfree86/common/xf86InPriv.h             |    3 
 hw/xfree86/common/xf86Init.c               |  151 
 hw/xfree86/common/xf86Io.c                 |  470 
 hw/xfree86/common/xf86Kbd.c                |  394 
 hw/xfree86/common/xf86KbdBSD.c             | 1265 -
 hw/xfree86/common/xf86KbdLnx.c             |  650 -
 hw/xfree86/common/xf86KbdMach.c            |  316 
 hw/xfree86/common/xf86Keymap.h             |  454 
 hw/xfree86/common/xf86MiscExt.c            |   80 
 hw/xfree86/common/xf86Mode.c               |  694 -
 hw/xfree86/common/xf86Module.h             |    4 
 hw/xfree86/common/xf86Option.c             |    4 
 hw/xfree86/common/xf86PciInfo.h            |    4 
 hw/xfree86/common/xf86Priv.h               |   17 
 hw/xfree86/common/xf86Privstr.h            |   49 
 hw/xfree86/common/xf86Versions.c           |    3 
 hw/xfree86/common/xf86Xinput.c             | 1423 --
 hw/xfree86/common/xf86Xinput.h             |   41 
 hw/xfree86/common/xf86pciBus.c             |    6 
 hw/xfree86/common/xf86str.h                |    1 
 hw/xfree86/common/xf86xv.c                 |   66 
 hw/xfree86/common/xf86xv.h                 |    3 
 hw/xfree86/common/xf86xvpriv.h             |    1 
 hw/xfree86/ddc/Makefile.am                 |    5 
 hw/xfree86/ddc/ddcProperty.c               |  206 
 hw/xfree86/ddc/edid_modes.c                |  348 
 hw/xfree86/ddc/interpret_edid.c            |   39 
 hw/xfree86/ddc/xf86DDC.h                   |    5 
 hw/xfree86/dixmods/extmod/Makefile.am      |    2 
 hw/xfree86/doc/Makefile.am                 |    3 
 hw/xfree86/doc/changelogs/CHANGELOG        |18691 -----------------------------
 hw/xfree86/doc/changelogs/CHANGELOG.ND     |  418 
 hw/xfree86/doc/changelogs/CHANGELOG.R5     | 1249 -
 hw/xfree86/doc/man/Xorg.man.pre            |    6 
 hw/xfree86/doc/man/xorg.conf.man.pre       |    2 
 hw/xfree86/dri/Makefile.am                 |    7 
 hw/xfree86/dri/dri.c                       |   94 
 hw/xfree86/dri/dri.h                       |    2 
 hw/xfree86/dri/drimodule.c                 |   19 
 hw/xfree86/dummylib/Makefile.am            |    2 
 hw/xfree86/exa/Makefile.am                 |    2 
 hw/xfree86/fbdevhw/Makefile.am             |    2 
 hw/xfree86/i2c/Makefile.am                 |    2 
 hw/xfree86/int10/Makefile.am               |   11 
 hw/xfree86/int10/helper_exec.c             |   13 
 hw/xfree86/loader/Makefile.am              |    2 
 hw/xfree86/loader/misym.c                  |    2 
 hw/xfree86/loader/xf86sym.c                |   12 
 hw/xfree86/os-support/Makefile.am          |   15 
 hw/xfree86/os-support/bsd/Makefile.am      |    9 
 hw/xfree86/os-support/bsd/bsd_KbdMap.c     | 1087 -
 hw/xfree86/os-support/bsd/bsd_bell.c       |   86 
 hw/xfree86/os-support/bsd/bsd_io.c         |  293 
 hw/xfree86/os-support/bsd/bsd_kbd.c        |  572 
 hw/xfree86/os-support/bsd/bsd_kbd.h        |    4 
 hw/xfree86/os-support/bus/Makefile.am      |    2 
 hw/xfree86/os-support/bus/Pci.c            |    8 
 hw/xfree86/os-support/bus/Pci.h            |    4 
 hw/xfree86/os-support/bus/altixPCI.c       |    9 
 hw/xfree86/os-support/bus/linuxPci.c       |  235 
 hw/xfree86/os-support/bus/xf86Pci.h        |    1 
 hw/xfree86/os-support/drm/Makefile.am      |   19 
 hw/xfree86/os-support/drm/drmmodule.c      |   57 
 hw/xfree86/os-support/drm/xf86drm.c        | 2307 ---
 hw/xfree86/os-support/drm/xf86drmHash.c    |  432 
 hw/xfree86/os-support/drm/xf86drmRandom.c  |  216 
 hw/xfree86/os-support/drm/xf86drmSL.c      |  488 
 hw/xfree86/os-support/hurd/Makefile.am     |    4 
 hw/xfree86/os-support/hurd/hurd_bell.c     |   35 
 hw/xfree86/os-support/hurd/hurd_mouse.c    |   80 
 hw/xfree86/os-support/linux/Makefile.am    |   29 
 hw/xfree86/os-support/linux/lnx_KbdMap.c   |  606 
 hw/xfree86/os-support/linux/lnx_acpi.c     |    6 
 hw/xfree86/os-support/linux/lnx_bell.c     |   43 
 hw/xfree86/os-support/linux/lnx_io.c       |  246 
 hw/xfree86/os-support/linux/lnx_kbd.c      |  530 
 hw/xfree86/os-support/linux/lnx_kbd.h      |    4 
 hw/xfree86/os-support/linux/lnx_pci.c      |   80 
 hw/xfree86/os-support/lynxos/Makefile.am   |    1 
 hw/xfree86/os-support/lynxos/lynx_io.c     |  165 
 hw/xfree86/os-support/misc/Makefile.am     |   16 
 hw/xfree86/os-support/sco/Makefile.am      |    4 
 hw/xfree86/os-support/sco/sco_KbdMap.c     |  304 
 hw/xfree86/os-support/sco/sco_io.c         |  268 
 hw/xfree86/os-support/sco/sco_kbd.c        |  530 
 hw/xfree86/os-support/sco/sco_kbd.h        |   20 
 hw/xfree86/os-support/shared/at_scancode.c |  131 
 hw/xfree86/os-support/shared/kbd.c         |   38 
 hw/xfree86/os-support/shared/std_kbdEv.c   |   49 
 hw/xfree86/os-support/shared/sysv_kbd.c    |  105 
 hw/xfree86/os-support/solaris/Makefile.am  |   10 
 hw/xfree86/os-support/solaris/sun_bell.c   |  185 
 hw/xfree86/os-support/solaris/sun_init.c   |   31 
 hw/xfree86/os-support/solaris/sun_io.c     |  159 
 hw/xfree86/os-support/solaris/sun_kbd.c    |  660 -
 hw/xfree86/os-support/solaris/sun_kbd.h    |   72 
 hw/xfree86/os-support/solaris/sun_kbdEv.c  |  854 -
 hw/xfree86/os-support/sysv/Makefile.am     |    2 
 hw/xfree86/os-support/sysv/sysv_io.c       |   77 
 hw/xfree86/os-support/sysv/sysv_mouse.c    |    3 
 hw/xfree86/os-support/sysv/xqueue.c        |  536 
 hw/xfree86/os-support/sysv/xqueue.h        |   12 
 hw/xfree86/os-support/usl/Makefile.am      |    8 
 hw/xfree86/os-support/usl/usl_KbdMap.c     |  304 
 hw/xfree86/os-support/usl/usl_io.c         |  171 
 hw/xfree86/os-support/usl/usl_kbd.c        |  455 
 hw/xfree86/os-support/usl/usl_kbd.h        |   14 
 hw/xfree86/os-support/usl/usl_mouse.c      |    7 
 hw/xfree86/os-support/usl/usl_xqueue.c     |  360 
 hw/xfree86/os-support/usl/usl_xqueue.h     |    9 
 hw/xfree86/os-support/xf86OSKbd.h          |  132 
 hw/xfree86/os-support/xf86_OSlib.h         |    9 
 hw/xfree86/os-support/xf86_OSproc.h        |   21 
 hw/xfree86/os-support/xf86drm.h            |  640 
 hw/xfree86/os-support/xf86drmCompat.h      |  258 
 hw/xfree86/parser/Input.c                  |    5 
 hw/xfree86/parser/Keyboard.c               |  308 
 hw/xfree86/parser/Makefile.am              |    3 
 hw/xfree86/parser/configProcs.h            |    2 
 hw/xfree86/parser/read.c                   |    7 
 hw/xfree86/rac/Makefile.am                 |    2 
 hw/xfree86/ramdac/Makefile.am              |    2 
 hw/xfree86/scanpci/Makefile.am             |    2 
 hw/xfree86/shadowfb/Makefile.am            |    2 
 hw/xfree86/utils/cvt/Makefile.am           |    2 
 hw/xfree86/utils/ioport/Makefile.am        |    2 
 hw/xfree86/utils/pcitweak/Makefile.am      |    2 
 hw/xfree86/utils/scanpci/Makefile.am       |    2 
 hw/xfree86/utils/xorgcfg/Makefile.am       |   20 
 hw/xfree86/utils/xorgcfg/interface.c       |    3 
 hw/xfree86/utils/xorgcfg/keyboard-cfg.c    |    7 
 hw/xfree86/utils/xorgcfg/mouse-cfg.c       |    3 
 hw/xfree86/utils/xorgcfg/text-mode.c       |   17 
 hw/xfree86/utils/xorgconfig/Cards          |    5 
 hw/xfree86/utils/xorgconfig/xorgconfig.c   |   23 
 hw/xfree86/vbe/Makefile.am                 |    2 
 hw/xfree86/vgahw/Makefile.am               |    2 
 hw/xfree86/x86emu/Makefile.am              |    2 
 hw/xfree86/xaa/Makefile.am                 |    2 
 hw/xfree86/xf4bpp/Makefile.am              |    2 
 hw/xfree86/xf8_16bpp/Makefile.am           |    2 
 hw/xfree86/xf8_32bpp/Makefile.am           |    2 
 hw/xfree86/xorgconf.cpp                    |   19 
 hw/xgl/Makefile.am                         |    2 
 hw/xgl/egl/Makefile.am                     |    2 
 hw/xgl/egl/module/Makefile.am              |    1 
 hw/xgl/egl/module/xeglmodule.c             |    2 
 hw/xgl/egl/xegl.c                          |    2 
 hw/xgl/egl/xegl.h                          |    2 
 hw/xgl/egl/xeglinit.c                      |    2 
 hw/xgl/glx/Makefile.am                     |    2 
 hw/xgl/glx/module/Makefile.am              |    2 
 hw/xgl/glx/module/xglxmodule.c             |    2 
 hw/xgl/glx/xglx.c                          |    2 
 hw/xgl/glx/xglx.h                          |    2 
 hw/xgl/glx/xglxinit.c                      |    2 
 hw/xgl/glxext/Makefile.am                  |    2 
 hw/xgl/glxext/module/Makefile.am           |    2 
 hw/xgl/xglinit.c                           |    2 
 hw/xnest/Args.c                            |   15 
 hw/xnest/Events.c                          |   65 
 hw/xnest/Init.c                            |    9 
 hw/xnest/Keyboard.c                        |    8 
 hw/xnest/Pointer.c                         |    4 
 hw/xprint/ddxInit.c                        |    6 
 hw/xwin/InitInput.c                        |    2 
 hw/xwin/Makefile.am                        |    2 
 include/Makefile.am                        |    1 
 include/XIstubs.h                          |   12 
 include/config.h                           |   31 
 include/dix-config.h.in                    |   27 
 include/dix.h                              |    5 
 include/dixevents.h                        |    4 
 include/exevents.h                         |   13 
 include/extinit.h                          |    6 
 include/input.h                            |   94 
 include/inputstr.h                         |   73 
 include/kdrive-config.h.in                 |    6 
 include/os.h                               |   10 
 include/regionstr.h                        |    3 
 include/xorg-config.h.in                   |    3 
 mi/mi.h                                    |    4 
 mi/mieq.c                                  |  207 
 mi/miinitext.c                             |   14 
 mi/mipointer.c                             |  198 
 mi/mipointer.h                             |   65 
 mi/mipointrst.h                            |   10 
 mi/miregion.c                              |    5 
 os/Makefile.am                             |   40 
 os/WaitFor.c                               |   46 
 os/connection.c                            |   94 
 os/log.c                                   |    2 
 os/utils.c                                 |   30 
 randr/Makefile.am                          |   12 
 randr/mirandr.c                            |  165 
 randr/randr.c                              | 1298 --
 randr/randrstr.h                           |  748 +
 randr/rrcrtc.c                             |  848 +
 randr/rrdispatch.c                         |  210 
 randr/rrinfo.c                             |  342 
 randr/rrmode.c                             |  221 
 randr/rroutput.c                           |  463 
 randr/rrpointer.c                          |  137 
 randr/rrproperty.c                         |  624 
 randr/rrscreen.c                           |  913 +
 randr/rrsdispatch.c                        |  305 
 randr/rrxinerama.c                         |  431 
 xfixes/xfixes.c                            |   17 
 xkb/XKBAlloc.c                             |    5 
 xkb/ddxBeep.c                              |   32 
 xkb/ddxLoad.c                              |   24 
 xkb/xkb.c                                  |  500 
 xkb/xkb.h                                  |    5 
 xkb/xkbAccessX.c                           |   10 
 xkb/xkbActions.c                           |    4 
 xkb/xkbEvents.c                            |    2 
 xkb/xkbLEDs.c                              |   24 
 xkb/xkbUtils.c                             | 1170 +
 373 files changed, 18682 insertions(+), 47370 deletions(-)

New commits:
diff-tree 143558500a89a5c887c75c03798bae68c953cac9 (from parents)
Merge: e3d3d29db5eef057b4e8294377c9c3147436bc2f ee9bdd3f4a14a42fb0747acc420966f0f669129b
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Wed Nov 29 20:41:41 2006 -0500

    Merge branch 'master' into my-XACE-SELINUX

diff --cc configure.ac
index 2d2f299,db2234f..3731204
@@@ -412,10 -439,9 +439,10 @@@
  AC_ARG_ENABLE(glx-tls,        AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: disabled)]), [GLX_USE_TLS=$enableval], [GLX_USE_TLS=no])
  AC_ARG_ENABLE(dri,            AS_HELP_STRING([--enable-dri], [Build DRI extension (default: auto)]), [DRI=$enableval])
  AC_ARG_ENABLE(xinerama,	      AS_HELP_STRING([--disable-xinerama], [Build Xinerama extension (default: enabled)]), [XINERAMA=$enableval], [XINERAMA=yes])
- AC_ARG_ENABLE(xf86vidmode,    AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: enabled)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=yes])
- AC_ARG_ENABLE(xf86misc,       AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: enabled)]), [XF86MISC=$enableval], [XF86MISC=yes])
+ AC_ARG_ENABLE(xf86vidmode,    AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: auto)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=auto])
+ AC_ARG_ENABLE(xf86misc,       AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: auto)]), [XF86MISC=$enableval], [XF86MISC=auto])
  AC_ARG_ENABLE(xace,     AS_HELP_STRING([--disable-xace], [Build X-ACE extension (default: enabled)]), [XACE=$enableval], [XACE=yes])
 +AC_ARG_ENABLE(xselinux,     AS_HELP_STRING([--disable-xselinux], [Build SELinux extension (default: enabled)]), [XSELINUX=$enableval], [XSELINUX=$XACE])
  AC_ARG_ENABLE(xcsecurity,     AS_HELP_STRING([--disable-xcsecurity], [Build Security extension (default: enabled)]), [XCSECURITY=$enableval], [XCSECURITY=$XACE])
  AC_ARG_ENABLE(appgroup,       AS_HELP_STRING([--disable-appgroup], [Build XC-APPGROUP extension (default: enabled)]), [APPGROUP=$enableval], [APPGROUP=$XCSECURITY])
  AC_ARG_ENABLE(xcalibrate,     AS_HELP_STRING([--enable-xcalibrate], [Build XCalibrate extension (default: disabled)]), [XCALIBRATE=$enableval], [XCALIBRATE=no])
@@@ -1105,8 -1162,39 +1176,39 @@@
  	XORG_OSINCS='-I$(top_srcdir)/hw/xfree86/os-support -I$(top_srcdir)/hw/xfree86/os-support/bus -I$(top_srcdir)/os'
  	XORG_INCS="$XORG_DDXINCS $XORG_OSINCS"
  	XORG_CFLAGS="$XORGSERVER_CFLAGS -DHAVE_XORG_CONFIG_H"
 -	XORG_LIBS="$COMPOSITE_LIB $MI_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XPSTUBS_LIB $OS_LIB"
 +	XORG_LIBS="$COMPOSITE_LIB $MI_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XPSTUBS_LIB $SELINUX_LIB $OS_LIB"
  
+ 	if test "x$DGA" = xauto; then
+ 		PKG_CHECK_MODULES(DGA, xf86dgaproto, [DGA=yes], [DGA=no])
+ 	fi
+ 	if test "x$DGA" = xyes; then
+ 		XORG_MODULES="$XORG_MODULES xf86dgaproto"
+ 		AC_DEFINE(DGA, 1, [Support DGA extension])
+ 		AC_DEFINE(XFreeXDGA, 1, [Build XDGA support])
+ 	fi
+ 
+ 	if test "x$XF86MISC" = xauto; then
+ 		PKG_CHECK_MODULES(XF86MISC, xf86miscproto, [XF86MISC=yes], [XF86MISC=no])
+ 	fi
+ 	if test "x$XF86MISC" = xyes; then
+ 		XORG_MODULES="$XORG_MODULES xf86miscproto"
+ 		AC_DEFINE(XF86MISC, 1, [Support XFree86 miscellaneous extensions])
+ 	fi
+ 
+ 	if test "x$XF86VIDMODE" = xauto; then
+ 		PKG_CHECK_MODULES(XF86VIDMODE, xf86vidmodeproto, [XF86VIDMODE=yes], [XF86VIDMODE=no])
+ 	fi
+ 	if test "x$XF86VIDMODE" = xyes; then
+ 		XORG_MODULES="$XORG_MODULES xf86vidmodeproto"
+ 		AC_DEFINE(XF86VIDMODE, 1, [Support XFree86 Video Mode extension])
+ 	fi
+ 
+ 	if test -n "$XORG_MODULES"; then
+ 	        PKG_CHECK_MODULES(XORG_MODULES, [$XORG_MODULES])
+ 	        XORG_CFLAGS="$XORG_CFLAGS $XORG_MODULES_CFLAGS"
+ 	        XORG_LIBS="$XORG_LIBS $XORG_MODULES_LIBS"
+ 	fi
+ 
  dnl Check to see if dlopen is in default libraries (like Solaris, which
  dnl has it in libc), or if libdl is needed to get it.
  	AC_CHECK_FUNC([dlopen], [], 
diff-tree ee9bdd3f4a14a42fb0747acc420966f0f669129b (from a6381e69845f58d2b3282992b1f881015190f1bc)
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Wed Nov 29 12:01:43 2006 -0800

    Add DIX_CFLAGS to util builds.
    
    Fixes a build breakage when $(top_srcdir) != $(top_builddir) because
    -I$(top_srcdir)/include is missing for the cvt, ioport, pcitweak, and scanpci
    builds.
    
    Signed-off-by: Adam Jackson <ajax at nwnk.net>

diff --git a/hw/xfree86/utils/cvt/Makefile.am b/hw/xfree86/utils/cvt/Makefile.am
index ff3c1f7..365c6cb 100644
--- a/hw/xfree86/utils/cvt/Makefile.am
+++ b/hw/xfree86/utils/cvt/Makefile.am
@@ -33,7 +33,7 @@ DUMMYLIB_SRCDIR = $(XFREE86_SRCDIR)/dumm
 
 # gah
 cvt_SOURCES = cvt.c $(top_srcdir)/hw/xfree86/common/xf86cvt.c
-cvt_CFLAGS = $(XORG_CFLAGS)
+cvt_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 cvt_LDADD = $(top_builddir)/hw/xfree86/dummylib/libdummy-nonserver.a
 
 man1_MANS = cvt.man
diff --git a/hw/xfree86/utils/ioport/Makefile.am b/hw/xfree86/utils/ioport/Makefile.am
index e96681b..1839c9a 100644
--- a/hw/xfree86/utils/ioport/Makefile.am
+++ b/hw/xfree86/utils/ioport/Makefile.am
@@ -33,7 +33,7 @@ DUMMYLIB_SRCDIR	= $(XFREE86_SRCDIR)/dumm
 
 INCLUDES = $(XORG_INCS) -I$(DUMMYLIB_SRCDIR)
 
-ioport_CFLAGS = $(XORG_CFLAGS)
+ioport_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 ioport_LDADD = \
 	../../os-support/libxorgos.la \
 	../../dummylib/libdummy-nonserver.a \
diff --git a/hw/xfree86/utils/pcitweak/Makefile.am b/hw/xfree86/utils/pcitweak/Makefile.am
index 9a565ad..5c2a6eb 100644
--- a/hw/xfree86/utils/pcitweak/Makefile.am
+++ b/hw/xfree86/utils/pcitweak/Makefile.am
@@ -33,7 +33,7 @@ DUMMYLIB_SRCDIR	= $(XFREE86_SRCDIR)/dumm
 
 INCLUDES = $(XORG_INCS) -I$(DUMMYLIB_SRCDIR)
 
-pcitweak_CFLAGS = $(XORG_CFLAGS)
+pcitweak_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 pcitweak_LDADD = \
 	../../os-support/libxorgos.la \
 	../../dummylib/libdummy-nonserver.a \
diff --git a/hw/xfree86/utils/scanpci/Makefile.am b/hw/xfree86/utils/scanpci/Makefile.am
index f4e2cbb..6af8eae 100644
--- a/hw/xfree86/utils/scanpci/Makefile.am
+++ b/hw/xfree86/utils/scanpci/Makefile.am
@@ -34,7 +34,7 @@ DUMMYLIB_SRCDIR	= $(XFREE86_SRCDIR)/dumm
 
 INCLUDES = $(XORG_INCS) -I$(SCANPCI_SRCDIR) -I$(DUMMYLIB_SRCDIR)
 
-scanpci_CFLAGS = $(XORG_CFLAGS)
+scanpci_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 scanpci_LDADD = \
 	../../scanpci/libscanpci.la \
 	../../os-support/libxorgos.la \
diff-tree a6381e69845f58d2b3282992b1f881015190f1bc (from b0c8558b9d9a9984c0067960392e28f5a7622b29)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Wed Nov 29 19:25:09 2006 +0100

    xfree86 DDX: Delete DDX screens in ddxGiveUp().
    
    This allows video drivers to clean up in the FreeScreen hook things they set up
    in the PreInit hook.

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index ff878d5..68d69c5 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -1119,6 +1119,9 @@ ddxGiveUp()
     DGAShutdown();
 #endif
 
+    while (xf86NumScreens)
+	xf86DeleteScreen(xf86NumScreens - 1, 0);
+
     xf86CloseConsole();
 
     xf86CloseLog();
diff-tree b0c8558b9d9a9984c0067960392e28f5a7622b29 (from 6245e9dd4719c5dc15ff45d49cf626123794038b)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sun Nov 26 19:31:48 2006 -0800

    Ensure RandR resource types are registered before resources are created.
    
    Now that resources can be created during server initialization, make sure
    the crtc, output and mode resource types are created before attempting to
    create associated resources.
    (cherry picked from commit ec83d674167e7045d5317b179c9998e3172a26dc)

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index b81c390..212352c 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -55,6 +55,8 @@ RRCrtcCreate (void	*devPrivate)
 {
     RRCrtcPtr	crtc;
     
+    if (!RRInit())
+	return NULL;
     crtc = xalloc (sizeof (RRCrtcRec));
     if (!crtc)
 	return NULL;
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 3cd9ef2..a0696e1 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -67,6 +67,9 @@ RRModeGet (xRRModeInfo	*modeInfo,
 	}
     }
 
+    if (!RRInit ())
+	return NULL;
+
     mode = xalloc (sizeof (RRModeRec) + modeInfo->nameLength + 1);
     if (!mode)
 	return NULL;
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 8b760ec..f38f582 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -51,6 +51,8 @@ RROutputCreate (const char  *name,
 {
     RROutputPtr	output;
 
+    if (!RRInit())
+	return NULL;
     output = xalloc (sizeof (RROutputRec) + nameLength + 1);
     if (!output)
 	return NULL;
diff-tree 6245e9dd4719c5dc15ff45d49cf626123794038b (from 24abce8032940e96bb2ccf9e463a7fff6f36283a)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Nov 21 16:52:28 2006 -0800

    Allocate correct size for RRPropertyRec (oops).
    
    Neglected to change the allocation size from sizeof (PropertyRec) to
    sizeof (RRPropertyRec). Lots of fun crashes this way.
    (cherry picked from commit 0626eb8e5c9fa05de6bdc9aa0c654f5148bf7cff)

diff --git a/randr/rrproperty.c b/randr/rrproperty.c
index 5d4c865..a47f306 100644
--- a/randr/rrproperty.c
+++ b/randr/rrproperty.c
@@ -68,9 +68,10 @@ RRCreateOutputProperty (Atom property)
 {
     RRPropertyPtr   prop;
     
-    prop = (RRPropertyPtr)xalloc(sizeof(PropertyRec));
+    prop = (RRPropertyPtr)xalloc(sizeof(RRPropertyRec));
     if (!prop)
 	return NULL;
+    prop->next = NULL;
     prop->propertyName = property;
     prop->is_pending = FALSE;
     prop->range = FALSE;
diff-tree 24abce8032940e96bb2ccf9e463a7fff6f36283a (from f62ac3ec39c6593df476985c630e499864c19c72)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Nov 21 01:15:26 2006 -0800

    Change RandR property datatype to include pending/valid values.
    
    This patch tracks the protocol changes which introduce more complex
    semantics for RandR output properties including pending and valid value
    information.
    (cherry picked from commit af55c65bea40669fdc038aa34c6a1ec9ecb33e87)

diff --git a/randr/mirandr.c b/randr/mirandr.c
index 3a99bf9..0b763e1 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -64,10 +64,11 @@ miRRCrtcSetGamma (ScreenPtr	pScreen,
     return TRUE;
 }
 
-static Bool
-miRROutputSetProperty (ScreenPtr	pScreen,
-		       RROutputPtr	output,
-		       Atom	property)
+Bool
+miRROutputSetProperty (ScreenPtr	    pScreen,
+		       RROutputPtr	    output,
+		       Atom		    property,
+		       RRPropertyValuePtr   value)
 {
     return TRUE;
 }
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 19af9b9..27ede92 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -69,9 +69,11 @@ extern int (*SProcRandrVector[RRNumberRe
  */
 
 #define RRModeName(pMode) ((char *) (pMode + 1))
-typedef struct _rrMode	    RRModeRec, *RRModePtr;
-typedef struct _rrCrtc	    RRCrtcRec, *RRCrtcPtr;
-typedef struct _rrOutput    RROutputRec, *RROutputPtr;
+typedef struct _rrMode		RRModeRec, *RRModePtr;
+typedef struct _rrPropertyValue	RRPropertyValueRec, *RRPropertyValuePtr;
+typedef struct _rrProperty	RRPropertyRec, *RRPropertyPtr;
+typedef struct _rrCrtc		RRCrtcRec, *RRCrtcPtr;
+typedef struct _rrOutput	RROutputRec, *RROutputPtr;
 
 struct _rrMode {
     int		    refcnt;
@@ -81,6 +83,24 @@ struct _rrMode {
     Bool	    userDefined;
 };
 
+struct _rrPropertyValue {
+    Atom	    type;       /* ignored by server */
+    short	    format;     /* format of data for swapping - 8,16,32 */
+    long	    size;	/* size of data in (format/8) bytes */
+    pointer         data;	/* private to client */
+};
+
+struct _rrProperty {
+    RRPropertyPtr   next;
+    ATOM 	    propertyName;
+    Bool	    is_pending;
+    Bool	    range;
+    Bool	    immutable;
+    int		    num_valid;
+    INT32	    *valid_values;
+    RRPropertyValueRec	current, pending;
+};
+
 struct _rrCrtc {
     RRCrtc	    id;
     ScreenPtr	    pScreen;
@@ -116,7 +136,7 @@ struct _rrOutput {
     int		    numPreferred;
     RRModePtr	    *modes;
     Bool	    changed;
-    PropertyPtr	    properties;
+    RRPropertyPtr   properties;
     void	    *devPrivate;
 };
 
@@ -139,9 +159,10 @@ typedef Bool (*RRCrtcSetProcPtr) (Screen
 typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr	pScreen,
 				       RRCrtcPtr	crtc);
 
-typedef Bool (*RROutputSetPropertyProcPtr) (ScreenPtr	pScreen,
-					    RROutputPtr	output,
-					    Atom	property);
+typedef Bool (*RROutputSetPropertyProcPtr) (ScreenPtr		pScreen,
+					    RROutputPtr		output,
+					    Atom		property,
+					    RRPropertyValuePtr	value);
 
 #endif
 
@@ -363,6 +384,12 @@ miRRCrtcSet (ScreenPtr	pScreen,
 	     int	numOutput,
 	     RROutputPtr *outputs);
 
+Bool
+miRROutputSetProperty (ScreenPtr	    pScreen,
+		       RROutputPtr	    output,
+		       Atom		    property,
+		       RRPropertyValuePtr   value);
+
 /* randr.c */
 /*
  * Send all pending events
@@ -676,6 +703,12 @@ RRPointerScreenConfigured (ScreenPtr pSc
 void
 RRDeleteAllOutputProperties (RROutputPtr output);
 
+RRPropertyValuePtr
+RRGetOutputProperty (RROutputPtr output, Atom property, Bool pending);
+
+RRPropertyPtr
+RRQueryOutputProperty (RROutputPtr output, Atom property);
+		       
 void
 RRDeleteOutputProperty (RROutputPtr output, Atom property);
 
@@ -685,6 +718,10 @@ RRChangeOutputProperty (RROutputPtr outp
 			pointer value, Bool sendevent);
 
 int
+RRConfigureOutputProperty (RROutputPtr output, Atom property,
+			   Bool pending, Bool range, Bool immutable,
+			   int num_values, INT32 *values);
+int
 ProcRRChangeOutputProperty (ClientPtr client);
 
 int
@@ -694,6 +731,12 @@ int
 ProcRRListOutputProperties (ClientPtr client);
 
 int
+ProcRRQueryOutputProperty (ClientPtr client);
+
+int
+ProcRRConfigureOutputProperty (ClientPtr client);
+
+int
 ProcRRDeleteOutputProperty (ClientPtr client);
 
 /* rrxinerama.c */
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index 49ba10b..6b61b9c 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -192,17 +192,19 @@ int (*ProcRandrVector[RRNumberRequests])
     ProcRRGetScreenResources,	/* 8 */
     ProcRRGetOutputInfo,	/* 9 */
     ProcRRListOutputProperties,	/* 10 */
-    ProcRRChangeOutputProperty,	/* 11 */
-    ProcRRDeleteOutputProperty,	/* 12 */
-    ProcRRGetOutputProperty,	/* 13 */
-    ProcRRCreateMode,		/* 14 */
-    ProcRRDestroyMode,		/* 15 */
-    ProcRRAddOutputMode,	/* 16 */
-    ProcRRDeleteOutputMode,	/* 17 */
-    ProcRRGetCrtcInfo,		/* 18 */
-    ProcRRSetCrtcConfig,	/* 19 */
-    ProcRRGetCrtcGammaSize,	/* 20 */
-    ProcRRGetCrtcGamma,		/* 21 */
-    ProcRRSetCrtcGamma,		/* 22 */
+    ProcRRQueryOutputProperty,	/* 11 */
+    ProcRRConfigureOutputProperty,  /* 12 */
+    ProcRRChangeOutputProperty,	/* 13 */
+    ProcRRDeleteOutputProperty,	/* 14 */
+    ProcRRGetOutputProperty,	/* 15 */
+    ProcRRCreateMode,		/* 16 */
+    ProcRRDestroyMode,		/* 17 */
+    ProcRRAddOutputMode,	/* 18 */
+    ProcRRDeleteOutputMode,	/* 19 */
+    ProcRRGetCrtcInfo,		/* 20 */
+    ProcRRSetCrtcConfig,	/* 21 */
+    ProcRRGetCrtcGammaSize,	/* 22 */
+    ProcRRGetCrtcGamma,		/* 23 */
+    ProcRRSetCrtcGamma,		/* 24 */
 };
 
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
index 44f1f0a..5d4c865 100644
--- a/randr/rrproperty.c
+++ b/randr/rrproperty.c
@@ -33,7 +33,7 @@ RRDeliverEvent (ScreenPtr pScreen, xEven
 void
 RRDeleteAllOutputProperties (RROutputPtr output)
 {
-    PropertyPtr prop, next;
+    RRPropertyPtr prop, next;
     xRROutputPropertyNotifyEvent    event;
 
     for (prop = output->properties; prop; prop = next)
@@ -46,15 +46,58 @@ RRDeleteAllOutputProperties (RROutputPtr
 	event.atom = prop->propertyName;
 	event.timestamp = currentTime.milliseconds;
 	RRDeliverEvent (output->pScreen, (xEvent *) &event, RROutputPropertyNotifyMask);
-        xfree(prop->data);
+	if (prop->current.data)
+	    xfree(prop->current.data);
+	if (prop->pending.data)
+	    xfree(prop->pending.data);
         xfree(prop);
     }
 }
 
+static void
+RRInitOutputPropertyValue (RRPropertyValuePtr property_value)
+{
+    property_value->type = None;
+    property_value->format = 0;
+    property_value->size = 0;
+    property_value->data = NULL;
+}
+
+static RRPropertyPtr
+RRCreateOutputProperty (Atom property)
+{
+    RRPropertyPtr   prop;
+    
+    prop = (RRPropertyPtr)xalloc(sizeof(PropertyRec));
+    if (!prop)
+	return NULL;
+    prop->propertyName = property;
+    prop->is_pending = FALSE;
+    prop->range = FALSE;
+    prop->immutable = FALSE;
+    prop->num_valid = 0;
+    prop->valid_values = NULL;
+    RRInitOutputPropertyValue (&prop->current);
+    RRInitOutputPropertyValue (&prop->pending);
+    return prop;
+}
+
+static void
+RRDestroyOutputProperty (RRPropertyPtr prop)
+{
+    if (prop->valid_values)
+	xfree (prop->valid_values);
+    if (prop->current.data)
+	xfree(prop->current.data);
+    if (prop->pending.data)
+	xfree(prop->pending.data);
+    xfree(prop);
+}
+
 void
 RRDeleteOutputProperty (RROutputPtr output, Atom property)
 {
-    PropertyPtr	prop, *prev;
+    RRPropertyPtr	prop, *prev;
     xRROutputPropertyNotifyEvent    event;
 
     for (prev = &output->properties; (prop = *prev); prev = &(prop->next))
@@ -70,8 +113,7 @@ RRDeleteOutputProperty (RROutputPtr outp
 	event.atom = prop->propertyName;
 	event.timestamp = currentTime.milliseconds;
 	RRDeliverEvent (output->pScreen, (xEvent *) &event, RROutputPropertyNotifyMask);
-        xfree(prop->data);
-        xfree(prop);
+	RRDestroyOutputProperty (prop);
     }
 }
 
@@ -80,96 +122,95 @@ RRChangeOutputProperty (RROutputPtr outp
 			int format, int mode, unsigned long len,
 			pointer value, Bool sendevent)
 {
-    PropertyPtr			    prop;
+    RRPropertyPtr		    prop;
     xRROutputPropertyNotifyEvent    event;
     int				    sizeInBytes;
     int				    totalSize;
     pointer			    data;
+    RRPropertyValuePtr		    prop_value;
+    Bool			    add = FALSE;
 
     sizeInBytes = format >> 3;
     totalSize = len * sizeInBytes;
 
     /* first see if property already exists */
-
-    for (prop = output->properties; prop; prop = prop->next)
-	if (prop->propertyName == property)
-	    break;
-    
+    prop = RRQueryOutputProperty (output, property);
     if (!prop)   /* just add to list */
     {
-        prop = (PropertyPtr)xalloc(sizeof(PropertyRec));
+        prop = RRCreateOutputProperty (property);
 	if (!prop)
 	    return(BadAlloc);
-        data = (pointer)xalloc(totalSize);
-	if (!data && len)
-	{
-	    xfree(prop);
-	    return(BadAlloc);
-	}
-        prop->propertyName = property;
-        prop->type = type;
-        prop->format = format;
-        prop->data = data;
-	if (len)
-	    memmove((char *)data, (char *)value, totalSize);
-	prop->size = len;
-        prop->next = output->properties;
-        output->properties = prop;
+	add = TRUE;
+	mode = PropModeReplace;
     }
+    if (prop->is_pending)
+	prop_value = &prop->pending;
     else
+	prop_value = &prop->current;
+    
+    /* To append or prepend to a property the request format and type
+	    must match those of the already defined property.  The
+	    existing format and type are irrelevant when using the mode
+	    "PropModeReplace" since they will be written over. */
+
+    if ((format != prop_value->format) && (mode != PropModeReplace))
+	return(BadMatch);
+    if ((prop_value->type != type) && (mode != PropModeReplace))
+	return(BadMatch);
+    if (mode == PropModeReplace)
     {
-	/* To append or prepend to a property the request format and type
-		must match those of the already defined property.  The
-		existing format and type are irrelevant when using the mode
-		"PropModeReplace" since they will be written over. */
-
-        if ((format != prop->format) && (mode != PropModeReplace))
-	    return(BadMatch);
-        if ((prop->type != type) && (mode != PropModeReplace))
-            return(BadMatch);
-        if (mode == PropModeReplace)
-        {
-	    if (totalSize != prop->size * (prop->format >> 3))
-	    {
-	    	data = (pointer)xrealloc(prop->data, totalSize);
-	    	if (!data && len)
-		    return(BadAlloc);
-            	prop->data = data;
-	    }
-	    if (len)
-		memmove((char *)prop->data, (char *)value, totalSize);
-	    prop->size = len;
-    	    prop->type = type;
-	    prop->format = format;
-	}
-	else if (len == 0)
+	if (totalSize != prop_value->size * (prop_value->format >> 3))
 	{
-	    /* do nothing */
-	}
-        else if (mode == PropModeAppend)
-        {
-	    data = (pointer)xrealloc(prop->data,
-				     sizeInBytes * (len + prop->size));
-	    if (!data)
-		return(BadAlloc);
-            prop->data = data;
-	    memmove(&((char *)data)[prop->size * sizeInBytes], 
-		    (char *)value,
-		  totalSize);
-            prop->size += len;
-	}
-        else if (mode == PropModePrepend)
-        {
-            data = (pointer)xalloc(sizeInBytes * (len + prop->size));
-	    if (!data)
+	    if (prop_value->data)
+		data = (pointer)xrealloc(prop_value->data, totalSize);
+	    else
+		data = (pointer)xalloc (totalSize);
+	    if (!data && len)
+	    {
+		if (add)
+		    RRDestroyOutputProperty (prop);
 		return(BadAlloc);
-	    memmove(&((char *)data)[totalSize], (char *)prop->data, 
-		  (int)(prop->size * sizeInBytes));
-            memmove((char *)data, (char *)value, totalSize);
-	    xfree(prop->data);
-            prop->data = data;
-            prop->size += len;
+	    }
+	    prop_value->data = data;
 	}
+	if (len)
+	    memmove((char *)prop_value->data, (char *)value, totalSize);
+	prop_value->size = len;
+	prop_value->type = type;
+	prop_value->format = format;
+    }
+    else if (len == 0)
+    {
+	/* do nothing */
+    }
+    else if (mode == PropModeAppend)
+    {
+	data = (pointer)xrealloc(prop_value->data,
+				 sizeInBytes * (len + prop_value->size));
+	if (!data)
+	    return(BadAlloc);
+	prop_value->data = data;
+	memmove(&((char *)data)[prop_value->size * sizeInBytes], 
+		(char *)value,
+	      totalSize);
+	prop_value->size += len;
+    }
+    else if (mode == PropModePrepend)
+    {
+	data = (pointer)xalloc(sizeInBytes * (len + prop_value->size));
+	if (!data)
+	    return(BadAlloc);
+	memmove(&((char *)data)[totalSize], (char *)prop_value->data, 
+	      (int)(prop_value->size * sizeInBytes));
+	memmove((char *)data, (char *)value, totalSize);
+	xfree(prop_value->data);
+	prop_value->data = data;
+	prop_value->size += len;
+    }
+    if (add)
+    {
+	prop->next = output->properties;
+	output->properties = prop;
     }
     if (sendevent)
     {
@@ -184,6 +225,81 @@ RRChangeOutputProperty (RROutputPtr outp
     return(Success);
 }
 
+RRPropertyPtr
+RRQueryOutputProperty (RROutputPtr output, Atom property)
+{
+    RRPropertyPtr   prop;
+    
+    for (prop = output->properties; prop; prop = prop->next)
+	if (prop->propertyName == property)
+	    return prop;
+    return NULL;
+}
+		       
+RRPropertyValuePtr
+RRGetOutputProperty (RROutputPtr output, Atom property, Bool pending)
+{
+    RRPropertyPtr   prop = RRQueryOutputProperty (output, property);
+
+    if (!prop)
+	return NULL;
+    if (pending && prop->is_pending)
+	return &prop->pending;
+    else
+	return &prop->current;
+}
+
+int
+RRConfigureOutputProperty (RROutputPtr output, Atom property,
+			   Bool pending, Bool range, Bool immutable,
+			   int num_values, INT32 *values)
+{
+    RRPropertyPtr   prop = RRQueryOutputProperty (output, property);
+    Bool	    add = FALSE;
+    INT32	    *new_values;
+
+    if (!prop)
+    {
+        prop = RRCreateOutputProperty (property);
+	if (!prop)
+	    return(BadAlloc);
+	add = TRUE;
+    } else if (prop->immutable && !immutable)
+	return(BadAccess);
+    
+    /*
+     * ranges must have even number of values
+     */
+    if (range && (num_values & 1))
+	return BadMatch;
+
+    new_values = xalloc (num_values * sizeof (INT32));
+    if (!new_values && num_values)
+	return BadAlloc;
+    if (num_values)
+	memcpy (new_values, values, num_values * sizeof (INT32));
+    
+    /*
+     * Property moving from pending to non-pending
+     * loses any pending values
+     */
+    if (prop->is_pending && !pending)
+    {
+	if (prop->pending.data)
+	    xfree (prop->pending.data);
+	RRInitOutputPropertyValue (&prop->pending);
+    }
+
+    prop->is_pending = pending;
+    prop->range = range;
+    prop->immutable = immutable;
+    prop->num_valid = num_values;
+    if (prop->valid_values)
+	xfree (prop->valid_values);
+    prop->valid_values = new_values;
+    return Success;
+}
+
 int
 ProcRRListOutputProperties (ClientPtr client)
 {
@@ -192,7 +308,7 @@ ProcRRListOutputProperties (ClientPtr cl
     xRRListOutputPropertiesReply    rep;
     int				    numProps = 0;
     RROutputPtr			    output;
-    PropertyPtr			    prop;
+    RRPropertyPtr			    prop;
     
     REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
 
@@ -211,6 +327,12 @@ ProcRRListOutputProperties (ClientPtr cl
     rep.nProperties = numProps;
     rep.length = (numProps * sizeof(Atom)) >> 2;
     rep.sequenceNumber = client->sequence;
+    if (client->swapped) 
+    {
+	int n;
+	swaps (&rep.sequenceNumber, n);
+	swapl (&rep.length, n);
+    }
     temppAtoms = pAtoms;
     for (prop = output->properties; prop; prop = prop->next)
 	*temppAtoms++ = prop->propertyName;
@@ -226,6 +348,68 @@ ProcRRListOutputProperties (ClientPtr cl
 }
 
 int
+ProcRRQueryOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRQueryOutputPropertyReq);
+    xRRQueryOutputPropertyReply	    rep;
+    RROutputPtr			    output;
+    RRPropertyPtr		    prop;
+    
+    REQUEST_SIZE_MATCH(xRRQueryOutputPropertyReq);
+
+    output = LookupOutput (client, stuff->output, SecurityReadAccess);
+    
+    if (!output)
+        return RRErrorBase + BadRROutput;
+    
+    prop = RRQueryOutputProperty (output, stuff->property);
+    if (!prop)
+	return BadName;
+    
+    rep.type = X_Reply;
+    rep.length = prop->num_valid;
+    rep.sequenceNumber = client->sequence;
+    rep.pending = prop->is_pending;
+    rep.range = prop->range;
+    rep.immutable = prop->immutable;
+    if (client->swapped) 
+    {
+	int n;
+	swaps (&rep.sequenceNumber, n);
+	swapl (&rep.length, n);
+    }
+    WriteReplyToClient (client, sizeof (xRRQueryOutputPropertyReply), &rep);
+    if (prop->num_valid)
+    {
+        client->pSwapReplyFunc = (ReplySwapPtr)Swap32Write;
+        WriteSwappedDataToClient(client, prop->num_valid * sizeof(INT32),
+				 prop->valid_values);
+    }
+    return(client->noClientException);
+}
+
+int
+ProcRRConfigureOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRConfigureOutputPropertyReq);
+    RROutputPtr				output;
+    int					num_valid;
+    
+    REQUEST_SIZE_MATCH(xRRConfigureOutputPropertyReq);
+
+    output = LookupOutput (client, stuff->output, SecurityReadAccess);
+    
+    if (!output)
+        return RRErrorBase + BadRROutput;
+    
+    num_valid = stuff->length - (sizeof (xRRConfigureOutputPropertyReq) >> 2);
+    return RRConfigureOutputProperty (output, stuff->property,
+				      stuff->pending, stuff->range,
+				      FALSE, num_valid, 
+				      (INT32 *) (stuff + 1));
+}
+
+int
 ProcRRChangeOutputProperty (ClientPtr client)
 {
     REQUEST(xRRChangeOutputPropertyReq);
@@ -309,7 +493,8 @@ int
 ProcRRGetOutputProperty (ClientPtr client)
 {
     REQUEST(xRRGetOutputPropertyReq);
-    PropertyPtr			prop, *prev;
+    RRPropertyPtr			prop, *prev;
+    RRPropertyValuePtr			prop_value;
     unsigned long		n, len, ind;
     RROutputPtr			output;
     xRRGetOutputPropertyReply	reply;
@@ -356,18 +541,26 @@ ProcRRGetOutputProperty (ClientPtr clien
 	return(client->noClientException);
     }
 
+    if (prop->immutable && stuff->delete)
+	return BadAccess;
+
+    if (stuff->pending && prop->is_pending)
+	prop_value = &prop->pending;
+    else
+	prop_value = &prop->current;
+    
     /* If the request type and actual type don't match. Return the
     property information, but not the data. */
 
-    if (((stuff->type != prop->type) &&
+    if (((stuff->type != prop_value->type) &&
 	 (stuff->type != AnyPropertyType))
        )
     {
-	reply.bytesAfter = prop->size;
-	reply.format = prop->format;
+	reply.bytesAfter = prop_value->size;
+	reply.format = prop_value->format;
 	reply.length = 0;
 	reply.nItems = 0;
-	reply.propertyType = prop->type;
+	reply.propertyType = prop_value->type;
 	WriteReplyToClient(client, sizeof(xRRGetOutputPropertyReply), &reply);
 	return(client->noClientException);
     }
@@ -375,7 +568,7 @@ ProcRRGetOutputProperty (ClientPtr clien
 /*
  *  Return type, format, value to client
  */
-    n = (prop->format/8) * prop->size; /* size (bytes) of prop */
+    n = (prop_value->format/8) * prop_value->size; /* size (bytes) of prop */
     ind = stuff->longOffset << 2;        
 
    /* If longOffset is invalid such that it causes "len" to
@@ -390,10 +583,10 @@ ProcRRGetOutputProperty (ClientPtr clien
     len = min(n - ind, 4 * stuff->longLength);
 
     reply.bytesAfter = n - (ind + len);
-    reply.format = prop->format;
+    reply.format = prop_value->format;
     reply.length = (len + 3) >> 2;
-    reply.nItems = len / (prop->format / 8 );
-    reply.propertyType = prop->type;
+    reply.nItems = len / (prop_value->format / 8 );
+    reply.propertyType = prop_value->type;
 
     if (stuff->delete && (reply.bytesAfter == 0))
     {
@@ -417,14 +610,13 @@ ProcRRGetOutputProperty (ClientPtr clien
 	default: client->pSwapReplyFunc = (ReplySwapPtr)WriteToClient; break;
 	}
 	WriteSwappedDataToClient(client, len,
-				 (char *)prop->data + ind);
+				 (char *)prop_value->data + ind);
     }
 
     if (stuff->delete && (reply.bytesAfter == 0))
     { /* delete the Property */
 	*prev = prop->next;
-	xfree(prop->data);
-	xfree(prop);
+	RRDestroyOutputProperty (prop);
     }
     return(client->noClientException);
 }
diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
index 67af753..4a6a6e4 100644
--- a/randr/rrsdispatch.c
+++ b/randr/rrsdispatch.c
@@ -132,6 +132,26 @@ SProcRRListOutputProperties (ClientPtr c
 }
 
 static int
+SProcRRQueryOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRQueryOutputPropertyReq);
+    
+    REQUEST_SIZE_MATCH(xRRQueryOutputPropertyReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRConfigureOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRConfigureOutputPropertyReq);
+    
+    REQUEST_SIZE_MATCH(xRRConfigureOutputPropertyReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
 SProcRRChangeOutputProperty (ClientPtr client)
 {
     REQUEST(xRRChangeOutputPropertyReq);
@@ -267,17 +287,19 @@ int (*SProcRandrVector[RRNumberRequests]
     SProcRRGetScreenResources,	/* 8 */
     SProcRRGetOutputInfo,	/* 9 */
     SProcRRListOutputProperties,/* 10 */
-    SProcRRChangeOutputProperty,/* 11 */
-    SProcRRDeleteOutputProperty,/* 12 */
-    SProcRRGetOutputProperty,	/* 13 */
-    SProcRRCreateMode,		/* 14 */
-    SProcRRDestroyMode,		/* 15 */
-    SProcRRAddOutputMode,	/* 16 */
-    SProcRRDeleteOutputMode,	/* 17 */
-    SProcRRGetCrtcInfo,		/* 18 */
-    SProcRRSetCrtcConfig,	/* 19 */
-    SProcRRGetCrtcGammaSize,	/* 20 */
-    SProcRRGetCrtcGamma,	/* 21 */
-    SProcRRSetCrtcGamma,	/* 22 */
+    SProcRRQueryOutputProperty,	/* 11 */
+    SProcRRConfigureOutputProperty,  /* 12 */
+    SProcRRChangeOutputProperty,/* 13 */
+    SProcRRDeleteOutputProperty,/* 14 */
+    SProcRRGetOutputProperty,	/* 15 */
+    SProcRRCreateMode,		/* 16 */
+    SProcRRDestroyMode,		/* 17 */
+    SProcRRAddOutputMode,	/* 18 */
+    SProcRRDeleteOutputMode,	/* 19 */
+    SProcRRGetCrtcInfo,		/* 20 */
+    SProcRRSetCrtcConfig,	/* 21 */
+    SProcRRGetCrtcGammaSize,	/* 22 */
+    SProcRRGetCrtcGamma,	/* 23 */
+    SProcRRSetCrtcGamma,	/* 24 */
 };
 
diff-tree f62ac3ec39c6593df476985c630e499864c19c72 (from fbd09443385c533416fa530399d54f130afaf985)
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Nov 28 10:31:40 2006 -0800

    Separate DDC mode list creation from MonPtr creation.
    
    This will be used by the intel driver, and likely other RandR 1.2 drivers.

diff --git a/hw/xfree86/ddc/edid_modes.c b/hw/xfree86/ddc/edid_modes.c
index 25f95ca..cfc8ddc 100644
--- a/hw/xfree86/ddc/edid_modes.c
+++ b/hw/xfree86/ddc/edid_modes.c
@@ -204,6 +204,46 @@ DDCGuessRangesFromModes(int scrnIndex, M
     }
 }
 
+DisplayModePtr
+xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC)
+{
+    int preferred, i;
+    DisplayModePtr Modes = NULL, Mode;
+
+    preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
+
+    /* Add established timings */
+    Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1);
+    Modes = xf86ModesAdd(Modes, Mode);
+
+    /* Add standard timings */
+    Mode = DDCModesFromStandardTiming(scrnIndex, DDC->timings2);
+    Modes = xf86ModesAdd(Modes, Mode);
+
+    for (i = 0; i < DET_TIMINGS; i++) {
+	struct detailed_monitor_section *det_mon = &DDC->det_mon[i];
+
+        switch (det_mon->type) {
+        case DT:
+            Mode = DDCModeFromDetailedTiming(scrnIndex,
+                                             &det_mon->section.d_timings,
+					     preferred);
+	    preferred = 0;
+            Modes = xf86ModesAdd(Modes, Mode);
+            break;
+        case DS_STD_TIMINGS:
+            Mode = DDCModesFromStandardTiming(scrnIndex,
+					      det_mon->section.std_t);
+            Modes = xf86ModesAdd(Modes, Mode);
+            break;
+        default:
+            break;
+        }
+    }
+
+    return Modes;
+}
+
 /*
  * Fill out MonPtr with xf86MonPtr information.
  */
@@ -213,15 +253,12 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
     DisplayModePtr Modes = NULL, Mode;
     int i, clock;
     Bool have_hsync = FALSE, have_vrefresh = FALSE;
-    int preferred;
 
     if (!Monitor || !DDC)
         return;
 
     Monitor->DDC = DDC;
 
-    preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
-
     Monitor->widthmm = 10 * DDC->features.hsize;
     Monitor->heightmm = 10 * DDC->features.vsize;
 
@@ -230,20 +267,14 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
         Monitor->reducedblanking = TRUE;
     /* Allow the user to also enable this through config */
 
-    /* Add established timings */
-    Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1);
-    Modes = xf86ModesAdd(Modes, Mode);
-
-    /* Add standard timings */
-    Mode = DDCModesFromStandardTiming(scrnIndex, DDC->timings2);
-    Modes = xf86ModesAdd(Modes, Mode);
+    Modes = xf86DDCGetModes(scrnIndex, DDC);
 
     /* Skip EDID ranges if they were specified in the config file */
     have_hsync = (Monitor->nHsync != 0);
     have_vrefresh = (Monitor->nVrefresh != 0);
 
     /* Go through the detailed monitor sections */
-    for (i = 0; i < DET_TIMINGS; i++)
+    for (i = 0; i < DET_TIMINGS; i++) {
         switch (DDC->det_mon[i].type) {
         case DS_RANGES:
 	    if (!have_hsync) {
@@ -279,21 +310,10 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
 		Monitor->maxPixClock = clock;
 
             break;
-        case DT:
-            Mode = DDCModeFromDetailedTiming(scrnIndex,
-                                             &DDC->det_mon[i].section.d_timings,
-					     preferred);
-	    preferred = 0;
-            Modes = xf86ModesAdd(Modes, Mode);
-            break;
-        case DS_STD_TIMINGS:
-            Mode = DDCModesFromStandardTiming(scrnIndex,
-                                             DDC->det_mon[i].section.std_t);
-            Modes = xf86ModesAdd(Modes, Mode);
-            break;
         default:
             break;
         }
+    }
 
     if (Modes) {
         /* Print Modes */
diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
index 5def97a..7799471 100644
--- a/hw/xfree86/ddc/xf86DDC.h
+++ b/hw/xfree86/ddc/xf86DDC.h
@@ -59,6 +59,8 @@ extern void xf86print_vdif(
     xf86vdifPtr v
 );
 
+DisplayModePtr xf86DDCGetModes(int scrnIndex, xf86MonPtr DDC);
+
 #endif
 
 
diff-tree fbd09443385c533416fa530399d54f130afaf985 (from 4ad0bde661be2af4a17771d66066d49736e85cbe)
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Nov 28 10:15:51 2006 -0800

    Replace bad mode name-setting code with xf86SetModeDefaultName().

diff --git a/hw/xfree86/ddc/edid_modes.c b/hw/xfree86/ddc/edid_modes.c
index 9e824b1..25f95ca 100644
--- a/hw/xfree86/ddc/edid_modes.c
+++ b/hw/xfree86/ddc/edid_modes.c
@@ -124,10 +124,6 @@ DDCModeFromDetailedTiming(int scrnIndex,
     Mode = xnfalloc(sizeof(DisplayModeRec));
     memset(Mode, 0, sizeof(DisplayModeRec));
 
-    Mode->name = xnfalloc(10); /* "1234x1234" */
-    xf86snprintf(Mode->name, 20, "%dx%d", timing->h_active,
-                 timing->v_active);
-
     Mode->type = M_T_DRIVER;
     if (preferred)
 	Mode->type |= M_T_PREFERRED;
@@ -144,6 +140,8 @@ DDCModeFromDetailedTiming(int scrnIndex,
     Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width;
     Mode->VTotal = timing->v_active + timing->v_blanking;
 
+    xf86SetModeDefaultName(Mode);
+
     /* We ignore h/v_size and h/v_border for now. */
 
     if (timing->interlaced)
diff-tree 4ad0bde661be2af4a17771d66066d49736e85cbe (from 05778432dc6e688bc0beff0c20ffd7e27b74888e)
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Nov 28 10:12:02 2006 -0800

    Clean up a bunch of long lines and trailing whitespace.

diff --git a/hw/xfree86/ddc/edid_modes.c b/hw/xfree86/ddc/edid_modes.c
index 5ce86ee..9e824b1 100644
--- a/hw/xfree86/ddc/edid_modes.c
+++ b/hw/xfree86/ddc/edid_modes.c
@@ -85,14 +85,15 @@ DDCModesFromStandardTiming(int scrnIndex
 {
     DisplayModePtr Modes = NULL, Mode = NULL;
     int i;
-    
-    for (i = 0; i < STD_TIMINGS; i++)
+
+    for (i = 0; i < STD_TIMINGS; i++) {
         if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
             Mode =  xf86CVTMode(timing[i].hsize, timing[i].vsize,
                                 timing[i].refresh, FALSE, FALSE);
 	    Mode->type = M_T_DRIVER;
             Modes = xf86ModesAdd(Modes, Mode);
         }
+    }
 
     return Modes;
 }
@@ -108,55 +109,56 @@ DDCModeFromDetailedTiming(int scrnIndex,
 
     /* We don't do stereo */
     if (timing->stereo) {
-        xf86DrvMsg(scrnIndex, X_INFO, "%s: Ignoring: We don't handle stereo.\n",
-                   __func__);
+        xf86DrvMsg(scrnIndex, X_INFO,
+		   "%s: Ignoring: We don't handle stereo.\n", __func__);
         return NULL;
     }
-    
+
     /* We only do seperate sync currently */
     if (timing->sync != 0x03) {
-         xf86DrvMsg(scrnIndex, X_INFO, "%s: %dx%d Warning: We only handle seperate"
+         xf86DrvMsg(scrnIndex, X_INFO,
+		    "%s: %dx%d Warning: We only handle seperate"
                     " sync.\n", __func__, timing->h_active, timing->v_active);
     }
-    
+
     Mode = xnfalloc(sizeof(DisplayModeRec));
     memset(Mode, 0, sizeof(DisplayModeRec));
-    
+
     Mode->name = xnfalloc(10); /* "1234x1234" */
     xf86snprintf(Mode->name, 20, "%dx%d", timing->h_active,
                  timing->v_active);
-    
+
     Mode->type = M_T_DRIVER;
     if (preferred)
 	Mode->type |= M_T_PREFERRED;
-    
+
     Mode->Clock = timing->clock / 1000.0;
-    
+
     Mode->HDisplay = timing->h_active;
     Mode->HSyncStart = timing->h_active + timing->h_sync_off;
     Mode->HSyncEnd = Mode->HSyncStart + timing->h_sync_width;
     Mode->HTotal = timing->h_active + timing->h_blanking;
-    
+
     Mode->VDisplay = timing->v_active;
     Mode->VSyncStart = timing->v_active + timing->v_sync_off;
     Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width;
     Mode->VTotal = timing->v_active + timing->v_blanking;
-    
+
     /* We ignore h/v_size and h/v_border for now. */
-    
+
     if (timing->interlaced)
         Mode->Flags |= V_INTERLACE;
-    
+
     if (timing->misc & 0x02)
         Mode->Flags |= V_PHSYNC;
     else
         Mode->Flags |= V_NHSYNC;
-    
+
     if (timing->misc & 0x01)
         Mode->Flags |= V_PVSYNC;
     else
         Mode->Flags |= V_NVSYNC;
- 
+
     return Mode;
 }
 
@@ -199,7 +201,7 @@ DDCGuessRangesFromModes(int scrnIndex, M
 
         if (Mode->VRefresh > Monitor->vrefresh[0].hi)
             Monitor->vrefresh[0].hi = Mode->VRefresh;
-        
+
         Mode = Mode->next;
     }
 }
@@ -214,7 +216,7 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
     int i, clock;
     Bool have_hsync = FALSE, have_vrefresh = FALSE;
     int preferred;
-    
+
     if (!Monitor || !DDC)
         return;
 
@@ -224,9 +226,9 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
 
     Monitor->widthmm = 10 * DDC->features.hsize;
     Monitor->heightmm = 10 * DDC->features.vsize;
-    
+
     /* If this is a digital display, then we can use reduced blanking */
-    if (DDC->features.input_type) 
+    if (DDC->features.input_type)
         Monitor->reducedblanking = TRUE;
     /* Allow the user to also enable this through config */
 
@@ -280,7 +282,7 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
 
             break;
         case DT:
-            Mode = DDCModeFromDetailedTiming(scrnIndex, 
+            Mode = DDCModeFromDetailedTiming(scrnIndex,
                                              &DDC->det_mon[i].section.d_timings,
 					     preferred);
 	    preferred = 0;
@@ -314,7 +316,7 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
 
         while (Mode->next)
             Mode = Mode->next;
-        
+
         /* add to MonPtr */
         if (Monitor->Modes) {
             Monitor->Last->next = Modes;
diff-tree 05778432dc6e688bc0beff0c20ffd7e27b74888e (from 38ecc66cd9c61346a46697bbf1d8319f4f6f9800)
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Nov 28 10:07:57 2006 -0800

    Move code to get a mode list from EDID data from ddcProperty.c to edid_modes.c.

diff --git a/hw/xfree86/ddc/Makefile.am b/hw/xfree86/ddc/Makefile.am
index aff8cd3..a04b5e8 100644
--- a/hw/xfree86/ddc/Makefile.am
+++ b/hw/xfree86/ddc/Makefile.am
@@ -4,7 +4,8 @@ module_LTLIBRARIES = libddc.la
 
 libddc_la_LDFLAGS = -avoid-version
 libddc_la_SOURCES = xf86DDC.c edid.c interpret_edid.c print_edid.c \
-                   interpret_vdif.c print_vdif.c ddcProperty.c
+                   interpret_vdif.c print_vdif.c ddcProperty.c \
+		    edid_modes.c
 
 INCLUDES = $(XORG_INCS) -I$(srcdir)/../i2c
 
diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index ddf580c..11b5e26 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -32,300 +32,8 @@
 #include "propertyst.h"
 #include "xf86DDC.h"
 
-/*
- * TODO:
- *  - for those with access to the VESA DMT standard; review please.
- */
-#define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DRIVER
-#define MODESUFFIX   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0
-
-DisplayModeRec DDCEstablishedModes[17] = {
-    { MODEPREFIX("800x600"),    40000,  800,  840,  968, 1056, 0,  600,  601,  605,  628, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 60Hz */
-    { MODEPREFIX("800x600"),    36000,  800,  824,  896, 1024, 0,  600,  601,  603,  625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 56Hz */
-    { MODEPREFIX("640x480"),    31500,  640,  656,  720,  840, 0,  480,  481,  484,  500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 75Hz */
-    { MODEPREFIX("640x480"),    31500,  640,  664,  704,  832, 0,  480,  489,  491,  520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 72Hz */
-    { MODEPREFIX("640x480"),    30240,  640,  704,  768,  864, 0,  480,  483,  486,  525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 67Hz */
-    { MODEPREFIX("640x480"),    25200,  640,  656,  752,  800, 0,  480,  490,  492,  525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 60Hz */
-    { MODEPREFIX("720x400"),    35500,  720,  738,  846,  900, 0,  400,  421,  423,  449, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 720x400 at 88Hz */
-    { MODEPREFIX("720x400"),    28320,  720,  738,  846,  900, 0,  400,  412,  414,  449, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 720x400 at 70Hz */
-    { MODEPREFIX("1280x1024"), 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024 at 75Hz */
-    { MODEPREFIX("1024x768"),   78800, 1024, 1040, 1136, 1312, 0,  768,  769,  772,  800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768 at 75Hz */
-    { MODEPREFIX("1024x768"),   75000, 1024, 1048, 1184, 1328, 0,  768,  771,  777,  806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768 at 70Hz */
-    { MODEPREFIX("1024x768"),   65000, 1024, 1048, 1184, 1344, 0,  768,  771,  777,  806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768 at 60Hz */
-    { MODEPREFIX("1024x768"),   44900, 1024, 1032, 1208, 1264, 0,  768,  768,  776,  817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768 at 43Hz */
-    { MODEPREFIX("832x624"),    57284,  832,  864,  928, 1152, 0,  624,  625,  628,  667, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 832x624 at 75Hz */
-    { MODEPREFIX("800x600"),    49500,  800,  816,  896, 1056, 0,  600,  601,  604,  625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 75Hz */
-    { MODEPREFIX("800x600"),    50000,  800,  856,  976, 1040, 0,  600,  637,  643,  666, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 72Hz */
-    { MODEPREFIX("1152x864"),  108000, 1152, 1216, 1344, 1600, 0,  864,  865,  868,  900, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1152x864 at 75Hz */
-};
 
-static DisplayModePtr
-DDCModesFromEstablished(int scrnIndex, struct established_timings *timing)
-{
-    DisplayModePtr Modes = NULL, Mode = NULL;
-    CARD32 bits = (timing->t1) | (timing->t2 << 8) |
-        ((timing->t_manu & 0x80) << 9);
-    int i;
-
-    for (i = 0; i < 17; i++) {
-        if (bits & (0x01 << i)) {
-            Mode = xf86DuplicateMode(&DDCEstablishedModes[i]);
-            Modes = xf86ModesAdd(Modes, Mode);
-        }
-    }
-
-    return Modes;
-}
-
-/*
- *
- */
-static DisplayModePtr
-DDCModesFromStandardTiming(int scrnIndex, struct std_timings *timing)
-{
-    DisplayModePtr Modes = NULL, Mode = NULL;
-    int i;
-    
-    for (i = 0; i < STD_TIMINGS; i++)
-        if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
-            Mode =  xf86CVTMode(timing[i].hsize, timing[i].vsize,
-                                timing[i].refresh, FALSE, FALSE);
-	    Mode->type = M_T_DRIVER;
-            Modes = xf86ModesAdd(Modes, Mode);
-        }
-
-    return Modes;
-}
-
-/*
- *
- */
-static DisplayModePtr
-DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
-			  int preferred)
-{
-    DisplayModePtr Mode;
-
-    /* We don't do stereo */
-    if (timing->stereo) {
-        xf86DrvMsg(scrnIndex, X_INFO, "%s: Ignoring: We don't handle stereo.\n",
-                   __func__);
-        return NULL;
-    }
-    
-    /* We only do seperate sync currently */
-    if (timing->sync != 0x03) {
-         xf86DrvMsg(scrnIndex, X_INFO, "%s: %dx%d Warning: We only handle seperate"
-                    " sync.\n", __func__, timing->h_active, timing->v_active);
-    }
-    
-    Mode = xnfalloc(sizeof(DisplayModeRec));
-    memset(Mode, 0, sizeof(DisplayModeRec));
-    
-    Mode->name = xnfalloc(10); /* "1234x1234" */
-    xf86snprintf(Mode->name, 20, "%dx%d", timing->h_active,
-                 timing->v_active);
-    
-    Mode->type = M_T_DRIVER;
-    if (preferred)
-	Mode->type |= M_T_PREFERRED;
-    
-    Mode->Clock = timing->clock / 1000.0;
-    
-    Mode->HDisplay = timing->h_active;
-    Mode->HSyncStart = timing->h_active + timing->h_sync_off;
-    Mode->HSyncEnd = Mode->HSyncStart + timing->h_sync_width;
-    Mode->HTotal = timing->h_active + timing->h_blanking;
-    
-    Mode->VDisplay = timing->v_active;
-    Mode->VSyncStart = timing->v_active + timing->v_sync_off;
-    Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width;
-    Mode->VTotal = timing->v_active + timing->v_blanking;
-    
-    /* We ignore h/v_size and h/v_border for now. */
-    
-    if (timing->interlaced)
-        Mode->Flags |= V_INTERLACE;
-    
-    if (timing->misc & 0x02)
-        Mode->Flags |= V_PHSYNC;
-    else
-        Mode->Flags |= V_NHSYNC;
-    
-    if (timing->misc & 0x01)
-        Mode->Flags |= V_PVSYNC;
-    else
-        Mode->Flags |= V_NVSYNC;
- 
-    return Mode;
-}
-
-/*
- *
- */
-static void
-DDCGuessRangesFromModes(int scrnIndex, MonPtr Monitor, DisplayModePtr Modes)
-{
-    DisplayModePtr Mode = Modes;
-
-    if (!Monitor || !Modes)
-        return;
-
-    /* set up the ranges for scanning through the modes */
-    Monitor->nHsync = 1;
-    Monitor->hsync[0].lo = 1024.0;
-    Monitor->hsync[0].hi = 0.0;
 
-    Monitor->nVrefresh = 1;
-    Monitor->vrefresh[0].lo = 1024.0;
-    Monitor->vrefresh[0].hi = 0.0;
-
-    while (Mode) {
-        if (!Mode->HSync)
-            Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal);
-
-        if (!Mode->VRefresh)
-            Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) / 
-                ((float) (Mode->HTotal * Mode->VTotal));
-
-        if (Mode->HSync < Monitor->hsync[0].lo)
-            Monitor->hsync[0].lo = Mode->HSync;
-
-        if (Mode->HSync > Monitor->hsync[0].hi)
-            Monitor->hsync[0].hi = Mode->HSync;
-
-        if (Mode->VRefresh < Monitor->vrefresh[0].lo)
-            Monitor->vrefresh[0].lo = Mode->VRefresh;
-
-        if (Mode->VRefresh > Monitor->vrefresh[0].hi)
-            Monitor->vrefresh[0].hi = Mode->VRefresh;
-        
-        Mode = Mode->next;
-    }
-}
-
-/*
- * Fill out MonPtr with xf86MonPtr information.
- */
-void
-xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
-{
-    DisplayModePtr Modes = NULL, Mode;
-    int i, clock;
-    Bool have_hsync = FALSE, have_vrefresh = FALSE;
-    int preferred;
-    
-    if (!Monitor || !DDC)
-        return;
-
-    Monitor->DDC = DDC;
-
-    preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
-
-    Monitor->widthmm = 10 * DDC->features.hsize;
-    Monitor->heightmm = 10 * DDC->features.vsize;
-    
-    /* If this is a digital display, then we can use reduced blanking */
-    if (DDC->features.input_type) 
-        Monitor->reducedblanking = TRUE;
-    /* Allow the user to also enable this through config */
-
-    /* Add established timings */
-    Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1);
-    Modes = xf86ModesAdd(Modes, Mode);
-
-    /* Add standard timings */
-    Mode = DDCModesFromStandardTiming(scrnIndex, DDC->timings2);
-    Modes = xf86ModesAdd(Modes, Mode);
-
-    /* Skip EDID ranges if they were specified in the config file */
-    have_hsync = (Monitor->nHsync != 0);
-    have_vrefresh = (Monitor->nVrefresh != 0);
-
-    /* Go through the detailed monitor sections */
-    for (i = 0; i < DET_TIMINGS; i++)
-        switch (DDC->det_mon[i].type) {
-        case DS_RANGES:
-	    if (!have_hsync) {
-		if (!Monitor->nHsync)
-		    xf86DrvMsg(scrnIndex, X_INFO,
-			    "Using EDID range info for horizontal sync\n");
-		Monitor->hsync[Monitor->nHsync].lo =
-		    DDC->det_mon[i].section.ranges.min_h;
-		Monitor->hsync[Monitor->nHsync].hi =
-		    DDC->det_mon[i].section.ranges.max_h;
-		Monitor->nHsync++;
-	    } else {
-		xf86DrvMsg(scrnIndex, X_INFO,
-			"Using hsync ranges from config file\n");
-	    }
-
-	    if (!have_vrefresh) {
-		if (!Monitor->nVrefresh)
-		    xf86DrvMsg(scrnIndex, X_INFO,
-			    "Using EDID range info for vertical refresh\n");
-		Monitor->vrefresh[Monitor->nVrefresh].lo =
-		    DDC->det_mon[i].section.ranges.min_v;
-		Monitor->vrefresh[Monitor->nVrefresh].hi =
-		    DDC->det_mon[i].section.ranges.max_v;
-		Monitor->nVrefresh++;
-	    } else {
-		xf86DrvMsg(scrnIndex, X_INFO,
-			"Using vrefresh ranges from config file\n");
-	    }
-
-	    clock = DDC->det_mon[i].section.ranges.max_clock * 1000;
-	    if (clock > Monitor->maxPixClock)
-		Monitor->maxPixClock = clock;
-
-            break;
-        case DT:
-            Mode = DDCModeFromDetailedTiming(scrnIndex, 
-                                             &DDC->det_mon[i].section.d_timings,
-					     preferred);
-	    preferred = 0;
-            Modes = xf86ModesAdd(Modes, Mode);
-            break;
-        case DS_STD_TIMINGS:
-            Mode = DDCModesFromStandardTiming(scrnIndex,
-                                             DDC->det_mon[i].section.std_t);
-            Modes = xf86ModesAdd(Modes, Mode);
-            break;
-        default:
-            break;
-        }
-
-    if (Modes) {
-        /* Print Modes */
-        xf86DrvMsg(scrnIndex, X_INFO, "Printing DDC gathered Modelines:\n");
-
-        Mode = Modes;
-        while (Mode) {
-            xf86PrintModeline(scrnIndex, Mode);
-            Mode = Mode->next;
-        }
-
-        /* Do we still need ranges to be filled in? */
-        if (!Monitor->nHsync || !Monitor->nVrefresh)
-            DDCGuessRangesFromModes(scrnIndex, Monitor, Modes);
-
-        /* look for last Mode */
-        Mode = Modes;
-
-        while (Mode->next)
-            Mode = Mode->next;
-        
-        /* add to MonPtr */
-        if (Monitor->Modes) {
-            Monitor->Last->next = Modes;
-            Modes->prev = Monitor->Last;
-            Monitor->Last = Mode;
-        } else {
-            Monitor->Modes = Modes;
-            Monitor->Last = Mode;
-        }
-    }
-}
 
 #define EDID1_ATOM_NAME         "XFree86_DDC_EDID1_RAWDATA"
 #define EDID2_ATOM_NAME         "XFree86_DDC_EDID2_RAWDATA"
diff --git a/hw/xfree86/ddc/edid_modes.c b/hw/xfree86/ddc/edid_modes.c
new file mode 100644
index 0000000..5ce86ee
--- /dev/null
+++ b/hw/xfree86/ddc/edid_modes.c
@@ -0,0 +1,328 @@
+/*
+ * Copyright 2006 Luc Verhaegen.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "xf86.h"
+#include "xf86DDC.h"
+#include <X11/Xatom.h>
+#include "property.h"
+#include "propertyst.h"
+#include "xf86DDC.h"
+
+/*
+ * TODO:
+ *  - for those with access to the VESA DMT standard; review please.
+ */
+#define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DRIVER
+#define MODESUFFIX   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0
+
+DisplayModeRec DDCEstablishedModes[17] = {
+    { MODEPREFIX("800x600"),    40000,  800,  840,  968, 1056, 0,  600,  601,  605,  628, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 60Hz */
+    { MODEPREFIX("800x600"),    36000,  800,  824,  896, 1024, 0,  600,  601,  603,  625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 56Hz */
+    { MODEPREFIX("640x480"),    31500,  640,  656,  720,  840, 0,  480,  481,  484,  500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 75Hz */
+    { MODEPREFIX("640x480"),    31500,  640,  664,  704,  832, 0,  480,  489,  491,  520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 72Hz */
+    { MODEPREFIX("640x480"),    30240,  640,  704,  768,  864, 0,  480,  483,  486,  525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 67Hz */
+    { MODEPREFIX("640x480"),    25200,  640,  656,  752,  800, 0,  480,  490,  492,  525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 60Hz */
+    { MODEPREFIX("720x400"),    35500,  720,  738,  846,  900, 0,  400,  421,  423,  449, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 720x400 at 88Hz */
+    { MODEPREFIX("720x400"),    28320,  720,  738,  846,  900, 0,  400,  412,  414,  449, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 720x400 at 70Hz */
+    { MODEPREFIX("1280x1024"), 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024 at 75Hz */
+    { MODEPREFIX("1024x768"),   78800, 1024, 1040, 1136, 1312, 0,  768,  769,  772,  800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768 at 75Hz */
+    { MODEPREFIX("1024x768"),   75000, 1024, 1048, 1184, 1328, 0,  768,  771,  777,  806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768 at 70Hz */
+    { MODEPREFIX("1024x768"),   65000, 1024, 1048, 1184, 1344, 0,  768,  771,  777,  806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768 at 60Hz */
+    { MODEPREFIX("1024x768"),   44900, 1024, 1032, 1208, 1264, 0,  768,  768,  776,  817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768 at 43Hz */
+    { MODEPREFIX("832x624"),    57284,  832,  864,  928, 1152, 0,  624,  625,  628,  667, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 832x624 at 75Hz */
+    { MODEPREFIX("800x600"),    49500,  800,  816,  896, 1056, 0,  600,  601,  604,  625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 75Hz */
+    { MODEPREFIX("800x600"),    50000,  800,  856,  976, 1040, 0,  600,  637,  643,  666, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 72Hz */
+    { MODEPREFIX("1152x864"),  108000, 1152, 1216, 1344, 1600, 0,  864,  865,  868,  900, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1152x864 at 75Hz */
+};
+
+static DisplayModePtr
+DDCModesFromEstablished(int scrnIndex, struct established_timings *timing)
+{
+    DisplayModePtr Modes = NULL, Mode = NULL;
+    CARD32 bits = (timing->t1) | (timing->t2 << 8) |
+        ((timing->t_manu & 0x80) << 9);
+    int i;
+
+    for (i = 0; i < 17; i++) {
+        if (bits & (0x01 << i)) {
+            Mode = xf86DuplicateMode(&DDCEstablishedModes[i]);
+            Modes = xf86ModesAdd(Modes, Mode);
+        }
+    }
+
+    return Modes;
+}
+
+/*
+ *
+ */
+static DisplayModePtr
+DDCModesFromStandardTiming(int scrnIndex, struct std_timings *timing)
+{
+    DisplayModePtr Modes = NULL, Mode = NULL;
+    int i;
+    
+    for (i = 0; i < STD_TIMINGS; i++)
+        if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
+            Mode =  xf86CVTMode(timing[i].hsize, timing[i].vsize,
+                                timing[i].refresh, FALSE, FALSE);
+	    Mode->type = M_T_DRIVER;
+            Modes = xf86ModesAdd(Modes, Mode);
+        }
+
+    return Modes;
+}
+
+/*
+ *
+ */
+static DisplayModePtr
+DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
+			  int preferred)
+{
+    DisplayModePtr Mode;
+
+    /* We don't do stereo */
+    if (timing->stereo) {
+        xf86DrvMsg(scrnIndex, X_INFO, "%s: Ignoring: We don't handle stereo.\n",
+                   __func__);
+        return NULL;
+    }
+    
+    /* We only do seperate sync currently */
+    if (timing->sync != 0x03) {
+         xf86DrvMsg(scrnIndex, X_INFO, "%s: %dx%d Warning: We only handle seperate"
+                    " sync.\n", __func__, timing->h_active, timing->v_active);
+    }
+    
+    Mode = xnfalloc(sizeof(DisplayModeRec));
+    memset(Mode, 0, sizeof(DisplayModeRec));
+    
+    Mode->name = xnfalloc(10); /* "1234x1234" */
+    xf86snprintf(Mode->name, 20, "%dx%d", timing->h_active,
+                 timing->v_active);
+    
+    Mode->type = M_T_DRIVER;
+    if (preferred)
+	Mode->type |= M_T_PREFERRED;
+    
+    Mode->Clock = timing->clock / 1000.0;
+    
+    Mode->HDisplay = timing->h_active;
+    Mode->HSyncStart = timing->h_active + timing->h_sync_off;
+    Mode->HSyncEnd = Mode->HSyncStart + timing->h_sync_width;
+    Mode->HTotal = timing->h_active + timing->h_blanking;
+    
+    Mode->VDisplay = timing->v_active;
+    Mode->VSyncStart = timing->v_active + timing->v_sync_off;
+    Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width;
+    Mode->VTotal = timing->v_active + timing->v_blanking;
+    
+    /* We ignore h/v_size and h/v_border for now. */
+    
+    if (timing->interlaced)
+        Mode->Flags |= V_INTERLACE;
+    
+    if (timing->misc & 0x02)
+        Mode->Flags |= V_PHSYNC;
+    else
+        Mode->Flags |= V_NHSYNC;
+    
+    if (timing->misc & 0x01)
+        Mode->Flags |= V_PVSYNC;
+    else
+        Mode->Flags |= V_NVSYNC;
+ 
+    return Mode;
+}
+
+/*
+ *
+ */
+static void
+DDCGuessRangesFromModes(int scrnIndex, MonPtr Monitor, DisplayModePtr Modes)
+{
+    DisplayModePtr Mode = Modes;
+
+    if (!Monitor || !Modes)
+        return;
+
+    /* set up the ranges for scanning through the modes */
+    Monitor->nHsync = 1;
+    Monitor->hsync[0].lo = 1024.0;
+    Monitor->hsync[0].hi = 0.0;
+
+    Monitor->nVrefresh = 1;
+    Monitor->vrefresh[0].lo = 1024.0;
+    Monitor->vrefresh[0].hi = 0.0;
+
+    while (Mode) {
+        if (!Mode->HSync)
+            Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal);
+
+        if (!Mode->VRefresh)
+            Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) / 
+                ((float) (Mode->HTotal * Mode->VTotal));
+
+        if (Mode->HSync < Monitor->hsync[0].lo)
+            Monitor->hsync[0].lo = Mode->HSync;
+
+        if (Mode->HSync > Monitor->hsync[0].hi)
+            Monitor->hsync[0].hi = Mode->HSync;
+
+        if (Mode->VRefresh < Monitor->vrefresh[0].lo)
+            Monitor->vrefresh[0].lo = Mode->VRefresh;
+
+        if (Mode->VRefresh > Monitor->vrefresh[0].hi)
+            Monitor->vrefresh[0].hi = Mode->VRefresh;
+        
+        Mode = Mode->next;
+    }
+}
+
+/*
+ * Fill out MonPtr with xf86MonPtr information.
+ */
+void
+xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
+{
+    DisplayModePtr Modes = NULL, Mode;
+    int i, clock;
+    Bool have_hsync = FALSE, have_vrefresh = FALSE;
+    int preferred;
+    
+    if (!Monitor || !DDC)
+        return;
+
+    Monitor->DDC = DDC;
+
+    preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
+
+    Monitor->widthmm = 10 * DDC->features.hsize;
+    Monitor->heightmm = 10 * DDC->features.vsize;
+    
+    /* If this is a digital display, then we can use reduced blanking */
+    if (DDC->features.input_type) 
+        Monitor->reducedblanking = TRUE;
+    /* Allow the user to also enable this through config */
+
+    /* Add established timings */
+    Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1);
+    Modes = xf86ModesAdd(Modes, Mode);
+
+    /* Add standard timings */
+    Mode = DDCModesFromStandardTiming(scrnIndex, DDC->timings2);
+    Modes = xf86ModesAdd(Modes, Mode);
+
+    /* Skip EDID ranges if they were specified in the config file */
+    have_hsync = (Monitor->nHsync != 0);
+    have_vrefresh = (Monitor->nVrefresh != 0);
+
+    /* Go through the detailed monitor sections */
+    for (i = 0; i < DET_TIMINGS; i++)
+        switch (DDC->det_mon[i].type) {
+        case DS_RANGES:
+	    if (!have_hsync) {
+		if (!Monitor->nHsync)
+		    xf86DrvMsg(scrnIndex, X_INFO,
+			    "Using EDID range info for horizontal sync\n");
+		Monitor->hsync[Monitor->nHsync].lo =
+		    DDC->det_mon[i].section.ranges.min_h;
+		Monitor->hsync[Monitor->nHsync].hi =
+		    DDC->det_mon[i].section.ranges.max_h;
+		Monitor->nHsync++;
+	    } else {
+		xf86DrvMsg(scrnIndex, X_INFO,
+			"Using hsync ranges from config file\n");
+	    }
+
+	    if (!have_vrefresh) {
+		if (!Monitor->nVrefresh)
+		    xf86DrvMsg(scrnIndex, X_INFO,
+			    "Using EDID range info for vertical refresh\n");
+		Monitor->vrefresh[Monitor->nVrefresh].lo =
+		    DDC->det_mon[i].section.ranges.min_v;
+		Monitor->vrefresh[Monitor->nVrefresh].hi =
+		    DDC->det_mon[i].section.ranges.max_v;
+		Monitor->nVrefresh++;
+	    } else {
+		xf86DrvMsg(scrnIndex, X_INFO,
+			"Using vrefresh ranges from config file\n");
+	    }
+
+	    clock = DDC->det_mon[i].section.ranges.max_clock * 1000;
+	    if (clock > Monitor->maxPixClock)
+		Monitor->maxPixClock = clock;
+
+            break;
+        case DT:
+            Mode = DDCModeFromDetailedTiming(scrnIndex, 
+                                             &DDC->det_mon[i].section.d_timings,
+					     preferred);
+	    preferred = 0;
+            Modes = xf86ModesAdd(Modes, Mode);
+            break;
+        case DS_STD_TIMINGS:
+            Mode = DDCModesFromStandardTiming(scrnIndex,
+                                             DDC->det_mon[i].section.std_t);
+            Modes = xf86ModesAdd(Modes, Mode);
+            break;
+        default:
+            break;
+        }
+
+    if (Modes) {
+        /* Print Modes */
+        xf86DrvMsg(scrnIndex, X_INFO, "Printing DDC gathered Modelines:\n");
+
+        Mode = Modes;
+        while (Mode) {
+            xf86PrintModeline(scrnIndex, Mode);
+            Mode = Mode->next;
+        }
+
+        /* Do we still need ranges to be filled in? */
+        if (!Monitor->nHsync || !Monitor->nVrefresh)
+            DDCGuessRangesFromModes(scrnIndex, Monitor, Modes);
+
+        /* look for last Mode */
+        Mode = Modes;
+
+        while (Mode->next)
+            Mode = Mode->next;
+        
+        /* add to MonPtr */
+        if (Monitor->Modes) {
+            Monitor->Last->next = Modes;
+            Modes->prev = Monitor->Last;
+            Monitor->Last = Mode;
+        } else {
+            Monitor->Modes = Modes;
+            Monitor->Last = Mode;
+        }
+    }
+}
diff-tree 38ecc66cd9c61346a46697bbf1d8319f4f6f9800 (from 834e4b079866594b50be64ae79f3cb2a5baa2070)
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Nov 28 10:06:15 2006 -0800

    Typo that was missed in testing.

diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index 87c91b8..ddf580c 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -69,7 +69,7 @@ DDCModesFromEstablished(int scrnIndex, s
 
     for (i = 0; i < 17; i++) {
         if (bits & (0x01 << i)) {
-            Mode = xf86DusplicateMode(&DDCEstablishedModes[i]);
+            Mode = xf86DuplicateMode(&DDCEstablishedModes[i]);
             Modes = xf86ModesAdd(Modes, Mode);
         }
     }
diff-tree 834e4b079866594b50be64ae79f3cb2a5baa2070 (from 5dbcd34a0a6c0d10dbfea8fdc9d7dfe7a0261b19)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Tue Nov 28 18:57:13 2006 +0100

    Fix potential NULL pointer access in timer code.
    
    https://bugzilla.novell.com/show_bug.cgi?id=223718

diff --git a/os/WaitFor.c b/os/WaitFor.c
index 6109e34..ba227a3 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -205,15 +205,17 @@ WaitForSomething(int *pClientsReady)
             if (timeout > 0 && timeout > timers->delta + 250) {
                 /* time has rewound.  reset the timers. */
                 CheckAllTimers(now);
-                timeout = timers->expires - now;
             }
 
-            if (timeout < 0)
-                timeout = 0;
-	    waittime.tv_sec = timeout / MILLI_PER_SECOND;
-	    waittime.tv_usec = (timeout % MILLI_PER_SECOND) *
-		               (1000000 / MILLI_PER_SECOND);
-	    wt = &waittime;
+	    if (timers) {
+		timeout = timers->expires - now;
+		if (timeout < 0)
+		    timeout = 0;
+		waittime.tv_sec = timeout / MILLI_PER_SECOND;
+		waittime.tv_usec = (timeout % MILLI_PER_SECOND) *
+				   (1000000 / MILLI_PER_SECOND);
+		wt = &waittime;
+	    }
 	}
 	XFD_COPYSET(&AllSockets, &LastSelectMask);
 #ifdef SMART_SCHEDULE
diff-tree 5dbcd34a0a6c0d10dbfea8fdc9d7dfe7a0261b19 (from 16f8f10dc2106bc6253b2d89a1f8efee8d80e2ba)
Author: Eric Anholt <eric at anholt.net>
Date:   Mon Nov 27 16:26:14 2006 -0800

    Register dependency on new RandR protocol.

diff --git a/configure.ac b/configure.ac
index e3221ed..db2234f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -545,7 +545,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.l
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4] [kbproto >= 1.0.3]"
+REQUIRED_MODULES="[randrproto >= 1.2] renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4] [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc"
 
 if test "x$DBUS" = xauto; then
diff-tree 16f8f10dc2106bc6253b2d89a1f8efee8d80e2ba (from b4b0d901d98371a8aa7b17d195e18e83e2a6a618)
Author: Eric Anholt <eric at anholt.net>
Date:   Mon Nov 27 16:21:31 2006 -0800

    Move mode handling helpers from ddcProperty.c to xf86Mode.c.

diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index 41ad08a..aa73e7d 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -426,6 +426,7 @@ DisplayModePtr xf86DuplicateMode(Display
 DisplayModePtr xf86DuplicateModes(ScrnInfoPtr pScrn, DisplayModePtr modeList);
 Bool xf86ModesEqual(DisplayModePtr pMode1, DisplayModePtr pMode2);
 void xf86PrintModeline(int scrnIndex,DisplayModePtr mode);
+DisplayModePtr xf86ModesAdd(DisplayModePtr modes, DisplayModePtr new);
 
 /* xf86Option.c */
 
diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index 5a51be0..3cebac7 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -2178,3 +2178,27 @@ xf86PrintModes(ScrnInfoPtr scrp)
 	p = p->next;
     } while (p != NULL && p != scrp->modes);
 }
+
+/**
+ * Adds the new mode into the mode list, and returns the new list
+ *
+ * \param modes doubly-linked mode list.
+ */
+_X_EXPORT DisplayModePtr
+xf86ModesAdd(DisplayModePtr modes, DisplayModePtr new)
+{
+    if (modes == NULL)
+	return new;
+
+    if (new) {
+        DisplayModePtr mode = modes;
+
+        while (mode->next)
+            mode = mode->next;
+
+        mode->next = new;
+        new->prev = mode;
+    }
+
+    return modes;
+}
diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index a1650bc..87c91b8 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -33,98 +33,6 @@
 #include "xf86DDC.h"
 
 /*
- * xf86Mode.c should have a some more DisplayModePtr list handling.
- */
-static DisplayModePtr
-xf86ModesAdd(DisplayModePtr Modes, DisplayModePtr Additions)
-{
-    if (!Modes) {
-        if (Additions)
-            return Additions;
-        else
-            return NULL;
-    }
-
-    if (Additions) {
-        DisplayModePtr Mode = Modes;
-
-        while (Mode->next)
-            Mode = Mode->next;
-        
-        Mode->next = Additions;
-        Additions->prev = Mode;
-    }
-
-    return Modes;
-}
-
-static DisplayModePtr
-xf86ModeCopy(DisplayModePtr Mode)
-{
-    DisplayModePtr New;
-
-    if (!Mode)
-        return NULL;
-
-    New = xnfalloc(sizeof(DisplayModeRec));
-
-    memcpy(New, Mode, sizeof(DisplayModeRec));
-    
-    New->name = xnfalloc(strlen(Mode->name) + 1);
-    memcpy(New->name, Mode->name, strlen(Mode->name) + 1);
-
-    /* We ignore privates as DDC code doesn't use it currently */
-    return New;
-}
-
-/*
- * Temporary.
- */
-static void
-add(char **p, char *new)
-{
-    *p = xnfrealloc(*p, strlen(*p) + strlen(new) + 2);
-    strcat(*p, " ");
-    strcat(*p, new);
-}
-
-static void
-PrintModeline(int scrnIndex,DisplayModePtr mode)
-{
-    char tmp[256];
-    char *flags = xnfcalloc(1, 1);
-
-    if (mode->HSkew) { 
-	snprintf(tmp, 256, "hskew %i", mode->HSkew); 
-	add(&flags, tmp);
-    }
-    if (mode->VScan) { 
-	snprintf(tmp, 256, "vscan %i", mode->VScan); 
-	add(&flags, tmp);
-    }
-    if (mode->Flags & V_INTERLACE) add(&flags, "interlace");
-    if (mode->Flags & V_CSYNC) add(&flags, "composite");
-    if (mode->Flags & V_DBLSCAN) add(&flags, "doublescan");
-    if (mode->Flags & V_BCAST) add(&flags, "bcast");
-    if (mode->Flags & V_PHSYNC) add(&flags, "+hsync");
-    if (mode->Flags & V_NHSYNC) add(&flags, "-hsync");
-    if (mode->Flags & V_PVSYNC) add(&flags, "+vsync");
-    if (mode->Flags & V_NVSYNC) add(&flags, "-vsync");
-    if (mode->Flags & V_PCSYNC) add(&flags, "+csync");
-    if (mode->Flags & V_NCSYNC) add(&flags, "-csync");
-#if 0
-    if (mode->Flags & V_CLKDIV2) add(&flags, "vclk/2");
-#endif
-    xf86DrvMsgVerb(scrnIndex, X_INFO, 3,
-		   "Modeline \"%s\"  %6.2f  %i %i %i %i  %i %i %i %i%s\n",
-		   mode->name, mode->Clock/1000., mode->HDisplay,
-		   mode->HSyncStart, mode->HSyncEnd, mode->HTotal,
-		   mode->VDisplay, mode->VSyncStart, mode->VSyncEnd,
-		   mode->VTotal, flags);
-    xfree(flags);
-}
-
-/*
  * TODO:
  *  - for those with access to the VESA DMT standard; review please.
  */
@@ -159,11 +67,12 @@ DDCModesFromEstablished(int scrnIndex, s
         ((timing->t_manu & 0x80) << 9);
     int i;
 
-    for (i = 0; i < 17; i++)
+    for (i = 0; i < 17; i++) {
         if (bits & (0x01 << i)) {
-            Mode = xf86ModeCopy(&(DDCEstablishedModes[i]));
+            Mode = xf86DusplicateMode(&DDCEstablishedModes[i]);
             Modes = xf86ModesAdd(Modes, Mode);
         }
+    }
 
     return Modes;
 }
@@ -392,7 +301,7 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
 
         Mode = Modes;
         while (Mode) {
-            PrintModeline(scrnIndex, Mode);
+            xf86PrintModeline(scrnIndex, Mode);
             Mode = Mode->next;
         }
 
diff-tree b4b0d901d98371a8aa7b17d195e18e83e2a6a618 (from parents)
Merge: 64de3baf85f6df274f71f736016f0848567cd9f6 d6cd0313c7f23f32c9c7dda00ff739e772bf7db3
Author: Eric Anholt <eric at anholt.net>
Date:   Mon Nov 27 15:43:15 2006 -0800

    Merge branch 'randr-1.2'
    
    Conflicts:
    
    	dix/events.c
    	dix/getevents.c
    	hw/xfree86/common/xf86Mode.c
    	hw/xfree86/dri/Makefile.am
    	hw/xfree86/os-support/drm/xf86drm.c
    	hw/xfree86/os-support/xf86drm.h

diff --cc configure.ac
index 590ab2a,b75caf7..e3221ed
@@@ -653,11 -654,13 +653,14 @@@
  if test "x$DRI" = xyes; then
  	AC_DEFINE(XF86DRI, 1, [Build DRI extension])
  	PKG_CHECK_MODULES([DRIPROTO], [xf86driproto])
 -	PKG_CHECK_MODULES([LIBDRM], [libdrm])
 +	PKG_CHECK_MODULES([LIBDRM], [libdrm >= 2.3.0])
  	PKG_CHECK_MODULES([GL], [glproto >= 1.4.1])
+ 	PKG_CHECK_EXISTS(libdrm >= 2.2.0,
+ 			 [AC_DEFINE([HAVE_LIBDRM_2_2], 1,
+ 			 [Has version 2.2 (or newer) of the drm library])])
  	AC_SUBST(DRIPROTO_CFLAGS)
  	AC_SUBST(LIBDRM_CFLAGS)
 +	AC_SUBST(LIBDRM_LIBS)
  	AC_SUBST(GL_CFLAGS)
  fi
  
diff --cc dix/getevents.c
index c1b8840,1d95028..be598bc
@@@ -37,8 -35,11 +37,9 @@@
  #include "inputstr.h"
  #include "scrnintstr.h"
  #include "cursorstr.h"
 -
  #include "dixstruct.h"
  #include "globals.h"
+ #include "dixevents.h"
 -
  #include "mipointer.h"
  
  #ifdef XKB
diff --cc hw/xfree86/common/xf86Mode.c
index 456331d,6dccf24..5a51be0
@@@ -475,141 -474,143 +487,141 @@@
  	cp->ClockMulFactor = max(1, cp->ClockMulFactor);
      }
  
 -    haveBuiltin = FALSE;
      /* Scan the mode pool for matching names */
 -    for (p = scrp->modePool; p != NULL; p = p->next) {
 -	if (strcmp(p->name, modep->name) == 0) {
 -	    /*
 -	     * Requested mode is a built-in mode. Don't let the user
 -	     * override it.
 -	     * Since built-in modes always come before user specified
 -	     * modes it will always be found first.  
 -	     */
 -	    if (p->type & M_T_BUILTIN) {
 -		haveBuiltin = TRUE;
 -	    }
 +    for (n = 0; n < ntypes; n++) {
 +	int type = types[n];
 +	for (p = scrp->modePool; p != NULL; p = p->next) {
  
 -	    if (haveBuiltin && !(p->type & M_T_BUILTIN))
 +	    /* scan through the modes in the sort order above */
 +	    if ((p->type & type) != type)
  		continue;
  
 -	    /* Skip over previously rejected modes */
 -	    if (p->status != MODE_OK) {
 -		if (!found)
 -		    status = p->status;
 -		continue;
 -	    }
 -		
 -	    /* Skip over previously considered modes */
 -	    if (p->prev)
 -		continue;
 +	    if (strcmp(p->name, modep->name) == 0) {
  
 -	    if (p->type & M_T_BUILTIN) {
 -		return xf86HandleBuiltinMode(scrp, p,modep, clockRanges,
 -					     allowDiv2);
 -	    }
 +		/* Skip over previously rejected modes */
 +		if (p->status != MODE_OK) {
 +		    if (!found)
 +			status = p->status;
 +		    continue;
 +		}
  
 -	    /* Check clock is in range */
 -	    cp = xf86FindClockRangeForMode(clockRanges, p);
 -	    if (cp == NULL) {
 -		/*
 -		 * XXX Could do more here to provide a more detailed
 -		 * reason for not finding a mode.
 -		 */
 -		p->status = MODE_CLOCK_RANGE;
 -		if (!found)
 -		    status = MODE_CLOCK_RANGE;
 -		continue;
 -	    }
 +		/* Skip over previously considered modes */
 +		if (p->prev)
 +		    continue;
  
 -	    /*
 -	     * If programmable clock and strategy is not LOOKUP_BEST_REFRESH,
 -	     * the required mode has been found, otherwise record the refresh
 -	     * and continue looking.
 -	     */
 -	    if (scrp->progClock) {
 -		found = TRUE;
 -		if (strategy != LOOKUP_BEST_REFRESH) {
 -		    bestMode = p;
 -		    DivFactor = cp->ClockDivFactor;
 -		    MulFactor = cp->ClockMulFactor;
 -		    ModePrivFlags = cp->PrivFlags;
 -		    break;
 +		if (p->type & M_T_BUILTIN) {
 +		    return xf86HandleBuiltinMode(scrp, p,modep, clockRanges,
 +			    allowDiv2);
  		}
 -		refresh = xf86ModeVRefresh(p);
 -		if (p->Flags & V_INTERLACE)
 -		    refresh /= INTERLACE_REFRESH_WEIGHT;
 -		if (refresh > bestRefresh) {
 -		    bestMode = p;
 -		    DivFactor = cp->ClockDivFactor;
 -		    MulFactor = cp->ClockMulFactor;
 -		    ModePrivFlags = cp->PrivFlags;
 -		    bestRefresh = refresh;
 +
 +		/* Check clock is in range */
 +		cp = xf86FindClockRangeForMode(clockRanges, p);
 +		if (cp == NULL) {
 +		    /*
 +		     * XXX Could do more here to provide a more detailed
 +		     * reason for not finding a mode.
 +		     */
 +		    p->status = MODE_CLOCK_RANGE;
 +		    if (!found)
 +			status = MODE_CLOCK_RANGE;
 +		    continue;
  		}
 -		continue;
 -	    }
  
 -	    /*
 -	     * Clock is in range, so if it is not a programmable clock, find
 -	     * a matching clock.
 -	     */
 +		/*
 +		 * If programmable clock and strategy is not
 +		 * LOOKUP_BEST_REFRESH, the required mode has been found,
 +		 * otherwise record the refresh and continue looking.
 +		 */
 +		if (scrp->progClock) {
 +		    found = TRUE;
 +		    if (strategy != LOOKUP_BEST_REFRESH) {
 +			bestMode = p;
 +			DivFactor = cp->ClockDivFactor;
 +			MulFactor = cp->ClockMulFactor;
 +			ModePrivFlags = cp->PrivFlags;
 +			break;
 +		    }
- 		    refresh = ModeVRefresh(p);
++		    refresh = xf86ModeVRefresh(p);
 +		    if (p->Flags & V_INTERLACE)
 +			refresh /= INTERLACE_REFRESH_WEIGHT;
 +		    if (refresh > bestRefresh) {
 +			bestMode = p;
 +			DivFactor = cp->ClockDivFactor;
 +			MulFactor = cp->ClockMulFactor;
 +			ModePrivFlags = cp->PrivFlags;
 +			bestRefresh = refresh;
 +		    }
 +		    continue;
 +		}
  
 -	    i = xf86GetNearestClock(scrp, p->Clock, allowDiv2,
 -		cp->ClockDivFactor, cp->ClockMulFactor, &k);
 -	    /*
 -	     * If the clock is too far from the requested clock, this
 -	     * mode is no good.
 -	     */
 -	    if (k & V_CLKDIV2)
 -		gap = abs((p->Clock * 2) -
 -		    ((scrp->clock[i] * cp->ClockDivFactor) / cp->ClockMulFactor));
 -	    else
 -		gap = abs(p->Clock -
 -		    ((scrp->clock[i] * cp->ClockDivFactor) / cp->ClockMulFactor));
 -	    if (gap > minimumGap) {
 -		p->status = MODE_NOCLOCK;
 -		if (!found)
 -		    status = MODE_NOCLOCK;
 -		continue;
 -	    }
 -	    found = TRUE;
 +		/*
 +		 * Clock is in range, so if it is not a programmable clock, find
 +		 * a matching clock.
 +		 */
  
 -	    if (strategy == LOOKUP_BEST_REFRESH) {
 -		refresh = xf86ModeVRefresh(p);
 -		if (p->Flags & V_INTERLACE)
 -		    refresh /= INTERLACE_REFRESH_WEIGHT;
 -		if (refresh > bestRefresh) {
 -		    bestMode = p;
 -		    DivFactor = cp->ClockDivFactor;
 -		    MulFactor = cp->ClockMulFactor;
 -		    ModePrivFlags = cp->PrivFlags;
 -		    extraFlags = k;
 -		    clockIndex = i;
 -		    bestRefresh = refresh;
 +		i = xf86GetNearestClock(scrp, p->Clock, allowDiv2,
 +			cp->ClockDivFactor, cp->ClockMulFactor, &k);
 +		/*
 +		 * If the clock is too far from the requested clock, this
 +		 * mode is no good.
 +		 */
 +		if (k & V_CLKDIV2)
 +		    gap = abs((p->Clock * 2) -
 +			    ((scrp->clock[i] * cp->ClockDivFactor) /
 +				cp->ClockMulFactor));
 +		else
 +		    gap = abs(p->Clock -
 +			    ((scrp->clock[i] * cp->ClockDivFactor) /
 +				cp->ClockMulFactor));
 +		if (gap > minimumGap) {
 +		    p->status = MODE_NOCLOCK;
 +		    if (!found)
 +			status = MODE_NOCLOCK;
 +		    continue;
  		}
 -		continue;
 -	    }
 -	    if (strategy == LOOKUP_CLOSEST_CLOCK) {
 -		if (gap < minimumGap) {
 -		    bestMode = p;
 -		    DivFactor = cp->ClockDivFactor;
 -		    MulFactor = cp->ClockMulFactor;
 -		    ModePrivFlags = cp->PrivFlags;
 -		    extraFlags = k;
 -		    clockIndex = i;
 -		    minimumGap = gap;
 +		found = TRUE;
 +
 +		if (strategy == LOOKUP_BEST_REFRESH) {
- 		    refresh = ModeVRefresh(p);
++		    refresh = xf86ModeVRefresh(p);
 +		    if (p->Flags & V_INTERLACE)
 +			refresh /= INTERLACE_REFRESH_WEIGHT;
 +		    if (refresh > bestRefresh) {
 +			bestMode = p;
 +			DivFactor = cp->ClockDivFactor;
 +			MulFactor = cp->ClockMulFactor;
 +			ModePrivFlags = cp->PrivFlags;
 +			extraFlags = k;
 +			clockIndex = i;
 +			bestRefresh = refresh;
 +		    }
 +		    continue;
  		}
 -		continue;
 +		if (strategy == LOOKUP_CLOSEST_CLOCK) {
 +		    if (gap < minimumGap) {
 +			bestMode = p;
 +			DivFactor = cp->ClockDivFactor;
 +			MulFactor = cp->ClockMulFactor;
 +			ModePrivFlags = cp->PrivFlags;
 +			extraFlags = k;
 +			clockIndex = i;
 +			minimumGap = gap;
 +		    }
 +		    continue;
 +		}
 +		/*
 +		 * If strategy is neither LOOKUP_BEST_REFRESH or
 +		 * LOOKUP_CLOSEST_CLOCK the required mode has been found.
 +		 */
 +		bestMode = p;
 +		DivFactor = cp->ClockDivFactor;
 +		MulFactor = cp->ClockMulFactor;
 +		ModePrivFlags = cp->PrivFlags;
 +		extraFlags = k;
 +		clockIndex = i;
 +		break;
  	    }
 -	    /*
 -	     * If strategy is neither LOOKUP_BEST_REFRESH or
 -	     * LOOKUP_CLOSEST_CLOCK the required mode has been found.
 -	     */
 -	    bestMode = p;
 -	    DivFactor = cp->ClockDivFactor;
 -	    MulFactor = cp->ClockMulFactor;
 -	    ModePrivFlags = cp->PrivFlags;
 -	    extraFlags = k;
 -	    clockIndex = i;
 -	    break;
  	}
 +	if (found) break;
      }
      if (!found || bestMode == NULL)
  	return status;
diff --cc hw/xfree86/dri/Makefile.am
index 4def387,bc7124b..68f1eae
@@@ -7,10 -7,13 +7,10 @@@
                     -I$(top_builddir)/GL/include \
  		   -I at MESA_SOURCE@/include \
                     -DHAVE_XORG_CONFIG_H \
-                    @DRIPROTO_CFLAGS@ \
 -		 \
 -		 \
 - \
+                    @DIX_CFLAGS@ @DRIPROTO_CFLAGS@ \
                     @LIBDRM_CFLAGS@ \
                     @GL_CFLAGS@
 -libdri_la_LDFLAGS = -module -avoid-version
 +libdri_la_LDFLAGS = -module -avoid-version @LIBDRM_LIBS@
  libdri_ladir = $(moduledir)/extensions
  libdri_la_SOURCES = \
  	dri.c \
diff --cc include/input.h
index e7017cb,f2fe6d1..ebb0915
@@@ -418,12 -418,6 +418,12 @@@
      int num_valuators,
      int *valuators);
  
 +extern void PostSyntheticMotion(
 +    int x,
 +    int y,
-     int screenNum,
++    ScreenPtr pScreen,
 +    unsigned long time);
 +
  extern int GetMotionHistorySize(
      void);
  
diff-tree d6cd0313c7f23f32c9c7dda00ff739e772bf7db3 (from ef47d9c3ba63e9a6243fe5c81ccc60c8246352b4)
Author: Eric Anholt <eric at anholt.net>
Date:   Mon Nov 27 14:46:50 2006 -0800

    Add some mode helper functions from the intel driver.
    
    This also removes static from some other functions that had been copied out
    to at least the intel driver, but perhaps others that were doing mode list
    handling.

diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index 4587500..57284c1 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -414,6 +414,14 @@ void xf86PruneDriverModes(ScrnInfoPtr sc
 void xf86SetCrtcForModes(ScrnInfoPtr scrp, int adjustFlags);
 void xf86PrintModes(ScrnInfoPtr scrp);
 void xf86ShowClockRanges(ScrnInfoPtr scrp, ClockRangePtr clockRanges);
+double xf86ModeHSync(DisplayModePtr mode);
+double xf86ModeVRefresh(DisplayModePtr mode);
+void xf86SetModeDefaultName(DisplayModePtr mode);
+void xf86SetModeCrtc(DisplayModePtr p, int adjustFlags);
+DisplayModePtr xf86DuplicateMode(DisplayModePtr pMode);
+DisplayModePtr xf86DuplicateModes(ScrnInfoPtr pScrn, DisplayModePtr modeList);
+Bool xf86ModesEqual(DisplayModePtr pMode1, DisplayModePtr pMode2);
+void xf86PrintModeline(int scrnIndex,DisplayModePtr mode);
 
 /* xf86Option.c */
 
diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index cd57e99..6dccf24 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -366,8 +366,9 @@ xf86HandleBuiltinMode(ScrnInfoPtr scrp,
     return MODE_OK;
 }
 
-static double
-ModeHSync(DisplayModePtr mode)
+/** Calculates the horizontal sync rate of a mode */
+_X_EXPORT double
+xf86ModeHSync(DisplayModePtr mode)
 {
     double hsync = 0.0;
     
@@ -379,8 +380,9 @@ ModeHSync(DisplayModePtr mode)
     return hsync;
 }
 
-static double
-ModeVRefresh(DisplayModePtr mode)
+/** Calculates the vertical refresh rate of a mode */
+_X_EXPORT double
+xf86ModeVRefresh(DisplayModePtr mode)
 {
     double refresh = 0.0;
 
@@ -398,6 +400,16 @@ ModeVRefresh(DisplayModePtr mode)
     return refresh;
 }
 
+/** Sets a default mode name of <width>x<height> on a mode. */
+_X_EXPORT void
+xf86SetModeDefaultName(DisplayModePtr mode)
+{
+    if (mode->name != NULL)
+	xfree(mode->name);
+
+    mode->name = XNFprintf("%dx%d", mode->HDisplay, mode->VDisplay);
+}
+
 /*
  * xf86LookupMode
  *
@@ -522,7 +534,7 @@ xf86LookupMode(ScrnInfoPtr scrp, Display
 		    ModePrivFlags = cp->PrivFlags;
 		    break;
 		}
-		refresh = ModeVRefresh(p);
+		refresh = xf86ModeVRefresh(p);
 		if (p->Flags & V_INTERLACE)
 		    refresh /= INTERLACE_REFRESH_WEIGHT;
 		if (refresh > bestRefresh) {
@@ -561,7 +573,7 @@ xf86LookupMode(ScrnInfoPtr scrp, Display
 	    found = TRUE;
 
 	    if (strategy == LOOKUP_BEST_REFRESH) {
-		refresh = ModeVRefresh(p);
+		refresh = xf86ModeVRefresh(p);
 		if (p->Flags & V_INTERLACE)
 		    refresh /= INTERLACE_REFRESH_WEIGHT;
 		if (refresh > bestRefresh) {
@@ -662,7 +674,7 @@ xf86LookupMode(ScrnInfoPtr scrp, Display
  * Initialises the Crtc parameters for a mode.  The initialisation includes
  * adjustments for interlaced and double scan modes.
  */
-static void
+_X_EXPORT void
 xf86SetModeCrtc(DisplayModePtr p, int adjustFlags)
 {
     if ((p == NULL) || ((p->type & M_T_CRTC_C) == M_T_BUILTIN))
@@ -744,6 +756,87 @@ xf86SetModeCrtc(DisplayModePtr p, int ad
     }
 }
 
+/**
+ * Allocates and returns a copy of pMode, including pointers within pMode.
+ */
+_X_EXPORT DisplayModePtr
+xf86DuplicateMode(DisplayModePtr pMode)
+{
+    DisplayModePtr pNew;
+
+    pNew = xnfalloc(sizeof(DisplayModeRec));
+    *pNew = *pMode;
+    pNew->next = NULL;
+    pNew->prev = NULL;
+    if (pNew->name == NULL) {
+	xf86SetModeDefaultName(pMode);
+    } else {
+	pNew->name = xnfstrdup(pMode->name);
+    }
+
+    return pNew;
+}
+
+/**
+ * Duplicates every mode in the given list and returns a pointer to the first
+ * mode.
+ *
+ * \param modeList doubly-linked mode list
+ */
+_X_EXPORT DisplayModePtr
+xf86DuplicateModes(ScrnInfoPtr pScrn, DisplayModePtr modeList)
+{
+    DisplayModePtr first = NULL, last = NULL;
+    DisplayModePtr mode;
+
+    for (mode = modeList; mode != NULL; mode = mode->next) {
+	DisplayModePtr new;
+
+	new = xf86DuplicateMode(mode);
+
+	/* Insert pNew into modeList */
+	if (last) {
+	    last->next = new;
+	    new->prev = last;
+	} else {
+	    first = new;
+	    new->prev = NULL;
+	}
+	new->next = NULL;
+	last = new;
+    }
+
+    return first;
+}
+
+/**
+ * Returns true if the given modes should program to the same timings.
+ *
+ * This doesn't use Crtc values, as it might be used on ModeRecs without the
+ * Crtc values set.  So, it's assumed that the other numbers are enough.
+ */
+_X_EXPORT Bool
+xf86ModesEqual(DisplayModePtr pMode1, DisplayModePtr pMode2)
+{
+     if (pMode1->Clock == pMode2->Clock &&
+	 pMode1->HDisplay == pMode2->HDisplay &&
+	 pMode1->HSyncStart == pMode2->HSyncStart &&
+	 pMode1->HSyncEnd == pMode2->HSyncEnd &&
+	 pMode1->HTotal == pMode2->HTotal &&
+	 pMode1->HSkew == pMode2->HSkew &&
+	 pMode1->VDisplay == pMode2->VDisplay &&
+	 pMode1->VSyncStart == pMode2->VSyncStart &&
+	 pMode1->VSyncEnd == pMode2->VSyncEnd &&
+	 pMode1->VTotal == pMode2->VTotal &&
+	 pMode1->VScan == pMode2->VScan &&
+	 pMode1->Flags == pMode2->Flags)
+     {
+	return TRUE;
+     } else {
+	return FALSE;
+     }
+}
+
 /*
  * xf86CheckModeForMonitor
  *
@@ -802,7 +895,7 @@ xf86CheckModeForMonitor(DisplayModePtr m
 
     if (monitor->nHsync > 0) {
 	/* Check hsync against the allowed ranges */
-	float hsync = ModeHSync(mode);
+	float hsync = xf86ModeHSync(mode);
 	for (i = 0; i < monitor->nHsync; i++) 
 	    if ((hsync > monitor->hsync[i].lo * (1.0 - SYNC_TOLERANCE)) &&
 		(hsync < monitor->hsync[i].hi * (1.0 + SYNC_TOLERANCE)))
@@ -815,7 +908,7 @@ xf86CheckModeForMonitor(DisplayModePtr m
 
     if (monitor->nVrefresh > 0) {
 	/* Check vrefresh against the allowed ranges */
-	float vrefrsh = ModeVRefresh(mode);
+	float vrefrsh = xf86ModeVRefresh(mode);
 	for (i = 0; i < monitor->nVrefresh; i++)
 	    if ((vrefrsh > monitor->vrefresh[i].lo * (1.0 - SYNC_TOLERANCE)) &&
 		(vrefrsh < monitor->vrefresh[i].hi * (1.0 + SYNC_TOLERANCE)))
@@ -1043,8 +1136,8 @@ xf86InitialCheckModeForDriver(ScrnInfoPt
 		/ (mode->CrtcHTotal * mode->CrtcVTotal);
     }
     
-    mode->HSync = ModeHSync(mode);
-    mode->VRefresh = ModeVRefresh(mode);
+    mode->HSync = xf86ModeHSync(mode);
+    mode->VRefresh = xf86ModeVRefresh(mode);
 
     /* Assume it is OK */
     return MODE_OK;
@@ -1683,7 +1776,7 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
 				      "TargetRefresh", 0.0);
     if (targetRefresh > 0.0) {
 	for (p = scrp->modePool; p != NULL; p = p->next) {
-	    if (ModeVRefresh(p) > targetRefresh * (1.0 - SYNC_TOLERANCE))
+	    if (xf86ModeVRefresh(p) > targetRefresh * (1.0 - SYNC_TOLERANCE))
 		break;
 	}
 	if (!p)
@@ -1772,7 +1865,7 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
 			 * If there is a target refresh rate, skip modes that
 			 * don't match up.
 			 */
-			if (ModeVRefresh(q) <
+			if (xf86ModeVRefresh(q) <
 			    (1.0 - SYNC_TOLERANCE) * targetRefresh)
 			    continue;
 
@@ -2068,8 +2161,8 @@ add(char **p, char *new)
     strcat(*p, new);
 }
 
-static void
-PrintModeline(int scrnIndex,DisplayModePtr mode)
+_X_EXPORT void
+xf86PrintModeline(int scrnIndex,DisplayModePtr mode)
 {
     char tmp[256];
     char *flags = xnfcalloc(1, 1);
@@ -2124,8 +2217,8 @@ xf86PrintModes(ScrnInfoPtr scrp)
 
     do {
 	desc = desc2 = "";
-	hsync = ModeHSync(p);
-	refresh = ModeVRefresh(p);
+	hsync = xf86ModeHSync(p);
+	refresh = xf86ModeVRefresh(p);
 	if (p->Flags & V_INTERLACE) {
 	    desc = " (I)";
 	}
@@ -2166,7 +2259,7 @@ xf86PrintModes(ScrnInfoPtr scrp)
 			p->SynthClock / 1000.0, hsync, refresh, desc, desc2);
 	}
 	if (hsync != 0 && refresh != 0)
-	    PrintModeline(scrp->scrnIndex,p);
+	    xf86PrintModeline(scrp->scrnIndex,p);
 	p = p->next;
     } while (p != NULL && p != scrp->modes);
 }
diff-tree 64de3baf85f6df274f71f736016f0848567cd9f6 (from 0a2a6e4070718b90af7ca0e047f028e0cabdfb9d)
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Wed Nov 22 14:46:51 2006 -0800

    Add a -showDefaultLibPath option.
    
    A corollary to the previous change, this option prints $libdir.

diff --git a/configure.ac b/configure.ac
index 2108db4..590ab2a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1383,6 +1383,7 @@ dnl has it in libc), or if libdl is need
 	AC_DEFINE_DIR(__XCONFIGFILE__, XF86CONFIGFILE, [Name of configuration file])
 	AC_DEFINE_DIR(XF86CONFIGFILE, XF86CONFIGFILE, [Name of configuration file])
 	AC_DEFINE_DIR(DEFAULT_MODULE_PATH, moduledir, [Default module search path])
+	AC_DEFINE_DIR(DEFAULT_LIBRARY_PATH, libdir, [Default library install path])
 	AC_DEFINE_DIR(DEFAULT_LOGPREFIX, LOGPREFIX, [Default log location])
 	AC_DEFINE_UNQUOTED(__VENDORDWEBSUPPORT__, ["$VENDOR_WEB"], [Vendor web address for support])
 
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 5106acf..ff878d5 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -101,6 +101,7 @@
 static void xf86PrintBanner(void);
 static void xf86PrintMarkers(void);
 static void xf86PrintDefaultModulePath(void);
+static void xf86PrintDefaultLibraryPath(void);
 static void xf86RunVtInit(void);
 
 #ifdef __UNIXOS2__
@@ -1382,6 +1383,11 @@ ddxProcessArgument(int argc, char **argv
     xf86PrintDefaultModulePath();
     exit(0);
   }
+  if (!strcmp(argv[i],"-showDefaultLibPath"))
+  {
+    xf86PrintDefaultLibraryPath();
+    exit(0);
+  }
   /* Notice the -fp flag, but allow it to pass to the dix layer */
   if (!strcmp(argv[i], "-fp"))
   {
@@ -1632,6 +1638,7 @@ ddxUseMsg()
   ErrorF("-isolateDevice bus_id  restrict device resets to bus_id (PCI only)\n");
   ErrorF("-version               show the server version\n");
   ErrorF("-showDefaultModulePath show the server default module path\n");
+  ErrorF("-showDefaultLibPath    show the server default library path\n");
   /* OS-specific usage */
   xf86UseMsg();
   ErrorF("\n");
@@ -1761,6 +1768,12 @@ xf86PrintDefaultModulePath(void)
 }
 
 static void
+xf86PrintDefaultLibraryPath(void)
+{
+  ErrorF("%s\n", DEFAULT_LIBRARY_PATH);
+}
+
+static void
 xf86RunVtInit(void)
 {
     int i;
diff --git a/hw/xfree86/doc/man/Xorg.man.pre b/hw/xfree86/doc/man/Xorg.man.pre
index 5803100..8645732 100644
--- a/hw/xfree86/doc/man/Xorg.man.pre
+++ b/hw/xfree86/doc/man/Xorg.man.pre
@@ -429,6 +429,9 @@ support.
 .B \-showDefaultModulePath
 Print out the default module path the server was compiled with.
 .TP 8
+.B \-showDefaultLibPath
+Print out the path libraries should be installed to.
+.TP 8
 .BI \-config " file"
 Read the server configuration from
 .IR file .
diff --git a/include/xorg-config.h.in b/include/xorg-config.h.in
index 4a64522..b9643a2 100644
--- a/include/xorg-config.h.in
+++ b/include/xorg-config.h.in
@@ -45,6 +45,9 @@
 /* Path to loadable modules. */
 #undef DEFAULT_MODULE_PATH
 
+/* Path to installed libraries. */
+#undef DEFAULT_LIBRARY_PATH
+
 /* Path to server log file. */
 #undef DEFAULT_LOGPREFIX
 
diff-tree 0a2a6e4070718b90af7ca0e047f028e0cabdfb9d (from 61832cb94c8a4d62cddb92188caeed86519e9d62)
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Fri Nov 17 18:27:23 2006 -0800

    Add a -showDefaultModulePath option.
    
    As discussed on the mailing list, people would rather have an X command-line
    option to print the module path so installers can know where to put modules,
    rather than the installers using `pkg-config --variable=moduledir xorg-server`,
    since some distros choose not to install xorg-server.pc.

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 33351f2..5106acf 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -100,6 +100,7 @@
 
 static void xf86PrintBanner(void);
 static void xf86PrintMarkers(void);
+static void xf86PrintDefaultModulePath(void);
 static void xf86RunVtInit(void);
 
 #ifdef __UNIXOS2__
@@ -1376,6 +1377,11 @@ ddxProcessArgument(int argc, char **argv
     xf86PrintBanner();
     exit(0);
   }
+  if (!strcmp(argv[i],"-showDefaultModulePath"))
+  {
+    xf86PrintDefaultModulePath();
+    exit(0);
+  }
   /* Notice the -fp flag, but allow it to pass to the dix layer */
   if (!strcmp(argv[i], "-fp"))
   {
@@ -1625,6 +1631,7 @@ ddxUseMsg()
   ErrorF("-ignoreABI             make module ABI mismatches non-fatal\n");
   ErrorF("-isolateDevice bus_id  restrict device resets to bus_id (PCI only)\n");
   ErrorF("-version               show the server version\n");
+  ErrorF("-showDefaultModulePath show the server default module path\n");
   /* OS-specific usage */
   xf86UseMsg();
   ErrorF("\n");
@@ -1748,6 +1755,12 @@ xf86PrintMarkers()
 }
 
 static void
+xf86PrintDefaultModulePath(void)
+{
+  ErrorF("%s\n", DEFAULT_MODULE_PATH);
+}
+
+static void
 xf86RunVtInit(void)
 {
     int i;
diff --git a/hw/xfree86/doc/man/Xorg.man.pre b/hw/xfree86/doc/man/Xorg.man.pre
index b7fa990..5803100 100644
--- a/hw/xfree86/doc/man/Xorg.man.pre
+++ b/hw/xfree86/doc/man/Xorg.man.pre
@@ -426,6 +426,9 @@ Print out the server version, patchlevel
 system/platform it was built on, and whether it includes module loader
 support.
 .TP 8
+.B \-showDefaultModulePath
+Print out the default module path the server was compiled with.
+.TP 8
 .BI \-config " file"
 Read the server configuration from
 .IR file .
diff-tree 61832cb94c8a4d62cddb92188caeed86519e9d62 (from 61863f09d22935406371e92bb75173d55ff9b29f)
Author: Brian <brian at i915.localnet.net>
Date:   Wed Nov 22 09:16:43 2006 -0700

    Regenerated from Mesa w/ latest gl_API.xml file

diff --git a/GL/glx/indirect_dispatch.h b/GL/glx/indirect_dispatch.h
index 9bf74eb..17a372f 100644
--- a/GL/glx/indirect_dispatch.h
+++ b/GL/glx/indirect_dispatch.h
@@ -85,8 +85,6 @@ extern HIDDEN void __glXDisp_EvalCoord2f
 extern HIDDEN void __glXDispSwap_EvalCoord2fv(GLbyte * pc);
 extern HIDDEN int __glXDisp_DestroyPixmap(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_DestroyPixmap(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN void __glXDisp_ProgramEnvParameter4dvARB(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_ProgramEnvParameter4dvARB(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetMapiv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetMapiv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_SwapBuffers(struct __GLXclientStateRec *, GLbyte *);
@@ -123,6 +121,8 @@ extern HIDDEN int __glXDisp_VendorPrivat
 extern HIDDEN int __glXDispSwap_VendorPrivate(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_CreateGLXPixmapWithConfigSGIX(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_CreateGLXPixmapWithConfigSGIX(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN void __glXDisp_VertexAttrib1fvNV(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_VertexAttrib1fvNV(GLbyte * pc);
 extern HIDDEN void __glXDisp_Vertex3iv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Vertex3iv(GLbyte * pc);
 extern HIDDEN void __glXDisp_CopyConvolutionFilter1D(GLbyte * pc);
@@ -279,6 +279,8 @@ extern HIDDEN void __glXDisp_ClearStenci
 extern HIDDEN void __glXDispSwap_ClearStencil(GLbyte * pc);
 extern HIDDEN void __glXDisp_VertexAttrib3dvARB(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_VertexAttrib3dvARB(GLbyte * pc);
+extern HIDDEN void __glXDisp_VertexAttribs4ubvNV(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_VertexAttribs4ubvNV(GLbyte * pc);
 extern HIDDEN void __glXDisp_ConvolutionParameteriv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_ConvolutionParameteriv(GLbyte * pc);
 extern HIDDEN void __glXDisp_RasterPos2fv(GLbyte * pc);
@@ -327,6 +329,8 @@ extern HIDDEN int __glXDisp_GetVertexAtt
 extern HIDDEN int __glXDispSwap_GetVertexAttribdvNV(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_Normal3fv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Normal3fv(GLbyte * pc);
+extern HIDDEN void __glXDisp_ProgramEnvParameter4dvARB(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_ProgramEnvParameter4dvARB(GLbyte * pc);
 extern HIDDEN void __glXDisp_VertexAttrib4ivARB(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_VertexAttrib4ivARB(GLbyte * pc);
 extern HIDDEN void __glXDisp_End(GLbyte * pc);
@@ -457,8 +461,6 @@ extern HIDDEN void __glXDisp_BindFramebu
 extern HIDDEN void __glXDispSwap_BindFramebufferEXT(GLbyte * pc);
 extern HIDDEN void __glXDisp_PushAttrib(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_PushAttrib(GLbyte * pc);
-extern HIDDEN void __glXDisp_VertexAttrib4usvARB(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_VertexAttrib4usvARB(GLbyte * pc);
 extern HIDDEN int __glXDisp_DestroyPbuffer(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_DestroyPbuffer(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_TexParameteriv(GLbyte * pc);
@@ -615,6 +617,8 @@ extern HIDDEN void __glXDisp_PrioritizeT
 extern HIDDEN void __glXDispSwap_PrioritizeTextures(GLbyte * pc);
 extern HIDDEN int __glXDisp_PixelStorei(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_PixelStorei(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN void __glXDisp_VertexAttrib4usvARB(GLbyte * pc);
+extern HIDDEN void __glXDispSwap_VertexAttrib4usvARB(GLbyte * pc);
 extern HIDDEN void __glXDisp_Color4iv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Color4iv(GLbyte * pc);
 extern HIDDEN void __glXDisp_EvalCoord2dv(GLbyte * pc);
@@ -783,8 +787,6 @@ extern HIDDEN void __glXDisp_VertexAttri
 extern HIDDEN void __glXDispSwap_VertexAttribs2fvNV(GLbyte * pc);
 extern HIDDEN void __glXDisp_Rectiv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Rectiv(GLbyte * pc);
-extern HIDDEN void __glXDisp_VertexAttrib1fvNV(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_VertexAttrib1fvNV(GLbyte * pc);
 extern HIDDEN void __glXDisp_SecondaryColor3dvEXT(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_SecondaryColor3dvEXT(GLbyte * pc);
 extern HIDDEN void __glXDisp_Vertex2fv(GLbyte * pc);
@@ -919,8 +921,6 @@ extern HIDDEN void __glXDisp_DrawBuffers
 extern HIDDEN void __glXDispSwap_DrawBuffersARB(GLbyte * pc);
 extern HIDDEN void __glXDisp_LoadName(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_LoadName(GLbyte * pc);
-extern HIDDEN void __glXDisp_VertexAttribs4ubvNV(GLbyte * pc);
-extern HIDDEN void __glXDispSwap_VertexAttribs4ubvNV(GLbyte * pc);
 extern HIDDEN void __glXDisp_CopyTexSubImage1D(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_CopyTexSubImage1D(GLbyte * pc);
 extern HIDDEN void __glXDisp_CullFace(GLbyte * pc);
diff-tree 61863f09d22935406371e92bb75173d55ff9b29f (from 33ff4cec5ff7533ec725f71d357c096dfb0acb79)
Author: Brian <brian at i915.localnet.net>
Date:   Wed Nov 22 09:16:17 2006 -0700

    Regenerated from Mesa, fixes glMap* protocol problem (bug 8899)

diff --git a/GL/glx/indirect_table.c b/GL/glx/indirect_table.c
index a6fd3a3..60d6760 100644
--- a/GL/glx/indirect_table.c
+++ b/GL/glx/indirect_table.c
@@ -645,7 +645,7 @@ static const void *Render_function_table
     /* [ 302] =  4182 */ {__glXDisp_RequestResidentProgramsNV, __glXDispSwap_RequestResidentProgramsNV},
     /* [ 303] =  4183 */ {__glXDisp_LoadProgramNV, __glXDispSwap_LoadProgramNV},
     /* [ 304] =  4184 */ {__glXDisp_ProgramParameter4fvNV, __glXDispSwap_ProgramParameter4fvNV},
-    /* [ 305] =  4185 */ {__glXDisp_ProgramParameter4dvNV, __glXDispSwap_ProgramParameter4dvNV},
+    /* [ 305] =  4185 */ {__glXDisp_ProgramEnvParameter4dvARB, __glXDispSwap_ProgramEnvParameter4dvARB},
     /* [ 306] =  4186 */ {__glXDisp_ProgramParameters4fvNV, __glXDispSwap_ProgramParameters4fvNV},
     /* [ 307] =  4187 */ {__glXDisp_ProgramParameters4dvNV, __glXDispSwap_ProgramParameters4dvNV},
     /* [ 308] =  4188 */ {__glXDisp_TrackMatrixNV, __glXDispSwap_TrackMatrixNV},
@@ -886,10 +886,10 @@ static const int_fast16_t Render_size_ta
     /* [140] =   140 */ {  0, ~0},
     /* [141] =   141 */ {  4, ~0},
     /* [142] =   142 */ {  8, ~0},
-    /* [143] =   143 */ { 40, 20},
-    /* [144] =   144 */ { 28, 21},
-    /* [145] =   145 */ { 64, 22},
-    /* [146] =   146 */ { 44, 23},
+    /* [143] =   143 */ { 28, 20},
+    /* [144] =   144 */ { 20, 21},
+    /* [145] =   145 */ { 48, 22},
+    /* [146] =   146 */ { 32, 23},
     /* [147] =   147 */ { 24, ~0},
     /* [148] =   148 */ { 16, ~0},
     /* [149] =   149 */ { 44, ~0},
diff-tree 33ff4cec5ff7533ec725f71d357c096dfb0acb79 (from ca2874b273232d9f51881b1cd754ed6847bfaf47)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Tue Nov 21 21:23:17 2006 +0000

    Issue CloseDownDevices() in os/log.c and remove from dix/main.c.
    
    This ensures that all calls to FatalError() will shutdown the input devices.

diff --git a/dix/main.c b/dix/main.c
index bee5490..077fdea 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -415,7 +415,6 @@ main(int argc, char *argv[], char *envp[
 			defaultFontPath);
 	}
 	if (!SetDefaultFont(defaultTextFont)) {
-	    CloseDownDevices();
 	    FatalError("could not open default font '%s'", defaultTextFont);
 	}
 #ifdef NULL_ROOT_CURSOR
@@ -425,13 +424,11 @@ main(int argc, char *argv[], char *envp[
         cm.yhot = 0;
 
         if (!(rootCursor = AllocCursor(NULL, NULL, &cm, 0, 0, 0, 0, 0, 0))) {
-	    CloseDownDevices();
             FatalError("could not create empty root cursor");
 	}
         AddResource(FakeClientID(0), RT_CURSOR, (pointer)rootCursor);
 #else
 	if (!(rootCursor = CreateRootCursor(defaultCursorFont, 0))) {
-	    CloseDownDevices();
 	    FatalError("could not open default cursor font '%s'",
 		       defaultCursorFont);
 	}
@@ -459,14 +456,12 @@ main(int argc, char *argv[], char *envp[
 #ifdef PANORAMIX
 	if (!noPanoramiXExtension) {
 	    if (!PanoramiXCreateConnectionBlock()) {
-	    	CloseDownDevices();
 		FatalError("could not create connection block info");
 	    }
 	} else
 #endif
 	{
 	    if (!CreateConnectionBlock()) {
-	    	CloseDownDevices();
 	    	FatalError("could not create connection block info");
 	    }
 	}
diff --git a/os/log.c b/os/log.c
index 05e542f..b1d628c 100644
--- a/os/log.c
+++ b/os/log.c
@@ -89,6 +89,7 @@ OR PERFORMANCE OF THIS SOFTWARE.
 #include <stdlib.h>	/* for malloc() */
 #include <errno.h>
 
+#include "input.h"
 #include "site.h"
 #include "opaque.h"
 
@@ -404,6 +405,7 @@ void
 AbortServer(void)
 {
     OsCleanup(TRUE);
+    CloseDownDevices();
     AbortDDX();
     fflush(stderr);
     if (CoreDump)
diff-tree ca2874b273232d9f51881b1cd754ed6847bfaf47 (from parents)
Merge: c9a5f9d3911c2e6a8f81b0721c9eb914fb7719b5 e2f6dacc736527790ed8e304698678afc17f71c6
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Sat Nov 18 19:56:32 2006 +0000

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver

diff-tree c9a5f9d3911c2e6a8f81b0721c9eb914fb7719b5 (from acb5ff4c73ac4d52201d7c421f488e2ead5c8b9c)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Sat Nov 18 19:55:42 2006 +0000

    Shutdown input devices if FatalError occurs during startup.
    Fixes Xdmx problems when the input device has been initialized
    and the keyboard map has been destroyed.

diff --git a/dix/main.c b/dix/main.c
index 88d7755..bee5490 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -414,21 +414,27 @@ main(int argc, char *argv[], char *envp[
 		ErrorF("failed to set default font path '%s'",
 			defaultFontPath);
 	}
-	if (!SetDefaultFont(defaultTextFont))
+	if (!SetDefaultFont(defaultTextFont)) {
+	    CloseDownDevices();
 	    FatalError("could not open default font '%s'", defaultTextFont);
+	}
 #ifdef NULL_ROOT_CURSOR
         cm.width = 0;
         cm.height = 0;
         cm.xhot = 0;
         cm.yhot = 0;
 
-        if (!(rootCursor = AllocCursor(NULL, NULL, &cm, 0, 0, 0, 0, 0, 0)))
+        if (!(rootCursor = AllocCursor(NULL, NULL, &cm, 0, 0, 0, 0, 0, 0))) {
+	    CloseDownDevices();
             FatalError("could not create empty root cursor");
+	}
         AddResource(FakeClientID(0), RT_CURSOR, (pointer)rootCursor);
 #else
-	if (!(rootCursor = CreateRootCursor(defaultCursorFont, 0)))
+	if (!(rootCursor = CreateRootCursor(defaultCursorFont, 0))) {
+	    CloseDownDevices();
 	    FatalError("could not open default cursor font '%s'",
 		       defaultCursorFont);
+	}
 #endif
 #ifdef DPMSExtension
  	/* check all screens, looking for DPMS Capabilities */
@@ -452,13 +458,17 @@ main(int argc, char *argv[], char *envp[
 
 #ifdef PANORAMIX
 	if (!noPanoramiXExtension) {
-	    if (!PanoramiXCreateConnectionBlock())
+	    if (!PanoramiXCreateConnectionBlock()) {
+	    	CloseDownDevices();
 		FatalError("could not create connection block info");
+	    }
 	} else
 #endif
 	{
-	    if (!CreateConnectionBlock())
+	    if (!CreateConnectionBlock()) {
+	    	CloseDownDevices();
 	    	FatalError("could not create connection block info");
+	    }
 	}
 
 	Dispatch();
diff-tree e2f6dacc736527790ed8e304698678afc17f71c6 (from f17e3c34dfd1f1418440bdebf45764e4dbf550f0)
Author: Dave Airlie <airlied at linux.ie>
Date:   Sat Nov 18 11:26:55 2006 +1100

    dri: setup libdrm hooks as early as possible.
    
    This is due to radeon doing drm stuff before DRI extension gets initialised

diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
index a49c632..5337f9a 100644
--- a/hw/xfree86/dri/dri.c
+++ b/hw/xfree86/dri/dri.c
@@ -84,7 +84,7 @@ static RESTYPE DRIDrawablePrivResType;
 static RESTYPE DRIContextPrivResType;
 static void    DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv);
 
-static drmServerInfo DRIDRMServerInfo;
+drmServerInfo DRIDRMServerInfo;
 
 				/* Wrapper just like xf86DrvMsg, but
 				   without the verbosity level checking.
@@ -176,8 +176,6 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfo
     else
 	openbusid = NULL;
 
-    drmSetServerInfo(&DRIDRMServerInfo);
-
     /* Note that drmOpen will try to load the kernel module, if needed. */
     fd = drmOpen(pDRIInfo->drmDriverName, openbusid);
     if (fd < 0) {
@@ -593,7 +591,7 @@ static void dri_drm_get_perms(gid_t *gro
   *mode = xf86ConfigDRI.mode;
 }
 
-static drmServerInfo DRIDRMServerInfo =  {
+drmServerInfo DRIDRMServerInfo =  {
   dri_drm_debug_print,
   xf86LoadKernelModule,
   dri_drm_get_perms,
diff --git a/hw/xfree86/dri/drimodule.c b/hw/xfree86/dri/drimodule.c
index b39c22e..0e3d84e 100644
--- a/hw/xfree86/dri/drimodule.c
+++ b/hw/xfree86/dri/drimodule.c
@@ -39,8 +39,11 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 #include "xf86Module.h"
 #include "globals.h"
 
+#include "xf86drm.h"
 static MODULESETUPPROTO(driSetup);
 
+drmServerInfo DRIDRMServerInfo;
+
 static XF86ModuleVersionInfo VersRec =
 {
         "dri",
@@ -81,6 +84,9 @@ driSetup(pointer module, pointer opts, i
     } else {
 	if (errmaj) *errmaj = LDR_ONCEONLY;
     }
+
+    drmSetServerInfo(&DRIDRMServerInfo);
+
     /* Need a non-NULL return value to indicate success */
     return 1;
 }
diff-tree ef47d9c3ba63e9a6243fe5c81ccc60c8246352b4 (from 07b26e690cd9a4fc626132feed0702515cbe5a88)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Thu Nov 16 13:50:48 2006 -0800

    Reduce calls to RRGetInfo.
    
    RRGetInfo can be expensive. Don't invoke it when quering Xinerama
    information or setting a new CRTC configuration.
    (cherry picked from commit b5aa9eb8e6eda36856a075f4b008c33f6c706bad)

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index c945468..b81c390 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -632,13 +632,6 @@ ProcRRSetCrtcConfig (ClientPtr client)
     pScreen = crtc->pScreen;
     pScrPriv = rrGetScrPriv(pScreen);
     
-    if (!RRGetInfo (pScreen))
-    {
-	if (outputs)
-	    xfree (outputs);
-	return BadAlloc;
-    }
-    
     time = ClientTimeToServerTime(stuff->timestamp);
     configTime = ClientTimeToServerTime(stuff->configTimestamp);
     
diff --git a/randr/rrxinerama.c b/randr/rrxinerama.c
index a8e4b39..771ed09 100644
--- a/randr/rrxinerama.c
+++ b/randr/rrxinerama.c
@@ -260,7 +260,11 @@ ProcRRXineramaQueryScreens(ClientPtr cli
     REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
 
     if (RRXineramaScreenActive (pScreen))
-	RRGetInfo (pScreen);
+    {
+	rrScrPriv(pScreen);
+	if (pScrPriv->numCrtcs == 0 || pScrPriv->numOutputs == 0)
+	    RRGetInfo (pScreen);
+    }
     
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
diff-tree 07b26e690cd9a4fc626132feed0702515cbe5a88 (from 6ff7f2ad6a5e2e769244590578e6809974b5235d)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Thu Nov 16 09:48:33 2006 -0800

    Remove RandR output options.
    
    RandR output options are now expected to be handled by properties instead.
    (cherry picked from commit 8b2a7e94a1dc2776ab2cfaaebb309be02502602a)

diff --git a/randr/mirandr.c b/randr/mirandr.c
index 3f56fe4..3a99bf9 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -52,7 +52,7 @@ miRRCrtcSet (ScreenPtr	pScreen,
 	     int	y,
 	     Rotation	rotation,
 	     int	numOutput,
-	     RROutputConfigPtr    outputs)
+	     RROutputPtr *outputs)
 {
     return TRUE;
 }
@@ -137,10 +137,6 @@ miRandRInit (ScreenPtr pScreen)
 	return FALSE;
     if (!RROutputSetCrtcs (output, &crtc, 1))
 	return FALSE;
-    if (!RROutputSetPossibleOptions (output, 0))
-	return FALSE;
-    if (!RROutputSetCurrentOptions (output, 0))
-	return FALSE;
     if (!RROutputSetConnection (output, RR_Connected))
 	return FALSE;
     RRCrtcNotify (crtc, mode, 0, 0, RR_Rotate_0, 1, &output);
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 2c3e0e7..19af9b9 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -72,7 +72,6 @@ extern int (*SProcRandrVector[RRNumberRe
 typedef struct _rrMode	    RRModeRec, *RRModePtr;
 typedef struct _rrCrtc	    RRCrtcRec, *RRCrtcPtr;
 typedef struct _rrOutput    RROutputRec, *RROutputPtr;
-typedef struct _rrOutputConfig	RROutputConfigRec, *RROutputConfigPtr;
 
 struct _rrMode {
     int		    refcnt;
@@ -109,8 +108,6 @@ struct _rrOutput {
     int		    mmWidth;
     int		    mmHeight;
     RRCrtcPtr	    crtc;
-    CARD32	    currentOptions;
-    CARD32	    possibleOptions;
     int		    numCrtcs;
     RRCrtcPtr	    *crtcs;
     int		    numClones;
@@ -123,11 +120,6 @@ struct _rrOutput {
     void	    *devPrivate;
 };
 
-struct _rrOutputConfig {
-    RROutputPtr	    output;
-    CARD32	    options;
-};
-
 #if RANDR_12_INTERFACE
 typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr	pScreen,
 					CARD16		width,
@@ -142,7 +134,7 @@ typedef Bool (*RRCrtcSetProcPtr) (Screen
 				  int			y,
 				  Rotation		rotation,
 				  int			numOutputs,
-				  RROutputConfigPtr	outputs);
+				  RROutputPtr		*outputs);
 
 typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr	pScreen,
 				       RRCrtcPtr	crtc);
@@ -369,7 +361,7 @@ miRRCrtcSet (ScreenPtr	pScreen,
 	     int	y,
 	     Rotation	rotation,
 	     int	numOutput,
-	     RROutputConfigPtr    outputs);
+	     RROutputPtr *outputs);
 
 /* randr.c */
 /*
@@ -490,7 +482,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	   int		y,
 	   Rotation	rotation,
 	   int		numOutput,
-	   RROutputConfigPtr  outputs);
+	   RROutputPtr  *outputs);
 
 /*
  * Request that the Crtc gamma be changed
@@ -641,10 +633,6 @@ RROutputSetCrtcs (RROutputPtr	output,
 		  RRCrtcPtr	*crtcs,
 		  int		numCrtcs);
 
-Bool
-RROutputSetPossibleOptions (RROutputPtr	output,
-			    CARD32	possibleOptions);
-
 void
 RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc);
     
@@ -657,10 +645,6 @@ RROutputSetSubpixelOrder (RROutputPtr ou
 			  int	      subpixelOrder);
 
 Bool
-RROutputSetCurrentOptions (RROutputPtr output,
-			   CARD32      currentOptions);
-
-Bool
 RROutputSetPhysicalSize (RROutputPtr	output,
 			 int		mmWidth,
 			 int		mmHeight);
@@ -739,8 +723,6 @@ Query state:
 		RRScreenSetSizeRange
 		RROutputSetCrtcs
 		RROutputSetCrtc
-		RROutputSetPossibleOptions
-		RRSetCurrentOptions
 		RRModeGet
 		RROutputSetModes
 		RROutputSetConnection
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 9f7177a..c945468 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -257,7 +257,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	   int		y,
 	   Rotation	rotation,
 	   int		numOutputs,
-	   RROutputConfigPtr  outputs)
+	   RROutputPtr  *outputs)
 {
     ScreenPtr	pScreen = crtc->pScreen;
 
@@ -290,10 +290,10 @@ RRCrtcSet (RRCrtcPtr    crtc,
 
 	    size.width = mode->mode.width;
 	    size.height = mode->mode.height;
-	    if (outputs[0].output->mmWidth && outputs[0].output->mmHeight)
+	    if (outputs[0]->mmWidth && outputs[0]->mmHeight)
 	    {
-		size.mmWidth = outputs[0].output->mmWidth;
-		size.mmHeight = outputs[0].output->mmHeight;
+		size.mmWidth = outputs[0]->mmWidth;
+		size.mmHeight = outputs[0]->mmHeight;
 	    }
 	    else
 	    {
@@ -308,7 +308,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	     * Old 1.0 interface tied screen size to mode size
 	     */
 	    if (ret)
-		RRCrtcNotify (crtc, mode, x, y, rotation, 1, &outputs[0].output);
+		RRCrtcNotify (crtc, mode, x, y, rotation, 1, outputs);
 	    return ret;
 	}
 #endif
@@ -554,15 +554,15 @@ ProcRRSetCrtcConfig (ClientPtr client)
     RRCrtcPtr		    crtc;
     RRModePtr		    mode;
     int			    numOutputs;
-    RROutputConfigPtr	    outputs = NULL;
-    xRROutputConfig 	    *outputConfigs;
+    RROutputPtr		    *outputs = NULL;
+    RROutput		    *outputIds;
     TimeStamp		    configTime;
     TimeStamp		    time;
     Rotation		    rotation;
     int			    i, j;
     
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
-    numOutputs = (stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2)) >> 1;
+    numOutputs = (stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2));
     
     crtc = LookupIDByType (stuff->crtc, RRCrtcType);
     if (!crtc)
@@ -589,47 +589,39 @@ ProcRRSetCrtcConfig (ClientPtr client)
     }
     if (numOutputs)
     {
-	outputs = xalloc (numOutputs * sizeof (RROutputConfigRec));
+	outputs = xalloc (numOutputs * sizeof (RROutputPtr));
 	if (!outputs)
 	    return BadAlloc;
     }
     else
 	outputs = NULL;
     
-    outputConfigs = (xRROutputConfig *) (stuff + 1);
+    outputIds = (RROutput *) (stuff + 1);
     for (i = 0; i < numOutputs; i++)
     {
-	outputs[i].output = LookupIDByType (outputConfigs[i].output, RROutputType);
-	if (!outputs[i].output)
+	outputs[i] = (RROutputPtr) LookupIDByType (outputIds[i], RROutputType);
+	if (!outputs[i])
 	{
-	    client->errorValue = outputConfigs[i].output;
+	    client->errorValue = outputIds[i];
 	    if (outputs)
 		xfree (outputs);
 	    return RRErrorBase + BadRROutput;
 	}
-	outputs[i].options = outputConfigs[i].options;
-	if (outputs[i].options & ~outputs[i].output->possibleOptions)
-	{
-	    client->errorValue = outputConfigs[i].options;
-	    if (outputs)
-		xfree (outputs);
-	    return BadMatch;
-	}
 	/* validate crtc for this output */
-	for (j = 0; j < outputs[i].output->numCrtcs; j++)
-	    if (outputs[i].output->crtcs[j] == crtc)
+	for (j = 0; j < outputs[i]->numCrtcs; j++)
+	    if (outputs[i]->crtcs[j] == crtc)
 		break;
-	if (j == outputs[i].output->numCrtcs)
+	if (j == outputs[i]->numCrtcs)
 	{
 	    if (outputs)
 		xfree (outputs);
 	    return BadMatch;
 	}
 	/* validate mode for this output */
-	for (j = 0; j < outputs[i].output->numModes; j++)
-	    if (outputs[i].output->modes[j] == mode)
+	for (j = 0; j < outputs[i]->numModes; j++)
+	    if (outputs[i]->modes[j] == mode)
 		break;
-	if (j == outputs[i].output->numModes)
+	if (j == outputs[i]->numModes)
 	{
 	    if (outputs)
 		xfree (outputs);
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 102587b..8b760ec 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -65,8 +65,6 @@ RROutputCreate (const char  *name,
     output->mmWidth = 0;
     output->mmHeight = 0;
     output->crtc = NULL;
-    output->currentOptions = 0;
-    output->possibleOptions = 0;
     output->numCrtcs = 0;
     output->crtcs = NULL;
     output->numClones = 0;
@@ -223,17 +221,6 @@ RROutputSetCrtcs (RROutputPtr	output,
     return TRUE;
 }
 
-Bool
-RROutputSetPossibleOptions (RROutputPtr	output,
-			    CARD32	possibleOptions)
-{
-    if (output->possibleOptions == possibleOptions)
-	return TRUE;
-    output->possibleOptions = possibleOptions;
-    RROutputChanged (output);
-    return TRUE;
-}
-
 void
 RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc)
 {
@@ -267,17 +254,6 @@ RROutputSetSubpixelOrder (RROutputPtr ou
 }
 
 Bool
-RROutputSetCurrentOptions (RROutputPtr output,
-			   CARD32      currentOptions)
-{
-    if (output->currentOptions == currentOptions)
-	return TRUE;
-    output->currentOptions = currentOptions;
-    RROutputChanged (output);
-    return TRUE;
-}
-
-Bool
 RROutputSetPhysicalSize (RROutputPtr	output,
 			 int		mmWidth,
 			 int		mmHeight)
@@ -413,7 +389,6 @@ ProcRRGetOutputInfo (ClientPtr client)
     rep.length = OutputInfoExtra >> 2;
     rep.timestamp = pScrPriv->lastSetTime.milliseconds;
     rep.crtc = output->crtc ? output->crtc->id : None;
-    rep.currentOptions = output->currentOptions;
     rep.mmWidth = output->mmWidth;
     rep.mmHeight = output->mmHeight;
     rep.connection = output->connection;
@@ -423,7 +398,6 @@ ProcRRGetOutputInfo (ClientPtr client)
     rep.nPreferred = output->numPreferred;
     rep.nClones = output->numClones;
     rep.nameLength = output->nameLength;
-    rep.possibleOptions = output->possibleOptions;
     
     extraLen = ((output->numCrtcs + 
 		 output->numModes + 
@@ -469,15 +443,12 @@ ProcRRGetOutputInfo (ClientPtr client)
 	swapl(&rep.length, n);
 	swapl(&rep.timestamp, n);
 	swapl(&rep.crtc, n);
-	swapl(&rep.currentOptions, n);
 	swapl(&rep.mmWidth, n);
 	swapl(&rep.mmHeight, n);
 	swaps(&rep.nCrtcs, n);
 	swaps(&rep.nModes, n);
 	swaps(&rep.nClones, n);
-	swapl(&rep.possibleOptions, n);
 	swaps(&rep.nameLength, n);
-	swapl(&rep.possibleOptions, n);
     }
     WriteToClient(client, sizeof(xRRGetOutputInfoReply), (char *)&rep);
     if (extraLen)
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index d47e9d6..76c16b0 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -712,7 +712,7 @@ ProcRRSetScreenConfig (ClientPtr client)
     Rotation		    rotation;
     int			    rate;
     Bool		    has_rate;
-    RROutputConfigRec	    output;
+    RROutputPtr		    output;
     RRModePtr		    mode;
     RR10DataPtr		    pData = NULL;
     RRScreenSizePtr    	    pSize;
@@ -749,14 +749,13 @@ ProcRRSetScreenConfig (ClientPtr client)
     if (!RRGetInfo (pScreen))
 	return BadAlloc;
     
-    output.output = RRFirstOutput (pScreen);
-    if (!output.output)
+    output = RRFirstOutput (pScreen);
+    if (!output)
     {
 	time = currentTime;
 	rep.status = RRSetConfigFailed;
 	goto sendReply;
     }
-    output.options = output.output->currentOptions;
     
     /*
      * if the client's config timestamp is not the same as the last config
@@ -769,7 +768,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	goto sendReply;
     }
     
-    pData = RR10GetData (pScreen, output.output);
+    pData = RR10GetData (pScreen, output);
     if (!pData)
 	return BadAlloc;
     
@@ -805,7 +804,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	return BadValue;
     }
 
-    if ((~output.output->crtc->rotations) & rotation)
+    if ((~output->crtc->rotations) & rotation)
     {
 	/*
 	 * requested rotation or reflection not supported by screen
@@ -878,7 +877,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	}
     }
     
-    rep.status = RRCrtcSet (output.output->crtc, mode, 0, 0, stuff->rotation,
+    rep.status = RRCrtcSet (output->crtc, mode, 0, 0, stuff->rotation,
 			    1, &output);
     
     /*
diff-tree f17e3c34dfd1f1418440bdebf45764e4dbf550f0 (from ae3c9ad4abe66784d7ee474455003d2745699286)
Author: George Sapountzis <gsap7 at yahoo.gr>
Date:   Thu Nov 16 02:18:03 2006 +0200

    Fix GL context destruction with AIGLX.
    
    The logic for freeing GL contexts introduced by "Fix AIGLX VT switching." is
    inverted. As it is now, GL context destruction is deferred for glxDRIEnterVT().

diff --git a/GL/glx/glxext.c b/GL/glx/glxext.c
index 11fb7fc..1f6c7f3 100644
--- a/GL/glx/glxext.c
+++ b/GL/glx/glxext.c
@@ -237,7 +237,7 @@ GLboolean __glXFreeContext(__GLXcontext 
      * __glXDispatch() or as a callback from the resource manager.  In
      * the latter case we need to lift the DRI lock manually. */
 
-    if (glxBlockClients) {
+    if (!glxBlockClients) {
 	__glXleaveServer();
 	cx->destroy(cx);
 	__glXenterServer();
diff-tree ae3c9ad4abe66784d7ee474455003d2745699286 (from 2eab230d9bd3f73ffe1b5a42111f89e85904ee11)
Author: Bjorn Helgaas <bjorn.helgaas at hp.com>
Date:   Thu Nov 16 17:29:06 2006 +0100

    Bug 9041: Check the return code in xf86MapDomainMemory().

diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c
index 15fc2b8..03388f1 100644
--- a/hw/xfree86/os-support/bus/linuxPci.c
+++ b/hw/xfree86/os-support/bus/linuxPci.c
@@ -683,28 +683,28 @@ xf86MapDomainMemory(int ScreenNum, int F
 		    ADDRESS Base, unsigned long Size)
 {
     int domain = xf86GetPciDomain(Tag);
-    int fd;
+    int fd = -1;
     pointer addr;
 
     /*
      * We use /proc/bus/pci on non-legacy addresses or if the Linux sysfs
      * legacy_mem interface is unavailable.
      */
-    if (Base > 1024*1024)
-	return linuxMapPci(ScreenNum, Flags, Tag, Base, Size,
+    if (Base >= 1024*1024)
+	addr = linuxMapPci(ScreenNum, Flags, Tag, Base, Size,
 			   PCIIOC_MMAP_IS_MEM);
-
-    if ((fd = linuxOpenLegacy(Tag, "legacy_mem")) < 0)
-	return linuxMapPci(ScreenNum, Flags, Tag, Base, Size,
+    else if ((fd = linuxOpenLegacy(Tag, "legacy_mem")) < 0)
+	addr = linuxMapPci(ScreenNum, Flags, Tag, Base, Size,
 			   PCIIOC_MMAP_IS_MEM);
+    else
+	addr = mmap(NULL, Size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, Base);
 
-    addr = mmap(NULL, Size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, Base);
-    if (addr == MAP_FAILED) {
-	close (fd);
+    if (fd >= 0)
+	close(fd);
+    if (addr == NULL || addr == MAP_FAILED) {
 	perror("mmap failure");
 	FatalError("xf86MapDomainMem():  mmap() failure\n");
     }
-    close(fd);
     return addr;
 }
 
diff-tree 6ff7f2ad6a5e2e769244590578e6809974b5235d (from 0dee48b8af3e054228aef0d15c1cb1c9e23790cc)
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Nov 7 13:13:53 2006 -0800

    Fix build on FreeBSD after input-hotplug.
    (cherry picked from commit 4e6e4baead6c565363abbcd9e06cc685be121596)

diff --git a/hw/xfree86/os-support/bsd/bsd_bell.c b/hw/xfree86/os-support/bsd/bsd_bell.c
index 60c2ffc..b7a0c48 100644
--- a/hw/xfree86/os-support/bsd/bsd_bell.c
+++ b/hw/xfree86/os-support/bsd/bsd_bell.c
@@ -27,10 +27,15 @@
 #include <xorg-config.h>
 #endif
 
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+#include <sys/kbio.h>
+#endif
+
 #include <termios.h>
 
 #include "xf86.h"
 #include "xf86Priv.h"
+#include "xf86_OSlib.h"
 
 #ifdef WSCONS_SUPPORT
 #define KBD_FD(i) ((i).kbdFd != -1 ? (i).kbdFd : (i).consoleFd)
diff-tree 2eab230d9bd3f73ffe1b5a42111f89e85904ee11 (from 26d2e45bdb0cf4d18ba7b0365425da49d60b3d5c)
Author: Jeremy C. Reed <reed at glacier.reedmedia.net>
Date:   Tue Nov 14 16:37:18 2006 -0600

    For NetBSD, define PCVT_SUPPORT (System has PCVT console).
    
    Noticed by Joerg Sonnenberger.  This fixes problem with console
    switching.
    
    This was in original imake NetBSD.cf.

diff --git a/configure.ac b/configure.ac
index 048712e..2108db4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -282,6 +282,7 @@ case $host_os in
   *netbsd*)
 	AC_DEFINE(CSRG_BASED, 1, [System is BSD-like])
 	AC_DEFINE(PCCONS_SUPPORT, 1, [System has PC console])
+	AC_DEFINE(PCVT_SUPPORT, 1, [System has PCVT console])
 	AC_DEFINE(WSCONS_SUPPORT, 1, [System has wscons console])
 	DRI=yes
 	;;
diff-tree 26d2e45bdb0cf4d18ba7b0365425da49d60b3d5c (from a724b7f1302ba7a59f140b521f13d2ddf0fcf9bf)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Tue Nov 14 15:33:07 2006 +0100

    Bug #9023: Only check mice for "mouse" or "void" if identifier is != NULL.

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index ffdca12..c0e21dd 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1307,7 +1307,7 @@ checkCoreInputDevices(serverLayoutPtr se
      * events, unless a 'void' section is found, in which case the user
      * probably wants to run footless.
      */
-    for (i = servlayoutp->inputs; i->driver; i++) {
+    for (i = servlayoutp->inputs; i->identifier && i->driver; i++) {
 	if (!strcmp(i->driver, "void") || !strcmp(i->driver, "mouse")) {
 	    found = 1; break;
 	}
diff-tree a724b7f1302ba7a59f140b521f13d2ddf0fcf9bf (from parents)
Merge: 6facd958c2e7098cb68eac2810a88b8cd40f19c0 f80a8ae6e6820378ea70ac0849cee8bf3055e0e8
Author: Jeremy C. Reed <reed at glacier.reedmedia.net>
Date:   Mon Nov 13 20:32:26 2006 -0600

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver

diff-tree 6facd958c2e7098cb68eac2810a88b8cd40f19c0 (from 8382234a7f318057de66490299d63807cefb5201)
Author: Jeremy C. Reed <reed at glacier.reedmedia.net>
Date:   Mon Nov 13 20:23:06 2006 -0600

    On DragonFLy, default to /dev/sysmouse (just like on FreeBSD).
    
    TODO: use autoconf to handle this so the code is not platform
    based but feature based.

diff --git a/hw/xfree86/utils/xorgcfg/text-mode.c b/hw/xfree86/utils/xorgcfg/text-mode.c
index 10f4b69..0430a54 100644
--- a/hw/xfree86/utils/xorgcfg/text-mode.c
+++ b/hw/xfree86/utils/xorgcfg/text-mode.c
@@ -551,7 +551,7 @@ MouseConfig(void)
     if (str == NULL)
 #ifdef WSCONS_SUPPORT
 	str = "/dev/wsmouse";
-#elif defined(__FreeBSD__)
+#elif defined(__FreeBSD__) || defined(__DragonFly__)
 	str = "/dev/sysmouse";
 #elif defined(__UNIXOS2__)
 	str = "mouse$";
diff --git a/hw/xfree86/utils/xorgconfig/xorgconfig.c b/hw/xfree86/utils/xorgconfig/xorgconfig.c
index f00eea0..091b2db 100644
--- a/hw/xfree86/utils/xorgconfig/xorgconfig.c
+++ b/hw/xfree86/utils/xorgconfig/xorgconfig.c
@@ -490,7 +490,7 @@ struct {
 
 #ifdef WSCONS_SUPPORT
 # define DEF_MOUSEDEV "/dev/wsmouse";
-#elif defined(__FreeBSD__)
+#elif defined(__FreeBSD__) || defined(__DragonFly__)
 # define DEF_MOUSEDEV "/dev/sysmouse";
 #elif defined(__linux__)
 # define DEF_MOUSEDEV "/dev/input/mice";
diff-tree f80a8ae6e6820378ea70ac0849cee8bf3055e0e8 (from 5bfe7f4dfc6ab51b6790d74faf11574385234423)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Mon Nov 13 18:26:05 2006 -0500

    Disable Xprt server build by default.

diff --git a/configure.ac b/configure.ac
index 103b087..048712e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -462,7 +462,7 @@ AC_ARG_ENABLE(dmx,    	      AS_HELP_STR
 AC_ARG_ENABLE(xvfb,    	      AS_HELP_STRING([--enable-xvfb], [Build Xvfb server (default: yes)]), [XVFB=$enableval], [XVFB=yes])
 AC_ARG_ENABLE(xnest,   	      AS_HELP_STRING([--enable-xnest], [Build Xnest server (default: auto)]), [XNEST=$enableval], [XNEST=auto])
 AC_ARG_ENABLE(xwin,    	      AS_HELP_STRING([--enable-xwin], [Build XWin server (default: auto)]), [XWIN=$enableval], [XWIN=auto])
-AC_ARG_ENABLE(xprint,         AS_HELP_STRING([--enable-xprint], [Build Xprint extension and server (default: auto)]), [XPRINT=$enableval], [XPRINT=auto])
+AC_ARG_ENABLE(xprint,         AS_HELP_STRING([--enable-xprint], [Build Xprint extension and server (default: no)]), [XPRINT=$enableval], [XPRINT=no])
 AC_ARG_ENABLE(xgl,            AS_HELP_STRING([--enable-xgl], [Build Xgl server (default: no)]), [XGL=$enableval], [XGL=no])
 AC_ARG_ENABLE(xglx,           AS_HELP_STRING([--enable-xglx], [Build Xglx xgl module (default: no)]), [XGLX=$enableval], [XGLX=no])
 AC_ARG_ENABLE(xegl,           AS_HELP_STRING([--enable-xegl], [Build Xegl xgl module (default: no)]), [XEGL=$enableval], [XEGL=no])
diff-tree 5bfe7f4dfc6ab51b6790d74faf11574385234423 (from acb5ff4c73ac4d52201d7c421f488e2ead5c8b9c)
Author: George Sapountzis <gsap7 at yahoo.gr>
Date:   Mon Nov 13 01:54:32 2006 +0200

    DRI: call drmSetServerInfo() before drmOpen().
    
    Also, remove some libdrm remnants.

diff --git a/configure.ac b/configure.ac
index 0977ee3..103b087 100644
--- a/configure.ac
+++ b/configure.ac
@@ -49,8 +49,6 @@ dnl xwin-config.h covers the XWin DDX.
 AC_CONFIG_HEADERS(include/xwin-config.h)
 dnl kdrive-config.h covers the kdrive DDX
 AC_CONFIG_HEADERS(include/kdrive-config.h)
-dnl libdrm now needs 64-bit file offsets
-AC_CONFIG_HEADERS(include/libdrm-config.h)
 
 AC_PROG_CC
 AM_PROG_AS
diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
index fbb24e4..a49c632 100644
--- a/hw/xfree86/dri/dri.c
+++ b/hw/xfree86/dri/dri.c
@@ -84,6 +84,8 @@ static RESTYPE DRIDrawablePrivResType;
 static RESTYPE DRIContextPrivResType;
 static void    DRIDestroyDummyContext(ScreenPtr pScreen, Bool hasCtxPriv);
 
+static drmServerInfo DRIDRMServerInfo;
+
 				/* Wrapper just like xf86DrvMsg, but
 				   without the verbosity level checking.
 				   This will make it easy to turn off some
@@ -174,6 +176,8 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfo
     else
 	openbusid = NULL;
 
+    drmSetServerInfo(&DRIDRMServerInfo);
+
     /* Note that drmOpen will try to load the kernel module, if needed. */
     fd = drmOpen(pDRIInfo->drmDriverName, openbusid);
     if (fd < 0) {
@@ -622,8 +626,6 @@ DRIExtensionInit(void)
 	    return FALSE;
     }
 
-    drmSetServerInfo(&DRIDRMServerInfo);
-
     RegisterBlockAndWakeupHandlers(DRIBlockHandler, DRIWakeupHandler, NULL);
 
     return TRUE;
diff --git a/hw/xfree86/os-support/xf86drmCompat.h b/hw/xfree86/os-support/xf86drmCompat.h
deleted file mode 100644
index 8ac6ee4..0000000
--- a/hw/xfree86/os-support/xf86drmCompat.h
+++ /dev/null
@@ -1,258 +0,0 @@
-/* xf86drmCompat.h -- OS-independent header for old device specific DRM user-level
- *                    library interface
- *
- * Copyright 2000 VA Linux Systems, Inc., Fremont, California.
- * Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *   Gareth Hughes <gareth at valinux.com>
- *   Kevin E. Martin <martin at valinux.com>
- *   Keith Whitwell <keith at tungstengraphics.com>
- *
- * Backwards compatability modules broken out by:
- *   Jens Owen <jens at tungstengraphics.com>
- *
- *
- */
-
-#ifndef _XF86DRI_COMPAT_H_
-#define _XF86DRI_COMPAT_H_
-
-/* WARNING: Do not change, or add, anything to this file.  It is only provided
- * for binary backwards compatability with the old driver specific DRM 
- * extensions used before XFree86 4.3.
- */
-
-#ifndef __user
-#define __user
-#endif
-
-/* I810 */
-
-typedef struct {
-   unsigned int start; 
-   unsigned int end; 
-   unsigned int size;
-   unsigned int mmio_offset;
-   unsigned int buffers_offset;
-   int sarea_off;
-
-   unsigned int front_offset;
-   unsigned int back_offset;
-   unsigned int depth_offset;
-   unsigned int overlay_offset;
-   unsigned int overlay_physical;
-   unsigned int w;
-   unsigned int h;
-   unsigned int pitch;
-   unsigned int pitch_bits;
-} drmCompatI810Init;
-
-extern Bool drmI810CleanupDma(int driSubFD);
-extern Bool drmI810InitDma(int driSubFD, drmCompatI810Init *info );
-
-/* Mga */
-
-typedef struct {
-   unsigned long sarea_priv_offset;
-   int chipset;
-   int sgram;
-   unsigned int maccess;
-   unsigned int fb_cpp;
-   unsigned int front_offset, front_pitch;
-   unsigned int back_offset, back_pitch;
-   unsigned int depth_cpp;
-   unsigned int depth_offset, depth_pitch;
-   unsigned int texture_offset[2];
-   unsigned int texture_size[2];
-   unsigned long fb_offset;
-   unsigned long mmio_offset;
-   unsigned long status_offset;
-   unsigned long warp_offset;
-   unsigned long primary_offset;
-   unsigned long buffers_offset;
-} drmCompatMGAInit;
-
-extern int drmMGAInitDMA( int fd, drmCompatMGAInit *info );
-extern int drmMGACleanupDMA( int fd );
-extern int drmMGAFlushDMA( int fd, drmLockFlags flags );
-extern int drmMGAEngineReset( int fd );
-extern int drmMGAFullScreen( int fd, int enable );
-extern int drmMGASwapBuffers( int fd );
-extern int drmMGAClear( int fd, unsigned int flags,
-			unsigned int clear_color, unsigned int clear_depth,
-			unsigned int color_mask, unsigned int depth_mask );
-extern int drmMGAFlushVertexBuffer( int fd, int indx, int used, int discard );
-extern int drmMGAFlushIndices( int fd, int indx,
-			       int start, int end, int discard );
-extern int drmMGATextureLoad( int fd, int indx,
-			      unsigned int dstorg, unsigned int length );
-extern int drmMGAAgpBlit( int fd, unsigned int planemask,
-			  unsigned int src, int src_pitch,
-			  unsigned int dst, int dst_pitch,
-			  int delta_sx, int delta_sy,
-			  int delta_dx, int delta_dy,
-			  int height, int ydir );
-
-/* R128 */
-
-typedef struct {
-   unsigned long sarea_priv_offset;
-   int is_pci;
-   int cce_mode;
-   int cce_secure;
-   int ring_size;
-   int usec_timeout;
-   unsigned int fb_bpp;
-   unsigned int front_offset, front_pitch;
-   unsigned int back_offset, back_pitch;
-   unsigned int depth_bpp;
-   unsigned int depth_offset, depth_pitch;
-   unsigned int span_offset;
-   unsigned long fb_offset;
-   unsigned long mmio_offset;
-   unsigned long ring_offset;
-   unsigned long ring_rptr_offset;
-   unsigned long buffers_offset;
-   unsigned long agp_textures_offset;
-} drmCompatR128Init;
-
-extern int drmR128InitCCE( int fd, drmCompatR128Init *info );
-extern int drmR128CleanupCCE( int fd );
-extern int drmR128StartCCE( int fd );
-extern int drmR128StopCCE( int fd );
-extern int drmR128ResetCCE( int fd );
-extern int drmR128WaitForIdleCCE( int fd );
-extern int drmR128EngineReset( int fd );
-extern int drmR128FullScreen( int fd, int enable );
-extern int drmR128SwapBuffers( int fd );
-extern int drmR128Clear( int fd, unsigned int flags,
-			 unsigned int clear_color, unsigned int clear_depth,
-			 unsigned int color_mask, unsigned int depth_mask );
-extern int drmR128FlushVertexBuffer( int fd, int prim, int indx,
-				     int count, int discard );
-extern int drmR128FlushIndices( int fd, int prim, int indx,
-				int start, int end, int discard );
-extern int drmR128TextureBlit( int fd, int indx,
-			       int offset, int pitch, int format,
-			       int x, int y, int width, int height );
-extern int drmR128WriteDepthSpan( int fd, int n, int x, int y,
-				  const unsigned int depth[],
-				  const unsigned char mask[] );
-extern int drmR128WriteDepthPixels( int fd, int n,
-				    const int x[], const int y[],
-				    const unsigned int depth[],
-				    const unsigned char mask[] );
-extern int drmR128ReadDepthSpan( int fd, int n, int x, int y );
-extern int drmR128ReadDepthPixels( int fd, int n,
-				   const int x[], const int y[] );
-extern int drmR128PolygonStipple( int fd, unsigned int *mask );
-extern int drmR128FlushIndirectBuffer( int fd, int indx,
-				       int start, int end, int discard );
-
-/* Radeon */
-
-typedef struct {
-   unsigned long sarea_priv_offset;
-   int is_pci;
-   int cp_mode;
-   int agp_size;
-   int ring_size;
-   int usec_timeout;
-
-   unsigned int fb_bpp;
-   unsigned int front_offset, front_pitch;
-   unsigned int back_offset, back_pitch;
-   unsigned int depth_bpp;
-   unsigned int depth_offset, depth_pitch;
-
-   unsigned long fb_offset;
-   unsigned long mmio_offset;
-   unsigned long ring_offset;
-   unsigned long ring_rptr_offset;
-   unsigned long buffers_offset;
-   unsigned long agp_textures_offset;
-} drmCompatRadeonInit;
-
-typedef struct {
-   unsigned int x;
-   unsigned int y;
-   unsigned int width;
-   unsigned int height;
-   void *data;
-} drmCompatRadeonTexImage;
-
-extern int drmRadeonInitCP( int fd, drmCompatRadeonInit *info );
-extern int drmRadeonCleanupCP( int fd );
-extern int drmRadeonStartCP( int fd );
-extern int drmRadeonStopCP( int fd );
-extern int drmRadeonResetCP( int fd );
-extern int drmRadeonWaitForIdleCP( int fd );
-extern int drmRadeonEngineReset( int fd );
-extern int drmRadeonFullScreen( int fd, int enable );
-extern int drmRadeonSwapBuffers( int fd );
-extern int drmRadeonClear( int fd, unsigned int flags,
-			   unsigned int clear_color, unsigned int clear_depth,
-			   unsigned int color_mask, unsigned int stencil,
-			   void *boxes, int nbox );
-extern int drmRadeonFlushVertexBuffer( int fd, int prim, int indx,
-				       int count, int discard );
-extern int drmRadeonFlushIndices( int fd, int prim, int indx,
-				  int start, int end, int discard );
-extern int drmRadeonLoadTexture( int fd, int offset, int pitch, int format,
-				 int width, int height,
-				 drmCompatRadeonTexImage *image );
-extern int drmRadeonPolygonStipple( int fd, unsigned int *mask );
-extern int drmRadeonFlushIndirectBuffer( int fd, int indx,
-					 int start, int end, int discard );
-
-/* SiS */
-extern Bool drmSiSAgpInit(int driSubFD, int offset, int size);
-
-/* I830 */
-typedef struct {
-   unsigned int start;
-   unsigned int end;
-   unsigned int size;
-   unsigned int mmio_offset;
-   unsigned int buffers_offset;
-   int sarea_off;
-   unsigned int front_offset;
-   unsigned int back_offset;
-   unsigned int depth_offset;
-   unsigned int w;
-   unsigned int h;
-   unsigned int pitch;
-   unsigned int pitch_bits;
-   unsigned int cpp;
-} drmCompatI830Init;
-
-extern Bool drmI830CleanupDma(int driSubFD);
-extern Bool drmI830InitDma(int driSubFD, drmCompatI830Init *info );
-
-#endif
-
-/* WARNING: Do not change, or add, anything to this file.  It is only provided
- * for binary backwards compatability with the old driver specific DRM 
- * extensions used before XFree86 4.3.
- */
diff --git a/hw/xfree86/os-support/xf86mm.h b/hw/xfree86/os-support/xf86mm.h
deleted file mode 100644
index e1a4e3e..0000000
--- a/hw/xfree86/os-support/xf86mm.h
+++ /dev/null
@@ -1,210 +0,0 @@
-/**************************************************************************
- * 
- * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA.
- * All Rights Reserved.
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * 
- **************************************************************************/
-
-#ifndef _XF86MM_H_
-#define _XF86MM_H_
-#include <stddef.h>
-#include "drm.h"
-
-/*
- * Note on multithreaded applications using this interface.
- * Libdrm is not threadsafe, so common buffer, TTM, and fence objects need to
- * be protected using an external mutex.
- *
- * Note: Don't protect the following functions, as it may lead to deadlocks:
- * drmBOUnmap(), drmFenceBuffers().
- * The kernel is synchronizing and refcounting buffer maps. 
- * User space only needs to refcount object usage within the same application.
- */
-
-
-/*
- * List macros heavily inspired by the Linux kernel
- * list handling. No list looping yet.
- */
-
-typedef struct _drmMMListHead
-{
-    struct _drmMMListHead *prev;
-    struct _drmMMListHead *next;
-} drmMMListHead;
-
-#define DRMINITLISTHEAD(__item)		       \
-  do{					       \
-    (__item)->prev = (__item);		       \
-    (__item)->next = (__item);		       \
-  } while (0)
-
-#define DRMLISTADD(__item, __list)			\
-  do {						\
-    (__item)->prev = (__list);			\
-    (__item)->next = (__list)->next;		\
-    (__list)->next->prev = (__item);		\
-    (__list)->next = (__item);			\
-  } while (0)
-
-#define DRMLISTADDTAIL(__item, __list)		\
-  do {						\
-    (__item)->next = (__list);			\
-    (__item)->prev = (__list)->prev;		\
-    (__list)->prev->next = (__item);		\
-    (__list)->prev = (__item);			\
-  } while(0)
-
-#define DRMLISTDEL(__item)			\
-  do {						\
-    (__item)->prev->next = (__item)->next;	\
-    (__item)->next->prev = (__item)->prev;	\
-  } while(0)
-
-#define DRMLISTDELINIT(__item)			\
-  do {						\
-    (__item)->prev->next = (__item)->next;	\
-    (__item)->next->prev = (__item)->prev;	\
-    (__item)->next = (__item);			\
-    (__item)->prev = (__item);			\
-  } while(0)
-
-#define DRMLISTENTRY(__type, __item, __field)   \
-    ((__type *)(((char *) (__item)) - offsetof(__type, __field)))
-
-typedef struct _drmFence{
-        unsigned handle;
-        int class;
-        unsigned type; 
-        unsigned flags;
-        unsigned signaled;
-        unsigned pad[4]; /* for future expansion */
-} drmFence;
-
-typedef struct _drmBO{
-    drm_bo_type_t type;
-    unsigned handle;
-    drm_u64_t mapHandle;
-    unsigned flags;
-    unsigned mask;
-    unsigned mapFlags;
-    unsigned long size;
-    unsigned long offset;
-    unsigned long start;
-    unsigned replyFlags;
-    unsigned fenceFlags;
-    unsigned pageAlignment;
-    void *virtual;
-    void *mapVirtual;
-    int mapCount;
-    unsigned pad[8];     /* for future expansion */
-} drmBO;
-
-
-typedef struct _drmBONode {
-    drmMMListHead head;
-    drmBO *buf;
-    drm_bo_arg_t bo_arg;
-    unsigned long arg0;
-    unsigned long arg1;
-} drmBONode;
-
-typedef struct _drmBOList {
-    unsigned numTarget;
-    unsigned numCurrent;
-    unsigned numOnList;
-    drmMMListHead list;
-    drmMMListHead free;
-} drmBOList;
-
-/* Fencing */
-
-extern int drmFenceCreate(int fd, unsigned flags, int class,
-			  unsigned type, 
-			  drmFence *fence);
-extern int drmFenceDestroy(int fd, const drmFence *fence);
-extern int drmFenceReference(int fd, unsigned handle, drmFence *fence);
-extern int drmFenceUnreference(int fd, const drmFence *fence);
-extern int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type);
-extern int drmFenceSignaled(int fd, drmFence *fence, 
-			    unsigned fenceType, int *signaled);
-extern int drmFenceWait(int fd, unsigned flags, drmFence *fence, 
-			unsigned flush_type);
-extern int drmFenceEmit(int fd, unsigned flags, drmFence *fence, 
-			unsigned emit_type);
-extern int drmFenceBuffers(int fd, unsigned flags, drmFence *fence);
-extern int drmFenceUpdate(int fd, drmFence *fence);
-
-
-/*
- * Buffer object list functions.
- */
-
-extern void drmBOFreeList(drmBOList *list);
-extern int drmBOResetList(drmBOList *list);
-extern void *drmBOListIterator(drmBOList *list);
-extern void *drmBOListNext(drmBOList *list, void *iterator);
-extern drmBO *drmBOListBuf(void *iterator);
-extern int drmBOCreateList(int numTarget, drmBOList *list);
-
-/*
- * Buffer object functions.
- */
-
-extern int drmBOCreate(int fd, unsigned long start, unsigned long size,
-		       unsigned pageAlignment,void *user_buffer, 
-		       drm_bo_type_t type, unsigned mask,
-		       unsigned hint, drmBO *buf);
-extern int drmBODestroy(int fd, drmBO *buf);
-extern int drmBOReference(int fd, unsigned handle, drmBO *buf);
-extern int drmBOUnReference(int fd, drmBO *buf);
-extern int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
-		    void **address);
-extern int drmBOUnmap(int fd, drmBO *buf);
-extern int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask, 
-			 unsigned hint);
-extern int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle);
-extern int drmBOInfo(int fd, drmBO *buf);
-extern int drmBOBusy(int fd, drmBO *buf, int *busy);
-
-
-extern int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags, 
-		       unsigned mask,
-		       int *newItem);
-extern int drmBOValidateList(int fd, drmBOList *list);
-extern int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle);
-extern int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint);
-
-/*
- * Initialization functions.
- */
-
-extern int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
-		     unsigned memType);
-extern int drmMMTakedown(int fd, unsigned memType);
-extern int drmMMLock(int fd, unsigned memType);
-extern int drmMMUnlock(int fd, unsigned memType);
-
-
-#endif
diff --git a/include/libdrm-config.h.in b/include/libdrm-config.h.in
deleted file mode 100644
index 286004b..0000000
--- a/include/libdrm-config.h.in
+++ /dev/null
@@ -1,10 +0,0 @@
-/* 
- * libdrm-config.h.in: not at all generated.
- */
-
-/* Number of bits in a file offset, on hosts where this is settable. */
-#undef _FILE_OFFSET_BITS
-
-/* Define for large files, on AIX-style hosts. */
-#undef _LARGE_FILES
-
diff-tree acb5ff4c73ac4d52201d7c421f488e2ead5c8b9c (from ca094684196886a4a1c10273049fae0705a3edc2)
Author: Jurij Smakov <jurij at wooyd.org>
Date:   Sat Nov 11 14:09:15 2006 +0200

    ffs: handle 0 argument (bug #8968)
    
    Handle an argument of 0 in ffs(), instead of looping indefinitely.
    Add an ffs prototype to dix.h, and add includes to ffs.c.
    (cherry picked from 34164e551e4c3909322d50b09835ca4ac1d49d68 commit)

diff --git a/dix/ffs.c b/dix/ffs.c
index f84f7b4..b75657d 100644
--- a/dix/ffs.c
+++ b/dix/ffs.c
@@ -36,6 +36,8 @@ int
 ffs(int i)
 {
     int j;
+    if (i == 0)
+        return 0;
     for (j = 1; (i & 1) == 0; j++)
 	i >>= 1;
     return j;
diff --git a/include/dix.h b/include/dix.h
index 983a84f..a5a570a 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -817,4 +817,7 @@ typedef struct {
 extern int xstrcasecmp(char *s1, char *s2);
 #endif
 
+/* ffs.c */
+extern int ffs(int i);
+
 #endif /* DIX_H */
diff-tree ca094684196886a4a1c10273049fae0705a3edc2 (from 28337cc1060bc08adef81c304dd9ed02d0a0e37b)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Fri Nov 10 18:02:05 2006 -0800

    Correct symlink-mesa.sh usage message

diff --git a/GL/symlink-mesa.sh b/GL/symlink-mesa.sh
index c14c683..9687ce8 100755
--- a/GL/symlink-mesa.sh
+++ b/GL/symlink-mesa.sh
@@ -289,9 +289,9 @@ action() {
 }
 
 usage() {
-    echo symlink.sh src-dir dst-dir
-    echo src-dir: the xc directory of the monolithic source tree
-    echo dst-dir: the modular source tree containing proto, app, lib, ...
+    echo symlink-mesa.sh src-dir dst-dir
+    echo src-dir: the Mesa source directory
+    echo dst-dir: the GL subdirectory of the Xserver modular tree
 }
 
 # Check commandline args
diff-tree 28337cc1060bc08adef81c304dd9ed02d0a0e37b (from e1720b1089328af80ca0cb85e5289ced05263f95)
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Nov 9 19:51:17 2006 -0800

    Fix typo before the last commit.

diff --git a/hw/xfree86/os-support/Makefile.am b/hw/xfree86/os-support/Makefile.am
index 5ade7e8..6346d1c 100644
--- a/hw/xfree86/os-support/Makefile.am
+++ b/hw/xfree86/os-support/Makefile.am
@@ -1,4 +1,4 @@
-t -SUBDIRS = bus @XORG_OS_SUBDIR@ misc $(DRI_SUBDIRS)
+SUBDIRS = bus @XORG_OS_SUBDIR@ misc $(DRI_SUBDIRS)
 DIST_SUBDIRS = bsd bus misc linux lynxos solaris sysv sco usl hurd
 
 sdk_HEADERS = xf86_OSproc.h xf86_OSlib.h xf86_ansic.h xf86_libc.h \
diff-tree e1720b1089328af80ca0cb85e5289ced05263f95 (from fd91630b73100e9d77ccb492c52807448bc772a5)
Author: Eric Anholt <eric at anholt.net>
Date:   Thu Nov 9 18:53:37 2006 -0800

    Bug #8868: Remove drm from SUBDIRS now that the directory is gone.

diff --git a/hw/xfree86/os-support/Makefile.am b/hw/xfree86/os-support/Makefile.am
index f9a888e..5ade7e8 100644
--- a/hw/xfree86/os-support/Makefile.am
+++ b/hw/xfree86/os-support/Makefile.am
@@ -1,5 +1,5 @@
-SUBDIRS = bus @XORG_OS_SUBDIR@ misc $(DRI_SUBDIRS)
-DIST_SUBDIRS = bsd bus drm misc linux lynxos solaris sysv sco usl hurd
+t -SUBDIRS = bus @XORG_OS_SUBDIR@ misc $(DRI_SUBDIRS)
+DIST_SUBDIRS = bsd bus misc linux lynxos solaris sysv sco usl hurd
 
 sdk_HEADERS = xf86_OSproc.h xf86_OSlib.h xf86_ansic.h xf86_libc.h \
               assyntax.h xf86OSmouse.h
diff-tree 0dee48b8af3e054228aef0d15c1cb1c9e23790cc (from ec77a95a02329a2ee3a94d7de9d2a234aecb9ca0)
Author: Keith Packard <keithp at mandolin.keithp.com>
Date:   Wed Nov 8 23:17:55 2006 -0800

    Add RRInit function to create resource types for RR objects.
    
    To allow RandR objects to be created before the screen object exists,
    the resource types must be registered with the resource database.
    A driver wishing to create RandR objects must call RRInit before doing so.
    
    Also, fix a segfault when setting Output data before it is associated with a
    screen.

diff --git a/randr/randr.c b/randr/randr.c
index 4426c47..147df8c 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -39,8 +39,7 @@
 #endif
 
 #define RR_VALIDATE
-int	RRGeneration;
-int	RRNScreens;
+static int	RRNScreens;
 
 #define wrap(priv,real,mem,func) {\
     priv->mem = real->mem; \
@@ -198,10 +197,10 @@ SRRNotifyEvent (xEvent *from,
     }
 }
 
-Bool RRScreenInit(ScreenPtr pScreen)
-{
-    rrScrPrivPtr   pScrPriv;
+static int RRGeneration;
 
+Bool RRInit (void)
+{
     if (RRGeneration != serverGeneration)
     {
 	if (!RRModeInit ())
@@ -210,9 +209,25 @@ Bool RRScreenInit(ScreenPtr pScreen)
 	    return FALSE;
 	if (!RROutputInit ())
 	    return FALSE;
+	RRGeneration = serverGeneration;
+    }
+    return TRUE;
+}
+
+static int RRScreenGeneration;
+
+Bool RRScreenInit(ScreenPtr pScreen)
+{
+    rrScrPrivPtr   pScrPriv;
+
+    if (!RRInit ())
+	return FALSE;
+
+    if (RRScreenGeneration != serverGeneration)
+    {
 	if ((rrPrivIndex = AllocateScreenPrivateIndex()) < 0)
 	    return FALSE;
-	RRGeneration = serverGeneration;
+	RRScreenGeneration = serverGeneration;
     }
 
     pScrPriv = (rrScrPrivPtr) xalloc (sizeof (rrScrPrivRec));
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 345418b..2c3e0e7 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -384,6 +384,8 @@ RRTellChanged (ScreenPtr pScreen);
 Bool
 RRGetInfo (ScreenPtr pScreen);
 
+Bool RRInit (void);
+
 Bool RRScreenInit(ScreenPtr pScreen);
 
 RROutputPtr
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 1b0ecab..102587b 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -31,10 +31,13 @@ void
 RROutputChanged (RROutputPtr output)
 {
     ScreenPtr	pScreen = output->pScreen;
-    rrScrPriv (pScreen);
-
+    
     output->changed = TRUE;
-    pScrPriv->changed = TRUE;
+    if (pScreen)
+    {
+	rrScrPriv (pScreen);
+	pScrPriv->changed = TRUE;
+    }
 }
 
 /*
@@ -335,17 +338,21 @@ RROutputDestroyResource (pointer value, 
 {
     RROutputPtr	output = (RROutputPtr) value;
     ScreenPtr	pScreen = output->pScreen;
-    rrScrPriv(pScreen);
-    int		i;
 
-    for (i = 0; i < pScrPriv->numOutputs; i++)
+    if (pScreen)
     {
-	if (pScrPriv->outputs[i] == output)
+	rrScrPriv(pScreen);
+	int		i;
+    
+	for (i = 0; i < pScrPriv->numOutputs; i++)
 	{
-	    memmove (pScrPriv->outputs + i, pScrPriv->outputs + i + 1,
-		     (pScrPriv->numOutputs - (i - 1)) * sizeof (RROutputPtr));
-	    --pScrPriv->numOutputs;
-	    break;
+	    if (pScrPriv->outputs[i] == output)
+	    {
+		memmove (pScrPriv->outputs + i, pScrPriv->outputs + i + 1,
+			 (pScrPriv->numOutputs - (i - 1)) * sizeof (RROutputPtr));
+		--pScrPriv->numOutputs;
+		break;
+	    }
 	}
     }
     if (output->modes)
@@ -481,4 +488,3 @@ ProcRRGetOutputInfo (ClientPtr client)
     
     return client->noClientException;
 }
-
diff-tree ec77a95a02329a2ee3a94d7de9d2a234aecb9ca0 (from 20e9144c0746943624ff77a61791b8596f3f8458)
Author: Keith Packard <keithp at mandolin.keithp.com>
Date:   Wed Nov 8 21:36:35 2006 -0800

    Allow RandR objects to be created before the associated ScreenRec.
    
    xf86 drivers need to create RandR object in the PreInit stage,
    before the ScreenRec is allocated. Changing the RandR DIX code
    to permit this required the addition of functions that later associate the
    objects with the related screen.
    
    An additional change is that modes are now global, and no longer associated
    with a specific screen. This change actually makes mode management cleaner
    as there is no more per-screen list of modes to deal with.
    
    This changes the RandR 1.2 ABI/API for drivers.

diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
index 0e1582e..35b22f0 100644
--- a/hw/xfree86/common/Makefile.am
+++ b/hw/xfree86/common/Makefile.am
@@ -51,7 +51,7 @@ sdk_HEADERS = compiler.h fourcc.h xf86.h
               xf86PciInfo.h xf86Priv.h xf86Privstr.h xf86Resources.h \
               xf86cmap.h xf86fbman.h xf86str.h $(XISDKINCS) \
               $(XVSDKINCS) atKeynames.h xf86Version.h xorgVersion.h \
-              xf86sbusBus.h xf86xv.h xf86xvmc.h xf86xvpriv.h
+              xf86sbusBus.h xf86xv.h xf86xvmc.h xf86xvpriv.h xf86Keymap.h
 
 DISTCLEANFILES = xf86Build.h
 CLEANFILES = $(BUILT_SOURCES)
diff --git a/randr/mirandr.c b/randr/mirandr.c
index 11c2991..3f56fe4 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -113,17 +113,24 @@ miRandRInit (ScreenPtr pScreen)
     modeInfo.height = pScreen->height;
     modeInfo.nameLength = strlen (name);
     
-    mode = RRModeGet (pScreen, &modeInfo, name);
+    mode = RRModeGet (&modeInfo, name);
     if (!mode)
 	return FALSE;
     
-    crtc = RRCrtcCreate (pScreen, NULL);
+    crtc = RRCrtcCreate (NULL);
     if (!crtc)
 	return FALSE;
+    if (!RRCrtcAttachScreen (crtc, pScreen))
+    {
+	RRCrtcDestroy (crtc);
+	return FALSE;
+    }
     
-    output = RROutputCreate (pScreen, "screen", 6, NULL);
+    output = RROutputCreate ("screen", 6, NULL);
     if (!output)
 	return FALSE;
+    if (!RROutputAttachScreen (output, pScreen))
+	return FALSE;
     if (!RROutputSetClones (output, NULL, 0))
 	return FALSE;
     if (!RROutputSetModes (output, &mode, 1, 0))
diff --git a/randr/randr.c b/randr/randr.c
index 7b39e80..4426c47 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -103,8 +103,6 @@ RRCloseScreen (int i, ScreenPtr pScreen)
 	RRCrtcDestroy (pScrPriv->crtcs[j]);
     for (j = pScrPriv->numOutputs - 1; j >= 0; j--)
 	RROutputDestroy (pScrPriv->outputs[j]);
-    for (j = pScrPriv->numModes - 1; j >= 0; j--)
-	RRModeDestroy (pScrPriv->modes[j]);
     
     xfree (pScrPriv);
     RRNScreens -= 1;	/* ok, one fewer screen with RandR running */
@@ -257,8 +255,6 @@ Bool RRScreenInit(ScreenPtr pScreen)
     
     wrap (pScrPriv, pScreen, CloseScreen, RRCloseScreen);
 
-    pScrPriv->numModes = 0;
-    pScrPriv->modes = NULL;
     pScrPriv->numOutputs = 0;
     pScrPriv->outputs = NULL;
     pScrPriv->numCrtcs = 0;
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 60877a3..345418b 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -79,7 +79,6 @@ struct _rrMode {
     xRRModeInfo	    mode;
     char	    *name;
     void	    *devPrivate;
-    ScreenPtr	    screen;
     Bool	    userDefined;
 };
 
@@ -210,10 +209,6 @@ typedef struct _rrScrPriv {
     CARD16		    width, height;	/* last known screen size */
     Bool		    layoutChanged;	/* screen layout changed */
 
-    /* modes, outputs and crtcs */
-    int			    numModes;
-    RRModePtr		    *modes;
-
     int			    numOutputs;
     RROutputPtr		    *outputs;
 
@@ -457,10 +452,17 @@ RRCrtcChanged (RRCrtcPtr crtc, Bool layo
  * Create a CRTC
  */
 RRCrtcPtr
-RRCrtcCreate (ScreenPtr	pScreen,
-	      void	*devPrivate);
+RRCrtcCreate (void	*devPrivate);
 
 /*
+ * Attach a CRTC to a screen. Once done, this cannot be
+ * undone without destroying the CRTC; it is separate from Create
+ * only to allow an xf86-based driver to create objects in preinit
+ */
+Bool
+RRCrtcAttachScreen (RRCrtcPtr crtc, ScreenPtr pScreen);
+    
+/*
  * Notify the extension that the Crtc has been reconfigured,
  * the driver calls this whenever it has updated the mode
  */
@@ -556,8 +558,7 @@ RRClientKnowsRates (ClientPtr	pClient);
  */
 
 RRModePtr
-RRModeGet (ScreenPtr	pScreen,
-	   xRRModeInfo	*modeInfo,
+RRModeGet (xRRModeInfo	*modeInfo,
 	   const char	*name);
 
 void
@@ -571,6 +572,12 @@ void
 RRModeDestroy (RRModePtr mode);
 
 /*
+ * Return a list of modes that are valid for some output in pScreen
+ */
+RRModePtr *
+RRModesForScreen (ScreenPtr pScreen, int *num_ret);
+    
+/*
  * Initialize mode type
  */
 Bool
@@ -601,12 +608,19 @@ RROutputChanged (RROutputPtr output);
  */
 
 RROutputPtr
-RROutputCreate (ScreenPtr   pScreen,
-		const char  *name,
+RROutputCreate (const char  *name,
 		int	    nameLength,
 		void	    *devPrivate);
 
 /*
+ * Attach an output to a screen, again split from creation so
+ * xf86 DDXen can create randr resources before the ScreenRec
+ * exists
+ */
+Bool
+RROutputAttachScreen (RROutputPtr output, ScreenPtr pScreen);
+
+/*
  * Notify extension that output parameters have been changed
  */
 Bool
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 76d0b6b..9f7177a 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -32,43 +32,34 @@ void
 RRCrtcChanged (RRCrtcPtr crtc, Bool layoutChanged)
 {
     ScreenPtr	pScreen = crtc->pScreen;
-    rrScrPriv(pScreen);
 
     crtc->changed = TRUE;
-    pScrPriv->changed = TRUE;
-    /*
-     * Send ConfigureNotify on any layout change
-     */
-    if (layoutChanged)
-	pScrPriv->layoutChanged = TRUE;
+    if (pScreen)
+    {
+	rrScrPriv(pScreen);
+    
+	pScrPriv->changed = TRUE;
+	/*
+	 * Send ConfigureNotify on any layout change
+	 */
+	if (layoutChanged)
+	    pScrPriv->layoutChanged = TRUE;
+    }
 }
 
 /*
  * Create a CRTC
  */
 RRCrtcPtr
-RRCrtcCreate (ScreenPtr	pScreen,
-	      void	*devPrivate)
+RRCrtcCreate (void	*devPrivate)
 {
-    rrScrPriv (pScreen);
     RRCrtcPtr	crtc;
-    RRCrtcPtr	*crtcs;
     
     crtc = xalloc (sizeof (RRCrtcRec));
     if (!crtc)
 	return NULL;
-    if (pScrPriv->numCrtcs)
-	crtcs = xrealloc (pScrPriv->crtcs, 
-			  (pScrPriv->numCrtcs + 1) * sizeof (RRCrtcPtr));
-    else
-	crtcs = xalloc (sizeof (RRCrtcPtr));
-    if (!crtcs)
-    {
-	xfree (crtc);
-	return NULL;
-    }
     crtc->id = FakeClientID (0);
-    crtc->pScreen = pScreen;
+    crtc->pScreen = NULL;
     crtc->mode = NULL;
     crtc->x = 0;
     crtc->y = 0;
@@ -84,11 +75,37 @@ RRCrtcCreate (ScreenPtr	pScreen,
     if (!AddResource (crtc->id, RRCrtcType, (pointer) crtc))
 	return NULL;
 
+    return crtc;
+}
+
+/*
+ * Attach a Crtc to a screen. This is done as a separate step
+ * so that an xf86-based driver can create CRTCs in PreInit
+ * before the Screen has been created
+ */
+
+Bool
+RRCrtcAttachScreen (RRCrtcPtr crtc, ScreenPtr pScreen)
+{
+    rrScrPriv (pScreen);
+    RRCrtcPtr	*crtcs;
+
+    /* make space for the crtc pointer */
+    if (pScrPriv->numCrtcs)
+	crtcs = xrealloc (pScrPriv->crtcs, 
+			  (pScrPriv->numCrtcs + 1) * sizeof (RRCrtcPtr));
+    else
+	crtcs = xalloc (sizeof (RRCrtcPtr));
+    if (!crtcs)
+	return FALSE;
+    
+    /* attach the screen and crtc together */
+    crtc->pScreen = pScreen;
     pScrPriv->crtcs = crtcs;
     pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc;
 
     RRCrtcChanged (crtc, TRUE);
-    return crtc;
+    return TRUE;
 }
 
 /*
@@ -243,7 +260,6 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	   RROutputConfigPtr  outputs)
 {
     ScreenPtr	pScreen = crtc->pScreen;
-    rrScrPriv(pScreen);
 
     /* See if nothing changed */
     if (crtc->mode == mode &&
@@ -255,45 +271,49 @@ RRCrtcSet (RRCrtcPtr    crtc,
     {
 	return TRUE;
     }
-#if RANDR_12_INTERFACE
-    if (pScrPriv->rrCrtcSet)
+    if (pScreen)
     {
-	return (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y, 
-				       rotation, numOutputs, outputs);
-    }
-#endif
-#if RANDR_10_INTERFACE
-    if (pScrPriv->rrSetConfig)
-    {
-	RRScreenSize	    size;
-	RRScreenRate	    rate;
-	Bool		    ret;
-
-	size.width = mode->mode.width;
-	size.height = mode->mode.height;
-	if (outputs[0].output->mmWidth && outputs[0].output->mmHeight)
+#if RANDR_12_INTERFACE
+	rrScrPriv(pScreen);
+	if (pScrPriv->rrCrtcSet)
 	{
-	    size.mmWidth = outputs[0].output->mmWidth;
-	    size.mmHeight = outputs[0].output->mmHeight;
+	    return (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y, 
+					   rotation, numOutputs, outputs);
 	}
-	else
+#endif
+#if RANDR_10_INTERFACE
+	if (pScrPriv->rrSetConfig)
 	{
-	    size.mmWidth = pScreen->mmWidth;
-	    size.mmHeight = pScreen->mmHeight;
+	    RRScreenSize	    size;
+	    RRScreenRate	    rate;
+	    Bool		    ret;
+
+	    size.width = mode->mode.width;
+	    size.height = mode->mode.height;
+	    if (outputs[0].output->mmWidth && outputs[0].output->mmHeight)
+	    {
+		size.mmWidth = outputs[0].output->mmWidth;
+		size.mmHeight = outputs[0].output->mmHeight;
+	    }
+	    else
+	    {
+		size.mmWidth = pScreen->mmWidth;
+		size.mmHeight = pScreen->mmHeight;
+	    }
+	    size.nRates = 1;
+	    rate.rate = RRVerticalRefresh (&mode->mode);
+	    size.pRates = &rate;
+	    ret = (*pScrPriv->rrSetConfig) (pScreen, rotation, rate.rate, &size);
+	    /*
+	     * Old 1.0 interface tied screen size to mode size
+	     */
+	    if (ret)
+		RRCrtcNotify (crtc, mode, x, y, rotation, 1, &outputs[0].output);
+	    return ret;
 	}
-	size.nRates = 1;
-	rate.rate = RRVerticalRefresh (&mode->mode);
-	size.pRates = &rate;
-	ret = (*pScrPriv->rrSetConfig) (pScreen, rotation, rate.rate, &size);
-	/*
-	 * Old 1.0 interface tied screen size to mode size
-	 */
-	if (ret)
-	    RRCrtcNotify (crtc, mode, x, y, rotation, 1, &outputs[0].output);
-	return ret;
-    }
 #endif
-    RRTellChanged (pScreen);
+	RRTellChanged (pScreen);
+    }
     return FALSE;
 }
 
@@ -311,22 +331,26 @@ RRCrtcDestroyResource (pointer value, XI
 {
     RRCrtcPtr	crtc = (RRCrtcPtr) value;
     ScreenPtr	pScreen = crtc->pScreen;
-    rrScrPriv(pScreen);
-    int		i;
 
-    for (i = 0; i < pScrPriv->numCrtcs; i++)
+    if (pScreen)
     {
-	if (pScrPriv->crtcs[i] == crtc)
+	rrScrPriv(pScreen);
+	int		i;
+    
+	for (i = 0; i < pScrPriv->numCrtcs; i++)
 	{
-	    memmove (pScrPriv->crtcs + i, pScrPriv->crtcs + i + 1,
-		     (pScrPriv->numCrtcs - (i - 1)) * sizeof (RRCrtcPtr));
-	    --pScrPriv->numCrtcs;
-	    break;
+	    if (pScrPriv->crtcs[i] == crtc)
+	    {
+		memmove (pScrPriv->crtcs + i, pScrPriv->crtcs + i + 1,
+			 (pScrPriv->numCrtcs - (i - 1)) * sizeof (RRCrtcPtr));
+		--pScrPriv->numCrtcs;
+		break;
+	    }
 	}
     }
     if (crtc->gammaRed)
 	xfree (crtc->gammaRed);
-    xfree (value);
+    xfree (crtc);
     return 1;
 }
 
@@ -343,15 +367,18 @@ RRCrtcGammaSet (RRCrtcPtr   crtc,
     Bool	ret = TRUE;
 #if RANDR_12_INTERFACE
     ScreenPtr	pScreen = crtc->pScreen;
-    rrScrPriv(pScreen);
 #endif
     
     memcpy (crtc->gammaRed, red, crtc->gammaSize * sizeof (CARD16));
     memcpy (crtc->gammaGreen, green, crtc->gammaSize * sizeof (CARD16));
     memcpy (crtc->gammaBlue, blue, crtc->gammaSize * sizeof (CARD16));
 #if RANDR_12_INTERFACE
-    if (pScrPriv->rrCrtcSetGamma)
-	ret = (*pScrPriv->rrCrtcSetGamma) (pScreen, crtc);
+    if (pScreen)
+    {
+	rrScrPriv(pScreen);
+	if (pScrPriv->rrCrtcSetGamma)
+	    ret = (*pScrPriv->rrCrtcSetGamma) (pScreen, crtc);
+    }
 #endif
     return ret;
 }
@@ -433,6 +460,9 @@ ProcRRGetCrtcInfo (ClientPtr client)
     if (!crtc)
 	return RRErrorBase + BadRRCrtc;
 
+    /* All crtcs must be associated with screens before client
+     * requests are processed
+     */
     pScreen = crtc->pScreen;
     pScrPriv = rrGetScrPriv(pScreen);
 
@@ -589,7 +619,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	for (j = 0; j < outputs[i].output->numCrtcs; j++)
 	    if (outputs[i].output->crtcs[j] == crtc)
 		break;
-	if (j == outputs[j].output->numCrtcs)
+	if (j == outputs[i].output->numCrtcs)
 	{
 	    if (outputs)
 		xfree (outputs);
diff --git a/randr/rrinfo.c b/randr/rrinfo.c
index e92caad..244b089 100644
--- a/randr/rrinfo.c
+++ b/randr/rrinfo.c
@@ -44,7 +44,7 @@ RROldModeAdd (RROutputPtr output, RRScre
     modeInfo.dotClock = ((CARD32) size->width * (CARD32) size->height *
 			 (CARD32) refresh);
     modeInfo.nameLength = strlen (name);
-    mode = RRModeGet (pScreen, &modeInfo, name);
+    mode = RRModeGet (&modeInfo, name);
     if (!mode)
 	return NULL;
     for (i = 0; i < output->numModes; i++)
@@ -90,12 +90,19 @@ RRScanOldConfig (ScreenPtr pScreen, Rota
     if (pScrPriv->numOutputs == 0 &&
 	pScrPriv->numCrtcs == 0)
     {
-	crtc = RRCrtcCreate (pScreen, NULL);
+	crtc = RRCrtcCreate (NULL);
 	if (!crtc)
 	    return;
-	output = RROutputCreate (pScreen, "default", 7, NULL);
+	if (!RRCrtcAttachScreen (crtc, pScreen))
+	{
+	    RRCrtcDestroy (crtc);
+	    return;
+	}
+	output = RROutputCreate ("default", 7, NULL);
 	if (!output)
 	    return;
+	if (!RROutputAttachScreen (output, pScreen))
+	    return;
 	RROutputSetCrtcs (output, &crtc, 1);
 	RROutputSetCrtc (output, crtc);
 	RROutputSetConnection (output, RR_Connected);
@@ -206,7 +213,6 @@ RRGetInfo (ScreenPtr pScreen)
     if (pScrPriv->nSizes)
 	RRScanOldConfig (pScreen, rotations);
 #endif
-    RRModePruneUnused (pScreen);
     RRTellChanged (pScreen);
     return TRUE;
 }
diff --git a/randr/rrmode.c b/randr/rrmode.c
index fb4b5eb..3cd9ef2 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -42,19 +42,23 @@ RRModeEqual (xRRModeInfo *a, xRRModeInfo
     return TRUE;
 }
 
+/*
+ * Keep a list so it's easy to find modes in the resource database.
+ */
+static int	    num_modes;
+static RRModePtr    *modes;
+
 RRModePtr
-RRModeGet (ScreenPtr	pScreen,
-	   xRRModeInfo	*modeInfo,
+RRModeGet (xRRModeInfo	*modeInfo,
 	   const char	*name)
 {
-    rrScrPriv (pScreen);
     int	i;
     RRModePtr	mode;
-    RRModePtr	*modes;
+    RRModePtr	*newModes;
 
-    for (i = 0; i < pScrPriv->numModes; i++)
+    for (i = 0; i < num_modes; i++)
     {
-	mode = pScrPriv->modes[i];
+	mode = modes[i];
 	if (RRModeEqual (&mode->mode, modeInfo) &&
 	    !memcmp (name, mode->name, modeInfo->nameLength))
 	{
@@ -71,16 +75,14 @@ RRModeGet (ScreenPtr	pScreen,
     mode->name = (char *) (mode + 1);
     memcpy (mode->name, name, modeInfo->nameLength);
     mode->name[modeInfo->nameLength] = '\0';
-    mode->screen = pScreen;
     mode->userDefined = FALSE;
 
-    if (pScrPriv->numModes)
-	modes = xrealloc (pScrPriv->modes,
-			  (pScrPriv->numModes + 1) * sizeof (RRModePtr));
+    if (num_modes)
+	newModes = xrealloc (modes, (num_modes + 1) * sizeof (RRModePtr));
     else
-	modes = xalloc (sizeof (RRModePtr));
+	newModes = xalloc (sizeof (RRModePtr));
 
-    if (!modes)
+    if (!newModes)
     {
 	xfree (mode);
 	return NULL;
@@ -89,37 +91,64 @@ RRModeGet (ScreenPtr	pScreen,
     mode->mode.id = FakeClientID(0);
     if (!AddResource (mode->mode.id, RRModeType, (pointer) mode))
 	return NULL;
+    modes = newModes;
+    modes[num_modes++] = mode;
+    
+    /*
+     * give the caller a reference to this mode
+     */
     ++mode->refcnt;
-    pScrPriv->modes = modes;
-    pScrPriv->modes[pScrPriv->numModes++] = mode;
-    pScrPriv->changed = TRUE;
     return mode;
 }
 
+RRModePtr *
+RRModesForScreen (ScreenPtr pScreen, int *num_ret)
+{
+    rrScrPriv(pScreen);
+    int	o;
+    RRModePtr	*screen_modes;
+    int		num_screen_modes = 0;
+
+    screen_modes = xalloc ((num_modes ? num_modes : 1) * sizeof (RRModePtr));
+    
+    for (o = 0; o < pScrPriv->numOutputs; o++)
+    {
+	RROutputPtr	output = pScrPriv->outputs[o];
+	int		m, n;
+
+	for (m = 0; m < output->numModes; m++)
+	{
+	    RRModePtr	mode = output->modes[m];
+	    for (n = 0; n < num_screen_modes; n++)
+		if (screen_modes[n] == mode)
+		    break;
+	    if (n == num_screen_modes)
+		screen_modes[num_screen_modes++] = mode;
+	}
+    }
+    *num_ret = num_screen_modes;
+    return screen_modes;
+}
+
 void
 RRModeDestroy (RRModePtr mode)
 {
-    ScreenPtr	    pScreen;
-    rrScrPrivPtr    pScrPriv;
     int	m;
     
     if (--mode->refcnt > 0)
 	return;
-    pScreen = mode->screen;
-    pScrPriv = rrGetScrPriv (pScreen);
-    for (m = 0; m < pScrPriv->numModes; m++)
+    for (m = 0; m < num_modes; m++)
     {
-	if (pScrPriv->modes[m] == mode)
+	if (modes[m] == mode)
 	{
-	    memmove (pScrPriv->modes + m, pScrPriv->modes + m + 1,
-		     (pScrPriv->numModes - m - 1) * sizeof (RRModePtr));
-	    pScrPriv->numModes--;
-	    if (!pScrPriv->numModes)
+	    memmove (modes + m, modes + m + 1,
+		     (num_modes - m - 1) * sizeof (RRModePtr));
+	    num_modes--;
+	    if (!num_modes)
 	    {
-		xfree (pScrPriv->modes);
-		pScrPriv->modes = NULL;
+		xfree (modes);
+		modes = NULL;
 	    }
-	    pScrPriv->changed = TRUE;
 	    break;
 	}
     }
@@ -137,6 +166,8 @@ RRModeDestroyResource (pointer value, XI
 Bool
 RRModeInit (void)
 {
+    assert (num_modes == 0);
+    assert (modes == NULL);
     RRModeType = CreateNewResourceType (RRModeDestroyResource);
     if (!RRModeType)
 	return FALSE;
@@ -146,26 +177,6 @@ RRModeInit (void)
     return TRUE;
 }
 
-void
-RRModePruneUnused (ScreenPtr pScreen)
-{
-    rrScrPriv (pScreen);
-    RRModePtr	*unused, mode;
-    int		m;
-    int		num = pScrPriv->numModes;
-
-    unused = xalloc (num * sizeof (RRModePtr));
-    if (!unused)
-	return;
-    memcpy (unused, pScrPriv->modes, num * sizeof (RRModePtr));
-    for (m = 0; m < num; m++) {
-	mode = unused[m];
-	if (mode->refcnt == 1 && !mode->userDefined)
-	    FreeResource (mode->mode.id, 0);
-    }
-    xfree (unused);
-}
-
 int
 ProcRRCreateMode (ClientPtr client)
 {
@@ -205,4 +216,3 @@ ProcRRDeleteOutputMode (ClientPtr client
     (void) stuff;
     return BadImplementation; 
 }
-
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 1f6f330..1b0ecab 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -42,30 +42,17 @@ RROutputChanged (RROutputPtr output)
  */
 
 RROutputPtr
-RROutputCreate (ScreenPtr   pScreen,
-		const char  *name,
+RROutputCreate (const char  *name,
 		int	    nameLength,
 		void	    *devPrivate)
 {
-    rrScrPriv (pScreen);
     RROutputPtr	output;
-    RROutputPtr	*outputs;
 
     output = xalloc (sizeof (RROutputRec) + nameLength + 1);
     if (!output)
 	return NULL;
-    if (pScrPriv->numOutputs)
-	outputs = xrealloc (pScrPriv->outputs, 
-			    (pScrPriv->numOutputs + 1) * sizeof (RROutputPtr));
-    else
-	outputs = xalloc (sizeof (RROutputPtr));
-    if (!outputs)
-    {
-	xfree (output);
-	return NULL;
-    }
     output->id = FakeClientID (0);
-    output->pScreen = pScreen;
+    output->pScreen = NULL;
     output->name = (char *) (output + 1);
     output->nameLength = nameLength;
     memcpy (output->name, name, nameLength);
@@ -91,12 +78,35 @@ RROutputCreate (ScreenPtr   pScreen,
     if (!AddResource (output->id, RROutputType, (pointer) output))
 	return NULL;
 
+    return output;
+}
+
+/*
+ * Attach an Output to a screen. This is done as a separate step
+ * so that an xf86-based driver can create Outputs in PreInit
+ * before the Screen has been created
+ */
+
+Bool
+RROutputAttachScreen (RROutputPtr output, ScreenPtr pScreen)
+{
+    rrScrPriv (pScreen);
+    RROutputPtr	*outputs;
+    
+    if (pScrPriv->numOutputs)
+	outputs = xrealloc (pScrPriv->outputs, 
+			    (pScrPriv->numOutputs + 1) * sizeof (RROutputPtr));
+    else
+	outputs = xalloc (sizeof (RROutputPtr));
+    if (!outputs)
+	return FALSE;
+    output->pScreen = pScreen;
     pScrPriv->outputs = outputs;
     pScrPriv->outputs[pScrPriv->numOutputs++] = output;
     RROutputChanged (output);
-    return output;
+    return TRUE;
 }
-
+		      
 /*
  * Notify extension that output parameters have been changed
  */
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 705e7d7..d47e9d6 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -360,6 +360,13 @@ ProcRRGetScreenResources (ClientPtr clie
     }
     else
     {
+	RRModePtr   *modes;
+	int	    num_modes;
+
+	modes = RRModesForScreen (pScreen, &num_modes);
+	if (!modes)
+	    return BadAlloc;
+	
 	rep.type = X_Reply;
 	rep.sequenceNumber = client->sequence;
 	rep.length = 0;
@@ -367,15 +374,15 @@ ProcRRGetScreenResources (ClientPtr clie
 	rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
 	rep.nCrtcs = pScrPriv->numCrtcs;
 	rep.nOutputs = pScrPriv->numOutputs;
-	rep.nModes = pScrPriv->numModes;;
+	rep.nModes = num_modes;
 	rep.nbytesNames = 0;
 
-	for (i = 0; i < pScrPriv->numModes; i++)
-	    rep.nbytesNames += pScrPriv->modes[i]->mode.nameLength;
+	for (i = 0; i < num_modes; i++)
+	    rep.nbytesNames += modes[i]->mode.nameLength;
 
 	rep.length = (pScrPriv->numCrtcs + 
 		      pScrPriv->numOutputs + 
-		      pScrPriv->numModes * (SIZEOF(xRRModeInfo) >> 2) +
+		      num_modes * (SIZEOF(xRRModeInfo) >> 2) +
 		      ((rep.nbytesNames + 3) >> 2));
 	
 	extraLen = rep.length << 2;
@@ -383,7 +390,10 @@ ProcRRGetScreenResources (ClientPtr clie
 	{
 	    extra = xalloc (extraLen);
 	    if (!extra)
+	    {
+		xfree (modes);
 		return BadAlloc;
+	    }
 	}
 	else
 	    extra = NULL;
@@ -391,7 +401,7 @@ ProcRRGetScreenResources (ClientPtr clie
 	crtcs = (RRCrtc *) extra;
 	outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs);
 	modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
-	names = (CARD8 *) (modeinfos + pScrPriv->numModes);
+	names = (CARD8 *) (modeinfos + num_modes);
 	
 	for (i = 0; i < pScrPriv->numCrtcs; i++)
 	{
@@ -407,9 +417,10 @@ ProcRRGetScreenResources (ClientPtr clie
 		swapl (&outputs[i], n);
 	}
 	
-	for (i = 0; i < pScrPriv->numModes; i++)
+	for (i = 0; i < num_modes; i++)
 	{
-	    modeinfos[i] = pScrPriv->modes[i]->mode;
+	    RRModePtr	mode = modes[i];
+	    modeinfos[i] = mode->mode;
 	    if (client->swapped)
 	    {
 		swapl (&modeinfos[i].id, n);
@@ -426,10 +437,11 @@ ProcRRGetScreenResources (ClientPtr clie
 		swaps (&modeinfos[i].nameLength, n);
 		swapl (&modeinfos[i].modeFlags, n);
 	    }
-	    memcpy (names, pScrPriv->modes[i]->name, 
-		    pScrPriv->modes[i]->mode.nameLength);
-	    names += pScrPriv->modes[i]->mode.nameLength;
+	    memcpy (names, mode->name, 
+		    mode->mode.nameLength);
+	    names += mode->mode.nameLength;
 	}
+    	xfree (modes);
 	assert (((((char *) names - (char *) extra) + 3) >> 2) == rep.length);
     }
     
diff-tree fd91630b73100e9d77ccb492c52807448bc772a5 (from 0409e1627a167db2efc1355f292d3c02a6989ffc)
Author: Dave Airlie <airlied at linux.ie>
Date:   Thu Nov 9 09:30:33 2006 +1100

    make X server use system libdrm - this requires libdrm >= 2.3.0
    
    This patch blacklists the load "drm" line, moves some functions in dri module
    links dri module against libdrm, and removes the X copy of libdrm

diff --git a/configure.ac b/configure.ac
index 3148403..0977ee3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -654,10 +654,11 @@ AM_CONDITIONAL(DRI, test "x$DRI" = xyes)
 if test "x$DRI" = xyes; then
 	AC_DEFINE(XF86DRI, 1, [Build DRI extension])
 	PKG_CHECK_MODULES([DRIPROTO], [xf86driproto])
-	PKG_CHECK_MODULES([LIBDRM], [libdrm])
+	PKG_CHECK_MODULES([LIBDRM], [libdrm >= 2.3.0])
 	PKG_CHECK_MODULES([GL], [glproto >= 1.4.1])
 	AC_SUBST(DRIPROTO_CFLAGS)
 	AC_SUBST(LIBDRM_CFLAGS)
+	AC_SUBST(LIBDRM_LIBS)
 	AC_SUBST(GL_CFLAGS)
 fi
 
@@ -1840,7 +1841,6 @@ hw/xfree86/loader/Makefile
 hw/xfree86/os-support/Makefile
 hw/xfree86/os-support/bsd/Makefile
 hw/xfree86/os-support/bus/Makefile
-hw/xfree86/os-support/drm/Makefile
 hw/xfree86/os-support/hurd/Makefile
 hw/xfree86/os-support/misc/Makefile
 hw/xfree86/os-support/linux/Makefile
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 57f929b..ffdca12 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -251,7 +251,7 @@ xf86ModulelistFromConfig(pointer **optli
 {
     int count = 0, i = 0;
     char **modulearray;
-    char *ignore[] = { "GLcore", "speedo", "bitmap", NULL };
+    char *ignore[] = { "GLcore", "speedo", "bitmap", "drm", NULL };
     pointer *optarray;
     XF86LoadPtr modp;
     
diff --git a/hw/xfree86/dri/Makefile.am b/hw/xfree86/dri/Makefile.am
index e711846..4def387 100644
--- a/hw/xfree86/dri/Makefile.am
+++ b/hw/xfree86/dri/Makefile.am
@@ -7,13 +7,10 @@ libdri_la_CFLAGS = -I$(top_srcdir)/hw/xf
                    -I$(top_builddir)/GL/include \
 		   -I at MESA_SOURCE@/include \
                    -DHAVE_XORG_CONFIG_H \
-		 \
-		 \
- \
                    @DRIPROTO_CFLAGS@ \
                    @LIBDRM_CFLAGS@ \
                    @GL_CFLAGS@
-libdri_la_LDFLAGS = -module -avoid-version
+libdri_la_LDFLAGS = -module -avoid-version @LIBDRM_LIBS@
 libdri_ladir = $(moduledir)/extensions
 libdri_la_SOURCES = \
 	dri.c \
diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
index 9e52e61..fbb24e4 100644
--- a/hw/xfree86/dri/dri.c
+++ b/hw/xfree86/dri/dri.c
@@ -42,11 +42,13 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 #include <unistd.h>
 #include <string.h>
 #include <stdio.h>
+#include <sys/ioctl.h>
 
 #define NEED_REPLIES
 #define NEED_EVENTS
 #include <X11/X.h>
 #include <X11/Xproto.h>
+#include "xf86drm.h"
 #include "misc.h"
 #include "dixstruct.h"
 #include "extnsionst.h"
@@ -67,6 +69,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
 #include "glxserver.h"
 #include "mi.h"
 #include "mipointer.h"
+#include "xf86_OSproc.h"
 
 #if !defined(PANORAMIX)
 extern Bool noPanoramiXExtension;
@@ -104,6 +107,7 @@ DRIDrvMsg(int scrnIndex, MessageType typ
     va_end(ap);
 }
 
+
 Bool
 DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
 {
@@ -571,6 +575,26 @@ DRICloseScreen(ScreenPtr pScreen)
     }
 }
 
+#define DRM_MSG_VERBOSITY 3
+
+static int dri_drm_debug_print(const char *format, va_list ap)
+{
+  xf86VDrvMsgVerb(-1, X_NONE, DRM_MSG_VERBOSITY, format, ap);
+  return 0;
+}
+
+static void dri_drm_get_perms(gid_t *group, mode_t *mode)
+{
+  *group = xf86ConfigDRI.group;
+  *mode = xf86ConfigDRI.mode;
+}
+
+static drmServerInfo DRIDRMServerInfo =  {
+  dri_drm_debug_print,
+  xf86LoadKernelModule,
+  dri_drm_get_perms,
+};
+
 Bool
 DRIExtensionInit(void)
 {
@@ -598,6 +622,8 @@ DRIExtensionInit(void)
 	    return FALSE;
     }
 
+    drmSetServerInfo(&DRIDRMServerInfo);
+
     RegisterBlockAndWakeupHandlers(DRIBlockHandler, DRIWakeupHandler, NULL);
 
     return TRUE;
@@ -2093,3 +2119,71 @@ DRICreatePCIBusID(pciVideoPtr PciInfo)
 	PciInfo->device, PciInfo->func);
     return busID;
 }
+
+static void drmSIGIOHandler(int interrupt, void *closure)
+{
+    unsigned long key;
+    void          *value;
+    ssize_t       count;
+    drm_ctx_t     ctx;
+    typedef void  (*_drmCallback)(int, void *, void *);
+    char          buf[256];
+    drm_context_t    old;
+    drm_context_t    new;
+    void          *oldctx;
+    void          *newctx;
+    char          *pt;
+    drmHashEntry  *entry;
+    void *hash_table;
+
+    hash_table = drmGetHashTable();
+
+    if (!hash_table) return;
+    if (drmHashFirst(hash_table, &key, &value)) {
+	entry = value;
+	do {
+#if 0
+	    fprintf(stderr, "Trying %d\n", entry->fd);
+#endif
+	    if ((count = read(entry->fd, buf, sizeof(buf))) > 0) {
+		buf[count] = '\0';
+#if 0
+		fprintf(stderr, "Got %s\n", buf);
+#endif
+
+		for (pt = buf; *pt != ' '; ++pt); /* Find first space */
+		++pt;
+		old    = strtol(pt, &pt, 0);
+		new    = strtol(pt, NULL, 0);
+		oldctx = drmGetContextTag(entry->fd, old);
+		newctx = drmGetContextTag(entry->fd, new);
+#if 0
+		fprintf(stderr, "%d %d %p %p\n", old, new, oldctx, newctx);
+#endif
+		((_drmCallback)entry->f)(entry->fd, oldctx, newctx);
+		ctx.handle = new;
+		ioctl(entry->fd, DRM_IOCTL_NEW_CTX, &ctx);
+	    }
+	} while (drmHashNext(hash_table, &key, &value));
+    }
+}
+
+
+int drmInstallSIGIOHandler(int fd, void (*f)(int, void *, void *))
+{
+    drmHashEntry     *entry;
+
+    entry     = drmGetEntry(fd);
+    entry->f  = f;
+
+    return xf86InstallSIGIOHandler(fd, drmSIGIOHandler, 0);
+}
+
+int drmRemoveSIGIOHandler(int fd)
+{
+    drmHashEntry     *entry = drmGetEntry(fd);
+
+    entry->f = NULL;
+
+    return xf86RemoveSIGIOHandler(fd);
+}
diff --git a/hw/xfree86/dri/dri.h b/hw/xfree86/dri/dri.h
index b49c426..dca0edd 100644
--- a/hw/xfree86/dri/dri.h
+++ b/hw/xfree86/dri/dri.h
@@ -339,6 +339,8 @@ extern void DRIMoveBuffersHelper(ScreenP
 
 extern char *DRICreatePCIBusID(pciVideoPtr PciInfo);
 
+extern int drmInstallSIGIOHandler(int fd, void (*f)(int, void *, void *));
+extern int drmRemoveSIGIOHandler(int fd);
 #define _DRI_H_
 
 #endif
diff --git a/hw/xfree86/dri/drimodule.c b/hw/xfree86/dri/drimodule.c
index 331de82..b39c22e 100644
--- a/hw/xfree86/dri/drimodule.c
+++ b/hw/xfree86/dri/drimodule.c
@@ -74,23 +74,14 @@ static pointer
 driSetup(pointer module, pointer opts, int *errmaj, int *errmin)
 {
     static Bool setupDone = FALSE;
-    pointer drm = NULL;
 
     if (!setupDone) {
 	setupDone = TRUE;
-    
-    	drm = 
-	   LoadSubModule(module, "drm", NULL, NULL, NULL, NULL, errmaj, errmin);
-    
-	if (!drm) {
-	    if (errmaj) *errmaj = LDR_NOSUBENT;
-	} else {
-	    LoadExtension(&XF86DRIExt, FALSE);
-	}
+	LoadExtension(&XF86DRIExt, FALSE);
     } else {
 	if (errmaj) *errmaj = LDR_ONCEONLY;
     }
     /* Need a non-NULL return value to indicate success */
-    return drm;
+    return 1;
 }
 
diff --git a/hw/xfree86/os-support/Makefile.am b/hw/xfree86/os-support/Makefile.am
index b07e3c9..f9a888e 100644
--- a/hw/xfree86/os-support/Makefile.am
+++ b/hw/xfree86/os-support/Makefile.am
@@ -1,14 +1,10 @@
-if DRI
-DRI_SUBDIRS=drm
-endif
-
 SUBDIRS = bus @XORG_OS_SUBDIR@ misc $(DRI_SUBDIRS)
 DIST_SUBDIRS = bsd bus drm misc linux lynxos solaris sysv sco usl hurd
 
 sdk_HEADERS = xf86_OSproc.h xf86_OSlib.h xf86_ansic.h xf86_libc.h \
               assyntax.h xf86OSmouse.h
 
-EXTRA_DIST = int10Defines.h xf86OSpriv.h README.OS-lib xf86drm.h
+EXTRA_DIST = int10Defines.h xf86OSpriv.h README.OS-lib
 
 # to get the grouping semantics right, you have to glom these three together
 # as one library, otherwise libtool will actively defeat your attempts to
diff --git a/hw/xfree86/os-support/drm/Makefile.am b/hw/xfree86/os-support/drm/Makefile.am
deleted file mode 100644
index 5389325..0000000
--- a/hw/xfree86/os-support/drm/Makefile.am
+++ /dev/null
@@ -1,19 +0,0 @@
-libdrm_la_LTLIBRARIES = libdrm.la
-libdrm_la_CFLAGS = -I$(top_srcdir)/hw/xfree86/common \
-                   -I$(top_srcdir)/hw/xfree86/dri \
-                   -I$(top_srcdir)/hw/xfree86/os-support \
-                   -I$(top_srcdir)/hw/xfree86/os-support/bus \
-                   -I$(top_srcdir)/hw/xfree86/os-suport/shared/drm/kernel \
-                   -I$(top_srcdir)/GL/glx \
-                   -I$(top_srcdir)/GL/include \
-                   -DHAVE_XORG_CONFIG_H \
-                   @LIBDRM_CFLAGS@
-
-libdrm_la_LDFLAGS = -module -avoid-version
-libdrm_ladir = $(moduledir)/@XORG_OS@
-libdrm_la_SOURCES = \
-	xf86drm.c \
-	xf86drmHash.c \
-	xf86drmRandom.c \
-	xf86drmSL.c \
-	drmmodule.c
diff --git a/hw/xfree86/os-support/drm/drmmodule.c b/hw/xfree86/os-support/drm/drmmodule.c
deleted file mode 100644
index 8d2b4bc..0000000
--- a/hw/xfree86/os-support/drm/drmmodule.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/* drmmodule.c -- Module initialization
- * Created: Fri Jun  4 09:05:48 1999 by faith at precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- * 
- * Authors: Rickard E. (Rik) Faith <faith at valinux.com>
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86Module.h"
-
-static MODULESETUPPROTO(drmSetup);
-
-static XF86ModuleVersionInfo VersRec =
-{
-        "drm",
-        MODULEVENDORSTRING,
-        MODINFOSTRING1,
-        MODINFOSTRING2,
-        XORG_VERSION_CURRENT,
-        1, 0, 0,
-        ABI_CLASS_EXTENSION,
-        ABI_EXTENSION_VERSION,
-        MOD_CLASS_NONE,
-        {0,0,0,0}
-};
-
-_X_EXPORT XF86ModuleData drmModuleData = { &VersRec, drmSetup, NULL };
-
-static pointer
-drmSetup(pointer module, pointer opts, int *errmaj, int *errmin)
-{
-    return (void *)1;
-}
diff --git a/hw/xfree86/os-support/drm/xf86drm.c b/hw/xfree86/os-support/drm/xf86drm.c
deleted file mode 100644
index e990e28..0000000
--- a/hw/xfree86/os-support/drm/xf86drm.c
+++ /dev/null
@@ -1,3262 +0,0 @@
-/**
- * \file xf86drm.c 
- * User-level interface to DRM device
- *
- * \author Rickard E. (Rik) Faith <faith at valinux.com>
- * \author Kevin E. Martin <martin at valinux.com>
- */
-
-/*
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <libdrm-config.h>
-#include <xorg-config.h>
-#endif
-
-#include "xf86.h"
-#include "xf86_OSproc.h"
-#define _DRM_MALLOC xalloc
-#define _DRM_FREE   xfree
-
-#include "drm.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <ctype.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#define stat_t struct stat
-#include <sys/ioctl.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <stdarg.h>
-
-/* No longer needed with CVS kernel modules on alpha 
-#if defined(__alpha__) && defined(__linux__)
-extern unsigned long _bus_base(void);
-#define BUS_BASE _bus_base()
-#endif
-*/
-
-/* Not all systems have MAP_FAILED defined */
-#ifndef MAP_FAILED
-#define MAP_FAILED ((void *)-1)
-#endif
-
-#include "xf86drm.h"
-
-#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
-#define DRM_MAJOR 145
-#endif
-
-#ifdef __NetBSD__
-#define DRM_MAJOR 34
-#endif
-
-# ifdef __OpenBSD__
-#  define DRM_MAJOR 81
-# endif
-
-#ifndef DRM_MAJOR
-#define DRM_MAJOR 226		/* Linux */
-#endif
-
-#ifndef DRM_MAX_MINOR
-#define DRM_MAX_MINOR 16
-#endif
-
-#ifndef makedev
-				/* This definition needs to be changed on
-                                   some systems if dev_t is a structure.
-                                   If there is a header file we can get it
-                                   from, there would be best. */
-#define makedev(x,y)    ((dev_t)(((x) << 8) | (y)))
-#endif
-
-#define DRM_MSG_VERBOSITY 3
-
-/**
- * Output a message to stderr.
- *
- * \param format printf() like format string.
- *
- * \internal
- * This function is a wrapper around vfprintf().
- */
-static void
-drmMsg(const char *format, ...)
-{
-    va_list	ap;
-
-    va_start(ap, format);
-    xf86VDrvMsgVerb(-1, X_NONE, DRM_MSG_VERBOSITY, format, ap);
-    va_end(ap);
-}
-
-static void *drmHashTable = NULL; /* Context switch callbacks */
-
-typedef struct drmHashEntry {
-    int      fd;
-    void     (*f)(int, void *, void *);
-    void     *tagTable;
-} drmHashEntry;
-
-void *drmMalloc(int size)
-{
-    void *pt;
-    if ((pt = _DRM_MALLOC(size))) memset(pt, 0, size);
-    return pt;
-}
-
-void drmFree(void *pt)
-{
-    if (pt) _DRM_FREE(pt);
-}
-
-/* drmStrdup can't use strdup(3), since it doesn't call _DRM_MALLOC... */
-static char *drmStrdup(const char *s)
-{
-    char *retval = NULL;
-
-    if (s) {
-	retval = _DRM_MALLOC(strlen(s)+1);
-	strcpy(retval, s);
-    }
-    return retval;
-}
-
-
-static unsigned long drmGetKeyFromFd(int fd)
-{
-    stat_t     st;
-
-    st.st_rdev = 0;
-    fstat(fd, &st);
-    return st.st_rdev;
-}
-
-static drmHashEntry *drmGetEntry(int fd)
-{
-    unsigned long key = drmGetKeyFromFd(fd);
-    void          *value;
-    drmHashEntry  *entry;
-
-    if (!drmHashTable) drmHashTable = drmHashCreate();
-
-    if (drmHashLookup(drmHashTable, key, &value)) {
-	entry           = drmMalloc(sizeof(*entry));
-	entry->fd       = fd;
-	entry->f        = NULL;
-	entry->tagTable = drmHashCreate();
-	drmHashInsert(drmHashTable, key, entry);
-    } else {
-	entry = value;
-    }
-    return entry;
-}
-
-/**
- * Compare two busid strings
- *
- * \param first
- * \param second
- *
- * \return 1 if matched.
- *
- * \internal
- * This function compares two bus ID strings.  It understands the older
- * PCI:b:d:f format and the newer pci:oooo:bb:dd.f format.  In the format, o is
- * domain, b is bus, d is device, f is function.
- */
-static int drmMatchBusID(const char *id1, const char *id2)
-{
-    /* First, check if the IDs are exactly the same */
-    if (strcasecmp(id1, id2) == 0)
-	return 1;
-
-    /* Try to match old/new-style PCI bus IDs. */
-    if (strncasecmp(id1, "pci", 3) == 0) {
-	int o1, b1, d1, f1;
-	int o2, b2, d2, f2;
-	int ret;
-
-	ret = sscanf(id1, "pci:%04x:%02x:%02x.%d", &o1, &b1, &d1, &f1);
-	if (ret != 4) {
-	    o1 = 0;
-	    ret = sscanf(id1, "PCI:%d:%d:%d", &b1, &d1, &f1);
-	    if (ret != 3)
-		return 0;
-	}
-
-	ret = sscanf(id2, "pci:%04x:%02x:%02x.%d", &o2, &b2, &d2, &f2);
-	if (ret != 4) {
-	    o2 = 0;
-	    ret = sscanf(id2, "PCI:%d:%d:%d", &b2, &d2, &f2);
-	    if (ret != 3)
-		return 0;
-	}
-
-	if ((o1 != o2) || (b1 != b2) || (d1 != d2) || (f1 != f2))
-	    return 0;
-	else
-	    return 1;
-    }
-    return 0;
-}
-
-/**
- * Open the DRM device, creating it if necessary.
- *
- * \param dev major and minor numbers of the device.
- * \param minor minor number of the device.
- * 
- * \return a file descriptor on success, or a negative value on error.
- *
- * \internal
- * Assembles the device name from \p minor and opens it, creating the device
- * special file node with the major and minor numbers specified by \p dev and
- * parent directory if necessary and was called by root.
- */
-static int drmOpenDevice(long dev, int minor)
-{
-    stat_t          st;
-    char            buf[64];
-    int             fd;
-    mode_t          devmode = DRM_DEV_MODE;
-    int             isroot  = !geteuid();
-    uid_t           user    = DRM_DEV_UID;
-    gid_t           group   = DRM_DEV_GID;
-
-    sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
-    drmMsg("drmOpenDevice: node name is %s\n", buf);
-
-    devmode  = xf86ConfigDRI.mode ? xf86ConfigDRI.mode : DRM_DEV_MODE;
-    devmode &= ~(S_IXUSR|S_IXGRP|S_IXOTH);
-    group = (xf86ConfigDRI.group >= 0) ? xf86ConfigDRI.group : DRM_DEV_GID;
-
-    if (stat(DRM_DIR_NAME, &st)) {
-	if (!isroot) return DRM_ERR_NOT_ROOT;
-	mkdir(DRM_DIR_NAME, DRM_DEV_DIRMODE);
-	chown(DRM_DIR_NAME, 0, 0); /* root:root */
-	chmod(DRM_DIR_NAME, DRM_DEV_DIRMODE);
-    }
-
-    /* Check if the device node exists and create it if necessary. */
-    if (stat(buf, &st)) {
-	if (!isroot) return DRM_ERR_NOT_ROOT;
-	remove(buf);
-	mknod(buf, S_IFCHR | devmode, dev);
-    }
-    chown(buf, user, group);
-    chmod(buf, devmode);
-
-    fd = open(buf, O_RDWR, 0);
-    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
-		fd, fd < 0 ? strerror(errno) : "OK");
-    if (fd >= 0) return fd;
-
-    /* Check if the device node is not what we expect it to be, and recreate it
-     * and try again if so.
-     */
-    if (st.st_rdev != dev) {
-	if (!isroot) return DRM_ERR_NOT_ROOT;
-	remove(buf);
-	mknod(buf, S_IFCHR | devmode, dev);
-	chown(buf, user, group);
-	chmod(buf, devmode);
-    }
-    fd = open(buf, O_RDWR, 0);
-    drmMsg("drmOpenDevice: open result is %d, (%s)\n",
-		fd, fd < 0 ? strerror(errno) : "OK");
-    if (fd >= 0) return fd;
-
-    drmMsg("drmOpenDevice: Open failed\n");
-    remove(buf);
-    return -errno;
-}
-
-
-/**
- * Open the DRM device
- *
- * \param minor device minor number.
- * \param create allow to create the device if set.
- *
- * \return a file descriptor on success, or a negative value on error.
- * 
- * \internal
- * Calls drmOpenDevice() if \p create is set, otherwise assembles the device
- * name from \p minor and opens it.
- */
-static int drmOpenMinor(int minor, int create)
-{
-    int  fd;
-    char buf[64];
-    
-    if (create) return drmOpenDevice(makedev(DRM_MAJOR, minor), minor);
-    
-    sprintf(buf, DRM_DEV_NAME, DRM_DIR_NAME, minor);
-    if ((fd = open(buf, O_RDWR, 0)) >= 0) return fd;
-    return -errno;
-}
-
-
-/**
- * Determine whether the DRM kernel driver has been loaded.
- * 
- * \return 1 if the DRM driver is loaded, 0 otherwise.
- *
- * \internal 
- * Determine the presence of the kernel driver by attempting to open the 0
- * minor and get version information.  For backward compatibility with older
- * Linux implementations, /proc/dri is also checked.
- */
-int drmAvailable(void)
-{
-    drmVersionPtr version;
-    int           retval = 0;
-    int           fd;
-
-    if ((fd = drmOpenMinor(0, 1)) < 0) {
-#ifdef __linux__
-				/* Try proc for backward Linux compatibility */
-	if (!access("/proc/dri/0", R_OK)) return 1;
-#endif
-	return 0;
-    }
-    
-    if ((version = drmGetVersion(fd))) {
-	retval = 1;
-	drmFreeVersion(version);
-    }
-    close(fd);
-
-    return retval;
-}
-
-
-/**
- * Open the device by bus ID.
- *
- * \param busid bus ID.
- *
- * \return a file descriptor on success, or a negative value on error.
- *
- * \internal
- * This function attempts to open every possible minor (up to DRM_MAX_MINOR),
- * comparing the device bus ID with the one supplied.
- *
- * \sa drmOpenMinor() and drmGetBusid().
- */
-static int drmOpenByBusid(const char *busid)
-{
-    int        i;
-    int        fd;
-    const char *buf;
-    drmSetVersion sv;
-
-    drmMsg("drmOpenByBusid: Searching for BusID %s\n", busid);
-    for (i = 0; i < DRM_MAX_MINOR; i++) {
-	fd = drmOpenMinor(i, 1);
-	drmMsg("drmOpenByBusid: drmOpenMinor returns %d\n", fd);
-	if (fd >= 0) {
-	    sv.drm_di_major = 1;
-	    sv.drm_di_minor = 1;
-	    sv.drm_dd_major = -1;	/* Don't care */
-	    drmSetInterfaceVersion(fd, &sv);
-	    buf = drmGetBusid(fd);
-	    drmMsg("drmOpenByBusid: drmGetBusid reports %s\n", buf);
-	    if (buf && drmMatchBusID(buf, busid)) {
-		drmFreeBusid(buf);
-		return fd;
-	    }
-	    if (buf) drmFreeBusid(buf);
-	    close(fd);
-	}
-    }
-    return -1;
-}
-
-
-/**
- * Open the device by name.
- *
- * \param name driver name.
- * 
- * \return a file descriptor on success, or a negative value on error.
- * 
- * \internal
- * This function opens the first minor number that matches the driver name and
- * isn't already in use.  If it's in use it then it will already have a bus ID
- * assigned.
- * 
- * \sa drmOpenMinor(), drmGetVersion() and drmGetBusid().
- */
-static int drmOpenByName(const char *name)
-{
-    int           i;
-    int           fd;
-    drmVersionPtr version;
-    char *        id;
-    
-    if (!drmAvailable()) {
-        /* try to load the kernel module now */
-        if (!xf86LoadKernelModule(name)) {
-            ErrorF("[drm] failed to load kernel module \"%s\"\n",
-		   name);
-            return -1;
-        }
-    }
-
-    /*
-     * Open the first minor number that matches the driver name and isn't
-     * already in use.  If it's in use it will have a busid assigned already.
-     */
-    for (i = 0; i < DRM_MAX_MINOR; i++) {
-	if ((fd = drmOpenMinor(i, 1)) >= 0) {
-	    if ((version = drmGetVersion(fd))) {
-		if (!strcmp(version->name, name)) {
-		    drmFreeVersion(version);
-		    id = drmGetBusid(fd);
-		    drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL");
-		    if (!id || !*id) {
-			if (id) {
-			    drmFreeBusid(id);
-			}
-			return fd;
-		    } else {
-			drmFreeBusid(id);
-		    }
-		} else {
-		    drmFreeVersion(version);
-		}
-	    }
-	    close(fd);
-	}
-    }
-
-#ifdef __linux__
-				/* Backward-compatibility /proc support */
-    for (i = 0; i < 8; i++) {
-	char proc_name[64], buf[512];
-	char *driver, *pt, *devstring;
-	int  retcode;
-	
-	sprintf(proc_name, "/proc/dri/%d/name", i);
-	if ((fd = open(proc_name, 0, 0)) >= 0) {
-	    retcode = read(fd, buf, sizeof(buf)-1);
-	    close(fd);
-	    if (retcode) {
-		buf[retcode-1] = '\0';
-		for (driver = pt = buf; *pt && *pt != ' '; ++pt)
-		    ;
-		if (*pt) {	/* Device is next */
-		    *pt = '\0';
-		    if (!strcmp(driver, name)) { /* Match */
-			for (devstring = ++pt; *pt && *pt != ' '; ++pt)
-			    ;
-			if (*pt) { /* Found busid */
-			    return drmOpenByBusid(++pt);
-			} else {	/* No busid */
-			    return drmOpenDevice(strtol(devstring, NULL, 0),i);
-			}
-		    }
-		}
-	    }
-	}
-    }
-#endif
-
-    return -1;
-}
-
-
-/**
- * Open the DRM device.
- *
- * Looks up the specified name and bus ID, and opens the device found.  The
- * entry in /dev/dri is created if necessary and if called by root.
- *
- * \param name driver name. Not referenced if bus ID is supplied.
- * \param busid bus ID. Zero if not known.
- * 
- * \return a file descriptor on success, or a negative value on error.
- * 
- * \internal
- * It calls drmOpenByBusid() if \p busid is specified or drmOpenByName()
- * otherwise.
- */
-int drmOpen(const char *name, const char *busid)
-{
-    if (!drmAvailable() && name != NULL) {
-	/* try to load the kernel */
-	if (!xf86LoadKernelModule(name)) {
-	    ErrorF("[drm] failed to load kernel module \"%s\"\n",
-	           name);
-	    return -1;
-	}
-    }
-
-    if (busid) {
-	int fd;
-
-	fd = drmOpenByBusid(busid);
-	if (fd >= 0)
-	    return fd;
-    }
-    if (name)
-	return drmOpenByName(name);
-    return -1;
-}
-
-
-/**
- * Free the version information returned by drmGetVersion().
- *
- * \param v pointer to the version information.
- *
- * \internal
- * It frees the memory pointed by \p %v as well as all the non-null strings
- * pointers in it.
- */
-void drmFreeVersion(drmVersionPtr v)
-{
-    if (!v) return;
-    if (v->name) drmFree(v->name);
-    if (v->date) drmFree(v->date);
-    if (v->desc) drmFree(v->desc);
-    drmFree(v);
-}
-
-
-/**
- * Free the non-public version information returned by the kernel.
- *
- * \param v pointer to the version information.
- *
- * \internal
- * Used by drmGetVersion() to free the memory pointed by \p %v as well as all
- * the non-null strings pointers in it.
- */
-static void drmFreeKernelVersion(drm_version_t *v)
-{
-    if (!v) return;
-    if (v->name) drmFree(v->name);
-    if (v->date) drmFree(v->date);
-    if (v->desc) drmFree(v->desc);
-    drmFree(v);
-}
-
-
-/**
- * Copy version information.
- * 
- * \param d destination pointer.
- * \param s source pointer.
- * 
- * \internal
- * Used by drmGetVersion() to translate the information returned by the ioctl
- * interface in a private structure into the public structure counterpart.
- */
-static void drmCopyVersion(drmVersionPtr d, const drm_version_t *s)
-{
-    d->version_major      = s->version_major;
-    d->version_minor      = s->version_minor;
-    d->version_patchlevel = s->version_patchlevel;
-    d->name_len           = s->name_len;
-    d->name               = drmStrdup(s->name);
-    d->date_len           = s->date_len;
-    d->date               = drmStrdup(s->date);
-    d->desc_len           = s->desc_len;
-    d->desc               = drmStrdup(s->desc);
-}
-
-
-/**
- * Query the driver version information.
- *
- * \param fd file descriptor.
- * 
- * \return pointer to a drmVersion structure which should be freed with
- * drmFreeVersion().
- * 
- * \note Similar information is available via /proc/dri.
- * 
- * \internal
- * It gets the version information via successive DRM_IOCTL_VERSION ioctls,
- * first with zeros to get the string lengths, and then the actually strings.
- * It also null-terminates them since they might not be already.
- */
-drmVersionPtr drmGetVersion(int fd)
-{
-    drmVersionPtr retval;
-    drm_version_t *version = drmMalloc(sizeof(*version));
-
-				/* First, get the lengths */
-    version->name_len    = 0;
-    version->name        = NULL;
-    version->date_len    = 0;
-    version->date        = NULL;
-    version->desc_len    = 0;
-    version->desc        = NULL;
-
-    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
-	drmFreeKernelVersion(version);
-	return NULL;
-    }
-
-				/* Now, allocate space and get the data */
-    if (version->name_len)
-	version->name    = drmMalloc(version->name_len + 1);
-    if (version->date_len)
-	version->date    = drmMalloc(version->date_len + 1);
-    if (version->desc_len)
-	version->desc    = drmMalloc(version->desc_len + 1);
-
-    if (ioctl(fd, DRM_IOCTL_VERSION, version)) {
-	drmMsg("DRM_IOCTL_VERSION: %s\n", strerror(errno));
-	drmFreeKernelVersion(version);
-	return NULL;
-    }
-
-				/* The results might not be null-terminated
-                                   strings, so terminate them. */
-
-    if (version->name_len) version->name[version->name_len] = '\0';
-    if (version->date_len) version->date[version->date_len] = '\0';
-    if (version->desc_len) version->desc[version->desc_len] = '\0';
-
-				/* Now, copy it all back into the
-                                   client-visible data structure... */
-    retval = drmMalloc(sizeof(*retval));
-    drmCopyVersion(retval, version);
-    drmFreeKernelVersion(version);
-    return retval;
-}
-
-
-/**
- * Get version information for the DRM user space library.
- * 
- * This version number is driver independent.
- * 
- * \param fd file descriptor.
- *
- * \return version information.
- * 
- * \internal
- * This function allocates and fills a drm_version structure with a hard coded
- * version number.
- */
-drmVersionPtr drmGetLibVersion(int fd)
-{
-    drm_version_t *version = drmMalloc(sizeof(*version));
-
-    /* Version history:
-     *   revision 1.0.x = original DRM interface with no drmGetLibVersion
-     *                    entry point and many drm<Device> extensions
-     *   revision 1.1.x = added drmCommand entry points for device extensions
-     *                    added drmGetLibVersion to identify libdrm.a version
-     *   revision 1.2.x = added drmSetInterfaceVersion
-     *                    modified drmOpen to handle both busid and name
-     */
-    version->version_major      = 1;
-    version->version_minor      = 2;
-    version->version_patchlevel = 0;
-
-    return (drmVersionPtr)version;
-}
-
-
-/**
- * Free the bus ID information.
- *
- * \param busid bus ID information string as given by drmGetBusid().
- *
- * \internal
- * This function is just frees the memory pointed by \p busid.
- */
-void drmFreeBusid(const char *busid)
-{
-    drmFree((void *)busid);
-}
-
-
-/**
- * Get the bus ID of the device.
- *
- * \param fd file descriptor.
- *
- * \return bus ID string.
- *
- * \internal
- * This function gets the bus ID via successive DRM_IOCTL_GET_UNIQUE ioctls to
- * get the string length and data, passing the arguments in a drm_unique
- * structure.
- */
-char *drmGetBusid(int fd)
-{
-    drm_unique_t u;
-
-    u.unique_len = 0;
-    u.unique     = NULL;
-
-    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL;
-    u.unique = drmMalloc(u.unique_len + 1);
-    if (ioctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) return NULL;
-    u.unique[u.unique_len] = '\0';
-
-    return u.unique;
-}
-
-
-/**
- * Set the bus ID of the device.
- *
- * \param fd file descriptor.
- * \param busid bus ID string.
- *
- * \return zero on success, negative on failure.
- *
- * \internal
- * This function is a wrapper around the DRM_IOCTL_SET_UNIQUE ioctl, passing
- * the arguments in a drm_unique structure.
- */
-int drmSetBusid(int fd, const char *busid)
-{
-    drm_unique_t u;
-
-    u.unique     = (char *)busid;
-    u.unique_len = strlen(busid);
-
-    if (ioctl(fd, DRM_IOCTL_SET_UNIQUE, &u)) {
-	return -errno;
-    }
-    return 0;
-}
-
-int drmGetMagic(int fd, drm_magic_t * magic)
-{
-    drm_auth_t auth;
-
-    *magic = 0;
-    if (ioctl(fd, DRM_IOCTL_GET_MAGIC, &auth)) return -errno;
-    *magic = auth.magic;
-    return 0;
-}
-
-int drmAuthMagic(int fd, drm_magic_t magic)
-{
-    drm_auth_t auth;
-
-    auth.magic = magic;
-    if (ioctl(fd, DRM_IOCTL_AUTH_MAGIC, &auth)) return -errno;
-    return 0;
-}
-
-/**
- * Specifies a range of memory that is available for mapping by a
- * non-root process.
- *
- * \param fd file descriptor.
- * \param offset usually the physical address. The actual meaning depends of
- * the \p type parameter. See below.
- * \param size of the memory in bytes.
- * \param type type of the memory to be mapped.
- * \param flags combination of several flags to modify the function actions.
- * \param handle will be set to a value that may be used as the offset
- * parameter for mmap().
- * 
- * \return zero on success or a negative value on error.
- *
- * \par Mapping the frame buffer
- * For the frame buffer
- * - \p offset will be the physical address of the start of the frame buffer,
- * - \p size will be the size of the frame buffer in bytes, and
- * - \p type will be DRM_FRAME_BUFFER.
- *
- * \par
- * The area mapped will be uncached. If MTRR support is available in the
- * kernel, the frame buffer area will be set to write combining. 
- *
- * \par Mapping the MMIO register area
- * For the MMIO register area,
- * - \p offset will be the physical address of the start of the register area,
- * - \p size will be the size of the register area bytes, and
- * - \p type will be DRM_REGISTERS.
- * \par
- * The area mapped will be uncached. 
- * 
- * \par Mapping the SAREA
- * For the SAREA,
- * - \p offset will be ignored and should be set to zero,
- * - \p size will be the desired size of the SAREA in bytes,
- * - \p type will be DRM_SHM.
- * 
- * \par
- * A shared memory area of the requested size will be created and locked in
- * kernel memory. This area may be mapped into client-space by using the handle
- * returned. 
- * 
- * \note May only be called by root.
- *
- * \internal
- * This function is a wrapper around the DRM_IOCTL_ADD_MAP ioctl, passing
- * the arguments in a drm_map structure.
- */
-int drmAddMap(int fd,
-	      drm_handle_t offset,
-	      drmSize size,
-	      drmMapType type,
-	      drmMapFlags flags,
-	      drm_handle_t * handle)
-{
-    drm_map_t map;
-
-    map.offset  = offset;
-/* No longer needed with CVS kernel modules on alpha
-#ifdef __alpha__
-    if (type != DRM_SHM)
-	map.offset += BUS_BASE;
-#endif
-*/
-    map.size    = size;
-    map.handle  = 0;
-    map.type    = type;
-    map.flags   = flags;
-    if (ioctl(fd, DRM_IOCTL_ADD_MAP, &map)) return -errno;
-    if (handle) *handle = (drm_handle_t)(unsigned long)map.handle;
-    return 0;
-}
-
-int drmRmMap(int fd, drm_handle_t handle)
-{
-    drm_map_t map;
-
-    map.handle = (void *)(unsigned long)handle;
-
-    if(ioctl(fd, DRM_IOCTL_RM_MAP, &map)) return -errno;
-    return 0;
-}
-
-/**
- * Make buffers available for DMA transfers.
- * 
- * \param fd file descriptor.
- * \param count number of buffers.
- * \param size size of each buffer.
- * \param flags buffer allocation flags.
- * \param agp_offset offset in the AGP aperture 
- *
- * \return number of buffers allocated, negative on error.
- *
- * \internal
- * This function is a wrapper around DRM_IOCTL_ADD_BUFS ioctl.
- *
- * \sa drm_buf_desc.
- */
-int drmAddBufs(int fd, int count, int size, drmBufDescFlags flags,
-	       int agp_offset)
-{
-    drm_buf_desc_t request;
-
-    request.count     = count;
-    request.size      = size;
-    request.low_mark  = 0;
-    request.high_mark = 0;
-    request.flags     = flags;
-    request.agp_start = agp_offset;
-
-    if (ioctl(fd, DRM_IOCTL_ADD_BUFS, &request)) return -errno;
-    return request.count;
-}
-
-int drmMarkBufs(int fd, double low, double high)
-{
-    drm_buf_info_t info;
-    int            i;
-
-    info.count = 0;
-    info.list  = NULL;
-
-    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return -EINVAL;
-
-    if (!info.count) return -EINVAL;
-
-    if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
-	return -ENOMEM;
-
-    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
-	int retval = -errno;
-	drmFree(info.list);
-	return retval;
-    }
-
-    for (i = 0; i < info.count; i++) {
-	info.list[i].low_mark  = low  * info.list[i].count;
-	info.list[i].high_mark = high * info.list[i].count;
-	if (ioctl(fd, DRM_IOCTL_MARK_BUFS, &info.list[i])) {
-	    int retval = -errno;
-	    drmFree(info.list);
-	    return retval;
-	}
-    }
-    drmFree(info.list);
-
-    return 0;
-}
-
-/**
- * Free buffers.
- *
- * \param fd file descriptor.
- * \param count number of buffers to free.
- * \param list list of buffers to be freed.
- *
- * \return zero on success, or a negative value on failure.
- * 
- * \note This function is primarily used for debugging.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_FREE_BUFS ioctl, passing
- * the arguments in a drm_buf_free structure.
- */
-int drmFreeBufs(int fd, int count, int *list)
-{
-    drm_buf_free_t request;
-
-    request.count = count;
-    request.list  = list;
-    if (ioctl(fd, DRM_IOCTL_FREE_BUFS, &request)) return -errno;
-    return 0;
-}
-
-
-/**
- * Close the device.
- *
- * \param fd file descriptor.
- *
- * \internal
- * This function closes the file descriptor.
- */
-int drmClose(int fd)
-{
-    unsigned long key    = drmGetKeyFromFd(fd);
-    drmHashEntry  *entry = drmGetEntry(fd);
-
-    drmHashDestroy(entry->tagTable);
-    entry->fd       = 0;
-    entry->f        = NULL;
-    entry->tagTable = NULL;
-
-    drmHashDelete(drmHashTable, key);
-    drmFree(entry);
-
-    return close(fd);
-}
-
-
-/**
- * Map a region of memory.
- *
- * \param fd file descriptor.
- * \param handle handle returned by drmAddMap().
- * \param size size in bytes. Must match the size used by drmAddMap().
- * \param address will contain the user-space virtual address where the mapping
- * begins.
- *
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper for mmap().
- */
-int drmMap(int fd,
-	   drm_handle_t handle,
-	   drmSize size,
-	   drmAddressPtr address)
-{
-    static unsigned long pagesize_mask = 0;
-
-    if (fd < 0) return -EINVAL;
-
-    if (!pagesize_mask)
-	pagesize_mask = getpagesize() - 1;
-
-    size = (size + pagesize_mask) & ~pagesize_mask;
-
-    *address = mmap(0, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, handle);
-    if (*address == MAP_FAILED) return -errno;
-    return 0;
-}
-
-
-/**
- * Unmap mappings obtained with drmMap().
- *
- * \param address address as given by drmMap().
- * \param size size in bytes. Must match the size used by drmMap().
- * 
- * \return zero on success, or a negative value on failure.
- *
- * \internal
- * This function is a wrapper for unmap().
- */
-int drmUnmap(drmAddress address, drmSize size)
-{
-    return munmap(address, size);
-}
-
-drmBufInfoPtr drmGetBufInfo(int fd)
-{
-    drm_buf_info_t info;
-    drmBufInfoPtr  retval;
-    int            i;
-
-    info.count = 0;
-    info.list  = NULL;
-
-    if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) return NULL;
-
-    if (info.count) {
-	if (!(info.list = drmMalloc(info.count * sizeof(*info.list))))
-	    return NULL;
-
-	if (ioctl(fd, DRM_IOCTL_INFO_BUFS, &info)) {
-	    drmFree(info.list);
-	    return NULL;
-	}
-				/* Now, copy it all back into the
-                                   client-visible data structure... */
-	retval = drmMalloc(sizeof(*retval));
-	retval->count = info.count;
-	retval->list  = drmMalloc(info.count * sizeof(*retval->list));
-	for (i = 0; i < info.count; i++) {
-	    retval->list[i].count     = info.list[i].count;
-	    retval->list[i].size      = info.list[i].size;
-	    retval->list[i].low_mark  = info.list[i].low_mark;
-	    retval->list[i].high_mark = info.list[i].high_mark;
-	}
-	drmFree(info.list);
-	return retval;
-    }
-    return NULL;
-}
-
-/**
- * Map all DMA buffers into client-virtual space.
- *
- * \param fd file descriptor.
- *
- * \return a pointer to a ::drmBufMap structure.
- *
- * \note The client may not use these buffers until obtaining buffer indices
- * with drmDMA().
- * 
- * \internal
- * This function calls the DRM_IOCTL_MAP_BUFS ioctl and copies the returned
- * information about the buffers in a drm_buf_map structure into the
- * client-visible data structures.
- */ 
-drmBufMapPtr drmMapBufs(int fd)
-{
-    drm_buf_map_t bufs;
-    drmBufMapPtr  retval;
-    int           i;
-
-    bufs.count = 0;
-    bufs.list  = NULL;
-    bufs.virtual = NULL;
-    if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) return NULL;
-
-    if (!bufs.count) return NULL;
-
-	if (!(bufs.list = drmMalloc(bufs.count * sizeof(*bufs.list))))
-	    return NULL;
-
-	if (ioctl(fd, DRM_IOCTL_MAP_BUFS, &bufs)) {
-	    drmFree(bufs.list);
-	    return NULL;
-	}
-				/* Now, copy it all back into the
-                                   client-visible data structure... */
-	retval = drmMalloc(sizeof(*retval));
-	retval->count = bufs.count;
-	retval->list  = drmMalloc(bufs.count * sizeof(*retval->list));
-	for (i = 0; i < bufs.count; i++) {
-	    retval->list[i].idx     = bufs.list[i].idx;
-	    retval->list[i].total   = bufs.list[i].total;
-	    retval->list[i].used    = 0;
-	    retval->list[i].address = bufs.list[i].address;
-	}
-
-	drmFree(bufs.list);
-	
-	return retval;
-}
-
-
-/**
- * Unmap buffers allocated with drmMapBufs().
- *
- * \return zero on success, or negative value on failure.
- *
- * \internal
- * Calls munmap() for every buffer stored in \p bufs and frees the
- * memory allocated by drmMapBufs().
- */
-int drmUnmapBufs(drmBufMapPtr bufs)
-{
-    int i;
-
-    for (i = 0; i < bufs->count; i++) {
-	munmap(bufs->list[i].address, bufs->list[i].total);
-    }
-
-    drmFree(bufs->list);
-    drmFree(bufs);
-	
-    return 0;
-}
-
-
-#define DRM_DMA_RETRY		16
-
-/**
- * Reserve DMA buffers.
- *
- * \param fd file descriptor.
- * \param request 
- * 
- * \return zero on success, or a negative value on failure.
- *
- * \internal
- * Assemble the arguments into a drm_dma structure and keeps issuing the
- * DRM_IOCTL_DMA ioctl until success or until maximum number of retries.
- */
-int drmDMA(int fd, drmDMAReqPtr request)
-{
-    drm_dma_t dma;
-    int ret, i = 0;
-
-				/* Copy to hidden structure */
-    dma.context         = request->context;
-    dma.send_count      = request->send_count;
-    dma.send_indices    = request->send_list;
-    dma.send_sizes      = request->send_sizes;
-    dma.flags           = request->flags;
-    dma.request_count   = request->request_count;
-    dma.request_size    = request->request_size;
-    dma.request_indices = request->request_list;
-    dma.request_sizes   = request->request_sizes;
-    dma.granted_count   = 0;
-
-    do {
-	ret = ioctl( fd, DRM_IOCTL_DMA, &dma );
-    } while ( ret && errno == EAGAIN && i++ < DRM_DMA_RETRY );
-
-    if ( ret == 0 ) {
-	request->granted_count = dma.granted_count;
-	return 0;
-    } else {
-	return -errno;
-    }
-}
-
-
-/**
- * Obtain heavyweight hardware lock.
- *
- * \param fd file descriptor.
- * \param context context.
- * \param flags flags that determine the sate of the hardware when the function
- * returns.
- * 
- * \return always zero.
- * 
- * \internal
- * This function translates the arguments into a drm_lock structure and issue
- * the DRM_IOCTL_LOCK ioctl until the lock is successfully acquired.
- */
-int drmGetLock(int fd, drm_context_t context, drmLockFlags flags)
-{
-    drm_lock_t lock;
-
-    lock.context = context;
-    lock.flags   = 0;
-    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
-    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
-    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
-    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
-    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
-    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
-
-    while (ioctl(fd, DRM_IOCTL_LOCK, &lock))
-	;
-    return 0;
-}
-
-/**
- * Release the hardware lock.
- *
- * \param fd file descriptor.
- * \param context context.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_UNLOCK ioctl, passing the
- * argument in a drm_lock structure.
- */
-int drmUnlock(int fd, drm_context_t context)
-{
-    drm_lock_t lock;
-
-    lock.context = context;
-    lock.flags   = 0;
-    return ioctl(fd, DRM_IOCTL_UNLOCK, &lock);
-}
-
-drm_context_t * drmGetReservedContextList(int fd, int *count)
-{
-    drm_ctx_res_t res;
-    drm_ctx_t     *list;
-    drm_context_t * retval;
-    int           i;
-
-    res.count    = 0;
-    res.contexts = NULL;
-    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL;
-
-    if (!res.count) return NULL;
-
-    if (!(list   = drmMalloc(res.count * sizeof(*list)))) return NULL;
-    if (!(retval = drmMalloc(res.count * sizeof(*retval)))) {
-	drmFree(list);
-	return NULL;
-    }
-
-    res.contexts = list;
-    if (ioctl(fd, DRM_IOCTL_RES_CTX, &res)) return NULL;
-
-    for (i = 0; i < res.count; i++) retval[i] = list[i].handle;
-    drmFree(list);
-
-    *count = res.count;
-    return retval;
-}
-
-void drmFreeReservedContextList(drm_context_t * pt)
-{
-    drmFree(pt);
-}
-
-/**
- * Create context.
- *
- * Used by the X server during GLXContext initialization. This causes
- * per-context kernel-level resources to be allocated.
- *
- * \param fd file descriptor.
- * \param handle is set on success. To be used by the client when requesting DMA
- * dispatch with drmDMA().
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \note May only be called by root.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_ADD_CTX ioctl, passing the
- * argument in a drm_ctx structure.
- */
-int drmCreateContext(int fd, drm_context_t * handle)
-{
-    drm_ctx_t ctx;
-
-    ctx.flags = 0;	/* Modified with functions below */
-    if (ioctl(fd, DRM_IOCTL_ADD_CTX, &ctx)) return -errno;
-    *handle = ctx.handle;
-    return 0;
-}
-
-int drmSwitchToContext(int fd, drm_context_t context)
-{
-    drm_ctx_t ctx;
-
-    ctx.handle = context;
-    if (ioctl(fd, DRM_IOCTL_SWITCH_CTX, &ctx)) return -errno;
-    return 0;
-}
-
-int drmSetContextFlags(int fd, drm_context_t context, drm_context_tFlags flags)
-{
-    drm_ctx_t ctx;
-
-				/* Context preserving means that no context
-                                   switched are done between DMA buffers
-                                   from one context and the next.  This is
-                                   suitable for use in the X server (which
-                                   promises to maintain hardware context,
-                                   or in the client-side library when
-                                   buffers are swapped on behalf of two
-                                   threads. */
-    ctx.handle = context;
-    ctx.flags  = 0;
-    if (flags & DRM_CONTEXT_PRESERVED) ctx.flags |= _DRM_CONTEXT_PRESERVED;
-    if (flags & DRM_CONTEXT_2DONLY)    ctx.flags |= _DRM_CONTEXT_2DONLY;
-    if (ioctl(fd, DRM_IOCTL_MOD_CTX, &ctx)) return -errno;
-    return 0;
-}
-
-int drmGetContextFlags(int fd, drm_context_t context, drm_context_tFlagsPtr flags)
-{
-    drm_ctx_t ctx;
-
-    ctx.handle = context;
-    if (ioctl(fd, DRM_IOCTL_GET_CTX, &ctx)) return -errno;
-    *flags = 0;
-    if (ctx.flags & _DRM_CONTEXT_PRESERVED) *flags |= DRM_CONTEXT_PRESERVED;
-    if (ctx.flags & _DRM_CONTEXT_2DONLY)    *flags |= DRM_CONTEXT_2DONLY;
-    return 0;
-}
-
-/**
- * Destroy context.
- *
- * Free any kernel-level resources allocated with drmCreateContext() associated
- * with the context.
- * 
- * \param fd file descriptor.
- * \param handle handle given by drmCreateContext().
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \note May only be called by root.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_RM_CTX ioctl, passing the
- * argument in a drm_ctx structure.
- */
-int drmDestroyContext(int fd, drm_context_t handle)
-{
-    drm_ctx_t ctx;
-    ctx.handle = handle;
-    if (ioctl(fd, DRM_IOCTL_RM_CTX, &ctx)) return -errno;
-    return 0;
-}
-
-int drmCreateDrawable(int fd, drm_drawable_t * handle)
-{
-    drm_draw_t draw;
-    if (ioctl(fd, DRM_IOCTL_ADD_DRAW, &draw)) return -errno;
-    *handle = draw.handle;
-    return 0;
-}
-
-int drmDestroyDrawable(int fd, drm_drawable_t handle)
-{
-    drm_draw_t draw;
-    draw.handle = handle;
-    if (ioctl(fd, DRM_IOCTL_RM_DRAW, &draw)) return -errno;
-    return 0;
-}
-
-int drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
-			   drm_drawable_info_type_t type, unsigned int num,
-			   void *data)
-{
-    drm_update_draw_t update;
-
-    update.handle = handle;
-    update.type = type;
-    update.num = num;
-    update.data = (unsigned long long)(unsigned long)data;
-
-    if (ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update)) return -errno;
-
-    return 0;
-}
-
-/**
- * Acquire the AGP device.
- *
- * Must be called before any of the other AGP related calls.
- *
- * \param fd file descriptor.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_ACQUIRE ioctl.
- */
-int drmAgpAcquire(int fd)
-{
-    if (ioctl(fd, DRM_IOCTL_AGP_ACQUIRE, NULL)) return -errno;
-    return 0;
-}
-
-
-/**
- * Release the AGP device.
- *
- * \param fd file descriptor.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_RELEASE ioctl.
- */
-int drmAgpRelease(int fd)
-{
-    if (ioctl(fd, DRM_IOCTL_AGP_RELEASE, NULL)) return -errno;
-    return 0;
-}
-
-
-/**
- * Set the AGP mode.
- *
- * \param fd file descriptor.
- * \param mode AGP mode.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_ENABLE ioctl, passing the
- * argument in a drm_agp_mode structure.
- */
-int drmAgpEnable(int fd, unsigned long mode)
-{
-    drm_agp_mode_t m;
-
-    m.mode = mode;
-    if (ioctl(fd, DRM_IOCTL_AGP_ENABLE, &m)) return -errno;
-    return 0;
-}
-
-
-/**
- * Allocate a chunk of AGP memory.
- *
- * \param fd file descriptor.
- * \param size requested memory size in bytes. Will be rounded to page boundary.
- * \param type type of memory to allocate.
- * \param address if not zero, will be set to the physical address of the
- * allocated memory.
- * \param handle on success will be set to a handle of the allocated memory.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_ALLOC ioctl, passing the
- * arguments in a drm_agp_buffer structure.
- */
-int drmAgpAlloc(int fd, unsigned long size, unsigned long type,
-		unsigned long *address, drm_handle_t *handle)
-{
-    drm_agp_buffer_t b;
-
-    *handle = DRM_AGP_NO_HANDLE;
-    b.size   = size;
-    b.handle = 0;
-    b.type   = type;
-    if (ioctl(fd, DRM_IOCTL_AGP_ALLOC, &b)) return -errno;
-    if (address != 0UL) *address = b.physical;
-    *handle = b.handle;
-    return 0;
-}
-
-
-/**
- * Free a chunk of AGP memory.
- *
- * \param fd file descriptor.
- * \param handle handle to the allocated memory, as given by drmAgpAllocate().
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_FREE ioctl, passing the
- * argument in a drm_agp_buffer structure.
- */
-int drmAgpFree(int fd, drm_handle_t handle)
-{
-    drm_agp_buffer_t b;
-
-    b.size   = 0;
-    b.handle = handle;
-    if (ioctl(fd, DRM_IOCTL_AGP_FREE, &b)) return -errno;
-    return 0;
-}
-
-
-/**
- * Bind a chunk of AGP memory.
- *
- * \param fd file descriptor.
- * \param handle handle to the allocated memory, as given by drmAgpAllocate().
- * \param offset offset in bytes. It will round to page boundary.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_BIND ioctl, passing the
- * argument in a drm_agp_binding structure.
- */
-int drmAgpBind(int fd, drm_handle_t handle, unsigned long offset)
-{
-    drm_agp_binding_t b;
-
-    b.handle = handle;
-    b.offset = offset;
-    if (ioctl(fd, DRM_IOCTL_AGP_BIND, &b)) return -errno;
-    return 0;
-}
-
-
-/**
- * Unbind a chunk of AGP memory.
- *
- * \param fd file descriptor.
- * \param handle handle to the allocated memory, as given by drmAgpAllocate().
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_UNBIND ioctl, passing
- * the argument in a drm_agp_binding structure.
- */
-int drmAgpUnbind(int fd, drm_handle_t handle)
-{
-    drm_agp_binding_t b;
-
-    b.handle = handle;
-    b.offset = 0;
-    if (ioctl(fd, DRM_IOCTL_AGP_UNBIND, &b)) return -errno;
-    return 0;
-}
-
-
-/**
- * Get AGP driver major version number.
- *
- * \param fd file descriptor.
- * 
- * \return major version number on success, or a negative value on failure..
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
- * necessary information in a drm_agp_info structure.
- */
-int drmAgpVersionMajor(int fd)
-{
-    drm_agp_info_t i;
-
-    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
-    return i.agp_version_major;
-}
-
-
-/**
- * Get AGP driver minor version number.
- *
- * \param fd file descriptor.
- * 
- * \return minor version number on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
- * necessary information in a drm_agp_info structure.
- */
-int drmAgpVersionMinor(int fd)
-{
-    drm_agp_info_t i;
-
-    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return -errno;
-    return i.agp_version_minor;
-}
-
-
-/**
- * Get AGP mode.
- *
- * \param fd file descriptor.
- * 
- * \return mode on success, or zero on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
- * necessary information in a drm_agp_info structure.
- */
-unsigned long drmAgpGetMode(int fd)
-{
-    drm_agp_info_t i;
-
-    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
-    return i.mode;
-}
-
-
-/**
- * Get AGP aperture base.
- *
- * \param fd file descriptor.
- * 
- * \return aperture base on success, zero on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
- * necessary information in a drm_agp_info structure.
- */
-unsigned long drmAgpBase(int fd)
-{
-    drm_agp_info_t i;
-
-    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
-    return i.aperture_base;
-}
-
-
-/**
- * Get AGP aperture size.
- *
- * \param fd file descriptor.
- * 
- * \return aperture size on success, zero on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
- * necessary information in a drm_agp_info structure.
- */
-unsigned long drmAgpSize(int fd)
-{
-    drm_agp_info_t i;
-
-    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
-    return i.aperture_size;
-}
-
-
-/**
- * Get used AGP memory.
- *
- * \param fd file descriptor.
- * 
- * \return memory used on success, or zero on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
- * necessary information in a drm_agp_info structure.
- */
-unsigned long drmAgpMemoryUsed(int fd)
-{
-    drm_agp_info_t i;
-
-    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
-    return i.memory_used;
-}
-
-
-/**
- * Get available AGP memory.
- *
- * \param fd file descriptor.
- * 
- * \return memory available on success, or zero on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
- * necessary information in a drm_agp_info structure.
- */
-unsigned long drmAgpMemoryAvail(int fd)
-{
-    drm_agp_info_t i;
-
-    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
-    return i.memory_allowed;
-}
-
-
-/**
- * Get hardware vendor ID.
- *
- * \param fd file descriptor.
- * 
- * \return vendor ID on success, or zero on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
- * necessary information in a drm_agp_info structure.
- */
-unsigned int drmAgpVendorId(int fd)
-{
-    drm_agp_info_t i;
-
-    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
-    return i.id_vendor;
-}
-
-
-/**
- * Get hardware device ID.
- *
- * \param fd file descriptor.
- * 
- * \return zero on success, or zero on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_AGP_INFO ioctl, getting the
- * necessary information in a drm_agp_info structure.
- */
-unsigned int drmAgpDeviceId(int fd)
-{
-    drm_agp_info_t i;
-
-    if (ioctl(fd, DRM_IOCTL_AGP_INFO, &i)) return 0;
-    return i.id_device;
-}
-
-int drmScatterGatherAlloc(int fd, unsigned long size, drm_handle_t *handle)
-{
-    drm_scatter_gather_t sg;
-
-    *handle = 0;
-    sg.size   = size;
-    sg.handle = 0;
-    if (ioctl(fd, DRM_IOCTL_SG_ALLOC, &sg)) return -errno;
-    *handle = sg.handle;
-    return 0;
-}
-
-int drmScatterGatherFree(int fd, drm_handle_t handle)
-{
-    drm_scatter_gather_t sg;
-
-    sg.size   = 0;
-    sg.handle = handle;
-    if (ioctl(fd, DRM_IOCTL_SG_FREE, &sg)) return -errno;
-    return 0;
-}
-
-/**
- * Wait for VBLANK.
- *
- * \param fd file descriptor.
- * \param vbl pointer to a drmVBlank structure.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_WAIT_VBLANK ioctl.
- */
-int drmWaitVBlank(int fd, drmVBlankPtr vbl)
-{
-    int ret;
-
-    do {
-       ret = ioctl(fd, DRM_IOCTL_WAIT_VBLANK, vbl);
-       vbl->request.type &= ~DRM_VBLANK_RELATIVE;
-    } while (ret && errno == EINTR);
-
-    return ret;
-}
-
-int drmError(int err, const char *label)
-{
-    switch (err) {
-    case DRM_ERR_NO_DEVICE: fprintf(stderr, "%s: no device\n", label);   break;
-    case DRM_ERR_NO_ACCESS: fprintf(stderr, "%s: no access\n", label);   break;
-    case DRM_ERR_NOT_ROOT:  fprintf(stderr, "%s: not root\n", label);    break;
-    case DRM_ERR_INVALID:   fprintf(stderr, "%s: invalid args\n", label);break;
-    default:
-	if (err < 0) err = -err;
-	fprintf( stderr, "%s: error %d (%s)\n", label, err, strerror(err) );
-	break;
-    }
-
-    return 1;
-}
-
-/**
- * Install IRQ handler.
- *
- * \param fd file descriptor.
- * \param irq IRQ number.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
- * argument in a drm_control structure.
- */
-int drmCtlInstHandler(int fd, int irq)
-{
-    drm_control_t ctl;
-
-    ctl.func  = DRM_INST_HANDLER;
-    ctl.irq   = irq;
-    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno;
-    return 0;
-}
-
-
-/**
- * Uninstall IRQ handler.
- *
- * \param fd file descriptor.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_CONTROL ioctl, passing the
- * argument in a drm_control structure.
- */
-int drmCtlUninstHandler(int fd)
-{
-    drm_control_t ctl;
-
-    ctl.func  = DRM_UNINST_HANDLER;
-    ctl.irq   = 0;
-    if (ioctl(fd, DRM_IOCTL_CONTROL, &ctl)) return -errno;
-    return 0;
-}
-
-int drmFinish(int fd, int context, drmLockFlags flags)
-{
-    drm_lock_t lock;
-
-    lock.context = context;
-    lock.flags   = 0;
-    if (flags & DRM_LOCK_READY)      lock.flags |= _DRM_LOCK_READY;
-    if (flags & DRM_LOCK_QUIESCENT)  lock.flags |= _DRM_LOCK_QUIESCENT;
-    if (flags & DRM_LOCK_FLUSH)      lock.flags |= _DRM_LOCK_FLUSH;
-    if (flags & DRM_LOCK_FLUSH_ALL)  lock.flags |= _DRM_LOCK_FLUSH_ALL;
-    if (flags & DRM_HALT_ALL_QUEUES) lock.flags |= _DRM_HALT_ALL_QUEUES;
-    if (flags & DRM_HALT_CUR_QUEUES) lock.flags |= _DRM_HALT_CUR_QUEUES;
-    if (ioctl(fd, DRM_IOCTL_FINISH, &lock)) return -errno;
-    return 0;
-}
-
-/**
- * Get IRQ from bus ID.
- *
- * \param fd file descriptor.
- * \param busnum bus number.
- * \param devnum device number.
- * \param funcnum function number.
- * 
- * \return IRQ number on success, or a negative value on failure.
- * 
- * \internal
- * This function is a wrapper around the DRM_IOCTL_IRQ_BUSID ioctl, passing the
- * arguments in a drm_irq_busid structure.
- */
-int drmGetInterruptFromBusID(int fd, int busnum, int devnum, int funcnum)
-{
-    drm_irq_busid_t p;
-
-    p.busnum  = busnum;
-    p.devnum  = devnum;
-    p.funcnum = funcnum;
-    if (ioctl(fd, DRM_IOCTL_IRQ_BUSID, &p)) return -errno;
-    return p.irq;
-}
-
-int drmAddContextTag(int fd, drm_context_t context, void *tag)
-{
-    drmHashEntry  *entry = drmGetEntry(fd);
-
-    if (drmHashInsert(entry->tagTable, context, tag)) {
-	drmHashDelete(entry->tagTable, context);
-	drmHashInsert(entry->tagTable, context, tag);
-    }
-    return 0;
-}
-
-int drmDelContextTag(int fd, drm_context_t context)
-{
-    drmHashEntry  *entry = drmGetEntry(fd);
-
-    return drmHashDelete(entry->tagTable, context);
-}
-
-void *drmGetContextTag(int fd, drm_context_t context)
-{
-    drmHashEntry  *entry = drmGetEntry(fd);
-    void          *value;
-
-    if (drmHashLookup(entry->tagTable, context, &value)) return NULL;
-
-    return value;
-}
-
-int drmAddContextPrivateMapping(int fd, drm_context_t ctx_id, drm_handle_t handle)
-{
-    drm_ctx_priv_map_t map;
-
-    map.ctx_id = ctx_id;
-    map.handle = (void *)(unsigned long)handle;
-
-    if (ioctl(fd, DRM_IOCTL_SET_SAREA_CTX, &map)) return -errno;
-    return 0;
-}
-
-int drmGetContextPrivateMapping(int fd, drm_context_t ctx_id, drm_handle_t * handle)
-{
-    drm_ctx_priv_map_t map;
-
-    map.ctx_id = ctx_id;
-
-    if (ioctl(fd, DRM_IOCTL_GET_SAREA_CTX, &map)) return -errno;
-    if (handle) *handle = (drm_handle_t)(unsigned long)map.handle;
-
-    return 0;
-}
-
-int drmGetMap(int fd, int idx, drm_handle_t *offset, drmSize *size,
-	      drmMapType *type, drmMapFlags *flags, drm_handle_t *handle,
-	      int *mtrr)
-{
-    drm_map_t map;
-
-    map.offset = idx;
-    if (ioctl(fd, DRM_IOCTL_GET_MAP, &map)) return -errno;
-    *offset = map.offset;
-    *size   = map.size;
-    *type   = map.type;
-    *flags  = map.flags;
-    *handle = (drm_handle_t)(unsigned long)map.handle;
-    *mtrr   = map.mtrr;
-    return 0;
-}
-
-int drmGetClient(int fd, int idx, int *auth, int *pid, int *uid,
-		 unsigned long *magic, unsigned long *iocs)
-{
-    drm_client_t client;
-
-    client.idx = idx;
-    if (ioctl(fd, DRM_IOCTL_GET_CLIENT, &client)) return -errno;
-    *auth      = client.auth;
-    *pid       = client.pid;
-    *uid       = client.uid;
-    *magic     = client.magic;
-    *iocs      = client.iocs;
-    return 0;
-}
-
-int drmGetStats(int fd, drmStatsT *stats)
-{
-    drm_stats_t s;
-    unsigned int i;
-
-    if (ioctl(fd, DRM_IOCTL_GET_STATS, &s)) return -errno;
-
-    stats->count = 0;
-    memset(stats, 0, sizeof(*stats));
-    if (s.count > sizeof(stats->data)/sizeof(stats->data[0]))
-	return -1;
-
-#define SET_VALUE                              \
-    stats->data[i].long_format = "%-20.20s";   \
-    stats->data[i].rate_format = "%8.8s";      \
-    stats->data[i].isvalue     = 1;            \
-    stats->data[i].verbose     = 0
-
-#define SET_COUNT                              \
-    stats->data[i].long_format = "%-20.20s";   \
-    stats->data[i].rate_format = "%5.5s";      \
-    stats->data[i].isvalue     = 0;            \
-    stats->data[i].mult_names  = "kgm";        \
-    stats->data[i].mult        = 1000;         \
-    stats->data[i].verbose     = 0
-
-#define SET_BYTE                               \
-    stats->data[i].long_format = "%-20.20s";   \
-    stats->data[i].rate_format = "%5.5s";      \
-    stats->data[i].isvalue     = 0;            \
-    stats->data[i].mult_names  = "KGM";        \
-    stats->data[i].mult        = 1024;         \
-    stats->data[i].verbose     = 0
-
-
-    stats->count = s.count;
-    for (i = 0; i < s.count; i++) {
-	stats->data[i].value = s.data[i].value;
-	switch (s.data[i].type) {
-	case _DRM_STAT_LOCK:
-	    stats->data[i].long_name = "Lock";
-	    stats->data[i].rate_name = "Lock";
-	    SET_VALUE;
-	    break;
-	case _DRM_STAT_OPENS:
-	    stats->data[i].long_name = "Opens";
-	    stats->data[i].rate_name = "O";
-	    SET_COUNT;
-	    stats->data[i].verbose   = 1;
-	    break;
-	case _DRM_STAT_CLOSES:
-	    stats->data[i].long_name = "Closes";
-	    stats->data[i].rate_name = "Lock";
-	    SET_COUNT;
-	    stats->data[i].verbose   = 1;
-	    break;
-	case _DRM_STAT_IOCTLS:
-	    stats->data[i].long_name = "Ioctls";
-	    stats->data[i].rate_name = "Ioc/s";
-	    SET_COUNT;
-	    break;
-	case _DRM_STAT_LOCKS:
-	    stats->data[i].long_name = "Locks";
-	    stats->data[i].rate_name = "Lck/s";
-	    SET_COUNT;
-	    break;
-	case _DRM_STAT_UNLOCKS:
-	    stats->data[i].long_name = "Unlocks";
-	    stats->data[i].rate_name = "Unl/s";
-	    SET_COUNT;
-	    break;
-	case _DRM_STAT_IRQ:
-	    stats->data[i].long_name = "IRQs";
-	    stats->data[i].rate_name = "IRQ/s";
-	    SET_COUNT;
-	    break;
-	case _DRM_STAT_PRIMARY:
-	    stats->data[i].long_name = "Primary Bytes";
-	    stats->data[i].rate_name = "PB/s";
-	    SET_BYTE;
-	    break;
-	case _DRM_STAT_SECONDARY:
-	    stats->data[i].long_name = "Secondary Bytes";
-	    stats->data[i].rate_name = "SB/s";
-	    SET_BYTE;
-	    break;
-	case _DRM_STAT_DMA:
-	    stats->data[i].long_name = "DMA";
-	    stats->data[i].rate_name = "DMA/s";
-	    SET_COUNT;
-	    break;
-	case _DRM_STAT_SPECIAL:
-	    stats->data[i].long_name = "Special DMA";
-	    stats->data[i].rate_name = "dma/s";
-	    SET_COUNT;
-	    break;
-	case _DRM_STAT_MISSED:
-	    stats->data[i].long_name = "Miss";
-	    stats->data[i].rate_name = "Ms/s";
-	    SET_COUNT;
-	    break;
-	case _DRM_STAT_VALUE:
-	    stats->data[i].long_name = "Value";
-	    stats->data[i].rate_name = "Value";
-	    SET_VALUE;
-	    break;
-	case _DRM_STAT_BYTE:
-	    stats->data[i].long_name = "Bytes";
-	    stats->data[i].rate_name = "B/s";
-	    SET_BYTE;
-	    break;
-	case _DRM_STAT_COUNT:
-	default:
-	    stats->data[i].long_name = "Count";
-	    stats->data[i].rate_name = "Cnt/s";
-	    SET_COUNT;
-	    break;
-	}
-    }
-    return 0;
-}
-
-/**
- * Issue a set-version ioctl.
- *
- * \param fd file descriptor.
- * \param drmCommandIndex command index 
- * \param data source pointer of the data to be read and written.
- * \param size size of the data to be read and written.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * It issues a read-write ioctl given by 
- * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
- */
-int drmSetInterfaceVersion(int fd, drmSetVersion *version )
-{
-    int retcode = 0;
-    drm_set_version_t sv;
-
-    sv.drm_di_major = version->drm_di_major;
-    sv.drm_di_minor = version->drm_di_minor;
-    sv.drm_dd_major = version->drm_dd_major;
-    sv.drm_dd_minor = version->drm_dd_minor;
-
-    if (ioctl(fd, DRM_IOCTL_SET_VERSION, &sv)) {
-	retcode = -errno;
-    }
-
-    version->drm_di_major = sv.drm_di_major;
-    version->drm_di_minor = sv.drm_di_minor;
-    version->drm_dd_major = sv.drm_dd_major;
-    version->drm_dd_minor = sv.drm_dd_minor;
-
-    return retcode;
-}
-
-/**
- * Send a device-specific command.
- *
- * \param fd file descriptor.
- * \param drmCommandIndex command index 
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * It issues a ioctl given by 
- * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
- */
-int drmCommandNone(int fd, unsigned long drmCommandIndex)
-{
-    void *data = NULL; /* dummy */
-    unsigned long request;
-
-    request = DRM_IO( DRM_COMMAND_BASE + drmCommandIndex);
-
-    if (ioctl(fd, request, data)) {
-	return -errno;
-    }
-    return 0;
-}
-
-
-/**
- * Send a device-specific read command.
- *
- * \param fd file descriptor.
- * \param drmCommandIndex command index 
- * \param data destination pointer of the data to be read.
- * \param size size of the data to be read.
- * 
- * \return zero on success, or a negative value on failure.
- *
- * \internal
- * It issues a read ioctl given by 
- * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
- */
-int drmCommandRead(int fd, unsigned long drmCommandIndex,
-                   void *data, unsigned long size )
-{
-    unsigned long request;
-
-    request = DRM_IOC( DRM_IOC_READ, DRM_IOCTL_BASE, 
-	DRM_COMMAND_BASE + drmCommandIndex, size);
-
-    if (ioctl(fd, request, data)) {
-	return -errno;
-    }
-    return 0;
-}
-
-
-/**
- * Send a device-specific write command.
- *
- * \param fd file descriptor.
- * \param drmCommandIndex command index 
- * \param data source pointer of the data to be written.
- * \param size size of the data to be written.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * It issues a write ioctl given by 
- * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
- */
-int drmCommandWrite(int fd, unsigned long drmCommandIndex,
-                   void *data, unsigned long size )
-{
-    unsigned long request;
-
-    request = DRM_IOC( DRM_IOC_WRITE, DRM_IOCTL_BASE, 
-	DRM_COMMAND_BASE + drmCommandIndex, size);
-
-    if (ioctl(fd, request, data)) {
-	return -errno;
-    }
-    return 0;
-}
-
-
-/**
- * Send a device-specific read-write command.
- *
- * \param fd file descriptor.
- * \param drmCommandIndex command index 
- * \param data source pointer of the data to be read and written.
- * \param size size of the data to be read and written.
- * 
- * \return zero on success, or a negative value on failure.
- * 
- * \internal
- * It issues a read-write ioctl given by 
- * \code DRM_COMMAND_BASE + drmCommandIndex \endcode.
- */
-int drmCommandWriteRead(int fd, unsigned long drmCommandIndex,
-                   void *data, unsigned long size )
-{
-    unsigned long request;
-
-    request = DRM_IOC( DRM_IOC_READ|DRM_IOC_WRITE, DRM_IOCTL_BASE, 
-	DRM_COMMAND_BASE + drmCommandIndex, size);
-
-    if (ioctl(fd, request, data)) {
-	return -errno;
-    }
-    return 0;
-}
-
-static void drmSIGIOHandler(int interrupt, void *closure)
-{
-    unsigned long key;
-    void          *value;
-    ssize_t       count;
-    drm_ctx_t     ctx;
-    typedef void  (*_drmCallback)(int, void *, void *);
-    char          buf[256];
-    drm_context_t    old;
-    drm_context_t    new;
-    void          *oldctx;
-    void          *newctx;
-    char          *pt;
-    drmHashEntry  *entry;
-
-    if (!drmHashTable) return;
-    if (drmHashFirst(drmHashTable, &key, &value)) {
-	entry = value;
-	do {
-#if 0
-	    fprintf(stderr, "Trying %d\n", entry->fd);
-#endif
-	    if ((count = read(entry->fd, buf, sizeof(buf))) > 0) {
-		buf[count] = '\0';
-#if 0
-		fprintf(stderr, "Got %s\n", buf);
-#endif
-
-		for (pt = buf; *pt != ' '; ++pt); /* Find first space */
-		++pt;
-		old    = strtol(pt, &pt, 0);
-		new    = strtol(pt, NULL, 0);
-		oldctx = drmGetContextTag(entry->fd, old);
-		newctx = drmGetContextTag(entry->fd, new);
-#if 0
-		fprintf(stderr, "%d %d %p %p\n", old, new, oldctx, newctx);
-#endif
-		((_drmCallback)entry->f)(entry->fd, oldctx, newctx);
-		ctx.handle = new;
-		ioctl(entry->fd, DRM_IOCTL_NEW_CTX, &ctx);
-	    }
-	} while (drmHashNext(drmHashTable, &key, &value));
-    }
-}
-
-int drmInstallSIGIOHandler(int fd, void (*f)(int, void *, void *))
-{
-    drmHashEntry     *entry;
-
-    entry     = drmGetEntry(fd);
-    entry->f  = f;
-
-    return xf86InstallSIGIOHandler(fd, drmSIGIOHandler, 0);
-}
-
-int drmRemoveSIGIOHandler(int fd)
-{
-    drmHashEntry     *entry = drmGetEntry(fd);
-
-    entry->f = NULL;
-
-    return xf86RemoveSIGIOHandler(fd);
-}
-
-/*
- * Valid flags are 
- * DRM_FENCE_FLAG_EMIT
- * DRM_FENCE_FLAG_SHAREABLE
- * DRM_FENCE_MASK_DRIVER
- */
-
-int drmFenceCreate(int fd, unsigned flags, int class,unsigned type, 
-		   drmFence *fence)
-{
-    drm_fence_arg_t arg;
-    
-    memset(&arg, 0, sizeof(arg));
-    arg.type = type;
-    arg.class = class;
-    arg.op = drm_fence_create;
-    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
-	return -errno;
-    fence->handle = arg.handle;
-    fence->class = arg.class;
-    fence->type = arg.type;
-    fence->flags = arg.flags;
-    fence->signaled = 0;
-    return 0;
-}
-
-/*
- * Valid flags are 
- * DRM_FENCE_FLAG_SHAREABLE
- * DRM_FENCE_MASK_DRIVER
- */
-
-int drmFenceBuffers(int fd, unsigned flags, drmFence *fence)
-{
-    drm_fence_arg_t arg;
-    
-    memset(&arg, 0, sizeof(arg));
-    arg.flags = flags;
-    arg.op = drm_fence_buffers;
-    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
-	return -errno;
-    fence->handle = arg.handle;
-    fence->class = arg.class;
-    fence->type = arg.type;
-    fence->flags = arg.flags;
-    fence->signaled = 0;
-    return 0;
-}
-    
-int drmFenceDestroy(int fd, const drmFence *fence)
-{
-    drm_fence_arg_t arg;
-   
-    memset(&arg, 0, sizeof(arg));
-    arg.handle = fence->handle;
-    arg.op = drm_fence_destroy;
-    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
-	return -errno;
-    return 0;
-}
-
-int drmFenceReference(int fd, unsigned handle, drmFence *fence)
-{
-    drm_fence_arg_t arg;
-   
-    memset(&arg, 0, sizeof(arg));
-    arg.handle = handle;
-    arg.op = drm_fence_reference;
-    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
-	return -errno;
-    fence->handle = arg.handle;
-    fence->class = arg.class;
-    fence->type = arg.type;
-    fence->flags = arg.flags;
-    fence->signaled = arg.signaled;
-    return 0;
-}
-
-int drmFenceUnreference(int fd, const drmFence *fence)
-{
-    drm_fence_arg_t arg;
-   
-    memset(&arg, 0, sizeof(arg));
-    arg.handle = fence->handle;
-    arg.op = drm_fence_unreference;
-    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
-	return -errno;
-    return 0;
-}
-
-int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type)
-{
-    drm_fence_arg_t arg;
-   
-    memset(&arg, 0, sizeof(arg));
-    arg.handle = fence->handle;
-    arg.type = flush_type;
-    arg.op = drm_fence_flush;
-    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
-	return -errno;
-    fence->class = arg.class;
-    fence->type = arg.type;
-    fence->signaled = arg.signaled;
-    return 0;
-}
-
-int drmFenceUpdate(int fd, drmFence *fence)
-{
-    drm_fence_arg_t arg;
-	
-    memset(&arg, 0, sizeof(arg));
-    arg.handle = fence->handle;
-    arg.op = drm_fence_signaled;
-    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
-	return -errno;
-    fence->class = arg.class;
-    fence->type = arg.type;
-    fence->signaled = arg.signaled;
-    return 0;
-}
-
-int drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType, 
-		     int *signaled)
-{
-    int 
-	ret;
-
-    if ((fence->flags & DRM_FENCE_FLAG_SHAREABLE) ||
-	((fenceType & fence->signaled) != fenceType)) {
-
-	ret = drmFenceFlush(fd, fence, fenceType);
-	if (ret)
-	    return ret;
-    }
-
-    *signaled = ((fenceType & fence->signaled) == fenceType);
-
-    return 0;
-}
-
-/*
- * Valid flags are 
- * DRM_FENCE_FLAG_SHAREABLE
- * DRM_FENCE_MASK_DRIVER
- */
-
-
-int drmFenceEmit(int fd, unsigned flags, drmFence *fence, unsigned emit_type)
-{
-    drm_fence_arg_t arg;
-   
-    memset(&arg, 0, sizeof(arg));
-    arg.flags = flags;
-    arg.handle = fence->handle;
-    arg.type = emit_type;
-    arg.op = drm_fence_emit;
-    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
-	return -errno;
-    fence->class = arg.class;
-    fence->type = arg.type;
-    fence->signaled = arg.signaled;
-    return 0;
-}
-
-/*
- * Valid flags are 
- * DRM_FENCE_FLAG_WAIT_LAZY
- * DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS
- */
-    
-int drmFenceWait(int fd, unsigned flags, drmFence *fence, unsigned flush_type)
-{
-    drm_fence_arg_t arg;
-    int ret;
-
-    if (flush_type == 0) {
-	flush_type = fence->type;
-    }
-
-    if (!(fence->flags & DRM_FENCE_FLAG_SHAREABLE)) {
-	if ((flush_type & fence->signaled) == flush_type) {
-	    return 0;
-	}
-    }
-
-    memset(&arg, 0, sizeof(arg));
-    arg.handle = fence->handle;
-    arg.type = flush_type;
-    arg.flags = flags;
-    arg.op = drm_fence_wait;
-    do {
-	ret = ioctl(fd, DRM_IOCTL_FENCE, &arg);
-    } while (ret != 0 && errno == EAGAIN);
-
-    if (ret)
-	return -errno;
-
-    fence->class = arg.class;
-    fence->type = arg.type;
-    fence->signaled = arg.signaled;
-    return 0;
-}    
-
-static int drmAdjustListNodes(drmBOList *list)
-{
-    drmBONode *node;
-    drmMMListHead *l;
-    int ret = 0;
-
-    while(list->numCurrent < list->numTarget) {
-	node = (drmBONode *) malloc(sizeof(*node));
-	if (!node) {
-	    ret = -ENOMEM;
-	    break;
-	}
-	list->numCurrent++;
-	DRMLISTADD(&node->head, &list->free);
-    }
-
-    while(list->numCurrent > list->numTarget) {
-	l = list->free.next;
-	if (l == &list->free)
-	    break;
-	DRMLISTDEL(l);
-	node = DRMLISTENTRY(drmBONode, l, head);
-	free(node);
-	list->numCurrent--;
-    }
-    return ret;
-}
-
-void drmBOFreeList(drmBOList *list)
-{
-    drmBONode *node;
-    drmMMListHead *l;
-
-    l = list->list.next;
-    while(l != &list->list) {
-	DRMLISTDEL(l);
-	node = DRMLISTENTRY(drmBONode, l, head);
-	free(node);
-	l = list->free.next;
-	list->numCurrent--;
-	list->numOnList--;
-    }
-
-    l = list->free.next;
-    while(l != &list->free) {
-	DRMLISTDEL(l);
-	node = DRMLISTENTRY(drmBONode, l, head);
-	free(node);
-	l = list->free.next;
-	list->numCurrent--;
-    }
-}
-	
-int drmBOResetList(drmBOList *list) {
-
-    drmMMListHead *l;
-    int ret;
-
-    ret = drmAdjustListNodes(list);
-    if (ret)
-	return ret;
-
-    l = list->list.next;
-    while(l != &list->list) {
-	DRMLISTDEL(l);
-	DRMLISTADD(l, &list->free);
-	list->numOnList--;
-	l = list->list.next;
-    }
-    return drmAdjustListNodes(list);
-}
-	
-static drmBONode *drmAddListItem(drmBOList *list, drmBO *item, 
-				 unsigned long arg0,
-				 unsigned long arg1)
-{
-    drmBONode *node;
-    drmMMListHead *l;
-
-    l = list->free.next;
-    if (l == &list->free) {
-	node = (drmBONode *) malloc(sizeof(*node));
-	if (!node) {
-	    return NULL;
-	}
-	list->numCurrent++;
-    } else {
-	DRMLISTDEL(l);
-	node = DRMLISTENTRY(drmBONode, l, head);
-    }
-    node->buf = item;
-    node->arg0 = arg0;
-    node->arg1 = arg1;
-    DRMLISTADD(&node->head, &list->list);
-    list->numOnList++;
-    return node;
-}
-     	
-void *drmBOListIterator(drmBOList *list)
-{
-    void *ret = list->list.next;
-
-    if (ret == &list->list)
-	return NULL;
-    return ret;
-}
-
-void *drmBOListNext(drmBOList *list, void *iterator)
-{
-    void *ret;
-
-    drmMMListHead *l = (drmMMListHead *) iterator;
-    ret = l->next;
-    if (ret == &list->list)
-	return NULL;
-    return ret;
-}
-
-drmBO *drmBOListBuf(void *iterator)
-{
-    drmBONode *node;
-    drmMMListHead *l = (drmMMListHead *) iterator;
-    node = DRMLISTENTRY(drmBONode, l, head);
-    
-    return node->buf;
-}
-
-
-int drmBOCreateList(int numTarget, drmBOList *list)
-{
-    DRMINITLISTHEAD(&list->list);
-    DRMINITLISTHEAD(&list->free);
-    list->numTarget = numTarget;
-    list->numCurrent = 0;
-    list->numOnList = 0;
-    return drmAdjustListNodes(list);
-}
-
-static void drmBOCopyReply(const drm_bo_arg_reply_t *rep, 
-			   drmBO *buf)
-{
-    buf->handle = rep->handle;
-    buf->flags = rep->flags;
-    buf->size = rep->size;
-    buf->offset = rep->offset;
-    buf->mapHandle = rep->arg_handle;
-    buf->mask = rep->mask;
-    buf->start = rep->buffer_start;
-    buf->fenceFlags = rep->fence_flags;
-    buf->replyFlags = rep->rep_flags;
-    buf->pageAlignment = rep->page_alignment;
-}
-    
-    
-
-int drmBOCreate(int fd, unsigned long start, unsigned long size, 
-		unsigned pageAlignment, void *user_buffer, drm_bo_type_t type, 
-		unsigned mask,
-		unsigned hint, drmBO *buf)
-{
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-    int ret;
-
-    memset(buf, 0, sizeof(*buf));
-    memset(&arg, 0, sizeof(arg));
-    req->mask = mask;
-    req->hint = hint;
-    req->size = size;
-    req->type = type;
-    req->page_alignment = pageAlignment;
-
-    buf->virtual = NULL;
-
-    switch(type) {
-    case drm_bo_type_dc:
-        req->buffer_start = start;
-	break;
-    case drm_bo_type_user:
-	req->buffer_start = (unsigned long) user_buffer;
-	buf->virtual = user_buffer;
-	break;
-    case drm_bo_type_fake:
-        req->buffer_start = start;
-	break;
-    default:
-	return -EINVAL;
-    }
-    req->op = drm_bo_create;
-
-    do {
-	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
-    } while (ret != 0 && errno == EAGAIN);
-
-    if (ret)
-	return -errno;
-    if (!arg.handled) {
-	return -EFAULT;
-    }
-    if (rep->ret) {
-        fprintf(stderr, "Error %d\n", rep->ret);
-	return rep->ret;
-    }
-    
-    drmBOCopyReply(rep, buf);
-    buf->mapVirtual = NULL;
-    buf->mapCount = 0;
-
-    return 0;
-}
-
-int drmBODestroy(int fd, drmBO *buf)
-{
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-    
-    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) {
-	(void) drmUnmap(buf->mapVirtual, buf->start + buf->size);
-	buf->mapVirtual = NULL;
-	buf->virtual = NULL;
-    }
-
-    memset(&arg, 0, sizeof(arg));
-    req->handle = buf->handle;
-    req->op = drm_bo_destroy;
-
-    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
-	return -errno;
-    if (!arg.handled) {
-	return -EFAULT;
-    }
-    if (rep->ret) {
-	return rep->ret;
-    }
-
-    buf->handle = 0;
-    return 0;
-}
- 
-int drmBOReference(int fd, unsigned handle, drmBO *buf)
-{
-
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-    
-    memset(&arg, 0, sizeof(arg));
-    req->handle = handle;
-    req->op = drm_bo_reference;
-    
-    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
-	return -errno;
-    if (!arg.handled) {
-	return -EFAULT;
-    }
-    if (rep->ret) {
-	return rep->ret;
-    }
-
-    drmBOCopyReply(rep, buf);
-    buf->type = drm_bo_type_dc;
-    buf->mapVirtual = NULL;
-    buf->mapCount = 0;
-    buf->virtual = NULL;
-
-    return 0;
-}
-
-int drmBOUnReference(int fd, drmBO *buf)
-{
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-    
-
-    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) {
-	(void) munmap(buf->mapVirtual, buf->start + buf->size);
-	buf->mapVirtual = NULL;
-	buf->virtual = NULL;
-    }
-
-    memset(&arg, 0, sizeof(arg));
-    req->handle = buf->handle;
-    req->op = drm_bo_unreference;
-
-    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
-	return -errno;
-    if (!arg.handled) {
-	return -EFAULT;
-    }
-    if (rep->ret) {
-	return rep->ret;
-    }
-
-    buf->handle = 0;
-    return 0;
-}   
-
-/*
- * Flags can be  DRM_BO_FLAG_READ, DRM_BO_FLAG_WRITE or'ed together
- * Hint currently be DRM_BO_HINT_DONT_BLOCK, which makes the
- * call return an -EBUSY if it can' immediately honor the mapping request.
- */
-
-int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
-	     void **address)
-{
-
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-    int ret = 0;
-
-    /*
-     * Make sure we have a virtual address of the buffer.
-     */
-
-    if (!buf->virtual && buf->type != drm_bo_type_fake) {
-	drmAddress virtual;
-	virtual = mmap(0, buf->size + buf->start, 
-		       PROT_READ | PROT_WRITE, MAP_SHARED,
-		       fd, buf->mapHandle);
-	if (virtual == MAP_FAILED) {
-	    ret = -errno;
-	}
-	if (ret) 
-	    return ret;
-	buf->mapVirtual = virtual;
-	buf->virtual = ((char *) virtual) + buf->start;
-    }
-
-    memset(&arg, 0, sizeof(arg));
-    req->handle = buf->handle;
-    req->mask = mapFlags;
-    req->hint = mapHint;
-    req->op = drm_bo_map;
-
-    /*
-     * May hang if the buffer object is busy.
-     * This IOCTL synchronizes the buffer.
-     */
-    
-    do {
-	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
-    } while (ret != 0 && errno == EAGAIN);
-
-    if (ret) 
-	return ret;
-    if (!arg.handled) 
-	return -EFAULT;
-    if (rep->ret)
-	return rep->ret;
-
-    drmBOCopyReply(rep, buf);	
-    buf->mapFlags = mapFlags;
-    ++buf->mapCount;
-    *address = buf->virtual;
-
-    return 0;
-}
-
-int drmBOUnmap(int fd, drmBO *buf)
-{
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-
-	
-    memset(&arg, 0, sizeof(arg));
-    req->handle = buf->handle;
-    req->op = drm_bo_unmap;
-
-    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) {
-	return -errno;
-    }
-    if (!arg.handled) 
-        return -EFAULT;
-    if (rep->ret)
-	return rep->ret;
-
-    return 0;
-}
-    
-int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask, 
-		  unsigned hint)
-{
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-    int ret = 0;
-
-    memset(&arg, 0, sizeof(arg));
-    req->handle = buf->handle;
-    req->mask = flags;
-    req->hint = hint;
-    req->arg_handle = mask; /* Encode mask in the arg_handle field :/ */
-    req->op = drm_bo_validate;
-
-    do{
-	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
-    } while (ret && errno == EAGAIN);
-    
-    if (ret) 
-	return ret;
-    if (!arg.handled)
-	return -EFAULT;
-    if (rep->ret)
-	return rep->ret;
-
-    drmBOCopyReply(rep, buf);
-    return 0;
-}
-	    
-
-int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle)
-{
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-    int ret = 0;
-
-    memset(&arg, 0, sizeof(arg));
-    req->handle = buf->handle;
-    req->mask = flags;
-    req->arg_handle = fenceHandle;
-    req->op = drm_bo_validate;
-
-    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
-    
-    if (ret) 
-	return ret;
-    if (!arg.handled)
-	return -EFAULT;
-    if (rep->ret)
-	return rep->ret;
-    return 0;
-}
-
-int drmBOInfo(int fd, drmBO *buf)
-{
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-    int ret = 0;
-
-    memset(&arg, 0, sizeof(arg));
-    req->handle = buf->handle;
-    req->op = drm_bo_info;
-
-    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
-    
-    if (ret) 
-	return ret;
-    if (!arg.handled)
-	return -EFAULT;
-    if (rep->ret)
-	return rep->ret;
-    drmBOCopyReply(rep, buf);
-    return 0;
-}
-
-int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint)
-{
-    drm_bo_arg_t arg;
-    drm_bo_arg_request_t *req = &arg.d.req;
-    drm_bo_arg_reply_t *rep = &arg.d.rep;
-    int ret = 0;
-
-    if ((buf->flags & DRM_BO_FLAG_SHAREABLE) ||
-	(buf->replyFlags & DRM_BO_REP_BUSY)) {
-        memset(&arg, 0, sizeof(arg));
-	req->handle = buf->handle;
-	req->op = drm_bo_wait_idle;
-	req->hint = hint;
-
-	do {
-	    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
-	} while (ret && errno == EAGAIN);
-
-	if (ret) 
-	    return ret;
-	if (!arg.handled)
-	    return -EFAULT;
-	if (rep->ret)
-	    return rep->ret;
-	drmBOCopyReply(rep, buf);
-    }
-    return 0;
-}
-	
-int drmBOBusy(int fd, drmBO *buf, int *busy)
-{
-    if (!(buf->flags & DRM_BO_FLAG_SHAREABLE) &&
-	!(buf->replyFlags & DRM_BO_REP_BUSY)) {
-	*busy = 0;
-	return 0;
-    } else {
-	int ret = drmBOInfo(fd, buf);
-	if (ret)
-	    return ret;
-	*busy = (buf->replyFlags & DRM_BO_REP_BUSY);
-	return 0;
-    }
-}
-    
-    
-int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags, 
-		       unsigned mask,
-		       int *newItem)
-{
-    drmBONode *node, *cur;
-    drmMMListHead *l;
-
-    *newItem = 0;
-    cur = NULL;
-
-    for (l = list->list.next; l != &list->list; l = l->next) {
-	node = DRMLISTENTRY(drmBONode, l, head);
-	if (node->buf == buf) {
-	    cur = node;
-	    break;
-	}
-    }
-    if (!cur) {
-	cur = drmAddListItem(list, buf, flags, mask);
-	if (!cur) {
-	    drmMsg("Out of memory creating validate list node.\n");
-	    return -ENOMEM;
-	}
-	*newItem = 1;
-	cur->arg0 = flags;
-	cur->arg1 = mask;
-    } else {
-	unsigned memMask = (cur->arg1 | mask) & DRM_BO_MASK_MEM;
-	unsigned memFlags = cur->arg0 & flags & memMask;
-	
-	if (!memFlags) {
-	    drmMsg("Incompatible memory location requests "
-		   "on validate list.\n");
-	    drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n",
-		   cur->arg0, cur->arg1);
-	    drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n",
-		   flags, mask);
-	    return -EINVAL;
-	}
-	if (mask & cur->arg1 & ~DRM_BO_MASK_MEM  & (cur->arg0 ^ flags)) {
-	    drmMsg("Incompatible buffer flag requests "
-		   "on validate list.\n");
-	    drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n",
-		   cur->arg0, cur->arg1);
-	    drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n",
-		   flags, mask);
-	    return -EINVAL;
-	}
-	cur->arg1 |= mask;
-	cur->arg0 = memFlags | ((cur->arg0 | flags) & 
-				cur->arg1 & ~DRM_BO_MASK_MEM);	
-    }
-    return 0;
-}
-
-
-int drmBOValidateList(int fd, drmBOList *list)
-{
-   
-  drmBONode *node;
-  drmMMListHead *l;
-  drm_bo_arg_t *arg, *first;
-  drm_bo_arg_request_t *req;
-  drm_bo_arg_reply_t *rep;
-  drm_u64_t *prevNext = NULL;
-  drmBO *buf;
-  int ret;
-
-  first = NULL;
-
-  for (l = list->list.next; l != &list->list; l = l->next) {
-      node = DRMLISTENTRY(drmBONode, l, head);
-
-      arg = &node->bo_arg;
-      req = &arg->d.req;
-
-      if (!first)
-	  first = arg;
-
-      if (prevNext)
-	  *prevNext = (unsigned long) arg;
-
-      memset(arg, 0, sizeof(*arg));
-      prevNext = &arg->next;
-      req->handle = node->buf->handle;
-      req->op = drm_bo_validate;
-      req->mask = node->arg0;
-      req->hint = 0;
-      req->arg_handle = node->arg1;
-  }
-  
-  if (!first) 
-      return 0;
-
-  do{
-      ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
-  } while (ret && errno == EAGAIN);
-
-
-  if (ret)
-      return -errno;
-  
-  for (l = list->list.next; l != &list->list; l = l->next) {
-      node = DRMLISTENTRY(drmBONode, l, head);
-      arg = &node->bo_arg;
-      rep = &arg->d.rep;
-      
-      if (!arg->handled) {
-	  drmMsg("Unhandled request\n");
-	  return -EFAULT;
-      }
-      if (rep->ret)
-	  return rep->ret;
-
-      buf = node->buf;
-      drmBOCopyReply(rep, buf);
-  }
-
-  return 0;
-}
-	  
-
-int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle)
-{
-   
-  drmBONode *node;
-  drmMMListHead *l;
-  drm_bo_arg_t *arg, *first;
-  drm_bo_arg_request_t *req;
-  drm_bo_arg_reply_t *rep;
-  drm_u64_t *prevNext = NULL;
-  int ret;
-
-  first = NULL;
-
-  for (l = list->list.next; l != &list->list; l = l->next) {
-      node = DRMLISTENTRY(drmBONode, l, head);
-
-      arg = &node->bo_arg;
-      req = &arg->d.req;
-
-      if (!first)
-	  first = arg;
-
-      if (prevNext)
-	  *prevNext = (unsigned long) arg;
-
-      memset(arg, 0, sizeof(*arg));
-      prevNext = &arg->next;
-      req->handle = node->buf->handle;
-      req->op = drm_bo_fence;
-      req->mask = node->arg0;
-      req->arg_handle = fenceHandle;
-  }
-  
-  if (!first) 
-      return 0;
-
-  ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
-
-  if (ret)
-      return -errno;
-  
-  for (l = list->list.next; l != &list->list; l = l->next) {
-      node = DRMLISTENTRY(drmBONode, l, head);
-
-      arg = &node->bo_arg;
-      rep = &arg->d.rep;
-      
-      if (!arg->handled)
-	  return -EFAULT;
-      if (rep->ret)
-	  return rep->ret;
-      drmBOCopyReply(rep, node->buf);
-  }
-
-  return 0;
-}
-
-int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
-	      unsigned memType)
-{
-    drm_mm_init_arg_t arg;
-    
-    memset(&arg, 0, sizeof(arg));
-    arg.req.op = mm_init;
-    arg.req.p_offset = pOffset;
-    arg.req.p_size = pSize;
-    arg.req.mem_type = memType;
-
-    if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))
-	return -errno;
-    
-    return 0;	
-}
-
-int drmMMTakedown(int fd, unsigned memType)
-{
-    drm_mm_init_arg_t arg;
-
-
-    memset(&arg, 0, sizeof(arg));
-    arg.req.op = mm_takedown;
-    arg.req.mem_type = memType;
-
-    if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))
-	return -errno;
-    
-    return 0;	
-}
-
-int drmMMLock(int fd, unsigned memType)
-{
-    drm_mm_init_arg_t arg;
-    int ret;
-
-    memset(&arg, 0, sizeof(arg));
-    arg.req.op = mm_lock;
-    arg.req.mem_type = memType;
-
-    do{
-	ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg);
-    } while (ret && errno == EAGAIN);
-    
-    return ret;	
-}
-
-int drmMMUnlock(int fd, unsigned memType)
-{
-    drm_mm_init_arg_t arg;
-    int ret;
-
-    memset(&arg, 0, sizeof(arg));
-    arg.req.op = mm_unlock;
-    arg.req.mem_type = memType;
-
-    do{
-	ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg);
-    } while (ret && errno == EAGAIN);
-    
-    return ret;	
-}
diff --git a/hw/xfree86/os-support/drm/xf86drmHash.c b/hw/xfree86/os-support/drm/xf86drmHash.c
deleted file mode 100644
index ba81a6e..0000000
--- a/hw/xfree86/os-support/drm/xf86drmHash.c
+++ /dev/null
@@ -1,432 +0,0 @@
-/* xf86drmHash.c -- Small hash table support for integer -> integer mapping
- * Created: Sun Apr 18 09:35:45 1999 by faith at precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Rickard E. (Rik) Faith <faith at valinux.com>
- *
- *
- * DESCRIPTION
- *
- * This file contains a straightforward implementation of a fixed-sized
- * hash table using self-organizing linked lists [Knuth73, pp. 398-399] for
- * collision resolution.  There are two potentially interesting things
- * about this implementation:
- *
- * 1) The table is power-of-two sized.  Prime sized tables are more
- * traditional, but do not have a significant advantage over power-of-two
- * sized table, especially when double hashing is not used for collision
- * resolution.
- *
- * 2) The hash computation uses a table of random integers [Hanson97,
- * pp. 39-41].
- *
- * FUTURE ENHANCEMENTS
- *
- * With a table size of 512, the current implementation is sufficient for a
- * few hundred keys.  Since this is well above the expected size of the
- * tables for which this implementation was designed, the implementation of
- * dynamic hash tables was postponed until the need arises.  A common (and
- * naive) approach to dynamic hash table implementation simply creates a
- * new hash table when necessary, rehashes all the data into the new table,
- * and destroys the old table.  The approach in [Larson88] is superior in
- * two ways: 1) only a portion of the table is expanded when needed,
- * distributing the expansion cost over several insertions, and 2) portions
- * of the table can be locked, enabling a scalable thread-safe
- * implementation.
- *
- * REFERENCES
- *
- * [Hanson97] David R. Hanson.  C Interfaces and Implementations:
- * Techniques for Creating Reusable Software.  Reading, Massachusetts:
- * Addison-Wesley, 1997.
- *
- * [Knuth73] Donald E. Knuth. The Art of Computer Programming.  Volume 3:
- * Sorting and Searching.  Reading, Massachusetts: Addison-Wesley, 1973.
- *
- * [Larson88] Per-Ake Larson. "Dynamic Hash Tables".  CACM 31(4), April
- * 1988, pp. 446-457.
- *
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#define HASH_MAIN 0
-
-#include <stdio.h>
-#include <stdlib.h>
-#if !HASH_MAIN
-# include "drm.h"
-# include "xf86drm.h"
-# include "xf86.h"
-#endif
-
-#define N(x)  drm##x
-
-#define HASH_MAGIC 0xdeadbeef
-#define HASH_DEBUG 0
-#define HASH_SIZE  512		/* Good for about 100 entries */
-				/* If you change this value, you probably
-                                   have to change the HashHash hashing
-                                   function! */
-
-#if HASH_MAIN
-#define HASH_ALLOC malloc
-#define HASH_FREE  free
-#define HASH_RANDOM_DECL
-#define HASH_RANDOM_INIT(seed)  srandom(seed)
-#define HASH_RANDOM             random()
-#else
-#define HASH_ALLOC drmMalloc
-#define HASH_FREE  drmFree
-#define HASH_RANDOM_DECL        void *state
-#define HASH_RANDOM_INIT(seed)  state = drmRandomCreate(seed)
-#define HASH_RANDOM             drmRandom(state)
-
-#endif
-
-typedef struct HashBucket {
-    unsigned long     key;
-    void              *value;
-    struct HashBucket *next;
-} HashBucket, *HashBucketPtr;
-
-typedef struct HashTable {
-    unsigned long    magic;
-    unsigned long    entries;
-    unsigned long    hits;	/* At top of linked list */
-    unsigned long    partials;	/* Not at top of linked list */
-    unsigned long    misses;	/* Not in table */
-    HashBucketPtr    buckets[HASH_SIZE];
-    int              p0;
-    HashBucketPtr    p1;
-} HashTable, *HashTablePtr;
-
-#if HASH_MAIN
-extern void *N(HashCreate)(void);
-extern int  N(HashDestroy)(void *t);
-extern int  N(HashLookup)(void *t, unsigned long key, unsigned long *value);
-extern int  N(HashInsert)(void *t, unsigned long key, unsigned long value);
-extern int  N(HashDelete)(void *t, unsigned long key);
-#endif
-
-static unsigned long HashHash(unsigned long key)
-{
-    unsigned long        hash = 0;
-    unsigned long        tmp  = key;
-    static int           init = 0;
-    static unsigned long scatter[256];
-    int                  i;
-
-    if (!init) {
-	HASH_RANDOM_DECL;
-	HASH_RANDOM_INIT(37);
-	for (i = 0; i < 256; i++) scatter[i] = HASH_RANDOM;
-	++init;
-    }
-
-    while (tmp) {
-	hash = (hash << 1) + scatter[tmp & 0xff];
-	tmp >>= 8;
-    }
-
-    hash %= HASH_SIZE;
-#if HASH_DEBUG
-    printf( "Hash(%d) = %d\n", key, hash);
-#endif
-    return hash;
-}
-
-void *N(HashCreate)(void)
-{
-    HashTablePtr table;
-    int          i;
-
-    table           = HASH_ALLOC(sizeof(*table));
-    if (!table) return NULL;
-    table->magic    = HASH_MAGIC;
-    table->entries  = 0;
-    table->hits     = 0;
-    table->partials = 0;
-    table->misses   = 0;
-
-    for (i = 0; i < HASH_SIZE; i++) table->buckets[i] = NULL;
-    return table;
-}
-
-int N(HashDestroy)(void *t)
-{
-    HashTablePtr  table = (HashTablePtr)t;
-    HashBucketPtr bucket;
-    HashBucketPtr next;
-    int           i;
-
-    if (table->magic != HASH_MAGIC) return -1; /* Bad magic */
-
-    for (i = 0; i < HASH_SIZE; i++) {
-	for (bucket = table->buckets[i]; bucket;) {
-	    next = bucket->next;
-	    HASH_FREE(bucket);
-	    bucket = next;
-	}
-    }
-    HASH_FREE(table);
-    return 0;
-}
-
-/* Find the bucket and organize the list so that this bucket is at the
-   top. */
-
-static HashBucketPtr HashFind(HashTablePtr table,
-			      unsigned long key, unsigned long *h)
-{
-    unsigned long hash = HashHash(key);
-    HashBucketPtr prev = NULL;
-    HashBucketPtr bucket;
-
-    if (h) *h = hash;
-
-    for (bucket = table->buckets[hash]; bucket; bucket = bucket->next) {
-	if (bucket->key == key) {
-	    if (prev) {
-				/* Organize */
-		prev->next           = bucket->next;
-		bucket->next         = table->buckets[hash];
-		table->buckets[hash] = bucket;
-		++table->partials;
-	    } else {
-		++table->hits;
-	    }
-	    return bucket;
-	}
-	prev = bucket;
-    }
-    ++table->misses;
-    return NULL;
-}
-
-int N(HashLookup)(void *t, unsigned long key, void **value)
-{
-    HashTablePtr  table = (HashTablePtr)t;
-    HashBucketPtr bucket;
-
-    if (!table || table->magic != HASH_MAGIC) return -1; /* Bad magic */
-
-    bucket = HashFind(table, key, NULL);
-    if (!bucket) return 1;	/* Not found */
-    *value = bucket->value;
-    return 0;			/* Found */
-}
-
-int N(HashInsert)(void *t, unsigned long key, void *value)
-{
-    HashTablePtr  table = (HashTablePtr)t;
-    HashBucketPtr bucket;
-    unsigned long hash;
-
-    if (table->magic != HASH_MAGIC) return -1; /* Bad magic */
-
-    if (HashFind(table, key, &hash)) return 1; /* Already in table */
-
-    bucket               = HASH_ALLOC(sizeof(*bucket));
-    if (!bucket) return -1;	/* Error */
-    bucket->key          = key;
-    bucket->value        = value;
-    bucket->next         = table->buckets[hash];
-    table->buckets[hash] = bucket;
-#if HASH_DEBUG
-    printf("Inserted %d at %d/%p\n", key, hash, bucket);
-#endif
-    return 0;			/* Added to table */
-}
-
-int N(HashDelete)(void *t, unsigned long key)
-{
-    HashTablePtr  table = (HashTablePtr)t;
-    unsigned long hash;
-    HashBucketPtr bucket;
-
-    if (table->magic != HASH_MAGIC) return -1; /* Bad magic */
-
-    bucket = HashFind(table, key, &hash);
-
-    if (!bucket) return 1;	/* Not found */
-
-    table->buckets[hash] = bucket->next;
-    HASH_FREE(bucket);
-    return 0;
-}
-
-int N(HashNext)(void *t, unsigned long *key, void **value)
-{
-    HashTablePtr  table = (HashTablePtr)t;
-
-    for (; table->p0 < HASH_SIZE;
-	 ++table->p0, table->p1 = table->buckets[table->p0]) {
-	if (table->p1) {
-	    *key       = table->p1->key;
-	    *value     = table->p1->value;
-	    table->p1  = table->p1->next;
-	    return 1;
-	}
-    }
-    return 0;
-}
-
-int N(HashFirst)(void *t, unsigned long *key, void **value)
-{
-    HashTablePtr  table = (HashTablePtr)t;
-
-    if (table->magic != HASH_MAGIC) return -1; /* Bad magic */
-
-    table->p0 = 0;
-    table->p1 = table->buckets[0];
-    return N(HashNext)(table, key, value);
-}
-
-#if HASH_MAIN
-#define DIST_LIMIT 10
-static int dist[DIST_LIMIT];
-
-static void clear_dist(void) {
-    int i;
-
-    for (i = 0; i < DIST_LIMIT; i++) dist[i] = 0;
-}
-
-static int count_entries(HashBucketPtr bucket)
-{
-    int count = 0;
-
-    for (; bucket; bucket = bucket->next) ++count;
-    return count;
-}
-
-static void update_dist(int count)
-{
-    if (count >= DIST_LIMIT) ++dist[DIST_LIMIT-1];
-    else                     ++dist[count];
-}
-
-static void compute_dist(HashTablePtr table)
-{
-    int           i;
-    HashBucketPtr bucket;
-
-    printf("Entries = %ld, hits = %ld, partials = %ld, misses = %ld\n",
-	   table->entries, table->hits, table->partials, table->misses);
-    clear_dist();
-    for (i = 0; i < HASH_SIZE; i++) {
-	bucket = table->buckets[i];
-	update_dist(count_entries(bucket));
-    }
-    for (i = 0; i < DIST_LIMIT; i++) {
-	if (i != DIST_LIMIT-1) printf("%5d %10d\n", i, dist[i]);
-	else                   printf("other %10d\n", dist[i]);
-    }
-}
-
-static void check_table(HashTablePtr table,
-			unsigned long key, unsigned long value)
-{
-    unsigned long retval  = 0;
-    int           retcode = N(HashLookup)(table, key, &retval);
-
-    switch (retcode) {
-    case -1:
-	printf("Bad magic = 0x%08lx:"
-	       " key = %lu, expected = %lu, returned = %lu\n",
-	       table->magic, key, value, retval);
-	break;
-    case 1:
-	printf("Not found: key = %lu, expected = %lu returned = %lu\n",
-	       key, value, retval);
-	break;
-    case 0:
-	if (value != retval)
-	    printf("Bad value: key = %lu, expected = %lu, returned = %lu\n",
-		   key, value, retval);
-	break;
-    default:
-	printf("Bad retcode = %d: key = %lu, expected = %lu, returned = %lu\n",
-	       retcode, key, value, retval);
-	break;
-    }
-}
-
-int main(void)
-{
-    HashTablePtr table;
-    int          i;
-
-    printf("\n***** 256 consecutive integers ****\n");
-    table = N(HashCreate)();
-    for (i = 0; i < 256; i++) N(HashInsert)(table, i, i);
-    for (i = 0; i < 256; i++) check_table(table, i, i);
-    for (i = 256; i >= 0; i--) check_table(table, i, i);
-    compute_dist(table);
-    N(HashDestroy)(table);
-
-    printf("\n***** 1024 consecutive integers ****\n");
-    table = N(HashCreate)();
-    for (i = 0; i < 1024; i++) N(HashInsert)(table, i, i);
-    for (i = 0; i < 1024; i++) check_table(table, i, i);
-    for (i = 1024; i >= 0; i--) check_table(table, i, i);
-    compute_dist(table);
-    N(HashDestroy)(table);
-
-    printf("\n***** 1024 consecutive page addresses (4k pages) ****\n");
-    table = N(HashCreate)();
-    for (i = 0; i < 1024; i++) N(HashInsert)(table, i*4096, i);
-    for (i = 0; i < 1024; i++) check_table(table, i*4096, i);
-    for (i = 1024; i >= 0; i--) check_table(table, i*4096, i);
-    compute_dist(table);
-    N(HashDestroy)(table);
-
-    printf("\n***** 1024 random integers ****\n");
-    table = N(HashCreate)();
-    srandom(0xbeefbeef);
-    for (i = 0; i < 1024; i++) N(HashInsert)(table, random(), i);
-    srandom(0xbeefbeef);
-    for (i = 0; i < 1024; i++) check_table(table, random(), i);
-    srandom(0xbeefbeef);
-    for (i = 0; i < 1024; i++) check_table(table, random(), i);
-    compute_dist(table);
-    N(HashDestroy)(table);
-
-    printf("\n***** 5000 random integers ****\n");
-    table = N(HashCreate)();
-    srandom(0xbeefbeef);
-    for (i = 0; i < 5000; i++) N(HashInsert)(table, random(), i);
-    srandom(0xbeefbeef);
-    for (i = 0; i < 5000; i++) check_table(table, random(), i);
-    srandom(0xbeefbeef);
-    for (i = 0; i < 5000; i++) check_table(table, random(), i);
-    compute_dist(table);
-    N(HashDestroy)(table);
-
-    return 0;
-}
-#endif
diff --git a/hw/xfree86/os-support/drm/xf86drmRandom.c b/hw/xfree86/os-support/drm/xf86drmRandom.c
deleted file mode 100644
index cd63aea..0000000
--- a/hw/xfree86/os-support/drm/xf86drmRandom.c
+++ /dev/null
@@ -1,216 +0,0 @@
-/* xf86drmRandom.c -- "Minimal Standard" PRNG Implementation
- * Created: Mon Apr 19 08:28:13 1999 by faith at precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- * 
- * Authors: Rickard E. (Rik) Faith <faith at valinux.com>
- *
- *
- * DESCRIPTION
- *
- * This file contains a simple, straightforward implementation of the Park
- * & Miller "Minimal Standard" PRNG [PM88, PMS93], which is a Lehmer
- * multiplicative linear congruential generator (MLCG) with a period of
- * 2^31-1.
- *
- * This implementation is intended to provide a reliable, portable PRNG
- * that is suitable for testing a hash table implementation and for
- * implementing skip lists.
- *
- * FUTURE ENHANCEMENTS
- *
- * If initial seeds are not selected randomly, two instances of the PRNG
- * can be correlated.  [Knuth81, pp. 32-33] describes a shuffling technique
- * that can eliminate this problem.
- *
- * If PRNGs are used for simulation, the period of the current
- * implementation may be too short.  [LE88] discusses methods of combining
- * MLCGs to produce much longer periods, and suggests some alternative
- * values for A and M.  [LE90 and Sch92] also provide information on
- * long-period PRNGs.
- *
- * REFERENCES
- *
- * [Knuth81] Donald E. Knuth. The Art of Computer Programming.  Volume 2:
- * Seminumerical Algorithms.  Reading, Massachusetts: Addison-Wesley, 1981.
- *
- * [LE88] Pierre L'Ecuyer. "Efficient and Portable Combined Random Number
- * Generators".  CACM 31(6), June 1988, pp. 742-774.
- *
- * [LE90] Pierre L'Ecuyer. "Random Numbers for Simulation". CACM 33(10,
- * October 1990, pp. 85-97.
- *
- * [PM88] Stephen K. Park and Keith W. Miller. "Random Number Generators:
- * Good Ones are Hard to Find". CACM 31(10), October 1988, pp. 1192-1201.
- *
- * [Sch92] Bruce Schneier. "Pseudo-Ransom Sequence Generator for 32-Bit
- * CPUs".  Dr. Dobb's Journal 17(2), February 1992, pp. 34, 37-38, 40.
- *
- * [PMS93] Stephen K. Park, Keith W. Miller, and Paul K. Stockmeyer.  In
- * "Technical Correspondence: Remarks on Choosing and Implementing Random
- * Number Generators". CACM 36(7), July 1993, pp. 105-110.
- *
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#define RANDOM_MAIN 0
-
-#include <stdio.h>
-#include <stdlib.h>
-#if !RANDOM_MAIN
-# include "drm.h"
-# include "xf86drm.h"
-# include "xf86.h"
-#endif
-
-#define N(x)  drm##x
-
-#define RANDOM_MAGIC 0xfeedbeef
-#define RANDOM_DEBUG 0
-
-#if RANDOM_MAIN
-#define RANDOM_ALLOC malloc
-#define RANDOM_FREE  free
-#else
-#define RANDOM_ALLOC drmMalloc
-#define RANDOM_FREE  drmFree
-#endif
-
-typedef struct RandomState {
-    unsigned long magic;
-    unsigned long a;
-    unsigned long m;
-    unsigned long q;		/* m div a */
-    unsigned long r;		/* m mod a */
-    unsigned long check;
-    long          seed;
-} RandomState;
-
-#if RANDOM_MAIN
-extern void          *N(RandomCreate)(unsigned long seed);
-extern int           N(RandomDestroy)(void *state);
-extern unsigned long N(Random)(void *state);
-extern double        N(RandomDouble)(void *state);
-#endif
-
-void *N(RandomCreate)(unsigned long seed)
-{
-    RandomState  *state;
-
-    state           = RANDOM_ALLOC(sizeof(*state));
-    if (!state) return NULL;
-    state->magic    = RANDOM_MAGIC;
-#if 0
-				/* Park & Miller, October 1988 */
-    state->a        = 16807;
-    state->m        = 2147483647;
-    state->check    = 1043618065; /* After 10000 iterations */
-#else
-				/* Park, Miller, and Stockmeyer, July 1993 */
-    state->a        = 48271;
-    state->m        = 2147483647;
-    state->check    = 399268537; /* After 10000 iterations */
-#endif
-    state->q        = state->m / state->a;
-    state->r        = state->m % state->a;
-
-    state->seed     = seed;
-				/* Check for illegal boundary conditions,
-                                   and choose closest legal value. */
-    if (state->seed <= 0)        state->seed = 1;
-    if (state->seed >= state->m) state->seed = state->m - 1;
-
-    return state;
-}
-
-int N(RandomDestroy)(void *state)
-{
-    RANDOM_FREE(state);
-    return 0;
-}
-
-unsigned long N(Random)(void *state)
-{
-    RandomState   *s = (RandomState *)state;
-    long          hi;
-    long          lo;
-
-    hi      = s->seed / s->q;
-    lo      = s->seed % s->q;
-    s->seed = s->a * lo - s->r * hi;
-    if (s->seed <= 0) s->seed += s->m;
-
-    return s->seed;
-}
-
-double N(RandomDouble)(void *state)
-{
-    RandomState *s = (RandomState *)state;
-    
-    return (double)N(Random)(state)/(double)s->m;
-}
-
-#if RANDOM_MAIN
-static void check_period(long seed)
-{
-    unsigned long count = 0;
-    unsigned long initial;
-    void          *state;
-    
-    state = N(RandomCreate)(seed);
-    initial = N(Random)(state);
-    ++count;
-    while (initial != N(Random)(state)) {
-	if (!++count) break;
-    }
-    printf("With seed of %10ld, period = %10lu (0x%08lx)\n",
-	   seed, count, count);
-    N(RandomDestroy)(state);
-}
-
-int main(void)
-{
-    RandomState   *state;
-    int           i;
-    unsigned long rand;
-
-    state = N(RandomCreate)(1);
-    for (i = 0; i < 10000; i++) {
-	rand = N(Random)(state);
-    }
-    printf("After 10000 iterations: %lu (%lu expected): %s\n",
-	   rand, state->check,
-	   rand - state->check ? "*INCORRECT*" : "CORRECT");
-    N(RandomDestroy)(state);
-
-    printf("Checking periods...\n");
-    check_period(1);
-    check_period(2);
-    check_period(31415926);
-    
-    return 0;
-}
-#endif
diff --git a/hw/xfree86/os-support/drm/xf86drmSL.c b/hw/xfree86/os-support/drm/xf86drmSL.c
deleted file mode 100644
index 36d8fd5..0000000
--- a/hw/xfree86/os-support/drm/xf86drmSL.c
+++ /dev/null
@@ -1,488 +0,0 @@
-/* xf86drmSL.c -- Skip list support
- * Created: Mon May 10 09:28:13 1999 by faith at precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- * 
- * Authors: Rickard E. (Rik) Faith <faith at valinux.com>
- *
- *
- * DESCRIPTION
- *
- * This file contains a straightforward skip list implementation.n
- *
- * FUTURE ENHANCEMENTS
- *
- * REFERENCES
- *
- * [Pugh90] William Pugh.  Skip Lists: A Probabilistic Alternative to
- * Balanced Trees. CACM 33(6), June 1990, pp. 668-676.
- *
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#define SL_MAIN 0
-
-#if SL_MAIN
-# include <stdio.h>
-# include <stdlib.h>
-#  include <sys/time.h>
-#else
-# include "drm.h"
-# include "xf86drm.h"
-# include "xf86.h"
-#endif
-
-#define N(x)  drm##x
-
-#define SL_LIST_MAGIC  0xfacade00LU
-#define SL_ENTRY_MAGIC 0x00fab1edLU
-#define SL_FREED_MAGIC 0xdecea5edLU
-#define SL_MAX_LEVEL   16
-#define SL_DEBUG       0
-#define SL_RANDOM_SEED 0xc01055a1LU
-
-#if SL_MAIN
-#define SL_ALLOC malloc
-#define SL_FREE  free
-#define SL_RANDOM_DECL        static int state = 0;
-#define SL_RANDOM_INIT(seed)  if (!state) { srandom(seed); ++state; }
-#define SL_RANDOM             random()
-#else
-#define SL_ALLOC drmMalloc
-#define SL_FREE  drmFree
-#define SL_RANDOM_DECL        static void *state = NULL
-#define SL_RANDOM_INIT(seed)  if (!state) state = drmRandomCreate(seed)
-#define SL_RANDOM             drmRandom(state)
-
-#endif
-
-typedef struct SLEntry {
-    unsigned long     magic;	   /* SL_ENTRY_MAGIC */
-    unsigned long     key;
-    void              *value;
-    int               levels;
-    struct SLEntry    *forward[1]; /* variable sized array */
-} SLEntry, *SLEntryPtr;
-
-typedef struct SkipList {
-    unsigned long    magic;	/* SL_LIST_MAGIC */
-    int              level;
-    int              count;
-    SLEntryPtr       head;
-    SLEntryPtr       p0;	/* Position for iteration */
-} SkipList, *SkipListPtr;
-
-#if SL_MAIN
-extern void *N(SLCreate)(void);
-extern int  N(SLDestroy)(void *l);
-extern int  N(SLLookup)(void *l, unsigned long key, void **value);
-extern int  N(SLInsert)(void *l, unsigned long key, void *value);
-extern int  N(SLDelete)(void *l, unsigned long key);
-extern int  N(SLNext)(void *l, unsigned long *key, void **value);
-extern int  N(SLFirst)(void *l, unsigned long *key, void **value);
-extern void N(SLDump)(void *l);
-extern int  N(SLLookupNeighbors)(void *l, unsigned long key,
-				 unsigned long *prev_key, void **prev_value,
-				 unsigned long *next_key, void **next_value);
-#endif
-
-static SLEntryPtr SLCreateEntry(int max_level, unsigned long key, void *value)
-{
-    SLEntryPtr entry;
-    
-    if (max_level < 0 || max_level > SL_MAX_LEVEL) max_level = SL_MAX_LEVEL;
-
-    entry         = SL_ALLOC(sizeof(*entry)
-			     + (max_level + 1) * sizeof(entry->forward[0]));
-    if (!entry) return NULL;
-    entry->magic  = SL_ENTRY_MAGIC;
-    entry->key    = key;
-    entry->value  = value;
-    entry->levels = max_level + 1;
-
-    return entry;
-}
-
-static int SLRandomLevel(void)
-{
-    int level = 1;
-    SL_RANDOM_DECL;
-
-    SL_RANDOM_INIT(SL_RANDOM_SEED);
-    
-    while ((SL_RANDOM & 0x01) && level < SL_MAX_LEVEL) ++level;
-    return level;
-}
-
-void *N(SLCreate)(void)
-{
-    SkipListPtr  list;
-    int          i;
-
-    list           = SL_ALLOC(sizeof(*list));
-    if (!list) return NULL;
-    list->magic    = SL_LIST_MAGIC;
-    list->level    = 0;
-    list->head     = SLCreateEntry(SL_MAX_LEVEL, 0, NULL);
-    list->count    = 0;
-
-    for (i = 0; i <= SL_MAX_LEVEL; i++) list->head->forward[i] = NULL;
-    
-    return list;
-}
-
-int N(SLDestroy)(void *l)
-{
-    SkipListPtr   list  = (SkipListPtr)l;
-    SLEntryPtr    entry;
-    SLEntryPtr    next;
-
-    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
-
-    for (entry = list->head; entry; entry = next) {
-	if (entry->magic != SL_ENTRY_MAGIC) return -1; /* Bad magic */
-	next         = entry->forward[0];
-	entry->magic = SL_FREED_MAGIC;
-	SL_FREE(entry);
-    }
-
-    list->magic = SL_FREED_MAGIC;
-    SL_FREE(list);
-    return 0;
-}
-
-static SLEntryPtr SLLocate(void *l, unsigned long key, SLEntryPtr *update)
-{
-    SkipListPtr   list  = (SkipListPtr)l;
-    SLEntryPtr    entry;
-    int           i;
-
-    if (list->magic != SL_LIST_MAGIC) return NULL;
-
-    for (i = list->level, entry = list->head; i >= 0; i--) {
-	while (entry->forward[i] && entry->forward[i]->key < key)
-	    entry = entry->forward[i];
-	update[i] = entry;
-    }
-
-    return entry->forward[0];
-}
-
-int N(SLInsert)(void *l, unsigned long key, void *value)
-{
-    SkipListPtr   list  = (SkipListPtr)l;
-    SLEntryPtr    entry;
-    SLEntryPtr    update[SL_MAX_LEVEL + 1];
-    int           level;
-    int           i;
-
-    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
-
-    entry = SLLocate(list, key, update);
-
-    if (entry && entry->key == key) return 1; /* Already in list */
-
-
-    level = SLRandomLevel();
-    if (level > list->level) {
-	level = ++list->level;
-	update[level] = list->head;
-    }
-
-    entry = SLCreateEntry(level, key, value);
-
-				/* Fix up forward pointers */
-    for (i = 0; i <= level; i++) {
-	entry->forward[i]     = update[i]->forward[i];
-	update[i]->forward[i] = entry;
-    }
-
-    ++list->count;
-    return 0;			/* Added to table */
-}
-
-int N(SLDelete)(void *l, unsigned long key)
-{
-    SkipListPtr   list = (SkipListPtr)l;
-    SLEntryPtr    update[SL_MAX_LEVEL + 1];
-    SLEntryPtr    entry;
-    int           i;
-
-    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
-
-    entry = SLLocate(list, key, update);
-
-    if (!entry || entry->key != key) return 1; /* Not found */
-
-				/* Fix up forward pointers */
-    for (i = 0; i <= list->level; i++) {
-	if (update[i]->forward[i] == entry)
-	    update[i]->forward[i] = entry->forward[i];
-    }
-
-    entry->magic = SL_FREED_MAGIC;
-    SL_FREE(entry);
-
-    while (list->level && !list->head->forward[list->level]) --list->level;
-    --list->count;
-    return 0;
-}
-
-int N(SLLookup)(void *l, unsigned long key, void **value)
-{
-    SkipListPtr   list = (SkipListPtr)l;
-    SLEntryPtr    update[SL_MAX_LEVEL + 1];
-    SLEntryPtr    entry;
-
-    entry = SLLocate(list, key, update);
-
-    if (entry && entry->key == key) {
-	*value = entry;
-	return 0;
-    }
-    *value = NULL;
-    return -1;
-}
-
-int N(SLLookupNeighbors)(void *l, unsigned long key,
-			 unsigned long *prev_key, void **prev_value,
-			 unsigned long *next_key, void **next_value)
-{
-    SkipListPtr   list = (SkipListPtr)l;
-    SLEntryPtr    update[SL_MAX_LEVEL + 1];
-    SLEntryPtr    entry;
-    int           retcode = 0;
-
-    entry = SLLocate(list, key, update);
-
-    *prev_key   = *next_key   = key;
-    *prev_value = *next_value = NULL;
-	
-    if (update[0]) {
-	*prev_key   = update[0]->key;
-	*prev_value = update[0]->value;
-	++retcode;
-	if (update[0]->forward[0]) {
-	    *next_key   = update[0]->forward[0]->key;
-	    *next_value = update[0]->forward[0]->value;
-	    ++retcode;
-	}
-    }
-    return retcode;
-}
-
-int N(SLNext)(void *l, unsigned long *key, void **value)
-{
-    SkipListPtr   list = (SkipListPtr)l;
-    SLEntryPtr    entry;
-    
-    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
-
-    entry    = list->p0;
-
-    if (entry) {
-	list->p0 = entry->forward[0];
-	*key     = entry->key;
-	*value   = entry->value;
-	return 1;
-    }
-    list->p0 = NULL;
-    return 0;
-}
-
-int N(SLFirst)(void *l, unsigned long *key, void **value)
-{
-    SkipListPtr   list = (SkipListPtr)l;
-    
-    if (list->magic != SL_LIST_MAGIC) return -1; /* Bad magic */
-    
-    list->p0 = list->head->forward[0];
-    return N(SLNext)(list, key, value);
-}
-
-/* Dump internal data structures for debugging. */
-void N(SLDump)(void *l)
-{
-    SkipListPtr   list = (SkipListPtr)l;
-    SLEntryPtr    entry;
-    int           i;
-    
-    if (list->magic != SL_LIST_MAGIC) {
-	printf("Bad magic: 0x%08lx (expected 0x%08lx)\n",
-	       list->magic, SL_LIST_MAGIC);
-	return;
-    }
-
-    printf("Level = %d, count = %d\n", list->level, list->count);
-    for (entry = list->head; entry; entry = entry->forward[0]) {
-	if (entry->magic != SL_ENTRY_MAGIC) {
-	    printf("Bad magic: 0x%08lx (expected 0x%08lx)\n",
-		   list->magic, SL_ENTRY_MAGIC);
-	}
-	printf("\nEntry %p <0x%08lx, %p> has %2d levels\n",
-	       entry, entry->key, entry->value, entry->levels);
-	for (i = 0; i < entry->levels; i++) {
-	    if (entry->forward[i]) {
-		printf("   %2d: %p <0x%08lx, %p>\n",
-		       i,
-		       entry->forward[i],
-		       entry->forward[i]->key,
-		       entry->forward[i]->value);
-	    } else {
-		printf("   %2d: %p\n", i, entry->forward[i]);
-	    }
-	}
-    }
-}
-
-#if SL_MAIN
-static void print(SkipListPtr list)
-{
-    unsigned long key;
-    void          *value;
-    
-    if (N(SLFirst)(list, &key, &value)) {
-	do {
-	    printf("key = %5lu, value = %p\n", key, value);
-	} while (N(SLNext)(list, &key, &value));
-    }
-}
-
-static double do_time(int size, int iter)
-{
-    SkipListPtr    list;
-    int            i, j;
-    unsigned long  keys[1000000];
-    unsigned long  previous;
-    unsigned long  key;
-    void           *value;
-    struct timeval start, stop;
-    double         usec;
-    SL_RANDOM_DECL;
-
-    SL_RANDOM_INIT(12345);
-    
-    list = N(SLCreate)();
-
-    for (i = 0; i < size; i++) {
-	keys[i] = SL_RANDOM;
-	N(SLInsert)(list, keys[i], NULL);
-    }
-
-    previous = 0;
-    if (N(SLFirst)(list, &key, &value)) {
-	do {
-	    if (key <= previous) {
-		printf( "%lu !< %lu\n", previous, key);
-	    }
-	    previous = key;
-	} while (N(SLNext)(list, &key, &value));
-    }
-    
-    gettimeofday(&start, NULL);
-    for (j = 0; j < iter; j++) {
-	for (i = 0; i < size; i++) {
-	    if (N(SLLookup)(list, keys[i], &value))
-		printf("Error %lu %d\n", keys[i], i);
-	}
-    }
-    gettimeofday(&stop, NULL);
-    
-    usec = (double)(stop.tv_sec * 1000000 + stop.tv_usec
-		    - start.tv_sec * 1000000 - start.tv_usec) / (size * iter);
-    
-    printf("%0.2f microseconds for list length %d\n", usec, size);
-
-    N(SLDestroy)(list);
-    
-    return usec;
-}
-
-static void print_neighbors(void *list, unsigned long key)
-{
-    unsigned long prev_key = 0;
-    unsigned long next_key = 0;
-    void          *prev_value;
-    void          *next_value;
-    int           retval;
-
-    retval = drmSLLookupNeighbors(list, key,
-				  &prev_key, &prev_value,
-				  &next_key, &next_value);
-    printf("Neighbors of %5lu: %d %5lu %5lu\n",
-	   key, retval, prev_key, next_key);
-}
-
-int main(void)
-{
-    SkipListPtr    list;
-    double         usec, usec2, usec3, usec4;
-
-    list = N(SLCreate)();
-    printf( "list at %p\n", list);
-
-    print(list);
-    printf("\n==============================\n\n");
-
-    N(SLInsert)(list, 123, NULL);
-    N(SLInsert)(list, 213, NULL);
-    N(SLInsert)(list, 50, NULL);
-    print(list);
-    printf("\n==============================\n\n");
-    
-    print_neighbors(list, 0);
-    print_neighbors(list, 50);
-    print_neighbors(list, 51);
-    print_neighbors(list, 123);
-    print_neighbors(list, 200);
-    print_neighbors(list, 213);
-    print_neighbors(list, 256);
-    printf("\n==============================\n\n");    
-    
-    N(SLDelete)(list, 50);
-    print(list);
-    printf("\n==============================\n\n");
-
-    N(SLDump)(list);
-    N(SLDestroy)(list);
-    printf("\n==============================\n\n");
-
-    usec  = do_time(100, 10000);
-    usec2 = do_time(1000, 500);
-    printf("Table size increased by %0.2f, search time increased by %0.2f\n",
-	   1000.0/100.0, usec2 / usec);
-    
-    usec3 = do_time(10000, 50);
-    printf("Table size increased by %0.2f, search time increased by %0.2f\n",
-	   10000.0/100.0, usec3 / usec);
-    
-    usec4 = do_time(100000, 4);
-    printf("Table size increased by %0.2f, search time increased by %0.2f\n",
-	   100000.0/100.0, usec4 / usec);
-
-    return 0;
-}
-#endif
diff --git a/hw/xfree86/os-support/xf86drm.h b/hw/xfree86/os-support/xf86drm.h
deleted file mode 100644
index 18e4564..0000000
--- a/hw/xfree86/os-support/xf86drm.h
+++ /dev/null
@@ -1,641 +0,0 @@
-/**
- * \file xf86drm.h 
- * OS-independent header for DRM user-level library interface.
- *
- * \author Rickard E. (Rik) Faith <faith at valinux.com>
- */
- 
-/*
- * Copyright 1999, 2000 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-
-#ifndef _XF86DRM_H_
-#define _XF86DRM_H_
-
-#include <drm.h>
-#include <xf86mm.h>
-
-				/* Defaults, if nothing set in xf86config */
-#define DRM_DEV_UID	 0
-#define DRM_DEV_GID	 0
-/* Default /dev/dri directory permissions 0755 */
-#define DRM_DEV_DIRMODE	 	\
-	(S_IRUSR|S_IWUSR|S_IXUSR|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH)
-#define DRM_DEV_MODE	 (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP)
-
-#define DRM_DIR_NAME  "/dev/dri"
-#define DRM_DEV_NAME  "%s/card%d"
-#define DRM_PROC_NAME "/proc/dri/" /* For backward Linux compatibility */
-
-#define DRM_ERR_NO_DEVICE  (-1001)
-#define DRM_ERR_NO_ACCESS  (-1002)
-#define DRM_ERR_NOT_ROOT   (-1003)
-#define DRM_ERR_INVALID    (-1004)
-#define DRM_ERR_NO_FD      (-1005)
-
-#define DRM_AGP_NO_HANDLE 0
-
-typedef unsigned int  drmSize,     *drmSizePtr;	    /**< For mapped regions */
-typedef void          *drmAddress, **drmAddressPtr; /**< For mapped regions */
-
-/**
- * Driver version information.
- *
- * \sa drmGetVersion() and drmSetVersion().
- */
-typedef struct _drmVersion {
-    int     version_major;        /**< Major version */
-    int     version_minor;        /**< Minor version */
-    int     version_patchlevel;   /**< Patch level */
-    int     name_len; 	          /**< Length of name buffer */
-    char    *name;	          /**< Name of driver */
-    int     date_len;             /**< Length of date buffer */
-    char    *date;                /**< User-space buffer to hold date */
-    int     desc_len;	          /**< Length of desc buffer */
-    char    *desc;                /**< User-space buffer to hold desc */
-} drmVersion, *drmVersionPtr;
-
-typedef struct _drmStats {
-    unsigned long count;	     /**< Number of data */
-    struct {
-	unsigned long value;	     /**< Value from kernel */
-	const char    *long_format;  /**< Suggested format for long_name */
-	const char    *long_name;    /**< Long name for value */
-	const char    *rate_format;  /**< Suggested format for rate_name */
-	const char    *rate_name;    /**< Short name for value per second */
-	int           isvalue;       /**< True if value (vs. counter) */
-	const char    *mult_names;   /**< Multiplier names (e.g., "KGM") */
-	int           mult;          /**< Multiplier value (e.g., 1024) */
-	int           verbose;       /**< Suggest only in verbose output */
-    } data[15];
-} drmStatsT;
-
-
-				/* All of these enums *MUST* match with the
-                                   kernel implementation -- so do *NOT*
-                                   change them!  (The drmlib implementation
-                                   will just copy the flags instead of
-                                   translating them.) */
-typedef enum {
-    DRM_FRAME_BUFFER    = 0,      /**< WC, no caching, no core dump */
-    DRM_REGISTERS       = 1,      /**< no caching, no core dump */
-    DRM_SHM             = 2,      /**< shared, cached */
-    DRM_AGP             = 3,	  /**< AGP/GART */
-    DRM_SCATTER_GATHER  = 4,	  /**< PCI scatter/gather */
-    DRM_CONSISTENT      = 5	  /**< PCI consistent */
-} drmMapType;
-
-typedef enum {
-    DRM_RESTRICTED      = 0x0001, /**< Cannot be mapped to client-virtual */
-    DRM_READ_ONLY       = 0x0002, /**< Read-only in client-virtual */
-    DRM_LOCKED          = 0x0004, /**< Physical pages locked */
-    DRM_KERNEL          = 0x0008, /**< Kernel requires access */
-    DRM_WRITE_COMBINING = 0x0010, /**< Use write-combining, if available */
-    DRM_CONTAINS_LOCK   = 0x0020, /**< SHM page that contains lock */
-    DRM_REMOVABLE	= 0x0040  /**< Removable mapping */
-} drmMapFlags;
-
-/**
- * \warning These values *MUST* match drm.h
- */
-typedef enum {
-    /** \name Flags for DMA buffer dispatch */
-    /*@{*/
-    DRM_DMA_BLOCK        = 0x01, /**< 
-				  * Block until buffer dispatched.
-				  * 
-				  * \note the buffer may not yet have been
-				  * processed by the hardware -- getting a
-				  * hardware lock with the hardware quiescent
-				  * will ensure that the buffer has been
-				  * processed.
-				  */
-    DRM_DMA_WHILE_LOCKED = 0x02, /**< Dispatch while lock held */
-    DRM_DMA_PRIORITY     = 0x04, /**< High priority dispatch */
-    /*@}*/
-
-    /** \name Flags for DMA buffer request */
-    /*@{*/
-    DRM_DMA_WAIT         = 0x10, /**< Wait for free buffers */
-    DRM_DMA_SMALLER_OK   = 0x20, /**< Smaller-than-requested buffers OK */
-    DRM_DMA_LARGER_OK    = 0x40  /**< Larger-than-requested buffers OK */
-    /*@}*/
-} drmDMAFlags;
-
-typedef enum {
-    DRM_PAGE_ALIGN       = 0x01,
-    DRM_AGP_BUFFER       = 0x02,
-    DRM_SG_BUFFER        = 0x04,
-    DRM_FB_BUFFER        = 0x08
-} drmBufDescFlags;
-
-typedef enum {
-    DRM_LOCK_READY      = 0x01, /**< Wait until hardware is ready for DMA */
-    DRM_LOCK_QUIESCENT  = 0x02, /**< Wait until hardware quiescent */
-    DRM_LOCK_FLUSH      = 0x04, /**< Flush this context's DMA queue first */
-    DRM_LOCK_FLUSH_ALL  = 0x08, /**< Flush all DMA queues first */
-				/* These *HALT* flags aren't supported yet
-                                   -- they will be used to support the
-                                   full-screen DGA-like mode. */
-    DRM_HALT_ALL_QUEUES = 0x10, /**< Halt all current and future queues */
-    DRM_HALT_CUR_QUEUES = 0x20  /**< Halt all current queues */
-} drmLockFlags;
-
-typedef enum {
-    DRM_CONTEXT_PRESERVED = 0x01, /**< This context is preserved and
-				     never swapped. */
-    DRM_CONTEXT_2DONLY    = 0x02  /**< This context is for 2D rendering only. */
-} drm_context_tFlags, *drm_context_tFlagsPtr;
-
-typedef struct _drmBufDesc {
-    int              count;	  /**< Number of buffers of this size */
-    int              size;	  /**< Size in bytes */
-    int              low_mark;	  /**< Low water mark */
-    int              high_mark;	  /**< High water mark */
-} drmBufDesc, *drmBufDescPtr;
-
-typedef struct _drmBufInfo {
-    int              count;	  /**< Number of buffers described in list */
-    drmBufDescPtr    list;	  /**< List of buffer descriptions */
-} drmBufInfo, *drmBufInfoPtr;
-
-typedef struct _drmBuf {
-    int              idx;	  /**< Index into the master buffer list */
-    int              total;	  /**< Buffer size */
-    int              used;	  /**< Amount of buffer in use (for DMA) */
-    drmAddress       address;	  /**< Address */
-} drmBuf, *drmBufPtr;
-
-/**
- * Buffer mapping information.
- *
- * Used by drmMapBufs() and drmUnmapBufs() to store information about the
- * mapped buffers.
- */
-typedef struct _drmBufMap {
-    int              count;	  /**< Number of buffers mapped */
-    drmBufPtr        list;	  /**< Buffers */
-} drmBufMap, *drmBufMapPtr;
-
-typedef struct _drmLock {
-    volatile unsigned int lock;
-    char                      padding[60];
-    /* This is big enough for most current (and future?) architectures:
-       DEC Alpha:              32 bytes
-       Intel Merced:           ?
-       Intel P5/PPro/PII/PIII: 32 bytes
-       Intel StrongARM:        32 bytes
-       Intel i386/i486:        16 bytes
-       MIPS:                   32 bytes (?)
-       Motorola 68k:           16 bytes
-       Motorola PowerPC:       32 bytes
-       Sun SPARC:              32 bytes
-    */
-} drmLock, *drmLockPtr;
-
-/**
- * Indices here refer to the offset into
- * list in drmBufInfo
- */
-typedef struct _drmDMAReq {
-    drm_context_t    context;  	  /**< Context handle */
-    int           send_count;     /**< Number of buffers to send */
-    int           *send_list;     /**< List of handles to buffers */
-    int           *send_sizes;    /**< Lengths of data to send, in bytes */
-    drmDMAFlags   flags;          /**< Flags */
-    int           request_count;  /**< Number of buffers requested */
-    int           request_size;	  /**< Desired size of buffers requested */
-    int           *request_list;  /**< Buffer information */
-    int           *request_sizes; /**< Minimum acceptable sizes */
-    int           granted_count;  /**< Number of buffers granted at this size */
-} drmDMAReq, *drmDMAReqPtr;
-
-typedef struct _drmRegion {
-    drm_handle_t     handle;
-    unsigned int  offset;
-    drmSize       size;
-    drmAddress    map;
-} drmRegion, *drmRegionPtr;
-
-typedef struct _drmTextureRegion {
-    unsigned char next;
-    unsigned char prev;
-    unsigned char in_use;
-    unsigned char padding;	/**< Explicitly pad this out */
-    unsigned int  age;
-} drmTextureRegion, *drmTextureRegionPtr;
-
-
-typedef enum {
-    DRM_VBLANK_ABSOLUTE = 0x0,	/**< Wait for specific vblank sequence number */
-    DRM_VBLANK_RELATIVE = 0x1,	/**< Wait for given number of vblanks */
-    DRM_VBLANK_SIGNAL   = 0x40000000	/* Send signal instead of blocking */
-} drmVBlankSeqType;
-
-typedef struct _drmVBlankReq {
-	drmVBlankSeqType type;
-	unsigned int sequence;
-	unsigned long signal;
-} drmVBlankReq, *drmVBlankReqPtr;
-
-typedef struct _drmVBlankReply {
-	drmVBlankSeqType type;
-	unsigned int sequence;
-	long tval_sec;
-	long tval_usec;
-} drmVBlankReply, *drmVBlankReplyPtr;
-
-typedef union _drmVBlank {
-	drmVBlankReq request;
-	drmVBlankReply reply;
-} drmVBlank, *drmVBlankPtr;
-
-typedef struct _drmSetVersion {
-	int drm_di_major;
-	int drm_di_minor;
-	int drm_dd_major;
-	int drm_dd_minor;
-} drmSetVersion, *drmSetVersionPtr;
-
-
-#define __drm_dummy_lock(lock) (*(__volatile__ unsigned int *)lock)
-
-#define DRM_LOCK_HELD  0x80000000U /**< Hardware lock is held */
-#define DRM_LOCK_CONT  0x40000000U /**< Hardware lock is contended */
-
-#if defined(__GNUC__) && (__GNUC__ >= 2)
-# if defined(__i386) || defined(__AMD64__) || defined(__x86_64__) || defined(__amd64__)
-				/* Reflect changes here to drmP.h */
-#define DRM_CAS(lock,old,new,__ret)                                    \
-	do {                                                           \
-                int __dummy;	/* Can't mark eax as clobbered */      \
-		__asm__ __volatile__(                                  \
-			"lock ; cmpxchg %4,%1\n\t"                     \
-                        "setnz %0"                                     \
-			: "=d" (__ret),                                \
-   			  "=m" (__drm_dummy_lock(lock)),               \
-                          "=a" (__dummy)                               \
-			: "2" (old),                                   \
-			  "r" (new));                                  \
-	} while (0)
-
-#elif defined(__alpha__)
-
-#define	DRM_CAS(lock, old, new, ret) 		\
- 	do {					\
- 		int old32;                      \
- 		int cur32;			\
- 		__asm__ __volatile__(		\
- 		"       mb\n"			\
- 		"       zap   %4, 0xF0, %0\n"   \
- 		"       ldl_l %1, %2\n"		\
- 		"       zap   %1, 0xF0, %1\n"   \
-                "       cmpeq %0, %1, %1\n"	\
-                "       beq   %1, 1f\n"		\
- 		"       bis   %5, %5, %1\n"	\
-                "       stl_c %1, %2\n"		\
-                "1:     xor   %1, 1, %1\n"	\
-                "       stl   %1, %3"		\
-                : "=r" (old32),                 \
-		  "=&r" (cur32),		\
-                   "=m" (__drm_dummy_lock(lock)),\
-                   "=m" (ret)			\
- 		: "r" (old),			\
- 		  "r" (new));			\
- 	} while(0)
-
-#elif defined(__sparc__)
-
-#define DRM_CAS(lock,old,new,__ret)				\
-do {	register unsigned int __old __asm("o0");		\
-	register unsigned int __new __asm("o1");		\
-	register volatile unsigned int *__lock __asm("o2");	\
-	__old = old;						\
-	__new = new;						\
-	__lock = (volatile unsigned int *)lock;			\
-	__asm__ __volatile__(					\
-		/*"cas [%2], %3, %0"*/				\
-		".word 0xd3e29008\n\t"				\
-		/*"membar #StoreStore | #StoreLoad"*/		\
-		".word 0x8143e00a"				\
-		: "=&r" (__new)					\
-		: "0" (__new),					\
-		  "r" (__lock),					\
-		  "r" (__old)					\
-		: "memory");					\
-	__ret = (__new != __old);				\
-} while(0)
-
-#elif defined(__ia64__)
-
-#ifdef __INTEL_COMPILER
-/* this currently generates bad code (missing stop bits)... */
-#include <ia64intrin.h>
-
-#define DRM_CAS(lock,old,new,__ret)					      \
-	do {								      \
-		unsigned long __result, __old = (old) & 0xffffffff;		\
-		__mf();							      	\
-		__result = _InterlockedCompareExchange_acq(&__drm_dummy_lock(lock), (new), __old);\
-		__ret = (__result) != (__old);					\
-/*		__ret = (__sync_val_compare_and_swap(&__drm_dummy_lock(lock), \
-						     (old), (new))	      \
-			 != (old));					      */\
-	} while (0)
-
-#else
-#define DRM_CAS(lock,old,new,__ret)					  \
-	do {								  \
-		unsigned int __result, __old = (old);			  \
-		__asm__ __volatile__(					  \
-			"mf\n"						  \
-			"mov ar.ccv=%2\n"				  \
-			";;\n"						  \
-			"cmpxchg4.acq %0=%1,%3,ar.ccv"			  \
-			: "=r" (__result), "=m" (__drm_dummy_lock(lock))  \
-			: "r" ((unsigned long)__old), "r" (new)			  \
-			: "memory");					  \
-		__ret = (__result) != (__old);				  \
-	} while (0)
-
-#endif
-
-#elif defined(__powerpc__)
-
-#define DRM_CAS(lock,old,new,__ret)			\
-	do {						\
-		__asm__ __volatile__(			\
-			"sync;"				\
-			"0:    lwarx %0,0,%1;"		\
-			"      xor. %0,%3,%0;"		\
-			"      bne 1f;"			\
-			"      stwcx. %2,0,%1;"		\
-			"      bne- 0b;"		\
-			"1:    "			\
-			"sync;"				\
-		: "=&r"(__ret)				\
-		: "r"(lock), "r"(new), "r"(old)		\
-		: "cr0", "memory");			\
-	} while (0)
-
-#endif /* architecture */
-#endif /* __GNUC__ >= 2 */
-
-#ifndef DRM_CAS
-#define DRM_CAS(lock,old,new,ret) do { ret=1; } while (0) /* FAST LOCK FAILS */
-#endif
-
-#if defined(__alpha__) || defined(__powerpc__)
-#define DRM_CAS_RESULT(_result)		int _result
-#else
-#define DRM_CAS_RESULT(_result)		char _result
-#endif
-
-#define DRM_LIGHT_LOCK(fd,lock,context)                                \
-	do {                                                           \
-                DRM_CAS_RESULT(__ret);                                 \
-		DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret);     \
-                if (__ret) drmGetLock(fd,context,0);                   \
-        } while(0)
-
-				/* This one counts fast locks -- for
-                                   benchmarking only. */
-#define DRM_LIGHT_LOCK_COUNT(fd,lock,context,count)                    \
-	do {                                                           \
-                DRM_CAS_RESULT(__ret);                                 \
-		DRM_CAS(lock,context,DRM_LOCK_HELD|context,__ret);     \
-                if (__ret) drmGetLock(fd,context,0);                   \
-                else       ++count;                                    \
-        } while(0)
-
-#define DRM_LOCK(fd,lock,context,flags)                                \
-	do {                                                           \
-		if (flags) drmGetLock(fd,context,flags);               \
-		else       DRM_LIGHT_LOCK(fd,lock,context);            \
-	} while(0)
-
-#define DRM_UNLOCK(fd,lock,context)                                    \
-	do {                                                           \
-                DRM_CAS_RESULT(__ret);                                 \
-		DRM_CAS(lock,DRM_LOCK_HELD|context,context,__ret);     \
-                if (__ret) drmUnlock(fd,context);                      \
-        } while(0)
-
-				/* Simple spin locks */
-#define DRM_SPINLOCK(spin,val)                                         \
-	do {                                                           \
-            DRM_CAS_RESULT(__ret);                                     \
-	    do {                                                       \
-		DRM_CAS(spin,0,val,__ret);                             \
-		if (__ret) while ((spin)->lock);                       \
-	    } while (__ret);                                           \
-	} while(0)
-
-#define DRM_SPINLOCK_TAKE(spin,val)                                    \
-	do {                                                           \
-            DRM_CAS_RESULT(__ret);                                     \
-            int  cur;                                                  \
-	    do {                                                       \
-                cur = (*spin).lock;                                    \
-		DRM_CAS(spin,cur,val,__ret);                           \
-	    } while (__ret);                                           \
-	} while(0)
-
-#define DRM_SPINLOCK_COUNT(spin,val,count,__ret)                       \
-	do {                                                           \
-            int  __i;                                                  \
-            __ret = 1;                                                 \
-            for (__i = 0; __ret && __i < count; __i++) {               \
-		DRM_CAS(spin,0,val,__ret);                             \
-		if (__ret) for (;__i < count && (spin)->lock; __i++);  \
-	    }                                                          \
-	} while(0)
-
-#define DRM_SPINUNLOCK(spin,val)                                       \
-	do {                                                           \
-            DRM_CAS_RESULT(__ret);                                     \
-            if ((*spin).lock == val) { /* else server stole lock */    \
-	        do {                                                   \
-		    DRM_CAS(spin,val,0,__ret);                         \
-	        } while (__ret);                                       \
-            }                                                          \
-	} while(0)
-
-/* General user-level programmer's API: unprivileged */
-extern int           drmAvailable(void);
-extern int           drmOpen(const char *name, const char *busid);
-extern int           drmClose(int fd);
-extern drmVersionPtr drmGetVersion(int fd);
-extern drmVersionPtr drmGetLibVersion(int fd);
-extern void          drmFreeVersion(drmVersionPtr);
-extern int           drmGetMagic(int fd, drm_magic_t * magic);
-extern char          *drmGetBusid(int fd);
-extern int           drmGetInterruptFromBusID(int fd, int busnum, int devnum,
-					      int funcnum);
-extern int           drmGetMap(int fd, int idx, drm_handle_t *offset,
-			       drmSize *size, drmMapType *type,
-			       drmMapFlags *flags, drm_handle_t *handle,
-			       int *mtrr);
-extern int           drmGetClient(int fd, int idx, int *auth, int *pid,
-				  int *uid, unsigned long *magic,
-				  unsigned long *iocs);
-extern int           drmGetStats(int fd, drmStatsT *stats);
-extern int           drmSetInterfaceVersion(int fd, drmSetVersion *version);
-extern int           drmCommandNone(int fd, unsigned long drmCommandIndex);
-extern int           drmCommandRead(int fd, unsigned long drmCommandIndex,
-                                    void *data, unsigned long size);
-extern int           drmCommandWrite(int fd, unsigned long drmCommandIndex,
-                                     void *data, unsigned long size);
-extern int           drmCommandWriteRead(int fd, unsigned long drmCommandIndex,
-                                         void *data, unsigned long size);
-
-/* General user-level programmer's API: X server (root) only  */
-extern void          drmFreeBusid(const char *busid);
-extern int           drmSetBusid(int fd, const char *busid);
-extern int           drmAuthMagic(int fd, drm_magic_t magic);
-extern int           drmAddMap(int fd,
-			       drm_handle_t offset,
-			       drmSize size,
-			       drmMapType type,
-			       drmMapFlags flags,
-			       drm_handle_t * handle);
-extern int	     drmRmMap(int fd, drm_handle_t handle);
-extern int	     drmAddContextPrivateMapping(int fd, drm_context_t ctx_id,
-						 drm_handle_t handle);
-
-extern int           drmAddBufs(int fd, int count, int size,
-				drmBufDescFlags flags,
-				int agp_offset);
-extern int           drmMarkBufs(int fd, double low, double high);
-extern int           drmCreateContext(int fd, drm_context_t * handle);
-extern int           drmSetContextFlags(int fd, drm_context_t context,
-					drm_context_tFlags flags);
-extern int           drmGetContextFlags(int fd, drm_context_t context,
-					drm_context_tFlagsPtr flags);
-extern int           drmAddContextTag(int fd, drm_context_t context, void *tag);
-extern int           drmDelContextTag(int fd, drm_context_t context);
-extern void          *drmGetContextTag(int fd, drm_context_t context);
-extern drm_context_t * drmGetReservedContextList(int fd, int *count);
-extern void          drmFreeReservedContextList(drm_context_t *);
-extern int           drmSwitchToContext(int fd, drm_context_t context);
-extern int           drmDestroyContext(int fd, drm_context_t handle);
-extern int           drmCreateDrawable(int fd, drm_drawable_t * handle);
-extern int           drmDestroyDrawable(int fd, drm_drawable_t handle);
-extern int           drmUpdateDrawableInfo(int fd, drm_drawable_t handle,
-					   drm_drawable_info_type_t type,
-					   unsigned int num, void *data);
-extern int           drmCtlInstHandler(int fd, int irq);
-extern int           drmCtlUninstHandler(int fd);
-extern int           drmInstallSIGIOHandler(int fd,
-					    void (*f)(int fd,
-						      void *oldctx,
-						      void *newctx));
-extern int           drmRemoveSIGIOHandler(int fd);
-
-/* General user-level programmer's API: authenticated client and/or X */
-extern int           drmMap(int fd,
-			    drm_handle_t handle,
-			    drmSize size,
-			    drmAddressPtr address);
-extern int           drmUnmap(drmAddress address, drmSize size);
-extern drmBufInfoPtr drmGetBufInfo(int fd);
-extern drmBufMapPtr  drmMapBufs(int fd);
-extern int           drmUnmapBufs(drmBufMapPtr bufs);
-extern int           drmDMA(int fd, drmDMAReqPtr request);
-extern int           drmFreeBufs(int fd, int count, int *list);
-extern int           drmGetLock(int fd,
-			        drm_context_t context,
-			        drmLockFlags flags);
-extern int           drmUnlock(int fd, drm_context_t context);
-extern int           drmFinish(int fd, int context, drmLockFlags flags);
-extern int	     drmGetContextPrivateMapping(int fd, drm_context_t ctx_id, 
-						 drm_handle_t * handle);
-
-/* AGP/GART support: X server (root) only */
-extern int           drmAgpAcquire(int fd);
-extern int           drmAgpRelease(int fd);
-extern int           drmAgpEnable(int fd, unsigned long mode);
-extern int           drmAgpAlloc(int fd, unsigned long size,
-				 unsigned long type, unsigned long *address,
-				 drm_handle_t *handle);
-extern int           drmAgpFree(int fd, drm_handle_t handle);
-extern int 	     drmAgpBind(int fd, drm_handle_t handle,
-				unsigned long offset);
-extern int           drmAgpUnbind(int fd, drm_handle_t handle);
-
-/* AGP/GART info: authenticated client and/or X */
-extern int           drmAgpVersionMajor(int fd);
-extern int           drmAgpVersionMinor(int fd);
-extern unsigned long drmAgpGetMode(int fd);
-extern unsigned long drmAgpBase(int fd); /* Physical location */
-extern unsigned long drmAgpSize(int fd); /* Bytes */
-extern unsigned long drmAgpMemoryUsed(int fd);
-extern unsigned long drmAgpMemoryAvail(int fd);
-extern unsigned int  drmAgpVendorId(int fd);
-extern unsigned int  drmAgpDeviceId(int fd);
-
-/* PCI scatter/gather support: X server (root) only */
-extern int           drmScatterGatherAlloc(int fd, unsigned long size,
-					   drm_handle_t *handle);
-extern int           drmScatterGatherFree(int fd, drm_handle_t handle);
-
-extern int           drmWaitVBlank(int fd, drmVBlankPtr vbl);
-
-/* Support routines */
-extern int           drmError(int err, const char *label);
-extern void          *drmMalloc(int size);
-extern void          drmFree(void *pt);
-
-/* Hash table routines */
-extern void *drmHashCreate(void);
-extern int  drmHashDestroy(void *t);
-extern int  drmHashLookup(void *t, unsigned long key, void **value);
-extern int  drmHashInsert(void *t, unsigned long key, void *value);
-extern int  drmHashDelete(void *t, unsigned long key);
-extern int  drmHashFirst(void *t, unsigned long *key, void **value);
-extern int  drmHashNext(void *t, unsigned long *key, void **value);
-
-/* PRNG routines */
-extern void          *drmRandomCreate(unsigned long seed);
-extern int           drmRandomDestroy(void *state);
-extern unsigned long drmRandom(void *state);
-extern double        drmRandomDouble(void *state);
-
-/* Skip list routines */
-
-extern void *drmSLCreate(void);
-extern int  drmSLDestroy(void *l);
-extern int  drmSLLookup(void *l, unsigned long key, void **value);
-extern int  drmSLInsert(void *l, unsigned long key, void *value);
-extern int  drmSLDelete(void *l, unsigned long key);
-extern int  drmSLNext(void *l, unsigned long *key, void **value);
-extern int  drmSLFirst(void *l, unsigned long *key, void **value);
-extern void drmSLDump(void *l);
-extern int  drmSLLookupNeighbors(void *l, unsigned long key,
-				 unsigned long *prev_key, void **prev_value,
-				 unsigned long *next_key, void **next_value);
-
-#endif
diff-tree 0409e1627a167db2efc1355f292d3c02a6989ffc (from 7e0aeebb8f8a5dff3cb4d88756e535dd70edeec4)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Wed Nov 8 16:17:20 2006 -0500

    'make dist' fixes.

diff --git a/GL/glx/Makefile.am b/GL/glx/Makefile.am
index 44d9cf9..8184f60 100644
--- a/GL/glx/Makefile.am
+++ b/GL/glx/Makefile.am
@@ -28,7 +28,11 @@ INCLUDES = \
 	-I$(top_srcdir)/mi
 
 
-nodist_libglx_la_SOURCES = indirect_size.h
+nodist_libglx_la_SOURCES = indirect_size.h \
+			   glapi.c \
+			   glcontextmodes.c \
+			   glcontextmode.h \
+			   glthread.c
 
 libglxdri_la_SOURCES = \
         glxdri.c \
@@ -37,10 +41,6 @@ libglxdri_la_SOURCES = \
 
 libglx_la_SOURCES = \
         g_disptab.h \
-        glapi.c \
-        glcontextmodes.c \
-        glcontextmodes.h \
-        glthread.c \
         glxcmds.c \
         glxcmdsswap.c \
         glxcontext.h \
diff --git a/hw/xfree86/doc/Makefile.am b/hw/xfree86/doc/Makefile.am
index 55e69b0..6d8f4d2 100644
--- a/hw/xfree86/doc/Makefile.am
+++ b/hw/xfree86/doc/Makefile.am
@@ -5,9 +5,6 @@ SUBDIRS = man
 endif
 
 EXTRA_DIST = \
-	changelogs/CHANGELOG \
-	changelogs/CHANGELOG.ND \
-	changelogs/CHANGELOG.R5 \
 	README.DRI \
 	README.fonts \
 	README.rapidaccess
diff-tree 7e0aeebb8f8a5dff3cb4d88756e535dd70edeec4 (from b5d09d4adb8088719ff494a4281a793717046576)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Wed Nov 8 12:03:37 2006 -0500

    Bug #6786: Use separate defines for server's Fixes support level.

diff --git a/xfixes/xfixes.c b/xfixes/xfixes.c
index a0e656d..cee9e09 100755
--- a/xfixes/xfixes.c
+++ b/xfixes/xfixes.c
@@ -48,6 +48,13 @@
 
 #include "xfixesint.h"
 
+/*
+ * Must use these instead of the constants from xfixeswire.h.  They advertise
+ * what we implement, not what the protocol headers define.
+ */
+#define SERVER_XFIXES_MAJOR 4
+#define SERVER_XFIXES_MINOR 0
+
 unsigned char	XFixesReqCode;
 int		XFixesEventBase;
 int		XFixesErrorBase;
@@ -65,16 +72,16 @@ ProcXFixesQueryVersion(ClientPtr client)
     rep.type = X_Reply;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
-    if (stuff->majorVersion < XFIXES_MAJOR) {
+    if (stuff->majorVersion < SERVER_XFIXES_MAJOR) {
 	rep.majorVersion = stuff->majorVersion;
 	rep.minorVersion = stuff->minorVersion;
     } else {
-	rep.majorVersion = XFIXES_MAJOR;
-	if (stuff->majorVersion == XFIXES_MAJOR && 
-	    stuff->minorVersion < XFIXES_MINOR)
+	rep.majorVersion = SERVER_XFIXES_MAJOR;
+	if (stuff->majorVersion == SERVER_XFIXES_MAJOR && 
+	    stuff->minorVersion < SERVER_XFIXES_MINOR)
 	    rep.minorVersion = stuff->minorVersion;
 	else
-	    rep.minorVersion = XFIXES_MINOR;
+	    rep.minorVersion = SERVER_XFIXES_MINOR;
     }
     pXFixesClient->major_version = rep.majorVersion;
     pXFixesClient->minor_version = rep.minorVersion;
diff-tree b5d09d4adb8088719ff494a4281a793717046576 (from 0567a6337b84fa045b5732e98203f488274aa2a2)
Author: Rich Coe <Richard.Coe at med.ge.com>
Date:   Wed Nov 8 18:10:14 2006 +0200

    CheckConnections: don't close down the server client (bug #7876)
    When an appgroup is shutting down, the list of clients can change, so make
    sure we're not trying to shut the server down.

diff --git a/os/connection.c b/os/connection.c
index 95c5500..100f1e5 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -1045,7 +1045,7 @@ CheckConnections(void)
 	FD_ZERO(&tmask);
 	FD_SET(curclient, &tmask);
 	r = Select (curclient + 1, &tmask, NULL, NULL, &notime);
-	if (r < 0)
+	if (r < 0 && GetConnectionTranslation(curclient) > 0)
 	    CloseDownClient(clients[GetConnectionTranslation(curclient)]);
     }	
 #endif
diff-tree 0567a6337b84fa045b5732e98203f488274aa2a2 (from e7900d68c3ee657158813f0650886d680c0a9a3c)
Author: Bram Verweij <amverweij at gmail.com>
Date:   Wed Nov 8 18:00:52 2006 +0200

    xfree86/linux acpi: fix tokenising
    Split on a space, rather on the 'video' string, as strtok takes a char,
    not a string.

diff --git a/hw/xfree86/os-support/linux/lnx_acpi.c b/hw/xfree86/os-support/linux/lnx_acpi.c
index aa30e72..024e6ef 100644
--- a/hw/xfree86/os-support/linux/lnx_acpi.c
+++ b/hw/xfree86/os-support/linux/lnx_acpi.c
@@ -78,7 +78,7 @@ lnxACPIGetEventFromOs(int fd, pmEvent *e
 	char *data = NULL; /* doesn't appear to be used in the kernel */
 	unsigned long int notify_l, data_l;
 
-	video = strtok(ev, "video");
+	video = strtok(ev, " ");
 
 	GFX = strtok(NULL, " ");
 #if 0
diff-tree e7900d68c3ee657158813f0650886d680c0a9a3c (from 2035f115b7db3c4b7deabeab0d814b3107d6ef30)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 8 15:36:47 2006 +0200

    remove trailing whitespace
    Whitespace police in full effect.

diff --git a/dix/getevents.c b/dix/getevents.c
index 4a3ee8e..c1b8840 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -168,7 +168,7 @@ updateMotionHistory(DeviceIntPtr pDev, C
 
     pDev->valuator->last_motion = (pDev->valuator->last_motion + 1) %
                                   pDev->valuator->numMotionEvents;
-    
+
     /* If we're wrapping around, just keep the circular buffer going. */
     if (pDev->valuator->first_motion == pDev->valuator->last_motion)
         pDev->valuator->first_motion = (pDev->valuator->first_motion + 1) %
@@ -745,7 +745,7 @@ SwitchCoreKeyboard(DeviceIntPtr pDev)
  * Currently a no-op.
  *
  * Call this just before processInputProc.
- */ 
+ */
 _X_EXPORT void
 SwitchCorePointer(DeviceIntPtr pDev)
 {
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 905c56a..5469426 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -372,7 +372,7 @@ xf86ProcessActionEvent(ActionEvent actio
 #endif
 	    /* Okay the message made it to the ddx.  The common layer */
 	    /* can check for relevant messages here and react to any  */
-	    /* that have a global effect.  For example:               */ 
+	    /* that have a global effect.  For example:               */
 	    /*                                                        */
 	    /* if (!strcmp(message, "foo") {                          */
 	    /*      do_foo(); break                                   */
@@ -457,9 +457,9 @@ xf86Wakeup(pointer blockData, int err, p
 		if (pInfo->read_input && pInfo->fd >= 0 &&
 		    (FD_ISSET(pInfo->fd, &devicesWithInput) != 0)) {
 		    int sigstate = xf86BlockSIGIO();
-		    
+
 		    pInfo->read_input(pInfo);
-		    xf86UnblockSIGIO(sigstate);		    
+		    xf86UnblockSIGIO(sigstate);
 		    /*
 		     * Remove the descriptior from the set because more than one
 		     * device may share the same file descriptor.
@@ -478,9 +478,9 @@ xf86Wakeup(pointer blockData, int err, p
     while (pInfo) {
 		if (pInfo->read_input && pInfo->fd >= 0) {
 		    int sigstate = xf86BlockSIGIO();
-		    
+
 		    pInfo->read_input(pInfo);
-		    xf86UnblockSIGIO(sigstate);		    
+		    xf86UnblockSIGIO(sigstate);
 		    /*
 		     * Must break here because more than one device may share
 		     * the same file descriptor.
@@ -502,7 +502,7 @@ xf86Wakeup(pointer blockData, int err, p
 	    }
 	}
     }
-    
+
     if (xf86VTSwitchPending()) xf86VTSwitch();
 
     if (xf86Info.inputPending) ProcessInputEvents();
@@ -527,7 +527,7 @@ xf86SigioReadInput(int fd,
 
 /*
  * xf86AddEnabledDevice --
- *    
+ *
  */
 _X_EXPORT void
 xf86AddEnabledDevice(InputInfoPtr pInfo)
@@ -539,7 +539,7 @@ xf86AddEnabledDevice(InputInfoPtr pInfo)
 
 /*
  * xf86RemoveEnabledDevice --
- *    
+ *
  */
 _X_EXPORT void
 xf86RemoveEnabledDevice(InputInfoPtr pInfo)
@@ -560,7 +560,7 @@ xf86InterceptSignals(int *signo)
 
 static void (*xf86SigIllHandler)(void) = NULL;
 
-_X_EXPORT void 
+_X_EXPORT void
 xf86InterceptSigIll(void (*sigillhandler)(void))
 {
     xf86SigIllHandler = sigillhandler;
@@ -608,7 +608,7 @@ static int xorg_backtrace_frame(uintptr_
     ElfSym *dlsym;
     char header[32];
     int depth = *((int *) arg);
-    
+
     if (signo) {
 	char signame[SIG2STR_MAX];
 
@@ -621,7 +621,7 @@ static int xorg_backtrace_frame(uintptr_
 
     snprintf(header, sizeof(header), "%d: 0x%lx", depth, pc);
     *((int *) arg) = depth + 1;
-    
+
     /* Ask system dynamic loader for info on the address */
     if (dladdr1((void *) pc, &dlinfo, (void **) &dlsym, RTLD_DL_SYMENT)) {
 	unsigned long offset = pc - (uintptr_t) dlinfo.dli_saddr;
@@ -643,7 +643,7 @@ static int xorg_backtrace_frame(uintptr_
 	 */
 	ErrorF("%s\n", header);
     }
-    
+
     return 0;
 }
 # endif /* HAVE_WALKCONTEXT */
@@ -686,7 +686,7 @@ static int xorg_backtrace_pstack(void) {
 
 	while (!done) {
 	    bytesread = read(pipefd[0], btline, sizeof(btline) - 1);
-	    
+
 	    if (bytesread > 0) {
 		btline[bytesread] = 0;
 		ErrorF("%s", btline);
@@ -710,11 +710,11 @@ static int xorg_backtrace_pstack(void) {
 static __inline__ void xorg_backtrace(void) {
 
     ErrorF("\nBacktrace:\n");
-    
-#  ifdef HAVE_PSTACK    
+
+#  ifdef HAVE_PSTACK
 /* First try fork/exec of pstack - otherwise fall back to walkcontext
    pstack is preferred since it can print names of non-exported functions */
-    
+
     if (xorg_backtrace_pstack() < 0)
 #  endif	
     {
@@ -752,7 +752,7 @@ xf86SigHandler(int signo)
     (void) signal(signo, xf86SigHandler);
     return;
   }
-  
+
   if (xf86SignalIntercept && (*xf86SignalIntercept < 0)) {
     *xf86SignalIntercept = signo;
     /* Re-arm handler just in case */
@@ -767,7 +767,7 @@ xf86SigHandler(int signo)
 #endif
 
   xorg_backtrace();
-    
+
   FatalError("Caught signal %d.  Server aborting\n", signo);
 }
 
@@ -854,7 +854,7 @@ xf86VTSwitch()
 #ifdef DEBUG
   ErrorF("xf86VTSwitch()\n");
 #endif
-  
+
 #ifdef XFreeXDGA
   if(!DGAVTSwitch())
 	return;
@@ -881,9 +881,9 @@ xf86VTSwitch()
     }
 #if !defined(__UNIXOS2__)
 
-    /* 
+    /*
      * Keep the order: Disable Device > LeaveVT
-     *                        EnterVT > EnableDevice 
+     *                        EnterVT > EnableDevice
      */
     pInfo = xf86InputDevs;
     while (pInfo) {
@@ -903,7 +903,7 @@ xf86VTSwitch()
 
     if (!xf86VTSwitchAway()) {
       /*
-       * switch failed 
+       * switch failed
        */
 
 #ifdef DEBUG
@@ -1003,7 +1003,7 @@ xf86VTSwitch()
     /* XXX HACK */
     xf86ReleaseKeys(inputInfo.keyboard);
 #endif /* !__UNIXOS2__ */
-    
+
     for (ih = InputHandlers; ih; ih = ih->next)
       xf86EnableInputHandler(ih);
 
@@ -1039,7 +1039,7 @@ addInputHandler(int fd, InputHandlerProc
 
 _X_EXPORT pointer
 xf86AddInputHandler(int fd, InputHandlerProc proc, pointer data)
-{   
+{
     IHPtr ih = addInputHandler(fd, proc, data);
 
     if (ih)
@@ -1049,7 +1049,7 @@ xf86AddInputHandler(int fd, InputHandler
 
 _X_EXPORT pointer
 xf86AddGeneralHandler(int fd, InputHandlerProc proc, pointer data)
-{   
+{
     IHPtr ih = addInputHandler(fd, proc, data);
 
     if (ih)
@@ -1079,13 +1079,13 @@ xf86RemoveInputHandler(pointer handler)
 {
     IHPtr ih;
     int fd;
-    
+
     if (!handler)
 	return -1;
 
     ih = handler;
     fd = ih->fd;
-    
+
     if (ih->fd >= 0)
 	RemoveEnabledDevice(ih->fd);
     removeInputHandler(ih);
@@ -1098,13 +1098,13 @@ xf86RemoveGeneralHandler(pointer handler
 {
     IHPtr ih;
     int fd;
-    
+
     if (!handler)
 	return -1;
 
     ih = handler;
     fd = ih->fd;
-    
+
     if (ih->fd >= 0)
 	RemoveGeneralSocket(ih->fd);
     removeInputHandler(ih);
@@ -1193,7 +1193,7 @@ void
 xf86ReloadInputDevs(int sig)
 {
   InputInfoPtr pInfo;
-  
+
   signal(sig, (void(*)(int))xf86ReloadInputDevs);
 
   pInfo = xf86InputDevs;
@@ -1202,7 +1202,7 @@ xf86ReloadInputDevs(int sig)
     EnableDevice(pInfo->dev);
     pInfo = pInfo->next;
   }
-  
+
   return;
 }
 
@@ -1224,7 +1224,7 @@ xf86PostWSKbdEvent(struct wscons_event *
   int value = event->value;
   unsigned int keycode;
   int blocked;
-  
+
   if (type == WSCONS_EVENT_KEY_UP || type == WSCONS_EVENT_KEY_DOWN) {
     Bool down = (type == WSCONS_EVENT_KEY_DOWN ? TRUE : FALSE);
 
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 09c08d2..93c89fd 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -90,7 +90,7 @@ xf86AddDriver(DriverPtr driver, pointer 
     else {
 	(void) memset( xf86DriverList[xf86NumDrivers - 1], 0,
 		       sizeof( DriverRec ) );
-	(void) memcpy( xf86DriverList[xf86NumDrivers - 1], driver, 
+	(void) memcpy( xf86DriverList[xf86NumDrivers - 1], driver,
 		       sizeof(DriverRec1));
 
     }
@@ -241,7 +241,7 @@ xf86AllocateScreen(DriverPtr drv, int fl
 #endif
 
     xf86Screens[i]->DriverFunc = drv->driverFunc;
-    
+
     return xf86Screens[i];
 }
 
@@ -293,7 +293,7 @@ xf86DeleteScreen(int scrnIndex, int flag
     xfree(pScrn);
 
     /* Move the other entries down, updating their scrnIndex fields */
-    
+
     xf86NumScreens--;
 
     for (i = scrnIndex; i < xf86NumScreens; i++) {
@@ -487,7 +487,7 @@ xf86SetDepthBpp(ScrnInfoPtr scrp, int de
     depth24flags &= ~(SupportConvert32to24 | SupportConvert32to24 |
 		      PreferConvert24to32 | PreferConvert32to24);
 #endif
-     
+
     if (xf86FbBpp > 0) {
 	scrp->bitsPerPixel = xf86FbBpp;
 	scrp->bitsPerPixelFrom = X_CMDLINE;
@@ -946,7 +946,7 @@ xf86SetGamma(ScrnInfoPtr scrp, Gamma gam
 {
     MessageType from = X_DEFAULT;
 #if 0
-    xf86MonPtr DDC = (xf86MonPtr)(scrp->monitor->DDC); 
+    xf86MonPtr DDC = (xf86MonPtr)(scrp->monitor->DDC);
 #endif
     if (TEST_GAMMA(xf86Gamma)) {
 	from = X_CMDLINE;
@@ -999,7 +999,7 @@ _X_EXPORT void
 xf86SetDpi(ScrnInfoPtr pScrn, int x, int y)
 {
     MessageType from = X_DEFAULT;
-    xf86MonPtr DDC = (xf86MonPtr)(pScrn->monitor->DDC); 
+    xf86MonPtr DDC = (xf86MonPtr)(pScrn->monitor->DDC);
     int ddcWidthmm, ddcHeightmm;
     int widthErr, heightErr;
 
@@ -1009,7 +1009,7 @@ xf86SetDpi(ScrnInfoPtr pScrn, int x, int
 
     if (DDC && (DDC->features.hsize > 0 && DDC->features.vsize > 0) ) {
       /* DDC gives display size in mm for individual modes,
-       * but cm for monitor 
+       * but cm for monitor
        */
       ddcWidthmm = DDC->features.hsize * 10; /* 10mm in 1cm */
       ddcHeightmm = DDC->features.vsize * 10; /* 10mm in 1cm */
@@ -1053,7 +1053,7 @@ xf86SetDpi(ScrnInfoPtr pScrn, int x, int
 	  if (widthErr>10 || heightErr>10) {
 	    /* Should include config file name for monitor here */
 	    xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
-		       "Probed monitor is %dx%d mm, using Displaysize %dx%d mm\n", 
+		       "Probed monitor is %dx%d mm, using Displaysize %dx%d mm\n",
 		       ddcWidthmm,ddcHeightmm, pScrn->widthmm,pScrn->heightmm);
 	  }
 	}
@@ -1149,7 +1149,7 @@ xf86SetRootClip (ScreenPtr pScreen, Bool
 	    pWin->valdata->before.resized = TRUE;
 	}
     }
-    
+
     /*
      * Use REGION_BREAK to avoid optimizations in ValidateTree
      * that assume the root borderClip can't change well, normally
@@ -1174,9 +1174,9 @@ xf86SetRootClip (ScreenPtr pScreen, Bool
 	REGION_EMPTY(pScreen, &pWin->borderClip);
 	REGION_BREAK (pWin->drawable.pScreen, &pWin->clipList);
     }
-    
+
     ResizeChildrenWinSize (pWin, 0, 0, 0, 0);
-    
+
     if (WasViewable)
     {
 	if (pWin->backStorage)
@@ -1221,7 +1221,7 @@ xf86SetRootClip (ScreenPtr pScreen, Bool
 	if (bsExposed)
 	{
 	    RegionPtr	valExposed = NullRegion;
-    
+
 	    if (pWin->valdata)
 		valExposed = &pWin->valdata->after.exposed;
 	    (*pScreen->WindowExposures) (pWin, valExposed, bsExposed);
@@ -1280,7 +1280,7 @@ xf86EnableDisableFBAccess(int scrnIndex,
 	 */
 	pspix->devPrivate = pScrnInfo->pixmapPrivate;
 	/*
-	 * Restore all of the clip lists on the screen 
+	 * Restore all of the clip lists on the screen
 	 */
 	if (!xf86Resetting)
 	    xf86SetRootClip (pScreen, TRUE);
@@ -1289,7 +1289,7 @@ xf86EnableDisableFBAccess(int scrnIndex,
     else
     {
 	/*
-	 * Empty all of the clip lists on the screen 
+	 * Empty all of the clip lists on the screen
 	 */
 	xf86SetRootClip (pScreen, FALSE);
 	/*
@@ -1410,7 +1410,7 @@ xf86LogInit()
 
 #define LOGSUFFIX ".log"
 #define LOGOLDSUFFIX ".old"
-    
+
     /* Get the log file name */
     if (xf86LogFileFrom == X_DEFAULT) {
 	/* Append the display number and ".log" */
@@ -1538,7 +1538,7 @@ xf86MatchDevice(const char *drivername, 
 	*sectlist = NULL;
 
     if (xf86DoProbe) return 1;
-  
+
     if (xf86DoConfigure && xf86DoConfigurePass1) return 1;
 
     /*
@@ -1546,18 +1546,18 @@ xf86MatchDevice(const char *drivername, 
      * as they show up in the config file with the drivers that the server
      * loads at run time.
      *
-     * ChipProbe can call 
-     * int xf86MatchDevice(char * drivername, GDevPtr ** sectlist) 
+     * ChipProbe can call
+     * int xf86MatchDevice(char * drivername, GDevPtr ** sectlist)
      * with its driver name. The function allocates an array of GDevPtr and
      * returns this via sectlist and returns the number of elements in
      * this list as return value. 0 means none found, -1 means fatal error.
-     * 
+     *
      * It can figure out which of the Device sections to use for which card
      * (using things like the Card statement, etc). For single headed servers
      * there will of course be just one such Device section.
      */
     i = 0;
-    
+
     /*
      * first we need to loop over all the Screens sections to get to all
      * 'active' device sections
@@ -1587,7 +1587,7 @@ xf86MatchDevice(const char *drivername, 
 	}
 	j++;
     }
-    
+
     /*
      * make the array NULL terminated and return its address
      */
@@ -1613,7 +1613,7 @@ struct Inst {
 
 /**
  * Find set of unclaimed devices matching a given vendor ID.
- * 
+ *
  * Used by drivers to find as yet unclaimed devices matching the specified
  * vendor ID.
  *
@@ -1629,7 +1629,7 @@ struct Inst {
  * \param drvp           Pointer the driver's control structure.
  * \param foundEntities  Returned list of entity indicies associated with the
  *                       driver.
- * 
+ *
  * \returns
  * The number of elements in returned in \c foundEntities on success or zero
  * on failure.
@@ -1644,7 +1644,7 @@ struct Inst {
  * that parameter.
  */
 _X_EXPORT int
-xf86MatchPciInstances(const char *driverName, int vendorID, 
+xf86MatchPciInstances(const char *driverName, int vendorID,
 		      SymTabPtr chipsets, PciChipsets *PCIchipsets,
 		      GDevPtr *devList, int numDevs, DriverPtr drvp,
 		      int **foundEntities)
@@ -1723,7 +1723,7 @@ xf86MatchPciInstances(const char *driver
 		    foundVendor = TRUE;
 		}
 		if ( (device_id == pPci->chipType)
-		     || ((vendorID == PCI_VENDOR_GENERIC) 
+		     || ((vendorID == PCI_VENDOR_GENERIC)
 			 && (match_class == device_class)) ) {
 		    if ( instances != NULL ) {
 			instances[allocatedInstances - 1].foundHW = TRUE;
@@ -1734,7 +1734,7 @@ xf86MatchPciInstances(const char *driver
 		    if ( xf86DoConfigure && xf86DoConfigurePass1 ) {
 			if ( xf86CheckPciSlot(pPci->bus, pPci->device,
 					      pPci->func) ) {
-			    GDevPtr pGDev = 
+			    GDevPtr pGDev =
 			      xf86AddDeviceToConfigure( drvp->driverName,
 							pPci, -1 );
 			    if (pGDev) {
@@ -1792,7 +1792,7 @@ xf86MatchPciInstances(const char *driver
     */
 
     for (j = 0; j < numDevs; j++) {
-        if (devList[j]->screen > 0 && devList[j]->busID 
+        if (devList[j]->screen > 0 && devList[j]->busID
 	    && *devList[j]->busID) {
 	    for (i = 0; i < allocatedInstances; i++) {
 	        pPci = instances[i].pci;
@@ -1821,7 +1821,7 @@ xf86MatchPciInstances(const char *driver
 					   pPci->device,
 					   pPci->func) &&
 		    devList[j]->screen == instances[i].screen) {
-		   
+
 		    if (devBus)
                         xf86MsgVerb(X_WARNING,0,
 			    "%s: More than one matching Device section for "
@@ -1830,10 +1830,10 @@ xf86MatchPciInstances(const char *driver
 			    devList[j]->identifier);
 		    else
 			devBus = devList[j];
-		} 
+		}
 	    } else {
-		/* 
-		 * if device section without BusID is found 
+		/*
+		 * if device section without BusID is found
 		 * only assign to it to the primary device.
 		 */
 		if (xf86IsPrimaryPci(pPci)) {
@@ -1848,7 +1848,7 @@ xf86MatchPciInstances(const char *driver
 		}
 	    }
 	}
-	if (devBus) dev = devBus;  /* busID preferred */ 
+	if (devBus) dev = devBus;  /* busID preferred */
 	if (!dev) {
 	    if (xf86CheckPciSlot(pPci->bus, pPci->device, pPci->func)) {
 		xf86MsgVerb(X_WARNING, 0, "%s: No matching Device section "
@@ -2068,7 +2068,7 @@ xf86MatchIsaInstances(const char *driver
 				dev->identifier);
 		} else
 		    foundChip = c->token;
-	    } else { 
+	    } else {
 		if (FindIsaDevice) foundChip = (*FindIsaDevice)(dev);
                                                         /* Probe it */
 		from = X_PROBED;
@@ -2079,7 +2079,7 @@ xf86MatchIsaInstances(const char *driver
 
 	if (foundChip >= 0){
 	    for (Chips = ISAchipsets; Chips->numChipset >= 0; Chips++) {
-		if (Chips->numChipset == foundChip) 
+		if (Chips->numChipset == foundChip)
 		    break;
 	    }
 	    if (Chips->numChipset == -1){
@@ -2102,7 +2102,7 @@ xf86MatchIsaInstances(const char *driver
 	}
     }
     *foundEntities = retEntities;
-    
+
     return numFound;
 }
 
@@ -2126,7 +2126,7 @@ xf86GetClocks(ScrnInfoPtr pScrn, int num
     if (num > MAXCLOCKS)
 	num = MAXCLOCKS;
 
-    for (i = 0; i < num; i++) 
+    for (i = 0; i < num; i++)
     {
 	if (ProtectRegs)
 	    (*ProtectRegs)(pScrn, TRUE);
@@ -2139,7 +2139,7 @@ xf86GetClocks(ScrnInfoPtr pScrn, int num
 	    (*ProtectRegs)(pScrn, FALSE);
 	if (BlankScreen)
 	    (*BlankScreen)(pScrn, FALSE);
-	    
+
     	usleep(50000);     /* let VCO stabilise */
 
     	cnt  = 0;
@@ -2153,25 +2153,25 @@ xf86GetClocks(ScrnInfoPtr pScrn, int num
 	    ErrorF("your OS does not support disabling interrupts, then you\n");
 	    FatalError("must specify a Clocks line in the XF86Config file.\n");
 	}
-	while ((inb(status) & maskval) == 0x00) 
+	while ((inb(status) & maskval) == 0x00)
 	    if (sync-- == 0) goto finish;
 	/* Something appears to be happening, so reset sync count */
 	sync = 200000;
-	while ((inb(status) & maskval) == maskval) 
+	while ((inb(status) & maskval) == maskval)
 	    if (sync-- == 0) goto finish;
 	/* Something appears to be happening, so reset sync count */
 	sync = 200000;
-	while ((inb(status) & maskval) == 0x00) 
+	while ((inb(status) & maskval) == 0x00)
 	    if (sync-- == 0) goto finish;
-    
-	for (rcnt = 0; rcnt < 5; rcnt++) 
+
+	for (rcnt = 0; rcnt < 5; rcnt++)
 	{
-	    while (!(inb(status) & maskval)) 
+	    while (!(inb(status) & maskval))
 		cnt++;
-	    while ((inb(status) & maskval)) 
+	    while ((inb(status) & maskval))
 		cnt++;
 	}
-    
+
 finish:
 	xf86EnableInterrupts();
 
@@ -2182,7 +2182,7 @@ finish:
 
     xf86SetPriority(FALSE);
 
-    for (i = 0; i < num; i++) 
+    for (i = 0; i < num; i++)
     {
 	if (i != knownclkindex)
 	{
@@ -2190,10 +2190,10 @@ finish:
 	    {
 		pScrn->clock[i] = 0;
 	    }
-	    else 
+	    else
 	    {
 		pScrn->clock[i] = (int)(0.5 +
-                    (((float)knownclkvalue) * pScrn->clock[knownclkindex]) / 
+                    (((float)knownclkvalue) * pScrn->clock[knownclkindex]) /
 	            (pScrn->clock[i]));
 		/* Round to nearest 10KHz */
 		pScrn->clock[i] += 5;
@@ -2204,7 +2204,7 @@ finish:
     }
 
     pScrn->clock[knownclkindex] = knownclkvalue;
-    pScrn->numClocks = num; 
+    pScrn->numClocks = num;
 
     /* Restore registers that were written on */
     (*ClockFunc)(pScrn, CLK_REG_RESTORE);
@@ -2425,17 +2425,17 @@ xf86LoadSubModule(ScrnInfoPtr pScrn, con
 
 /*
  * xf86LoadOneModule loads a single module.
- */             
+ */
 _X_EXPORT pointer
 xf86LoadOneModule(char *name, pointer opt)
 {
     int errmaj, errmin;
     char *Name;
     pointer mod;
-    
+
     if (!name)
 	return NULL;
-    
+
 #ifndef NORMALISE_MODULE_NAME
     Name = xstrdup(name);
 #else
@@ -2507,7 +2507,7 @@ static const OptionInfoRec BSOptions[] =
    { -1,                   NULL,           OPTV_NONE,    {0}, FALSE }
 };
 
-_X_EXPORT void 
+_X_EXPORT void
 xf86SetBackingStore(ScreenPtr pScreen)
 {
     Bool useBS = FALSE;
@@ -2547,7 +2547,7 @@ static const OptionInfoRec SMOptions[] =
    { -1,                   NULL,           OPTV_NONE,    {0}, FALSE }
 };
 
-_X_EXPORT void 
+_X_EXPORT void
 xf86SetSilkenMouse (ScreenPtr pScreen)
 {
     Bool useSM = TRUE;
@@ -2558,12 +2558,12 @@ xf86SetSilkenMouse (ScreenPtr pScreen)
     options = xnfalloc(sizeof(SMOptions));
     (void)memcpy(options, SMOptions, sizeof(SMOptions));
     xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, options);
-    
+
     /* check for commandline option here */
     /* disable if screen shares resources */
-    if (((pScrn->racMemFlags & RAC_CURSOR) && 
+    if (((pScrn->racMemFlags & RAC_CURSOR) &&
 	 !xf86NoSharedResources(pScrn->scrnIndex,MEM)) ||
-	((pScrn->racIoFlags & RAC_CURSOR) && 
+	((pScrn->racIoFlags & RAC_CURSOR) &&
 	 !xf86NoSharedResources(pScrn->scrnIndex,IO))) {
 	useSM = FALSE;
 	from = X_PROBED;
@@ -2632,7 +2632,7 @@ xf86ConfigIsaEntity(ScrnInfoPtr pScrn, i
     IsaChipsets *i_id;
     EntityInfoPtr pEnt = xf86GetEntityInfo(entityIndex);
     if (!pEnt) return pScrn;
-    
+
     if (!(pEnt->location.type == BUS_ISA)) {
 	xfree(pEnt);
 	return pScrn;
@@ -2646,7 +2646,7 @@ xf86ConfigIsaEntity(ScrnInfoPtr pScrn, i
     }
 
     if (!pScrn)
-	pScrn = xf86AllocateScreen(pEnt->driver,scrnFlag); 
+	pScrn = xf86AllocateScreen(pEnt->driver,scrnFlag);
     xf86AddEntityToScreen(pScrn,entityIndex);
 
     if (i_chip) {
@@ -2671,7 +2671,7 @@ xf86ConfigPciEntity(ScrnInfoPtr pScrn, i
     EntityInfoPtr pEnt = xf86GetEntityInfo(entityIndex);
     if (!pEnt) return pScrn;
 
-    if (!(pEnt->location.type == BUS_PCI) 
+    if (!(pEnt->location.type == BUS_PCI)
 	|| !xf86GetPciInfoForEntity(entityIndex)) {
 	xfree(pEnt);
 	return pScrn;
@@ -2708,12 +2708,12 @@ xf86ConfigPciEntity(ScrnInfoPtr pScrn, i
 
 _X_EXPORT ScrnInfoPtr
 xf86ConfigFbEntity(ScrnInfoPtr pScrn, int scrnFlag, int entityIndex,
-		   EntityProc init, EntityProc enter, EntityProc leave, 
+		   EntityProc init, EntityProc enter, EntityProc leave,
 		   pointer private)
 {
     EntityInfoPtr pEnt = xf86GetEntityInfo(entityIndex);
     if (!pEnt) return pScrn;
-    
+
     if (!(pEnt->location.type == BUS_NONE)) {
 	xfree(pEnt);
 	return pScrn;
@@ -2726,7 +2726,7 @@ xf86ConfigFbEntity(ScrnInfoPtr pScrn, in
     }
 
     if (!pScrn)
-	pScrn = xf86AllocateScreen(pEnt->driver,scrnFlag); 
+	pScrn = xf86AllocateScreen(pEnt->driver,scrnFlag);
     xf86AddEntityToScreen(pScrn,entityIndex);
 
     xf86SetEntityFuncs(entityIndex,init,enter,leave,private);
@@ -2748,14 +2748,14 @@ xf86ConfigActiveIsaEntity(ScrnInfoPtr pS
     IsaChipsets *i_id;
     EntityInfoPtr pEnt = xf86GetEntityInfo(entityIndex);
     if (!pEnt) return FALSE;
- 
+
     if (!pEnt->active || !(pEnt->location.type == BUS_ISA)) {
         xfree(pEnt);
         return FALSE;
     }
- 
+
     xf86AddEntityToScreen(pScrn,entityIndex);
- 
+
     if (i_chip) {
         for (i_id = i_chip; i_id->numChipset != -1; i_id++) {
             if (pEnt->chipset == i_id->numChipset) break;
@@ -2766,10 +2766,10 @@ xf86ConfigActiveIsaEntity(ScrnInfoPtr pS
     xf86ClaimFixedResources(res,entityIndex);
     if (!xf86SetEntityFuncs(entityIndex,init,enter,leave,private))
         return FALSE;
- 
+
     return TRUE;
 }
- 
+
 _X_EXPORT Bool
 xf86ConfigActivePciEntity(ScrnInfoPtr pScrn, int entityIndex,
                           PciChipsets *p_chip, resList res, EntityProc init,
@@ -2778,13 +2778,13 @@ xf86ConfigActivePciEntity(ScrnInfoPtr pS
     PciChipsets *p_id;
     EntityInfoPtr pEnt = xf86GetEntityInfo(entityIndex);
     if (!pEnt) return FALSE;
- 
+
     if (!pEnt->active || !(pEnt->location.type == BUS_PCI)) {
         xfree(pEnt);
         return FALSE;
     }
     xf86AddEntityToScreen(pScrn,entityIndex);
- 
+
     if (p_chip) {
         for (p_id = p_chip; p_id->numChipset != -1; p_id++) {
             if (pEnt->chipset == p_id->numChipset) break;
@@ -2792,11 +2792,11 @@ xf86ConfigActivePciEntity(ScrnInfoPtr pS
         xf86ClaimFixedResources(p_id->resList,entityIndex);
     }
     xfree(pEnt);
- 
+
     xf86ClaimFixedResources(res,entityIndex);
     if (!xf86SetEntityFuncs(entityIndex,init,enter,leave,private))
         return FALSE;
- 
+
     return TRUE;
 }
 
@@ -2852,7 +2852,7 @@ xf86ConfigIsaEntityInactive(EntityInfoPt
 }
 
 void
-xf86ConfigFbEntityInactive(EntityInfoPtr pEnt, EntityProc init, 
+xf86ConfigFbEntityInactive(EntityInfoPtr pEnt, EntityProc init,
 			   EntityProc enter, EntityProc leave, pointer private)
 {
     ScrnInfoPtr pScrn;
@@ -2921,7 +2921,7 @@ xf86RegisterRootWindowProperty(int ScrnI
     pNewProp->format = format;
     pNewProp->size = len;
     pNewProp->data = value;
- 
+
 #ifdef DEBUG
     ErrorF("new property filled\n");
 #endif
@@ -2963,7 +2963,7 @@ xf86RegisterRootWindowProperty(int ScrnI
 #ifdef DEBUG
     ErrorF("xf86RegisterRootWindowProperty succeeded\n");
 #endif
-    return(Success);    
+    return(Success);
 }
 
 _X_EXPORT Bool
diff-tree 2035f115b7db3c4b7deabeab0d814b3107d6ef30 (from 809e2841aaa54662a42498aacec558bc813bba1c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 8 15:28:10 2006 +0200

    xfree86: remove xf86Keymap.h

diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
index 57493f3..6ad8566 100644
--- a/hw/xfree86/common/Makefile.am
+++ b/hw/xfree86/common/Makefile.am
@@ -66,7 +66,6 @@ EXTRA_DIST = \
 	xf86Bus.h \
 	xf86Config.h \
 	xf86InPriv.h \
-	xf86Keymap.h \
 	xf86Module.h \
 	xf86Opt.h \
 	xf86PciInfo.h \
diff --git a/hw/xfree86/common/xf86Keymap.h b/hw/xfree86/common/xf86Keymap.h
deleted file mode 100644
index 5299bad..0000000
--- a/hw/xfree86/common/xf86Keymap.h
+++ /dev/null
@@ -1,454 +0,0 @@
-
-/*
- * Copyright (c) 1994-2002 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/*
- *
- * For Scancodes see notes in atKeynames.h  !!!!
- *
- */
-/* $XConsortium: xf86Keymap.h /main/14 1996/02/21 17:38:47 kaleb $ */
-
-static KeySym map[NUM_KEYCODES * GLYPHS_PER_KEY] = {
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#if !defined(__SOL8__) && (!defined(sun) || defined(i386))
-
-    /* 0x00 */  NoSymbol,       NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x01 */  XK_Escape,      NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x02 */  XK_1,           XK_exclam,	NoSymbol,	NoSymbol,
-    /* 0x03 */  XK_2,           XK_at,		NoSymbol,	NoSymbol,
-    /* 0x04 */  XK_3,           XK_numbersign,	NoSymbol,	NoSymbol,
-    /* 0x05 */  XK_4,           XK_dollar,	NoSymbol,	NoSymbol,
-    /* 0x06 */  XK_5,           XK_percent,	NoSymbol,	NoSymbol,
-    /* 0x07 */  XK_6,           XK_asciicircum,	NoSymbol,	NoSymbol,
-    /* 0x08 */  XK_7,           XK_ampersand,	NoSymbol,	NoSymbol,
-    /* 0x09 */  XK_8,           XK_asterisk,	NoSymbol,	NoSymbol,
-    /* 0x0a */  XK_9,           XK_parenleft,	NoSymbol,	NoSymbol,
-    /* 0x0b */  XK_0,           XK_parenright,	NoSymbol,	NoSymbol,
-    /* 0x0c */  XK_minus,       XK_underscore,	NoSymbol,	NoSymbol,
-    /* 0x0d */  XK_equal,       XK_plus,	NoSymbol,	NoSymbol,
-    /* 0x0e */  XK_BackSpace,   NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x0f */  XK_Tab,         XK_ISO_Left_Tab,NoSymbol,	NoSymbol,
-    /* 0x10 */  XK_Q,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x11 */  XK_W,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x12 */  XK_E,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x13 */  XK_R,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x14 */  XK_T,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x15 */  XK_Y,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x16 */  XK_U,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x17 */  XK_I,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x18 */  XK_O,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x19 */  XK_P,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1a */  XK_bracketleft, XK_braceleft,	NoSymbol,	NoSymbol,
-    /* 0x1b */  XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,
-    /* 0x1c */  XK_Return,      NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1d */  XK_Control_L,   NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1e */  XK_A,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1f */  XK_S,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x20 */  XK_D,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x21 */  XK_F,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x22 */  XK_G,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x23 */  XK_H,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x24 */  XK_J,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x25 */  XK_K,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x26 */  XK_L,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x27 */  XK_semicolon,   XK_colon,	NoSymbol,	NoSymbol,
-    /* 0x28 */  XK_quoteright,  XK_quotedbl,	NoSymbol,	NoSymbol,
-    /* 0x29 */  XK_quoteleft,	XK_asciitilde,	NoSymbol,	NoSymbol,
-    /* 0x2a */  XK_Shift_L,     NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2b */  XK_backslash,   XK_bar,		NoSymbol,	NoSymbol,
-    /* 0x2c */  XK_Z,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2d */  XK_X,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2e */  XK_C,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2f */  XK_V,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x30 */  XK_B,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x31 */  XK_N,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x32 */  XK_M,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x33 */  XK_comma,       XK_less,	NoSymbol,	NoSymbol,
-    /* 0x34 */  XK_period,      XK_greater,	NoSymbol,	NoSymbol,
-    /* 0x35 */  XK_slash,       XK_question,	NoSymbol,	NoSymbol,
-    /* 0x36 */  XK_Shift_R,     NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x37 */  XK_KP_Multiply, NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x38 */  XK_Alt_L,	XK_Meta_L,	NoSymbol,	NoSymbol,
-    /* 0x39 */  XK_space,       NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3a */  XK_Caps_Lock,   NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3b */  XK_F1,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3c */  XK_F2,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3d */  XK_F3,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3e */  XK_F4,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3f */  XK_F5,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x40 */  XK_F6,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x41 */  XK_F7,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x42 */  XK_F8,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x43 */  XK_F9,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x44 */  XK_F10,         NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x45 */  XK_Num_Lock,    NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x46 */  XK_Scroll_Lock,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x47 */  XK_KP_Home,	XK_KP_7,	NoSymbol,	NoSymbol,
-    /* 0x48 */  XK_KP_Up,	XK_KP_8,	NoSymbol,	NoSymbol,
-    /* 0x49 */  XK_KP_Prior,	XK_KP_9,	NoSymbol,	NoSymbol,
-    /* 0x4a */  XK_KP_Subtract, NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4b */  XK_KP_Left,	XK_KP_4,	NoSymbol,	NoSymbol,
-    /* 0x4c */  XK_KP_Begin,	XK_KP_5,	NoSymbol,	NoSymbol,
-    /* 0x4d */  XK_KP_Right,	XK_KP_6,	NoSymbol,	NoSymbol,
-    /* 0x4e */  XK_KP_Add,      NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4f */  XK_KP_End,	XK_KP_1,	NoSymbol,	NoSymbol,
-    /* 0x50 */  XK_KP_Down,	XK_KP_2,	NoSymbol,	NoSymbol,
-    /* 0x51 */  XK_KP_Next,	XK_KP_3,	NoSymbol,	NoSymbol,
-    /* 0x52 */  XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,
-    /* 0x53 */  XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,
-    /* 0x54 */  XK_Sys_Req,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x55 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x56 */  XK_less,	XK_greater,	NoSymbol,	NoSymbol,
-    /* 0x57 */  XK_F11,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x58 */  XK_F12,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x59 */  XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5a */  XK_Up,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5b */  XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5c */  XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5d */  XK_Begin,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5e */  XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5f */  XK_End,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x60 */  XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x61 */  XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x62 */  XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x63 */  XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x64 */  XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x65 */  XK_Control_R,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x66 */  XK_Pause,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x67 */  XK_Print,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x68 */  XK_KP_Divide,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x69 */  XK_Alt_R,	XK_Meta_R,	NoSymbol,	NoSymbol,
-    /* 0x6a */  XK_Break,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6b */  XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6c */  XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6d */  XK_Menu,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6e */  XK_F13,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6f */  XK_F14,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x70 */  XK_F15,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x71 */  XK_F16,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x72 */  XK_F17,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x73 */  XK_backslash,	XK_underscore,	NoSymbol,	NoSymbol,
-    /* 0x74 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x75 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x76 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x77 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x78 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x79 */  XK_Henkan,	XK_Mode_switch,	NoSymbol,	NoSymbol,
-    /* 0x7a */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7b */  XK_Muhenkan,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7c */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7d */  XK_backslash,	XK_bar,		NoSymbol,	NoSymbol,
-    /* 0x7e */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7f */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-
-#else /* SunOS */
-
-/* Assumes a US English keyboard as default - sorry 'bout that
- *
- * Hopefully it'll be enough someone can have a sorta working
- * keyboard, if they're not using XKB
- *
- * DWH 9/12/99
- */
-
-    /* 0x00 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x01 */  XK_quoteleft,	XK_asciitilde,	NoSymbol,	NoSymbol,
-    /* 0x02 */  XK_1,		XK_exclam,	NoSymbol,	NoSymbol,
-    /* 0x03 */  XK_2,		XK_at,		NoSymbol,	NoSymbol,
-    /* 0x04 */  XK_3,		XK_numbersign,	NoSymbol,	NoSymbol,
-    /* 0x05 */  XK_4,		XK_dollar,	NoSymbol,	NoSymbol,
-    /* 0x06 */  XK_5,		XK_percent,	NoSymbol,	NoSymbol,
-    /* 0x07 */  XK_6,		XK_asciicircum,	NoSymbol,	NoSymbol,
-    /* 0x08 */  XK_7,		XK_ampersand,	NoSymbol,	NoSymbol,
-    /* 0x09 */  XK_8,		XK_asterisk,	NoSymbol,	NoSymbol,
-    /* 0x0a */  XK_9,		XK_parenleft,	NoSymbol,	NoSymbol,
-    /* 0x0b */  XK_0,		XK_parenright,	NoSymbol,	NoSymbol,
-    /* 0x0c */  XK_minus,	XK_underscore,	NoSymbol,	NoSymbol,
-    /* 0x0d */  XK_equal,	XK_plus,	NoSymbol,	NoSymbol,
-    /* 0x0e */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x0f */  XK_BackSpace,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x10 */  XK_Tab,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x11 */  XK_Q,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x12 */  XK_W,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x13 */  XK_E,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x14 */  XK_R,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x15 */  XK_T,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x16 */  XK_Y,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x17 */  XK_U,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x18 */  XK_I,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x19 */  XK_O,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1a */  XK_P,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1b */  XK_bracketleft,	XK_braceleft,	NoSymbol,	NoSymbol,
-    /* 0x1c */  XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,
-    /* 0x1d */  XK_backslash,	XK_bar,		NoSymbol,	NoSymbol,
-    /* 0x1e */  XK_Caps_Lock,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1f */  XK_A,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x20 */  XK_S,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x21 */  XK_D,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x22 */  XK_F,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x23 */  XK_G,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x24 */  XK_H,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x25 */  XK_J,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x26 */  XK_K,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x27 */  XK_L,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x28 */  XK_semicolon,	XK_colon,	NoSymbol,	NoSymbol,
-    /* 0x29 */  XK_quoteright,	XK_quotedbl,	NoSymbol,	NoSymbol,
-    /* 0x2a */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2b */  XK_Return,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2c */  XK_Shift_L,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2d */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2e */  XK_Z,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2f */  XK_X,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x30 */  XK_C,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x31 */  XK_V,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x32 */  XK_B,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x33 */  XK_N,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x34 */  XK_M,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x35 */  XK_comma,	XK_less,	NoSymbol,	NoSymbol,
-    /* 0x36 */  XK_period,	XK_greater,	NoSymbol,	NoSymbol,
-    /* 0x37 */  XK_slash,	XK_question,	NoSymbol,	NoSymbol,
-    /* 0x38 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x39 */  XK_Shift_R,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3a */  XK_Control_L,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3b */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3c */  XK_Alt_L,	XK_Meta_L,	NoSymbol,	NoSymbol,
-    /* 0x3d */  XK_space,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3e */  XK_Alt_R,	XK_Meta_R,	NoSymbol,	NoSymbol,
-    /* 0x3f */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x40 */  XK_Control_R,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x41 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x42 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x43 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x44 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x45 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x46 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x47 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x48 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x49 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4a */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4b */  XK_Insert,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4c */  XK_Delete,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4d */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4e */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4f */  XK_Left,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x50 */  XK_Home,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x51 */  XK_End,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x52 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x53 */  XK_Up,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x54 */  XK_Down,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x55 */  XK_Prior,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x56 */  XK_Next,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x57 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x58 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x59 */  XK_Right,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5a */  XK_Num_Lock,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5b */  XK_KP_Home,	XK_KP_7,	NoSymbol,	NoSymbol,
-    /* 0x5c */  XK_KP_Left,	XK_KP_4,	NoSymbol,	NoSymbol,
-    /* 0x5d */  XK_KP_End,	XK_KP_1,	NoSymbol,	NoSymbol,
-    /* 0x5e */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5f */  XK_KP_Divide,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x60 */  XK_KP_Up,	XK_KP_8,	NoSymbol,	NoSymbol,
-    /* 0x61 */  NoSymbol,	XK_KP_5,	NoSymbol,	NoSymbol,
-    /* 0x62 */  XK_KP_Down,	XK_KP_2,	NoSymbol,	NoSymbol,
-    /* 0x63 */  XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,
-    /* 0x64 */  XK_KP_Multiply,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x65 */  XK_KP_Prior,	XK_KP_9,	NoSymbol,	NoSymbol,
-    /* 0x66 */  XK_KP_Right,	XK_KP_6,	NoSymbol,	NoSymbol,
-    /* 0x67 */  XK_KP_Next,	XK_KP_3,	NoSymbol,	NoSymbol,
-    /* 0x68 */  XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,
-    /* 0x69 */  XK_KP_Subtract,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6a */  XK_KP_Add,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6b */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6c */  XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6d */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6e */  XK_Escape,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6f */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x70 */  XK_F1,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x71 */  XK_F2,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x72 */  XK_F3,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x73 */  XK_F4,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x74 */  XK_F5,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x75 */  XK_F6,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x76 */  XK_F7,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x77 */  XK_F8,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x78 */  XK_F9,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x79 */  XK_F10,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7a */  XK_F11,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7b */  XK_F12,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7c */  XK_Print,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7d */  XK_Scroll_Lock,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7e */  XK_Pause,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7f */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-
-#endif /* SunOS */
-
-};
-
-#if !defined(Lynx) && \
-    !defined(__UNIXOS2__) && \
-    !defined(__mips__) && \
-    !defined(linux) && \
-    !defined(CSRG_BASED) && \
-    !defined(__CYGWIN__) && \
-    !defined(__SOL8__) && \
-    (!defined(sun) || defined(i386))
-
-static KeySym map84[NUM_KEYCODES * GLYPHS_PER_KEY] = {
-    /* 0x00 */  NoSymbol,       NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x01 */  XK_Escape,      NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x02 */  XK_1,           XK_exclam,	NoSymbol,	NoSymbol,
-    /* 0x03 */  XK_2,           XK_at,		NoSymbol,	NoSymbol,
-    /* 0x04 */  XK_3,           XK_numbersign,	NoSymbol,	NoSymbol,
-    /* 0x05 */  XK_4,           XK_dollar,	NoSymbol,	NoSymbol,
-    /* 0x06 */  XK_5,           XK_percent,	NoSymbol,	NoSymbol,
-    /* 0x07 */  XK_6,           XK_asciicircum,	NoSymbol,	NoSymbol,
-    /* 0x08 */  XK_7,           XK_ampersand,	NoSymbol,	NoSymbol,
-    /* 0x09 */  XK_8,           XK_asterisk,	NoSymbol,	NoSymbol,
-    /* 0x0a */  XK_9,           XK_parenleft,	NoSymbol,	NoSymbol,
-    /* 0x0b */  XK_0,           XK_parenright,	NoSymbol,	NoSymbol,
-    /* 0x0c */  XK_minus,       XK_underscore,	NoSymbol,	NoSymbol,
-    /* 0x0d */  XK_equal,       XK_plus,	NoSymbol,	NoSymbol,
-    /* 0x0e */  XK_BackSpace,   NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x0f */  XK_Tab,         NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x10 */  XK_Q,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x11 */  XK_W,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x12 */  XK_E,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x13 */  XK_R,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x14 */  XK_T,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x15 */  XK_Y,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x16 */  XK_U,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x17 */  XK_I,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x18 */  XK_O,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x19 */  XK_P,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1a */  XK_bracketleft, XK_braceleft,	NoSymbol,	NoSymbol,
-    /* 0x1b */  XK_bracketright,XK_braceright,	NoSymbol,	NoSymbol,
-    /* 0x1c */  XK_Return,      NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1d */  XK_Control_L,   NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1e */  XK_A,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x1f */  XK_S,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x20 */  XK_D,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x21 */  XK_F,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x22 */  XK_G,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x23 */  XK_H,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x24 */  XK_J,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x25 */  XK_K,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x26 */  XK_L,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x27 */  XK_semicolon,   XK_colon,	NoSymbol,	NoSymbol,
-    /* 0x28 */  XK_quoteright,  XK_quotedbl,	NoSymbol,	NoSymbol,
-    /* 0x29 */  XK_quoteleft,	XK_asciitilde,	NoSymbol,	NoSymbol,
-    /* 0x2a */  XK_Shift_L,     NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2b */  XK_backslash,   XK_bar,		NoSymbol,	NoSymbol,
-    /* 0x2c */  XK_Z,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2d */  XK_X,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2e */  XK_C,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x2f */  XK_V,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x30 */  XK_B,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x31 */  XK_N,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x32 */  XK_M,           NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x33 */  XK_comma,       XK_less,	NoSymbol,	NoSymbol,
-    /* 0x34 */  XK_period,      XK_greater,	NoSymbol,	NoSymbol,
-    /* 0x35 */  XK_slash,       XK_question,	NoSymbol,	NoSymbol,
-    /* 0x36 */  XK_Shift_R,     NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x37 */  XK_KP_Multiply, NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x38 */  XK_Alt_L,	XK_Meta_L,	NoSymbol,	NoSymbol,
-    /* 0x39 */  XK_space,       NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3a */  XK_Caps_Lock,   NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3b */  XK_F1,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3c */  XK_F2,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3d */  XK_F3,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3e */  XK_F4,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x3f */  XK_F5,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x40 */  XK_F6,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x41 */  XK_F7,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x42 */  XK_F8,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x43 */  XK_F9,          NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x44 */  XK_F10,         NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x45 */  XK_Num_Lock,    NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x46 */  XK_Scroll_Lock,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x47 */  XK_KP_Home,	XK_KP_7,	NoSymbol,	NoSymbol,
-    /* 0x48 */  XK_KP_Up,	XK_KP_8,	NoSymbol,	NoSymbol,
-    /* 0x49 */  XK_KP_Prior,	XK_KP_9,	NoSymbol,	NoSymbol,
-    /* 0x4a */  XK_KP_Subtract, NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4b */  XK_KP_Left,	XK_KP_4,	NoSymbol,	NoSymbol,
-    /* 0x4c */  NoSymbol,	XK_KP_5,	NoSymbol,	NoSymbol,
-    /* 0x4d */  XK_KP_Right,	XK_KP_6,	NoSymbol,	NoSymbol,
-    /* 0x4e */  XK_KP_Add,      NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x4f */  XK_KP_End,	XK_KP_1,	NoSymbol,	NoSymbol,
-    /* 0x50 */  XK_KP_Down,	XK_KP_2,	NoSymbol,	NoSymbol,
-    /* 0x51 */  XK_KP_Next,	XK_KP_3,	NoSymbol,	NoSymbol,
-    /* 0x52 */  XK_KP_Insert,	XK_KP_0,	NoSymbol,	NoSymbol,
-    /* 0x53 */  XK_KP_Delete,	XK_KP_Decimal,	NoSymbol,	NoSymbol,
-    /* 0x54 */  XK_Sys_Req,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x55 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x56 */  XK_less,	XK_greater,	NoSymbol,	NoSymbol,
-    /* 0x57 */  XK_F11,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x58 */  XK_F12,		NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x59 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5a */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5b */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5c */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5d */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5e */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x5f */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x60 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x61 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x62 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x63 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x64 */  XK_KP_Enter,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x65 */  XK_Control_R,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x66 */  XK_Pause,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x67 */  XK_Print,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x68 */  XK_KP_Divide,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x69 */  XK_Alt_R,	XK_Meta_R,	NoSymbol,	NoSymbol,
-    /* 0x6a */  XK_Break,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6b */  XK_Meta_L,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6c */  XK_Meta_R,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6d */  XK_Menu,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6e */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x6f */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x70 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x71 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x72 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x73 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x74 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x75 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x76 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x77 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x78 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x79 */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7a */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7b */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7c */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7d */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-    /* 0x7e */  NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-};
-#endif
diff-tree 809e2841aaa54662a42498aacec558bc813bba1c (from b5438f7fb2879e0226b578f60b22a490e73c3a83)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 8 15:27:58 2006 +0200

    xfree86: add general handler, port ACPI to it (bug #5665)
    
    Add 'general' handler registration, which will not trigger DPMS when an
    event comes in.
    Make ACPI use this.

diff --git a/hw/xfree86/common/xf86.h b/hw/xfree86/common/xf86.h
index 4587500..5112530 100644
--- a/hw/xfree86/common/xf86.h
+++ b/hw/xfree86/common/xf86.h
@@ -222,6 +222,10 @@ pointer xf86AddInputHandler(int fd, Inpu
 int xf86RemoveInputHandler(pointer handler);
 void xf86DisableInputHandler(pointer handler);
 void xf86EnableInputHandler(pointer handler);
+pointer xf86AddGeneralHandler(int fd, InputHandlerProc proc, pointer data);
+int xf86RemoveGeneralHandler(pointer handler);
+void xf86DisableGeneralHandler(pointer handler);
+void xf86EnableGeneralHandler(pointer handler);
 void xf86InterceptSignals(int *signo);
 void xf86InterceptSigIll(void (*sigillhandler)(void));
 Bool xf86EnableVTSwitch(Bool new);
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 6ce9319..905c56a 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -1014,8 +1014,8 @@ xf86VTSwitch()
 
 /* Input handler registration */
 
-_X_EXPORT pointer
-xf86AddInputHandler(int fd, InputHandlerProc proc, pointer data)
+static pointer
+addInputHandler(int fd, InputHandlerProc proc, pointer data)
 {
     IHPtr ih;
 
@@ -1034,15 +1034,50 @@ xf86AddInputHandler(int fd, InputHandler
     ih->next = InputHandlers;
     InputHandlers = ih;
 
-    AddEnabledDevice(fd);
+    return ih;
+}
+
+_X_EXPORT pointer
+xf86AddInputHandler(int fd, InputHandlerProc proc, pointer data)
+{   
+    IHPtr ih = addInputHandler(fd, proc, data);
+
+    if (ih)
+        AddEnabledDevice(fd);
+    return ih;
+}
+
+_X_EXPORT pointer
+xf86AddGeneralHandler(int fd, InputHandlerProc proc, pointer data)
+{   
+    IHPtr ih = addInputHandler(fd, proc, data);
 
+    if (ih)
+        AddGeneralSocket(fd);
     return ih;
 }
 
+static void
+removeInputHandler(IHPtr ih)
+{
+    IHPtr p;
+
+    if (ih == InputHandlers)
+	InputHandlers = ih->next;
+    else {
+	p = InputHandlers;
+	while (p && p->next != ih)
+	    p = p->next;
+	if (ih)
+	    p->next = ih->next;
+    }
+    xfree(ih);
+}
+
 _X_EXPORT int
 xf86RemoveInputHandler(pointer handler)
 {
-    IHPtr ih, p;
+    IHPtr ih;
     int fd;
     
     if (!handler)
@@ -1053,17 +1088,27 @@ xf86RemoveInputHandler(pointer handler)
     
     if (ih->fd >= 0)
 	RemoveEnabledDevice(ih->fd);
+    removeInputHandler(ih);
+
+    return fd;
+}
+
+_X_EXPORT int
+xf86RemoveGeneralHandler(pointer handler)
+{
+    IHPtr ih;
+    int fd;
+    
+    if (!handler)
+	return -1;
+
+    ih = handler;
+    fd = ih->fd;
+    
+    if (ih->fd >= 0)
+	RemoveGeneralSocket(ih->fd);
+    removeInputHandler(ih);
 
-    if (ih == InputHandlers)
-	InputHandlers = ih->next;
-    else {
-	p = InputHandlers;
-	while (p && p->next != ih)
-	    p = p->next;
-	if (ih)
-	    p->next = ih->next;
-    }
-    xfree(ih);
     return fd;
 }
 
@@ -1082,6 +1127,20 @@ xf86DisableInputHandler(pointer handler)
 }
 
 _X_EXPORT void
+xf86DisableGeneralHandler(pointer handler)
+{
+    IHPtr ih;
+
+    if (!handler)
+	return;
+
+    ih = handler;
+    ih->enabled = FALSE;
+    if (ih->fd >= 0)
+	RemoveGeneralSocket(ih->fd);
+}
+
+_X_EXPORT void
 xf86EnableInputHandler(pointer handler)
 {
     IHPtr ih;
@@ -1095,6 +1154,20 @@ xf86EnableInputHandler(pointer handler)
 	AddEnabledDevice(ih->fd);
 }
 
+_X_EXPORT void
+xf86EnableGeneralHandler(pointer handler)
+{
+    IHPtr ih;
+
+    if (!handler)
+	return;
+
+    ih = handler;
+    ih->enabled = TRUE;
+    if (ih->fd >= 0)
+	AddGeneralSocket(ih->fd);
+}
+
 /*
  * As used currently by the DRI, the return value is ignored.
  */
diff --git a/hw/xfree86/os-support/linux/lnx_acpi.c b/hw/xfree86/os-support/linux/lnx_acpi.c
index eca76db..aa30e72 100644
--- a/hw/xfree86/os-support/linux/lnx_acpi.c
+++ b/hw/xfree86/os-support/linux/lnx_acpi.c
@@ -163,7 +163,7 @@ lnxACPIOpen(void)
 
     xf86PMGetEventFromOs = lnxACPIGetEventFromOs;
     xf86PMConfirmEventToOs = lnxACPIConfirmEventToOs;
-    ACPIihPtr = xf86AddInputHandler(fd,xf86HandlePMEvents,NULL);
+    ACPIihPtr = xf86AddGeneralHandler(fd,xf86HandlePMEvents,NULL);
     xf86MsgVerb(X_INFO,3,"Open ACPI successful (%s)\n", ACPI_SOCKET);
 
     return lnxCloseACPI;
@@ -178,7 +178,7 @@ lnxCloseACPI(void)
    ErrorF("ACPI: Closing device\n");
 #endif
     if (ACPIihPtr) {
-	fd = xf86RemoveInputHandler(ACPIihPtr);
+	fd = xf86RemoveGeneralHandler(ACPIihPtr);
 	shutdown(fd, 2);
 	close(fd);
 	ACPIihPtr = NULL;
diff-tree b5438f7fb2879e0226b578f60b22a490e73c3a83 (from b0a7443ca8bd224994f98c1c1e25de88f2573224)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 8 15:24:58 2006 +0200

    Get*Events: massive reorganisation
    
    Reorganise the code logically, and put more comments in.
    Clip valuators in proximity calls.

diff --git a/dix/getevents.c b/dix/getevents.c
index b19a73f..4a3ee8e 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1,5 +1,6 @@
 /*
  * Copyright © 2006 Nokia Corporation
+ * Copyright © 2006 Daniel Stone
  *
  * Permission to use, copy, modify, distribute, and sell this software and
  * its documentation for any purpose is hereby granted without fee,
@@ -27,18 +28,17 @@
 
 #include <X11/X.h>
 #include <X11/keysym.h>
-#include "misc.h"
-#include "resource.h"
 #define NEED_EVENTS
 #define NEED_REPLIES
 #include <X11/Xproto.h>
+
+#include "misc.h"
+#include "resource.h"
 #include "inputstr.h"
 #include "scrnintstr.h"
 #include "cursorstr.h"
-
 #include "dixstruct.h"
 #include "globals.h"
-
 #include "mipointer.h"
 
 #ifdef XKB
@@ -63,177 +63,143 @@ extern Bool XkbCopyKeymap(XkbDescPtr src
 #include "exglobals.h"
 #include "extnsionst.h"
 
-/* Maximum number of valuators, divided by six, rounded up. */
+
+/* Maximum number of valuators, divided by six, rounded up, to get number
+ * of events. */
 #define MAX_VALUATOR_EVENTS 6
 
 /* Number of motion history events to store. */
 #define MOTION_HISTORY_SIZE 256
 
+
 /**
- * Returns the maximum number of events GetKeyboardEvents,
- * GetKeyboardValuatorEvents, and GetPointerEvents will ever return.
- *
- * Should be used in DIX as:
- * xEvent *events = xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+ * Pick some arbitrary size for Xi motion history.
  */
 _X_EXPORT int
-GetMaximumEventsNum() {
-    /* Two base events -- core and device, plus valuator events.  Multiply
-     * by two if we're doing key repeats. */
-    int ret = 2 + MAX_VALUATOR_EVENTS;
-
-#ifdef XKB
-    if (noXkbExtension)
-#endif
-        ret *= 2;
-
-    return ret;
+GetMotionHistorySize()
+{
+    return MOTION_HISTORY_SIZE;
 }
 
+
 /**
- * Convenience wrapper around GetKeyboardValuatorEvents, that takes no
- * valuators.
+ * Allocate the motion history buffer.
  */
-_X_EXPORT int
-GetKeyboardEvents(xEvent *events, DeviceIntPtr pDev, int type, int key_code) {
-    return GetKeyboardValuatorEvents(events, pDev, type, key_code, 0, 0, NULL);
+_X_EXPORT void
+AllocateMotionHistory(DeviceIntPtr pDev)
+{
+    if (pDev->valuator->motion)
+        xfree(pDev->valuator->motion);
+
+    if (pDev->valuator->numMotionEvents < 1)
+        return;
+
+    pDev->valuator->motion = xalloc(((sizeof(INT32) * pDev->valuator->numAxes) +
+                                     sizeof(Time)) *
+                                    pDev->valuator->numMotionEvents);
+    pDev->valuator->first_motion = 0;
+    pDev->valuator->last_motion = 0;
 }
 
+
 /**
- * Returns a set of keyboard events for KeyPress/KeyRelease, optionally
- * also with valuator events.  Handles Xi and XKB.
- *
- * events is not NULL-terminated; the return value is the number of events.
- * The DDX is responsible for allocating the event structure in the first
- * place via GetMaximumEventsNum(), and for freeing it.
- *
- * This function does not change the core keymap to that of the device;
- * that is done by SwitchCoreKeyboard, which is called from
- * mieqProcessInputEvents.  If replacing function, take care to call
- * SetCoreKeyboard before processInputProc, so keymaps are altered to suit.
- *
- * Note that this function recurses!  If called for non-XKB, a repeating
- * key press will trigger a matching KeyRelease, as well as the
- * KeyPresses.
+ * Dump the motion history between start and stop into the supplied buffer.
+ * Only records the event for a given screen in theory, but in practice, we
+ * sort of ignore this.
  */
 _X_EXPORT int
-GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type,
-                          int key_code, int first_valuator,
-                          int num_valuators, int *valuators) {
-    int numEvents = 0, i = 0;
-    CARD32 ms = 0;
-    int final_valuator = first_valuator + num_valuators;
-    KeySym sym = pDev->key->curKeySyms.map[key_code *
-                                           pDev->key->curKeySyms.mapWidth];
-    deviceKeyButtonPointer *kbp = NULL;
-    deviceValuator *xv = NULL;
+GetMotionHistory(DeviceIntPtr pDev, xTimecoord *buff, unsigned long start,
+                 unsigned long stop, ScreenPtr pScreen)
+{
+    char *ibuff = NULL, *obuff = (char *) buff;
+    int i = 0, ret = 0;
+    Time current;
+    /* The size of a single motion event. */
+    int size = (sizeof(INT32) * pDev->valuator->numAxes) + sizeof(Time);
 
-    if (!events)
+    if (!pDev->valuator || !pDev->valuator->numMotionEvents)
         return 0;
 
-    if (type != KeyPress && type != KeyRelease)
-        return 0;
+    for (i = pDev->valuator->first_motion;
+         i != pDev->valuator->last_motion;
+         i = (i + 1) % pDev->valuator->numMotionEvents) {
+        /* We index the input buffer by which element we're accessing, which
+         * is not monotonic, and the output buffer by how many events we've
+         * written so far. */
+        ibuff = (char *) pDev->valuator->motion + (i * size);
+        memcpy(&current, ibuff, sizeof(Time));
 
-    if (!pDev->key || !pDev->focus || !pDev->kbdfeed ||
-        (pDev->coreEvents && !inputInfo.keyboard->key))
-        return 0;
+        if (current > stop) {
+            return ret;
+        }
+        else if (current >= start) {
+            memcpy(obuff, ibuff, size);
+            obuff += size;
+            ret++;
+        }
+    }
 
-    if (pDev->coreEvents)
-        numEvents = 2;
-    else
-        numEvents = 1;
+    return ret;
+}
 
-    if (num_valuators) {
-        if ((num_valuators / 6) + 1 > MAX_VALUATOR_EVENTS)
-            num_valuators = MAX_VALUATOR_EVENTS;
-        numEvents += (num_valuators / 6) + 1;
-    }
 
-#ifdef XKB
-    if (noXkbExtension)
-#endif
-    {
-        switch (sym) {
-            case XK_Num_Lock:
-            case XK_Caps_Lock:
-            case XK_Scroll_Lock:
-            case XK_Shift_Lock:
-                if (type == KeyRelease)
-                    return 0;
-                else if (type == KeyPress &&
-                         (pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
-                        type = KeyRelease;
-        }
-    }
+/**
+ * Update the motion history for a specific device, with the list of
+ * valuators.
+ */
+static void
+updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator,
+                    int num_valuators, int *valuators)
+{
+    char *buff = (char *) pDev->valuator->motion;
 
-    /* Handle core repeating, via press/release/press/release.
-     * FIXME: In theory, if you're repeating with two keyboards,
-     *        you could get unbalanced events here. */
-    if (type == KeyPress &&
-        (((pDev->key->down[key_code >> 3] & (key_code & 7))) & 1)) {
-        if (!pDev->kbdfeed->ctrl.autoRepeat ||
-            pDev->key->modifierMap[key_code] ||
-            !(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3]
-                & (1 << (key_code & 7))))
-            return 0;
+    if (!pDev->valuator->numMotionEvents)
+        return;
 
-#ifdef XKB
-        if (noXkbExtension)
-#endif
-        {
-            numEvents += GetKeyboardValuatorEvents(events, pDev,
-                                                   KeyRelease, key_code,
-                                                   first_valuator, num_valuators,
-                                                   valuators);
-            events += numEvents;
-        }
-    }
+    buff += ((sizeof(INT32) * pDev->valuator->numAxes) + sizeof(CARD32)) *
+            pDev->valuator->last_motion;
+    memcpy(buff, &ms, sizeof(Time));
 
-    ms = GetTimeInMillis();
+    buff += sizeof(Time);
+    bzero(buff, sizeof(INT32) * pDev->valuator->numAxes);
 
-    kbp = (deviceKeyButtonPointer *) events;
-    kbp->time = ms;
-    kbp->deviceid = pDev->id;
-    if (type == KeyPress)
-        kbp->type = DeviceKeyPress;
-    else if (type == KeyRelease)
-        kbp->type = DeviceKeyRelease;
+    buff += sizeof(INT32) * first_valuator;
+    memcpy(buff, valuators, sizeof(INT32) * num_valuators);
 
-    if (num_valuators) {
-        kbp->deviceid |= MORE_EVENTS;
-        for (i = first_valuator; i < final_valuator; i += 6) {
-            xv = (deviceValuator *) ++events;
-            xv->type = DeviceValuator;
-            xv->first_valuator = i;
-            xv->num_valuators = num_valuators;
-            xv->deviceid = kbp->deviceid;
-            switch (num_valuators - first_valuator) {
-            case 6:
-                xv->valuator5 = valuators[i+5];
-            case 5:
-                xv->valuator4 = valuators[i+4];
-            case 4:
-                xv->valuator3 = valuators[i+3];
-            case 3:
-                xv->valuator2 = valuators[i+2];
-            case 2:
-                xv->valuator1 = valuators[i+1];
-            case 1:
-                xv->valuator0 = valuators[i];
-            }
-        }
-    }
+    pDev->valuator->last_motion = (pDev->valuator->last_motion + 1) %
+                                  pDev->valuator->numMotionEvents;
+    
+    /* If we're wrapping around, just keep the circular buffer going. */
+    if (pDev->valuator->first_motion == pDev->valuator->last_motion)
+        pDev->valuator->first_motion = (pDev->valuator->first_motion + 1) %
+                                       pDev->valuator->numMotionEvents;
 
-    if (pDev->coreEvents) {
-        events++;
-        events->u.keyButtonPointer.time = ms;
-        events->u.u.type = type;
-        events->u.u.detail = key_code;
-    }
+    return;
+}
 
-    return numEvents;
+
+/**
+ * Returns the maximum number of events GetKeyboardEvents,
+ * GetKeyboardValuatorEvents, and GetPointerEvents will ever return.
+ *
+ * Should be used in DIX as:
+ * xEvent *events = xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+ */
+_X_EXPORT int
+GetMaximumEventsNum() {
+    /* Two base events -- core and device, plus valuator events.  Multiply
+     * by two if we're doing key repeats. */
+    int ret = 2 + MAX_VALUATOR_EVENTS;
+
+#ifdef XKB
+    if (noXkbExtension)
+#endif
+        ret *= 2;
+
+    return ret;
 }
 
+
 /* Originally a part of xf86PostMotionEvent; modifies valuators
  * in-place. */
 static void
@@ -307,8 +273,10 @@ acceleratePointer(DeviceIntPtr pDev, int
     }
 }
 
+
 /**
- * Clip an axis to its bounds.
+ * Clip an axis to its bounds, which are declared in the call to
+ * InitValuatorAxisClassStruct.
  */
 static void
 clipAxis(DeviceIntPtr pDev, int axisNum, int *val)
@@ -322,8 +290,7 @@ clipAxis(DeviceIntPtr pDev, int axisNum,
 }
 
 /**
- * Compare the list of valuators against the limits for each axis, and clip
- * them to those bounds.
+ * Clip every axis in the list of valuators to its bounds.
  */
 static void
 clipValuators(DeviceIntPtr pDev, int first_valuator, int num_valuators,
@@ -336,9 +303,14 @@ clipValuators(DeviceIntPtr pDev, int fir
         clipAxis(pDev, i + first_valuator, &(valuators[i]));
 }
 
+
 /**
  * Fills events with valuator events for pDev, as given by the other
  * parameters.
+ *
+ * FIXME: Need to fix ValuatorClassRec to store all the valuators as
+ *        last posted, not just x and y; otherwise relative non-x/y
+ *        valuators, though a very narrow use case, will be broken.
  */
 static xEvent *
 getValuatorEvents(xEvent *events, DeviceIntPtr pDev, int first_valuator,
@@ -373,108 +345,133 @@ getValuatorEvents(xEvent *events, Device
     return events;
 }
 
+
 /**
- * Pick some arbitrary size for Xi motion history.
+ * Convenience wrapper around GetKeyboardValuatorEvents, that takes no
+ * valuators.
  */
 _X_EXPORT int
-GetMotionHistorySize()
-{
-    return MOTION_HISTORY_SIZE;
+GetKeyboardEvents(xEvent *events, DeviceIntPtr pDev, int type, int key_code) {
+    return GetKeyboardValuatorEvents(events, pDev, type, key_code, 0, 0, NULL);
 }
 
-/**
- * Allocate the motion history buffer.
- */
-_X_EXPORT void
-AllocateMotionHistory(DeviceIntPtr pDev)
-{
-    if (pDev->valuator->motion)
-        xfree(pDev->valuator->motion);
-
-    if (pDev->valuator->numMotionEvents < 1)
-        return;
-
-    pDev->valuator->motion = xalloc(((sizeof(INT32) * pDev->valuator->numAxes) +
-                                     sizeof(Time)) *
-                                    pDev->valuator->numMotionEvents);
-    pDev->valuator->first_motion = 0;
-    pDev->valuator->last_motion = 0;
-}
 
 /**
- * Dump the motion history between start and stop into the supplied buffer.
- * Only records the event for a given screen in theory, but in practice, we
- * sort of ignore this.
+ * Returns a set of keyboard events for KeyPress/KeyRelease, optionally
+ * also with valuator events.  Handles Xi and XKB.
+ *
+ * events is not NULL-terminated; the return value is the number of events.
+ * The DDX is responsible for allocating the event structure in the first
+ * place via GetMaximumEventsNum(), and for freeing it.
+ *
+ * This function does not change the core keymap to that of the device;
+ * that is done by SwitchCoreKeyboard, which is called from
+ * mieqProcessInputEvents.  If replacing that function, take care to call
+ * SetCoreKeyboard before processInputProc, so keymaps are altered to suit.
+ *
+ * Note that this function recurses!  If called for non-XKB, a repeating
+ * key press will trigger a matching KeyRelease, as well as the
+ * KeyPresses.
  */
 _X_EXPORT int
-GetMotionHistory(DeviceIntPtr pDev, xTimecoord *buff, unsigned long start,
-                 unsigned long stop, ScreenPtr pScreen)
-{
-    int i = 0, ret = 0;
-    /* The size of a single motion event. */
-    int size = (sizeof(INT32) * pDev->valuator->numAxes) + sizeof(Time);
-    Time current;
-    char *ibuff = NULL, *obuff = (char *) buff;
+GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type,
+                          int key_code, int first_valuator,
+                          int num_valuators, int *valuators) {
+    int numEvents = 0;
+    CARD32 ms = 0;
+    KeySym *map = pDev->key->curKeySyms.map;
+    KeySym sym = map[key_code * pDev->key->curKeySyms.mapWidth];
+    deviceKeyButtonPointer *kbp = NULL;
 
-    if (!pDev->valuator || !pDev->valuator->numMotionEvents)
+    if (!events)
         return 0;
 
-    for (i = pDev->valuator->first_motion;
-         i != pDev->valuator->last_motion;
-         i = (i + 1) % pDev->valuator->numMotionEvents) {
-        /* We index the input buffer by which element we're accessing, which
-         * is not monotonic, and the output buffer by how many events we've
-         * written so far. */
-        ibuff = (char *) pDev->valuator->motion + (i * size);
-        memcpy(&current, ibuff, sizeof(Time));
+    if (type != KeyPress && type != KeyRelease)
+        return 0;
 
-        if (current > stop) {
-            return ret;
-        }
-        else if (current >= start) {
-            memcpy(obuff, ibuff, size);
-            obuff += size;
-            ret++;
-        }
+    if (!pDev->key || !pDev->focus || !pDev->kbdfeed ||
+        (pDev->coreEvents && !inputInfo.keyboard->key))
+        return 0;
+
+    if (pDev->coreEvents)
+        numEvents = 2;
+    else
+        numEvents = 1;
+
+    if (num_valuators) {
+        if ((num_valuators / 6) + 1 > MAX_VALUATOR_EVENTS)
+            num_valuators = MAX_VALUATOR_EVENTS;
+        numEvents += (num_valuators / 6) + 1;
     }
 
-    return ret;
-}
+#ifdef XKB
+    if (noXkbExtension)
+#endif
+    {
+        switch (sym) {
+            case XK_Num_Lock:
+            case XK_Caps_Lock:
+            case XK_Scroll_Lock:
+            case XK_Shift_Lock:
+                if (type == KeyRelease)
+                    return 0;
+                else if (type == KeyPress &&
+                         (pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
+                        type = KeyRelease;
+        }
+    }
 
-/**
- * Update the motion history for a specific device, with the list of
- * valuators.
- */
-static void
-updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator,
-                    int num_valuators, int *valuators)
-{
-    char *buff = (char *) pDev->valuator->motion;
+    /* Handle core repeating, via press/release/press/release.
+     * FIXME: In theory, if you're repeating with two keyboards in non-XKB,
+     *        you could get unbalanced events here. */
+    if (type == KeyPress &&
+        (((pDev->key->down[key_code >> 3] & (key_code & 7))) & 1)) {
+        if (!pDev->kbdfeed->ctrl.autoRepeat ||
+            pDev->key->modifierMap[key_code] ||
+            !(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3]
+                & (1 << (key_code & 7))))
+            return 0;
 
-    if (!pDev->valuator->numMotionEvents)
-        return;
+#ifdef XKB
+        if (noXkbExtension)
+#endif
+        {
+            numEvents += GetKeyboardValuatorEvents(events, pDev,
+                                                   KeyRelease, key_code,
+                                                   first_valuator, num_valuators,
+                                                   valuators);
+            events += numEvents;
+        }
+    }
 
-    buff += ((sizeof(INT32) * pDev->valuator->numAxes) + sizeof(CARD32)) *
-            pDev->valuator->last_motion;
-    memcpy(buff, &ms, sizeof(Time));
+    ms = GetTimeInMillis();
 
-    buff += sizeof(Time);
-    bzero(buff, sizeof(INT32) * pDev->valuator->numAxes);
+    kbp = (deviceKeyButtonPointer *) events;
+    kbp->time = ms;
+    kbp->deviceid = pDev->id;
+    if (type == KeyPress)
+        kbp->type = DeviceKeyPress;
+    else if (type == KeyRelease)
+        kbp->type = DeviceKeyRelease;
 
-    buff += sizeof(INT32) * first_valuator;
-    memcpy(buff, valuators, sizeof(INT32) * num_valuators);
+    events++;
+    if (num_valuators) {
+        kbp->deviceid |= MORE_EVENTS;
+        clipValuators(pDev, first_valuator, num_valuators, valuators);
+        events = getValuatorEvents(events, pDev, first_valuator,
+                                   num_valuators, valuators);
+    }
 
-    pDev->valuator->last_motion = (pDev->valuator->last_motion + 1) %
-                                  pDev->valuator->numMotionEvents;
-    
-    /* If we're wrapping around, just keep the circular buffer going. */
-    if (pDev->valuator->first_motion == pDev->valuator->last_motion)
-        pDev->valuator->first_motion = (pDev->valuator->first_motion + 1) %
-                                       pDev->valuator->numMotionEvents;
+    if (pDev->coreEvents) {
+        events->u.keyButtonPointer.time = ms;
+        events->u.u.type = type;
+        events->u.u.detail = key_code;
+    }
 
-    return;
+    return numEvents;
 }
 
+
 /**
  * Generate a series of xEvents (returned in xE) representing pointer
  * motion, or button presses.  Xi and XKB-aware.
@@ -528,6 +525,8 @@ GetPointerEvents(xEvent *events, DeviceI
     kbp->time = ms;
     kbp->deviceid = pDev->id;
 
+    /* Set x and y based on whether this is absolute or relative, and
+     * accelerate if we need to. */
     if (flags & POINTER_ABSOLUTE) {
         if (num_valuators >= 1 && first_valuator == 0) {
             x = valuators[0];
@@ -645,6 +644,7 @@ GetPointerEvents(xEvent *events, DeviceI
     return num_events;
 }
 
+
 /**
  * Post ProximityIn/ProximityOut events, accompanied by valuators.
  *
@@ -689,6 +689,7 @@ GetProximityEvents(xEvent *events, Devic
     if (num_valuators) {
         kbp->deviceid |= MORE_EVENTS;
         events++;
+        clipValuators(pDev, first_valuator, num_valuators, valuators);
         events = getValuatorEvents(events, pDev, first_valuator,
                                    num_valuators, valuators);
     }
@@ -696,6 +697,7 @@ GetProximityEvents(xEvent *events, Devic
     return num_events;
 }
 
+
 /**
  * Note that pDev was the last device to send a core event.  This function
  * copies the complete keymap from the originating device to the core
@@ -737,6 +739,7 @@ SwitchCoreKeyboard(DeviceIntPtr pDev)
     }
 }
 
+
 /**
  * Note that pDev was the last function to send a core pointer event.
  * Currently a no-op.
diff-tree b0a7443ca8bd224994f98c1c1e25de88f2573224 (from 332f179db7c38310db1f752d45f51b6d8301fd30)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 8 15:23:52 2006 +0200

    configure.ac: axe redundant SDL test

diff --git a/configure.ac b/configure.ac
index 6bfa74c..3148403 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1584,6 +1584,7 @@ if test "$KDRIVE" = yes; then
         AC_DEFINE(TSLIB, 1, [Have tslib support])
     fi
 
+    AC_CHECK_HEADERS([SDL/SDL.h])
     if test x"$ac_cv_header_SDL_SDL_h" = xyes && test "x$XSDL" = xauto; then
        XSDL=yes
     fi
@@ -1642,12 +1643,6 @@ if test "$KDRIVE" = yes; then
     AC_CHECK_FUNC([nanosleep], [],
         AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
 
-    # check for SDL SDK
-    AC_CHECK_HEADERS([SDL/SDL.h])
-    if test "x$XSDL" = xauto; then
-        XSDL="$ac_cv_header_SDL_SDL_h"
-    fi
-
     AC_SUBST([XEPHYR_LIBS])
     AC_SUBST([XEPHYR_INCS])
     AC_SUBST([XSDL_LIBS])
diff-tree 332f179db7c38310db1f752d45f51b6d8301fd30 (from 988757a44197c91027109076e2e33ff6510ed71d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 8 15:23:35 2006 +0200

    kdrive/sdl: fix compilation

diff --git a/hw/kdrive/sdl/sdl.c b/hw/kdrive/sdl/sdl.c
index d354f6f..d7448ff 100644
--- a/hw/kdrive/sdl/sdl.c
+++ b/hw/kdrive/sdl/sdl.c
@@ -30,7 +30,6 @@
 #include "kdrive-config.h"
 #endif
 #include "kdrive.h"
-#include "kkeymap.h"
 #include <SDL/SDL.h>
 #include <X11/keysym.h>
 
@@ -39,20 +38,20 @@ static Bool sdlScreenInit(KdScreenInfo *
 static Bool sdlFinishInitScreen(ScreenPtr pScreen);
 static Bool sdlCreateRes(ScreenPtr pScreen);
 
-static void sdlKeyboardBell (int volume, int pitch, int duration);
-static void sdlKeyboardLeds (int leds);
-static void sdlKeyboardFini(void);
-static void sdlKeyboardLoad (void);
-static Bool sdlKeyboardInit(void);
+static void sdlKeyboardFini(KdKeyboardInfo *ki);
+static Bool sdlKeyboardInit(KdKeyboardInfo *ki);
 
-static Bool sdlMouseInit(void);
-static void sdlMouseFini(void);
+static Bool sdlMouseInit(KdPointerInfo *pi);
+static void sdlMouseFini(KdPointerInfo *pi);
 
 void *sdlShadowWindow (ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, CARD32 *size, void *closure);
 void sdlShadowUpdate (ScreenPtr pScreen, shadowBufPtr pBuf);
 
 void sdlTimer(void);
 
+KdKeyboardInfo *sdlKeyboard = NULL;
+KdPointerInfo *sdlPointer = NULL;
+
 KeySym sdlKeymap[]={
 	0, 			/* 8 */
 	0, 
@@ -168,51 +167,23 @@ KeySym sdlKeymap[]={
 	NoSymbol, NoSymbol		/* 118 */
 };
 
-//KdMouseInfo *kdMouseInfo;
-
-KdKeyboardFuncs sdlKeyboardFuncs = {
-    sdlKeyboardLoad,
-    sdlKeyboardInit,
-    sdlKeyboardLeds,
-    sdlKeyboardBell,
-    sdlKeyboardFini,
-    3,
+KdKeyboardDriver sdlKeyboardDriver = {
+    .name = "keyboard",
+    .Init = sdlKeyboardInit,
+    .Fini = sdlKeyboardFini,
 };
 
-KdMouseFuncs sdlMouseFuncs = {
-    sdlMouseInit,
-    sdlMouseFini,
+KdPointerDriver sdlMouseDriver = {
+    .name = "mouse",
+    .Init = sdlMouseInit,
+    .Fini = sdlMouseFini,
 };
 
 
 KdCardFuncs sdlFuncs = {
-    0,	/* cardinit */
-    sdlScreenInit,	/* scrinit */
-    0,	/* initScreen */
-    sdlFinishInitScreen, /* finishInitScreen */
-    sdlCreateRes,	/* createRes */
-    0,	/* preserve */
-    0,		/* enable */
-    0,		/* dpms */
-    0,		/* disable */
-    0,		/* restore */
-    0,	/* scrfini */
-    0,	/* cardfini */
-    
-    0,			/* initCursor */
-    0,			/* enableCursor */
-    0,			/* disableCursor */
-    0,			/* finiCursor */
-    0,			/* recolorCursor */
-    
-    0,	/* initAccel */
-    0,	/* enableAccel */
-    0,	/* syncAccel */
-    0,	/* disableAccel */
-    0,	/* finiAccel */
-    
-    0,    	 /* getColors */
-    0	 /* putColors */
+    .scrinit = sdlScreenInit,	/* scrinit */
+    .finishInitScreen = sdlFinishInitScreen, /* finishInitScreen */
+    .createRes = sdlCreateRes,	/* createRes */
 };
 
 int mouseState=0;
@@ -327,52 +298,34 @@ static Bool sdlFinishInitScreen(ScreenPt
 	return TRUE;
 }
 
-static void sdlKeyboardBell (int volume, int pitch, int duration)
-{
-#ifdef DEBUG
-	printf("a bell would go here\n");
-#endif
-}
-
-static void sdlKeyboardLeds (int leds)
-{
-#ifdef DEBUG
-	printf("Leds: %d\n", leds);
-#endif
-}
-
-static void sdlKeyboardLoad(void)
+static void sdlKeyboardFini(KdKeyboardInfo *ki)
 {
-	int x;
-	kdMinScanCode = 8;
-	kdMaxScanCode = 255;
-	kdMinKeyCode = 8;
-	kdMaxKeyCode = 255;
-	kdKeymapWidth = 2;
-
-	memcpy(kdKeymap, sdlKeymap, sizeof(sdlKeymap));
+        sdlKeyboard = NULL;
 }
 
-static void sdlKeyboardFini(void)
+static Bool sdlKeyboardInit(KdKeyboardInfo *ki)
 {
+        ki->minScanCode = 8;
+        ki->maxScanCode = 255;
+        ki->keySyms.minKeyCode = 8;
+        ki->keySyms.maxKeyCode = 255;
+        ki->keySyms.mapWidth = 2;
+        memcpy(ki->keySyms.map, sdlKeymap, sizeof(sdlKeymap));
 
-}
+	sdlKeyboard = ki;
 
-static Bool sdlKeyboardInit(void)
-{
-	return TRUE;
+        return TRUE;
 }
 
-static Bool sdlMouseInit (void)
+static Bool sdlMouseInit (KdPointerInfo *pi)
 {
-#ifdef DEBUG
-	printf("kdMouseInfo: 0x%x\n", kdMouseInfo);
-#endif
+        sdlPointer = pi;
 	return TRUE;
 }
 
-static void sdlMouseFini(void)
+static void sdlMouseFini(KdPointerInfo *pi)
 {
+        sdlPointer = NULL;
 }
 
 
@@ -395,8 +348,18 @@ void InitOutput(ScreenInfo *pScreenInfo,
 
 void InitInput(int argc, char **argv)
 {
-	/* FIXME: change this to use SDL key/mouse funcs */
-	KdInitInput(&sdlMouseFuncs, &sdlKeyboardFuncs);
+        KdPointerInfo *pi;
+        KdKeyboardInfo *ki;
+
+        KdAddKeyboardDriver(&sdlKeyboardDriver);
+        KdAddPointerDriver(&sdlMouseDriver);
+        
+        ki = KdParseKeyboard("keyboard");
+        KdAddKeyboard(ki);
+        pi = KdParsePointer("mouse");
+        KdAddPointer(pi);
+
+        KdInitInput();
 }
 
 void ddxUseMsg(void)
@@ -418,7 +381,7 @@ void sdlTimer(void)
 	while ( SDL_PollEvent(&event) ) {
 		switch (event.type) {
 			case SDL_MOUSEMOTION:
-				KdEnqueueMouseEvent(kdMouseInfo, mouseState,  event.motion.x, event.motion.y);
+				KdEnqueuePointerEvent(sdlPointer, mouseState, event.motion.x, event.motion.y, 0);
 				break;
 			case SDL_MOUSEBUTTONDOWN:
 				switch(event.button.button)
@@ -434,7 +397,7 @@ void sdlTimer(void)
 						break;
 				}
 				mouseState|=buttonState;
-				KdEnqueueMouseEvent(kdMouseInfo, mouseState|KD_MOUSE_DELTA, 0, 0);
+				KdEnqueuePointerEvent(sdlPointer, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
 				break;
 			case SDL_MOUSEBUTTONUP:
 				switch(event.button.button)
@@ -450,14 +413,14 @@ void sdlTimer(void)
 						break;
 				}
 				mouseState &= ~buttonState;
-				KdEnqueueMouseEvent(kdMouseInfo, mouseState|KD_MOUSE_DELTA, 0, 0);
+				KdEnqueuePointerEvent(sdlPointer, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
 				break;
 			case SDL_KEYDOWN:
 			case SDL_KEYUP:
 #ifdef DEBUG
 				printf("Keycode: %d\n", event.key.keysym.scancode);
 #endif
-			        KdEnqueueKeyboardEvent (event.key.keysym.scancode, event.type==SDL_KEYUP);
+			        KdEnqueueKeyboardEvent (sdlKeyboard, event.key.keysym.scancode, event.type==SDL_KEYUP);
 				break;
 
 			case SDL_QUIT:
@@ -482,12 +445,9 @@ static void xsdlFini(void)
 }
 
 KdOsFuncs sdlOsFuncs={
-	xsdlInit,
-	0,
-	0,
-	0,
-	xsdlFini,
-	sdlTimer
+	.Init = xsdlInit,
+	.Fini = xsdlFini,
+	.pollEvents = sdlTimer,
 };
 
 void OsVendorInit (void)
diff-tree 988757a44197c91027109076e2e33ff6510ed71d (from e2b78df5800fb4e3f0ed01b38a1974ba3577949c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 8 14:06:51 2006 +0200

    config: error messages non-fatal, and before we free them
    
    Move error messages before we free the error structure, and make them all
    non-fatal.

diff --git a/config/config.c b/config/config.c
index b95128d..05757e2 100644
--- a/config/config.c
+++ b/config/config.c
@@ -258,49 +258,51 @@ configInitialise()
     dbus_error_init(&error);
     bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
     if (!bus || dbus_error_is_set(&error)) {
-        FatalError("[dbus] some kind of error occurred: %s (%s)\n", error.name,
-                   error.message);
+        ErrorF("[dbus] some kind of error occurred: %s (%s)\n", error.name,
+                error.message);
         dbus_error_free(&error);
         return;
     }
 
     if (!dbus_connection_get_unix_fd(bus, &configfd)) {
         dbus_connection_unref(bus);
+        ErrorF("[dbus] couldn't get fd for bus\n");
+        dbus_error_free(&error);
         configfd = -1;
-        FatalError("[dbus] couldn't get fd for bus\n");
         return;
     }
 
     snprintf(busname, sizeof(busname), "org.x.config.display%d", atoi(display));
     if (!dbus_bus_request_name(bus, busname, 0, &error) ||
         dbus_error_is_set(&error)) {
+        ErrorF("[dbus] couldn't take over org.x.config: %s (%s)\n",
+               error.name, error.message);
+        dbus_error_free(&error);
         dbus_connection_unref(bus);
         configfd = -1;
-        FatalError("[dbus] couldn't take over org.x.config: %s (%s)\n",
-                   error.name, error.message);
-        dbus_error_free(&error);
         return;
     }
 
     /* blocks until we get a reply. */
     dbus_bus_add_match(bus, MATCH_RULE, &error);
     if (dbus_error_is_set(&error)) {
+        ErrorF("[dbus] couldn't match X.Org rule: %s (%s)\n", error.name,
+               error.message);
+        dbus_error_free(&error);
         dbus_bus_release_name(bus, busname, &error);
         dbus_connection_unref(bus);
         configfd = -1;
-        FatalError("[dbus] couldn't match X.Org rule: %s (%s)\n", error.name,
-                   error.message);
-        dbus_error_free(&error);
         return;
     }
 
     snprintf(busobject, sizeof(busobject), "/org/x/config/%d", atoi(display));
     if (!dbus_connection_register_object_path(bus, busobject, &vtable, bus)) {
+        ErrorF("[dbus] couldn't register object path\n");
         configfd = -1;
         dbus_bus_release_name(bus, busname, &error);
         dbus_bus_remove_match(bus, MATCH_RULE, &error);
         dbus_connection_unref(bus);
-        FatalError("[dbus] couldn't register object path\n");
+        dbus_error_free(&error);
         return;
     }
 
diff-tree e2b78df5800fb4e3f0ed01b38a1974ba3577949c (from b55007d8cc9d20baa23d5de67683e414c827d3e5)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Nov 7 11:13:56 2006 +0200

    xkb: warning fix

diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index 86a40e0..139221f 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -816,7 +816,7 @@ XkbSrvInfoPtr	xkbi;
 		((xE[0].u.u.type==KeyPress)||(xE[0].u.u.type==KeyRelease))) {
 	    ErrorF("XKbFilterWriteEvents:\n");
 	    ErrorF("   Event state= 0x%04x\n",xE[0].u.keyButtonPointer.state);
-	    ErrorF("   XkbLastRepeatEvent!=xE (0x%x!=0x%x) %s\n",
+	    ErrorF("   XkbLastRepeatEvent!=xE (0x%p!=0x%p) %s\n",
 			XkbLastRepeatEvent,xE,
 			((XkbLastRepeatEvent!=(pointer)xE)?"True":"False"));
 	    ErrorF("   (xkbClientEventsFlags&XWDA)==0 (0x%x) %s\n",
diff-tree b55007d8cc9d20baa23d5de67683e414c827d3e5 (from f93d10ce9bb4a6de83b561f44fb7b046def16234)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Nov 7 11:13:32 2006 +0200

    SyntheticMotion: don't dereference sprite.screen when not using Xinerama

diff --git a/dix/events.c b/dix/events.c
index 68a2d38..e5701ee 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -330,7 +330,8 @@ static void ConfineToShape(RegionPtr sha
 static void PostNewCursor(void);
 
 #define SyntheticMotion(x, y) \
-    PostSyntheticMotion(x, y, sprite.screen->myNum, \
+    PostSyntheticMotion(x, y, noPanoramiXExtension ? 0 : \
+                              sprite.screen->myNum, \
                         syncEvents.playingEvents ? \
                           syncEvents.time.milliseconds : \
                           currentTime.milliseconds);
diff-tree f93d10ce9bb4a6de83b561f44fb7b046def16234 (from 389275d240e4ba19d62fda0f138a45c7ecb245ff)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Nov 6 18:33:45 2006 +0200

    dix: remove staggeringly broken vendor workarounds
    
    Dear SGI,
    No.
    
    Scant regards,
    Daniel

diff --git a/dix/events.c b/dix/events.c
index b5937e7..68a2d38 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3079,12 +3079,7 @@ EventSelectForWindow(register WindowPtr 
     if (wClient (pWin) == client)
     {
 	check = pWin->eventMask;
-#ifdef SGIMISC
-	pWin->eventMask =
-	    (mask & ~SGIMiscSpecialDestroyMask) | (pWin->eventMask & SGIMiscSpecialDestroyMask);
-#else
 	pWin->eventMask = mask;
-#endif
     }
     else
     {
@@ -3093,9 +3088,6 @@ EventSelectForWindow(register WindowPtr 
 	    if (SameClient(others, client))
 	    {
 		check = others->mask;
-#ifdef SGIMISC
-		mask = (mask & ~SGIMiscSpecialDestroyMask) | (others->mask & SGIMiscSpecialDestroyMask);
-#endif
 		if (mask == 0)
 		{
 		    FreeResource(others->resource, RT_NONE);
diff-tree 389275d240e4ba19d62fda0f138a45c7ecb245ff (from d585b4189aff8d7952847f75b19b4f092ab3b88b)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Nov 5 02:47:59 2006 +0200

    XkbCopyKeymap: don't iterate broken types, or dereference null pointers
    
    Don't iterate invalid destination types (>= num_types) when coping key
    types.
    Don't free key_aliases if it's NULL (theoretical, but sure).
    Make sure dst's label_font gets allocated if it's NULL.
    (Thanks, Chris Lee.)

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 627ab20..321bf2e 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -1047,34 +1047,40 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
             }
         }
 
-        if (src->map->types) {
-            if (src->map->size_types > dst->map->size_types) {
-                if (dst->map->types) {
+        if (src->map->types && src->map->num_types) {
+            if (src->map->num_types > dst->map->size_types ||
+                !dst->map->types || !dst->map->size_types) {
+                if (dst->map->types && dst->map->size_types) {
                     tmp = xrealloc(dst->map->types,
-                                   src->map->size_types * sizeof(XkbKeyTypeRec));
+                                   src->map->num_types * sizeof(XkbKeyTypeRec));
                     if (!tmp)
                         return FALSE;
                     dst->map->types = tmp;
                     bzero(dst->map->types +
-                            (dst->map->size_types * sizeof(XkbKeyTypeRec)),
-                          (src->map->size_types - dst->map->size_types) *
+                            (dst->map->num_types * sizeof(XkbKeyTypeRec)),
+                          (src->map->num_types - dst->map->size_types) *
                             sizeof(XkbKeyTypeRec));
                 }
                 else {
-                    tmp = xcalloc(src->map->size_types, sizeof(XkbKeyTypeRec));
+                    tmp = xcalloc(src->map->num_types, sizeof(XkbKeyTypeRec));
                     if (!tmp)
                         return FALSE;
                     dst->map->types = tmp;
                 }
             }
-            else if (src->map->size_types < dst->map->size_types) {
-                if (dst->map->types) {
-                    for (i = src->map->num_types, dtype = (dst->map->types + i);
-                         i < dst->map->size_types; i++, dtype++) {
-                        if (dtype->level_names)
-                            xfree(dtype->level_names);
-                        dtype->level_names = NULL;
-                        dtype->num_levels = 0;
+            else if (src->map->num_types < dst->map->num_types &&
+                     dst->map->types) {
+                for (i = src->map->num_types, dtype = (dst->map->types + i);
+                     i < dst->map->num_types; i++, dtype++) {
+                    if (dtype->level_names)
+                        xfree(dtype->level_names);
+                    dtype->level_names = NULL;
+                    dtype->num_levels = 0;
+                    if (dtype->map_count) {
+                        if (dtype->map)
+                            xfree(dtype->map);
+                        if (dtype->preserve)
+                            xfree(dtype->preserve);
                     }
                 }
             }
@@ -1082,16 +1088,18 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
             stype = src->map->types;
             dtype = dst->map->types;
             for (i = 0; i < src->map->num_types; i++, dtype++, stype++) {
-                if (stype->num_levels) {
+                if (stype->num_levels && stype->level_names) {
                     if (stype->num_levels != dtype->num_levels &&
-                        dtype->num_levels && dtype->level_names) {
+                        dtype->num_levels && dtype->level_names &&
+                        i < dst->map->num_types) {
                         tmp = xrealloc(dtype->level_names,
                                        stype->num_levels * sizeof(Atom));
                         if (!tmp)
                             continue;
                         dtype->level_names = tmp;
                     }
-                    else if (!dtype->num_levels || !dtype->level_names) {
+                    else if (!dtype->num_levels || !dtype->level_names ||
+                             i >= dst->map->num_types) {
                         tmp = xalloc(stype->num_levels * sizeof(Atom));
                         if (!tmp)
                             continue;
@@ -1102,7 +1110,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                            stype->num_levels * sizeof(Atom));
                 }
                 else {
-                    if (dtype->num_levels && dtype->level_names)
+                    if (dtype->num_levels && dtype->level_names &&
+                        i < dst->map->num_types)
                         xfree(dtype->level_names);
                     dtype->num_levels = 0;
                     dtype->level_names = NULL;
@@ -1114,15 +1123,17 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                 if (stype->map_count) {
                     if (stype->map) {
                         if (stype->map_count != dtype->map_count &&
-                            dtype->map_count && dtype->map) {
+                            dtype->map_count && dtype->map &&
+                            i < dst->map->num_types) {
                             tmp = xrealloc(dtype->map,
                                            stype->map_count *
                                              sizeof(XkbKTMapEntryRec));
                             if (!tmp)
                                 return FALSE;
                             dtype->map = tmp;
-                       }
-                        else if (!dtype->map_count || !dtype->map) {
+                        }
+                        else if (!dtype->map_count || !dtype->map ||
+                                 i >= dst->map->num_types) {
                             tmp = xalloc(stype->map_count *
                                            sizeof(XkbKTMapEntryRec));
                             if (!tmp)
@@ -1136,7 +1147,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
 
                     if (stype->preserve) {
                         if (stype->map_count != dtype->map_count &&
-                            dtype->map_count && dtype->preserve) {
+                            dtype->map_count && dtype->preserve &&
+                            i < dst->map->num_types) {
                             tmp = xrealloc(dtype->preserve,
                                            stype->map_count *
                                              sizeof(XkbModsRec));
@@ -1144,7 +1156,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                                 return FALSE;
                             dtype->preserve = tmp;
                         }
-                        else if (!dtype->preserve || !dtype->map_count) {
+                        else if (!dtype->preserve || !dtype->map_count ||
+                                 i >= dst->map->num_types) {
                             tmp = xalloc(stype->map_count *
                                          sizeof(XkbModsRec));
                             if (!tmp)
@@ -1179,14 +1192,14 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                         xfree(dtype->level_names);
                     if (dtype->map && dtype->map_count)
                         xfree(dtype->map);
-                    if (dtype->preserve && dtype->preserve)
+                    if (dtype->preserve && dtype->map_count)
                         xfree(dtype->preserve);
                 }
                 xfree(dst->map->types);
                 dst->map->types = NULL;
             }
         }
-        dst->map->size_types = src->map->size_types;
+        dst->map->size_types = src->map->num_types;
         dst->map->num_types = src->map->num_types;
 
         if (src->map->modmap) {
@@ -1957,7 +1970,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
             dst->geom->num_key_aliases = dst->geom->sz_key_aliases;
         }
         else {
-            if (dst->geom->sz_key_aliases) {
+            if (dst->geom->sz_key_aliases && dst->geom->key_aliases) {
                 xfree(dst->geom->key_aliases);
                 dst->geom->key_aliases = NULL;
             }
@@ -1967,13 +1980,16 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
         
         /* font */
         if (src->geom->label_font) {
-            if (strlen(src->geom->label_font) !=
+            if (!dst->geom->label_font) {
+                tmp = xalloc(strlen(src->geom->label_font));
+                if (!tmp)
+                    return FALSE;
+                dst->geom->label_font = tmp;
+            }
+            else if (strlen(src->geom->label_font) !=
                 strlen(dst->geom->label_font)) {
-                if (dst->geom->label_font)
-                    tmp = xrealloc(dst->geom->label_font,
-                                   strlen(src->geom->label_font));
-                else
-                    tmp = xalloc(strlen(src->geom->label_font));
+                tmp = xrealloc(dst->geom->label_font,
+                               strlen(src->geom->label_font));
                 if (!tmp)
                     return FALSE;
                 dst->geom->label_font = tmp;
diff-tree d585b4189aff8d7952847f75b19b4f092ab3b88b (from b6d7b537ed8975363ad0f7c4180a62822358e418)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:47:55 2006 +0200

    xkb: fix uninitialised warning
    
    Fix uninitialised warning with memset(); we never actually use it
    uninitialised, but gcc doesn't know that.

diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 0cbf8d0..e0bf89c 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -868,6 +868,10 @@ XkbStateRec	old;
 unsigned	mods,mask,oldCoreState = 0,oldCorePrevState = 0;
 xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device);
 
+    /* never actually used uninitialised, but gcc isn't smart enough
+     * to work that out. */
+    memset(&old, 0, sizeof(old));
+
     if ((filter->keycode!=0)&&(filter->keycode!=keycode))
 	return 1;
 
diff-tree b6d7b537ed8975363ad0f7c4180a62822358e418 (from 8ba0c7b62c78dead722b0c8aa414f37bac4414b7)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:43:22 2006 +0200

    os: fix sun extensions test
    
    'else if' is not very valid, plus the logic is kind of broken, so just
    move it outside the ifdef in the first place.

diff --git a/os/utils.c b/os/utils.c
index 65e1311..9824501 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -55,11 +55,13 @@ OR PERFORMANCE OF THIS SOFTWARE.
 
 /* The world's most shocking hack, to ensure we get clock_gettime() and
  * CLOCK_MONOTONIC. */
+#ifdef sun              /* Needed to tell Solaris headers not to restrict to */
+#define __EXTENSIONS__  /* only the functions defined in POSIX 199309.       */
+#endif
+
 #ifdef _POSIX_C_SOURCE
 #define _SAVED_POSIX_C_SOURCE _POSIX_C_SOURCE
 #undef _POSIX_C_SOURCE
-#else if defined(sun)	/* Needed to tell Solaris headers not to restrict to */
-#define __EXTENSIONS__	/* only the functions defined in POSIX 199309.       */
 #endif
 #define _POSIX_C_SOURCE 199309L
 #include <time.h>
diff-tree 8ba0c7b62c78dead722b0c8aa414f37bac4414b7 (from c3ea1f7db494365032526dc06a7283384bd0ecd1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:41:03 2006 +0200

    xace: avoid 'unused variable pScreen'
    
    Initialise pScreen explicitly, as REGION_* macros ignore pScreen.

diff --git a/Xext/xace.c b/Xext/xace.c
index 14a5e79..7f7944a 100644
--- a/Xext/xace.c
+++ b/Xext/xace.c
@@ -406,12 +406,14 @@ XaceCensorImage(client, pVisibleRegion, 
     unsigned int format;
     char * pBuf;
 {
-    ScreenPtr pScreen = pDraw->pScreen;
+    ScreenPtr pScreen;
     RegionRec imageRegion;  /* region representing x,y,w,h */
     RegionRec censorRegion; /* region to obliterate */
     BoxRec imageBox;
     int nRects;
 
+    pScreen = pDraw->pScreen;
+
     imageBox.x1 = x;
     imageBox.y1 = y;
     imageBox.x2 = x + w;
diff-tree c3ea1f7db494365032526dc06a7283384bd0ecd1 (from 3a9b96425851b495503bd2eb0fd0d01c08f6a097)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:38:31 2006 +0200

    dix/mi: still more warning fixes
    
    Fix up prototypes for PrintChildren and PrintWindowTree in the dix.
    Make miPrintRegion be unconditionally defined, and move the prototype into
    regionstr.h.
    Change a bunch of ScreenPtr pScreen = foo; to
    ScreenPtr pScreen; pScreen = foo; in window.c, so we avoid unused variable
    references (as inline REGION_* doesn't reference pScreen).

diff --git a/dix/window.c b/dix/window.c
index 3dfeda3..f0079e0 100644
--- a/dix/window.c
+++ b/dix/window.c
@@ -187,7 +187,7 @@ _X_EXPORT int deltaSaveUndersViewable = 
  *    For debugging only
  ******/
 
-int
+static void
 PrintChildren(WindowPtr p1, int indent)
 {
     WindowPtr p2;
@@ -197,14 +197,15 @@ PrintChildren(WindowPtr p1, int indent)
     {
 	p2 = p1->firstChild;
 	for (i=0; i<indent; i++) ErrorF( " ");
-	ErrorF( "%x\n", p1->drawable.id);
+	ErrorF( "%lx\n", p1->drawable.id);
 	miPrintRegion(&p1->clipList);
 	PrintChildren(p2, indent+4);
 	p1 = p1->nextSib;
     }
 }
 
-PrintWindowTree()
+static void
+PrintWindowTree(void)
 {
     int i;
     WindowPtr pWin, p1;
@@ -547,9 +548,11 @@ ClippedRegionFromBox(register WindowPtr 
                      register int x, register int y,
                      register int w, register int h)
 {
-    ScreenPtr pScreen = pWin->drawable.pScreen;
+    ScreenPtr pScreen;
     BoxRec box;
 
+    pScreen = pWin->drawable.pScreen;
+
     box = *(REGION_EXTENTS(pScreen, &pWin->winSize));
     /* we do these calculations to avoid overflows */
     if (x > box.x1)
@@ -1663,7 +1666,8 @@ CreateUnclippedWinSize (register WindowP
     pRgn = REGION_CREATE(pWin->drawable.pScreen, &box, 1);
 #ifdef SHAPE
     if (wBoundingShape (pWin) || wClipShape (pWin)) {
-	ScreenPtr pScreen = pWin->drawable.pScreen;
+	ScreenPtr pScreen;
+        pScreen = pWin->drawable.pScreen;
 
 	REGION_TRANSLATE(pScreen, pRgn, - pWin->drawable.x,
 			 - pWin->drawable.y);
@@ -1699,7 +1703,8 @@ SetWinSize (register WindowPtr pWin)
 			 (int)pWin->drawable.height);
 #ifdef SHAPE
     if (wBoundingShape (pWin) || wClipShape (pWin)) {
-	ScreenPtr pScreen = pWin->drawable.pScreen;
+	ScreenPtr pScreen;
+        pScreen = pWin->drawable.pScreen;
 
 	REGION_TRANSLATE(pScreen, &pWin->winSize, - pWin->drawable.x,
 			 - pWin->drawable.y);
@@ -1741,7 +1746,8 @@ SetBorderSize (register WindowPtr pWin)
 		(int)(pWin->drawable.height + (bw<<1)));
 #ifdef SHAPE
 	if (wBoundingShape (pWin)) {
-	    ScreenPtr pScreen = pWin->drawable.pScreen;
+	    ScreenPtr pScreen;
+            pScreen = pWin->drawable.pScreen;
 
 	    REGION_TRANSLATE(pScreen, &pWin->borderSize, - pWin->drawable.x,
 			     - pWin->drawable.y);
@@ -1952,7 +1958,8 @@ MakeBoundingRegion (
     BoxPtr	pBox)
 {
     RegionPtr	pRgn;
-    ScreenPtr   pScreen = pWin->drawable.pScreen;
+    ScreenPtr   pScreen;
+    pScreen = pWin->drawable.pScreen;
 
     pRgn = REGION_CREATE(pScreen, pBox, 1);
     if (wBoundingShape (pWin)) {
diff --git a/include/regionstr.h b/include/regionstr.h
index 6c39324..e6882e7 100644
--- a/include/regionstr.h
+++ b/include/regionstr.h
@@ -321,4 +321,7 @@ extern void miRegionEmpty(
 extern BoxPtr miRegionExtents(
     RegionPtr /*pReg*/);
 
+extern void miPrintRegion(
+    RegionPtr /*pReg*/);
+
 #endif /* REGIONSTRUCT_H */
diff --git a/mi/miregion.c b/mi/miregion.c
index fdb538c..0db46dc 100644
--- a/mi/miregion.c
+++ b/mi/miregion.c
@@ -223,8 +223,7 @@ _X_EXPORT RegDataRec miEmptyData = {0, 0
 RegDataRec  miBrokenData = {0, 0};
 RegionRec   miBrokenRegion = { { 0, 0, 0, 0 }, &miBrokenData };
 
-#ifdef DEBUG
-int
+_X_EXPORT void
 miPrintRegion(rgn)
     RegionPtr rgn;
 {
@@ -242,9 +241,7 @@ miPrintRegion(rgn)
       ErrorF("%d %d %d %d \n",
 	     rects[i].x1, rects[i].y1, rects[i].x2, rects[i].y2);
     ErrorF("\n");
-    return(num);
 }
-#endif /* DEBUG */
 
 _X_EXPORT Bool
 miRegionEqual(reg1, reg2)
diff-tree 3a9b96425851b495503bd2eb0fd0d01c08f6a097 (from 6716488fa256798070017232405b107d5c985479)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:33:09 2006 +0200

    dix: add missing prototypes
    
    Add missing prototype for ffs, and include headers from ffs.c.
    Move PostSyntheticMotion prototype to input.h.

diff --git a/dix/events.c b/dix/events.c
index 3b1a0aa..b5937e7 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -327,7 +327,6 @@ static CARD8 criticalEvents[32] =
 
 #ifdef PANORAMIX
 static void ConfineToShape(RegionPtr shape, int *px, int *py);
-extern void PostSyntheticMotion(int x, int y, int screenNum, int time);
 static void PostNewCursor(void);
 
 #define SyntheticMotion(x, y) \
diff --git a/dix/ffs.c b/dix/ffs.c
index e25d715..f84f7b4 100644
--- a/dix/ffs.c
+++ b/dix/ffs.c
@@ -26,6 +26,12 @@ The Open Group.
 
 */
 
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include "dix.h"
+
 int
 ffs(int i)
 {
diff --git a/include/dix.h b/include/dix.h
index f346b43..983a84f 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -701,6 +701,8 @@ extern Bool AllocateClientPrivate(
     int /*index*/,
     unsigned /*amount*/);
 
+extern int ffs(int i);
+
 /*
  *  callback manager stuff
  */
diff --git a/include/input.h b/include/input.h
index f2fe6d1..e7017cb 100644
--- a/include/input.h
+++ b/include/input.h
@@ -418,6 +418,12 @@ extern int GetProximityEvents(
     int num_valuators,
     int *valuators);
 
+extern void PostSyntheticMotion(
+    int x,
+    int y,
+    int screenNum,
+    unsigned long time);
+
 extern int GetMotionHistorySize(
     void);
 
diff-tree 6716488fa256798070017232405b107d5c985479 (from 51813d77bfb84609a58a98e678efe9b6c0bf5503)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:30:23 2006 +0200

    dix: remove unused debug code

diff --git a/dix/main.c b/dix/main.c
index 203773a..88d7755 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -701,9 +701,6 @@ AddScreen(
     int i;
     int scanlinepad, format, depth, bitsPerPixel, j, k;
     ScreenPtr pScreen;
-#ifdef DEBUG
-    void	(**jNI) ();
-#endif /* DEBUG */
 
     i = screenInfo.numScreens;
     if (i == MAXSCREENS)
@@ -737,13 +734,6 @@ AddScreen(
     pScreen->ClipNotify = 0;	/* for R4 ddx compatibility */
     pScreen->CreateScreenResources = 0;
     
-#ifdef DEBUG
-    for (jNI = &pScreen->QueryBestSize; 
-	 jNI < (void (**) ()) &pScreen->SendGraphicsExpose;
-	 jNI++)
-	*jNI = NotImplemented;
-#endif /* DEBUG */
-
     /*
      * This loop gets run once for every Screen that gets added,
      * but thats ok.  If the ddx layer initializes the formats
diff-tree 51813d77bfb84609a58a98e678efe9b6c0bf5503 (from 844090a5b557705dd0adce2b7ed98813b5104d85)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:29:05 2006 +0200

    dix: remove unused variable

diff --git a/dix/main.c b/dix/main.c
index 81350cc..203773a 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -249,7 +249,6 @@ main(int argc, char *argv[], char *envp[
     int		i, j, k, error;
     char	*xauthfile;
     HWEventQueueType	alwaysCheckForInput[2];
-    CursorMetricRec cm;
 
     display = "0";
 
diff-tree 844090a5b557705dd0adce2b7ed98813b5104d85 (from 61b570d0c1eb448f0aa08b4598118f0d43bc7345)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:21:29 2006 +0200

    xfree86/xf86misc: warning fixes

diff --git a/hw/xfree86/common/xf86MiscExt.c b/hw/xfree86/common/xf86MiscExt.c
index 375226a..6524284 100644
--- a/hw/xfree86/common/xf86MiscExt.c
+++ b/hw/xfree86/common/xf86MiscExt.c
@@ -247,7 +247,6 @@ _X_EXPORT Bool
 MiscExtSetMouseDevice(pointer mouse, char* device)
 {
     mseParamsPtr mse = mouse;
-
     mse->device = device;
     
     return TRUE;
@@ -256,9 +255,6 @@ MiscExtSetMouseDevice(pointer mouse, cha
 _X_EXPORT Bool
 MiscExtGetKbdSettings(pointer *kbd)
 {
-    kbdParamsPtr kbdptr;
-    InputInfoPtr pInfo;
-
     DEBUG_P("MiscExtGetKbdSettings");
 
     return FALSE;
diff-tree 61b570d0c1eb448f0aa08b4598118f0d43bc7345 (from c51fadc07d938f6a3edfd5620170fcb7d6486a11)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:21:09 2006 +0200

    xfree86/os-support: update prototype for OSRingBell

diff --git a/hw/xfree86/os-support/xf86_OSproc.h b/hw/xfree86/os-support/xf86_OSproc.h
index 0311b81..1bbbf56 100644
--- a/hw/xfree86/os-support/xf86_OSproc.h
+++ b/hw/xfree86/os-support/xf86_OSproc.h
@@ -150,7 +150,7 @@ extern Bool xf86DisableInterrupts(void);
 extern void xf86EnableInterrupts(void);
 extern void xf86SetTVOut(int);
 extern void xf86SetRGBOut(void);
-extern void xf86SoundKbdBell(int, int, int);
+extern void xf86OSRingBell(int, int, int);
 #if defined(QNX4)
 #pragma aux xf86BusToMem modify [eax ebx ecx edx esi edi];
 #pragma aux xf86MemToBus modify [eax ebx ecx edx esi edi];
diff-tree c51fadc07d938f6a3edfd5620170fcb7d6486a11 (from 578899139f133746634a7bf8845e25362b5dfca2)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 21:20:45 2006 +0200

    mieq: annotate with some more comments

diff --git a/mi/mieq.c b/mi/mieq.c
index be76580..80915fd 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -58,7 +58,7 @@ typedef struct _Event {
     xEvent          event[7];
     int             nevents;
     ScreenPtr	    pScreen;
-    DeviceIntPtr    pDev;
+    DeviceIntPtr    pDev; /* device this event _originated_ from */
 } EventRec, *EventPtr;
 
 typedef struct _EventQueue {
@@ -136,7 +136,9 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e
     	newtail = oldtail + 1;
     	if (newtail == QUEUE_SIZE)
 	    newtail = 0;
-    	/* Toss events which come in late */
+    	/* Toss events which come in late.  Usually this means your server's
+         * stuck in an infinite loop somewhere, but SIGIO is still getting
+         * handled. */
     	if (newtail == miEventQueue.head) {
             ErrorF("tossed event which came in late\n");
 	    return;
@@ -200,6 +202,8 @@ mieqProcessInputEvents()
             else
                 ++miEventQueue.head;
 
+            /* If this is a core event, make sure our keymap, et al, is
+             * changed to suit. */
             if (e->event[0].u.u.type == KeyPress ||
                 e->event[0].u.u.type == KeyRelease) {
                 SwitchCoreKeyboard(e->pDev);
diff-tree 578899139f133746634a7bf8845e25362b5dfca2 (from ae58d349c1cf5d63ad3616c485baa858350978d5)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Nov 4 20:35:55 2006 +0200

    RemoveGeneralSocket: don't touch EnabledDevices
    
    RemoveGeneralSocket.  Harmless, but.

diff --git a/os/connection.c b/os/connection.c
index cdd1d18..95c5500 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -1091,7 +1091,6 @@ AddEnabledDevice(int fd)
 _X_EXPORT void
 RemoveGeneralSocket(int fd)
 {
-    FD_CLR(fd, &EnabledDevices);
     FD_CLR(fd, &AllSockets);
     if (GrabInProgress)
 	FD_CLR(fd, &SavedAllSockets);
diff-tree ae58d349c1cf5d63ad3616c485baa858350978d5 (from 96f78e3886791b723ccd9ba40bea701603537b0c)
Author: Laurence Withers <l at lwithers.me.uk>
Date:   Sat Nov 4 19:34:37 2006 +0200

    CreateColormap: fix return value (bug #7083)
    
    Return BadMatch when an unsupported visual type is given, not BadValue --
    this is correct according to the spec.

diff --git a/dix/dispatch.c b/dix/dispatch.c
index d8e3ae7..26cb544 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -2520,7 +2520,7 @@ ProcCreateColormap(register ClientPtr cl
 	    return(result);
     }
     client->errorValue = stuff->visual;
-    return(BadValue);
+    return(BadMatch);
 }
 
 int
diff-tree 96f78e3886791b723ccd9ba40bea701603537b0c (from 5a40448f2d0ac2c86c617bebe3fb649174bf0d7f)
Author: Erik Andren <erik.andren at gmail.com>
Date:   Sat Nov 4 19:29:49 2006 +0200

    remove XFree86 changelogs (bug #7262)
    
    Without being able to tie these to specific commits, the text changelog is
    useless, as well as being huge.

diff --git a/hw/xfree86/doc/changelogs/CHANGELOG b/hw/xfree86/doc/changelogs/CHANGELOG
deleted file mode 100644
index a8d6dff..0000000
--- a/hw/xfree86/doc/changelogs/CHANGELOG
+++ /dev/null
@@ -1,18691 +0,0 @@
-XFree86 4.4.0 (29 February 2004)
- 821. Fix Radeon secondary head register initialization (Hui Yu at ATI,
-      Benjamin Herrenschmidt).
- 820. ati & atimisc module changes (Marc La France)
-      - Allow builds with ATIAvoidNonPCI && !ATIAvoidCPIO;
-      - Make handling of unknown Radeon's saner;
-      - Add private option to re-enable BIOS display switches;
-      - Deal with ati & atimisc module version skews;
-      - Fix private option handling;
- 819. Fix rendition driver system lockup on changes to text mode
-      (Bugzilla #1204, Eric Wittry).
- 818. Make the "fp=n" TTCap option behave the same with the FreeType backend
-      as with the X-TT backend (Bugzilla #1163, Chisato Yamauchi).
- 817. Fix the disappearance of the RAW_ASCENT, RAW_DESCENT, RAW_PIXEL_SIZE,
-      and RAW_POINT_SIZE properties for the FreeType backend (Bugzilla #1163,
-      Chisato Yamauchi).
- 816. Fix a FreeType backend problem with the font ascent/descent being
-      incorrect with some fonts (Bugzilla #1163, Chisato Yamauchi, reported by
-      Michael Lampe).
- 815. Fix for detection of hardwired panel for the via driver (Bugzilla #813,
-      Luc Verhaegen, reported by Johannes Specht).
- 814. Fix missing ';' in via_driver.c hidden by an empty macro (Bugzilla #813,
-      Luc Verhaegen).
- 813. Add FT_Get_Postscript_Name() to the freetype2 export list for OS/2.
-      This is needed for the recent PostScript fontname property fix
-      (Bugzilla #1189, Frank Giessler).
- 812. Fix MGA driver for big endian and EXTRADEBUG compilation (derived from
-      #6132, Rene Rebe).
- 811. Turn off the GetDisplayInfo BIOS call by default and add an option 
-      to turn it back on in the i810 driver. This fixes some lockup
-      problems found with some Dell BIOS' (Alan Hourihane, Alain Poirier).
- 810. Fix compile issue in imstt driver (#6140, Rene Rebe)
- 809. Only reset primary head of a Radeon (#6133, Rene Rebe).
- 808. Fix big-endian typo in xf86CopyYUV12ToPacked (#6131, Rene Rebe).
- 807. Fix neomagic white screen/lockup bug introduced in 4.3.99.15 (Bugzilla
-      #1179, #1157, David Dawes).
- 806. Fixing DPMS: let modification of DPMS timeout take effect immeditately,
-      don't activate DPMS when disabled (Egbert Eich).
-
-XFree86 4.3.99.903 (15 February 2004)
- 805. Resync the pci.ids data with pciids.sf.net (2004-02-15 snapshot).
- 804. Improve X server performance on OS/2 when using TCP transport:
-       - Let the server set TCP_NODELAY, et al.
-       - Change the behavior of os2PseudoSelect() on sockets.
-      (Bugzilla #1175, Frank Giessler).
- 803. X server on OS/2 doesn't respect AutoRepeat on/off unless XKB is disabled
-      (Bugzilla #1174, Frank Giessler).
- 802. Licence update.
- 801. Optimise SlowBcopy() for ia64 architecture (Marc La France).
- 800. Simplify vgaHWSaveFonts() and vgaHWRestoreFonts() to fix hangs seen with
-      certain nVidia boards on ZX1-based systems (Marc La France).
- 799. Some more font path checks.
- 798. Don't define X_LOCALE on Panther (Etsushi Kato and Toshimitsu Tanaka).
- 797. Fix GL_VERSION string for indirect rendering (Bugzilla #1147, DRI Project)
- 796. Fix the 1024x576 modes in the via driver (Bugzilla #812, Luc Verhaegen,
-      reported by Julian Cable).
- 795. Add uz_UZ locale (Bugzilla #1151, Mashrab Kuvatov).
- 794. Fix font alias overrun.
- 793. Fix for the way the FreeType backend sets the
-      _ADOBE_POSTSCRIPT_FONTNAME property for Type1 fonts (Bugzilla #1123,
-      David Dawes, based on Roland Mainz, reported by David Capshaw).
- 792. Fix formatting of the XLookupString bytes that xev prints out (Bugzilla
-      #1153, Noah Levitt).
- 791. Likely fix for FreeBSD 5.2 libGL build problem (David Dawes, reported by
-      Terry R. Friedrichsen).
- 790. Fix typo in bsd_mouse.c (Tyler Retzlaff).
- 789. Fix off-by-one errors in the emulation of an ix86's BT, BTS, BTR and BTC
-      instructions (Marc La France).
- 788. Fixing segfaults that may happen in some corner cases on VT switch
-      and int10 initialization (Egbert Eich).
- 787. Increase PCI I/O space size on Linux/PowerPC (Bugzilla #1143,
-      Paul Mackerras).
- 786. Fix DRI cleanup at exit and re-enabling on reset for the via driver
-      (Bugzilla #998, Thomas Hellström).
- 785. Fix Xv error propagation to the client for the via driver (Bugzilla #998,
-      Thomas Hellström).
- 784. Fix a problem when utilizing DrawArrays when indirect rendering
-      (Bugzilla #1142, DRI Project).
- 783. Xterm followup fix for Bugzilla #981 (Thomas Dickey).
- 782. Fix EXT version of vertex arrays (DRI Project).
- 781. Fix long-standing off-by-one bug in calculating dimensions of single
-      (private) back cliprect when the window is partially offscreen in
-      libdri.a (Keith Whitwell)
- 780. Don't do the MGAISBUSY() loop in MGAStormSync() for Mystique cards
-      because this reportedly results in an infinite loop (Bugzila #85,
-      David Dawes, reported by Phil ??? and Stéphane VOLTZ).
- 779. Make sure the r128 driver enables the hsync and vsync signals after
-      programming a video mode (Bugzilla #935, Kevin Martin).
- 778. Fix Multitexture problems with vertex arrays and indirect rendering
-      (Bugzilla #1092, DRI Project).
- 777. Fix SecondaryColor & FogColor when indirect rendering (Bugzilla #1091, 
-      DRI Project).
- 776. Fix build failures on Mac OS X 10.1.x (Torrey T. Lyons).
- 775. Fix a timing problem in the nsc driver that prevents the display from
-      working in some cases (Bugzilla #840, Hansruedi Glauser, Alan Hourihane).
- 774. Via driver workaround to handle setting WC for the video memory when
-      initially only part of it has WC set (Bugzilla #1010 Thomas Hellström).
- 773. Fix the XAA clipping flags for the via driver, which fixes a line
-      drawing problem seen with OpenOffice Calc (Bugzilla #1026,
-      Thomas Hellström).
- 772. HKSCS and GB18030 support for luit (Bugzilla #1048, Zarick Lau).
- 771. Fix some remaining memory allocation related problems with the via
-      driver (Bugzilla #998, Thomas Hellström).
- 770. Add a UseRpath build switch to allow the use of -rpath to be enabled
-      or disabled from the host.def file.  Implemented for *BSD, Hurd, Linux.
-      The default settings remains as before (David Dawes).
- 769. Add a root window property called XFree86_VT that holds the VT number
-      that the XFree86 server is running on (Andrew Aitcheson, suggested by
-      Samuel Thibault).
- 768. Fix a problem where root window properties registered with
-      xf86RegisterRootWindowProperty() are not re-registered after server
-      regeneration (David Dawes, reported by Samuel Thibault).
- 767. Fix xtest failures for the savage driver's zero width lines by
-      removing the TwoPointLine and using only the Bresenham version
-      (reported by Nicolas Joly).
- 766. Fix refresh rate setting for 845G/856G systems that don't support the
-      Intel-specific refresh rate BIOS calls (Bugzilla #1106, David Dawes,
-      reported by Lucian Precup).
- 765. Fixes/build updates for BSD/OS 5.1 and 4.3.1 (Bugzilla #1111, Kurt Lidl).
- 764. Fix a problem in libXmu's FindChildren() that can cause a crash by
-      copying memory from outside the bounds of an array (Bugzilla #1109,
-      John Tillman).
- 763. Add missing TimerCallback in trident_video.c to shutdown the video.
-      This could account for many peoples lockups with video on Trident chips.
-      Also, add a Wait for vsync when programming video modes to avoid lockups.
-      (Yukun Chen, Alan Hourihane).
- 762. Fix a lockup problem on Trident Blade3D engines by permanently turning
-      on PCI Retry. Also sync the engine on CloseScreen and LeaveVT.
-      (Yukun Chen, Alan Hourihane).
- 761. Fix getaddrinfo() return value check in SmsGenerateClientID() that was
-      causing a crash when the current hostname is unresolved, and returning
-      a NULL id otherwise (Bugzilla #1096, David Dawes).
- 760. Support automatic configuration of the X server on OpenBSD with 
-      wsmouse-supported mices. (Matthieu Herrb).
- 759. Updates for XKB keyboard maps:
-      - Add Tibetan/Dzongkha keyboard layout (Bugzilla #1082, Gregory Mokhin).
-      - Add three new Internet/multimedia keyboard descriptions
-        (Bugzilla #1088, Radics Laszlo).
- 758. Add overlooked SecondaryColor entries to AppleDRI indirect dispatch
-      table (Torrey T. Lyons).
- 757. Allocate pBIOSInfo->UserSetting in the via driver, which fixes a crash
-      (James Harris).
- 756. Fix Linux drm kernel modules to handle the nopage() prototype change in
-      Linux 2.6.1 (Michel Dänzer, from DRI CVS).
- 755. Fix use of dynamic xcursors on OS/2 (Bugzilla #1087, Frank Giessler).
- 754. Fix the fbdev driver so that it allows 24-bit pixel size, and disable
-      the RandR extension when rotation is enabled (Jonathan Thambidurai).
- 753. Rendition driver fixes:
-       - Fix the mode size limits so that the set of modes that the driver
-         accepts isn't unnecessarily restricted.
-       - Fix color palette refreshing after VT switching.
-       - Fix a core dump at server exit with the hardware cursor was enabled.
-       - Add checking for supported depths.  Without this the server could
-         crash if an unsupported depth was specified.
-      (Eric Wittry)
- 752. Update XKB registry file rules/xfree86.xml (Sergey Oudaltsov).
- 751. Fix some rules in en_US.UTF-8 Compose file (Bugzilla #1071,
-      Matthew Fischer).
- 750. Add some content (supported hardware and driver options) to the tdfx(4)
-      man page (Bugzilla #1068, Nicolas Joly).
- 749. Make '-pn' (partial network) the default for all X servers, and document
-      the '-nopn' option (David Dawes).
- 748. Allow rstartd.real to be installed into a location other than LIBDIR
-      (#6034, Luke Mewburn).
- 747. Allow xdm's chooser to be installed into a directory other than LIBDIR
-      (#6033, Luke Mewburn).
- 746. Add XKB description for the Logitech Access keyboard (#6026,
-      Michael Geddes).
- 745. Fix typo in computing xterm's relative font size (Jess Thrysoee).
- 744. Fix typo in savage man page (Bugzilla #1065, Nicolas Joly).
- 743. Fix for xf86Msg() call with swapped arguments (Bugzilla #1064,
-      Nicolas Joly).
- 742. Set the dependencies correctly for SCO shared libraries, and use gcc
-      for linking instead of ld (Bugzilla #1045, Kean Johnston).
- 741. Some cleanups for the SCO support, and a few changes required for
-      compilation on UnixWare (Bugzilla #1045, Kean Johnston).
- 740. Make the X server lock file code treat the display string in the same
-      way as the local listener code (i.e., convert it to an integer then back
-      to a string).  This fixes a problem where an non-numeric display
-      argument could cause a second server to be started on display :0,
-      replacing the local listener nodes for the original server.
-      (Bugzilla #1056, David Dawes, reported by Robin Schoonover).
- 739. Fix xfs and xdm core dumps in BecomeOrphan(), and rework/simplify
-      the BecomeDaemon() code (Bugzilla #1060, #1074, David Dawes, 
-      reported by Martin Birgmeier).
- 738. Add a "VBERestore" option for the i830 part of the i810 driver, to
-      allow the VBE restore bug workaround to be disabled.  This is needed
-      for correct text mode restoration on some 830M-based machines
-      (David Dawes, reported by Martin van Es).
- 737. Fix memory leak when list of registered renderers are cleared at the
-      start of each new server generation (Kevin Martin and Rik Faith).
- 736. Fix memory double freeing at XIM destroying in imLcIm.c (Ivan Pascal,
-      reported: Bugzilla #1015).
- 735. Add xkb keymap for Microsoft Mutimedia Keyboard keys (Bugzilla #1052,
-      Jacques Legare).
- 734. Update Compose file for en_US.UTF-8 locale (Bugzilla #1053,
-      Matthew Fischer) and fix wrong comment signs there (Ivan Pascal).
- 733. VIA driver fixes:
-       - Restructure the via driver's cache allocation to work with both
-	 the VIA and new open DRI module, and remove the now unneeded
-	 version check (Thomas Hellström, Alan Cox, bugzilla #998).
-       - Remove special case lindvd hack (Alan Cox)
-       - Add support for Xv when unaccelerated (Thomas Hellström)
-      (Bugzilla #998, #1020, #1021).
- 732. Check for a NULL argument in XSetICFocus() before dereferencing it.
-      This fixes crashes with some XIM software (see
-      http://bugzilla.mozilla.gr.jp/show_bug.cgi?id=2961#c19).
- 731. Improve the i810 bitblt bug workaround, and re-enable the pixmap cache
-      at depth 24 (David Dawes).
- 730. Workaround for lockup at mode switch with an i810 (David Dawes).
- 729. Fix transparent mono 8x8 pattern fills for the i810 (David Dawes).
- 728. Disable XKB by default in XDarwin (Torrey T. Lyons).
- 727. Fix manpage build warnings on Panther (Matthieu Herrb).
- 726. Make sure that the ring buffer is flushed in I810CloseScreen().  This
-      fixes unpredictable behaviour that sometimes shows up after server
-      exit/restart or server reset, including memory corruption, spontaneous
-      reboots, etc, and some odd xtest behaviour (David Dawes).
- 725. Xdmcp fixes for IPv6 and mixed IPv6/IPv4 operation. (Mario Klebsch, 
-      Matthieu Herrb).
- 724. Update rman by merging XFree86 changes to rman 3.2 (Thomas Dickey).
- 723. Create fonts.scale and fonts.dir files in the target directories at
-      'make install' time.  This fixes several problems where some font
-      entries get left out (David Dawes).
- 722. Add the Bitstream Vera fonts (Bitstream, Inc and The Gnome Project).
- 721. Xterm patches #183, #184 (Thomas Dickey).
- 720. Build fix for the Chips driver on Linux/arm (#6011, Michel Dänzer and
-      Othmar Pasteka).
- 719. Change v4l "norm" names to the bttv versions (#5993,
-      Marco Antonio Alvarez).
- 718. Fix for symbols/hr map (#5991, Vlatko Kosturjak).
- 717. The current VIA DRI driver isn't remotely compatible with the current
-      code, so make sure it isn't loaded by requiring version 2.0.0 or later
-      (Alan Cox).
- 716. Fix VIA KM400 memory detection (Luc Verhaegen, Bugzilla #813).
- 715. Fix a long standing VIA Xv problem with totem/xine and YUV surface
-      types (Uberto Barbini).
- 714. VIA driver updates/fixes:
-       - Remove HARDWARE_NEEDS_PROGRAMMED_ORIGIN (Bugzilla #1011).
-       - Allocate the UserSetting structure and use it. Changed the names so
-         its uses can be tracked through the tree (Bugzilla #1006, #1014).
-       - Remove dead FIFO handling code.
-       - Clean up formatting in via_bios.h, via_driver.h.
-       - via_tuner module (1/2 of Bugzilla #1012, #1013):
-         + Add via_tuner structures and methods.
-         + Handle the back end work for boards with Philips SAA71xx
-           devices on the I2C bus providing one or two TV overlays.
-         + Handle CXA2104S audio decoder if present.
-         + Handle FI1236 TV tuners if present.
-       - Remove bogus DriverVersion, DriverName stuff.
-       - Xv updates (Bugzilla #1013):
-         + Remove DDR mode tables and compute supported overlay modes properly.
-         + Remove various bits of dead code.
-         + Probe for Tuners in the Xv setup.
-	 + Don't advertise XvImageMask on the tuner overlays - they can't do it.
-         + Clean up tuner channel computation.
-         + Make the property setting code use the via_tuner backend.
-         + Fix formatting of the various YUV copying loops.
-      (Alan Cox).
- 713. Add a missing code for jisx0208.1990-0.enc (Chisato Yamauchi).
- 712. Xtt2 update: Restore the behaviour of "bw" TTCap option for Netscape 4.x.
-      (Chisato Yamauchi).
- 711. Fix neomagic driver default mode selection to match the detected
-      panel size.  This allows it to work correctly with automatic
-      configuration (David Dawes).
- 710. Fixes and updates for XKB keyboard maps:
-      - Fix Armenian phonetic keymap (Bugzilla #1016, Ani).
-      - Fix rules for Brasilian ABNT2 keyboard (Ricardo Y. Igarashi).
-      - Add Shift+CapsLock group switcher (Ivan Pascal, see Bugzilla #1025).
-      - Update rules/xfree86.lst with missing descriptions (Ivan Pascal).
- 709. Build fix for Solaris Express (Bugzilla #1032, Alan Coopersmith).
- 708. Fix warning in lib/Xt/Alloc.c (Bugzilla #1035, Nicolas Joly).
- 707. Fix short overflow problem with box clipping in fb/fbcopy.c
-      (Bugzilla #978, Stephen McCamant).
- 706. Fix logic in xterm's get_pty() for platforms where old-style pty's are
-      preferred to /dev/ptmx (Bugzilla #997, Kean Johnston, Thomas Dickey).
- 705. Fix handling of eightBitInput for UTF-8 locales in xterm (Thomas Dickey).
- 704. Merge recent cygwin-related changes from freedesktop.org's config/cf
-      (Thomas Dickey).
- 703. Disable Xv in the via driver when acceleration is disabled (Alan Cox).
- 702. Fix bugs caused by empty PCI buses on ZX1-based systems (Marc La France).
- 701. Fix optional save/restore of BIOS area data in int10 module
-      (Marc La France).
- 700. Update Swedish localization of XDarwin GUI (Patrik Montgomery).
- 699. Fixes to build/run on cygwin (Thomas Dickey).  This includes a workaround
-      for _XtInherit by Ralf Habacker, needed to run applications such as xman.
- 698. Warning fixes for gcc 3.3.2 (Marc La France).
- 697. Fix file descriptor leaks in xdm (Marc La France).
- 696. Fix memory leaks in libFS (Marc La France).
- 695. Security fix:  change xdm to use mkstemp(), where available, instead of
-      mktemp() (Marc La France).
- 694. Update XKB registry file rules/xfree86.xml (Sergey Oudaltsov).
- 693. Fix for FreeType-related crash when attempting to draw a missing glyph
-      with constant-width fonts (Chisato Yamauchi).
-
-XFree86 4.3.99.902 (18 December 2003)
- 672. Fixes for xterm (Thomas Dickey):
-      - Add a limit-check in selection to fix a bug in triple-clicking
-        (Bugzilla #981)
-      - add -v/-version/-h/-help options to uxterm (Debian #223926)
- 671. Updates for SCO support (Bugzilla #994, Kean Johnston).
- 670. Don't build the Aiptek driver unless HasLinuxInput is set
-      (Bugzilla #972, Andrew Aitchison).
- 669. A new fixed version of the zh_CN.UTF-8 locale file (Bugzilla #991,
-      James Su).
- 668. Fix locale.dir/locale.alias bugs that break the zh_CN.GB2312 locale
-      (Bugzilla #990, James Su).
- 667. Fixes and updates for XKB keyboard maps:
-      - Add to 'us' keymap backslash key that can be rewritten in other layouts
-        (Bugzilla #976, Børre Gaup).
-      - Fix some keys in Georgian latin keymap (Bugzilla #985, Vano Beridze).
-      - Add Korean keymap (Jungshik Shin).
-      - Add French variant of 'dvorak' keymap (Josselin Mouette).
-      - Fix wrong key type in the 'keymap without special keys' (Ivan Pascal).
- 666. Via driver updates:
-       - Fix pixmap caches and Xv. The blitter has a 2048 pixel limit so we
-         must constrain the pixmap cache.
-       - Rip out all the memory allocator garbage and put it in one place.
-       - Allow optional use of AlanH's new linear allocator (not yet heavily
-         tested).
-       - Fix allocation bugs that this clean up made visible.
-       - Add missing I2C symbols.
-       - Some small formatting/other cleanups.
-      (Alan Cox).
- 665. Fix a problem with distinguishing unassigned characters in the FreeType
-      backend (Bugzilla #975, Roland Mainz, Chisato Yamauchi).
- 664. Update Japanese localization of XDarwin GUI (Toshimitsu Tanaka).
- 663. Fix setjmp-related build issues on Solaris 2.5.1/x86 (Lindsay Haigh).
- 662. Xdm, xf86cfg, mkfontscale and fonttosfnt fixes for platforms without
-      snprintf() (Lindsay Haigh).
- 661. Update Brazilian keyboard map (Ricardo Y. Igarashi).
- 660. Fix a bug in the fbgc.c code that caused the even stipple code path to
-      be used instead of the odd stipple path. Basically causing glitches in
-      rendering or no rendering at all. (Alan Hourihane).
- 659. Fix XDarwin crash in IOKit mode for certain screen resolutions
-      (Torrey T. Lyons).
- 658. DRI update - update the SiS DRI driver from DRI trunk (Eric Anholt).
- 657. Fix mouse wheel code again for PowerPC (#5990, Rene Rebe).
- 656. Fix sparc asm glapi initialisation in libGL when using indirect rendering
-      (GLX) (Bugzilla #923, Ferris McCormick).
- 655. Disable the OPTGX1SubsequentHorVertLine() function in the NSC Geode
-      GX1 driver to due problems falling back to the FillRectSolid function.
-      (Alan Hourihane, See Bugzilla #841 for reasons).
- 654. Add sun.unicode.india-0.enc (Bugzilla #939, JungShik Shin, Roland Mainz).
- 653. Fix an x86emu crash for a BIOS that references the FS (or GS) register
-      (Sergey Babkin).
- 652. Install the DRM kernel module source under ProjectRoot/src (David Dawes).
- 651. Update XKB registry file rules/xfree86.xml (Sergey Oudaltsov).
- 650. Fix '-nolisten tcp' when building with IPv6 disabled (Bugzilla #651,
-      Andrew Bevitt).
- 649. Add some missing dead-key compose sequences for Vietnamese (#5981,
-      Le Hong Boi).
- 648. Fix a problem with the v4l driver not seeing all the tv-norms
-      available under the bttv driver with the Linux 2.6.0-test11 kernel
-      (#5976, Marco Antonio Alvarez).
- 647. Build fix after recent REGION_* changes (Part of #5983, Oswald
-      Buddenhagen, and #5984, Alexander Stohr).
- 646. Fix for XKB map 'altwin' to avoid one keysym to more than one modifier
-      mapping (Ivan Pascal).
- 
-XFree86 4.3.99.901 ( 2 December 2003)
- 645. Update xterm's checking of modifiers to match change 635, and handle
-      the case of keys like Meta_L being in more than one modifier.  This
-      addresses an issue arising from Bugzilla #924 (David Dawes).
- 644. When XDM-AUTHORIZATION-1 is used with IPv6 IPv4-mapped addresses,
-      (which should not happen with change 643, but can be done with other 
-      xdm implementations) send the IPv4 address in the auth data; otherwise
-      send fake data for alignement purposes. (Matthieu Herrb).
- 643. Don't generate XDM-AUTHORIZATION-1 authentification data for 
-      IPv6 connections (Matthieu Herrb).
- 642. Fix fontconfig timestamp checking problem that shows up on JFS
-      (Bugzilla #932, Frank Giessler).
- 641. Restore VT ownership at XFree86 server exit on Linux.  Should do the
-      same for other platforms that change change VT ownership at startup
-      (Bugzilla #927, Andrew Bevitt).
- 640. Fix Mesa/GL problem on Linux with -mcpu=ultrasparc (reported by
-      Ferris McCormick).
- 639. Fix a problem connecting to an IPv4-only X server running on a
-      machine which happens to have an AAAA DNS record from a NetBSD or
-      OpenBSD host with IPv6 configured (Matthieu Herrb).
- 638. Don't use IPv6 sockets with IPv4-mapped addresses (::FFFF:w.x.y.z)
-      when making IPv4 connections with the "tcp" transport type.  This
-      fixes problems on platforms (such as FreeBSD 5.1) which disable
-      IPv4-mapped addresses by default.  It also fixes a problem with
-      XDM-AUTHORIZATION-1 for IPv4 connections with the default "tcp"
-      transport as reported in Bugzilla #903 (David Dawes).
- 637. Fix backward compatibility of Xlib+IPv6 for apps linked against a libc
-      without IPv6 support (David Dawes).
- 636. Restore the behaviour of scalable fonts.dir entries in directories with
-      the ":unscaled" attribute (Chisato Yamauchi, David Dawes, reported by
-      Mike Fabian).
- 635. Fix xmodmap's output of the modifiers map when the first column keysym
-      is empty (Ivan Pascal).
- 634. Fixes for XKB keyboard maps:
-      - fix Meta, Super, Hyper keysyms interpretation
-      - fix typo in rules/xfree86.xml (Ivan Pascal).
- 633. DRI updates.
-      - Latest kernel drivers from the DRI trunk.
-      - Fix FB_LOCATION in radeon driver (Michel Daenzer).
-      - Texture managment code consolidation (Ian Romanick)
-      - i830 stencil fix (Keith Whitwell)
-      - mga blend fixes (Ville Syrjala)
- 632. Fix a problem that prevented the i810 driver from using dot clocks less
-      than 12MHz (which appear to work) (Bugzilla #925, Richard Dengler).
- 631. Fix a server crash that can happen when loading some CID fonts
-      (Bugzilla #906, David Dawes).
- 630. Restructured version of the wacom driver, with support for TwinView,
-      fixed bugs and added filters (Bugzilla #537, Ping Cheng).
- 629. Fix libfontenc link failure on OS/2 (Bugzilla #921, Frank Giessler).
- 628. OS/2 fixes:
-       - Unable to connect to a font server.
-       - SIGFPE in GLX.
-      (Bugzila #920, Frank Giessler).
- 627. Add a missing entry to big5hkscs-0.enc (Bugzilla #917, Jungshik Shin).
- 626. Update libfreetype-xtt2 to version 1.1a:
-       - Fixed erroneous method of making up italic bitmap.
-      (Chisato Yamauchi, After X-TT Project).
- 625. OS/2 build fixes:
-       - Cleanup of bootstrap leftovers in xc/config/imake.
-       - Explicitly define int32_t and int64_t in Mesa.
-       - Missing Xft/Imakefile patch.
-      (Bugzilla #915, Frank Giessler).
- 624. Fix hide/unhide of XDarwin application with xpr when an AppleWM-aware
-      window manager is not present (Torrey T. Lyons).
- 623. Fix generic rootless code bug which caused the wrong region to be
-      damaged on window resize (Torrey T. Lyons).
- 622. Fix server crash when doing 'listwithinfo' of an outline font in
-      a directory marked ":unscaled" (Bugzilla #911, David Dawes).
- 621. Fix a key truncation problem with 'xauth add' (Bugzilla #903,
-      David Dawes).
- 620. With AppleDRI, don't use APPLE_fence as a replacement for NV_fence
-      calls (John Harper).
- 619. Fix intermittent XDarwin crash when quitting (Torrey T. Lyons).
- 618. Build fixes and updates for GNU/Hurd and GNU/K*BSD systems (Bugzilla
-      #907, #908, Robert Millan).
- 617. Xterm fixes (Bugzilla #893, #905, Thomas Dickey).
- 616. XDarwin fixes:
-       - Fix intermittent crash on XDarwin startup.
-       - Fix failure to redraw after resizing with cr implementation.
-       - Fix install failure when DESTDIR is specified (Reported by
-         Benjamin Reed).
-      (Torrey T. Lyons).
- 615. Add command line options to mkfontscale to enable/disable generation
-      of iso10646-1 lines (Bugzilla #885, Roland Mainz).
- 614. Add a more complete set of the encodings we support to mkfontscale
-      (Bugzilla #884, Roland Mainz).
- 613. Add ansi-1251 encoding file (Bugzilla #884, Roland Mainz).
- 612. Update XDMCP to use the IPv6 multicast address that has been assigned
-      by IANA.  Draft XDMCP 1.1 specs updated accordingly (Bugzilla #895,
-      Alan Coopersmith).
- 611. Add 'defined(VT_ACTIVATE)' to the test for platforms that support VT
-      switching (based on Bugzilla #894, Robert Millan).
- 610. Make several tests for glibc features glibc-specific rather than
-      specific to the underlying OS (Bugzila #890, 891, Robert Millan).
-
-XFree86 4.3.99.16 (20 November 2003)
- 609. Fix 'constype' for modern framebuffers on Solaris (Bugzilla #890,
-      Alan Coopersmith).
- 608. Fix a thread deadlock problem in libXp (Bugzilla #887, Roland Mainz).
- 607. Fix event buffer overrun in the wacom driver (Bugzilla #882, David Dawes,
-      reported by Jonathan Hough).
- 606. Add unmapping code to DGAUnmapPhysical() for most systems that use
-      mmap().  Without this lots of map/unmap calls would result in running
-      out of address space and/or file handles (Bugzilla #880, David Dawes,
-      reported by Eckhard Neber).
- 605. Restore the Windows keycodes in the 'xfree86' XKB keycodes map,
-      and add the Solaris-compatible tokens as aliases (reported by
-      Panagiotis Papadakos).
- 604. Fix some problems building against external installations of
-      freetype2 (David Dawes).
- 603. Add font bounds checking to the X server side of the font server
-      interface (Chisato Yamauchi, David Dawes).
- 602. Fix ForcePCIMode option to work as advertised in Radeon driver
-      (Bugzilla #850, Kevin Martin).
- 601. Update the fonts document for the FreeType backend changes
-      (Chisato Yamauchi, Reiko Nakajima, After X-TT Project).
- 600. Don't allow the lack of "SUPERSCRIPT TWO" to prevent Adobe Standard
-      Cyrillic encoded fonts from being accepted as "koi8" capable
-      (Michail Vidiassov).
- 599. Xvfb didn't have enough pixmap formats for Render (David Dawes).
- 598. Fix the processing of xdm/config/Xres.cpp, which is broken with
-      gcc 3.3.2 (reported by Chisato Yamauchi).
- 597. Fix two problems with Xvfb:
-        - Too much memory was allocated because of a confusion between
-          bytes and pixels.
-        - The XWD header was corrupted at server reset.
-      (David Dawes).
- 596. Fix several problems xwud has displaying TrueColor dumps (extreme
-      slowness displaying on TrueColor visuals, and incorrectness displaying
-      on DirectColor visuals) (David Dawes).
- 595. Rank TrueColor above DirectColor in xwud.  This avoids colourmap flashing
-      by default when running on a server with both visuals available
-      (David Dawes).
- 594. Build with Xplugin support by default on Panther (Torrey T. Lyons).
- 593. On Mac OS X, allow "X -version" to work without connecting to
-      CoreGraphics (Torrey T. Lyons, reported by Benjamin Reed).
- 592. Don't optimize away window restacks in rootless mode (John Harper).
- 591. Fix problems preventing mesa-based GLX from working with Xnest, even
-      though it is linked in and advertised (David Dawes).
- 590. Fix typing in XDarwin Preference panel going to X11 (Torrey T. Lyons).
- 589. Fix rootless build after REGION_* macro rework (Torrey T. Lyons).
- 588. Fix broken GLX indirect rendering (David Dawes).
- 587. Fix the XKB definitions for the "Hiragana_Katakana" key, and fix
-      some incorrect definitions in symbols/jp (Chisato Yamauchi).
- 586. Change the mkfontdir wrapper script to invoke mkfontscale via its full
-      path name (Chisato Yamauchi).
- 585. Modify xf86config and xf86cfg to enable loading the "freetype" module
-      (Chisato Yamauchi).
- 584. Wrap ucs2any with ProgramTargetName in dependencies, as needed for
-      OS/2, and note that OS/2 doesn't have basename(3) (Bugzilla #871,
-      Frank Giessler).
- 583. Fix atimisc's decoding of the mode on input for large panels
-      (Marc La France).
- 582. Fix SEGV when ATIPreinit() fails (Marc La France).
- 581. In rootless XDarwin, don't send ButtonPress events when clicking in
-      non-X11 windows (Torrey T. Lyons, John Harper).
- 580. AppleWM compatibility fixes:
-       - Disable XDarwin handling cut and paste if AppleWM-aware cut and
-         paste manager is available.
-       - Set _NATIVE_SCREEN_ORIGIN property on root window.
-      (John Harper, Torrey T. Lyons).
- 579. Change ProjectRoot from /XFree86 to /usr/X11R6 on OS/2 (Bugzilla #865,
-      Frank Giessler).
- 578. Fix building of new Mesa on OS/2 (Bugzilla #865, Frank Giessler).
- 577. Change the way how libraries with long file names are handed on
-      OS/2 (Bugzilla #865, Frank Giessler).
- 576. Force screen blanking when entering DPMS states (Bugzilla #866,
-      David Dawes, reported by Ed Fardos).
- 575. XDarwin fixes/cleanups:
-       - Handle X11 executables opened from the Finder.
-       - Use xcodebuild instead of pbxbuild on Panther.
-       - Clean up Darwin specific imake #defines.
-       - Fix compiler warnings on Panther.
-      (Torrey T. Lyons).
- 574. A workaround for platforms (like *BSD) where IPv6 sockets don't accept
-      IPv4 connections: disable IPv6 XDMCP code by default.  This allows IPv4
-      XDMCP to work on such platforms (David Dawes).
- 573. Rework REGION_* macros to eliminate NEED_SCREEN_REGIONS build failures
-      (Marc La France).
- 572. Fix an old bug in the X server and xfs related to usage of
-      c->savedName (Bugzilla #818, Owen Taylor).
- 571. Fix FontFileListOneFontWithInfo() so that it handles aliases in the
-      same was as FontFileOpenFont() (Bugzilla #818, Owen Taylor).
- 570. Respect USE_SSE_ASM for the .S files in the r200 and radeon 3D drivers.
-      This should fix the reported OpenBSD build problem (David Dawes).
- 569. Some missing FreeBSD AMD64/Sparc64 patches (Bugzilla #786, Eric Anholt).
- 568. The call to xf86RandRSetMode() from xf86RandRCreateScreenResources()
-      doesn't appear to be necessary.  Removing it restores the documented
-      ViewPort behaviour when RandR is enabled (David Dawes).
- 567. Make the vesa driver blank the screen during initialisation for
-      cosmetic reasons (David Dawes).
- 566. Make the cirrus driver blank the screen during initialisation for
-      cosmetic reaons (most other drivers do this) (Bugzilla #781,
-      Nicholas Miell).
- 565. The vesa driver wasn't setting the viewport correctly either at
-      ScreenInit or EnterVT (David Dawes).
- 564. Fix the viewport initialisation.  The ViewPort parameters from the
-      XF86Config file were being ignored, and the default was a 0,0 viewport
-      rather than centred on the virtual screen as documented.  When RandR
-      is enabled, it undoes all of this though... (David Dawes).
- 563. Fix an off-by-one bug in libXcursor that can result in segfaulting
-      applications (David Dawes, reported by Agustin Gianni).
- 562. Fix RandR initialization problem when default screen resolution is
-      different from the virtual resolution. (Bugzilla #853, Bob Paauwe).
- 561. Fix an Xv problem with the via driver where updating a portion of the
-      overlay causes excessive CPU usage (Bugzilla #821, Neil Terry).
- 560. Fix an Xnest hang on OS/2 (Bugzilla #852, Frank Giessler).
- 559. OS/2 update for the recent move to building most libraries shared,
-      and add some functions to the export lists for freetype and Xt for
-      compatibility with older applications (Bugzilla #852, Frank Giessler).
- 558. Fix the installation location of the XRes and Xss manpage aliases
-      (Bugzilla #848, ISHIKAWA Mutsumi).
- 557. Include backwards compatibility API for renamed stream functions in
-      Freetype2 library (Torrey T. Lyons).
- 556. Fix acecad driver to call xf86DeleteInput() (Bugzilla #855, S. Voltz).
- 555. Register to handle X11 executables on Panther (John Harper).
- 554. Fixes for GLX on Mac OS X:
-       - Make libGL not export libGLU symbols.
-       - Fix uninitialized mutex for threaded direct GLX.
-      (John Harper).
- 553. Fix "Non-aligned pointer being freed" warnings on XDarwin startup
-      (Torrey T. Lyons).
- 552. Miscellaneous fixes for Panther:
-       - Fix spurious #pragma getting inserted by cpp (Martin Costabel).
-       - Fix startup failure due to bad keymapping file (Torrey T. Lyons).
-       - Fix startup warning about missing semicolons (Torrey T. Lyons).
- 551. Mesa X86 asm build fix for Solaris (David Dawes).
- 550. Fix building libOSMesa on Darwin (Torrey T. Lyons).
- 549. Get backlight working on Apple's GeForce4 powerbooks (Guido Guenther).
-
-XFree86 4.3.99.15 ( 1 November 2003)
- 548. Update libfreetype-xtt2 to version 1.1:
-       - Improved the very lazy method.  To prevent displaying chipped bitmap
-         when having italic angle, the lsb and rsb are adjusted by using
-         italicAngle in post table.
-       - Added automatic correction of bitmap position for preventing
-         displaying chipped bitmap when using charcell or very lazy method.
-       - Set DEFAULT_VERY_LAZY macro.  If post table is available, the very
-         lazy method is used as default when handling multi-bytes fonts.
-       - Added additional glyphs(0x2d21-0x2d7c) to jisx0208.1990-0.enc.
-      (Chisato Yamauchi, After X-TT Project).
- 547. Set the pixel clock limit above which hzoom is enabled for the video
-      overlay for G450 and G550 cards to 234MHz.  This fixes a problem with
-      the Xv support having half horizontal resolution (Michel Lespinasse).
- 546. Add support on Mac OS X for building keymap using Carbon Keyboard
-      Layout API (John Harper).
- 545. Map holes in kdrive VESA driver (#5436, Juliusz Chroboczek).
- 544. Add option to Radeon driver to allow minimum dot clock to be
-      overridden (Bugzilla #831, Nils Philippsen).
- 543. Add shared libraries run-path information to pkg-config datafiles
-      provided for some libraries. (Bugzilla #832, Frederick Bruckman, 
-      Matthieu Herrb).
- 542. Fix buglets detected by SGI compiler in neomagic, sis and tseng drivers
-      (Marc La France).
- 541. Fix I/O alignment in mga and via drivers (Marc La France).
- 540. Improve xkbcomp's key types auto-recognition (Ivan Pascal).
- 539. Add support for multi-threaded direct GLX rendering with AppleDRI
-      (John Harper).
- 538. Fix a problem in Xlib that was cause by the ANSI prototype cleanups
-      (Bugzilla #839, Owen Taylor).
- 537. Limit the rate of duplicate audit messages in the X server. (Matthieu 
-      Herrb, David Dawes).
- 536. Fix ChipValidMode() return type (Marc La France).
- 535. Fix for AGP8x support on HP zx1-based systems (Marc La France). 
- 534. Workaround for mysterious segfault related to mkfontscale's use of
-      memcmp()  (Marc La France).
- 533. Support the new Linear allocator in the trident driver and make the
-      hardware cursor use it. Xv automagically uses it. (Alan Hourihane).
- 532. Fix acecad input driver build and re-enable it 
-      (Bugzilla #816, Alan Hourihane).
- 531. Fix DRM_CAS on ia64 as used by the DRI (Bugzilla #778, John Dennis).
- 530. Call OsCleanup() at the end of each server generation, and add an
-      argument to indicate when the server is terminating.  This allows
-      misc end-of-generation cleanups to be added to OsCleanup() (David Dawes).
- 529. Explicitly free the DPMS and ScreenSaver timer resources at the end
-      of each server generation (David Dawes).
- 528. Cygwin configuration updates and install script updates (Bugzilla #799, 
-      805, Harold L Hunt II, Alexander Gottwald)
- 527. Build shared libraries for Xt and Xaw on Cygwin. (Bugzilla #804, 
-      Ralf Habacker).
- 526. Xterm patches #180, 181 (Thomas Dickey).
- 525. Update libfreetype-xtt2 to version 1.0d:
-       - Fixed server crash caused by loading fonts for which encoding file
-         does not exist.
-       - Some fixes for minor bugs when handling errors.
-       - Some minor cleanups.
-      (Chisato Yamauchi, After X-TT Project).
- 524. Export strl{cat,cpy} functions to the server modules and provide 
-      an implementation for the systems that don't have them. (Matthieu 
-      Herrb).
- 523. Fixes and updates for XKB keyboard maps:
-      - Update Serbian layouts (Bugzilla #92, Danilo Segan).
-      - Add 'MS Windows like' US International variant for 'us' keymap (Ivan
-        Pascal).
-      - Change CapsLock default behavior to 'Caps acts as locking Shift,
-        Shift cancels Caps'.  Add new type for four-level keys (Ivan Pascal).
- 522. Fix generic rootless code bug which tests CopyWindow instead of CopyBytes
-      (Kensuke Matsuzaki).
- 521. Update libfreetype-xtt2 to version 1.0c.  This consists of some minor
-      fixes and cleanups (Chisato Yamauchi, After X-TT Project).
- 520. Add accelerated rootless drawing support and fix bug in rootless
-      FillSpans (Torrey T. Lyons and John Harper).
- 519. Update SiS driver:
-      - Merge 661/741/760 support
-      - Clean up
-      - Fix Xv problems after swsuspend
-      - Fix LCD-via-CRT1 on various machines
- 518. Prevent some compilers from optimising out Mesa's X11 error interface
-      (Marc La France).
- 517. Add rules to generate post-processed and assembler source from C++ files
-      (Marc La France).
- 516. Change `make World` so that well it interrupts itself to build a utility
-      (makedepend, pswrap, etc), it only builds that utility.  Some things were
-      being built too early (Marc La France).
- 515. When the i830 driver's checks for sufficient memory for tiled mode
-      fail, don't later try to allocate with tiling enabled (David Dawes).
- 514. Enable I845G_VBE_WORKAROUND in the i830 driver for all platforms, since
-      this reportedly fixes VT switching problems on hardware other than the
-      845G.
- 513. Updated README.SiS (Thomas Winischhofer).
- 512. Add the After X-TT Project's libfreetype-xtt2 1.0b fixes and
-      enhancements to the "freetype" module (Chisato Yamauchi,
-      After X-TT Project).  This should make it possible to deprecate the
-     "xtt" module in a future release.  Fixes and enhancements include:
-       - Fixed crash caused by using fonts which have OS2 sfnt table.
-       - Corrected metrics calculation error.  Although the original code uses
-         size->metrics, the FT_Size_Metrics does not have exact values when
-         handling the outline.  So the codes for metrics calculation were
-         drastically rewritten.
-       - Fixed some problems with FreeTypeRasteriseGlyph():
-          + Made "only metrics is required" distinct from "both metrics and
-            rasterised bitmap are required" to improve performance when
-            loading large charset.
-          + Fixed the erroneous usage of freetype2 API.  To get valid metrics,
-            FT_Outline_Get_BBox() or FT_Outline_Get_CBox() is used for outline.
-          + Took the strange code for raster copying and rewrote it.
-       - Fixed UNDERLINE_POSITION so that it counts downwards.
-       - Fixed a risky calculational method for info->maxbound and
-         info->minbound when spacing is not charcell.  All glyphs' metrics are
-         calculated and valid info->maxbounds and info->minbounds are set
-         without cutting any corners.
-       - Added TTCap option "fn","ai","ds","fs","vl","cr","bw","eb","hi",
-         "fc" and "fm" which are compatible with X-TT 1.4.
-       - Supported character width for vertical layouts.
- 511. Encoding file updates (After X-TT Project):
-       - Removed jisx0208.1983-0.enc and added 'ALIAS jisx0208.1983-0' to
-         jisx0208.1990-0.enc.
-       - Added Windows ucs2 cmap(3,1) to jisx0208.1990-0.enc and
-         jisx0201.1976-0.enc.
-       - Added files for GB18030-0 and GB18030-1 (James Su).
- 510. Update X-TrueType (X-TT) to version 1.4.2 (Chisato Yamauchi,
-      After X-TT Project):
-       - Fixed several bugs of make_up_italic_bitmap() function.
-       - Changed the order of priority of mapIDRelations in JISX0208 and
-         JISX0201 code converter. The windows ucs2 is given the highest
-         priority for kochi-substitute Japanese fonts.
-       - Fixed code relation in cc_jisx0208_to_std_ucs2() function
-         (not 0x215d -> 0x00b1 but 0x215d -> 0x2212)
-       - Added minor improvements.
- 509. Fixes and updates for HTML and PDF versions of spec docs for
-      installation and inclusion in the online docs (David Dawes).
- 508. Implement SharedLibtoolLibraryTarget, etc for bsdLib/ELF, including
-      creating links for older but compatible revisions of such
-      libraries (David Dawes).
- 507. Allow a simple form of option name aliasing for options handled
-      via OptionInfoRec (David Dawes).
- 506. Add optimized code for RENDER with rootless XDarwin (John Harper,
-      Torrey T. Lyons).
- 505. Declare LoadPalette, SetOverscan and DPMSSet as public functions through
-      the XFree86's ScrnInfoRec, so these functions can be wrapped.
-      (Alan Hourihane).
- 504. XDarwin improvements:
-       - Add complete server side support for AppleWM with xpr.
-       - Allow Aqua and X11 windows to interleave when AppleWM-aware window
-         manager is present.
-       - Fix hang on server reset.
-      (Torrey T. Lyons, John Harper).
- 503. Fix double-free at server regeneration in the screensave/DPMS timer
-      code (David Dawes).
- 502. Build most libraries as shared by default. (Matthieu Herrb, 
-      David Dawes).
- 501. Add missing symbol definition files for libraries (Matthieu Herrb).
- 500. Add 'inet' keymaps for two Logitec keyboard models (Bugzilla #762,
-      Eric Mountain; Bugzilla #766, Chris Hornbaker) and cleanup Logitec
-      keymaps (Ivan Pascal).
- 499. Add missing SetScreenSaverTimer() to ProcSetScreenSaver (Ivan Pascal).
- 498. Fix building on Mac OS X after DRI merge (Torrey T. Lyons).
-
-XFree86 4.3.99.14 (10 October 2003)
- 497. Add an xf86InitFBManagerLinear() function and implement the Linear
-      allocation routines. These still fallback to XY area allocation if
-      no (or the lack of) linear space is available. It assumes the driver
-      has already called one of the init routines to the FBManager for Areas
-      before this new setup can be used (Alan Hourihane).
- 496. Added USB keyboard support for Solaris/x86 platform (Bugzilla #352,
-      Daniel Rock).
- 495. i830/i810 driver:
-      * Added Christian Ziez's code to tweak BIOS image to convince chipset of
-        resized video RAM.
-      * Fixed viewport/video overlay window alignment issues.
-      * Fixed calculation of video overlay memory size.
-      * Fixed video overlay on TV out (Bugzilla #213). (Egbert Eich).
- 494. Fixed mode setting in trident driver: use mode passed in function 
-      argument, not value in currentMode (Bugzilla #197, Egbert Eich).
- 493. Added delay when writing to Glint PM2 ramdac to avoid lockups 
-      (Egbert Eich).
- 492. Fixed bug in Glint Bresenham line fallback code that caused line be drawn
-      beyond framebuffer boundaries (Bugzilla #624, Egbert Eich).
- 490. Force sane pallette when entering DGA mode in Matrox driver 
-      (Egbert Eich).
- 489. ATI Rage128: Wait with modifying FP video mode according to BIOS values
-      until final call of ValidMode() to prevent modes from being rejected
-      (Bugzilla #661, Egbert Eich).
- 488. Some Savage BIOSes turn on clock doubling on non-doubled modes. 
-      Added code that catches and fixes this situation (Egbert Eich).
- 487. Tdfx driver: Fixed order of initialization/deinitialization in 
-      ScreenInit()/ CloseScreen().
-      Fixed texture video support, removed artefacts in last line of overlay
-      video support (Bugzilla #299). (Egbert Eich).
- 486. Add "automatic configuration" support for the XFree86 server, allowing
-      it to be started in a useful way without an XF86Config file.
-       - Add support to the config file parser for processing internally
-         supplied configuration data.
-       - Modify the algorithm for finding core input devices to maximise the
-         likelihood that they will be found.
-       - Add a FindDevice function to the OSMouse interface, allowing
-         an OS-specific function to be called to find the mouse device when
-         none is specified in the configuration.  Implementations included for
-         Linux and FreeBSD.
-       - Add a GuessProtocol function to the OSMouse interface, allowing
-         an OS-specific function to be called as a fallback when the mouse
-         protocol can't otherwise be detected.  Implementation included for
-         Linux.
-       - Bump the OSMouse interface version to 1.1 with the addition of the
-         above two functions.
-       - An interface for calling an external utility "getconfig" to generate
-         some configuration data.  Implementation of getconfig included.
-       - Generate a default internal configuration, autodetecting as much
-         as possible, with reasonable fallbacks.
-       - Recognise "DefaultDepth" and "DefaultFbbpp" options in the Device
-         section.
-       - Add a "TargetRefreshRate" option to help prevent modes with too
-         high a resolution (and poor refresh rate) being used as the default.
-       - Use DDC-probed mode timings to estimate the monitor parameters when
-         the DDC-probed information doesn't include a DS_RANGES property.
-         This should improve the reliability of monitor auto-detection.
-      (David Dawes, X-Oz Technologies).
- 485. Add functions for checking option values without marking them as "used"
-      (David Dawes).
- 484. Add missing xf86ReplaceRealOption() function (David Dawes).
- 483. Added support for Siliconmotion Cougar3DR chip (Bugzilla #754, 
-      Chris Edgington).
- 482. Cygwin:
-      * Added another German keyboard layout.
-      * Added Japanese keyboard layout to the list of defaults as jp.
-      * Added a new default keyboard layout for Portuguese (Brazil, ABNT2).
-      * Print the layout number in hexadecimal.
-      * Display the argument to the -query option in the window title.
-        (Bugzilla #763, Alexander Gottwald)
- 481. Add processing for WM_WINDOWPOSCHANGED to cause window to repaint when
-      using TweakUI's focus-follows-mouse behavior.  (Bugzilla #763, 
-      Harold L Hunt II)
- 480. Added runtime detection of SHM support by checking the return value of 
-      shmget to the SHM and xf86BIGFONT extension to support SHM on Cygwin 
-      (Bugzilla #764, Harold L Hunt II).
- 479. Adding O_BINARY flag when opening an xkm file if this flag is defined
-      (Bugzilla #768, Alexander Gottwald).
- 478. Radeon driver fixes (Hui Yu at ATI)
-      - 9200 DVI fix and TMDS_PLL initialization for all chips
-      - New chips support (9800XT/SE, 9600XT/SE, M11, T2/X2 etc.)
-      - Cleanup unused/secondary chip ids
-      - Autodetect PCI cards
-      - Add BusType to override PCI card autodetect
-      - Add display bandwidth calculation routine to fix flickering/tearing
-        display problem
-      - Workaround for corrupted BIOS image causing incorrect panel size
-      - Fix the LCD table reading loop
-      - Various small changes (including improving DDC reliability and
-        CRTC_MORE_CNTL initialization)
- 477. Fix XAA Color8x8 cache bug:
-      Pattern was expanded from source instead of destination
-      (Thomas Winischhofer)
- 476. Fixes and updates for XKB keyboard maps:
-      - Add 'United Kingdom w/deadkeys' gb(intl) keymap (Bugzilla #744,
-        Phil Jones).
-      - Add multi_layout compliant 'us_intl' keymap (Ivan Pascal).
-      - Fix 'macintosh' geometry file (Bugzilla #753, Simon Vallet).
- 475. APM driver:
-      . improved clock parameter calculation.
-      . Fixed order of initialization of cursor.
-      . Fixed restauration of graphical text mode.
-      . Added YUY2 video format.
-      . Corrected accel framebuffer pitches and max screen height 
-      (Bugzilla #528, Egbert Eich).
- 474. Moved DisableMMIO() out of the unmap() function, added call to 
-      EnableMMIO() to EnterVT() to work around lockup problems when 
-      switching between two Xserver (Bugzilla #748, Egbert Eich).
- 473. Fixed problem with text widget in Xaw when widget has a different 
-      depth than the default visual (Bugzilla #745, Wolfram Gloger).
- 472. Fixed Sig11 when calling X -query with no ipv6 support in kernel 
-      (Bugzilla #737, Egbert Eich).
- 471. Added support for Sparc64 and AMD64 on FreeBSD.
-      This patch also disables warnings from system headers, fixes some elf
-      relocations also relevant for other platforms and disables translation of
-      KEY_SysReqest and KEY_Break on sparc64. (Bugzilla #739, Eric Anholt).
- 470. Switched VIA video driver to fillkey helper function (Bugzilla #525,
-      Alan Cox).
- 469. Fixed CRT modes > FP panel size for siliconmotion (Bugzilla #727, 
-      Hugues Fournier).
- 468. Fixed xedit coredumps: update counter of free objects when getting an
-      object from the list (Bugzilla #722, Egbert Eich).
- 467. Fixed definition of UseInstalledOnCrossCompile so that it never is
-      undefined (Harlod L. Hunt II).
- 466. Add the 'b' flag to fopen() when opening binary xkm files. This is
-      irrelevant for *nix OSes, but required for Cygwin. (Bugzilla #689, 
-      Harold L Hunt II).
- 465. Cygwin:
-      * MultiWindow Mode: Automatically validate the size of windows that are
-        being resized.  (Earle F. Philhower III)
-      * Safely shutdown the MultiWindow Mode and Clipboard Manager threads on
-        server shutdown.  (Earle F. Philhower III)
-      * MultiWindow Mode - Fix a crash from a string copy bug.  
-        (Earle F. Philhower III)
-      * Add lots of defaults for keyboardlayout.  (Alexander Gottwald)
-      * Add a system tha allows arbitrary commands to be added to the tray menu
-        icon.  (Earle F. Philhower III)
-      * Print the name of the keyboardlayout to aid in adding more layouts. 
-        (Alexander Gottwald)
-      * Stop printing the IDirectDrawSurface4_Blt() failure messages after 10
-        times.  (Harold L Hunt II)
-      * Disable check for pc105 keyboard and just assume that it is present.  
-        This check was causing problems with certain keyboard drivers that 
-        failed to report that a pc105 keyboard was present. 
-	(Alexander Gottwald)
-      * MultiWindow Mode - Add handling for WM_CHANGE_STATE IconicState 
-        messages;
-      minimize the associated Windows window when these messages are
-      received. (Harold L Hunt II).
-      Submitted: (Bugzilla #704, Harold L. Hunt).
- 464. cygwin.cf:
-      * removed BuildDPS flag.
-      * Changed Alloca flag as Cygwin 1.5.x supports alloca, now.
-      * Use external expat package by default.
-      * Changed XawI18nDefines to utilize improved wide char support in 
-      Cygwin 1.5.x. (Bugzilla #699, Harold L. Hunt II). 
- 463. Fixed C&T panel register setting (Akira Taniguchi, Egbert Eich).
- 462. Fixing crash on ia64 because of wrong setjmp buffer alignment (Bugzilla
-      #596, John Dennis).
- 461. Changing ImPS/2 mouse Z-axis range to -8 to 7 (Bugzilla #691, 
-      Matthew W. S. Bell, Egbert Eich).
- 460. Making sure the compiled xkb config file is found by Xnest if 
-      ProjectRoot is modified (Bugzilla #688, Frank Giessler).
- 459. Fixing build of machine code .S files on OS/2 (Bugzilla #689, 
-      Frank Giessler).
- 458. Import Mesa 5.0.2 (Alan Hourihane).
- 457. DRI merge (DRI Project)
-      - Update the SiS driver to use Mesa 5.0
-      - 
- 456. Fixes and updates for XKB keyboard maps:
-      - Update xkb geometry files (Alexander Pohoyda).
-      - Fix German-Romanian maps (Manfred Pohler).
-      - Cleanup Hungarian layout (Bugzilla #730, Egmont Koblinger).
- 455. Change the order of the timeouts processing and the input devices
-      reading in WaitForSomething() which caused unneeded keyboard autorepat
-      events (Ivan Pascal).
-
-XFree86 4.3.99.13 (25 September 2003)
- 454. Add support for chip ID 5964 (Radeon 9200 SE) to the radeon driver, and
-      fix detection of IDs 5962 and 5963 with Driver "ati" (Bugzilla #732,
-      Michel Daenzer)
- 453. Add gcc format checking for the X server's message and logging
-      functions, and fix lots of associated warnings (David Dawes).
- 452. Replace the perl version of ucs2any with a C version ( Ben Collver and 
-      other NetBSD developers, Matthieu Herrb).
- 451. For drivers that support 'Option "dri"' have the driver request
-      loading the dri module when this option is true.  This brings
-      it in to line with how other things are handled.  Other drivers
-      that have DRI support need to have the "dri" option added (David Dawes).
- 450. Fix libGL bug that could cause deadlock when switching contexts
-      (John Harper).
- 449. Improve the contrast of the whiteglass xterm cursor, and fix the
-      hotspot of the whiteglass right_ptr cursor and add transparency
-      to it (#5867, René Rebe).
- 448. Fix a problem with the "pl2" (Polish qwertz) map where the order in
-      which the Alt_R and Shift keys are pressed affects the results
-      (Tom Pala).
- 447. In xdm, use better pseudo-random number generators to generate
-      magic cookies. Add support for EGD and other compatible entropy
-      gathering daemons. (Oswald Buddenhagen from KDE, Matthieu Herrb).
- 446. Fix IMPS/2 mouse wheel on platforms where char defaults to unsigned
-      (Rene Rebe).
- 445. Fix rare xterm crash on Darwin due to dyld deadlock when a signal comes
-      in while dyld is looking up a symbol (Rob Braun).
- 444. XDarwin cleanup and improvements:
-      - Load bundle at runtime for chosen Quartz mode: xpr, cr, or fullscreen.
-      - AppleWM extension has been generalized to work with any Quartz mode.
-        Currently only the xpr implementation is complete.
-      - Wrote a man page for AppleWM.
-      - Moved hw/darwin/quartz/aqua* files that contained code to protect
-        the alpha channel to miext/rootless/safeAlpha.
-      (Torrey T. Lyons).
- 443. Remove lots of redundant redeclarations (David Dawes).
- 442. VIA driver:
-      Fixed video memory detection. (Bugzilla #525, Alan Cox).
-      Fixed TV and FP initialization problems (Bugzilla #525, Frederic Crozat,
-       Alan Cox).
-      Removed remaining globals (Egbert Eich).
- 441. Fixed memory leaks in the loader (Bugzilla #682 and #683, Juergen Keil).
- 440. Fixed erroneous freeing of DisplayModeRec in xf86DeleteMode() when
-      deleting the modePool in xf86PruneDriverModes() the 'prev' member has
-      a different meaning for modePool modes than for ScrnInfoPtr->modes modes
-      where it creates a doubly linked list (Bugzilla #678, Juergen Keil).
- 439. Fixed SDK for VIA driver (Bugzilla #674, Bernhard Rosenkraenzer).
- 438. Extended list of monitor ranges and modes in xf86cfg (Egbert Eich).
-
-XFree86 4.3.99.12 (10 September 2003)
- 437. Move the X server log file handling from the XFree86 DDX to the DIX,
-      allowing the more descriptive logging to be used throughout the server,
-      and the log messages to be more uniform in formatting (David Dawes).
- 436. Added support for the Compaq Evo keyboard (Stanislav Brabec).
- 435. Fixed writes past end of array in via_bios.c (Bugzilla #662,
-      Egbert Eich).
- 434. Let luit copy the termios settings from the calling terminal (Bugzilla
-      #641, Juliusz Chroboczek).
- 433. Add _ADOBE_POSTSCRIPT_FONTNAME to the list of font properties xlsfonts
-      that are atoms and should be converted to strings when run with the
-      -ll flag. Also fixed the lenght problems that may arise (Bugzilla # 659,
-      Alan Coopersmith).
- 432. Backing out 321.: sysMem gets initialized once during server lifetime
-      (Egbert Eich).
- 431. Fixing X11.tmpl to set XFTINCLUDES after defining a non-standard path
-      to fontconfig, adding FONTCONFIGINCLUDES to the build rules for fontconfig
-      (Kevin P. Fleming).
- 430. Added support for the hp5181 inet keyboard (Bugzilla #648, Alan Strohm).
- 429. Added support for Apple Laptop keyboards, added level3/group switching to
-      KP_Enter, modified layout so keyboards acts the same way as under Mac OS
-      (Bugzilla #642, Frank Murphy).
- 428. Adding ANGKHANKHU (U+0E5A) character to level 3 of keycode <AD09> on
-      th_tis keymap (Theppitak Karoonboonyanan).
- 427. Fixes and updates for XKB keyboard maps:
-      - Add 'Romanian keymap for German keyboard' and 'Romanian keymap with
-        access to German umlauts' (Manfred Pohler).
-      - Update xfree86.dtd file (Sergey V. Oudaltsov).
-      - Add an XkbOption that makes a keyboard map without special keysyms
-        on Ctrl+Alt+smth for those who use such combinations for another
-        purposes (Ivan Pascal).
- 426. Reverse patch #423 because it causes compile problems (Ivan Pascal).
- 425. Disable the bytecode interpreter by default in FreeType 1, bringing it
-      into line with the default for FreeType 2.  Document how to enable
-      it in xf86site.def for those with no legal impediment to doing so
-      (David Dawes).
- 424. Improvement of Xlib's keysym compose module:
-      - Allow to figure out a mulibyte string if it is omitted in Compose file.
-      - Add 'include' instruction with some substitutions.
-      - Add a searching of Compose file as a value of XCOMPOSEFILE environment
-        variable and as a $HOME/.XCompose file. (Ivan Pascal).
- 423. Add a writing of some Xserver XKB module error messages into a servers
-      log file (Ivan Pascal).
- 422. Add Trident CyberBladeXP4 support, but acceleration is currently
-      disabled. (Alan Hourihane).
- 421. Xinstall.sh updates to reduce its reliance on external utilities and
-      provide better diagnostics when required external utilities don't exist.
-      (David Dawes).
- 420. Fixes and updates for XKB keyboard maps:
-      - Fix unneeded BKSL redefinition in Ukrainian 'winkeys' keyboard map
-        (Andriy Rysin).
-      - Fix some keycodes for jp106 keyboard model (Bugzilla #657,
-        Stephen J. Turnbull).
-      - Update xfree86.xml registry file (Andriy Rysin, Sergey V. Oudaltsov).
- 419. Add a missing xf86UnblockSIGIO() call to xf86InstallSIGIOHandler()
-      (#5839, NetBSD PR xsrc/22668, Yorick Hardy).
- 418. Fix a problem with the "pl" map where the order in which the Alt_R and
-      Shift keys are pressed affects the results (#5832, Tom Pala).
- 417. Fix the warning generated by the ONE_LEVEL <RALT> definition in
-      the "level3" map (#5832, Tom Pala).
- 416. Remove the unnecessary dependence of RandR on RENDER (David Dawes).
- 415. Remove some static variables that should be per-screen (David Dawes).
- 414. SiS driver update:
-      - Add 8x8 Color Pattern Fill (315/330 series)
-      - Add transparency support for 8x8 Mono Pattern (300/315/330 series)
-      - Fix Xv "insufficency" triggered by MPlayer (315 series)
- 413. Add missing REQUEST_SIZE_MATCH() to xSyncSetCounter protocol request
-      (noticed by Ruben Nunez Francisco).
- 412. Allow building libOSMesa during non-XFree86 builds (Marc La France).
- 411. Rip out incorrect limits on the number of PCI buses an ix86 chipset can
-      handle and implement an improved solution for avoiding "phantom" PCI
-      buses (Marc La France, Bugzilla #604).
- 410. Fixes for potential integer overflows in font libraries. (blexim, 
-      Matthieu Herrb).
- 409. SiS driver: Add RENDER hardware acceleration
- 408. Add a Fopen() function to open the Xauthority file without spawning
-      a shell (Bugzilla #255, Aidan Kehoe, Matthieu Herrb). 
- 407. Fix a bug introduced with #397 that results in the core pointer and
-      keyboard devices specified in a ServerLayout section being ignored
-      (David Dawes).
- 406. Added big5hkscs encoding to font encoding files (Bugzilla #575, 
-      Jungshik Shin).
- 405. Don't call FBIOPAN_DISPLAY ioctl with arguments that will cause a
-      confusing if harmless error; make an fbdevhw internal function static to
-      fix a warning. (Michel Dänzer)
- 404. Passing correct virtual screen size to xf86ValidateModes() in VIA driver
-      (Luc Verhaegen).
- 403. Added RGB overlays to i810 driver (Bugzilla# 625, Alastair M. Robinson).
- 402. Fixed mode switching and mode comparison for xf86VidMode extension for S3
-      driver (Bugzilla #613, Alexey Baj, Egbert Eich).
- 401. Via driver: Fixed remaining globals, some formatting issues, out of 
-      memory handling in Xv overlay code and a couple of small glitches caused 
-      by the fixes (Bugzilla# 525, Alan Cox)
-      Fixed some missing globals and static build (Egbert Eich).
-      A handful globals still remain.
- 400. Update the Xserver(1), XFree86(1) and XF86Config(5) man pages to
-      clarify how XFree86 configuration/run-time parameters are specified
-      and their order of precedence (David Dawes).
-
-XFree86 4.3.99.11 (25 August 2003)
- 399. Try to make the state of libXfont more consistent.  It shouldn't depend
-      on whether a static or loadable XFree86 server is being built, so it
-      now always has a dependency on the FreeType2 library (when FreeType
-      support is enabled) (David Dawes).
- 398. Make the specification of a Monitor in the Screen sections of the
-      XF86Config file optional.  Some drivers may need changes (coming later)
-      to maximise the utility of this (David Dawes).
- 397. When a core keyboard or core pointer cannot be found in the
-      configuration, create default ones.  The pointer part of this
-      requires some changes to the mouse driver (coming later) before
-      the default core pointer configuration will be useful on most
-      platforms (David Dawes).
- 396. Add a facility for assigning version numbers to builtin XFree86 server
-      interfaces and allowing modules to query them.  Assign versions for
-      the os-mouse and os-kbd interfaces (David Dawes).
- 395. Include uname(2) information in the server's banner messages
-      (Marc La France). 
- 394. Fix bug in detection of multi-function PCI devices (Marc La France, in
-      partial resolution of Bugzilla #574).
- 393. Change the XFree86 server's global default depth to 16, and change most
-      drivers that support the three common depths (8, 16, 24) to defer to
-      the global default rather than specifying their own (David Dawes).
- 392. Fixed a crash when _XIMProtoOpenIM(), hich is called through XOpenIM() 
-      API when protocol IM is being set up,  fails (Bugzilla #618, 
-      Hisashi MIYASHITA).
- 391. Fixed a possible source of Sig11 in Jamstudio driver (Bugzilla #617,
-      Jonathan Hough, Egbert Eich).
- 390. Fixed building without RENDER support (Bugzilla #306, Matthieu Herrb, 
-      Egbert Eich).
- 389. Pass pointer obtained by Xalloc() to Xfree() not the one that may be
-      manipulated in the mean time (Bugzilla #614, Alan Coopersmith).
- 388. Added reverse mapping of keysyms to keycodes (XKeysymToKeycode())
-      to xev to detect situations where this maps to a different keycode than
-      the one of the key pressed (Egbert Eich).
- 387. Made xauth called by startx quiet (Bugzilla #597, Stas Sergeev).
- 386. Added missing operand size override handling to PUSH imm8 in x86emu
-      (Bugzilla #590, Boris Weissman).
- 385. Fixed compile glitch with NetBSD in xdm/genauth.c (Bugzilla #587, 
-      Nicolas JOLY)
- 384. Fix bugs in Xlib's EUC string converters that cause incorrect work of
-      _Xmblen.  Fix _Xmblen usage in imCallbk.c when Xlib is built with
-      X_LOCALE (Etsushi Kato).
- 383. Update xev program for print the result of XmbLookupString call
-      (Bugzilla #582, Noah Levitt, Ivan Pascal)
- 382. Fixes and updates for XKB keyboard maps:
-      - Fix for Uzbek keyboard map (Bugzilla #595, Mashrab Kuvatov).
-      - Fix for the problem with Alt+Tab combinations in some window mangers
-        (Bugzilla #580,616): window chooser menu doesn't disappear after
-        Alt key release (Egbert Eich, Ivan Pascal).
- 381. Allow a Display subsection with no depth or fbbpp specified to match
-      any depth/fbbpp, and make Display subsections optional, creating one
-      with default parameters when no suitable one can be found (David Dawes).
- 380. Include <sys/param.h> to get the BSD macro for luit (ITO Tsuyoshi).
- 379. DRM resync from the DRI trunk...
-       - Lots of misc fixes/cleanups, and some resyncs with 2.4 and 2.6
-         kernels.
-       - Fix maplist entries being used after they were freed; thanks to
-         Benjamin Herrenschmidt for tracking this down (Michel Daenzer).
-       - FreeBSD updates (Eric Anholt).
-       - Fail in DRM(agp_acquire) if the AGP aperture can't be used, such
-         that the X server falls back to PCI GART or disables the DRI
-         gracefully (Michel Daenzer).
-       - Possibly fix stanford checker complaints about sarea for radeon
-         (Keith Whitwell).
-       - Restore i830 texture age waiting when swapping in new textures
-         (Keith Whitwell).
-       - Fix texture rectangle support for r100 (Keith Whitwell).
-       - Add i810 add page flipping support to the DRM (Dave Airlie).
-       - Merged DRM documentation (Jose Fonseca). 
-       - r128 MESA_ycbcr_texture (Ian Romanick, Leif Delgass).
- 378. Linux drm module build fixes for newish kernels from the DRI
-      repository (Michel Daenzer, Linus Torvalds, Leif Delgass).  This
-      addresses Bugzilla #603, 605 (Calum Mackay).
- 377. Fix the test for 2.5.x with x < 52 Linux kernels for the drm module
-      build (Bugzilla #601, Callum Mackay).
- 376. Fix an XAA pixmap cache server crash that can happen in some cases
-      when the off-screen memory is heavily fragmented (David Dawes, based
-      on #5752, Koike Kazuhiko, Chisato Yamauchi).
- 375. Fix for the Brazilian ABNT2 keyboard extra key that now translates to
-      a different keycode value. Patch suggested by Ivan Pascal.
- 374. Fixed XDarwin fullscreen crash in some screen sizes (Torrey T. Lyons).
- 373. Be a little more precise about differentiating between active and
-      inactive non-video PCI resources (Marc La France).
- 372. Added Apple-WM extension and library (John Harper, Torrey T. Lyons).
- 371. Fixed indirect GLX on Mac OS X when the client can not make a
-      connection to the CoreGraphics window server (John Harper).
- 370. Fixed support for 64bit PCI bus on 32bit systems (Egbert Eich).
- 369. Added support for using aliases in the -nolisten option. '-nolisten tcp'
-      aliases to IPv4 and IPv6 (Matthieu Herrb, Egbert Eich).
- 368. Added fallback Xlib transport layer if IPv6 socket cannot be openend
-      (Egbert Eich).
- 367. Added missing symbol to the vbeSymbols table in i740 driver (Bugzilla
-      #583, Egbert Eich).
- 366. Changed scripts containing 'head -1' which is not supported by 
-      POSIX 1003.1-2001 any more (Bugzilla #570, #569, Paul Eggert, 
-      Egbert Eich).
- 365. Changed POSIX 1003.1-2001 non-conformant 'sort +2' to 'sort -k 3' with
-      backward compatibility (Bugzilla #568, Paul Eggert).
- 364. Add Microsoft Pro OEM model to XKB inet map (Bugzilla #458,
-      maxim at wzzrd.com)
- 363. Extract the CHANGELOG's commit date and include it in the XFree86
-      server log/version information (David Dawes).
- 362. Change the way xf86Build.h is created so that it doesn't cause its
-      dependencies to be rebuilt when its contents are not changed
-      (David Dawes).
-
-XFree86 4.3.99.10 (10 August 2003)
- 361. Fixes and updates for XKB keyboard maps:
-      - Added numpad:microsoft XKB option (Bugzilla #558, Will Styles).
-      - Fixed inconsistence in indicator names (Bugzilla #577, Noah Levitt).
-      - Added type6 model of Sun keyboard (Warren Turkal).
- 360. Add UK (gb) layout to the dvorak XKB map (#5739, Mike Sulivan).
- 359. More work on the NativeGDI server for Cygwin/XFree86. The span routines
-      are nearing completion (albeit they run slowly until the higher
-      level X primitive functions are implemented). The obvious issue with
-      the current code is the problems surrounding 1-bit DIBsections which
-      have msb/lsb issues compared to the other types of DIBsections.
-      This work was done quite some time ago in the Cygwin/XFree86 CVS.
-      (Alan Hourihane).
- 358. SiS driver update:
-      - Added pseudo-Xinerama extension for MergedFB mode
-      - Fixes for Clevo L285/L287 (1024x768)
- 357. Include Xmd.h in Xpm/lib/XpmI.h to get definitions of LONG64 
-      (Bugzilla #562, John Dennis).
- 356. Moved Meta_L/R keys and added Super_L/R keys on macintosh keyboard.
-      This makes the layout more compatible to the PC keyboard layout 
-      (Bugzilla #565, Frank Murphy).
- 355. Add check for Xmalloc() return value in XGetErrorDatabaseText() to avoid
-      Sig11 (Bugzilla #563, Alan Coopersmith).
- 354. Separated build of libglx.a module and normal libglx.a library 
-      (Bugzilla #541, Frank Giessler).
- 353. Fixed build of Xnest, Xprt and Xvfb for OS/2 by linking with the linker
-      definition files (Bugzilla #541, Frank Giessler).
- 352. Fixed freeing of properties form xkb_geomerty block (Bugzilla #550, 
-      Alexander Pohoyda).
- 351. Fixed string octal number parsing and string to int conversion for "\00"
-      in xkbcomp (Bugzilla #553, Egbert Eich).
- 350. Removed stale definition from XftCompat.h (Bugzilla #543, Egbert Eich).
- 349. Added XLC_LOCALE file for zh_CN.UTF-8, moved iso10646 encoding to the end
-      in ja_JP, ko_KR and zh_TW UTF-8  XLC_LOCALE files 
-      (Bugzilla #544, Akira TAGOH).
- 348. Fixed typo in #if conditional in cfb code (Bugzilla #556, Dave Love).
- 347. Fixed ValidMode() in C&T driver to work with option 'FixPanelSize' 
-      (Egbert Eich).
- 346. Fixed Meta_R key on us layout Macintosh keyboard (Bugzilla #539, 
-      Frank Murphy).
- 345. Add new charset sequence for CText at the end of list. This way the
-      sequence of a charsets that were added earlier will be picked if two
-      sequences for the same charset are registered (Bugzilla #228, 
-      Egbert Eich).
- 344. Use return value sysconf (_SC_OPEN_MAX) instead of the fixed number 256
-      for allowed number of open files on POSIX.1 conformant systems
-      (Egbert Eich).
- 343. Added missing exported functions in libfreetype to compile mkfontscale,
-      made mkfontsdir script install on platforms that use extensions (Bugzilla
-      536, Frank Giessler).
- 342, Fixed a sig11 in Xaw that may appear on the rare condition that no font
-      can be found (Bugzilla #482, Egbert Eich).
- 341. Added KP_Separator to symbols that can generate decimal() in xcalc
-      (Egbert Eich).
- 340. Disabled Color8x8PatternFill() in savage driver (Egbert Eich).
- 339. Fixed a sig11 in twm when used with a session manager (Egbert Eich).
- 338. Fixed rounding of refresh rate in RandR, updated Xrandr man page 
-       (Bugzilla #527, Egbert Eich).
- 337. Added MenuBorderWidth and MenuBorderColor options to twm (Bugzilla #529, 
-      Alexander Pohoyda)
- 336. Update for VIA driver:   
-      - DGA no longer hangs (eg freedroidRPG now runs reliably)
-      - Starting two copies of Xine no longer aborts the X server
-      - Added support for KM400/K8M400
-      - Improved video overlay support.
-      - Fixed video overlay clipping when the image cliprects change but 
-	not the size.
-      - TV tuner support via XV interface for two overlay ports.
-      - DRI support (the client side library is not yet fully ported to 4.3).
-      - Disable Xv in modes with insufficient bandwidth (1600c1200x16).
-      - Updated documentation
-	It differs from the base VIA codedrop.
-      - Several of the fixes were done by me on top of it (the dual Xine fix,
-	and bandwidth)
-      - Various system types have been turned to CARD32 to make the code 
-	portable
-      - The hybrid Video4Linux/XV glue was racy and has been removed 
-	(the XV layer is more than sufficient anyway)
-      - DRI library client code is not included (porting not yet finished)
-      - Additional debugging
-        (Bugzilla #525, VIA, Alan Cox) .
-      - Cleaning up namespace pollution, removing dependency on via_drm.h
-	removing some global symbols from driver (Egbert Eich).
-        Please note: there are more global symbols yet to be removed.
- 335. Remove the 'xc/xkbcomp/geometry/HP' directory from the CVS repository.
- 334. Substantial rewrite of the "nv" driver (Mark Vojkovich).
- 333. Resync with Cygwin/XFree86 changes up to Test92 (#5721, Harold Hunt and
-      the Cygwin/XFree86 project).
- 332. Add a clean target for Cygwin's ResourceObjectRule() rule (#5720,
-      Harold Hunt).
- 331. Fix xman's formatting/displaying of manual pages on Darwin, where
-      'groff' defaults to PostScript formatting (#5719, T. M. Pederson).
- 330. SiS driver update:
-       - Fixed SiS 620 support
-       - Added interface for sisctrl utility
-      (Thomas Winischhofer)
- 329. Fixes for regressions in xauth and xhost with IPv6 code
-      (Matthieu Herrb, Hideki ONO). 
- 328. Update X-TrueType (X-TT) to version 1.4.1 (Chisato Yamauchi,
-      After X-TT Project):
-       - Extension of code converter modules for ARABIC, ARMSCII8,
-         BIG5HKSCS, GB18030, ISO8859.*, etc. (Pablo Saratxaga, James Su)
-       - Try to use TT_Load_Glyph_Bitmap() in get_metrics() when `bs'
-         option is not set.
-       - Use Embedded Bitmap with the option `eb=y' when Auto Italic is set.
-       - Enhancements for `ds', `eb' and `bw' options.
-       - New options for TTCap, `fc' and `fm': they enable the *extremely*
-         fast loading of big Japanese or unicode fonts with `-p-' in the XLFD.
-       - Performance improvement of FreeTypeGetMetrics() function.
-       - Improved performance based on the solution to the buffer
-         overflow problem, caused by exceeding the range of
-         maxbounds.ascent/maxbounds.descent.  This problem occurred only
-         when `-m-' spacing was used.
-       - Improved fix to crashes caused when certain fonts (e.g. verdana.ttf)
-         are used; solution based on investigating the true nature of the
-         problem.
-       - Added patch for mktcapdir-0.5.4 and some ttfconf files suitable for
-         X-TT 1.4.0.
-       - Preparation for extending the encoding field of XLFD.  X-TT permits
-         the following additional XLFD format:
-            "-foo-foo-medium-r-normal--0-0-0-0-c-0-foo.2000-0.0"
-            "-foo-foo-medium-r-normal--0-0-0-0-c-0-foo.2000-0.1"
-         The last number can be used to indicate the plane number of a huge
-         character set.
-       - Support for reverse `fc' specification. `fc=0xaa00-0xa0ff' means
-         specifying the ranges 0x0000-0xa0ff and 0xaa00-0xffff.  This is
-         useful for GB18030 proportional fonts.
-       - Improved fix for server crash that appears on Linux/PPC.
-       - Added ksc5601.*-3 and ksx1001.*-3 to KSCJOHAB/main.c (Jungshik Shin).
-       - Added U+20AC and U+00AE characters to KSCJOHABtoUCS2.c and
-         KSC5601toUCS2.c (Jungshik Shin).
-       - Fixed an X server crash when using LucidaSansRegular.ttf
-         (reported by Koike Kazuhiko).
-       - Improved fix to prevent NULL dereference when the font cache
-         becomes full; solution by allocation of a dummy area for bitmap.
-       - Fixed an X server crash because of an inconsistency problem between
-         XFree86 and X-TT (reported by Koike Kazuhiko).
-       - Numerous minor improvements.
-
-XFree86 4.3.99.9 (25 July 2003)
- 327. Add Mach64 I2C framework.  Derived from GATOS project (Marc La France).
- 326. Removed ru_yawerty xkb symbols file as it is misleading as suggested
-      by Ivan Pasacal (Bugzilla #516, Ivan Pascal).
- 325. Fixed two bounds errors in rman 
-      (Bugzilla #505, Dan Nelson, Bugzilla #506,  Eric Anholt).
- 324. Cleaned up MMIO map/unmap in RADEONPreInit(), unmapped MMIO in 
-      CloseScreen() even when server is switched away (Bugzilla #504, 
-      Hui Yu, Egbert Eich).
- 323. Modified transport code so that a bind to an IPv4 socket fails silently
-      when the bind to an IPv6 socket for the same port was successful.
-      This works around a problem in theIPv6 implementation on some OSes
-      that also handle IPv4 calls over IPv6 sockets (Egbert Eich).
- 322. Simplified handling of the -nolisten option as suggested by 
-      Alan Coopersmith. This option can now be issued multiple times.
- 321. Added code to unmap sysMem when freeing int10 (Bugzilla #504, 
-      Frank Giessler).
- 320. Fix generic rootless crash while resizing when CopyBytes is not defined
-      by the implementation (Torrey T. Lyons).
- 319. Fix XDarwin Cocoa rootless crash when unshaping a shaped window
-      (Torrey T. Lyons).
- 318. More IPv6 changes from Alan Coopersmith as follows:
-      - Add support for IPv6 bracketed numeric addresses, similar to RFC 2732
-        syntax to a number of areas.
-      - Fix some issues with colon parsing and determining which addresses are
-        DECnet (two colons between hostname and display number) and which are
-        non-bracketed IPv6 numeric addresses ending in two colons, followed by
-        another colon and the display number (three colons in a row).
-      - Fix additional places Fabio forgot to change the string length when
-        switching "inetv6" to "inet6".
-      - Use MAXHOSTNAMELEN if it is defined for MAXHOSTNAME in xrdb.  (Perhaps
-        NI_MAXHOST should be used as well on platforms that support it.)
-      - Make #include <sys/socket.h> in Xtrans.h look like the other places
-        it's included in the tree, with checks for Lynx & Win32
- 317. IPv6:  2003.07.11 update to X.Org's response to comment #13;  i.e.
-      s/FamilyInternetV6/FamilyInternet6/g  (Marc La France).
- 316. IPv6 build fixes for older Linux systems;  Many of these are derived from
-      a suggestion by Alan Coopersmith (Marc La France).
- 315. Change DEVID macro to work around glitch in SCO's C compiler
-      (Marc La France).
- 314. Fixed Radeon driver so that clone modes survive server reset 
-      (Bugzilla #487, Egbert Eich).
- 313. Changed behavior of FreeType and Type1 renderer: when no encoding file
-      is found fail with BadFontName instead of using an iso8859-1 encoding
-      (Bugzilla #479, Roland Mainz, Juliusz Chroboczek, Egbert Eich).
- 312. Fixed screen switching problem on SCO where VT was off by one 
-      (Bugzilla #470, Kean Johnston).
- 311. S3 driver:
-      . allow only specific displayWidths when acceleration is enabled 
-      . added double_scan support (Egbert Eich).
- 310. Removed build rules for hp Xserver that was recently removed from 
-      Xserver/Imakefile (Egbert Eich).
- 309. Fixes for C&T driver: 
-      . switch to SW mouse in doublescan modes.
-      . centered video correctly for all interlaced modes (docs were
-        misleading).
-      . fixed README (Egbert Eich).
- 308. Fixed a typo in mkfontscale (Bugzilla #491, Juliusz Chroboczek).
- 307. A lot of X server prototype cleanups, including fixing an
-      inconsistency between the cfbBitBlt and CopyPlane functions 
-      exposed by the prototyping (#A.1859, Alexander Stohr).
- 306. Fix missing newline in Message -> MessageF transition in dri_glx.c
-      (#A.1833, Alexander Stohr).
- 305. Fill out the sunleo man page (#A.1783, Arnaud Quette).
- 304. Fix a typo in the XSetWMProtocols(3) man page (#5697, Alexander Pohoyda).
- 303. Fix for a few Xlib charset converters (Bruno Haible).
- 302. Fix calculation of CRTC2 frame offset with page flipping in radeon driver
-      (Michel Daenzer)
- 301. Xinerama-fy the XTest extension (Rik Faith).
-
-XFree86 4.3.99.8 (10 July 2003)
- 300. X.Org IPv6 changes (Bugzilla #227, Alan Coopersmith, Marc La France).
-      See http://www.x.org/IPV6_Specific_Changes.html for details.  This has
-      been further modified as follows.
-      - Deal with small memory leaks in xdm & xauth.
-      - Fix a number of compilation issues.
-      - Where supported, use SIOCGLIFCONF to query network interfaces on more
-        than only Solaris.
-      - Incorporate X.Org responses to comments #'s 1, 2, 4, 5, 7, 10, 11, 12,
-        13, 14 and 15 (taken from an X.Org-internal document dated 2003.06.17).
-      - Replace HasIPv6 imake symbol with BuildIPv6, defaulting it to YES, and
-        build in IPv6 support whenever BuildIPv6 is asserted _and_ the OS
-        #define's AF_INET6.  This is to maximise IPv6 code exposure and
-        eliminate <OS>.cf file changes to support IPv6.
- 299. On Solaris, don't allow remote root xdm logins if CONSOLE is set in
-      /etc/default/login (Bugzilla #227, Alan Coopersmith).
- 298. Fix SEGV in fstobdf when font server is not specified and FSServerName()
-      returns NULL (Bugzilla #227, Alan Coopersmith).
- 297. Fix XDMCP bug that could cause local host entries in /etc/X0.hosts to be
-      lost (Bugzilla #227, Alan Coopersmith).
- 296. Make certain xtrans static variable volatile to avoid optimisation issues
-      that occur when they are modified by SIGALRM handlers
-      (Bugzilla #227, Alan Coopersmith).
- 295. Use %p instead of %x to print pointer values in xtrans debug messages to
-      avoid overflow on platforms with 32-bit ints & 64-bit pointers
-      (Bugzilla #227, Alan Coopersmith).
- 294. Change SUN-RPC code to use authdes_seccreate() call rather than the
-      deprecated authdes_create() (Bugzilla #227, Alan Coopersmith).
- 293. Add xdm /dev/random handling for Solaris
-      (Bugzilla #227, Alan Coopersmith).
- 292. Solaris compile fixes (Bugzilla #227, Alan Coopersmith).
- 291. Update X.Org version numbers to X11R6.6 or X11R6.7 and replace old
-      references to X Consortium with X.Org (Bugzilla #227, Alan Coopersmith).
- 290. Update the usage of DRM AGP handles so that valid handles aren't
-      mis-interpreted as invalid handles (based on Bugzilla #484, Dave Airlie).
- 289. Twisting fontfile.c and fontdir.c to be able to pass all fonts (bitmap
-      and scaleable) to the scalable renderer as this one can deal with 
-      XLFD names (Bugzilla #475, Juliusz Chroboczek). PLEASE TEST!
- 288. Changing PS/2 mouse resolution to 8 counts/mm as some broken mice have
-      problems with other values (W. uses 8) (Egbert Eich).
- 287. Fixing mode setting by BIOS. Wrong clock selection in MiscOut register
-      caused screen to stay blank (Egbert Eich).
- 286. Added description for -dumpSched and -schedInterval to the usage
-      message (Egbert Eich)
- 285. Update the SCO OpenServer port, fixing these specific problems:
-        . Fixed the Imake template so i[3456]86 and friends arent defined
-        . Fixed bad preprocessor stuff in X11.tmpl that was producing warnings
-        . Updated default GCC flags to more aggresively optimize
-        . Fixed keyboard LED handling
-        . Enable SCO function keys in xterm
-        . Make Delete key send  DEL by default on SCO in xterm
-        . Fix to make fonttosfnt compile (Bugzilla #470, Kean Johnston).
- 284. Added missing ro2 symbols file to list of files to install 
-      (Bugzilla #476, Egbert Eich).
- 283. Corrected precedence problem in test in xc/lib/X11/XKBUse.c:
-      XkbUseExtension(). This avoids an extra round trip during application
-      startup (Bugzilla #473, Owen Taylor).
- 282. Fixing deadlock in libXi - when is called _XLockDisplay() twice - when 
-      calling a Xi function that calls XGetExtensionVersion() (Bugzilla #260,
-      Bastien Nocera, Owen Taylor). 
- 281. Adding support for video modes <320x240 to S3 driver by changing the 
-      minimal clock frequency to 15.6 MHz (Bugzilla #472, Alexey Baj).
- 280. Made mkfontscale behavior and options compatible to mkfontdir, fixed
-      bugs in output format (Bugzilla #425, Juliusz Chroboczek, Kean Johnston).
- 279. Changed xclock hands back to black (antialiased) , created XClk-col.ad
-      to set colored hands instead, added missing documentation for missing
-      resources. This follows the behavior of the other X applications more
-      closely (Bugzilla #437, Joerg Wunsch).
- 278. Added support for Trio64UV+ and Trio64V2/DX/GX to S3 driver (backport
-      from 3.x) (Bugzilla #465, Alexej Baj).
- 277. Increased Xlib default buffer size to 16k (was 2048), made size 
-      configurable thru environment variable XLIBBUFFERSIZE (minimum 2048)
-      (Bugzilla #466, Roland Mainz).
- 276. Increased maximum BIGREQUEST size to 4Mb and made it configurable thru
-      a command line option. This increases performance of certain 
-      applications considerably (Bugzilla #460, Roland Mainz).
- 275. VIA driver: initialized screen parameters in PreInit() instead of
-      AccelInit() so that they are set even when acceleration is disabled
-      (Egbert Eich).
- 274. Do not drop H&V sync during screen blanking for Radeon
-      (Bugzilla #320, Michael Breuer, Hui Yu at ATI).
- 273. Let out-of-limit pixel clocks only use the frequency below pll output
-      lower limit for Radeons (Bugzilla #262, John Vickers, Hui Yu at ATI).
- 272. Add support for Radeon cards with DAC/TMDS wire up in different ways
-      from what the driver was originally programmed to; includes support
-      for dual DVI cards (Hui Yu at ATI).
- 271. Add Radeon DPMS handling for flat panels (Bugzilla #26, Hui Yu at ATI).
- 270. Decreased the retry loops in DDC probing so that Radeon startup
-      time won't be too long in the worst case (Hui Yu at ATI).
- 269. Fix Radeon Asic bug in RMX unit of IGP chips (Hui Yu at ATI).
- 268. Fix Radeon register initialization for RGB offset to fix the
-      "milky-screen" problem (Bugzilla #351, Hui Yu at ATI).
- 267. Add support for new Radeon chips: R350(9800), RV350(9600,M10),
-      RS250(IGP7000), RS300(IGP9000), RV280(9200) (Hui Yu at ATI).
- 266. Fix a lockup with the trident driver when stopping/starting Xv
-      applications (Alan Hourihane).
- 265. Fix initialisation in xauth (Martin Birgmeier).
- 264. Calling RADEONSaveFPRegisters() regardless of display type to catch
-      register restauration problems (Bugzilla #193, Hui Yu).
- 263. Fixed order of name and filename in encodings.dir files generated by
-      mkfontscale (Roland Mainz).
- 262. Changed resource registration in TDFX driver: VGA mem resources
-      are unused during OPERATING state, RAC isn't required for memory
-      resources (Bugzilla #357, Egbert Eich).
- 261. Attempt to fix VIA driver lockups when moving windows:
-      assumed bug compatibility to previous S3 products 
-      (Bugzilla #435, Egbert Eich).
- 260. Disabled mode writeback to client program from MGA driver (Egbert Eich).
- 259. #ifdef'ed variables in os-support/bsd in cases they are not needed
-      (Bugzilla #430, Jason L. Wright).
- 258. Fixes and updates for XKB keyboard maps:
-      - add Faroese keyboard map (Bugzilla #401, Roi a Torkilsheyggi)
-      - add missing KPPT key to ABNT2 keycodes list (Bugzilla #431, Christian
-        Tosta)
-      - fix geometry/pc file (Alexander Pohoyda).
- 257. Don't sleep on Darwin for directory owner/mode problems (John Harper).
- 256. Limit 430TX and 430VX to 128 and 32 PCI buses respectively
-      (Marc La France).
- 255. Add direct GLX rendering on Mac OS X and Apple-DRI extension
-      (John Harper).
- 254. Replaced inline asms with compier intrinsics for Intel compiler
-      (Bugzilla #427, Slava Sysoltsev).
- 253. Partly fixed build problems caused by mkfontdir replacement
-      (Bugzilla #425, Egbert Eich).
- 252. SiS driver update:
-      Fixed Xabre support
-      (Final) fix for Compaq 3045US
-      Customized timing for 848x480 parallel panels
- 251. Replaced mkfontdir by simple shell script that calls mkfontscale
-      (see #233) (Bugzilla #388, Juliusz Chroboczek).
- 250. Added encoding files for Arabic (iso8859-6.16 and iso8859-6.8x)
-      (Bugzilla #420, Roland Mainz).
- 249. Removed O_SYNC from open call for /dev/mem for all Linux platforms.
-      This hopefully takes care of the speed problem 
-      (Bugzilla #419, #414, Egbert Eich).
- 248. Fixed fontstosfnt to build on OS/2 (Bugzilla #415, Frank Giessler
-      Juliusz Chroboczek).
- 247. Fixed DMC touchscreen driver: button press events are properly
-      recognized now, made sure device is still recognized after a restart,
-      fixed misleading error messages (Bugzilla #418, Andreas Kies).
- 246. Added PanoramiX supprt for the RENDER requests: Trapezoids, Triangles,
-      TriStrip, TriFan, SetPictureTransform and SetPictureFilter 
-      (Bugzilla #138, Egbert Eich).
- 245. Fixed SW/Theme cursor drawing glitches in i740 driver (Bugzilla #21,
-      Egbert Eich).
- 244. Added input driver for Aiptek tablet (Bugzilla: #393, (list #5686), 
-      Bryan W. Headley).
-
-XFree86 4.3.99.7 (25 June 2003)
- 243. Added 'BitKeeper' to the directories that get excluded by lndir
-      (Bugzilla #408, H.J.Lu).
- 242. Fixed gcc warnings in xdmauth.c (Bugzilla #410, Jason L. Wright).
- 241. Updated Citron touchscreen driver: set 'block duration time'
-      to one second to avoid timeouts, added user strings to inform about
-      HW version (Peter Kunzmann).
- 240. Fixed wraparound bug in TimerSet() (Peter Osterlund).
- 239. Fixed X*LookupString() in imDevLkup.c to return status 
-      XBufferOverflow and the required size as required 
-      (Bugzilla #397, Kusanagi Kouichi).
-      Dto. for imLcLkup.c (Egbert Eich).
- 238. Removed unused function QualifyName, Exit() from Xprint 
-      and CountBits(), matchVisuals() from GLX 
-      (Bugzilla #395, #400, #394 Jason L. Wright).
- 237. Fixed type warning when building sunffb driver on 64bit 
-      (Bugzilla #404, Jason L. Wright).
- 236. Fixed warnings when building Palmex touchscreen driver statically
-      (Bugzilla #405, Jason L. Wright).
- 235. Fixes and updates for XKB keyboard maps:
-      - add programmers variant to the Turkish keyboard map (Nilgün Belma
-        Bugüner)
-      - add a variant of the Romanian keyboard map for German keyboard
-        (Manfred Pohler)
-      - add layout for BTC 9001AH keyboard (Nick Kurshev)
-      - add Uzbek keymap description (Bugzilla #391, Mashrab Kuvatov)
-      - update geometry files (Alexander Pohoyda)
- 234. Added fonttosfnt, a utility that generates bitmap-only TTFs. It is
-      capable of reading most font formats (Bugzilla #389, 
-      Juliusz Chroboczek). 
- 233. Added functionalities to mkfontscale so mkfontscale performs every
-      functionality mkfontdir does (Bugzilla #387, Juliusz Chroboczek).
- 232. Removed absolute path from cpp for Linux as /usr/bin/ should be
-      in the default search patch (Egbert Eich).
- 231. Fix regression of Xvideo not working with some videos on the
-      CyberBladeXP/Ai1 chips (Bugzilla #251, Stephane Voltz).
- 230. Added early failure and warning message when not sufficient memory
-      available for DRI in i8xx driver (Egbert Eich).
- 229. Fix bug in original patch which added support for two new relocation
-      types for IA64 (Bugzilla #195, John Dennis).
- 228. Fix scaling calculus in savage driver (Bugzilla #274, Emmanuel).
- 227. Clarifying if conditions, fixing memory leaks in error path, removing
-      useless code in savage driver (Bugzilla #278+279, Emmanuel).
- 226. Adding message to R128 driver which informs about modified modes for LCD
-      according to VBIOS (Bugzilla #23, Egbert Eich).
- 225. Fixed chipset ID for v2100/v2200 for overrides (Egbert Eich).
- 224. Added interlaced support for Voodoo 3,4,5 to TDFX driver (Bugzilla #383,
-      Jakub Bogusz).
- 223. Fixed typo in getPciBiosTypes() (Bugzilla #382,  Jakub Bogusz).
- 222. Restore previous mode if mode switch fails (Bugzilla #381, Jakub Bogusz).
- 221. Fixed typo that prevented lubB19 fonts with different maps from being
-      generated (Bugzilla #380, Jakub Bogusz).
- 220. Sync entrypoints for OS/2 with recent changes in fontconfig and Xft
-      (Bugzilla #374, Frank Giessler).
- 219. Added detection of 2Mb memory for CLGD7548, fixed a possible memory 
-      leak and did minor cleanups (Bugzilla #369, Lucas Correia Villa Real). 
-      (PLEASE TEST!)
- 218. Recode single-byte keyboard scancodes that clash with recoded
-      double-byte scancodes (David Dawes).
- 217. Fixes and updates for XKB keyboard maps:
-      - add more EuroSign to "us_intl" keyboard map (Paul Bolle)
-      - update geometry files (Alexander Pohoyda)
-      - add AudioMute key to inet(hpxe3gc) (Bugzilla #350, Paul Pacheco)
-      - add option for replacing RCtrl key with Right Alt (Bugzilla #343,
-        Adam Tlalka)
-      - add Uzbek keyboard map (Bugzilla #372, Mashrab Kuvatov)
- 216. (Re-)fix portability of gccmakedep and generate ccmakedep on all
-      platforms (Marc La France).
- 215. Fix i810/i815 problem with interlaced modes where only the top half
-      of the screen gets displayed (Paul Stewart).
- 214. Changed any occurance of x86_64 to AMD64, the official name of the
-      architecture (Egbert Eich).
- 213. Removed Copyright sign from man pages as this causes some formatters
-      to choke (Egbert Eich).
- 212. Export SysV IPC functions to modules in Net and OpenBSD 
-      (Bugzilla #355, Quentin Garnier). 
- 211. Fix rootless bug when reordering windows behind others (Torrey T Lyons).
- 210. Fix page size issues that prevented the mmap()'ing of SBUS devices
-      (Marc La France).
- 209. Fixes for the following problems on OS/2:
-       - long startup delay of xinit
-       - recovery from hard-error popups
-       - text-mode version of xf86cfg
-       - xf86cfg unable to find default config file
-       - installation of static libraries
-       - missing exported functions in X11.dll
-       - typo in xf86pathIsAbsolute()
-      (Bugzilla #267, Frank Giessler).
- 208. SiS driver update:
-      Fixed 1280x960 and 1280x1024 LCD support (SiS 30x)
-      Added Chroma-Keying support to Xv part
-      Added support for Barco iQ R and G series projectors
-
-XFree86 4.3.99.6 (10 June 2003)
- 207. Add support for the Mac's KP_Equal key (untested) (David Dawes).
- 206. Import fontconfig 2.1.0 as an external package, and update the build
-      to use this version (David Dawes).
- 205. New version of the FreeType backend. (Bugzilla #325, Juliusz Chroboczek).
- 204. Rework XDarwin's Cocoa rootless implementation to use new generic
-      rootless code in miext/rootless (Torrey T. Lyons).
- 203. Fix repeated image problem when using a vesa video mode before starting
-      the Xserver on the S3 Trio3D cards (Alan Hourihane).
- 202. Import zlib 1.1.4 for systems that don't provide it (Matthieu Herrb).
- 201. Improve fonts width and weight detection (Bugzilla #265-266,
-      Juliusz Chroboczek).
- 200. Fix library dependencies for xlibi18n modules (Bugzilla #82, Joe Kelsey,
-      Matthieu Herrb).
- 199. Fix manual pages typos (Bugzilla #316, Jens Schweikhardt).
- 198. Fix bug (Bugzilla #315) in _XTextPropertyToTextList() that causes
-      an application crash in some circumstances (Ivan Pascal).
- 197. Fixes and updates for XKB keyboard maps:
-      - add asciitilde to Swedish 'nodeadkeys' map (Bugzilla #291).
-      - add map for true Romanian keyboard (Bugzilla #300, Manfred Pohler).
-      - add EuroSign to "us_intl" keyboard map (Bugzilla #309, Paul Bolle).
-      - fix some keys in Armenian 'phonetic' layout (Bugzilla #313, Ani).
-      - add some geometry files (Alexander Pohoyda).
-      - some cosmetic changes.
- 196. Import FreeType 2.1.4, and do initial merge for config/build
-      (David Dawes).
- 195. Remove unnecessary links of libm (Marc La France).
- 194. IRIX 6.5 build fixes and noise reductions (Marc La France).
- 193. Clean up confusion in Imakefiles between XONLYLIB and XLIBONLY (and
-      between DEPXONLYLIB and the previously non-existent DEPXLIBONLY)
-      (Marc La France).
- 192. Do not unnecessarily link libXmu, libXt and/or libXext into executables
-      (Marc La France).
- 191. Fix makedepend for IRIX 6.5 (Marc La France).
- 190. Make the handling of X_BYTE_ORDER in Imakefiles more portable
-      (Marc La France).
- 189. Allow building of a libXfont without font cache support (Marc La France).
- 188. When using cpp to generate scripts and data files, change XCOMM to pound
-      signs even when preceeded by only whitespace, and provide a means to
-      generate output lines with trailing backslashes.  Change `startx` script
-      accordingly (Marc La France).
-
-XFree86 4.3.99.5 (25 May 2003)
- 187. Fix XDMCP queries in xdm on systems using getifaddrs(). 
-      (Bugzilla #277, Joel Ray Holveck). 
- 186. Initial imake/config support for more closely (and more
-      automatically) emulating how libtool handles shared library revisions.
-      Implmemented for Linux only so far (David Dawes).
- 185. Fix libexpat shared lib revision on platforms that use minor version
-      numbers (David Dawes).
- 184. Update Tamil keyboard map (Thuraiappah Vaseeharan).
- 183. Add missing xfs reply to GetEventMask requests (Marc La France).
- 182. Change the ELF loader to ignore .debug* sections (Marc La France).
- 181. Simplify internal interfaces in the PCI code and remove the Xserver's
-      interference with normal PCMCIA operation (Marc La France).
- 180. i810/815 depth buffer needs to be a multiple of the tile size.  This
-      fixes 3D corruption near the bottom of the screen at 800x600 at 16bpp
-      (Bugzilla #283, Dave Airlie).
- 179. SiS driver update
-       - Allow Modelines for LCD and secondary VGA on 301B
-       - Support plasma panels natively (including a small
-         database for some known panels since some panels
-	 report wrong timing data via DDC)
- 178. DRM resync from the DRI trunk...
-       - Lots of fixes/cleanups/resyncs for the BSD DRM drivers (Eric Anholt).
-       - Fix potential oops and memory leaks when allocations fail in
-         addbufs_agp/pci (Leif Delgass).
-       - Add support for buffer private structs with PCI DMA buffers
-         (Leif Delgass).
-       - Disable MTRRS on FreeBSD-stable (Eric Anholt).
-       - Remove some unused code (Keith Whitwell).
-       - Move prototypes for gamma functions to gamma_drv.h (Keith Whitwell).
-       - 2.5.x resync (Linus Torvalds).
-       - Ensure driver has been initialized before installing irq handler,
-	 and modify all drivers to ensure irq handler is removed before
-	 cleanup, and cleanup is called at takedown (Leif Delgass).
-       - Check for lock on init/cleanup in all drivers except i810/i830
-         (Leif Delgass).
-       - Put back __HAVE_KERNEL_CTX_SWITCH for the sparc drm driver
-         (Keith Whitwell).
-       - Only free original pagelist in addbufs_pci if one already exists
-         (fixes oops) (Leif Delgass).
-       - texmem-0-0-1 branch merge (Ian Romanick).
-       - Fix warning on machines where sizeof(drm_addr_t) != 4 (Randy Dunlap).
-       - Support AGP bridges where the AGP aperture can't be accessed directly
-         by the CPU (David Mosberger, Benjamin Herrenschmidt, Michel Daenzer,
-         Paul Mackerras, Jeff Wiedemeier).
- 177. Fix another xedit compile problem (Marc La France).
- 176. Small fix for Italian keyboard map (Sebastiano Vigna).
- 175. Don't ship xf86Bus.h and xf86pciBus.h with the SDK (Marc La France).
- 174. Restore VGA driver's checking for depths 1, 4 & 8 (Marc La France).
- 173. Fix a problem with savage driver when UseBIOS is off, such that the
-      performance drops dramatically. Now the performance matches or
-      exceeds that of the option UseBIOS (Alan Hourihane).
- 172. Add workaround for problems that arise when in multi-layout map
-      different modifier keysyms share the same key (Ivan Pascal).
- 171. Fix bug that causes XGetKeyboardMapping produce incorrect map when keys
-      have more then two keysyms.  Also add a map columns duplication for better
-      compatibility with core protocol keyboard maps (Ivan Pascal).
- 170. Fix XKB bug (Bugzilla #253) that causes an Xserver crash when XKB action
-      RedirectKey is used (Ivan Pascal).
- 169. Add missing letters to Ukrainian phonetic keyboard map (Andriy Rysin).
-
-XFree86 4.3.99.4 (10 May 2003)
- 168. Prevent a SIGFPE with the glint/pm3 driver when attempting to display
-      an XVideo image less than 8 pixels wide (Måns Rullgård).
- 167. Support for building a DRI enabled server on OpenBSD (Wilbern Cobb,
-      Matthieu Herrb).
- 166. Fix double free bug when a Mac-specific font fails to load with
-      Freetype (Torrey T. Lyons).
- 165. Check for NULL tObj in the i830 3D driver's TexEnv function.  This
-      fixes a FlightGear crash (Keith Whitwell).
- 164. Set Mesa hooks to flush vertices on state changes in Radeon 3D drivers
-      (Keith Whitwell).
- 163. Add an entry to the i2c module that drivers can call to retrieve an array
-      of all I2C buses associated with a screen (Marc La France).
- 162. Fix to prevent PCI and CardBus resets when switching out of the server's
-      virtual console (Marc La France).
- 161. Change the /dev/ file used on some *BSD's to mmap the framebuffer in DGA
-      clients to match the /dev/ file used by the server (Marc La France).
- 160. SiS driver fixes:
-      - Added MergedFB mode (including HWCursor and Xv)
-      - Xv enhancements and fixes for all chipsets
-      - New Xv properties (SWITCHCRT, TVPOSITION, etc)
-      - Added support for custom LCD resolutions (via DDC)
-      - Fixed DVI output (DVI-D and DVI-A), automatic detection
-      - Numerous bugfixes and enhancements
-      (Thomas Winischhofer)
- 159. Make freetype-config more useful on NetBSD (#5693, Thomas Klausner).
- 158. Small fixes in keyboard maps:
-      - add an explicit type declaration in level3(ralt_switch)
-        (Bugzilla #225, Séamus Ó Ciardhuáin);
-      - fix wrong group number in Russian keyboard map (Ivan Pascal).
- 157. Add rootless implementation for XDarwin using Apple's Xplugin API
-      (John Harper, Torrey T. Lyons).
- 156. Fix precision problems in xf86XVClipVideoHelper and in Mach64 XVideo
-      support (Marc La France).
- 155. Add missing symbols when DRI is disabled to glint driver
-      (Bugzilla #203, Mike Harris).
- 154. Fix a memory leak caused by the data allocated in XGetDefault() never
-      being freed (Jim Radford).
- 153. Update keysym capitalization rules in XConvertCase() with unicode
-      keysyms and some missed charsets (Bugzilla #209, Séamus Ó Ciardhuáin).
- 152. Use C89 style function prototypes in manual pages (Bugzilla #208,
-      Aidan Kehoe).
- 151. Fix small memory leaks in XvQueryAdaptors() and __driUtilCreateScreen()
-      (Jim Radford).
- 150. Updated Wacom driver to support ntuos 2 2D mouse and a few styli,
-      TabletPC with ISD V4 protocol, intiq 15X and Cintiq 18SX 
-      (Wacom).
- 149. Fix programming error in ix86 motherboard chipset determination
-      (Marc La France).
- 148. Ansi prototypes cleanup in Xserver/include and Xserver/os 
-      (Matthieu Herrb).
- 147. Fix shared libXp dependencies on *BSD and Darwin (Dale Rahn). 
- 146. Fix infinite loop that occurs on systems whose PCI configuration space
-      doesn't advertise a host bridge (Marc La France).
- 145. Workaround for broken devices that don't implement the header type field
-      in their PCI configuration space (Marc La France).
- 144. Portability changes for older Sun compilers (Alan Coopersmith).
-
-XFree86 4.3.99.3 (25 April 2003)
- 143. Fix building of the dristat and drmstat utilities (David Dawes).
- 142. From the DRI trunk...
-       - Remove more dead code from the BSD DRM (Eric Anholt).
-       - Remove some #if 0'd code and unused string functions from the Linux
-         DRM (Keith Whitwell).
-       - Move debug versions of the DRM memory functions to a new file
-         (Keith Whitwell).
-       - drm_memory cleanup (Leif Delgass).
-       - dristat and drmstat cleanups (Leif Delgass).
-       - Remove unused dev->map_count (Leif Delgass).
-       - For the i830 DRM driver, pass the dma handle from pci_alloc_consistent
-	 to the card for status page rather than using virt_to_bus on
-	 the virtual address (Leif Delgass).
-       - Cleanup the style of the linux-compat code in the BSD DRM, and use
-         ioctl directly rather than reimplementing it (Eric Anholt).
- 141. Remove old XF86Setup source code. (Matthieu Herrb).
- 140. Only add all default modes to mode list when RandR is enabled and 
-      active (Egbert Eich).
- 139. MGA driver: vertical blanking can generate interrupt (2D driver part)
-      (Ville Syrjala Bugz.: 199).
- 138. Fix mmapw SEGV (Marc La France).
- 137. From the DRI trunk...
-       - Install dummy/noop read & poll fops unless the driver has
-         replacements (Keith Whitwell).
-       - Remove gamma-specific stuff from the BSD DRM (Eric Anholt).
-       - Remove DRM_DMA_HISTOGRAM and associated code from the BSD DRM
-         (Eric Anholt).
-       - Remove BSD DRM's unused drm_init.h (Eric Anholt).
-       - Handle read() failures in the drm X server module (Michel Daenzer).
-       - Set DRM device major for NetBSD.
- 136. Fix bug that prevented fbman from using the last partial scanline of a
-      Mach64 framebuffer (Marc La France).
- 135. Make ATI Mach64 FIFO cache integrity testing optional (Marc La France).
- 134. Export ATI Mach64 hardware overlay as an XVideo adaptor (derived from
-      GATOS project, Egbert Eich, Marc La France).
- 133. Reorganise ATI Mach64 support into separate source files
-      (Marc La France).
- 132. Refine atimisc's decoding of the panel mode on server entry in an attempt
-      to reduce the effect of atyfb bugs (Marc La France).
- 131. Make Rage128 and Radeon XVideo available even when 2D acceleration is
-      disabled (Marc La France).
- 130. There is no longer any need to require hardware cursors during Rage128
-      and Radeon XVideo displays (Marc La France).
- 129. Initialise v4l's XVideo adaptors last (Marc La France).
- 128. Reduce cut&paste effects by adding more helpers to Xv
-      (derived from #5645, Björn Augustsson, Marc La France).
- 127. Centralise a region comparison primitive into 'mi' and use it instead of
-      local definitions throughout the server (Marc La France).
- 126. DPMSExtension & XvExtension driver cleanups (Marc La France).
- 125. Add missing tests for vtSema to xaa 'Picture' functions.
-      These missing checks caused strange behavior with some drivers
-      when RENDER extension requests were made while X was switched away.
-      (Egbert Eich).
- 124. i810 driver: call drmCtlUninstHandler() on CloseScreen() 
-      (David Airlie).
- 123. Savage driver updated to 1.1.1.27: several fixes for video glitches
-      (Tim Roberts).
- 122. Put back the DRM part of Charl Botha's Radeon suspend/resume support
-      that was inadvertently backed out in the DRI resync last week.
- 121. Resync the Linux drm modules with the DRI trunk.  Includes:
-       - Check for NULL map before calling DRM(ioremapfree) on cleanup
-         (Leif Delgass).
-       - Remove DRM read, poll and write_string (Keith Whitwell).
-       - Add more get_param queries for embedded project (Keith Whitwell).
-       - Move a bunch of gamma-specific code into a gamma-specific file,
-         and restore the kooky DRM(write_string) code for gamma
-         (Keith Whitwell).
-       - Remove unused DMA histogram code (Keith Whitwell).
-       - Remove unused 'DRM_FLAG_NOCTX' option (Keith Whitwell).
-       - Remove unused __HAVE_KERNEL_CTX_SWITCH code (Keith Whitwell).
-       - Fix templates so the i8x0 drivers don't have to define
-         __HAVE_DMA_WAITLIST (Keith Whitwell).
-       - Gamma drm updates (Alan Hourihane).
-       - Only mga, i810, i830 require AGP (Leif Delgass).
-       - Remove PCIGART_ENABLED define for radeon, pcigart support now
-         included for any arch (Leif Delgass).
-       - Get rid of superfluous fields in struct drm_radeon_ring_buffer
-         (Michel Daenzer).
-       - Use correct address for radeon ring read pointer writeback
-         (Michel Daenzer).
- 120. Fix a potential bug in ZX1 support (Marc La France).
- 119. Fix a buffer overflow in xkbprint (Ivan Pascal).
- 118. Fix a bug in Xlib that prevents a vertical text drawing with
-      X[mb|wc]DrawString (bugzilla #178, OSAME Ken-ichiro).
- 117. Added missing files to the SDK so it can actually be used (Sven Luther).
- 116. mkfontscale enhancements (bugzilla #166, Julius Chroboczek). 
- 115. Fix handling of local host names in /etc/X<n>.hosts (bugzilla #156,
-      Alan Coopersmith).
- 114. Add to XLookupString an automatic search of the layout which keysym can
-      be converted to a control-code when Control modifier is set (Ivan Pascal).
- 113. Fix xkbcomp crash with some combinations of layouts in a multi-layout
-      keyboard map (Ivan Pascal).
- 112. Keyboard maps cleanups, including:
-      - fix incorrect aliases in a keycodes file.
-      - remove unneeded type declarations.
-      - remove ThirdLevel modifier key descriptions in maps and replace them
-        with references to a common one in 'level3' file.
-      - some cosmetic changes.
-      (Ivan Pascal).
- 111. Fix some function definition conflicts from Xlib cleanup when X_LOCALE
-      or NeedWidePrototypes is set (Torrey T. Lyons).
- 110. Resync the BSD drm modules with the DRI trunk (Eric Anholt).
- 109. Resync the Linux drm modules with the DRI trunk.  Includes:
-       - Add 2nd arg for DRM_FREE (Keith Whitwell).
-       - Use file pointers instead of pids for resource and lock tracking
-         (Keith Whitwell).
-       - Add 'SG' map type identifier string ((pci scatter/gather) to /proc vm
-         info (Leif Delgass).
-       - Use list_entry() to get container struct from struct list_head
-         pointers.  Build fix for RedHat 9 kernel (5 args to
-         remap_page_range()) (Leif Delgass).
- 108. Fix a server crash with shadowfb and render when refreshing outside the
-      visible screen (Sven Luther).
- 107. Fix a potential infinite loop during server generation when in
-      Xinerama (Rik Faith).
- 106. Fix DRM module build on 2.5.41 and later kernels (tqueue -> workqueue)
-      (David Dawes).
- 105. Fix lockup when using Xv in the trident driver (Alan Hourihane).
- 104. Add support for TV chipsets VT1621 and CH7005 to the trident driver
-      (VIA, Alan Hourihane).
- 103. Add VIA CLE266 driver (Bugzilla #154, VIA/S3)
- 102. Remove non-functioning glxStub, and remove external GlxStaticServerLib
-      support (David Dawes).
- 101. Change the WORLDOPTS default to empty.  This means that 'make World'
-      will now stop on the first error.  To get the old behaviour, run
-      'make WORLDOPTS=-k World' (David Dawes).
- 100. Add preliminary version of generic rootless code based on XDarwin's
-      rootless mode (Torrey T. Lyons, John Harper).
-  99. Remove PEX and XIE source code (Matthieu Herrb).
-  98. The XKB version of XRefreshKeyboardMapping() had an UnlockDisplay()
-      call without a preceding LockDisplay() call (Yoel Perl).
-  97. Xlib cleanups and fixes, including:
-       - Fixed up any old style function defintions that raised warnings.
-       - Fixed functions with no parameter or return value.
-       - Moved any external prototype in a c-files to h-files.
-       - Set unreferenced and unmentioned functions to static.
-       - Completed any forward declartion with its calling parameters.
-       - Established function typedefs where might be helpful.
-       - Fixed bogus XIM callback function to XID type, fixed XPointer* -
-         XPointer mismatch on some callback.
-       - Added explicit FIXME XXX statement on locations for the work around
-         macro XCMS_CONVERSION_HARDWARE where the compiler was unsatisfied
-         about a known problem with the currently inconsistent src_to_CIEXYZ
-         table types.
-       - Split _XcmsSetGetColor and *Colors handling routine in order
-	 to avoid any type conflicts there, fixed a memory leak for
-	 error case in that area.  Used stack based Buffer for single-color
-	 version (should be simpler and faster).
-       - Fixed _XAsyncReply where a "register variable pend" was passed
-	 and returned with the & operator.  This location is further
-	 suspect of variable size problems on anything else but 32 bit
-	 platforms, with the new code it might more likely raise a type
-	 mismatch warning for those specific location.
-      (#A.1729, Alexander Stohr).
-  96. Fix the <KPDL> mapping for the hr XKB map, and add an hr_US map (#A.1726,
-      Vlatko Kosturjak).
-  95. Fix vmware driver crash when running two X servers concurrently (#5688,
-      Nolan Leake).
-  94. Rework the Linux drm kernel module build to leverage off the standard
-      kernel build system.  This is based on suggestions and examples from
-      David Woodhouse.  This approach has the advantage that the build
-      requirements of a wider range of standard kernels are now supported
-      transparently, but the disadvantage of some extra complexity to handle
-      building against clean vendor-distributed kernel source trees.
-      This has been tested with some recent Red Hat and SuSE distributions
-      (David Dawes).
-  93. Update Italian keyboard map (Bugzilla #109, Sebastiano Vigna).
-  92. Add keys missed in multi-layout keyboard maps: LSGT key in Belgian map
-      and 'old','phonetic' variants in Armenian map (Ivan Pascal).
-  91. More reliable workaround for handling the I830Sync() function being
-      called while VT switched away (David Dawes).
-  90. Fix references to DRI functions in non-DRI i810_driver.c build
-      (David Dawes).
-  89. Import expat 1.95.4 (Matthieu Herrb). 
-
-XFree86 4.3.99.2 (10 April 2003)
-  88. Fix file descriptor leaks in xman (Ted Unangst, OpenBSD PR#3186).
-  87. Fix bug in mode validation that occurs when the XF86Config doesn't
-      specify any mode or virtual resolution information (Marc La France).
-  86. Resetting 'bound' flag for an agp entry after undbind succeeded in
-      drm_agpsupport.h (Egbert Eich).
-  85. Ignoring hw_lock for drm device if lock was set by a different instance
-      (ie Xserver) to prevent second server to spin in driver release function
-      (currently only relevant for i8xx drm drivers) (David Dawes).
-  84. Adding extra delay before doing a slowBcopy in ia64 to prevent a MC
-      when saving/restoring VGA fonts (Egbert Eich).
-  83. Turn off needToSync in LeaveVT() in i830 driver to prevent server
-      crashes because xaa tries to sync blitter while switched away 
-      (Egbert Eich).
-  82. Added the O_SYNC flag when opening /dev/mem to work around a kernel bug
-      which causes conflits between WC settings in MTRR registers and cacheable
-      attribute in page table (Egbert Eich).
-  81. Reduced retry count for mouse configuration to 4. This should speed
-      up server start for people who use a mouse repeater like gpm
-      (Egbert Eich).
-  80. Fixed xf86cfg to duplicate font names before they get freed when
-      unloading the module (Egbert Eich).
-  79. Added missing functions to xf86cfg (Egbert Eich).
-  78. Added missing ROP_NEEDS_SOURCE to Savage driver;
-      now all 2D accel functions should use this flag (Egbert Eich).
-  77. Reduced flicker with video playback in Savage driver (Tim Roberts).
-  76. Load vgahw submodule in RENDITION driver before using it
-      (Egbert Eich).
-  75. Magically speed up video playback on Neomagic (Egbert Eich).
-  74. Added drmAgpUnbind()/drmAgpBind() functionality on Leave/Enter for i810
-      cards to allow a second Xserver to be started if the first one has
-      DRI enabled (Egbert Eich).
-  73. Set NeedRingBufferLow for i855/i865 to avoid lockups on vt switches
-      (Egbert Eich).
-  72. Check for vtSema before accessing registers in I830BIOSSaveScreen()
-      (Egbert Eich).
-  71. Some sanity fixes for atiprobe to work better with xf86cfg: Handle
-      situation gracefully if the PCI config pointer doesn't exist 
-      (Egbert Eich).
-  70. Changed behavior of fontfile: don't drop the entire directory if some
-      fonts cannot be rendered (Egbert Eich).
-  69. Fixed B&H bdf fonts: AVERAGE_WIDTH is not a string but an int (Mike Fabian).
-  68. Fixed type in radeon driver which caused display to go into
-      powersaving mode when Xcursor is disabled (Bugz: 90, Michel Dänzer).
-  67. Fixed typo in XKB-Config.sgml (Bugz: 53, Hiroyuki Bessho).
-  66. Fix SiliconMotion driver for mode switching and SEGV problem when
-      initializing Xv functionality (Bugzilla #50, Alan Hourihane).
-  65. Add Radeon DRI suspend/resume support (Charl Botha, #A.1431).
-  64. Rage 128 Xv fix for high resolution displays (Rik Faith).
-  63. PPC updates for Radeon (Michel Dänzer, Hui Yu at ATI).
-  62. Radeon patch from ATI (Hui Yu at ATI).
-      - IGP320/330/340 support (2D only)
-      - RV280 (9200/M9+) support
-      - Fix for some M9 laptop panels
-      - Improved version of monitor detection code previously submitted
-      - Fixed bug for two or more radeon cards
-      - Man page updates
-      - Workaround for double scan modes problem at high resolutions
-      - Overlay scaling problem when RMX is used
-  61. Fix xprop to get all windows (not only the first) in a property holding
-      a window list printed (#A.1676, Kim Woelders).
-  60. Fix for spontaneous repeated keyboard events during sync grab (#A.1713,
-      Michal Maruska).
-  59. Fixed DPMS problem on C&T 69000 due to incorrect LCD flag 
-      (Bugzilla #101, Egbert Eich).
-  58. Added xkb symbols layout for BTC 5090 internet keyboard  
-      (Bugzilla #57, Jack Angel).
-  57. Fix the Xinstall.sh script so that it can handle being run from a
-      directory with white space in its path name (#A.1690, Eric Branlund).
-  56. Allow AGPGART support to be enabled for OpenBSD (#A.1684, Brian Feldman).
-  55. Make the mouse driver check the SendDragEvents option (based on #A.1682,
-      Juuso Ã…berg).
-  54. Fix a double allocation in _XTextPropertyToTextList() (#A.1681,
-      Lubos Lunak).
-  53. Fix a typo that causes the 'yu' keymap to emit a lower case 'L' in
-      both shift states (#A.1675, Nikola Smolenski).
-  52. Allow the remote shell command for xon to be specified from the
-      command line.  This allows ssh to be used (for example) (#A.1657,
-      Mike Urban).
-  51. Fix segfaults that can happen when using composition of RENDER and
-      non-RENDER fonts (#A.1656, Wu Jian Feng).
-  50. Add convenient ways to enter "double quote" and "cedilla" with the
-      en_US.UTF-8 compose rules (Alexandre Oliva).
-  49. Improve support for Wacom Cintiq boards (#A.1547, Sebastian Rittau).
-  48. Add support for Kensington's "ValuMouse" to the mouse driver (#A.1494,
-      Roy Wood).
-  47. Workaround for a crash that happens if a scalable font has a bitmap
-      entry in fonts.dir (#5687, Juliusz Chroboczek).
-  46. Single/dual rasterizer quiescence patch for the glint/gamma DRI driver
-      (#5685, Sven Luther).
-  45. Fix a FreeBSD/alpha build problem (#5679, Fred Clift).
-  44. Fix a bug in the GLU/project.3gl man page (#5676, Thomas Klausner).
-  43. Luit fixes:
-       - Fix a buffer overflow.
-       - Allow for holes in the pty space, and use the union of the pty
-         names in 4.4BSD and recent FreeBSD.
-       - Allow luit to be set-uid on all BSD releases, and introduce an
-         additional security fix on POSIX saved-id systems.
-      (#5672, 5674, ITO Tsuyoshi, Juliusz Chroboczek).
-  42. Fix memory leaks in ProcXF86VidModeModModeLine and
-      ProcXF86VidModeValidateModeLine, and unintialized fields of the mode
-      structure in ProcXF86VidModeAddModeLine, VidModeCreateMode, and
-      VidModeAddModeline (#5671, Miguel Freitas).
-  41. Fix SEGV in fbdev's mode validation (Alexandr Andreev).
-  40. Add two more variations of Thai XKB maps (#5658,
-      Theppitak Karoonboonyanan, Visanu Euarchukiati,
-      Supphachoke Santiwichaya).
-  39. Fix a twm crash when the window menu is used and no windows are open
-      (#5667, Matthias Scheler).
-  38. Restore the sign of UNDERLINE_POSITION in the FreeType backend (#5665,
-      Roman Kagan).
-  37. Check the return value of fclose() in xauth to prevent losing the
-      existing contents of an Xauthority file when there is insufficient
-      space to write the new one (#5663, Owen Taylor).
-  36. Fix case in xmag which would cause a BadMatch during a X_GetImage for
-      single child of root class InputOnly.  Also do some null pointer
-      protection (#5657, Kevin Brosius).
-  35. Allow an arbitary message to be sent to the DDX by pressing a key
-      which has the appropriate action definition (#5519, Joe Moss).
-  34. Add a new request to the XF86Misc extension that allows a client
-      to send an arbitrary message to the DDX, which in turn can send the
-      message to the driver.  The driver may also send a string back.
-      An example of this is implemented for the radeon driver (#5518,
-      Joe Moss).
-  33. Remove duplicate XShmGetEventBase() declaration (#5656,
-      Branden Robinson).
-  32. Fix drag lock when using a mouse button greater than 4
-      (Bugzilla #51, Paul Elliott)
-  31. Fix lockup on server shutdown/restart with the radeon driver
-      (Bugzilla #94, Michel Dänzer).
-  30. Add missing symbols to reference list that show up when DRI is not
-      loaded in r128 driver (Bugzilla #83, Leif Delgass).
-  29. Add missing symbols to reference list that show up when DRI is not
-      loaded in mga driver (Bugzilla #84, Leif Delgass).
-  28. Various build and warning fixes (#A.1703, Peter Breitenlohner).
-  27. Avoid overlapping strcpy() in imake.c (Dan Nelson).
-  26. Updates for building on OS/2 (#5650, Frank Giessler).
-
-XFree86 4.3.99.1 (23 March 2003)
-  25. Xterm patch #176 (Thomas Dickey).
-  24. Another int10 fix.  This time for adapters found at PCI:0:0:0.  This
-      fix is particularly important for ZX1-based systems (Marc La France).
-  23. int10 fix for all ix86 non-Linux systems (Marc La France).
-  22. Add preliminary support for generating HTML and PDF versions of most
-      spec documents (David Dawes).
-  21. Use lower-case extensions uniformly for text and PostScript documents
-      (based on #4876, Branden Robinson).
-  20. Disable cuase of SEGV's in rendition driver (Marc La France).
-  18. Limit 440EX & 440LX based systems to 32 PCI buses (Marc La France).
-  18. Fix typo that caused incorrect initialization of xkb memory
-      (John Heasley).
-  17. Fix bug in trident driver that caused old Cyber 9382/9385 chipsets
-      to display half a jittered screen (Alan Hourihane).
-  16. Add shadowfb support to XDarwin IOKit mode (Torrey T. Lyons).
-  15. Change most of os-support/ to respect VIDMEM_READONLY (Marc La France).
-  14. Fix compatibility problem between modules generated without the recent
-      setjmp/longjmp work and a server generated using glibc <= 2.2.*
-      (Marc La France).
-  13. setjmp/longjmp related fixes for Linux/libc5 systems (Marc La France).
-  12. Fix possible overflow in _XlcLocaleDirName. (Matthieu Herrb).
-  11. Various NetBSD fixes for non-i386 (#5662, #5666 Aymeric Vincent, 
-      Matthew Green, Chris Gilbert, Thomas Klausner). 
-  10. Enable native thread support on NetBSD 1.6M and later (#5597, #5660, 
-      Matthias Scheler). 
-   9. Make setjmp/longjmp emulation save/restore blocked signal masks on all
-      libc5 & glibc systems (Marc La France).
-   8. Fix for non-PC keyboard bug introduced by changes to make SysRq
-      generate the same keycode as PrtScrn (Ivan Pascal).
-   7. Workaround for problems linking C programs against libGLU on FreeBSD 3.x
-      (David Dawes).
-   6. Make setjmp/longjmp emulation save/restore blocked signal masks on all
-   5. Fix setjmp/longjmp emulation for glibc 2.2.[01] systems and remove
-      HasGlibc21Sigsetjmp override (Marc La France).
-   4. setjmp/longjmp-related compilation fixes for libc5 systems
-      (Marc La France).
-   3. Fix minor glitch in the generation of Makefiles for libraries that don't
-      need threads support (Marc La France).
-   2. Fix XDarwin build broken by #960 (Shantonu Sen).
-   1. Fix StaticColor colormap on Darwin/x86 6.x (Rob Braun).
-
-XFree86 4.3.0 (27 February 2003)
- 964. Add an imake option to allow the glibc21-style setjmp() behaviour
-      to be forced when auto-detecting it fails (this is needed for RH 7.0).
- 963. Add missing raise/lower volume key descriptions for the "hpxe3gc"
-      XKB map (#A.1651, Paul Pacheco).
- 962. Fix some typos in the Syriac XKB map (#5654, Emil Soleyman-Zomalan).
- 961. Add documentation about using XKB for the XFree86 server's special
-      key sequences and the HandleSpecialKeys config option (#5653, Joe Moss).
- 960. Move the XF86_DATE definition to a separate file so that bumping it
-      doesn't trigger almost everything to be rebuilt (David Dawes).
- 959. Xterm patch #174 (Thomas Dickey).
- 958. Fix a bug that was preventing DGA2 acceleration from being advertised
-      by the i810 driver (David Dawes).
- 957. Fix an "xtt" font backend module crash that shows up on Linux/PPC,
-      related to an invalid code converter module being loaded because of
-      a broken string comparison in xttconv.c (#A.1647, Chisato Yamauchi,
-      Daisuke MASATSUNA).
- 956. Fix a NULL dereference that can happen in lcGenConv.c (#A.1646,
-      Anthony Fok Tung-Ling).
- 955. Bump the libXft minor revision for the UTF-16 APIs that were added
-      after rev 2.0 (#A.1643, A.1644, Keith Packard, 5652, Mike Harris).
- 954. Fix a typo in the "freetype" font backend that prevents "ttc" fonts
-      from working (#5651, Mike Fabian).
- 953. Fix atimisc bug in restoring colourmaps after a VT switch
-      (Marc La France).
- 952. A more complete set of dead accent/space compose sequences, add
-      <Multi_key> <slash> for letters with a "stroke", and add some
-      combos for exponent characters, katakana voiced sounds, etc to
-      the en_US.UTF-8 compose file (#5646, David Monniaux).
- 951. Reinstate the VBEInit() call in the savage driver's PreInit().  This
-      appears to fix a problem on some Savage MX platforms (#5649,
-      Mike Harris).
- 950. Restore the radeon driver's unconditional RADEONPreInt10Save() call
-      on Alpha platforms because this is needed for Radeon cards where the
-      BIOS ROM can't be read after it's been run once (by the firmware)
-      without this (#5648, Jeff Wiedemeier).
- 949. Update Newport driver doc (#5647, Guido Guenther).
- 948. Fix reversed logic for VGA locking/unlocking (Nat Ersoz).
- 947. Luit fixes:
-       - Fix a bug with --encoding being too strict with the syntax.
-       - Add a -x flag that causes luit to exit as soon as the child does.
-       - Update the man page to synchronise with Tomohiro's work on XTerm.
-      (#5643, Juliusz Chroboczek).
- 946. Fix some endianness bugs in the r200 DRI driver, and guard a debugging
-      print message (Michel Dänzer).
- 945. Fix radeon HW cursor artifacts when switching between 2-color and
-      ARGB cursors by always using the ARGB mode (#A.1639, Michel Dänzer and
-      Fredrik Höglund).
- 944. Fix rootless XDarwin crash when trying to GetImage with a rectangle
-      bigger then the associated top level window (John Harper).
- 943. Add support for multi-head on ZX1-based Itanium2 systems  (Marc La France
-      with documentation and assistance from Hewlett-Packard).
- 942. Correctly initialize the RE_LINE_PATTERN register in the radeon
-      and r200 DRI drivers (Keith Whitwell).
- 941. Fix a problem where a malformed Ximage can cause Xcursor to step
-      outside the image data (#A.1636, Keith Packard, reported by
-      Michel Dänzer).
- 940. Allow xf86setjmp/xf86setlongjmp to work with platforms where
-      setjmp() isn't directly available as a function, specifically Linux
-      platforms that use glibc 2.0 and 2.1. (David Dawes, Keith Packard).
- 939. Check pScrn->vtSema before calling xf86SetCursor() from
-      xf86CursorCloseScreen().  This avoids a segfault at exit with some
-      drivers (Alan Hourihane).
- 938. Fix adding FP native mode for Radeon (Hui Yu at ATI, Kevin Martin).
- 937. Initialize I2C when primary head has an invalid DDC type for the
-      Radeon driver (Hui Yu at ATI).
- 936. Video fixes for TV and TVOverscan for the nsc driver (Sarma Kolluru).
- 935. Fix to prevent ShadowComposite() to try to update the framebuffer
-      when server is switched away (Egbert Eich).
- 934. Fix problems where the ThirdLevel key and Alt modifiers don't work
-      when a map that uses the ThirdLevel virtual modifier is not the first
-      layout in a multi-layout configuration (#5642, Ivan Pascal).
- 933. Use safe values in the Thai XIM which should work regardless of
-      the signedness of XIMStringConversionPosition (#A.1628,
-      Theppitak Karoonboonyanan).
- 932. Replace xf86setjmp/xf86setlongjmp with symbol aliases that resolve
-      directly to the native libc versions so that they can operate in
-      modules, and make xf86jmp_buf much larger so that should be big enough
-      for any reasonable CPU/OS combination.  This should fix problems
-      with the Freetype2-based freetype font module (#A.1625, Keith Packard).
- 931. Change the default base symbols map from pc104 to pc105, which should
-      fix most cases where the <LSGT> key isn't defined.  Also change the
-      default XkbModel from pc101 to pc105 (Ivan Pascal).
- 930. Fix run-time enabling/disabling of VT switching via xf86EnableVTSwitch()
-      (David Dawes).
- 929. Add a "DontVTSwitch" option to allow VT switching to be disabled
-      (on platforms where the X server initiates VT switches) (#5640,
-      Branden Robinson).
- 928. Fix a memory leak in _XimExtension() (#5638, MINAMI Hirokazu).
- 927. Fix hard-coded ProjectRoot paths in the proxymngr man page (#5634,
-      Branden Robinson).
- 926. Fix a NULL pointer dereference in the fontenc library (#5633, Debian).
- 925. Update the neomagic man page to document the OverlayMem option (#5632,
-      Diego Santa Cruz and Branden Robinson).
- 924. Fix a memory leak in XCloseDisplay, and a potential race condition
-      when multiple threads attempt to initialize the Xcursor library
-      simultaneously (#A.1623, Keith Packard).
- 923. Fix xvidtune to pop up a info window if mode on chipset is
-      not tuneable (Egbert Eich).
- 922. Fix a NULL pointer in a var_arg list in xfd which causes problems
-      on 64 bit systems (Egbert Eich).
- 921. Fix a typo in the nsc Imakefile when installing the linkkit 
-      (#A.1624, Stanislav Brabec).
- 920. Remove a dependency on how Xlib buffers requests internally for
-      xtest's test 2 of XSync (Keith Packard).
- 919. Fix a bug in the way the bitmap font code calculates mix/max bounds
-      (it was ignoring empty characters), which fixes some xtest fonts
-      bounds check failures (Keith Packard).
- 918. Check that the HW cursor has been setup before calling
-      xf86ForceHWCursor() in the radeon (and r128) driver.  This fixes
-      crashes when using only the SW cursor (#5628, Michel Dänzer).
- 917. Fix duplicate arguments for xf86MatchPciInstances() in the DESIGN doc
-      (#5627, Guido Guenther).
- 916. Miscellaneous 64-bit and warning fixes to mfb, xf1bpp and xf4bpp
-      (Marc La France).
- 915. Fix a bug in beforelight that was preventing it from being restarted 
-      and could cause random X clients to be killed. (Matthieu Herrb)
- 914. Add a means by which a motherboard chipset driver can prevent the common
-      layer's check for mis-configured PCI-to-PCI bridges (Marc La France).
- 913. Fix bug that would sometimes cause an extra hardware cursor to re-appear
-      on a secondary head after a server reset (Marc La France).
- 912. Protect "cvl" references in recent changes to _XEventsQueued() with
-      '#ifdef XTHREADS' (reported by Dan Holm).
-
-XFree86 4.2.99.902 (17 February 2003)
- 911. Change the newport driver to use ShadowFBInit2 to fix the broken
-      "switching back from the console" issue, and update the driver's man
-      page (#5625, Guido Guenther).
- 910. SCO doc update (#5624, J. Kean Johnston).
- 909. Fix X11.tmpl so that Fontconfig works correctly if an OS.cf file
-      sets HasFontconfig, and do this in sco5.cf (#5624, J. Kean Johnston).
- 908. Move the vbe module from xfree86/os-support/ to xfree86/ (David Dawes).
- 907. Some changes to the os-support kbd driver layer's calling conventions
-      to provide more flexibility (#A.1615, Zephaniah E. Hull).
- 906. Fix a crash in the "xtt" font module caused by a NULL dereference
-      when the font cache becomes full (#A.1611, Chisato Yamauchi and
-      tokeijikakenoringo).
- 905. Update the list of DRI-supported Radeon hardware (#A.1610,
-      Knut J Bjuland).
- 904. Fix a problem in _XEventsQueued() that causes an event reader lock
-      of another thread to be released.  This can cause a hang and keyboard
-      lockup in KDE (#5619, Ewald Snel).
- 903. Fix some bugs with Xft drawing to non-Render enabled servers:
-       - Drawing monochrome glyphs had an infinite loop.
-       - XftGlyphSpecCore failed to render some glyphs, leading to application
-         crashes from uninitialized values.
-       (#A.1608, Keith Packard, reported by Nalin Dahyabhai).
- 902. Fix the <BKSL> key in the "winkeys" variants of the Russian and
-      Ukrainian XKB maps (#5624, Leon Kanter).
- 901. Install the XKB README files (#5623, Ivan Pascal).
- 900. Add the numeric keys row to the pc/us symbols map (#5622, Ivan Pascal).
- 899. Resync with DRI mesa-4-0-4 branch:
-       - Fix DOT3 texture combine env in the r200 driver (Ian Romanick).
-       - Fix SW TCL path in the radeon driver (Felix Kühling).
-       - Don't assert for FLUSH_STORED_VERTICES if a glBegin hasn't been
-         emitted (Alan Hourihane).
- 898. Another update to the fix for the client-side DRI cleanup code that
-      should fix references to freed data, an fix a potential memory leak
-      (Leif Delgass).
- 897. Fix the behaviour of XLookupString() when XKB is enabled in Xlib
-      but not the server.  This fixes an xtest XRebindKeysym() failure
-      (David Dawes).
- 896. Added radeon driver options documentation to the Options file
-      (#5621, Michel Dänzer).
- 895. Fix the return value of SetFontPath() when a font path element is bad
-      (David Dawes).
- 894. Add some more HP keyboard layouts (Peter Soos).
- 893. Remove XFree86-specific keysyms that already have generic equivalents
-      (Menu, Redo, Print, Undo).
- 892. Add keyboard layout information for the HP 5181 Internet/Multimedia
-      keyboard (#A.1603, John Mitchell).
- 891. Fix a problem where two-color render cursors have extra pixels set
-      (#A.1607, Keith Packard).
- 890. Fix for corruption when using video modes requiring more than 2MB on
-      S3 968 cards (#A.1602, Justin T. Gibbs).
- 889. Fix TVoverscan problems on the NSC SC1200 chip (Sarma Kolluru).
- 888. Cure cursor artifacts by setting HARDWARE_CURSOR_SHOW_TRANSPARENT and
-      HARDWARE_CURSOR_UPDATE_UNHIDDEN in the r128 and radeon drivers.  The
-      wait-for-VSync nonsense the Radeon's currently do can, and should, be
-      ripped out later.  (Marc La France).
- 887. Extend HARDWARE_CURSOR_SHOW_TRANSPARENT to make hardware cursors
-      transparent, rather than disabling them, when a switch to a software
-      cursor is needed.  This removes recently introduced cursor artifacts
-      in the atimisc driver.  (Marc La France).
- 886. Cancel repeat for switch screen XKB actions, which fixes a VT
-      switching problem that has just become visible (Ivan Pascal).
- 885. Added reinitialization of screen layout after RandR size change
-      on a multihead setup. This keeps cursor movement beween screens
-      working (Egbert Eich).
- 884. Remove Xcms.txt entries that have server-side equivalents.  It looks
-      like the slightly different resulting colour definitions from the
-      Xcms.txt entries were responsible for an xtest failure.
- 883. Fix some problems with using pre-existing version of fontconfig,
-      freetype2 and expat (#A.1600, Keith Packard).
- 882. Add missing zero-sized check to one of Xft's core rendering routines
-      (#A.1599, Keith Packard).
- 881. Add a missing symbol reference to the radeon driver (#5618, Mike Harris).
- 880. Fix the Xcursor include path in the man page (#5617, Kevin Brosius).
- 879. Update ViRGE documentation (#5617, Kevin Brosius).
- 878. Fix mkfontscale so that it doesn't include characters forbidden in XLFD
-      in the names it generates (#5616, Mike Fabian and Juliusz Chroboczek).
- 877. Fix a rounding problem in the "freetype" module, which fixes the problem
-      worked around in entry 864 below (#5615, Juliusz Chroboczek).
- 876. Fix incorrect alias for lv_LV.iso885913, and add some missing lv_LV
-      aliases (#5614, Aivils Stoss).
- 875. Fix a bug where xauth may write an incomplete authority file and delete
-      the old one if there is insufficient disk space (#5612, Harald Hoyer).
- 874. DPMSClose() wasn't correctly setting its devPrivate to NULL (based
-      on #A.1594, Denis Zaitsev).
- 873. Fix scanpci's printing of routing information for PCI-to-PCI bridges
-      (Marc La France).
- 872. Bring Cygwin/XFree86 up-to-date (#5613)
-       - Multiwindow Window Manager (Kensuke Matsuzaki).
-       - Clipboard integration (Harold Hunt).
-       - Remove unnecessary redefines of fchown/fchmod (Takashi Sawanaka)
-       - Fix some NULL pointer problems on screen changes (Alexander Gottwald).
- 871. Fix some problems when noaccel is used in the nsc driver (Sarma Kolluru).
- 870. Fix acceleration bugs in the nsc driver (Sarma Kolluru).
- 869. Change initMouseHW() to always return TRUE, which restores the older
-      more graceful behaviour (Egbert Eich).
- 868. Revert the DestroyContext, GarbageCollectDrawables reording in
-      dri_util.c, and instead check if the drawable is known to the DRI
-      client code before calling XF86DRIGetDrawableInfo (Egbert Eich).
- 867. Fix some scaling problems with the updated whiteglass cursor icons,
-      fixing some incorrect hotspots (Kevin Puetz).
- 866. The sunffb driver was treating a function with a void return value
-      as if it had a Bool return value.  This causes the driver to fail
-      in some cases (#A.1588, Ferris McCormick).
- 865. Add private keysyms for the new XKB actions (XFree86 special keys),
-      and move those actions to an XKB compatibility map.  This fixes
-      side-effects (loss of auto-repeat and mousekeys functionality) of
-      the way this was implemented previously (#5610, Ivan Pascal).
- 864. Fix an X server crash with the "freetype" module when displaying
-      kochi-mincho.ttf at a size of 18 pixels or higher (Chisato Yamauchi).
- 863. Fix segfault in XkbInitKeyboardDeviceStruct() (David Dawes).
- 862. Add a ServerFlags/ServerLayout option for disabling the RandR extension
-      (David Dawes).
- 861. Resync with DRI mesa-4-0-4 branch:
-       - Correct RADEON_MAX_TCL_VERTSIZE and set MaxArrayLockSize
-         (Keith Whitwell).
-       - Fix EAGAIN handling in radeon_cp_dispatch_texture(), which fixes
-         corruption of large textures (Michel Dänzer).
-       - Fix bufferSize and alphaMask for DRI in several drivers (Brian Paul,
-         Leif Delgass).
-       - Avoid a loop on validating destroyed drawable (Keith Whitwell).
-       - Reorder DestroyContext, GarbageCollectDrawables to avoid error
-         (Egbert Eich).
-       - Remove untested BSD DRM vlank signal code (Eric Anholt).
-       - Update Radeon PCI IDs for BSD drm driver (Eric Anholt).
-       - Uninitialize mutexes on cleanup in the BSD drm driver, which
-         fixes panics with FreeBSD-5.0 with WITNESS (Eric Anholt).
-       - Remove the untested/unused gamma DRM driver for BSD (Eric Anholt).
- 860. Fix byte swapping of the refresh rate argument to RandR's
-      SetScreenConfig request, and fix a 1.0 client compatibility problem
-      with SetScreenConfig (#A.1574, Keith Packard).
- 859. The i810 driver wasn't releasing control of the agpgart when VT switching
-      away for the 830M and later (David Dawes).
- 858. Update Rage 128 and Radeon PCI IDs (Mike Harris).
- 857. Fix vertical retrace to not interfere with interrupt handling
-      (#5608, Michel Dänzer).
- 856. Add M9 DRI support (Hui Yu at ATI).
- 855. Update Radeon man page (Michel Dänzer).
- 854. Add Radeon man page (Hui Yu at ATI).
- 853. Use strtol instead of atoi in xf86cfg 'expert' mode. Make pauses
-      when printing keyboard models in xf86config (#5609, Chisato Yamauchi).
- 852. Xterm patch #173 (Thomas Dickey).
- 851. Don't use XkbGetKeyboard() in xset, just use XkbAllocKeyboard()
-      (Ivan Pascal).
- 850. Fixes for the nsc driver for HW cursor hotspots and GX2 video
-      clipping issues (Sarma Kolluru, NSC).
- 849. Fix HW cursor on CRTC2 for SiS650+301B (Thomas Winischhofer).
- 848. Update the i810/i830 driver to recognise the 865G integrated graphics
-      chipset (David Dawes).
- 847. Updates for the nsc driver (Sarma Kolluru, NSC).
- 846. Fixed dual head for 1400x1050 displays (Thomas Winischhofer).
- 845. Initializing clock ranges in several drivers to get rid of the
-      annoying 'scaled from 0.0 MHz' message in xf86PrintModes()
-      (Egbert Eich).
-
-XFree86 4.2.99.901 (4 February 2003)
- 844. Fixing a double free in libXRandr (Egbert Eich).
- 843. The microsoft-win3.1 encoding file wasn't being installed (#A.1569,
-      Mike Harris).
- 842. Sync the FIFO in the vmware driver after defining an ARGB cursor
-      (#5607, Nolan Leake).
- 841. Add missing Num_Lock and Scroll_Lock modifiers to the jp XKB map
-      (Chisato Yamauchi).
- 840. Change the default cursor theme to "core".
- 839. Fix some keys in the Slovenian (si) XKB map (David Balazic,
-      Henrik Nordström).
- 838. Add a check to xset for a NULL return from XkbGetKeyboard()
-      (Tapani Utriainen).
- 837. Resync with DRI mesa-4-0-4 branch:
-       - radeon DRM: only acknowledge interrupts we handle -- others could
-         be used outside the DRM (Michel Dänzer).
-       - Fix PCI and AGP posting problems (based on testing by Chris Ison
-         and suggestions by Benjamin Herrenschmidt and Arjan van de Ven).
-       - Remove radeon_flush_write_combine() which has been unused for a while
-         (Michel Dänzer).
-       - Disable strict aliasing when building the DRM (Michel Dänzer).
- 836. Fix xfs crash on Darwin by making libXfont a flat namespace image
-      (Torrey T. Lyons).
- 835. Avoid endless loop when initializing an PS/2 mouse behind a 
-      repeater (Egbert Eich).
- 834. Radeon driver: make sure  RADEONCPStop() is only called when
-      RADEONCPStart() has been called before. Failing to do so may
-      make the kernel driver oops (Egbert Eich).
- 833. Disabling MMX, 3DNow and SSE support for x86-64 as the function
-      call sequence is hardcoded to ia32 (Egbert Eich).
- 832. Fix a hang in multi-thread mode caused by a missing UnlockDisplay() in
-      XkbGetMapChanges() (Jose Luu).
- 831. Resync with DRI mesa-4-0-4 branch:
-       - Don't inflate relative vblank sequence numbers on repeated calls
-         (e.g., when interrupted by a signal) (Michel Dänzer).
-       - Fix size of VERTEX2 ioctl struct (Egbert Eich).
- 830. SiS driver fixes:
-       - Mode restoration fix.
-       - Xv Hue and Saturation property fixes (310/325 series).
-       - Built-in mode fixes.
-       - Revert wrong bus width assumptions from previous patch.
-      (Thomas Winischhofer).
- 829. R128 build fix on big endian platforms (#A.1565, George Staikos).
- 828. Updated whiteglass cursor icons that fix the resizing glitches in the
-      existing ones (#A.1563, Kevin Puetz).
- 827. Include server control definitions in some XKB maps that were missing
-      them (based on #A.1562, Jens Petersen).
- 826. Define Alt/Meta modifiers for the jp106 XKB layout, and include
-      server control definitions (#A.1562, Jens Petersen).
- 825. Add some locales required for the OpenI18N compliance test (#A.1550,
-      Leon Ho).
- 824. s3virge driver updates:
-       - 320x240 doublescan support with mouse adjust.
-       - Power management printouts, DAC error printout fix.
-       - Log XVideo status based on chipset, and preliminary support for
-         disabling XV when a mode doesn't support it.
-      (#A.1550, Kevin Brosius).
- 823. Add an Ethiopic TTF and OTF font (#A.1549, Daniel Yacob).
- 822. Add a phonetic layout to the Bengali XKB map (#5606, Taneem Ahmed).
- 821. Work around an AGP bug in the AlphaServer ES45 by padding each ring
-      buffer packet in the radeon drm with NOPs to cache line boundaries.
-      This is only done for Alpha platforms (#5605, Jeff Wiedemeier).
- 820. Add missing domain decoding to DRM(irq_busid) for Alpha (#5604,
-      Jeff Wiedemeier).
- 819. Build fix for the DRM on FreeBSD 5.0-current (#5603, Eric Anholt).
- 818. xaaStateChange.c was not calling RestoreAccelState before doing
-      CPUToScreenTexture and CPUToScreenAlphaTexture, which seems to be the
-      reason why RENDER acceleration was broken on some dual-monitor MGA cards
-      (#5602, Nolan Leake).
- 817. Make the vmware driver a little more conservative about supporting
-      HW RGBA cursors in 8-bit modes (#5606, Nolan Leake).
- 816. Work around a problem with the vmware driver's interaction with the
-      offscreen memory manager (#5606, Nolan Leake).
- 815. Fix fb's rotation of tiles and stipples when using non-zero PixOrigin
-      macros (Torrey T. Lyons).
- 814. Fix Radeon native FP mode initializion (Hui Yu at ATI).
- 813. Resync with DRI mesa-4-0-4 branch:
-       - Fix Q3A mode change prolbem in thr r200 driver (Keith Whitwell).
-       - Add a missing break to prevent spurious GL_INVALID_ENUM
-         (Leif Delgass).
-       - Fix __FUNCTION__ usage in the ffb 3D driver (Leif Delgass).
-       - Limit the number of pending vblank signals to 100 to prevent
-         a DoS (Michel Dänzer).
-       - Fix a void * arithmetic warning in the radeon DRM driver
-         (Leif Delgass).
- 812. Fix a typo in the "pl2" XKB map (#A.1553, Piotr Xurek).
- 811. Fix a null dereference in Mesa that can cause an X server crash at
-      client exit (#A.1548, Ezra Peisach).
- 810. Improve the XTT code that prevents unexpected data to be passed to
-      XAA (#5600, Chisato Yamauchi).
- 809. xkbcomp/rules/xfree86.xml wasn't being installed (#5599, Ivan Pascal).
- 808. Add knowledge about two Korean foundries to mkfontscale (#5598,
-      Jungshik Shin).
- 807. Disable the INREG fallbackup in the radeon 3D driver on Alpha because
-      it references a function that's not availalbe (#5596, Jeff Wiedemeier).
- 806. Fixed patch 760: VBEInit takes entity index, not screen index 
-      (Egbert Eich).
- 805. Card name changes/fixes (Hui Yu at ATI).
- 804. Panel color channel depth fix for Radeons (Hui Yu at ATI).
- 803. Include list_for_each_safe define for kernels that do not have it
-      (Kevin Martin).
- 802. Fix 2D corruption around 3D window, when 3D window is moving and using
-      Radeon page flipping code (Michel Dänzer).
- 801. Big endian fixes for Rage 128 and Radeon video and Radeon cursor code
-      (Michel Dänzer).
- 800. Enable PCI GART for all architectures (still gated by ForcePCIMode, if
-      on an AGP card) (Michel Dänzer).
- 799. Fix for Radeon's CP accelerated 2D sync routine (Michel Dänzer).
- 798. SiS driver fixes:
-	- Fix for SiS730+LVDS machines (display modes restricted due to 
-	  hardware limits; LCD text mode restoration fixed)
-	- Fix for SiS300 bus width detection
-	- Fix for Fn+Fx output device switching on some machines (still 
-	  does not work on all)
-	- Numerous Dual Head fixes
-	- Added color hardware cursor support on 300/310/325/330 series
-	- Added PAL-M and PAL-N support for Chrontel 701x
-	- Added ModeLine handling for 300/310/325/330 series (CRT1 only)
-        (Thomas Winischhofer).
- 797. Fix for memory fences on PowerPC (Marc La France).
- 796. Work-around for Radeon int10 problems (Marc La France).
- 795. Fix XDarwin crash in rootless mode with 16-bit color by ensuring that
-      window pixmap pointers are 32-bit aligned (John Harper, Torrey T. Lyons).
- 794. Update the i810 2D driver and i830 3D drivers to recognise and handle
-      the Intel 852GM/855GM integrated graphics chipsets (David Dawes,
-      Keith Whitwell).
- 793. Force extension-generated mode switches always occur (Marc La France).
- 792. Fix OS/2 library build problem (Frank Giessler).
- 791. Fix bug that at times prevented recognition of resources decoded on PCI
-      root buses (Marc La France).
- 790. Fix XDarwin's spurious transparent regions in rootless windows
-      (Torrey T. Lyons).
- 789. Fix bug in recognition of certain ix86 Host-to-PCI bridges
-      (Marc La France).
- 788. Fix for breakage in reading the serial PnP mouse ID string (David Dawes).
- 787. Add "core" theme to Xcursor to force old behaviour (Keith Packard).
- 786. Increase the default font cache size so that it works better for
-      iso10646 (#A.1541, Hidetoshi Yamanouchi, Chisato Yamauchi).
- 785. Fix an XTT problem where garbage is displayed when there are undefined
-      glyphs for fixed width fonts, and fix some other potential problems
-      (#A.1541, Hidetoshi Yamanouchi, Chisato Yamauchi).
- 784. Resync symbols/fi with symbols/pc/fi (#A.1532, Marko Myllynen,
-      #5589, Linus Torvalds).
- 783. Resync xkb/rules/xfree86.xml with xfree86.lst (#5595, Ivan Pascal).
- 782. ISO_Level3_Shift was breaking compose sequences because Xlib wasn't
-      recognising it as a modifier key (#5594, Ivan Pascal).
- 781. Add a Lao (lo) XKB map (#5592, Anousak Souphavanh).
- 780. Add a multi-layout version of the Malayalam keymap (#5593, Ivan Pascal).
- 779. Add some missing entries to the xkb rules $oldlayouts and $nonlatin
-      sets (#5593, Ivan Pascal).
- 778. Prevent mkfontscale from looking at bitmap fonts, and ensure that it
-      doesn't crash if a font happens to have no head (#5591,
-      Juliusz Chroboczek).
- 777. Document that DVI the mga_hal module may be necessary to use the DVI
-      output with the G550 and other cards (#5590, Andrew Aitchison).
- 776. Fixes for a few "nodeadkeys" XKB maps (David Dawes).
- 775. Protect magic cookie from short-lived exposure on command line in 
-      startx (Christian Biere).
- 774. Fix ELF loader to ignore -g debugging information
-      (#A.1539, Juergen Keil).
- 773. Fix artifacts left by XDarwin when reshaping a shaped window (reported
-      by Adrian Umpleby).
- 772. Fix XDarwin rootless crash when resizing a window (John Harper).
- 771. Fix vbe module to not assume BIOS call results are zero-extended
-      (Paulo Cesar Pereira de Andrade).
- 770. Fix improper initialisation of pciConfigRec's.  Reported by Marcel
-      Moolenaar (Marc La France).
- 769. Fix intermittent XDarwin crash on Mac OS X 10.1.x when changing cursors
-      on dual processor machines (Torrey T. Lyons).
- 768. Correction to 'is' keymap (reported by Richard Allen).
- 767. Fix GLX library mis-use of LockDisplay()/UnlockDisplay() sequences
-      (reported by Alexis Vartanian).
-
-XFree86 4.2.99.4 (20 January 2003)
- 766. Fix XDarwin's rootless mode with 16-bit color (John Harper).
- 765. Allow UTF8 conversion to work for Japanese locales (#A.1527,
-      Etsushi Kato).
- 764. Add a method for working around a problem that can show up when
-      running setxkbmap from a machine with a different version of XKB
-      than the X server.  The workaround method is documented in
-      the setxkbmap(1) man page (#5588, Ivan Pascal).
- 763. Add some new keys and key combinations that can be used for switching
-      between XKB groups (#5587, Ivan Pascal).
- 762. Fix typos in the README.fonts document (#5585, John Himpel,
-      Juliusz Chroboczek).
- 761. Fix the pc/fi and pc/il XKB maps after recent changes made them
-      non-compliant with the multi-layout scheme (#5581, Ivan Pascal).
- 760. Allow the mga driver to fallback to using VBE for DDC when using
-      the native method fails.  This allows DDC to work for DVI output
-      on Matrox cards (#5580, Andrew Aitchison).
- 759. Add block handler for XDarwin's quartz modes to clean up any
-      autoreleased objects in the server thread (Torrey T. Lyons).
- 758. Fix use of uninitliazed variable in xmag/xmag.c (A.1525, Keith Packard).
- 757. Fix typo in Radeon Mono8x8 code (#A.1526, Juergen Keil).
- 756. PS/2 mice initialization sequence changed: rerun entire sequence
-      when something goes wrong - this needs to be rewritten completely
-      after 4.3 is out (Egbert Eich).
- 755. Savage driver: disable HW cursor on stretched LCD displays,
-      let SaveScreen and DGA test if HW cursor is on before 
-      disabling/reenabling it (Egbert Eich).
- 754. Fixed VBE EDID read: due to a missing register setting read
-      ended in endless loop on certain systems (Egbert Eich).
- 753. Changed the default mouse device for FreeBSD to sysmouse and the
-      protocol to auto when running X -configure (#5584, Eric Anholt).
- 752. Changed the default mouse device for xf86cfg and xf86config to
-      /dev/sysmouse for FreeBSD (#5582, #5583, Eric Anholt).
- 751. Fix for Mono8x8 patterns on Radeon (#A.1520, Juergen Keil, Kevin Martin).
- 750. Fix for Radeon mode validation (#A.1330, #A.1380, #A.1393, #A.1522,
-      #A.1523, Wayne Whitney, Hui Yu at ATI, Juergen Keil).
- 749. Workaround for flickering problem with switching between ARGB and mono
-      cursors on Radeons (#A.1380, Hui Yu at ATI).
- 748. DDCMode fix for VidMode extension (#A.1380, Kevin Martin, Hui Yu at ATI).
- 747. Panel detection bug fix for Radeon (#A.1380, Hui Yu at ATI).
- 746. Add Xv overlay support for dual headed Radeons (#A.1380, Hui Yu at ATI).
- 745. Fix Radeon driver's 24-bit support for flat panels (#A.1380, Hui Yu at ATI).
- 744. Add Radeon 9500/Pro support (#A.1380, Hui Yu at ATI).
- 743. Disable CGWorkaround for non-A11 rev R300s (Kevin Martin, Hui Yu at ATI).
- 742. Radeon solid/dashed line fix for RV200 and newer card (Kevin Martin).
- 741. Radeon overlay gamma fix (Hui Yu at ATI).
- 740. Radeon LG panel fix (Hui Yu at ATI).
- 739. Change makedepend to warn about any whitespace it finds in front of
-      pre-processor directives (Marc La France).
- 738. Missing deadkeys in UTF-8 compose table (Mike Fabian).
- 737. Build fix for SPARC (Thorsten Kukuk).
- 736. Fixed integer address value in vesa driver to be large enough
-      to hold a 64 bit memory address (Andreas Schwab).
- 735. Disabled RENDER accel on Matrox when used in multihead mode 
-      (Stefan Dirsch).
- 734. Added FireGL 8700/8800 to the list of supported cards or RADEON
-      driver (Stefan Dirsch).
- 733. Added -mcmodel=kernel to DRM Makefile for x86_64 (Stefan Dirsch). 
- 732. Added vesa and fbdev driver to x86_64, removed nsc driver for ia64 build
-      (Stefan Dirsch).
- 731. Fixing comments in th_TH.UTF-8 (Stefan Dirsch).
- 730. Fixes from the DRI CVS:
-       - Don't segfault when spec or fog stride is 0.
-       - Don't set RADEON_SURF_TRANSLATION_DIS for framebuffer aperture
-         byte swapping on big endian machines; doesn't work with R200 and
-         later chips.
-       - Improve AGP workaround for pre-R200 chips.
-      (Michel Dänzer).
- 729. Remove inappropriate __linux__ ifdef in the tdfx client-side DRI driver
-      (#5579, Eric Anholt).
- 728. Allow makedepend handle whitespace in front of the '#' in preprocessor
-      directives (ISO C permits this) (#A.1516, Alexander Stohr).
- 727. Add zh_TW.UTF-8 locale support (#A.1514, Leon Ho).
- 726. Add recognition of wacom "XD-xxxx" models to the wacom input driver,
-      and treat them the same as "GD-xxxx" models (#A.1505, Rene Rask).
- 725. Fix some missing render extension big-req compatibility (#A.1493,
-      Keith Packard).
- 724. Fix a missing initialisation in the calcomp input driver that makes
-      the driver unusable and crashes the X server at startup (#A.1492,
-      Martin Kroeker).
- 723. Work around for a bug in the i740 driver's XVideo support where the
-      video output would sometimes stop updating (#5578, Stephen Blackheath).
- 722. Make DRM signal-on-vblank request return EINVAL on BSD since it's
-      not been ported yet (#5576, Eric Anholt).
- 721. Remove the no longer used bsd/drm/kernel/r128/*.[ch] files (#5576,
-      Eric Anholt).
- 720. drmFreeBufs was missing from the r128 driver's referenced symbols list
-      (#5574, Eric Anholt).
- 719. Allow all of the extended mouse button bits for the "sysmouse" protocol
-      to be passed through (#5573, Eric Anholt).
- 718. Update the XFree86 server special key handling so that by default
-      there is a fallback to the the hard-coded keys when there is no
-      Terminate action binding in the XKB map.  A new global option is
-      added to allow the fallback mechanism to be used never, when needed,
-      or always, with "when needed" the default (#5572, Joe Moss).
- 717. Update the README.fonts document (#5570, Juliusz Chroboczek).
- 716. Build the loader's libc wrapper with -DHAVE_SYSV_IPC on FreeBSD
-      since NVIDIA's binary driver uses it (#5569, Eric Anholt).
- 715. Reduce the stack usage from 64k to 8k in imLcPrs.c, which fixes
-      a problem with Java for FreeBSD (#5568, Eric Anholt).
- 714. Gcc 3 deprecated the #pragma weak method for weak links (#5567,
-      Motoyuki Konno).
- 713. FreeBSD.cf updates:
-       - Sparc64 support
-       - Recent 5.0-current doesn't need libXThrStub
-       - Disable SharedLibXdmGreet, fixing xdm on alpha
-      (#5566, Eric Anholt).
- 712. XDarwin now loads GLX support dynamically. Current options are Apple's
-      OpenGL framework or Mesa (Torrey T. Lyons).
- 711. GeForceFX support in the nv driver (Mark Vojkovich).
- 710. DPMS support in the nv driver.  CRTs only at this time (Mark Vojkovich).
- 709. Fix for recognition of non-existent PCI devices (Marc La France).
- 708. Fix for when firmware/BIOS initialisation does not enable the extra
-      command FIFO entries available on second-generation integrated Mach64
-      variants (Marc La France).
- 707. Copying Syriac OTF fonts to directory OTF instead of TTF.
-      The xtt font renderer cannot handle OTF fonts causing the
-      entire directory to be ignored (Egbert Eich).
- 706. Disabling MIT-SHM extensions for Xnest, fixing pixmap private
-      code in Xnest, thus cleaning out bogus patch 137. 
-      NOTE: The MIT-SHM presently *does* *not* work with Xnest. 
-      I have code to make it work but it is not well tested therefore 
-      MIT-SHM is disabled for now! (Egbert Eich).
- 705. Fix the misnaming of three of the redglass cursors (#A.1491,
-      Keith Packard).
- 704. Fix for two problems where the combination of xtt and XAA could result
-      in a crash.  The first problem was xtt returning a NULL pointer for
-      the bitmap even though the height was non-zero.  The second problem
-      was glyph ascent/descent exceeding the range of maxbounds.ascent/
-      maxbounds.descent (A.1484, Chisato Yamauchi, Masanori Shimada).
- 703. Eliminate locale-dependent behaviour in fontconfig's setfontdirs
-      script (#A.1483, Markus Kuhn).
- 702. Fix a bug in previous Thai XIM changes (#5563,
-      Theppitak Karoonboonyanan).
- 701. Updates for the Israeli XKB map, including:
-       - Implement parens mirroring.
-       - Add two additional variants: "lyx", replacing shifted Hebrew
-         letters with Hebrew point marks, and "si1452", implementing the
-         Standard of Israel no. 1452 mapping.
-      (#5562, Tzafrir Cohen).
- 700. BuildServersOnly fix when building on a system with no installed
-      X headers or libraries (#5559, ISHIKAWA Mutsumi).
- 699. Add extended symbols for the "Logitech Cordless Desktop Navigator"
-      keyboard (#A.1480, Gilbert Fridgen).
- 698. Fix xdm resource's font references to match actual bitmap fonts (#A.1477,
-      Göran Uddeborg).
- 697. Update the xcursorgen man page (#A.1475, Keith Packard).
- 696. Add a Mongolian XKB map (#5557, Sanlig Badral).
- 695. Fixes for the Turkish XKB map (#5556, Nilgün Belma Bugüner).
- 694. Thai XIM fixes:
-       - Fix the arguments in calling to StringConversionCallback in Thai XIM
-         filter, according to Hideki Hiura's explanation on the protocol.
-       - Add input sequence correction capability to the Thai XIM by
-         exploiting the XIMStringConversionSubstitution operation.
-      (#5553, Theppitak Karoonboonyanan).
- 693. Resync the pc/fi XKB map with the previous map (#5552, Marko Myllynen).
- 692. Workaround for parsing of Layout sections caused by recent changes
-      (#5558, Andrew Aitchison, Paulo César Pereira de Andrade).
- 691. Fix the enabling of the Glint Gamma for use on an Appian Graphics
-      Jeronimo 2000 board which uses two Permedia3's (#5448, Sven Luther).
- 690. Fix a problem in the trident driver for older chipsets and using
-      16bit clock programming, manifested itself on a Thinkpad 760EL,
-      but there are probably lots of others. (Alan Hourihane).
- 689. On Darwin add Mac font directories to fonts.conf (Torrey T. Lyons).
- 688. Post XDarwin mouse events in Quartz mode where they happen rather than
-      where the cursor currently is (Adrian Umpleby).
- 687. Enable Freetype Mac FOND support on Mac OS X (Torrey T. Lyons).
- 686. Add an "lswitch" option to the group xkb map, allowing the left Alt
-      key to be used for AltGr (#A.1463, Andreas Tobler).
- 685. Add some locales for OpenI18N1.2 (LI18NUX2000) level.1 conformance,
-      and change zh_HK to point to zh_HK.big5hkscs which conforms to
-      glibc's default for zh_HK (#A.1457, Leon Ho).
- 684. Updates for the Irish and Ogham XKB maps (#5549, 5550,
-      Séamus Ó Ciardhuáin).
- 683. Xterm patch #172 (Thomas Dickey).
-
-XFree86 4.2.99.3 (21 December 2002)
- 682. Add a request to XFree86-VidModeExtension to get the read/write
-      permissions so that clients can check if they have permission to
-      change parameters (David Dawes).
- 681. Fix read-only XFree86-VidModeExtension requests for remote connections
-      (David Dawes, reported by Jamie Zawinski).
- 680. Correct problem when the server prints the name of a 'private
-      xkb action' in a format that xkbcomp cannot understand, and
-      was causing problems when calling XkbGetKeyboard (Ivan Pascal).
- 679. Fix animated cursor problem with multiple screens (#A.1454,
-      Keith Packard).
- 678. gtf.c build fix for LynxOS 4.0 (#A.1453, Stuart Lissaman).
- 677. Fix a segfault in fontconfig (#A.1450, Keith Packard).
- 676. If some LEDs are lighting when one reloads the XKB keyboard map
-      (using setxkbmap or xf86cfg) the LEDs become 'frozen' and can't
-      be switched off. The patch fixes this bug. (#5544, Ivan Pascal).
- 675. Fix some problems with the addition of multi-layout scheme to
-      xkb: some keys that aren't 'alphabetic' should be treated as
-      such to allow CapsLock+Shift working as expected; sometimes it
-      is required to load an include file more than once due to
-      multi-layout configuration, also fix some typos
-      (#5545, Ivan Pascal).
- 674. XKB programable 'special combinations' (such as Ctrl+Alt+<key>)
-      also send usual key evants (press and release).  Although the
-      keysym generated in this case is NoSymbol such events can confuse
-      some applications (#5546, Ivan Pascal).
- 673. Fix some remaining memory leaks in xkb initialization code
-      (Paulo César Pereira de Andrade).
- 672. Temporarily enable the hard-coded Ctrl-Alt-Backspace terminate sequence
-      until a better fallback mechanism is implemented (Egbert Eich).
- 671. Allow XKB-remappable hot keys to work with the "kbd" driver
-      (Egbert Eich).
- 670. Export xf86inSuspend as needed by the "kbd" driver (Egbert Eich).
- 669. SiS driver updates, including:
-       - support for SiS 330 Xabre (untested)
-       - Bugfix for boxes with two VGA connectors (tested)
-       - Autodetection of second monitor (tested)
-       - TV detection improved (tested)
-       - fixed error in 1280x1024 panel support (yet untested)
-       - Fixed bug in TV output on SiS30xB/30xLV (PAL still only BW, not
-         even the Windows driver can display PAL in color)
-       - Fixed positioning of TV picture. Works now for all video bridges
-         except Chrontel 7019 (still untested).
-      (Thomas Winischhofer).
- 668. Add an alternative French XKB layout (fr-latin9) (#A.1446, Guylhem Aznar,
-      Rene Cougnenc, Nicolas Mailhot).
- 667. Add bar and brokenbar to default <LSGT> definition for pc102 and
-      pc105 xkb maps (based on #A.1445, Göran Uddeborg).
- 666. Change the keypad "decimal" key to KP_Separator in the dk, fi, no, se
-      xkb maps (#A.1440, Robin Rosenberg).
- 665. Fixes and cleanups for the ISO8859-14 Compose table (#5543, 
-      Séamus Ó Ciardhuáin).
- 664. Update the Ogham xkb map, including full support for the IS434 standard
-      and laptops (#5542, Séamus Ó Ciardhuáin).
- 663. Update the Irish xkb map, including adding support for laptops (#5541,
-      Séamus Ó Ciardhuáin).
- 662. Add "Inet" key definitions for the Honeywell Euroboard keyboard (#A.810,
-      Scott Penrose).
- 661. Add "Inet" key definitions for the Trust Direct Access keyboard (#A.897,
-      Raphaël Poss).
- 660. Add draglock support to the mouse driver, for aiding trackball use
-      by people with low dexterity (#A.1224, Paul Elliott).
- 659. Fix bad includes in the xkb "level3" symbols file (A.1444,
-      Göran Uddeborg).
- 658. Fix atimisc panel support bug that occurs when the mode on server entry
-      is a VGA mode with large horizontal and/or vertical blanking pulses
-      (Marc La France).
- 657. Fix small documentation error in config/imake/imakemdep.h (#A.1052,
-      Linus Almstrom).
- 656. Small change to find_mesa_visual() in xf86glx.c to avoid
-      branch misprediction on x86 (#A.1057, lompik at voila.fr).
- 655. Clear memory allocated in xtWidgetAlloc() to avoid garbage from
-      malloc() being referenced later (#A.1114, Adam J. Richter).
- 656. Make SysRq generate the same keycode as PrtScrn, and Break the same
-      keycode as Pause (#A.1160, Owen Taylor).
- 655. Add "Inet" key definitions for some HP and Toshiba laptops (#A.1213,
-      Peter Soos).
- 654. "Inet" key definitions for the Brother Internet keyboard (#A.1242,
-      Diego Iastrubni).
- 653. "Inet" key definitions for the Ennyah model DKB-1008 keyboard (#A.1256,
-      Lionel Landwerlin).
- 652. Apply i830 DRM driver cleanups to the i810 driver (#A.1438,
-      David Airlie).
- 651. Add XI18NOBJS files for the ko_KR.UTF-8 and ja_JP.UTF-8 locales
-      (#5538, 5539, Jungshik Shin).
- 650. Add FIRSTINDEX to the gb2312.1980-0.enc, gbk-0.enc and jis0212.1990-0.enc
-      encoding files (#5537, Jungshik Shin).
- 649. Increment shared libraries major revisions on OpenBSD if gcc with 
-      stack protector is used (Matthieu Herrb, Todd Fries). 
- 648. Resync with DRI (mesa-4-0-4-branch).
- 647. Update XDarwin's IOKit mode to work with new event handling code
-      (Torrey T. Lyons).
- 646. Add some more aliases for some German locales (#A.1263, Thomas Koeller).
- 645. Update kio8-r encoded Cyrillic BDF fonts (#A.1267, Andrey A. Chernov).
- 644. Fix Xtrans TLI code to handle a port scan and not fill the log file
-      with error messages from _XSERVTransTLIAccept() (#A.1333, Fiel Cabral).
- 643. Only free cbs.data.text when cbs.type is XIMTextType in
-      _XimStatusDrawCallback() (#A.1342, Owen Taylor).
- 642. Allow mouse pointer movement to be rotated (#A.1346, Joost Buelens).
- 641. Add xkb layouts for Indian scripts (Kannada, Telugu, and Oriya) (#A.1436,
-      Guntupalli Karunakar).
- 640. Enable MMX, SSE and 3DNow! for NetBSD 1.6 and later (#5536,
-      Matthias Scheler).
- 639. Merge the xkb 'lt' layouts into pc/lt (#5535, Nerijus Baliunas).
- 638. Set the default fa_IR character set to UTF-8 instead of
-      ISIRI-3342 (#A.1356, Roozbeh Pournader).
- 637. Fixes and updates for building under LynxOS/PowerPC 4.0 (#A.1386,
-      Stuart Lissaman).
- 636. Update the ClearlyU fonts to version 1.9 (#A.1386, Mark Leisher).
- 635. Fix for drmOpenDevice() ignoring success on its second attempt at
-      opening the drm device (#A.1394, Alexander Stohr).
- 634. Add support for a "-include" command line option to makedepend, similar
-      to the same GNU C option (#A.1396, Alexander Stohr).
- 633. Perform country-independent matching for Chinese languages in fontconfig
-      (#A.1406, Keith Packard).
- 632. Finish off the UTF-16 APIs in Xft, and fix the UTF-16 conversion
-      code in fontconfig (#A.1411, Keith Packard, Jungshik Shin).
- 631. Make XIM locale checking case-independent (based on #A.1422, Leon Ho).
- 630. Fix incorrect datatype for the pixmap width in
-      fbCompositeSrcAdd_8000x8000(), and add some small optimisations
-      (#A.1423, Keith Packard).
- 629. Update the se xkb map to allow the older AltGr+5 method of entering
-      the Euro sign (#A.1433, Christian Rose).
- 628. Add validation for the screen number parameter received over the wire
-      by the X server's DRI extension code, and fix some similar checks in
-      the GLX code.  This fixes X server segfaults when an invalid screen
-      value is provided (#A.1434, Felix Kühling)..
- 627. Fix some bugs in the Iranian xkb layout (#A.1135, Roozbeh Pournader).
- 626. Add a Bosnian xkb layout (#A.1398, Amila Akagic).
- 625. Fix for Hungarian xkb layout (#A.1175, Peter Soos).
- 624. Update the Maltese xkb layouts (#A.1243, Ramon Casha).
- 623. Add EuroSign to the xkb "gb" layout (#A.901, Dermot McNally).
- 622. Various updates for the xkb "xfree86" keymap list (including #A.777,
-      Andriy Rysin).
- 621. Let kbd driver test if Xserver is in suspend before handling any
-      input events (Egbert Eich).
- 620. Fixed agp version checking to accept minor versions >= the specified
-      number (Leif Delgass).
- 619. Update referenced symbols lists for the mga, vesa, i810 and vmware
-      drivers (David Dawes).
- 618. Add missing symbol to the mga driver's referenced symbols lists
-      (#5534, Mike Harris).
- 617. Add some utf8 locale aliases (#5533, Mike Harris).
- 616. Fix some Linux/Alpha (with domain support) build and runtime
-      problems (#5532, Jeff Wiedemeier).
- 615. Add some missing symbols to the radeon driver's referenced symbols
-      lists (#5531, Mike Harris).
- 614. Restore the Alt/Meta mappings for pc104/pc105 keyboards in the
-      multi-layout maps (David Dawes).
- 613. Add UTF-8 locale entries for Amharic-Ethiopian, Tigrinya-Eritrean
-      and Tigrinya-Ethiopian (#5529, Daniel Yacob).
- 612. Restore the "\|" key in the GB multi-layout keyboard layout (#5528,
-      Andrew Aitchison).
- 611. Updates for the auto-generated UTF-8 Compose file (#5527,
-      David Monniaux).
- 610. Updates/fixes for the Korean font encoding file (#5525, Jungshik Shin).
- 609. Fix some problems with the multilayout version of the Turkish layout
-      (#5521, Nilgün Belma Bugüner).
- 608. DRM vertical blank ioctl can send a signal as an alternative to
-      blocking (r200 and radeon only so far) (#5523, Michel Dänzer).
- 607. Build fix for Linux/Alpha (#5515, Mike Harris).
- 606. Change CppCmd on Linux to /usr/bin/cpp (#5514, Mike Harris).
- 605. Fix an incorrect check for the "StrangeLockups" option in the
-      neomagic driver (#5505, Mike Harris).
- 604. Rename geode driver to nsc and add GX2 support (Sarma Kolluru, NatSemi).
- 603. Add the missing XKB definition for keysym "ISO_Level3_Lock" (#5526,
-      Séamus Ó Ciardhuáin).
- 602. XkbSetControls should return True when successful, not False (#A.1385,
-      Stephen Montgomery-Smith).
- 601. The functions XGetXlibControls and XSetXlibControls must work even if
-      the X server doesn't have the XKB extensions (#5513, Ivan Pascal).
- 600. Add en_ZA locales (#5512, Berend De Schouwer).
- 599. Fix shadowfb to not make update callbacks for operations that don't
-      touch offscreen memory, and to not double (or more) update glyph
-      rendering (#5509, Nolan Leake).
- 598. Change XAA to not sync when it sees RENDER operations that don't
-      touch VRAM, and to try to accelerate Glyphs with Composite if it
-      seems likely that will work (#5509, Nolan Leake).
- 597. VMware driver updates, including:
-       - Fixed vmwareGetImage to correctly calculate the region to be gotten.
-       - Small cursor bypass optimization.
-       - Fixed race between writing normal registers and writing HWcursor
-         registers.
-       - Fixed small race in the FIFO wrap code that could cause FIFO
-         corruption.
-       - Added temporary offscreen memory manager.
-       - Added compositing (RENDER) acceleration.
-      (#5509, Nolan Leake).
- 596. Newport driver updates, including:
-       - Add hardware cursor support.
-       - Workaround blank console after VT switch on some newports
-         (based on a patch from Dominik Behr).
-       - Support for the Indigo2 XL (based on a patch from Adrian Schroeter).
-      (#5507, Guido Guenther).
- 595. Add SGML versions of the XKB config and enhancing docs (#5506,
-      Kamil Toman).
- 594. Enable SSE, MMX, 3DNow support by default for Linux/x86_64 (#5502,
-      Mike Harris).
- 593. Replace hard-coded "lib" directory names with LibDirName in Imake.tmpl
-      (#5480, Mike Harris).
- 592. DRI shouldn't have been enabled for Linux/s390 (#5500, Mike Harris).
- 591. Numerous bug, stability, and correctness fixes for the Intel 830/845G
-      3D support (#5517, Keith Whitwell).
- 590. Numerous bug and stability fixes for the Intel 830/845G 2D and Xv
-      support (#5517, David Dawes).
- 589. Move IOKit-specific global variables out of generic XDarwin code
-      (Torrey T. Lyons).
- 588. Add a new interface for registration of core font renderers that allows
-      priorities to be assigned.  This allows multiple renderers for the
-      same extension to be registered, with the one with the highest priority
-      being the one that gets used (#5435, 5437, Juliusz Chroboczek).
- 587. Fix 640x480 modes in neomagic driver (Egbert Eich).
- 586. Fix reporting of G400/G450 in MGA driver (Andrew C. Aitchison).
- 585. Don't change the authorization data (and in particular, don't
-      enable local host access) if the X server's authority file
-      is removed or becomes unreadable while the server is running
-      (David Dawes, reported by Dietmar Schröter).
- 584. Xterm patch #171 (Thomas Dickey).
- 583. Fix uninitialized buffer-count in luit (Semen A. Ustimenko).
- 582. Various xdm updates from Debian and Suse (#5358, Branden Robinson, 
-      #5511, Sebastian Krahmer).
- 581. Flesh out suncg6's SaveScreen() function (Moritz Bunkus).
- 580. lib/Xaw/MultiSrc.c improperly checks open() return value
-      (A.1415, Jaromir Dolecek), Fix provided by Hideo Saito in NetBSD.
- 579. Add DPMS and screen blanking support in the sunffb driver
-      (Ferris McCormick).
- 578. Fix SEGV that occurs when Xsun* runs into an unrecognized framebuffer
-      type (Marc La France).
- 577. When the mode on server entry is found to be using composite sync on a
-      Mach64 variant, turn on the "compositesync" option (Marc La France).
- 576. Plug SIGIO hole while the server is switching back into its VT
-      (reported by Michel Lespinasse).
- 575. Use shadowfb in XDarwin fullscreen Quartz mode (Torrey T. Lyons).
- 574. Make RENDER optional for Xvfb. When RENDER is enabled add depth 32 
-      pixmap format  to list of supported pixmaps (Egbert Eich).
- 573. Fix va_args glitches for xterm/libfontconfig: 0 == (void*)0 isn't true   
-      for all platforms (Egbert Eich).
- 572. Fix lbxproxy to also build on platforms that don't have snprintf()    
-      (Egbert Eich).
- 571. Fix va_args glitches in mkfontscale: arg stack isn't preserved after
-      calling va_arg on all platforms (Egbert Eich).
- 570. Fixed x11perf aa benchmarks to support non-default visuals/colormaps
-      (Egbert Eich).
- 569. Use -Os to build on Darwin PPC with Gcc 3.x (Torrey T. Lyons).
- 568. XEditResCheckMessages trashed XtMalloced memory on some widget
-      hierarchies, due to using incorrect indexes when removing
-      duplicates (A.1409, Rob Arthan).
- 567. xprop updates (Mihael Hategan).
- 566. Fix SEGV in ICE library (Petter Reinholdtsen).
- 565. Fix interaction between backing store and miext/shadow (adapted from
-      Paulo César Pereira de Andrade).
- 564. Add new key descriptions for XFree86 special keys (i.e. for terminating
-      and VT switching the Xserver) (#5510, Ivan Pascal).
- 563. #define DEALLOCATE_LOCAL as "do {} while(0)" instead of nothing to
-      eliminate GCC warnings caused by code that does not assume
-      DEALLOCATE_LOCAL can deal with null pointers (suggested by Kevin Martin).
- 562. -
- 561. Fix bug in kldload() call on FreeBSD (reported by Joy Ganguly).
- 560. Adding int10 symbols to the list of possibly unresolved symbols in
-      Rage128 driver (Egbert Eich).
- 559. Allowing scanpci to be build on Ppc (Egbert Eich).
- 558. Updating SiS driver. Lots of new features, supported chipsets and
-      LCD panels, bug fixes. For details please check:
-      http://www.winischhofer.net/linuxsis630.shtml 
-      (Thomas Winischhofer).
- 557. Changed MGA driver to query fb_offset for DRI from kernel instead
-      of taking the driver's FBAddress - this is required by platforms
-      like Alpha (Egbert Eich).
- 556. Fix Xmu memory leak (reported by Michael Vogt).
- 555. Deal with Creative SBlive devices that mis-identify themselves as
-      "prehistoric" VGA's (Marc La France).
- 554. Allow -configure to setup Unknown Vendor/Boards removing the requirement
-      of xf86PciInfo information (Alan Hourihane).
- 553. Hardware alpha blended cursors in the "nv" driver, new PCI IDs, and
-      a fix for a problem on PowerPC (Mark Vojkovich).
- 552. "nv" driver workaround needed to let Xv continue to work after a 
-      suspend on some laptops (Pierre Lombard).
- 551. Restore '--assembler-with-cpp' in AsCmd for Linux/mips, fixing the build
-      on that platform (#5499, Guido Guenther).
- 550. An alternative update for alphabetic four level cz, sk XKB maps.
-      This is compatible with the way MS Windows behaves (#5498, Kamil Toman).
- 549. Clarify the difference between characters and bytes in xev (#5497,
-      Markus Kuhn).
- 548. Add an Irish (ie) XKB keyboard map (#5496, Seamus O Ciardhuain).
- 547. Replace the UTF-8 compose map with one automatically generated from
-      the official Unicode documentation, with the addition of some
-      handwritten rules (#5495, David Monniaux).
- 546. Document the "nomtrr" option in the XF86Config man page (#5494,
-      Mike Harris).
- 545. Some fixes for the Icelandic xkb map (#5493, Olafur Osvaldsson).
- 544. Add French Canadian keyboard description to xfree86.lst (#5492,
-      Mike Harris).
- 543. Add a new file for descriptions of XkbModel, XkbLayout, XkbVariant
-      and XkbOption names, using an XML format.  Includes a DTD file
-      and perl script to convert from the new format to the old (.lst)
-      format (#5491, Ivan Pascal).
- 542. Add missing "dvorak" single-group XKB layout (#5490, Ivan Pascal).
- 541. Change the xkbfile library to allow some names to be grouped into
-      a named list, which allows the rules file to be simplified (#5490,
-      Ivan Pascal).
- 540. Make the new single-group XKB symbols maps used by default (#5490,
-      Ivan Pascal).
- 539. Fix a crash that can happen when some apps are run in CJK locales
-      (#5489, Havoc Pennington).
- 538. Make xdm check the full password string (on Linux) for locked accounts
-      rather than just the first character (#5485, Mike Harris,
-      Nalin Dahyabhai).
- 537. Fix a few cases where the transport endpoints would be removed
-      even if NOUNLINK is specified in the flags (#5484, J. Kean Johnston).
- 536. Attempt to fix bitblt problems when doing offscreen pixmaps in
-      i810 (Egbert Eich).
- 535. Change Build rule so that x86 assembler code for MESA can be completely
-      disabled on i386 (Egbert Eich).
- 534. Added IEEE Optimization for x86-64 (Egbert Eich).
- 533. Initialized fullscreen in DRIscreenPrivate to a vaild value 
-      (Egbert Eich).
- 532. Fixed module loader to map memory in the low 32bit address space on
-      x86-64 (Egbert Eich).
- 531. Shifted Keypad delete: added KP_Separator for de_DE and de_CH keyboard.
- 530. Added sanity checks to various scripts (Egbert Eich).
- 529. Fixed Trident RGB16 video playback mode (Alastair Robinsion).
- 528. i810 only set OVRACT register when TVout isn't enabled 
-      (Sebastien BASTARD, Matthew J. Sottek, Egbert Eich).
- 527. Record changes of BusMaster state so that pciDisable/Enable/Mem/Io
-      don't override these (Egbert Eich).
- 526. Fixed RAC code: when no resources are shared chips may still need
-      RAC for bus access if both require non overlapping parts of the
-      VGA resources (Egbert Eich).
- 525. Fix for resource registration of C&T and Tdfx driver (Egbert Eich).
- 524. Prevent   core dumps in Xutf8Reset/Lookup code of Xlib (Masaru Yokoi).
- 523. Added support for BE systems for C&T driver (Michael Stephen Hanni). 
- 522. Added support for special keys found on many ACPI control, Easy Access
-      Keyboards, Internet keyboards, laptops, notebooks and PDA (via
-      xkb/symbols/inet). Added new key symbols for these keyboards 
-      (Stanislav Brabec).
- 521. Fixed some problems with ininite loops which where introduced 
-      with the host bridge specific code (Egbert Eich).
- 520. AXP domain support (Jeff Wiedemeier).
- 519. Added -m32 flag to c++ when build on ia32 (Egbert Eich).
- 518. -
- 517. Added rule to be able to use Numlock key on broken IBM keyboards
-      (Stefan Dirsch).
- 516. Fixed Xlib build rules so it builds a truly static library again 
-      (Egbert Eich).
- 515. When compiled with GCC, force imake to generate Makefile's using GCC's
-      preprocessor rather than a system-provided one (Marc La France).
- 514. Replace hard-coded "lib" directory names with LibDirName in X11.tmpl
-      (#5480, Mike Harris).
- 513. Add some README files for XKB and it's configuration files (#5479, 5483,
-      Kamil Toman).
- 512. Fixes for the "pc" cz and sk XKB maps:
-       - readded cz_qwerty (but new pc/ style) map
-       - added bskl variant missing in cz_qwerty and sk, sk_qwerty
-       - fixed keypad decimal key definition to affect only defined group
-         in cz, cz_qwerty
-       - missing SPCE definition readded to sk, sk_qwerty
-      (#5478, Kamil Toman).
- 511. Union Reality UR-F98 headtracker input driver (Linux-only) (#5476, 5477,
-      Alan Cox).
- 510. Palmax PD1100 touch screen driver (#5475, 5477, Alan Cox).
- 509. Fujitsu Stylistic input driver (#5474, 5477, Rob Tsuk, John Apfelbaum,
-      Richard Miller-Smith, Alan Cox).
- 508. Initialise ProgramName in xterm's main before referencing it (#5473,
-      Peter Valchev).
- 507. Add an Ogham XKB keyboard map (#5472, Seamus O Ciardhuain).
- 506. Handle Alt+Ctrl+Shift+SPECIAL differently from Alt+Ctrl+SPECIAL
-      where SPECIAL is one of the fallback built-in XFree86 hot keys
-      (#5468, J. Kean Johnston).
- 505. Add Syriac XKB keyboard maps (#5467, Emil Soleyman-Zomalan).
- 504. Rename HasKatmaiSupport to HasSSESupport (#5461-5463, 5465, Mike Harris).
- 503. Add mouse wheel support for SCO OpenServer (#5460, J. Kean Johnston).
- 502. Fix i18n problem in xmessage due to use of the useStringInPlace
-      resource (A.1381, Chisato Yamauchi).
- 501. Fix xnest build on file systems that are not case sensitive
-      (Torrey T. Lyons).
- 500. Use unique local Imake define for fonts.conf dir (#5482, Mike A. Harris)
- 499. Fix xc/lib/Imakefile to not break HasFontconfig (#5481, Mike A. Harris)
- 498. Refresh screen after wake from sleep in XDarwin full screen mode
-      (Torrey T. Lyons).
- 497. Fixes and updates for the SCO OpenServer port (#5459, J. Kean Johnston).
- 496. Add PCI ID defines for some ATI R300 chipsets (#5458,
-      Vladimir Dergachev).
- 495. Fix error message typo in MakeRootTile() (#5451, Mike Harris).
- 494. Redirect hostname's stderr in the xon script (#5450, Mike Harris).
- 493. Add a request to the XFree86-Misc extension for querying the
-      X server's config file, module path, and log file name (#5456, Joe Moss).
- 492. Add support for using the XKEYBOARD extension's action handlers
-      for the XFree86 X server hot keys.  This provides control over
-      the mapping of these hot keys (#A.1334, 5454, Joe Moss).
- 491. Reinstate the X server -xkbdir option, but only when the X server's
-      real and effective uids are the same (based on #A.1132, Ivan Popov).
- 490. Fix an xkbcomp bug that prevents a later definition from specifying
-      actions if the previous definition didn't (#5471, Joe Moss).
- 489. Add a stub handler to xkbcomp for the DeviceValuator action (#A.1341,
-      Joe Moss).
- 488. Fix broken software cursor with XDarwin's new event handling
-      (Torrey T.  Lyons).
- 487. Change imake so that, when compiled with GCC, it invokes the pre-
-      processor through the gcc front-end, passing it imake's -v flag
-      (Marc La France).
- 486. xf86cfg and xf86config patches, includind 1400x1050 mode, update list
-      of modules, auto inclusion of the xtt module when running X -configure
-      (A.1363, A.1364, A.1365, Chisato Yamauchi).
- 485. Fix unbalanced paranthesis in linuxPci.c (#5466, Ishikawa Mutsumi).
- 484. Remove "Option VideoRam" from savage driver, there's no need for it,
-      and utilize the entities given VideoRam size (Alan Hourihane).
- 483. Fix fontconfig to obey NothingOutsideProjectRoot, so that the directory
-      /usr/share/fonts is ignored in this case (#A.1325, Joe Moss).
- 482. Fix a segfault when using xkbcomp's -I option, and update the man
-      page to correctly document the way this option works (#5447, Joe Moss).
- 481. Don't assume mmap returns the pointer hint requested.  This is in
-      the DENSE map code for Linux/alpha (#5439, Ray Strode).
- 480. Build fix for r128_accel on PPC when DRI is disabled (based on
-      #5438, Mike Harris and #5449, Matthieu Herrb).
- 479. Updates to bdf/misc UCS fonts (#5446, 5453, Markus Kuhn).
- 478. Fix Thai glyphs in the 6x13 UCS font (#5427, Theppitak Karoonboonyanan).
- 477. Add Thai glyphs to 7x13, 7x13B, 7x13O, 7x14, 7x14B UCS fonts
-      (#5445, Theppitak Karoonboonyanan).
- 476. Add Thai subfont generation based on the ISO8859-11 map from unicode.org
-      (#5434, 5445, Theppitak Karoonboonyanan).
- 475. Update the multilayout version of the Greek (el) xkb symbols (#5425,
-      Vasilis Vasaitis).
- 474. On XDarwin startup, do not send events to the X server thread until it
-      is ready to receive them (Torrey T. Lyons).
- 473. Add a utility (called gtf) for calculating VESA GTF mode lines
-      (Andy Ritger).
- 472. Add an input driver for KB-Gear's Jamstudio pentablet (A.1328, 
-      Brian Goines).
- 471. Add a Tektronix 4957 input driver (#A.1211, Olivier Danet).
- 470. Fix backing store in Rage 128 and Radeon drivers (Kevin Martin).
- 469. Fix Mono8x8 code in savage driver, needed ROP_NEEDS_SOURCE, also
-      add NO_PLANEMASK to ScreenToScreen as code doesn't handle that case
-      (Alan Hourihane).
- 468. Add a little utility to read and write I/O ports, for those host
-      architectures that have them (Marc La France).
- 467. Ignore (with messages) any HorizSync and VertRefresh specifications for
-      panels when using ATI LT, LTPro, XL and Mobility M1 (Marc La France).
- 466. Fix a build failure when BuildServersOnly is defined and XnestServer
-      is not defined, and when /usr/X11R6 is not installed. (#A.1145,
-      Valeriy E. Ushakov).
- 465. Fix panel support bug for ATI LTPro, XL and Mobility M1 chips
-      (Marc La France).
- 464. Fix mode validation to deal with video memory sizes 256MB or greater
-      (Marc La France).
- 463. Add ARGB cursors support to the vmware driver (#5442, Nolan Leake).
- 462. Add more query options to glxinfo (#5441, Brian Paul).
- 461. Fix a typo in glxinfo (#5440, D. Hageman).
- 460. Fix a memory leak in Cygwin/XFree86 server (#5444, Kensuke Matsuzaki).
- 459. Missing fallback to miPolyArc in fbarc.c (#A.1339, Ralf Klingebiel).
- 458. Fix the cyrix driver support for the 5510, 5520 and 5530. This driver
-      only works with VSA1 based chips (#A.1260, Alan Cox).
- 457. When building with gcc >= 2.8, generate Makefiles with `imake -Wundef`
-      (Marc La France).
- 456. Re-instate changes clobbered by DRI merge (Marc La France).
- 455. Fix a typo in shadowfb support from #5413 (#5430, Nolan Leake).
- 454. Fix a bug in vmware's HW cursor support which conditionally hid the
-      cursor (#5430, Nolan Leake).
- 453. Fix an initialization problem in the calcomp input driver (#A.1056,
-      Josef Walzer).
- 452. Add command line and XF86Config options to control Render color
-      allocation on dynamic indexed visuals (Olivier Chapuis, Keith Packard)
- 451. Keep track of whether the 830/845G HW cursor should be visible or
-      hidden so that it doesn't get turned on when it shouldn't (David Dawes).
- 450. Fix for DGA offset inconsistency in the 830/845G driver (based on
-      a patch from Edgar Toernig).
- 449. Fix a memory leak when calling _XCloseLC and removing the loadable
-      locales (#A.855 Mark Robinson).
- 448. Fix input size of character strings used in lib/X11/lcGetConv.c (#A.828,
-      Yong-Jhen Hong).
- 447. Add Shape extension support to Cygwin/XFree86 rootless mode (#5431,
-      Matsuzaki Kensuke).
- 446. Fix a typo in the s3 driver which prevented virtual display sizes.
-      (#A.965, Stef Voltz).
- 445. Fix a server crash that can happen when a DGA client frees its colormap
-      before setting the mode back to the original mode (David Dawes).
- 444. Modify Type1 font RAM allocation heuristics to allow for larger fonts.
-      (#A.1121, Melchior Franz).
- 443. Add new relocation entries for Alpha architecture to the loader which
-      are used when compiling with gcc >3.1 (#A.819, Thorsten Kranzkowski).
- 442. Fix server crash when using Xinerama when application closes. 
-      (#A.808, Tsukahara Ken).
- 441. Import Mesa-4.0.4, and resync with the DRI trunk (DRI Project).
- 440. Server support for the alpha architecture on OpenBSD 3.2. 
-      (Matthieu Herrb, Arthur Grabowski). 
- 439. Workaround for <linux/input.h> conflict (Marc La France).
-
-XFree86 4.2.99.2 (21 October 2002)
- 438. Fix some memory leaks in libX11 i18n code (#A.1314, Olivier Chapuis).
- 437. Add DGA and Xvideo support to the i740 driver (#A.1307, Kopecek Tomas).
- 436. Fix the number of beeps when using AccessX and XKB 
-      (#A.1302, Alan Coopersmith).
- 435. Add twelve hour format to xclock's digital format
-      (#A.1285, Brian L. Matthews).
- 434. Fix application crash when using DPS client libraries 
-      (#A.1282, Frank Giessler).
- 433. Fix pixmap cache corruption on VT switches in mga driver
-      (#A.1279, Ross Mikosh).
- 432. Add missing Increment option in Summa input driver (#A.1276, G.P.Halkes).
- 431. Missing semicolon in twm/gram.y (#A.1307, Jim Gifford).
- 430. Cygwin/XFree86 updates
-      - Add X.ico, an icon for Windows (Harold Hunt, Jehan Bing)
-      - Include a preliminary pseudo-rootless mode (Matsuzaki Kensuke)
-      - XF86Config file support (Alexander Gottwald)
-      - Scrollbars support (Jehan Bing, Harold Hunt)
-      (#5424, Cygwin/XFree86 developers).
- 429. Add ko_KR.UTF-8 and ja_JP.UTF-8 XLC_LOCALE files (#5421, Jungshik Shin).
- 428. Add TCVN support to luit (#5416, Tomohiro KUBOTA).
- 427. Expand luit to support several major non-ISO-2022-compliant
-      encodings such as GBK and Shift_JIS (#5416, Tomohiro KUBOTA).
- 426. Add support for double-buffering to the tdfx driver's XVideo overlay
-      support (#5415, Stephen Davies).
- 425. Add a -strftime option for xclock's digital mode (#5414, George Belotsky).
- 424. README.fonts update (#5409, 5410, Khoda Hafez).
- 423. Major update for VMware driver
-      - recoded to use XAA, offscreen memory support, and color expansion code
-      - Add RENDER support
-      - Optimization of HWcursor
-      - Bug fixes for HWcursor in 8bit mode and VT switching
-      (#5423, Nolan Leake, VMware).
- 422. Updates for shadowfb code
-      - Add RENDER support
-      - support for pre-fb modifications
-      - support for real framebuffers rather than memory based framebuffer
-      - Removal of old fullscreen update code (when VT switching)
-      - fix bug in FillSpans
-      (#5411, #5413, Nolan Leake, VMware).
- 421. Clear the list of registered renderers at the start of each new server
-      generation, and only print warnings about suffixes with more than
-      one registered renderer for the first generation (David Dawes).
- 420. Make xf86PrintModes() show which modes are hot-key switchable
-      (David Dawes).
- 419. Fix the vesa driver's misuse of virtualX for displayWidth (David Dawes).
- 418. Fix the VBE module's depth/bpp matching, which fixes some 24/32 problems
-      as well as some 15/16 problems (David Dawes).
- 417. Fix black cursor images on Mac OS X 10.2.2 (Joseph Maurer).
- 416. Fix hotkey switching for user-specified modes, and fix hotkey switching
-      between all valid modes when no specific modes are specified in the
-      config file (David Dawes).
- 415. Trival input drivers Imakefile cleanup (#5299, Mike Harris).
- 414. Use INSTDATFLAGS when installing X server modules (#5292,
-      Branden Robinson).
- 413. Fix the iso8859-15 Compose map -- there is no diaeresis codepoint
-      in iso8859-15 (#5389, Wolfgang Sourdeau, Rüdiger Kuhlman).
- 412. Acute/apostrophe fix for nodeadkeys section of XKB German symbols
-      (#5388, Andreas Metzler).
- 411. Fix Cards file typo (#5387, Branden Robinson).
- 410. Cleanup the XKB Macinosh US keyboard symbols, and remove those that
-      should be in other country maps (#5386, Branden Robinson).
- 409. Add a user-configurable throttle on xconsole's number of saved lines
-      (#5379, Branden Robinson).
- 408. Fix missing declaration of XShmGetEventBase() in XShm.h (#5375,
-      Branden Robinson).
- 407. Remove inconsistencies in the way extension headers are referred to
-      in most extension libraries (David Dawes).
- 406. Install extension struct/protocol headers that weren't already
-      being installed (#5369, Branden Robinson).
- 405. Fix long-standing colour map bug in ATI driver (Marc La France).
- 404. Enable imake.c to perform correct C library version detection on hppa
-      machines (#5372, Ben Collins).
- 403. Add new Imake rules to handle C++ programs that don't have man pages
-      (#5371, Branden Robinson).
- 402. Add a -color app-defaults file for xmessage that exercises some
-      features of Xaw7, and fix the base app-defaults to not use the no
-      longer supported "whenNeeded" value for the "Scroll" resource (#5370,
-      Branden Robinson).
- 401. Stop the drm module from creating a world-writable directory in /dev.
-      Since dev nodes can only be created by root, there's no need for
-      anyone else to be able to write to /dev/dri (#5367, Brendan O'Dea,
-      #5380, 5422, Mike Harris).
- 400. Fix a SEGV in lbxproxy because it's ResizeReverseMap() makes assumptions
-      about the atom numbers that can lead to unallocated memory being
-      accessed (#5366, Branden Robinson and Anthony DeRobertis).
- 399. Increase the wacom driver's timeout for reading data after a request.
-      This is needed for PalmWac (Wacom emulation for PalmOS) (#5364,
-      Mathieu Clabaut).
- 398. Add Big5-HKSCS to locale.dir, and fix a missing portion in X-TT's
-      Big5HKSCS-Unicode table (#5362, Branden Robinson and ThizLinux
-      Laboratory Ltd).
- 397. Handle vetoed APM suspend events properly on Linux (#5362,
-      Branden Robinson).
- 396. Handle ARM and HP-PA separately from m68k and PowerPC in xfree86.cf,
-      and some cleanups (#5360, Branden Robinson).
- 395. xfs updates and cleanups (#5359, Branden Robinson).
- 394. Fix for random crashes when a screen fails to initialise (Marc La France).
- 393. Update RandR to include refresh rates (v1.1) (Keith Packard)
- 392. Numerous man pages fixes, add some missing manpages (#5365, #5373,
-      #5376, #5377, #5382-5385, #5390, #5391, #5393, #5295 Branden Robinson
-      #5374, Jonathan Amery, #5378, Jochen Voss)
- 391. Install bdftruncate and ucs2any without the .pl extension
-      (#5391, Branden Robinson) 
- 390. Rewrite Radeon DDC/DFP mode detection and management (Kevin Martin).
- 389. Integrate ATI patch:
-      - Add 2D support for Radeon 9000 (RV250), Mobility M9 (RV250 mobile)
-        and Radeon 9700 (R300)
-      - Clone mode fixes and improvements
-      - Dell VE card fixes
-      - Dual-head VT switching fixes
-      - General code clean up
-      (#A.1217, Hui Yu at ATI).
- 388. Rewrite XDarwin's event handling to fix some bugs and to use
-      SetInputCheck() for a performance boost (Torrey T. Lyons).
- 387. Add a little utility to write files through mmap() (Marc La France).
- 386. Add National Semiconductor Geode driver, support for the 5530, SC1200
-      and SC1400 chipsets (NSC, Alan Hourihane).
- 385. linux.cf updates:
-       - Resync the DebianMaintainer #define and the stuff in the
-         corresponding if block to meet Debian's current needs.
-       - Sort long chains of architecture-dependent #if-#elif directives in
-         ASCII order.
-       - Add explicit recongition of several architectures to the #ifndef
-         BuildXF86DRI block.
-       - Define a fallback CplusplusCmd (g++) if we don't recongize the
-         platform we're on.
-       - Turn off the loadable server on MIPS and SuperH platforms, where it
-         doesn't (yet) work.
-       - Trash some unneeded #defines in the Mc68020Architecture compilation
-         environment.
-       - Remove the block that #defines HasXserver NO for the s390 and s390x
-         architectures (things like Xvfb build fine on these platforms).
-      (#5357, Branden Robinson).
- 384. Fix an error in the Finnish XKB keyboard map (#5356, Marko Myllynen).
- 383. Add a Malayalam XKB keyboard map (#5355, Baiju M).
- 382. Add a "kbd" driver module that can eventually replace the built-in
-      "keyboard" driver (#5344, Ivan Pascal).
- 381. Add os-support level support for a loadable keyboard driver for BSD
-      and Linux (#5344, Ivan Pascal).
- 380. Add some new common layer functions for supporting a loadable keyboard
-      driver (#5344, Ivan Pascal).
- 379. Move the XkbDisable option to a global server flag rather than
-      keyboard driver flag, since it really is a global setting (#5344,
-      Ivan Pascal).
- 378. Fix RenderCreateCursor's conversion from an ARGB cursor to a 2-color
-      cursor when the cursor is wider than 8 pixels (#5353, Greg Parker).
- 377. Fix 24bpp displays with the fbdev driver when not using shadowfb
-      (#5351, Michel Lanners).
- 376. Fixes and improvements for the en_US.UTF8 compose rules (#5346,
-      Alexandre Oliva).
- 375. Fix compose rules for some dead accents for iso8859-1 and iso8859-15
-      (#5338, 5339, Alexandre Oliva).
- 374. Add support for th_TH.UTF-8. with XIM (#5336, Theppitak Karoonboonyanan).
- 373. Fix some bugs in the Thai XIM:
-       - excessive '(' char when switching XKB keyboard group
-       - ineffective Ctrl-<key> and Alt-<key>
-      (#5335, Theppitak Karoonboonyanan).
- 372. Add an X server command line flag (-br) to make the default root window
-      solid black (#5334, Jens Owen).
- 371. Add support for th_TH.ISO-8859-11 (#5327, Theppitak Karoonboonyanan).
- 370. Use pci_alloc_consistent/pci_free_consistent instead of the
-      local page alloc/free functions in the i810 and i830 DRM drivers
-      (#5323, Arjan van de Ven).
- 369. Fix some non-POSIX usage of tail, expand and sort (#5322, Paul Eggert).
- 368. Fix bug in PCI code for Solaris/SPARC (Marc La France).
- 367. When enabling PCI adapters, also enable their bus mastering capability;
-      Consequently, deprecate xf86EnablePciBusMaster() (Marc La France).
- 366. Fix lndir's handling of relative symbolic links, and update the man page
-      to document the -withrevinfo flag (H. J. Lu, Marc La France).
- 365. Xdm patches: realloc usage, zero malloc()ated memory, enable 
-      /dev/urandom on NetBSD 1.4 and later, OpenBSD patches (#5345, 
-      Mike A. Harris, #5401, Matthias Scheler, Matthieu Herrb)
- 364. Xterm patches #168, #169 (Thomas Dickey).
- 363. In certain circumstances, allow VGA-rerouting through Simba bridges.
-      This only affects UltraSPARC-IIi systems.  This is a small but
-      necessary step in eradicating SparcArchitecture's need to compile the ati
-      dribver with -DAVOID_CPIO (Marc La France).
- 362. In int10, ignore interrupts whose simulation isn't yet implemented.
-      Previously, such interrupts caused the emulation to stop.  (Egbert Eich,
-      Marc La France).
- 361. Add full support for multi-head on 460GX-based Itanium systems
-      (Marc La France, with documentation loaned by Intel under NDA).
- 360. Fix Darwin build problems with libXrandr and the new FreeType2 backend
-      (Torrey T. Lyons).
- 359. Savage driver updates.
-      - Support for ProSavage DDR (PCI ID 0x8D04)
-      - TV output fixes
-      - support for -pixmap24 flag
-      - XAA fixes to cure lockups
-      (#5412, Tim Roberts).
- 358. Enable version controlled .dll's on Cygwin/XFree86 (Alexander Gottwald).
- 357. Some build fixes for Cygwin/XFree86 (Alan Hourihane).
- 356. Add new FreeType2 backend which fixes a bug with -c- fonts
-      (#5347, #5348, Juliusz Chroboczek).
- 355. Add new command line options to glxinfo for more detailed output
-      (#5354, Brian Paul).
- 354. Support for 24bpp, fix screen blanking and bug fixes for newport driver
-      (#5329, #5349, Guido Guenther).
- 353. Add RandR support to XFree86 DDX. (Keith Packard)
- 352. Update RandR extension to 1.0.  Eliminate depth switching 
-      (Keith Packard, Jim Gettys)
- 351. Fix XDarwin rootless crash when window resizing with complex bit
-      gravity (Greg Parker).
- 350. Fix some incorrect mappings in the gbk-0.enc encodings file (#5313,
-      Tomohiro KUBOTA).
- 349. Fix C precedence bug in mfb (#5309, Tassia St. Germain).
- 348. Updates to mkfontscale (#5307, Juliusz Chroboczek).
- 347. Add SharedXcursorReqs to Cygwin build (#5405, Harold Hunt).
- 346. Add image transformation and subpixel order to Render (Keith Packard)
- 345. Add Xcursor-def.cpp to Xcursor library (#5350, Alexander Gottwald).
- 344. Update to pci.ids to 2002-09-24 snapshot (Marc La France).
- 343. Add a little utility to read files through mmap() (Marc La France).
- 342. Implement a means to ignore certain host bridges while determining PCI
-      bus topology (not yet used) (Marc La France).
- 341. Bridge driver interface fixups for host bridges (Marc La France).
- 340. Change makedepend to recognise invocations of parameter'ed macros
-      (Marc La France).
- 339. Major redesign in the Xedit syntax highlight code. Now there isn't
-      anymore the builtin C mode, but a new version using the xedit lisp
-      interpreter, as well as several new modes, including Lisp/Scheme,
-      Imakefile, X Resource files, Makefile, Manpage source, Sgml and
-      Html (Paulo César Pereira de Andrade).
- 338. Print a warning if more than one renderer is registered for a font type
-      (#5305, Juliusz Chroboczek).
- 337. Fix a double free() that can cause a crash in XCloseIM() (based one
-      #5303, Mo DeJong).
- 336. Allow xman's MANCONF definition to be specified in the Imakefile
-      (based on #5302, Mike Harris).
- 335. Config typo and update for Linux on Hitachi SuperH architecture (#5301,
-      ISHIKAWA Mutsumi).
- 334. Add a "DefaultRefresh" option to the vesa driver (David Dawes).
- 333. Fix build problem when calling GNU make with "--" prefixed options
-      (#5291, Toomas (toomas at tklabor.ee)).
- 332. Avoid noise from hostname call in startx (#5270, Mike Harris).
- 331. xwd ignores the -frame option if the -id option is used (#5251,
-      Mike Harris).
- 330. Fix problem where DRIUnlock was called when DRI fails to load
-      (Kevin Martin)
- 329. Fix erroneous warnings about removing DRM signal handler when DRI
-      fails to load (Kevin Martin)
- 328. Add LINE_LIMIT_COORDS option to XAA to work around limited coordinate
-      space for lines on Radeons (Kevin Martin)
- 327. Fix Radeon DGA code to use XAA sync function (Michel Dänzer)
- 326. Major rework of Radeon accel code:
-      - Merge CP and MMIO code (Kevin Martin and Michel Dänzer)
-      - Fix indirect buffer CP code (Kevin Martin and Michel Dänzer)
-      - Add CP support for scanline color expansion and image writes
-        (Michel Dänzer)
-      - Fix Mono8x8 problems (Kevin Martin and Michel Dänzer)
-      - Fix clipping routine to properly set transparency and
-        dp_gui_master_cntl reg (Kevin Martin and Michel Dänzer)
-      - Fix clipping calculation errors (Kevin Martin)
-      - Properly set line bias so that sw rendered solid and dashed lines
-        match the accel TwoPoint lines (Kevin Martin)
-      - Fix drawing last point for solid and dashed lines (Kevin Martin)
-      - Remove NoLineAccel option since two point lines work (Kevin Martin)
- 325. Export some more Xft symbols (Cygwin) that are needed for qt 3.x
-      (#5285, Ralf Habacker).
- 324. Don't sleep on Cygwin for ICE directory mode problems (#5284,
-      Ralf Habacker).
- 323. Fix a bug in XtGetDisplays() with more than 1 open display (#5282,
-      Kip Rugger).
- 322. Second part of xkb multi-layout keyboard map support (#5321,
-      Ivan Pascal).
- 321. Allow the Record extension to report logical coordinated with Xinerama
-      (#5231, Paul Stewart).
- 320. Allow the XTrap extension to report logical coordinated with Xinerama
-      (#5230, Paul Stewart).
- 319. Moved LdPreLib define after the vendor/OS specific config files
-      as it may depend on setting done there (Egbert Eich).
- 318. Several fixes for cross compile environment (Egbert Eich).
- 317. Added code to allow for building of static only libraries with
-      -fPIC for platforms which require it (Egbert Eich).
- 316. Added '-m32' to gcc flags as default for ia32 builds when gcc version
-      is >= 3.1. This allows building a 32 bit Version of X on 64bit x86-64
-      (Egbert Eich).
- 315. Changed direct calls of ld to 'gcc -nostdlib' for Linux (Egbert Eich). 
- 314. Changed calls to as to 'gcc -c -x assembler-with-cpp' for Linux
-      (Egbert Eich).
- 313. Added '-fno-strict-aliasing' flag to gcc version >= 3.1 (Egbert Eich).
-      Strict requires that one address must not contain pointers to
-      different types - a feature heavily used by X (Egbert Eich).
- 312. Fixed a core dump problem in libXtt (?) (Egbert Eich).
- 311. Removed '#pragma pack' from structures that contain function pointers
-      in x86emu. This causes problems on gcc 3.1 for ia64 (Egbert Eich).
- 310. Added defines for missing X types to saverproto.h (Egbert Eich).
- 309. Fixed compiler warings generated by gcc >= 3.1 in mesa drivers 
-      (Egbert Eich).
- 308. For platforms that allow both 32 and 64 bit libraries to be executed
-      split Xlib i18n modules path into 
-      <libpath>/X11R6/lib/X11/locale/lib/common and
-      <libpath>/X11R6/lib/X11/locale/lib64/common. 'lib64' has been defined
-      to be the default path for 64bit shared libraries on these platforms
-      (Egbert Eich).
- 307. Fixed obvious typo in OMlib (Egbert Eich).
- 306. Fixed code in cfb that didn't comply with C sequence rules.
-      Modern C compilers tend to be more aggressive on code reordering 
-      (Egbert Eich).
- 305. Changed arguments of NoopDDA() from VarArgs to void. Handling
-      of VarArgs by gcc isn't compatible with the way it was used
-      on certain platforms (Egbert Eich).
- 304. Added support for 32bit pixmaps for 24bit overlay framebuffers in 
-      fb overlay code (Egbert Eich).
- 303. Fixed kdrive to print a meaningful error message instead of just
-      core dump when no matching graphics cards is found (Egbert Eich).
- 302. fixed portability bug in xwd (Andreas Schwab <schwab at suse.de>)
- 301. fixed X Server crash, which happended each time a proportional iso10646
-      font was loaded with xtt backend (Yong Li <rigel863 at yahoo.com>)
- 300. Added some ARM specific fixes to compiler.h (Uli Hecht).
- 299. Added a virtual 'dummy' driver (Egbert Eich).
- 298. Fixed core dump when certain access functions are not set in
-      xf86Bus.c (Egbert Eich).
- 297. Fixed problem where SIGIO could be disabled after a server reset.
- 296. Added configurable list of devices the xf86Misc extension is allowed
-      to change the mouse device to (Egbert Eich).
- 295. Changed default mouse type to 'auto' when generating config file
-      with '-configure' (Egbert Eich).
- 294. Made sure keyboard modifier settings are consistent after exit 
-      from DGA when the xkb extension is used (Egbert Eich).
- 293. Disabled keyboard processing when Xserver is suspended by power 
-      management.
-      This allows effective locking of laptops when stolen (Egbert Eich).
- 292. Added/improved options for lockfile syncing (Egbert Eich).
- 291.  Added support for backup copy of Xserver logfile (Egbert Eich).
- 290. Fixed GetTimeInMillis() to use deltas instead of absolute time
-      returend by gettimeofday(). This ensures time is monotonic in X
-      (Egbert Eich).
- 289. Fixed xf86Misc extension to allow modification of Expps2 mice 
-      (Egbert Eich).
- 288. Made code in xf86MiscExt.c more readable (Egbert Eich).
- 287. Fixed PCI CardBus bridge handling (Egbert Eich).
- 286. Added code to reenable PCI bus mastering after coming back from a 
-      VT switch to radeon driver (Charl P. Botha <http://cpbotha.net/>) 
-      (Egbert Eich).
- 285. Dito for r128 driver (M. Harris).
- 284. Dito for glint and mga driver (Egbert Eich).
- 283. Fixed double scan issues for low res modes in C&T driver (Egbert Eich).
- 282. Set rgbBits to 8 for all HiQV chips in chips driver (Egbert Eich).
- 281. Moved initialization of accel funtions past initialization of
-      offscreen fb manager in chips driver (Egbert Eich).
- 280. Fixed initialization of video in chips driver (?).
- 279. Fixed HALlib problem restoring text mode on G550 (Egbert Eich).
- 278. Restructured and included Matrox's Merged Framebuffer changes
-      to mga driver (Egbert Eich).
- 277. G450/550 clockchip programming fixes (Matrox).
- 276. Fixed HW Cursor for HALlib frame granularity (Egbert Eich).
- 275. Enabling 2D accel in 24-bit for neomagic 2360 and 2380 (Egbert Eich).
- 274. Added support for builtin 1024x480 mode of Sony subnotebooks for
-      Neomagic driver (Egbert Eich).
- 273. Fixed support for lowRes (320x240) modes in neomagic driver 
-      (Egbert Eich).
- 272. Fixed RAC function registration in S3 driver (Egbert Eich).
- 271. Added some voodoo to screen initialization of S3 driver (Egbert Eich).
- 270. Fixed vbe/int10 support in SMI driver. It used to core dump
-      when BIOS was not usable (Egbert Eich).
- 269. Separated BRIGHTNESS and and CAPTURE_BRIGNTESS video attributes
-      in smi driver: CAPTURE_BRIGHTNESS refers to the capture chip 
-      (ie. Philips SAA7110) while BRIGHTNESS controls the video overlay
-      of the SMI chip itself (Egbert Eich).
- 268. Disable automatic loading of DRI when running SUN ffb as this is
-      inconsistent with other drivers (Thorsten Kukuk).
- 267. Fixed Gamma/Brightness code in trident driver (Egbert Eich).
- 266. Added FpDelay debugging option (Egbert Eich).
- 260. Fixed video support for Trident 9397 (Egbert Eich).
- 265. Fixed Cursor/VT switch support for vmware driver (Egbert Eich).
- 264. Fixed Blit problems in vmware driver when running KDE (Egbert Eich).
- 263. Added RENDER support to vmware driver (Egbert Eich).
- 262. Added C&T 69030 to extrapci.ids (Egbert Eich).
- 261. Improved mouse autodetection code (Egbert Eich).
- 260. Restructured int10 code so that vm86 and x86emu support can be loaded
-      as modules. Implemented heuristic to try vm86 first and fall back to
-      x86emu. This allows 32 bit Xservers to run on x86_64 on 64-bit kernel
-      without vm86 support (Egbert Eich).
- 259. Restructured elf loader: determine which section to load from elfheader
-      flags (Egbert Eich).
- 258. Adding RENDER Support to RAC (Egbert Eich).
- 257. Using borderClip instead of borderSize region for redisplay function
-      in miext/shadow code to avoid core dumps when vt switched away 
-      (Egbert Eich).
- 256. Replacing sprintf() by snprintf() in lbxproxy to eliminate possible
-      buffer overrun exploits (Egbert Eich).
- 255. KP_Decimal fixes to Czech and Slovak keybards 
-      (Jan Holesovsky <kendy at suse.cz>) (Egbert Eich).
- 254. Treat PCI-to-MCA and PCI-to_EISA bridges as PCI-to-ISA (Marc La France).
- 253. Correct the server's understanding of CardBus resource ranges
-      (Marc La France).
- 252. Ignore unconfigured (and mis-configured) PCI-to-PCI and PCI-to-CardBus
-      bridges (Marc La France).
- 251. Prevent infinite loops during VGA re-routing (Marc La France).
- 250. Add a framework for bus bridge drivers and use it to rework the handling
-      of Sun's Simba P2P bridges (Marc La France).
- 249. Fix bdftopcf memory leak (Marc La France).
- 248. XVideo support for the i830 and i845G (David Dawes, Alan Hourihane).
- 247. Fix various bugs in the DRI support for the i830 and i845G
-      (Keith Whitwell).
- 246. Major rework of the 2D i830/i845G support, including:
-       - Improve VESA mode selection, and fix refresh rate selection.
-       - Don't duplicate functions provided in the vbe modules.
-       - Don't duplicate functions provided in the vgahw module.
-       - Rewrite memory allocation.
-       - Rewrite initialisation and save/restore state handling.
-       - Decouple the i810 support from i830 and later.
-       - Remove various unnecessary hacks and workarounds.
-       - Fix an 845G problem with the ring buffer not in pre-allocated
-         memory.
-       - Fix screen blanking.
-       - Fix some HW cursor glitches, and turn HW cursor off at VT switch
-         and exit.
-       - Don't attempt to use the i830's function 1 entity.
-       - Fix problems with option handling.
-      (David Dawes).
- 245. A "hammer" approach at ensuring font properties are freed properly
-      (Marc La France).
- 244. Fix 'su' usage for FreeBSD in the default xdm config (Eric Anholt).
- 243. Fix a FreeBSD scrollwheel problem that shows up with gcc 3.1
-      (Eric Anholt).
- 242. Make C++ libraries on FreeBSD get linked with $(CXX), fixing libGLU
-      (Eric Anholt).
- 241. FreeBSD.cf updates, including enabling SSE/3DNow support (Eric Anholt).
- 240. Intel 830 and 845G DRI support, including i830 support updated for
-      Mesa 4.x (#5288, Jeff Hartmann, 2D3D).
- 239. [SECURITY] Fix an Xlib problem that made it possible to load arbitrary
-      code into privileged clients.
- 238. Add Xcursor library.  Make Xlib use it. (Keith Packard)
- 237. Fix threaded libraries on Mac OS X 10.2 (A.1229, Marko Karppinen).
- 236. Add hardware accelerated GLX to XDarwin (Greg Parker).
- 235. Use Imake custom version variables in XDarwin startup message
-      (Torrey T. Lyons).
- 234. Attempt to prevent PCI scans on non-PCI ix86 systems (Marc La France).
- 233. Allow master aborts on CardBus buses to complete normally during PCI
-      scans (Marc La France).
- 232. Fix bug that prevented the server from restoring CardBus data properly
-      (Marc La France).
- 231. Fix DEVID define and make it more generally available (Marc La France).
- 230. Fix bug in NetBSD PCI code (Marc La France).
- 229. Add an option to completely disable PCI scans (Marc La France).
- 228. Xterm patch #167 (Thomas Dickey).
- 227. Add CreateCursor request to Render extension (Keith Packard)
- 226. Change scanpci to not disable I/O too early (Marc La France).
- 225. Better error handling in xfs -ls argument parsing (Mordy Ovits).
- 224. Make loader ignore ELF objects that don't define any symbols (H. J. Lu)
- 223. Add a HasGcc3 imake symbol (Marc La France).
- 222. Enable threaded libraries on Darwin (Jeff Whitaker and Torrey T. Lyons).
- 221. Xaw documentation fixes (A.1218, Paul Vojta).
- 220. Add some mode collection/handling interfaces to the vbe module,
-      which makes it easier for drivers to set modes via the video BIOS
-      (David Dawes).
- 219. I830/845 Workaround for BIOSes which force 1MB stolen memory, and
-      agpgart related fix (#5300, Abraham vd Merwe).
- 218. Add NetBSD specific PCI access functions for powerpc and alpha 
-      platforms (Charles Hannum). 
- 217. Split bsd_video.c into architecture specific files, and merge NetBSD
-      alpha and powerpc support there. (Matthieu Herrb, Simon Burge, 
-      Charles Hannum & other NetBSD developers). 
- 216. Define CSRG_BASED for Darwin and fix xman so it works on Darwin
-      (Torrey T. Lyons).
- 215. On Darwin, fix imake to find Gcc and correct config for RawCppCmd
-      (Torrey T. Lyons).
- 214. Add functions to allow modules to query the core X server version
-      and the version of its sub modules (David Dawes).
- 213. Fix scanpci's printing of 64-bit PCI bases (Marc La France).
- 212. Add missing dependency and regenerate xf86PciStdIds.h accordingly
-      (Marc La France).
- 211. A more flexible way of dealing with ix86 motherboard chipsets that can
-      only implement less than the full 256 PCI buses (Marc La France).
- 210. RAC-related fixups to ATI drivers and xf86SetOperatingState() call
-      cleanups in most drivers (Marc La France).
- 209. Fix int10 miscompilation glitch on IA-64 (Marc La France).
- 208. Add support for Permedia3 (rev C) chips that use slightly different
-      clock programming techniques (Jay Estabrook).
- 207. Fix Finder warnings about XDarwin plist format on Jaguar
-      (Torrey T. Lyons).
- 206. Fix XDarwin build issues on Jaguar (Sean Fagan).
- 205. Fix Radeon DDC for non-Dell cards, and fix a radeon pci id-related
-      build problem (#5326, Andrew C Aitchison).
- 204. Change the X server (and scanpci) to use the pci.ids file (from
-      pciids.sf.net) for vendor/device descriptions (David Dawes).
- 203. Change XDarwin to use NSQuickDrawView instead of Carbon windows to
-      get a QuickDraw graphics port for rootless windows (Torrey T. Lyons).
- 202. Add support for some missing 32-bit address modes to x86emu.  Some
-      video BIOSes use them, especially those for some of the integrated
-      Intel chipsets, and this fixes int10/vbe support for these on
-      platforms that use the emulator (David Dawes).
- 201. Add PCI ID for ATI Radeon Mobility M7 'LX' (#5233, Mike Harris).
- 200. Fix CrossCompile environment for Cygwin/XFree86 
-      (#5324, Alexander Gottwald, Harold Hunt).
- 199. ATI patch to:
-      - Fix Dell OEM VE card support
-      - Add better clone mode support
-      - Fix large panel (>= 1600x1200) detection and initialization problems
-      - Remove "PanelSize" and "CrtScreen" options since they are no longer
-        needed with new CloneMode and improved flat panel support
-      - Add "DDCMode" option to detect and use DDC modes
-      - Add "PanelOff" option to disable panel on laptops
-      - Fix corrupted console problem
-      - Other misc fixes
-      (#A.1043, Hui Yu at ATI).
- 198. Remove -DNO_TCP_H from cygwin.cf for Cygwin/XFree86 (#5320, Harold Hunt).
- 197. Major updates to Cygwin/XFree86.
-       - fix depth 24 issues.
-       - fix the handling of the DirectDraw module.
-       - disable the use of the LAYER/RANDR extension.
-       - lots of bug fixes. 
-      (#5318, #5317, Harold L. Hunt, Alan Hourihane).
- 196. When using the vesa driver and the DisplaySize option the server
-      would crash with a floating point exception due to a divide by zero
-      in miscreeninit() (#5298, Mike A. Harris).
- 195. The function MoveLine in lib/Xaw/TextAction.c sometimes attempts to
-      read uninitialized memory when hit ctrl-N in a Text widget to move to
-      the next line (#5245, Johnathan Kamens).
- 194. Adjust -probe for change in default stderr verbosity (Marc La France).
- 193. Radeon patch for Xv on all known Radeon devices (James Ralston and
-      Keith Packard).
- 192. New XDarwin application icon (Michael Oland).
- 191. Dead strip unneeded code in rootlessValTree.c and other miscellaneous
-      XDarwin code cleanup (Greg Parker and Torrey T. Lyons).
- 190. Lots of Cygwin/XFree86 cleanups and fixes (#5304, Harold Hunt)
- 189. Fix rootless XDarwin crash when resizing a window with negative x
-      coordinate (Torrey T. Lyons).
-
-XFree86 4.2.99.1 (7 June 2002)
- 188. Fix some build problems when building with shared libraries disabled
-      (David Dawes).
- 187. Update the magellan input driver and turn it on in the build process
-      (#A.1024, Christoph Koulen).
- 186. Add Peritek Borealis support to the I128 driver (Robin Cutshaw).
- 185. Modify the r128 and radeon drivers to use fbdev's DPMS support when
-      fbdev is enabled (#5219, Michel Dänzer).
- 184. Add support for the composite sync mode flag to the radeon driver
-      (#5219, Michel Dänzer).
- 183. Add a mkfontscale utility for creating fonts.scale files (#5213, 5214,
-      Juliusz Chroboczek).
- 182. Add a 1152x768 mode suitable for Titanium PowerBooks to the set of
-      build-in modes (#5212, Michel Dänzer).
- 181. Add support to xkbcomp and libxkbfile for composing multi-layout
-      keyboard maps from partial "single layout" files.  This allows
-      the XkbLayout to be specified as a comma-separated list of single
-      layout names.  Note: new "single layout" symbol maps aren't available
-      yet. (#5210, Ivan Pascal).
- 180. Fix Xv endianess problem with the Radeon driver (#5207, Guido Guenther).
- 179. Updates to the Finnish xkb map, including:
-       - add ISO-8859-15 missing symbols ([zZsS]caron)
-       - reorganize some special symbols (such as paragraph, cent, division)
-       - map AltGr+SPCE as space, nobreakspace comes way too often by accident
-       - minor white space/comment cleanups
-      (#5197, Marko Myllynen).
- 178. Add an option to the r128 driver for enabling DMA for Xv image transfers
-      (#5195, Michel Dänzer).
- 177. Make the 'distclean' target remove depend files (#5194,
-      Carlos A M dos Santos).
- 176. Fix bad usage of "UseInstalled" in FreeBSD.cf (#5192,
-      Carlos A M dos Santos).
- 175. Several xkb layout updates:
-       - Added other Armenian layouts.
-       - Added Swedish dvorak layout.
-       - Fixed typo in "la" file.
-       - Added EuroSign in Dutch keyboard.
-       - Added a "comma" variant for "ro" keyboard allowing to type real comma
-         below Romanian letters.
-       - New file "ro2" with the real Romanian layout (the file "ro" is not a
-         Romanian keyboard, but a modified US one that has been hacked to
-         include Romanian letters).
-      (#5191, Pablo Saratxaga).
- 174. Fix makedepend so that it can parse a unary '+' operator (#5185,
-      Mark Snitily).
- 173. Fix a typo in Xvesa's emulation of instructions forbidden in vm86
-      mode (#5184, Juliusz Chroboczek)
- 172. Fix a bounds check in Xlib's Region code (#5183, Owen Taylor).
- 171. Fix LIBXML2LIBDIR name clash in lib/Imakefile (#5180, ISHIKAWA Mutsumi).
- 170. Avoid a problem with setfontdirs when run in some locales (#5179,
-      ISHIKAWA Mutsumi).
- 169. A little tuning for XtAppPeekEvent() (#5178, Dan McNichol).
- 168. Add a command line option to luit to specify the encoding (#5177, 5181,
-      Tomohiro Kubota).
- 167. A fix for luit's command line argument handling (#5173, Tomohiro Kubota).
- 166. Add support to luit for some more 8-bit encodings (#5171,
-      Juliusz Chroboczek).
- 165. Add an option to luit to enable using GL codes instead of GR codes
-      after a single shift for keyboard input (#5170-5172, Tomohiro Kubota
-      and Juliusz Chroboczek).
- 164. Fix an fbdev driver crash when the VT isn't active (#5169,
-      Michel Dänzer).
- 163. Fix a bug that resulted in XwcTextPropertyToTextList() storing an
-      incomplete list (#5168, Tassia St. Germain, for X.Org).
- 162. Add "ISO8859-16" to the registry (#5167, Tassia St. Germain, for X.Org).
- 161. A revised Greek xkb layout, including a three-level "extended"
-      variant, and a "polytonic" variant (#5165, Vasilis Vasaitis).
- 160. Add support for an el_GR.UTF-8 locale, including a compose file with
-      support for polytonic Greek text (#5165, Vasilis Vasaitis).
- 159. Add missing zh_CN XI18N_OBJS file (#5164, Yong Li).
- 158. Make xfs chdir to "/" before fork()ing (#5162, Mike Harris).
- 157. Add some reference counting for Xlib's i18n modules, preventing
-      a module getting unloaded while it's still in use (#5160, Owen Taylor).
- 156. Update for SCO OpenServer support (#5158, Kean Johnston).
- 155. Add aliases for the Brazilian Portuguese locale as defined on FreeBSD
-      (#5157, Carlos A M dos Santos).
- 154. Recognise the en_UK.ISO8859-15 and en_US.ISO8859-15 locales (#5156, 5186,
-      Matthias Scheler).
- 153. Some cleanups for the UTF-8 Compose file, including:
-       - Better support for Greek
-       - Typo fixes, including incorrect character literals and keysyms.
-      (#5154, Vasilis Vasaitis).
- 152. Modify Xt's default fallback font pattern to work better in locales
-      where the current one fails to find a useful font (#5152,
-      Tomohiro KUBOTA).
- 151. Updates to bdf/misc UCS fonts, and generate ISO8859-16 subsets
-      (#5147, Markus Kuhn).
- 150. Fix some empty delay loops and jiffie wrap bugs in the i830 drm driver
-      (#5149, Arjan Van de Ven).
- 149. Fix a potential NULL dereference in the drm kernel module (#5148,
-      Andreas Schwab).
- 148. Major OS/2 support update (#5119, Holger Veit).
- 147. Fix mode setting in DGA on the Rage128 & Radeon drivers (Alan Hourihane).
- 146. Build libXt as a flat namespace image on Darwin (Torrey T. Lyons).
- 145. Install the bitmap file xc/programs/bitmap/Stipple as Stippler on file
-      systems that are not case sensitive (Torrey T. Lyons).
- 144. Fix enabling of MMIO window on BladeXP desktop chips (Alan Hourihane).
- 143. Due to bugs in the CyberBladei7/i1 series that cause offset problems,
-      we're disabling the hardware cursor (for now) (Alan Hourihane).
- 142. Fix Xft-def.cpp file for Cygwin/XFree86 (#5283, Harold Hunt).
- 141. Server support for OpenBSD/sparc64 (Jason Wright, Matthieu Herrb).
- 140. Alignment fixes for Xvideo on the Permedia3 (Alan Hourihane).
- 139. lndir fix for paths containing '//' (H. J. Lu).
- 138. Fix blank display problem in trident driver for older TGUI series
-      chips, and a few Xv cleanups too (Alan Hourihane).
- 137. Enable MIT-SHM extension in Xnest server (#A.795, Steve Schwarz).
- 136. Fix typo in Rage128 DGA driver (#5187. Charles M. Hannum).
- 135. Fix enabling of DRI when XvMC is disabled (#5208, Matthew Sottek, Intel).
- 134. Fix HW Cursor handling in vmware driver (#5193, Jeremy, VMWare).
- 133. YUV handling updates for v4l module. Can now handle multiple formats
-      and find common format for both videocard and kernel.(#5196, Gerd Knorr).
- 132. Savage driver updates (#5203, Tim Roberts).
- 131. Drop the indirect buffer after ScreenInit, fixes corruption and
-      kernel error messages. (#5199, Michel Dänzer).
- 130. Add Polygon support to Render extension (Carl Worth, Keith Packard)
- 129. Add Intel i845G 2D support to the i8x0 driver, DRI is disabled. 
-      (#A.1062, Graeme Fisher, 2D3D).
- 128. Fix RGB/BGR inversion problem and screen blanking in the glint
-      driver (Alan Hourihane).
- 127. Add MIT-SCREEN-SAVER extension docs (Alan Coopersmith).
- 126. Fix problems opening /dev/fb0 in fbdevhw layer (#5229, Michel Dänzer).
- 125. Update the apm driver (#5227, Loic Grenie).
- 124. Update the Japanese localization of XDarwin (Toshimitsu Tanaka).
- 123. Symbol table cleanup, leaving xf86GetPointerScreenFuncs() as the only
-      common/xf86Cursor.c entry available to modules (Marc La France).
- 122. Fix VidMode-generated mode switches by making them go through (almost)
-      the same code path as keyboard-generated mode switches (Marc La France).
- 121. Allow AGP apertures to overlap with other BIOS-assigned PCI resources
-      (Marc La France).
- 120. Indent'd most of xterm's C code (Thomas Dickey).
- 119. Major Radeon driver code cleanup (Kevin Martin).
- 118. Radeon Xv fixes and video key support added (Keith Packard).
- 117. DPMS support for DFP/LCD and second head added for Radeon (Hui Yu at ATI).
- 116. Option to disable line acceleration added since Radeon only has 14 bits
-      for lines and clipping.  This will be changed to an XAA option for 14
-      bit support in the future (Hui Yu at ATI, Kevin Martin).
- 115. Radeon DDC and DFP handling improvements (Hui Yu at ATI).
- 114. Fixes for DRI lockup problems with Radeon 7500/VE and the AMD 761
-      chipset (Hui Yu at ATI).
- 113. Radeon PLL routines rewritten with ATOMIC_UPDATE enabled (Hui Yu at ATI).
- 112. Clone mode added to Radeon driver (not yet functional and disabled
-      by default) (Hui Yu at ATI, Kevin Martin).
- 111. Fix usage of BuildBinTop in Cygwin/XFree86 (#5223, Harold Hunt).
- 110. Implement WarpCursor for Cygwin/XFree86, and use GetProcAddress
-      instead of relying on ddraw.dll (#5220-#5222, Harold Hunt).
- 109. Fix bug that prevented the vesa driver from accessing VGA CRTC registers
-      (Marc La France).
- 108. New pre-processor files for expat, fontconfig and rename of
-      OSmesa-def.cpp to OSMesa-def.cpp (#5215-#5218, Alexander Gottwald).
- 107. Rework ati, atimisc, r128 and radeon module versioning (Marc La France).
- 106. Code clean up for the original Rage LT (Marc La France).
- 105. An attempt at disabling display switches while the server is running on
-      an LT Pro or Mobility M1 (Marc La France).
- 104. Make atimisc, r128 and radeon modules register the symbols they reference
-      at module load time, rather than PreInit() (Marc La France).
- 103. Fix rounding error in Mach64 DSP calculation (Marc La France).
- 102. Convert xmh to ANSI C (Thomas Dickey).
- 101. Xterm patch #166 (Thomas Dickey).
- 100. Fix keyboard beeps on Cygwin/XFree86 (#5211, Harold Hunt).
-  99. Fixed i810 crash on vt switch due to call to Sync() while switched away
-      (Andris Pavenis).
-  98. Fixed MGAG550 HW Cursor (Laure-Amelie Couturie).
-  97. Added Xv support to neomagic driver (Shigehiro Nomura).
-  96. Implemented cross compile environment (Egbert Eich).
-  95. Added AMD x86-64 architecture support (Egbert Eich).
-  94. Fixed memory leaks in xkb code (Egbert Eich).
-  93. Fixed several memory leaks in the config file parser and initialization
-      routines (Egbert Eich).
-  92. Added CardBus bridge support (Egbert Eich).
-  91. Fixed strdup() define in glx (Egbert Eich).
-  90. Extended xf86misc extension to support changing the mouse device
-      (Egbert Eich).
-  89. Replaced strdup() in xf86Configure.c with xalloc()/strcpy() to avoid
-      conflicts when using internal malloc (Egbert Eich).
-  88. Extended memory debugging: Added signal handler to trigger a memory
-      debugger dump on SIGUSR2 when compiled with memleak support
-      (Egbert Eich).
-  87. Set vtSema to FALSE when suspended by APM to catch calls to 2D accel
-      functions (Egbert Eich).
-  86. Implemented mouse protocol detection by analyzing data stream
-      (Egbert Eich).
-  85. Added PnP mouse detection for PS/2, ImPS/2 and older MS serial mice
-      (Egbert Eich).
-  84. Fixed gamma correction code for Trident 9397 (Alan Hourihane).
-  83. Fixed C&T driver to avoid initialization of video in non-linear mode
-      (Egbert Eich).
-  82. Changed C&T driver to allow video even if acceleration is disabled
-      (Egbert Eich).
-  81. Attempt to implement a more consistent handling of HW cursor in C&T
-      driver (Egbert Eich).
-  80. Fixed MGA driver to make HALlib work with VESA framebuffer modes
-      (Egbert Eich).
-  79. Reworked Rendition driver (Egbert Eich).
-  78. S3 Virge driver: added minimal gap between SyncStart and HDisplay to
-      avoid video lockups (Egbert Eich).
-  77. Fixed memory leaks in S3 Savage driver (Egbert Eich).
-  76. Modified several drivers to do int10 initialization using the
-      VBE functions instead of calling int10 directly (Egbert Eich).
-  75. Fixed video support and mode initialization in Silicon Motion driver,
-      removed wait for v-retrace (Egbert Eich).
-  74. Misc fixes to SiS driver (Thomas Winischhofer).
-  73. Added support for 1400x1050 screen in Trident driver (Egbert Eich).
-  72. Fixed several video issues for Trident CyberBladeXP chips (Egbert Eich).
-  71. Added probe for Tseng ISA chips (Egbert Eich).
-  70. Added 'KGAUniversal' option to generic vga driver which changes handling
-      left overscan to work also on chips with C&T core (ie all C&T and Intel
-      graphics chips) (Egbert Eich).
-  69. Modified int10 code to map area between V_BIOS and SYS_BIOS instead of
-      copying it. Copying causes problems if legacy devices map MMIO
-      registers there (Egbert Eich).
-  68. Implemented an extended int10 init function to allow passing flags
-      (Egbert Eich).
-  67. Implemented optional handling of BIOS video mode scratch area in int10
-      code (Egbert Eich).
-  66. Again modified MTRR range splitting (Egbert Eich).
-  65. Added funtions to VBE to save and restore a video mode (Egbert Eich).
-  64. Added missing commas to symbols/us_intl (Hans Lunsing).
-  63. Added Ungherese (qwerty) support (Koblinger Egmont).
-  62. Added Euro symbol for hungarian kbd layout (Koblinger Egmont).
-  61. Build with libcurses on Darwin for forward compatibility
-      (Jordan Hubbard).
-  60. Add Trident CyberBladeXP acceleration (Alan Hourihane).
-  59. Major XDarwin rootless mode rewrite:
-       - Use Carbon to draw directly to windows' backing buffers, rather
-         than "triple" buffering with Core Graphics.
-       - Reorganized Xserver/hw/darwin directory structure to separate out
-         legacy support for Mac OS X 10.0.x.
-      (Torrey T. Lyons and Greg Parker).
-  58. Fix RGB/BGR inversion problem on Permedia3 chips (Alan Hourihane).
-  57. Fix server link problem that shows up on ppc (#5205, Guido Guenther).
-  56. Restore effect of option "NoSilkenMouse" (Marc La France).
-  55. Fix some nForce graphics regressions caused by recent flat panel and
-      Mac updates to the nv driver (Mark Vojkovich).
-  54. Recognise the "Absolute" keyword that was documented in the
-      XF86Config man page (David Dawes).
-  53. Fix the man page information about Absolute screen positioning in
-      the ServerLayout section (David Dawes).
-  52. SunOS changes to xedit's lisp interpreter (Marc La France).
-  51. Support the Ti 3026 ramdac with 3DLabs Permedia found on some
-      AccelStar boards (Alan Hourihane).
-  50. Move int10 softbooting furthur up in the glint driver to post
-      much earlier (Alan Hourihane).
-  49. Fix bug that sometimes caused makedepend to forget #define'd symbols
-      (Marc La France).
-  48. MIT-SHM updates (Roberto Zunino, Matthieu Herrb).
-  47. Import Mesa-4.0.1, and resync with the DRI trunk which is now based
-      on this (Keith Whitwell, Brian Paul, Alan Hourihane, David Dawes).
-  46. Mga driver updates:
-       - Don't try dual-head mode with the G400 unless the mga_hal module
-         is loaded.
-       - Distinguish between the G400 and G450 when showing the chipset in
-         the log.
-       - Update the mga man page for supported hardware and dual-head
-         support.  Futher updates are needed to document all of the
-         drivers's options.
-      (David Dawes).
-  45. Add -Wundef when compiling the tree with GCC >= 2.8 (Marc La France).
-  44. Macintosh flat panel fix in the "nv" driver (Mark Vojkovich).
-  43. XDarwin fixes and improvements for full screen Quartz mode:
-       - Pull full screen specific code out of generic Quartz support.
-       - Install new colormaps correctly with PseudoColor.
-       - Release the screen immediately when closing down.
-       - Do not try to release the screen when closing down in rootless mode.
-      (Torrey T. Lyons).
-  42. Reimplement Xft library on top of new fontconfig library (Keith Packard).
-  41. Resync with the final Mesa-3.4.x-based DRI trunk.
-  40. Add support for wscons bell (Jason Wright).
-  39. Fix IBM-reported bug that could cause PCI bus lockouts with second
-      generation integrated Mach64 controllers (Marc La France).
-  38. Rework ATI driver's registration of symbols with the loader
-      (Marc La France).
-  37. In the ATI driver, add option "CrtDisplay" to force CRT display in a
-      dual display situation (Marc La France).
-  36. In the ATI driver, rename option "CrtScreen" to "NoPanelDisplay", keeping
-      "CrtScreen" as a private option for compatibility (Marc La France).
-  35. Document X_NOT_IMPLEMENTED (Marc La France).
-  34. NetBSD teeny OS version handling improvement in imake (#5176,
-      Matthias Scheler).
-  33. Build I2C support before building drivers (Marc La France).
-  32. Fix a problem related to reserving the overlay key in the default
-      colormap in 24+8 mode.  This caused some clients using the 8-bit
-      visuals to fail (David Dawes).
-  31. [SECURITY] Zlib error handling fix (Mark Adler).
-  30. Put back XDarwin's byte-ordering fix for reading keymappings on
-      Darwin x86 that was inadvertently dropped (Rob Braun).
-  29. Fix Big Endian hardware cursor bug on GeForce3 (Mark Vojkovich).
-  28. Experimental flat panel support in the "nv" driver.  GeForce2 Go
-      should work now (Mark Vojkovich).
-  27. XDarwinStartup improvements:
-       - Auto-detect proper mode to run XDarwin.
-       - Find XDarwin.app with Launch Services.
-       - Add XDarwinStartup man page.
-      (Torrey T. Lyons).
-  26. Localize XDarwin credits in French (Olivier Verdier) and Portuguese
-      (FabrÂ’cio L. de Castro).
-  25. Turn off XFree86-Misc and VidMode extensions for XDarwin
-      (Torrey T. Lyons).
-  24. Localize a few missing strings in XDarwin preferences (Torrey T. Lyons).
-  23. GeForce4 support (Mark Vojkovich).
-  22. Add IA-64 460GX PCI IDs (Marc La France).
-  21. Some vesa driver updates:
-       - Use the common layer's mode validation functions, which gives
-         mode selection behaviour more consistent with other drivers.
-       - Don't force the depth 24 framebuffer bpp.  Instead check what
-         framebuffer layouts are supported by VBE, and and choose the
-         layout appropriately.
-       - fb handles 24/32 fb/pixmap layout conversion, so don't use
-         the xf24_32bpp module.
-       - shadow + fb at depth 4 needs the bpp set to 8.
-      (David Dawes).
-  20. Fix some misleading messages about why modes aren't available
-      (David Dawes).
-  19. Fix for `hostname` issue on Linux (Marc La France).
-  18. Fix startx script for ksh (Phillip B. Bruce).
-  17. Fix Emulate3Buttons for wsmouse protocol on NetBSD and OpenBSD
-      (Matthieu Herrb).
-  16. Add Portuguese localization of XDarwin front end
-      (FabrÂ’cio L. de Castro).
-  15. Fix mouse Protocol "Auto" for SunOS (Marc La France).
-  14. Relocate all driver low memory accesses (atimisc module not yet done)
-      (Marc La France).
-  13. Make driver I/O relocatable (atimisc, s3, sis and tseng not yet done)
-      (Marc La France).
-  12. PCI domain changes for SunOS/SPARC64 (Marc La France).
-  11. PCI domain changes for Linux/SPARC64 (#4653, David S. Miller,
-      Marc La France).
-  10. Temporary workaround for IA-64 (Marc La France).
-   9. Fix SIGSEGV when printing modes that have no modifiers (Marc La France).
-   8. Revert the ATI driver's composite sync default to off (Marc La France).
-   7. Add a note to the messages that get printed when a signal is caught
-      during initialization (which includes X -configure) that reported
-      unresolved symbols might not be the reason for the server aborting
-      (David Dawes).
-   6. Fix symbol registration in some drivers, which reduces the number of
-      symbols reported as "unresolved" when 'X -configure' crashes
-      (David Dawes).
-   5. Fill in names for BIOS modes in the vesa driver's mode pool that weren't
-      otherwise assigned names (David Dawes).
-   4. Fix an unresolved symbol in libGLU.so that shows up when building it
-      with gcc-3 (David Dawes).
-   3. Fix invalid code caused by a memcpy() macro being split by a directive
-      (#5150, Sami Farin).
-   2. Fix incorrect symbol prefixing with Xlib's i18n modules on Solaris
-      (Keith Packard, David Dawes).
-   1. Don't try to print mode names when the name is NULL (David Dawes).
-
-XFree86 4.2.0 (18 January 2002)
- 690. Workaround for hardware bug that prevents older ATI 3D Rage adapters from
-      being assigned to XF86Config device sections (Marc La France).
-
-XFree86 4.1.99.7 (17 January 2002)
- 689. Fix bug introduced in snapshot 4.1.99.5 causing XDarwin's PseudoramiX
-      extension to always be disabled (Torrey T. Lyons).
- 688. Disable the pipe check for stdout/stderr that was added in the previous
-      snapshot because it looks like it might cause too many problems
-      (David Dawes).
- 687. Update the Arabic (ar) XKB keyboard map (#5145, Arabeyes team).
- 686. Update the Russian (ru) XKB keyboard map, adding two new variants
-      ("typewriter" and "phonetic") (#5143, Ivan Pascal).
- 685. Remove the lt_a and lt_p XKB keyboard maps (#5139, Nerijus Baliunas).
- 684. Disable the DRI and print a warning message for Radeon 8500 cards
-      until they are supported (Kevin Martin).
- 683. Properly detect when no BIOS is present on Radeon cards (#4978,
-      Charles Hannum, Kevin Martin).
- 682. Delay before restoring VGA registers for Radeons to "fix" VT switch
-      problems (Kevin Martin).
- 681. Add new PCI IDs from ATI (Kevin Martin).
- 680. Update the Xinstall.sh script to create version compatibility links for
-      shared freetype libraries when needed (David Dawes).
- 679. Update Freetype2 shared library versions to match the versions libtool
-      generates (Keith Packard).
- 678. Doc updates (lots of people, includes #5142, 5144)
-
-XFree86 4.1.99.6 (14 January 2002)
- 677. Change the default verbosity level for stderr from 1 to 0 (David Dawes).
- 676. Set the X server's stderr to non-blocking for non-root users
-      (David Dawes).
- 675. Don't allow the X server to start when stdout or stderr is a pipe for
-      non-root users (David Dawes).
- 674. Add OpenGL man pages.
- 673. Avoid duplicate symbol problem with xkbevd on some platform (#A.769,
-      Nicholas Leippe).
- 672. Updated Ukranian XKB symbols file (#A.764, Andriy Rysin).
- 671. Fix ELF loader for ARM architecture (#5138, Phil Blundell and
-      Adam C. Powell IV).
- 670. Fix a race condition in the Linux kernel DRM code (#5136,
-      Arjan van de Ven).
- 669. Fix DGA support in the s3virge driver (#5135, Kevin Brosius).
- 668. Add XvBskew, XvRskew to adjust skew values for centering of an
-      Xvideo window for the trident driver (Alan Hourihane).
- 667. Fix loader for Motorola 68k machines (Alan Hourihane).
- 666. Fix very high resolution modes (e.g. 1600x1200 at 16bpp) in the
-      Trident driver (Alan Hourihane).
- 665. -
- 664. Quick hack to allow GLX to be included in non-XFree86 servers
-      (Marc La France).
- 663. More ROP_NEEDS_SOURCE fixes for Savage chipsets (Egbert Eich).
- 662. Improvements to the SiS driver which should fix a lot of the 630
-      issues (Thomas Winischhofer).
- 661. In XDarwin IOKit mode, ignore screens sized 1x1 (Torrey T. Lyons).
- 660. Some missing QNX fixes (#5121, Frank Liu).
- 659. Update XDarwin man page and usage message for XFree86 4.2.0. Add
-      XFree86 man page to XDarwin distribution (Torrey T. Lyons).
- 658. Add bn_BD.UTF-8 to locale.dir (Taneem Ahmed).
- 657. Fix luit not dropping priviledges when run with the -c flag (#5134,
-      Juliusz Chroboczek).
- 656. Fix unresolved symbol and loader symbol registration problems in the
-      i810 driver that were introduced with the i830 support (David Dawes,
-      Abraham vd Merwe).
- 655. Fix sparklies problem for other Trident *BladeXP chipsets
-      (Alan Hourihane).
- 654. In XDarwin IOKit mode, ignore screens that can not provide the requested
-      size, depth, or refresh rate instead of generating a fatal error
-      (Torrey T. Lyons).
-
-XFree86 4.1.99.5 (7 January 2002)
- 653. Fix some typos in the DRI README (#A.757, Andreas Mohr).
- 652. xon.sh path setting from 3.3.6 (#A.756, Marc Herbert).
- 651. Fix a problem with the Radeon driver that was causing the sync polarity
-      to be ignored (#A.753, Vedran Rodic).
- 650. Set the max clock correctly for the G550 second head (#5133,
-      Luugi Marsan).
- 649. Fix a Radeon DRI lockup problem (#5128, Steven Pritchard).
- 648. Back out some mga_g450pll.c changes that cause problems on at least
-      some G450 configurations (#5122, David Woodhouse).
- 647. Fix some xterm build warnings on *BSD (David Dawes, Thomas Dickey).
- 646. Some QNX4 fixes/updates (#5121, 5124, 5130, 5131, Frank Liu).
- 645. Prefer POSIX O_NONBLOCK to O_NDELAY (when defined) in lib/dps (#5121,
-      Frank Liu).
- 644. Fix portability problem with XpmI.h (based on #5121, Frank Liu).
- 643. Only use SA_RESTART in xterm when it's available (#5121, Frank Liu).
- 642. Work around Watcom compiler bug that shows up when building Mesa's
-      stencil.c (David Dawes, based on #5121, Frank Liu).
- 641. Handle __inline and __inline__ in compiler.h for non-GNU compilers,
-      which makes it more likely that drivers will build with other compilers
-      (David Dawes, based on #5121, Frank Liu).
- 640. Build fixes for xedit/lisp. Don't define NEED_SNPRINTF when not needed.
-      Avoid a double recursion into subdirs (#5123, Matthieu Herrb).
-      Added code for systems without getpagesize.
- 639. Fix the xdm's handling of keys, allowing keypad keys to work (#A.662,
-      Servaas Vandenberghe).
- 638. Fix hang when quitting XDarwin before starting X server
-      (Torrey T. Lyons).
- 637. Don't add XDarwin's PseudoramiX extension with only one screen
-      (Greg Parker).
- 636. Add Spanish localization of XDarwin help file (Pablo Di Noto).
- 635. Improve XDarwinStartup's error reporting (Torrey T. Lyons).
-
-XFree86 4.1.99.4 (28 December 2001)
- 634. Update the ati/radeon driver to recognise the All-in-Wonder 8500's
-      ID (#5117, Vladimir Dergachev).
- 633. Fix bug where a pointer may be checked without being intialized in xman
-      (#5120, Martin Husemann).
- 632. Add an informational message to the radeon driver when LCD/DFP mode
-      validation fails (#5118, Vladimir Dergachev).
- 631. Handle the ATI Rage128 "PP" variant like the "PR" variant (#4982,
-      Mike Harris).
- 630. Fix a LynxOS on PowerPC build problem (#A.746, Stuart Lissaman).
- 629. Fix the names of the Northern Saami keyboards (#A.742,
-      Petter Reinholdtsen).
- 628. Add Xinerama info to xdpyinfo (#A.741, Greg Parker).
- 627. Fix an xdm problem caused by not handling an interrupted read (#A.728,
-      Darren Marshall).
- 626. Add functions completing text control for Render.  Bump XRender library
-      minor version (Keith Packard).
- 625. Add XKB layout info for a newer Logitech iTouch keyboard (#A.727,
-      Dimitromanolakis Apostolos).
- 624. Fix a problem that shows up with the summa tablet driver when using
-      a Genius EasyPen (#A.714, Anders Melchiorsen).
- 623. Fix for VT switch problem with the S3 driver (based on #A.677,
-      Juergen Lesny).
- 622. Remove some more spurious entries in the KSC 5601 encoding file (#A.678,
-      Jungshik Shin).
- 621. Fix for APM problem on devfs-based Linux systems with APM in a kernel
-      module (#A.663, Denis Zaitsev).
- 620. Update the mga Xv double buffering to match the more recent submission
-      (#4976, Didier Gautheron).
- 619. Fix a bug in the XKB Slovak (sk) layout (#A.621, Juraj Bednar).
- 618. Fix a small window when a SIGIO may be received without a handler
-      installed (David Dawes, based on #A.620, Michel Lespinasse).
- 617. ISO 8859-{1,7,15} Compose file updates and fixes (#5114,
-      Vasilis Vasaitis).
- 616. In XDarwin multi-monitor IOKit mode, read screen location from the
-      kernel (Torrey T. Lyons).
- 615. Update XDarwin credits file (Torrey T. Lyons).
- 614. Fix various XDarwin crashes in multi-monitor rootless mode by using
-      a new "light" version of PanoramiX/Xinerama called PseudoramiX
-      (Gregory Parker).
- 613. Fix some typos in the X.Org INSTALL doc (#5113, Chris Pepper).
- 612. Fix an bug that prevented the releasing of XvMC memory on exit (#5112,
-      Matthew J. Sottek).
- 611. Some Xprint build warning fixes (David Dawes).
- 610. Xprt PCL3 support (#5111, Mark Snitily, from X11R6.6).
- 609. Xprt PostScript bitmap cache (#5110, Chris Bare, from X11R6.6).
- 608. Updates for the Romanian (ro) XKB map (#5108, Marius Andreiana).
- 607. Update s3virge docs (#5107, Kevin Brosius).
- 606. Disable pixmap24 option for Permedia3/4/R4 as the chip doesn't support
-      this (Alan Hourihane).
- 605. Fixed a infinite loop in the i2c code.
- 604. Fixed a Sig11 problem in siliconmotion driver (Egbert Eich).
- 603. Fixes to silicon motion driver:
-	- gamma correction for 24 bit true color mode.
-	- XAA: clipping rectangle was clipped to visible screen, so offscreen
-	  pixmaps could not been drawn at with accelerated drawing functions.
-	- in SMI_ScreenInit frame buffer size calculation for video changed.
-	- smi_video: partly rewritten.
-	  - Support for 7111
-	  - interlaced video via
-	    - XF86Config Option "Interlaced" or
-	    - attribute XV_INTERLACED (Corvin Zahn).
- 602. Add French localization of XDarwin help file (Olivier Verdier).
-
-XFree86 4.1.99.3 (19 December 2001)
- 601. Change the property Xprint uses to identify pmf printer internal fonts
-      to avoid a clash with DPS (#5106, Chris Bare, from X11R6.6).
- 600. Fix a C type aliasing bug in xkbcomp (#5104, Jakub Jelinek).
- 599. Fix a bug in Xprint's PS output code that was over-optimizing out
-      clip change requests (#5102, Chris Bare, from X11R6.6).
- 598. Improved error handling for Xprint's -XpFile option (#5101, 5105,
-      Chris Bare, from X11R6.6).
- 597. Add higher resolution options to the Xprint postscript printer support
-      (#5096, Chris Bare, from X11R6.6).
- 596. BuildLoadableXlibI18n should be keyed off "SharedLibX11" rather than
-      "BuildX11Lib" (#5095, Ernie Coskrey).
- 595. Fix a luit inconsistency between the default data used when a
-      locale is unknown and the data used by ISO 8859-1 locales (#5092,
-      Juliusz Chroboczek).
- 594. Add eo_EO locale entries, which is what GNU libc 2.2 uses for the
-      Esperanto locale (#5091, Juliusz Chroboczek).
- 593. Fix an Xprt page handling problem (#5090, Chris Bare, from X11R6.6).
- 592. Update the X.Org release number from 6.5.1 to 6.6 in various
-      documents and header files (#5089, 5100, Chris Bare, from X11R6.6).
- 591. Recognise __SVR4 as an alternative for SVR4 in Xosdefs.h (#5087,
-      Chris Bare, from X11R6.6).
- 590. Cleanup some header files to make them more C++ friendly (#5086, 5088,
-      Chris Bare, from X11R6.6).
- 589. Update the driver status document (#5085, Branden Robinson).
- 588. Fix the SiS drm driver (#5084, Torsten Duwe).
- 588. Fix Trident driver pitch values when accelerator is in use, applies
-      to Image and Blade series chips (Alan Hourihane).
- 586. Minor bugfix to SiS driver, restructured VT switching code
-      (Egbert Eich).
- 585. Attempt to fix flickering in 24bpp on Trident CyberBladeXPAi1
-      (Egbert Eich).
- 584. Fixed UTF8lib support (Mike Fabian).
- 583. Re-instate makedepend's recognition of backslash line terminations
-      (Marc La France).
- 582. Add proper reference counting to the XvMCContext so that destroying
-      the context before destroying associated surfaces is handled correctly
-      (#5083, Matthew J. Sottek).
- 581. Fix the xtt (X-TrueType) font module so that it will recognise
-      fonts with upper-case suffixes (".TTF" and ".TTC") (#5082,
-      ISHIKAWA Mutsumi).
- 580. Use uname instead of hostname in rstart and xon scripts for portability,
-      plus some other rstart and xon fixes (#5081, Chris Bare, from X11R6.6).
- 579. Some newport driver cleanups and fixes (#5080, 5103, Guido Guenther).
- 578. Fix XagNsingleScreen definition and some related side-effects (#5077,
-      Chris Bare, from X11R6.6).
- 577. Fix some doc typos, and remove references to the non-existent
-      shadowfb(4) man page (#5076, David Krause).
- 576. Pitch calculation updates for the r128 driver (#5074, Michel Dänzer).
- 575. Updates for VMware SVGA programming documentation (#5073,
-      Jeremy (VMware)).
- 574. Fix cases where makedepend reports the wrong line number and file when
-      an error occurs (#5072, Mark Snitily, from X11R6.6).
- 573. Fix differences in libXt behaviour when using poll() compared with
-      when using select() (#5071, Chris Bare, from X11R6.6).
- 572. Some warning cleanups for Tru64 (#5069, Antti Tapaninen).
- 571. Fix a typo in the mt_us keymap entry (#5067, Nerijus Baliunas).
- 570. Add some missing UNDEFINE lines to the iso8859-11 and tis620-2
-      encoding files (#5065, 5066, Theppitak Karoonboonyanan).
- 569. Some Luxi font updates:
-       - update the Type 1 versions to fix a UID-related bug and cover more
-         glyphs
-       - update the TTF fonts.scale file to include ISO 8859-13
-       - update the docs to properly reflect the fonts' glyph coverage
-      (#5064, B&H, Juliusz Chroboczek).
- 568. Fix "The Open Group" copyright notices to reflect the change in
-      post R6.4 licensing (#5093, Mark Snitily, from X11R6.6).
- 567. Added debugging helpers (Egbert Eich).
- 566. Added support for the Trident CyberBladeXPAi1 (Egbert Eich).
- 565. Fixed Mono8x8Fill problem in S3 Virge and Savage drivers (Egbert Eich).
-
-XFree86 4.1.99.2 (12 December 2001)
- 564. Fix XDarwin GetImage bug on screens other than 0 in rootless mode
-      (Gregory Parker).
- 563. Fix acceleration, hw cursor and console restoration in the "nv" driver
-      on PowerPC (Mark Vojkovich).
- 562. Fix console switching on r128 & radeon drivers using FBDev (#5075,
-      Benjamin Herrenschmidt (radeon), Michel Dänzer (r128) ).
- 561. Implement double buffering for XVputimage in the mga driver (#A.601,
-      Didier Gautheron).
- 560. Fix a wheel emulation problem that prevented delivery of button
-      events when the wheel button was the same as one of the emulated
-      button (#A.600, Antonio Larrosa Jiménez).
- 559. Fix some 'make install.sdk' problems (#A.586, Stanislav Brabec).
- 558. Fix mga DGA when UseFBDev is enabled (#A.584, Wayne Whitney).
- 557. Fix dri module build when BuildXinerama is set to NO (David Dawes,
-      based on #A.599, Pontus Lidman).
- 556. Fix libXext build when BuildLBX is set to NO (based on #A.582,
-      Didier Gautheron).
- 555. Fix typo in ms_MY locale name (was ms_NY) (Hasbullah Bin Pit).
- 554. Fix incorrect code in signal handlers in most of the clients,
-      xterm and xdm not done yet (Matthieu Herrb).
- 553. Add Glint R4 and Gamma2 support to the glint driver (Alan Hourihane).
- 552. Fix rotated display in the nv driver (Mark Vojkovich).
- 551. By default, validate all available modes rather than only the largest
-      such mode (Marc La France).
- 550. Various XDarwin improvements:
-      - Use all 8 bits of PseudoColor in full screen Quartz mode.
-      - Write XDarwin version number to console log.
-      - Move Alt/Option key back to Mod1 by default.
-      (Torrey T. Lyons)
- 549. Fix offscreen memory manager segfault (Jacques Gangloff).
- 548. XDarwin Quartz mode cursor improvements:
-      - Safely free QuickDraw cursors.
-      - Fix disappearing cursor in rootless mode with multiple monitors.
-      (Gregory Parker and Torrey T. Lyons)
- 547. i810 XvMC fixes (#5078, Matthew J. Sottek).
- 546. Downgrade DDC-related mode rejections to warnings as some monitors
-      advertise their nominal, rather than actual, tolerances (Marc La France).
- 545. Add Korean localization of XDarwin front end (Kyunghwan Kim).
- 544. Allow XDarwin to launch from the Finder even if there are spaces, etc.
-      in the path to its application bundle (Torrey T. Lyons).
- 543. Add XvHsync, XvVsync to adjust skew values for centering of an
-      Xvideo window for the trident driver (Geoffrey Hausheer, Alan Hourihane).
- 542. Fixed xkb to avoid setting of AccessXTimeout to 0 (Egbert Eich).
- 541. Added option to sync the logfile after every line written (Egbert Eich).
- 540. Improved APM handling:
-      - Added disable of Input Handlers.
-      - Added support for undo on failed APM requests.
-      - Set vtSema to false (Egbert Eich).
- 539. Improved detection of primary device especially for non-PC platforms
-      (Egbert Eich).
- 538. Silicon Motion driver Fixes:
-      - Removed separate loading of int10 code.
-      - Added reset of graphics engine on EnterVT (Egbert Eich).
- 537. Set flag ROP_NEEDS_SOURCE for CPUToScreenColorExpand for all
-      S3 Savage chips (Egbert Eich).
- 536. SiS driver:
-      - Added fix to restore fbdev mode properly on VT switch/exit.
-      - Improved LCD handling on SiS 630.
-      - fixed screen blanking in SiS driver to properly blank LCDs
-        (Egbert Eich).
- 535. Trident driver:
-      - Fixed screen centering for 640x480 Modes.
-      - Fixed video playback for BladeAi1.
-      - Fixed hotkey internal/external switching for XPm8/16.
-      - Added support for on-the-fly video recentering.
-      - Attempt to fix contrast settings for video (Egbert Eich).
- 534. Added reset code for PS/2 mice when replug events occurs
-      (required for later Linux 2.4.x kernels) (Egbert Eich).
- 533. xf86cfg: start AccessX controls even when started from a running server
-      (Egbert Eich).
- 532. Add support in glint driver for booting secondary cards that have
-      the VGA disable jumper set (so no access to the BIOS) (Jay Estabrook).
- 531. Add Spanish localization of XDarwin front end (Pablo Di Noto).
- 530. Set the r128 DRI driver version back to 2.2 so that the major version is
-      the same as for the version in XFree86 4.1.0.
- 529. Fixes for DGA2.0 support in the radeon driver (#A.585,
-      Shyouzou Sugitani).
- 528. Fix mkfontdir's scanning of fonts.scale files to detect a bad file
-      resulting from concatenating two fonts.scales files, and to avoid
-      buffer overruns from over-long strings (#A.563, Jonathan Kamens).
- 527. Avoid i810 VT switching problems on FreeBSD (David Dawes).
- 526. Fix a possible SIGFPE in the X-TrueType fonts (#A.640, Nam SungHyun).
- 525. Fix -probe and -configure to not clear the screen on exit on SunOS SPARC.
-      (Marc La France).
- 524. Fix support for ATI Graphics Pro Turbo 1600 adapters (Marc La France).
- 523. Newport driver updates, including 24-bit support (#5062, Guido Guenther).
- 522. Fix pixel info not being returned from the APPGROUP extension (#5061,
-      Chris Bare, from X11R6.6).
- 521. Remove debug message in the calcomp driver (#5060, Martin Kroeker).
- 520. Replace "X Windows" with "X Window System" or "X" in various places
-      (#5058, David Krause).
- 519. Fix the size of some lbx struct members on 64-bit architectures
-      (#5053, Chris Bare, from X11R6.6).
- 518. Fix the size of some xXagGetAttrReply struct members on 64-bit
-      architectures (#5052, Chris Bare, from X11R6.6).
- 517. Add a NULL check that was missing in the CID part of the Type1 code
-      (#5050, Mark Snitily, from X11R6.6).
- 516. XKB AccessX LED beep feature (#5047, Chris Bare, from X11R6.6).
- 515. Fix WriteToClient flushing bug (#5046, Chris Bare, from X11R6.6).
- 514. Fix improper freeing of widget translations in libXt when
-      REFCNT_TRANSLATIONS is defined (#5044, Chris Bare, from X11R6.6).
- 513. Fix XPrint memory leak (#5042, Chris Bare, from X11R6.6).
- 512. Local Authorization Fix (#5041, Chris Bare, from X11R6.6).
- 511. Add locale entries for Sami (#5055, Børre Gaup).
- 510. Fix XProcessInternalConnection man page duplication (#5040, Chris Bare,
-      from X11R6.6).
- 509. Minor xrx Imakefile fix (#5038, Chris Bare, from X11R6.6).
- 508. Remove outdated xc/fonts/encodings/large/README (#5033,
-      Juliusz Chroboczek).
- 507. Enable XVideo support for the SuperSavage (#5031, Tim Roberts).
- 506. Add some missing locale entries (#5026, Mike Harris).
- 505. s3virge driver updates, including:
-       - cr3a patch (#4884, Adam J. Richter)
-       - ViRGE MX XVideo patch (#4915, Sven Menke)
-       - An option to disable XVideo
-       - Disable solid filled rects for Trio3D because of trouble reports
-       - Some MX fixes
-       - Fix ViRGE MX XVideo so window overlap works
-       - Enable ViRGE GX2 XVideo
-       - Fix low resolution problems on ViRGE MX (&GX2)
-      (#5024, 5030, 5034, Kevin Brosius).
- 504. Some new/updated xkb files (#5019, Pablo Saratxaga).
- 503. Add some ATI PCI IDs (#5018, Mike Harris).
- 502. Implement a hack for the DEC TGA2 cards which maps an extra page
-      before framebuffer start as the acceleration code is slightly
-      broken (Jay Estabrook).
- 501. Allow secondary MGA boards to be used on Alpha that have the VGA
-      disable switch set (Jay Estabrook).
- 500. Fix Radeon jerky cursor movement bug (Jay Estabrook, #5054, Mike Harris).
- 499. Add new Luxi fonts from Bigelow & Holmes (#5010, Charles Bigelow and
-      Kris Holmes, integrated by Juliusz Chroboczek).
- 498. Update the ClearlyU fonts to version 1.8 (#5009, Mark Leisher).
- 497. Add XKB symbols for Saami (#5006, 5059, Børre Gaup).
- 496. Change the mapping of the JIS reverse solidus to what most Japanese
-      users expect (#5002, Juliusz Chroboczek).
- 495. Fix hiding/showing of mouse cursor under Windows on Cygwin/XFree86
-      (#5056, Harold Hunt).
- 494. Fix Permedia3 SDRAM based boards planemask problems (Jay Estabrook).
- 493. Don't use int10 in glint driver when using fbdev interface (#5039,
-      Michel Dänzer).
- 492. Fix SlowBCopy for MIPS and PowerPCs (Marc La France).
- 491. Fix XF86Config overrides for I/O base, framebuffer address and video
-      memory size in cyrix driver (Marc La France).
- 490. Don't interfere with ATI panel support when using DDC information for
-      monitor tolerance defaults (Marc La France).
- 489. Add Dutch localization of XDarwin help file (Paul Edens).
- 488. Add stub functions needed by libGL to libXThrStubs. Link libGL against
-      libXthrStubs on systems that build it. (#4997, Matthieu Herrb).
- 487. Fix building and loading of I18N modules by Xlib on NetBSD and OpenBSD
-      (#5049, Matthieu Herrb).
- 486. Fix duplicate loader symbols (#5048, Vladimir Dergachev).
- 485. Fix problems with clipping in fb when the clip list contains negative
-      coordinates (Gregory Parker).
- 484. Fix return value of VBEBankSwitch() (Norm Raden).
- 483. Updates/fixes for the QNX6 (aka Neutrino) port (#4990, Frank Liu).
- 482. Autodetect when -fno-merge-constants is needed for building modules,
-      and enable its use by default in those cases (Marc La France,
-      David Dawes).
- 481. Status doc updates (#4991, Branden Robinson).
- 480. Fix for flickering i815 LCDs (#4968, Poul-Henning Kamp, Harald Koenig).
- 479. Move much of the I18N code in Xlib into separately loadable
-      modules (#4965, 5043, Ernie Coskrey, from X11R6.6).
- 478. Modify UXTerm.ad's font5 resource so that xterm can display double
-      width characters using a font distributed with XFree86 (#4962,
-      Tomohiro KUBOTA).
- 477. Add Dutch localization of XDarwin front end (Paul Edens).
- 476. Add a quick check to not use as the default mode any internal modes
-      with horizontal timing parameters that aren't CRT-friendly (David Dawes).
- 475. Add an 832x624 @ 75Hz mode line to the default mode set (#4960,
-      Andrew C. Aitchison).
- 474. Fix Radeon LCD Panel detection and Power Delay (ATI Technologies).
- 473. Ignore XDarwin full screen switch key combination when in rootless mode
-      (Torrey T. Lyons).
- 472. Xterm patches #163, #164 (Thomas Dickey): mostly bug fixes.
- 471. Fix race condition in XDarwin causing occasional hangs or crashes when
-      quitting from the menu (Torrey T. Lyons).
- 470. Cygwin/XFree86 updates (#5035, #5036, Harold Hunt).
- 469. Make sure Cygwin checks ENOBUFS for error test in XlibInt.c, as under
-      Cygwin when the socket is full ENOBUFS is returned (Brian Genisio).
- 468. Fix SIGFPE in LastLinePel for ATI Radeon, console restoring on dual CRT
-      head on VE, improved panel and ddc line detection (ATI Technologies).
- 467. Fix bug that caused hardware cursors to disappear on mode switches when
-      silken mouse is disabled (Marc La France).
- 466. Preliminary changes to keyboard handling for SPARC SunOS
-      (Marc La France).
- 465. Zero out SPARC SunOS primary framebuffer on exit, like Sun's servers do
-      (Marc La France).
- 464. More driver name normalisation (Marc La France).
- 463. Minor speedup for Mach64 acceleration for big-endian architectures
-      (Marc La France).
- 462. Fix bug that prevented relocation of unassigned PCI I/O bases
-      (Marc La France).
- 461. Add Swedish localization of the XDarwin help file (Patrik Montgomery).
- 460. Fix use of gethostbyname and getservbyname to _XGethostbyname and
-      _XGetservbyname for portability (#5017, Mark W. Snitily, from X11R6.6).
- 459. Fix buffer problems used by xrdb to build command line, noticed on
-      systems with a large amount of visuals (#5016, Alan Coopersmith).
- 458. Fix bug regarding signal handling in x11perf by inserting an abort
-      test after each run (#5015, Mark W. Snitily, from X11R6.6).
- 457. Add improved diagnostic messages and error checking to libXfont
-      which is used by bdftopcf command (#5014, Chris Bare, from X11R6.6).
- 456. Fix advertised surfaces for the i810 Motion Compensation driver and
-      make use of new XVMC_INTRA_UNSIGNED surface flag (#5003, Matthew Sottek).
- 455. Fix r128 driver to call wrapped screen functions when using the
-      fbdevhw layer (#5004, Michel Dänzer).
- 454. Add Rage128 Pro PP detection to ati driver (#5025, Alfred Perlstein,
-      Mike Harris).
- 453. Add CyberBladeXPAi1 recognition to the trident driver (#A.658,
-      Jani Jaakkola).
- 452. Fix typo in PCI bus scanning that caused a hang when there was more than
-      one PCI bus (#A.652, Uwe Dannowski).
- 451. Update Japanese localization of XDarwin help file (Toshimitsu Tanaka).
- 450. Update XDarwin help file (Torrey T. Lyons).
- 449. Fix XDarwin SHAPE support in rootless mode (Gregory Parker).
- 448. More corrections to Xaw manpage (#5022, Branden Robinson).
- 447. Fix XDarwin crash if a NULL mask is passed to Composite in rootless
-      mode (Torrey T. Lyons).
- 446. Fix XDarwin crash if more than one keyboard interface is returned from
-      NXEventSystemInfo (Gregory Parker).
- 445. Big5 encoding fix (#4957, Juliusz Chroboczek).
- 444. Use DDC sync (disabled by default) and DPMS info (#4955,
-      Andrew C Aitchison).
- 443. Update the i810 XVideo support to double the maximum image width
-      to 1440 (#4933, Philip Pokorny).
- 442. Fix several memory leaks in x11perf (#4931, Ernie Coskrey, from X11R6.6).
- 441. Bypass startup VT #1 switching hack for FreeBSD/syscons unless running
-      on a pre-3.1 version of FreeBSD (#4926, Huver).
- 440. Catch bogus flat panel dimensions in the ati/r128 driver (#4907,
-      Michel Dänzer).
- 439. Fix Maltese entry in xkbcomp/keymap/xfree86 (#4921, Nerijus Baliunas).
- 438. Fix a locale.alias typo (#4920, Nerijus Baliunas).
- 437. Documents Options for the Matrox and Neomagic drivers, and makes
-      HW/SWcursor generic options (#5021, Dr. Andrew C. Aitchison).
- 436. Corrections and updates to Xaw manpage (#5020, Branden Robinson).
- 435. Add German localization of XDarwin front end (Andreas Monitzer).
- 434. Add the DEC-XTRAP extension and sample clients (#4904, 4918,
-      Paul Stewart).
- 433. Update the us_intl XKB symbols map to include all diacritics used
-      in latin script (#4917, Pablo Saratxaga).
- 432. Add a Compose file for utf-8 (#4917, 5019, Pablo Saratxaga).
- 431. Fix radeon and sis GL module Imakefiles (#4916, Bill Nottingham).
- 430. Bug fixes and updates for Savage driver (#5001, Tim Roberts).
- 429. Add luit (#4914, Juliusz Chroboczek).
- 428. Fix a typo in fontenc that prevents building with no dependency on
-      libfont (#4913, Juliusz Chroboczek).
- 427. Add an encoding file for the KSC Johab encoding (#4912, Jungshik Shin).
- 426. Remove some spurious entries in the KSC 5601 encoding file (#4910,
-      Jungshik Shin).
- 425. Add Swedish localization of XDarwin front end (Patrik Montgomery).
- 424. Fill in mode switch characters in XDarwin keymap (Mario Klebsch and
-      Torrey T. Lyons).
- 423. Linux/PA-RISC portability fixes (#4892, Grant Grundler, Bdale Garbee,
-      and LaMont Jones).
- 422. Linux/mips portability patch (#4891, 4919, Guido Guenther).
- 421. Preliminary support for building on Linux/arm32 (#4890,
-      Branden Robinson).
- 420. Make it possible to build the X server on Linux/m68k platforms
-      (#4889, Christian T. Steigies).
- 419. Fixes for xman's manpath config handling (#4886, Branden Robinson and
-      Colin Watson).
- 418. Fix some man page aliases (#4882, Branden Robinson).
- 417. Define __GLX_ALIGN64 for glx on Alpha (based on #4888, Branden Robinson).
- 416. Remove PEX5 from the lists of specs in doc/specs/Imakefile (#4881,
-      Branden Robinson).
- 415. linux.cf updates (#4874, Branden Robinson).
- 414. Updates for zh locale files (#4879, Branden Robinson).
- 413. xf86config man page update (#4877, Branden Robinson).
- 412. Startx enhancements and cleanups (#4875, Branden Robinson and
-      Henry T. So).
- 411. Use DirectDraw2 instead of DirectDraw on Cygwin (#5012, Harold Hunt).
- 410. Add French localization of XDarwin front end (Olivier Verdier).
- 409. Fix portability problem in the generation of the man page version string
-      (Marc La France).
- 408. Fix a NativeGDI problem on Cygwin/XFree86 (#5007, #5008, Harold Hunt).
- 407. Fix for threaded libraries (Marc La France).
- 406. Finish removal of SuperProbe (Marc La France).
- 405. A rather large number of warning fixes throughout (Marc La France).
- 404. Fix bug in HTML install script (Marc La France).
- 403. Missing ident lines for some XFree86-modified files (Marc La France).
- 402. Add default half-width doublescanned modes (Marc La France).
- 401. Mark all driver-registered resources with ResBus (Marc La France).
- 400. Fix DPMS-related build problem (Marc La France).
- 399. Log a message just before calling each ChipProbe() during '-probe'
-      processing (Marc La France).
- 398. Temporarily disable ISA probing on SPARCs and PowerPCs (Marc La France).
- 397. Add PCI IDs for Sun hardware (Marc La France).
- 396. Fix memory leak in resource relocation (Marc La France).
- 395. Do not relocate resources that only conflict with disabled non-video PCI
-      devices or disabled PCI ROMs (Marc La France).
- 394. Re-organise SBUS code (Marc La France).
- 393. Add as-yet-unused definitions for PCI resource types other than I/O and
-      memory (Marc La France).
- 392. Add doc for Solaris, but don't format it yet (Marc La France).
- 391. Normalise driver names (Marc La France).
- 390. For SPARCs, disable DGA support in ATI driver
-      (from #4650, David S. Miller).
- 389. Clean up some debugging messages (Marc La France).
- 388. Fix newport driver for when a /proc fs isn't mounted (Marc La France).
- 387. Fix DAC handling bugs in s3 driver (Marc La France).
- 386. Fix resource registration bug for PCI Tseng's (Marc La France).
- 385. Add aperture driver for Solaris (not yet used) (Marc La France).
- 384. Rework scanpci to fix problems that prevented it from completely
-      displaying non-PCI bridges and Simba bridges (Marc La France).
- 383. Fix build problems in some input drivers (Marc La France).
- 382. Fix int10 compile problem for SPARCs and PowerPCs (Marc La France).
- 381. Ensure master aborts on secondary buses complete normally during PCI
-      scans (Marc La France).
- 380. Some memory mapping and Solaris cleanups (Marc La France).
- 379. Fix XDarwin crash on server reset and problem in full screen mode when
-      switching from X to Aqua to X too rapidly (Torrey T. Lyons).
- 378. Add __apploaddir__ definition to imake MANDEFS, to specify location of
-      app-defaults directory, fixes Debian bug report #87611 (Thomas Dickey).
- 377. Xterm patches #161, #162 (Thomas Dickey): mostly bug fixes.
- 376. Add new CyberBladeXP Aladdin based chip ID's (#4994, Hubert Feyrer).
- 375. fix a potential issue where POSIX allows the string returned
-      from getenv to be overwritten (from X11R6.6, Chris Bare).
- 374. Cygwin/XFree86 cleanups and fixes (#4992, #4993, #4999 Harold Hunt).
- 373. Fix i830 VT switching problems which hang the ring buffer (#4987,
-      #4989, Abraham vd Merwe).
- 372. fix a format string problem in lbxproxy, apparently not exploitable
-      (r0gue at vertarmy.org,  Matthieu Herrb).
- 371. Fix disappearing cursor in XDarwin rootless mode by falling back to
-      system cursor for cursors bigger than 16x16 (Torrey T. Lyons).
- 370. Make XDarwin start more robustly from the Finder (Torrey T. Lyons).
- 369. Update XDarwin Japanese localization (Toshimitsu Tanaka).
- 368. Fix calculation of DPI when Xinerama in use (#4986, Andrew C Aitchison).
- 367. Update XDarwin preferences GUI to match current features
-      (Torrey T. Lyons).
- 366. Xkb fixes for international keyboards (Matthieu Herrb).
- 365. Add client side sparc64 support for NetBSD and OpenBSD (Eduardo Horvath,
-      Matthieu Herrb).
- 364. Allow xkbcomp to be used in a cross-compile environment (Alan Hourihane).
- 363. Update documention for the SiS driver, the Options file
-      (Ademar de Souza Reis Jr.).
- 362. Xterm patches #157, #158, #159, #160 (Thomas Dickey): mostly bug fixes.
- 361. Fix high-res modes in the nv driver.  Add interlaced support for
-      chips older than NV11 (Mark Vojkovich).
- 360. Cross compilation fixes (#4981, Harold Hunt, Alan Hourihane).
- 359. Fix cursor artifacts when running XDarwin in full screen Quartz mode
-      with 8 bit depth (Torrey T. Lyons).
- 358. Fix byte ordering issue in XDarwin when loading keymapping files on x86
-      and correctly set ByteOrder for PPC and x86 (Rob Braun).
- 357. When XDarwin is launched from the Finder, start X clients in an
-      interactive shell if user's shell is Bourne-based (Torrey T. Lyons).
- 356. Add CaseSensitiveFileSystem definition, which defaults to YES, except
-      on Darwin, Cygwin, and OS/2. Fix another case problem spotted by
-      NAKAHASHI Ichiro (Torrey T. Lyons).
- 355. Enable Vendor specific FatalError for Cygwin/XFree86 and create
-      the Xserver as a windows executable (#4967, Harold Hunt).
- 354. Add i830 2D and DRI driver (#A.604, VA Linux Systems, 2D3D).
- 353. Use the -no-cpp-precomp compiler option on Darwin, rather than the
-      deprecated -traditional-cpp (Christoph Pfisterer).
- 352. Reverting patch #340, fixing type (Egbert Eich).
- 351. Fix rotation in fbdev driver (#4958, #4959, Michel Dänzer).
- 350. Resync with DRI CVS trunk (DRI Project).
- 349. Move ati driver out of DevelDrivers on PPC platforms (#4952,
-      Michel Dänzer).
- 348. SECURITY: set default value of authComplain resource in xdm to true.
-      This closes a hole where anyone can connect to the X server if
-      the xdm auth dir doesn't exist (Galen Hancock).
- 347. SECURITY: don't let a non-root user halt the machine by having X
-      send SIGUSR1 to init (Thomas Moestl).
- 346. Changed int10 module to stub on Sparc (Egbert Eich).
- 345. Added hyperpen driver (Roland Jansen et. al.).
- 344. Fixed alignments of x86emu-structures for AXP (Jay Estabrook).
- 343. Fixed XLoadQueryFont() and XLoadFont() to support locales
-      (required for Euro support) (Markus Kuhn).
- 342. Modified XtCvtStringToFont() to match any ISO8859 instead of
-      latin1 as fallback. Required for Euro Support (Markus Kuhn).
- 341. Added acute to compose key list for iso8859-15 (Markus Kuhn).
- 340. Modified XV Xinerama support to recognize adaptors if screen 0
-  has no adaptor (Egbert Eich).
- 339. Modified order of disable devices and LeaveVT() to be symetric
-      to the enter case (Egbert Eich).
- 338. Modified GetTimeInMillis() to handle non monotonous system clocks
-      (Egbert Eich).
- 337. Added comment about a Zeos Meridan 850c Notebook to C&T docs (Alan Cox).
- 336. Added call to vbeFree() to apm driver (Egbert Eich).
- 335. C&T driver:
-      - fixed sig11 problem for non-69030 chipsets.
-      - fixed DGA to announce acellerated functions only if accelleration
-        is enabled.
-      - added FP_mode flag to C&T driver which allows to override the detected
-        state of the flat panel (Egbert Eich).
-      - fixed driver to act appropriately if the BIOS switches to the
-        external monitor it detects when doing DDC.
-      - Set IOBase correctly for MMIO when detection 65545 PCI.
-      - fixed text screen restauration on 69030 (Egbert Eich).
-      - reinabled correct KGA handling of C&T chips: unblank before the end
-        of scanline.
-      - added support for composite sync.
-      - when FP is active disallow display sizes greater than panel.
-      - added double buffering to video support.
-      - fixed register settings to prevent flickering during video playback.
-       (Egbert Eich).
- 334. Fixed bug in C&T driver that caused interlaced mode not to work
-      (Claus Hulstrøm).
- 333. Added full MMIO support for C&T 69030 chips (Gregg H. Burman).
- 332. Fixed MMIO accel code in Cirrus Alpine driver, got PIO accel code to
-      work (Egbert Eich).
- 331. Fixed fbdev to obtain 24 bit framebuffer format from the kernel, added
-      more failure messages to fbdev driver (Egbert Eich).
- 330. Added calls to vbeFree() to rendition, savage, silicon motion,
-      i740 and i810 driver (Egbert Eich).
- 329. Modified MGA driver for new Sparse allocation sceme (Jay Estabrook).
- 328. Modified handling of sparse addresses on AXP: The code now no longer
-      maps the entire sparse range. Now the required ranges are mapped
-      relative to a fixed base address (Jay Estabrook).
- 327. Fixed HW cursor for MGA G100 (Egbert Eich).
- 326. Fixed MGA drivers to be able to use overlay modes when HAL lib is
-      loaded (Egbert Eich).
- 325. Disabled accel functions that cause lockups on certain neomagic
-      systems by default. They can be reenabled by setting the option
-      "StrangeLockups" to "no" (Egbert Eich).
- 324. Did a further fix on ScreenToScreenCopy() for Neomagic 2200
-      (Egbert Eich).
- 323. Added experimental support for Toshiba Libretto. This can be enabled
-      by the option "DisplayHeight480" (Egbert Eich).
- 322. Fixed clipping in Savage driver, update to version 1.1.1.19
-      (Tim Roberts).
- 321. fixed calls to BLTSync() on SiS driver (Egbert Eich).
- 320. Fixed Mono8x8PatternFill(): Moving SETROPFG behind SETROPBG did the
-      trick (Egbert Eich).
- 319. Setting 24 bpp pximap flags correctly in SiS driver dependening
-      on chipset (Egbert Eich).
- 318. Setting depth and bpp of framebuffer correctly for suncg14 and sunleo
-      driver (Thorsten Kukuk).
- 317. Tseng driver not longer ignores results of TsengDoMemLimit() which
-      tests for certain restrictions on the usable framebuffer size
-      (Egbert Eich).
- 316. Vesa driver: adding calls to vbeFree() before exiting PreInit().
-      Reinit vbe in ScreenInit() (Egbert Eich).
- 315. Adding int10 initialization to generic vga driver (Egbert Eich).
- 314. Modified generic vga driver to use shadow fb for vga16 on AXP.
-      This works around the problem that AXP can address memory only 32bit
-      wide which doesn't work on a latched register planar fb (Egbert Eich).
- 313. Removing 3.3 code from wacom driver. Makes driver hard to read
-      (Egbert Eich).
- 312. Removing message output from xf86WcmPlug() which causes -configure
-      to core dump (Egbert Eich).
- 311. Modified int10 Pci code to be able to use new version of
-      xf86ReadPciBIOS() (Egbert Eich).
- 310. Modified int10 int1A handler to return valid when an unimplemented int10
-      call is encountered. This allows fallback to system BIOS (Egbert Eich).
- 309. Modified xf86ReadPciBIOS() to check for valid i386 PC signature.
-      Added functions xf86GetAvailablePciBIOSTypes() and
-      xf86ReadPciBIOSByType() to obtain available PCI BIOS types and
-      retrieve a certain BIOS by type (Egbert Eich).
- 308. Reversed bogus patch 1050 of version 4.0.2. The graphics engine will
-      *never* be called after receiving an APM suspend and before receiving
-      an APM resume. If the neomagic locks up on resume this has a different
-      reason (Egbert Eich).
- 307. Change  real/effective user ID to 0/0 before calling modprobe in
-      xf86LoadKernelModule() on Linux so user can also load drm modules. Fixed
-      PATH environment variable to /sbin (Stefan Dirsch, Egbert Eich).
- 306. Removed disable/enable interrupt code on ia64 as interrupts cannot
-      be controled from user level (Egbert Eich).
- 305. Further attempt to fix split algorithm for MTRR regions (Egbert Eich).
- 304. Fixed problem in XAACopyPlaneNtoNColorExpand() that caused bogus
-      memory accesses when src was not in fb memory (Egbert Eich).
- 303. Fixed cfb8_32PaintWindow() to use correct cfb32FillBoxTileOdd function
-      (Egbert Eich).
- 302. Fix to xdm PAM support (Werner Fink).
- 301. Fixed cz and cz_querty keyboard layouts, added support for Slovak
-      keyboard (Jan Holesovsky).
- 300. Fixed core dump in twm if no locales are present (Egbert Eich).
- 299. Modified xterm app default to use LFD fontnames instead of old type
-      (Michael Schroeder).
- 298. Add a f.startwm function to twm to start another manager.
-      (Matthieu Herrb).
- 297. Disable MIT-SHM in Xnest, caused a segfault (Matthieu Herrb).
- 296. Update wskbd keyboard protocol handling for OpenBSD/macppc
-      (Matthieu Herrb).
- 295. Fix problems starting XDarwin from the Finder and pasting with
-      multi-button mouse emulation (Torrey T. Lyons).
- 294. S3 driver updates. Restore console for 964 with Ti3025 and Trio64, and
-      support for Aurora64V+ (#4953, Ani Joshi).
- 293. Fix USB Keyboard access when no PS/2 controller present
-      (#4948, Pontus Lidman).
- 292. Add i810 XvMC (Motion Compensation) driver (#4946, #4964, #4966,
-      Matthew Sottek, Intel).
- 291. When using XKB and LEDs are switched on/off by external application
-      the keyboard module doesn't change phisycal LEDs state immediately
-      (#4951, Ivan Pascal).
- 290. Clean up Cygwin/XFree86 keyboard files (#4949 Harold Hunt).
- 289. Add Matrox G550 support (#4947, Luugi Marson, Matrox).
- 288. Remove SuperProbe.man definition for manual page
-      (#4944, Ishikawa Mutsumi).
- 287. Ark driver updates (#4943, Ani Joshi).
- 286. Fix xterm when XIM is disabled - caused a segfault
-      (#4942, Tomohiro Kubota).
- 285. Add Big Endian support (PowerPC) to radeon driver (#4934, Ani Joshi).
- 284. Fix support for legacy Windows TrueType fonts in Big5 encoding
-      (#4938, Joe Man).
- 283. Support Radeon 7500, 8500 and Rage128ProII (#4941, ATI Technologies).
- 282. Support Trident TGUI96xx and greater with Xv (Alan Hourihane).
- 281. XDarwin fixes for Xinerama in Quartz modes:
-       - Turn Xinerama on by default.
-       - Fix warping the cursor.
-      Also load keymapping from file in IOKit mode for Mac OS X 10.1
-      compatibility. (Torrey T. Lyons and Gregory Parker)
- 280. Fix Trident 96xx high clock setting, acceleration fixes (Alan Hourihane).
- 279. Fix XDarwin rootless crashing bug when window resizing with the Mac menu
-      bar not on X11 main screen (Gregory Parker).
- 278. Define X_LOCALE on Darwin as Darwin's setlocale() does not work
-      properly (Torrey T. Lyons).
- 277. Fix problems with XDarwin multi-monitor support for some screen
-      arrangements (Gregory Parker).
- 276. Preliminary big endian (PowerPC) support for the "nv" driver
-      (Ani Joshi, Mark Vojkovich).
- 275. Enable ThreadedX for Cygwin/XFree86 using auto import features of
-      newer binutils packages (Alan Hourihane).
- 274. Exclude the Mac OS X menu bar from the X11 screen while running XDarwin
-      in rootless mode (Yannick Bessette and Torrey T. Lyons).
- 273. Add support for builtin MTRR and AGP support in NetBSD 1.5Y.
-      (Matthias Drochner and Frank van der Linden).
- 272. Rework XDarwin front end to start X clients in the user's normal
-      environment and fix issues while quitting (Torrey T. Lyons).
- 271. SECURITY: fix glyph clipping for large origin (Keith Packard).
-      Reported to be remotly exploitable through konqueror or netscape
-      by Georgi Guninski.
- 270. Fix setting of memPhysBase in a few drivers (#4937, Gerd Knorr).
- 269. Finish merging freetype-2-0-4 into trunk by resolving conflicts. This
-      also fixes a syntax error on Darwin caused by an out of date version of
-      ttgload.c (Torrey T. Lyons).
- 268. Update VMware driver (#4935, Jeremy (VMware)).
- 267. Native GDI infrastructure sync with Cygwin/XFree86 (#4936, Harold Hunt).
- 266. Update Darwin build configuration files including:
-       - Report full OS version and more capabilities.
-       - Fix X server build problem due to libraries in ProjectRoot being
-         listed as dependencies for some targets.
-       - Allow dynamic shared libraries to take advantage of two-level
-         namespace on Darwin 1.4.
-      (Torrey T. Lyons)
- 265. Disable clipboard viewer, external program xwinclip handles this (fow now)
-      (#4932, Harold Hunt).
- 264. Add ability to let Aqua and X use different display modes while running
-      XDarwin full screen (Torrey T. Lyons).
- 263. Fix build dependency problem in xedit/lisp/lisp.rules
-      (#4930, Harald Koenig).
- 262. Fix a fontenc-related problem that can cause the TrueType backend
-      to crash (#4909, Juliusz Chroboczek).
- 261. Fix DPMS support for I128 driver (Robin Cutshaw).
- 260. Add OSVErrorF for Cygwin/XFree86 (#4923, Harold Hunt).
- 259. Support Trident Cyber9320, TGUI9440, TVGA8900C, TVGA9000 ISA chips
-      (Alan Hourihane).
- 258. Fix banked 24bpp displayWidth calculation (Marc La France).
- 257. Fix accel initialisation bugs in ATI driver (Marc La France).
- 256. Add entry to initialise framebuffer manager by area (allowing for a
-      possible extra partial scanline) and make it print all largest areas
-      (Marc La France).
- 255. Make xdm use BSD authentification on OpenBSD and use setproctitle()
-      instead of home grown version where available (enabled on
-      OpenBSD and NetBSD only) (Matthieu Herrb).
- 254. Make -configure generate the DisplaySize from the acquired DDC
-      information (#4897, Andrew C Aitchison).
-
-XFree86 4.1.99.1 (20 August 2001)
- 253. Fix bad xalloc() in the new fontenc code (#4899, ISHIKAWA Mutsumi).
- 252. Fix some Xrandr build issues on Cygwin/XFree86 (#4898, Suhaib Siddiqi).
- 251. Fix some Cygwin/XFree86 dependencies in cygwin.rules (#4894, Harold Hunt).
- 250. Add ATI Xpert2000 (Rage 128 SM) (#4896, Mike Harris).
- 249. Fix '-configure' crash introduced recently (#4895, Andrew C Aitchison).
- 248. Re-write Xvideo support for Permedia3 (Alan Hourihane).
- 247. Add Texas Instruments Permedia to Delta attached chips (Alan Hourihane).
- 246. Add Permedia4 support (different clock synth) (Jay Estabrook).
- 245. Resync with DRI CVS trunk (VA Linux Systems).
- 244. Add XKB descriptions for the extra keys on a Dell Internet keyboard
-      (#A.533, Ben Liblit).
- 243. Add a Maltese XKB map and locale support (#A.527, Ramon Casha).
- 242. Add a new "bksl" variant of the Czech XKB map (#A.515, Stanislav Brabec).
- 241. Fix the initialization sequence for ExplorerPS/2 (#A.510,
-      Arndt Schoenewald).
- 240. When xdm is built with PAM support, don't call getpwnam() before
-      calling the various PAM functions associated with authenticating a user
-      (A.504, Ben Harris).
- 239. Fix ccmakedep to handle source file extensions of more than one
-      character (#A.507, Andy Wiggin).
- 238. Fix a VT switching crash in the cirrus driver when acceleration is
-      disabled (#A.489, Kirill V. Semenkov, #A.518, B. D. Elliott).
- 237. Add support for the "PR" variant of the Rage 128 Pro (#A.487,
-      Alfred Perlstein).
- 236. Make the config file created with 'XFree86 -configure' load the
-      speedo and/or type1 modules if relevant font directory is in
-      the font path (#A.484, Dmitry Yu. Bolkhovityanov).
- 235. Fix a bug in the nv driver's detection of the crystal frequency (A.481,
-      Leo L. Schwab).
- 234. Make xfontsel use the same order in its menus as the sort order used
-      by the X server and xfs (#A.480, Dmitry Yu. Bolkhovityanov).
- 233. Add an input driver for DMC FIT10 touch-panel (#A.477, Mayk Langer).
- 232. Fix xf86PostMotionEvent() to handle first_valuator values other than
-      zero (#A.468, Joe Krahn).
- 231. Change the Swedish xkb map to map AltGr+Space to space (#A.467,
-      David Härdeman).
- 230. Fix the return value information in the Xv library man pages (#A.458,
-      Tommi Vainikainen).
- 229. Fix the DGA client library so that it can map the video memory on
-      Solaris 8 x86 (#A.454, Juergen Keil).
- 228. Change {Max,Min}{X,Y}Position options in the elographics and mutouch
-      drivers to {Max,Min}{X,Y} so that it's consistent with the other
-      drivers.
- 227. Some Bulgarian and Serbian locale updates (#A.444, Anton Zinoviev).
- 226. Add a usage message to glxinfo (#A.430, Mike Coleman).
- 225. Set the Alt/Windows key mappings for 104-key keyboards to be
-      compatible with 101-key keyboards by default, and add some new
-      XKB options to set them differently.
- 224. Add some new XKB options to select third level shift and group
-      switchers/togglers (#A.425, Anton Zinoviev).
- 223. Fix a bug in the Serbian XKB map (#A.424, Anton Zinoviev).
- 222. Export from the loader the DIX symbols necessary for a modular version
-      of the DEC-XTRAP extension (#4797, Paul Stewart).
- 221. Add a workaround for FreeBSD to make programs (like mkfontdir) that
-      are run as part of the build use the shared libraries from the build
-      rather than those that may be installed on the system (David Dawes).
- 220. Use MAXSOCKS for connection limit in Cygwin/XFree86 (Alan Hourihane).
- 219. Add Render's layer support to Cygwin/XFree86 (#4872, Harold Hunt).
- 218. Support for OpenBSD/powerpc (Matthieu Herrb).
- 217. Experimental change to default behaviour of ATI panel support to override
-      the horizontal and vertical porches of all modes to that found in the
-      mode on entry (Marc La France).
- 216. Fix detection of a panel's mode on entry in the ATI driver
-      (Marc La France).
- 215. Fix for Option "CRTScreen" in ATI driver (Marc La France).
- 214. Patch for the Thai glyphs in Mark Leisher's ClearlyU font (#4846,
-      Theppitak Karoonboonyanan).
- 213. Add a font encoding file for tis620-2 (#4845, Theppitak Karoonboonyanan).
- 212. Add a font encoding file for ISO8859-16 (#4844, Markus Kuhn).
- 211. Make the input method framework in Xlib work better in an UTF-8
-      locale (#4843, Yao Zhang and Bruno Haible).
- 210. Default *sampleText*international to false in xfontsel's app-defaults
-      file, since it breaks if the user has '*international: true' (#4842,
-      Juliusz Chroboczek).
- 209. A new version of the fontenc layer.  A major difference is that it
-      reads from a "system" encodings directory
-      <ProjectRoot>/lib/fonts/encodings/encodings.dir, which is searched
-      after any encodings.dir file in the font's directory.  The font
-      ABI version is bumped to 0.3 and the Xfont shared library's version
-      is bumped to 1.4 (#4839, Juliusz Chroboczek).
- 208. Add support to xload for displaying the load of remote hosts by using
-      information in rwhod(1)'s database (#4833, Anders Eriksson).
- 207. Rename the XVisibilityNotifyEvent man page to XVisibilityEvent,
-      which matches the naming convention for the other X Event man pages
-      (#4830, Ernie Coskrey, from X11R6.6).
- 206. Update the registry to match X.Org's X11R6.6 version (#4829,
-      Ernie Coskrey, from X11R6.6).
- 205. Fix for the SlowKeys feature of the AccessX portion of XKB not working
-      when the delay is longer than the amount of time between the delivery
-      of key press events to the extension (#4828, Ernie Coskrey,
-      from X11R6.6).
- 204. Add a locale alias for "th_TH.TIS-620" (#4827,
-      Theppitak Karoonboonyanan).
- 203. Some linux.cf updates (#4825, Branden Robinson).
- 202. Make the vbe module build like the other modules.
- 201. -
- 200. Add a command line options (-show) to xvidtune to print out the current
-      video mode (#4809, Markus Kuhn).
- 199. A new driver for the "Acecad Flair" tablet (not enabled by default yet)
-      (#4800, Edouard TISSERANT).
- 198. Fix some typos in the iso8859-2 Compose file (#4799, Kamil Toman).
- 197. Add some XKB options to allow the CapsLock behaviour to be easily
-      selected (#4794, Ivan Pascal).
- 196. Don't reference the log file in the FatalError message if it hasn't
-      been opened yet (#4793, Branden Robinson).
- 195. Add Calcomp input driver (#A.554 Martin Kroeker).
- 194. Add preliminary 8 bit PseudoColor support to XDarwin full screen Quartz
-      mode and fix IOKit mode PseudoColor that was broken by the multi-monitor
-      patch (Torrey T. Lyons).
- 193. Load XDarwin keymapping from file by default and give more useful error
-      message if getting keymapping from kernel fails. Change keymapping
-      translation so delete key is XK_BackSpace by default (Torrey T. Lyons).
- 192. Create the two sets of locale.alias and locale.dir entries (those with
-      and those without the ':' separator) from a single set of entries in
-      the source files (David Dawes).
- 191. Add an MS mouse driver for KDrive (#4754, Juliusz Chroboczek).
- 190. Improve "true Big5" and "Emacs Big5" support (#4792, Yong Li, #4798,
-      Tomohiro KUBOTA).
- 189. Fix a non-standard character set bug in Xlib (#4792, Ivan Pascal).
- 188. Fix for the savage driver on 64-bit platforms (#4788, Jay Estabrook).
- 187. Xv fix for the r128 driver on big-endian architectures (#4781,
-      Michel Dänzer).
- 186. Fix an Xlib bug that affects conversion from CTEXT to multibyte /
-      wide character (#4780, Tomohiro KUBOTA, #4783, Bruno Haible).
- 185. Release notes (4.1.0) and Status doc fixes (#4778, 4779,
-      Branden Robinson).
- 184. 64-bit fix for lib/X11/ImUtil.c (#4773, Mike Harris).
- 183. Fix dashed lines for the r128 driver on big-endian architectures
-      (#4769, Michel Dänzer).
- 182. Fix Xlib's parsing of CTEXT with multi-byte characters in GR (#4761,
-      Juliusz Chroboczek).
- 181. Fixes for the Romanian (ro) XKB map (#4746, Marius Andreiana).
- 180. XDarwin bug fixes:
-       - Stop FatalError re-entry in "no Quartz support" messages.
-       - Synchronize XDarwin serverVisible state with application on rootless
-         startup.
-      (Torrey T. Lyons)
- 179. Fix an XDarwin bug that broke XWarpPointer in Quartz modes (Gregory
-      Parker).
- 178. Fix some more mi build warnings (David Dawes).
- 177. Fix some mi build warnings (#4716-4719,4721-4724, Adam Sulmicki).
- 176. Port for Linux/SuperH (Jornada680/690 and SEGA Dreamcast) (#4680, 4681,
-      ISHIKAWA Mutsumi).
- 175. Support for mouse wheel emulation (#A.506, Henry T. So).
- 174. Add support to Cygwin/XFree86 to use CTRL+ALT+BKSPACE as the shutdown
-      signal and fix up command line options to accomodate.
-      (#4838, Alexander Gottwald).
- 173. In XDarwin, add ability to change modifiers to use when faking multiple
-      mouse buttons (Gregory Parker).
- 172. Do not build Cygwin/XFree86 with -ansi as Cygwin's library (newlib) lacks
-      some prototype definitions that cause runtime failures (hypot being one
-      of them) (Alan Hourihane).
- 171. Add extra library flags (commented out for now) for building
-      Cygwin/XFree86's server (#4834, Harold Hunt).
- 170. Fix a bug in the v4l module which caused multiple TV cards not to work
-      (#4835, Gerd Knorr).
- 169. Add multi-monitor support to XDarwin for all display modes using
-      Xinerama (Gregory Parker and Torrey T. Lyons).
- 168. Fix 16bpp colour maps on Mach64's (Marc La France).
- 167. Fix Mach64 DPMS bug (Marc La France).
- 166. Fix bug that prevented hardware cursors on Mach64 CT's (Marc La France).
- 165. Document what a ChipAdjustFrame() function should to to prevent moving
-      of hardware cursors during mode switches (Marc La France).
- 164. -Wimplicit warning cleanup [`make World` >required<] (Marc La France).
- 163. Ensure installed headers can find the headers they, in turn, #include
-      (Marc La France).
- 162. Make imake pass its -W* flags to cpp (Marc La France).
- 161. More accomodations for newer GCC's (Mike A. Harris).
- 160. Remove a CYGWIN define from Xserver/include/windowstr.h
-      (#4832, Harold Hunt).
- 159. Fix a casting problem which causes bdftopcf to write corrupted
-      fonts on buffer boundaries (#A.522, Jakub Bogusz).
- 158. Cygwin/XFree86 updates (#4824, #4826 Harold Hunt).
- 157. Fix horizontal stripes problem in Permedia3 driver (Alan Hourihane).
- 156. Remove most X_NOT_STDC_ENV code, and assume that __STDC__ is defined
-      (David Dawes).
- 155. Remove (stale) support for Amoeba and Minix (David Dawes).
- 154. Update Cygwin/XFree86 cross-compilation and update to latest
-      source base (#4801, #4802, Harold Hunt).
- 153. Fix 'make install' for Freetype. (#4812, Carlos A M dos Santos).
- 152. Turn on dll style modules for Linux/MIPS. (#4807, Guido Guenther).
- 151. Add support for ATI's Radeon VE, Mobility M6, All-In-Wonder Radeon
-      and Rage128 Pro Ultra, Digital Flat Panel support. Use DDC2 interface.
-      (#4817, Mike Smith, ATI Technologies).
- 150. Add IBM S/390 support for building the tree (#4815, Mike A. Harris)
- 149. Fixes incorrect spelling of "XChangeWindowAttributes" found in
-      XCreateColormap(3X11) and XInstallColormap(3X11)
-      (#4813 Carlos A M dos Santos).
- 148. Fix a serious memory leak in XAA (Mark Vojkovich).
- 147. Add a DriverPrivate field to I2C devices (Marc La France).
- 146. In the ATI driver, initialise the fb manager whether or not XAA is also
-      used (Marc La France).
- 145. Fix typos in radeon and wacom drivers.
- 144. Don't disable the secondary CRTC on ATI Rage XL adapters (it doesn't
-      exist) (Marc La France).
- 143. Speed up ix86 block moves in ATI driver (Marc La France).
- 142. Temporarily disable hardware cursor support for ATI GX & CX adapters
-      (Marc La France).
- 141. Make composite sync the default in the ATI driver (David S. Miller).
- 140. Rework stretching of small DFP modes in ATI driver (Marc La France).
- 139. Add an interesting PCI ID (Marc La France).
- 138. Allow ChipValidMode() functions to pre-calculate a mode's horizontal
-      sync and vertical refresh rates (Marc La France).
- 137. Another fix for mode switch and cursor interactions (Marc La France).
- 136. Temporary fix for endianness problems in ATI driver (Marc La France).
- 135. Add XGetIMValues() prototype to Xlib.h (Marc La France).
- 134. Use a more reasonable numbering for recent binutils versions on Linux
-      (Marc La France).
- 133. Fix dependencies for building drivers in a static server
-      (Marc La France).
- 132. Update XDarwin Japanese localization to include rootless UI changes
-      (Toshimitsu Tanaka).
- 131. Fix potential XDarwin bug in translating Darwin keymappings to X11
-      keymaps with unrecognized modifier keys (Gregory Parker).
- 130. Make XDarwin ignore Caps Lock when checking for VT switch, except when
-      the user's switch key preference includes Caps Lock (Gregory Parker).
- 129. Update XDarwin Cocoa UI and preferences for rootless mode. Add more
-      explicit error message for users trying to run in Quartz modes without
-      Quartz support. Remove unneeded info.nib files (Torrey T. Lyons).
- 128. Added XDarwin menu bar hiding/showing in rootless mode (Gregory Parker).
- 127. Fix DDC from reporting misleading information.
-      (#4806 Andrew C Aitchison)
- 126. Patch to make VBE DDC honour the NoDDC option.
-      Before this, NoDDC disabled only 2 of the 3 ways the server might
-      ask the monitor for DDC infomation.
-      (#4805 Andrew C Aitchison)
- 125. Stops xf86cfg complaining about non-video chips from Intel.
-      Adds a few PCI card ids for Intel and one for Matrox.
-      (#4804 Andrew C Aitchison)
- 124. Add support for NVIDIA nForce integrated graphics (Mark Vojkovich).
- 123. Fix a possible fatal crash in Xv when Xinerama is used (Mark Vojkovich).
- 122. Corrects typos in output of xf86cfg when checking modules and
-      documents ddc module options (Andrew C Aitchison).
- 121. On Mac OS X, allow users to disable mouse acceleration changes by
-      XDarwin (Torrey T. Lyons).
- 120. By default, don't build the MagicTouch input driver until a common layer
-      interface is coded for it (Marc La France).
- 119. Fix Offscreen Image support for Xv/v4l in tdfx driver (Alan Hourihane).
- 118. Add MagicTouch driver (A.482, Mauro Ziliani)
- 117. Fix side effect in XFree86 of the recent changes to libxf86config
-      (A.486, Knuts Andy).
- 116. Define Xutf8LookupString in X11-def.cpp for Cygwin/XFree86
-      (#4790, Suhaib Siddiqi).
- 115. Turn on RandR build for Cygwin/XFree86 (#4789, Harold Hunt).
- 114. Import of Gregory Parker's rootless code for Mac OS X. The code has
-      been cleaned up, reorganized, and modified to use Cocoa and fb
-      (Gregory Parker and Torrey T. Lyons).
- 113. Freshen SCO port (#4709, J. Kean Johnston).
- 112. Fix int10 build for GCC 3.0 (Marc La France).
- 111. An attempt at fixing the i740 driver to not reference options before they
-      are collected (Marc La France).
- 110. Fix for RandR build (Bill Crawford).
- 109. Fix 3Dfx Voodoo Banshee boards with timing issues (Alan Hourihane).
- 108. Allow Cygwin/XFree86 to be cross compiled (#4784-#4786 Harold Hunt).
- 107. Fix fatal bug in XAA's N-to-N CopyPlane acceleration (Elliot Lee).
- 106. Add RandR support to the Kdrive PCMCIA driver (Alan Hourihane).
- 105. Fix SharedLibGL to SharedLibGlx in cygwin.rules and some Cygwin/XFree86
-      fixes including enabling backing store. (#4770, #4771 Harold Hunt).
- 104. xf86UnMapVidMem shows the wrong number of arguments in
-      os-support/README.OS-lib (#4357, Guido Guenther).
- 103. Some driver loader symbol req/ref registration cleanups (David Dawes).
- 102. Cygwin/XFree86 fixes.
-      Release pressed modifier keys when server looses focus.
-      Remove declaration in lib/X11/lcGetConv.c (no longer needed).
-      Remove unnecessary #if(n)def __CYGWIN__ in lib/X11/lcGetConv.c, one in
-      lib/dps/csconndi.c and one in lib/font/Type1/regions.h.
-      Add a new SharedDepLibraryTarget rule (#4763-#4768, Harold Hunt).
- 101. Fix bogus handling of BUS_CNTL Mach64 register (Marc La France).
- 100. Fix a typo in xc/programs/bitmap/Bitmap.h (#4757, Suhaib Siddiqi).
-  99. Add Cygwin/XFree86 manpage and minor tweaks (#4756, Harold Hunt).
-  98. Ensure PCI master aborts are allowed to complete normally on non-root
-      buses (Marc La France).
-  97. Allow ChipScreenInit()'s to load modules during the first server
-      generation (Marc La France).
-  96. Update XvMC header files to match the spec (Matthew Sottek).
-  95. Darwin build configuration changes:
-       - Turn on building Xv and GLX extensions.
-       - Make GLX and GLU build successfully.
-       - Use Darwin's libz instead of building one for XFree86.
-       - Use XFree86's standard compiler optimization flags per CPU type.
-      (Torrey T. Lyons).
-  94. Fix Xserver/Imakefile typo which broke XDarwin build (Torrey T. Lyons).
-  93. Fix Darwin bindist files so that dynamic shared libraries are put in
-      Xbin.tgz instead of Xprog.tgz (Torrey T. Lyons).
-  92. Fix problem in Ib/Xaw/AsciiSrc.c:nitStringOrFile() when descriptor 0
-      is closed, as a zero return value from open(2) is taken as an error
-      (splite at purdue.edu).
-  91. Fix glide driver that causes -configure to fail for all drivers
-      (Alan Hourihane).
-  90. Don't define SVR4 on Cygwin/XFree86 (#4751, Suhaib Siddiqi,
-      Alan Hourihane).
-  89. Don't override system commands specified in host.def on Cygwin/XFree86
-      (#4753, Alexander Gottwald).
-  88. Fix cursor problem in server respawn's on Cygwin/XFree86
-      (#4750, Harold Hunt).
-  87. Fix typo definition of CplusplusCmd in cygwin.cf
-      (#4752, Alexander Gottwald).
-  86. Fix makedepend for use on Cygwin/XFree86.
-      Use makedepend on Cygwin/XFree86.
-      Fix SharedDepLibraryTarget so that build dependencies are correct,
-      this fixes libGLU's build problem (Alan Hourihane).
-  85. Don't define MKSTEMP on Cygwin/XFree86 (#4725, Harold Hunt).
-  84. Fix memory count function for I128 (Mark Thompson).
-  83. Use TermcapLibrary as -lncurses instead of -ltermcap, fixes problem
-      building xterm/resize on Cygwin/XFree86 (#4749, Harold Hunt).
-  82. Fix X server segfault in the GLX code (Brian Paul).
-  81. PseudoColor fixes for Cygwin/XFree86 (#4745, Harold Hunt).
-  80. Fix broken TGA driver (Alan Hourihane).
-  79. Fix FIFO reset trouble in tdfx driver by lowering the FIFO size due to
-      suspect code in Glide3. (Alan Hourihane).
-  78. Fix Xvideo in tdfx driver when using YUY2 or UYVY data (Alan Hourihane).
-  77. Add two missing symbols to loader reference for the glint driver
-      (#4740, Mike Harris).
-  76. Make Cygwin/XFree86 work at 8bpp, and re-arrange some command line
-      flags. (#4743, Harold Hunt).
-  75. Fix some build issues on Cygwin/XFree86 (#4736, #4737, Suhaib Siddiqi).
-  74. Some Cygwin/XFree86 cleanups (#4735, Harold Hunt).
-  73. Fix XAA's incorrect acceleration of X-Render's repeated sources and
-      masks (Mark Vojkovich).
-  72. Disable PCI resource conflict checking for Linux/Alpha (Jay Estabrook).
-  71. Fix Linux xf86GetPciSizeFromOS() parsing when the kernel is 64 bit
-      and any base or size is larger than 32 bits in magnitude (#4732,
-      David S. Miller).
-  70. Xinstall.sh updates and bug fixes (David Dawes).
-  69. Make XDarwin ddx pass up proper right and middle mouse button numbers
-      and fix mouse button 5 (Christoph Pfisterer and Torrey T. Lyons).
-  68. Restore backwards compatibility from 4.0.[2,3] to 4.1.0 for
-      the i810, r128 and radeon DRI drivers (Gareth Hughes).
-  67. Fix a problem when using patterns of horizontal lines with the mga
-      video overlay (#A.442, Ewald Snel).
-  66. Remove duplicate XineramaLibrary section in X11.tmpl (#4731,
-      Mike Harris).
-  65. Enable building DRI for Linux/ppc, and fix a drm-related bug
-      for Linux/ppc (#4728, 4730, Michel Dänzer).
-  64. Document Options for the r128 and fbdev drivers (#4727, 4729,
-      Michel Dänzer).
-  63. Add a BuildBindist switch which causes a file containing the XFree86
-      version number to be installed in ProjectRoot, include this in
-      the Xbin bindist tarballs, and turn on this switch in the bindist
-      host.def files.  The purpose is to allow the installer script to
-      easily identify which version the bindist tarballs are (David Dawes).
-  62. Resync bindist and Xinstall.sh with changes made for 4.0.3 (David Dawes).
-  61. Fix the Shape extension's XShapeCombineMask to handle cases where
-      src_mask is None according to the spec.  This reportedly fixes an
-      X server crash (#4715, Huver).
-  60. Exclude the DRI extension when NO_HW_ONLY_EXTS is defined (based on
-      #4714, Frederic Lepied).
-  59. Fixup Cygwin/XFree86 after recent Xrandr changes (#4726, Harold Hunt).
-  58. Fix ATI Radeon driver on Alpha. Seems as though the BIOS doesn't
-      like Re-POSTing and memory setup gets confused. (Jay Estabrook, Jeff
-      Weidemeier)
-  57. Build fixes for Cygwin/XFree86 (#4710,#4711,#4713 Harold Hunt).
-  56. Fix problem with Xinstall.sh on Darwin 1.3.x (#A.431, Stefan Pantos).
-  55. Update Xinstall.sh and Darwin bindist directories to optionally
-      install Quartz support and to add an x86 distribution (Torrey T. Lyons).
-  54. Install xterm.termcap and xterm.terminfo when installing xterm
-      (Torrey T. Lyons).
-  53. Add missing return value for miSetPixmapDepths() (#4708,
-      ISHIKAWA Mutsumi).
-  52. Fill in the v4l man page template with some useful information (#4707,
-      Gerd Knorr).
-  51. Fix FFB OpenGL SwapBuffers (#4705, David S. Miller).
-  50. Fix some mi build warnings (#4695-4701,4704, Adam Sulmicki).
-  49. Work around a problem building the rstart specs doc with a symlinked
-      build tree (David Dawes).
-  48. Fix Glint 300SX+Delta support. Add faster 500TX text acceleration
-      based on other code (Alan Hourihane).
-  47. Remove SPARC-specific byte-swapping code that would not work on older
-      SPARC CPUs (part of #4653, David S. Miller).
-  46. NULLify mapVidMem() and remove DEV_MEM define for Linux/SPARC
-      (#4651, David S. Miller).
-  45. Fixing MTRR split code (hopefully) (Egbert Eich).
-  44. Fixing coredump when doing vbeFree() twice: S3 Virge and C&T
-      (Egbert Eich).
-  43. Fixing HWCursor for mga driver in fbdev mode (Egbert Eich).
-  42. Make the entire source tree (except GLX) compile under SunOS/SPARC 5.7.
-      Functions that have yet to be ported are FatalError()'s.  This is
-      temporarily controlled through a BuildXFree86onSparcSunOS #define in
-      host.def (Marc La France).
-  41. Merge support for all Solaris/ix86 versions together (Marc La France).
-  40. Replace Xserver/Imakefile's DDXDIRn scheme with a more general scheme
-      (Marc La France).
-  39. For GCC on SVR4 variants, use -fPIC rather than -fpic to generate shared
-      objects (Marc La France).
-  38. Fix xmh's use of XtNewString() with getenv (#4694, Tim Waugh).
-  37. Xdm/PAM fixes: leave it to PAM to observe whether or not an account
-      is locked, and reinitialize credentials after calling initgroups(),
-      because sometimes the credentials pam_setcred() gives are in the
-      form of group membership (#4693, Mike Harris).
-  36. Add an encodings file for standard box drawing characters for
-      VT100-compatible terminals (#4691, Juliusz Chroboczek).
-  35. Fix warnings when building mieq.c (#4689, Adam Sulmicki).
-  34. Fix some bugs in the cz and sk entried in XKB's keymap/xfree86 file
-      (#4692, Ivan Pascal).
-  33. Add 'hr' entries to XKB's keymap/xfree86 and rules/xfree86.lst files
-      (#4687, Nerijus Baliunas).
-  32. Include <X11/Xutil.h> in shape.h to get Region typedef (#4686,
-      Adam Sulmicki).
-  31. Acceleration bug fixes for GLINT Permedia1 (Alan Hourihane).
-  30. Ensure glint driver chips don't exceed the specified virtual sizes.
-      (Alan Hourihane).
-  29. ATI DGA changes (Patrick Chase and Marc La France):
-      - Add accelerated DGA primitives for Mach64 variants;
-      - Add accelerated DGA transparent blits for Rage128 and Radeon;
-      - Fix setting of DGA_CONCURRENT_ACCESS;
-      - Take XaaNo* options into consideration.
-  28. Simplify DGAShutdown() (Marc La France).
-  27. Fix colourmap bug when switching out of a DGA mode (Marc La France).
-  26. Make it possible, but not required, for a driver to initialise DGA after
-      XAA so that it may factor in any XaaNo* options in determining what DGA
-      drawing primitives to support (Marc La France).
-  25. Prevent mode switches while DGA modes are set (Marc La France).
-  24. Remove all VGA'isms from the glint driver, it doesn't need them
-      (Alan Hourihane).
-  23. Support the Delta in the glint driver, needed for boards that have
-      the Delta connected to the rasterizer, as it acts as an arbiter for
-      the bus. Resolves acceleration troubles. (Alan Hourihane).
-  22. Add an lv entry to XKB's keymap/xfree86 file (#4685, Nerijus Baliunas).
-  21. Fix some typos in XKB's xfree86.lst file (#4684, Nerijus Baliunas).
-  20. Add DDXOSVERRORF ifdefs to the XFree86 ddx code that make use of the
-      OsVendorVErrorFProc feature (#4678, Michel Dänzer).
-  19. Convert the r128 driver's "UseBIOSDisplay" option into a more general
-      "Display" option (#4678, Michel Dänzer).
-  18. Treat GL_POINT like GL_POINTS and GL_LINE like GL_LINES in the sunffb
-      DRI driver (#4677, David S. Miller).
-  17. Some doc updates related to cross compiling (#A.413, Scott A McConnell).
-  16. Fix bsdLib.rules and bsdLib.tmpl problems that show up when
-      X11ProjectRoot is defined (#4676, Johnny C. Lam).
-  15. Fix Trident XVideo colorkey at depth 15, 24 (Alan Hourihane).
-  14. Fix some apm driver bugs, including one that prevented acceleration
-      from working (#4674, Loïc Grenié).
-  13. Fix 555 (depth 15) palette handling in the i810 driver (#4673,
-      Andrew C. Aitchison).
-  12. [SECURITY] Fix authentication issues with mmap() on drm devices
-      (Jeff Hartmann).
-  11. Add euro locales and some other missing locales to locale.alias and
-      locale.dir (#4662, 4665, 4667, Mike Harris).
-  10. Fix Romanian XKB map (#4664, Mike Harris).
-   9. Spell Portuguese correctly in XKB lst files (#4663, Mike Harris).
-   8. Fix new ioperm calls in lnx_video.c for Alpha that are not needed
-      (Jay Estabrook).
-   7. Add drivers for PCMCIA cards, HP VGA Out F1252A, and the ColorGraphic
-      Voyager VGA card to the KDrive server. Tested on the Compaq IPAQ.
-      Use -listmodes, to check resolutions supported.
-      (Alan Hourihane).
-   6. Add RandR extension (Jim Gettys)
-   5. Fix int10 option handling and DDC max clock reporting (Marc La France).
-   4. Fix problems with assembler file dependencies when using gccmakedep
-      with the build (Frederic Lepied).
-   3. Update Japanese localization of XDarwin help file (Toshimitsu Tanaka).
-   2. Update XDarwin man pages, help files, and version info. Add option to
-      build XDarwin.app bundle for deployment (Torrey Lyons).
-   1. Finish DRI resync, including tdfx driver updates for textured video
-      support (VA Linux Systems).
-
-XFree86 4.0.99.900 (18 May 2001)
- 561. Add an XKB description for Latvian (lv) keyboards (#A.411, Ilya Ketris).
- 560. Resync with DRI CVS trunk (VA Linux Systems).
- 559. Savage driver updates, including compiler warning fixes, document
-      the "ShadowStatus" option in the man page, and fix an argument
-      mismatch between ShadowWait and SavageWaitQueue (#4661, Tim Roberts).
- 558. Update the wacom driver to add a "ScreenNo" option to allow a tablet
-      to be attached to a screen in a multi-head setup, and to add auto-
-      detection of USB line and max parameters of USB tablets (#4640,
-      Frederic Lepied).
- 557. Add a README file that has information about enabling the extra buttons
-      on the IBM Rapid Access keyboard (#4639, Dennis Bjorklund).
- 556. Fix some Slovene/Slovak confusion in locale.dir/locale.alias files
-      (#4638, Kamil Toman).
- 555. New XKB keymaps for cz and sk (#4634, 4637, Kamil Toman).
- 554. Updates for the iso8859-2 Compose file (#4634, Kamil Toman).
- 553. Check V_CSYNC in the r128 driver, and fix building with R128_DEBUG
-      enabled (#4631, Michel Dänzer).
- 552. Mesa 3.4.2 (and later) import.
- 551. More build & warning fixes (Marc La France).
- 550. Fix bug that caused hardware cursors to be temporarily moved during mode
-      switches (Marc La France).
- 549. Optimise HARDWARE_CURSOR_AND_SOURCE_WITH_MASK case (Marc La France).
- 548. Move xf86CursorScreenRec definition into xf86CursorPriv.h
-      (Marc La France).
- 547. Fix BIOS retrievals in MGA driver (Marc La France).
- 546. Fix ATIProbe() for newer Rage128 and Radeon chips (Marc La France).
- 545. Add temporary workaround in ATI driver for interrupts that occur on
-      PowerPC's upon PCI master-aborts (Marc La France).
- 544. Update XDarwin to use fb and support Render (Torrey Lyons).
- 543. Back out sunleo conversion to fb.  This driver is too heavily dependent
-      on cfb32 for a simple fb conversion (Marc La France).
- 542. Miscellaneous build/warning fixes (Marc La France).
- 541. More prep work for SunOS (Marc La France).
- 540. Fix libXft build on SunOS (Marc La France).
- 539. Another makedepend bug fix (Marc La France).
- 538. Fix use of xftcache utility during !UseInstalled builds (Marc La France).
- 537. Adds #XFree86LOADER define to wrap ModuleInfo related functions
-      (#4654, Harold Hunt).
- 536. Add an option to the SiS driver to turn off Xvideo support
-      (Ademar de Souza Reis Jr.)
- 535. Fix FreeType bug, use MAXFONTNAMELEN (#4652, Janusz Gorycki,
-      Juliusz Chroboczek).
- 534. Fix hw/vfb for compilation on Cygwin/XFree86 (#4655, Harold Hunt).
- 533. Fix some Sparc platform issues with Pci resources and the glint
-      driver (#4641-4641,4644-4648 David S. Miller).
- 532. Update glide, imstt, newport, rendition, suncg14, suncg3, suncg6,
-      sunleo, suntcx, vga and vmware to use fb and support Render
-      (Keith Packard).
- 531. XDarwin fixes:
-       - Turn off building non-functional RENDER support.
-       - Reduce disappearing cursor problems when switching with Dock.
-       - Top of X display is no longer occasionally drawn black when
-         switching from Aqua.
-      (Torrey Lyons).
- 530. Update freetype2 bits to 2.0.2 version (Keith Packard).
- 529. Re-fix the Trident Video scaler support for Blade series chips
-      (Alan Hourihane).
- 528. Fixed lbx to handle endian swapping without core dump (Egbert Eich).
- 527. Fixed MTRR region splitting (Egbert Eich).
- 526. Cleaned up option handling in int10 code (Egbert Eich).
- 525. Added options to specify the Video BIOS to use for POSTing a
-      chipset (Egbert Eich).
- 524. Trident driver: added call to BIOS to enable unstretched mode when
-      display is stretched. This should make the option "CyberShadow"
-      obsolete. (Egbert Eich).
- 523. Attempt to fix video Support on Trident driver (Egbert Eich).
- 522. Added VBE DDC support to SiS driver (Egbert Eich).
- 521. Fixed Silicon Motion to unblank the display when driver fails
-      in PreInit() (Egbert Eich).
- 520. Cleaned up handling of 'shadow status' in Savage driver
-      (Egbert Eich).
- 519. Savage driver: fixed lockups for Savage4 when loading colormap,
-      manipulating the HW cursor, doing certain blit operations
- 518. Cleanded up DDC code in mga driver (Egbert Eich).
- 517. Fixed KGA handling in i740 driver (Egbert Eich).
- 516. Converted i740 and Silicon Motion drivers to fb (Egbert Eich).
- 515. Added calls to vbeFree() or xf86FreeInt10() to C&T, glint,
-      mga, neomagic, nv, s3v, tdfx and trident drivers to clean up
-      shared memory segments (Egbert Eich).
- 514. Reworked video support in C&T driver, cleaned up block handler
-      (Egbert Eich).
- 513. C&T driver: introduced a delay when setting the cursor image for
-      the first time after a mode change (Egbert Eich).
- 512. Fixed R128CCE_RESET in r128 driver to do a reset only when dri
-      is enabled (Egbert Eich).
- 511. Rewrote readPciBIOS() and getValidBIOSBase() (Egbert Eich).
- 510. Fixed xf86Info structure in xf86Globals.c to match prototype
-      (Egbert Eich).
- 509. -
- 508. Fix XDarwin install problems with DESTDIR handling and with soft links
-      to the XtAppAddTimeOut manpage (Christoph Pfisterer).
- 507. Add Error message output in Cygwin/XFree86 (#4632, Harold Hunt).
- 506. Fix xdm when HasPam defined, and enable Pam support on Solaris 2.6 and
-      later (#A.401, #A.402, #A.403, Rainer Orth).
- 505. Add Croatian keyboard for xkbcomp from Slovenian keyboard layout
-      (#A.405, Vlatko Kosturjak).
- 504. Fix XvQueryAdaptors when there is no adaptors found
-      (#A.394, Jamie Strachan).
- 503. Remove a stray INCLUDES in Xmuu/Imakefile when snprintf isn't used.
-      Set the Permedia2 DAC Mask to 0xFF.
-      PCI ROM space address access patch for LynxOS PPC.
-      Change limit of motoppcBusAddrToHostAddr for LynxOS PPC.
-      Include <sys/wait.h> for LynxOS in os/osinit.c.
-      Define CBAUD, when it's missing in xterm, on LynxOS.
-      (#A.387, Stuart Lissaman).
- 502. Add SiS 86C204 to xf86PciInfo.h (#A.382, Carlos Manuel Duclos Vergara).
- 501. Fix mga font corruption problems introduced with the recent addition
-      of big-endian support (#4629, Andrew C. Aitchison).
- 500. Update for the mga driver's man page (#4628, Andy Isaacson).
- 499. Add more drivers to the default build on Linux/mips (#4623,
-      Guido Guenther).
- 498. Move the vgahw module load/init after the PROBD_DETECT handling
-      in the i810 driver's PreInit(), which fixes a segv when using
-      the X server's -configure option (#A.378, Leandro Martelli).
- 497. Fix a problem with Radeon VE cards failing to enable its video output
-      (#A.376, Paul Stewart).
- 496. Fix some DRI-related build dependency problems (David Dawes).
- 495. Fix some drivers (including tdfx, r128, radeon, ark, imstt) that weren't
-      respecting the Virtual resolution requested in the config file
-      (David Dawes).
- 494. Fix some offscreen memory calculation/allocation problems in the
-      tdfx driver (David Dawes).
- 493. Fix a bug in localResizeOffscreenLinear when checking widths
-      (Alan Hourihane).
- 492. Update Japanese localization for XDarwin Dock related fixes
-      (Toshimitsu Tanaka).
- 491. Fix restoring of text mode fonts on Permedia3 (Alan Hourihane).
- 490. Provide workaround for an apparent bug in Mac OS X 10.0.2 that causes
-      XDarwin to lose the cursor when switching to X using the Dock icon.
-      Fix "Application not responding" message in XDarwin's popup Dock menu
-      (Torrey Lyons).
- 489. Hardware cursor documentation update (Marc La France).
- 488. XVideo extension support in ATI driver for generic (e.g. v4l) adapters
-      (based on a patch by Ignacio Garcia Etxebarria).
- 487. Fix ATI driver bug that caused the hardware cursor to move after mode
-      switches (Marc La France).
- 486. Fix off-by-one error in screen positioning after a mode switch
-      (Marc La France).
- 485. Backout part of 479 and implement a proper fix in the ATI driver
-      (Marc La France).
- 484. Fix palette problem on NVIDIA Riva128 in DGA mode (Mark Vojkovich).
- 483. setxkbmap patch that:
-        - fixes bug in comand line parser
-        - makes debug output more comprehensive
-        - prevent to use 'variant' from previous call if 'layout' name changed.
-      (#4627, Ivan Pascal)
- 482. Documents Xaa specific options in the XF86Config manual page
-      (#4616, Branden Robinson)
- 481. Add Mouse 3 Button emulation to Cygwin/XFree86 (#4626, Harold Hunt,
-      Alexander Gottwald).
- 480. V4L documentation fix (Marc La France).
- 479. Fix bug in generic hardware cursor RealizeCursor entry
-      (Marc La France).
- 478. Extend the XFree86-VidModeExtension to accept gamma ramps from the
-      client rather than just rgb gamma values (Mark Vojkovich).
- 477. More Xv updates for the Permedia3 (#4625, Sven Luther).
- 476. Build Cygwin/XFree86 with -ansi -pedantic (Alan Hourihane).
- 475. Limit the number of PCI buses to 128 on ix86 (Marc La France).
- 474. More fixes for the handling of unassigned PCI bases (Marc La France).
- 473. Fix option handling in most drivers so that per-screen options work
-      correctly (David Dawes).
- 472. Resync with DRI CVS trunk (VA Linux Systems).
- 471. Import latest Mesa 3.4.x branch.
- 470. Add a PIOOffset value plus readEnable and writeEnable function pointers
-      to the vgahw rec.  The former allows vgahw to be used for VGA registers
-      that are shadowed in I/O space.  The latter allow the VGA_ENABLE
-      register to be accessed in similar way to most other VGA registers.
-      Add vgaHWEnable() and vgaHWDisable() functions (David Dawes).
- 469. Disable HWcursor for CyberBladeXP chips (Alan Hourihane).
- 468. Fix a Trident Cyber9388 setup issue (Alan Hourihane).
- 467. Fix man page building and installing on Darwin. To be safe we assume
-      the Darwin file system is case insensitive since one common variety is,
-      ie. HFS+ (Torrey Lyons).
- 466. Improve interoperability between Aqua pasteboard and X cut buffer with
-      XDarwin (Gregory Parker).
- 465. Updates for Cygwin/XFree86 (Harold Hunt).
- 464. Provide more robust default preferences for XDarwin (Torrey Lyons).
- 463. Remove map84 keyboard map from Cygwin/XFree86 build (#4621, Harold Hunt).
- 462. Disable xload on Cygwin/XFree86 (Alan Hourihane).
- 461. Remove an errorneous i++ from os/xdmcp.c with -class (Alexander Gottwald).
- 460. Allow Cygwin/XFree86 to build with cygipc support (Alan Hourihane).
- 459. Small XDarwin fixes:
-       - Don't leak IOService objects when searching for desired screen.
-       - Eliminate chance of SIGPIPE while shutting down.
-       - Revert to Aqua cursor when quit by exiting main client.
-       - Stop console error messages when using mouse button 3.
-      (Torrey Lyons and Christoph Pfisterer).
- 458. At Linus' request, make linux/int10 module deal with shmat() errors
-      (Marc La France).
- 457. Fix makedepend's integer value parsing and make it understand GCC's
-      #include_next directive as found in glibc & libc5 (Marc La France).
- 456. Xterm patch #156 (Thomas Dickey):  change preference of types for
-      selection-target between UTF8_STRING and STRING (Juliusz Chroboczek),
-      fixes for configure script and documentation (report by Adam
-      <adam at cfar.umd.edu>).
- 455. Fix XDarwin so display number preference is followed (Torrey Lyons).
- 454. Fix Xserver/Imakefile for Cygwin/XFree86 (Harold Hunt, Alan Hourihane).
-
-XFree86 4.0.99.3 (26 April 2001)
- 453. Loader fixups for Sparc's (Marc La France).
- 452. Fix dependencies for libGLU on Cygwin/XFree86 (Alan Hourihane).
- 451. Make xdm & xfs compile on Cygwin/XFree86 (Alan Hourihane).
- 450. Update Japanese localization of XDarwin.app's Preferences window
-      (Toshimitsu Tanaka).
- 449. Don't build clients that require extension libraries unless those
-      libraries are being built (#A.386, Scott A McConnell, David Dawes).
- 448. Fix the BuildXinerama test in Xserver/Imakefile (#4615, Harold Hunt).
- 447. Ignore MakeDllModules when DoLoadableServer isn't set (#4613,
-      Guido Guenther).
- 446. Don't define the <Ctrl>T compose sequences in the iso8859-1 compose
-      map by default (#4611, Mike Harris).
- 445. Allow the nls compose data files to be pre-processed (David Dawes).
- 444. Fix some problems introduced with the internationalisation of twm
-      (#4607, Juliusz Chroboczek).
- 443. Fix dpsinfo so that the correct headers are included (#4606,
-      Juliusz Chroboczek).
- 442. Fix mismatches between the way xlsfonts interprets font properties and
-      the way they are defined in the XLFD spec (#4604, Jochen Voss).
- 441. Add entries for German iso-8859-15 locales (#4603,
-      Philipp Matthias Hahn).
- 440. Cleanup build in Xserver/GL/mesa, making use of the earlier cleanups in
-      the lib/GL build (David Dawes).  #4602 is redundant as a result.
- 439. [SECURITY] Check for negative reply length/overflow in _XAsyncReply
-      (Xlib) (#4601, Mike Harris).
- 438. New 'hu' xkb symbols file (#A.364, Peter Soos).
- 437. Trident driver fixes for PC98 platforms (#4612, Akio Morita).
- 436. Convert apm driver from cfb to fb (Alan Hourihane).
- 435. Fix makedepend for '//' comment parsing and symbols that contain
-      expressions (Marc La France).
- 434. Fix a problem with the mga G400 2nd head going into power saver mode
-      when it should be blanked, and enable DPMS for the 2nd head (#A.358,
-      Craig Leres).
- 433. Fix a horizontal resolution problem that shows up with mga Xv (#A.365,
-      Ewald Snel).
- 432. Work around a refresh rate problem when using custom modelines that
-      have a refresh rate > 100Hz with the Matrox HAL library (#A.360,
-      Ewald Snel).
- 431. XDarwin fixes:
-       - Provide work around for kernel/driver issue on Darwin 1.3 that
-         causes the kernel keymapping to be empty on Mac portables.
-       - Command line -dpi option is no longer ignored.
-      (Torrey Lyons).
- 430. Ensure that the X-TT module isn't built if the Xserver isn't being
-      built (#4594, Chu-yeon Park).
- 429. Make xconsole try to reopen the /dev/xconsole pipe when it gets an EOF
-      (#4593, Jeff King).
- 428. Prevent an infinite loop (or unpredictable behaviour) in xmodmap (#4592,
-      Peter Maydell).
- 427. Add a font substitute for the zh locale (#4590, submitted by Branden
-      Robinson).
- 426. Make the backspace key definitions for the xkb macintosh/us and
-      dvorak layouts consistent with the default 'us' layout (#4588, 4589,
-      Branden Robinson).
- 425. Update for the sessreg man page (#4587, Branden Robinson).
- 424. Add a font substitute for the ko locale (#4586, Changwoo Ryu).
- 423. Avoid using fileno() in xauth's signal handler, and write messages to
-      stderr rather than stdout (#4585, submitted by Branden Robinson).
- 422. Fix nested comment warnings in dix/gc.c (#4584, Branden Robinson).
- 421. Include <stdlib.h> in two lbxutil files to get malloc/free prototypes
-      (#4583, submitted by Branden Robinson).
- 420. Remove duplicate paragraph in xdm man page (#4582, Branden Robinson).
- 419. Fix line numbers in error messages when parsing .twmrc files (#4580,
-      Topi Miettinen).
- 418. Fix backwards font glyphs in the ati/Mach64 driver for big endian
-      platforms (#4579, Michael Dänzer).
- 417. Add a build-time option to xf86config to make it append the major version
-      number to the config file name (David Dawes, prompted by #4577,
-      Branden Robinson).
- 416. xf86config build fix for non-GNU make (Marc La France).
- 415. Build fix for Summa driver on SunOS/Sparc (Marc La France).
- 414. compiler.h cleanup (Marc La France).
- 413. More DependDefines, OS_DEFINES and EXT_DEFINES build fixes
-      (Marc La France).
- 412. Fix installation of specs docs (#4575, Branden Robinson).
- 411. Make Cygwin/XFree86 call miSetPixmapDepth for RENDER extension
-      (Alan Hourihane).
- 410. Xterm patch #155 (Thomas Dickey): correct change to return-type of
-      in_put(), which caused problem with UTF-8 (fixed by Bruno Haible).
- 409. Some unobstrusive preparations for SunOS/Sparc (Marc La France).
- 408. Remove unnecessary libxf86_os link into Xnest & Xvfb (Marc La France).
- 407. Disable building of SuperProbe by default (Alan Hourihane).
- 406. Make OS_DEFINES available to all server Makefiles (Marc La France).
- 405. Add support to xman for parsing '\" <string> formatting hints.
-      Also cleanup some of the vendor-specific definitions and fix
-      processing of mandoc pages on FreeBSD (based on #4573,
-      Branden Robinson, David Dawes).
- 404. Fix default mailbox selection in xbiff for Linux, add recognition of
-      $MAIL, and update the man page accordingly (based on #4571,
-      Branden Robinson).
- 403. Remove redundant PCI id definitions in the tdfx driver, and clean up
-      the messages printed when the DRI can't be enabled because the bpp
-      isn't supported (based on #4570, Branden Robinson and #4598,
-      Antti Tapaninen).  Also, re-enable soft booting.
- 402. Install the XftConfig file under $(CONFDIR), with a link from the
-      usual place (based on #4569, Branden Robinson).
- 401. Update the Debian section on linux.cf (#4568, Branden Robinson).
- 400. Startx fixes/enhancements, including:
-       - Fix argument processing.
-       - Set XAUTHORITY.
-       - Don't overwrite existing cookies, and remove ones added for this
-         session when exiting.
-       - Deallocate the VT that X was using.
-       - Update the man page.
-      (based on #4567, Branden Robinson, Henry T. So, Jr).
- 399. Implement two new driver-provided options in the common cursor code and
-      use them to work around hardware bug that causes flickering Mach64
-      hardware cursors (Marc La France).
- 398. Integrate SiS driver changes (Ademar De Souza Reis).
- 397. Initialize Elsa GloriaXXL (GLINT) framebuffer properly (Alan Hourihane).
- 396. Fix bug where XDarwin.app would not hide the X display when it was no
-      longer the active application (Torrey Lyons).
- 395. Make XDarwin.app ignore .xserverrc file when started from the GUI so
-      that it starts correctly (Torrey Lyons).
- 394. Cygwin updates (#4557, 4558, 4563, Suhaib Siddiqi).
- 393. Document the usage of the -server option in the xfsinfo man page (#4562,
-      Mike Harris).
- 392. Fix xfs man page problem (#4561, Mike Harris).
- 391. Fix a crash that happens when a font encoding has no aliases and it is
-      invoked using a non-canonical name (#4560, Takeshi Miyasaka).
- 390. Add imake/config support for distinguising big endian and little endian
-      MipsArchitecture types (#4556, Florian Lohoff).
- 389. Add support to the mga driver for auto-detecting the display type
-      (#4555, Stephane Duguay (Matrox)).
- 388. Savage driver updates, including:
-       - Enable the Render extension.
-       - Make the DGA mode setup look more like the other drivers.
-       - First cut at Xvideo for the Savage4.
-       - Add a "ShadowStatus" option, which is a reliable workaround for the
-         scrolling hang that many experience.
-      (#4554, Tim Roberts).
- 387. Enable wide character support for NetBSD 1.5P and later (#4553,
-      Matthias Scheler).
- 386. Add offscreen image support to the i810 driver (for Xv), and fix
-      physMemBase (#4552, Matthew Sottek).
- 385. Fix bad cut&paste update to the sunffb driver (#4551, David S. Miller).
- 384. Fix "DriDrivers" typo in the sparc section of xfree86.cf (#4550,
-      David S. Miller).
- 383. Update UCS 75dpi and 100dpi fonts, including adding UCS versions of
-      the UTBI and UTB fonts that were in the unnec_75dpi and unnec_100dpi
-      directories.  The other "unnec" fonts are also moved over (#4548,
-      Markus Kuhn).
- 382. Make the v4l driver module keep searching for more devices if the first
-      one can't do overlay (#4545, 4614, Gerd Knorr).
- 381. Bug fixes for Xv support using a Permedia3 chip (#4564, Sven Luther).
- 380. Xterm patches #151, #152, #153, #154 (Thomas Dickey):
-       - improve select/paste of COMPOUND_TEXT and UTF8_STRING (Juliusz
-         Chroboczek, Bruno Haible).
-       - fixes for erase operations (Alexander V Lukyanov).
-       - correct ifdef for bold overstriking when built to support UTF-8.
-       - change resource corresponding to "-T" option to match Xt library's
-	 "-title", i.e., ".title" rather than "*title" so the command-line
-	 options are interchangeable as documented (Debian bug report #68843).
-       - modify "RequestResize()" function to save/restore window manager hints
-	 (Debian bug report #79939).
-       - improved error checking for input-method initialization.
-       - minor fixes for terminfo entries.
-       - various build/portability fixes.
- 379. XDarwin fixes:
-       - Don't SetUID XDarwin X server. (The IOKit doesn't need it.)
-       - Startup message reports correct display mode.
-       - XDarwin.app is now installed in /Applications by default.
-       - Update xinit server name list.
-       - "make clean" now works for a non-root user.
-      (Torrey T. Lyons)
- 378. Make XDarwin correctly handle color hardware cursors in Quartz mode
-      (Gregory Parker).
- 377. Fixes to the XDarwin application:
-       - Display menubar when started without a splash screen.
-       - Query before quitting from Aqua when started with startx.
-      (Torrey T. Lyons).
- 376. Update Japanese localization for XDarwin application (Toshimitsu Tanaka).
- 375. Fix byte ordering and static colormap issues with XDarwin server
-      on x86 hardware (Rob Braun).
- 374. Fix problems with XDarwin hardware cursor support in Quartz mode
-      (Gregory Parker).
- 373. Resync with DRI CVS trunk (VA Linux Systems).
- 372. Fix bug in XvMC protocol (Bob Paauwe).
- 371. Ensure NoInt10 is used for PC98 (Alan Hourihane).
- 370. Fix PC98 issues with the trident driver (#4547, Akio Morita).
- 369. Add a NoInt10 option to the int10 module, allowing it to be disabled
-      per entity (Alan Hourihane).
- 368. Fixes to the XDarwin application:
-       - X clients are now started correctly.
-       - Shuts down cleanly.
-       - Removed erroneous NSString releases in quartzCocoa.m.
-       - Dragging with mouse button 3 or higher depressed produces events.
-      (Christoph Pfisterer and Torrey Lyons)
- 367. Make the ramdac module for the IBM RGB640 DAC work at depth 15
-      (Alan Hourihane).
- 366. Fix interference between acceleration and hardware cursors on Mach64
-      variants (Marc La France).
- 365. Fix xload so it is functional on Darwin OS (Rob Braun).
- 364. Mac OS X specific fixes:
-       - Fix typo in XDarwin startup program that could cause crash with
-         many command line options.
-       - Move Show/HideMenuBar() call to main thread so that XDarwin
-         application displays a menu bar on the Mac OS X desktop.
-      (Greg Parker).
- 363. XDarwin application fixes including:
-       - Fix bugs causing XDarwin preferences to not be saved correctly.
-       - When using system beep, turn off bell when beep volume is set to 0.
-      (Christoph Pfisterer).
- 362. Fix building of dpsops.h and psops.h in correct order (Alan Hourihane).
- 361. Change xvmc.h to xvmcext.h to avoid case-(in)sensitive name clash with
-      XvMC.h for Cygwin/XFree86 (Alan Hourihane).
-
-XFree86 4.0.99.2 (6 April 2001)
- 360. Fbdev driver updates, including:
-       - Switch from shadowfb to mishadow.
-       - Add RENDER extension support.
-       - Add DGA support.
-       - Fix SaveScreen function
-       - Blank screen in ScreenInit so the former framebuffer contents aren't
-         visible
-      (#4544, Michel Dänzer).
- 359. Remove references to th_TH compose file from compose.dir (#4543,
-      Theppitak Karoonboonyanan).
- 358. Fix for improper setting of the maxHValue limit in the tseng driver.
-      This makes modes like 1152x864 at 24bpp possible (#A.355, Stanislav Brabec).
- 357. Fix a hw cursor related lockup that shows up with some mga G400
-      16MB OEM single head cards (#A.351, Ewald Snel).
- 356. Fix the XKB macintosh/it mapping (the accent-related keys were wrong)
-      (#A.349, Andrea Ghirardini).
- 355. Add XKB descriptions for the extra keys on a Chicony internet
-      keyboard (#A.356, John Gladkih).
- 354. Add support for the internal input device interface to mice on
-      Solaris 8, and make it the default protocol ("VUID") (#A.340,
-      Marcus Comstedt).
- 353. Add XKB descriptions for the extra keys on an IBM Rapid Access II
-      keyboard (#A.332, Patrick D'Cruze).
- 352. Fix a typo in xvidtune (#A.327, Peter Breitenlohner).
- 351. Fix Linux/libc5 build problem in the bigfont extension code (#A.327,
-      Peter Breitenlohner).
- 350. Fix typo in Chooser.ad (#A.327, Peter Breitenlohner).
- 349. Big endian and PowerPC support for the mga driver (#4540, Ani Joshi).
- 348. Big endian support for the tdfx driver (#4539, Ani Joshi,
-      Nicolas Dimitrijevic).
- 347. Build the tdfx and imstt drivers on PowerPC platforms (#4538, Ani Joshi).
- 346. Add IMS (Integrated Micro Solutions) PCI data for the TwinTurbo128
-      and TwinTurbo3D (#4537, Ani Joshi).
- 345. Fix some color and accel glitches in the imstt driver (#4536, Ani Joshi).
- 344. Add ISA I/O support for PowerPC Linux using the __NR_pciconfig_iobase
-      syscall (#4535, Ani Joshi).
- 343. New Xwin server code from the Cygwin/XFree86 project.  This version
-      is more portable across Win32 platforms.  Changes include:
-       - Use fb and shadowfb, and use the faster of GDI blitter,
-         DirectDraw blitter and DirectDraw4 blitter to update damaged
-         regions.  The video card's framebuffer is no longer mapped.
-       - Works correctly at depths > 8, but colors are not correct at depth 8.
-       - Uses the standard Win32 API messages for processing keyboard and
-         mouse input rather than using DirectInput.  This is more reliable.
-       - Improved internal structure and coding conventions.
-       - Builds completely from the XFree86 tree using gcc (the Visual C++
-         compiled xf_dx.dll is no longer used).
-       - The new server can run on machines that don't have DirectDraw/DirectX
-         installed (or installed but not operable) by falling back to the
-         GDI blitter.  The best drawing interface is determined at startup,
-         but this can be overriden with the -engine command line option.
-       - The Xrender extension is now supported.
-       - Command line option is available to run in full screen mode.
-      (#4531, 4532, 4534, Cygwin/XFree86 project including Harold L Hunt II,
-      Suhaib M Siddiqi, Dakshinamurthy Karra, Peter Busch).
- 342. v4l driver bug fixs: catch xalloc() failures, and set the depth
-      correctly for the VIDIOCSPICT ioctl (#4530, Gerd Knorr).
- 341. Add a driver for VMware virtual SVGA devices.  This is for use
-      by X servers running under a VMware guest OS (#4529, VMware, Inc).
- 340. Remove Cygwin-specific #ifdef in Xserver/os/Waitfor.c, which fixes
-      a crash (#4528, Suhaib Siddiqi).
- 339. Cygwin build fixes (#4527, Suhaib Siddiqi).
- 338. Updates to the "citron" input driver.  It includes compatibility
-      with the Winbond SIO chip (83977EF), and some new commands to
-      communicate to the touch driver from an application program
-      (via XChangeFeedbackControl) (#4526, Peter Kunzmann, Citron).
- 337. Updates to the "summa" input driver, including:
-       - "Resolution" replaces "LPI" as option for setting resolution.
-       - Fixed device reporting to give the actual tablet area size and
-         resolution.
-       - Tested and working with: SummaSketch3, Hitachi_1217D, a couple of
-         others emulating the Summa protocol.
-       - Reduce debug message verbosity.
-       - Various cleanups.
-      (#4525, Huver).
- 336. SunFFB driver bug fixes, including:
-       - Be smarter about restoring Kernel framebuffer state.
-       - Cure build errors when debug defines are enabled.
-       - Do not enable DRI or DGA acceleration if NoAccel option is specified.
-      (#4524, David S. Miller).
- 335. Mga G450 dual head support, (#4523, Luugi Marsan (Matrox) and
-      David Woodhouse).
- 334. Fix missing xfree -> Xfree mapping in the Type1 font library code (#4521,
-      Juliusz Chroboczek).
- 333. Make sure that an initialization assumption in parse_fontdata() in
-      lib/X11/omGeneric.c is met (#4520, Jonathan Kamens).
- 332. Add checksum verification to detect monitors that give incorrect EDID
-      data (#4517, Andrew C Aitchison).
- 331. Fix checking of LD_ELFDLOBJECT on big-endian systems (#4514,
-      Guido Guenter).
- 330. Add an update.fonts target/rule for maintainer use to update
-      the latin1 fonts in the source tree that are derived from the
-      ISO10646-1 masters (David Dawes).
- 329. Update UCS misc fonts, which includes the addition of the missing
-      4 DEC VT100 graphics characters from Unicode 3.2 (#4533, Markus Kuhn).
- 328. Handle build-time generation of 8 bit fonts from the UCS versions,
-      rework the way this is organised, and allow some better control over
-      which fonts are built/installed (David Dawes).
- 327. Add UCS versions of most of the 75dpi and 100dpi bdf fonts, and generate
-      8-bit subsets of them.  Also, remove the now-redundant latin2
-      bdf font directories (#4512 Markus Kuhn).
- 326. Add support for Trident CyberBladeXP and CyberBladeXPm (mobile)
-      (Alan Hourihane, Robert V Fleisig).
- 325. Add XKB descriptions for the extra keys on an IBM Rapid Access keyboard
-      (#4510, Dennis Bjorklund).
- 324. Update Status and i810 docs to mention i815 support and FreeBSD support
-      (#4509, Andrew C Aitchison, David Dawes).
- 323. Xprt fixes to make it closer to X.org version (Danny Backx).
- 322. Fix for reading PCI resource data on Linux/alpha (#4508,
-      Ivan Kokshaysky).
- 321. Add XKB descriptions for the extra keys on a "Logitech Internet Keyboard"
-      (#4505, Matthew Hand).
- 320. Build shared libGL and DRI client modules on Linux without PIC for
-      performance reasons.
- 319. Updates to glxinfo (Brian Paul).
- 318. Add glxgears (Brian Paul).
- 317. glxinfo needs libGLU (Marc La France).
- 316. Rage128 fix to Cards database (Marc La France).
- 315. Minor fix to PCI resource overlap handling (Marc La France).
- 314. Loader code simplification and IA-64 cache flushes (Marc La France).
- 313. Workaround in the ATI driver for troublesome interaction between loader
-      and compiler optimisation (Marc La France).
- 312. Warning fixes for `gcc -fno-builtin`, which appears to be the default on
-      some systems (Marc La France).
- 311. Add glyph transformations to Xft (Tuomas J. Lukka)
- 310. Add XftCache creation to fonts/Type1 (Keith Packard)
- 309. Add Xmuu library for non-Xt/Xaw dependent applications (Jim Gettys)
- 308. Add i810 and Xv support to kdrive (Pontus Lidman)
- 307. Fix Radeon CPUToScreen acceleration on Alpha platforms (Jay Estabrook).
- 306. Fix bug in ServerLayout option handling when there's no ServerFlags
-      section present (David Dawes).
- 305. Allow fb to access 16bit devices (Alan Hourihane).
- 304. XvImage support for GeForce chips in the nv driver (Mark Vojkovich).
- 303. XvMC build fix (Marc La France).
- 302. Fix recently introduced bug in xf86cfg (Marc La France).
- 301. Re-instate warning fixes clobbered by DRI merge (Marc La France).
- 300. Ignore disabled non-video PCI ROMs (Marc La France).
- 299. Hardware cursor implementation for Mach64 variants (William Blew,
-      Ani Joshi, Marc La France).
- 298. Some endianness fixes in the ATI driver (incomplete) (Marc La France).
- 297. Fix MMIO ordering problems for Mach64 acceleration (Marc La France).
- 296. Fix ATI driver behaviour when it finds the LCD panel has been disabled
-      on entry (Marc La France).
- 295. Fix ECP clock for GATOS (Vladimir Dergachev).
- 294. Undo part of CHANGELOG 36 (Marc La France).
- 293. Rework the building of libGL and the DRI drivers (David Dawes).
- 292. Update greek keyboard layout and compose map.
-      (#4513, Katsaloulis Panagiotis)
- 291. Fix problems in Xnest when MouseKeys is enabled and patched it to
-      use XKB to allow clients to change keyboard description and
-      configuration whithout interfering with the "real" X server
-      (Paulo César Pereira de Andrade).
- 290. Dvorak keymap fix (#A.343, J Phillips).
- 289. Some vesa driver updates, including:
-       - Wrap CloseScreen().
-       - Call xf86PrintModes().
-       - Add error messages for when PreInit bails out for lack of modes.
-       - Rework how the debugging information is printed.
-       _ Avoid some build warnings.
-      (David Dawes)
- 288. Make it possible to call xf86PrintModes() when there is no hsync or
-      refresh data available, like from the vesa drivers (David Dawes).
- 287. Add a "cleanlinks" script for cleaning up dangling links in lndir-created
-      shadow trees (David Dawes).
- 286. Resync with DRI CVS trunk (VA Linux Systems).
- 285. Make extension headers available when the extension is enabled but the
-      extension's client library is disabled (David Dawes).
- 284. Make it possible to enable building selected extension libraries
-      when BuildServersOnly is set, and allow independent control of
-      building docs and clients (David Dawes).
- 283. Import latest Mesa 3.4.x branch.
- 282. Lower the default fifo threshold for PM3 chips (Alan Hourihane,
-      Rafael Barbalho, 3DLabs).
- 281. Fix 3DLabs GLINT driver for use the Flat Panels, use the UseFlatPanel
-      option. Tested with the SGI 1600SW and Permedia3 board (Alan Hourihane).
- 280. Fix glxinfo to query default display (Alan Hourihane).
- 279. Convert TGA driver to use fb (Alan Hourihane).
- 278. Fix XTRAP typo in miinitext.c (Damien Touraine).
- 277. Major updates to the XFree86(1) man page (David Dawes).
- 276. A new (perl) version of the mkhtmlindex script that works better than
-      the shell version (David Dawes).
- 275. Fix the `make depend` scripts to accept -U flags and not require a blank
-      in their -f flag (Marc La France).
- 274. Bump the video and input driver ABI minor numbers.
- 273. Add xf86SetRealOption() (Huver).
- 272. Change Xdarwin do that it processes all pending events instead of
-      just the oldest one on ProcessInputEvents() call ,
-      Quit Xdarwin cleanly, wether from the Xserve or from Cocoa front end,
-      Fix a case typp which cases the Xdarwin server not to start if
-      installed on a case sensitive file system like UFS.
-      (#4504, #4507, #45011, Gregory Parker, Torrey T. Lyons).
- 271. Move Section DRI/Endsection into the DRI function to be consistant with
-      all of the other sections. (Quentin Neill)
- 270. Made xf4bpp code moer 64bit clean (still doesn't work on Alphas)
-      (Egbert Eich).
- 269. Removed disable/enable interrupt call on ia64 platforms.
-      The machine instruction is privileged and not permitted in user space
-      (Egbert Eich).
- 268. Improved mode setting in Trident driver; added code to ValidMode
-      to reject any modes whose size is larger than the physical LCD
-      size if LCD is enabled (Egbert Eich).
- 267. Modified error message in TDFX driver to give user a clue how
-      to avoid error (Stefan Dirsch).
- 266. Fixed appearant typo in SMI driver (Egbert Eich).
- 265. Changed Savage driver to unmap memory when exiting PreInit() and
-      maps it on every call to ScreenInit() (Egbert Eich).
- 264. Changed handling of failed vbe call in rage 128 driver.
-      No the driver doesn't fail any more (Egbert Eich).
- 263. Integrate the currently Panix-specific keycodes into atKeynames.h,
-      since they're not really Panix-specific (David Dawes).
- 262. Fix problem with a NULL pointer in Xv Xineramification (Benjamin Monate).
- 261. Bug fixes and improvements for mouse 3 button emulation state machine
-      (Andrew Pimlott).
- 260. Updates for Hurd support (#A.324, Marcus Brinkmann).
- 259. Add call to setlocale() in xev (#A.322, Eugene B. Byrganov).
- 258. Add support fo the charset Big5HKSCS to the X-TrueType module, as
-      well as some basic XLocale support for it (#A.321, Roger So).
- 257. Fix core dump in XqueueMousePreInit (#A.317, Fiel Cabral).
- 256. Allow the mga driver's "DigitalScreen" option to work for the first
-      head (#A.297, Niels Gram Jeppesen).
- 255. Add zh_CN.GBK locale support (#A.293, Yong Li).
- 254. Fix a problem with the ThinkingMousePS/2 protocol handling of left
-      movement (#A.292, Ian Remmler).  (This has been in 3.3.x since 3.3.4.)
- 253. Make xdm Xinerama-aware so that it can avoid splitting login and
-      chooser windows across physical screens (#A.276,
-      Dmitry Yu. Bolkhovityanov).
- 252. Fix a resource allocation bug in the DBE code (#A.271, Bill Rugolsky).
- 251. Only enable Xv support for the 630 in the sis driver (#A.263, Nick Lamb).
- 250. Modify the sis driver to prefer 24bpp framebuffer layout.  Perhaps not
-      all support 32bpp? (#A.263, Nick Lamb).
- 249. Add missing byte to Intellimouse init string, which fixes problems
-      that show up with some KVM switches (#A.258, Seung-Hyeon Rhee).
- 248. Some DRM module fixes for FreeBSD 5-current (#A.242, Andrew Atrens).
- 247. Fix xterm build on Solaris 2.5.1 (based on #A.282 from mark at zang.com).
- 246. Make the Linux/PPC "custom keycodes" choice a run-time option instead
-      of a build-time option (#A.240, Franz Sirl).
- 245. Add support to splitting WC MTRR regions on Linux when the regions is
-      not aligned on a size boudary (#A.238, _Usul John Obscurant).
- 244. Add Acecad support to the "summa" input driver (#A.237, Arpad Gereoffy).
- 243. Don't try to map 64K blit window aperture on older trident chips
-      (Alan Hourihane).
- 242. V4L driver cleanups and Xineramification (#4502, Gerd Knorr).
- 241. Make the X server and the Mac OS X front end run in a single process.
-      Other build fixes for Darwin (#4500, #4501, the XonX team).
- 240. Don't build xf86config under BuildServersOnly (Marc La France).
- 239. Potential fix for DGA apps that set colourmaps the normal way rather than
-      through DGA (Mark Vojkovich, Marc La France, Pontus Lidman).
- 238. Make fstobdf generate correct ATTRIBUTES fields (Ishikawa Mutsumi).
- 237. Xt man page updates (Paul Vojta).
- 236. Plug kernel security hole in Linux int10 (Marc La France).
- 235. Fix Xnest build for newest gcc versions (Marc La France).
- 234. Fix typo in Xv Xinerama support (Gerd Knorr).
- 233. Fix a problem with multi-thread support on OpenBSD (released OpenBSD
-      versions don't have getpwuid_r) (Matthieu Herrb)
- 232. Allow to compile on OpenBSD-current which has completly removed PCVT
-      from its installation. (Matthieu Herrb)
- 231. Support for ThreadedX on FreeBSD (FreeBSD ports patch-xthread).
- 230. Updates for console-related FreeBSD system header changes as of 4.1-REL
-      (FreeBSD ports patch-r, patch-s).
- 229. Don't leave free'd vrotate uninitialised in lib/X11/omGeneric.c
-      (FreeBSD ports patch-q).
- 228. Protect #define HasPam in FreeBSD.cf (FreeBSD ports patch-d).
- 227. Fix border garbage for the G400 second head by backing out #4205
-      (David Dawes).
- 227. Fix a typo in fonts/util/Imakefile (#4499, Juliusz Chroboczek).
- 226. Add a document describing the DPS code included in the tree, and
-      pointers to web resources (#4498, Juliusz Chroboczek).
- 225. Use VBE to add runtime DDC support to the i810 driver (#4496,
-      Andrew C. Aitchison).
- 224. DRM kernel module updates for FreeBSD (#4493, joe at cracktown.org).
- 223. Add support for the "Internet" keys of the Genius Comfy KB-16M keyboard
-      (#4491, Kamil Toman).
- 222. Include three DPS sample clients:
-       - dpsinfo: random info about the DPS extension;
-       - dpsexec: interactive DPS ``executive'' (command-line);
-       - texteroids: a demo of font support.
-      (#4489, 4497, Juliusz Chroboczek).
- 221. Don't build the GLU library when not building GLX.  This fixes
-      a build failure when GLX is disabled (#4488, Juliusz Chroboczek).
- 220. Make the stub files that pswrap generates contain the same set of
-      includes as the Adobe version, which fixes problems building
-      standalone DPS clients (#4487, Juliusz Chroboczek).
- 219. Fix setxkbmap bugs, including:
-       - Continue working if the appropriate root window property where the
-         current xkb settings are saved can't be read or interpreted.
-       - Make the -keymap option work.
-       - Update the man page to explain how the "-option" option works.
-       - Add primitive sanity checking for 'map name'.
-      (#4482, Ivan Pascal).
- 218. Fix a server crash while reading DDC data from EDID2 capable monitors
-      (#4481, Andrew C Aitchison).
- 217. Updates to Thai support, including:
-       - Fix a bug combining characterw with Shift keys.
-       - Remove the th_TH Compose file so that Thai XIM is/can be(?) activated
-         without needing XSetLocaleModifiers().
-       - A more precise context-sensitive input sequence check using
-         XNStringConversionCallback added. This has been tested with
-         xiterm+thai-1.04pre2. The implementation detail might be changed
-         if found inconsistent with the X11 specification.
-      (#4478, Theppitak Karoonboonyanan).
- 216. Update ucs2any.pl, and replace the special map-* files with the
-      original mapping files from ftp.unicode.org.  Changes include:
-       - A bug has been fixed that caused sometimes the FONT property not
-         to be updated correctly.
-       - The FONTBOUNDINGBOX is now recalculated, which makes the script
-         also suitable for proportional fonts.
-       - The mapping table for the DEC VT100 graphic characters is now built
-         into the script. This means the special map-* files are not necessary
-         any more and they could be replaced with the original mapping files
-         found on ftp://ftp.unicode.org/Public/MAPPINGS/
-       - Whether the DEC VT100 graphic characters are added can be controlled
-         with options +d/-d. Default is to add them for upright charcell fonts
-         only.
-       - Slightly improved warning messages.
-      (#4472, Markus Kuhn).
- 215. Fix libGLU build problem on Cygwin (#4467, Suhaib M. Siddiqi).
- 214. Fix missing libX11 exported symbols for Cygwin (#4467,
-      Suhaib M. Siddiqi).
- 213. Updates for Hurd support (#A.209, Marcus Brinkmann).
- 212. Fix some mis-placed mem_barrier's for Alpha platforms (Jay Estabrook).
- 211. Fix a Index/DAC register access in glint PM2v, PM3 driver.
-      (#A.319, Romain Dolbeau).
- 210. Add Xv support to Permedia3 driver (#4480, #4486 Sven Luther).
- 209. Support for NVIDIA GeForce3 (Mark Vojkovich).
- 208. Allow GccWarningFlags overrides on Linux (Marc La France).
- 207. Fix a problem with xvinfo's listing of image formats
-      (Giridhar Pemmasani).
- 206. Fix bug in XkbSetNamedDeviceIndicator (XkbSetNamedIndicator). This
-      function can be used both for change state of specified indicator
-      (on/off) and for change description (and so behavior) of indicator.
-      Fix bug (in XkbGetPerClientControls). Typo where subroutine apply bit
-      mask (that consist of bitwise OR of three separate masks) to value
-      that have to be returned (#4474, Ivan Pascal).
- 205. Setxkbmap can crash X server if one specify some illegal string as
-      'xkb variant' name (#4471, Ivan Pascal).
- 204. In Grab mode XKB sends 'state' in key events without 'group info'
-      (keyboard map layout) (#4469-4470, Ivan Pascal).
- 203. Rewrite the X-Video extension's Xineramification (Mark Vojkovich).
-
-XFree86 4.0.99.1 (19 February 2001)
- 202. Gamma correction and DirectColor visual support for NVIDIA RIVA TNT
-      and newer chipsets (Mark Vojkovich).
- 201. IA64 fix for generic int10 code (Egbert Eich).
- 200. Redadding space as delimiter in locale.alias and locale.dir
-      (Egbert Eich).
- 199. Modified memory debugger script to retieve backtrace information
-      with an unmodified version of gdb (Egbert Eich).
- 198. Modified memory debugger to print out backtrace of call where
-      a referenced freed pointer was once allocated (Egbert Eich).
- 197. Several more fixes for memory leaks and several "referenced freed"
-      to keep memory debugger quiet (Egbert Eich).
- 196. Fixed "referenced freed" memory debugger message in xf8_24bpp code
-      (Egbert Eich).
- 195. Add a new rule for building DRI (client) modules, so that only the
-      relevant symbols are exported (#4454, Red Hat).
- 194. Fixed several memleaks in PCI bus code (Egbert Eich).
- 193. Added code to disable SIGIO when entering SETUP state and reenable
-      it when leaving SETUP state (Egbert Eich).
- 192. Add type of option argument as comment to config file.
-      (xf86cfg might need some fixing) (Egbert Eich).
-      (Hopefully) fixed reordering of chips so primary comes first
-      (Egbert Eich).
- 191. Fixed bug that caused server to crash when a DGA private colormap
-      was freed as miSprite still had a pointer to this colormap
-      (Egbert Eich).
- 190. Fixed savage driver for altered vbe functionality (Egbert Eich).
- 189. Moved bulk of generic VBE functionality from VESA driver into
-      the vbe module (Egbert Eich).
- 188. Fixed some bugs in vesa driver (Egbert Eich).
- 187. Fixed memleaks in parser code as well as several referenced freed
-      pointers which pollute output of memory debugger and obsucre debugging
-      (Egbert Eich).
- 186. Fixed ChangeWindowAttributes() in cfb8_16 code (Egbert Eich).
- 185. Moved Linux specific typedef from shared/xf86AXP.h to linux-specific
-      os-level code (Egbert Eich).
- 184. Added option to int10 softbooter to POST even primary device.
- 183. Fixed memory leak in linux int10 code (Egbert Eich).
- 182. Modified vm86 trap code not to fail on a #LOCK prefix byte
-      (Egbert Eich).
- 181. Fixed memory leak in posix_tty.c (Egbert Eich).
- 180. Added support to generic driver to POST even primary devices
-      (Egbert Eich).
- 179. Added support for more AXP chipsets that require sparse addressing
-      to bsd os level (Egbert Eich).
- 178. Added missing symbols to C&T driver (Egbert Eich).
- 177. Fixed problems with Xv code in C&T driver (Egbert Eich).
- 176. Fixed a vertical and horizontal offsets on HiQV chips due to
-      non-"standard" handling of H/VBlankEnd registers (Egbert Eich).
- 175. Removed code that sets a chipset into graphics mode when
-      saving/restoring fonts in standard vga code. This causes problems
-      on some trident chipsets (Egbert Eich). [EXPERIMENTAL!]
- 174. Moved KGA code that handles the H/VBlankEnd code that overscans remain
-      invisible to separate functions. This way drivers have better control
-      over these registers.
- 173. TGA driver fixes (Jay Estabrook).
- 172. Moved option processing to allow VGAClock option to be processed
-      (Egbert Eich).
- 171. Added option to swap heads on a matrox G400 dual head (Stefan Dirsch).
- 170. Added handling of broken planemask support on different models of
-      matrox G100 cards (Egbert Eich).
- 169. Fixed minor memory leak in ati driver (Egbert Eich).
- 168. Fixed resource registration in TDFX driver (Egbert Eich).
- 167. Set new modelines for Trident LCD modes (Egbert Eich).
- 166. Fixed handling of PreEnd Control register on Trident (Egbert Eich).
- 165. Fixed problem with Trident Blade Mono8x8Patterns (Egbert Eich).
- 164. Fixed clock division for CyberBlade E4 (Egbert Eich).
- 163. Removed last static symbols from Tseng driver (Egbert Eich).
- 162. Fixed handling of ICS5341 RAMDAC under 24bpp (Egbert Eich).
- 161. Fixed resource registration in rendition driver (Egbert Eich).
- 160. Attempt to fix various other issues on rendition - driver remains
-      to be broken though (Egbert Eich)!
- 159. Fixed false linear size for NeoMagic 2380 (Egbert Eich).
- 158. Modified calulation of aperture size in NeoMagic driver to use the
-      available video memory instead of the map size (Egbert Eich).
- 157. Added a delay to prevent rare cases of lockups when starting
-      X on NeoMagic 2160 (Miles Lane).
- 156. Added DGA to Cirrus driver (Egbert Eich).
- 155. Missing symbols added to Cirrus driver (Egbert Eich).
- 154. Fixed acceleration on Alpine (Cirrus) driver. PIO and MMIO versions of
-      the accelerator driver now support the same functionality (Egbert Eich).
- 153. Removed unneededed call to xfree() in ddc code (Egbert Eich).
- 152. -
- 151. Siliconmotion driver updates, including:
-        - Color change/flash at 8bpp when switch back to desktop in rotation
-          mode.
-        - System hangs when enabling rotation in 24-bpp.
-        - Overlay disappear in the virtual desktop when move the window.
-        - Mouse pointer doesn't work properly in panning modes under rotation.
-        - Garbage appears on desktop when click the Basic/Metal for the Theme
-          Selector.
-        - Added ZoomOnLCD option.
-        - Desktop changes color when panning in 24-bpp mode.
-        - CRT is off after exit X on DSTN 800x600.
-        - Screen broken occurs in X when enable Rotation on DSTN 800x600.
-      (#4463, Frido Garritsen).
- 150. Include <time.h> in Xos.h to get struct tm (based on #4464, Mike Harris,
-      and H.J. Lu).
- 149. Add 1400x1050 60Hz and 75Hz to the default built-in modes (#4462,
-      Tim Roberts).
- 148. Create the default modes source file from the mode definitions on
-      systems that have perl (David Dawes).
- 147. Alias memset and memcpy to xf86memset and xf86memcpy in the loader,
-      which should catch implicit compiler-generated calls to these functions
-      (David Dawes).
- 146. Fix NV, Glint, ati and mga drivers for Alpha EV56 machines
-      (Jay Estabrook).
- 145. Work around compiler-generated call to memcpy in the sis driver
-      (David Dawes).
- 144. Fix the neomagic driver so that it saves/restores the palette (#4452,
-      Ken Hornstein).
- 143. Fix a palette saving bug in the vgahw module (#4452, Ken Hornstein).
- 142. Fix a typo in Xfbdev.man (#4446, Juliusz Chroboczek).
- 141. Major updates to the savage driver, including:
-       - DDC support
-       - I2C support
-       - XVideo YUV overlay support for Savage/MX and Savage/IX
-       - DGA support
-       - yanks Ani Joshi's depth/bitsPerPixel patch for searching the BIOS
-       - fixes interactions with frame buffer and SVGATextMode consoles;
-         VT switching now seems quite reliable for almost everyone
-       - yanks unused options
-       - adds new options for hacks to deal with the status register hangs
-       - adds one special case memory configuration for Savage 4
-       - adds support for doublescan modes (320x240 works)
-       - adds LCD panel detection
-       - fixes a panning bug at depth 24 (panning must be to even pixels)
-       - adds a workaround for bugs in the latest ProSavage BIOSes
-      (#4445, 4448, Tim Roberts).
- 140. Make 'X -configure' use the long monitor name when present in the
-      DDC info (#4444, Andrew C. Aitchison).
- 139. Make glxinfo respect $DISPLAY (#4443, Meelis Roos).
- 138. Fix TrueType font problems in 4.0.2 (#4439, Juliusz Chroboczek).
- 137. Document the "DisplaySize" keyword in the XF86Config man page (#4438,
-      Andrew C. Aitchison).
- 136. Update the i810 driver to set the UV vertical phase for the 4:2:0
-      planar formats to account for the spatial relationship between the
-      chroma and luma samples (#4436, Jonathan Bian).
- 135. Updates for Cygwin support (#4433, Suhaib M. Siddiqi).
- 134. Fix a bug in the fonts.sgml doc (#4432, Juliusz Chroboczek).
- 133. Fix the xdpyinfo so that it will build when the XKB extension isn't
-      defined (#4422, Jim Gettys).
- 132. Fix the xdm greeter so that it will build when the XKB extension isn't
-      defined (#4421, Jim Gettys).
- 131. Only build setxkbmap when building the XKB lib support (based on #4420,
-      Jim Gettys).
- 130. Improve the mga driver messages when the HAL module isn't available
-      (#4451, David Woodhouse).
- 129. Add G450 support to the mga driver (#4416, Luugi Marsan (Matrox),
-      4449, David Woodhouse).
- 128. Mga driver updates, including HAL cleanups, add a Crtc2Ram option,
-      and merge with Matrox beta4 source (#4415, Antii Tapaninen, #4423,
-      Simon Hosie).
- 127. Fix a rounding problem in the wacom driver that was causing some
-      position instability (#4417, Hannes Eriksson).
- 126. Change Freetype2 compilation to pacify makedepend (Marc La France).
- 125. Added changes to il (Hebrew) xkb keyboard map (#4459, Tzafrir Cohen).
-      Added new by (Belarusian) xkb keyboard map (#4460, Alexander Mikhailian).
-      Small additions to fixes A.272 to allow autorepeat control of MouseKeys
-      also in 'non-accelerated mode' (#4461, Ivan Pascal).
- 124. Add ATI Rage 128 PD support (#4455, ISHIKAWA Mutsumi).
- 123. Make modeline2c.pl script case-insensitive (#4453, Mike Harris).
- 122. Change ATI driver to detect panel dimensions of non-PC systems using an
-      LT or LT Pro (Marc La France).
- 121. Fix misdetection of sparse I/O PCI bases and handling of unassigned PCI
-      bases in ATI driver (Marc La France).
- 120. Extend libc wrapper's emulation of gettimeofday() and add emulation of PC
-      and PC98 interval timers to int10 (Marc La France).
- 119. An attempt at fixing the handling of unassigned PCI resources by
-      improving detection of them and forcing them to be relocated
-      (Marc La France).
- 118. Make lndir ignore finder data files on Mac OS X (Matthieu Herrb).
- 117. -
- 116. -
- 115. Undo s3virge changes in 4.0.2 for Xv support on ViRGE chipsets since
-      they caused problems with plain ViRGE cards.  Xv is still supported
-      for the ViRGE DX (#4414, 4430, Kevin Brosius).
- 114. Siliconmotion driver fixes:
-       - 24bpp corruption
-       - mouse cursor still showing after X-server shutdown
-      (#4413, Frido Garritsen).
- 113. Change the Thai charset and locale description to a form agreed to
-      by some Thai developers (#4412, Chanop Silpa-Anan).
- 112. [SECURITY] Fix temp files vulnerabilites in xman on systems with
-      mkstemp(). (Matthieu Herrb).
- 111. Major improvement to the Xmaster UI on Mac OS X. (#4447, XonX team).
- 110. 8 bit DAC support for the NVIDIA Riva-128 (Mark Vojkovich).
- 109. Fix panning on Permedia3 (Alan Hourihane).
- 108. Enable wsmouse support on OpenBSD/i386 (Matthieu Herrb).
- 107. Xdarwin bug fixes and updates (#4440-4442, Torrey T. Lyons).
- 106. ATI driver Sparc compile fix (David S. Miller).
- 105. Implement BlockFills at 32bpp in the Permedia3 driver (Alan Hourihane).
- 104. Ensure PCI retry is off for Permedia3, and fix an over by 1 error on
-      FIFO usage (Alan Hourihane).
- 103. Prevent glint driver from Seg faulting if mode pool is empty
-      (Alan Hourihane).
- 102. Add FIFOSize to glint driver for overriding of the FIFO depending on
-      the target chip being used (Alan Hourihane).
- 101. Major updates to the GLINT driver.
-	- Add Dual-Headed Appian Jeronimo 2000 support (dual PM3's), it now
-	  shares heads as per MGA driver for G4xx dual head boards.
-	- Faster Permedia3 WriteBitmap/WritePixmap accelerator functions.
-	- Fix Scanline acceleration routines when MAX FIFO is reached.
-	- Improved Gamma support.
-	- Upload cursor and cursor colours for pm2v/pm3 during vertical retrace,
-	  which fixes r/b inversion and loss of video problems.
-	- Fix pm2v/pm3 text restoration problems.
-	- Re-arranged structure to accomodate multi-chips per screen.
-	- Removed dualmx files and incorporated changes into standalone versions
-	- Allow -configure to only configure VGA based Glint chips, works
-	  around multichip boards (for now).
-      (Alan Hourihane).
- 100. Add XaaNoWriteBitmap and XaaNoWritePixmap options to XAA (Alan Hourihane).
-  99. Improve determination of primary adapter (Marc La France).
-  98. Fix PPC xf86sym.c compile problems (Marc La France).
-  97. Fix int10 option handling for drivers that call xf86CollectOptions()
-      before calling int10 (Marc La France).
-  96. Properly detect unassigned MMIO address in ATI driver (Marc La France).
-  95. Fix default compilation on Sparc/Solaris (Marc La France).
-  94. Fix typo in Linux/Arm configuration (Marc La France).
-  93. By default, don't build libGLU on libc5 systems (Marc La France).
-  92. Fix HW cursor colors for pm2v/pm3 in the glint driver (Alan Hourihane).
-  91. Rework the memory detection code for Permedia3, now correctly detects
-      boards which aren't 32MB (Alan Hourihane).
-  90. Write ScanlineCPUToScreen, ScanlineImageWrite functions for Permedia3
-      which write directly to the FIFO, and remove obsolete functions
-      (Alan Hourihane).
-  89. Fix ordering of writes in pm2v/pm3 ramdac functions in the glint driver,
-      thus fixing the R/B inversion problems (Jay Estabrook).
-  88. Set the version strings in man pages dynamically (David Dawes).
-  87. Remove the XF86_VERSION string from xf86Version.h, leaving just
-      the numerical values.  All the version information is now derived
-      from that single set of values (David Dawes).
-  86. [SECURITY] Fix temp vulnerabilities in Xaw/MultiSrc.c using the technique
-      in patch #4279 (Branden Robinson). Fix temp file vulnerability in
-      gccmakedep based on report from Alan Cox. Fix temp file vulnerability
-      in Imake.rules, InstallManPageAliases (Matthieu Herrb).
-  85. Support vertical sub-pixel glyph rasterization in Xft
-      (Keith Packard)
-  84. Allow xf86ClaimPciSlot to be called with a NULL GDevPtr, as it was
-      previously (Alan Hourihane).
-  83. Fix clean rule in DRM build (Philip Willoghby).
-  82. If MouseKeys is switched on, then the mousekeys autorepeat. (fixes
-      #272, Stephen Montgomery-Smith)
-  81. Ensure Video is unavailable when no acceleration available in the
-      trident driver (Alan Hourihane).
-  80. Implement a distclean make target (Marc La France).
-      NOTE:  To correctly install this change, either `make Everything` or
-             `rm xmakefile; make World`.
-  79. Preprocess all man pages to make sure that the references to pages
-      in sections that are platform-dependent are correct.  Also fixed some
-      misc formatting problems found while doing that (David Dawes).
-  78. Ensure client side version checking in 3D drivers for Rage128 and
-      Radeon chipsets (Alan Hourihane).
-  77. Nv driver update to fix the cursor for double scan modes, and to
-      improve double scan mode handling in general (#4408, Csaba Halasz,
-      Jarno Paananen).
-  76. Fix a twm segfault if it gets events for buttons > 5 (#4407, 4425,
-      Nathan Hand).
-  75. Update the module subdirectory search list to include "multimedia/"
-      (#4405, Vladimir Dergachev).
-  74. Small R6.5.1 merge update in Xlib (based on #4403, Bruno Haible).
-  73. Updates to the xprop utility, including:
-       - Move to ANSI C, use const where possible.
-       - Print WM_NAME and WM_ICON_NAME properties in the locale encoding.
-       - Allow multiple "-remove" commands on the same command line.
-       - Better error message when "-remove" is applied to a font.
-       - New option "-set" that permits the changing of individual window
-         properties.
-      (#4402, Bruno Haible).
-  72. Remove schumacher-clean compatibility aliases, since the fonts are
-      really ASCII and not iso8859-1 (#4401, Bruno Haible).
-  71. Allow drivers to provide their own substitute for the xf86I2CWriteRead
-      function (#4399, Vladimir Dergachev).
-  70. Cirrus driver updates, including:
-       - Add a call to fbPictureInit() in the Laguna driver.
-       - Fix warning (missing a symbol from VBE) when starting the Alpine
-         driver.
-       - Fix MMIO acceleration for the CL-GD5480
-      (#4395, Itai Nahshon).
-  69. Fix Neomagic 2200 screen corruption (Egbert Eich).
-  68. Disable RENDER extension support in the ATI(misc) driver when mibank
-      and/or shadowfb is used (Marc La France).
-  67. Remove cfb & friends from the ATI driver (Marc La France).
-  66. Some additional ATI PCI IDs (Marc La France).
-  65. Make compilation of drivers produce the same object whether or not
-      DPMS and DGA extensions are being built.  Partial changes to do the same
-      for RENDER (Marc La France).
-  64. Ensure `make depend` goes through the same set of subdirectories as
-      `make all` does.  Allows MakefileAdditions to contain depend rule(s)
-      (Marc La France).
-  63. Move $(EXTRA_DEFINES) to the end of ALLDEFINES.  Ditto for
-      $(CXXEXTRA_DEFINES) and CXXDEFINES.  Allows easier overrides at the
-      subdirectory level (Marc La France).
-  62. Add a pre-clean phase to `make World` if xc/xmakefile already exists
-      (Marc La France).
-  61. Import X.Org's X11R6.5.1 (David Dawes)
-  60. Change identification of Trident 8400(CyberBlade/i7) so that it is not
-      a Cyber chipset (integrated Desktop version) (Alan Hourihane).
-  59. Use the wsmouse protocol in XFree86 -configure if wsmouse is available
-      (Matthieu Herrb, lha at stacken.kth.se).
-  58. Sync Xdarwin with XonX version (#4428 Torrey T. Lyons):
-      - add a working WarpCursor
-      - add 15 bit pixel depth to the Quartz mode.
-  57. New version of Xmaster, a Mac OS X application that controls the
-      X server (#4427, Torrey T. Lyons, Andreas Monitzer).
-  56. Add external CRT support for the Rage 128 Mobility (Kevin Martin
-      and ATI).
-  55. Radeon DRI fixes (VA Linux Systems).
-      - Re-enable freeing resources when the screen is destroyed (Kevin
-        Martin)
-      - Use screen-relative instead of window-relative coordiantes to
-        calculate the tiled depth buffer offset address (Kevin Martin)
-      - Fix texture upload at offset 0 bug.  Quake 2 engine games use
-        TexSubImage to update lightmaps and the like, and we were
-        uploading the updates before the image had space in the texture
-        heap allocated to it. (Gareth Hughes)
-      - Add XF86Config file option to enable depth buffer moves (they
-        are disabled by default since they are excuciatingly slow)
-        (Kevin Martin)
-      - Enable bus mastering in PCI config space for those systems that
-        do not automatically have it enabled (Kevin Martin)
-      - Remove AGP_CNTL register programming -- it was a holdover from
-        the Rage 128 driver and is not needed on the Radeon (Kevin
-        Martin)
-      - Fix offscreen memory allocation calculation for textures (Kevin
-        Martin)
-  54. Allow libGLU to be built (Craig Dunwoody, SGI, David Dawes,
-      Alan Hourihane).
-  53. Import the GLU parts of ogl-sample.
-  52. Add an imake control for determining when xload should be installed
-      set-gid (David Dawes).
-  51. Add some imake controls for installing Xkb and app-defaults files
-      in the traditional location rather than under /etc/X11 (Red Hat does
-      that) (David Dawes).
-  50. Add compressed man page functionality to the rules in Imake.rules,
-      so it should be usable on most platforms (David Dawes).
-  49. Make acceleration work on the Trident Cyber9388 (Alan Hourihane).
-  48. - Various small changes to accomodate Mac OS X support and fix a
-        problem people were having with uninitialized globals in X
-        libraries,
-      - Allow XFree86 to run on Mac OS X as a full screen client of
-        CoreGraphics,
-      - Add a Mac OS X application that controls the X server and feeds it
-        events when running on Mac OS X. Currently must be built by
-        ProjectBuilder (#4409, #4410, #4411, Torrey T. Lyons).
-  47. Fix Mach64 Mono 8x8 Pattern acceleration (Marc La France).
-  46. Experiment with setting the server's "vendor release" value from
-      the information in xf86Version.h, and modify xdpyinfo to show the
-      server version in an easily readable format (David Dawes).
-  45. Fix 1bpp colour map in vgaHW (Marc La France).
-  44. More IA64 loader fixes and make xf86sym.c compile again
-      (Michael Madore, Marc La France).
-  43. Add missing symbols in vesa driver (Marc La France).
-  42. Fix multihead pointer problem on Rage 128 (Mark Vojkovich).
-  41. Resync with DRI CVS trunk (Kevin Martin, VA Linux Systems)
-      - Add Radeon 3D driver (Kevin Martin and Gareth Hughes)
-      - Improve Rage 128 3D driver support (Gareth Hughes)
-      - Add fast AGP read/drawpixels support in MGA driver (Keith Whitwell)
-      - Update DRI docs (Kevin Martin, Brian Paul)
-      - Fix various bugs (Keith Whitwell, Brian Paul, Kevin Martin)
-  40. Rename fsinfo to xfsinfo to avoid a name clash with the fsinfo utility
-      in the Berkeley automounter amd (Matthieu Herrb).
-  39. Invert NO_COMPILER_H_EXTRAS to prevent unintentional references to inx()/
-      outx() on the likes of SunOS (Marc La France).
-  38. Change the os-support layer to only claim a bare minimum of I/O resources
-      rather than a larger estimate (Marc La France).
-  37. Loader work:  Fix handling of shared GOTs on IA-64 and Alpha's, and of
-      PLT and OPD entries on IA-64;  Cleanup debug messages and #if testing
-      (Marc La France).
-  36. Extensive int10 rework to address lockups, spontaneous reboots and tight
-      CPU loops on various architectures (Marc La France):
-      - Use intialised BIOS to softboot primary adapters on non-PC's;
-      - Fix endianness problems;
-      - Move stack into its own page to prevent overwritting interrupt vectors;
-      - Prevent (with a message) int10 from interfering with mainboard devices
-        (i.e. RTC, keyboard, speaker, chipset, etc.);
-      - Flesh out int 0x42 emulation on non-PC's;
-      - Emulate BIOS data area on non-PC's;
-  35. Add missing symbols in i810 and sis drivers (Marc La France).
-  34. Optionally disable, at compile time, loader bug workarounds in ATI driver
-      (Marc La France).
-  33. Prevent the Rage 128 and Radeon drivers from initialising an adapter more
-      than once (Marc La France).
-  32. Move support for >64kB BIOS'es from int10 into the os-support/bus layer
-      (Marc La France).
-  31. When retrieving PCI BIOS'es, only use another PCI base when a previous
-      retrieval attempt fails (Marc La France).
-  30. Temporary kludge to not consider any adapter as primary if more than one
-      candidate can be found (Marc La France).
-  29. Make deleted mode messages less fearsome (Marc La France).
-  28. Fix -configure to retrieve the correct set of options for ATI, C&T,
-      Cirrus and NeoMagic adapters (Marc La France).
-  27. When removing PCI resource overlaps, always consider resources whose size
-      can be accurately determined, whether active or not (Marc La France).
-  26. Real 4:2:0 YUV support for the Rage 128 (Mark Vojkovich).
-  25. Xinerama support for Render extension (Keith Packard).
-  24. Make some changes to the clock selection for trident driver
-      (Alan Hourihane).
-  23. Switch savage driver to fb (+Render), correct maxHValue (Keith Packard).
-  22. Add font property caching in Xft (Keith Packard).
-  21. Xterm patch #150 (Thomas Dickey).
-  20. Fix 24/8 Overlay support on Permedia2v and Permedia3 chipsets
-      (Alan Hourihane).
-  19. Add CyberStretch option to the trident driver for Cyber chipsets that
-      allows Graphics modes to stretch to the full display (Alan Hourihane).
-  18. Xterm patch #149 (#4351, Thomas Dickey).
-  17. Fix Y offsets passed to pixmap cache when DRI disabled in R128 driver
-      (Alan Hourihane).
-  16. Add BlockFills to Permedia3 (Alan Hourihane).
-  15. Fix pixmap cache when more than 16MB of memory on Permedia 3
-      (Alan Hourihane).
-  14. Fix colourmap problems at depth15/16 on Permedia3 (Alan Hourihane).
-  13. Bump xc/programs/Xserver/GL/dri (libdri.a) version to 3.1.0 to
-      correspond with the DRI backbuffer rewrite, and modify drivers accordingly
-      (Alan Hourihane).
-  12. Enable ImageWrites on Rage128 and Radeon (Alan Hourihane).
-  11. Add DRIMoveBuffersHelper function to prevent code duplication in
-      the drivers (Mark Vojkovich).
-  10. Bug fixes for endianness problems in Permedia3 driver
-      (#4404, Sven Luther).
-   9. Add Appian Jeronimo 4x8Mb (PM2v) support to the glint driver
-      (Alan Hourihane).
-   8. Add render support to i810 driver (Keith Packard with testing
-      by Christien Bunting)
-   7. Switch misc (non-radeon, non-r128) ATI driver to fb (Keith Packard).
-   6. 3DFX driver changes (Mark Vojkovich).
-      - fix some DGA issues.
-      - 2D and 3D now share offscreen memory (much faster 2D now).
-      - rewrite Xv support to use the video overlay.
-      - add new Options "VideoKey" and "ShowCache".
-   5. Change xterm from simple face name to full Xft font name so
-      that options can be provide (like minspace) (Keith Packard)
-   4. Add UTF-8 support to Xft (Keith Packard)
-   3. Add font/face sharing and a minumum vertical space option
-      to Xft (Keith Packard)
-   2. Fix 64 bit DGA bug (Mark Vojkovich).
-   1. Rewrite DRI back buffer handling to minimize the impact on 2D
-      performance (Mark Vojkovich).
-   0. Fix incorrect driverName fields in the cyrix, i810 and sis drivers.
-      This was causing 'XFree86 -configure' to get the driver name wrong
-      (David Dawes).
-
-XFree86 4.0.2 (18 December 2000)
-1211. Fix a problem introduced recently when using the "ps/2" protocol for
-      mice on FreeBSD (David Dawes).
-1210. Disable DRI for tdfx when there's insufficient memory for textures
-      (Alan Hourihane).
-1209. Rename the R6.4 INSTALL and RELNOTES docs at the top level of the source
-      tree, and add a copy of the XFree86 RELNOTES.
-1208. Add Solaris 8/x86 key mappings for some more jp106 keys.
-1207. Fix wacom man page to match the driver (based on #4398, Akio Morita).
-1206. Install the iso8859-13 encoding file (#4397, Nerijus Baliunas).
-1205. Misc doc-related updates.
-
-XFree86 4.0.1Zc (15 December 2000)
-1204. Fix an Xlib memory overrun when the Xutf8TextPropertyToTextList function
-      is used in a unibyte locale (#4394, Bruno Haible).
-1203. Fix the yen/backslash keys for Solaris 8/x86 with Japanese 106 keyboards
-      (based on #4393, Takaaki Nomura).
-1202. Fix type mismatches in the r128 DRI driver on Alpha platforms (#4392,
-      Gareth Hughes).
-1201. Fix build on Japanized version of Solaris 8 for x86 (#4390,
-      Takaaki Nomura).
-1200. Remove some old XtOffset magic for the arm that affects building
-      with gcc (#4388, Keith Packard).
-1199. Release notes updates (David Dawes, Egbert Eich, Mark Vojkovich,
-      Robin Cutshaw, Keith Packard, Alan Hourihane, #4391, Kevin Brosius).
-1198. Revert the tdfx driver to something functionally close to the
-      last known working version (4.0.1g) (David Dawes).
-
-XFree86 4.0.1Zb (14 December 2000)
-1197. New fonts document (#4386, 4387, Juliusz Chroboczek).
-1196. Status doc update for Trident (Alan Hourihane).
-1195. Update the R6.4 INSTALL and RELNOTES docs to include references at
-      the top to the XFree86-specific docs (David Dawes).
-1194. Make it possible to install platform-specific man pages with most
-      ix86 builds (David Dawes).
-1193. Add a short man page for the newport driver, update it's sample config
-      file, and have the driver check user-supplied parameters (#4385,
-      Guido Guenther).
-1192. Missing part of fix for FreeBSD sysmouse support (#4317, from FreeBSD
-      ports collection).
-1191. Trident driver bug fixes (Alan Hourihane).
-1190. Make it possible to install hardcopy specs docs that we can't generate
-      from source (David Dawes).
-1189. Set the HasPerl default correctly for LynxOS (#4384, Thomas Mueller).
-1188. Lots of Status doc updates (#4383, Branden Robinson).
-1187. Update some DebianMaintainer defaults in linux.cf (#4380,
-      Branden Robinson).
-1186. Fix a segfault in the font path verification code in xfs (#4379,
-      Charles C. Fu).
-1185. Rework and document the various MatroxHal imake parameters, and
-      build in support for the mga_hal module by default for loadable server
-      builds (David Dawes).
-1184. Fix sis driver corrupt display with more than 8MB of video memory (#4378,
-      Can-Ru Yeou).
-1183. Fix xf86cfg build problem on systems that don't come with snprintf
-      and/or regex (based on #4361, Thomas Mueller).
-1182. Fix siliconmotion driver screen restoration when a graphics vesafb mode
-      is selected during boot up (#4377, Frido Garritsen).
-1181. Install and RELNOTES updates for Darwin (#4375, 4376, Torrey T. Lyons).
-1180. s3virge patch to get Xft/Xrender working (#4374, Kevin Brosius).
-1179. Improve aperture driver related error messages on OpenBSD
-      (Matthieu Herrb).
-1178. Workaround for IA-64 loader bug (Marc La France).
-1177. Fix recognition of valid depth/fbbpp combinations in ATI driver
-      (Marc La France).
-1176. Fix 1bpp in ATI driver (Marc La France).
-1175. Fix ATI DPMS support on panels by mimicking BIOS behaviour more closely
-      (Marc La France).
-
-XFree86 4.0.1Za (12 December 2000)
-1174. Set defaults for Mesa's x86 CPU-specific asm options, and make it
-      possible to build with MMX disabled for systems with older assemblers
-      (David Dawes).
-1173. Fix some R128 DRI bugs:
-       - Fix depth span functions (was causing rendering errors for windows
-         not at (0,0)).
-       - Don't use 32-bit depth buffers since they're not supported by Mesa.
-       - Use subpixel offsets to fix coordinate rounding errors.
-      (#4373, Gareth Hughes).
-1172. Reinstate the AllTarget for the rule to make html man pages
-      (David Dawes).
-1171. Build all modules on Linux/mips, fixing Xnest build (#4372,
-      Guido Guenther).
-1170. Update Permedia 3 README, Cards file, and glint section in the Status
-      doc (#4371, Sven Luther).
-1169. Fix depth passed to the BIOS in the savage driver (affects depth 15)
-      (#4369, Ani Joshi).
-1168. Update fbdev man page (#4368, Michel Daenzer).
-1167. Fix a problem with 32-bit depth buffers when using indirect rendering,
-      by not advertising them in the mga driver (#4367, Brian Paul).
-1166. Update man page version strings, and convert some server/XFree86 man
-      pages to cpp-processed files to make the references to pages in
-      system-dependent sections correct (David Dawes).
-1165. Update the release notes for the i18n and Unicode support (#4366,
-      Bruno Haible).
-1164. Document most of the environment variables that can influence libX11
-      and libXt in the 'X' man page (#4365, Bruno Haible).
-1163. Update the ICCCM spec document to relfect the selection targets currently
-      used in XFree86 (#4364, Bruno Haible).
-1162. Update the CTEXT spec document to reflect part of the current
-      practice in XFree86 (#4363, Bruno Haible).
-1161. Augment SpecsDocDirs to reflect additional docs that have XFree86 changes
-      (#4362, Bruno Haible).
-1160. Fix Xv library references in the xvinfo Imakefile (#4361,
-      Thomas Mueller).
-1159. Fix a signed/unsigned error in the calculation of 16-bit displacements
-      in x86emu (#4359, Tim Roberts).
-1158. Fix "noaccel" option in the tdfx driver when building without DRI
-      (David Dawes).
-1157. Add Darwin documentation (Torrey T. Lyons).
-1156. Add Darwin bindist files and update Xinstall.sh (Matthieu Herrb).
-1155. Update bindist files for NetBSD 1.5 ELF (Matthieu Herrb).
-1154. Add DGA support to I128 driver (Robin Cutshaw).
-
-XFree86 4.0.1Z (8 December 2000)
-1153. Flesh out the wacom man page (#4358, Frederic Lepied).
-1152. Fix incorrect documentation for xf86UnMapVidMem() in README.OS-lib
-      (#4357, Guido Guenther).
-1151. Update the newport driver to use the map/unmap functions provided by
-      the os-support layer (#4356, Guido Guenther).
-1150. Bugfix to xf86UDelay() (Egbert Eich).
-1149. Added a sanity check to  pciConvertRange2Host() (Egbert Eich).
-1148. Added more log messages to Linux APM code (Egbert Eich).
-1147. Added a sanity check to xf86ConfigPciEntity() (Egbert Eich).
-1146. Resync with DRI CVS trunk (tdfx driver updates) (Daryll Strauss).
-1145. Add -textmode mode option for xf86cfg, to run a ncurses interface, and
-      add the "expert" interface, to provide more control over the config file.
-      Updates to vesa driver, removed debug messages and fixed problem with
-      console restoration in some S3 cards.
-1144. Merge tdfx 3D driver code (VA Linux).
-1143. Add support PPC support on Rage 128 and disable Int10 for PPC on
-      Rage 128 (until the bug in PPC Int10 support is fixed) (Kevin Martin).
-1142. Install an alternative fonts.alias file that references the UCS-encoded
-      fonts on systems without Perl (David Dawes).
-1141. Add CyberShadow Option back into Trident driver (Alan Hourihane).
-1140. Resync with DRI CVS trunk, including:
-       - SSE support updates
-       - DRI-specific full screen mode
-       - Reduce the minimum space required for 3D on the Rage 128
-      (VA Linux).
-1139. Fix a memory leak in the UTF-8 <--> CompoundText converter (#4354,
-      Bruno Haible).
-1138. Add support for the selection target UTF8_STRING to libXaw (#4353,
-      Bruno Haible).
-1137. Make Xlib's CompoundText converter ISO-2022 compliant (#4352,
-      Bruno Haible).
-1136. Fix 2 wacom driver bugs (core dump on VT switching, and USB support)
-      (#4350, Frederic Lepied).
-1135. Update the ClearlyU fonts to 1.8b.  Changes include:
-       - Cleaned up the Arabic glyphs so they don't look quite so juvenile.
-       - Squared up the Hebrew glyphs so they match the style of the other
-         scripts better.
-       - Added many of the basic Hangul glyphs.
-       - Brought the Cyrillic block in line with Unicode 3.0 and moved the
-         extra glyphs into the PUA font in the 0xE4XX range.
-      (#4349, Mark Leisher).
-1134. Update the savage driver to all I/O via MMIO, and add DPMS support
-      (4347, Ani Joshi).
-1133. Change xfs to drop privs after daemonising so that the pid file can
-      be written (#4346, Frederic Lepied).
-1132. Miscellaneous fixups to the trident driver (Alan Hourihane).
-1131. Add Xv support to the trident driver. Works for Blade and Image series
-      chips, but zooming currently doesn't work on Image series.
-      (Alan Hourihane).
-1130. Don't perform a software reset on the Graphics Engine for Trident
-      Blade3D's and CyberBlade's (Alan Hourihane).
-1129. Fix typo in int10 for IA-64's (Marc La France).
-1128. Make PCI bridge information in the log more accurate (Marc La France).
-1127. Update ATI docs (Marc La France).
-1126. Another getValidBIOSBase() fix (Marc La France).
-1125. If the loader server dies from a signal during initialisation, print a
-      list of undefined symbols (Marc La France).
-1124. Move Alpha MMIO definitions from xf86_OSproc.h to compiler.h
-      (Marc La France).
-1123. Change update.docs rule for shadow tree friendliness (Marc La France).
-1122. Don't reference libc wrapper names directly in the newport driver
-      (David Dawes).
-1121. Fix the fr_CH xkb Macintosh symbols file (#4345, Olaf Hering).
-1120. Revert the Estonian_Estonia.1257 change in patch #4297 because
-      windows-1257 is a closer match to iso8859-13 than iso8859-15.
-      Also add entries for the et_EE.ISO8859-1 locale (while not perfect for
-      Estonian, it is commonly used) (#4344, Ville Hallik).
-1119. Change name of long Unicode keysyms from 6 to 8 hex digits, which
-      matches conventional usage better (#4343, Ivan Pascal).
-1118. Make XF86VidModeSetViewPort() actually set the viewport to the
-      X and Y coordinates specified as opposed to always setting it to (0,0)
-      (#4342, Joe Moss).
-1117. Work around some build problems on SVR4.0 (#4341, Satoshi Kimura).
-1116. Compose characters for the Macedonian UTF-8 locale (#4338,
-      Damjan Georgievski).
-1115. Fix build problems with the wacom driver on Linux 2.4 when building
-      a static server (Frederic Lepied, David Dawes).
-1114. Changed name of server binary to call by xf86cfg back to "XFree86
-      (Egbert Eich).
-1113. Modified handling of memory alloctaion in TDFX driver (Egbert Eich).
-1112. Attempt to fix the 'UseModes' directive in the Monitor section
-      (Egbert Eich).
-1111. Added debugging output for BIOS base address search (Egbert Eich).
-1110. Changed neomagic driver to treat disable stretching for each mode
-      individually (Egbert Eich).
-1109. Removed '-traditional' from cpp rule for makedpend. Required for
-      new glibc header files (Ruediger Oertel).
-1107. Fix to make SuperProbe build again on ia64 (Andreas Schwab).
-1107. Attempt to fix int10 (Egbert Eich).
-1106. Modified blitter busy test to use the MMIO mapped registers on chips
-      > CT69000 (Egbert Eich).
-1105. Attempt to improve dga support in C&T driver (Egbert Eich).
-1104. Moved ppc_flush_icache to compiler.h - hope this fixes build problems
-      (Egert Eich).
-1103. changed cirrus driver to us fb instead of cfb (Egbert Eich).
-1102. Modularized HALlib for mga driver (Egbert Eich).
-1101. Added DGA support to tseng driver (Rainer Keller).
-1100. Added "framebuffer" bus type allowing resource control to take place
-      outside of the server (Egbert Eich).
-1099. Added turkish keyboard layout (Togan Muftuoglu).
-1098. Fix Cyber9397/DVD acceleration problem (Alan Hourihane).
-1097. Resync with the DRI CVS trunk.
-1096. Fix alot of Rage 128 Xv bugs (Mark Vojkovich).
-1095. Fix XKB symbols for Swedish Macintosh keyboards (#4337, Olaf Hering).
-1094. Disable DRI on PPC (#4337, Olaf Hering).
-1093. Suppress xf86ReadBIOS debugging messages for BSD (#4336, Takaaki Nomura).
-1092. Silicon Motion driver update, includes bug fixes (#4335,
-      Frido Garritsen, Silicon Motion, Inc.).
-1091. Updates to the dumpkeymap utility and its documentation (#4323,
-      Eric Sunshine).
-1090. Enable 3D support for Rage 128 Mobility chips (Kevin Martin).
-1089. Add clip rectangles support to Render extension, Xrender and Xft.
-      Make Xrender and Xft usable from c++.
-      Fix a bunch of compiler warnings in Render extension code
-      (Keith Packard)
-
-XFree86 4.0.1h (4 December 2000)
-1088. Fix key mapping for the '\' key on GB keyboards in Solaris 8.
-1087. Status doc updates for Neomagic an NVIDIA (#4334, Andrew C. Aitchison,
-      Mark Vojkovich).
-1086. Updated Rage 128 DRI support from the DRI CVS (Gareth Hughes, VA Linux).
-1085. -
-1084. Bump the minor revisions of libXmu (UTF8_STRING) and libX11
-      (Xutf8LookupString).
-1083. Fixes for all known bugs in the CompoundText parser and generator,
-      including:
-       * While adding a charset:
-         - Adding a charset with two different escape sequences (e.g.
-           ISO-8859-14) led to broken behaviour of the converter. Moreover
-           the second added would have priority over the first added.
-         - If an invalid escape sequence was detected by _XlcParseCharSet, it
-           was still used when generating compound text.
-         - Extended segment charsets with varying number of bytes per character
-           were treated like those with 1 byte per character.
-         - _XlcAddCT failed to copy its ct_sequence argument, thus leading to
-           bugs when this argument was a dynamically allocated string.
-         - Missing detection of different charsets having the same escape
-           sequence.
-       * Parsing Compound Text:
-         - The functions _XlcParseCT and _XlcGetCTInfo did not perform range
-           checks on the strings being parsed. Danger of core dump through
-           out-of-bounds string access if a malicious client provides malformed
-           text.
-         - Builtin extended segment charsets were not recognized because the
-           strncmp in _XlcGetCTInfo was returning false most of the time, due
-           to the embedded length bytes.
-         - Extended segment charsets in general would not be deactivated after
-           the specified number of bytes.
-         - In _XlcCheckCTSequence, extended segments with invalid embedded
-           length bytes would lead to out-of-bounds string accesses as well.
-         - Unrecognized escape sequences did not lead to a return value > 0.
-         - Left-to-right and right-to-left indicators (starting with 0x9b) were
-           just ignored, without leading to a return value > 0.
-         - If the source string was larger than the intermediate buffer,
-           multibyte characters could be split into pieces, leading to
-           conversion errors.
-       * Generating Compound Text:
-         - The length embedded in an extended segment prefix was always wrong.
-         - Long strings could give rise to extended segments with a length that
-           doesn't fit in the allowed 14 bits.
-         - After an extended segment, GL or GR designators would unnecessarily
-           be repeated.
-         - Bytes in the range 0x81..0x88, 0x8b..0x9a, 0x9c..0x9f in multibyte
-           encodings could not be output, would be thrown away.
-         - Byte 0x9b could not be output in the UTF-8 charset.
-       * udcInf.c was generating invalid Compound Text (invalid length in
-         extended segment).
-       * lcConv.c: If in the indirect converter, the first step led to no
-         output, the second step would still be called, possibly leading to
-         out-of-bounds accesses.
-       * lcUTF8.c: had knowledge about JISX0208.1983-0 but not about
-         JISX0208.1990-0.
-      (#4333, Bruno Haible).
-1082. Fix documentation for XSetOMValues() (#4332, Bruno Haible).
-1081. Fix namespace polution in <X11/Xlib.h> introduced with patch #4293
-      (#4331, Bruno Haible).
-1080. Fix a bug in the newly introduced Xutf8LookupString() function that
-      loses input not representable in the locale encoding (#4330,
-      Bruno Haible).
-1079. Avoid four new gcc warnings about const in lcUTF8.c introduced by
-      patch #4293 (#4329, Bruno Haible).
-1078. Fix some additional cases of confusing local typedef for wchar_t
-      (#4328, Bruno Haible).
-1077. Fix some round-trip conversion errors in COMPOUND_TEXT -> UTF8_STRING ->
-      COMPOUND_TEXT due to wrong tables introduced by patches #4214, 4215
-      (#4327, Pablo Saratxaga).
-1076. Cygwin update for building Xrender DLL (#4326, Suhaib M. Siddiqi).
-1075. Fix an undefined SUBDIRS in xc/lib/GL/mesa/src/drv/Imakefile when
-      compiling on something other than x86, alpha or sparc (#4325,
-      Brian Paul).
-1074. Don't have the neomagic driver disable stretching when a mode that
-      fills the panel is selected (#4324, Andrew C. Aitchison).
-1073. Fix a bug in Xlib's _XimLocalMbLookupString() that causes a crash when
-      a zero keycode keypress event is received (#4322, HIBINO Kei).
-1072. NetBSD doesn't have perl in its default install (Matthieu Herrb).
-1071. Add Xft support to xditview with #ifdefs (Keith Packard)
-1070. Add a MIT-MAGIC-COOKIE-1 generator to startx for NetBSD 1.5 and OpenBSD
-      and FreeBSD and make mkcookie support more generic (Matthieu Herrb).
-1069. Update OpenBSD and NetBSD docs (Matthieu Herrb).
-1068. Clean up r128_video.c again (Marc La France).
-1067. Fix ATI clock generator recognition when an adapter BIOS cannot be
-      retrieved (Linus Torvalds).
-1066. Fix int10 and ATI driver for video BIOSes larger than 64kB
-      (Marc La France).
-1065. Change xf86MatchDevice() to initialise its return pointer and clean up
-      drivers accordingly (Marc La France).
-1064. Fix for bug in new imConv.c (#4318, Ivan Pascal).
-1063. Fix for FreeBSD sysmouse support (#4317, from FreeBSD ports collection).
-1062. Enable the ru_SU local entries for FreeBSD (based on patch from FreeBSD
-      ports collection).
-1061. Driver for the S3 Savage family of chips (#4315, 4316, 4319-4321,
-      Tim Roberts).
-1060. Add xkb definitions for the Logitech cordless keyboard (#4314,
-      Michel Goraczko).
-1059. Add support for "unicode keysym" to XKeysymToString() and
-      XStringToKeysym() (#4313, Ivan Pascal).
-1058. SiS driver updates, including:
-       - Performance tuning for sis630
-       - Support XV extension for sis630
-       - Support Chrontel TV for sis630
-      (#4312, Can-Ru Yeou).
-1057. Fix Xrender library to handle strings > 254 chars long.
-      Change Xrender and Xft interfaces to use 'unsigned int'
-      instead of 'unsigned long' for 32-bit glyph values.
-      (Keith Packard)
-1056. Fix neomagic driver mangled acceleration test (#4309, 4310,
-      Chip Salzenberg).
-1055. Add a rudimentary driver for the SGI Indy's newport cards (only
-      8-bit and non-accelerated so far) (#4308, Guido Guenther).
-1054. Fix a bug in rman that is provoked by the new dumpkeymap man page
-      (David Dawes).
-1053. Updates to the dumpkeymap utility, and add documentation (including
-      a man page) (#4307, Eric Sunshine).
-1052. Add -version and -showconfig options to the Darwin Xserver, and print
-      the usual "XFree86" banner message (#4306, Torrey T. Lyons).
-1051. Fix i810 crash when running XFree86 -configure (#4305, Ryan Drake).
-1050. Linux APM fix, which fixes a problem that shows up with the neomagic
-      driver after an APM suspend (#4304, 4311, Chip Salzenberg).
-1049. Correct maximum ranges for Wacom IV devices (#4303, Frederic Lepied).
-1048. Add preliminary support for USB input devices under Linux (wacom
-      driver (#4303, MATSUMURA Namihiko).
-1047. Locale fixes/cleanups, including:
-       - Cleanup garbage in XLC_LOCALES.
-       - Add "use_stdc_env' to locales where it was absent.
-       - Move non-standard charset descriptions from the lcCT.c table to
-         the XLC_LOCALE files.
-      (#4302, Ivan Pascal).
-1046. Make sure the correct "driverName" string is used in xf86Configure.c.
-1045. Fix some i810 driver problems when too little videoRam is specified
-      (David Dawes).
-1044. Fix an i810 driver bug that prevents the DRI from being enabled
-      after a server reset (Jeff Hartmann).
-1043. Add a "dri" config file option to the i810 driver that can be used
-      to enable/disable the DRI (no other method works for statically
-      linked servers) (David Dawes, from VA's 7.0.1).
-1042. Update the i810 driver to check the max available GART memory
-      (Jeff Hartmann, David Dawes, from VA's 7.0.1).
-1041. Resync DRI code/drivers with the DRI CVS (VA Linux).  Includes
-      3dfx driver updates (Daryll Strauss).
-1040. Fix a couple of clipping problems on the Trident CyberBlade/Blade3d
-      chipsets (Alan Hourihane).
-1039. Fix a couple of Alpha related issues (Jay Estabrook).
-1038. Change Xft interface (again) to use new XftColor datatype for
-      colors instead of XRenderColor.  xterm and x11perf updated to
-      match.  (Keith Packard)
-1037. Fix an i810 init problem that resulted in the fallback to 2D failing
-      for one case where there's insufficient memory to enable the DRI
-      (David Dawes, from VA's 7.0.1).
-1036. Add support for printing a vendor-specific version string in the
-      X server startup messages (David Dawes, from VA's 7.0.1).
-1035. Xwd workaround for a gcc bug (Red Hat's XFree86-4.0.1-xwd-gcc-workaround
-      patch).
-1034. Fixes for sparc drivers, mostly to prevent accessing the hardware
-      when the server doesn't have control of the VT (Red Hat's
-      XFree86-4.0.1-ffb patch).
-1033. Use OS-provided interface for accessing PCI config space on Linux/ia64
-      (based on Red Hat's XFree86-4.0.1-ia64-pci patch).
-1032. Use AsmDefines when processing the Sparc assembler code for cfb
-      (based on Red Hat's XFree86-4.0-sparc-asmflags patch).
-1031. Add PAM authentication to the X server (based on Red Hat's
-      XFree86-4.0-Xwrapper patch).
-1030. Add Slovenian and Romanian entries to XKB's keymap/xfree86 file
-      (Red Hat's XFree86-4.0-si_xkb patch and XFree86-4.0-ro_xkb.patch).
-1029. Fix for PAM support in xdm SessionExit() (Red Hat's
-      XFree86-4.0-pamsession patch).
-1028. XlibInt.c patch to avoid buffer overflow (Red Hat's
-      XFree86-3.3.6-fixemacs patch).
-1027. Updates to xfs from Red Hat and Debian, including:
-       - command line options to make xfs drop it's root privs (-droppriv
-	 and -user) - command line options to make xfs start as a daemon,
-         and a build option to make this the default.
-       - don't let a port option in the config file override the -port
-	 command line option
-       - cleanup/fix syslogging
-      (based on #4253, Topi Miettinen, Debian, and Red Hat's
-       XFree86-4.0-xfsredhat patch).
-1026. Support for startx to set up the Xauth when starting an X server
-      (based on Red Hat's XFree86-4.0-startx_xauth patch).
-1025. Fix an unaligned access on Alpha with the tdfx driver (Jay Estabrook).
-1024. Add detection for CyberBlade/Ai1 Socket A chipsets (Alan Hourihane).
-
-XFree86 4.0.1g (29 November 2000)
-1023. Fix small bug in lcGeneric.c (#4301, Ivan Pascal).
-1022. Rewrite Xft library for Render extension/core text and font management
-      Change xterm to use new interface (Keith Packard).
-1021. s3virge driver updates, including Xv fixes for the ViRGE DX, disable
-      GX2 color expansion until it's stable, GX2 Xv code (not enabled or
-      working yet) (#4299, Kevin Brosius).
-1020. Siliconmotion driver (#4298, Frido Garritsen, Silicon Motion, Inc.).
-1019. Fix Estonian_Estonia.1257 entry in locale.alias (#4297, 4300,
-      Nerijus Baliunas).
-1018. New Lithuanian XKB map (#4296, Nerijus Baliunas).
-1017. Fix a problem with the "xtt" font module introduced with recent
-      changes to the "freetype" module (#4295, ISHIKAWA Mutsumi).
-1016. Fix the return value for the "indirect" converter in Xlib (#4294,
-      Bruno Haible).
-1015. ANSI C cleanup of Xlib locale core code (#4293, Bruno Haible).
-1014. Optimize the i18n support for parsing resource files for the unibyte
-      locales, and clean up pre-ANSI-C-isms and warnings (#4292, Bruno Haible).
-1013. Enhance the CompoundText <-> UTF-8 converter so that it understands
-      the BIG5 encoding scheme used by Emacs (#4291, Bruno Haible).
-1012. Fix documentation and implementation of _XlcCompareISOLatin1 and
-      _XlcNCompareISOLatin1 (#4290, Bruno Haible).
-1011. Add new Unicode-based APIs for internationalized text for Xlib (#4289,
-      Bruno Haible).
-1010. Fix a minor Mesa lighting bug (#4288, Brian Paul).
-1009. Fix the glide driver's resolution of symbols from the glide library
-      (#4281, Pontus Lidman).
-1008. Fix X server stalling forever with local font servers on Linux 2.4
-      kernels (#4280, Branden Robinson).
-1007. Improve temp file handling in the Xaw library (#4279, Branden Robinson).
-1006. Add support for Rage 128 RG (#4277, Michael Mattice).
-1005. Modify XimGetCharCode() to use conversion from keysym to UCS and then
-      from UCS to the appropriate charset specified in the locale description
-      (#4276, Ivan Pascal).
-1004. Allow Unicode fonts to be used as UTF-8 locale native fonts (#4275,
-      Ivan Pascal).
-1003. Fix abnt2/br XKB config (#4274, Paulo Cesar Pereira de Andrade).
-1002. Let the Darwin X server build on pure Darwin as well as Mac OS X systems
-      (#4273, Torrey T. Lyons).
-1001. Patch to allow xdm to build on Darwin (#4273, Torrey T. Lyons).
-1000. Fix parser not dup'ing a string (#4272, Paulo Cesar Pereira de Andrade).
- 999. Improve direct fifo writes for the glint/permedia3 pixmapwrite hook
-      when using FIFO disconnect (#4271, Sven Luther).
- 998. Fix a sprite problem with the "xwin" server (#4269, Suhaib M. Siddiqi).
- 997. Fix a confusing local typedef for "wchar_t' in xc/lib/X11/lcUTF8.c
-      (#4268, Bruno Haible).
- 996. Allow ProjectVar to override "/var" when set (based on #4266,
-      Bruno Haible).
- 995. Rework Trident Blade/CyberBlade acceleration (Alan Hourihane).
- 994. Make the CyberBlade/e4 (aka 9540) work (Alan Hourihane).
- 993. Updates to Big5 encodings for the TrueType font backends (#4265,
-      Jacky Bryant).
- 992. Fixes for Thai (th_TH) locale support in Xlib (#4264,
-      Theppitak Karoonboonyanan)
- 991. Fix a segv in Xnest caused by overflowing the pixmap formats array
-      (based on #4262, Matthieu Herrb).
- 990. Fix an xdm problem that prevents the chooser from working (#4261,
-      Matthieu Herrb).
- 989. Update the Cards file (#4260, Paulo Cesar Pereira de Andrade).
- 988. Update Macedonian xkb symbols, and add mk_MK.utf8 to locale.alias
-      (#4258, 4259, Damjan Georgievski).
- 987. Safe tempfile handline for imake's probing of glibc version (based on
-      #4257, Colin Phipps).
- 986. Fix typo in dvorak xkb symbols file, plus white space cleanup (#4256,
-      Branden Robinson).
- 985. Fix typo in server startup message (#4255, Branden Robinson).
- 984. Make XOpenDisplay() bail out if the server claims that its vendor
-      string is > 256 in length (#4254).
- 983. Add some useful default key bindings for the xdm login widget (#4252,
-      Branden Robinson).
- 982. Change the default xdm Xaccess file to not allow any connections
-      (#4252, Branden Robinson).
- 981. Set the default glyph caching mode to "CACHE_16_BIT_GLYPHS"
-      (#4251, Branden Robinson).
- 980. Make the X server use the XAUTHORITY environment variable (if set)
-      when the -authfile command line flag isn't given (#4250,
-      Branden Robinson).
- 979. Add Debian-specific settings to linux.cf (#4249, Branden Robinson).
- 978. Rename Trident Cyber9540 to CyberBlade/e4 and make appropriate
-      changes in driver (Alan Hourihane).
- 977. Fix Trident Cyber series to only detect SDRAM (Alan Hourihane).
- 976. Make xf86SoundKbdBell() available to modules (for citron driver)
-      (Marc La France, #4270, Frederic Lepied).
- 975. Fix glide driver's check for glide library presence (Marc La France).
- 974. Add missing symbol references in r128 and s3virge drivers
-      (Marc La France).
- 973. Fix int10 debugging and reading in all segments between 0x0C0000 and
-      0x0F0000 (Marc La France).
- 972. Fix typo in imake.c (Marc La France).
- 971. Turn off SGRAM optimization for Trident Blade chips, causes some
-      problems. (Alan Hourihane).
- 970. Ignore various ".stab.*" sections for Solaris (Marc La France).
- 969. Fix ENXIO errors on Linux BIOS retrievals by removing restriction on
-      several OSes that xf86ReadBIOS()'s Base be page-aligned (Marc La France).
- 968. Disable change 873.  It causes device/monitor mismatches
-      (Marc La France).
- 967. Change linux/int10 to intercept signals generated by the vm86() syscall
-      rather than killing the server (Marc La France).
- 966. Reinstate DG/UX mmap() bug work-around in int10 (Marc La France).
- 965. Rage128 and Radeon fix for -configure (Marc La France).
- 964. Fix int10 woes with retrieving PCI BIOSes (Marc La France).
- 963. Allow modules to intercept signals that would otherwise kill the server
-      (Marc La France).
- 962. Fix static Xvfb server build (Marc La France).
- 961. Some warning fixes (Marc La France).
- 960. Rage128 and Radeon #include changes to reduce recompilations
-      (Marc La France).
- 959. Modify item no. 949 - only reset clipping for Cyber9382, Cyber9385 and
-      ProVidia9682 (Alan Hourihane).
- 958. Added messages about modes rejected on lookup (Egbert Eich).
- 957. Attempt to fix DDC1 support on Neomagic (Egbert Eich).
- 956. Added Block/UnblockSIGIO() to DDC1 readout code (Egbert Eich).
- 955. Enabled virtual depth for a second head on a G400 multihead
-      (this needs to be looked at) (Egbert Eich).
- 954. Added code to check if the PictureScreen structure was initialized
-      before referencing it (Egbert Eich).
- 953. Modified xf86UDelay() to use Block/UnblockSIGIO and usleep()
-      instead of gettimeofday() (Egbert Eich).
- 952. Modified xf86MatchPciInstances() to allow for chipset overrides
-      even when called with no separate vendorID (Egbert Eich).
- 951. Changed Xvfb to use fb instead of cfb (Egbert Eich).
- 950. Moved a misplaced xfree() in the generic driver. Now more than
-      one chipset can use this driver in a multihead setup (Egbert Eich).
- 949. Did some fixes for the Trident driver ie. fixed a LCD modeline,
-      reset clipping register on all non 3D chips (Egbert Eich).
- 948. Added missing parts for AXP support to lnx_video.c (Egbert Eich).
- 947. Added bsr/bsf to x86emu (Jeff Wiedemeier).
-
-XFree86 4.0.1f (16 November 2000)
- 946. Add a dumpkeymap utility for Darwin (#4248, Eric Sunshine).
- 945. Fix a Darwin build problem with mkcfm, and get xdm closer to building
-      (#4247, Torrey T. Lyons).
- 944. DDX for the Xdarwin server (#4246, Torrey T. Lyons).
- 943. Enable xdm/PAM support by default for FreeBSD versions with PAM.
- 942. Fix a problem where the X server thinks it has acquired a VT at startup
-      before it has really been released.  This is due to the ioctl()
-      returning prematurely because of a pending signal (Jeff Hartmann).
- 941. Fix a problem with the PAM support in xdm that prevents
-      pam_start_session() from ever being called (Takanori Saneto).
- 940. Enable PAM support for xdm on FreeBSD (#A.202, Jean-Marc Zucconi, and
-      Takanori Saneto).
- 939. Fix xf86cfg build problem when BuildXinerama is set to NO (#A.200,
-      Jean-Marc Zucconi).
- 938. gccmakedep has a typo which affects handling the -o and -O options
-      (A.192, Ivan Zakharyaschev).
- 937. Specify the units for the dpms and rate commands in the xset man
-      page (#A.191, John Heidemann).
- 936. Let makedepend ignore "//" style comments on all platforms, not
-      just Win32, and fix a bug in that code that was causing the line
-      after such comments to also be ignored (#A.189, Guenther Grau).
- 935. Update GNU/Hurd support (#A.188, Marcus Brinkmann).
- 934. Initial port of the ark driver to 4.x (#4242, Ani Joshi).
- 933. Wacom input driver update, including support for 38400 link speed
-      and fix wrong advertisement of min/max values (#4241, Frederic Lepied).
- 932. Fix some parser problems, including:
-       - parser does not write Modes section and UseModes keyword
-       - the vscan value wasn't being used
-       - make the XF86ConfModesPtr structure accessible from the
-         XF86ConfMonitorPtr structure
-       - allow xf86Parser.h to be included from in a C++ program
-      (#4238, 4243-4245, Paulo Cesar Pereira de Andrade).
- 931. Fix the name of the Serbian xkb symbols file (rename from yu to sr)
-      (#4237, Ivan Pascal).
- 930. Fix mkcfm bug (#4236, Juliusz Chroboczek).
- 929. Glint/permedia3 updates (#4235, 4238, Sven Luther).
- 928. Fix an SVR4 loader build problem introduced in 4.0.1d (#4234,
-      Takaaki Nomura).
- 927. Fix a bug in fontenc that would cause a memory leak whenever an
-      encoding would be declared in encodings.dir but not in the encoding
-      file itself (#4233, Juliusz Chroboczek).
- 926. Make the freetype backend use the fontenc matrix encoding support,
-      remove support for the defunct XAnti extension, and bump the version
-      of the freetype backend to 1.1.8 (#4233, Juliusz Chroboczek).
- 925. Add proper support for matrix encodings in fontenc (including the
-      new FIRSTINDEX keyword in encoding files), and bump the version of
-      the font module ABI to 0.2 (#4233, Juliusz Chroboczek).
- 924. Fix a problem the vesa driver (#4232, Paulo Cesar Pereira de Andrade).
- 923. Fix problems building the C&T driver with DEBUG defined (#4231,
-      Taketoshi Sano).
- 922. Remove lt_LT.ISO8859-1 entry from compose.dir (#4230, Nerijus Baliunas).
- 921. s3virge driver updates, including:
-       - Stabilize GX2 support, reenable silken mouse
-       - Enable MX fixes
-       - Add support for the render extension
-       - Enable BLT_BUG for ViRGE and VX chipsets
-      (#4229, Kevin Brosius).
- 920. Don't initialize DRI when noaccel is specified in the tdfx driver
-      (Alan Hourihane).
- 919. Make module ABI compatibility mismatches fatal by default, and
-      add a command line option for making them non-fatal (David Dawes).
- 918. Changed SiS driver to use fb instead of cfb (Alan Hourihane).
- 917. Fix r128 and radeon driver source code formatting that was munged
-      during ATI merge (Kevin Martin).
- 916. Update Markus Kuhn's UCS fonts, and add his scripts for extracting
-      subsets of them to the build process (David Dawes).
- 915. Fix visual setting in ATI r128/radeon driver (Jeff Wiedemeier).
- 914. Alpha fix for xf86cfg (Alan Hourihane).
- 913. Resync DRI code/drivers with the DRI CVS (VA Linux).
- 912. Fix tdfx driver to register resources and remove some redundant code
-      (Alan Hourihane).
-
-XFree86 4.0.1e (6 November 2000)
- 911. Fix the ksc5601.1987-0 encoding file (#4226, 4228, Pablo Saratxaga).
- 910. Update xdm/sessreg to write ":0" type entried in utmp on OpenBSD
-      (#4225, Matthieu Herrb).
- 909. Fix for Xmu under NetBSD, which doesn't #define "unix" anymore (#4225,
-      Matthieu Herrb).
- 908. Preliminary support for OpenBSD/powerpc (#4225, Tsubai Masanari,
-      Matthieu Herrb).
- 907. Support for native WSCONS driver on NetBSD and OpenBSD (#4225,
-      Tsubai Masanari).
- 906. Support for new OpenBSD 2.8 shared libs scheme (#4225, Matthieu Herrb).
- 905. Support for the OpenBSD ports tree (#4225, Marc Espie).
- 904. Update the list of layouts in the xfree86.lst file (#4224, Ivan Pascal).
- 903. Add an XKB map for Serbian (#4224, Milos Rancic).
- 903. New revision of the Bulgarian XKB map (#4224, Anton Zinoviev).
- 902. Change the Alt key definitions in the "group switcher" descriptions
-      to not override the base Alt key mappings (#4223, Ivan Pascal).
- 901. Change XKB Mode_switch behavior description to not clear "locked
-      group" (#4223, Ivan Pascal).
- 900. Create a root window property "XFree86_DDC_EDID2_RAWDATA" when
-      suitable data is available (#4222, Andrew C. Aitchison).
- 899. Fix some typos/errors in the Latvian and Lithuanian entries in
-      the locale.alias and locale.dir files (#4221, Nerijus Baliunas).
- 898. Fix two more bugs in xkbcomp: handling of 'keycode aliases', and
-      copying of strings when copying structures (#4208, Ivan Pascal).
- 897. Added render extension support to tseng driver (Egbert Eich).
- 896. Fixed clock code in neomagic driver (Egbert Eich).
- 899. xf86Configure now uses the imake variable xf86ConfigFile (Egbert Eich).
- 898. xf86cfg has a new option for a server path (Egbert Eich).
- 897. xf86cfg can now handle more than one command line argument (Egbert Eich).
- 895. Added a delay to dac code in neomagic driver (Egbert Eich).
- 894. Changed shadowfb to use delayed updates in neomagic
-       driver (Egbert Eich).
- 893. Rewrote ddc code in nv driver (Egbert Eich).
- 892. Rewrote ddc code in neomagic driver (Egbert Eich).
- 891. Fixed problems with enter/leave/closeScreen in nv
-       driver (Egbert Eich).
- 890. Fixed a bug in the fixed modelines in trident driver (Egbert Eich).
- 889. Added reinitialization of blitter on enterVT in trident
-       driver (Egbert Eich).
- 888. Fixed a typo which caused wrong register to be set in trident
-       driver (Egbert Eich).
- 887. Added loader symbol handling to tseng driver (Egbert Eich).
- 886. Changed tseng driver to use fb instead of cfb (Egbert Eich).
- 885. Changed chips driver to use fb instead of cfb (Egbert Eich).
- 884. Added render extension support to chips driver (Egbert Eich).
- 883. Added render extension support to neomagic driver (Egbert Eich).
- 882. Added render extension support to nv driver (Egbert Eich).
- 881. Modified helper_mem.c to map everything between video bios and
-       system bios on PC-like platforms (Egbert Eich).
- 880. Modified Linux mapVidMem() to map memory on page boundaries
-       (Egbert Eich).
- 879. Changed BIOS_SIZE (Sys BIOS) from 0x10000 to 0xffff to make
-       int10 work un DGUX (Takis Psarogiannakopoulos).
- 878. Fixed a bug in the argument list of the call to xf86ReadPciBIOS()
-       from int10/pci.c (Egbert Eich).
- 877. Added simple sanity check to catch situation where DDC reads
-       all 0 and therefore trivially has the correct checksum (Egbert Eich).
- 876. Changed i2c code to allow for longer rise/fall times on longer
-       cables (Egbert Eich).
- 875. Removed limit on default visual for 4bpp (Egbert Eich).
- 874. Added macros to build nv driver on AXP (Jay Estabrook).
- 873. Changed -configure to use primary card as first card (Egbert Eich).
- 872. Changed generic vga driver to not unmap memory when switched away.
- 871. Fixed problem that caused APM support to be disabled on server
-       reset (Egbert Eich).
- 870. Added support for newer sparse AXP systems (Egbert Eich).
- 869. Added support for MGA G100 PCI (Egbert Eich).
- 868. Add missing exported libXext Shm functions to loader (Alan Hourihane).
- 867. Change Rage 128 DRM driver name to what the r128 kernel module
-      expects (Kevin Martin).
- 866. Fix newly merged "ati" driver probe to allow "r128" and "radeon"
-      driver names in the XF86Config file for backwards compatibility
-      (Kevin Martin).
- 865. Use vgaHW module to fix font save/restore in i128 driver (Robin Cutshaw).
- 864. Fixed (hopefully) a Xinerama problem with BE clients (Mark Vojkovich).
- 863. Modifications to GLw to allow it to build without Motif, and
-      integrate it into the regular build process (#4142,
-      Carlos A. M. dos Santos, David Dawes).
- 862. Import the GLw parts of SGI's ogl-sample (snapshot from 20001102)
-      under xc/extras/ogl-sample.
- 861. Add support for SubSection in the Vendor Section of the config file
-      (Stuart Anderson)
- 860. Fix a typo introduced in a recent update to the 'no' xkb symbols
-      file (#4218, Pablo Saratxaga, 4219, Harald Nordgård-Hansen).
- 859. Parser symbol update (#4217, Paulo Cesar Pereira de Andrade).
- 858. Updates to iso8859-9e, microsoft_cp1251 charset handling, and
-      add real support for microsoft_cp1255 and microsoft_cp1256 (#4214, 4215,
-      Pablo Saratxaga).
- 857. Fix Sparc build problems linking xf86cfb with libloader that were
-      related to various interdependencies (#4212, David S. Miller).
- 856. Allow generic XVideo adaptors (like v4l) to be initialised for
-      the G400 crtc2 (#4211, Antti Tapaninen).
- 855. Update mga driver to check the chipset much earlier to prevent
-      server hang when using g400 dual head + millennium 2, and some
-      G200 PCI/warp cleanups (#4211, Antti Tapaninen).
- 854. Updates to the Macedonian xkb symbols (#4210, 4220, Damjan Georgievski).
- 853. Combine the ATI, Rage128 and Radeon drivers into one with multiple
-      sub-modules (Marc La France).
- 852. Make BIOS accesses in the Rage128 and Radeon drivers independent of
-      endianess and alignment (Marc La France).
- 851. Fix the claiming of XF86Config device sections by drivers, and change
-      xf86MatchDevices() to only return unclaimed sections (Marc La France).
- 850. Fixed build problem in s3virge when XvExtension is not set (Stuart
-      Anderson)
- 849. Add a message at the top of the server/log output for pre-release
-      versions stating that they are unsupported (David Dawes).
- 848. Fix two problems in Imake.rules: have LinkBuildBinary create the
-      used directory if it doesn't exist, and fix a missing ')' in
-      the LinkConfFileLong (#A.187, Ivan Zakharyaschev).
- 847. Fix a libXt bug that affects multidisplay applications when Xt is
-      built to use select(2) rather than poll(2) (#A.181, Antony Uspensky).
- 846. Add a -utime option to xclock that allows the digital clock to
-      display the number of seconds since the Epoch (based on A.173,
-      Kelsey Hudson).
- 845. Add symbols mappings for extra keys on the BTC 9000 keyboard (#A.167,
-      Stefano Cavallari).
- 844. Fix twm's icon manager so that it is functional before an EnterNotify
-      event is received in twm's event loop (#A.156, Jason Zwolak).
- 843. Update comments about standards for Estonian support, and add an
-      entry for the Estonian keyboard layout to the xfree86.lst file
-      (#A.155).
- 842. Fix for G400 crtc2 blank screen color (#4205, Antti Tapaninen).
- 841. Modify the mga/HALlib support to allow it to be selected at
-      run-time.  This allows a driver built with HALlib to be used with
-      older hardware (like the Millennium, Millennium 2) (#4204,
-      Antii Tapaninen).
- 840. Add config/imake support for Darwin (#4200, Torrey T. Lyons).
- 839. Add a driver for the citron touch screen (#4199, Peter Kunzmann).
- 838. Fix Html man page install problem (Robin Cutshaw).
- 837. Fix transparency problem with blits, add DDC2 for i128-II chipset
-      in i128 driver (Robin Cutshaw).
- 836. Allow loader to be build if HasShm == NO (Marcus Brinkmann).
- 835. Allow the log file to be set in the config files (Stuart Anderson).
- 834. Fix Rage128/Radeon drivers to free correct scratch buffer on LeaveVT
-      (Alan Hourihane).
- 833. Xterm patch #148 (#4213, Thomas Dickey).
- 832. Split ATI driver into two modules in preparation for merging in the
-      r128 and radeon drivers (Marc La France).
- 831. Update the XFree86 -configure code to put the default font path
-      in the Files section of the config file it generates (#4202,
-      Paulo Cesar Pereira de Andrade).
- 830. Add write-combine support for IA-64 (Mark Vojkovich).
-
-XFree86 4.0.1d (27 October 2000)
- 829. Add code to the xf86config utility to get the list of XKB selections
-      from the appropriate XKB files rather than having them hard-coded.
-      Also allow XkbOptions to be set (#4209, Ivan Pascal).
- 828. -
- 827. Xterm patch #147 (#4207, Thomas Dickey).
- 826. Move the initialisation of pScrn->EnableDisableFBAccess into
-      InitOutput(), which fixes an infinite loop problem that can show up
-      on server resets (#4206, Joe Moss).
- 825. Make xf86cfg use the same config file search path as the X server
-      (#4203, Paulo Cesar Pereira de Andrade).
- 824. -
- 823. Fix a bug in the vesa driver when finding the linear address for the
-      card, some compile time warnings, faster code for handling colormap
-      changes, and add DGA support (#4201, Paulo Cesar Pereira de Andrade).
- 822. Fix a typo in the mga driver that causes planemask problems with
-      the PCI version of the G100 (#4198, Antti Tapaninen).
- 821. Add an option to the C&T driver to disable "TMED" (DSTN dithering
-      scheme) (#A.172, Damir Anicic, #4196, 4197, David Bateman).
- 820. Pablo Saratxaga's i18n updates for XFree86 that are used in Mandrake 7.2.
-      Includes various new and fixed xkb files, locale name additions and
-      updates, and new support for various charset encodings (#4195,
-      Pablo Saratxaga).
- 819. Improve Xaw 7 compatibility with version 6 in the form widget geometry
-      management code.  This should fix some problems seen with ghostview
-      (#4194, Paulo Cesar Pereira de Andrade).
- 818. Build fixes for XFree86 on Cygwin (#4193, Suhaib Siddiqi).
- 817. Fix for missing symbol messages in int10 and cirrus driver
-      (Marc La France).
- 816. Detect null windows of PCI-to-PCI bridges (Marc La France).
- 815. Update pciConfigRec's and pciVideoRec's when relocating PCI resources
-      (Marc La France).
- 814. Fix handling of 64-bit PCI bases (Marc La France).
- 813. Fix cursor hide on i128 in multi-head mode (Robin Cutshaw).
- 812. Fix accel on i128 non-primary cards (Robin Cutshaw).
- 811. locale.alias fix for ko_KR.utf8 (#4190, Won-kyu Park).
- 810. Fix incorrect vtSema usage in neomagic driver DPMS code (#4184,
-      Andrew C Aitchison).
- 809. Fix a 1-byte overflow in Xtrans.c (#4182, Aaron Campbell).
- 808. Enable building the loadable server for BSD/OS.
- 807. Fix the following xkbcomp bugs:
-       - 'base group' keyword added to 'whichGroup' possible values list
-       - 'groupsWrap' keyword removed from 'controls' possible values list
-       - fix crash in processing files with unnamed sections
-       - now keep 'per key group adjustment mode' in XKM file
-       - now allow an empty 'key' description to be specified in an
-         xkb_symbols file.
-      (#4170, Ivan Pascal).
- 806. Add a "bcast" flag for mode lines, which is needed to display
-      broadcast resolutions (#4169, Michel Danzer).
- 805. Fix compiler warnings when building the mga driver with or without
-      the Matrox HALlib, add the digital/tv-out/tvstandard/cabletype
-      options, missing files, and some cleanups (#4166, Antti Tapaninen).
- 804. Fix spelling from xvinfo (#4166, Antti Tapaninen).
- 803. Add support to twm for displaying multibyte strings on window titles,
-      and make the twm config file reader 8-bit clean (#4165, 4168, 4180,
-      Tomohiro Kubota).
- 802. Fix a tseng driver problem related to the usable amount of video memory
-      (#4164, A.182, Randy McCaskill).
- 801. Add support for the new Render extension to the nv driver, and
-      turn on fb support by default in the nv driver (#4161, Jarno Paananen).
- 800. Fix a typo that prevents DPS from being built statically (#4160,
-      Juliusz Chroboczek).
- 799. Fix some xkbfile bugs in the .xkb files that it writes
-      (two adjacent commas, no xkb_types section in xkb_layout) (#4159,
-      Ivan Pascal).
- 798. Fix an xkbcomp bug that causes an infinite loop for some error
-      message output (#4158, Ivan Pascal).
- 797. Fix XlcNONE usage in charset description (#4153, Ivan Pascal).
- 796. Fix a bug in XKB group adjustment (#4152, Ivan Pascal).
- 795. Fix some build problems that show up with the SVR4 C compiler
-      (based on #4139, Takaaki Nomura).
- 794. Add two new XKB group switches (Alt+Shift and Menu key) (#4151,
-      Ivan Pascal).
- 793. Fix HTML man page links when the man page suffix has more than one
-      character (#4150, Bruno Haible, A.149, Serguei Ostrovskii).
- 792. Remove the old UTF-1 locale (it's not filesystems safe, deprecated
-      for years, withdrawn from ISO standards, and nobody uses it) (#4147,
-      4149, Bruno Haible).
- 791. Replace multiple stub functions in libXThrStub by only one (#4141,
-      Carlos A. M. dos Santos).
- 790. Fix some build problems that show up with glibc 2.1.3 where ctype.h
-      sometimes (always?) depends on stdlib.h being included (#4134,
-      Kevin Brosius).
- 789. Updates for building on BSD/OS 4.2 on UltraSparc (#4132, Kurt J. Lidl).
- 788. Default to linking the Xfont library into the X server statically
-      (based on #4127, Kurt J. Lidl).
- 787. Update apNetBSD.shar for a kernel mmap interface change (#4124,
-      Bernd Ernesti).
- 786. When the "auto" mouse protocol is specified, do the auto-detection
-      whenever regaining control of the VT (based on #4120, Kazutaka Yokota).
- 785. Change the usage of the "Xinerama" config file option to be consistent
-      with all the other ServerLayout/ServerFlags options, and document it
-      in the XF86Config man page (#4118, Itai Nahshon).
- 784. Add I2C/DDC support to i128 driver (Robin Cutshaw).
- 783. Add non-GXcopy raster op support to cirrus driver (#4178, David Monniaux).
- 782. Use DlLibrary instead of referencing -ldl explicitly in xf86cfg
-      (#4189, Matthieu Herrb).
- 781. Add S3 Virge XVideo support (preliminary) (#4186, Kevin Brosius).
- 780. Fix non-DRI build problem in r128 driver (#4188, Matthieu Herrb).
- 779. Add XLIB for OpenBSD/i386 dependency problem to xvinfo
-      (#4187, Matthieu Herrb).
- 778. Update C&T driver, remove obsolete acceleration and use fb instead
-      of cfb with USE_FB option (#4185, David Bateman).
- 777. Experimental XAA Render support in the MGA driver (Mark Vojkovich).
- 776. Preliminary XAA support for the Render extension (Mark Vojkovich).
- 775. Pass depth/bpp correctly, scan all fbdev devices, misc fbdev fixes.
-      (#4179, Michel Danzer).
- 774. Add generic Vesa driver, fixes for xf86cfg plus changes to parser to
-      reflect xf86cfg changes (#4174,#4175, Paulo Cesar Pereira de Andrade).
- 773. Loader fixes for Alpha. (Jay Estabrook).
- 772. Accelerated TGA2 32bpp for tga driver (Jay Estabrook).
- 771. Allow use of Compaq's Math Library on Alpha (currently for Mesa)
-      (Alan Hourihane).
- 770. Update Tiny-X Xvesa server for standard VGA BIOS modes. (Keith Packard)
- 769. Added ATI Radeon driver, accelerated 2D only (for now) (VA Linux).
- 768. Fix depth24/32 issue in i128 driver (#4176, Andrew C Aitchison).
- 767. On IA-64's, build DRI and drm's if they would be built on IA-32's
-      (David Mosberger).
- 766. Fix xf8_32wid build on Sparc's (Marc La France).
- 765. Fix MMIO macros for Sparc's (David S. Miller, Jakub Jelinek,
-      Marc La France).
- 764. Sparc warning fixes (Marc La France).
- 763. Fix for decoded I/O and memory ranges of certain Sun PCI-to-PCI bridges
-      (David S. Miller, Jakub Jelinek).
- 762. Force ATIAvoidCPIO to YES on Sparc's (Marc La France).
- 761. Minor fix for the ATI driver's printing of MMIO registers
-      (Marc La France).
- 760. Minor fix for sunffb DGA support (Marc La France).
- 759. Remove unnecessary pointer<->long casts in tseng driver (Marc La France).
- 758. Re-align Sparc PCI support with that of other architectures
-      (Marc La France).
- 757. mmap() /dev/fb instead of /dev/mem on Linux/Sparc (Marc La France).
- 756. Fix OS-reported PCI ranges on Linux/Sparc (David S. Miller,
-      Jakub Jelinek).
- 755. Remove a dependency on word size in the determination of PCI resource
-      sizes on Linux (Marc La France).
- 754. Permedia3 updates (#4177, 4183, 4192, Sven Luther).
- 753. Add Xv support to the r128 driver (Stuart Anderson/Vladmir Dergacheb)
- 752. Make VBE module log a message when the BIOS doesn't support any VESA
-      extensions (Marc La France).
- 751. Fix int10 so that it rejects BIOS's that are not aligned on a 512-byte
-      boundary (Marc La France).
- 750. Fix int10 for ISA adapters on Alpha's (Egbert Eich).
- 749. Fix for ATI ISA adapters on Alpha's or with -configure (Marc La France).
- 748. Fix stupid clock probe bug in ATI driver (Marc La France).
- 747. Reorganise ATI driver in preparation for futuure changes
-      (Marc La France).
- 746. Formatting changes to hsync/vrefresh messages (Marc La France).
- 745. Fix spurious free() when using an ISA adapter (Marc La France).
- 744. Preliminary acceleration of the Render extension for Matrox G200/G400
-      (Mark Vojkovich).
- 743. Fix ordering of drawable destruction in client-side DRI (Brian Paul).
- 742. Update Trident's text acceleration routines (Alan Hourihane).
- 741. Destroy unbound window info when a client destroys a context in
-      the client-side DRI driver (Kevin Martin).
- 740. Make ATI driver's detection of Rage 128's more precise (Marc La France).
- 739. Reinstate BIOS checksum verification but make it non-fatal
-      (Marc La France).
- 738. Don't set protection register on older trident chips
-      Fixes Vertical line problem. (Alan Hourihane).
- 737. Add missing symbols for Solaris (incomplete) (Marc La France).
- 736. Add primitive support in xterm for Xft based fonts (Keith Packard)
- 735. Add new Xft library to hook FreeType 2 to Render (Keith Packard)
- 734. Added support for Number Nine I128 chipsets (Robin Cutshaw).
- 733. Added support for softbooting BIOSes on ia64 (Egbert Eich).
- 732. Fixed handling of XtMakeGeometryRequest() to test for parent
-      belonging to subclass of composite class only if the widget
-      itself is managed. This follows the specs more closely.
-      (Keith Packard).
- 731. Changed handling of DDC read in r128 driver. Driver does not
-      fail any more if vbe DDC reads don't succeed (Egbert Eich).
- 730. Fixed infinite loop when referencing the same mnitor section
-      twice when using a Mode Section (Egbert Eich).
- 729. Fixed problem that caused SIGV in xf86GetValidBiosBase() (Egbert Eich).
- 728. Fixed macintosh us keyboard (Olaf Hering).
- 727. Added missing symbols to mga driver (Stefan Dirsch).
- 726. Fixed a ia64 loader problem that caused SIGV when PLT was present
-      (Andreas Schwab).
- 725. Fixed ia64 build rules (Andreas Schwab).
- 724. Fix DGA library to only swap events for DGA 2.0 X servers
- 723. Fix locale parsing code in Xlib and Xt (Matthieu Herrb)
- 722. Fix X Test Suite to work on 800x600 screens (Keith Packard)
- 721. PCI chip ID updates to ATI driver (Marc La France).
- 720. Fix i810 driver for -probe and -configure (Marc La France).
- 719. Change message when default modes are deleted (Marc La France).
- 718. Fix Xinerama byte swapping bug (Marc La France).
- 717. IA-64 and Alpha fixes for pswrap, Mesa, DRI, Xpm, libX11, Xt, Xaw, Xmu,
-      dps, Type1 fonts, cfb24, most output drivers, ELF loader, ramdac module,
-      xf4bpp and xf86cfg (Marc La France).
- 716. Improve IA-64 support by removing a plethora of 32-bit'isms
-      (Marc La France).
- 715. Default HasLinuxDoc to NO (Marc La France).
- 714. Lots of Neomagic driver fixes/enhancements (Mark Vojkovich).
-      - Fix logic bug that kept HW cursor from being used.
-      - Added support for gamma correction and DirectColor visuals.
-      - Fixed some depth/bpp confusion (depth 15 works now).
-      - Convert from cfb to fb.
-      - Fix typo that kept the pixmap cache from being used.
-      - Fixed DGA support.
-      - Disable 8x8 pattern fills because they don't work.
-      - Set correct virtual desktop size limits for 2160 and older chips.
-      - Preliminary man page.
-      - Enable burst modes by default.
-      - Accelerate ImageWrite support for 2097/2160.
- 713. Fix some depth 32 problems in XAA (Mark Vojkovich).
- 712. Add Silken Mouse to Rage 128 driver (Alan Hourihane).
- 711. Resync DRI code/drivers with the DRI CVS (VA Linux).
- 710. Add glxinfo to programs list (#4138, Mark Paton).
- 709. Add LVDS support for SiS and fix copyright messages (#4136, Can-Ru Yeou).
- 708. Fix support for C&T 69030 (#4137, David Bateman).
- 707. Support Cirrus Logic 7548 chip (#4146, David Monniaux).
- 706. Fix typos in Xt man pages (#4156, Carlos Santos).
- 705. Fix libdps bug (#4154, Juliusz Chroboczek).
- 704. Xterm patch #146 (#4144, Thomas Dickey).
- 703. Xterm patch #145 (#4140, Thomas Dickey).
- 702. Fix 32bpp on the Permedia3 (Sven Luther).
- 701. Fix to xterm InsertChar() to handle cases where cur_col + n
-      ends up past the end of the line (Andreas Schwab).
- 700. Added keyboard layouts for PowerMac (Olaf Hering).
- 609. Fixed Macintosh keyboard layouts (Olaf Hering).
- 608. Fixed build when BuildServer defined NO (Egbert Eich).
- 607. Fixes for C&T 69030 (David Bateman).
- 606. Fix for locale setting in Xlib and Xt using getlocale()
-      from glibc5 (Egbert Eich).
- 605. Added handling of i5/686 and k6 compiler defines to Imake.cf
-      (Philipp Thomas).
- 604. Added support for non-English locales in xload (Egbert Eich).
- 603. Fixed memory initialization in Xlib (Vladimir Nadvornik).
- 602. Fixed memory initialization in xdm (Egbert Eich).
- 601. Rudimentary S390 support (Ruediger Oertel, Bernhard Kaindl).
- 600. Enabled support for compressed xpm-files (Stefan Dirsch).
- 599. Added support for Czech querty keyboard (Jan Holesovsky).
-      Some fixes for ia64 ().
- 598. Added CPU to Screen Color expansion to Neomagic driver (Egbert Eich).
- 597. Added support for hotkey display output switch for Neomagic
-      driver (Egbert Eich).
- 596. Add "xvinfo" client for querying Xv adaptors (Mark Vojkovich).
- 595. Fix DGA support in the i810 driver (Mark Vojkovich).
- 594. Enlarge the i810 pixmap cache and have the YUV overlay use that memory
-      rather than allocate dedicated memory for overlay data (Mark Vojkovich).
- 593. Add/fix support for the Rage 128 Mobility chips (M3/M4) (Kevin Martin).
- 592. Fix RegisterResources for multiple heads in glint driver
-      (#4143, Berend Ozceri).
- 591. Update Permedia3's hw cursor to match the Permedia2v's they are
-      the same (Alan Hourihane).
- 590. Fix glint driver to use colorKey rather than fixed value (Alan Hourihane).
- 589. Add ScreenToScreenCopies for Permedia3 (Alan Hourihane).
- 588. Add SilkenMouse support to the i810 driver (Mark Vojkovich).
- 587. Disable DRI acceleration in depth 15 on the i810 because it doesn't
-      work (Mark Vojkovich).
- 586. Fix some ordering problems in the I810ScreenInit that broke the
-      software cursor and backing store (Mark Vojkovich).
- 585. Convert the i810 driver from cfb to fb (Mark Vojkovich).
- 584. Fix some depth/bpp confusion in the i810 driver.  Depth 15 works now
-      (Mark Vojkovich).
- 583. Turn off visual ID matching in Xv (Mark Vojkovich).
- 582. Add the IA-64 ELF loader (Jakub Jelinek).
- 581. Add I420 and UYVY image formats to the i810 driver (#4135, Jonathan Bian).
- 580. Fix an Xaw problem with illegal aliases (#4133, Jakub Jelinek).
- 579. Set $(SHELL) to '/bin/sh -e' on Linux to allow builds/installs stop
-      immediately on errors as on other platforms (Brandon Robinson).
- 578. Update i810 driver for -configure to work (Alan Hourihane).
- 577. Have Xv silently ignore client requests with zero sized primitives
-      (Mark Vojkovich).
- 576. Disable gamma correction and DirectColor visuals on the i810 because
-      they don't work (Mark Vojkovich).
- 575. Fix a bug in XAA's MSBFIRST color expansion support (Mark Vojkovich).
- 574. Allow the default i810 video overlay key to be changed from the
-      XF86Config file (Mark Vojkovich).
- 573. Don't build DRM modules with a non-module Linux kernel (Marc La France).
- 572. Reinstate non-MMIO-only version of ATI driver for Alpha architecture
-      (Marc La France).
- 571. Fix input event queueuing for 64-bit platforms (Marc La France).
- 570. IA-64 changes resulting from a source cross-check with Alpha support
-      for 64-bit dependencies (Marc La France).
- 569. Fix in ATI drivber for DPMS support on panels (Marc La France).
- 568. I810 bugs fixes and enhancements relating to Xv (#4121, 4117, 4123,
-      4128, Jonathan Bian).
-
-XFree86 4.0.1c (28 August 2000)
- 567. Add support to xset for setting the keyboard repeat rate using XKB
-      (A.119, A.126, Stephen Montgomery-Smith).
- 566. Various DRI-related 64-bit/IA-64 fixes (#A.134, David Mosberger).
- 565. Support for multithreaded libraries on NetBSD when used in conjunction
-      with the GNU pth library (#4113, Chris Sekiya).
- 564. Add /usr/pkg/bin to NetBSD's DefaultUserPath (#4112, Bernd Ernesti).
- 563. Add a (Linux-specific) VESA driver for Keith's small X server (#4111,
-      Juliusz Chroboczek).
- 562. Update Hungarian xkb maps (#A.145, Peter Soos).
- 561. Fix ATI driver bug that prevented the disabling of int10, ddc and vbe
-      through options (Marc La France).
- 560. Improve libX11 behaviour when a server doesn't have XKB, allowing
-      XKB-aware XLookupString features with servers without XKB (#4108,
-      Ivan Pascal).
- 559. Fix a bug in xkbcomp'shandling of 'group compat' data (#4107,
-      Ivan Pascal).
- 558. Fix an i810 driver problem doing XvImage with clipping (#4106, 4110,
-      Jonathan Bian).
- 557. Add PCI info for devices found on the G4 Mac (#4105, Matthieu Herrb).
- 556. New XkbOptions for LED selection (#4101, Ivan Pascal).
- 555. Changes to XkbGetControls regarding ax_options (#4100, Ivan Pascal,
-      based on A.125, Stephen Montgomery-Smith).
- 554. Changes to XkbSetControls regarding per_key_repeat (#4099, Ivan Pascal,
-      based on A.124, Stephen Montgomery-Smith).
- 553. Fix MouseKeys acceleration (#4098, Ivan Pascal, based on A.112,
-      Stephen Montgomery-Smith).
- 552. -
- 551. Man page for Xmark (#4097, Richard Braakman).
- 550. Fixes for Macintosh XKB data files (#4094, Ani Joshi).
- 549. Change VarDbDirectory to /var/lib on Linux to comply with FHS 2.1
-      (#4093, Branden Robinson).
- 548. Include <sys/types.h> in agpgart.h (#4091, Branden Robinson).
- 547. Re-add installation of the micro font (#4090, Branden Robinson).
- 546. Fix the rstart/server script generation (#4088, 4089, Branden Robinson).
- 545. Allow mkhtmlindex.sh to work when the shell's -e flag is used (#4087,
-      Branden Robinson).
- 544. Xterm patch #144 (#4109, Thomas Dickey).
- 543. Xterm patch #143 (#4104, Thomas Dickey).
- 542. Xterm patch #142 (#4102, Thomas Dickey).
- 541. Xterm patch #141 (#4085, Thomas Dickey).
- 540. Xterm patch #140 (Thomas Dickey).
- 539. Xaw bug fix (#4084, Paulo Cesar Pereira de Andrade).
- 538. Add support for the NeoMagic NM2230 MagicMedia 256AV+ to the neomagic
-      driver (#4083, Andrew C Aitchison).
- 537. Fix generic Xom to select the same font for measuring text escapement
-      as is used for drawing (#4082, Owen Taylor).
- 536. Resync DRI code/drivers with the DRI CVS (VA Linux).
- 535. Engine polling changes in r128 driver (David Mosberger).
- 534. Fix linear memory mapping in ATI driver (Marc La France).
- 533. Fix endianness problems in the ATI driver when accessing BIOS images
-      (Marc La France).
- 532. Allow building Xptr, Xnest and Xvfb with MakeDllModules
-      (Bill Nottingham).
- 531. Build DRI drivers on IA-64 (David Mosberger, Marc La France).
- 530. Use $(CC) instead of $(LD) when building modules (Bill Nottingham).
- 529. When building with MakeDllModules, generate both dynamic and static
-      libraries (Bill Nottingham, Marc La France).
- 528. Fix detection problem with ramdac for Glint Permedia1's
-      (Alan Hourihane).
- 527. Fix minor symbol resoltion problem in dlopen() loader (Marc La France).
- 526. Alpha changes that fell out of RadHat's IA-64 changes (Marc La France).
- 525. A merge of most of RedHat's IA-64 changes (Keith Fish, Stephane Eranian,
-      Bill Nottingham, Marc La France):
-      - Don't force static server build.
-      - Fix NULL #define'ition for loader server.
-      - Various #if-testing changes.
- 524. Fix the few problems that showed up with the integration of the cygwin
-      support (Suhaib M. Siddiqi).
- 523. ATI driver changes (Marc La France):
-      - Make ATIProbe() and ATIPreInit() optionally more verbose.
-      - Fix compile problem on Alpha's.
-      - Fix Mach64 hardware clipping bug.
-      - Support transparency during Mach64 screen-to-screen copies.
-      - Disable int10 interface in MMIO-only driver version.
-      - Fix determination of MMIO base address for Mach64 GX, CX, CT, ET,
-        VT and GT.
-      - "Wake" up ATI VGA's before probing for them.
-      - Other cosmetic changes.
- 522. Workaround for problems with static during palette changes on the
-      MGA G400 (Mark Vojkovich).
- 521. Share common drm files between Linux and FreeBSD.  This fixes
-      DRI-related build problems on FreeBSD (David Dawes).
- 520. Add Romanian xkb symbols definitions (Cristian Gafton).
- 519. First cut at pushing the AGP GART interface into the os-support
-      layer, with support for Linux and FreeBSD (David Dawes).
- 518. Fix SHM support in Xv that was broken in 4.0.1b (David Dawes)
- 517. Change the Solaris8/x86 keyboard handling to map the raw keycodes to
-      the same keycodes that we use on other platforms, and remove the
-      Solaris8/x86-specific XKB definitions (David Dawes).
- 516. Fix a problem in the fbdev driver where xf86DrvMsg() is called before
-      the necessary pScrn fields have been initialised (Martin Dalecki).
- 515. Fix mga dri bug that caused some rendering corruption when the dri module
-      was loaded (Mark Vojkovich).
-
-XFree86 4.0.1b (11 August 2000)
- 514. Fix the freetype font renderer's handling of True Type Collections
-      (.ttc files) (based on #A.123, timecop at japan.co.jp).
- 513. Add PCI IDs for Silicon Motion, Inc (#A.122, Martin Dalecki).
- 512. Fix a problem with the sequence number not being byte-swapped
-      for the reply to the DPMSCapable request (#A.120, Stephen Tse).
- 511. Fix input driver PreInit funtions to behave as expected by InitInput()
-      (David Dawes).
- 510. Port the spaceorb input driver to 4.x (Guido Heumer).
- 509. Port the Summa input driver to 4.x (#A.116, Peter Schlaile).
- 508. Add a DigitalEdge input driver (#A.116, Peter Schlaile).
- 507. Remove obsolete PC98 code (#4081, Takaaki Nomura).
- 506. Fix PC98 keyboard problems (#4081, Osamu Tomita).
- 505. Imake support for building on Linux/arm32 (#4080, Andrew E. Mileski).
- 504. Fix a problem with restoring the PIXCONF register in the i810 driver
-      (#4078, Jonathan Bian).
- 503. Fix a build problem with the sis dri driver Imakefile (#4076,
-      Takaaki Nomura).
- 502. Add DPMS support to the fbdev driver (#4075, Ani Joshi).
- 501. Add DPMS support to the fbdevhw module (#4074, Ani Joshi).
- 500. Fix VGA detection bug with Mach64 integrated controllers
-      (Marc La France).
- 499. Accelerated line support for the NV driver (Chas Inman, Mark Vojkovich).
- 498. Add GeForce2 support to the NV driver (Chas Inman).
- 497. Integrate Cygwin support.  To compile, this requires Cygwin 1.0 or
-      later with gcc 2.95.2 and Windows NT (#4073, Suhaib M. Siddiqi).
- 496. Add en_GB.ISO8859-15 to locale.dir (David Dawes)
- 495. Build int10 on all platforms and move ATI driver after r128 driver in
-      compiled-in probe lists (Marc La France, Michael Madore).
- 494. Fix bug in parser code: addNewOption2() trunkates option list
-      when an option is added that already exists (Egbert Eich).
- 493. Fix tmp file problem with makedepend scripts (based on report from
-      Alan Cox).
- 492. ATI driver changes (Marc La France):
-      - Fix resource relocation bug.
-      - An attempt at fixing problems reported with Chrontel 8398's.
-      - Workaround for Mobility BIOS bug that affected the driver's ability to
-        restore the mode on server entry.
-      - Fix SEGV that occurs with ATI adapter BIOS'es that do not support some
-        flavour of VBE.
-      - Allow the driver to tolerate the absence of an initialised adapter BIOS
-        image and introduce XF86Config options for the information the driver
-        would otherwise require from it.
-      - Recognise more cases where a DFP panel might be in use.
-      - Fix minor bug that occurred on xf86SetDepthBpp() failures.
-      - Implement a compilation option that produces an MMIO-only version of
-        the driver.  Intended for non-Intel architectures.  See the driver's
-        Imakefile for details.
- 491. fixed handling of backwards compatibility in xvmode (Egbert Eich).
- 490. fixed changing mouse protocol with xf86misc extensions (Egbert Eich).
- 489. added code to sanitize uninitialized PCI config space
-      base addresses (Egbert Eich).
- 488. Changed xf86xv.c to call StopVideo(exit=TRUE) even
-      if StopVideo(exit=FALSE) has already been sent (Egbert Eich).
- 487. fixed core dump in C&T video driver when vt switching
-      Changed C&T video driver to only register a block handler
-      when StopVideo() is called with exit = TRUE (Egbert Eich).
- 486. Fixed Cirrus driver not segfault when termineated while
-      switched away (Egbert Eich).
- 485. Neomagic driver: select sw cursor when screen stretching is
-      enabled (Egbert Eich).
- 484. Neomagic driver: fixed problem with screen to screen copy
-      on 2200 chipsets (Egbert Eich).
- 483. Neomagic driver: fixed 'white screen problem' by implementing
-      a signal save delay routine (Egbert Eich).
- 482. r128 driver: Fixed colormap set problem when server is switched
-      away (Egbert Eich).
- 481. r128 driver Added reinitialization of accel engine after vt switch.
- 480. fixed a fg/bg color problem in SiS driver (Egbert Eich).
- 479. attempt to address some problems with Cyber LCD chipsets in
-      Trident driver (Egbert Eich).
- 478. tseng driver: Implemented correct MMIO handling (Egbert Eich).
- 477. tseng driver: made accel driver multi screen capable (Egbert Eich).
- 476. fixed vgaHW driver to use forground color for readability
-      test of pallette registers. This prevents annoying flashing
-      screen on server start (Egbert Eich).
- 475. added module/font/rgb path parameters to xf86cfg (Egbert Eich).
-
-XFree86 4.0.1a (2 August 2000)
- 474. i810 DRI updates (Jeff Hartmann).
- 473. i810 driver updates (H. J. Lu).
- 472. Save/restore the text mode colourmap for Solaris, to fix a blank
-      screen problem on Solaris 8 after exiting the X server (#A.104,
-      Richard Coley).
- 471. Patch for SuperProbe on Linux with devfs (#A.103, Adam J. Richter).
- 470. Enable BSD/gcc-2.95.2 workaround for BSD/OS 4.2 (#4072, Kurt Lidl).
- 469. Fix a problem with the header symlinks in Xserver/GL/mesa/include/GL
-      (#4071, Matthieu Herrb).
- 468. Finish integrating the SiS DRI driver support (Can-Ru Yeou, SiS).
- 467. Change references to the Mesa source directory in Imakefiles to
-      $(MESASRCDIR) (David Dawes).
- 467. Fix a typo an error in the example code in the XtAppAddInput man page
-      (#4070, Carlos A. M. dos Santos).
- 466. Imstt driver updates, including moving from cfb to fb, fixing fbdev
-      bugs and an accel blit bug, and a general cleanup (#4068, Ani Joshi).
- 465. Fix the installation path of the xditview bitmap (#4067,
-      Carlos A. M. dos Santos).
- 464. Some xf86cfg fixes (#4065, 4068, Paulo Cesar Pereira de Andrade).
- 463. Fix some syntax errors in xkb config files and a size mismatch between
-      two xkbcomp structures that were being masked one to another (#4063,
-      Paulo Cesar Pereira de Andrade).
- 462. Fix a problem where the xkbcomp would read junk data from the server
-      if SmartScheduleTimer() is called while writing to it (#4063,
-      Paulo Cesar Pereira de Andrade).
- 461. Increase MAXVISUALSPERDEPTH further for Xnest so that it will work
-      with GLX (#4062, Harald Koenig).
- 460. Xv overlay support for the Intel i810 chipset (#4061, Jonathan Bian,
-      Matthew J Sottek, Intel).
- 459. Penmount touch panel input driver (#4060, Mayk Langer).
- 458. Fix the r128 SaveScreen function so that it doesn't touch the hardware
-      when switched away (#4056, Benjamin Herrenschmidt).
- 457. Add support to xman for FreeBSD's /etc/manpath.config (#4055,
-      Carlos A M dos Santos).
- 456. Update Xinstall.sh to handle the different behaviour of ldconfig
-      2.1.3 (used on SuSE 6.4) (#4058, Michael Rohleder).
- 455. Fix incorrect use of xf86{En,Dis}ableInterrupts() for ppc
-      (Marc La France).
- 454. Add man pages for pcitweak and scanpci (David Dawes).
- 453. Fix problems with xkb "Internet" keyboard mapping support (David Dawes).
- 452. A few corrections to PIO and MMIO definitions affecting mips, arm32,
-      powerpc architectures and QNX4 (Marc La France).
- 451. Minor int10 and VBE fixups (Marc La France).
- 450. For frequency options, don't clobber the old value before verifying the
-      new one is valid (Marc La France).
- 449. Ensure xf86_ansic.h is always #include'd before compiler.h in code
-      that can be compiled as a module (even for the static server).  Generate
-      an error if not (Marc La France).
- 448. Make linux/int10 module complain when SystemV IPC isn't configured
-      into the kernel (Marc La France).
- 447. Add new offscreen frame bufffer manager functions for managing linear
-      offscreen areas (Mark Vojkovich).
- 446. int10 fixes and remove checksum verification (Marc La France).
- 445. More message formatting changes for DDC (Marc La France).
- 444. Add missing xf86write symbol (Marc La France).
- 443. Fix open(, O_CREAT) emulation (Marc La France).
- 442. Fix Trident Cyber9320 > 8bpp modes (Alan Hourihane).
- 441. Allow memory mapping during probe phase (Marc La France).
- 440. Clean up os-support/dgux/dgux_video.c (Marc La France).
- 439. Fix int10 bug that prevented recognition of video BIOS'es that are part
-      of the system BIOS (Marc La France).
- 438. MGA driver warning fix (Marc La France).
- 437. An update to change 425 (Marc La France).
- 436. More EDID formatting changes (Marc La France).
- 435. Fix bug that caused the relocation of PCI I/O bases assigned to multiples
-      of 0x0100 (but not 0x0400) by the system BIOS (Marc La France).
- 434. Add ATI driver to Alpha, and experimentally, to ppc architectures.  ppc
-      support is still known to be incomplete (Marc La France).
- 433. For IA64, compile everything, except PEX, that is also compiled for IA32
-      (Marc La France).
- 432. Fix Cyrix driver for -configure (Alan Hourihane).
- 431. Fix Glint PM3 memory detect when only 1MB of videoram (Alan Hourihane).
- 430. Fix DAC colour problem and blank out issue in glint driver
-      (Alan Hourihane).
- 429. Add missing clock values to the trident driver (Alan Hourihane).
- 428. Fix Glint driver's SaveScreen function (#4057, Michel Danzer).
- 427. Convert MGA driver to use fb instead of cfb (Mark Vojkovich).
- 426. Rewrite MGA color expansion routines so that pci retries never occur
-      (Mark Vojkovich).
- 425. Make ATI driver tolerate relocation of conflicting resources
-      (Marc La France).
- 424. Make Mach64 FIFO handling available to GATOS (Marc La France).
- 423. Fix bug in Mach64 scissor handling (Marc La France).
- 422. Implement Mark Vojkovich's suggestions in the ATI driver
-      (LSB ordering of monochrome data and host transfer burst modes)
-      (Marc La France).
- 421. More fixes to ATI DSP register calculation (Marc La France).
- 420. ATI DGA support fixes for VGA Wonder capable adapters and the
-      setting of the DGA_CONCURRENT_ACCESS flag (Marc La France).
- 419. Change imake to generate symbols for the GCC version used to
-      compile it (Marc La France).
- 418. Fix xf1bpp/xf4bpp in trident driver and some planemask problems
-      (Alan Hourihane).
-
-XFree86 4.0.1 (1 July 2000)
- 417. Update OpenBSD and NetBSD docs (#4053, Matthieu Herrb).
- 416. Fix segfault when destroying a GLX context (Kevin Martin).
- 415. Doc updates (Georgina Economou).
- 414. Fix some palette and fbdev problems, and add a missing break to the
-      video memory type detection code for the r128 (#4043, Benjamin
-      Herrenschmidt).
-
-XFree86 4.0Z (30 June 2000)
- 413. README updates (Georgina Economou).
- 412. Add some SiS DRI code, but currently disabled because the X server
-      driver level support hasn't been integrated yet (Can-Ru Yeou, SiS).
- 411. Remove the PPC-specific assembly for load/stores from the r128 driver,
-      and use the versions now provided in compiler.h, which are faster (#4051,
-      Ani Joshi).
- 410. Fix the UTF-8 converters so that cut&paste works better in UTF-8 locales
-      (#4049, Bruno Haible).
- 409. Complete the move of glx.h to xc/include/GL, and don't include
-      Xmd.h in glx.h (#4048, Brian Paul).
- 408. Apm driver updates, including fixing 24/32 access, fixing an
-      initialization bug, and some code cleanups (#4047, Loic Grenie).
- 407. Sparc/sbus updates: put sparcProm* in the correct header file, add
-      xf86SbusSetOsHwCursorCmap sbus layer interface, and export symbols for
-      this new interface and the sparcProm* interfaces in the loader (#4046,
-      Jakub Jelinek).
- 406. Add cg3/cg14/tcx/bw2 drivers (sparc), and fix a few bugs in leo and
-      cg6 drivers.  Build these driver, plus the ati and glint drivers
-      on Linux/sparc (#4046, Jakub Jelinek).
- 405. Fix Elite3D detection (#4045, David S. Miller).
- 404. Treat SBUS like ISA when assigning access control records, so now
-      multi-head, Xinerama, etc works with SBUS drivers (#4045,
-      David S. Miller).
- 403. SDK install updates (#4044, David Bateman).
- 402. Work around an odd problem with waitpid() in the code for auto-loading
-      DRM kernel modules on Linux (#4042, Brian Paul).
- 401. Change the imake parameter for BSD/OS from BSD386Architecture to
-      BSDOSArchitecture (#4041, Kurt Lidl).
- 400. Make the neomagic driver recognise the NM2380 chip, and treat it
-      exactly like a NM2360 (#4041, Kurt Lidl).
- 399. Updates for compiling cleanly on BSD/OS 4.0.1, and to make the
-      BSD/OS support less i386-centric (#4041, Kurt Lidl).
- 398. Disable SilkenMouse for the s3virge GX2 to avoid some lockup problems
-      (#4039, Kevin Brosius).
- 397. Some mga DRI updates to improve stability (Jeff Hartmann).
- 396. Fix some DRI offscreen memory calculations in the Matrox driver
-      (Mark Vojkovich).
- 395. IA64 workarounds - should compile and run right out of the box now
-      (Mark Vojkovich).
- 394. LBX, X-TrueType and Xnest warning fixes (Marc La France).
- 393. Remove unused xf86MapDisplay() and xf86UnMapDisplay() os-support entry
-      points (Marc La France).
-
-XFree86 4.0g (26 June 2000)
- 392. Fix a missing -I in sunffb/Imakefile (#4038, David S. Miller).
- 391. Some -misc-fixed-* BDF font updates, primarily expanding the 7x13
-      set to include the same 8-bit variants as the 6x13 set, including
-      a new oblique/italic version (#4037, Markus Kuhn).
- 390. Fix an endless loop in the UTF-8 converters (#4036, Bruno Haible).
- 389. Straighten out xfindproxy exit codes to match success/failer status;
-      also change one instance where error message was printed to stdout
-      (#4035, Huver).
- 388. With LBX enabled, the X server wasn't checking the proxy connection,
-      and so fails the connection request without calling InvalidHost()
-      (#4033, Huver).
- 387. xfwp doProcessWritables() closes connection, but then proceeds
-      to reset client fd via FD_SET() (#4031, Huver).
- 386. Don't build a non-DRI libOSMesa (#4029, Takaaki Nomura).
- 385. Add generic DGA support to SiS driver (Alan Hourihane).
- 384. Add more support structure for Alpha/DRI (not enabled yet though)
-      (Alan Hourihane).
- 383. Fix glXDestroyContext bug that caused Q3A to use old clip rect info
-      when opening a new window (Kevin Martin).
- 382. Fix R128 3D driver clear problem which caused R128Pro cards to lock
-      up, and fix dword count on ring-based vertex buffer code for PCI
-      R128 cards (Gareth Hughes).
- 381. Possible fix for a problem introduced with item 332 that resulted
-      in the first screen's config file data being used for all screens
-      (Mark Vojkovich, David Dawes).
- 380. Add an imake parameter NothingOutsideProjectRoot that turns off
-      installing links and config files, etc, outside of ProjectRoot
-      (David Dawes).
- 379. Possible fix a problem with 'make install' on Linux when there is
-      already a /usr/include/GL directory (David Dawes).
- 378. Fix a DGA-related crash when using multiple input devices with the
-      DGA extension disabled (Matthieu Herrb).
-
-XFree86 4.0f (23 June 2000)
- 377. Suppress the use of a temporary directory to build man pages on
-      OpenBSD, which fixes problems with some external programs (#4028,
-      Matthieu Herrb).
- 376. Allow some linux/mips settings in linux.cf to be overriden (#4026,
-      Guido Guenther).
- 375. Synchronize the pointer state before checking it in xf86CheckButton()
-      (Paulo Cesar Pereira de Andrade).
- 374. s3virge driver fixes for noise and console corruptionn on the GX2 and
-      MX (but they're commented out for the MX because it hasn't been tested
-      yet) (#4027, Kevin Brosius).
- 373. Fixes for lib/GL Imakefiles (Marc La France).
- 372. Update DRI drivers sunffb,mga,i810,glint,r128,tdfx to check for
-      DRIQueryVersion, overcomes an older libdri issue (Alan Hourihane).
- 371. Change tdfx driver to use fb instead of cfb (Alan Hourihane).
- 370. Make using libpthread optional for OpenBSD 2.7.
- 369. Fix a problem when calling XF86VidModeSwitchMode() when the switched
-      screen is different from the one that has the pointer (#4024,
-      Paulo Cesar Pereira de Andrade).
- 368. Bindist files for Linux/mips (#4023, Guido Guenther).
- 367. Allow XFree86 to compile on NetBSD-current and 1.5_ALPHA, which
-      no longer use the pcvt console, but have a compatibility mode for it
-      in wscons (#4021, Bernd Ernesti).
- 366. Add support for the iso8859-13 charset to Xlib (#4020, Bruno Haible).
- 365. Add ISO-8859-13 support to the UTF-8 converters, which is needed for
-      Lithuanian UTF-8 locales (#4019, Bruno Haible).
- 364. Fix three bugs in the UTF-8 converters:
-       - In an UTF-8 locale, keyboard input coming in as UTF-8 would not be
-         accepted.
-       - Incorrect handling of the "end of string" and "invalid byte sequence"
-         situations.
-       - A bug on platforms with sizeof(wchar_t) != sizeof(int).
-      (#4018, Bruno Haible).
- 363. Enable building DRI support for FreeBSD 4.1 and higher.
- 362. Don't try to use kldload() on FreeBSD versions prior to 3.0 (#4016,
-      Takaaki Nomura).
- 361. Some sunffb cleanups (#4015, David S. Miller).
- 360. Add DRI drawable index callback (#4015, David S. Miller).
- 359. Fix -configure option to print out fatal message and abort gracefully
-      when pci data isn't entered into xf86PciInfo.h (Alan Hourihane).
- 358. Add generic DGA support to NeoMagic (not tested) (Alan Hourihane).
- 357. Add generic DGA support to i810 (not tested) (Alan Hourihane).
- 356. Fix GCC 2.96 complaints in big font extension and imstt driver
-      (Steven King).
- 355. Fix remaining DRI III compile glitches (Marc La France).
- 354. Fix long standing bug with 3Dfx driver when DRI module isn't loaded.
-      It complained about unresolved symbol called after 'Textures memory'
-      output (Alan Hourihane).
-
-XFree86 4.0e (20 June 2000)
- 353. Fix a couple of acceleration problems in glint driver (Alan Hourihane).
- 352. Don't attempt to build the Sparc DRI drivers on ix86, and vice versa
-      (David Dawes).
- 351. Fix a lib/GL build problem when the DRI isn't enabled (#4014,
-      Nicholas J Brealey).
- 350. Fix location of dri module links in the xc/exports directory of the
-      build tree.
- 349. Replace LoaderSymbol() with xf86LoaderCheckSymbol() in drivers.
- 348. Disable SmartScheduler on LynxOS 3.1 (#4013, Thomas Mueller).
- 347. Update Japanese PC98 docs (#4012, Isao Ohishi, Takaaki Nomura).
- 346. Add some S3/Diamond PCI IDs (#4011, Werner Leeb).
- 345. Update sbus support for recent bus infrastructure changes
-      (David S. Miller)
- 344. Check for NULL pointers from item 332 (Alan Hourihane).
- 343. Xf86cfg updates (#4010, Paulo Cesar Pereira de Andrade).
- 342. Fix threads support in OpenBSD 2.7 and above (#4006, 4009,
-      Carlos A M dos Santos).
- 341. UCS misc BDF fonts updates, including new oblique/italic versions
-      (6x13O, 8x13O), Korean font covering all Hangul symbols (18x18ko)
-      and many additional autogenerated ISO 8859 fonts to cover with
-      6x13 and 8x13 all the locale encodings suggested by the Li18nux
-      specification (#4007, Markus Kuhn).
- 340. Add Linux/Sparc support for the DRI, and a DRI driver for Sun
-      Creator3D hardware (#4004).
- 339. Fix DRI BusIDString length usage (#4003, David S. Miller).
- 338. Xterm patch #139 (#4002, Thomas Dickey).
- 337. Make the use of GlxDefines for libGL independent of BuildXF86DRI (#4001,
-      David S. Miller).
- 336. Fix i810 build warnings (#4000, Jarno Paananen).
- 335. Fix an i810 build problem (Keith Whitwell, #4000, Jarno Paananen).
- 334. Fix a multihead problem with the mga driver (Mark Vojkovich).
- 333. Add support to the i810 driver for the i815 (Keith Whitwell).
- 332. Add infrastructure support for cards with multiple CRTCs (screens)
-      per accelerator (PCI entity) (Jeff Hartmann and David Dawes).
- 331. Fix some Mesa problems (Brian Paul).
- 330. Rework patch for mapping drmAddMap on Alpha platforms
-      (Bruce Stockwell/Compaq, Alan Hourihane).
- 329. Don't build Debuggable Library on Linux for the release (Alan Hourihane).
- 328. Don't build lib/GL/mesa/src/X86 on Alpha systems (Alan Hourihane).
- 327. xdm warning fix (Marc La France).
- 326. Make x11perf die gracefully when display cannot be opened
-      (Marc La France).
- 325. Fix rendition driver compile glitch (Marc La France).
- 324. #ifdef out glitch in glint driver (Marc La France).
- 323. Preliminary DGA support in ATI driver (Marc La France).
- 322. Minor update to DESIGN and Status documents (Marc La France).
- 321. Fix DGA's reporting of vertical refresh rates to clients
-      (Marc La France).
- 320. Make driver-provided Sync(), SetViewport() and GetViewport() DGA
-      callbacks optional (Marc La France).
- 319. Fix XKB compile glitch (Marc La France).
- 318. Make imstt driver compile (Marc La France).
-
-XFree86 4.0d (16 June 2000)
- 317. Fix a typo in the xfree86 xkb keycodes file (#3999, Matthieu Herrb).
- 316. Fix some build problems when the DRI is not enabled (#3998,
-      Matthieu Herrb).
- 315. Add missing Linux/mips config changes (#3997, Guido Guenther).
- 314. Fix for libICE DOS (Keith Packard).
- 313. FontInfo.c (lib/X11) needs to be built with the bigfont defines (#3996,
-      Paulo Cesar Pereira de Andrade).
- 312. Disable the smart scheduler for SVR4.0 (based on #3916, Takaaki Nomura).
- 311. Add a check for PS/2 mice on Linux for the X server's -configure
-      option (#3991, Paulo Cesar Pereira de Andrade).
- 310. Fix a problem mouse driver button flush was causing with Xaw menus
-      (#3991, Paulo Cesar Pereira de Andrade, David Dawes).
- 309. Modify scanpci to print out card/subsys information, and add a few
-      more entries to the pci data (David Dawes).
- 308. Fix r128_cursor.c build problem for big-endian machines (#3989,
-      Thomas Mueller, #3994, Ani Joshi).
- 307. Update LynxOS docs (#3989, Thomas Mueller).
- 306. Add a few PPC compiler internal symbols to the loader's export list
-      (#3989, Thomas Mueller).
- 305. Add crypt support to xdm for LynxOS (#3989, Thomas Mueller).
- 304. Add preliminary build support for LynxOS 3.1.0 (#3989, Thomas Mueller).
- 303. Add keysyms to complete the set for the Compaq SK2850 keyboard and
-      the Microsoft Natural Keyboard Pro (David Dawes).
- 302. Add new keysyms for PDAs (#3985, 3987, 3988, Jim Gettys).
- 301. Xterm patch #138 (#3986, Thomas Dickey).
- 300. DRI megapatch III.  This includes DRI enhancements, 3dfx fixes and
-      updates, updates Mesa to the latest version, adds Intel i810, Matrox
-      G200/G400, ATI Rage 128 and 3dfx Voodoo5 3D support, adds ATI Rage
-      Mobility 2D support (disabled by default).  (Precision Insight and
-      VA Linux Systems).
- 299. Add a function to the X server that performs the same checks on
-      command line arguments and environment variables as the Xwrapper
-      from 3.3.x.  This function is called very early from main()
-      (David Dawes).
- 298. Fix for some Xlib problems that can show up when connecting to
-      a rogue server (Keith Packard, with analysis by Chris Evans).
- 297. Increase MAXVISUALSPERDEPTH to 64 for Xnest so that it can handle
-      GLX's visuals.
- 296. Add a Macedonian xkb symbols file (#A.96, Zlatko Trajceski).
- 295. Fix a buffer overflow with the -xkbmap X server flag (#A.91,
-      Trevor Johnson).
- 294. Fix a rectangle fill problem that shows up with an AGP SiS 6326
-      (A.81, A.83, Milivoj Savin).
- 293. Fix a problem in xcalc when the current locale uses a character
-      other than "." for the decimal point (#A.63, Stanislav Brabec).
- 292. Allow some more parameters in linux.cf and lnxLib.rules to be
-      redefined (#A.60, Stanislav Brabec).
- 291. Fix a typo in lib/Xss/Imakefile (#A.59, Stanislav Brabec).
- 290. Fix an xfs crash that shows up when many clients connect (#A.48,
-      Remy Card).
- 289. Fix some man page build problems (#A.43, Ian Collier).
- 288. Fix xedit core dump (in Xaw) on Solaris, related to the bsearch()
-      usage (#A.42, Ian Collier).
- 287. Add xkb mappings for the keycodes generated by the SysRq and Break
-      keys, which are different from the keycodes generated when used as
-      PrtScn and Pause (#A.29, Eric W. Biederman).
- 286. Fix problems when building on Solaris 2.6/sparc and Irix 6.5.5
-      (#A.21, A.28, Sullivan N. Beck).
- 285. Fix a core dump in fstobdf when using 16 bit fonts (#A.25,
-      Morten Storgaard Nielsen).
- 284. Clean up some of the messages printed by the neomagic driver
-      (David Dawes).
- 283. Add support for the 2360 (256ZX) to the neomagic driver, and enable
-      acceleration at depth 24 for this chip (#A.23, Gregory M Pomerantz).
- 282. Adjust the bigfont extension to not use SHM segments for fonts with
-      a small glyph metric size, and fix a build problem on systems without
-      shared memory (#3984, Bruno Haible).
- 281. Status doc updates (#A.9, Chris Smith, A.80, Ferenc Acs).
- 280. Fix memleak warning when doing realloc(NULL, size) (#A.7,
-      Charles G Waldman).
- 279. xf86cfg fixes (#3983, Paulo Cesar Pereira de Andrade).
- 278. Add SilkenMouse support to the s3virge driver (#3982, Kevin Brosius).
- 277. Update Xv support in the glint driver and add the XvPutImage function
-      for the Permedia 2 (#3926, Michael Schimek).
-
-XFree86 4.0c (13 June 2000)
- 276. Xterm patch #137 (#3976, Thomas Dickey).
- 275. Doc update for the chips driver (#3981, David Bateman).
- 274. Fix some problems building with the SDK (#3981, David Bateman).
- 273. Fix comments for the address matching algorithm in
-      XauGetAuthByAddr() and XauGetBestAuthByAddr() (Keith Packard, based on
-      #3939, Peter Runestig).
- 272. Handle setting SharedLibXdmGreet in the OS imake config files rather
-      than having a complicated expression in the xdm Imakefile (#3980,
-      Matthieu Herrb).
- 271. xdm updates from the OpenBSD team, including:
-       - support for Kerberos IV authentication [enabled only in OpenBSD.cf,
-         but could be enabled for other systems by setting HasdKrbIV]
-       - use the arc4random(4) random number generator on OpenBSD
-       - add a new resource "allowRootLogin", which can be used to disable
-         root logins through xdm
-       - log failed logins to syslogd [OpenBSD only, but could be enabled on
-         other systems]
-       - verify that the shell is valid using /etc/shells [OpenBSD only]
-       - verify that the account hasn't expired [OpenBSD only, but could be
-         enabled on other system that use the same passwd aging structure]
-      (#3948, 3980, OpenBSD team, Matthieu Herrb).
- 270. Big/little endian MMIO_XX macros for ppc, and also PIO macros check
-      that IOBase is mmapped before doing any accesses (#3979,
-      Kostas Gewrgiou).
- 269. Preliminary driver for Integrated Micro Solutions TwinTurbo128
-      (imstt) (#3978, Ani Joshi).
- 268. Fix broken czsk keymaps, and let the user directly select either
-      Czech or Slovak keyboard in xf86config (#3975, Kamil Toman).
- 267. Implement DGA2 support with depth switching for ATI Rage 128 cards
-      (#3974, Ove Kaaven).
- 266. Recent versions of FreeBSD have the xpg4 library folded into libc.
- 265. xf86cfg updates (#3973, Paulo Cesar Pereira de Andrade).
- 264. Xaw bug fixes (#3973, Paulo Cesar Pereira de Andrade).
- 263. Fix M-d and M-h key bindings in the Xaw Text widget (#A.87,
-      Jonathan Kamens).
- 262. Fix some Xaw memory errors (#A.79, Jonathan Kamens).
- 261. Xman fixes/updates, including:
-       - Fix a core dump in fclose()
-       - Append the default search path when MANPATH ends in a ':'
-       - Understand man pages that have a single line with a .so directive
-      (#3969, 3973, Paulo Cesar Pereira de Andrade).
- 260. Resync nls Compose file with 3.3.6 (#3964, 3973,
-      Paulo Cesar Pereira de Andrade).
- 259. Fix moving the pointer between screens when using MouseKeys, and fix
-      some bugs in the xkbfile code (#3963, 3973,
-      Paulo Cesar Pereira de Andrade).
- 258. Fix XC-SECURITY security bug (#3954, 3973,
-      Paulo Cesar Pereira de Andrade).
- 257. Bigfont bug fix, which stops cvsup crashing (#3954, 3973,
-      Paulo Cesar Pereira de Andrade).
- 256. Replace some bitswapping assembler code in XAA with faster C code
-      (Mark Vojkovich).
- 255. Rendition driver updates, including:
-       - add DirectColor support
-       - add SilkenMouse support
-       - documentation updates
-       - some code cleanups
-      (#3972, Dejan Ilic).
- 254. For v4l: don't advertise the XV_VOLUME attr if we're only going to
-      return BadMatch on use (#3968, David Woodhouse).
- 253. Modify the I2C delay routine to use xf86getsecs (gettimeofday) instead
-      of an uncalibrated loop (#3967, Andrew Aitchison).
- 252. Add some PCI ids to xf86PciInfo.h, and include some instructions
-      about how to add new PCI data (#3966, Kevin Brosius).
- 251. Update documentation for Japanese PC98 (#3965, Satoshi Kimura,
-      Akio Morita, Takaaki Nomura).
- 250. XIM patch (imInt.c) (#3962, Fuminori Hirayama).
- 249. Xterm patch #136 (#3960, Thomas Dickey).
- 248. Fix Imake.rules for building on Solaris 7 with gcc-2.95.2 (#3958,
-      Nicholas Brealey).
- 247. Add basic support for the Linux/mips and mipsel architecture (#3957,
-      3970, Guido Guenther).
- 246. Disable reading the BIOS in the int10 code for Japanese PC98 (#3959,
-      Isao Ohishi).
- 245. Add a "NoPciBurst" option to the Trident drive for Japanese PC98
-      cards with the TGUi968x chip (#3955, Akio Morita).
- 244. Xterm patch #135 (#3951, Thomas Dickey).
- 243. Fbdev driver fix (#3953, Ani Joshi).
- 242. Xterm patch #134 (#3949, Thomas Dickey).
- 241. Import the mktemp() usage fixes for imake from the 3.3.x branch
-      (#3947, Matthieu Herrb).
- 240. Rman updates, including:
-       - minor reformating (make { and } match)
-       - fix logic for parsing comments in man pages, which allows the
-         copyrights to appear in the output html
-       - a few changes based on weblint and tidy
-      (#3946, Thomas Dickey).
- 239. Fix incorrect type for vgaIOBase in the neomagic driver (#3944,
-      Ani Joshi).
- 238. Fix an Xlib build problem when the big-font extension is disabled
-      (#3945, Mutsumi Ishikawa).
- 237. Xv v4l attribute handling bug fix (#3928, Gerd Knorr).
- 236. Fix some problems with the locale-dependent input processing in Xlib
-      by:
-       - removing unneeded to/from CTEXT conversion for characters coming
-         from keyboard input
-       - move "locale_code" and "keyboard charset" searching to the
-         initialization step (XIM creation)
-       - Fix some inconsistencies between memory allocation and freeing
-         in XIM objects (imLcIm.c imThaiIm.c)
-      (#3927, Ivan Pascal).
- 235. Update support for Appian J2000 board with dual PM3 chips, and
-      add partial acceleration (#3977, Sven Luther).
- 234. Only claim other devices on the same card when gamma chip is used
-      in the glint driver (Alan Hourihane).
- 233. Separate offscreen memory manager API from implementation to facilitate
-      driver replacement of the default manager (Mark Vojkovich).
- 232. Add Option "TexturedVideo" to have the Matrox driver optionally use
-      YUV textures instead of the video overlay for XvImage support
-      (Mark Vojkovich).
- 232. Add Xv functions for allocating/freeing XvVideoAdaptorRecs to shield
-      drivers from structure size changes (Mark Vojkovich).
- 231. Have XDGAQueryModes return no modes as being available instead of an
-      error when DGA is not supported on the particular screen (Mark Vojkovich).
- 230. Fix xdm when PAM is not available (Marc La France).
- 229. Fix int10 bug on non-PC platforms (Marc La France).
- 228. Finish prototyping of DPS libraries.  Fix argument promotions in
-      pswrap.  Fix yytext portability problem.  Fix non-standard format
-      in pswrap (#3941, #3942, Nomura Takaaki, Thomas Dickey).
- 227. Fixed FP chipset handling in Trident driver. LCD-CRT switching
-      should work now (Egbert Eich).
- 226. Modified device detection on PCI bus to handle Host-to-PCI bridges
-      better (Egbert Eich).
- 225. Fix i810 driver so it advertises 32bpp pixmaps in depth 24 like the
-      rest of the drivers do (Mark Vojkovich).
- 224. Added a call ioperm() to to allow vm86 to execute in/out calls
-      directly to avoid problems with certain notebook bioses (Egbert Eich).
- 223. Fixed mouse driver to flush pending button press events on
-      protocol change (Egbert Eich).
- 222. Fixed DDC support and sync flags handling in trident driver
-      (Egbert Eich).
- 221. Added PAM support to xdm, ANSIfied prototypes (Werner Fink).
- 220. Added ServerFlag to force the use of OS PCI config space
-      support (Egbert Eich).
- 219. Fix Xv DDX stop overlaid stills/images when XvStopVideo() is called
-      (Mark Vojkovich).
- 218. Have the Xv DDX send clients exposure events when windows containing
-      overlaid data, which isn't actually in the framebuffer, are moved
-      (Mark Vojkovich).
- 217. Fix ordering of calling DDC probe in VBE to respect NoDDC options
-      (Alan Hourihane).
- 216. Fix VBE initialization in trident driver for DDC (Alan Hourihane).
- 215. Fix a typo in the glint driver (#3943, Michael Schimek).
- 214. Fix multithread bug in Xlib big font support (Mark Vojkovich).
- 213. Fix a window class initialization problem in Xinerama (Mark Vojkovich).
- 212. Fix some multithreading related problems in the Xv client library
-      (Mark Vojkovich).
-
-XFree86 4.0b (23 May 2000)
- 211. Add support to the sunffb driver for multiple visuals on the same screen,
-      overlays, double buffering and some other niceties (#3938,
-      David S. Miller, Jakub Jelinek).
- 210. Make the modifier setting on Sun keyboards match what XFree86 expects
-      (#3937, Jakub Jelinek).
- 209. Add unaccelerated support for the Sun CG6 (#3935, Jakub Jelinek).
- 208. Make the -configure option work with SBUS/UPA drivers, fix some
-      bugs in the sbus layer, add support for ioctl based colormap setting,
-      and fix leds on Sun keyboards (#3934, Jakub Jelinek).
- 207. Fix a parallel build problem in lib/dps (#3932, H. J. Lu).
- 206. Fix some build problems that show up  with LynxOS x86 and PowerPC (#3929,
-      Thomas Mueller).
- 205. Fix documentation files for the mutouch and elographics drivers,
-      and build these drivers by default (#3935, Patrick Lecoanet).
- 204. Make the dga2 library use the device name provide by the driver rather
-      than always using the default (3924, David S. Miller).
- 203. Fix a problem with the internal xalloc that shows up on Sparc (#3923,
-      David S. Miller).
- 202. Fix a GLX visual problem that causes a crash at server shutdown
-      (#3922, David S. Miller).
- 201. 8+32 framebuffer for hardware that uses window IDs (David S. Miller).
- 200. Fix a memory allocation in lbxproxy that can cause it to crash at
-      startup (#3921, Peter Runestig, #A.46, Rob Clark).
- 199. Fix a problem with imake's handling of DefaultGccIncludeDir (#3920,
-      Peter Runestig, #A.64, Stanislav Brabec).
- 198. lib/X11/imInt.c fix from the OpenMotif release notes (#3919).
- 197. Prototype and fix almost all compiler warnings fot he dps library
-      and the related pswrap program (#3912, Thomas Dickey).
- 196. Fix for x-tt font cache corruption (#3911, H. J. Lu).
- 195. Ansi prototypes for the lbxusilt library and Xserver/lbx directory
-      (#3908, Matthieu Herrb).
- 194. Fix some bugs in the cirrus lg driver (#3900, Itai Nahshon).
- 193. Accelerated driver for Sun Leo/ZX cards (#3899, 3936, Jakub Jelinek).
- 192. Fully accelerated driver for Sun FFB and AFB chips (#3898,
-      Jakub Jelinek).
- 191. Generic SBUS and UPA support for XFree86 (#3897, Jakub Jelinek).
- 190. Fix building xf86cfg on systems where libxpm isn't linked in
-      implicitly (#3903, Matthieu Herrb).
- 189. Update the fbdevhw stubs for an interface change (#3902, Matthieu Herrb,
-      #3910, Bernd Ernesti).
- 188. Simplify the platform defines in servermd.h to make them more hardware
-      dependent than OS dependent (#3913, Kurt Lidl).
- 187. Fix a bug in the search/replace dialog in the Xaw text widget (#3896,
-      Paulo Cesar Pereira de Andrade).
- 186. Xterm patch #133 (#3894, Thomas Dickey).
- 185. Fixes for the Xaw TipWidget (#3893, Paulo Cesar Pereira de Andrade).
- 184. Change CTEXT from/to converters to allow processing of "C1" codes
-      (0x80-0x9f) as ordinary characters for "non-standard" encodings
-      (such as UTF-8) (#3891, Ivan Pascal).
- 183. Add "software" per-key auto-repeat disabling (#3889, Ivan Pascal).
- 182. Refix fog.c build problem on Alpha (#3888, Dave Gilbert).
- 181. Add some new things for the VidMode interface in xf86cfg (#3877,
-      Paulo Cesar Pereira de Andrade).
- 180. Rework most of the look and feel of xf86cfg, and fix some bugs (#3877,
-      3886, 3892, Paulo Cesar Pereira de Andrade).
- 179. Add a ProjectRoot to Xaw rather than hard-coding it, so that the
-      pixmap code can find pixmaps and bitmaps on non-standard installations
-      (#3877, Paulo Cesar Pereira de Andrade).
- 178. Fix a bug in the DRI section parsing (David Dawes).
- 177. Add support for building shared libraries on BSD/OS (#3876, Kurt Lidl).
- 176. Add imake support for automatically determining the version for BSD/OS,
-      and update bsdi.cf for the features relevant to the different versions
-      (#3876, 3940, Kurt Lidl).
- 175. Xterm patch #132 (#3874, Thomas Dickey).
- 174. Fix rman-related build problems when building external applications
-      (#3869, Matthieu Herrb, #3890, H. J. Lu).
- 173. Fix a typo in OpenBSD.cf (#3867, Matthieu Herrb).
- 172. Fix some build warnings (#3864, Ani Joshi).
- 171. Fix some BSDI typos in hw/sun (#3862, Kurt Lidl).
- 170. Fix r128 palette save/restore when VT switching (#3861, Ani Joshi).
- 169. Disable the X server's internal malloc by default (#3860, Keith Packard).
- 168. Make xdpyinfo and xf86dga fail gracefully when DGA is not enabled
-      in the driver, but the extension is enabled (#3870, Andrew Aitchison).
- 167. Fix too many xfree calls in lbxproxy (#3907, Matthieu Herrb).
- 166. Fix uninitialized fd_set mask in lbxproxy (#3906, Matthieu Herrb).
- 165. Fix typo when printing HSync frequency when not a range
-      (#3895, Andrew Aitchison).
- 164. Fix a window unmapping bug in the mioverlay code (Mark Vojkovich).
- 163. Attempt to improve memory detection reliability in the Matrox driver
-      (Mark Vojkovich).
- 162. Fix possible SEGV in generic int10 module (Marc La France).
- 161. Fix *BSD aperture driver to allow for int10 (Bernd Ernesti,
-      Marc La France).
- 160. Fix vesafb restore problem in ATI driver (Marc La France).
- 159. Fix a few more compilation glitches (Marc La France).
- 158. Fix DRM for gamma for single and dual MX chips (Alan Hourihane).
- 157. Fix Mesa for single and dual MX chips (Alan Hourihane).
- 156. Fix Mesa for multiple screen widths (Alan Hourihane).
- 155. Add DGA support to the glint driver.
-      - Fix initialization of DRI when using single or dual MX's.
-      - Fix register resources.
-      - Turn on more acceleration for DualMX boards.
-      - Fix DualMX boards displaywidth problems at >640 widths.
-      - Fix depth15/16 for PM2v and PM3 chipsets (Alan Hourihane).
- 154. Use MMIO_xx macros in glint driver (#3904, Michel Danzer).
- 153. Fix lib/GL/mesa/src/X86/Imakefile for m4 (Alan Hourihane).
- 152. Fix m4 rules in Imake.tmpl (Alan Hourihane).
- 151. ATI documentation update (Marc La France).
- 150. Disable debugging messages from XF86-Misc extension (Marc La France).
- 149. Ensure XAA always respects user options that disable subsets of its
-      primitives (Marc La France).
- 148. Bug fix in XAA's CPU-to-screen colour expansion (Marc La France).
- 147. Finish off XAA's CPU-to-screen colour expansion for 24bpp
-      (Marc La France).
- 146. When matching adapters to XF86Config sections, the ATI driver will now
-      look at the primary adapter before any other non-primary PCI adapters
-      (Marc La France).
- 145. Ensure Mach64 acceleration is disabled when using the VGA CRTC
-      (Marc La France).
- 144. Set a Mach64's scaler/overlay clock divider in preparation for a GATOS
-      merge (Marc La France).
- 143. Make VBE use its own option instead of DDC's (a consequence of
-      re-entrancy) (Marc La France).
- 142. Make option processing re-entrant in DDC, int10, VBE and XAA modules, and
-      in the common layer (Marc La France).
- 141. Add Permedia3 support to the glint driver (Sven Luther).
- 140. Fix XvPutImage in the client libs so that it can use the BIG-REQUESTS
-      extension (Mark Vojkovich).
- 139. Fixed xf4bpp for devPrivates in PixmapRec. (Egbert Eich).
- 138. Fixed laguna driver to map FB after the video RAM size is known
-      (Egbert Eich).
- 137. Fixed xdm to give up to respawn Xservers if the server crashes
-      more than once within 60 seconds (Egbert Eich).
- 136. Added VGA default clock option to generic driver (Egbert Eich).
- 135. Fixed CyberShadow option in Trident driver (Egbert Eich).
- 134. Fix bug where the cursor is not put back after a failed DGA mode
-      initialization attempt (Mark Vojkovich).
- 133. Add a missing symbol "AllocateColormapPrivateIndex" (Mark Vojkovich).
- 132. Remove Intel 440BX-specific resources from os-support layer
-      (Marc La France).
- 131. Change ATI driver to mark VGA resources as unused in operating state when
-      appropriate (Marc La France).
- 130. Fix bug in the generation of default screen layout (Marc La France).
- 129. Include all resource attributes when printing them (Marc La France).
- 128. Fix compiled-in input driver list (Marc La France).
- 127. Allow driver access to resource manipulation functions (Marc La France).
- 126. Fix a DGA 2.0 crash that happened when bogus mode numbers were sent
-      by the client (Lionel Ulmer).
- 125. Make a recent shm pixmap fix Xinerama aware (Mark Vojkovich).
- 124. Fix mode setting bug in ATI driver (Marc La France).
- 123. Add int10, DDC & VBE support to ATI driver
-      (Andrew C Aitchison, Marc La France).
- 122. Allow driver to supply DDC module to VBE (Marc La France).
- 121. Attempt to fix cyrix driver (untested). (Egbert Eich)
- 120. Added support for 'inactive' devices. (Egbert Eich)
- 119. Fixed xf86misc extensions. (Egbert Eich)
- 118. Fixed design of xf86SetAccessFuncs(). Now all old access funcs
-      are returned if the driver asks for them not only the one
-      that is used in OPERATING state. (Egbert Eich)
- 117. Added a function LoadDrvSubModule() to allow drivers to load
-      sub modules before a screen is allocated. (Egbert Eich)
- 116. Fixed lndir to handle trailing '/' on path correctly. (Egbert Eich)
- 115. Undefined i486/i586/i686 in Imake.cf. cpp might predefine
-      them which might cause undesirable results. (Egbert Eich)
- 114. Updated x86emu. (Egbert Eich)
- 113. Fixed problems with xf86RegisterResources() if preregistered
-      resources are not marked ResBios. Identical ranges are not considered
-      to conflict with each other. (Egbert Eich)
- 112. Improved DDC information printout. (Egbert Eich)
- 111. Added NODDC options to vbe. (Egbert Eich)
- 110. Added fixes for Lynx OS. (Egbert Eich)
-      Changed int10 code to always map/allocate entire 1Meg. (Egbert Eich)
- 109. Let int10 code try harder to locate a video bios to work
-      around some system bios bugs. (Holger Veit, Egbert Eich)
- 108. Modified fbdevProbe() to return the name string representing
-      the chipset. (Egbert Eich)
- 107. Minor fixes to i810 driver (Egbert Eich)
- 106. Fixed format of float numbers in C&T driver. (Jens Taprogge)
- 105. Added support for the NeoMagic 2360. (Gregory Pomerantz)
- 104. Add an xf86UnloadSubModule() entry (temporarily disabled)
-      (Marc La France).
- 103. Fix missing symbol "ServerGrabCallback" (Mark Vojkovich).
- 102. Fix XAA problems with CPU-to-screen colour expansion (Marc La France).
- 101. For panel support in the ATI driver, add an entry to the monitor
-      section's mode list for the panel's native resolution (Marc La France).
- 100. Fix depth24 acceleration problems with 300SX (Alan Hourihane).
-  99. Update glint driver for fb24_32 and ensure memset used in fb is
-      xf86memset when using loader (Alan Hourihane).
-  98. By default, limit ATI 3DRage LTPro's to 200 MHz, instead of 230 MHz
-      (Marc La France).
-  97. Remove some leftover INTERNAL_VS_EXTERNAL_PADDING stuff from the
-      extensions (Mark Vojkovich).
-  96. Fix a NonTE text bug in XAA where zero-height primitives could be passed
-      to the driver (Mark Vojkovich).
-  95. Add CPU-to-screen colour expansion acceleration for Mach64's
-      (Kevin Martin, Marc La France).
-
-XFree86 4.0a (6 April 2000)
-  94. Major OS/2 resync (#3859, Holger Veit).
-  93. Fix some 'XFree86 -configure' problems when multiple cards (#3850,
-      Paulo Cesar Pereira de Andrade).
-  92. New graphical config tool (xf86cfg) (#3850,
-      Paulo Cesar Pereira de Andrade).
-  91. Fix a typo in Xinstall.sh that prevents moving config files to
-      /etc/X11 from being optional (#3858, Richard Gooch).
-  90. Add lt_LT.ISO_8859-4 to locale.alias, and update the lt symbols for
-      xkb (#3857, Ricardas Cepas).
-  89. Fix the return values of some "xkb action" filters (SetControls and
-      RedirectKey) (#3854, Ivan Pascal).
-  88. Fix problems with using "radio group" number one in XKB keyboard
-      descriptions (#3853, Ivan Pascal).
-  87. Fix MIT-SHM crash caused by incorrect reference tracking (#3851,
-      Keith Packard).
-  86. Updates to allow a build on sparc-linux to succeed (#3849,
-      Jakub Jelinek).
-  85. Fix GetImage in XY format in fb at 32bpp (#3848, Keith Packard).
-  84. Add support for 24/32 fb/pixmap format conversion to fb (#3847,
-      Keith Packard).
-  83. Update the r128 driver to use fb and fb24_32, and disable
-      transparency at 24bpp (#3846, Keith Packard).
-  82. Let the server continue when a font path element in the default path
-      is found to be invalid (#3843, Keith Packard).
-  81. Fix parsing of the Group keyword in the DRI section of the config file
-      (#3842, Stefan Dirsch, David Dawes).
-  80. Add support for YUV422, YV12, RGB15 and RGB16 XvImages to the C&T driver
-      (#3840, David Bateman).
-  79. Change the config file Xkb* option priority.  Now, if XkbKeymap is
-      set it will be tried first.  If a component is present it will override
-      components computed from ruls/module/layout/etc (#3839, Ivan Pascal).
-  78. Fix an infinite loop problem that can show up in makedepend (#3838, A.10,
-      Jeremy Buhler).
-  77. Fix Overlay support in the TI ramdac module (Alan Hourihane).
-  76. Fix mixup between TVP3026/3030 ramdacs in the ramdac module
-      (Alan Hourihane).
-  75. Increase usage of ReadPixmap within XAA (Mark Vojkovich).
-  74. Allow the v4l driver to use offscreen YUV surfaces exported by the
-      chipset drivers (Gerd Knorr).
-  73. Change xf86LoadModules() so that it doesn't quit at the first module
-      that fails to load (David Dawes).
-  72. SIGIO doesn't work on Linux pipes, so diasble it for input devices
-      which are pipes (#3835, Keith Packard).
-  71. Bring the SDK support up to date (#3834, David Bateman).
-  70. Fix an Xlib problem that causes an application crash when inputting
-      cyrillic symbols with the koi8-r locale (and other locales with
-      long esc-sequences) (#3833, Ivan Pascal, #A.15, Serguei Poliakov, #A.34,
-      Stanislav Meduna, #A.40, Rimantas Plaipa, #A.74, Sergei Laskavy).
-  69. Fixes for S3 Trio3D/2X:
-       - flickering for some cards (bad FIFO setting from bios).
-       - workaround for 8MB ram (ramdac can access only 4MB).
-       - adjust clock limits which have been too low.
-      (#3832, Harald Koenig).
-  68. Fix v4l problem with a function being called after the module is
-      unloaded (#3831, gbritton at light-brigade.mit.edu).
-  67. Fixes for the PPC icache flushing code (#3830, Kostas Gewrgiou).
-  66. Fix for /tmp race installing man pages on OpenBSD (#3829,
-      Matthieu Herrb).
-  65. Fix problems building the Xsun and XsunMono servers on
-      NetBSD-current/sparc (#3828, Matthieu Herrb).
-  64. Add a comment to site.def about how to move the /etc/X11 contents to
-      a directory under ProjectRoot (#3827, R Horn).
-  63. Fix an Xaw bug that shows up when usingn c-mode with xedit on Linux
-      (#3824, Paulo Cesar Pereira de Andrade).
-  62. Enable devfs support for the v4l driver (based on #3823,
-      Christopher Sekiya).
-  61. Update for README.FreeBSD (#3822, Kazutaka Yokota).
-  60. Bump the video driver ABI minor version because of interface changes
-      (now 0.2).
-  59. Disable SilkenMouse when IO/MEM resource sharing means that it cannot
-      be reliably used (#382o, Keith Packard and Egbert Eich).
-  58. Fix DGA 1.0 compatibility for mouse events and SetViewport behaviour
-      (#3820, Keith Packard).
-  57. Fix the Linux APM code so that the X server doesn't hang the machine
-      on suspend (#3820, Keith Packard and Egbert Eich).
-  56. Fix problems that break Overlay support in the glint driver (#3818,
-      Michel Dänzer).
-  55. Possible fix for AvailableOptions function and submodule loading
-      for the cirrus driver (David Dawes).
-  54. Add an entry for the GeForce to the Cards file (#A.6, Oliver Lau).
-  53. Fix pswrap build problem when cross compiling (#3815, Jim Gettys).
-  52. Fix a typo in itsy.cf (#3814, Jim Gettys).
-  51. SiS driver fixes:
-       - 630/540/300 display abnormal for all modes.
-       - 630/540/300 cannot enter true color modes.
-       - 530/620 1600x1200x8bpp display abnormal.
-      (#3807, Can-Ru Yeou, SiS).
-  50. Fix a -configure crash in the nv driver (#3805, Jarno Paananen).
-  49. Rendition driver updates:
-       - rename most v_ to verite_ to avoid potential namespace clashes.
-       - add support for VBE DDC and "XFree86 -configure".
-       - fix PROBE_DETECT issues.
-       - Replace a number of ErrorF's with xf86DrvMsg to reduce noise
-         when not requested. A number of debugging messages #ifdef'ed also.
-       - Option "MTRR" reenabled. Was disabled when acceleration was debugged.
-      (#3785, 3808, Dejan Ilic).
-  48. S3virge driver updates:
-       - Revert WAITIDLE to cleanly abort a segfaulting imagewrite.
-       - Start of GX2 fixes.
-       - Add DDC monitor X -configure code.
-       - Update copyrights
-      (#3783, Kevin Brosius).
-  47. Update XSetWMProperties() to set the WM_LOCALE_NAME property (#3780,
-      Peter Novodvorsky).
-  46. Xterm patch #131 (#3777, Thomas Dickey).
-  45. Add some xtest tests to cover some accelerated cases implemented by
-      XAA, and fix some Linux/glibc build problems (#3767, Rik Faith).
-  44. Xineramification of XvImage support (Mark Vojkovich).
-  43. By default, cache writes to selected Mach64 MMIO registers and allow this
-      cache to be disabled (Marc La France).
-  42. Add detection of Rage128 Mobility to ATI driver (Marc La France).
-  41. Fix a Xinerama GetImage bug that showed up in 24+32 (Mark Vojkovich).
-  40. Fix XAA transparent blits.  They are broken in 4.0 (Mark Vojkovich).
-  39. Fix typo in mioverlay that broke resize gravity (Mark Vojkovich).
-  38. Fix PCI/AGP bridge I/O and memory window detection (Marc La France).
-  37. Add Mach64 solid zero-width line acceleration, except for 24bpp
-      (Kevin Martin, Marc La France).
-  36. Add Mach64 mono 8x8 pattern fill acceleration (Kevin Martin,
-      Marc La France).
-  35. Fix DDC bug (John McCorquodale).
-  34. Fix minClock and maxClock determination in ATI driver (Marc La France).
-  33. A first step at allowing -configure to deal with more than one device per
-      driver (Marc La France).
-  32. ATI driver changes:  Implement Mach64 engine restriction on virtual
-      resolution;  Add DPMS support;  More DSP calculation fixes;  Fix text
-      mode restoration bug;  Fix Mach64 screen blanking;  Don't probe for
-      previously claimed VGA compatibles;  Fix device section matching for
-      Mach64 controllers made by UMC foundry;  Miscellaneous cleanups
-      (Marc La France).
-  31. Add GLINT 300SX support to the glint driver (Alan Hourihane).
-  30. Remove the unused GLINT Delta code (for now) to re-implement as
-      a chipset (like the gamma) from the glint driver (Alan Hourihane).
-  29. Add support for the TVP3026 ramdac to the ramdac module (Alan Hourihane).
-  28. Add support for building and installing HTML versions of the man
-      pages (David Dawes).
-  27. Fix some limitation in rman so that it will handle our man pages
-      correctly (David Dawes).
-  26. Import rman-3.0.8, for generating HTML versions of the man pages
-      (David Dawes).
-  25. ATI fixes to Cards database (Marc La France).
-  24. Fix some man page formatting problems that show up on some platforms
-      (David Dawes).
-  23. Fix an 8+24 bug that occured when shared memory pixmaps were used as
-      tiles (Mark Vojkovich).
-  22. Support for the Trident CyberBlade/DSTN/i1 (Alan Hourihane).
-  21. Fix Xinerama problems that occured when screen zero was not at (0,0)
-      (Mark Vojkovich).
-  20. Add untested support for Matrox SDRAM G400s (Mark Vojkovich).
-  19. Improve memory probing reliability in the Matrox driver (Mark Vojkovich).
-  18. Fix DESIGN doc and XF86Config man page information about the Screen
-      entry format in the ServerLayout sections (David Dawes).
-  17. Add missing file permission flags to xf86shmget (Mark Vojkovich).
-  16. Workaround in 8+32 for applications that assume changes to window
-      background pixmaps go into effect immediately (Mark Vojkovich).
-  15. Change loader search order to look in more specific subdirectories first,
-      thereby avoiding loading 3.3.* module versions (Marc La France).
-  14. Remove the var-* bindist files for platforms that don't use Xvar.tgz
-      (David Dawes).
-  13. No Xset.tgz, so remove the set-list bindist files (David Dawes).
-  12. Fix Xinstall's symlink testing for Solaris (/bin/sh's builtin doesn't
-      recognise '-L') (David Dawes).
-  11. Update Xinstall.sh to handle the xkb/compiled directory properly in all
-      cases, including when there is no Xvar.tgz tarball (David Dawes).
-  10. Add missing cs_CZ.ISO_8859-2 entries to locale.alias (#A.20,
-      Cejka Rudolf).
-   9. Updates to Linux-ix86 bindist host.def file.
-   8. Fix installation of iso8859-{1,2,3} Compose files, and fix the czech
-      entry in locale.alias (Charles Lopes, #A.62, Stanislav Brabec).
-   7. Fix some problems with layers forgetting that SwitchMode is an
-      optional function (Mark Vojkovich).
-   6. Parser bug fix for hexadecimal numbers (Marc La France).
-   5. Fix scanpci (Marc La France).
-   4. DPMS #include fix (Marc La France).
-   3. Fix an event ordering problem in Xinerama (Mark Vojkovich).
-   2. Fix some clipping bugs in the Xv DDX (Mark Vojkovich).
-   1. Remove 24bpp shadowfb support from the NV driver since the hardware
-      is not capable of 24bpp (Mark Vojkovich).
-
-XFree86 4.0 (8 March 2000)
-3972. Possible fix for a cirrus driver crash when using -configure
-      (David Dawes).
-3971. R128 driver doc update (#3813, Ove Kaaven).
-3970. Update Unicode/ISO 10646 information in the release notes (#3812,
-      Markus Kuhn).
-3969. Fix an apm driver crash when using -configure (#3811, Loic Grenie).
-3968. Release notes updates (David Dawes).
-3967. Major updates to the XF86Config man page (David Dawes).
-3966. Update the Cyrix driver documentation (#3810, Richard Hecker).
-3965. Update the APM driver documentation (#3809, Loic Grenie).
-3964. Fix a name clash in XF86OffscreenImageRec (Mark Vojkovich).
-
-XFree86 3.9.18Za (7 March 2000)
-3963. GCC/egcs bug workaround and other more minor ATI fixes (Marc La France).
-3962. Split HasGlide into HasGlide2 and HasGlide3 (David Dawes).
-3961. Enable known gcc optmisation work arounds by default (David Dawes).
-3960. Fix uninitialized screen function (RestackWindow) (#3806, Keith Packard).
-3959. Added DRI users guide documentation (Brian Paul and Kevin Martin).
-3958. Update the -misc-fixed-* BDF fonts.  New glyphs have been added and
-      some old ones fixed.  10x20.bdf and 9x15.bdf now also cover the
-      ISO 8859-6 characters (Arabic), and 18x18ja.bdf covers now all
-      characters necessary to display the full ISO-2022-JP-2 repertoire
-      (#3799, Markus Kuhn).
-3957. Make sure the fbdevhw module is loaded by the glint driver when it
-      is needed, and add some memory barriers to some register access macros
-      (#3804, Michel Dänzer).
-3956. Update the glint driver man page and release notes (#3804,
-      Michel Dänzer).
-3955. Remove some noisy messages from the mga driver (#3803, Mark Vojkovich).
-3954. The last segment in any zero-width polysegment drawing request to
-      a window with more than one clipping rectangle gets dropped in the
-      fb code (#3802, Keith Packard).
-3953. Fix the versions for which HasMTRRSupport is enabled for OpenBSD
-      (#3800, Matthieu Herrb).
-3952. Fix some "ambiguous" else statements in some of the driver Probe()
-      functions (David Dawes).
-3951. Don't make the VBEInit call in the chips driver dependent on the loader
-      server (David Dawes).
-3950. Register vbe symbols as "referenced" with the loader in drivers that
-      use them (David Dawes).
-3949. Fixed the unresolved VBE symbols in the r128 driver and a crash
-      related to referencing vgahw symbols before the module is loaded
-      (Kevin Martin).
-3948. Fix a -configure crash in the tdfx driver (David Dawes).
-3947. Fix a mouse driver bug that prevented the X server from seeing the
-      mouse button 4 and above when three button emulation is enabled
-      (#3773, Yoshihiko Sarumau, Kazutaka Yokota).
-3946. Add NO_GXCOPY to the s3virge driver's imagewrite flags, which fixes
-      a crash (#3783, Kevin Brosius).
-3945. Fix a parser build problem for Interactive Unix, and update the
-      docs (#3796, Michael Rohleder).
-3944. Fix the r128 hw cursor for big endian machines, and enable building
-      the r128 driver for PPC (#3975, Kostas Gewrgiou).
-3943. Update lnxResource.c to allow builds to succeed on PPC platforms
-      (#3795, Kostas Gewrgiou).
-3942. B&H Lucidux fonts (#3794, donated by Charles Bigelow, Kris Holmes
-      from Bigelow and Holmes Inc, with hinting donated by Berthold Horn and
-      Blenda Horn from Y&Y, Inc).
-3941. Doc update for the sis driver (#3793, R Horn).
-3940. Fix an xman build problem on LynxOS (#3792, Thomas Mueller).
-3939. Fix some 24-plane problems with the tga driver, and update the docs
-      (#3789, Martin Lucina).
-3938. Rage 128 documentation update (Kevin Martin).
-3937. Fix an unresolved reference to VErrorF from the int10 module
-      (David Dawes).
-3936. Reduce some of the noise in the server startup messages (David Dawes).
-3935. Static library objects don't use THREADS_CFLAGS (#3790, Matthieu Herrb).
-3934. Fix a fatal error related to shared memory pixmaps in Xinerama (#3788,
-      Mark Vojkovich).
-3933. Fix IA64 build fixes (#3787, Mark Vojkovich).
-3932. Fill out the rendition man page (#3785, Dejan Ilic).
-3931. Update the s3virge man page (#3784, Kevin Brosius).
-3930. Fix the FreeBSD/alpha code to track changes made to the Linux memory
-      mapping code (#3782, Doug Rabson).
-3929. Update email addresses for C&T driver authors (#3781, Nozomi Ytow).
-
-XFree86 3.9.18Z (3 March 2000)
-3928. Restrict the X server -configure option to root, and fix a crash
-      when the server fails to read the first stage config file that it
-      writes when run with this option (David Dawes).
-3927. Modify the parser's xf86WriteConfigFile() function to write the
-      file using the real user id when the real and effective ids are
-      different (David Dawes).
-3926. Fix a problem with VT switching disabling direct rendering 3D apps
-      (Kevin Martin).
-3925. Add an imake parameter called XFree86Devel that can be set in host.def
-      to enable devel-specific settings (like more verbose compiler warnings),
-      and adjust GccWarningOptions to use this (David Dawes).
-3924. Various doc updates, and don't install out of date docs (David Dawes).
-3923. Fix a thread related problem in the Xv client library (Mark Vojkovich).
-3922. Fix a Xinerama problem with XShapeMask (Mark Vojkovich).
-3921. LynxOS documentation and bindist updates, and an os-support fix (#3779,
-      Thomas Mueller).
-3920. Update the wacom input driver to suppor the PL400 model and the
-      stroking pen on the Intuos model (#3778, Frederic Lepied).
-3919. -
-3918. -
-3917. Add prototypes for xman, and eliminate most of the compiler warnings
-      (#3772, Thomas Dickey).
-3916. Xterm patch #130 (#3771, Thomas Dickey).
-3915. Fix a segfault in XAA caused by reading beyond shared memory bitmaps
-      when hardware clipping is not available (Mark Vojkovich).
-3914. Update the mga man page (Mark Vojkovich).
-3913. A Q&D fix for GLX segment violation in loader server (Marc La France).
-3912. Add Mach64 screen-to-screen copy acceleration (Kevin Martin,
-      Marc La France).
-3911. IA-64 fixes (Mark Vojkovich).
-3910. Add skeleton man pages for the video and input drivers that don't
-      already have one (David Dawes).
-3909. Add man pages for the mouse, keyboard and void input drivers
-      (David Dawes).
-3908. Enable building the "void" input driver by default (David Dawes).
-3907. Keep xf86RegisterRootWindowProperty from freeing data it didn't
-      allocate (Mark Vojkovich).
-3906. Add an extra file name to the server config file search path --
-      XF86Config-M, where M is the major version number (David Dawes).
-3905. DRI megapatch II.  This includes DRI enhancements, 3dfx fixes and
-      updates, updates Mesa to version 3.3 beta, adds new GLX dispatch
-      code and adds i810 2D support (Precision Insight).
-3904. Add SERVER_OVERLAY_VISUALS root window property (Mark Vojkovich).
-3903. Remove unnecessary VGA CRTC unlock/relock in cyrix driver
-      (Marc La France).
-3902. Fix ATI driver's 8514/A probe delay when one isn't present
-      (Marc La France).
-3901. Changes to -configure:  ATI driver interface;  Move default monitor
-      tolerances to xf86ValidateModes();  Let drivers decide on default depth
-      and mode;  Don't "special-case" VGA driver.  (Marc La France)
-3900. Fix xc/lib/Imakefile for BuildServersOnly (Marc La France).
-
-XFree86 3.9.18b (29 February 2000)
-3899. Fix a bug in lnx_apm.c that causes fd 0 to be closed instead
-      of the just opened /proc/apm (#3766, Kars de Jong).
-3898. Fix a SuperProbe build problem on UnixWare 7 (#3765, Thanh Ma).
-3897. Mouse doc updates (#3764, Kazutaka Yokota).
-3896. Speed up dashed lines and conic sections in fb, including changing
-      mi to use PolyPoint instead of FillSpans for dashed arcs (#3763,
-      Keith Packard).
-3895. Add shadowfb support to the rendition driver (#3762, Dejan Ilic).
-3894. Allow Rage128 driver to Probe DDC too (Alan Hourihane).
-3893. Allow i740 driver to Probe DDC (using vbe) for -configure, and remove
-      one liner from tdfx driver to enable it too (Alan Hourihane).
-3892. Make GNU make -j workaround separately configurable (Marc La France).
-3891. Replace remaining occurrences of BuildXTT imake symbol with
-      BuildXTrueType (Marc La France).
-3890. Fix some problems using the UTF-8 -locale:
-       - Add proper side (GL/GR) handling to the UTF-8 locale
-       - No more need to define ISO10646-1 in en_US.UTF-8. It is already
-         defined in lcCT.c
-       - The fontset loading routines would access invalid memory when
-         not all fonts for a fontset were found
-      (#3761, Bruno Haible).
-3889. Avoid spurious warnings from the XFree86-Bigfont extension (#3760,
-      Bruno Haible).
-3888. Fix an error in the XtAppMainLoop() man page related to its return
-      behaviour (#3759, Bruno Haible).
-3887. Make it possible for gcc to compile the Linux int10 module with -fPIC
-      (#3758, Bruno Haible).
-3886. Fix typos in fontcacheP.h and RELNOTES (#3757, Bruno Haible).
-3885. Disable stripping programs when they are installed to make it
-      easier to debug problems that may show up within libraries (#3756,
-      Bruno Haible).
-3884. Add support for reading power management events for NetBSD and
-      OpenBSD (#3755, Matthieu Herrb).
-3883. Update Xinstall.sh for NetBSD-current-ELF (#3754, Matthieu Herrb).
-3882. Update NetBSD and OpenBSD bindist files (#3753, Matthieu Herrb).
-3881. Apm driver update, including extending the Rush extension to allow
-      initialisation of the Rush chip in a legal way (#3752, Loic Grenie).
-3880. Xterm patch #129 (#3751, Thomas Dickey).
-3879. Add DDC support to the tdfx driver via the vbe interface (#3750,
-      Jarno Paananen).
-3878. Enable double scan and interlaced modes for the tdfx and nv drivers
-      (#3750, Jarno Paananen).
-3877. Fix 8bpp initialisation problem with the rendition driver (#3749,
-      Dejan Ilic).
-3876. Update the XThrStub library version with that in the 3.3.x branch,
-      and enable thread-safe libraries for OpenBSD 2.6 and later (#3748,
-      Matthieu Herrb).
-3875. Fix some REGION_BROKEN related stuff with the overlays (Mark Vojkovich).
-3874. Fix a bug with unaccelerated pixmap cache uploads when virtualX
-      was larger than the displayWidth (Mark Vojkovich).
-3873. Xinerama changes (Mark Vojkovich).
-      - extend the Xinerama protocol and change the version number to 1.1.
-      - add a new client API in the "Xinerama" namespace with more
-        functionality than the previous "PanoramiX" functions.
-      - move Xinerama functions out of libXext and into libXinerama.a.
-      - some Xinerama bug fixes.
-3872. Add a flags field to the XF86OffscreenImageRec (Mark Vojkovich).
-3871. Fix a malloc/free problem in Xnest on 64-bit platforms (David Dawes).
-3870. Update bindist definition files (David Dawes).
-3869. More installer updates (David Dawes).
-3868. Make -configure generate multihead configs (Alan Hourihane).
-
-XFree86 3.9.18a (25 February 2000)
-3867. Add a preliminary Install document (David Dawes).
-3866. Remove obsolete XF98 and XF68 definitions from xfree86.cf (David Dawes).
-3865. Fix some rendition driver problems (#3746, Dejan Ilic).
-3864. Add build-time support for using fb instead of cfb with the nv
-      driver (#3744, Jarno Paananen).
-3863. Add missing xf86_ansic.h include for the nv driver, and avoid a
-      gcc 2.96-generated memcpy call in Mesa (#3743, Jarno Paananen).
-3862. Glint driver updates:
-       - removed obsolete NoWriteBitmap option
-       - reworked pm2_accel.c (cleaned up swapping/mirroring, removed
-         obsolete hacks)
-       - fixed setting of mode sync flags
-       - fixed PolySegmentThinSolidWrapper functions
-      (#3742, Michel Dänzer).
-3861. Change the positioning of $(XF86INT10LIB) to fix some static server
-      linking problems (#3741, Kevin Brosius).
-3860. Make xclock's -brief option off by default, and document it in the
-      man page (#3740, Nozomi Ytow).
-3859. Improve the default converters set in libX11, and use it for all
-      "one byte" locales (#3737, Ivan Pascal).
-3858. Some improvements to the generic converters set in libX11, including:
-       - some converter optimization
-       - actions that can be done once at initialization step moved to
-         lcGeneric.c
-       - converters from CharSet to MultiByte/WideChar added
-      (#3731, Ivan Pascal).
-3857. Add a "showCurrent" resource for Xaw, which makes the list widget
-      always show the selected item (#3728, Paulo Cesar Pereira de Andrade).
-3856. Use fb for the fbdev driver, and check if the fbdev modes are suitable
-      for the monitor (#3709, Michel Dänzer).
-3855. Add support for finding VT devices for Linux kernels compiled with
-      devfs (#3692, Christopher Sekiya).
-3854. Implmenent the Font Type font properties for the Speedo, Type 1 and
-      TrueType backends (#3688, Juliusz Chroboczek).
-3853. Add an installation script (Xinstall.sh) for installing binary
-      distributions (David Dawes).
-3852. Fix bitmap installation location for xditview (#3724, Harald Koenig).
-3851. Make -probe and -configure deal with vendor-supplied modules again
-      (Marc La France).
-3850. Fix an exposure problem that occured in 8+32 mode when the root
-      window was in depth 24 (Mark Vojkovich).
-3849. The MGA driver now recognizes a "VideoKey" option that sets the
-      default video key for YUV overlays (Mark Vojkovich).
-3848. Add some missing cfbDrawableEnabled checks to the 8+32 and 24+32
-      framebuffers (Mark Vojkovich).
-3847. Fix a segfault introduced by the workaround in 3546 below.
-3846. Fix big endian problems in XAA stipple code (Michel Dänzer).
-3845. Fix xf86MatchPciInstances() to not cause r128 to report detection of
-      other ATI adapters to -probe (Marc La France).
-3844. Fix bug in xf86MatchDevices() with -probe or -configure (Marc La France).
-3843. More compilation fixups (Marc La France).
-3842. Make -probe and -configure use compiled-in driver lists. Make -configure
-      work in the static server (Marc La France).
-3841. A second attempt at fixing DPS compilation (Marc La France).
-3840. Add DDC probing to the -configure option and enable it in the trident
-      driver (Alan Hourihane).
-3839. Bring xditview over from the contrib dist.
-3838. Fix drm free list bug (Jeff Hartmann and Rik Faith, Precision Insight).
-3837. Remove deprecated keywords (Kevin Martin).
-3836. Support for YUV offscreen surfaces in Xv and have the MGA driver
-      offer them (Mark Vojkovich).
-3835. Reorder generic Xv adaptor registration to allow V4L to use
-      driver-managed YUV offscreen surfaces (Gerd Knorr).
-3834. Preliminary IA-64 support (Mark Vojkovich, Johannes Erdfelt).
-
-XFree86 3.9.18 (21 February 2000)
-3833. Bump the minor version number for libXaw since it has some symbols
-      that are not present in 6.0.
-3832. Add a "xf86LoaderCheckSymbol" function and use this in drivers to
-      check if the vgahw module is loaded before calling vgaHWFreeHWRec()
-      (David Dawes).
-3831. Fix some build problems on Interactive Unix (#3739, Michael Rohleder).
-3830. Disable NetBSD aperture driver support by default (#3736,
-      Matthieu Herrb).
-3829. Update OpenBSD and NetBSD docs (#3735, Matthieu Herrb).
-3828. Update the VideoBoard98 file (#3734, Isao Ohishi).
-3827. Fix 'X -scanpci' crash (David Dawes).
-3826. Fix the "ev56" gcc option (#3730, Keith Packard).
-3825. Fix some problems with the MMIO macro use of function pointers on
-      Alpha (#3729, Keith Packard).
-3824. Fix a Mesa bug involving paletted textures and software rendering
-      (#3727, Brian Paul).
-3823. Fix a glx bug involving glFlush() inside glXWaitGL() (#3727, Brian Paul).
-3822. Disable the 3DNow assembler code for now, to avoid problems with
-      assemblers that don't recognise the instructions (Brian Paul).
-3821. Fix some problems with the Cards file (#3726,
-      Paulo Cesar Pereira de Andrade).
-3820. Eliminate the double mappings added to the r128 driver work around
-      earlier limitations, and add the fix necessary to make the R128
-      work on an Alpha UP1000 box without hanging the AGP bus during fb
-      rendering (#3720, Keith Packard).
-3819. Fix an int10 crash when the BIOS accessed memory beyond the first
-      8kbytes (#3722, Keith Packard).
-3818. Fix PCI memory regions on dense alpha (#3720, Keith Packard).
-3817. Fix an int10 module build problem on big endian machines (#3719,
-      Kostas Gewrgiou).
-3816. Remove "lib" from the GLcore module name (David Dawes).
-3815. Set HasPoll to NO for Linux to work around a problem that Netscape
-      has when libXt uses poll() instead of select() (#3718, Keith Packard).
-3814. Disable 24bpp fb rendering on big endian machines because it doesn't
-      work yet (#3717, Keith Packard).
-3813. Fix an Xlib bug that causes freed memory to be accessed.  This is
-      exposed by Netscape (#3716, Keith Packard).
-3812. Fix a problem in glxUseXFont() when direct rendering (#3715, Brian Paul).
-3811. A rework of Kevin Martin's Mach64 acceleration.  Only solid fills for
-      now (Marc La France).
-3810. ATI Mobility fixes (Marc La France).
-3809. A new clock ordering has been reported for Mach32's.  Treated as a
-      different clock chip for now (Marc La France).
-3808. Build fixups (Marc La France).
-3807. Fix a bug in the code that checks for the presence of a core keyboard
-      and pointer (David Dawes).
-3806. Remove unnecessary system headers from Xext/fontcache.c, which were
-      causing unresolved symbols for the extmod module on Solaris
-      (David Dawes).
-
-XFree86 3.9.17Z (17 February 2000)
-3805. Fix VT switch problem when using shadowfb with the ati driver
-      (Marc La France).
-3804. Fix some typos in the mouse driver that affect some of the extended
-      PS/2 protocols (Kazutaka Yokota).
-3803. Xterm patch #128 (#3713, Thomas Dickey).
-3802. Fix a crash in the XKB library code (#3712,
-      Paulo Cesar Pereira de Andrade).
-3801. Set the right max clock for the Voodoo3 3000 (#3707,
-      Yoann Vandoorselaere).
-3800. Fix various build problems (David Dawes).
-3799. Fix all other SaveScreen() functions, and add a helper xf86IsUnblank()
-      that drivers can use to interpret the SaveScreen mode values
-      (David Dawes).
-3798. Fix GLINTSaveScreen's use of the second argument (#3706, Michel Danzer).
-3797. Glint driver updates: register int10 module's symbols, and add a
-      workaround to set the sync flags in supplied modes to make the HW
-      cursor work with FBDev (#3650, Michel Danzer).
-3796. Indented xfree86 for better readability. (Egbert Eich)
-3795. Fixed int10 build rules (hope they are right now) (Egbert Eich)
-3794. Changed lnxResources.c to know about differences between ev4/5 and ev6.
-      (Egbert Eich).
-3793. xf86pciBus.c restores old registration if attempt fo fix PCI
-      registration fails. (Egbert Eich)
-3792. Removed sparse mapping from vidmem.c. (Egbert Eich)
-3791. Changed memory mapping for linux on Alpha:
-       - removed separate mapping functions for sparse and dense.
-       - allow for 32bit read/write to access memory directly without
-         going thru a function call if Jensen support is not enabled
-      (Egbert Eich)
-3790. Fix for dead keys in XKB Norwegian keyboards (#3702, 3703,
-      Preston Brown).
-3789. Synced with latest Mesa 3.3 sources (Brian Paul, Precision Insight).
-3788. Bug fixes for DRI (Kevin Martin, Precision Insight).
-3787. Bug fixes for tdfx DRI driver (Daryll Strauss, Precision Insight).
-3786. Cleanups for the contrib programs recently moved into the main xc/
-      tree (#3701, Bruno Haible).
-3785. Small lynx.cf fix (#3700, Thomas Mueller).
-3784. Initialise MMIO32 for r128 when using fbdev (#3699, Kostas Gewrgiou).
-3783. Avoid most lockups for Trio3D startup (s3virge driver) (#3698,
-      Harald Koenig).
-3782. Fix unresolved and conflicting symbols in X-TT, and fix the broken
-      BIG5 converter (#3697, Takuya Shiozaki).
-3781. Update README.fonts (#3696, Juliusz Chroboczek).
-3780. Add dot, line, arc accelerations for 24bpp in fb, and cleanup most
-      warnings (#3695, 3711, Keith Packard).
-3779. Make it possible to build the r128 driver with support for fb
-      (disabled by default) (#3693, Keith Packard).
-3778. Fix a problem with lnx_ev56 (#3693, Keith Packard).
-3777. Fix references to noPanoramiXExtension when Xinerama is not built
-      (#3691, Christopher Sekiya).
-3776. Fix possible races in xauth and libXau (#3690, 3694, Colin Phipps).
-3775. Fix some Xv and PC-98 init bugs in the apm driver (#3689, Loic Grenie).
-3774. Fix SVR4.0 build problem in the cyrix driver (David Dawes).
-3773. Fix SVR4.0 build problems in the sis driver (#3687, Takaaki Nomura).
-3772. Change CppProgram to /usr/bin/cpp for FreeBSD.
-3771. DPS build fixes (#3686, Juliusz Chroboczek, David Dawes).
-3770. Back out the pMga->PointerMoved change.
-3769. Fix DRI/DRM code to build tdfx driver and turn off building MGA DRI
-      support until the next code merge (Kevin Martin).
-3768. Attempt to first read the PLL parameters in the BIOS from PCI space,
-      then fallback to 0xc0000, and then fallback to default PLL parameters
-      in r128 driver (Kevin Martin).
-3767. Fix compiler warnings in r128 driver (Kevin Martin).
-
-XFree86 3.9.17f (12 February 2000)
-3766. Moved Alpha ev5/56 read dense functions to a separate file.
-      (Egbert Eich)
-3765. Improved RAC support for asynchronous events (not yet enabled).
-      (Egbert Eich)
-3764. Fixed a bug that prevented restoration of PCI registers after
-      a VT switch. (Egbert Eich)
-3763. Fixed support for BIOS reading on multiple chipset cards. (Egbert Eich)
-3762. Separated stub functions from pcitweak. (Egbert Eich)
-3761. Rewrote scanpci to use libxf86_os.a. (Egbert Eich)
-3760. Improved server state notification callback handler to meet the
-      needs of multi-head dri. (Egbert Eich)
-3759. Mga fix for pMga->PointerMoved init (#3684, Isao Ohishi).
-3758. Import FreeType 1.3.1 and X-TrueType 1.3, and incorporate the
-      font cache extension (#3653, Akio Morita, X-TrueType team, Nozomi Ytow).
-3757. Add a stub for xf86OSPMOpen() for OS's that don't have their own
-      (David Dawes).
-3756. Move the other XFree86-supported contrib programs to the main xc/
-      tree (except for xditview) (David Dawes).
-3755. Add a dummylib that provides functions required by libxf86_os.  This
-      makes it easier for utilities (like scanpci and pcitweak) to use
-      libxf86_os (Egbert Eich, David Dawes).
-3754. Some bug fixes and PC-98 enhancements for the apm driver (#3685,
-      Loic Grenie).
-3753. GL build fix (#3683, Christopher Sekiya).
-3752. Xterm patch #127 (#3682, Thomas Dickey).
-3751. Cyrix MediaGX driver.  Not very usable yet (#3681, Richard Hecker).
-3750. Add DPS libraries.  Building these is disabled right now because
-      some more work is needed on the Imakefiles and portability issues
-      (#3645, 3680, Juliusz Chroboczek).
-3749. Fix the mga driver to work with the MGA 2064W on Alpha architectures
-      (#3679, Doug Rabson).
-3748. Support for building XFree86 on FreeBSD/alpha (#3678, Doug Rabson).
-3747. Restore viewport correctly on VT switch for the s3virge, and clean
-      up the logging messages (#3676, Kevin Brosius).
-3746. Don't try to program the keyboard repeat rate directly for Linux/98
-      (#3675, Takaaki Nomura).
-3745. Update information about mouse support in 3.9.18 (#3673, 3674,
-      Kazutaka Yokota).
-3744. Remove the "Extended PS/2 mouse protocol" class from the supported
-      interfaces in FreeBSD, since they are already handled at the
-      device driver level (#3672, Kazutaka Yokota).
-3743. Merge Kevin Hendricks fbdev/ppc patches in r128, fix wrong order
-      in cursor init (#3671, Kostas Gewrgiou, Kevin Hendricks).
-3742. Fix a problem building xedit/realpath.c that shows up on Linux
-      (#3670, Andrew Aitcheson).
-3741. Fix a build problem for lcUTF.c on Linux/libc5 (#3668,
-      Andrew Aitcheson).
-3740. Make sure the cursor is positioned correctly after mode changes
-      (#3667, Harald Koenig).
-3739. Add support for the SiS 630/540/300/530/620 to the SiS driver with
-      hw acceleration.  Support for the tvout function is included for
-      the 630/540/300 (#3666, Can-Ru Yeou, SiS).
-3738. Fix some build problems with the apm driver on SVR4.0 (David Dawes).
-
-XFree86 3.9.17e (11 February 2000)
-3727. Move xman into the main xc/ tree.
-3726. The leak-tracing allocator now works on 64-bit machines, and update
-      the server to allow the use of the leak-tracing allocator (#3665,
-      Keith Packard).
-3725. Fix fb so that it works with 64-bit pointers and works on big-endian
-      machines (#3665, Keith Packard).
-3724. r128 driver updates to work on Alpha UP1000 (ev6).  The changes follow
-      recommendations from Kevin Martin and Egbert to try to make them
-      reasonable (#3665, Keith Packard).
-3723. Modify mfb, cfb and mi so that they now do all accesses 32-bits at
-      a time instead of 64 (on 64-bit platforms).  This eliminates image
-      repadding in DIX (#3665, Keith Packard).
-3722. Bug fixes, comments and cosmetics for the input method code:
-       - Add prefix "_Xim" to two input specific functions.
-       - Remove buggy function ConvertUCS4toUTF8 (bug: UCS-4 never contains
-         surrogates), and replace with simpler code. Based on a patch by
-         Ivan Pascal.
-       - Fix for _XimLookupMBText and _XimLookupWCText in multibyte locales
-         Patch by Ivan Pascal.
-      (#3664, Bruno Haible, Ivan Pascal).
-3721. Fix ugly code in _XlcCreateDefaultCharSet and add comments (#3663,
-      Bruno Haible).
-3720. Introduce a UTF-8 locale, including conversion from/to compound text.
-      This is not fully functional yet (#3662, Bruno Haible).
-3719. Resturcutre lib/X11/lcCt.c so that it is more understandable.  Update
-      the default_ct_data array.  Fix bugs in _XlcCheckCTSequence and cstoct,
-      and fix the UTF-8 introducing sequence (#3661, Bruno Haible).
-3718. Fix parsing of resource files so that it works better in multi-byte
-      locales (#3660, Bruno Haible).
-3717. Add commens to the libX11 locale files, declare _XlcInitLoader and
-      XlcConverter and a portability fix for dlopen() (#3659, Bruno Haible).
-3716. Fix an indentation problem in Xlib that was the origin of a malloc/free
-      bug (#3658, Bruno Haible).
-3715. Fix a bug in the locale file parsing routines (#3657, Bruno Haible).
-3714. Create a locale en_US.UTF-8.  This isn't fully functional yet, but
-      parts of Xlib work with it (#3657, Bruno Haible).
-3713. Modify xman to search for man pages in a locale-specific directory
-      first (#3652, Paulo Cesar Pereira de Andrade).
-3712. Have xedit use the BSD realpath() provided instead of the standard
-      Linux one because the Linux one behaves differently (#3652,
-      Paulo Cesar Pereira de Andrade).
-3711. Fix some typos in the Monitors and Cards files (#3652,
-      Paulo Cesar Pereira de Andrade).
-3710. Disable SilkenMouse in the C&T driver until the memory transfer
-      sync problem is solved (#3654, Nozomi Ytow).
-3709. -
-3708. Don't "normalise" module names in xf86LoadModules (David Dawes).
-3707. Apm driver updates, including updates to the xf86Rush extension (#3649,
-      3655, Loic Grenie).
-3706. Small cosmetic patch to glide driver (#3648, Loic Grenie).
-3705. Fix a bug in the way the BIOS mapping size is calculated in
-      in the ReadBIOS functions (#3647, Loic Grenie).
-3704. Add ReputImage function to the Xv DDX to prevent flickering during
-      window moves on some hardware (Loic Grenie).
-3703. Fix a bigfont extension build problem on Interactive UNIX (#3646,
-      Michael Rohleder).
-3702. Fix a bigfont extension build problem on NetBSD and OpenBSD (#3644,
-      Matthieu Herrb).
-3701. USB mouse support for *BSD (enabled for OpenBSD) (#3644, 3656,
-      Matthieu Herrb).
-3700. Update README.fonts (#3643, Juliusz Chroboczek).
-3699. i810 driver and preliminary DRI support for i810 and mga (#3638,
-      Keith Whitwell, Precision Insight).
-3698. 8+24 support upgraded to a non-destructive overlay (Mark Vojkovich).
-3697. Modify XAA to allow image rendering into DMA buffers (Mark Vojkovich).
-3696. Fix some SVR4.0 build problems (#3642, 3653, Satoshi Kimura).
-3695. Add XErrorDB entries for the DPS extension (#3639, Juliusz Chroboczek).
-3694. Fix a bigfont extension build problem on Linux/libc5 (#3637,
-      Takaaki Nomura).
-3693. Extend the Mouse "ZAxisMapping" option so that it can accept
-      (optionally) four arguments.  The additional two are for mice that
-      have two wheels or whose scroll device has two axes) (#3636, 3641,
-      Kazutaka Yokota).
-3692. Add support for some new mice (Microsoft IntelliMouse Explorer,
-      Genius NetScroll Mouse Optical, IBM ScrollPoint) and serial PnP
-      IDs (A4 Tech 4D/4D+, MouseSystems SmartScroll, Logitech Cordless
-      MouseMan Wheel, 8D Scroll mouse) to the mouse driver, and update
-      the mouse documentation (#3636, 3640, 3641, Kazutaka Yokota).
-3691. Xterm patch #126 (#3635, Thomas Dickey).
-3690. Fix for the Japanese PC-98 with GA-RUSH/6PCI in the apm driver (#3634,
-      Isao Ohishi).
-3689. Update man pages and server messages for -xf86config usage, and
-      FatalError when an unsafe path is given by a non-root user (#3633,
-      Mark Montague).
-3688. Add support for the Melco WHP-PS8 Permedia2-based card for Japanese
-      PC-98 machines to the glint driver (#3354, Isao Ohishi).
-3687. Avoid segv in new Linux apm support (David Dawes, Michel Danzer).
-3686. Fix unresolved symbols in the linux int10 module and the GLcore module
-      (David Dawes).
-3685. Add xkb support plus new (XFree86-specific) keysym names for the
-      HP and Logitech iTouch "Internet" keyboards (David Dawes).
-3684. Fix a vbe-related build problem on Solaris (David Dawes).
-
-XFree86 3.9.17d (9 February 2000)
-3684. XKB could crash with keycodes larger than the range given in the
-      keycodes file (David Dawes).
-3683. Allow the passing of all extended keycodes, which makes it possible
-      to access keys on "Internet" keyboards (David Dawes).
-3682. Added support for saving/restoring access state during
-      asynchronous events. Added code to make xf86EnableAccess()
-      atomic for asynchronous events. (Egbert Eich)
-3681. Modified xf86EnterServerState() to avoid any unnecessary
-      disabling of resources during state transition. (Egbert Eich)
-3680. Added function callback registration. Drivers can register
-      callback functions to be notified of the start/end of a
-      resource transition. (Egbert Eich)
-3679. Added support for OS specific Pci address windows. (Egbert Eich)
-3678. Added more debug traps to xalloc.c. Added support to peek/poke
-      MMIO registers and fb addresses from a debugger. (Egbert Eich)
-3677. Changed resource registration to use CPU space addresses
-      instead of BUS space addresses. Added flag to resource type
-      to mark addresses in bus address space. (Egbert Eich)
-3676. Extended host2bus and bus2host address conversion for PCI
-      addresses to PIO. (Egbert Eich)
-3675. Improved subset and intersect handling for resources ranges.
-      (Egbert Eich)
-3674. Modified mapping of V_RAM in int10/generic.c. (Egbert Eich)
-3673. Updated INT10.HOWTO. (Egbert Eich)
-3672. Added support for VBE DDC read out to s3v driver. (Egbert Eich)
-3671. Added xf86SetDDCProperties() to glint, chips, neomagic, s3v
-      and r128 driver. (Egbert Eich)
-3670. Fixed problems with virtual screen size != real screen size
-      when using shadow fb in mga driver. (Egbert Eich)
-3669. Fixed handling of virtual != real screen in shadowfb. (Egbert Eich)
-3668. Prevent reinitialization of pMga->PointerMoved in mga_driver.c
-      on server reset. (Egbert Eich).
-3667. Added int10 support to r128 driver. (Egbert Eich)
-3666. Attempt to make apm driver 64bit clean. (Egbert Eich)
-3665. Added options to swap x/y coordinates on mice. Useful when
-      using rotate on notebooks. (Egbert Eich)
-3664. Modified memory mapping on AXP to map entire MMIO space
-      at once. (Egbert Eich)
-3663. Fixed handling of sparsely mapped MMIO on AXP increasing
-      performance considerably. (Egbert Eich).
-3662. Added non-barrier versions of MMIO_OUTxx. (Egbert Eich).
-3661. Added support for new AXPs that don't have sparse mapping.
-      (Egbert Eich)
-3660. Separated high and low level handling in ModeInit() and
-      Restore() in cirrus driver. (Egbert Eich)
-3659. Made chipset specific record subrecord of vendor record
-      in cirrus driver. (Egbert Eich).
-3658. Made some improvements to acceleration code of Cirrus Alpine driver.
-      (Egbert Eich)
-3657. Added support for 64-bit cursor for Cirrus Alpine. (Egbert Eich)
-3656. Fixed cirrus driver to handle MMIO access using MMIO_IN/OUTxx
-      (Egbert Eich)
-3655. Fixed xf86HWCurs.c to handle 32-bit cursors on 64-bit machines
-      correctly. (Egbert Eich)
-3654. Added rotate support to neomagic, s3v, chips and cirrus
-      driver (Egbert Eich)
-3653. Added shadow fb support to s3v and cirrus driver (Egbert Eich)
-3652. Fixed sig11 problem after server reset caused by the new
-      extension loading code. (Egbert Eich)
-3651. Attempted to fix build problems with int10 (Egbert Eich)
-3650. Added a baseclass/subclass override to xf86PciInfo.h.
-      This override is evaluated in xf86pciBus.c (Egbert Eich)
-3649. Changed memory mapping in int10 support for Linux to use SYSV
-      IPC shm instead of mapping /proc/self/mem (Egbert Eich)
-3648. Added APM support for portable systems. (Egbert Eich)
-3647. XFree86-Bigfont extension that provides efficient client access to
-      the complete glyph metrics, using shared memory where possible/available
-      or transmitting the data in a compressed format otherwise (#3626,
-      Bruno Haible).
-3646. Update locale support for Celtic languages (Welsh, Irish, Scots, Manx
-      and Cornish), and include a compose file for ISO-8859-14 (#3612,
-      Alastair McKinstry).
-3645. Add a Slovenian xkb symbols file (#3629, Marko Samastur,
-      Primoz Peterlin).
-3644. The new extension init code didn't handle server resets (#3628,
-      Ebgert Eich).
-3643. xf86GetPciSizeFromOS() didn't close the file it opened (#3627,
-      Loic Grenie).
-3642. Export frexp() and ldexp() to modules (#3624, 3631, Juliusz Chroboczek).
-3641. Fixes for CTEXT handling in Xlib:
-       - rewrite CTEXT from/to converters for standard compliance
-       - CTEXT parser now understands UTF-8 (and other DOC) sequences and
-         performs only CTEXT sequence recognition
-       - detailed charset information parsing moved to the procedure that
-         adds 'charset object'
-       - Some actions for preparing 'charset object' moved to lcCharSet.c
-         (where it can be done easily)
-       - XlcAddCT call added to XLC_LOCALE file parser to allow recognition
-         of charsets that are described only in those files (ie, not
-         in internal Xlib tables)
-      (#3624, Ivan Pascal).
-3640. Convert the nv driver to use MMIO to access the VGA registers
-      instead of normal I/O ports.  Also riva_hw is updated to the
-      same version as is in 3.3.6 (#3620, Jarno Paananen).
-3639. DRI and Mesa update (#3619, Brian Paul, Precision Insight).
-3638. Fix a problem with the tdfx driver that can result in a lockup
-      (#3618, Nicholas Brealey).
-3627. Fix some PPC inline assembler in compiler.h (#3617, Kostas Gewrgiou).
-3626. Add support for the S3 Trio3D/2x and Trio3D chips to the s3virge
-      driver (#3616, 3623, Harald Koenig).
-3625. Fix some build problems on Solaris 8 with gcc (#3615, Richard Coley).
-3624. Fix an Xserver core dump that can happen when xdmcp-related command
-      line options have missing arguments (#3614, Harald Koenig).
-3623. Xterm patch #125 (#3611, Thomas Dickey).
-3622. Add a Type1 version of the cursor font (#3610, Juliusz Chroboczek).
-3621. Add Trident Cyber9540 detection (not tested) (Alan Hourihane).
-3620. Fix horizontal/vertical line drawing for r128 driver (Kevin Martin).
-3619. Update -probe option for all bus types (Alan Hourihane).
-3618. Fix primary card detection for -configure (Alan Hourihane).
-3617. Modularize the mouse driver (Alan Hourihane).
-3616. Fix Cyber9388 detection in trident driver (Alan Hourihane).
-3615. Implement some of the (installed) path restructuring that was
-      discussed back in April 1999 (David Dawes).
-3614. Remove duplicated code in XKB and InputMethod processing (#3396,
-      Ivan Pascal).
-
-XFree86 3.9.17c (30 January 2000)
-3613. Add DDC1 and DDC2 support to the NVIDIA driver (#3608, Jarno Paananen).
-3612. Make -configure multihead aware, add loading of all extension modules,
-      setup Layout sections (Alan Hourihane).
-3611. XTextPropertyToTextList doesn't work if incoming XTextProperty has
-      encoding field other than STRING or COMPOUND_TEXT (#3606, Ivan Pascal).
-3610. Fix a bug in the X11 generic converters that prevents them from
-      converting the last character in a string (#3605, Ivan Pascal).
-3609. Fix a bug in _XOpenLC() that was causing unallocated memory to be
-      freed (#3604, Ivan Pascal).
-3608. Xterm patch #124 (#3603, Thomas Dickey).
-3607. Fixes to the character set conversion tables (#3602, Bruno Haible).
-3606. Reduce the data section of libX11 by 30% by proper use of
-      'const' for tables (#3601, Bruno Haible).
-3605. Fix a bug in ConvertUCS4toUTF8() in libX11 (#3600, Bruno Haible).
-3604. Fix some fb macros that gcc accepted but which weren't legal ANSI C
-      (#3599, Keith Packard).
-3603. Update micmap to allow the drivers to specify the r/g/b mask values
-      (3598, Keith Packard).
-3602. Disable the cfbCopyPlane functions on big endian machines, and fix
-      a cfb24 bug (#3597, David Bateman).
-3601. Add a CheckExtension() function that can be called to check if an
-      extension has been initialised (David Dawes).
-3600. Allow extensions to specify which other extensions must be
-      initialised first, and sort the initialisation order according to
-      this information (David Dawes).
-3599. Force BIOS to be read from 0xc0000 for r128 driver (Kevin Martin).
-3598. Add a XXXAvailableOptions to DriverRec which allows passing available
-      options back to the -configure option (Alan Hourihane).
-3597. Avoid PCI-PCI bridges with an unexpected header type, which avoids
-      an infinite loop that can show up in the PCI bus enumeration code
-      (Egbert Eich).
-3596. More compilation fixups (Marc La France).
-3595. Add '###' (Comment) line capability to the parser (Alan Hourihane).
-3594. Fix the laguna driver to return MOD_CLASS_NONE (Alan Hourihane).
-3593. Add the 'extmod' module to the -configure option (Alan Hourihane).
-3592. Modify the extension loading code so that he core server no longer
-      needs to be aware of all extensions that can be loaded (David Dawes).
-3591. Remove XExtensionVersion from XPrint headers (Dirk Hohndel, from 3.3.5).
-3590. Fix a build problem with the static server related to the -configure
-      option code (#3596, Takaaki Nomura).
-
-XFree86 3.9.17b (24 January 2000)
-3589. Add a rule to lnxdoc.rules for maintainers to use to update the
-      formatted docs (David Dawes).
-3588. Add new -configure option to generate a clean XF86Config without the
-      need for a config tool. But hopefully could be used with XF86Setup.
-      (Needs some OS based updates - tested only on linux so far)
-      (Alan Hourihane).
-3587. Fix 64 bit problem in the Xv client header files (Mark Vojkovich).
-3586. Change the default charset for et_EE from ISO8859-4 to ISO8859-15,
-      which conforms with the upcoming standard EVS8:1999
-      (http://www.eki.ee/itstandard/) (#3595, Ville Hallik).
-3585. Fix a bug in XKB's CapsLock handling for some non-Latin1 locales,
-      and add support for ISO8859-15.  Without this, CapsLock only affects
-      Latin1 keysyms and has no effect on scaron and zcaron, for example
-      (#3595, Ville Hallik).
-3584. Add Estonian keyboard support to XKB (#3595, Ville Hallik).
-3583. Hack to disable optimisation when building Xext/xf86vmode.c on FreeBSD
-      4.0 to avoid a compiler bug (David Dawes).
-3582. Disable the hardware cursor in the tdfx driver when the screen is
-      too wide for the hardware to properly position the cursor on the
-      right side of the screen (#3593, Scott Bertin).
-3581. Fix a typo in panoramiXprocs.c that shows up on SVR4.0 (#3592,
-      Takaaki Nomura).
-3580. Xterm patch #123 (#3591, Thomas Dickey).
-3579. Add a "Status" document that lists and compares the driver status of
-      4.0 and 3.3.x (needs a lot more input) (David Dawes, plus contributions
-      from the devel team).
-3578. Fix a problem with the EmulateTimeout line in the file generated
-      by xf86config, and have xf86config create /etc/X11 if it doesn't
-      already exist (David Dawes).
-3577. Put an OS-independent version of the int10 module/library in
-      xfree86/int10, but still allow an OS-specific version to override
-      it (David Dawes).
-3576. Import a minimal subset of the x86emu 0.6 distribution (David Dawes).
-3575. Register the required/referenced int10 symbols in the nv driver
-      so that there are no warnings on platforms that don't have this
-      module (David Dawes).
-3574. Don't probe for PC98 architecture on Solaris (David Dawes).
-3573. Fix some SVR4.0 build problems related to bzero() (David Dawes).
-3572. Rewrite the way Xinerama deals with events (Mark Vojkovich).
-3571. Fix VT switching problem in shadowfb (Marc La France).
-3570. Initialize DST_X_DIR and DST_Y_DIR for solid filled rects and for
-      horizontal and vertical lines to fix line drawing problems, and
-      initialize ScanlineCPUToScreenColorExpandFillFlags to fix font
-      corruption problems in r128 driver (Kevin Martin and Rik Faith).
-3569. Fix BIOS reading problem with r128 driver (Kevin Martin).
-3568. Fix imake failure in Mesa Imakefile (Kevin Martin).
-3567. Change trident driver to use fb instead of cfb and make DDC1 info
-      available to the primary card (Alan Hourihane).
-3566. Fix an XAA text corruption problem introduced by the endian fix
-      in 3.9.17a (David Dawes).
-
-XFree86 3.9.17a (21 January 2000)
-3565. Update linux.cf to use the kernel header files on Debian rather than
-      those packaged with the libc headers (#3544, Simon Richter).
-3564. Add an item to the default twm menu to open an xterm window (#3584,
-      David Brownlee).
-3563. Update Spanish locales in xc/nls (#3583, Fernando Herrera).
-3562. Fix I2C/DDC for S3 ViRGE (#3582, Harald Koenig).
-3561. Update the fbdevhw module for some new cards (#3579, Kostas Gewrgiou).
-3560. Fix interpret_vdif.c for big endian machines (#3578, Kostas Gewrgiou).
-3559. Minor fix to DDC to find monitor descriptions in EDID v1.1 (#3576,
-      Andrew Aitchison).
-3558. Allow silken mouse to work when building on Linux without DRI (#3574,
-      Keith Packard).
-3557. Only do the kbdrate I/O on architectures that support it (#3573, 3581,
-      Kostas Gewrgiou, Branden Robinson).
-3556. Fix XAA colour expansion for big-endian architectures (#3572,
-      Kostas Gewrgiou).
-3555. Update QNX support (#3570, Frank Guangxin Liu).
-3554. Fix "controlization" in XLookupString for chars > 127 (#3569,
-      Ivan Pascal).
-3553. Take advantage of FB speedups in Tiny-X (#3568, Keith Packard).
-3552. Speed up FB and do 32bit accesses instead of 64bit accesses
-      (#3567, Keith Packard).
-3551. Eliminate saving the contents of the screen durint VT switching
-      (#3562, Keith Packard).
-3550. Make using fb easier for driver writers (#3561, Keith Packard).
-3549. Fix TCP font server connections (#3560, Keith Packard).
-3548. Implement the "OverclockMem" option for the Millennium and Millennium
-      II (#3558, Andrew Aitchison).
-3547. Speed up some FB performance problems (#3557, 3559, 3560, 3588, 3589,
-      Keith Packard).
-3546. Work around a bad code generation bug in gcc 2.7.2.3 that shows up
-      in XAA (#3550, Rik Faith).
-3545. Add a -brief option to xclock to show only hours and minutes when in
-      digital mode (#3549, Keith Packard).
-3544. Fix some dead key problems with xkb symbols for Swiss French and
-      Swiss German keyboards (#3546, Charles Lopes).
-3543. Add drm_poll to fix SIGIO problem in the drm kernel modules, and change
-      drm to use /{proc,dev}/dri to avoid conflicts with /{proc,dev}/graphics
-      (Rik Faith and Daryll Strauss).
-3542. Fix some fb/glint-realted static build problems (Marc La France).
-3541. Add 3.9.17 xterm information to the RELNOTES (#3541, Thomas Dickey).
-3540. Fix some 64-bit problems in the GLX code (#3539, Dave Gilbert).
-3539. Execute the GLINT delta code in the Probe for each instance of
-      hardware found, not just the first one (#3534, Michael Rohleder).
-3538. Allow mesa to build on an Alpha (#3533, Matt Grossman).
-3537. Fix glint/Imakefile so that the correct fb.h is included, and rename
-      the private fb.h file in fbdevhw so that it won't be mistakenly included
-      instead of the one in Xserver/fb (David Dawes).
-3536. Fix some (unused) bad usages of InstallDynamicModule (David Dawes).
-3535. Make the Glint driver use the new fb module and fix correct operation
-      for 24bpp support (Alan Hourihane).
-3534. Fix for various compilation glitches (Marc La France).
-3533. Fix some Segmentation faults with NULL pointers in xf86Config.c
-      (Alan Hourihane).
-3532. Update some drivers to respect the PROBE_DETECT flag and update
-      xf86DoProbe to print out the supported chipset list (Alan Hourihane).
-3531. Update Trident driver to fix Clock source for 9440 chips and allow
-      linear framebuffer mapping for nommio (Alan Hourihane).
-3530. Fix fb for module compiling and ifdef fbcmap for now (Alan Hourihane).
-3529. Add Cyber9397 and Cyber9397DVD PCI ID detection to trident driver
-      (Alan Hourihane).
-3528. Fix Multiple MX RegisterResources with RAC in glint
-      driver (Alan Hourihane).
-3527. Update loader for Xinerama changes (Alan Hourihane).
-3526. Massive Xinerama rewrite (Mark Vojkovich).
-      - Change the way it deals with resources.
-      - Remove broken Xinerama code from the multibuf extension.
-      - Add support for shared memory pixmaps.
-      - Lessen Xinerama's impact on DIX.
-3525. Point and arc acceleration improvements for the NVIDIA driver
-      (Mark Vojkovich).
-3524. MGA acceleration modifications to prevent pci retries during
-      color expansions (Mark Vojkovich).
-
-XFree86 3.9.17 (31 December 1999)
-3523. Clean up bindist directories for the loader server (Robin Cutshaw).
-3522a. Fix return values in PsImageText8() and PsImageText16() (#3535,
-      Takaaki Nomura).
-3522. Old-style DGA keyboard input fix (#3536, Keith Packard).
-
-XFree86 3.9.16Za (29 December 1999)
-3521. Fix HW cursor on rendition V2K (#3532, Dejan Ilic).
-3520. Sync wacom driver with 3.3 (Frederic Lepied).
-3519. Resolve missing symbol in TDFX driver (#3531, Dave Gilbert).
-3518. Allow TDFX driver to build on Linux-axp (#3530, Dave Gilbert).
-3517. Fix Linux-axp compile problem (#3529, Dave Gilbert).
-3516. Jumbo Tiny-X patch with Itsy support (#3527, Keith Packard).
-3515. Turn off debug messages in font client code (#3525, Keith Packard).
-3414. Allow colormap privates to be allocated before default colormap
-      (#3524, Keith Packard).
-3413. Make Xserver/fb work with R6.3 server and with MSB cpu
-      (#3523, Keith Packard).
-3412. Compress built-in fonts (#3522, Keith Packard).
-3411. Fix ct_driver for static server (#3521, Takaaki Nomura).
-3410. Fix the last Xaw user of XtOffset (#3520, Keith Packard).
-3409. FreeBSD-current compile fix (#3519, Eric Anholt).
-3408. Xterm patch #122. (#3517, Thomas Dickey).
-3407. Remove duplicate symbol from loader (#3516/3528,
-      Jarno Paananen/Nicholas Brealey).
-
-XFree86 3.9.16Z (28 December 1999)
-3406. Temporary fix for building linux platform without glide (Robin Cutshaw).
-3405. Fix unresolved symbols for the loader (#3501, Matthieu Herrb).
-3404. Fix compiles on non-NetBSD systems (#3499, Matthieu Herrb).
-3403. Fix XKB XlookupString usage (#3511, Ivan Pascal).
-3402. Use ForceLatin1Lookup mode after XmbLookupString/XwcLookupString
-      (#3510, Ivan Pascal).
-3401. Export symbols for SGI driver (#3505, Terence Ripperda).
-3400. Fix problem with compilation of static server on SVR4.0
-      (#3497,3514 Takaaki Nomura).
-3399. Fix where using bitsPerPixel from screen pixmap to use drawable,
-      fix default visual class search for fallback visual, fix pixmap
-      privates allocation, change screen init sequence so that the
-      calling function is responsible for init of backing store
-      (#3495, Keith Packard).
-3398. Fix more problems between the X and font servers (#3493, Keith Packard).
-3397. Fix util/memleak to work on linux/x86 (#3492, Keith Packard).
-3396. Add DPS support hooks (#3491, Juliusz Chroboczek).
-3395. Add QNX4, Neutrino support (#3489, Frank Guangxin Liu).
-3394. Add ATI Rage 128 Pro PF support to r128 driver (#3488, Rik Faith).
-3393. AutoRepeat fix for xf86config (#3485, Harald Koenig).
-3392. Cirrus driver split for Laguna and Alpine (#3484, Derek Fawcus).
-3391. Mga_dac3026 rev A/B fixes (#3427, Mark Montague).
-3390. Jumbo font patch.  This updates the bdf/misc fonts to the
-      latest ISO versions (#3429+updates, Markus Kuhn).
-3389. Fix a problem with no Xv encodings being reported (Mark Vojkovich).
-3388. Update Xv driver interface docs (Mark Vojkovich).
-
-XFree86 3.9.16f (15 December 1999)
-3387. Fix posix compliance problem in Xserver/os/utils.c
-      (Robin Cutshaw/Keith Packard).
-3386. Fix for os2_bios (#3483, Holger Veit).
-3385. Enhance DK keyboard support (#3481, Keld Simonsen).
-3384. Xv client library documentation (#3480, Mark Vojkovich).
-3383. Rendition microcode cleanup, accel fix, int10/ddc support,
-      pixmap cache fix, doc update (#3479, Dejan Ilic/Marc Langenbach).
-3382. Reverse kbdrate patch (#3478, Harald Koenig).
-3381. Add Xv support to tga driver (#3473, Matt Grossman).
-3380. Add ViRGE/MX and BIOS probing to the s3virge driver (#3470,
-      Harald Koenig).
-3379. Install NetBSD aperture driver in /usr/local until added to
-      the core O/S (#3466, Matthieu Herrb).
-3378. Add QNX/Neutrino support (#3464, Frank Guangxin Liu).
-3377. DRI megapatch.  This moves mesa to xc/extras, updates Mesa to
-      version 3.2, adds full support and fifo code for 3dfx hardware,
-      and updates the device driver to work with Linux 2.3 kernels
-      (#3463, Daryll Strauss).
-3376. Fix dynamic loading on the alpha platform (#3459, Hannes Reinecke).
-3375. Add Xinerama option to the serverlayout section of the config file
-      (#3458, Joe Moss).
-3374. Add accelerated line support, clean up accel code, and other fixes
-      for the tga driver (#3453, Matt Grossman).
-3373. Restore colormap on exit in nv driver (#3452, Thomas Mueller).
-3372. Generalize the SIGIO way of reading input data (#3450, Frederic Lepied).
-3371. Fix missing quotes in Xt docs (#3443, Matthieu Herrb).
-3370. Add request bounds checking for xfs (#3449, Keith Packard).
-3369. Fix problem where font library fails to match bitmap instances
-      (#3448, Keith Packard).
-3368. Change font client code to recover from font server hangs/crashes
-      and reduce memory fragmentation (#3446, Keith Packard).
-3367. Allow MAXCLIENT to be any of 64, 128, 256, or 512 and adjust the
-      resource allocation code as appropriate (#3445, Keith Packard).
-3366. Fix compile problems with Solaris 7 (#3437, Nicholas Brealey).
-3365. Add Riva TNT2 M64 to nv_driver (#3436, Jarno Paananen).
-3364. Add prototypes for Xserver/Xprint and fix various problems with
-      Xprint (#3432, Thomas Dickey).
-3363. Add proper clock checking for VidMode extension, add SDK fixes for
-      missing files, add SilkenMouse for C&T driver (#3424, David Bateman).
-3362. Sync v4l and glint drivers with the new Xv changes (Mark Vojkovich).
-3361. Add XvImage support to the MGA driver - G200/400 only (Mark Vojkovich).
-3360. Xv changes/additions (Mark Vojkovich)
-      - XvImage support in the Xv DDX, DIX, client libs and header files.
-      - Add min and max fields to the XvAttributes.
-      - Reved Xv minor version.
-      - Rewrote some of the way clipping is dealt with in the Xv DDX.
-3359. Fix nv driver rendering bugs (Mark Vojkovich).
-3358. Add MTRR support for LynxOS (#3419, Thomas Mueller).
-3357. Fix bad return in GLINTAdjustFrame (#3418, David Holland).
-3356. Fix some build problems with the rendition driver, including a general
-      problem building the static server, and problems that show up on
-      some OSs (David Dawes, #3418, David Holland).
-
-XFree86 3.9.16e (5 December 1999)
-3355. Fix a problem with the bitmap font module (#3421, Matthieu Herrb).
-3354. Misc. bug/typo fixes. (Egbert Eich)
-3353. Fixed scanpci to generate better output on Alphas (Harald Koenig,
-      Egbert Eich)
-3352. Added initial VESA VBE support. This includes initialization
-      and DDC. (Egbert Eich)
-3351. Added support for 64bit PCI devices (untested) (Egbert Eich.
-3350. Added support to read PCI memory and io ranges from kernel on
-      Linux 2.3 (untested). (Egbert Eich)
-3349. introduced "#undef" before definitions in xf86_libc.h to keep
-      gcc on Alpha quite. (Egbert Eich)
-3348. Added a function to check if any resource needs to share memory.
-      Required for DGA. (Egbert Eich)
-3347. Added copyright messages to int10 code. Fixed int10 code to
-      run on Alphas.
-3346. Changed some byte and word access to MMIO registers in drivers
-      to use MMIO_READ/WRITE8/16(). Made attempt to make some drivers
-      64 bit (and Alpha!) clean: s3virge, chips, gling, neomagic.
-      Fixed bugs in compiler.h.  (Egbert Eich)
-3345. Made part of the code 64 bit clean. (Egbert Eich)
-3344. Cleanups in the C&T driver. (Egbert Eich)
-3343. Clearified meaning of VIDMEM_MMIO and VIDMEM_MMIO_32BIT. (Egbert Eich)
-3342. Added support for host-PCI bridges. (Egbert Eich)
-3341. Changed policy for removing resource overlaps.
-      Removed a bug in findIntersect() (xf86Bus.c).
-      Added function that enables/disables all resources of a given
-      screen. Added a config file option to set overlap removal
-      aggressiveness.(Egbert Eich)
-3340. Split xf86Bus.c into generic/pci/isa specific parts. (Egbert Eich)
-3339. Faster clocks for the G400 (Mark Vojkovich).
-3338. Fix bug in FB manager's ResizeArea function (Mark Vojkovich).
-3337. Pass positioning information for the obsolete ServerLayout format
-      to the common layer, and update the DESIGN doc for the newer ServerLayout
-      formats (David Dawes).
-
-XFree86 3.9.16d (19 November 1999)
-3336. Fx up new MMIO macros (#3337, Matt Grossman).
-3335. Clean up compiler warnings in lib/font/bitmap (#3411, Matt Grossman).
-3334. TGA fixes, add sync on green (#3410, Matt Grossman).
-3333. Fix NULL pointer dereference in libXaw (#3406, Christopher Sekiya).
-3332. Add Rage128 support (#3405, Rik Faith, funded by ATI).
-3331. Add MTRR support for NetBSD and OpenBSD. Add new NetBSD aperture driver
-      (#3404, Matthieu Herrb).
-3330. Xterm patch #121 (#3402, Thomas Dickey).
-3329. Rendition driver bugfixes and alpha related cleanups (#3400,
-      Dejan Ilic, Marc Langenbach, Egbert Eich).
-3328. Add void input device (ä3392, Frederic Lepied).
-3327. Changed the Xon serial option to be able to select xon/xoff for input,
-      output or both. Add support for Graphire models. Change wacom init
-      phase to use new Xoff option (#3391, Frederic Lepied).
-3326. Change the SwapAxes option to SwapXY in elographics/microtouch driver
-      to match an already existing option in the Dynapro driver. Add a Focus
-      class capability to the elographics driver (#3395, Patrick Lecoanet).
-3325. Update mouse rate handling (#3388, Harald Koenig).
-3324. Fix NULL pointer dereference in misprite.c (#3380, Edward Wang).
-3323. Add FBDev and ShadowFB support to glint driver. Add new option
-      "NoWriteBitmap" (#3383, Michel Daenzer).
-3322. Update SuperProbe to handle S3 Savage4, Savage200 and clean up
-      Trio3D/Savage3D detection (#3382,3384 Harald Koenig).
-3321. Add new framebuffer code and tiny X DDX architecture (#3379,
-      Keith Packard).
-3320. Add DGA2 documentation (#3378, Mark Vojkovich).
-3319. Update XFree86 manpage wrt -bpp/-depth/-fbbpp (#3377, Andy Isaacson).
-3318. Make SuperProbe check primary cards, only (#3374, Harald Koenig).
-3317. Add SilkenMouse to *BSD (#3373, Matthieu Herrb).
-3316. Allow SilkenMouse to work if not all drivers of an OS support SIGIO
-      (#3372, Keith Packard).
-3315. Fix a few problems in TGA driver and add support for backing store
-      and SilkenMouse (#3371, Matt Grossman).
-3314. Add smarter scheduler (#3370, Keith Packard).
-3313. Xterm patch #120 (#3369, Thomas Dickey).
-3312. Enable xf86SetKbdRate function on Solaris 8 (#3364, David Holland).
-3311. Fix some bugs and add acceleration to Rendition server (#3360,
-      Dejan Ilic).
-3310. Make raw DDC information available as properties in the root window
-      (#3357, Andrew Aitchison).
-3309. Fix for xf86CreateRootWindow (#3355, Andrew Aitchison).
-3308. Add manpage for the chips driver (#3353, David Bateman).
-3307. Update contact info (#3352, Andrew van der Stock).
-3306. Add kbd rate support for Linux (#3363, Harald Koenig).
-3305. Update Portuguese XKB map (#3351, Joao Esteves, Francisco Colaco).
-3304. Fix text clipping in 3dfx driver (#3349, Henrik Harmsen).
-3303. Fix S3 ViRGE hw cursor (#3348, Harald Koenig).
-3302. Fix clipping in 3dfx driver (#3342, Daryll Strauss).
-3301. Enable SilkenMouse for 3dfx driver (#3341, Henrik Harmsen).
-3300. Enable SIGIO support on LynxOS (#3339, Thomas Mueller).
-3299. Get TRUE defined in sigio.c. Fix xterm compile problem on ISC
-      (#3338, Michael Rohleder).
-3298. Correct DPMS suspend/standby modes for 3dfx driver (#3336,
-      Henrik Harmsen)
-3297. Xterm patch #119 (#3335, Thomas Dickey).
-3296. ATI LCD changes to add interlaced mode support and near-final rework of
-      mode validation (Marc La France).
-3295. Keep track of a mode's hsync and vrefresh rates used for monitor checks
-      so they can be displayed by xf86PrintModes() (Marc La France).
-3294. Add sync polarities to VESA modes (Marc La France).
-3293. Fix VESA mode typos and some warnings (Marc La France).
-3292. Add GeForce/Quadro support to the NVIDIA driver (Chas Inman,
-      Mark Vojkovich).
-3291. Fix a DGA colormap problem (Mark Vojkovich).
-3290. Disable the Double-Buffer extension in Xinerama mode since it
-      doesn't work (Mark Vojkovich).
-3289. Fix XAA scanline color expansion routines to check the buffer address
-      after the Subsequent function is called.  This allows the driver to
-      change buffers on-the-fly (Mark Vojkovich).
-3288. Update PCI device IDs for newer NVIDIA chipsets (Mark Vojkovich).
-3287. Add an 80 Hz sample rate option for PS/2 mice (Mark Vojkovich).
-3286. Remove ATI driver's meddling with LCD power management facilities
-      (Marc La France).
-3285. Ensure miInitializeBanking() fails when a bank clip region cannot be
-      allocated (Marc La France).
-3284. Static server fix for s3virge and nv drivers (Marc La France).
-3283. Map MMIO areas on ATI adapters (Marc La France).
-3282. Disable DirectColor and gamma support for the original ATI integrated
-      controllers (Marc La France).
-3281. Linear aperture fixes for ATI 88800 and CT controllers (Marc La France).
-3280. Make LCD mode validation changes in ATI driver (CHANGELOG #3271)
-      into a development option, restoring the previous behaviour by
-      default (Marc La France).
-3279. When display subsection mode names run out without yeilding a valid mode,
-      continue validation with the largest unvalidated modePool member, rather
-      than the first (Marc La France).
-3278. Allow drivers to specify whether or not sync/refresh rates in monitor
-      sections are optional and use this for ATI LCD support (Marc La France).
-3277. Replace xf86Exiting with its DIX counterpart, dispatchException's
-      DE_TERMINATE bit (Marc La France).
-3276. NVIDIA driver changes (Mark Vojkovich):
-      - Improved shadowfb support (screen rotation).
-      - Improved acceleration (color expansion, lines).
-      - Fixed some rendering correctness issues.
-      - Full DGA 2.0 support including changing depth on the fly.
-3275. Make usage of hardware clipping in XAA more consistent (Mark Vojkovich).
-3274. Limit MGA driver to using 16 Meg of ram to workaround some hardware
-      limitations (Mark Vojkovich).
-3273. Fix DGA event bug (Mark Vojkovich).
-3272. Mode validation changes (Marc La France).
-      - Remove assumption that modes of the same name are also of the same
-        size.
-      - Even if Display subsection mode names include duplicates, no two names
-        will ever match the same mode.
-      - If the supplied mode names do not yield a usable mode (including the
-        case where no names are supplied), scan the mode pool until a usable
-        mode is found.  This is a step towards allowing successful server
-        runs with XF86Config's that specify no mode information whatsoever.
-      - Implement minHeight and maxHeight checks.
-      - Call the driver's ValidMode() for a final OK just before accepting a
-        mode.
-      - Free mode pool on xf86PruneDriverModes() calls.
-      - Documentation updates.
-      - Minor fixes to C&T and GLINT drivers.
-3271. ATI driver updates (Marc La France).
-      - Disallow interlaced modes when scanline pitch exceeds hardware limits.
-      - LCD support no longer depends on the mode on server entry.
-      - Fix bug introduced by CHANGELOG entry 3245.
-      - Re-lock adapters on ATIPreInit() failures.
-      - Make default sync polarities consistent.
-3270. Trident updates for ISA cards and DGA support (Alan Hourihane).
-3269. mibank bug fixes (Marc La France).
-3268. Add -withrevinfo flag to lndir to allow shadowing of RCS, SCCS, CVS and
-      CVS.adm directories (Marc La France).
-3267. SIGIO workaround for older Linux kernels (Marc La France).
-3266. Fix xalloc.c compilation failure with -DXALLOC_LOG (Marc La France).
-3265. Change ATIProbe() to use int 10 vector to locate the BIOS of VGA and
-      VGA Wonder non-PCI adapters (Marc La France).
-3264. Make '-probe' work for static server and ATI driver (Marc La France).
-3263. #define _POSIX_C_SOURCE to 2 for Linux libc5 (Marc La France).
-
-XFree86 3.9.16c (13 October 1999)
-3262. Export SetCriticalEvent from DIX, it was an unresolved external in
-      xf86dga2.c (#3326, Jarno Paananen).
-3261. Removes Alpha-specific MMIO-mappings from NVIDIA driver in the
-      same fashion that was done in MGA-driver (#3326, Jarno Paananen).
-3260. Add SilkenMouse to NVIDIA and Glint drivers (#3326, Jarno Paananen).
-3259. Workaround for problem in xf86RegisterRootWindowProperty() code
-      (Jarno Paananen).
-3258. DGA workaround for recent VTSwitch changes (#3325, Mark Vojkovich).
-3257. Out of memory fixes for the mi region code (#3323, 3324, Keith Packard).
-3256. "Silken Mouse" support (#3323, Keith Packard).
-3255. Modify the ati driver to temporarily ignore Rage 128s (#3322,
-      Marc La France).
-3254. Fix offscreen memory handling for xf4bpp when VT switched away
-      (Alan Hourihane).
-3253. xf4bpp, xf1bpp, ISA additions for the trident driver (Alan Hourihane).
-3252. Fix problem with cleanup after XAA offscreen pixmap allocation fails
-      (Mark Vojkovich).
-3251. Fix missing USE_MMIO define in trident driver (Alan Hourihane).
-3250. Blade, image and trident updates for the trident driver (Alan Hourihane).
-3249. A very preliminary "-probe" mode for the X server (David Dawes).
-3248. Remove __alpha__ ifdefs from the mga and s3virge drivers by changing
-      the way sparse MMIO access is handled (David Dawes).
-3247. Fix a WarpPointer bug introduced when "xineramifying" some dix code
-      (Mark Vojkovich).
-3246. Move the BuildObjectFromLibrary rule into Imake.rules.
-3245. Fix text mode restoration when large modes are used in the ATI driver
-      (#3318, 3321, Marc La France).
-3244. Rendition driver update, including skeleton HW cursor and accelerated
-      support (#3317, Dejan Ilic, Marc Langenbach).
-3243. Change mode validation to allow drivers to modify a mode before it
-      is checked against the monitor's constraints (#3316, Marc La France).
-3242. C&T driver fix (#3314, David Bateman).
-3241. Change the ati mode validation strategy for programmable clocks to best
-      refresh (#3313, Marc La France).
-3240. Fix ATI Rage XL/XC & Mobility support so that it actually works this time
-      (#3313, Marc La France).
-3239. Update the xfsft code to version 1.1.7 (#3310, Juliusz Chroboczek).
-3238. Remaining keyboard support for Solaris 8/x86, including keyboard beep,
-      auto-repeat, keyboard LEDs, modifier keys (#3294, 3309, David Holland).
-3237. Add xf86RegisterRootWindowProperty() - a mechanism for drivers etc
-      to add properties to the root window before the screen is created
-      (#3307, Andrew Aitchison).
-3236. Fix two problems that may occur when some extension allocates a "font
-      private index" while a font is already open (#3305, Bruno Haible).
-3235. Xterm patch #118 (#3303, Thomas Dickey).
-3234. Fix a typo in a dga header file (#3302, Mark Vojkovich).
-3233. Update rendition name info in scanpci (#3301, Dejan Ilic).
-3232. Getuid fix for scanpci (#3300, Marc La France).
-3231. This patch will avoid compilation warnings when GCC 3.0 comes out (#3299,
-      Bruno Haible).
-3230. Fix some build warnings (#3298, Bruno Haible).
-3229. Fix for the DebuggableLibraries support (#3297, Bruno Haible).
-3228. Revert to always using bison instead of yacc on Linux (#3296,
-      Bruno Haible).
-3227. Fix XAA flags checking for the ScanlineImageWrite function (#3293,
-      Alan Hourihane).
-3226. Fix some problems wth the SiS 2x5 chipsets, and disable advertising
-      support for the 201 and 202 chipsets (#3292, Juanjo Santamarta).
-3225. Call SoftReset for MGA cards on PC-98 machines (#3291, Isao Ohishi).
-3224. Use the int10 soft booter to get a non-primary voodoo3 card to work
-      with the tdfx driver (#3290, Henrik Harmsen).
-3223. Fixes for the i740 and neomagic drivers (#3289, Jeff Hartmann).
-3222. Enable compiling ico on systems with pre-standard pthread API (e.g.,
-      LynxOS), and fix a problem where a condition variable is used without
-      holding the corresponding mutex (#3288, Thomas Mueller).
-3221. Add soft-booting capability to the glint and nv drivers (#3287,
-      Jarno Paananen).
-3220. Xterm patch #117 (#3285, Thomas Dickey).
-3219. Fix xf8_32bpp's VT switching by restoring the previous
-      xf86SaveRestoreImage() into it (#3284, Marc La France).
-3218. Remove duplicate symbol in misym.c (#3283, Alan Hourihane).
-
-XFree86 3.9.16b (27 September 1999)
-3217. Xterm patch #116 (#3280, Thomas Dickey).
-3216. Add new flags to the Xv adaptor type to indicate that it can be used
-      to render into window or pixmaps and do video or stills (#3279,
-      Mark Vojkovich).
-3215. Fix some MGA pci retry related corruption problems (#3278,
-      Mark Vojkovich).
-3214. Attempt to autoprobe the memory on all MGA cards except the 2164
-      (#3277, Mark Vojkovich).
-3213. APM driver updates, including bug fixes, 24bpp acceleration and
-      improved Rush support (#3276, Loic Grenie).
-3212. Some DGA fixes (3275, Loic Grenie).
-3211. Fix and document the CMAP_LOAD_EVEN_IF_OFFSCREEN option for the common
-      layer cmap code (#3274, Marc La France).
-3210. Some resource management speed improvements in Xinerama (#3273,
-      Mark Vojkovich).
-3209. Fix an off-by-one error in shadowfb's EnterVT wrapper (#3272,
-      Marc La France).
-3208. Fix ATI driver DAC handling for >8bpp TrueColor and add >8bpp
-      DirectColor support (#3271, Marc La France).
-3207. Add a hardcopy version of the Xv specs (#3270, Mark Vojkovich).
-3206. Integration of a bug fix by David Woodhouse in the Microtouch
-      driver. Correct a possible problem when configuring only one of
-      the two devices supported by the driver (#3269, Patrick Lecoanet).
-3205. Update XF86Conf.man to reflect the current state of the input drivers
-      (#3269, Patrick Lecoanet).
-3204. Add support for the ThruGlass touchscreens to the Microtouch driver
-      (#3269, Andreas Micklei).
-3203. Add SwapAxes and PortraitMode options to the Elographics and
-      Microtouch drivers (#3269, Patrick Lecoanet).
-3202. Port Microtouch and elographics drivers to the new module loading method
-      (#3269, Patrick Lecoanet).
-3201. Rewrite the way Xinerama handles visibility events.  Also fix some
-      problems with CoordModePrevious primitives drawn on the root window
-      (#3267, Mark Vojkovich).
-3200. Some Xaw and xedit updates.  The html-mode code is removed from xedit
-      (#3265, Paulo Cesar Pereira de Andrade).
-3199. Fix a problem with pScrn->rgbBits not being set in the correct place
-      in the tdfx driver (#3264, Scott Bertin).
-3198. Update ATI info for `XFree86 -scanpci` (#3263, Marc La France).
-3197. ATI driver changes:
-       - Rage XC & Rage XL fixes.
-       - Preliminary Rage Mobility support.
-       - Fix from Christian Lupien to disable TVOUT feature of 3D Rage
-         adapters.
-       - Work around vertical blending limitations with "shallow" modes by
-         doublescanning (accelerator CRTC) or multiscanning (VGA CRTC) them.
-       - Fix bug that did not map the VGA aperture for generic VGA support.
-      (#3260, Marc La France).
-3196. Warning fixes in miscrinit.c (#3260, Marc La France).
-3195. Rework mibank for maintenance reasons (#3260, 3281, Marc La France).
-3194. VT switching changes, implementing a framework for framebuffer layers
-      to be notified when an aperture is remapped at a different virtual
-      address during EnterVT, and improved DDX-independence for mibank,
-      and xf86SaveRestoreImage() no longer cares how the lower framebuffer
-      layers access pixmap pixels (#3260, Marc La France).
-3193. Remove scanpci's redundant check for "root".  It get in the way when
-      setting its setuid bit (#3260, Marc La France).
-3192. Add several acceleration functions to the tdfx driver, and fix some
-      compliance problems (#3259, Darryl Strauss).
-3191. i740 driver updates (#3256, Kurt Olsen).
-3190. Enable image writes in the nv driver for the TNT in 32 bit mode
-      (#3255, Jarno Paananen, Neil Burch).
-3189. Remove the last global variables from the nv driver (#3255,
-      Jarno Paananen).
-3188. Turn MGA soft reset stuff back on but modified so that it doesn't
-      poll for fifos in case the PLLs aren't powered up (#3254,
-      Mark Vojkovich).
-3187. Xterm patch #115 (#3253, Thomas Dickey).
-3186. Comment out some of the CacheBlit tiling code since the logic is not
-      quite correct and it can get stuck in an endless loop in some cases
-      (#3250, Mark Vojkovich).
-3185. Fix tseng 24 bpp mode (#3249, Egbert Eich).
-3184. Fix et4000W32p font corruption with ColorExpandScanline in modes > 8bpp
-      (#3249, Egbert Eich).
-3183. Add Solaris 8 support (#3241, 3247, David Holland).
-3182. Fix some build problems in the Type1 code that show up on Solaris 8
-      (#3241, David Holland).
-3181. Add an ISO8859-1 version of the "micro" font (#3246, Mark Montague).
-3180. Minor DDC code improvement: xf86PrintEDID() now returns pointer to
-      monitor structure (#3245, Egbert Eich).
-3179. Problem with RAC wrapper (hopefully) fixed (#3245, Egbert Eich).
-3178. Neomagic ScreenToScreenCopy bug fix (#3245, Egbert Eich).
-3177. Initial INT10 module (Linux-only so far) (#3245, 3248, 3251, Egbert Eich).
-3176. Update the DRM Linux kernel module to match that in the Linux 2.3.18
-      tree, and update libdrm and the DRI routines that use libdrm to reflect
-      changes in the Linux kernel (#3244, Rik Faith).
-3175. Fix a WarpPointer bug in Xinerama (#3243, 3252, Mark Vojkovich).
-3174. Fix a seg fault when changing DGA mode (#3242, Loic Grenie).
-3173. Xterm patch #114 (#3240, Thomas Dickey).
-3172. Fix an XAA GC validation problem with Polygons for some fillStyles in
-      some situations (#3239, Mark Vojkovich).
-3171. Fix an incorrect method for preallocating a color on the default map
-      (#3237, Mark Vojkovich).
-3170. Fix a bad assumption in the XAA NonTE text rendering code (#3236,
-      Mark Vojkovich).
-3169. An attempt to autodetect the G400 Max and set the max pixel clock
-      appropriately (#3235, Mark Vojkovich).
-3168. Fix shadowfb problems when drawing is done while switched out (#3234,
-      Marc La France).
-3167. Attempt to autodetect SDRAM in the MGA driver for the primary head
-      (#3233, Mark Vojkovich).
-3166. Make Window->Pixmap copies in Xinerama less broken (#3232,
-      Mark Vojkovich).
-3165. Fix a bug in the Xinerama ShmGetImage support added in the last alpha
-      (#3230, Mark Vojkovich).
-3164. New cursor warping code.  This implements the new way of specifying
-      screen positions in the ServerLayout config file section (#3229,
-      Mark Vojkovich).
-3163. Add a xf86CheckMTRR function which returns TRUE when changing the
-      MTRR setting is supported and enabled (#3227, Alan Hourihane).
-3162. Resync SuperProbe and scanpci with the 3.3.x version (#3226,
-      Marc La France).
-3161. Make 8+24 work on Matrox 2064w (Millennium I) with >4MB (#3224,
-      Mark Montague).
-3160. Make xdpyinfo -ext XFree86-VidModeExtension print the current mode line
-      (#3223, Andrew Aitchison).
-3159. Minor fix to Xnest Imakefile (#3222, Marc La France).
-3158. Make the wrapping or replacement of ScreenRec region code function
-      pointers reliable when NEED_SCREEN_REGIONS is #define'd (#3221,
-      Marc La France).
-3157. Remove ScreenRec region code function pointers (except BitmapToRegion)
-      when the server is compiled with NEED_SCREEN_REGIONS #undef'ined
-      (#3221, Marc La France).
-3156. Fix memory leak during resource broker initialisation (#3220,
-      Marc La France).
-3155. During broker initialisation, use both system and non-system PCI
-      resources to "trim" OS resources.  Among other things, this allows the
-      maximum memory limit to be bumped back up to 2G (#3220, 3282,
-      Marc La France).
-3154. Temporarily allow a driver to register resources that only conflict with
-      resources whose size the common layer has only estimated (#3220,
-      Marc La France).
-3153. ATI driver updates, including:
-       - Add option to display on the CRT interface whether or not a digital
-         flat panel is detected.
-       - Add support for ShadowFB (adapted from Henrik Harmsen).
-       - Always read BIOS from legacy location for adapters found enabled on
-         server entry.
-       - Ensure the primary CRTC is always used for the CRT interface.
-       - Fix determination of panel dimensions with older BIOS's.
-       - Stop driver when panel dimensions cannot be determined.
-      (#3219, Marc La France).
-3152. Thread-related updates to 'ico' (#3217, Carlos A M dos Santos).
-3151. Fix a build problem on 64-bit platforms introduced in 3.9.16a (#3216,
-      Matt Grossman).
-
-XFree86 3.9.16a (6 September 1999)
-3150. Add support to the parser for a new way of specifying the screen
-      positions (not made use of yet) (David Dawes).
-3149. Remove a spurious #endif in linux.cf (#3215, Jarno Paananen).
-3148. Add driver option VIDEO_OVERLAID_STILLS for the Xv DDX (untested)
-      (#3214, Mark Vojkovich).
-3147. Comment out the MGASoftReset() call in the mga driver to fix a
-      multi-head problem (#3213, Mark Vojkovich).
-3146. xman updates, including some app-defaults file tuning, change some
-      widget names for better consistency, reformat the help file and
-      update the man page (#3212, Carlos A M dos Santos)..
-3145. Add support for DG/ux systems to xload (#3212,
-      Takis Psarogiannakopoulos).
-3144. App-defaults file updates for xcalc (#3212, Carlos A M dos Santos).
-3143. Fix some prototypes/casts in viewres (#3212, Carlos A M dos Santos).
-3142. Add an XtSetLanguageProc() call to all contrib programs except xman
-      (#3212, Carlos A M dos Santos).
-3141. Fix a zero-height bug in the xaa text code (#3211, Mark Vojkovich).
-3140. ScreenToScreenColorExpansion bug fix for the G400 (#3210,
-      Mark Vojkovich).
-3139. Xineramify ShmGetImage (#3209, Mark Vojkovich).
-3138. Rewrite PanoramiXGetImage so that it passes xtest (#3209,
-      Mark Vojkovich).
-3137. Increase IMAGE_BUFSIZE to 64k (#3208, Mark Vojkovich).
-3136. Remove the "old input" code (David Dawes).
-3135. Fix a problem with xman that prevents it form recognising the
-      XM_DELETE_WINDOW message when xman is run with the "topbox" disabled
-      (#3207, Carlos A M dos Santos).
-3134. Prevent xkbcomp from overwriting writing through symlinks (#3206,
-      Branden Robinson).
-3133. Use ncurses instead of termcap for Linux/libc6 (#3204, H.J. Lu).
-3132. Fix a build problem with the tdfx driver (#3203, Takaaki Nomura).
-3131. Add a clean rule to remove the automatically generated
-      doc/sgml/index.sgml file (#3202, Marc La France).
-3130. Fix some build warnings (#3202, Marc La France).
-3129. Add missing files for the Rush extension (#3199, Loic Grenie).
-3128. Export the xf86InitFBManagerRegion symbol.
-
-XFree86 3.9.16 (31 August 1999)
-3127. Potential fix for a server crash when connecting from a byte-swapped
-      client in Xinerama mode (based on #3196, Attila Fülöp).
-3126. Build xterm/resize with -lncurses on Debian (#3197, Attila Fülöp).
-3125. Allow inclusion of Xvlib.h into C++ code (#3195, Vladimir Dergachev).
-3124. Modify the ISO-8859-{6,7,10} to Unicode tables so that they agree with
-      the tables found on ftp.unicode.org (#3172, Bruno Haible).
-3123. Some minor C&T bug fixes (#3194, David Bateman).
-3122. Xman update (#3174, Carlos A M dos Santos).
-3021. Import some xkb data file updates from 3.3.5.
-3020. Fix a build problem on Alpha platforms (#3191, Matt Grossman).
-3019. Allow driver SDK builds for the i740 driver (#3190, Daryll Strauss).
-3018. Allow driver SDK builds for the tdfx driver, and allow it to be built
-      without DRI support (#3189, Daryll Strauss).
-
-XFree86 3.9.15d (29 August 1999)
-3017. 3Dfx driver for Banshee and Voodoo3 (#3188,
-      Daryll Strauss/Precision Insight).
-3016. Fix a 24/32 GetImage problem (#3187, Mark Vojkovich).
-3015. Intel i740 driver (#3186, Precision Insight/Daryll Strauss).
-3014. Fix a planemask problem in 24bpp with the recently added MGA point
-      speedups (#3185, Mark Vojkovich).
-3013. Some new and updated ISO 10646-1 fonts, including 5x7, 6x10, 6x13, 6x13B,
-      7x13, 7x13B, 7x14, 7x14B, 8x13, 8x13B, 9x15, 9x15B, 10x20, 9x18, 12x13ja,
-      18x18ja (#3184, Markus Kuhn, Robert Brady, Birger Langkjer,
-      Constantine Stathopoulos).
-3012. Update the default xdm config file to disable listening for XDMCP
-      requests (#3183, Matthieu Herrb).
-3011. Reinstate the code to stop DDC1 problems on secondary screens with
-      the MGA driver (#3182, Andrew Aitchison).
-3010. Fix for the option handling in the glide driver (#3181, Henrik Harmsen).
-3009. NVIDIA doc update (#3179, Jarno Paananen).
-3008. Doc update for the C&T driver (#3176, David Bateman).
-3007. Update some of the bindist files (#3175, Michael Rohleder).
-3006. Fix a libXfont build problem that shows up on IUS (#3175,
-      Michael Rohleder).
-3005. Xaw and xedit updates (#3174, 3180, Paulo Cesar Pereira de Andrade).
-3004. Add a new DebuggableLibraries imake parameter to allow libraries to
-      be built with debugging symbols, and enable this by default for Linux
-      (#3173, Bruno Haible).
-3003. Some Driver SDK build fixes (#3172, David Bateman).
-3002. Modify the MGA driver to fall back to DDC1 if DDC2 fails or is
-      disabled (#3171, Andrew Aitchison).
-3001. Allow the -allowMouseOpenFail X server command line option to be
-      recognised independently of the XFree86-Misc extension (#3170, Joe Moss).
-3000. Update NetBSD's and OpenBSD's aperture driver to remove a warning from
-      xf86ReadBIOS() during xf86Config.c's PC98 detection on non-PC98 systems
-      (#3169, Marc La France).
-2999. Disable setting the default gamma from the DDC data (#3168,
-      Andrew Aitchison).
-2998. Update the microtouch input driver for "NEW_INPUT", and re-enable
-      building it (#3178, David Woodhouse).
-2997. Back out the change in 3.9.15c that includes "non-system" resources
-      in the RAC "system" resources list (#3167, Marc La France).
-2996. Update the RELNOTES for DDC (#3165, Andrew Aitchison).
-2995. Fix a problem with xf86ReadBIOS() on NetBSD/OpenBSD (#3164,
-      Marc La France).
-2994. Add an XLC_LOCALE file for zh_TW.Big5 (#3163, Pablo Saratxaga).
-2993. Add dummy Compose files for encodings that don't already have them
-      (#3163, Pablo Saratxaga).
-2992. APM driver updates.  The Rush extension is now included in the driver
-      (some files missing, so not enabled yet) (#3162, 3159, Loic Grenie).
-2991. Some fixes for the VidMode extension (#3161, Loic Grenie).
-2990. Update SuperProbe to recognise the APM AT3D chipset (#3160, Loic Grenie).
-2989. Some fixes for the nv driver (#3158, Jarno Paananen).
-2988. Fix a typo in ObjectFromAsmSource() in xf86.rules (#3157,
-      Matthieu Herrb).
-2987. Add some NVIDIA cards to the Cards file (#3155, Jarno Paananen).
-2986. A quick hack to cut down on XAA pixmap cache thrashing that
-      happens with some particular apps (#3154, Mark Vojkovich).
-2985. Update the tabtcvn file to include the full tcvn-5712 encoding, not
-      only lowercase characters (#3153, Pablo Saratxaga).
-2984. Create the doc index list from information in the .sgml files
-      (David Dawes).
-2983. Basic man page for the generic VGA driver (David Dawes).
-2982. Fix for lockup problem with Trident Image 975 (Alan Hourihane).
-
-XFree86 3.9.15c (22 August 1999)
-2981. Update NetBSD.cf to reflect NetBSD's switch from GNU malloc to FreeBSD's
-      malloc (#3151, Bernd Ernesti).
-2980. Change xf86ReadBIOS() to reuse the fd for /dev/mem or /dev/xf86 from
-      the other bsd_video.c functions in order to avoid the difficulty caused
-      by the NetBSD aperture driver only allowing one open of /dev/xf86 at
-      a time (#3150, Matthieu Herrb).
-2979. Add pre-R6.4 compatible entries to the NLS .dir and .alias files.  This
-      should make it possible for them to be used with older versions of Xlib.
-2978. Fix a typo in the MGA arc code that broke some arcs (#3149,
-      Mark Vojkovich).
-2977. Fix a problem with cfb allocating too much space on the stack when
-      clipping rects (#3148, Mark Vojkovich).
-2976. Add missing sync when uploading into the XAA pixmap cache (#3147,
-      Mark Vojkovich).
-2975. Change XDGAFlush() to XDGASync() (#3146, Mark Vojkovich).
-2974. Add transparent DGA blits to the MGA driver, and enable the OverclockMem
-      option for the G400 (#3145, Mark Vojkovich).
-2973. Update the common cursor code to keep virtual desktop panning from
-      interfering with screen rotation (#3144, Mark Vojkovich).
-2972. Dynapro driver update: initialise the incoming packet state machine,
-      and add a "SwapXY" option (#3142, David Woodhouse).
-2971. Fix a loader problem that shows up on Alpha/ELF platforms when there
-      is a .sbss section (#3141, Hannes Reinecke).
-2970. Modify DDC for neomagic (#3139, Egbert Eich).
-2969. Add DDC support for the S3 ViRGE (DDC2 untested) (#3139, Egbert Eich).
-2968. Fix DDC2 support for MGA and C&T drivers (#3139, Egbert Eich).
-2967. Add a call to xf86SetPciVideo(NULL,NONE) after each probe (#3139,
-      Egbert Eich).
-2966. Modified registration of the OS access windows (#3139, Egbert Eich).
-2965. Some Xaw and xedit fixes (#3138, Paulo Cesar Pereira de Andrade).
-2964. Next round of the font ansification and warning removal (#3135,
-      Matthieu Herrb).
-2963. Fix ATI 18800-x detection problem (#3133, Marc La France).
-2962. Check for limitations on vertical blending in panel support for the ATI
-      driver (#3133, Marc La France).
-2961. Update ATI driver to complain about bad BIOS data (#3133,
-      Marc La France).
-2960. Man page corrections for the MGA driver (#3132, Mark Vojkovich).
-2959. Limit PCI BIOS apertures to 16MB as per the PCI 2.1 spec (#3131,
-      Marc La France).
-2958. Assume a system has up to 1G of physical memory installed, rather than
-      2G (#3130, Marc La France).
-2957. Fix a bug in the handling for buggy VGA CRTCs (#3129, Marc La France).
-2956. Fix to build the mga driver with the driver SDK (#3128, David Bateman).
-2955. Xterm patch #113 (#3125, Thomas Dickey).
-2954. Port the XAA cfb copyplane functions, adding them to the cfb code
-      (#3124, 3126, 3127, David Bateman).
-
-XFree86 3.9.15b (15 August 1999)
-2953. Improved point rendering performance for the MGA driver (#3123,
-      Mark Vojkovich).
-2952. Xaw and xedit updates (#3122, Paulo Cesar Pereira de Andrade).
-2951. Remove the Latin2 Type1 fonts.
-2950. Change the RGB mask names in the DGA structures (#3120, Mark Vojkovich).
-2949. More acceleration and bug fixes for the NV driver (#3119,
-      Jarno Paananen).
-2948. Change some things in the XAA color expansion code to facilitate
-      rendering into DMA buffers (#3118, Mark Vojkovich).
-2947. Fix a 64 bit problem with the xf24_32bpp layer (#3117, Mark Vojkovich).
-2946. Modify XF86FlushInput() to work for non-tty devices, which is required
-      for PS/2 mice with Linux 2.2.x kernels (#3114, Kazutaka Yokota).
-2945. Support for rotating the virtual desktop for the MGA driver using
-      the shadowfb (#3113, 3116, Mark Vojkovich).
-2944. Fix a colormap problem with DGA when initialized from an 8+24 mode with
-      the MGA driver (#3112, Mark Vojkovich).
-2943. Fix multihead on the MGA-2164W (#3111, Mark Vojkovich).
-2942. XAA speedups for planar copies in some cases (#3110, Mark Vojkovich).
-2941. Add a driver SDK which performs a similar function to the old LinkKit,
-      but for the loadable server (#3105, David Bateman).
-2940. C&T doc update and xgamma man page update (#3105, David Bateman).
-2939. Add an option to the C&T driver to allow the user to select the
-      transparency key when using the overlay (#3105, David Bateman).
-2938. Add DGA2 support to the C&T driver (#3105, David Bateman).
-2937. Fix a bug in the bitmap font code introduced in 3.9.15a (#3101,
-      Juliusz Chroboczek).
-2936. Some TGA driver cleanups, including a SaveScreen function and code to
-      disallow virtual desktops in a nicer way (#3100, Matt Grossman).
-
-XFree86 3.9.15a (1 August 1999)
-2935. Fix the RAC usage in the nv driver to allow multi-head to work
-      (#3093, Itai Nahshon).
-2934. Reduce memory consumption of the bitmap font backends when using
-      sparse fonts, which is important when using Unicode-encoded fonts
-      (#3092, Juliusz Chroboczek).
-2933. Fix Option register initialisation in multi-head for MGA 2064/2164
-      (#3089, Andrew Aitchison).
-2932. Convert the nv (NVIDIA) driver from 3.3.4 (#3078-3080, 3087,
-      Jarno Paananen).
-2931. Add SuperProbe for NetBSD 1.4 wscons (#3083, Matthias Drochner).
-2930. Fix button and modifier key state problems in DGA (#3082,
-      Mark Vojkovich).
-2929. Avoid a possible segmentation fault in "xsm" which, for example,
-      occurs local hostname can't be resolved (#3073, Matthias Scheler).
-2928. ATI driver updates, including:
-        - Add preliminary panel support.
-        - Rework RAC interface.
-        - PCI VGA's not on primary bus are now detected.
-        - Fix bug when an adapter's VGA has been disabled.
-        - Fix gamma support.
-      (#3069, Marc La France)
-2927. Fix 8514/A pre-defined resource and pre-define VGA sparse I/O resources
-      (#3069, 3081, Marc La France).
-2926. Fix a bug in the registration of background device BIOS'es (#3069,
-      Marc La France).
-2925. Invert the meaning of ResMinimised bit into ResEstimated (#3069,
-      Marc La France).
-2924. Allow drivers to print resource lists, and allow them to enable/disable
-      adapters before creating bus slots for them (#3069, Marc La France).
-2923. Resync SuperProbe and scanpci with 3.3.x (#3069, Marc La France).
-2922. Add some missing man pages for the DGA and VidMode extensions (#3064,
-      Joe Moss).
-2921. Some changes to the DGA and colormap layers to allow gamma changes
-      during DGA mode (#3060, Mark Vojkovich).
-2920. Fix XIM segv error (#3033, 3051, Manabe Takashi).
-2919. Add a client state callback to the DGA extension so that the server side
-      can be cleaned up when a DGA client exits (#3048, 3049, Mark Vojkovich).
-2918. Update the FreeBSD/mouse documentation (#3047, Kazutaka Yokota).
-2917. Fix an undocumented blitter constraint on the G200 (#3046,
-      Mark Vojkovich).
-2916. Fix the MGA driver so that it can support changing depth on the fly
-      in DGA mode.  All depths are now offered to DGA clients regardless of
-      what the screen's main depth is (#3045, Mark Vojkovich).
-2915. Fix a bug in the InstallGenManPageLong() rule in lynx.cf (#3043,
-      Thomas Mueller).
-2914. Update ATI doc with info about a VGA/RAC problem (#3044,
-      Andrew Aitchison).
-
-XFree86 3.9.15 (19 July 1999)
-2913. -
-2912. Fix a problem with the library spec in xgc/Imakefile (#3042,
-      Thomas Mueller).
-2911. Add native 69030 support to the C&T driver (#3041, David Bateman).
-2910. Update release notes for the apm driver (#3040, Loic Grenie).
-2909. Fix a small bug in the color expands in the TGA driver (#3039,
-      Matt Grossman).
-2908. Updates for the Japanese (PC98) docs (#3038, Takaaki Nomura).
-2907. Some Xaw and xedit updates (#3037, Paulo Cesar Pereira de Andrade).
-2906. Fix a problem with the VidMode extension (#3036, David Bateman).
-2905. Sample config file for Japanese PC98 architecture (#3035,
-      Takaaki Nomura).
-
-XFree86 3.9Py (18 July 1999)
-2904. Add a visualClass to the XDGAMode request and a XDGACreateColormap
-      request to DGA 2.0 so Colormaps can be created for XDGADevices
-      without needing a corresponding visual (#3032, Mark Vojkovich).
-2903. Update the mmap versions of xf86ReadBIOS() to use a map size that
-      fits the requested BIOS offset and length rather than using a fixed
-      map size (David Dawes).
-2902. Xterm patch #112 (#3031, Thomas Dickey).
-2901. Change the colormap layer's LoadPalette function to take a Visual as
-      an argument rather than just the Visual class (#3030, Mark Vojkovich).
-2900. Add some code to auto-detect Japanese PC98 systems (#3029,
-      Takaaki Nomura).
-2899. Fix a casting problem in DefineSelf() that shows up on FreeBSD/alpha
-      (#3028, Doug Rabson).
-2898. Fix a problem with the GMX2000 DRI support (#3034, Jens Owen).
-2897. Work around a problem in mfb that is caused by an optimiser bug
-      in egcs-1.1.2 for the alpha (#3027, Doug Rabson).
-2896. Fix a problem that shows up in the s3virge driver after the recent
-      vgahw module changes (David Dawes).
-2895. Add missing references to xf86MiscExt.c in common/Imakefile (#3025,
-      Joe Moss).
-2894. Update for the apm driver so that it will work on a Japanese PC-98
-      with GA-RUSH6/PCI(VoodooRUSH based video card) (#3024, Isao Ohishi).
-2893. ISO 10646-1 Japanese font (12x13ja.bdf) that covers a superset of
-      CP1252 and JIS X 208, and which is suitable to be used together with
-      6x13 for bi-width Japanese text output (#3022, Markus Kuhn).
-2892. Refine the MouseMan+ (PS2++) protocol support (#3020, Kazutaka Yokota).
-2891. Fix problems with the wheels on some mice, including the OEM version of
-      the Logitech FirstMouse+, are not recognized and the mouse cursor jumps
-      around (#3020, Kazutaka Yokota).
-2890. Fix a problem building the X-TT modules on Solaris 7 (based on #3019,
-      David Holland).
-2889. Fix a bug in Xaw/TextAction.c introduced in 3.9Pw (#3018,
-      Paulo Cesar Pereira de Andrade).
-2888. ISO 10646-1 version of the 5x7 and 6x13B fonts, and an update for the
-      6x13 font (#3017, Markus Kuhn).
-2887. First part of the ansification of xc/lib/fonts.  So far the bitmap,
-      fc and fontfile directories have been done (#3016, Matthieu Herrb).
-2886. Fix default PC98 XKB setting (#3015, Akio Morita).
-2885. Remove the reference to VGADriverDoc in xfree86/Imakefile (#3015,
-      Takaaki Nomura).
-2884. Fix a bug in Xaw/TextPop.c (#3014, Paulo Cesar Pereira de Andrade).
-2883. Man page update for xfontsel (#3013, Paulo Cesar Pereira de Andrade).
-
-XFree86 3.9Px (12 July 1999)
-2882. Updates to get XF86Setup to build again after the NewInput-related
-      changes, and have XF86Setup print a short message stating that it
-      isn't usable before exiting (#3012, Joe Moss).
-2881. Fix some compiler warnings in lib/Xext (#3011, Matt Grossman).
-2880. Fix a bug in the wacom driver that shows up when multiple wacom devices
-      don't report the same valuators (#3010, Frederic Lepied).
-2879. Some updates to the PCI/RAC code (#3008, Egbert Eich).
-2878. Fix the acute and apostrophe mixup in the German xkb layout with the
-      nodeadkey option, and add the EuroSign to AltGr+e (#3006, Markus Kuhn).
-2877. Add code to the mga driver to handle PC98 architecture machines
-      (#3007, Takaaki Nomura).
-2876. Add a global (ServerFlags) "PC98" Option for the Japanese PC98
-      architecture, and add a function xf86IsPc98() that drivers can call
-      to check for this.
-2875. Fix a relocation problem in the ELF loader that shows up on 64-bit
-      platforms when mapping unresolved symbols to LoaderDefaultFunc()
-      (#3005, Doug Rabson).
-2874. Remove the original text version of the DESIGN doc from hw/xfree86.
-2873. Fix a glyph padding problem in XAA's nonTE text code that shows up on
-      64-bit platforms (Doug Rabson).
-2872. Rework the wacom driver's init phase (#3004, Frederic Lepied).
-2871. Add a 19200 speed option to the wacom driver for Airbrush tablets
-      (#3004, Frederic Lepied).
-2870. Add support for transparent stipples to the tga driver (#3003,
-      Matt Grossman).
-2869. Modify xfontsel to not show scaled fonts by default (#3002,
-      Paulo Cesar Pereira de Andrade).
-2868. Some notes about xterm for the release notes (#3001, Thomas Dickey).
-2867. Some Xaw, Xmu and xedit updates (#2999, 3002,
-      Paulo Cesar Pereira de Andrade).
-2866. Xterm patch #111 (#2998, Thomas Dickey).
-2865. Fix a "NoAccel" problem with the PM2 video support (#2997,
-      Michael Schimek).
-2864. Update for lynx.cf (#2995, Thomas Mueller).
-2863. Fix a LynxOS macro clash with the cirrus driver, and fix a
-      xf86UnmapVidMem() warning in the cirrus driver (#2995, Thomas Mueller).
-2862. Fix a problem on LynxOS where assert is unresolved in the static server
-      (#2995, Thomas Mueller).
-2861. Fix a problme with vsnprintf being unresolved when building Xvfb
-      and Xnest on some platforms (#2995, Thomas Mueller).
-2860. Remove the s3virge fifo_ changes introduced in 3.9Pu, update the
-      DGA2 support and docs (#2994, Kevin Brosius).
-2859. Initial attempt to get the XFree86-Misc again (#2993, Joe Moss).
-2858. Remove XAASync() (#2992, Rik Faith).
-2857. Cleanup the TGA driver's hw cursor code, remove global variables in
-      in the "accel" files, and fix up the RAC support (#2991, Matt Grossman).
-2856. Add partial support for color expands to the 8-bit TGA driver (#2991,
-      Matt Grossman).
-2855. Re-enable DDC2 support in the MGA driver (#2989, Andrew Aitchison).
-2854. Add missing TIOC defines for Interactive Unix to xf86_OSlib.h (#2990,
-      Michael Rohleder).
-2853. Don't register the Xqueue mouse handler for Interactive Unix (#2990,
-      Michael Rohleder).
-2852. Don't include sys/mman.h in cidchar.c when USE_MMAP isn't defined
-      (#2990, Michael Rohleder).
-2851. Disable BuildXF86DRI and BuildXF86DRIDriverSupport for Interactive Unix
-      (#2990, Michael Rohleder).
-2851. Update the apm (Alliance ProMotion) driver (#2987, 2988, Loic Grenie).
-2850. Fix a problem with the xf86config screen configuration that was
-      introduced with the removal of "32bpp" (#2986, Matthieu Herrb).
-2849. Add a DefaultDepth configuration page to xf86config (#2986,
-      Matthieu Herrb).
-2848. Add the inputDevice examples from XF86Config.eg to config files
-      generated by xf86config (#2986, Matthieu Herrb).
-2847. Modify the vgahw module to allow it to save/restore more than the
-      standard number VGA CRTC, Sequencer, Graphics and Attribute registers
-      (2985, 2996, Jeff Garzik).
-2846. Add DDC information to the release notes (#2984, Andrew Aitchison).
-2845. Change XDGAChangePixmapMode to return the X-Y position of the pixmap
-      in case the server is not able to place it exactly where requested
-      (#2983, Mark Vojkovich).
-2844. Fix some problems with unfavorable alignment of XAA offscreen pixmap
-      (#2982, Mark Vojkovich).
-2843. Some XAA speedups for NonTE text in certain cases (#2981,
-      Mark Vojkovich).
-2842. Rename the assembler files that need preprocessing from .s to .S,
-      and adjust the imake rules accordingly.
-2841. A fix for xf86PciReadBios() (#2979, Egbert Eich).
-2840. Fix a problem with false detection of multi-function PCI devices (#2978,
-      Loic Grenie).
-2839. Fix a problem with libXfont.a not being linked into exports/lib during
-      the build phase (#2977, Thomas Mueller, 2990, Michael Rohleder).
-2838. Deal with OSes which don't have TIOCM ioctls in posix_tty.c (#2976,
-      Thomas Mueller).
-2837. Fix the use of TIOCM_ in some calls to xf86SerialModem..() in mouse/pnp.c
-      (#2976, Thomas Mueller).
-2836. Enable NEW_INPUT on LynxOS (#2976, Thomas Mueller).
-
-XFree86 3.9Pw (6 July 1999)
-2835. Fix for GetBlock() (#2974, Egbert Eich).
-2834. Remove the test for SHAREDIOCLASS when creating a pciAccessInfoRec for
-      a device (#2974, Egbert Eich).
-2833. Modified BIOS ROM handling, doing validation only on demand (#2974,
-      Egbert Eich).
-2832. Add a ChangeGamma function to the ScrnInfoRec, which allows drivers to
-      optionally provide a function to do this instead of the default one
-      provided by the colormap layer (#2972, Mark Vojkovich).
-2831. Sis driver memclock fixes (#2971, Bart Oldeman, Juanjo Santamarta).
-2830. Add snprintf() and vsnprintf() to libc emulation (#2970, Marc La France).
-2829. Increase array size in PciInfo data (#2970, Marc La France).
-2828. Add a LoaderRefSymbols() function (#2970, Marc La France).
-2827. When matching fixed clocks, prefer non-CLKDIV2 modes over CLKDIV2 modes
-      (#2970, Marc La France).
-2826. Reinstate xf86GetPciConfigInfo() and some warning fixes (#2970,
-      Marc La France).
-2825. Build libXext and libX11 client-side libraries when also building
-      GLX, despite BuildServersOnly (#2970, Marc La France).
-2824. Update ATI doc (#2970, Marc La France).
-2823. ATI driver from 3.3.3.1 (rac interface is preliminary, no LCD panel
-      or Rage 128 support yet) (#2970, Marc La France).
-2822. Fix Ukrainian_GHE_with_upturn double definition error (#2969,
-      Peter Novodvorsky).
-2822. Updates to the xf86config utility for the 4.0 config file format
-      (#2968, Matthieu Herrb).
-2821. Add default rules to allow easy compilation of .c files to assembler.
-
-XFree86 3.9Pv (4 July 1999)
-2820. Add a marked up (SGML) version of the DESIGN doc (David Dawes).
-2819. Remove the Alpha-specific Linux libc6 parts in linux.cf.
-2818. Add a "defs.ent" file for defining SGML entities that can be shared by
-      other docs (David Dawes).
-2817. Import the mouse.sgml doc from 3.3.x, and update it for 4.0.
-2816. Remove support for the very old LinuxDoc tools.
-2815. Use SpecialCObjectRule() in favour of SpecialObjectRule().
-2814. Fix lots of 64-bit problems in XAA (#2967, Mark Vojkovich).
-2813. Add a new DGA request to allow switching the DGA pixmap from one the
-      size of the framebuffer to one the size of the viewport that you
-      can move around (#2966, Mark Vojkovich).
-2812. Make sure that all Xinerama heads have the same root window depth,
-      and don't advertise backing store or save unders as being available
-      unless it's available on all heads (#2965, Mark Vojkovich).
-2811. Some Xaw and xedit updates (#2964, Paulo Cesar Pereira de Andrade).
-2810. Some DRI updates (#2962, Rik Faith).
-2809. Fix a double-free problem in the mouse driver (#2959, Egbert Eich).
-2808. Add some debugging code to xalloc.c to detect and allow trapping of
-      double xfree() calls (#2954, Egbert Eich).
-2807. Add Single GLINT MX support for Direct Rendering, which now allows
-      ELSA Gloria XXL to take part in this (#2592, 2955, 2957, 2958,
-      Alan Hourihane and #2960, Rik Faith).
-2806. Add ScanlineCPU function to the glint driver for PM2 when pci
-      retries aren't used (#2952, Alan Hourihane).
-2805. Use mediumraw keyboard mode for LinuxPPC (#2946, Gerd Knorr).
-2804. Xterm patch #110 (#2943, Thomas Dickey).
-2803. Add CyberBlade/i7 (Socket 7), CyberBlade/i7 DSTN (Laptop Socket 7) and
-      CyberBlade/i1 (Slot 1) support to the trident driver (#2940,
-      Alan Hourihane).
-2802. Some new PCI ids for Cyberblades and Via MVP4 (#2939, Alan Hourihane).
-2801. Replace `__volatile__' in xf86drm.h with `volatile' (#2938,
-      Takaaki Nomura).
-2800. Fix a problem with the umask not being reset in some cases in the
-      xtrans code (#2936, Bill Nottingham).
-2799. Improve the latency associated with writing to the PCI config space,
-      which is important for RAC to work efficiently (Egbert Eich).
-
-XFree86 3.9Pu (27 June 1999)
-2798. Xterm patch #109 (#2920, Thomas Dickey).
-2797. Xaw and xedit updates (#2932, 2933, Paulo Cesar Pereira de Andrade).
-2796. Make the "fifo_conservative" memory settings default for the s3virge
-      accelerator (#2931, Kevin Brosius).
-2795. Preliminary DGA2 code for the s3virge driver (#2931, Kevin Brosius).
-2794. Updates to PI's DRI sample implementation, including:
-      - Dynamic loading of the OpenGL client driver is implemented
-      - 3D client death while holding the drawable lock does not cause deadlock
-      - The kernel module works with Linux 2.2.x [x <= 10] and 2.3.y [y <= 8]
-      - A better authentication mechanism has been implemented
-      - XF86Config options for the DRI are supported
-      (#2929, Precision Insight).
-2793. Add functions to the FBManager to query the largest size available and
-      to purge all areas that aren't nailed down (#2928, Mark Vojkovich).
-2792. Fix some serious performance problems with Xinerama when the number
-      of resource IDs becomes large (#2927, Carsten Haitzler).
-2791. Remove the significant RGB bits check from Xinerama visual eliminations
-      (#2926, Mark Vojkovich).
-2790. Fix a typo in xmodmap and xstdcmap (#2924, Matthieu Herrb).
-2789. Fix the type of the OverclockMem Option in the MGA driver (#2922,
-      Andrew Aitchison).
-2788. Fix PCI resource handling problems that were showing up with the
-      glint driver (#2918, Egbert Eich).
-2787. Fix a problem building some Makefiles when JoystickSupport is enabled
-      (#2917, Todd Fries).
-2786. Fix a typo in the RAC support for the glint driver (#2915, Jens Owen).
-2785. Fix a RAC-related build problem on 64-bit machines (#2913,
-      Matt Grossman).
-2784. Some afb-related updates (#2911, Sven Luther).
-2783. Fix race condition in xinit (Nate Eldredge, Mark Montague).
-2782. Documentation for the new RAC code (Egbert Eich).
-2781. Fix some problems with the glide driver that can result in server crashes
-      if there is a problem when it is starting up (David Dawes).
-2780. Install the X server signal handlers before xf86OpenConsole is first
-      called.  This makes sure that the VT is returned to text mode if the
-      server crashes in the early stages of InitOutput() (David Dawes).
-2779. Fix xf86vsprintf() and xf86vfprintf().
-2778. Support for the different PLL reference clock used for HP's on-board
-      G200s.
-2777. Disable building the Xanti extension (Mark Vojkovich).
-2776. Update the log file handling to catch most messages that are generated
-      before the log file is actually opened (David Dawes).
-2775. Another fix for PM2 text restoration (Egbert Eich).
-
-XFree86 3.9Pt (20 June 1999)
-2774. First cut at converting the fbdev, sis, glide, neomagic and rendition
-      drivers for the new RAC code (David Dawes).
-2773. Fix a PM2 lockup problem during GLINTSave, and fix a text mode font
-      corruption problem (#2907, Egbert Eich).
-2772. Xterm patch #108 (#2906, Thomas Dickey).
-2771. Fix a problem with duplicate ShmCompletion events in Xinerama mode
-      (#2905, Mark Vojkovich).
-2770. Add a XDGAKeyEventToXKeyEvent helper function to the DGA client library
-      (#2904, Mark Vojkovich).
-2769. Fix some incorrect XAA GC validation checks (#2903, Mark Vojkovich).
-2768. Fix some XAA caching problems with shared memory pixmaps (#2903,
-      Mark Vojkovich).
-2767. Wait for the fifo to clear out in the mga driver before returning to
-      the client after any cpu->screen color expansion or image writes (#2901,
-      Mark Vojkovich).
-2766. Don't use the BIOS info for the MGA G400 since we don't understand
-      the format (#2901, Mark Vojkovich).
-2765. Fix some MGA bitblit problems when more than 16MB of memory is being
-      used (#2901, Mark Vojkovich).
-2764. Set memory clocks to the bios defaults in the MGA driver, and add an
-      Option "OverclockMem" to allow the previous settings to be used (#2901,
-      Mark Vojkovich).
-2763. Xaw and xedit updates (see lib/Xaw/Changelog) (#2899,
-      Paulo Cesar Pereira de Andrade).
-2762. Ansification and warning elimination in lib/xtrans (#2896,
-      Matthieu Herrb).
-2761. Fix a glint scanline interleave bug introduced by the change in
-      device scaning order in the new RAC code (#2890, Jens Owen).
-2760. Fix a dual head Xinerama crash that happens when running the xv program
-      (#2889, Itai Nahshon).
-2759. Add v4l Xv support to the trident driver (#2877, Alan Hourihane).
-2758. Trident Image series and standard chipset acceleration fixes (#2877,
-      Alan Hourihane).
-2757. Add more Blade3D acceleration to the trident driver (#2877,
-      Alan Hourihane).
-2756. Fix for DPMS with the new RAC (Itai Nahshon).
-2755. RAC updates, including changing the way PCI resource validation works
-      (Egbert Eich).
-2754. Update the TGA driver for the new RAC (#2886, Matt Grossman).
-2753. Fix a fatal event problem with DGA 2.0 (#2884, Mark Vojkovich).
-2752. Fix some macros in xf86str.h that conflict with system headers on some
-      platforms (#2883, 2888, 2902, Matt Grossman).
-
-XFree86 3.9Ps (14 June 1999)
-2751. Some small RAC updates (Egbert Eich).
-2750. Direct Rendering Infrastructure from Precision Insight (#2871).
-2749. Fix a problem building xedit on SVR4.0 (missing strcasecmp).
-
-XFree86 3.9Pr (13 June 1999)
-2748. Xterm patch #107 (#2879, Thomas Dickey).
-2747. Cirrus driver updates, including support for generic (V4L) video
-      adapters, fix depth 15 mode for the laguna chips and turn of the DAC
-      when blanking the screen (#2878, Itai Nahshon).
-2746. Fix problems with the build of the 6.1-compatible Xaw shared library,
-      and some optimizations and bug fixes for the Xaw and xedit (#2877,
-      Paulo Cesar Pereira de Andrade).
-2745. Add functions (CreateFontRec and DestroyFontRec) for allocating and
-      freeing FontRecs rather than having the size encoded in all of the
-      renderer modules.  Also, change the font private index handling to
-      make all indices show up in all FontRecs (#2873, Mark Vojkovich).
-2744. Add ANSI prototypes for lib/XIE (#2870, Thomas Dickey).
-2743. Some preliminary work on adding afb support to the fbdev driver (#2869,
-      Sven Luther).
-2742. Change the semantics of xf86ReadPciBIOS() to allow it to temporarily
-      map an unmapped BIOS at the address assigned to another of the card's
-      base address registers, and modify the MGA driver to make use of this
-      (David Dawes).
-2741. Add some functions to the common layer to allow drivers to register
-      input handling functions, and modify the pm2_video code to make use of
-      this instead of the XInput code (David Dawes).
-2740. Trap for packed 24bpp on systems with 64-bit scanlines.
-2739. Fix the type of the "set_mckl" option in the s3virge driver (#2865,
-      Harald Koenig).
-2738. Fix some s3virge palette problems in 8bpp mode (#2863, Harald Koenig).
-2737. Avoid clobbering CR55 in the s3virge HW cursor code (#2862,
-      Harald Koenig).
-2736. Xterm patch #106 (#2861, Thomas Dickey).
-2735. Fix an incorrect test in I2CWriteBytes() in the i2c module (#2875,
-      Ben Cahill).
-2734. Don't set YDSTORG for the non-WRAM Matrox cards (#2874, Mark Vojkovich).
-2733. Change the order of text-mode font restoration in the vgahw module
-      (#2872).
-2732. XInput driver for Dynapro touch screens (#2859, 2860, 2867,
-      David Woodhouse).
-2731. Enable support for extended PS/2 protocols on Solaris/x86 (#2857,
-      Nicholas Brealey).
-2730. Fix the ZAxisMapping handling in the mouse driver (#2857,
-      Nicholas Brealey).
-2729. Add a sixth valuator to the wacom driver to support the wheel of
-      the airbrush and of the lens cursor (Frederic Lepied).
-2728. Convert the wacom driver to work with the new input code
-      (Frederic Lepied).
-2727. Increase the MAXSCREENS value from 4 to 16 (Egbert Eich).
-2726. Add support to scanpci for printing out PCI-PCI bridge header
-      information correctly (Egbert Eich).
-2725. New RAC (Resource Access Control) code (Egbert Eich).
-2724. Update the Solaris/x86 version of xf86ReadBIOS() to handle BIOSs located
-      at high physical addresses (David Dawes).
-2723. An attempt at allowing the server to correct the /tmp/.X11-unix
-      directory when it is possible to do so safely (David Dawes).
-2722. Re-enable screen->screen blts for the Trident Image3D, and fix a problem
-      with mapping/unmapping memory with VT switching (David Dawes).
-2721. Fix a problem linking with libXfont when building the shared version
-      is disabled (David Dawes).
-2720. Fix an Xlib problem introduced in 3.9Pq that shows up when X_LOCALE
-      is defined (David Dawes).
-
-XFree86 3.9Pq (6 June 1999)
-2719. Change the parser's error message printing so that they will end
-      up in the log file (David Dawes).
-2718. Add support for armscii-8, ibm-cp1133, mulelao-1, viscii1.1-1,
-      tcvn-5712, georgian-academy, georgian-ps (not all complete yet)
-      (#2843, Pablo Saratxaga).
-2717. Some fixes for the v4l driver that make it keep track of the video
-      state correctly (#2854, Gerd Knorr).
-2716. Xterm patch #105 (#2853, Thomas Dickey).
-2715. Add defines to the Xaw code to make it possible to build a version
-      of the shared library that is binary compatible with the standard 6.1
-      version (#2849, Paulo Cesar Pereira de Andrade).
-2714. Xedit updates (see the Xaw Changelog for details) (#2849,
-      Paulo Cesar Pereira de Andrade).
-2713. Bump the Xaw library major version (now 7.0), and enable the Xpm
-      dependency by default (#2849, Paulo Cesar Pereira de Andrade).
-2712. Fix an Xmu build warning (#2849, Paulo Cesar Pereira de Andrade).
-2711. Some updates to the XAnti extension (#2851, 2852, Mark Vojkovich).
-2710. Update the scanline width choices used in the MGA driver to better
-      match the capabilities of the different chips (#2850, Mark Vojkovich).
-2709. Add G400 support to the MGA driver (#2850, Mark Vojkovich).
-2708. Resync SuperProbe with 3.3.3.1e, and add ATI Rage XL & XC detection
-      (#2847, Marc La France).
-2707. Fix for drivers/v4l/README (#2846, David Woodhouse).
-2706. Fixes for the big5.eten-0 and gb2312.1980-0 encoding files (#2840, 2841,
-      2846, Juliusz Chroboczek).
-2705. Use 8-bit I/O instead of 16-bit I/O in xf4bpp (better for older
-      adapters), and some cleanups (#2838, Marc La France).
-2704. Fix RGB "masks" for depth <=8, and fix the formatting of the "Clocks"
-      messages (#2838, Marc La France).
-2703. Remove assumption that PCI systems contain PCI video (#2838,
-      Marc La France).
-2702. Add missing parsing of the ZAxisMapping option to the revised mouse
-      driver (David Dawes).
-2701. Add a simple verification check for core-capable input devices
-      (David Dawes).
-2700. Update the serial PnP mouse support for the revised mouse driver
-      (David Dawes).
-
-XFree86 3.9Pp (30 May 1999)
-2699. Xterm patch #104 (#2836, Thomas Dickey).
-2698. Doc updates for the s3virge driver, and cleanup register debugging
-      printouts (#2835, Kevin Brosius).
-2697. Rework the config file search algorithm, and allow "safe" relative
-      paths to be specified by non-root users (David Dawes).
-2696. Close input devices while VT switched away (David Dawes).
-2695. Prevent the input device "PreInit" from being called in subsequent
-      server generations (David Dawes).
-2694. Handle the Keyboard config information as an InputDevice section
-      (but the keyboard driver isn't converted yet) (David Dawes).
-2693. Add basic accessEnable calls to the Tseng driver so that it will at
-      least work single head with an ET6000 (David Dawes).
-2692. Fix Xinerama bugs related to the Shape extension (#2832, Mark Vojkovich).
-2691. Separate the pitch and virtual X increments (#2829, Marc La France).
-2690. Add some large encoding files for the `fontenc' layer (#2827,
-      Juliusz Chroboczek).
-2689. A rewrite of the way Xinerama handles visuals (#2824, Mark Vojkovich).
-2688. Integrate the pointer acceleration patch from Kevin Brown (#2823,
-      Frederic Lepied).
-2687. Make button mapping work for XInput "AlwaysCore" devices (#2823,
-      Frederic Lepied).
-2686. Fix xtest failure with SiS TwoPointLine (#2821, Juanjo Santamarta).
-2685. Xlib support for KOI8-U (#2820, Aleksey Novodvorsky).
-2684. Fix a problems with the new mouse code looping by adding CLOCAL to
-      the standard termios flags for xf86OpenSerial() (#2819, Matthieu Herrb).
-2683. New font document (#2818, Juliusz Chroboczek).
-2682. Fix the reworked "wsmouse" code for NetBSD (#2815, Matthieu Herrb).
-2681. Fix for `resize' on OpenBSD (#2814, Matthieu Herrb).
-2680. Add the `s' flag to ArCmd and ArAddCmd for SVR4 so that empty archives
-      can be created (#2813, Nicholas Brealey).
-
-XFree86 3.9Po (23 May 1999)
-2679. Enable the new input code (NewInput) by default in xfree86.cf
-      (David Dawes).
-2678. Add compatibilty support for interpreting "Pointer" sections as
-      "InputDevice" sections in the reworked input device code (David Dawes).
-2677. Modify mkfontdir to handle duplicate encodings in a reasonable way
-      when generating the encodings.dir file (#2812, Juliusz Chroboczek).
-2676. Xaw and xedit updates (see lib/Xaw/Changelog for details) (#2811,
-      Paulo Cesar Pereira de Andrade).
-2675. Fix xinerama problems with clipmasks and stipple/tile offsets
-      in GCs used on the root window (#2810, Mark Vojkovich).
-2674. Fix problems uploading to the pixmap cache in 8+32 mode when
-      ImageWrites aren't available (#2809, Mark Vojkovich).
-2673. Ansify the Xv client library (#2808, Mark Vojkovich).
-2672. Add a XvQueryPortAttributes request to the Xv API/protocol and
-      driver interface, with an example in the v4l driver, and update the
-      documentation (#2808, Mark Vojkovich).
-2671. Fix some compiler warnings in the oldX and ICE libraries (#2807,
-      Matt Grossman).
-2670. Fix a problem with the Type1 font handling that was introduced when the
-      CID support was added (#2805, Ivan Bach).
-2669. Wacom driver update, including a fix for initialization problems with
-      Wacom IV devices, and improved Wacom V device support (Lens cursor
-      support) (#2803, Frederic Lepied).
-2668. Fix for some 8+32 xinerama problems (#2802, Mark Vojkovich).
-2667. Xkb fixes for PC98 (#2800, Akio Morita).
-2666. Xkb data files for a Macintosh keyboard (#2798, Sven LUTHER).
-2665. Some preliminary support for the "new" mouse driver for most OSs
-      (David Dawes).
-2664. Prevent xf86LogInit() being called for subsequent server generations.
-
-XFree86 3.9Pn (16 May 1999)
-2663. Add a SetClientVersion request to the DGA extension (David Dawes).
-2662. Change DGA initialisation ordering in the MGA driver (#2796,
-      Mark Vojkovich).
-2661. Turn off DGA pixmaps in xinerama since it insists on duplicating
-      the rendering protocol on all heads despite the DGA pixmaps existing
-      only on a single head (#2795, Mark Vojkovich).
-2660. Fix some xinerama problems with 8+32 overlays (#2795, Mark Vojkovich).
-2659. Add XAA acceleration for DGA pixmaps (#2795, Mark Vojkovich).
-2658. Add PCI IDs for new NVIDIA chipsets (#2794, Mark Vojkovich).
-2657. Change the default cursor colour in the app-defaults for editres
-      (#2793, Paulo Cesar Pereira de Andrade).
-2656. Xedit updates, including a new Xedit-color.ad file, to show some of
-      the new features of Xaw, and some improvements to the ispell interface
-      (#2793, Paulo Cesar Pereira de Andrade).
-2655. Xaw updates, including some fixes, optimizations, and additional
-      documentation (#2793, Paulo Cesar Pereira de Andrade).
-2654. Working mouse support with the new input device code (David Dawes).
-2653. Fix for sysv_video.c on Interactive UNIX (#2792, Michael Rohleder).
-2652. Fix handling of xkbcomp's -I flag (Stanislav Meduna).
-2651. CID updates (third submission) (#2769, Ivan Bach, SGI).
-2650. Kludge to allow a server with the glint driver to link without XInput
-      (#2788, Marc La France).
-2649. Remove unused dacSpeeds field from the ScrnInfoRec (#2788,
-      Marc La France).
-2648. Add an option to the colourmap code to allow a driver's LoadPalette()
-      to be called even when switched out (#2788, Marc La France).
-2647. Add more reasons for rejecting a mode (#2788, Marc La France).
-2646. Factor in the log verbosity when reporting the verbosity to a driver
-      (#2788, Marc La France).
-2645. Allow xf86GetClocks() to be called with NULL ProtectRegs() and
-      BlankScreen() functions (#2788, Marc La France).
-2644. When deleting a screen, also free its mode lists and options (#2788,
-      Marc La France).
-2643. Allow a driver to determine if -probeonly was specified (#2788,
-      Marc La France).
-2642. Fix a large jump in changelog numbering that happened a little while
-      ago (#2788, Marc La France).
-2641. Various warning and include fixes (#2788, Marc La France).
-2640. Xterm patch #103 (#2786, Thomas Dickey).
-2639. SiS driver updates, including fixing the SetMClk option, change solid
-      lines from bresenham to two-point, correct a clippling bug, and change
-      the verbose level of some messages (#2784, 2785, Juanjo Santamarta).
-2638. Fix a server loop that can happen when VT switching while a grab is
-      in progress (#2782, Edward Wang).
-2637. Xterm patch #102 (#2778, Thomas Dickey).
-2636. Fix some spelling errors in Xlib.h (#2775, Itai Nahshon).
-2635. Add auto-detection of Debian to imake (#2774, Sven Luther).
-2634. SiS driver updates, including turning on solid line acceleration,
-      remove GXCOPY_ONLY for Mono8x8 patterns, change mmio pointers to
-      volatile to avoid optimization problems, use xaarop.h, fix offscreen
-      memory init to avoid exceeding the accelerator's address range
-      (#2772, Alan Hourihane).
-2633. Fix build problems with the v4l driver on some systems (based on #2771,
-      Gerd Knorr, and a suggestion from David Woodhouse).
-2632. Xterm patch #101 (#2770, Thomas Dickey).
-2631. Fix some more Xinerarma bugs (#2766, 2768, Mark Vojkovich).
-2630. Fix the use of va_lists in the logging code (David Dawes).
-
-XFree86 3.9Pm (9 May 1999)
-2629. Clean up the handling of Alphas in the s3virge driver (#2767,
-      Matt Grossman).
-2628. Fix a problem that can show up when a module is unloaded while another
-      module has unaccounted for references to its symbols (Egbert Eich).
-2627. -
-2626. Finish DGA event support (#2765, Mark Vojkovich).
-2625. Xaw updates (including compatibility updates and a man page), xedit
-      and editres updates (#2764, Paulo Cesar Pereira de Andrade).
-2624. Disable MIT-SHM in Xnest since it doesn't work (#2763, Wolfram Gloger).
-2623. Add hw clipping for the SiS 6326, and solid lines (disabled) (#2760,
-      Juanjo Santamarta).
-2622. Cirrus driver updates (#2759, Itai Nahshon).
-2621. Fix complier warnings in lib/X11 (#2758, Matt Grossman).
-2620. Fix complier warnings in lib/Xau (#2757, Matt Grossman).
-2619. Update some of the font encoding translation files (#2756,
-      Juliusz Chroboczek).
-2618. Fix some bugs in the font encoding support (#2756, Juliusz Chroboczek).
-2617. Update the Arabic24 BDF font to version 1.3 (#2754, Mark Leisher).
-2616. Xterm patch #100 (#2753, Thomas Dickey).
-2615. A start at the unification of input devices (David Dawes).
-2614. Change the MGA ImageWrite code to not use the image transfer window
-      for simple cpu->framebuffer copies (#2738, Mark Vojkovich).
-2613. Add lseek and bsearch to the libc wrappers (and fix fseek), as needed
-      by the CID font code.
-2612. Add missing file for CID fonts support, and fix a few module-related
-      thing with it.
-
-XFree86 3.9Pl (3 May 1999)
-2611. Fix Xinerama bugs in GetImage and PolyRectangle (#2751, Mark Vojkovich).
-2610. Xterm patch #99 (#2750, Thomas Dickey).
-2609. Disable unneccessary C&T message (#2748, Nozomi Ytow).
-2608. Add some DGA event support (not working yet) (#2747, Mark Vojkovich).
-2607. Xaw and xedit updates including some compatibility updates and
-      performance improvements (#2746, Paulo Cesar Pereira de Andrade).
-2606. Modify mkfontdir to create "encodings.dir" files (#2745,
-      Juliusz Chroboczek).
-2605. Update the DESIGN doc for the new DGA driver interface (#2744,
-      Mark Vojkovich).
-2604. Update the LynxOS vidmem code to use the new shared vidmem.c (#2743,
-      Thomas Mueller).
-2603. -
-2602. Update TGA docs (#2737, Matt Grossman).
-2601. Fix a zero width problem that shows up in xaaSpans.c when hardware
-      clipping is enabled (#2736, Alan Hourihane).
-2600. Add support for Adobe CID fonts (#2728, Ivan Bach, SGI).
-2599. Quick fix for cirrus driver problem introduced in 3.9Pk.
-2598. Fix a problem with pcitweak that was preventing it from working with
-      buses other than bus 0 (David Dawes).
-2597. Update xfontsel to display appropriate glyphs for ISO10646 fonts
-      (Mark Leisher).
-2596. Add support for building XF86Setup with ncurses on NetBSD and OpenBSD
-      (#2734, Matthieu Herrb).
-2595. Fix vidmem map/unmap mismatch in the TGA driver (#2733, Matt Grossman).
-2594. A minor interlace improvement for the PM2 Xv driver (#2731,
-      Michael Schimek).
-2593. Fix color expansion bug in the SiS driver (#2729, Juanjo Santamarta).
-2592. Major resync for OS/2 (#2727, 2732, 2735, Holger Veit).
-2591. Xterm patch #98 (#2726, 2730, Thomas Dickey).
-2590. Fix a build V4L driver build problem (#2725, David Woodhouse).
-2589. Xterm patch #97 (#2724, Thomas Dickey).
-2588. Move the VTInit and VTSysReq keywords from the Keyboard section to
-      the ServerFlags section (as options) (David Dawes).
-2587. Remove the legacy ServerNumLock and "RightAlt", etc special key mapping
-      support (David Dawes).
-2586. Add a new, more complete version of snprintf, vsnprintf for OSs that
-      don't have it.  This one is based on the "SIO" stdio-like package
-      (David Dawes).
-2585. Add log file support, including separate log and stderr streams, and
-      separate verbosity levels for each stream.  Changed the -verbose option
-      to accept an optional integer argument that specifies the verbosity
-      level, add a -logverbose option and a root-only -logfile option
-      (David Dawes).
-2584. Unify the "Overlay" options and "SetMclk" options, and remove the
-      SetMClk Device section keyword (David Dawes).
-2583. Add a "frequency" option value type for use with options processed
-      by xf86ProcessOptions().  This value type consists of a floating point
-      number optionally followed by "Hz", "kHz" or "MHz" (David Dawes).
-
-XFree86 3.9Pk (25 April 1999)
-2582. Move the SVR4-specific handling of mapping memory areas which have
-      read side-effects out of the drivers and into the os-support layer
-      (David Dawes).
-2581. Fix unmap parameters for the SiS driver (David Dawes).
-2580. Fix unmap parameters for the glint driver (#2722, Alan Hourihane).
-2579. Fix the depth 24 visual initialisation (mask, offset) in the
-      Rendition driver (#2720, Martin Cerveny).
-2578. Rework the use of inb/outb in the trident driver, replacing it with
-      MMIO.  Also, don't use the 0xBF000 range for the accelerator registers
-      (#2719, Alan Hourihane).
-2577. Add a -screen option to the xgamma utility so that the gamma of each
-      screen can be changed in Xinerama mode (#2717, Mark Vojkovich).
-2576. Fix all the known problems with the ispell support in xedit (#2716,
-      Paulo Cesar Pereira de Andrade).
-2575. Xaw updates, including improved speed for FindPiece in AsciiSrc.c,
-      add submenu support to the SimpleMenuWidget, add support for text
-      justification to the TextWidget, add an overwrite mode to the
-      TextWidget, make the TextWidget understand negative "multiply" values,
-      add an indent action to the TextWidget, fix a bug in the undo code
-      (#2716, 2721, Paulo Cesar Pereira de Andrade).
-2574. Pcitweak fix for LynxOS, and define NO_MMAP for pre 2.5.0 LynxOS
-      releases (#2715, Thomas Mueller).
-2573. Fix for cirrus hardware cursor on (big endian) PowerPC platform
-      (#2715, Thomas Mueller).
-2572. Experimental DDC support for the Matrox "G" series cards (#2713,
-      Andrew Aitchison).
-2571. Fix a crash in the XAA fill code that happens when
-      Mono8x8PatternFillFlags is set only to HARDWARE_PATTERN_PROGRAMMED_BITS,
-      which affects the TGA driver (#2712, Matt Grossman).
-2570. Replace the default "fixed" (6x13) font with Markus Kuhn's ISO 10646-1
-      version (#2711, Markus Kuhn).
-2569. Import Mark Leisher's ClearlyU BDF fonts (#2707, Mark Leisher).
-2568. Import Mark Leisher's Arabic24 BDF font (#2706, Mark Leisher).
-2567. Initial acceleration for the 24-plane TGA (#2710, Tim Rowley).
-2566. Fix clip bugs in the MGA driver (#2709, Mark Vojkovich).
-2565. Update the `xfsft' TrueType backend to version beta1.1.4.  This includes
-      updates to the `fontenc' interfaces (#2708, Juliusz Chroboczek).
-2564. Fix some #include problems with the rendition driver (#2704, Dejan Ilic).
-2563. Fix a syntax error in the `ru' symbols file (#2703, Peter Novodvorsky).
-2562. Update the xf86SetGamma and xf86SetDpi helpers to use DDC information
-      when it is available, and update the MGA driver to make the DDC
-      information available earlier in the PreInit phase (#2702,
-      Andrew Aitchison).
-2561. Flesh out XF86Setup's config file read and write routines (#2701,
-      Joe Moss).
-2560. Parser fixes (#2700, Joe Moss).
-2559. Remove the out of date references to the sparse map mem functions from
-      the loader (#2699, Matt Grossman).
-2558. Color expansion for the SiS driver, and change the "NoTurboQueue" option
-      to "TurboQueue" (#2696, Juanjo Santamarta).
-2557. Xterm patch #96, including improved logic for bold fonts, improved
-      Unix98 PTY support, and modify initial-erase logic to ensure that the
-      ttyModes resource overrides it (#2695, Thomas Dickey).
-2556. Some #include and warning fixes (#2693, Marc La France).
-2555. On an error, tell user to re-run the server >without< -quiet.  This is
-      generalized to allow the production of error messages to specify the
-      minimum verbosity to be used before reporting a problem (#2693,
-      Marc La France).
-2554. Make -depth 24 produce a more appropriate message when the driver
-      doesn't support it (#2693, Marc La France).
-2553. Reinstate black & white colour options for 1bpp (#2693, Marc La France).
-2552. Fix a typo in XF86Conf.man (#2691, Itai Nahshon).
-2551. Fix the initialisation of some global flags when the config file has
-      no ServerFlags section (David Dawes).
-
-XFree86 3.9Pj (18 April 1999)
-2550. Update SiS docs (#2690, Juanjo Santamarta).
-2549. Glide driver and documentation updates.  Fix the "EXTERN_MODULE"
-      usage, force the virtual size to be the display size, and add a
-      GlideDevice Option to specify one of multiple cards (#2689,
-      Henrik Harmsen).
-2548. Resync DPMS timeout code with the 3.3.x code, which fixes some problems
-      (#2688, David Wragg).
-2547. Preliminary MTRR support for FreeBSD (3.2 and later) (David Dawes).
-2546. Separate the OS-independent and OS-dependent parts of the MapVidMem
-      functions, and handle sparse mapping with a flag to MapVidMem instead
-      of using a separate function (David Dawes).
-2545. Remove most LinkKit references.
-2544. Disable WC for the framebuffer for the Rendition V1K by default,
-      because it appears to be causing lockups (Dejan Ilic).
-2543. Some fixes for the Rendition driver (Dejan Ilic).
-2542. Add HW cursor using the Bt485 ramdac to the DEC TGA driver (#2687,
-      Matt Grossman).
-2541. More of the DGA 2.0 extension.  Most of it is there now except for
-      the events (#2686, Mark Vojkovich).
-2540. Imlement attributes for Audio (mute, volume) and implement
-      QueryBestSize for the v4l driver (#2685, Gerd Knorr).
-2539. Fix hardware cursor code so that it works with the internal 64 bit
-      scanlines used on Alpha platforms (#2679, Matt Grossman).
-2538. Export new DGA symbols from the loader (#2678, Alan Hourihane).
-2537. Update C&T driver to use independent clocks for FP/dual and CRT modes
-      with HiQV chipsets (#2677, Egbert Eich).
-2536. Port of Precision Insight's NeoMagic driver to the new design
-      (#2677, Egbert Eich).
-2535. Add a Linux kernel backbone to the Permedia 2 Xv driver (#2661+revisions,
-      Michael Schimek).
-2534. Port of the rendition driver to the new design (#2674, Marc Langenbach).
-2533. Fix for the parser's printDeviceSection() function (#2673, Joe Moss).
-2532. Fix a bug in the handling of ZAxisMapping in the parser (#2672,
-      Nicholas Brealey).
-2531. Enable mono 8x8 pattern fills for the SiS driver (#2670,
-      Juanjo Santamarta).
-2530. Remove references to ru_SU in locale.alias (#2669, Aleksey Nowodworsky).
-2529. Fix a bug in xf86CollectOptions() that could cause a server crash.
-2528. Fix the problem causing the mouse acceleration to be done twice
-      (#2671, Frederic Lepied).
-2527. Disable clipping in the trident driver for FillRectSolid because the
-      driver gets passed zero values (#2681, Alan Hourihane).
-2526. Add Trident Blade3D support (#2681, Alan Hourihane).
-2525. Add Mono8x8 pattern for the Trident Image series (#2681, Alan Hourihane).
-2524. Fix trident screen glitches when mode switching (#2681, Alan Hourihane).
-2523. Some minor documentation-related cleanups.  Doctools version 1.0.2 is
-      now required to format the XFree86 docs.
-
-XFree86 3.9Pi (11 April 1999)
-2522. Fix a Linux/PPC loader relocation bug, and reenable building the
-      loadable server by default for Linux/PPC (#2668, Gerd Knorr).
-2521. Fix a problem with non-terminated strings in the Xv library (#2665,
-      Gerd Knorr).
-2520. Update the v4l driver -- fix open/close handling and add support for
-      the XV_ENCODING attribute (#2665, Gerd Knorr).
-2519. Implement FBDevSaveScreen() (#2664, Gerd Knorr).
-2518. Enable shadowfb by default for the fbdev driver (#2664, Gerd Knorr).
-2517. Fix fbdev option handling (#2664, Gerd Knorr).
-2516. Fbdev documentation updates (#2664, Gerd Knorr).
-2515. Some more progress on the DGA 2.0 API/protocol (#2663, Mark Vojkovich).
-2514. Add ispell support to xedit (#2662, Paulo Cesar Pereira de Andrade).
-2513. Fix -DUSE_XPM handling in Xaw (#2662, Paulo Cesar Pereira de Andrade).
-2512. Some updates to the offscreen memory allocator and the i2c code
-      (#2661, Michael Schimek).
-2711. Use the correct version of xf86Xinput.c (the wrong version was
-      included in 3.9Ph) (Frederic Lepied).
-2710. Fix a pcitweak build problem on NetBSD (#2659, Isao Ohishi).
-2509. Add acceleration for the 8+16 mode of the C&T driver (#2658,
-      David Bateman).
-2508. Add compatibility to the client-side of the VidMode extension so that
-      it will work with 3.3.x servers (#2657, David Bateman).
-2507. Update 'ru' xkb symbols file (#2656, Aleksey Nowodworsky).
-2506. Add Trident 9525 ID to PCI info and trident driver (#2655,
-      Alan Hourihane).
-2505. Cleanup some compiler warnings in mfb and mi (#2654, Alan Hourihane).
-2504. Added a glide driver.  It currently only works with the loadable
-      server (read the manpage before trying it) (#2653, Henrik Harmsen).
-2503. Update the Type1/latin2 fonts.* files to disable reencoding of the
-      fonts while keeping the same XLFD names (#2652, Juliusz Chroboczek).
-2502. Fix some pcitweak build problems on Interactive UNIX (#2651,
-      Michael Rohleder).
-2501. Xterm patch #95 (see xterm.log.html for details) (#2649, Thomas Dickey).
-2500. Fix typos in the VidMode extension that causes a protocol problem
-      (#2648, 2657, David Bateman).
-2499. Reorder the visuals to put TrueColor before DirectColor so that broken
-      clients (like Wabi) that assume the default visual is the first visual
-      will work (2647, David Woodhouse).
-2498. Fix a problem with the ThinkingMousePS/2 protocol handling of left
-      movement (#2392, Ian Remmler).
-2497. Fix an ISO8859-5 support bug in Xlib (Nikolai Saoukh).
-2496. Rework the GlxInitVisuals hooks with a more general wrapper-based
-      mechanism (David Dawes).
-2495. Fix a XINERAMA bug in dix/events.c (Dirk Hohndel).
-
-XFree86 3.9Ph (5 April 1999)
-2494. Add code to XF86Setup for mode adjustment (like xvidtune), addition,
-      and removal (#2646, Joe Moss).
-2493. Remove the use of the `dialog' program from XF86Setup, and add
-      various curses routines and the start of a text mode user-interface
-      (both curses & plain text).  Also remove some obsolete Tk 4.0-specific
-      code (#2645, Joe Moss).
-2492. Add code to XF86Setup to convert all of the config file sections
-      to/from Tcl variables (#2644, Joe Moss).
-2491. Allow fbdev to handle non-page-aligned framebuffers correctly (#2643,
-      Gerd Knorr).
-2490. Add RAC code to the fbdev driver (if there is a PCI BusID specified
-      in the config file it will "check in" this into access control)
-      (#2643, Gerd Knorr).
-2489. Cleanup in sysv_video.c (#2642, Michael Rohleder).
-2488. Update xedit's realpath.c for IUS (#2642, Michael Rohleder).
-2487. Add support for InputDevice sections to the parser (not used yet)
-      (David Dawes).
-2486. A first cut at cleaning up the handling of memory mapping and client
-      exit/crash in the DGA library (David Dawes).
-2485. Shadowfb support for the generic VGA driver at depths 4 and 1
-      (Dirk Hohndel and Mark Vojkovich).
-2484. Fix the printMonitorSection and printDeviceSection functions in
-      the parser (#2641, Joe Moss).
-2483. Change the s3virge chipset names, removing the slashes (#2640,
-      Kevin Brosius).
-2482. Preliminary s3virge man page (#2640, Kevin Brosius).
-2481. Fix s3virge HW cursor (#2640, Kevin Brosius, Mark Vojkovich).
-2480. Remove some multiply defined variables in the cfb modules to avoid
-      a problem on LynxOS PowerPC (#2639, Thomas Mueller).
-2479. Fix a crash in the new xedit code for listing files and directories
-      (#2638, Paulo Cesar Pereira de Andrade).
-2478. Change the kill_ring code in TextAction.c to always end in a text block
-      of zero length (#2638, Paulo Cesar Pereira de Andrade).
-2477. Add xpm pixmap support to Xaw (needs to be built with -DUSE_XPM
-      for this), and if the xpm image has a mask, the widget will be
-      automatically reshaped to the pixmap mask (#2638,
-      Paulo Cesar Pereira de Andrade).
-2476. Add some PCI IDs for Creative Labs 3D Blaster Banshee PCI (#2637,
-      Nicholas Brealey).
-2475. XAA pixmap->window and window->pixmap copy optimization (#2636,
-      Mark Vojkovich).
-2474. Implement some attributes for the v4l module, and fix the clipping
-      code (#2635, Gerd Knorr).
-2473. Incorporate 3.3.1 FIFO settings for the SiS driver based on memory
-      bandwidth and pixel clock (#2632, Juanjo Santamarta).
-2472. SetMclk and FastVram options for the SiS driver (#2632,
-      Juanjo Santamarta).
-2471. Fix some SiS mode switch problems (#2632, Juanjo Santamarta).
-2470. Imakefile fix for building the X server with BuildGlxExt=NO (#2631,
-      Thomas Mueller).
-2469. Imakefile fixes for cxpm and sxpm (#2631, Thomas Mueller).
-2468. LynxOS resync, including removing the CrossCompile rule from lynx.cf,
-      LynxOS sparc resync, remove SMEM warning for default verbose level,
-      LynxOS support for chips driver util programs (#2631, Thomas Mueller).
-2467. Add man pages for the fbdevhw and fbdev modules (#2630, Gerd Knorr).
-2466. Add fb.h so that fbdevhw can be built on pre-2.2 Linux (#2630,
-      Gerd Knorr).
-2465. Add support for generic Xv adaptors to the fbdev driver (#2629,
-      David Woodhouse).
-2464. Fix X locale problem for Linux/libc6 introduced in 3.9Pg (#2628,
-      Nozomi Ytow).
-2463. Fix VT switching problems with the 8+16 code (#2627, David Bateman).
-2462. Generic Xv support for the s3virge driver (#2626, David Woodhouse).
-2461. Add a permission notice to videodev.h (#2625, David Woodhouse).
-2460. Resync parts of the XInput DDX code with 3.3.x, including restoring
-      the "Switch" device, RELATIVE_CHECK code, Elographics driver,
-      Wacom driver, and Joystick driver (#2514, 2548, Frederic Lepied
-      and Patrick Lecoanet).
-2459. Fix remaining build issued with the GLX/Mesa integration
-      (Marc La France).
-2458. Some preliminary support code that the new RAC code may use
-      (David Dawes).
-2457. Add a utility called `pcitweak' that can be used to read/write
-      registers in the PCI config space from the command line (David Dawes).
-
-XFree86 3.9Pg (29 March 1999)
-2456. Fix an off-by-one clipping error in the XAA wide line code (#2624,
-      Mark Vojkovich).
-2455. Add HW cursor support to the s3virge driver and make it the default
-      (#2623, Kevin Brosius).
-2454. Add OS-specific subdirectories to the loader subdirectory search lists,
-      and install OS-specific modules in such directories (David Dawes).
-2453. Set the screen numbering in multihead configurations based on the
-      ordering of the Screen entries in the ServerLayout section,
-      and allow an optional numerical argument to follow the Screen
-      keyword to indicate a different ordering (David Dawes).
-2452. Fix some signedness discrepancies in the libc_wrapper code.
-2451. Add missing parts to the parser's printKeyboardSection routine (#2621,
-      Joe Moss).
-2450. Finalising the DGA 2.0 driver interface (#2619, Mark Vojkovich).
-2449. Xterm patch #94 (#2618, Thomas Dickey).
-2448. Accelerated support for 8+16 overlays in XAA (untested) (#2617,
-      Mark Vojkovich).
-2447. Some optimisations for the 8+32 and 24+32 layers (#2616, Mark Vojkovich).
-2446. Updates for IUS (Interactive Unix) (#2614, Michael Rohleder).
-2445. Update xf86config for the 4.0 config file format (#2613,
-      Justin Bradford).
-2444. Update and clean up the Cards file (#2600, 2612, Justin Bradford).
-2443. When probing for a VGA, it's unnecessary to unlock its CRTC registers
-      (#2611, Marc La France).
-2442. Remove xf86FreeBusSlots(), which is redundant, unused and incorrect
-      (#2611, Marc La France).
-2441. Move the claiming of ISA resources from xf86Check???Slot() to
-      xf86Claim???Slot() (#2611, Marc La France).
-2440. On Linux, define _GNU_SOURCE only compiling the xc/ source tree (#2611,
-      Marc La France).
-2439. Remove uneeded s3virge files (#2615, Kevin Brosius).
-2438. "pci_burst" option updates for the s3virge driver (#2615, Kevin Brosius).
-2437. Fix missing accel flags and depth 24 problem with the s3virge driver
-      from the Alpha patch (#2615, Kevin Brosius).
-2436. Make sure the size of offscreen pixmaps don't exceed the address space
-      of the ViRGE (#2610, Mark Vojkovich).
-2435. Add a driver for video4linux frame grabber cards (#2609, Gerd Knorr,
-      David Woodhouse).
-2434. Add support to the MGA driver so that it will use any available
-      generic Xv adaptors (#2609, David Woodhouse).
-2433. Add xf86XVRegisterGenericAdaptor() and xf86XVListGenericAdaptors()
-      functions for maintaining a list of Xv adaptors which are not tied
-      to a particular screen (#2609, David Woodhouse).
-2432. Fix virtual screen panning with the SiS driver (#2608,
-      Juanjo Santamarta).
-2431. Fix security problem with the creation of the /tmp/.X11-unix directory
-      (#2607, Matthieu Herrb).
-2430. Update the 8+16 layer to get the color key from the new field in
-      the ScrnInfoRec (#2605, Mark Vojkovich).
-2429. Complete the Xv config evaluation code in the PM2 Xv driver and the
-      common layer (#2604, Michael Schimek).
-2428. Modify Xv DDX's clipping interface (#2604, Michael Schimek).
-2427. Fix a bug in the handling of Boolean options (#2603, Michael Schimek).
-2426. Have xf86ChangeGamma() update and install the default colormap
-      when the currently installed colormap is not implemented by lookup
-      (#2602, Mark Vojkovich).
-2425. Export StoreColors() (#2601, Mark Vojkovich).
-2424. Replace all Imakefile.obj files with Imakefile.inc because .obj is
-      a reserved extension for object file on OS/2 (#2599, Holger Veit).
-2423. Update the Cards file parser to accept a new DRIVER line (#2598,
-      Justin Bradford).
-2422. Fix getline clash in proxymngr and xsm (#2595, Dejan Ilic).
-2421. Fix colourmap on Permedia2, and fix GLINT SaveScreen to blank the
-      display (#2594, 2596, Alan Hourihane).
-2420. Make fbdev work on Sparc Linux, and fix a few bugs in fbdevhw and
-      fbdev (#2593, Jakub Jelinek).
-2419. Sparc Linux support for XFree86 (#2593, Jakub Jelinek).
-2418. Add DPMS support to the s3virge driver (#2592, Matt Grossman).
-2417. ppc_flush_icache() for Linux/PPC, required for the loader to work
-      correctly (#2591, Gerd Knorr).
-2416. Linux/PPC loader fix (#2590, Stuart Anderson).
-2415. Modify the ramdac module and glint driver to use the ScrnInfoRec
-      overlay fields (#2589, 2594, Alan Hourihane).
-2414. Add RTL ethernet and VIA APCI PCI devices to the ID list (#2588,
-      Kevin Brosius).
-2413. Fix a problem with $(STD_CPP_DEFINES) that was introduced in 3.9Pf.
-2412. Add VESA default modes, small perl hack to create an initialized data
-      structure from them, and the code to use those modes as default if no
-      other modes with the same name are defined (Dirk Hohndel).
-
-XFree86 3.9Pf (21 March 1999)
-2411. Fix some malloc problems in xf86xv.c (#2587, Michael Schimek).
-2410. Fix building of Xprt, Xnest and Xvfb when doing a loader build
-      (David Dawes).
-2409. Updates to s3virge driver to get it working under Linux/Alpha
-      (#2586, Matt Grossman).
-2408. Fix getline() clash (#2585, Alan Hourihane).
-2407. Have the s3virge driver use the new XAA rop helper functions (#2584,
-      Mark Vojkovich).
-2406. Add code to SuperProbe to detect the S3 Trio3D and Savage3D
-      (2583, Eric Molitor).
-2405. Add some XAA helper functions that drivers can call for help
-      converting X rops into MS rops (#2582, Mark Vojkovich).
-2404. Resync the overlay support in the glint driver (#2580, 2581,
-      Mark Vojkovich).
-2403. Add support for changing the overlay color key to the MGA driver
-      (#2579, Mark Vojkovich).
-2402. Preallocate the color key in the default colormap and set it to
-      something already in the default man (black) so that AllocColor will
-      never allocate it (#2578, Mark Vojkovich).
-2401. Use the color key field in the ScrnInfoRec for the overlay layers
-      (#2578, Mark Vojkovich).
-2400. Preliminary loader support for Linux/PPC ELF objects (#2577 (2570),
-      Stuart Anderson).
-2399. Fix some XAA offscreen pixmap problmes (#2576, Mark Vojkovich).
-2398. DGA fixes.  Old apps should now run with the new driver interface,
-      and event handling should work better than before (#2575,
-      Mark Vojkovich).
-2397. Fix most remaining signed/unsigned and prototype warnings in the
-      following directories: lib/Xaw, lib/Xmu, programs/xclipboard,
-      programs/xconsole, programs/xmag, and programs/xvidtune (#2574,
-      Thomas Dickey).
-2396. Restore the interface of XmuConvertStandardSelection() to use
-      XPointer rather than XtPointer (#2574, Thomas Dickey).
-2395. Fix an malloc size bug in libICE (#2572, Christopher Sekiya).
-2394. Make MIT-SHM resource types non-static so that other extensions
-      (like Xv) can access client shared memory segments (#2571,
-      Mark Vojkovich).
-2393. First cut at altering the C&T user docs for 4.0 (#2569, David Bateman).
-2392. Fix a C&T problem affecting the colourmap setup for 1bpp modes, and some
-      other minor C&T driver fixes (#2569, David Bateman).
-2391. Fix an buffer overflow in os/connection.c (#2568, Gerd Knorr).
-2390. Add support for Modes sections and the UseModes keyword for Monitor
-      sections to the parser (#2567, Dirk Hohndel).
-2389. Fix xfree86.cf for Alpha (#2567, Dirk Hohndel).
-2388. Fix XAAFillPolygonStippled to obey the flag NO_TRANSPARENCY in
-      Mono8x8PatternFill (#2566, Xavier Ducoin).
-2387. Only allow the shadowfb layer in the C&T driver when linear addressing
-      is enabled (#2565 (2561), David Bateman).
-2386. Fix some problems with the xf8_16bpp layer, and allow it to work
-      with depth 15 as well as 16 (#2565 (2561, 2562), David Bateman).
-2385. Implement TrueColor with PseudoColor Overlays (8+16) for the
-      C&T driver for HiQV chipsets (#2565 (2561), David Bateman).
-2384. Add a -quiet option to xgamma (#2565 (2561), David Bateman).
-2383. Add TrueColor Gamma Correction for C&T HiQV chipsets (#2565 (2561),
-      David Bateman).
-2382. Fix Permedia 2 HW cursor lockup (#2563, Alan Hourihane).
-2381. Initial XAA support for SiS530 and SiS620 (#2560, Xavier Ducoin).
-2380. Add SuperProbe for SiS (#2559, Xavier Ducoin).
-2379. Fix the InstalMultipleMan and InstallMultipleManSuffix rules for
-      NetBSD and OpenBSD (#2558 (2557), Matthieu Herrb).
-2378. Add Cards entry for Number Nine FX Reality 772 (#2556, Harald Koenig).
-2377. Make XF86Setup build again (not fully functional yet) (#2555, Joe Moss).
-2376. Update the apm (Alliance Promotion) driver to the 4.0 interface (#2554,
-      Loic Grenie, Henrik Harmsen).
-2375. Add some rules for driver/module man pages, and add a sample driver
-      man page for the mga driver (David Dawes).
-2374. Update the Option Names section of xfree86/Registry (David Dawes).
-2373. Merge the OPTV_BOOLEAN and OPTV_TRI option classes, removing the
-      latter.  Update code affected by this (David Dawes).
-2372. Fix the BackingStore option.
-2371. Disable transparency for screen->screen copies for Trident Image for
-      now.
-2370. Trident Image transparency update (#2564, Alan Hourihane).
-
-XFree86 3.9Pe (14 March 1999)
-2369. Fix problems debugging archive library modules on Linux with long
-      member names (Paul Flinders).
-2368. Add new XAA clipping for Trident Image (#2553, Alan Hourihane).
-2367. Fix Trident save screen so that it blanks the display (#2553,
-      Alan Hourihane).
-2366. Fix tranparency for the Trident Image cards (#2553, Alan Hourihane).
-2365. Remove the panmi and pandix directories, since they're no longer
-      needed.
-2364. Add gamma correction to the C&T driver, but disabled because it doesn't
-      work yet (David Bateman).
-2363. Add shadow fb support to the C&T driver (David Bateman).
-2362. Finish off the VidMode extension backward compatibility code
-      (David Bateman).
-2361. Add SetGamma/GetGamma requests to the VidMode extension, and a client
-      called 'xgamma' that makes use of them to allow the server's gamma
-      correction to be changed dynamically (David Bateman).
-2360. Make the cursor layer smart enough to remove the cursor itself when
-      DGA is activated (#2552, Mark Vojkovich).
-2359. Add some overlay-related entries to the ScrnInfoRec (#2550,
-      Mark Vojkovich).
-2358. Some DGA fixes (#2550, 2551, Mark Vojkovich).
-2357. Set X_BYTE_ORDER from the imake config, and use it in place of
-      the system's BYTE_ORDER (David Dawes).
-2356. Update copyright notices in the s3virge driver (#2546, Kevin Brosius).
-2355. Xterm patch #93 (#2546, Thomas Dickey).
-2354. Fix some minor fbdev problems in fbdevhw and the mga driver (#2545,
-      Gerd Knorr).
-2353. Disable the loader for LinuxPPC because it doesn't work (#2545,
-      Gerd Knorr).
-2352. Disable the Linux fbdevhw by default for versions older than 2.2
-      (#2545, Gerd Knorr).
-2351. Xaw and xedit updates, including changes to Xaw to support latin*
-      languages in the text code when not using the "international" resource
-      (#2544, Paulo Cesar Pereira de Andrade).
-2350. Add 3D decoration and the ability to display an XPM pixmap in the xdm
-      Login widget.  A default pixmap made with the XFree86 logo is included
-      (#2543, Amit Margalit, Caolan McNamara, Ivan Griffin, Matthieu Herrb).
-2349. Improve attribute scaling in the PM2 Xv driver (#2542, Michael Schimek).
-2348. Add an "acecad" mouse protocol so that an acecad tablet can be used
-      with the standard mouse driver (#2541, Jeff Anton).
-2347. Include xf86_ansic.h in module build of xf86vmode.c (#2540,
-      Matthieu Herrb).
-2346. Fix a server crash when no mode lines are specified in the Monitor
-      section (#2539, Andreas Ehliar).
-2345. Resync SuperProbe with the 3.3.3.1 version (#2538, Marc La France).
-2344. Document -once server commad line option (#2538, Marc La France).
-2343. Add and document a -noreset server command line option to disable server
-      resets when the last client connection is closed.  This is useful for
-      xtest'ing a server that is switched out (#2538, Marc La France).
-2342. More compiler warning fixups, including a re-integration of GLX for both
-      static and loader builds (#2538, Marc La France).
-2341. On Linux, compile with _GNU_SOURCE so that declarations for snprintf &
-      friends may be #include'd with <stdio.h> (#2538, Marc La France).
-2340. Fix the glint driver's use of resource control, which fixes problems
-      using MGA/GLINT combinations in multi-head (#2537, Alan Hourihane).
-2339. Fix a problem building xrdb with SVR4.0's cc (#2536, Satoshi Kimura).
-2338. Fix a trident 24bpp bug (#2535, Alan Hourihane).
-2337. Fix Permedia 2V hardware cursor (#2534, Alan Hourihane).
-2336. Add the rest of the known EM_ machine type defines, and Sparc
-      specific relocation defines to loader/elf.h (#2533, David Miller).
-2335. -
-2334. Disable MTRRs when unmapping memory (#2531, David Wragg).
-2333. Avoid the MTRR messages on systems with no MTRR support unless
-      the "mtrr" option is specified or -verbose is used (#2531, David Wragg).
-2332. -
-2331. Fix some offscreen pixmap-related problems with XAA (#2497, 2549,
-      Mark Vojkovich).
-
-XFree86 3.9Pd (9 March 1999)
-2330. Updates for Hurd port (#2528, UCHIYAMA Yasushi).
-2329. Fix some Solaris 7 build problems (#2530, Nicholas Brealey).
-2328. Add some more PCI entries (#2529, Nicholas Brealey).
-2327. Preliminary DGA support for the mga driver (#2527, Mark Vojkovich).
-2326. Fix some DGA bugs and turn on events in the DGA compatibility code
-      (#2526, Mark Vojkovich).
-2325. Fix the memory units in the old DGA (#2525, Mark Vojkovich).
-2324. Allow drivers to limit the size of XAA offscreen pixmaps (#2524,
-      Mark Vojkovich).
-2323. Fix the problem with XAA pixmap cache messages only being printed
-      for the first screen (#2524, Mark Vojkovich).
-2322. Temporarily disable rops without a source in the s3virge driver,
-      and add the ShowCache option (#2523, Mark Vojkovich).
-2321. Add XF86Config parser for VideoAdaptor configuration (#2521,
-      Michael Schimek).
-2320. Fis Permedia DPMS bug and Permedia 2 hw cursor (#2521, Michael Schimek).
-2319. Move include/Xvlib.h to include/X11/extensions/, add missing
-      XvPortNotify, and fix Xv DDX StopVideo deficiency (#2521,
-      Michael Schimek).
-2318. More ansifications/gcc warning removal for the clients (#2520,
-      Matthieu Herrb).
-2317. Implement backward compatibility for the server side of the VidMode
-      extension, which relies on the new clients informing the server of
-      their version (David Dawes).
-2316. Initial conversion of the VidMode extension for 4.0 (David Bateman).
-2315. Add DPMS support to the TGA driver (#2518, Matt Grossman).
-2314. Fix a bug in xaaInitAccel.c that affects disabling offscreen pixmaps
-      (#2519, Andrew Aitchison).
-2313. Some SiS driver fixes/updates (#2517, Juanjo Santamarta).
-2312. Fix a server crash when assiging the primary device (#2516,
-      Alan Hourihane).
-2311. Don't save/restore the VGA colourmap in the glint driver (#2515,
-      Alan Hourihane).
-2310. Fix a problem of using freed data in xgc (#2512, Jeff Anton).
-2309. Make the server fail gracefully when it can't load its base modules
-      (#2511, Alan Hourihane).
-2308. Fix a global declaration clash in panoramiXprocs.c (#2510,
-      Alan Hourihane).
-2307. Fix installation of GLX man pages (based on #2509, Matthieu Herrb).
-2306. Update the Linux/ppc section of xfree86.cf (#2507, Gerd Knorr).
-2305. Add code to the mga driver for using the fbdevhw module (#2507, 2522,
-      Gerd Knorr).
-2304. Add a fbdev module that provides a simple non-accelerated driver that
-      works on top of fbdevhw (#2507, Gerd Knorr).
-2303. Add a fbdevhw module that provides the functions needed to access
-      Linux framebuffer devices (#2507, Gerd Knorr).
-2302. Add a wrapper for mmap and munmap (#2507, Gerd Knorr).
-2301. Fix an XAA FillPoly problem that shows up with the noblank screen
-      saver (#2513, Mark Vojkovich).
-2300. Fix some problems in XAA's 32->24bpp image conversion (Mark Vojkovich).
-2299. Fix padding in the xf24_32bpp layer (#2508, Mark Vojkovich).
-
-XFree86 3.9Pc (2 March 1999)
-2298. Preliminary work on new DGA event support (#2506, Mark Vojkovich).
-2297. Add rewrite of s3virge driver's accel code (#2505, Mark Vojkovich,
-      Kevin Brosius).
-2296. Remove typos and inconsistencies between the Xv manual pages and
-      the implementation (#2504, Michael Schimek).,
-2295. Ansification and gcc warning elimnation in xfwp, xhost, xieperf,
-      xinit, xkbevd, xkbprint, xkbutils, xkill, xlogo (#2502, Matthieu Herrb).
-2294. Fix an MGA driver crash that shows up when running xtest (#2501
-      Alan Hourihane).
-2293. Correctly indicate when the MGA driver auto-detects SDRAM cards
-      (#2500, Alan Hourihane).
-2292. Add "noddc1" and "noddc2" options to the DDC layer to allow DDC to
-      be disabled (#2499, Alan Hourihane).
-2291. Change PsAttVal.c (Xprt/PS) so that values other then {PostScript 2}
-      can be put into xp-raw-formats-supported (#2498, Noah Roberts).
-2290. Fix a 'make includes' problem in lib/font that shows up on SVR4.
-2289. Integrate SGI's GLX and the Mesa core rendering library
-      (#2492, Precision Insight, SGI, Mesa).
-2288. -
-2287. New DGA DDX layer (not finished yet) (#2495, Mark Vojkovich).
-2286. Backwards compatibility layer translating DGA 1.0 into the new DDX
-      (#2494, Mark Vojkovich).
-2285. Disable old DGA support in the cirrus driver (#2493, Mark Vojkovich).
-2284. Ansification and gcc warning elimnation in xclipboard, xclock, xcmsdb,
-      xconsole, xdm, xdpyinfo, xedit, xfd and xfindproxy (#2491,
-      Matthieu Herrb).
-2283. Fix 8 plane TGA 8x8 pattern fill (#2490, Matt Grossman).
-2282. Fix pitch padding in the xf24_32bpp layer (#2489, 2496, Itai Nahshon).
-2281. Add DPMS support for the Cirrus Laguna chips (#2489, 2496, Itai Nahshon).
-2280. Add loader req/ref symbol lists to the cirrus module (#2489, 2496,
-      Itai Nahshon).
-2279. Fix cirrus display corruption with acceleration and SW cursor
-      (#2489, 2496, Itai Nahshon).
-2278. Add minimal 5430 support to the cirrus driver (#2489, 2496,
-      Itai Nahshon).
-2277. Resync LynxOS support (#2486, Thomas Mueller).
-2276. Remove the driver for the never-released P3D chipset (#2285, Dejan Ilic).
-2275. Change xf86XVScreenInit's arguments so that it's easier to initialize
-      the Xv DDX when adaptors come from multiple sources (#2484,
-      Mark Vojkovich).
-2274. Ansification and gcc warning elimnation in x11perf and xauth
-      (#2483, Matthieu Herrb).
-2273. Fix a backing store bug in the 24/32 layer, and add a local version
-      of a 24->24bpp copy routine since the performance in cfb24 is too
-      poor (#2481, Mark Vojkovich).
-2272. Add support for setting write-combining for the frame buffer memory,
-      and disabling WC for MMIO memory via the PPro/PII MTRR facility
-      provided in Linux 2.2 (#2480, 2503, David Wragg).
-2271. Xaw and xedit updates/fixes (#2479, Paulo Cesar Pereira de Andrade).
-2270. Add some more PCI data (#2478, Andrew Aitchison, #2489, 2495,
-      Itai Nahshon).
-2269. Fix a bug in the KIO8-U encoding in fontenc.c (#2477,
-      Juliusz Chroboczek).
-2268. Fix most of the warnings that show up when building on Digital Unix 4.0D,
-      with the DEC C compiler.
-2267. Fix for Millennium II hardware cursor-related loss of sync problem
-      that shows up with some revs of the 3026 ramdac (Trey Boudreau).
-2266. Update the setting of the option registers in G-type RAMDAC
-      Matrox cards and add "no_ddc" flag (Dirk Hohndel, Michael
-      Brown).
-
-XFree86 3.9Pb (20 February 1999)
-2265. Allow YaccCmd to be overridden in host.def (#2474-2476,
-      Christopher Sekiya).
-2264. Implement null overscans in VGA, minor fixups to VGA generic
-      default mode, re-add #ifndef's in VGA generic driver erroneously
-      deleted in 3.9No (#2473, Marc LaFrance).
-2263. More MULTIBUFFER extension fixes (#2471, Marc LaFrance).
-2262. Add support for the Matrox G200 SDRAM cards; G100 SGRAM still
-      doesn't work (Dirk Hohndel).
-2261. Support Linux PowerPC. Add Linux 2.2 PCI config space code
-      (#2470, Gerd Knorr).
-2260. Remove gcc warnings in the clients and lib/FS (#2469, Matthieu Herrb).
-2259. Updates to the PCI database (Dirk Hohndel, David Monro).
-
-XFree86 3.9Pa (14 February 1999)
-2258. Use /dev/io to enable I/O access on FreeBSD instead of KDENABIO.
-2257. Correct some typos/grammatical problems with the DESIGN doc (Ivan Bach).
-2256. Fix a crash when PciAccInfo isn't initialized (#2468, Alan Hourihane).
-2255. Add SiS530 detection to the SiS driver. Clock programming,
-      acceleration and hw cursor are not implemented, yet (Dirk Hohndel).
-2254. Fix some bugs related to hardware clipping of spans. XAA
-      WideLine speedups when hardware clipping is available (#2467
-      Mark Vojkovich).
-2253. Permedia2 clipping fixes, fix WritePixmap for non-GXcopy rasters
-      (#2466, Alan Hourihane).
-2252. Add -scanpci option and a scanpci module to the server. Add tons
-      of PCI2.1 subsystem ids to identify specifc cards; the PCI data
-      base needs more work (Dirk Hohndel).
-2251. Remove obsolete xf86[GS]etDefaultColorVisualClass() and fix some
-      small typos and comments; make type of BIOS, Memory and I/O
-      bases consistent (#2460,2465 Marc LaFrance).
-2250. Add ScanlineCPUToScreen for TX/MX and older Permedia chipsets
-      for when PCI retries are not enabled (#2459,2461,2462,2463
-      Alan Hourihane).
-2249. Add 24/8 overlay support for 3Dlabs chipsets and switch to MMIO
-      for vga access (#2459, Alan Hourihane).
-2248. Add 24/8 overlay support to IBM526 and IBM640 ramdacs, fix IBM640 hw
-      cursor (#2458, Alan Hourihane).
-2247. Fix depth 24 support in TGA driver (#2456, Tim Rowley).
-
-XFree86 3.9P (7 February 1999)
-2246. Some TGA driver speedups and cleanups (#2454, Matt Grossman).
-2245. Fix a lock_display() prototype problem in Xlibint.h that shows up
-      when building with -DXTHREADS.
-2244. Allow the driver to override XAA's assignment of Screen functions which
-      access the framebuffer (#2453, Mark Vojkovich).
-2243. Fix mga overlay problems related to the software cursor and disable
-      overlays for the G100 since it doesn't support planemasks (#2452,
-      Mark Vojkovich).
-2242. Rectangle outline performance improvements for the shadow framebuffer
-      (2451, Mark Vojkovich).
-2241. Update the ati driver code to include changes in 3.3.3.1.  The driver
-      is not buildable yet (#2450, Marc La France).
-2240. Add support for VT switching to the 8+16 layer (#2449, Mark Vojkovich).
-2239. Export xf86NewSerialNumber() (#2448, Mark Vojkovich).
-2238. Fix XAA pixmap cache in 24bpp when ImageWrites are not available and
-      32bpp pixmaps are used (#2447, Mark Vojkovich).
-2237. Improve performance for zero width arcs at 24bpp in the mga driver
-      (#2446, Mark Vojkovich).
-2236. Optimise 24->32bpp transfers (#2445, Mark Vojkovich).
-2235. Xterm patch #92 (#2444, Thomas Dickey).
-2234. Fix some compiler warnings in libfont (#2443, Marc La France).
-2233. Make building the Speedo and Type1 font code optional (#2443,
-      Marc La France).
-2232. Add DDC2 and Xv support for Permedia 2 to the glint driver (#2442,
-      Michael Schimek).
-2231. Update the glint driver's clipping for the new XAA clip support
-      (#2440, Alan Hourihane).
-2230. Add support for the ELSA Gloria-XXL with Glint Gamma chip (#2440, 2441,
-      Alan Hourihane).
-2229. Fix some ANSI vs non-ANSI prototype mixing in the Speedo code.
-2228. Fix a bug setting the framebuffer pixmap format for depth 4 in
-      xf86SetDepthBpp().
-2227. Fix some misuse of the VGA "Palette" enable/disable functions in the
-      vgahw code, and clarify what they do.  This fixes some display artefacts
-      that were showing up when writing to the colourmap.
-
-XFree86 3.9Nz (1 February 1999)
-2226. Add an 8+16bpp dual framebuffer layer (#2425, Mark Vojkovich).
-2225. Add "ShadowFB" to the mga driver for experimenting with the shadowfb
-      layer (#2439, Mark Vojkovich).
-2224. Some cleanups/fixes for Solaris 7 (#2437, David Holland).
-2223. Ansify (and remove gcc warnings from) the following clients: appres,
-      bdftopcf, beforelight, bitmap and editres (#2436, Matthieu Herrb).
-2222. Eliminate cpp-related warnings about the "unix" symbol on NetBSD-current
-      (#2434, Matthieu Herrb).
-2221. Fix a bug in Xaw's StripChart widget that shows up with xload
-      (#2433, Matthieu Herrb).
-2220. Some initial code for supporting other SiS cards in the SiS driver
-      (#2420, Juanjo Santamarta).
-2219. Allow static Xvfb to compile (#2432, Marc La France).
-2218. Fix ddc and chips Imakefiles (#2432, Marc La France,
-      #2435, Matthieu Herrb).
-2217. Remove redundant BitsPerPixel macro definitions (#2432, Marc La France).
-2216. Remove some redundant rules from Xpm's Imakefile (#2432, Marc La France).
-2215. Fix some compiler warnings (#2432, Marc La France).
-2214. Allow the deprecated MultiBuffer extension to compile (#2432,
-      Marc La France).
-2213. Fix problems building with XInput disabled (#2432, Marc La France).
-2212. Fix 'make clean' to remove lndir and revpath (#2432, Marc La France).
-2211. Add a new "shadowfb" layer that maintains a virtual framebuffer in
-      system memory and tells the driver what parts of the videoram
-      framebuffer need updating.  This allows the use of write-only videoram
-      framebuffers (#2431, 2438, Mark Vojkovich).
-2210. Fix some compilation problems on Alpha platforms caused by some
-      inlines in complier.h being declared as extern instead of static
-      (2430, Matt Grossman).
-2209. Remove the inconsistencies with numeric chipset tokens in the s3virge
-      driver (#2428, Kevin Brosius).
-2208. Move the mga DDC code into the PreInit function, add I2C support
-      (disabled and not working so far), and allow the driver to continue
-      without DDC support if the DDC module is missing (#2427,
-      Andrew Aitchison).
-2207. Fix a problem with xsm not acknowledging the SaveYourself message it
-      sends clients with a SaveComplete message (#2426, Robert Bihlmeyer).
-2206. Update the mga driver to use the new XAA clipping (#2424,
-      Mark Vojkovich).
-2205. Some enhancements to XAA's HW clipping handling, allowing clipping
-      to be used for more than just lines (#2423, Mark Vojkovich).
-2204. Fix a problem with the previous cfb screen pixmap access fix (#2242,
-      Mark Vojkovich).
-2203. Fix SiS 24bpp support (#2421, Alan Hourihane).
-2202. Fix SiS HW cursor, max clock and 16bpp support (#2418, Alan Hourihane).
-2201. Update the ramdac module's HW cursor support to handle hardware that
-      requires nibble swapping (#2417, 2419, Alan Hourihane).
-2200. Make the fact that the XAA TE font rendering assembly code is disabled
-      by default more obvious (#2416, David Bateman).
-2199. Fix VT switches in 8+32 mode (#2415, Mark Vojkovich).
-2198. Add common encoding support for the Speedo, Type1 and FreeType
-      font backends (#2385, Juliusz Chroboczek).
-2197. Update lib/font/FreeType to xfsft-1.0.3 (#2385, Juliusz Chroboczek).
-2196. X-TT updates for our loader (X-TT team and Nozomi Ytow).
-2195. Import X-TrueType 1.2pre-19990125 (X-TT team).
-
-XFree86 3.9Ny (26 January 1999)
-2194. Some improvements to the XAA TE font rendering assembly code (note
-      that this assembly code is disabled by default) (#2413, David Bateman).
-2193. Fix some places in cfb that were accessing the screen pixmap directly
-      from the private (#2412, Mark Vojkovich).
-2192. Fix a FreeType build problem on 64-bit platforms (#2411, Alan Hourihane).
-2191. Fix a cfb24 build problem that shows up with egcs (#2410,
-      Alan Hourihane).
-2190. Add DPMS, DDC1 and HW cursor support to the SiS driver, and fix panning
-      in the SiS driver (#2409, Alan Hourihane).
-2189. Put copyright notices from the pandix/panmi code into the merged
-      dix/mi versions (#2408, Alan Hourihane).
-2188. Update drivers to use the 24/32 conversion layer, and to default to
-      a 24bpp framebuffer format when supported.
-2187. Make some refinements to the way the depth 24 pixmap format is set.
-2186. Replace the ModuleInit function with a ModuleData data object.  This
-      allows the loader to get the version and entry points from a module
-      without first executing module code.
-2185. Unify the abiclass and abivendor fields of XF86ModuleVersionInfo,
-      and add a moduleclass field.
-2184. Add a SaveRestoreImage field to the ScrnInfoRec to allow drivers to
-      supply an alternative to the default.
-
-XFree86 3.9Nx (24 January 1999)
-2183. Prevent LoadSubModule() from passing absolute module paths and from
-      providing its own module search path.
-2182. Import FreeType 1.2.  This includes the FreeType library specific parts
-      of #2385 from Juliusz Chroboczek.
-2181. Add a root-only -modulepath command line option to the X server.
-2180. Fix the VT switch screen restore bug introduced a few versions ago
-      (#2406, Mark Vojkovich).
-2179. ND version of the SiS driver, currently only for the 6326 chip (#2404,
-      2405, 2407, Alan Hourihane).
-2178. xterm patch #91 (#2402, Thomas Dickey).
-2177. Add 32/24 support to the MGA driver (#2401, Mark Vojkovich).
-2176. Add 32bpp->24bpp conversion acceleration to XAA (#2400, Mark Vojkovich).
-2175. Add partial acceleration support to the TGA driver (#2399, 2403,
-      Matt Grossman).
-2174. Fix an 8+32 layer bug introduced in 3.9Nw (#2398, Mark Vojkovich).
-2173. Add a 32/24 conversion layer.  Pixmaps are still 24bpp internally,
-      but the interfaces visible to clients are all 32bpp (#2397,
-      Mark Vojkovich).
-2172. Fix trident driver panning at 24bpp (#2395, Alan Hourihane).
-2171. Add DDC1 and DDC2 (the latter not working yet) to the trident driver
-      (#2395, Alan Hourihane).
-2170. Add MCLK override to the trident driver (#2395, Alan Hourihane).
-2169. Enable pixel multiplexing to the trident drive for high resolution
-      8bpp modes (#2395, Alan Hourihane).
-2168. Add clipping for the Trident 9682 and 9685 and Mono8x8 and CPUToScreen
-      support for the 9685 (#2395, Alan Hourihane).
-2167. Add offscreen pixmap support for the Trident Image series (#2395,
-      Alan Hourihane).
-2166. Fix some cfb24 problems that showed up after the previous changes
-      (#2396, Nozomi Ytow).
-2165. Update the C&T HW cursor defaults to only disable them by default when
-      necessary (#2394, David Bateman).
-2164. Add some sanity checking for the subdirs argument to LoadSubModule, etc.
-2163. Fix a bug in the verbose Mode handling in the parser that can result
-      in an infinite loop when the "Mode" keyword is used incorrectly in
-      a config file.
-2162. Add a global default module path to the loader, and a function that
-      the common layer can call to set it.
-2161. LoadModule was ignoring the subdir list argument (Nozomi Ytow).
-2160. Add printing of subsystem ids to scanpci (Dirk Hohndel).
-
-XFree86 3.9Nw (17 January 1999)
-2159. Add functions for finding the pixmap format and pixmap bpp for a
-      given depth, and fix a crash in xf86ValidateModes() caused by recent
-      changes in this area.
-2158. Add an extra argument to LoadSubModule (and LoadModule) to allow the
-      caller to optionally specify version and/or ABI requirements that
-      the loaded module must meet for the load to complete successfully.
-2158. Add support to the loader for vendor-defined ABI classes.  These classes
-      are specified as a string.  The main use is for third party modules that
-      themselves load sub-modules (like X-TT).
-2157. Fix the MGA driver's handling of the "MGA_SDRAM" option.  SDRAM cards
-      are still not auto-detected though (#2391, Mark Vojkovich).
-2156. Add a screen->screen colour expansion bug workaround to the MGA driver,
-      and enable the faster linear expansions instead of the planar ones
-      (#2390, Mark Vojkovich).
-2155. Fix some depth/bpp issues in the SHM code (#2389, Mark Vojkovich).
-2154. Export some missing symbols for Alpha platforms (#2388, Alan Hourihane).
-2153. Fix a bug in determing the card type in the TGA driver (#2387,
-      Alan Hourihane).
-2152. Fix a problem in ramdac/BT.c (#2386, Alan Hourihane).
-
-XFree86 3.9Nv (15 January 1999)
-2151. Fix cfb24 problems that show up with xtest (#2384, Nozomi Ytow).
-2150. Fix 64 pixel rounding of display width in the C&T driver (#2383,
-      David Bateman).
-2149. Add an UnloadSubModule() function that can unload individual sub-modules
-      without unloading sibilings.
-2148. Remove a lot of unnecessary casts of x*alloc().
-2147. Add a pciGetBaseSize() funtion to the PCI code.
-2146. Make our PCI code aware of the following 2.1 type 0 header fields:
-      Cardbus CIS pointer and subsystem ids.
-2145. Remove the KEEP_BPP code, and fix problems with some drivers referencing
-      the unused pixmapBPP ScrnInfoRec field.
-
-XFree86 3.9Nu (13 January 1999)
-2144. Fix a bug in PANORAMIX_FREE(), which was referencing just freed data.
-2143. Merge the pandix/panmi code into dix and mi, and enable building
-      the Xinerama (panoramiX) extension by default (#2377-2381,
-      Alan Hourihane).
-2142. Rework the handling of the depth/bpp/fbbpp options.  The -bpp flag and
-      related config file keywords are no longer used.  New flags and options
-      have been added to specify the server-wide depth 24 pixmap format.
-      A "standard" set of pixmap formats is always advertised, so drivers
-      using these don't need to worry about explicitly adding them.
-2141. Fix some sun_path overflows in xtrans.
-2140. Some panoramix fixups (#2376, Alan Hourihane).
-2139. Don't allow arbitrarily long display number strings to be passed on
-      to xtrans by _X11TransConnectDisplay().
-2138. Update the parser and xf86Config.c to allow Options to be specified in
-      the config file's ServerLayout section.  Options in the ServerLayout
-      section can override those in the ServerFlags section.
-2137. Update the parser and xf86Config.c to allow "Inactive" devices
-      to be specified in the config file's ServerLayout section.
-2136. Import xpm version 3.4k.
-
-XFree86 3.9Nt (11 January 1999)
-2135. Fix 8+32 rendering bugs (#2374, Mark Vojkovich).
-2134. Update vgaHWddc1SetSpeed() to select the 25 MHz clock (#2373,
-      Alan Hourihane).
-2133. Add support for a shared font library (#2364, Takuya SHIOZAKI).
-2132. Add ProfiledDepLibraryTarget, DebuggedDepLibraryTarget and
-      SharedDepLibraryTarget rules to imake (#2364, Takuya SHIOZAKI).
-2131. Fix a typo in xf86Init.c (#2372, Nozomi Ytow).
-2130. Xaw and xedit updates (#2371, Paulo Cesar Pereira de Andrade).
-2129. Move the DDC call to before the mode initialisation in the mga driver
-      (#2367, Alan Hourihane).
-2128. Fix a problem with the xkb dvorak layout (#2362, Tabman)
-2127. Fix an xsm crash (NULL dereference) when a client sets an SM property
-      list to a length of zero (#2361, Robert Bihlmeyer).
-2126. Untested support for the Trident 939A/DVD (#2359, 2360, Alan Hourihane).
-
-XFree86 3.9Ns (3 January 1999)
-2125. Allow backing store to be controlled with a per-screen config file
-      option (#2357, Mark Vojkovich).
-2124. Fix XAA so that the offscreen pixmaps are compatible with backing store
-      (#2354, Mark Vojkovich).
-2123. Fix a bug in XAA's stipple to 8x8 pattern reduction code (#2352,
-      Mark Vojkovich).
-2122. 8+32 overlay support for XAA (#2352, 2356, Mark Vojkovich).
-2121. Add TGUI9440 and Cyber9320 support to the trident driver (#2348,
-      Alan Hourihane).
-2120. Fix a typo in xkbcomp/symbols/sun/Imakefile (#2337, Matthieu Herrb).
-2119. Mga driver updates for the new 8+32 overlay support (#2332, 2353,
-      Mark Vojkovich).
-2118. New 8+32 overlay support (#2331, 2351, 2358, Mark Vojkovich).
-2117. Fix a bug in the xterm man page (#2333, Thomas Dickey).
-2116. Remove the -fno-strength-reduce option for OpenBSD and NetBSD (#2328,
-      Matthieu Herrb).
-2115. Import regex for systems that don't have a Posix regex.
-2114. Add a LoaderListDir() function that can be used to list the available
-      modules.
-2113. Modify LoadModule and LoadSubmodule to accept optional subdir and
-      pattern lists, and use regular expressions for the module matching
-      instead of prefix/suffix lists.
-2112. Add a "revpath" utility to xc/config/util to help in dealing with
-      imake's use of relative paths.  If this proves to be useful, it could
-      be used more widely in imake's rules.
-2111. Install some classes of modules into subdirectories of the "modules"
-      directory.  The imake module install rules have been updated
-      accordingly.
-
-XFree86 3.9Nr (20 December 1998)
-2110. Add support for the wscons console driver for NetBSD-current (#2326,
-      Matthieu Herrb).
-2109. Remove cfbPuntCopyPlane from cfb (#2325, Mark Vojkovich).
-2108. Fix a build problem related to Xarch.h on NetBSD (#2322, Isao Ohishi).
-2107. Fix an XAA bug tha can result in a zero height when rendering TE text
-      (#2321, Mark Vojkovich).
-2106. Fix an optimization bug in the new XAA rect and span code (#2319,
-      Mark Vojkovich).
-2105. Accelerate CopyPlane on offscreen pixmaps (#2318, Mark Vojkovich).
-2104. Fix a 4bpp problem with the C&T driver and the new colourmap code
-      (#2317, David Bateman).
-2103. Enable XAA offscreen pixmaps in the C&T driver (#2317, David Bateman).
-2102. ImageRead functions for some C&T HiQV chipsets (disabled) (#2317,
-      David Bateman).
-2101. MMIO access to the registers for PCI C&T 69000 (#2317, David Bateman).
-2100. Cleanup code in mipushpxl.c (#2313, Thomas Mueller).
-2099. Fix MX/TX clipping bugs in the glint driver (#2312, Alan Hourihane).
-2098. xterm patch #90 (#2311, Thomas Dickey).
-2097. Export missing symbols for panoramiX (#2310, Alan Hourihane).
-2096. Initialise a number of Xlib/Xt data structures, correct a minor linker
-      bug in OS/2 (#2026, Holger Veit).
-2095. Fix some realloc() usages (#2019, Matthieu Herrb).
-2094. Support for arc4random() in xdm/genauth.c (#2019, Michael Shalayeff).
-2093. Update mkfontdir to create an appropriate fonts.dir file when no
-      fonts are found rather than doing nothing.
-2092. Replace void main() -> int main() for ANSI conformance (#2019,
-      Matthieu Herrb).
-2091. Only allow the X server -nolock option when the real uid is root.
-2090. Some sanity checks on DISPLAY name (#2168, Kevin Vajk).
-2089. Fix an Xnest crash with too many visuals (#2019, Matthieu Herrb).
-2088. Swedish sun keyboard support in Xsun and xkb (#2019, Magnus Holmberg).
-2087. A quick attempt at neutralising a stack-buffer overflow problem in
-      the Xprt server.
-2086. LP64 compiler warning fixes from the NetBSD xsrc tree (#2019,
-      Ross Harvey).
-2085. Don't install lndir on OpenBSD (#2019, Matthieu Herrb).
-2084. Teach imake how to automatically determine the NetBSD architecture
-      (#2180, Jason Thorpe).
-2083. Add local font directory (Dirk Hohndel).
-2082. LynxOS OS version detection for imake (#2039, Thomas Mueller).
-2081. Resync OpenBSD.cf (#2019, Matthieu Herrb).
-2080. Fix security problem by creating /tmp/.X11-unix with sticky bit (#2168,
-      Kevin Vajk, David Dawes, Dirk Hohndel).
-2079. Make LinkVarDirectory handle DESTDIR (#2019, Matthieu Herrb).
-2078. Resync NetBSD.cf.
-2077. Some doc and nroff-related updates to the build system.
-2076. Update tk/tcl definitions in FreeBSD.cf and add support for building
-      a.out compatibility libraries on FreeBSD/ELF systems.
-2075. Create host.def with sane defaults when none exists and when a cut-down
-      source tree is detected.
-2074. Resync with 3.3.3 (items 2075-2096 above).
-2073. Fix an xset segfault (#2320, Itai Nahshon).
-
-XFree86 3.9Nq (13 December 1998)
-2072. Change the modversion field in the XF86ModuleVersionInfo struct into
-      separate major, minor and patchlevel fields.
-2071. Initial DG/ux support (#2299, Takis Psarogiannakopoulos).
-2070. DDC1 support for TVP3026 based Matrox cards (#2309, Andrew Aitchison).
-2069. More rewrites of the way spans and rects are handles in XAA so that
-      it never has to allocate any memory, thereby eliminating potential
-      stack overflow problems (#2308, Mark Vojkovich).
-2068. MGA driver-provided FillCacheBltRects replacement, optimised for fastblt
-      (#2307, Mark Vojkovich).
-2067. Choose MGA planar vs linear screen to screen colour expansion at runtime
-      rather than at compile time (#2307, Mark Vojkovich).
-2066. Fix a build problem related to Xarch.h on OpenBSD (#2306,
-      Matthieu Herrb).
-2065. Fix a typo in FreeBSD.cf that affects adding the runtime library
-      search patch for 2.2.x (#2305, Keisuke Inoue).
-2064. Some enhanced XKB files for French-Canadian keyboards (#2204,
-      Eric Moreau).
-2063. Fix an incorrect realloc in xmodmap (#2303, Alexander V. Lukyanov).
-2062. Fix depth 30 for the glint driver (#2297, Alan Hourihane).
-2061. Resync pandix and panmi, and fix some panoramix build problems
-      (#2296, Alan Hourihane).
-2060. Enable offscreen pixmaps for the glint driver (#2295, Alan Hourihane).
-2059. Fix PC98 XKB (#2292, Hirofumi Nishizuka and #2300, Tetsuo Tsukamoto).
-2058. Fix some unresolved symbols (#2293, Michael Rohleder).
-
-XFree86 3.9Np (6 December 1998)
-2057. Some xedit updates (#2291, Paulo Cesar Pereira de Andrade).
-2056. Updates to the Xaw text code (#2291, Paulo Cesar Pereira de Andrade).
-2055. XAA doc updates (#2289, Mark Vojkovich).
-2054. Replace linear screen to screen colour expansions with planar ones
-      in the MGA driver because there seems to be a hardware problem with
-      the linear ones (#2288, Mark Vojkovich).
-2053. Enable offscreen pixmaps for the MGA driver (#2288, Mark Vojkovich).
-2052. Some misc XAA updates (#2287, Mark Vojkovich).
-2051. A non-trival rewrite of the way fills are done in XAA (#2287,
-      Mark Vojkovich).
-2050. Add a LINEAR_FRAMEBUFFER flag to XAA so that the pixmap cache can
-      be loaded without requiring a driver-supplied ImageWrite function
-      (#2287, Mark Vojkovich).
-2049. Add fully accelerated offscreen pixmaps support to XAA (#2287,
-      Mark Vojkovich).
-2048. Add a RemoveAreaCallback for the offscreen memory manager.  Areas
-      for which this is supplied are considered lower priority than ones
-      that don't, and can be booted out when something of higher priority
-      needs the space (#2286, Mark Vojkovich).
-2047. Remove the ScreenPtr passed to the offscreen memory manager's resize
-      function since it is already available from the FbAreaPtr (#2286,
-      Mark Vojkovich).
-2046. Change xf86SaveRestoreImage() so that it doesn't create a new
-      screen pixmap but modifies the old one (#2285, Mark Vojkovich).
-2045. Add support to mi for pixmaps with non-zero origins (#2284,
-      Mark Vojkovich).
-2044. Fix some Alpha compilation problems introduced in 3.9No (#2283,
-      Alan Hourihane).
-2043. Fix an Xlib  problem with _XimLookupMBText() when using KOI8-R
-      (#2282, Alexander Kabaev).
-2042. Fix the pattern source address mask for the C&T HiQV chips, which
-      was causing 8x8 pattern problems when using more than 2MB of video
-      memory (#2281, Peter Wainwright).
-2041. Update the TGA and Trident drivers for the ramdac/cmap changes (#2277,
-      Alan Hourihane).
-2040. Change the Permedia2 to use a direct LoadPalette rather than the
-      ramdac module because of 16bpp difficulty with the TVP3026 (#2277,
-      Alan Hourihane).
-2039. Remove the old cmap code from the ramdac module and use the new
-      cmap layer instead (#2277, Alan Hourihane).
-2038. Fix os.h and misc.h so that system headers don't get included when
-      building modules.
-2037. Make the X server read an Xauthority file using the real user id
-      to avoid problems when it is located on an NFS-mounted filesystem.
-      (as suggested by #2276, MIHIRA Sanpei Yoshiro).
-2036. Xdm patch to allow the "Willing to manage" test displayed in the chooser
-      window to be generated from a program run on the target host.  This
-      allows information like number of users, load average, etc to be
-      displayed (like CDE does) (#2275, Dick Snippe).
-2035. Fix a core dump problem in xauth when interrupted while attempting
-      to lock the auth file.  Also fix a potential problem with calling
-      printf() from within a signal handler (#2274, BSDI/Jeff Polk).
-2034. Add DDC2 probing for Cirrus 5446/5480 and Laguna chipsets (#2273,
-      Itai Nahshon).
-2033. Fix some possible memory corruption and some minor bugs in the new DDC
-      code (#2271, 2272, Itai Nahshon).
-2032. Offscreen memory manager and colormap layer doc updates (#2270, 2290,
-      Mark Vojkovich).
-2031. Some glint clipping fixes (#2269, Alan Hourihane).
-2030. New XInput code, including new drivers for the SpaceOrb and Magellan
-      (#2243, Metro Link).
-2029. Fix mga YDstOrg start address adjustment after VT switching.
-2028. Fix cfb24 bitblt for non-trivial planemasks (Peter Wainwright).
-2027. Fix bad headers included when compiling cup.c for extmod module.
-2026. Fix a malloc/xfree mismatch in xtrans LocalInitTransports().
-2025. Add some documentation for DDC (#2259, Egbert Eich).
-2024. Fix a problem with recent VT switch changes.
-
-XFree86 3.9No (29 November 1998)
-2023. Fix the depth vs bpp mixup in miCreateScreenResources().
-2022. Resync the s3virge driver with most of the updates contained in 3.3.3.
-      This includes GX2 and MX+ support and the set_mclk and set_lcdclk
-      options (#2267, Kevin Brosius).
-2021. Update the cirrus, chips and tseng drivers to use the new colourmap
-      layer (via vgaHWHandleColormaps).
-2020. Add support for automatically adjusting the overscan colour index to
-      the new colourmap layer.
-2019. Disable backing store by default, and provide a "+bs" option to enable
-      it from the command line.  This may be done in a better way later.
-2018. Remove the per-depth cfb private indices added in 3.9Nn (#2265,
-      Mark Vojkovich).
-2017. Build cfb with -DSINLGEDEPTH because we don't need the per-depth
-      cfb Screen privates.
-2016. Fix problems with the allocation of the cfbScreenPrivateIndex
-      parameters.
-2015. Remove the offscreen memory manager functions out of the ScrnInfoRec
-      (#2266, Mark Vojkovich).
-2014. Update the s3virge driver to use the new colormap layer, which fixes
-      the VT switch colormap problem (#2264, Kevin Brosius).
-2013. Disable s3virge trapezoid fills since they don't match cfb (#2264,
-      Kevin Brosius).
-2012. Add an ImageWrite function for the s3virge driver, so the pixmap
-      cache support now works (#2264, Kevin Brosius).
-2011. Turn off PCI_RETRY by default in the glint driver, and various other
-      driver updates (#2263, Alan Hourihane).
-2010. Fix a glint driver bug in WritePixmap for TX/MX chipsets (#2263,
-      Alan Hourihane).
-2009. Update the Alpha unaligned access inlines in compiler.h, based on
-      similar code in the Linux kernel (#2240, Matti Aarnio).
-2008. Fix a typo in the C&T driver (#2262, Nozomi Ytow).
-2007. Enable building libraries and clients for for sparclinux (#2261,
-      Christopher Sekiya).
-2006. Define _XOPEN_SOURCE for Linux (#2261, Christopher Sekiya).
-2005. Add the vga copy plane expansion patch to the vgafb code (#2021,
-      Jens Owen).
-2004. -
-2003. Fix a bug in xaaStipple.c which can cause a blitter lockup.
-2002. Fix a C&T bug that causes memory corruption when not in linear mode
-      (#2260, Egbert Eich).
-2001. Only disable C&T transparency blits for HiQV chips below 65550, and
-      fix the display pitch when acceleration is enabled (#2260,
-      David Bateman).
-2000. Conditionally enable ScreenToScreenColorExpandFills for C&T HiQV
-      chips (#2259, 2260, Nozomi Ytow, Egbert Eich).
-1999. Reduce the timeout period for C&T blitter lockups and reset the reset-bit
-      after blitter timeouts (#2260, Egbert Eich).
-1998. Add DDC1/2 support for the C&T driver (not tested) (#2260, Egbert Eich).
-1997. Add a DDC module with DDC1 and DDC2 support for EDID version 1.x,
-      and untested VDIF support (#2259, 2260, Egbert Eich).
-1996. Fix a problem switching from VT back to X when displayPitch
-      != displayWidth (#2260, Egbert Eich).
-1995. Some colormap layer optimisations (#2258, Mark Vojkovich).
-1994. Add some missing micmap symbols to the loader's export list (#2257,
-      Alan Hourihane).
-
-XFree86 3.9Nn (22 November 1998)
-1993. Set the valid gamma range as macros rather than having it hard coded
-      in various places.
-1992. Always refer to and store the gamma values as those of the monitor,
-      not of the correction.  This means that the values stored in the
-      ScrnInfoRec are now the same as those entered in the config file and
-      on the command line.
-1991. Fix the colormap layer's handling of static colormaps (#2255,
-      Mark Vojkovich).
-1990. Add XAA acceleration for pixmap->window N deep planar copies (#2254,
-      Mark Vojkovich).
-1989. Add an xf86ChangeGamma() function to the colormap layer (#2253,
-      Mark Vojkovich).
-1988. Have NameCompare() check for NULL pointers (#2252, Rik Faith).
-1987. Port Mark Vojkovich's accelerated line code form Permedia 2 to TX
-      and Permedia 1 chips (#2249, Alan Hourihane).
-1986. Fix mono 8x8 pattern problem for Permedia 1 (#2249, Alan Hourihane).
-1985. Fix glint crash in CloseScreen, and set rgbBits to 8 by default
-      (#2249, Alan Hourihane).
-1984. Fix glint CRTC setting alignment when using 24bpp (#2249,
-      Alan Hourihane).
-1983. Give all cfb private indices unique names so that cfb's for multiple
-      depths can be loaded on the same screen (#2248, 2250, 2251,
-      Mark Vojkovich).
-1982. xterm patch #89, including the completion of double-sized character
-      support (#2247, Thomas Dickey).
-1981. Fix an MGA dashed line clipping bug (#2246, Mark Vojkovich).
-1980. S3virge driver updates, including som acceleration, reinstatement of
-      config options and chip ID changes (#2245, Kevin Brosius).
-1979. Fix some RAC-related problems with the glint driver (#2244,
-      Alan Hourihane).
-1978. Fix some 64-bit problems in some unused driver code (for reference)
-      (#2242, Matti Aarnio).
-1977. Fix a 64-bit alignment problem in cfb8line.c (#2242, Matti Aarnio).
-1976. Fix a typo in Pclose() (#2242, Matti Aarnio).
-1975. Update some Linux-related Imake.cf settings (#2242, Matti Aarnio).
-1974. -
-1973. Cirrus 546x memory interleaving (#2235, Corin Anderson).
-1972. XAA and HW cursor support for the Cirrus 546x series (#2235,
-      Corin Anderson).
-1971. Fix a cirrus 546x clock setting problem that was introduced in 3.9Nm
-      and add a few more predefined dot clocks (#2234, #2235, Corin Anderson).
-1970. Move the generic one-installed-colormap colormap handling functions
-      into micmap.c, remove the use of STATIC_COLOR, update other fb
-      layers to use the micmap functions where appropriate and ensure
-      that they initialise InstallColormap, UninstallColormap, StoreColors
-      and ListInstalledColormaps in their ScreenInit functions.  Also move
-      the global InstalledMaps array into micmap.c.
-
-XFree86 3.9Nm (15 November 1998)
-1969. libXv fix (#2233, Michael Schimek).
-1968. Add support for building clients on NetBSD/vax 1.3H (#2231,
-      Chris Sekiya).
-1967. Add an alternate init function for the framebuffer manager.  The new
-      one takes a region rather than a box which allows disconnected regions
-      to be managed (#2230, Mark Vojkovich).
-1966. XAA pixmap cache fix (#2229, Mark Vojkovich).
-1965. Add support to XAA for filled rects via ImageWrites (#2227,
-      Mark Vojkovich).
-1964. Preliminary "XAnti" extension for antialiasing (#2224, Mark Vojkovich).
-1963. Fix glint driver coordinates when offscreen (negative) when using
-      colour expansion and the NEGATIVE_X stuff (#2221, Alan Hourihane).
-1962. Add PCI IDs for S3 Trio3D and Savage chips to scanpci and xf86PciInfo.h
-      (#2220, Harald Koenig).
-1961. Add support to XAA for the caching of planar colour expansion data,
-      including an example of how to use it in the mga driver (#2215,
-      Mark Vojkovich).
-1960. Xaw and xedit updates (#2205, Paulo Cesar Pereira de Andrade).
-1959. Provide code to initialise cirrus memory config registers on non-primary
-      cards using config file options (#2202, Itai Nahshon).
-1958. Initial code for Cirrus Laguna I2C/DDC support (#2202, Itai Nahshon).
-1957. Fix some cirrus initialisation errors and MCLK calculation (#2202,
-      Itai Nahshon).
-1956. Synch the cir.h and lg.h files (#2202, Itai Nahshon).
-1955. For newer Cirrus Alpine chips, replace most I/O operations to calls
-      to the vgahw I/O routines, and configure them for MMIO when available
-      (#2202, Itai Nahshon).
-1954. Fix mga G100/200 planemask problem (#2198, Mark Vojkovich).
-1953. Update the mga driver to use the new colourmap layer (#2198,
-      Mark Vojkovich).
-1952. A new colourmap layer (#2197, Mark Vojkovich).
-1951. Redo the lbx colourmap fix in a multihead friendly way (#2196,
-      Mark Vojkovich).
-1950. Make the resource access updates to the glint driver to get it working
-      again (#2177, Alan Hourihane).
-1949. Fix Cirrus 546x big screen modes, 32bpp modes (#2175, Corin Anderson).
-1948. Support for the Cirrus 5464 (5462 remains untested) (#2175,
-      Corin Anderson).
-1947. Fix xf86ValidateModes() to make the maxHeight parameter optional
-      as documented (#2174, Corin Anderson).
-1946. Acceleration for the trident 3DImage/Cyber9388/Cyber9397 chipsets,
-      and accel updates for other trident chips (#2161, Alan Hourihane).
-1945. Implement I2C layer for the trident driver (#2161, Alan Hourihane).
-1944. Add TGUI96xx hardware cursor support (#2161, Alan Hourihane).
-1943. Add some xkb entries for 105 key international PC keyboards (#2157,
-      Matthieu Herrb).
-1942. Enable mode switching for the ViRGE driver (#2156, Kevin Brosius,
-      2200, Joe Moss).
-1941. Add depths 15,16,24 to the preliminary ViRGE driver (#2156,
-      Kevin Brosius).
-1940. Replace __syscall() with syscall() in Linux/Alpha PCI code (#2211,
-      Matti Aarnio).
-
-XFree86 3.9Nl (1 November 1998)
-1939. xterm patch #88 (#2152, Thomas Dickey).
-1938. Fix some build problems that show up on SunOS 4.1.4.
-1937. Allow the driver to give XAA the definition of a full planemask,
-      with a reasonable default set when it doesn't (#2150, Mark Vojkovich).
-1936. XAA optimisation: when fgPixel == bgPixel draw opaque stipples as
-      solid rects (#2150, Mark Vojkovich).
-1935. Preliminary S3 ViRGE driver conversion (#2148, Kevin Brosius).
-1934. Fix a bug in the LBX extension's colourmap code (#2143, Mark Vojkovich).
-1933. Add base address size and type fields to PciVideoRec (#2141,
-      Egbert Eich).
-1932. Change the PCIInfo entries for NeoMagic chips (#2141, Egbert Eich).
-1931. Some C&T driver updates (#2141, Egbert Eich).
-1930. Add support for the Cirrus 5465 (and 5464, 5462 -- untested)
-      (#2140, Corin Anderson).
-1929. Make the vgahw module a little easier to use by setting its own
-      defaults where appropriate.
-
-XFree86 3.9Nk (25 October 1998)
-1928. Some XAA GC validation bug fixes and optimisations.  This includes
-      wrapping pixmap rendering to determine when pixmap cache invalidation
-      is required (#2126, Mark Vojkovich).
-1927. Backout the dix fb,bg planemask manipulation added in a previous version
-      (#2125, Mark Vojkovich).
-1926. Fix an MGA fastblt bug (#2124, Mark Vojkovich).
-1925. Accelerate zero width arcs on MGA (only use for rops other than
-      GXcopy and when PCI retries are enabled) (#2124, Mark Vojkovich).
-1924. Restore default-promotion to the Xdmcp library (#2103, Thomas Dickey).
-1923. Prototype/ansification cleanup for Xserver/XIE, xfs, fontlib, mkfontdir,
-      and fix some bugs found along the way (#2103, Thomas Dickey).
-1922. Set HasPoll to YES for Linux with glibc2 (#2095, Kars de Jong).
-1921. Fix some MGA modeline problems and change the G200 MCLK to 143MHz
-      (#2088, Radislaw Kapitan).
-1920. Move xedit from the contrib tree to the main tree.
-1919. Xaw and xedit updates (see the changelog in the Xaw directory for
-      details) (#2083, Paulo Cesar Pereira de Andrade).
-1918. Add support for BSD 4.4 style long file names in ar archives to
-      the loader (#2066, Matthieu Herrb).
-1917. Some GNU/Hurd config/build updates (#2057, UCHIYAMA Yasushi).
-1916. Do a soft reset for secondary MGA cards prior to probing for the
-      video memory size (#2052, Radislaw Kapitan).
-1915. sigset_t isn't an integer type on NetBSD (and some other OSs) so
-      don't try to print it in xdm (#2048, Matthieu Herrb).
-1914. NetBSD's preprocessor emits a warning when it sees '#ifdef unix',
-      which makes imake noisy (#2048, Matthieu Herrb).
-1913. xterm patches 85, 86, 87 (see xterm.log.html for details) (#2043, 2056,
-      2097, Thomas Dickey).
-1912. Change "fcd8859-15" to "iso8859-15".
-1911. Some updates to the "dacG" mga reset code, and enable it by default
-      since it helps initialising an inactive secondary G200 (#2032,
-      Radoslaw Kapitan).
-
-XFree86 3.9Nj (11 October 1998)
-1910. Fix the 8+24 overlay's CopyWindow wrapper so that it works properly
-      with "NoAccel" or without hardware planemasks (#2041, Mark Vojkovich).
-1909. Reenable planemasks for SDRAM G200s and disable for all G100 (#2040,
-      Mark Vojkovich).
-1908. Add mga overlay support for the TVP3026 (#2040, Mark Vojkovich).
-1907. Ansifiy and remove most warnings from the Xdmcp library and xdm
-      (#2038, Thomas Dickey).
-1906. xterm patch 84 (see xterm.log.html for details) (#2036,
-      Thomas Dickey, Bjorn Helgaas).
-1905. Enhancements for xedit (#2028, 2033, Paulo Cesar Pereira de Andrade).
-1904. Patch to make editres work properly (#2028,
-      Paulo Cesar Pereira de Andrade).
-1903. Xaw updates (see the changelog in the Xaw directory for details)
-      (#2028, 2033, Paulo Cesar Pereira de Andrade).
-
-XFree86 3.9Ni (6 October 1998)
-1902. Fix miCreateDefColormap() for depth 1.
-1901. Update the "extmod" module of the new extensions.
-1900. Fix some font-related problems introduced by the R6.4 merge.
-1899. Update the cirrus driver for the recent i2c module changes (#2025,
-      Itai Nahshon).
-1898. Initial XAA acceleration for the cirrus driver (#2025, Itai Nahshon).
-1897. Add some option code to do a soft reset when restoring the video state
-      for the "dacG" part of the MGA driver (#2012, Uli Walther).
-1896. Add some TTF encoding files (#2013-2016, Juliusz Chroboczek).
-1895. Resync the FreeType server interface with Xfsft-1.0.2, including
-      code to read encodings from plain text files (#2013-2016,
-      Juliusz Chroboczek).
-1894. Add an "8plus24" option to the MGA driver that turns on overlays when
-      in 32bpp mode.  Support is there only for the 1064 and SGRAM G100/G200
-      chips so far (#2024, Mark Vojkovich).
-1893. Fix an MGA dashed line bug (#2024, Mark Vojkovich).
-1892. Add an "mga_sdram" option that turns off block mode and disables
-      planemasks (#2024, Mark Vojkovich).
-1891. Add SGRAM and NonTEText optimisations to the MGA driver (#2024,
-      Mark Vojkovich).
-1890. Add XYPixmap support to XAA (#2023, Mark Vojkovich).
-1889. Preliminary support for depth 8 + 24 mode.  Depth 8 currently uses
-      32bpp pixmaps.  Support is included for destructive and non-destructive
-      overlays and driver-chosen transparency key (#2022, Mark Vojkovich).
-1888. Update imake for cpp changes with egcs-1.1 and gcc-2.8.1 (#2017,
-      David Wragg).
-1887. Fix XvQueryAdaptors() when more than one adaptor is present, and
-      export xf86XVScreenInit() to drivers (#2018, Michael Schimek).
-1886. Updates/improvements to the I2C module (#2008, 2018, Michael Schimek).
-1885. Don't include standard system headers when building XIE as a module.
-1884. Cleanup Xlibint.h, which significantly reduces the level of compiler
-      warnings, and also cleanup XIE's error.h (#2007, Thomas Dickey).
-1883. Add support for built-in driver modes (#2006, Egbert Eich).
-1882. Ansify and remove gcc warnings for imake, makedepend, lndir, makestrs,
-      makekeys and mkg3states) (#2005, Matthieu Herrb).
-1881. Introduce a "generic" PCI device (pseudo vendor/devids) for use with
-      the generic vga driver (#1994, Egbert Eich).
-1880. Fix some bugs in the C&T driver (#1994, Egbert Eich).
-1879. Fix an XAA bug with CPU_TRANSFER_PAD_QWORD handling (#1994, Egbert Eich).
-1878. Sanity fix: if all devices of a screen are of type none assume
-      resource type NONE in xf86AddControlledResource() even if specified
-      otherwise (#1994, Egbert Eich).
-1877. Added more support to the resource code for mono devices (for
-      consistency) (#1994, Egbert Eich).
-1876. Add RAC wrappers to the sprite functions (#1994, Egbert Eich).
-1875. Reset xf86Resetting in xf86Init.c (#1994, Egbert Eich).
-
-XFree86 3.9Nh (5 October 1998)
-1874. Temporary workaround to avoid static server build problem introduced
-      in 3.9Ng.
-1873. Import and merge in X11R6.4 and its first three public patches.
-
-XFree86 3.9Ng (27 September 1998)
-1872. Rewrite the XAA NonTE text code, fixing the handling of overlapping
-      characters (#2002, Mark Vojkovich).
-1871. Fix an typo causing a CapNotLast line bug in XAA (#2002, Mark Vojkovich).
-1870. Some updates to the FreeBSD/ELF support, including auto-detection
-      of the binary format.
-1869. Update the Type1 and Speedo fonts.scale files to take advantage
-      of the recent ISO 8859-2 encoding updates (#1995, Juliusz Chroboczek).
-1868. Update drivers to use miCreateDefColormap instead of calling
-      the ones in the fb-specific code, update mfbCreateDefColormap
-      to call the mi version, and remove the xf4bpp version.
-1867. ANSI-related cleanups for the C&T driver, and make use of the
-      LoaderRefSymobols() code to eliminate loader warnings (#1993,
-      David Bateman).
-1866. Fix pixmap cache sizing for C&T DSTN systems (#1993, David Bateman).
-1865. Fix a typo that affected the memory probing for C&T 65550 sysems
-      with 2MB of memory (#1993, David Bateman).
-1864. Let the C&T driver accept '-depth 15' (#1993, David Bateman).
-1863. Reintroduce DirectColor visual support for depth >8 for the
-      Millennium I (#1992, Andrew Aitchison).
-1862. Fixes and cleanups for Linux/Alpha build problems (#1989, 2000,
-      Andrew P. Lentvorski).
-1861. Make some changes to the vgahw MMIO handling for Alpha platforms.
-1860. Cleanup and simply some of the mga driver/dac/clock code (#1991,
-      Radislaw Kapitan).
-1859. Enable mga TVP3026 interlaced cursor (#1991, Radislaw Kapitan).
-1858. Enable the Pseudo-DMA window for the G100 in the mga driver (#1991,
-      Radislaw Kapitan).
-1857. Change some tables in the mga driver to 'const' to help make sure
-      that they are not abused, and fix the code that was abusing them
-      (#1991, Radislaw Kapitan).
-1856. Fix some G200 problems introduced in 3.9Nf (#1988, 1991, Mark Vojkovich,
-      Radislaw Kapitan).
-1855. Fix static server problems caused by item 1851 (based on #1984, 1985,
-      Takaaki Nomura).
-1854. xman improvements for NetBSD/OpenBSD (#1983, Matthieu Herrb,
-      Ross Harvey).
-1853. C&T update for SuperProbe (#1981, Taketoshi Sano).
-
-XFree86 3.9Nf (20 September 1998)
-1852. Update the sample config file to be consistent with the updated format.
-1851. Add a mechanism to allow modules to tell the loader which symbols from
-      from other modules it references, and which of those are essential.
-      This makes it possible to eliminate unnecessary warnings about
-      unresolved symbols, and to trigger a fatal error where appropriate.
-1850. More attempts towards a working G100 server (#1982, Dirk Hohndel).
-1849. Update the mga driver for use with the resource management code.
-1848. Fix some bugs and typos in the resource management code.
-1847. Rework the vgahw module, abstracting the register accesses and split up
-      the save/restore parts.
-1846. Add '\n' to some of the messages in PEXExtensionInit().
-1845. Fix the mga driver's handling of the option register in mga_dac3026.c.
-1844. Trap reentrancy to the FatalError() function and call abort() when
-      this happens.
-1843. Avoid a bug in SunPro C 4.2 (ix86) that shows up when building libPEX5
-      (#1980, David Holland).
-1842. Fix a typo in Xserver/Imakefile (#1979, David Holland).
-1841. Have the Xv DIX layer trap zero size src and/or dest, returning
-      BadValue (#1978, Mark Vojkovich).
-1840. Parially accelerated lines for the Permedia 2 (#1977, Mark Vojkovich).
-1839. Some formatting, bug fix updates to the C&T driver, and reintroduce
-      the screen blanking during initialisation for the C&T drivers
-      (#1976, David Bateman).
-1838. Update the C&T driver to use the RAC wrapper (#1976, Egbert Eich).
-1837. Add a Resource Access Control (RAC) wrapper module which allows
-      colourmap, cursor and fb access to be wrapped when necessary in
-      cases where memory and/or I/O resources are being shared (#1976,
-      Egbert Eich).
-1836. Back out item 1823 (mi bank enable) (#1976, Ebgert Eich).
-
-XFree86 3.9Ne (13 September 1998)
-1835. Remove the OS dependence in the formatting of docs in xfree86/doc/sgml
-      (which removes the need for the BuildAllDocs setting).
-1834. Update mi and dix cursor handling to avoid displaying empty cursors
-      (#1972, Mark Vojkovich).
-1833. Update Xv docs (#1971, Mark Vojkovich).
-1832. Add return values to the Get/Put driver functions in the Xv DDX
-      (#1970, Mark Vojkovich).
-1831. Some preliminary reorganisation of the MGA driver (#1969,
-      Mark Vojkovich).
-1830. Update CURSOR.NOTES (#1968, Mark Vojkovich).
-1829. MGA driver should recognise 15 as a valid depth (#1967,
-      Andrew Aitchison).
-1828. Experimental G100 support for the MGA driver, and fix clock PLL
-      programming (#1966, Radislaw Kapitan).
-1827. Add support for the 9660, 9680 and 9682 chips to the new trident driver,
-      and add some initial acceleration (#1963, Alan Hourihane).
-1826. Fix some planemask test problems at 16bpp with the C&T driver (#1962,
-      Taketoshi Sano).
-1825. Fix a problem with QWORD_PAD in XAA (#1961, David Bateman).
-1824. Fix SuperProbe's detection of some C&T HiQV chipsets (#1960,
-      Taketoshi Sano).
-1823. Update the mi banking code to enable resources as required (#1959,
-      Egbert Eich).
-1822. Update the generic VGA driver to use the new resource control code
-      (#1959, Egbert Eich).
-1821. Restructure the C&T driver, and fix the following:
-        - CRT half-screen blanking
-        - 1bpp mode
-        - several SEGV problems
-        - the long standing LCD blank problem
-      (#1959, Egbert Eich).
-1820. Allow a Device section without a BusID be acceptable for the primary
-      vga device when multiple heads are detected (#1959, Egbert Eich).
-1819. New resource management code, which should provide an improved
-      infrastructure for handling multi-head configuration, particularly
-      where resource sharing is required (#1959, Egbert Eich).
-1818. Fix problems with NonTE ImageText in XAA (#1958, Mark Vojkovich).
-1817. Fix the tseng driver's handling of cases when there is insufficient
-      free memory for acceleration to be used (#1957, Koen Gadeyne).
-1816. Change the RELATIVE_CHECK() macro in xf86Xinput.c to fix a multi-head
-      cursor problem (Chris Bare).
-1815. Update xf86ReadPciBIOS to set the decode enable bit while reading,
-      and update the mga driver to use xf86ReadPciBIOS when appropriate.
-1814. Use mmap for reading the BIOS on more platforms because the
-      lseek/read method doesn't work in many cases when the offset is
-      greater than 2G.
-
-XFree86 3.9Nd (6 September 1998)
-1813. Preliminary port of the trident driver for the ND (the old version
-      has been moved to the olddrivers directory (#1956, Alan Hourihane).
-1812. Document the offscreen memory managers new ResizeArea function
-      (#1955, Mark Vojkovich).
-1810. Allow the FreeType code to be build as an X server font module.
-1809. Add Latin2 support to the Speedo and Type1 font code (#1792,
-      Robert Wilhelm).
-1808. Updates to XFree86 specific parts of FreeType (#1792, 1933,
-      Robert Wilhelm, Juliusz Chroboczek).
-1807. Add the base FreeType 1.1 distribution to /xc/extras/FreeType, and
-      update the build procedure to get the source from there.
-1806. Map the pseudo-DMA transfer window used on newer MGA chips, and use
-      it for solid rects and spans (#1953, Mark Vojkovich).
-1805. Fix C&T HiQV detection (#1952, Taketoshi Sano).
-1804. Add dashed line support to XAA, and update the mga driver to use it
-      (#1951, 1953, 1954, Mark Vojkovich).
-1803. Lots of glint driver updates, including a memclock option to set the
-      mclk, and some more XAA functions for the older Permedia chip (#1950,
-      Alan Hourihane).
-1802. Use POSIX macro S_IS* instead of (((m)&S_IFMT)==S_IF*) and replace
-      "u_long" with "unsigned long" (#1949, UCHIYAMA Yasushi).
-1801. Fix IBM hw cursor pixel ordering (#1948, Alan Hourihane).
-1800. Remove accel/tga and accel/glint directories that are no longer needed
-      (#1947, Alan Hourihane).
-1799. Build support for FreeBSD/ELF (#1946, Doug Rabson, Joachim Kuebart,
-      Ollivier Robert).
-1798. Xaw and Xmu fixes (#1945, Paulo Cesar Pereira de Andrade).
-1797. HW Bresenham line drawing support for Tseng W32p and ET6000
-      (#1944, Koen Gadeyne).
-1796. Fix depth/bpp issues at depth 16 and depth 15 with the IBM support
-      in the ramdac module (#1943, Alan Hourihane).
-1795. Change messages in xf86PruneMonitorModes() so that they appear at the
-      default verbosity level (#1942, Egbert Eich).
-1794. Print out clock ranges or fixed clocks scaled by the mul/div factors
-      (#1942, Egbert Eich).
-1793. MGA G200 support (#1941, Radislaw Kapitan).
-1792. Preliminary I2C module (#1940, Itai Nahshon).
-1791. Add config support for building XFree86 on Linux with DECnet transport
-      (#1939, Eduardo Serrat).
-
-XFree86 3.9Nc (29 August 1998)
-1790. 24bpp (high res display problems) and 32bpp (horizontal stripe) fixes
-      for the mga driver (#1715, 1716, Doug Merritt).
-1789. Take the mga driver's YDstOrg parameter into account when it passed the
-      framebuffer start address to the cfbInitScreen functions.  This fixes
-      problems that can show up when using more than 4MB.
-1788. Fix an extraneous pixel drawn for some H/V two point lines with
-      a Millennium I (Mark Vojkovich).
-1787. Make the BuildLinuxDoc* symbols default to YES when HasSgmlFmt is YES
-      (Marc La France).
-1786. Add a resize function to the offscreen memory manager (#1937,
-      Mark Vojkovich).
-1785. Fix C&T 69000 horizontal CRT overflow register settings (#1936,
-      David Bateman).
-1784. Add some missing UnlockDisplay calls to lib/Xv/Xv.c (#1935,
-      Thomas Mueller).
-1783. Fix colourmap save problem (#1935, Thomas Mueller).
-1782. Support for LynxOS 3.0.0 and LynxOS PowerPC fixes (#1935,
-      Thomas Mueller).
-1781. An ND version of the Cirrus driver, currently for 5480 and 5446 chips
-      only.  The old driver has been moved to xfree86/olddrivers/cirrus
-      for reference (#1932, 1938, Itai Nahshon).
-1780. Xterm updates:
-        - add configure test to infer if xterm should be installed setuid
-          based on previously installed xterm (reported by Stephen Marley).
-        - integrate/extend patch by Jason Bacon to implement quasi-continuous
-          mouse reporting.
-        - correct control sequences transmitted by function keys F1 to F4
-          when sunFunctionKeys resource is true (it was still using the
-          VT100 control sequences).
-        - modify handling of backarrow key so that the control modifier
-          toggles the backspace/delete interpretation set by the
-          backarrowKey resource.
-        - limit the row and column values used to report mouse position.
-      (#1931, Thomas Dickey).
-1779. Fix clockRanges alloction problem in the tseng driver (#1927,
-      Koen Gadeyne).
-1778. Fix tseng banked accelerated mode, and disable ImageWrite in banked
-      mode if it requires more than 8k (#1927, Koen Gadeyne).
-1777. Some initial ET4000W32p acceleration (#1927, Koen Gadeyne).
-1776. Fix 24 and 32bpp tseng modes for cards with programmable clocks
-      (#1930, Koen Gadeyne).
-1775. Implement the pci_retry and Memclk options for the MGA driver (#1927,
-      Mark Vojkovich).
-1774. Update the mga driver to use MMIO for everything (making use of the
-      MMIO support in the vgahw module), and do its own colourmap handling
-      (#1927, Mark Vojkovich).
-1773. Add a MMIO version of the vgahw code to the vgahw module (#1926, 1928,
-      Mark Vojkovich).
-1772. Small Xv DDX udpate (#1925, Mark Vojkovich).
-1771. Update the C&T driver to use the new ClockMulFactor code (#1924, 1936,
-      David Bateman).
-1770. Add a ROP_NEEDS_SOURCE option to XAA, as needed by the C&T driver
-      (#1924, David Bateman).
-1769. Add support to the tga driver for 24 plane cards (#1923, Tim Rowley).
-1768. Resync the scale[] find_scale[] arrays in the bitmap font code, which
-      got out of sync when gzipped font support was added (#1921 Doug Ridgway).
-1767. Fix incorrect #ifdef in sunKeyMap.c for Danish Type 5 Sun keyboards
-      (#1919, Erik Bertelsen).
-1766. Move HW cursor support from the XAA module to the ramdac module,
-      update drivers for this change, move IBM cursor code from  the glint
-      driver to the ramdac module, and intergrate the HW cursor code fir
-      the IBM ramdacs using a new helper function in the ramdac module.
-      (#1918, Alan Hourihane).
-1765. Fix some more compiler.h problems for AXP platforms (#1918,
-      Alan Hourihane).
-
-XFree86 3.9Nb (20 August 1998)
-1764. Fix some memory leaks in Xlib that happen on realloc failures
-      (#1914, ??)
-1763. Optimise the way C&T acceleration is handled by reorganising
-      some of the graphics primitives, including caching foreground and
-      background colours, and moving some operations from the Subsequent
-      primitives to the Setup primitives (#1915, David Bateman).
-1762. Introduce HW cursor for the Permedia2 (but p2 and p2v dont' work
-      yet), fixup pm2v_dac and pm2_dac register naming, and add reset
-      logic to reset the accelerator (but not used yet) (#1912,
-      Alan Hourihane).
-1761. Fix building in xfree86/common when XINPUT is not defined (Egbert Eich).
-1760. Fix problem compiling xf86_IlHack.c on Alpha platforms.
-1759. Add an option "ShowOverscan" to the vgahw module which makes the
-      unblanked area of overscan clearly visible.
-1758. Adjust the builtin mode for the 8bpp generic vga driver to blank as
-      much of the overscan area as possible.
-1757. Adjust the horizontal blank end value in the vgahw module to avoid
-      excessive blanking for most chipsets when running in generic vga mode.
-1756. Tseng driver updates, including:
-       - Add support for chips with a set of discrete clocks instead of a
-         programmable clock.
-       - use the new ClockRanges code to auutomatically select between pixmux
-         and normal modes, and for 24bpp clock scaling.
-       - add a replacement for vgaHWBlankScreen() that doesn't do a
-         sequencer reset.
-       - remove some old, unused code.
-      (#1910, Koen Gadeyne).
-1755. Loader updates required for the updated gdb (#1908, Paul Flinders).
-1754. Add VSTATUS control char support to xterm (#1907, Robert Earl).
-1753. Update the register probing of the chipset for the C&T HiQV chips
-      in SuperProbe and the C&T driver (#1904, David Bateman).
-1752. Add cached screen to screen colour expansion to the C&T driver
-      (1904, David Bateman).
-1751. Add options to XAA to allow acceleration primitives to be disabled
-      individually (#1903, David Bateman).
-1750. Add preliminary solid Bresenham and two point line support for XAA,
-      and code to make use of it for the mga driver (#1900-1902,
-      Mark Vojkovich).
-1749. Introduce Helper functions for ramdac module, Save/Restore/SetBpp,
-      and update the glint and tga drivers to use them (#1899, 1913,
-      Alan Hourihane).
-1748. Move IBM640 code from the glint driver intot he generic ramdac module
-      (#1899, Alan Hourihane).
-1747. Add ClockMulFactor and ClockDivFactor fields to clockRanges to allow
-      for scaling of clocks when doing mode validation (#1898, 1905,
-      Koen Gadeyne, 1906, Itai Nahshon).
-1746. Add recognition of the Voodoo 2 to the PCI list (#1897, Koen Gadeyne).
-1745. Some editres, xedit and xgc updates (#1788, 1842,
-      Paulo Cesar Pereira de Andrade).
-1744. Lots of Xaw/Xmu updates (including ansification of Xaw and Xmu) --
-      see the Changelog in xc/lib/Xaw for further details (#1776, 1788, 1842,
-      Paulo Cesar Pereira de Andrade).
-1743. Support for GNU/Hurd (#1895, UCHIYAMA Yasushi).
-1742. Remove the implicit assumption in some areas that O_RDONLY is 0
-      (#1894, UCHIYAMA Yasushi).
-1741. Merge in Metro Link's version of the 64 bit select fixes for the
-      X server and lbxproxy (#1893, Stuart Anderson).
-1740. Set DlLibrary to be empty for OpenBSD, and remove formatted man pages
-      on 'make clean' for OpenBSD and NetBSD (#1892, Matthieu Herrb).
-
-XFree86 3.9Na (14 August 1998)
-1739. Rework the way the maximum number of server client connections
-      is determined, and experimentally increase MAXCLIENTS to 256.
-1738. Enable mmap support in Xvfb for Linux (#1889, Douglas Ridgway).
-1737. Xv DDX layer for XFree86, and add documentation for it to the DESIGN
-      doc (#1883, 1884, Mark Vojkovich).
-1736. Modify AddScreen() and AllocateScreenPrivateIndex() to initialise new
-      screen devPrivates to zero.
-1735. Ansify the Xv server dix code (#1881, Mark Vojkovich).
-1734. XAA doc update (#1880, Mark Vojkovich).
-1733. Cache the fg, bg and planemask values in the MGA driver and only
-      change them when needed (#1878, Mark Vojkovich).
-1732. Preliminary ImageRead support for the MGA driver (disabled) (#1879,
-      Mark Vojkovich).
-1731. Preliminary ImageRead support (#1878, Mark Vojkovich).
-1730. Use accelerated ImageWrites for PutImage and BackingStore and SaveUnder
-      pixmap restores (#1878, Mark Vojkovich).
-1729. Fix an XAA text rendering bug for rotated text (#1878, Mark Vojkovich).
-1728. Tseng driver updates:
-       - Add DPMS support
-       - Replace some Boolean options with Tristate options
-       - Add ET4000W32p support and the ICS5341 16-bit ramdac support
-       - 1bpp and 4bpp support added (1bpp doesn't work yet)
-       - cleanup mode validation code
-      (#1877, Koen Gadeyne).
-1727. Fix problems using ffs() in the X server on 64bit platforms
-      (specifically Linux/Alpha) (#1876, Raphael Finkel).
-1726. Fix for palette problems with the BT ramdac support in the ramdac
-      module (#1873, Alan Hourihane).
-1725. Export the symbols __remq and __remqu from the loader for Alpha
-      platforms (#1872, Alan Hourihane).
-1724. Fix a 24/32bpp problem with the IBM code in the ramdac module
-      (#1871, Alan Hourihane).
-1723. Change the way the depth/bpp/fbbpp values are selected form the
-      command line and config file to prevent inconsistently mixing values
-      from the two sources (#1868, Alan Hourihane).
-1722. Fix some XAA hw cursor problems:
-       - Apply the HARDWARE_CURSOR_INVERT_MASK flag only after applying
-         HARDWARE_CURSOR_AND_SOURCE_WITH_MASK
-       - Fix the 1-bit interleaving code
-      (#1867, Koen Gadeyne).
-1721. Remove all the (currently unused) colour expansion code from
-      the old branch that replaced some XAA functions.  This should no
-      longer be necessary (#1866, Koen Gadeyne).
-1720. Add XAA hw cursor support for the ET6000 (#1866, Koen Gadeyne).
-1719. Fix some problems that showed up with the glint driver when
-      using a P2 and TX500 card together (#1861, Dirk Hohndel).
-1718. Have the glint driver remove all but one mode since the chipset
-      doesn't support panning (#1859, 1870, Alan Hourihane).
-1717. Update the loader to correctly identify dll ELF modules (#1858,
-      Itai Nahshon).
-1716. Fix an infinite loop in the xf86Config code that can happen with a
-      config file error (#1858, Itai Nahshon).
-1715. Resync the TGA driver with changes elsewhere (#1856, 1874,
-      Alan Hourihane).
-1714. Glint driver updates, including:
-       - HW cursor for IBM 526 and 640 ramdacs
-       - Depth 30 support for the IBM 640
-       - GLINT MX (ELSA Gloria XL) support
-       - More acceleration for the TX/MX chipsets
-       - Fixes for Alpha platforms
-       - Major acceleration updates for Permedia, Permedia2, 500TX and MX chips
-       - Permedia 2v cleanups
-      (#1855, 1857, 1860, 1863, 1864, 1865, 1890, Alan Hourihane).
-1713. Add support for depth 30 to xf86SetWeight() (#1854, Alan Hourihane).
-1712. Reinstate the ONLY_LEFT_TO_RIGHT_BITBLT and ONLY_TWO_BITBLT_DIRECTIONS
-      XAA options (#1853, Alan Hourihane).
-1711. Add support for the IBM 640 ramdac to the ramdac module (#1852,
-      Alan Hourihane).
-1710. Add finer grained offscreen memory management for the accelerator
-      to the Tseng driver to allow as many acceleration features to be
-      enabled as can be supported by the available offscreen memory
-      (#1851, Koen Gadeyne).
-1709. Add XAA scanline colour expansion, screen-to-screen colour expansion,
-      8x8 colour pattern fills, ImageWrite to the Tseng driver (#1851,
-      Koen Gadeyne).
-
-XFree86 3.9N (2 August 1998)
-1708. Fix some XAA problems (#1850, Mark Vojkovich and Koen Gadeyne).
-1707. Rename some of the XAA colour expansion stuff, and update the XAA docs
-      (#1848, 1849, Mark Vojkovich).
-1706. Tseng driver updates (#1847, Koen Gadeyne):
-        Add Mclk support, replace globals in tseng_bank.c with entries
-        in the TsengRec, remove redundant parameter passing, fix a potential
-        bug in the ET6000 memory detection code, implement memory limit
-        checking, fix a bug in the 555/565 handling, cleanup locking/unlocking
-        code.
-1705. Some fine tuning of the way the extension modules are build.
-1704. Merge in the new design branch.  A full changelog for the new design
-      branch can be found in the CHANGELOG.ND file.
-1703. Font-related X server buffer overflow fixes (Robin Cutshaw).
-
-XFree86 3.9Ak (11 July 1998)
-1702. xterm patches 81 and 82.  Fix Linux/Alpha build problems,
-      utmp handling on Solaris, some terminfo nits, and improve
-      cursor colour (#1794, 1797, Thomas Dickey).
-1701. Fix CloseScreen() related problems (#1793, Marc La France).
-1700. Close some sockets that xdm was leaving open when running new
-      sessions (#1704, Matthieu Herrb).
-1699. Fix usleep problems with static servers on SVR4.
-1698. Fix a problem parsing "ModeLine" entries (#1779, Keldon Jones).
-
-XFree86 3.9Aj (04 July 1998)
-1697. PC98 fix for VT switching, VideoBoard98 update (#1766, Takaaki Nomura).
-1696. xterm patches 79 and 80.  Fix for F1-F4 key handling, fg/bg pixel
-      value with -flipPixels, scrollbar color, keypad handling, and
-      various terminfo enhancements (#1758,1762 Thomas Dickey).
-1695. Lots of Xaw work.  See xc/lib/Xaw/Changelog for details
-      (#1660, 1673, 1678, 1686, 1701, 1738, 1752, 1755, 1765
-      Paulo Cesar Pereira de Andrade).
-1694. Add the library security fixes (#1722).
-1693. Fix rendering errors in the generic bit expansion code (#1746,
-      Jens Owen).
-1692. Fix problem in Oak clock setting routines (#1744, Kevin Buhr).
-1691. Clean up vga16 (remove unused code, remove vga16's mfb (vga2 is used
-      instead), clean up vga16's external name space). Minor fix to ATI
-      driver. (#1742, Marc LaFrance).
-1690. Fix macro expansion in xf86Config.c (#1730, Jens Maurer).
-1689. On Linux, default the use of special or internal malloc's to NO
-      (instead of forcing it to NO). Allow CloseScreen to free wrapper
-      private storage in most servers. Push out backing store initialisation
-      to the callers of the various <framebuffer>ScreenInit()'s. Change
-      m68k's XF68_FBDev to use backing store low-level functions to
-      save/restore the screen during VT switches. Minor fixup to loader
-      message. (#1719, Marc La France).
-1688. Fixes for 24bpp and 32bpp on Matrox Millenium II. This fixes the
-      horizontal stripe for modes using > 4MB (#1715,1716, Doug Merritt).
-1687. Fix build problems on LynxOS and enable keyboard LEDs on LynxOS 2.5.1
-      (1712, Thomas Mueller).
-
-XFree86 3.9Ai (05 June 1998)
-1686. Add rendition directory. This is not included in the build process, yet
-      (#1707, Marc Langenbach).
-1685. Make glint compile on Alpha. Some xtest fixes for Alpha (#1705,
-      Christian Worley).
-1684. xterm patch 77,78, convert to ANSI C (#1702,1706 Thomas Dickey).
-1683. Fix compile problems under OS/2 (#1693, Holger Veit).
-1682. Fix xmag segfault (#1675, Andy Sloane).
-1681. Fix build problem of the static servers on FreeBSD. Fix build problem
-      on SVR4(incomplete). Update PC98 Card Database(#1691, Isao Ohishi,
-      Takaaki Nomura).
-1680. Minor fix to ATI driver clock code. Fix vga16 for xtest-detected
-      problems. Fix up vga16's pixmap printing when enabled by DEBUG. There's
-      no need for XFree86LOADER specifics in mibitblt.c(#1690, Marc La France).
-1679. Fix hw cursor on CT65555 and fix loader problem (#1688,1689 Nozomi Ytow).
-1678. Fix freeing of names when removing modes (#1685, Matthieu Herrb).
-1677. Enable ImageWrite in 24 bpp for C&T HiQV (#1684,1687 Nozomi Ytow).
-1676. Fix unknown symbol type 1e message in a.out loader (#1683,
-      Matthieu Herrb).
-1675. xterm patches 75 and 76. Fix for print-window function, minor cleanups,
-      lots of fixes from other people (see xterm.log.html) (#1681,1682,
-      Thomas Dickey).
-1674. Make vga16 use backing store functions to save/restore the screen on VT
-      switches. Don't call xf86InvalidatePixmapCache when bpp is 1 or 4
-      (#1680, Marc La France).
-1673. Change PIC code to print names of ALL devices capable of displaying
-      video. Return pointer to the last card instead of the first (#1662,
-      Dejan Ilic).
-1672. Add skeleton driver for Tritech Pyramid 3D (#1661, Dejan Ilic,
-      Mark Vojkovich).
-1671. Check additional pci bus in scanpci (Robin Cutshaw).
-
-XFree86 3.9Ah (28 April 1998)
-1670. Xterm patch 74 fix define conflicts and update print support (#1674,
-      T.E.Dickey).
-1669. Xterm patch 73 added print window facility, terminfo updates,
-      conditional include cleanup, debugging trace enhancements, and
-      HP-UX configure updates (#1672 T.E.Dickey).
-1668. Framebuffer fixes leaving valid GC on exit, fix for opaque types
-      (#1669 Marc Aurele La France).
-1667. Add ELF support for AXP platform (#1666 Stuart Anderson).
-1666. PCI function fixes for AXP platform (#1665 Alan Hourihane).
-1665. SiS updates (#1664 Mike Chapman, Mitani Hiroshi).
-1664. Fix CompressAllFonts define use in X11.tmpl (#1663 Matthieu Herrb).
-1663. Xaw updates including more functions for diaplayLists, fixes
-      for simpleMenuWidget, boxWidget, and panedWidget (#1660 Paulo Cesar
-      Pereira de Andrade).
-1662. Xdm seg fault fix (#1658 Matthieu Herrb).
-1661. Tseng PIXMUX updates (#1656 Krajcsovits Gyorgy).
-1660. Mouse driver loop restructuring and additional packet data
-      checks (#1654, Oyvind Aabling).
-1659. PANIX build fix for PC98 platform (#1653, Satoshi Kimura).
-1658. Sync loss on cursor change fix (#1650, Mark Vojkovich).
-1657. Driver line fix, unresolved symbol fix, remove loading of xaavga256
-      at depths greater than 8, glint 24bpp fix (#1645-1649 Alan Hourihane).
-1656. More XF86Setup patches, P9000 symbol fix, PC98 Imakefile sync (#1644
-      Takaaki Nomura).
-1655. Tseng doc, accel sync with 3.3.2, PIXMUX and misc fixes (#1641,1642
-      Koen Gadeyne).
-1654. ISC fix for usleep and glint probe fix for DELTA (#1639,1640 Michael
-      Rohleder).
-1653. Add FreeType code to lib/font/FreeType, but the build-related
-      things haven't been done yet (David Turner, Robert Wilhelm,
-      Werner Lemberg, Mark Leisher, Juliusz Chroboczek).
-1652. Xterm patch 72 activity notification enhancement (#1659, T.E.Dickey).
-1651. Xterm patch 71 buffer overflow fix (#1651, T.E.Dickey).
-1650. Sync I128 server acceleration with 3.3.2 (Robin Cutshaw).
-
-XFree86 3.9Ag (05 April 1998)
-1649. AGX ScrnInfoRec fix, fix compiler warnings for Xprt and loader,
-      fix vgaCloseScreen problem, add new ScreenRec functions to
-      set/get pixmaps and wrapper functions, VC switch to use
-      low-level backing store functions (#1635, Marc Aurele La France).
-1648. xfree98/XF86Setup sync with 3.3.2 (#1632, Takaaki Nomura).
-1647. xfree86/XF86Setup sync with 3.3.2 (#1629,1634 Kazutaka Yokota).
-1646. Back out the following R6.4-related changes:
-         #1169, 1170, 1342 -- version numbering changes,
-         #1167 -- CUP extension,
-         #1225, 1282, 1341 -- EVI extension,
-         #1171-1178, 1198, 1246, 1305 -- Xinerama extension,
-         #1165 -- Xt Resource Configuration Management.
-1645. XAA fixes for xf86bpp (#1633, Alan Hourihane).
-1644. More 3.3.2 syncs, PC98 sync, usleep problem with FreeBSD,
-      SVR4.0 build problem fixes (#1631, Takaaki Nomura).
-1643. Kensinngton Thinking and Expert Mouse fix (#1630, Kazutaka Yokota).
-1642. S3 968 fix (#1628, Kazutaka Yokota).
-1641. Add DoImageWrite for Permedia2 and partial 24bpp acceleration to
-      the glint server (#1627, Alan Hourihane).
-1640. ISC sync with 3.3.2 (#1625,1626, Michael Rohleder).
-1639. Xterm patch 70 including Imakefile fix for logging, "ich"
-      restoration, cursor color fix, "-vb" arg fix, character-set
-      rework, SS2/SS3 control fix, terminfo updates (#1624, T.E.Dickey).
-1638. Add loader symbol for miSetZeroLineBias (#1623, Mark Vojkovich).
-1637. Fix duplicate symbols in s3 server (#1621, Takaaki Nomura).
-1636. glint cleanup for XAA autoload modules (#1620, Alan Hourihane).
-1635. xf86Config fixes for svga and accel servers, extmod load for all
-      depths (#1618,1619, Alan Hourihane).
-
-XFree86 3.9Af (28 March 1998)
-1634. Add 1024x600 to the identified video modes in the chips server
-      (#1617, Nozomi Ytow).
-1633. Resync xfree98 with xfree86 and resync some PC98 files with 3.3.2
-      (#1616, Takaaki Nomura).
-1632. Fix micro typo in chips.sgml (#1615, David Bateman).
-1631. Define defaults for XF86Config file locations. Have make World remove
-      Makefile.bak files. Resync ScrnInfoRec's for the last time (Hope
-      springs eternal). "Externalise" InstalledMaps in all XFree?? servers.
-      Remove reference to DEFAULT_MODULE_PATH in static servers. Deal with
-      some of the warnings produced by gcc by default. Resync ATI driver with
-      the version found in XFree86 3.3.2. Fix loader bug in dealing with XAA.
-      (#1614, Marc La France).
-1630. Don't abort a static server if the Driver statement in the Device
-      section is missing (#1613, Kazutaka Yokota).
-1629. Fix typo in #1606 and improve printing of mouse related messages
-      (#1613, Kazutaka Yokota).
-1628. Build fixes for static S3 and S3V servers (#1613, Kazutaka Yokota).
-1627. Re-add 8x8 trap fill support in XAA (#1612, Mark Vojkovich).
-1626. Add new text replacements to glint server, add packed data modes, tune
-      fifo handling, fix drawing bugs and others (#1609,1611, Mark Vojkovich,
-      Alan Hourihane).
-1625. Add mouse related 3.3.2 changes to XF86Setup (which still doesn't
-      compile) (#1608,1610, Kazutaka Yokota).
-1624. Update xdpyinfo to reflect mouse code changes (#1607, Kazutaka Yokota).
-1623. Merge missing mouse code from 3.3.2 (#1606, Kazutaka Yokota).
-1622. Resync xterm, add missing patches from 3.3.2 (#1605, Thomas Dickey).
-
-XFree86 3.9Ae (22 March 1998)
-1621. Bring over some of the new mouse code from the 3.3.2 tree.
-1620. Link X11 apps against libxpg4 on FreeBSD to get multibyte locale
-      support.
-1619. SVGA/chips. include support for the new 69000 chipset. Fix up the
-      memory probing for the 65554, 65555 and 68554 chips. Add probing for
-      the 64200, 64300 and 69000 chips to SuperProbe. Fix  the memory probing
-      for the 65554, etc in SuperProbe. Some docs updates (#1603,1604,
-      David Bateman).
-1618. Fix Mach32 text restoration (#1601, Marc La France).
-1618. Add Rendition V2x00 to vgaPCI.h (#1598, Marc Langenbach).
-1617. xterm patches. improve test for highlightColor so that xterm does not
-      attempt to use that unless it is different from the foreground and
-      background colors. remove ich and ich1 from xterm and xterm-8bit
-      terminfo descriptions. restore 1-pixel overlap of scrollbar border with
-      left edge of window. add a configure option, --enable-logfile-exec.
-      make the ALLOWLOGFILEEXEC code compile & run, if configured. minor
-      documentation nits. correct the problem in xterm with utmp by removing
-      the reset of setuid/setgid before the main event loop (#1525,1571,1599,
-      Thomas Dickey).
-1616. Change s3/svga from using 8x8 pattern fills to 8x8 color expand fills.
-      Add support for S3's type planar 8x8 pattern fills to XAA. Add support
-      for S3's planar 8x8 fills to the XAA stippled trapezoid stuff
-      (#1594,1595,1596,1597, Mark Vojkovich).
-1615. Ensure the correct message for lines at startup (#1591, Alan Hourihane).
-1614. Fix XAA to allow vertical lines using TwoPointLine (#1590,
-      Alan Hourihane).
-1613. Change the xf86orect.c code to always use a hardware filled rect rather
-      than a software one when drawing vertical lines (#1589, Mark Vojkovich).
-1612. Add MICROSOFT_ZERO_LINE_BIAS flag to xaa to indicate that the hardware
-      uses MicroSoft's line bias rules rather than X's. Fix the end point
-      sematics for two point lines. Add TiledFilled Rects via image write.
-      Fix a problem with the CopyArea wrapper syncing when it shouldn't. Fix
-      twopoint line problems with XAA dashed lines. Make sure we alway check
-      for one rect situations when using XAA polygon code (#1575,1576,1577,
-      1578,1579,1580,1581, Mark Vojkovich).
-1611. Add new MGA acceleration, including image writes and 8x8 pattern trap
-      fills. Go back to two point lines. Add solid filled span replacement.
-      Make PCI retries off for mga by default (need Option "pci_retry" to turn
-      them on).  Make hardware cursor work better in doublescan modes.  And
-      turn hw cursor on by default (#1582,1583,1592 Mark Vojkovich).
-1610. Removes assumption that we have a Trapezoid function (#1573,
-      Alan Hourihane).
-1609. Fix ImageWrite code at 15bpp by fixing xaa not to rely on xf86bpp, but
-      use the accel structure (#1572, Alan Hourihane).
-1608. Fix problem building resize on BSDI, update manpages, add log
-      xterm.log.html (#1490, Thomas Dickey).
-1607. Small patch to xterm's 8-bit terminal description (#1481, Thomas Dickey).
-1606. Move framebuffer ModuleInit functions to separate C source files.
-      Another fixup to mono's ScrnInfoRec (#1474. Marc La France).
-1605. Loader updates (#1467, Stuart Anderson).
-1604. Ensure window and GC privates are aligned on a sizeof(long) boundary.
-      Minor bug fix to mfb and afb framebuffers. Reinstate building of Xibm
-      server. Move pRotatedPixmap, pCompositeClip, fExpose, freeCompClip from
-      GC privates to the GC structure proper (in preparation for the banking
-      mi wrapper) (#1442,1443,1444,1445,1588 Marc La France).
-1603. xterm fixes for configuration (#1437, Bjorn Helgaas).
-1602. Lots of SVGA/ATI updates. Enforce architectural limits on panning &
-      scrolling. Duplicate recent XF86_Mach64 changes (Bus detection, Chipset
-      detection adjustments, Support for 16MB linear apertures, maxClock
-      settings). First swipe at supporting adapters whose VGA has been
-      disabled. Save and restore more registers on mode
-      entries/switches/exits. Colour map initialization changes to make use
-      of uninitialized entries more obvious. Bug fix to DSP register
-      calculation. Support 15, 16, 24 and 32bpp on integrated controllers.
-      Remove dependence on TimingTab. Include VGA DAC registers in verbose
-      output. Skip sparse I/O probes when PCI configuration space indicates a
-      device has registered a block I/O base. Virtual X rounding adjustments
-      for packed modes. Documentation updates (#1430, Marc La France).
-1601. Clean up ScrnInfo, make vgaCloseScreen call the framebuffer's
-      CloseScreen() function, determine more pricely whether the virtual
-      resolution fits in video memory, minor optimization of cfb's
-      ImageGlyphBlt entry (#1428,1429, Marc La France).
-1600. Fix typo in mga.h (#1418, Tim Rowley).
-1599. Fix some baserom/_baserom confusion (#1407, Gary Barton/Concurrent).
-1598. More fixes from Metro Link and some updates for clients. Remove
-      all but one copy of sdimple.c (#1405,1406, Craig Groeschel).
-1597. Remove unnecessary byte_reversed arrays (#1400, Craig Groeschel).
-1596. Add missing Xarch.h (#1399, Craig Groeschel).
-1595. Add no-listen keyword to xfs (#1397, Topi Miettinen).
-1594. Build fixes for PC98 static build (#1391,1396 Takaaki Nomura).
-1593. Build fixes to loader directory (#1388, Alan Hourihane).
-1592. Some Link Kit fixes (#1384, David Bateman).
-1591. Add zoom initialization and fix blits on T2R (Robin Cutshaw).
-1590. Add support for several new mice, including Kensington ThinkingMouse,
-      ALPS GlidePoint, Genius NetScroll, Genius NetMouse, Genius NetMouse,
-      ASCII MieMouse, Logitech MouseMan+, Logitech FirstMouse+ (#1380,
-      Kazutaka Yokota).
-
-XFree86 3.9Ad (25 January 1998)
-1596. Fix two buffer overflow problems in the X server.
-1595. Fix some libXt VSW5 failures (#1347, 1359-1363, 1365, Kaleb Keithley,
-      Arthur Barstow).
-1594. Change server's default vendor string and release (#1342,
-      Kaleb Keithley).
-1593. Fix problem entering mode_shifted characters with xdm and XKB
-      (#1340, Kaleb Keithley).
-1592. Bump SunOS 4.x libXext rev (#1339, Kaleb Keithley).
-1591. Pick up PCI multimedia/video devices and display devices of all
-      subclasses (not just VGA) in vgaGetPCIInfo().
-1590. Reinstate Xserver/hw/ibm for reference purposes.
-1589. Cirrus and vga256 driver changes to support the PowerPC machines.
-      (1357, Gary Barton/Concurrent).
-1588. Organize xf86_ansic.h/xf86_libc.h/xf86_OSlib.h, and de-mangle xf86*
-      libc calls. Move Probe routine to the beginning of the ScrnInfoRec to
-      match the vgaVideoChipRec. Make the mach32, mach64, mach8, i128, and
-      ibm8514 servers loadable. Use one global byte_reversed array. When
-      SetCursor is called with a null CursorPtr, turn the cursor off. Fix
-      CapNotLast lines and segments in mach64 and xaa. Copy some code from
-      Metro-X 3 to handle panning at 24 bpp on Mach64. Mask the correct
-      number of pitch bits when updating the CRTC_OFF_PITCH register. Use
-      xf86scanpci instead of vgaPCIInfo. Fix tseng driver DPMS bug. Declare
-      and initialize xf86PixmapIndex. (#1356, Craig Groeschel/Metro Link).
-1587. Add xf86Serial functions (#1355, Chris Bare/Metro Link).
-1586. New config file parser, new functions for accessing xf86Info,
-      handle an XQUEUE race condition, make sure XqueQaddr is initialized
-      (1353, Stuart Anderson/Metro Link)
-1585. Build cleanups and fixes to cursor handling for multi screen layout
-      (#1354, Craig Groeschel/Metro Link).
-1584. Add portable and extensible PCI support framework (#1352,
-      Gary Barton/Concurrent).
-1583. Support PowerMAX_OS on Motorola/Concurrent PowerPC machines
-      (#1351, Gary Barton/Concurrent).
-1582. .cf and Imakefile changes to use PpcArchitecture and PpcSvr4Architecture
-      definitions for consistency (#1350, Gary Barton/Concurrent).
-1581. Fix 9397 detection in Trident driver (#1376, Alan Hourihane).
-1580. Add support for the DacSpeed entry to the Mach64 server (#1375,
-      Kevin Martin).
-1579. Fix 16bpp for the Permedia 2 (#1373, Alan Hourihane).
-1578. Fix DPMS for Trident cards (#1372, Alan Hourihane).
-1577. Add Option "no_pci_retry" to option code and the MGA driver (#1370,1371,
-      Mark Vojkovich).
-1576. Add back CyberCont that was removed from Trident driver in 3.9Ac by
-      mistake (#1369, Alan Hourihane).
-1575. Fix ImageWrite code to not read beyond the end of the source in cases
-      of bad alignment (#1368, Mark Vojkovich).
-1574. xterm updates (#1366,1378 Thomas Dickey) including:
-      - change the terminfo entry so that rs1 does a hard reset
-      - modify treatment of hard reset by the xterm program to reset the saved
-        lines
-      - correct hard reset by also resetting user-defined keys.
-      - change the way highlihting is implemented
-1573. Fix PutImage to work with Rops other than GXcopy (#1364, Alan Hourihane).
-1572. Fix clipping in 16bpp on tgui chipsets, fix 32bpp and add transparency
-      (#1345,1346,1349 Alan Hourihane).
-1571. Some updates to stub driver to reflect current layout (#1343,
-      Dejan Ilic).
-1570. Change xdm config to explicitly specify the VT used on OpenBSD (#1337,
-      Matthieu Herrb).
-1569. Build fix for P9x00 driver (#1336,1344 Takaaki Nomura).
-1568. Resync xaa/Imakefile for PC98 (#1335, Takaaki Nomura).
-
-XFree86 3.9Ac (11 January 1998)
-1567. Fix some VSW5 failures in libXt (#1333, Kaleb Keithley).
-1566. xterm updates (#1332, Thomas Dickey) including:
-      - Add xterm support for blinking text.  It doesn't actually cause the
-        text to flash, but text with the blink attribute can be displayed in
-        color, using new resources colorBL and colorBLMode.
-      - Corrected a missing save-cursor in the handling of SGR 1048.
-      - Flush the output of the transparent printing after each line.
-      - Correct the modes that are affected by save/restore cursor.
-      - Corrected placement of one of the XSync calls which had the
-	side-effect of writing on the window border when the xterm was
-	resizing from 132 to 80 columns.
-      - Work around an incompatibility of the XKB definition used in xterm
-        versus that symbol from IRIX 6.2's imake definitions (by adjusting
-        the standalone configure script).
-1565. Add detection of Intel TX chips and Pyramid 3D TR25202 to scanpci
-      (#1330, Dejan Ilic).
-1564. Fix xtest related problems on MGA (related to syncing before reading)
-      (#1329, 1334, Mark Vojkovich).
-1563. Possible fix for Millennium II crashing (#1328, Mark Vojkovich).
-1562. Add more careful checking of $HOME/.xsession in the default xdm
-      Xsession script (#1327, Geoff Wing).
-1561. Fix uninitialised variables in decddx (#1326, Kaleb Keithley).
-1560. Fix a typo in the Xlib docs (#1325, Kaleb Keithley).
-1559. Add 8x8 pattern filled 1 rect polygons to XAA.  Also included is
-      an 8x8 pattern filled trapezoid function (#1324, 1331, Mark Vojkovich).
-1558. Add more conservative limits for when XAA uses trapezoid fills rather
-      than spans (#1323, Mark Vojkovich).
-1557. Add transparent 8x8 pattern fills to s3/svga (#1322, Mark Vojkovich).
-1556. Xt (VSW5 failures): Xt11/XtCallConverter - Test Purposes 11, 12, 13
-      (#1321, Kaleb Keithley).
-1555. Xt: XtMakeGeometryRequest doesn't emit error if parent != composite
-      (#1320, Kaleb Keithley).
-1554. S3 (svga) ramdac fixes in IBMRGB52x_Init, TI_3020_3025_Init,
-      NORMAL_PreInit, and ATT_409_498_Probe routines, including fixes for
-      the use of the dacSpeeds array (#1319, Craig Groeschel/Metro Link).
-1553. Fixes for Permedia PM2 support to correct 32bpp, and improve things
-      for 16bpp (#1318, Alan Hourihane).
-1552. P9x00 driver (#1317, Joerg Knura).
-1551. Allow xvidtune to be driven by the keyboard (#1315, via Kaleb Keithley).
-1550. Add missing exported symbols to Win32 DLLs (#1314, Kaleb Keithley).
-1549. Detect an extra Trident Cyber chip (#1313, Alan Hourihane).
-1548. Add timeouts to all Tseng "wait for something" functions (#1312,
-      Koen Gadeyne).
-1547. Tseng driver documentation update (#1311, Koen Gadeyne).
-1546. Update xterm man page, configure script and related things (#1310,
-      Thomas Dickey).
-1545. Add a version number to xterm, and make the -version and -help options
-      used before attempting to open the display (#1310, 1316, Thomas Dickey).
-1544. Implement logic to permit xterm to work with proportional fonts.
-      This is done by rendering the characters on a fixed pitch (#1310,
-      Thomas Dickey).
-1543. Fix missing planemask in XAA function (#1309, Mark Vojkovich).
-1542. Fix XAA syncing inconsistencies (#1308, Mark Vojkovich).
-1541. Allow Trident 9397 and later 3D chipsets to work by not using
-      acceleration (#1307, Alan Hourihane).
-1540. Fixes for older Trident Cyber series (#1307, Arthur Tateshi).
-1539. Fix includes for xfwp (#1306, Craig Groeschel/Metro Link).
-1538. Fix for large pixmaps in XINERAMA extension (#1305, Kaleb Keithley).
-1537. Xlib: XGetICValues fails for {preedit,status}Attributes
-      (#1299, Kaleb Keithley).
-1536. Add locale and xkb files for Lithuanian (#1298, Ricardas Cepas).
-1535. Device updates for scanpci (Robin Cutshaw).
-1534. First cut at cleaning up the parallel make dependencies (Robin Cutshaw).
-
-XFree86 3.9Ab (29 December 1997)
-1533. Reorganize the acceleration code in the tseng driver. Fix tseng XAA init
-      problem (#1303, Koen Gadeyne).
-1532. Add support for changing the MClk from the XF86Config file for
-      W32p cards with ICS5341 RAMDAC and for the ET6000 family (#1302,
-      Koen Gadeyne).
-1531. Add option to build xterm without tek4014 emulation. Add option to
-      build xterm with default TERM value other than "xterm". Apply some
-      minor bugfixes to OS/2 version. Fix configure help message and missing
-      quotes in memmove/bcopy configure test (#1297, Thomas Dickey, Darren
-      Heibert).
-1530. Add support for clock setting of the new trident chips (#1294,
-      Alan Hourihane).
-1529. XAA vertical line speedup (#1293, Alan Hourihane).
-1528. Add panning for Permedia and Permedia 2 (#1292, Alan Hourihane).
-1527. Add a few more messages to tseng driver and clean up the use of
-      the different bytes-per-pixel variables. Add "showcache" option
-      (#1300,1301, Koen Gadeyne).
-1526. Fix XAA pixmap cache bug with 16bpp and RGB=555 or 32bpp (#1295,
-      Walter Gadeyne).
-1525. Fix ImageWrite for Tseng (and re-enable it) (#1296, Koen Gadeyne).
-1524. Fix horizontal lines in Tseng driver (#1291, George Krajcsovits).
-1523. Support MUSIC MU9C4910 RAMDAC in Tseng driver (#1290, Koen Gadeyne).
-1522. Fix bad color in hardware linedraw for Tseng (#1290, Koen Gadeyne).
-
-XFree86 3.9Aa (20 December 1997)
-1521. Fix border colours for Trident server (#1289, Alan Hourihane).
-1520. Major update to Mach64 server. Proper identification of the different
-      chips. Support for 16MB boards. Increased max DAC speed settings for
-      newer chips. Support for AGP RagePro cards. Block write mode for
-      RagePro chips. 1600x1200 mode support for VT and newer chips. Use the
-      auxilliary register aperture on chips that support it. Use 16MB memory
-      aperture on PCI Mach64s with integrated controllers.
-      (#1288, Kevin Martin).
-1519. New code for the glint server. Preliminary support for the Permedia 2
-      hardware cursor. Preliminary support for panning the display with
-      multiple modelines for Permedia/Permedia 2. Fix ELSA Permedia 2 boards.
-      Cleanup of glint_init.c. Fix DGA when using software cursor. Addition
-      of code to not save VGA state if the VGA core is disabled.
-      (#1285,1286,1287, Alan Hourihane).
-1518. Fix the "invalid depth" problem with packed 24 (#1284, Andrew Aitchison).
-1517. Fixes to finish keyboard layout (Johan Myreen).
-
-XFree86 3.9z (14 December 1997)
-1516. Fix loss of sync while panning problem and attempt to fix the occasional
-      crashes of the Millennium II by restricting the MGACountRam function
-      to test the first 8MB, only (#1280, Mark Vojkovich).
-1515. Fix XF86Setup to create a (symbolic) link of /usr/X11R6/bin/X when it
-      doesn't exist (#1279, Matthieu Herrb).
-1514. Fix solid trap/rect fill bugain the mga server for the Millennium II
-      that was hurting performance severely (#1277, Mark Vojkovich).
-1513. Reenable BitBlt accelerations for Millennium II (#1271, Mark Montague).
-1512. Fix mmap memory leak in IGS driver. ARM32/NetBSD specific fix for
-      xf86MapInfoMap (#1265, Katrina Maffey).
-1511. Resync change 1474 for PC98 and fix a reference to usleep on SVR4
-      (#1264, Takaaki Nomura).
-1510. Add BLK opaque color expansion for 2164 and change the mga code to use
-      a lookup table for XFree->mga rop conversions (#1261, Mark Vojkovich).
-1509. Fix XAA hardware cursor support for BT485 ramdacs
-      in the S3/SVGA server (#1260, Mark Vojkovich).
-1508. Fix VT switching hang in FreeBSD (#1259, Joerg Wunsch).
-1507. Enable MMIO / linear FB on Cirrus 7548. Experimental patch for screen
-      expansion (640x480 on 800x600 LCD) which doesn't seem to work, yet
-      (#1258, Achim Oppelt).
-1506. Fix gc validation (#1257,1262 Mark Vojkovich).
-1505. Fix SIGSEGV in xf86setup (Dirk Hohndel).
-1504. Extend XF86Setup to allow selecting the modes and the default color
-      depth (Dirk Hohndel).
-1503. Fix build problem on Solaris 2.6/x86 with gcc 2.7.2.3.
-1502. Fix Solaris 2.x + gcc build problem in xfwp (#1272, Takaaki Nomura).
-1501. Xkb{Get,Set}PerClientControls missing from XKBlib.h (#1283,
-      Kaleb Keithley).
-1500. BSD 4.4 sockets not handled correctly in xfwp/transport.c (#1276, 1281,
-      Kaleb Keithley).
-1499. Local connection doesn't work for lbxproxy on AIX (#1275,
-      Arthur Barstow).
-1498. Get fcntl flags in Xtrans before setting them (#1268, Kaleb Keithley).
-1497. Fix 'Xnest -query' on IBM (#1263, Kaleb Keithley).
-1496. Fix X server core dump after disconnecting from a font server
-      (#1256, Arthur Barstow).
-1495. Xserver:Security Policy parsing code returns bogus value on suceess
-      (#1254, M.S. Ramesh).
-1494. Install app-defaults in /var (#1253, Kaleb Keithley).
-1493. Some xfwp fixes (#1252, Arthur Barstow).
-1492. Fix some Win32 problems (#1251, 1255, Kaleb Keithley).
-1491. DPMS was missing from pandix main.c (#1246, Kaleb Keithley).
-1490. Solaris 2.x LOCALCONN updates (#1269 Kaleb Keithley).
-1489. DPMS updates (#1229, Kaleb Keithley).
-1488. KeyPress event doesn't use XKB state when GrabsUseXKBStateMask is set
-      (#1227, Kaleb Keithley).
-1487. Add EVI (Extended Visual Information) server extension (#1225, 1282,
-      Kaleb Keithley).
-1486. Fix some Xmb man pages and specs docs (#1220, 1270, Kaleb Keithley).
-1485. Plugin fixes (#1219, 1221, 1224, 1226, 1247, 1273, Kaleb Keithley).
-
-XFree86 3.9y (6 December 1997)
-1484. Fix some initialization problems in the xkb programs (#1233,
-      Andreas Schwab).
-1483. Fix loader to resolve symbols properly in Xext (#1250, Robin Cutshaw).
-1482. Fix loader on Solaris and enable it for SVR4 (#1248,1249, Robin Cutshaw).
-1481. Fix some problems with T2R support (#1245, Robin Cutshaw).
-1480. Fix rfhcnt calculation and VT swithcing in mga driver. Allow DirectColor
-      on Millennium II cards (#1241,1242,1243,1244, Mark Montague).
-1479. Potential fix for s3/svga cursor support for Ti ramdacs. Remove a
-       mistake from the s3/svga acceleration code (#1237, Mark Vojkovich).
-1478. Switch the MGA driver over to XAA Hardware Cursor. Only support for
-      TVP3026 is included (#1236,1239, Mark Vojkovich).
-1477. Add delayed syncing abd faster arcs ub 8bpp to mga driver (#1235,
-      Mark Vojkovich).
-1476. Fix another SIGSEGV in xterm, where wrong assumptions about the type of
-      widget passed to an action handler were made (#1234, Thomas Dickey,
-      Arfst Ludwig).
-1475. Fix the wraparound problem with the Mach32 cursor and add another seven
-      pixels to the possible width of the cursor (#1232, Bryan Feir).
-1474. Remove vga256/vgainit (#1231, Mark La France).
-1473. Fix a namespace collision in Mach8 server (#1230, Mark La France).
-1472. Fix SIGSEGV when some internal xterm buffers overflowed (#1228,
-      Thomas Dickey).
-1471. Fix HiQV version of ImageWrite in the C&T driver (#1222,1223,
-      David Bateman).
-1470. Yet another attempt to fix packing order for dashed lines (#1217,
-      Mark Vojkovich).
-1469. Build fixes for Xext (#1216,1238 Takaaki Nomura).
-1468. Remove all references to the W32 server (but not the actual server code)
-      (#1215, Koen Gadeyne).
-1467. Complete initial support for Permedia 2 and add some acceleration for it
-      (Alan Hourihane).
-1466. Some more code for supporting the IBM RGB640 in the glint server
-      (Dirk Hohndel).
-
-XFree86 3.9x (23 November 1997)
-1466. Updates for SCO (#1211, 1212, J. Kean Johnston).
-1465. Fix netscape plugin core dump when transfer is interrupted (#1209,
-      Kaleb Keithley).
-1464. Registry updates (#1205, Kaleb Keithley).
-1463. Preliminary imake support for different Linux distributions (#1203,
-      Kaleb Keithley).
-1462. Enable JIS, SJIS, EUC, etc. on X_LOCALE machines (#1201, Kaleb Keithley).
-1461. Linux and HP imake cf updated (#1200, Kaleb Keithley).
-1460. Updates to XINERAMA (#1198, Kaleb Keithley).
-1459. Make the DPMS extension a more "standard" item (ie, its library code
-      is now in libXext) (#1197, Kaleb Keithley).
-1458. xload doesn't need libutil and libkvm on NetBSD and OpenBSD (#1189,
-      Scott Reynolds).
-1457. Separate module-specific and non-module-specific Xserver/Xext code
-      (#1149, Holger Veit).
-1456. OS/2 updates (don't use WIN32 file handling) (#1149, Holger Veit).
-1455. Clean up XAA calls in glint server (#1210, Alan Hourihane).
-1454. Adapt memory detection in I128 server to T2R (#1208, Robin Cutshaw).
-1453. Add DGA to glint server and get xvidtune to work with it (#1207,
-      Alan Hourihane).
-1452. Cleanups and preliminary support for the Trident 3DImage975 and
-      3DImage985 (#1206, Alan Hourihane).
-1451. Add stipple acceleration to the tseng driver (#1192, Koen Gadeyne,
-      Mark Vojkovich).
-1450. Add better text acceleration to the tseng driver (#1190, Koen Gadeyne).
-1449. Fix HiQV image writes (#1191, David Bateman).
-1448. Remove the need for the VideoMemSave buffers in glint server (#1196,
-      Alan Hourihane).
-1447. Handle bogus base address in vgaPCIInfo for s3/svga (#1194, Mark
-      Vojkovich).
-1446. Fix XF86Setup to work with Tcl/Tk 8.0 and improve support for future
-      mouse protocols in XF86Setup (#1158,1159, Joe Moss).
-1445. Fix DGASetViewPort problem in S3 server (#1157, Harald Koenig).
-1444. Add -U flag to imake (#1156, Chris Demetriou).
-1443. First cut for I128 Revolution support (#1155, Robin Cutshaw).
-1442. Fix packing order for dashed lines (#1154, 1188, Alan Hourihane, Mark
-      Vojkovich).
-1441. Fix joycal.c to work with Linux 2.1.x (#1153, Robin Cutshaw).
-1440. Fix ImageString xtest results. Call miImageGlyphBlt instead of
-      cfbImageGlyphBlt8 (#1152, Alan Hourihane).
-1439. Add overlay support for the IBM RGB526 (disabled)(#1151, Mark Vojkovich).
-1438. Fix setting maxclock in s3/svga (#1151, Mark Vojkovich).
-1437. Print module version in plain text (#1150, Holger Veit).
-1436. Correct change 1390 (#1148, Takaaki Nomura).
-
-XFree86 3.9w (16 November 1997)
-1435. Remove some compiler warnings.
-1434. Fix lcPublic state_depend_encoding test in Xlib (#1181, Kaleb Keithley).
-1433. Fix buffer overrun in lib/X11/omGeneric.c (#1180, Kaleb Keithley).
-1432. Add new XINERAMA extension (#1171-1178, Kaleb Keithley).
-1431. Update man pages for X11R6.4 (#1169, 1170, Kaleb Keithley).
-1430. Add new CUP (Colormap Utilization) extension code (#1167,
-      Kaleb Keithley).
-1429. Add resource configuration management code to libXt (#1165,
-      Arthur Barstow).
-1428. Xkb{Get,Set}PerClientControls not implemented in Xlib (#1164,
-      Kaleb Keithley).
-1427. Fix bug in lbxproxy's detection of synonymous server names (#1161,
-      Arthur Barstow).
-1426. Various xfwp fixes and cleanups (#1103-1107, 1109, 1110, 1140-1144,
-      1160, 1162, 1163, 1166, 1168, 1179, Arthur Barstow).
-1426. Fix select prototype for HP/UX 10.x (#1102, Kaleb Keithley).
-1425. Fix a 64-bit nit in MakeRootTile (#1080, Kaleb Keithley).
-1424. Export weak symbols in elistgen.sun (#1078, Kaleb Keithley).
-1423. Put back the reference to the xfree68 directory in
-      xkbcomp/symbols/Imakefile.
-1422. Add xkb support for some older HP keyboards (#1077, Kaleb Keithley).
-1421. Fix some typos in the iso8859-1 compose file (#1076,
-      Niels Kristian Bech Jensen).
-1420. Xlib UTF support uses longs, but should use wchar_t (#1068,
-      Kaleb Keithley).
-1419. HP/UX 10 config update (#1066, 1079, Kaleb Keithley).
-1418. Update lbxproxy to use the Xtrans library (#1060, Arthur Barstow).
-1417. Deal with gratuitous Xserver colormap flashing (#1059, Kaleb Keithley).
-1416. LBX-related updates to the Xserver (#1049, Kaleb Keithley).
-1415. Remove Xibm server from the source (#1048, Kaleb Keithley).
-1414. Remove xmh from the core tree (#1043, Kaleb Keithley).  Note, only
-      the entry for it in xc/programs/Imakefile is removed here so far, and
-      we may want to move it into our supported contrib.
-1413. Update sgi.cf (#1042, Kaleb Keithley).
-1412. Fix inconsistency with the naming of general man pages and the sections
-      they are installed in (#1040, Kaleb Keithley).
-1411. Fix xrx plug-in build problem on Solaris 2.6 (#1039, Kaleb Keithley).
-1410. Fix Xserver crash when using lbxproxy and xdm-auth-1 (#1038,
-      Kaleb Keithley).
-1409. Fix an infinite loop in CreateVisual() in lbxproxy (#1034,
-      Arthur Barstow).
-1408. locale.alias updates (#1032, Kaleb Keithley).
-1407. Misc very minor TOG updates (#1031, Kaleb Keithley).
-1406. Fix for MaxClients not being defined correctly in the Xserver
-      (#1030, Sekhar Makkapati).
-1405. Fix an Xserver problem related to FreeCursor() in
-      DisposeWindowOptional() (#1026, Kaleb Keithley).
-1404. Add setusercontext support to xdm for FreeBSD (#1025, Kaleb Keithley).
-1403. Use named pipes for local connections with Solaris 2.x (#1011, 1067
-      Kaleb Keithley).
-1402. Fix lost support for non-standard encodings in Xlib (#1005,
-      Kaleb Keithley).
-1401. Fix Xserver crash when colormap of copyfromparent given (#990,
-      Sekhar Makkapati).
-1400. Make lbxproxy try another port when bind fails (#988, Arthur Barstow).
-1399. Remove the Xserver '-config' flag for OSs that don't have tight command
-      line length restrictions (#987, Kaleb Keithley).
-1398. Remove some vararg cruft from the Appgroup library (#986,
-      Kaleb Keithley).
-1397. Fix SecurityLookupIDByClass in Xserver (#1186, Sekhar Makkapati).
-1396. Fix for sample site.def (#1184, Sekhar Makkapati).
-1395. Fix references to LINE_MAX in Xos_r.h (#1182, Sekhar Makkapati).
-
-XFree86 3.9v (9 November 1997)
-1394. Add unrolled text code for the 9 pixel width fonts (#1147,
-      Mark Vojkovich).
-1393. Fix planemask/transparency problems in tseng driver (#1146,
-      Harald Nordgard Hansen).
-1392. Add Fire GL 3000 option for glint server (#1139, Bart van den Broek).
-1391. Remove unnecessary ARM32 code (#1138, Katrina Maffey).
-1390. Fix a crash in XCopyPlane after server reset (#1137, Katrina Maffey).
-1389. Add support for PS/2 Intellimouse (#1136, Tim Goodwin).
-1388. Add a PolyArc replacement for s3/svga in 8bpp when using a linear
-      framebuffer. Add a stippled rect speedup for destinations less than 32
-      pixels wide (#1135, Mark Vojkovich).
-1387. Add read speed benchmark and support for >8bpp modes to dga test
-      program (#1134, Koen Gadeyne).
-1386. Fix dashed lines for vga256 (#1133, Alan Hourihane).
-1385. Enable trapezoid fill on mga (#1132, Radek Kapitan).
-1384. Fix ImageWriteFlags in trident driver (#1131, Alan Hourihane).
-1383. Fix wide line problem in the static server (#1129, Brian Wainscott).
-1382. Fix syncing problems with the scanline routines in XAA (#1128,
-      Alan Hourihane).
-1381. Restructure glint server to call the AccelInit function in a sane
-      manner (#1127, Alan Hourihane).
-1380. Add planemask support for the tridents and add hardware clipping for
-      the Cyber chipsets. Add Cyber 9397 detection (#1126,1130, Alan Hourihane).
-1379. Fix a typo in vgaPCI.h (#1125, Alan Hourihane).
-1378. Fix a problem with setting the maximum clock value on s3 cards at depths
-      other than 8bpp (#1123, Steve Forsythe).
-1377. Fix dashed lines for matrox driver (#1122, Radek Kapitan).
-1376. Use correct arguments to xf86ImageWrite when uploading cursor image to
-      videoram. Units of pixels instead of bytes (#1120, Mark Vojkovich).
-1375. Fix s3/svga cursor location computation error (#1119, Mark Vojkovich).
-1374. Improve GC validation code in XAA (#1117,1118,1121, Mark Vojkovich,
-      David Bateman).
-1373. Add accelerated color expansion for all color depths and for all
-      W32-style chips (#1116, Koen Gadeyne).
-1372. Add Warpnext/Warpprev to twm (#1114, Benjamin Gras).
-1371. One more fix to restore changes to variable types made in change 1347.
-      This should fix MouseSystem mice (#1111,1124,1145, Steve Forsythe,
-      Andrew Aitchison).
-1370. Add missing pm_accel.c.
-1369. Add ImageWrite support to glint server (Alan Hourihane).
-
-XFree86 3.9u (1 November 1997)
-1368. Add support for I128 Revolution to scanpci and SuperProbe (#1108,
-      Robin Cutshaw).
-1367. Compile fixes for ARM32/NetBSD (#1099, Katrina Maffey).
-1366. Change mga to use bresenham lines instead of two point (#1098,
-      Radek Kapitan).
-1365. Add mga stipple code so that it is 256K pixels barrier sensible and
-      even faster than current XAA stipple code (#1097, Mark Vojkovich,
-      Radek Kapitan).
-1364. Move C&T hw cursor into XAA. Re-enable ImageWrite on C&T. Rewrite 32bpp
-      HiQV code (should be almost usable) (#1096, David Bateman).
-1363. Get the ch8398 work in tseng driver at every color depth and any hibit
-      setting (#1095, George Krajcsovits).
-1362. Changes to XAA hw cursor code to better support switching between hw
-      and sw cursor (#1094, David Bateman).
-1361. Fix incorrect parenthesis placement caused by hand-applying part of
-      change 1347 (#1092, Mark Vojkovich).
-1360. Resync PC98 Imakefiles (#1091, Takaaki Nomura).
-1359. Build fix for PANIX (#1090, Takaaki Nomura).
-1358. Fix a duplicate inclusion of <sys/termio.h> on ISC inside xterm/screen.c
-      and update the help text for xterm to correspond with the appropriate
-      commandline switches (#1089, Michael Rohleder).
-1357. Fix some incorrect type modifications in change 1347 (#1087,1088
-      Alan Hourihane, Michael Rohleder).
-1356. Fix mga_xaarepl.c to compile with non-GNU cc (#1086, Robin Cutshaw).
-1355. Clean up vgaPCI.h for Trident (#1085, Alan Hourihane).
-1354. Fix a bug introduced in change 1222 (#1084, Koen Gadeyne).
-1353. Remove amiga/ataritt files from xkbcomp/symbols Imakefile (they have
-      been moved to a subdir in change 1338) (#1083, Takaaki Nomura).
-1352. Update VideoBoard98 (#1081, Takaaki Nomura).
-1351. Add DO_NOT_BLIT_STIPPLES to the xf86AccelInfoRec.Flags (#1070,
-      Marc Vojkovich).
-1350. More work for Permedia 2 support. Still doesn't work (Dirk Hohndel).
-1349. Split acceleration drivers for GLINT and Permedia. Get glint server
-      to work (again) on Fire GL 1000 (Helmut Fahrion).
-1348. Get glint server to work on Fire GL 3000 (Bart van den Broek).
-
-XFree86 3.9t (26 October 1997)
-1347. Add support for ARM32 architecture and IGS CyberPro 2010 support
-      (#1052, Digital Equipment Corporation).
-1346. Multi-display support for lbxproxy (#969-971, 977, 978, Arthur Barstow).
-1345. Remove some misleading 32-bit comments in Xlib (#967, Kaleb Keithley).
-1344. Additional symbols for Japanese 109 key keyboard (#962, Kaleb Keithley).
-1343. Faster bit counting algorithm for Xlib/Xt modifier code (#958,
-      Kaleb Keithley).
-1342. XKB updates for hp ddx (#955, 956, Kaleb Keithley).
-1341. Fix Xaw Text Widget call to XtMalloc(0) (#954, Kaleb Keithley).
-1340. Updates to xrx plugins (#953, 957, 959-961, 963, Kaleb Keithley).
-1339. Use dump instead of nm in elistgen.sun (#922, Kaleb Keithley).
-1338. xkb updates (#920, Kaleb Keithley).
-1337. Fix imake's SPARCcompiler CCompilerMajorVersion detection (#919,
-      Kaleb Keithley).
-1336. Updates related to xkbcomp install (#918, Kaleb Keithley).
-1335. General MS-Win lib fixes (#917, Kaleb Keithley).
-1334. xterm support for -lcurses on HPUX 10.2 (#914, 916, 952, Kaleb Keithley).
-1333. Fix incorrect mode name in xf86config.c.
-1332. Fix text restore problem on some Avance Logic cards (#1072, Thomas
-      Dreibholz).
-1331. WriteBitmap code for MGA driver (#1069, Mark Vojkovich, Radek Kapitan).
-1330. Add a clean rule to remove XKB's .dir files. Add support for newer 3D
-      Rage III adapters to SuperProbe, the Mach64 server and the ATI driver.
-      Fix misuse of DirtyStartup define. Fix Mach64 mode restoration problems
-      in ATI driver. Fix 8MB linear aperture problem in ATI driver. Fix
-      typo's in drivers/s3* Imakefiles. Fix banking globals when a linear
-      aperture is used. Retrofit 3.3.1 vgaPCI code into 3.9s. (#1065,
-      Marc La France).
-1329. Add support for the Microsoft Intellimouse in the XFree86-Misc
-      Extension and XF86Setup (#1063,1064, Takaaki Nomura, Joe Moss).
-1328. Add Scanline ImageWrite support to XAA (#1062, Alan Hourihane).
-1327. Missing Millennium II AGP fixes (#1058, Brian Wainscott).
-1326. XAA hw cursor fix. Delay cursor restoration until after the saved screen
-      is restored (#1057, Mark Vojkovich).
-1325. Fix server to print the clock scale instead of effective clocks when
-      using a clockchip (#1056, Krajcsovits Gyorgy).
-1324. Correct eraser/stylus detection in wacom driver (#1055, Frederic Lepied).
-1323. Fixes for APM driver. HW lines/HW clipping. ROP support. Text accel now
-      uses PAD_DWORD. Bugfix for WaitForFifo() (lost serial interrupts) and
-      ApmSync() (various errors). HW cursor now uses XAA interface. Combined
-      write for many registers (x+y in one longword etc.) (#1054, Henrik
-      Harmsen).
-1322. xterm fixes. Correct a minor placement problem with the right scrollbar.
-      Implement a new set of control sequences for switching between the
-      normal and alternate VT100 screens. Implement the alternate-screen menu
-      entry (#1053, Thomas Dickey).
-1321. Add some reasonable limit for when a trapezoid fill is used rather than
-      using spans (#1051, Mark Vojkovich).
-1320. Add bindist description files for an OpenBSD/sparc binary distribution
-      (#1045, Todd Fries).
-1319. Some fixes and additions to the PCI databases (#1046,1050, Dejan Ilic).
-1318. Add 543x cirrus driver for PowerPC, fix some LynxOS related problems
-      (#1044, Thomas Mueller).
-1317. Add support for ViRGE/GX2 to SuperProbe (Dirk Hohndel).
-1316. Add support for ViRGE/GX2 to SVGA and S3V server (#1041, Harald Koenig).
-
-XFree86 3.9s (15 October 1997)
-1315. Fix segmentation fault in glint driver when server is started with a
-      card without GLINT/PERMEDIA chip (Stefan Dirsch).
-1314. Lots of fixes and additions to glint acceleration (Helmut Fahrion).
-1313. Fix problem with xterm hanging when opening a log file. Add
-      right-scrollbar to xterm (#1037, Thomas Dickey, Michael Rohleder).
-1312. Add GD7555 to vgaPCI.h and fix XF98_SVGA (#1036, Shuichi Ueno).
-1311. Fix a bug with Qword pad support in ImageWrite (#1033, Mark Vojkovich).
-1310. Fix mystique driver and build problem on SVR4.0 (#1029, Takaaki Nomura,
-      Isao Ohishi).
-1309. Fix SuperProbe to correctly detect memory on the Trident 9685 (#1023,
-      Alan Hourihane).
-1308. Add hardware clipping and transparency for the trident chips that
-      support it. Partially implement the 'set_mclk' option, not yet
-      complete, remove the tgui_mclk_66 option, clean up the TV output for
-      9685 boards. Documentation updates (#1022, Alan Hourihane).
-1307. Add accelerated ImageWrite and a WriteBitmap replacement to the tseng
-      driver (#1021, Mark Vojkovich, Koen Gadeyne).
-1306. Documentation update for tseng driver (#1020, Koen Gadeyne).
-1305. Clear disallowed flags in Options bitmap (#1019, Alan Hourihane).
-1304. Fix XAA hardware cursor for built-in S3 RAMDACs (#1018, Alan Hourihane).
-1303. Use trapezoid fills for some wide lines (#1017, Mark Vojkovich).
-1302. Fix colormap switching problem in svga/s3 (#1016, Mark Vojkovich).
-1301. Fix install problem with xkbcomp (#1014, Robin Cutshaw).
-1300. Fix lnx_jstk.c to work with 2.1.x joystick.h file (#1013, Robin Cutshaw).
-1299. Disable some HTotals in matrox driver that cause vertical stripes (#1010,
-      1015, Radek Kapitan).
-1298. Improve some bailout messages in tseng driver (#1009, Koen Gadeyne).
-1297. Suppress popen/pclose messages (#1008, Takaaki Nomura).
-1296. Initial support for Millennium II AGP (Dirk Hohndel).
-1295. Fixes to make glint server pass more of xtest (Alan Hourihane).
-
-XFree86 3.9r (30 September 1997)
-1294. Bug fixes to xterm. Change default resource of colorMode to true. Fix
-      'ech' control. Add resource boldColors and +pc / -pc. Add resource
-      colorAttrMode. Fix conflict between colorULMode/colorBDMode versus ANSI
-      colors. Correct two problems with the optional logging support. Various
-      updates to configure-script macros (#1004, Thomas Dickey).
-1293. Make sure ImageWriteBase gets set with a default value (#1003,
-      Alan Hourihane).
-1292. Replace mktemp() with mkstemp() in xrdb (#1002, Luke Mewburn).
-1291. Don't fail to start if there isn't enough memory for the hw cursor in
-      tseng driver (#1001, Koen Gadeyne).
-1290. Fix the install problem with XF98_SVGA (#1000, Takaaki Nomura).
-1289. Add bresenham lines to tseng driver (#997, Koen Gadeyne).
-1288. Significantly accelerate clipped terminal font performance (#996,998,999,
-      Andrew van der Stock, David Bateman).
-1287. Enable 24bpp for Trident TGUI 96xx (#995, Alan Hourihane).
-1286. Add support for the Trident ClearTV (#994, Alan Hourihane).
-1285. Remove INT64 from XAA text code (#993, Mark Vojkovich).
-1284. XAA hw cursor support for s3/svga. IBM cursor works, other RAMDAC
-      cursors need to be implemented/verified. S3 builtin curser seems
-      to work in 8bpp, but fails in other depths (#992, Mark Vojkovich).
-1283. Some fixes for Unixware 2.1.2 (#989, Steve Forsythe).
-1282. Fix the remaining line drawing problems for the CL-GD5428 and CL-GD754x
-      chips (#985, Corin Anderson).
-1281. Fix build problem (982, Takaaki Nomura).
-1280. Add more acceleration for Permedia (this is partly producing drawing
-      errors and needs much more testing) and remove Trapezoid bug in 500TX
-      support of glint server (Helmut Fahrion).
-1279. Build fixes for XAA hw cursor and updates to glint XAA hw cursor (#983,
-      984, Alan Hourihane).
-1278. Better color depth support and cleanups for glint server (Helmut Fahrion).
-1277. Add initial support for Permedia 2 chip to glint server (Dirk Hohndel).
-1276. Add support for GLINT MX chip to glint server (Dirk Hohndel).
-1275. Add RIVA 128 to scanpci (Dirk Hohndel).
-
-XFree86 3.9q (19 September 1997)
-1274. Add XF98_SVGA server, update XF98Conf.cpp, VideoBoard98, fix mga driver
-      for PC98 (#980,981, Michio "Karl" Jinbo, Shuichirou Urata).
-1273. Some fixes to glint server (Helmut Fahrion, Stefan Dirsch, Dirk Hohndel).
-1272. Fix for glint_dump_regs and disable accelerated lines for glint
-      (Stefan Dirsch).
-1271. Add XAA hw cursor support and update trident and glint drivers to use it
-      (#973-976,979, Alan Hourihane).
-1270. Several fixes to xterm: fix redraw errors after font changes or resizes,
-      add sunKeyboard resource, correct fg/bg test in the control sequence
-      that replies with the current SGR settings ((#972, Thomas Dickey).
-1269. Several fixes to the xterm standalone configure script (#972,
-      Thomas Dickey).
-1268. Fix to pointer movement constraints (#968, Stuart Anderson).
-
-XFree86 3.9p (15 September 1997)
-1267. Disable Image Write for HiQV chips in C&T driver (#966, David Bateman).
-1266. Add stipple accelerated functions through the ScanlineScreenToScreen
-      function (#965, Alan Hourihane).
-1255. Add ImageWrite support for the Laguna chips in cirrus driver (#964,
-      Corin Anderson).
-1254. Disable the Xserver '-config' option when run set-uid.
-1253. Have the Xservers run xkbcomp under the real user's ID.
-1252. Fix xterm's default handling of the KP_Add key.
-1251. Fix Linux-axp xdm build problem.
-1250. Fix stripping of extension from module names (so that it works OK
-      when there is a '.' in the module directory pathname).
-1249. Fix some problems in the trident driver with the 9685 programmable clock
-      and disable the GE when too little memory is available (#950,
-      Alan Hourihane).
-1248. Fix build problem with non gcc compilers (#948,949, Takaaki Nomura,
-      David Bateman).
-1247. Fix some dangling references and max MClk value in matrox driver (#951,
-      Dirk Hohndel).
-1246. Disable debugging messages in DirectColor support (Andrew Aitchison).
-1245. Fix saving video memory for glint server (Helmut Fahrion).
-
-XFree86 3.9o (9 September 1997)
-1244. Yet another fix for the problems around installing xkbcomp
-      (Michael Rohleder, David Dawes, Dirk Hohndel).
-1243. Add more acceleration for 500TX to glint server (Alan Hourihane).
-1242. Add initial acceleration for Permedia to glint server (Dirk Hohndel).
-1241. Lots of cleanups and fixes to glint server (Stefan Dirsch, Helmut
-      Fahrion, Dirk Hohndel).
-1240. Fix glint server problems on some ASUS motherboards (Stefan Dirsch).
-1239. Add Permedia support to glint server (Helmut Fahrion, Dirk Hohndel).
-1238. Several m68k related fixes (faster pic code, change Atari TT geometry),
-      fixes to not reference the undefined variable XPROJECTROOT, some glibc
-      updates (#947, Andreas Schwab).
-1237. Move some of the improvements that Mark Vojkovich made for the S3 stipple
-      code back into XAA (#945, David Bateman).
-1236. Fix problem with HW cursor disappearing on Cirrus Laguna chips (#943,
-      Corin Anderson).
-1235. Fix 24bpp XAA NonTE image text with RGB_EQUAL (#942, David Bateman).
-1234. Fix BIOS layout issues in matrox drivers. This might make Millennium
-      Rev 3 cards work (#941, Andrew van der Stock).
-1233. Improve the performance of the 24bpp fills on the 6554x machines and
-      hopefully implements a solid fill at 32bpp for the 6555x machines
-      (untested). Some cosmetic changes (#940,944, David Bateman).
-1232. Turn off CPU_TRANSFER_BASE_FIXED in SVGA/S3 driver (#939, Mark Vojkovich).
-1231. Add the correct Enable/DisableIO Ports back into the glint driver (#938,
-      Alan Hourihane).
-1230. Fix trident & mga driver for PC98. Fix XF98Conf.cpp. Resync PC98
-      Imakefiles (#935, Takaaki Nomura).
-1229. Add accelerated Image Write to C&T driver. Attempted fix for the use
-      of TMED DSTN dithering on the 65555 and 68554 chips. Small
-      documentation patch (#934, David Bateman).
-1228. Fix XF86Setup to load XFree86-VidModeExtension (#932, Takaaki Nomura).
-1227. Fix MClk limits for matrox driver (#931, Andrew van der Stock).
-1226. Fix build problem on Solaris (#929, Matthieu Herrb).
-1225. Add DacSpeed to C&T driver (#930, David Bateman).
-1224. Disable acceleration for IMA bus chips in tseng driver (#928,
-      David Bateman)
-1223. Turn Record extension into module and fix problems in XInput joystick
-      module (#927,933, Matthieu Herrb).
-1222. Add support for the ch8398 and ch8398a clockchips to the tseng driver
-      (#913,914 Gyorgy Krajcsovits).
-
-XFree86 3.9n (26 August 1997)
-1221. Lots of small fixes for xterm (#912, Thomas Dickey).
-1220. Add DirectColor visual to Matrox server (#911, Andrew Aitchison).
-1219. Disable 8x8 pattern tiling on W32 (not W32i/p) cards. Fix lowend W32p
-      cards with IMA bus. Modify linear memory code (#910, Koen Gadeyne).
-1218. Fix locale in R6.3, Fix PC98 XKB, Remove xf86ClearIOPortList() and
-      xf86AddIOPorts() from PEGC driver (#908, Takaaki Nomura, Isao Ohishi).
-1217. Remove xf86ClearIOPortList() and xf86AddIOPorts() (#907,909
-      Matthieu Herrb).
-1216. Add ET6100 support to tseng driver (#906, Koen Gadeyne).
-1215. Add wide lines to XAA (#904, Mark Vojkovich).
-1214. Add Chrontel8391CalcClock function (#903, Gyorgy Krajcsovits).
-1213. Fix output of hex numbers in chip revision (#902, Dejan Ilic).
-1212. Add accelerated Bresenham lines to tseng driver at 8bpp (#901,
-      Koen Gadeyne).
-1211. Xlib: XIMStringConversionRetrival should be XIMStringConversionRetrieval
-      (#905, Kaleb Keithley).
-1210. Official fix for potential buffer overflow in XGetErrorDatabaseText
-      (#900, Kaleb Keithley).
-1209. Fix typo in cde.rules (#899, Kaleb Keithley).
-1208. SGI threads patch update (#898, Kaleb Keithley).
-1207. Fix UNSHARED_CXXLIB for SPARCcompiler4.0 (#897, Kaleb Keithley).
-1206. Fix SPARCcompiler CCompilerMajorVersion (#896, Kaleb Keithley).
-1205. Parse junk from export lists better (#895, Kaleb Keithley).
-1204. Removes some dead or unused code in os-support (#893,  Matthieu Herrb).
-1203. Remove xf86tmpnam() from libc_wrapper and rewrites xf86tmpfile() to
-      use tmpfile() (#892,  Matthieu Herrb).
-1202. Add a separate README.OpenBSD for 3.9 (#890, Matthieu Herrb).
-1201. Move most common extensions into a module (#889, Matthieu Herrb).
-1200. OpenBSD multi-architecture support (#888, Matthieu Herrb).
-1199. Disable disables broken software/hardware cursor switching in s3/svga
-      (#887, Mark Vojkovich).
-1198. Some fixes for PC98. XF86Setup, mga driver, VideoBoards98, Cards98
-      (#886, Takaaki Nomura, Takefumi Tsukada).
-1197. Acceleration fixes for Trident and accelerated ImageWrite (#883,884,885
-      Alan Hourihane).
-1196. Bring the 3.3.1 Trident fixes into 3.9 (#882, Alan Hourihane).
-1195. Add incomplete Rendition detection code to SuperProbe (Dirk Hohndel).
-1194. Add Rendition detection to PCI code (#881, Marc Langenbach, Dirk Hohndel).
-1193. Fix to only build *.dir file for xkbcomp on make install (#880,
-      Michael Rohleder).
-1192. Add ImageWrites for s3/svga (#879, Mark Vojkovich).
-1191. Rename dashed pattern flags (#878, Mark Vojkovich).
-1190. Add ImageWrite support for XAA (#877, Mark Vojkovich).
-1189. Add MGA2164 define to vgaPCI.h (#876, Takaaki Nomura).
-1188. Extend the frame buffer test in glint_dump_regs (Stefan Dirsch).
-
-XFree86 3.9m (13 August 1997)
-1187. Add printing support to xterm (#870, Thomas E. Dickey).
-1186. Fix denial of service attack through xdm double freeing memory (#875,
-      Kaleb Keithley).
-1185. Fix Solaris build problem (#874, Takaaki Nomura).
-1184. Preliminary experimental support for the Millennium II (#852-857,
-      Andrew Vanderstock).
-1183. Recognise the rev 3 Mystique, and hopefully set everything up
-      correctly for it, change MMIO/fb mapping for Mystique rev >=3.
-      (David Dawes)
-1182. Patches to both XAA and the Glint sources that enable the
-      ScanlineScreenToScreen colour expansion (#873, Alan Hourihane).
-1181. Fix problem of xkbcomp not generating .dir files during install
-      (#872, Kaleb Keithley).
-1180. Fix problem with possible denial of service attack using the X server
-      (#867, Kaleb Keithley).
-1179. Update VidModes.sgml to latest version (#871, Eric Raymond).
-1178. Fix I128 support for AXP (#868, Robin Cutshaw).
-1177. Add planemask support to most XAA functions for all tseng chips
-      (#869, Koen Gadeyne).
-1176. Fix text rendering for W32 at 16bpp, always determine bus type, fix
-      bug in XAA color expansion (#865, Koen Gadeyne).
-1175. Fix ET6000 dram speed code, disable 32bpp on ics5301 ramdacs (#864,
-      Koen Gadeyne).
-1174. Clean up RAMDAC handling in tseng driver, extend stg1702 support, and
-      fix problems caused by treating unknown RAMDACs as AT&T compatible
-      (#862, Koen Gadeyne).
-1173. Fix support for linear memory mode on W32p rev a&b (#861, Koen Gadeyne).
-1172. Fix ET6000 black screen problem (#861, Koen Gadeyne).
-1171. Changes to Amiga XKB code (#860, Bernd Ernesti).
-
-XFree86 3.9l (31 July 1997)
-1170. Fix parsing of DPMS parameters in config file.
-1169. Catch a NULL dereference in lib/X11/lcFile.c (#843, Dirk Hohndel).
-1168. Xterm support for compound text cut and paste (#836, Kaleb Keithley).
-1166. Fix some I128 problems reported with PPro CPUs (#834, Robin Cutshaw).
-1165. Disable C&T fill at 32bpp (#831, David Bateman).
-1164. Update VideoBoard98 file (#830, 842 Takaaki Nomura, Isao Ohishi).
-1163. Prevent re-allocation of cfb ScreenPrivateIndex for multi-head
-      server (#829, Stuart Anderson).
-1162. Fix unintended changes in PCI code.
-1161. Fix handling of PS/2 protocol mice with OpenBSD (it doesn't translate
-      to BusMouse protocol like NetBSD does) (#820, Matthieu Herrb).
-
-XFree86 3.9k (29 July 1997)
-1160. Several fixes to xterm. Correct  an indexing error in the doublesize
-      character logic. Correct the logic of ShowCursor when it is painting in
-      a doublesize cell. Correct the behavior when switching to doublesize
-      characters and back again. Add cbt (back_tab) to the terminfo
-      description. Correct the logic for disabling xmc. Minor correction to
-      positioning of underlines for small (e.g., 5x8 font size. Add more
-      special-case tokens to the standalone configure script's imake-option
-      filter. Add a '--enable-logging' option for the standalone configure
-      script. Add check and ifdef's for the standalone configure script to
-      allow for building on platforms with X11R6, which lacks Xpoll.h
-      (#769,821, Thomas Dickey).
-1159. Preliminary support for Millennium on PC98 (#825, Shuichiro Urata,
-      Takaaki Nomura).
-1158. update XKB for PC98 (#825, Isao Ohishi).
-1157. Support XF86Setup for PC98 (#825, Takaaki Nomura, Kazunori Ueno).
-1156. PC98 resync (#825, Michio "Karl" Jinbo).
-1155. Add common Imakefiles for some PC98 sub directories (#825,
-      Michio "Karl" Jinbo).
-1154. Add code to fine tune memory access on ET6000 boards and cleanup some
-      W32 specific code that would write to illegal registers on ET6000 cards
-      (#818, Harald Nordgard Hansen).
-1153. Ensure accelerator CRTC registers are unlocked before writing them and
-      horizontal & vertical syncs are not disabled on mode switches (#817,
-      Marc La France).
-1152. Change xsetroot -mod option to count pixels from left to right within
-      each 16-pixel slice, instead of right to left (#817, Marc La France).
-1151. Cleanup declarations for xf86Verbose, xf86ProbeOnly & xf86ProbeFailed,
-      make VGABase XF86Config option recognized by more servers, HSkew wasn't
-      being dealt with correctly in matching modes to clocks, fixup default
-      mode for the generic VGA driver (#817, Marc La France).
-1150. Fix a few bugs in ATI driver, break it up in multiple files, add
-      support for Mach64 accelerator CTRC, which now is used by default, and
-      generic VGA (untested) (#817, Marc La France).
-1149. Fix build problem on Solaris (#810, Dirk Hohndel).
-1148. Re-enable LEFT_EDGE_CLIPPING_NEGATIVE for the HiQV chips and tidy up the
-      ScreenToScreenColorExpand stuff (#808, David Bateman).
-1147. Enable the sw_cursor option and add support for the no_accel option (#806,
-      Joe Moss).
-1146. Avoid source overruns in xf86DrawStippleScanline() and remove the
-      restrictions on TRIPLE_BITS_24BPP, LEFT_EDGE_CLIPPING
-      and LEFT_EDGE_CLIPPING_NEGATIVE_X (#805, David Bateman).
-1145. Allow keywords with underscores in XF86Setup (#802, Harald Koenig).
-1144. Explicitly enable hsync and vsync on Mach64 boards (#799, Marc La France).
-1143. Small fix for norwegian keyboard in xkb (#797, Harald Nordgard Hansen).
-1142. Add 32bpp to HiQV driver and get CopyArea and Solid Fills accelerated
-      in 32bpp (#790,796, David Bateman).
-1141. Fix clock calculation on HiQV chips (#783, David Bateman).
-1140. Fix hardware clipping and get closer to a working 8x8pattern color expand
-      (#781,811, Alan Hourihane).
-1139. Disable C&T HiQV ImageWrite (#780, David Bateman).
-1138. Change how patterns are packed for LINE_PATTERN_MSBFIRST_INCREASING
-      (#779, Mark Vojkovich).
-1137. SVGA/S3 acceleration improvements (#778, Mark Vojkovich).
-1136. Fix xclock problem that shows up on Cirrus 542x chips
-      (#777, Corin Anderson).
-1135. Small fix for C&T driver (#775,776 David Bateman).
-1134. Merge missing ViRGE code from 3.3* into 3.9* (#773, Harald Koenig).
-1133. Support for I128 DRAM cards (#816, Robin Cutshaw).
-1132. PCI updates required for the I128 server (#815, Robin Cutshaw).
-1131. Fix for Xt/Error.c (#813, Kaleb Keithley).
-1130. Make XF86Setup's keyword matching the same as the Xservers (ie,
-      ignore '_', ' ', '\t' in keywords).
-1129. Tseng documentation update (#800, 803, Koen Gadeyne).
-1128. Update to imake's auto GCC PostIncDir detection for OpenBSD
-      (#794, Matthieu Herrb).
-1127. Fix I128 problems (#792, 809, Robin Cutshaw).
-1126. Fix some errors in the symbols/th XKB file (Poonlap Veeratanabutr).
-1125. Don't use EXTRA_DEFINES in Xserver/xkb/Imakefile (#786, Kaleb Keithley).
-1124. Alternate way of fixing the "./" problem in Imake.rules
-      (#785, Kaleb Keithley).
-1123. Install full path in dynamic libraries for SCO (#782, J. Kean Johnston).
-1122. Fix remaining problems with SCO OpenServer 5 support (#772,
-      J. Kean Johnston).
-1121. Fix support for older I128 cards (#771, Robin Cutshaw).
-1120. Add detection for C&T 68554, and fix detection of the 65550 revision
-      numbers (#770, David Bateman).
-1119. Fix STG170x support in tseng driver (#766, Koen Gadeyne).
-1118. Fix linkkit install problem in apm driver (#767, Holger Veit).
-1117. Add more resolutions to xf86config (#767, Holger Veit).
-1116. Add OS/2 diagnostic on network config (#767, Holger Veit).
-1115. Fix EditRes problems that show up on OS/2 (#767, Holger Veit).
-1114. Fix a problem in OS/2's imakesvc.cmd (#767, Holger Veit).
-1113. Fix lockup when the SVGA server dumps core with the MGA driver
-      on some OSs.
-1112. Fix a bug in cfb24GetSpans which can cause a server crash
-      (StarOffice will provoke this).
-1111. Fix the use of a C++ reserved word in xf86vmode.h.
-1110. Reset the DPMS state to ON when re-entering the server's VT.
-
-XFree86 3.9j (12 July 1997)
-1109. Process Xqueue events synchronously to avoid problems with
-      accelerated servers.
-1108. Fix sqrt problems in miarc (#765, Harald Koenig).
-1107. Remove special Tk 4.0 support in XF86Setup and add C code to match the
-      latest vidmode extension changes. Fix a minor bug in the DPMS code
-      (#764, Joe Moss).
-1106. Several small fixes to Xserver/{dix,include,os/,PEX5} (#760-763,
-      Craig Groeschel).
-1105. XKB fixes (#759, Stuart Anderson).
-1104. Fix uninitialized variable (verbose) in scanpci.c (#757, Thomas Mueller).
-1103. Add big endian version of PCI config structure (#757, Thomas Mueller).
-1102. Add cross compile definitions for LynxOS and add static vga server for
-      LynxOS PowerPC (#757, Thomas Mueller).
-1101. Add bindist files for LynxOS (#756, Thomas Mueller).
-1100.
-1099. Add handling for AST onboard Mach32 card (#754, Bryan Feir).
-1098. Fix a problem in Imake.rules that shows up when using Motif.rules.
-1097. Fix MGA lockup on SVR4.0.
-1096. Add missing for Japanese "small TSU" character to the XKB
-      symbols/jp file (#751, Shigehiko Sasaki).
-1095. Fix ET4000/W32i acceleration at 16 and 24bpp, and accelerate colour
-      expansion at 16bpp and 24bpp for the W32p (#747, Koen Gadeyne).
-1094. Fix for I128 rev 2 chips (#746, Robin Cutshaw).
-1093. Fix typo in xf86_libc.h.
-
-XFree86 3.9i (6 July 1997)
-1092. Fix apm HW cursor problem at VT switch, and a problem with
-      screen-to-screen bitblts (#745, Henrik Harmsen).
-1091. VidMode extensions updates, including adding a new function to
-      return the available clocks, and how many more clocks can be programmed,
-      add the HSkew parameter and some reserved fields (this introduces
-      a protocol incompatibility), and fix a bug in the ValidateModeLine
-      function's clock checking (#744, Joe Moss).
-1090. Add port probing to SuperProbe for the Alliance 6410, 6422 and AT24
-      (#743, Joe Moss).
-1089. Add similar ET6300 detection to scanpci and vgaPCI.h.
-1088. Fix SuperProbe's ET6000 memory probe (#742, Koen Gadeyne).
-1087. Add detection for the ET6100 and ET6300 to SuperProbe (#742,
-      Koen Gadeyne).
-1086. Some PCI video cards don't have the expected "IBM" string in the
-      BIOS, so look for the "PCI" string too.  Without this, scanning with
-      -nopci fails for some cards (#741, Koen Gadeyne).
-1085. Possible fix for XWarpCursor() not working with the XInput
-      xf86PostMotionEvent() function (#740, Michael Rohleder).
-1084. Add some "test-support" code to xterm, which is not enabled by
-      default (#739, Thomas E. Dickey).
-1083. Fix ET4000W32p RAMDAC detection (backs out most of #717), make
-      the tseng driver use DELAYED_SYNC, and an (unsuccessful) attempt
-      to get CPU-to-screen colour expansion working (#737, Koen Gadeyne).
-1082. Add missing valuator initialisation to the OS/2, SCO and Xqueue
-      MouseProc() functions.  This fixes the mouse problems on those OSs
-      (#736, 738, Holger Veit and Richard Coley).
-1081. Fix a misplaced va_end() in the recent XInput code which caused a core
-      dump on OS/2 (#736, Holger Veit).
-1080. Fix SummaSketch bug that shows up with newer XInput code, add
-      a missing conversion_proc, fix misplaced break, and add new config
-      options to the SummaSketch subsection for ActiveArea and ActiveOffset
-      (#735, Steven Lang).
-1079. Fix a problem with xterm's cursor colour versus the background, and
-      remove a duplicate initialisation of the cursor's GC (#734,
-      Thomas E. Dickey).
-1078. Fix XAA's bpp setting at 24bpp (#733, Mark Vojkovich).
-1077. Fix cpp script problem on AIX (#732, Kaleb Keithley).
-1076. Fix xhost core dump that can happen if no hosts are authorised
-      (#731, Kaleb Keithley).
-1075. Glint driver updates (#729, 730, Alan Hourihane).
-1074. Move the solx86usleep() function out of solx86_init.c into a separate
-      file, which should fix the problems addressed by #726.
-1073. Add ANSI-C wrappers (#724, Holger Veit).
-1072. Update recent config and libX11 changes for OS/2 (#724, Holger Veit).
-1071. Fix and enable ET4000W32i acceleration, and fix unmap bug in the
-      ET6000 memory probe (#723, Koen Gadeyne).
-1070. Replace fdflush() in the Summa and AceCad drivers with tcflush
-      (#722, Steven Lang).
-1069. SCO support updates (#721, J. Kean Johnston).
-1068. Add some more dead accents to the 'se' xkb layout (#718, Dejan Ilic).
-1067. Merge in TOG's X11R6.3 public patch 2.
-
-XFree86 3.9h (30 June 1997)
-1066. Don't call seteuid in the server when the real uid is root.  This
-      fixes a problem of not getting a core file under some FreeBSD versions.
-1065. Tseng driver cleanups (#717, Koen Gadeyne).
-1064. 'xset dpms 600 0 0' complains about 600 being greater than 0.
-1063. New XInput driver for the AceCad ADVANCEDigitizer (#716, Shane Watts).
-1062. Clean up some problems with the xf86 wrappers (#715, Matthieu Herrb).
-1061. New Xinput driver for MicroTouch TouchPen touch screen (#714,
-      Patrick Lecoanet).
-1060. Changes for E281-2310 and fully compatible controllers in the
-      Elographics driver (#714, Juergen P. Meier).
-1059. Elographics driver updates (#714, Patrick Lecoanet).
-1058. Fix ROP bugs in the svga/s3v driver (#713, Harald Koenig).
-1057. Fix a malloc/free bug which can cause the Xserver to crash when
-      an lbxproxy terminates.
-1056. Change default compression level in lbxproxy (#710, Kaleb Keithley).
-1055. Xt/Error.c update (#708, Kaleb Keithley).
-1054. LibXext cleanups (#707, Kaleb Keithley).
-1053. Config updates (#706, Kaleb Keithley).
-1052. Add PreviousCandidate and MultipleCandidate keysyms (some new Japanese
-      keyboards have these keys) (#705, Kaleb Keithley).
-1051. Fix some xterm bugs (#700, Thomas E. Dickey).
-1050. Initial part of implementing VT100 doublesize characters for xterm
-      (#700, Thomas E. Dickey).
-1049. First stab at adding dlopen() style loader (#712, Matthieu Herrb).
-1048. Add further acceleration to the GLINT server (mostly disabled) (#711,
-      Alan Hourihane).
-1047. Add support for I128 Series II Rev 2 chips (#704, Robin Cutshaw).
-1046. Additions to the apm driver. Add support for AT3D, acceleration for
-      8,16,32bpp (for AT3D and AT24, filled rectangles, screen-screen bitblts,
-      host-screen color expansion bitblts for text). DPMS support, hardware
-      cursor code (also in 8bpp), use programmable clock, set MCLK to 57.3
-      MHz on AT3D, various bugfixes and cleanups (#702, Henrik Harmsen).
-1045. Fix problems with displaying card READMEs in XF86Setup (#701, Dirk
-      Hohndel).
-1044. Add left-edge clipping to s3_newmmio. There's bug in both the scanline
-      screen->screen and CPU->screen stipple fallback routines though.  Both
-      break certain patterns and the screen->screen bug is worse than the
-      CPU->screen one (#694, Mark Vojkovich).
-1043. Enables the XInput modules from 3.2 to be loaded as modules in
-      XF86_LOADER (#693, Matthieu Herrb).
-1042. Add code to have XAA check to see if a stipple can be reduced to an 8x8
-      pattern before banishing it from the pixmap cache on account of it's
-      size (#692, Mark Vojkovich).
-1041. Fix CapNotLast problem in dashed line code (#686, Mark Vojkovich).
-1040. Add stippled fill fallback for SVGA/S3 if the pixmap cache is too small
-      (#685, Mark Vojkovich)
-1039. Fix for xf86initac,c so that drivers can specify their own WriteBitmap
-      functions and fallbacks for non-cachable stippled fills. This also
-      allows usage of both CPU->screen and scanline screen->screen color
-      expansion instead of one or the other (#684, Mark Vojkovich).
-1038. Some Xlib fixes (#687-690, 695-699, Kaleb Keithley).
-1037. XKB updates (#674, 675, 709, Kaleb Keithley).
-1036. Config updates to make use of change 1033 (#673, Kaleb Keithley).
-1035. Fix a typo in the XKB symbols/hu file and add an entry for it in
-      the rules/xfree86.lst file (Peter Soos).
-1034. Fix a bug in Xt/Error.c that can result in partially duplicated
-      error/warning messages.
-
-XFree86 3.9g (20 June 1997)
-1033. Changes to imake to determine LinuxCLib*Version,
-      LinuxBinUtilsMajorVersion and PostIncDir at build time (#673,
-      Kaleb Keithley).
-1032. Fix SEGV in solx86's xf86MapVidMem() when called without first
-      calling xf86LinearVidMem() (David Thompson).
-1031. Fix for pci detection code in S3 server (#683, Harald Koenig).
-1030. Fix problems with rop -1 in S3V server (#679,681,682, Huver Hu, Harald
-      Koenig).
-1029. Fix cache expansion routine for HARDWARE_PATTERN_NOT_LINEAR (#680,
-      Mark Vojkovich).
-1028. Add "no_split_xfer" option to S3 server (#678, Harald Koenig).
-1027. Fix bug in xterm. Logout records should contain '\0' as first char
-      in user name (#676, Alex Belits).
-1026. Fix color problems on S3 cards with Ti3026 for SVGA/S3 (#671,
-      Achim Oppelt).
-1025. Adapt code to future changes in NetBSD's (and OpenBSD's?) mmap
-      semantics (#670, Matthieu Herrb).
-1024. Fix xterm's op termcap entry, and shorten the entry so it fits within
-      the 1024 character limit.
-1023. Actually include changes 963-965.
-1022. Add accelerated server for cards based on 3DLabs GLINT chipsets. This
-      server is known to work on Elsa GLoria L cards on most motherboards.
-      It does not support any other cards at this time. This work was
-      sponsored by S.u.S.E., Elsa, and SNI (Alan Hourihane, Stefan Dirsch,
-      Dirk Hohndel).
-
-XFree86 3.9f (16 June 1997)
-1021. Fix some build problems with 3.9e.
-
-XFree86 3.9e (15 June 1997)
-1020. Add some more I128 acceleration, including pixmap cache, rectangle
-      fills and line drawing (#669, Robin Cutshaw).
-1019. Fix a compile problem that shows up with GLX isn't enabled
-      (#668, Frederic Lepied).
-1018. If the Wacom driver isn't supplied with a value for the Suppress
-      option it is calculated to report motions according to the screen
-      resolution (#668, Frederic Lepied).
-1017. Fix a bug in the XInput Wacom driver which prevented the eraser from
-      working (#668, Frederic Lepied).
-1016. Add a virtual XInput device called "Switch" which sends extended
-      motions when a different device sends a core event (with AlwaysCore
-      enabled (#668, Frederic Lepied).
-1015. Fix behaviour of XInput relative devices.  They send events with
-      accumulated valuators not with valuators deltas (#668, Frederic Lepied).
-1014. XInput devices with AlwaysCore enabled send both core and extended
-      events at the same time (#668, Frederic Lepied).
-1014. Move HP's HPkeysym.h (#667, Kaleb Keithley).
-1013. Fix a bad include in FS.h (#666, Arthur Barstow).
-1012. Add the mechanism to acknowledge the new DacSpeed[] values to the
-      svga/s3 driver.  Only the Trios use it so far (#665, Mark Vojkovich).
-1011. Fix(?) Truecolor depths for the Ti 3026/3030 ramdacs in the svga/s3
-      driver (#665, Mark Vojkovich).
-1010. Fix a logic bug in the XAA code that checks to see if there is
-      enough room for 8x8 patterns in the pixmap cache (#664,
-      Mark Vojkovich).
-1009. Changes to vga256/vga to allow the NV1 driver to work without
-      requiring any VGA functionality (#663, David McKay).
-1008. Resync the MGA driver with 3.3 (#660, Radoslaw Kapitan).
-1007. Lots of updates to the svga/ati driver (#659, Marc Aurele La France).
-1006. Update support for ATI Rage II+, Rage Pro in the Mach64 server, scanpci,
-      and SuperProbe (#659, Marc Aurele La France).
-1005. Remove man pages for VGA16 and Mono servers (#659,
-      Marc Aurele La France).
-1004. Fix duplicate target in drivers/s3/Imakefile (#658, Robin Cutshaw).
-1003. Fix some Xprt problems (#655-657, Kevin Samborn).
-1002. Fix some DPMS problems, including problems when the DPMS timeouts
-      are smaller than the screensaver cycle time, and problems with the
-      various DPMS setting not being re-initialised at server reset.
-1001. Fix an InfoRec initialisation problem in xfree68/fbdev (#652,
-      Andreas Schwab).
-1000. Fix incorrect links created from nls/XLC_LOCALE to xc/exports
-      (#652, Andreas Schwab).
- 999. Fix a flaw in a libX11 security fix (#652, Andreas Schwab).
- 998. Add libc 6 config for Linux/m68k to Linux.cf (#652, Andreas Schwab).
- 997. Allow depth-specific Dacspeeds to work for the tseng driver
-      (#651, Koen Gadeyne).
- 996. Tseng driver cleanups (#650, Koen Gadeyne).
- 995. Allow xterm to start when /etc/termcap is missing, and fix some
-      configure script nits (#649, Thomas E. Dickey).
- 994. Fix twm crash if interrupted during startup (#644, Wolfram Gloger).
- 993. Fontlib fixes (#636-640, 642, 646, 648, Arthur Barstow).
- 992. Add audit logging to xfwp (#623, Kaleb Keithley).
- 991. Sun/XKB keyboard fix (#621, Kaleb Keithley).
- 990. Update xrx defaults (#620, Kaleb Keithley).
- 989. Fontserver fixes (#613, 643, Arthur Barstow).
- 988. Imake config updates (#610-612, 614-617, 619, 624, Kaleb Keithley).
-
-XFree86 3.9d (10 June 1997)
- 987. Fix "xaa_no_color_exp" option for scanline-screen-to-screen color
-      expansion (#629, Koen Gadeyne).
- 986. Add hint how to disable building Xprt to xf86site.def (#627, Koen
-      Gadeyne).
- 985. Change Linux to use -D_REENTRANT (#644, Wolfram Gloger).
- 984. Fix C&T driver to be more strict about DClk and MClk limits for HiQV
-      chips (#645, David Bateman).
- 983. Fix I128 server (#635, Robin Cutshaw).
- 982. Fix VT switching problems in mga driver (#634, Guy Desbief).
- 981. Fixes for xterm (missing part of install-rule, incorrect assignment for
-      --enable-color-mode option, unexpected cursor color change while
-      scrolling) (#632,633, Thomas Dickey).
- 980. Fix a problem where the Tseng memory mapped registers get cleared in
-      vgaScreenInit() when it is clearing the screen as startup.  This only
-      happened for 8bpp with linear mode enabled (#630, OEyvind Aabling).
- 979. Avoid nested asm calls for SVR4.0 (#631, Takaaki Nomura).
- 978. Fix error messages when loading modules in the static server (#626,
-      Matthieu Herrb).
- 977. Change svga/s3 into two separate modules s3_pio and s3_newmmio. This
-      doesn't work with the static server at this point. Add linear
-      addressing and 16/24(packed)/32bpp. Add pci_retry option. (#625,
-      Mark Vojkovich).
- 976. Allow the ChipId and ChipRev values to be overridden from the XF86Config
-      for the Mach64 server.
- 975. Fix some 1bpp and 4bpp problems (#609, Marc Aurele La France).
- 974. Changes to allow SuperProbe, Mach64 driver, scanpci and vgaPCI to
-      detect the newer ATI 3D Rage II+ chips (#609, Marc Aurele La France).
- 973. Allow the server side of the multibuffer extension to compile (#609,
-      Marc Aurele La France).
- 972. Continue removal of the XF86_VGA16 & XF86_Mono servers (#609,
-      Marc Aurele La France).
- 971. Add some new keywords to xf86_Config.h (#608, Stuart Anderson).
- 970. Fix problem building the PC98 loader server (#607, Takaaki Nomura).
- 969. Fix xdm/Imakefile for OpenBSD (which doesn't have libcrypt)
-      (#606, Matthieu Herrb).
- 968. Fix default value for xf86bpp (David Dawes, Dirk Hohndel).
- 967. Some cleanups to tseng driver, re-apply the STG1700 RAMDAC changes and
-      re-introduce some 1/4bpp checks (#605, Koen Gadeyne).
- 966. Fix a few typos in tseng.sgml (#605, Koen Gadeyne).
- 965. Automagically select the correct protocol for PS/2 mice at startup
-      with XF86Setup (#604, Dirk Hohndel).
- 964. Fix XF86Setup to follow links that point to non-existing files (so that
-      it creates /var/X11R6/bin/X if necessary (#604, Dirk Hohndel).
- 963. Fix XF86Setup to allow reading the right README files for cards using
-      the SVGA server (#604, Dirk Hohndel).
- 962. Fix small problem with installing the LinkKit (#603, Geert Uytterhoeven).
- 961. Fix 8x8 pattern cache size checking (#602, David Bateman).
- 960. Remove old (pre-XAA) acceleration from C&T driver (#601, David Bateman).
- 959. Two small fixes in C&T driver for "use_vclk1" option and ImageWrites
-      (#600, David Bateman).
- 958. Add C&T 65555 detection to SuperProbe and SVGA server; treat it
-      basically like a 65550 but attempts to use the TMED features (untested)
-      (#600, David Bateman).
- 957. Fix build problems in tseng_driver.c (#599, David Bateman).
- 956. Fix XF86Setup build problem (#598, Takaaki Nomura).
- 955. Fix yet another fontserver problem (#597, Arthur Barstow).
- 954. Remove bogus changes to xc/Imakefile (Dirk Hohndel).
- 953. Fix incorrect define for DGA (Steve Kump).
-
-XFree86 3.9c (3 June 1997)
- 952. Fix a problem with the HW cursor being drawn in the overscan area
-      with the svga/s3v driver and cleanup some of the register
-      save/restore (#585, Harald Koenig).
- 951. Disable the banked-mode speedups for the Tseng driver when running
-      in linear mode (#584, David Bateman).
- 950. Fix for CR53 not being restored unless xf86Verbose > 1 in the svga/s3v
-      driver (#572, Sebastien Marineau).
- 720. Fix problems restoring some non-standard text modes for the Millennium
-      (#571,573, Radoslaw Kapitan, #574, Ansgar Hockmann).
- 948. Fix svga/s3v panning at 24bpp (#570, Harald Koenig).
- 947. Fix S3V panning at 24bpp (#569, Harald Koenig).
- 946. Fix misleading messages in the svga/s3v driver when the SVGA server
-      is started with a non-ViRGE S3 card (#568, Sebastien Marineau).
- 945. Alternate S3V 32<->24 bpp translation to avoid unaligned traps
-      on Alpha platforms (#567, Harald Koenig).
- 944. Disable 8x8 pattern fill when less than 8 scanlines are available
-      in the XAA pixmap cache (#566, David Bateman).
- 943. Fix a screen restore problem for the Mystique when the server is
-      started with '-probeonly' (#559, Radoslaw Kapitan).
- 942. Turn the monitor back on after DPMS has done its thing for
-      OSs where the input devices are not selectable (558, Jack Thomasson).
- 941. Fix some incorrect ROP definitions in the C&T driver (#557,
-      David Bateman).
- 940. Fix some text font corruption for the S3 Trio64 (#549,554 Harald Koenig).
- 939. XF86Setup carddata updates (#547, Koen Gadeyne, #552, Matthieu Herrb).
- 938. Modify xon to use the fully qualified hostname on Linux (#544,
-      Burchard Steinbild, Dirk Hohndel).
- 937. Exclude ROPs with no source from XAA CopyPlane functions (#538,
-      David Bateman).
- 936. Mach32 updates, including accepting '-bpp 15' and increasing the
-      16bpp clock limit for the 68875 ramdac to 80MHz (#536, Bryan Feir).
- 935. PC98 doc updates (#535, Takaaki Nomura).
- 934. Fix for an S3V server problem at 16bpp introduced in change 650
-      (#532, Huver Hu).
- 933. Further fix for Mystique problems when VT switching (#531,
-      Radoslaw Kapitan).
- 932. Fix a blit bug with the ViRGE chip in the svga/s3v driver which
-      shows up with xv rubber-banding (#529, Sebastien Marineau).
- 931. Fix a blank screen problem when switching back to the Xserver
-      from a text VT with the Mystique (#520, Radoslaw Kapitan).
- 930. Some minor Tseng code cleanups (#519, Koen Gadeyne).
- 929. Add a timeout to the MGA Sync() function (#518, Radoslaw Kapitan).
- 928. Map only the amount of video memory present in the MGA driver
-      rather than always 8MB (#516, Radoslaw Kapitan).
- 927. Disable the HW cursor in the tseng driver when entering DGA mode
-      (#514, Koen Gadeyne).
- 926. Fix a S3V server text console corruption problem when running at 24bpp
-      (#513, Kevin Brosius).
- 925. Update NetBSD/OpenBSD docs (#512, Matthieu Herrb).
- 925. Update Cirrus docs (#509, Harm Hanemaayer).
- 924. Change Tseng memory mapped registers to volatile (#507, Koen Gadeyne).
- 923. Disable Tseng 24bpp for CH8398 RAMDAC (#507, Koen Gadeyne).
- 922. Update docs to reflect change 643 (#507, Koen Gadeyne).
- 921. Re-enable Tseng 8bpp+linear+accel combination (#507, OEyvind Aabling).
- 920. Update mga docs (#502, #503, Radoslaw Kapitan).
- 919. Fix font and LUT corruption on VT switch for the svga/s3v driver
-      (#497, Harald Koenig).
- 918. Fix some acceleration bugs in the TGUI driver (#495,496, Alan Hourihane).
- 917. Updates to the I128 server for Alpha platforms (#494, Robin Cutshaw).
- 916. Fix a Mystique colour problem when switching VTs (#488, Guy Desbief).
- 915. Fix a bug in Mystique memory detection (2MB was detected as 4MB)
-      (#482, Radoslaw Kapitan).
- 914. Merge in simple dashed horizontal and vertical line drawing in the
-      S3V server into s3line.c, and use this for 24/32bpp (#474, Huver Hu).
- 913. Modify the S3V server to advertise a 32 bits-per-pixel pixmap
-      format to clients, and translate to/from packed 24bpp when accessing
-      the framebuffer.  This allows a lot of clients which didn't know
-      how to handle the 24 bits-per-pixel pixmap format to work
-      (#474, Huver Hu).
- 912. Start cleanup of depth/bitPerPixel usage in the SVGA server.  xdpyinfo
-      should now report the correct information (#472, Mark Vojkovich).
- 911. Change chiprounding from 128 to 64 in 8bpp for the Mystique, which
-      allows 1600x1200x8 on 2MB boards (#467, Radoslaw Kapitan).
- 910. Position the tseng accel scratchpad area correctly (#461, Koen Gadeyne).
- 909. Fix a problem with the W32 server that causes it to hang with
-      W32i cards (#456, Koen Gadeyne).
- 908. Save the initial state of bit 7 of CR58 in the S3, S3V servers and
-      svga/s3v driver, and change the "ras_precharge" option to allow it
-      to be turned on or off (#458, Harald Koenig).
- 907. Enable the clockchip in the tseng driver by default when a suitable
-      RAMDAC/clockchip is found (#448, Koen Gadeyne).
- 906. Fix text mode restore with ViRGE (#443, Harald Koenig).
- 905. Add CH8398 probing to XF86_W32 (#439, Kurt Olsen).
- 904. Add STG1702 probing to XF86_W32 (#434, Stuart Lamble).
- 903. Fix blitbug widths in SVGA/S3V and S3V servers, enable the hardware
-      cursor in doublescan mode in SVGA/S3V server, fix the 24bpp problem in
-      SVGA/S3V server when mode switching (#432, Sebastien Marineau).
- 902. Disable 24bpp on the STG1700, new "default" linear memory base for W32p
-      cards, fix STG170x problems (#430 Koen Gadeyne).
- 901. Add MODULEVENDORSTRING to the ModuleVersionInfo (#423, Stuart Anderson).
- 900. Finetuning for Miro 80SV support. Add "no_pci_disconnect" Option
-      (for some Alpha boxes, Alphastation255 and UDB) (#416, Harald Koenig).
- 899. Fix several problems with the tseng driver. Don't allow pixmux modes
-      in the VGA16 or MONO server (it doesn't work), disable the combination
-      8bpp + linear + acceleration, fix maximal pixel clock for W32p, fix
-      cut'n'paste bug where CRTC 0x31 was restored incorrectly, update the
-      XF86_SVGA manual pages (#414,415, Koen Gadeyne).
- 898. NetBSD and OpenBSD doc updates (#412, Matthieu Herrb).
- 897. LynxOS documentation updates (#411,537 Thomas Mueller).
- 896. LynxOS microSPARC fixes (#410, Thomas Mueller).
- 895. Small fixes for dacspeed and set_mclk code in the S3V server (#401,
-      Harald Koenig).
- 894. Fix text mode restauration in S3V server (#400, Harald Koenig).
- 893. Some misc bug fixes (#395, Harald Koenig).
- 892. Change clock limits for S3 /DX and /GX chips to 170/170/135 based
-      on information from S3 (#395, Harald Koenig).
- 891. Add detection and higher clock limits for MELCO S3 ViRGE card
-      (#395, Harald Koenig).
- 890. Add set_mclk for S3V and S3/Trio64 (#395, Harald Koenig).
- 889. Add support for specifying DACSpeeds separately for 8/16/24/32bpp
-      (#395, Harald Koenig).
- 888. Fix module handle leak in LoaderOpen (#393, Eric Nygren).
- 877. Add Mach8 and 8514 to loader server (#387,394, Hans Nasten).
- 876. More 68k loader updates (#380, Alan Hourihane).
- 875. Some updates to the S3 server (#374, Harald Koenig).
- 874. Fix some hangs on C&T 65550/65554 (#370, David Bateman).
- 873. Several OS/2 fixes: Add the creation of host.def if not present. Get
-      errno declared correctly. Add missing commandline options (#403,405
-      Holger Veit).
- 872. Fix a problem in the tseng driver which was causing it to fail at >8bpp
-      with the STG1700 RAMDAC (#594, Koen Gadeyne).
- 871. Tseng doc updates (#594, Koen Gadeyne).
- 870. Enable shadow passwords by default for xdm on Linux-Elf.
- 869. Fix Xrm buffer overflow in Xprint ddx (#591, Kaleb Keithley).
- 868. Fix for incorrect handling of negative values in cfb (#586, Harald
-      Koenig).
- 867. Fix for fontserver accessing NULL pointer (#587, Arthur Barstow).
- 866. A better fix for change 862 (#590, Kaleb Keithley).
- 865. Fix the incorrect resetting of the HW cursor hotx/hoty values at
-      VT switch in most servers/drivers that support HW cursor
-      (based on #582, OEyvind Aabling, #588, Dejan Ilic).
- 864. Fix for Xlib/Xt buffer overflows which can be triggered by long
-      $LANG and related environment variables (#576, Alex Belits).
- 863. Cards db updates (#583, Dirk Hohndel, Harald Koenig).
- 862. Fix for NULL dereference in XtOpenApplication/XtAppInitialize.
-      This also makes these functions behave as documented (ie, exit
-      when the display open fails).
- 861. Some man page updates.
- 860. Refine change 856 to take into account that some forms of 8x8
-      pattern fill only need one scanline in the XAA pixmap cache
-      (#581, David Bateman).
- 859. Remove some unneeded <locale.h> includes in libXp and XKB (libX11)
-      (#579, 580, Kaleb Keithley).
- 858. Fix a problem that can cause xfs to crash after running for a while
-      (#578, Arthur Barstow).
- 857. Fix a problem with xfs that meant it could be killed by interrupting
-      one of its clients (#575, Arthur Barstow).
- 856. Disable 8x8 pattern fill when less than 8 scanlines are available
-      in the XAA pixmap cache (#566, David Bateman).
- 855. Fix some sgml problems in fbdev.sgml (#564, Matthieu Herrb).
- 854. Cards db updates (#548, Koen Gadeyne, #552, Matthieu Herrb,
-      #555, Harald Koenig).
- 853. Make the TGA server us the same black/white pixel defaults as the
-      others, and make it honour the flippixels flag (#551, Alan Hourihane).
- 852. Updates for the VGADriverDoc sample stub driver (#546, Harald Koenig).
- 851. Fix uninitialised variables in xeyes which can cause it to crash
-      on Alpha platforms (#546, Harald Koenig).
- 850. Fix a problem where XAA calls accel text functions with a ROP that
-      has no source by rechecking the text function when the ROP is changed
-      in the gc (#543, David Bateman).
- 849. Fix an xterm autoconf problem (#541, Thomas E. Dickey).
- 848. Add support for ICD2061 programmable clock in the pvga1 driver,
-      as used by Diamond Speedstar 24X cards (#539, Torsten Duwe).
- 847. Fix XAA cap style problem with thin lines that shows up with the
-      MGA driver (#540, Radoslaw Kapitan).
- 846. Update the Cards db for ViRGE cards (#534, Sebastien Marineau).
- 845. PC98 doc updates (#530, Michio "Karl" Jinbo).
- 844. Implement the Get/SetViewPort() functions in the VidMode extension
-      (these were already documented).
- 843. Fix some client/server protocol mismatches in some newer VidMode
-      extension functions, and allow new clients to not fail with
-      servers that don't have these fixes.  The extension version has
-      been bumped to 0.8.
- 842. Allow xconsole to handle regular files (it could in our R5-based
-      releases, but this was lost when we moved to R6).
- 841. Updates of tgetent for terminfo vs termcap for resize (#527,
-      Thomas E. Dickey).
- 840. Add aixterm-style 16 colour support to xterm (#527, Thomas E. Dickey).
- 839. Make sure the port number is printed in host byte order in Xserver
-      AUTH warning messages (#525, Marc W. Eichin).
- 838. Stop xterm from setting the TERMCAP environment variable when
-      using terminfo (#523, Mark W. Eichin).
- 837. Remove '.' from DefaultUserPath (#517, Per Fogelstrom).
- 836. Add more ET6000-based cards to the Cards db, and make ET6000 and
-      ET4000w32i/p cards point to the SVGA server instead of the W32 server
-      (#515, Koen Gadeyne).
- 835. Remove '-m486' from the default gcc options.
- 834. Add detection of other variants of the Cyber9385 to the trident
-      driver and SuperProbe (Arthur Tateishi and Alan Hourihane).
- 833. Change the SVGA server to tell DGA clients that the memory available
-      is InfoRec.videoRam rather than ChipLinearSize (which is often
-      too large).
- 832. Cards db updates (#511, Harm Hanemaayer).
- 831. Fix LynxOS inconsistent TERMCAP use by xterm and resize ($504,
-      Thomas Mueller).
- 830. Fix a duplicate declaration in imConv.c that shows up when building
-      without XKB support, and remove a "Const" from the declaration
-      (#505, David A. Koontz).
- 829. Remove all local symlinks for 'make clean' in lnxLib.rules.
- 828. Add an autoconf configuration script for xterm.  This isn't used
-      in the standard build process, but is useful when building xterm
-      standalone (#500, Thomas E. Dickey).
- 827. Fix a problem in the RECORD server extension where the last ClientDied
-      is never flushed (#498, Kaleb Keithley).
- 826. Fix array bounds problem in dixutils.c (#493, Kaleb Keithley).
- 825. Fix Xserver crash in SHAPE extension (#492, Kaleb Keithley).
- 824. Fix typos in NetBSD.cf and OpenBSD.cf (#491, Takaaki Nomura).
- 823. Update sun.cf with the version numbers of more recent Sun ProWorks
-      compilers (#489, William Austin).
- 822. TOG fix for the lib/X11 -xrm buffer overflow (#487, Kaleb Keithley).
- 821. XInput doc updates (#486, Frederic Lepied).
- 820. Fix SuperProbe's memory size detection for the ATI 264VT-B, 264GT-B,
-      264LT and above, and fix SuperProbe's detection of the 264LT
-      (#481, Marc Aurele La France).
- 819. New entries for the Monitors db (#478, collected by Andrew Vanderstock).
- 818. Enable building support for the NetBSD/OpenBSD/Solaris aperture
-      drivers by default.
- 817. Have postinst.sh optionally install a link in /usr/bin to rstartd.
- 816. Change the name of the saved ids feature test macro in xterm to
-      be more accurate.
- 815. Enable colour in the default XTerm app-defaults file, and include
-      the colour-related resources there.
- 814. Update SOLX86 docs (#477, Matthieu Herrb).
- 813. Update the Xservers to check for /dev/xsvc before /dev/fbs/aperture
-      on Solaris (#477, Matthieu Herrb).
- 812. Fix XAA stipple ScreenToScreen colour expansion, and fix a problem
-      with stipples when ONLY_TRANSPARENCY is flagged (#476, David Bateman).
- 811. Fix Xlib ctstowcs parser mishandling charset escape sequences in
-      COMPOUND_TEXT (#470, Kaleb Keithley).
- 810. Fix the -ar1 and -ar2 Xserver flags breaking XKB auto-repeat (#469,
-      Kaleb Keithley).
- 809. Add a backward-compatibility option to disable the recent XtMalloc
-      changes (#468, Kaleb Keithley).
- 808. Bump the revision number of SuperProbe (#462, Koen Gadeyne).
- 807. Add ICS5341 and ISC5301 SDAC/Gendac detection to SuperProbe (#462,
-      Koen Gadeyne).
- 806. Fix negative offsets in pixmap during stipple fill (#460,
-      Radoslaw Kapitan).
- 805. Fix the layout of the mouse protocol buttons in XF86Setup.  XF86Setup
-      now requires Tk version 4.1 or later (#459, Matthieu Herrb).
- 804. Install rstartd in /usr/X11R6/bin rather than in /usr/bin.
- 803. Fix a DGA addressing problem in the S3 server (#457, Mark Vojkovich).
- 802. Remove the part of the PCI config-type detection that seems to switch
-      some Neptune-based machines from type 1 to type 2.
- 801. xtest update for OpenBSD (#455, Matthieu Herrb).
- 800. Only show Xinput initialisation messages once (#454, Matthieu Herrb).
- 799. Add support for the IntelliMouse protocol to xf86config and XF86Setup.
- 798. Fix a problem in the Xservers where the DPMS timer code can cause
-      select() can get called with a negative timeout value (and get stuck
-      in an infinite loop) (#453, Van Jacobson).
- 797. OS/2 updates (including docs) (#452, Holger Veit).
- 796. Doc updates (#450, Matthieu Herrb).
- 795. Fix the trident driver to make virtual resolutions work for the
-      TGUI96xx/Cyber chips and make 32bpp available to these chips too.
-      Also, update the clock code for these chips to allow higher
-      resolutions (#386, Alan Hourihane).
- 794. Disable the svga/s3v register dumps except for xf86Verbose > 1.
- 793. Fix the svga/s3v driver Probe() to not falsely assume a ViRGE card
-      is present in some circumstances.
- 792. Add some new entries for the ServerFlags section to allow some
-      control of the code used to determine the PCI config type on
-      Intel platforms.
- 791. Fix handling of the "line" parameter for the scroll-forw/scroll-back
-      actions in xterm, and add entries to the XTerm app-defaults to
-      use buttons 4 and 5 (as generated by the wheel on the IntelliMouse)
-      for scrolling.
- 790. Add debugging messages to the PCI probe code.  These are enabled
-      when xf86Verbose > 2.  Also, try scanpci's method of detecting PCI
-      config type 1 when the other method fails.
- 789. Fix DeviceButtonMotion (#437, George Sachs).
- 788. Fix for SuperProbe dumping core on NetBSD (#433, Matthieu Herrb).
- 787. Fix fbdev.c and update documentation (#428, Geert Uytterhoeven).
- 786. mga/README updates (#419, Radoslaw Kapitan, #431, Guy Desbief).
- 785. xtest fixes, and updates for Linux (Harald Koenig).
- 784. MGA doc updates (#447, Guy Desbief).
- 783. Fix the Xt TopLevelShell's XtNiconic resource (Sekhar Makkapati).
- 782. Tseng doc updates (#445, Koen Gadeyne).
- 781. Tseng doc updates (#421, Harald Nordgard Hansen).
- 780. Change the behaviour of XtMalloc, XtCalloc and XtRealloc when
-      Malloc0ReturnsNull is set to YES so that they conform to the
-      Xt spec (#444, Kaleb Keithley).
- 779. Fix for buffer overflows in libX11's GetDatabase().  This can be
-      used to exploit setuid programs linked against libX11
-      (#442, Harald Nordgard Hansen).
- 778. Doc updates (#441, Takaaki Nomura).
- 777. Doc updates (#440, Thomas Mueller).
- 776. Modify some messages in the svga/s3v driver (#443, Harald Koenig).
- 775. Undo change 623; the post dividers were incorrect (#435, Marc Aurele
-      La France).
- 774. Move the Tk/Tcl include dirs after all the others in the XF86Setup
-      Imakefile to make sure they don't cause installed X headers to be
-      incorrectly used.
- 773. Add CH8398 RAMDAC detection to SuperProbe (#418, Kurt Olsen).
- 772. Fix an error in xterm's vt220 emulation: the DECUDK is only supposed
-      to be interpreted for _shifted_ function keys (#384, Thomas E. Dickey).
- 771. Patch to GLX comment/example in xf86site.def (#409, Henry Worth).
- 770. Improve handling of screen pitch for accelerated C&T driver (#407,
-      David Bateman).
- 769. Add support for the Miro 80SV to the S3 server (#406, Harald Koenig).
- 768. Fix bmtoa, smproxy, twm, xsm and Xprint to use mkstemp, if available,
-      to avoid the mktemp() race condition (#404, Matthieu Herrb).
- 767. Several updates XInput: Add always core feature to mouse driver. Add zone
-      configuration for the wacom driver (TopX, TopY, BottomX, BottomY). Add
-      KeepShape option for the wacom to respect the ratio of width/height
-      |of the screen. Add multiple active zones on the same tablet. Add
-      checks not to send core button events when multiple devices control the
-      core pointer. Fix problem in the mouse driver not sending the button id
-      in extended events. (#402, Frederic Lepied).
- 766. More modes for xf86config and XF86Setup database (#397, Koen Gadeyne).
- 765. Fix name of GLX stub library (#389, Henry Worth).
- 764. Renumber option flag definitions to allow more space in the various
-      categories.
- 763. Fix problems with DGA on 4/8MB Millenniums (#390, Radoslaw Kapitan).
- 762. Fix Mystique display problems and dim text font after exit problems
-      (#378,379, Guy Desbief).
- 761. Rewrite clock restoring procedure for mga driver (#385, Radoslaw Kapitan).
- 760. More modes for XF86Setup database (#372, Koen Gadeyne).
- 759. Fix typos in NetBSD.cf (#363, Takaaki Nomura).
- 758. Add a ModuleInit function to libxaa.a (#362, J. Kean Johnston).
- 757. Fix a NULL dereference in xf86Config.c on OSs that don't support
-      dlopen() loading for the static servers (#361, Thomas Mueller).
- 756. Fix a problem with references to the GLX stub libraries in
-      Xserver/Imakefile that affects building static servers
-      (#361, Thomas Mueller).
- 755. Allow most of the extensions in Xext to be dynamically loaded (in
-      a single module) (#360, Matthieu Herrb).
- 754. Allow the DBE extension to be dynamically loaded (#359, Matthieu Herrb).
-
-XFree86 3.9b (4 May 1997)
- 753. Add BuildPC98Servers as an easy way to enable/disable building
-      all PC98 servers.
- 752. Build Xvfb by default to help pick up build problems.
- 751. Make 'makedepend' understand '-U' on the command line.
- 750. Some fix-trackers from TOG, includes:
-        lib/Xi: missing error message (#352 -- we already had this fix)
-        lib/X11: long font paths can garbage heap (#353)
-        fix potential memory leak in xinput ProcXGetDeviceMotionEvents (#354)
-        fix unmatched quotes in comments (and other stuff?!?) (#355)
-        config updates (#356)
-        lib/X11: when IMS dies the library closes all open IMs (#357)
-        lib/X11: When doing XSetICValues and IMS returns ERROR, library core
-          dump (#358).
- 749. Clean up the GLX for the static-linked servers (#351, Henry Worth).
- 748. Fix SCO Open Server build problem (#348, J. Kean Johnston).
- 747. Add an option to allow VClk1 to be used as the programmable clock
-      with C&T 65550 and 65554 chips (#346 Daniel Bischof, Andreas Heitmann
-      and Thomas Landgraf).
- 746. Remove trailing ',' at the end of InfoRec initialisations, which
-      was hiding potential compiler warnings (#343, Koen Gadeyne).
- 745. Replace the ChipClockScaleFactor field with ChipClockMulFactor and
-      ChipClockDivFactor to allow for non-integer factors required in
-      some cases (#343, Koen Gadeyne).
- 744. Fix some 'make' problems that show up on NetBSD and OpenBSD, and clean
-      up BSD 4.4 -specific make stuff in the config/cf directory
-      (#342, #344, Matthieu Herrb).
- 743. Add better error/warning messages for the aperture driver code for
-      NetBSD/OpenBSD (#341, Matthieu Herrb).
- 742. Block choosing interleave mode for the Mystique, and set maxPixelClock
-      for the Mystique (#338, Radoslaw Kapitan).
- 741. Add ability to set MCLK for the mga driver in XF86Config (#338, #339,
-      Radoslaw Kapitan).
- 740. Fix some problems with XAA DELAYED_SYNC and the software cursor and
-      backing store -- new wrappers are added (#337, Sebastien Marineau).
- 739. Re-enable HW cursor for Millennium, and implement looping over
-      MGAIdent when checking the Chipset (#336, Radoslaw Kapitan).
- 738. Remove some assumptions about burst modes from the C&T ImageWrite
-      function (#335, David Bateman).
- 737. Matrox Mystique driver support, which should work fine with
-      acceleration disabled (#334, Guy Desbief).
- 736. Fix for double-height MGA hw cursor when using interlaced modes
-      (#333, Radoslaw Kapitan).
- 735. Explicit syncing of the blitter at the end of the C&T XAA primitives
-      is no longer needed since delayed syncing is off by default
-      (#332, David Bateman).
- 734. Use the source pitch for colour CPU to screen operations in the C&T
-      driver (#332, David Bateman).
- 733. Fix writing the 16bpp planemask to the chip in the C&T driver
-      (#332, David Bateman).
- 732. Stop reserving 1kb of video memory when the accelerator is disabled
-      for the Tseng driver (#331, Stuart Lamble).
- 731. Fix Trident 96xx/Cyber series for snow on the screen and fix
-      acceleration issues (#330, #349, Alan Hourihane).
- 730. C&T doc updates (#329, David Bateman).
- 729. Fix a bitblt bug for 8bpp, widths 49..56 in the s3v driver (#328,
-      Sebastien Marineau).
- 728. Add filled trapezoid support to the s3v driver (#328,
-      Sebastien Marineau).
- 727. Add caching of often-used ViRGE registers (#328, Sebastien Marineau).
- 726. Add hw cursor support for the SVGA s3v driver (#328, Sebastien Marineau).
- 725. Add a new kind of XAA pixmap cache slot which is used to hold mono
-      8x8 patterns for chips which have PROGRAMMED_BITS (#327,
-      Sebastien Marineau).
- 724. Fix XAA pixmap cache invalidation after a VT switch (#327,
-      Sebastien Marineau).
- 723. Fix lockup problem in SVGA s3v driver, and some cleanups (#326,
-      Harald Koenig).
- 722. Fix MGA hw cursor not displaying after switching resolutions
-      (#325, Radoslaw Kapitan).
- 721. Fix text colour problems for ViRGE/VX, a rectfill and bitblt bug
-      for virtual width == 2048, and avoid some more bad hardware lines in
-      the S3V server (#324, Harald Koenig).
- 720. Move chipset independent hw-cursor stub from mga_dac3026.c to
-      mga_hwcurs.c (#322, Radoslaw Kapitan).
- 719. Fix a build problem in osPexFont.c, and add a ModuleInit function
-      for libxf86cache.a (#321, Michael Rohleder).
- 718. Fix a 32bpp Millennium DAC initialisation typo (#318, Radoslaw Kapitan).
- 717. Loader support for m68k (#317, #323, Alan Hourihane).
- 716. Fix copyright and remove RCS idents in xf86_ldext.h (#316,
-      Matthieu Herrb).
- 715. Fix some NonTE text problems, and back out change #690 (#315,
-      David Bateman).
- 714. Add initialisation of GlxInitVisualsPtr to loadmod.c (#313, Henry Worth).
- 713. Don't build libX11 for BuildServers only unless building the Xnest
-      server (#312, Marc Aurele La France).
- 712. Remove extraneous line in xf86text.c (#311, Harald Nordgard Hansen).
- 711. Restore changes accidentally backed out of xfree86.cf in 3.9a
-      (includes #310, #313, #320, #326).
- 710. Open /dev/tty0 instead of /dev/console on Linux to find the first
-      free VT.
-
-XFree86 3.9a (17 April 1997)
- 709. Add delayed syncing as an optional flag for XAA.  This is now
-      currently enabled only in the S3 driver (#308, Mark Vojkovich).
- 708. Several fixes to TE and NonTE fonts. The server now passes CH06
-      drwimgstr, drwimgst16, drwstr, drwstr16, drwtxt and drwtxt16 xtest tests
-      (#305,307, Sebastien Marineau).
- 707. Add Latin2 Type1 fonts (Peter Soos).
- 706. Add Latin2 bdf fonts (Petr Kolar).
- 705. Add SubsequentDashedTwoPointLine to XAA (#296, Mark Vojkovich).
- 704. Add a Hungarian XKB symbols file (Peter Soos).
- 703. Add support for Microsoft Intellimouse (#304, Thomas Vogler).
- 702. Add ViRGE/VX support to SVGA/S3V server; this isn't really working, yet
-      (#299,301, Harald Koenig).
- 701. Add memory, FIFO, and PCI retry options to SVGA/S3V server (#293,300,
-      Sebastien Marineau).
- 700. Add support for 15bpp and 32bpp to SVGA/S3V server. 32bpp only with
-      very limited acceleration (#293,300, Sebastien Marineau).
- 699. Only build libX11 while doing BuildServersOnly if Xnest is enabled (295,
-      Harald Koenig).
- 698. Disable color expansion with planemask at 24bpp in chips driver (#303,
-      David Bateman).
- 697. Fix small bug in SVGA/S3 dash line code (#302, Mark Vojkovich).
- 696. Allow trident 96xx chips to restore text mode (#298, Alan Hourihane).
- 695. Fix virtual resolutions for trident driver at 24bpp (#298, Massimiliano
-      Ghilardi).
- 694. TGUI driver updates for PC98 (#297, Akio Morita)
- 693. Fix building PC98 modules, resync PC98 Imakefile (#297, Takaaki Nomura).
- 692. Fix ch8398 ramdac command byte for 8bpp in tseng driver (#294,
-      Krajcsovits Gyorgy).
- 691. Fix NonTE fonts in XAA (#292,309 David Bateman).
- 690. Disable XAA matchcommon logic to fix problem with grayed out fonts
-      (#291, David Bateman).
- 689. Fix sis driver for 8x8 color expand pattern fill pattern flags and XAA's
-      new synching policy (#290, Xavier Ducoin).
- 688. LynxOS updates (#289, Thomas Mueller).
- 687. Enable 1bpp and 4bpp for the chips driver (#288, David Bateman).
- 686. Jump version number to document that this is the branch working towards
-      XFree86-4.0.
-
-XFree86 3.2At (14 April 1997)
- 685. Fix ImageText fallback (#287, David Bateman).
- 684. Some fixes for NonTE text. Add FixedBase support. Add TRIPLE_BITS24BPP
-      support. Fix CPU_TRANSFER_PAD_QWORD problem. Fix possible loss of a few
-      pixels at the end of NonTE text strings (#286, David Bateman).
- 683. Fix compile problem with USL compiler (#283, David Bateman).
- 682. Updates to mga_reg.h for Mystique (Guy Desbief).
- 681. Add ATT20C49x RAMDAC support for 16 and 24bpp modes to tseng driver.
-      Make ET6000 hardware cursor use closest available color instead of
-      refusing to change colors when it can't find an exact match. Fix
-      another W32i linear mode bug. Change ET6000 pixel clock limits as per
-      Tseng's recommendations (=much lower than we had before). fix a BUG in
-      the ET4000 "standard set-of-clocks" code. Use ChipClockScaleFactor.
-      (#282, Koen Gadeyne).
- 680. Fix and re-enable 8x8 pattern color expansion (!=24bpp) for Alpine cards
-      Fix CPUToScreen color expansion for 24bpp mode, fix determining the BG
-      color in 24bpp color expansion routines (#281,285, Corin Anderson).
- 679. Various Cirrus fixes and additions. Fix HAVE_546X() macro for Laguna
-      support. Add support for CL-GD5480. Disable Alpine XAA color expansion
-      code. Fix 32bpp Alpine mode bug. Overload {slow,med,fast}_dram options
-      to set Rambus BCLK on Laguna chips. Remove Sync()'s in laguna_acl.c.
-      Removed unnecessary, dead, and/or dumb code in cir_driver.c. Add clock
-      values for 150MHz through 229MHz dot clocks. Set clock limits correctly
-      for Laguna chips. (#280, Corey Anderson).
- 678. Fix problem in xf86gcmisc.c that could cause a segfault (#279,
-      Mark Vojkovich).
- 677. Fix problems with NonTE text in XAA (#278, David Bateman).
- 676. Fix loader under SVR4.0.4 (lstat,fstat,mknod)(#277, Richard Coley).
- 675. Speedups for dashed lines in SVGA/S3 (#276, Mark Vojkovich).
- 674. Allow building Xnest with BuildServersOnly (#275, Marc Aurele La France).
- 673. Fix vga16 and banked vga2 without also breaking either of the loader or
-      static servers. Remove obsolete directories and other extraneous junk.
-      Remove mi's dependence on mfb. LoaderFixups is no longer needed. Add
-      xf86InitViewport to the symbol table. Combine vga2/mfb & vga2/mfb.banked.
-      (#274 Marc Aurele La France).
- 672. More layout cleanups in matrox driver (#273, Radek Kapitan).
- 671. Fix LinkKit to build loader (#272, Takaaki Nomura).
- 670. Fix some Alpha problems (#270, Robin Cutshaw).
- 669. Add MemClk field to all drivers (#270,271 Robin Cutshaw, Sebastien
-      Marineau).
- 668. Fix server crashes in C&T driver caused by delayed syncing (#269, David
-      Bateman).
- 667. Fix problems with PEX modules (#268, Takaaki Nomura).
- 666. Fix some problems in XAA benchmarks and Trident Cyber support (#266,267,
-      Alan Hourihane).
- 665. Add Mystique to scanpci (#264, Guy Desbief).
- 664. Fix problems with delayed syncing (#263, Mark Vojkovich).
- 663. Fix LinkKit and cirrus driver (#262, Takaaki Nomura).
- 662. Fix I18N bug (#261, Nagao Tadaaki).
- 661. First steps to get loader on SCO (#260, J. Kean Johnston).
- 660. File structure changes for mga driver (#259, Radek Kapitan).
- 659. Add stubs to load GLX extension (#228,246, Henry Worth, Dirk Hohndel).
-
-XFree86 3.2As (09 April 1997)
- 658. Several fixes and enhancements for the cirrus driver. Fix the crash that
-      showed up in 3.2A with MMIO on some chips at 16bpp. Enable the 8x8
-      pattern fill code for different chips. Reorganize the BitBLT feature
-      checks in the accelerated driver, and make it compatible with the new
-      delayed syncing in XAA.Fix the > 85 MHz dot clock mode on the
-      CL-GD5436/46. Detect all DRAM configurations that are possible on the
-      CL-GD5446. Add code to handle the 7555 (no detection).
-      (#258, Harm Hanemaayer).
- 657. Fix Bresenham line bug in trident/9440 driver (#257, Alan Hourihane).
- 656. Add trapezoid acceleration to tseng driver (disabled), disable W32 hw
-      cursor, remove redundant warning message about "Wrong Cursor Color Tried"
-      (#256, Koen Gadeyne).
- 655. Add mga dashed lines (#255, Andrew Vanderstock).
- 654. Add more flexible way of loading and initializing extensions (#253,
-      Matthieu Herrb).
- 653. Fix bugs in the S3V server concerning rectfill with scan line width of
-      2048 and with lines (#251,252, Harald Koenig).
- 652. Add option "set_memclk" (#249, Sebastien Marineau).
- 651. Fix hangs in svga/s3v server, fix some bugs, add planemask support to
-      most accelerated primitives and start accelerated lines (#249, Sebastien
-      Marineau).
- 650. Fix XAA to force ROP to GXcopy for XDrawImageString (#249, Sebastien
-      Marineau).
- 649. Change "unsigned long" to CARD32 in dashed line support (#248,
-      Mark Vojkovich).
- 648. Add Matrox Mystique to vgaPCI.h (Guy Desbief).
- 647. Fix building XF98_EGC (#247, Takaaki Nomura).
- 646. Fix some problems with delayed syncing in the C&T driver (#245, David
-      Bateman).
- 645. Add dashed line support for SVGA/S3 (#243, Mark Vojkovich).
- 644. Add dashed line support for XAA (#242,244, Mark Vojkovich).
- 643. Fix some fill problems in S3V server (#241, Harald Koenig).
- 642. Several fixes to C&T driver that rearrange code in XAA FillRect code to
-      work around bug in HW cursor, add ImageWrite function, use the 8x8
-      pattern where possible to simulate a planemask, add preliminary support
-      for vga2 and vga16 and temporary fix for Syncing problems in new XAA code
-      (#239, David Bateman).
- 641. Further LinkKit changes (#238, Takaaki Nomura).
- 640. Small fix for LinkKit (#237, David Bateman).
- 639. Fix twm double-frees (#236, John Hawkinson).
- 638. Include missing patch for change 601.
- 637. Update Compaq vgaVideoChipRec (1bpp,4bpp,15bpp,32bpp) (#234, Gerry Toll).
- 636. Fix Linkkit (#233, Takaaki Nomura).
- 635. Fix broken console restore for 4bpp driver (#232, Marc Aurele La France).
- 634. Add S3 chipset override code to SVGA/S3 server (#231, Harald Koenig).
- 633. Start converting XF86Setup to use the loader (#230, Joe Moss).
- 632. Correct DCLK limits for S3V server (#229, Harald Koenig).
- 631. Add STG1702 to SuperProbe (#227, Stuart Lamble).
- 630. Small fix for syncing in XAA color expansion (#225, Mark Vojkovich).
- 629. Resync PC98 server (#224, Takaaki Nomura).
- 628. Add stg1702 auto probing to the tseng driver (#223,#226, Stuart Lamble).
- 627. Fix 4bpp for PC98 (#222, Takaaki Nomura).
-
-XFree86 3.2Ar (28 March 1997)
- 626. Remove the old driver subdirectories.
- 625. Fix setting of CRTC[22] on VGA compatibles (#220, Marc Aurele La France).
- 624. Fix vga16 & banked vga2; don't remap *fb's endtab. Use the correct
-      banking functions, displayWidth handling (#219, Marc Aurele La France).
- 623. Change Mach64 to use the known extended post-divider setting on the
-      3D Rage II (#218, Marc Aurele La France).
- 622. Lots of changes to the SVGA/ATI driver, including 3D Rage II support,
-      memory type detection (#217, Marc Aurele La France).
- 621. Clean up internal allocator a bit, and make it log more information
-      (when enabled) (#216, Marc Aurele La France).
- 620. Fix misuse of UseInstalled in the .cf files for BSD derivatives.
-      Make LinkKit use the same default CCOPTIONS as the main build.
-      Remove redundancy in svr4.cf (#215, Marc Aurele La France).
- 619. Add newer ATI chipsets to SuperProbe (#214, Marc Aurele La France).
- 618. Fix color expansion and pixmap cache in trident driver (#212,213,
-      Alan Hourihane).
- 617. Change XAA to delay syncing (#211, Mark Vojkovich).
- 616. Fix OS/2 naming problem in Xserver Imakefile and XAA 8x8 pattern
-      rotations and flag checking inconsistency (#210, Sebastien Marineau).
- 615. Add SVGA/S3V driver (#210, Sebastien Marineau).
- 614. Add Sigma Designs REALMagic to SuperProbe (#209, Harald Koenig).
- 613. Merge Trio64V2/Aurora64V+/PLATO changes into S3/SVGA driver (#208,
-      Harald Koenig).
- 612. Fix building XF98_EGC (#207, Takaaki Nomura).
- 611. Add ImageWrite to s3/svga and prepare driver for upcoming XAA changes;
-      the s3/svga server no longer does cursor blocking, users of Xqueue
-      might have to use the Option "sw_cursor" (#206, Mark Vojkovich).
- 610. Fix 8 bit DAC handling in SVGA server (#205, Mark Vojkovich).
- 609. Add better support for linear memory on W32i cards (#204, Koen Gadeyne).
- 608. Add HORIZONTAL_TWOPOINTLINE to XAA (#203, Alan Hourihane).
- 607. Add autoloading of libxf86cache to Mach32 & Mach64 server and compile
-      ServerInit() and ModuleInit() only for the LOADER (#202, Takaaki Nomura).
- 606. Add support for Cirrus CL-GD5464BD, CL-GD5465 (#201, Corin Anderson).
- 605. Documentation updates and improved memory bandwidth handling in tseng
-      driver (#200, Koen Gadeyne).
- 604. ViRGE/DX support for S3V server (#199, Harald Koenig).
- 603. Some fixes to Trio64V+ & Trio64V2 (#198, Harald Koenig).
- 602. Recognize 1MB on ViRGE (using an illegal setting) (Alan Hourihane).
- 601. Fix and enhance handling of unresolved symbols in loader (#196, Harald
-      Koenig).
- 600. Fixes and Additions for XF86Setup (#194,195, Joe Moss).
- 599. Fix SuperProbe for W32 chipsets (#191, Koen Gadeyne).
- 598. Fix building the static S3 server (#188-190, Harald Koenig).
- 597. Fix undefined symbols in the pex5 module (#187, Matthieu Herrb).
- 596. Fix autoloading modules in the S3 server for PC98 (#186,197 Takaaki
-      Nomura).
-
-XFree86 3.2Aq (23 March 1997)
- 595. Fix building static XF86_S3 (#185, Harald Koenig).
- 594. Enable loader on OpenBSD (#184, Matthieu Herrb).
- 593. Add missing files for NV1 (change 591).
-
-XFree86 3.2Ap (22 March 1997)
- 592. Fix screen problems with C&T at 24bpp (#182, Nozomi Ytow).
- 591. Add NV1 acceleration (#181, David McKay).
- 590. Add Trio64V2 170/110/60MHz support to S3 server (#180, Harald Koenig).
- 589. Automagic loading of modules for old S3 server (#178,179 Harald Koenig).
- 588. Automagic loading of modules for PC98 servers (#177, Takaaki Nomura).
- 587. Fixes to blitter and hw cursor handling in C&T driver (#176, David
-      Bateman, Egbert Eich).
- 586. Add Elsa handling to S3/SVGA and Trio64V2/DX/GX, ViRGE/DX/GX and PLATO/PX
-      to SuperProbe, scanpci, S3, S3V and S3/SVGA servers (#174,175,
-      Harald Koenig).
- 585. Build fix for Xprt, Xnest and Xvfb (#172, Takaaki Nomura).
-
-XFree86 3.2Ao (18 March 1997)
- 584. Fix/add IBM RGB528 support and add ELSA eeprom detection (only
-      for IBM ramdacs right now) (#170, Harald Koenig).
- 583. Fix linking problem of XF86_LOADER for Linux/a.out (#170,171, Harald
-      Koenig, Xavier Ducoin)
- 582. Fix several problems with loader and static server that were caused
-      by change 567 (Dirk Hohndel).
- 581. Fix bad 400x300 mode line (#165, Koen Gadeyne).
- 580. Finer W32 chipset detection (#165, Koen Gadeyne).
- 579. Tseng documentation updates (#165, Koen Gadeyne).
- 578. Fix unresolved strlen in PEX and XIE (#164, Takaaki Nomura).
- 577. Fix changes of NEC480 to PEGC (#163, Michio "Karl" Jinbo).
- 576. Fix building of XF98_LOADER (#163,169, Michio "Karl" Jinbo,
-      Takaaki Nomura).
- 575. Fix building of normal X servers for PC98 (#163, Takaaki Nomura).
- 574. Fix building P9000 module (#160, Takaaki Nomura).
- 573. Add S3/SVGA color expansion (#161, Mark Vojkovich).
- 572. Fix problems with "dac_8_bit" in svga server (#159, Mark Vojkovich).
- 571. Fix ET6000 hardware cursor (#158, Harald Nordgard Hansen).
- 570. Changes to NetBSD + BSD Elf library configuration (#157, Chris G.
-      Demetriou).
- 569. Fix for the SVGA/S3 hardware cursor (Xavier Ducoin).
-
-XFree86 3.2An (15 March 1997)
- 568. Build fixes in order to get a clean compile on Linux and FreeBSD
-      (not for PC98, though). The servers still don't work quite as
-      they should.
-
-XFree86 3.2Am (12 March 1997)
- 567. First attempt to get a universal SVGA server that statically links
-      in all drivers except those from the accel directory. Links ok and
-      seems to work at >=8bpp, but has bit ordering problems for 1,4bpp.
-      (David Dawes, Dirk Hohndel).
- 566. Fixes for Trident Cyber chipsets (#154,155, Alan Hourihane).
- 565. Fixes for OS/2 (more IHaveModules and drive letters in ModulePath),
-      get Mach64 to work again (#153, Holger Veit).
- 564. Cleanups and improvements to tseng hw cursor code (#152, Koen Gadeyne,
-      Harald Nordgard Hansen).
- 563. Add pci_retry option to tseng driver (#151, Dejan Ilic).
- 562. Change NEC480 to PEGC, resync of SuperProbe/Imakefile (#150, Takaaki
-      Nomura).
- 561. Add hardware cursor to MGA driver (#149, Xavier Ducoin).
- 560. Make tseng driver handle 1/4/8bpp at runtime (#145, Koen Gadeyne).
- 559. Make apm driver loadable (#146, Joe Moss).
- 558. Fix some cross compilation problem for XAA on OS/2 (#144, Sebastien
-      Marineau).
- 557. Fix some 24bpp problems for ViRGE and cfb (#144, Sebastien Marineau).
- 556. Move cursor area to top of vidmem for ViRGE (#144, Sebastien Marineau).
- 555. Really fix mono/Imakefile and fix PEX struct dirent problem (#143,
-      Matthieu Herrb).
- 554. Add handling for S3-style 8x8 pattern fill to XAA; fix s3/svga
-      accordingly (#141, Mark Vojkovich).
- 553. Fix OS/2 problems; disable cross compiling Xprt, Xvfb, Xnest (#140,
-      Holger Veit).
- 552. Include some fix trackers, fixing problems with sunLib.tmpl, hp.cf,
-      memory leak in xdm: xdmcp.c manage(), Imake.rules, zlib 1.0.4, AltGR
-      not working in Xlib (#131,132,135-139).
- 551. Reapply change 536 for the new drivers (#130, Mark Vojkovich).
- 550. Enable loader for NetBSD and fix a few typos (#127-129, Takaaki Nomura).
-
-XFree86 3.2Al ( 7 March 1997)
- 549. Fix a.out loader for FreeBSD (#126, Takaaki Nomura).
- 548. Add the BT-848 to scanpci (#121, Dejan Ilic).
- 547. Change the way dynamic loading of vga2. vga16, vga256 modules is done
-      (just one module per driver for all color depths, all the drivers are
-      moved to xfree86/drivers) (#122-124, Alan Hourihane, Dirk Hohndel).
- 546. Add support for 3DLabs GLINT chipsets to scanpci and SuperProbe, start
-      working on a 2D server for Elsa Gloria L (Dirk Hohndel, Stefan Dirsch).
-
-XFree86 3.2Ak ( 4 March 1997)
- 545. Make Mono drivers loadable and clean up some of XF86_LOADER; this
-      change replaces some of the things done in change 537 (#119, H.J. Lu).
- 544. Fix char alignment in COFF loader as well (#120, Thomas Mueller).
- 543. Fix short alignment in COFF loader and add missing entry to SYMENT
-      (#118, Michael Rohleder).
- 542. Build fix for libc_wrapper.c on ISC (#117, Michael Rohleder).
- 541. Add Module Version to Mach32 server (#117, Michael Rohleder).
- 540. Add smarter handling of unresolved symbols in the loader (#116,
-      Sebastien Marineau).
- 539. Fix problem in OS/2 loader (#115, Sebastien Marineau).
- 538. Add module versioning and auto loading to S3V server (#114, Sebastien
-      Marineau).
- 537. Change name of Screen Section to "XFree86".
- 536. Set correct clipping rectangle for SVGA/S3 (#112, Mark Vojkovich).
- 535. Fix a problem in trapezoid solid fill code (not sure if this fixes
-      the problems that caused change 533 to be disabled) (#110,
-      Mark Vojkovich).
- 534. Add 'Doublescan' support to MGA driver (#109, Radoslaw Kapitan).
- 533. Add trapezoid solid fill acceleration to MGA driver; disabled as it
-      doesn't draw correctly at this point (#109, Radoslaw Kapitan).
- 532. Remove MgaAccelSwitch (#108, Radoslaw Kapitan).
- 531. Improve SolidFill speed on C&T65545/6/8 (#107, Nozomi Ytow).
- 530. Fix libc_wrapper.c build problem on SVR4 (#106, Takaaki Nomura).
- 529. Fix VGA16 driver (#105, Thomas Mueller).
- 528. Fix Compaq AVGA driver (#104, Ming Yu, Joseph Pfeiffer, Gerry Toll).
- 527. Add more comments to MGA driver (#103, Radoslaw Kapitan).
-
-XFree86 3.2Aj (28 February 1997)
- 526. Various build fixes for FreeBSD, NetBSD, Linux, Solaris (Dirk Hohndel).
- 525. Fixes for OS/2 loader and ar code (#100, Sebastien Marineau).
- 524. Updates to S3/SVGA driver (#99, Mark Vojkovich).
- 523. Add SubsequentFillTrapezoidSolid to XAA (#99, Mark Vojkovich).
- 522. First stab at getting VGA16 as loadable module; doesn't work, yet
-      (Dirk Hohndel).
- 521. Add Mystique register definitions (#98, Guy Desbief).
- 520. Fix unresolved symbols with loadable ati driver (#96, Thomas Mueller).
- 519. Add module versioning (#97, Holger Veit).
- 518. LynxOS doesn't have vfscanf (#95, Thomas Mueller).
- 517. Fix 499 was missing. It is now included.
- 516. Remove bogus code in xf86frect.c (#93, Harm Hanemaayer, Harald Nordgard
-      Hansen).
- 515. Build fixes for FreeBSD (#92, Takaaki Nomura).
- 514. Restructure RAMDAC handling in tseng driver and add 16/24bpp support
-      for STG1703 (#91, Koen Gadeyne).
- 513. Tseng HW cursor state save/restore (#91, Dejan Ilic).
- 512. Disable HW cursor on et4000 (#91, Koen Gadeyne).
- 511. Fix et6000 memory probing (#91, Koen Gadeyne).
- 510. Fix handling of PCI probe in the tseng driver (#91, Koen Gadeyne).
- 509. Fix "double-magic" in libc_wrapper.c (#90, Holger Veit).
- 508. Fix for ET6000 HW cursor (#89, Harald Nordgard Hansen).
- 507. Fixes to MGA driver: remove "nolinear", allow overriding MMIO address
-      as IoBase in XF86Config, remove obsolete files (#88, Radoslaw Kapitan).
-
-XFree86 3.2Ai (25 February 1997)
- 506. Fix libc_wrapper.c for LynxOS, where stdin/out/err isn't a valid
-      initializer (#87, Thomas Mueller).
- 505. Updates to SiS driver: fix setting MemBase, allow some XAA functions
-      in 8bpp even without linear mode, support DPMS (#86, Xavier Ducoin).
- 504. Disable the stream display fetch length control for Trio64V2
-      (#85, Xavier Ducoin).
- 503. Update SuperProbe for sis86c202 and sis86c205 (#84, Xavier Ducoin).
- 502. Allow ModulePath to have multiple elements; use heuristic to find the
-      module if only part of the exact filename is specified; allow subdirs
-      of the module directory to be searched (Dirk Hohndel).
- 501. Change loader code so that ModuleInit is a magic function name that
-      indicates the init function for a module. ServerInit now is the function
-      used to get the initial ScrnInfoRec; change all modules to follow these
-      naming conventions (Dirk Hohndel).
- 500. Fix missing fsetpos/fgetpos in ISC (#78, Michael Rohleder).
- 499. Fix elfloader to recognize .data1 and .rodata1 sections
-      (#82, Steve Forsythe).
- 498. Add readdir family of functions to libc_wrapper (#81, Holger Veit).
- 497. Add crosscompilation support for OS/2 (#81, Holger Veit).
- 496. Add loadable module support for P9000 (#80, Erik Nygren).
- 495. Fix error message in loader (#79, Matthieu Herrb).
- 494. Workaround for a bug in 68k GNU binutils (#77, Geert Uytterhoeven).
- 493. Add new xf86_libc.h to make porting to the new style loader
-      architecture easier. Adapt PEX5 using the new header file (Dirk Hohndel).
- 492. Fixes for a.out loader (#74-76, Matthieu Herrb).
- 491. More fixes for libc_wrapper.c (#73, Michael Rohleder).
-
-XFree86 3.2Ah (23 February 1997)
- 490. Some a.out loader updates for Linux/a.out (#72, Harald Koenig).
- 489. Add support for cross compilation of modules in the Imake rules
-      (#71, Holger Veit).
- 488. Add a subset of xf86stdio functions to libc_wrapper.c (#71, Holger Veit).
- 487. Make the I128 driver loadable (#65,66,70, Robin Cutshaw).
- 486. Fix et4000 driver compile problems for vga2 and vga16
-      (#69, Koen Gadeyne).
- 485. Fix 8x8 patterns for TGUI chips (#68, Alan Hourihane).
- 484. Fix direct reference to memset() (#67, Harald Nordgard Hansen).
- 483. Gnu parallel make update for loadable server (#64, H.J. Lu).
- 482. Include the summasketch support explicitly in xf86Xinput.c when
-      not using dynamic modules (#63, Christer Nilsson).
- 481. Loader support for OS/2-style a.out (#62, Sebastien Marineau).
- 480. Fix nested asm calls in tseng_cursor.c (#61, Takaaki Nomura).
- 479. Add a timeout to the C&T blitter wait loop, and reset the blitter
-      when this happens (#60, David Bateman).
- 478. Add missing imake patch for massaging the results of parse_utsname()
-      (#57, Chris Demetriou).
- 477. Don't define DoLoadableServer yet for non-Intel Linux platforms.
- 476. Don't refer to the PEX init function in loadmod.c when PEXEXT isn't
-      defined (as is the case on Alpha platforms) (#56, Alan Hourihane).
- 475. Fix references to usleep on SVR4 (#61, Takaaki Nomura).
- 474. Fix references to snprintf on SVR4 (David Dawes).
- 473. Fix some compile problems on FreeBSD (David Dawes).
-
-XFree86 3.2Ag (19 February 1997)
- 472. Fix Imakefiles and loader problems on OS/2 (#53, Sebastien Marineau).
- 471. Fix problems with ISC and the Mach32 module (#55, Michael Rohleder).
- 470. Fix Xnest and Xvfb when DoLoadableServer is YES (Dirk Hohndel).
- 469. Clear up multiplex support on 96xx and display error message when
-      requested resolution exceeds available memory with the accelerator
-      engine (#52, Alan Hourihane).
- 468. Let Trio64V2 use newmmio driver (#49, Tom Angert).
- 467. First cut for ET6000 hardware cursor (#48, Dejan Ilic).
- 466. Some xf86 wrappers (#47, Craig Groeschel).
- 465. Convert PEX and XIE to be loadable with the new style loader
-      (Dirk Hohndel).
- 464. Clean up configuration files to distinguish old and new style
-      loading of extensions (Dirk Hohndel).
- 463. Add DPMS support (off mode only) to the P9000 server
-      (#9, Karl Anders Oygard).
- 462. Add PCI probing to the P9000 server (#9, Karl Anders Oygard).
- 461. Resync PC98 Imakefiles.
- 460. Enable the loadable server for LynxOS AT (#46, Thomas Mueller).
- 459. Better fix for XF86Setup compile problems (David Dawes).
-
-XFree86 3.2Af (17 February 1997)
- 458. Fix XF86Setup/Imakefile (#45, Harald Nordgard Hansen).
- 457. Fix xdm/Imakefile for ISC (Michael Rohleder).
- 456. Fix problem with S3V and W32 modules (Dirk Hohndel).
- 455. Move module rules from xf86.rules to Imake.rules, and when building
-      a module, install a link to it in xc/exports/lib/modules/ (David Dawes).
- 454. Start Elf loader for Linux/Alpha; doesn't work, yet (#44, Alan Hourihane).
- 453. Hide cursor in S3/SVGA when DGA is active (#43, Mark Vojkovich).
- 452. a.out loader for module loading (#42, Matthieu Herrb).
- 451. Extend OS support layer to cover some libc functions and update all
-      drivers to use the internal functions (Dirk Hohndel).
-
-XFree86 3.2Ae (16 February 1997)
- 450. Add -showunresolved flag to server.
- 449. Add sourceAddress option to xdm (#41, Christos Zoulas).
- 448. Fix cfb8line (#40, Jeff Anton).
- 447. Turn pixmap cache in SVGA/S3 server back on and switch over to XAA for
-      lines and segments (#39, Mark Vojkovich).
- 446. Fix COFF header file (#38, Stuart Anderson).
- 445. Better XKB russian keyboard support (#36, Andrey A. Chernov).
- 444. Fix an X11R6.3 problem with SCO 5 build (#35, Alan Hourihane).
- 443. Fixes for Trio64V2 (#35, Tom Angert, Harald Koenig, Xavier Ducoin).
- 442. avoid nested asm calls which cause compile errors on PANIX(SVR4) (#31,
-      Takaaki Nomura).
- 441. Resync LinkKit (#26, Takaaki Nomura).
- 440. Fix some build problems when not using the new loader code
-      (on FreeBSD) (David Dawes).
- 439. Stop S3 and S3V server from overwriting CR11 (#30, Harald Koenig).
- 438. Fix banking code in S3/SVGA driver (#29, Thomas Mueller).
- 437. Fix DPMS code for C&T (#28, David Bateman).
- 436. Enable left edge clipping for HiQV chips (#28, David Bateman).
- 435. Stop C&T probe from printing out messages for non C&T chips (#28,
-      David Bateman).
-
-XFree86 3.2Ad (14 February 1997)
- 434. Merge Metro Link loader code and make all SVGA drivers and S3, S3V
-      server loadable (Metro Link, Dirk Hohndel).
- 433. Avoid installing CVS admin files when doing 'make install' for rstart
-      (#25).
- 432. Resync xfree98/SuperProbe/Imakefile.
- 431. Fix for 'xset r rate' and XF86MiscSetKbdSettings() for some OSs (#24).
-
-XFree86 3.2Ac (12 February 1997)
- 430. Fix problem with system #define Control on LynxOS (Thomas Mueller).
- 429. FreeBSD 2.2 doesn't need libz (Takaaki Nomura).
- 428. Another attempt at left edge clipping for HiQV chips (still disabled
-      by default) (David Bateman).
- 427. DPMS in C&T is now enabled even when no monitor is detect (David Bateman).
- 426. Additional fixes for 65530/35 linear addressing (untested) (Egbert Eich).
- 425. Fix for the 16/24 bpp corruption in RIGHT2LEFT blits in the C&T driver
-      (Egbert Eich).
- 424. Fix LinkKit and XF98_TGUI server (Takaaki Nomura).
- 423. Reenable xsetpointer, xsetmode, xsetxkbmap in programs/Imakefile.
- 422. Encapsulate arguments in C&T header files (Nozomi Ytow).
- 421. Documentation updates for ET4000, mostly about 16/24/32bpp (Koen Gadeyne).
- 420. Fix VGA2 and VGA16 that were broken in 394/395 and reenable them
-      (Koen Gadeyne).
- 419. Improved resolution switching and 24bpp handling in S3V (Kevin Brosius).
- 418. Matrox detection in SuperProbe (Alan Hourihane).
- 417. Fix bug in the Type1 font code (H.J. Lu).
- 416. Autoprobe Viper PCI and DPMI support for P9000 (Karl Anders Oygard).
- 415. Use fill rect solid for horizontal lines on S3 (Mark Vojkovich).
- 414. Add 8bit dac support to MGA (Mark Vojkovich).
- 413. Add make -j support for gnu make (H.J. Lu and Craig Groeschel).
-
-XFree86 3.2Ab (11 February 1997)
- 412. Some fixes for Linux/m68k (Geert Uytterhoeven).
- 411. Add XAA S3 driver to the SVGA server (Mark Vojkovich).
- 410. Add a flag argument to the ValidMode functions (Dirk Hohndel).
- 409. Implemented (but disabled) left edge clipping for color expansion for
-      HiQV chips (David Bateman).
- 408. 8x8 mono pattern fills for HiQV chips (David Bateman).
- 407. DPMS support for C&T driver (David Bateman).
- 406. Scanpci for Alpha (Robin Cutshaw).
- 405. Fix clock clock limits for trident driver (Alan Hourihane).
- 404. 9420/9430 acceleration - not tested, only partial, too (Alan Hourihane).
- 403. DPMS support for the Trident driver (Alan Hourihane).
- 402. 24/32bpp support for Trident chipsets (Alan Hourihane).
- 401. Trident support for the Alpha platform (Alan Hourihane).
- 400. Add DPMS to et4000 driver of the SVGA server (Harald Nordgard Hansen).
- 399. Fixes and addition to the acceleration for W32 and ET6000 (Koen Gadeyne).
- 398. Chrontel RAMDAC support for W32 in SVGA server (Kurt Olsen).
- 397. Hardware Linedraw support for ET6000 and ET4000W32p (Koen Gadeyne).
- 396. Add memory bandwidth as a concept to the W32 RAMDAC code (Koen Gadeyne).
- 395. Move W32/ET6k clock setting functions into tseng_clock.c. This together
-      with change 394 breaks the W32 server and the et4000 driver in the
-      VGA2 and VGA16 server (all those are disabled by default for now)
-      (Koen Gadeyne).
- 394. Move RAMDAC support from W32 server in SVGA server and added
-      accelerated 16/24/32 bpp support for ET4000/W32p (Koen Gadeyne).
-
-XFree86 3.2Aa (10 February 1997)
- 393. Much additional acceleration for the HiQV chips (David Bateman).
- 392. Print the PCI retry setting in MGA server (Radoslaw Kapitan).
- 391. OpenBSD fixes (Matthieu Herrb).
- 390. Small fix for doc naming.
- 389. Fix 24bpp clock limit for ViRGE (Harald Koenig).
- 388. Fix 16bpp 6554x 8x8 pattern fill problem (David Bateman).
- 387. Fix core dump in C&T driver (Egbert Eich).
-
-XFree86 3.2A (28 January 1997)
- 386. Updates to the OS/2 pipe xtrans code (Sebastien Marineau).
- 385. Update the max clock for the TGUI ProVidia 968x (Alan Hourihane).
- 384. Disable memory interleaving before restoring the text font info
-      for the MGA driver.  This fixes font corruption that shows up
-      in Alpha platforms (Jay Estabrook).
- 383. Fix some document formatting problems.
- 382. Enable MMIO by default for TGUI chips when acceleration is enabled.
-      It can be disabled with the "no_mmio" option.
- 381. Fix problems with the Trident driver in 16-colour mode (Alan Hourihane).
- 380. Back out change 370 because it is obsoleted by change 373.
- 379. Fix 369 was missing, and is now included.
- 378. OS/2 updates (including documentation) (Holger Veit).
- 377. Add bitblt acceleration for 16 and 32bpp for the I128 server
-      (Robin Cutshaw).
- 376. Tseng doc update (Koen Gadeyne).
-
-XFree86 3.2y (26 January 1997)
- 375. I128 accel fix (Robin Cutshaw).
- 374. Update Japanese version of documentation to 3.2 (Kazuyuki Okamoto).
- 373. Fix 8x8 pattern acceleration for ET6000 (Koen Gadeyne).
- 372. Fix an optimisation/volatile problem with the I128 accel code
-      (Robin Cutshaw).
- 371. Fix the clearing of video memory in the SVGA server when the linear
-      base address has been offset (Jay Estabrook).
- 370. Disable 8x8 pattern acceleration for ET6000 (Harald Nordgard Hansen).
- 369. Fix stippled/tiled lines (segments) (Harm Hanemaayer).
- 368. Update the LinkKit for recent I128 server changes (Takaaki Nomura).
- 367. Fix display of 8bit characters in xterm (when in VT100 mode)
-      (Thomas E. Dickey).
- 366. m68k server updates (Geert Uytterhoeven).
- 365. Matrox doc updates (Andrew Vanderstock).
- 364. Update Mach64 docs (Kevin Martin).
- 363. Fix a ELSA Winner 2000PRO/X-8 initialisation problem that shows up
-      after running a certain other X server (Harald Koenig).
- 362. Fix a PC98 TGUI problem when using XAA colour expansion (Kazunori Ueno).
-
-XFree86 3.2x (23 January 1997)
- 361. Remove some XAA debugging messages (David Bateman).
- 360. Preliminary I128 bitblt acceleration using XAA (Robin Cutshaw).
- 359. NetBSD doc updates (Matthieu Herrb).
- 358. Fix a problem with specifying the chipset as "et6000" with the W32
-      server (Koen Gadeyne).
- 357. Fix for XAA bitmap problem which showed up with the C&T driver, and
-      With this fixed, change 339 has been backed out (David Bateman).
- 356. Update clock limits for the PC98 TGUI server (Akio Morita).
- 355. PC98 documentation update (Akio Morita).
- 354. Tseng doc updates (Koen Gadeyne).
- 353. Add NO_PLANEMASK to the Tseng XAA colorexpansion flags (Koen Gadeyne).
- 352. LynxOS doc updates (Thomas Mueller).
- 351. Fix some unaligned access problems with pixmap data that show up on
-      Alpha platforms (Jay Estabrook).
- 350. Fix a problem with passing the depth/weight specified on the
-      server command line in some situations (Harald Koenig).
- 349. Add support for the S3 Aurora64V+ programmable clock, which is slightly
-      different from the Trio64 (Harald Koenig).
- 348. Blank the screen before turning off the sync signals for the WD90C24
-      DPMS support (Brad Bosch).
- 347. Change 341 was missing, and is now included.
- 346. Don't accelerate XAA functions which use source bitmap data when
-      the rop is GXclear, GXnoop, and GXset (as well as GXinvert)
-      (Harm Hanemaayer).
- 345. S3V doc updates (Kevin Brosius).
- 344. S3 doc updates (Harald Koenig).
- 343. Remove some experimental code in XF86Setup that was causing it
-      to fail when starting the first server (Joe Moss).
-
-XFree86 3.2w (22 January 1997)
- 342. Update the xset man page for the DPMS additions.
- 341. Updates to TGUI acceleration, to hopefully fix some problems that
-      show up with xtest (Alan Hourihane).
- 340. Add recognition of some other TGUI Cyber chipset codes (Alan Hourihane).
- 339. Enable 8x8 mono pattern fills for C&T 65545, and limit colour expansion
-      to GXCOPY_ONLY to avoid some crashes when running things like
-      xengine and xdvi (David Bateman).
- 338. Fix various Chips & Tech display problems for 6554x, 65550 and
-      64300 chips (Egbert Eich).
- 337. Fix some XAA-related xtest errors (Harm Hanemaayer).
- 336. Enable the "no_accel" flag for the ET6000 (Koen Gadeyne).
- 335. When the "et6000" chipset is specified, use the port-probed value
-      for the membase rather than getting it from the PCI info (Koen Gadeyne).
- 334. Tseng documentation updates (Koen Gadeyne).
- 333. Cirrus documentation updates (Harm Hanemaayer).
- 332. Add README.SiS (Xavier Ducoin).
- 331. Temporary workaround for Mode_switch problems when using XKB and
-      Latin1 charset (Matthieu Herrb).
-
-XFree86 3.2v (20 January 1997)
- 330. Added rules to use FreeBSD's sgmlfmt tool to format Linuxdoc/sgml
-      docs -- but this needs more work.
- 329. Blank the screen before setting a DPMS mode (Leonard N. Zubkoff).
- 328. Fix sync disabling for DPMS for the S3 (and S3V) server (Robert Wilhelm).
- 327. Change the .name parameter of the S3V server to "S3V" (Kevin Brosius).
- 326. Improve S3V 24bpp mode switching (still has some problems)
-      (Kevin Brosius).
- 325. Disable 32bpp for the S3V server (not supported) (Kevin Brosius).
- 324. Fix S3V aspect ratio problem at 24bpp (Kevin Brosius).
- 323. Fix rotation direction of 8x8 mono patterns in XAA (David Bateman).
- 322. XAA updates (see xaa/NOTES for details) (Harm Hanemaayer).
- 321. Another fix for 5446 clocks higher than 85 MHz (Harm Hanemaayer).
- 320. When a clocks line is specified in the XF86Config file for the
-      cirrus driver, ignore it rather that insisting on its removal
-      (Harm Hanemaayer).
- 319. Remove artificial limit for LCD dot clock for Cirrus 754x chips
-      (Harm Hanemaayer).
- 318. Fix a problem with default cirrus MMIO operation (Harm Hanemaayer)
- 317. Improved acceleration support at 24bpp for the Ark driver
-      (Harm Hanemaayer).
- 316. Ark documentation updates (Harm Hanemaayer).
- 315. Enable "slow_dram" in the tseng driver for cards below W32i
-      (Koen Gadeyne).
- 314. Fix a tseng driver typo (missing braces) which was causing linear
-      mode to incorrectly disable acceleration for the ET6000 (Dejan Ilic)
- 313. Fix a tseng driver bug which was causing a system hang because
-      "fast_dram" wasn't completely disabled (Dejan Ilic).
- 312. Fix a tseng driver bug which causes a server crash when the chipset
-      "et6000" is specified for the SVGA server (Koen Gadeyne).
- 311. Some more W32i accel code, but disabled because it doesn't yet
-      work (Koen Gadeyne).
- 310. Fix for ET6000 24bpp MULBPP optimisation (Harald Nordgard Hansen).
- 309. Tseng documentation updates (Koen Gadeyne).
- 308. Cirrus documentation updates (Corin Anderson).
- 307. Updates for TGUI96xx hw cursor (8bpp, 16bpp), and PC98 TGUI card
-      list (Akio Morita).
- 306. Fix build TGA compile problem and xdm build problem on Linux/Alpha
-      (Robin Cutshaw).
-
-XFree86 3.2u (19 January 1997)
- 305. Only show the "extension not loaded" messages for the first
-      server generation.
- 304. Don't allow DPMS to be switched if the Xserver's VT isn't active
-      (Leonard N. Zubkoff).
- 303. Implement DPMS "off" support for the WD90C24, for LCD, CRT or both
-      (Brad Bosch).
- 302. Add a missing DPMSExtension #ifdef in os/WaitFor.c (Corin Anderson).
- 301. Fix an XAA bug with mono patterns, SCREEN_ORIGIN, and PROGRAMMED_ORIGIN
-      (Corin Anderson).
- 300. Implement monochrome pattern fill for Cirrus Laguna chips
-      (Corin Anderson).
- 299. Disable "fast_dram" for the ET6000 because it can cause serious
-      problems (Koen Gadeyne).
- 298. Disable "power saving" in the Tseng driver because the current
-      way of doing it causes memory corruption (Koen Gadeyne).
- 297. Disable linear mode and acceleration for Tseng chips that have
-      not been tested or which are not supported (Koen Gadeyne).
- 296. Add some code to treat the ET6000 slightly differently when the
-      chipset is specified in the XF86Config file, to help the case
-      when another (disabled) PCI video card is detected (Koen Gadeyne).
- 295. Use triple-buffering for colour expansion in the tseng driver
-      (Koen Gadeyne).
- 294. Make some variables in the tseng driver static (Koen Gadeyne).
- 293. Remove some asm stuff in the tseng driver, and add a C optimised
-      MULBPP calculation (Koen Gadeyne).
- 292. Disable XAA framebuffer concurrency in the tseng driver, which
-      hides most of the text corruption problems (Koen Gadeyne).
- 291. Man page (DPMS) and documentation (MGA) updates (Leonard N. Zubkoff).
- 290. Fix invalid modelines in XF98Conf.cpp (Takaaki Nomura).
- 289. Add checking of mode size against video memory requirements to the
-      Mach32 and Mach64 servers.
- 288. Fix GXnor and GXnand ROP definitions for the TGUI driver.
- 287. Update for Linux a.out libX11's jump_ignore (Harald Koenig).
- 286. Fix (?) TGA server link problem.
-
-XFree86 3.2t (18 January 1997)
- 285. Update W32 docs (Dirk Hohndel).
- 284. Recognise "noaccel" and "slow_dram" options in the ET4000 driver
-      (Dirk Hohndel).
- 283. Fix problem with not truncating pixel values in the MGA driver
-      (Dirk Hohndel).
-
-XFree86 3.2s (18 January 1997)
- 282. Fix a problem with xdm's sessreg and utmp on Linux (Leonard N. Zubkoff).
- 281. Fix a plane-enable bug for Cirrus 754x (Corin Anderson).
- 280. Don't use teblt code for depths other than 8 for Cirrus 754x
-      chips (Corin Anderson).
- 279. Implement programmable pattern offset using XAA, add support for
-      plane masks and fix sum bugs for Cirrus Laguna chips (Corin Anderson).
- 278. Don't check the PCI command FIFO for Cirrus Laguna chips
-      (Corin Anderson).
- 277. Add XAA support to the SiS driver.  The old code can be reverted
-      to at runtime with the "noaccel" option (Xavier Ducoin).
- 276. Add recognition of XAA options as valid options for the SVGA
-      server (Alan Hourihane).
- 275. Add "please report" messages when S3 Trio64V2, Trio64UV+ or
-      Aurora64V+ chips are detected (Harald Koenig).
- 274. Add undocumented options to XF86Config to allow a numerical ChipID
-      and ChipRev to be specified (used by the S3 and S3V servers)
-      (Harald Koenig).
- 273. Attempt to fix false detection of RGB524 ramdac as RGB528
-      (Harald Koenig).
- 272. Make sure x coordinate doesn't overflow into the y coordinate
-      for some MGA operations (Xavier Ducoin and Radoslaw Kapitan).
- 271. Don't write high order CRTC vertical bits for Trident chips earlier
-      than TGUI9440AGi (Alan Hourihane).
- 270. Fix an error in koi8-r charset switching code (Andrey Chernov).
- 269. Disable acceleration for TGUI Cyber chips (Alan Hourihane).
- 268. Fix register access in Cirrus 754x LCD size detection (Harm Hanemaayer).
- 267. Add support for the "no_stretch" option for Cirrus 754x chips
-      (Harm Hanemaayer).
- 266. Enable MMIO by default for Cirrus 543x/4x chips, and add a "no_mmio"
-      option to allow it to be disabled (Harm Hanemaayer).
- 265. Disable PCI burst mode on the TGUI by default, but allow it to be
-      turned on with options (Alan Hourihane).
- 264. Update max clocks for the TGUI 96xx chips (Alan Hourihane).
- 263. Fix centre/stretch TGUI LCD problems (Alan Hourihane).
- 262. Add Option "tgui_mclk_66" to force MCLK to 66 MHz (Alan Hourihane).
- 261. Fix TGUI Cyber detection problems (Alan Hourihane).
- 260. Flush MGA "direct access read cache" in MgaSync(), which fixes
-      problems reading directly from the framebuffer after accelerated
-      operations (Radoslaw Kapitan).
- 259. XAA updates (see xaa/NOTES for details) (Harm Hanemaayer).
- 258. Updates for LynxOS 2.5.0 (Thomas Mueller).
- 257. Fix xterm text highlighting when the window it partly off-screen
-      (Thomas E. Dickey).
- 256. Remove the GetSaver/SetSaver functionality from the client
-      side of the XFree86-Misc extension, but leave dummy support in
-      the server side for now to avoid breaking old clients
-      (Leonard N. Zubkoff).
- 255. Implement hw-specific DPMS support for servers/drivers which already
-      had an old implementation, adding support for Standby mode where
-      possible, and adding a StandbyTime keyword for the XF86Config
-      file (Leonard N. Zubkoff).
- 254. Fix some problems with the original DPMS extension behaviour
-      (Leonard N. Zubkoff).
- 253. Possible speedup for S3V polypoint code (Harald Koenig).
- 252. Disable C&T 65550 acceleration features that weren't present
-      in 3.2 (David Bateman).
- 251. Fix a C&T 24bpp pattern fill problem (David Bateman).
- 250. Make the XAA C&T code independent of the old acceleration code
-      (David Bateman).
- 249. Recognise the Alliance AT24, but treat the same way as a 6442
-      (Joe Moss).
- 248. Add detection for newer TGUI chipsets to SuperProbe (Alan Hourihane).
-
-XFree86 3.2r (14 January 1997)
- 247. Use some extra XAA flags in the MGA acceleration (Radoslaw Kapitan).
- 246. XAA updates (see xaa/NOTES for details) (Harm Hanemaayer).
- 245. Fix DAC register for > 85 MHz mode on Cirrus 5446 (Harm Hanemaayer).
- 244. Memory config fix for 2MB Cirrus 7543/8 and fix 754x LCD size detection
-      (Harm Hanemaayer).
- 243. Fix a problem in Imake.rules that causes problems when using bash
-      (Leonard N. Zubkoff).
- 242. Fix some server prototyping problems (Thomas E. Dickey).
- 241. Detect the Trio64UV+, Trio64V2 and Aurora64V+, and handle them
-      as a Trio64V+ (Harald Koenig).
- 240. Add preliminary support for the ELSA Winner 2000PRO/X-8 (S3 968,
-      IBM RGB528A, 8MB VRAM 250 MHz) (Harald Koenig).
- 239. Fix retrace waits in the MGA driver (Radoslaw Kapitan).
- 238. Enable CPUToScreen colour expansion for the TGUI driver (Alan Hourihane).
- 237. Add an options "lcd_center" to the TGUI driver for Cyber chips
-      (Alan Hourihane).
- 236. Some S3V updates, including combining s3dline.c and s3dseg.c,
-      moving planemask/colour conversion into a separate module,
-      add FillSolid, improve speed of s3plypt.c, and enable some
-      previously disable functions (Berry Dijk).
- 235. Updates for ISC support (Michael Rohleder).
- 234. Disable ExportLists for Solaris versions older than 2.5.
- 233. Fix for C&T 8x8 pattern fills (David Bateman).
- 232. LinkKit fix (SiS driver) (Takaaki Nomura).
- 231. Fix for XAA colour expansion when using FIXED_BASE (Koen Gadeyne).
- 230. ET6000 accel updates and optimisations (Koen Gadeyne).
- 229. Add code to the MGA driver to set MCLK based on the values
-      stored in the BIOS and the memory size (Andrew E. Mileski).
-
-XFree86 3.2q (12 January 1997)
- 228. Make makedepend recognise #warning on all OSs (since we have it
-      in shm.h).
- 227. Add Digital's DPMS server extension (no device-specific support yet).
- 226. Fix some compile problems on Solaris x86 2.4 with gcc (James Hawtin).
- 225. Add prelim support for LCD stretching with the TGUI Cyber chips
-      (Alan Hourihane).
- 224. Add support for some blitter functions to the SiS driver (not XAA
-      yet) (Xavier Ducoin).
- 223. Fix HW cursor problems in the SiS driver (Xavier Ducoin).
- 222. Add 15/16/24bpp support to the SiS driver (Xavier Ducoin).
- 221. Fix problems with linear mode in the SiS driver (Xavier Ducoin).
- 220. Programmable clock support for the SiS 205 (Xavier Ducoin).
- 219. TGUI acceleration updates (Alan Hourihane).
- 218. Add XAA support for the Chips & Technologies driver (David Bateman).
- 217. Support for 555 weighting in the MGA driver (Xavier Ducoin).
- 216. TGUI clock fix (Alan Hourihane and Massimiliano Ghilardi).
- 215. VGA server compiler warning fixes (Thomas E. Dickey).
- 214. LinkKit fixes (Takaaki Nomura).
- 213. XAA updates (see xaa/NOTES for details) (Harm Hanemaayer).
- 212. The item 203 fix was missing.  It is included now.
- 211. Modify Cirrus 754x LCD size detection (Harm Hanemaayer).
- 210  Add support for pattern offset for the Cirrus 5446 (Harm Hanemaayer).
- 209. Fix non-MMIO operation for the Cirrus 5446 (Harm Hanemaayer).
- 208. Fix font cache problem introduced in 3.2p (Takaaki Nomura).
-
-XFree86 3.2p (8 January 1997)
- 207. XAA support for the Cirrus Laguna chips (Corin Anderson).
- 206. Modify the PF1-PF4 coding in the xterm termcap/terminfo, and add an
-      interim xterm-vt220 description to accommodate the old and new styles
-      (Thomas E. Dickey).
- 205. Combine the coding for foreground and background colours in xterm
-      into a single byte (Thomas E. Dickey).
- 204. Some optimisations and transparent 8x8 pattern tiling for the ET6000
-      driver (Koen Gadeyne)
- 203. Parallel make fix for lbxproxy (Robin Cutshaw).
- 202. LinkKit fixes (David Bateman).
- 201. Defining XF86ExpireServer to YES in host.def allows easy enabling
-      of server expiry.
- 200. The item 176 fix was missing.  It is included now.
- 199. Fix an Xlib  problem with non-8859-1 locales (Kaleb Keithley).
- 198. Set default hsync and vsync polarity for the MGA driver in the same
-      way as other servers (Leonard N. Zubkoff).
- 197. Fix sync polarity in MGA driver (Radoslaw Kapitan).
- 196. Add DGA support to the MGA driver (Mark Vojkovich).
- 195. Some xterm cleanups (Thomas E. Dickey).
- 194. Implement DECSTR (soft terminal reset) for xterm (Thomas E. Dickey).
- 193. Fix some unaligned accesses in cfb16SegmentSS1RectCopy() on Alpha
-      (Harald Koenig).
- 192. 8x8 colour expand patterns for MGA (Radoslaw Kapitan).
- 191. Fix various compiler warnings in the S3 server (Thomas E. Dickey).
- 190. Fix TRANS_ENABLE definition for the TGUI driver (Alan Hourihane).
- 189. Fix a problem with the location of ident lines in the tclIndex file
-      (Joe Moss).
-
-XFree86 3.2o (5 January 1997)
- 188. Add MIPS/Arc support to build the S3 server on OpenBSD (Per Fogelstrom).
- 187. Split OpenBSD config support out into a new OpenBSD.cf file
-      (Matthieu Herrb).
- 186. Split the retrace wait out into a separate function in the S3
-      server (Mark Vojkovich).
- 185. Fix a problem with FIFO setting for Mach64 chips with an
-      integrated DAC (Kevin Martin).
- 184. Fix a pixmap corruption problem that shows up on Mach64 [CVG]T chips
-      (Kevin Martin).
- 183. Disallow block write mode for [CVG]T Mach64 chips (Kevin Martin).
- 182. Fix a problem for Mach64 CT-D cards where the server writes to the
-      wrong I/O address, possibly that of another PCI device (Kevin Martin).
- 181. Fix Rage II support in the Mach64 server (Kevin Martin).
- 180. Add preliminary XAA support for the TGA server (Alan Hourihane).
- 179. Don't compile Xprint/Xrm.c because it is already included in
-      attributes.c (Holger Veit).
- 178. Various updates for OS/2 (Holger Veit).
- 177. Fix some typing problems in xf86expblt.c (Alan Hourihane).
- 176. Fix XAA crash for drivers that don't fill in the ServerInfoRec
-      (Harm Hanemaayer).
- 175. Add DPMS support for the MGA driver (Leonard N. Zubkoff).
- 174. Add sync-on-green support to the MGA driver (Leonard N. Zubkoff).
- 173. Add support for display modes that require more than 4MB on
-      Millennium cards (Leonard N. Zubkoff).
- 172. Enable acceleration support for the Trident 9320LCD chips
-      (Alan Hourihane).
- 171. Add parallel make support for the lbxutil Imakefile (Robin Cutshaw).
- 170. Fix a problem with the Xmark script (Andrew E. Mileski).
-
-XFree86 3.2n (3 January 1997)
- 169. Fix some xaa build problems on some platforms.
- 168. Updates to NetBSD.cf, including auto-detection of ELF (Chris Demetriou).
- 167. Add I128 series II detection to scanpci and SuperProbe (Robin Cutshaw).
- 166. Fix a problem in sun.cf (Robin Cutshaw).
-
-XFree86 3.2m (2 January 1997)
- 165. Fix some problems creating Xserver links in XF86Setup (Dirk Hohndel).
- 164. Update to R6.3 public patch 1.
- 165. XAA updates (Harm Hanemaayer).
- 163. Fix problems with out-of-date cirrus_acl.c (Harm Hanemaayer).
- 162. Move all default settings from xf86site.def to xfree86.cf, and leave
-      xf86site.def containing only commented out definitions.
- 161. Fix 'make install' problems in xkbcomp.
- 160. Fix some ZLIB problems.
-
-XFree86 3.2l (31 December 1996)
- 159. Tseng acceleration updates (Koen Gadeyne).
- 158. Add config support for using the system's standard version of libz
-      when it exists (Chris Demetriou).
- 157. Add rules for ELF shared libraries on BSD (Chris Demetriou).
- 156. Recognise __alpha__ as AlphaArchitecture for NetBSD, and treat
-      __alpha__ the same way as __alpha is various part of the code
-      (Chris Demetriou).
- 155. Update NetBSD config file (Chris Demetriou).
- 154. Add code to dynamically recognise NetBSD versions in imake, and
-      add defines to allow massaging of the information returned by
-      uname Chris Demetriou).
- 153. Fix inconsistent usage of malloc/xalloc/Xalloc in the Xprt server.
- 152. Fix segfault at startup of clients linked with libICE on SVR4.0
- 151. Add detection for the 250MHz ramdac used on the PowerDoc Edition
-      variant of the Matrox Millennium (Dirk Hohndel).
- 150. Fix some compile/cpp warnings (Marc Aurele La France).
- 149. Add support to makedepend for the '^' and '? :' operators
-      (Marc Aurele La France).
- 148. Change GZIP to GZIPCMD in Makefiles because of a conflict with
-      an environment variable used by gzip (Marc Aurele La France).
- 147. Fix make depend problem for xdm-shadow (Marc Aurele La France).
- 146. Update Linux a.out support for R6.3 (Harald Koenig).
- 145. Trident doc updates (Alan Hourihane).
- 144. TGUI solidfill updates (Alan Hourihane).
- 143. XC fixes.
-
-XFree86 3.2k (28 December 1996)
- 142. Fix a problem introduced in 3.2i which causes the S3 server to crashed
-      for cards with a Ti3026.
- 141. Updates for GNU libc on Linux, and fix some compile warnings
-      (H.J. Lu).
- 140. Updated Russian XKB layout (Andrey Chernov).
- 139. Workaround for KOI8-R problem in XmbLookupString().  The change
-      is to XLC_XLOCALE/koi8-r (Andrey Chernov).
- 138. Fix some problems with the server build on Alphas (Jay Estabrook).
- 137. Avoid a server hang in the et4000 driver (Koen Gadeyne).
- 136. Add some more acceleration for ET4000 chips (Koen Gadeyne).
- 135. Fix server crash when chipset "et6000" is specified (Koen Gadeyne).
- 134. Cleanup of vgaHW.c (Marc Aurele La France).
- 133. In the vga2 server, use the bank size, not the aperture size, to
-      decide between banked and non-banked support (Marc Aurele La France).
- 132. Fix to FIFO depth calculation in the Mach64 server
-      (Marc Aurele La France).
- 131. Fix some problems with the width of the pixmap used by the VGA servers
-      when the server's VT isn't active (Marc Aurele La France).
- 130. Major ati SVGA driver updates (Marc Aurele La France).
- 129. Fix Xserver/Imakefile problem that sometimes causes problems with
-      cfb24 not being built (Marc Aurele La France).
- 128. Fix some compiler warnings (including a problem with the ScreenInfoRec
-      initialisation in the I128 server) (Marc Aurele La France).
- 127. Updated PC98 TGUI support (Akio Morita).
- 126. Add MMIO support to the TGUI driver, and remove MCLK limits
-      (Alan Hourihane).
- 125. Add pa, Sf, Sb capabilities to the xterm termcap.
- 124. Add Tcl interfaces for the new vidmode functions (Joe Moss).
- 123. Complete the implementation of XF86VidModeAddModeLine() (Joe Moss).
- 122. Some more s3init.c cleanups (Mark Vojkovich).
- 121. XC fixes.
- 120. More R6.3-related updates.
-
-XFree86 3.2j (26 December 1996)
- 119. Integrate X11R6.3 (pre-release) source base.
-
-XFree86 3.2i (20 December 1996)
- 118. Some general cleanups (Stuart Anderson, Dirk Hohndel).
-
-XFree86 3.2h (20 December 1996)
- 117. Fix a "void * used in arithmetic" warning in lnx_video.c.
- 116. Allow the XInput "AlwaysCore" feature to be controlled dynamically
-      via an "integer feedback" (Frederic Lepied).
- 115. Fix TGUI clock programming problems (Alan Hourihane).
- 114. Fix clock scaling with ClockChip "cirrus" (Harm Hanemaayer).
- 113. Fix some compile problems on SVR4 (Takaaki Nomura).
-
-XFree86 3.2g (19 December 1996)
- 112. Separate the function prototypes out of xf86_OSlib.h (Stuart Anderson).
- 111. Fix for change 97 (which was causing a server startup problem)
-      (Harald Koenig).
- 110. Enable accelerated copy plane for 24bpp in XAA.
- 109. Fix some compile problems related to the recent Cirrus changes.
-
-XFree86 3.2f (18 December 1996)
- 108. Enable the XAA driver for cirrus chips with a BitBLT engine and
-      the driver for Laguna family chips (Harm Hanemaayer).
- 107. Modify the support for dot clocks > 85 MHz on the 5436/46
-      (Harm Hanemaayer).
- 106. Fix 24bpp support for the CL-GD5430 (Harm Hanemaayer).
- 105. Add optimized support for the CL-GD5446 to the XAA driver
-      (Harm Hanemaayer).
- 104. When a PCI cirrus chip is detected, enable linear addressing by default
-      (Harm Hanemaayer).
- 103. Better LCD control settings for CL-GD754x for different LCD sizes,
-      and improve 754x LCD type detection (Harm Hanemaayer).
- 102. Modify CRT FIFO threshold setting for the CL-GD7548 (Harm Hanemaayer).
- 101. Don't treat the CL-GD7543 as an Alpine-family chip (Harm Hanemaayer).
- 100. XAA updates (see the NOTES file in the xaa directory for details)
-      (Harm Hanemaayer).
-  99. Support for sharing the core pointer between multiple XInput devices
-      (Frederic Lepied).
-  98. XAA support for the ET6000 (Koen Gadeyne).
-  97. Fix an S3 server crash caused by an off-by-one access when displaying
-      images (Harald Koenig).
-  96. Updates to LynxOS support for 2.5.0 (Thomas Mueller).
-  95. Add a "pc104" XKB layout for keyboards with the extra "Windows" keys
-      (Joe Moss).
-  94. Fix for problem clearing "chordmiddle" flag from XF86Setup (Joe Moss).
-  93. Ti3026 clock programming updates for the MGA driver (Andrew E. Mileski).
-  92. A general s3init.c cleanup and modularization.  This isolates
-      ramdac register save/restore functions, and moves them into
-      s3ramdacs.c (Mark Vojkovich).
-  91. Fix S3 server lockup due to vsync wait when power-saving mode is
-      active (Xavier Ducoin).
-  90. PC98 LinkKit updates (Takaaki Nomura).
-
-XFree86 3.2e (12 December 1996)
-  89. Fix some TGUI clock programming problems (Massimiliano Ghilardi).
-  88. Disable <ctrl><alt><backspace> when in DGA mode (Mark Vojkovich).
-  87. Fix some XAA-related server link problems (Marc Aurele La France).
-  86. Fix some LinkKit problems (David Bateman and Takaaki Nomura).
-  85. Fix some more implicit typing in function declarations (Andreas Schwab).
-  84. Add some more ELSA cards to the Cards file (Harald Koenig).
-  83. Fix the ICS5342 clock limit (Harald Koenig).
-  82. Fix typos in the mga Alpha support.
-  81. Fix a typo in the XThrStub Imakefile (H.J. Lu).
-  80. Resync the PC98 Imakefiles (Takaaki Nomura).
-
-XFree86 3.2d (9 December 1996)
-  79. Updates to SCO Open Server 5 support (Tom Angert and J Kean Johnston).
-  78. Add support for Linux C library version 6 (GLIBC), and fix some
-      prototype problems (H.J. Lu).
-  77. Add Alpha support for the mga driver (SVGA server), and generic
-      driver (Mono/VGA2 server) (Jay Estabrook).
-  76. Fix s3ReadImageBanked() with a planemask (Harald Koenig).
-  75. Add fast bitblt support for the mga driver (Radoslaw Kapitan).
-  74. Allow probing of the Bt485 when an S3 968 is detected (Mark Vojkovich).
-  73. Fix an integer overflow in the S3V server when drawing long lines
-      (Harald Koenig).
-  72. Add detection of the Alliance ProMotion chips to SuperProbe
-      (Joe Moss).
-  71. XAA updates (including disabling non-TE text acceleration)
-      (Harm Hanemaayer).
-  70. Fix pixmap support in XAA (Harm Hanemaayer and Alan Hourihane).
-  69. Update the device-specific XF86Config parsing support to report
-      unknown keyword and options (Egbert Eich).
-  68. Add another check for the fb base address in the S3 server
-      (Harald Koenig).
-  67. Fix some typos in the SuperProbe Imakefile (Harald Koenig).
-  66. Update the AXP/IO Jensen support (David Mosberger).
-  65. Add code to the S3 server to recognise the ELSA 1000PRO/X
-      (Harald Koenig).
-  64. Fix an initialisation problem for Diamond ViRGE/VX cards, which
-      causes a lockup (Harald Koenig).
-  63. Add support for the STREAMS processor to the S3V server (Kevin Brosius).
-  62. Fix a problem in xf86bench.c for OS/2 (Holger Veit).
-  61. Some mga line fixes (Radek Kapitan).
-  60. Chips & Technologies driver updates (includes support for the
-      64200 and 64300 WinGine series of chips, and the 65525 and 65535
-      chips) (David Bateman and Egbert Eich).
-  59. Fix some problems with the new S3 probe code (Mark Vojkovich).
-  58. Allow xterm to output 8-bit characters in VT100 mode (Matthieu Herrb
-      and Thomas Dickey).
-  57. Add a return value to XF86DGAGetVideo() (Mark Vojkovich).
-  56. Add missing write_mem_barrier definitions (Harald Koenig).
-  55. Fix some compile problems with 3.2c.
-
-XFree86 3.2c (24 November 1996)
-  54. Fix some potential buffer overflows in SuperProbe, and don't
-      install it setuid root (Marc Slemko).
-  53. Add support for driver-specific parsing of the XF86Config file's
-      Device section (Egbert Eich).
-  52. Fix S3 virtual resolution handling problem introduced in 3.2a
-      (Mark Vojkovich).
-  51. Add a '-nolisten' flag to the X server to allow disabling of
-      a transport type (Nathaniel D. Daw).
-  50. Update Imake.rules to do better error recovery for missing
-      directory or Makefiles (Thomas E. Dickey).
-  49. Add REP (repeat) control for xterm (Thomas E. Dickey).
-  48. XAA updates (Harm Hanemaayer).
-  47. Add required changes for the PC98 servers to build using XAA
-      (Takaaki Nomura).
-  46. Fix an unaligned access in cfb (Harald Koenig).
-  45. Add support for Alpha Jensen (EISA) using sparse memory MMIO
-      (Martin Ostermann).
-  44. Add working "newmmio" support for AXP (Harald Koenig).
-  43. Add some memory barriers to the ViRGE server for AXP (Harald Koenig).
-  42. Reset the ViRGE (but not ViRGE/VX) GE while reading the BIOS to avoid
-      text font corruption (Harald Koenig).
-  41. Change the S3 ViRGE default base address when PCI config registers
-      can't be accessed (mainly for AXP) (Harald Koenig).
-  40. S3 ViRGE/VX fix (Harald Koenig).
-  39. Patch for mk68 servers (Geert Uytterhoeven).
-  38. Add detection for the S3 Aurora64V+ and Trio64UV+ (Harald Koenig).
-  37. Replace the truncated files in xterm/tektests with full versions
-      (from color_xterm) (Thomas E. Dickey).
-  36. Add some more MGA line code (Andrew Vanderstock).
-  35. Add some MGA macros, especially for access type setting
-      (Radoslaw Kapitan).
-  34. Add MGA screen-to-screen color expansion (not used yet)
-      (Radoslaw Kapitan).
-
-XFree86 3.2b (20 November 1996)
-  33. Fix some compilation problems with 3.2a.
-  32. Fix DGA fb mapping for SVR4 (Richard Coley).
-  31. Fix Hercules mono driver text bug (H.J. Lu).
-
-XFree86 3.2a (18 November 1996)
-  30. Bump default FreeBSD version to 2.1.6.
-  29. TGUI driver updates for PC98 (Akio Morita).
-  28. Fix trident driver compile problem with VGA2 and VGA16 servers
-      (Takaaki Nomura).
-  27. XAA support for the Trident driver (Alan Hourihane).
-  26. Add VT52 emulation to xterm (Thomas E. Dickey).
-  25. Fix a missing resets to groundstate in xterm (Denis Auroux and
-      Thomas Dickey).
-  24. Improve overflow problem in XAA internal benchmarking
-      (Akio Morita).
-  23. XAA support for the mga driver (Radoslaw Kapitan and the Matrox team).
-  22. XAA support for the Cirrus BitBLT and Laguna chips (but not enabled
-      yet) (Harm Hanemaayer).
-  21. XAA support for the ARK driver (Harm Hanemaayer).
-  20. A new acceleration interface (XAA) for the SVGA server (Harm Hanemaayer).
-  19. S3V s3plypt.c changed to use GE, but is slower so still disabled
-      (Harald Koenig).
-  18. Change the S3V GE reset to avoid lockups (Harald Koenig).
-  17. Add WaitIdle() at the end of S3V accel routines to avoid screen
-      corruption from direct fb access while the GE is still active
-      (Harald Koenig).
-  16. Remove unsupported option flags from the S3V server (Harald Koenig).
-  15. Allow large S3 cursors by switching to SW cursor when required
-      (Harald Koenig).
-  14. Fix S3 frame buffer probing and memory leak (Harald Koenig).
-  13. Fix S3 ReadImage with a planemask (when ReadImageNoMem can't be used)
-      (Harald Koenig).
-  12. S3 line and text fixes (Harald Koenig).
-  11. Fix DGA colourmap problems in the W32 server.
-  10. Fix a problem with realloc usage in xrdb for some older OSs
-      (eg, SunOS 4.x) (Wolfgang Rupprecht).
-   9. Fix an xrdb malloc problem (Michael Lipp).
-   8. Fix xload problems on Solaris 2.5 (David Thompson).
-   7. Fix xload problem for most BSD OSs that was introduced in 3.2, and
-      fix some problems in the BSDI-specific code (Matthieu Herrb).
-   6. Modify the external ClockProg support to allow for programmable
-      clocks (ie, no clocks line) (Egbert Eich).
-   5. Fix W32p rev C and rev D PCI ids (Koen Gadeyne).
-   4. Fix a problem which causes a server crash on PANIX/PC98 when using
-      the XFree86-Misc extension (Takaaki Nomura).
-   3. S3 server probe cleanup (Mark Vojkovich).
-   2. Fix XF86Setup compile problem on Solaris (Robin Cutshaw).
-   1. Patches for OS/2 support (Holger Veit).
-
-XFree86 3.2 (26 October 1996)
-1079. Fix a bug in xgc that can cause a SEGV (Takaaki Nomura).
-1078. README and FreeBSD doc updates (Takaaki Nomura).
-1077. RELNOTES updates, and some updates to the preinst and postinst scripts.
-1076. Tell xf86config about the S3V server.
-1075. Fix some typos in XF86Setup.
-1074. Fix a problem with XF86Setup that shows up when there is no
-      <Xroot>/bin/X link present.
-1073. Fix a test restoration problem with the ali driver.
-1072. NetBSD and Solaris doc updates (Matthieu Herrb).
-1071. Cirrus doc updates (Harm Hanemaayer).
-1070. Prevent Oak probe from falsely detecting some Avance Logic chips.
-
-XFree86 3.1.2Zd (24 October 1996)
-1069. Fix a problem with the TGUI driver disabling linear mode when the
-      OS doesn't support it.
-1068. Fix an image stipple problem in the S3, Mach8, Mach32 and 8514 servers
-      (Harald Koenig).
-
-XFree86 3.1.2Zc (24 October 1996)
-1067. Mach64 doc updates (Kevin Martin).
-1066. Xvfb shouldn't depend on cfb24 (Geert Uytterhoeven).
-1065. Update contrib to R6.1.
-1064. C&T doc updates (David Bateman).
-1063. Fix an image stipple problem in the S3V server (Harald Koenig).
-1062. Doc updates (Takaaki Nomura).
-
-XFree86 3.1.2Zb (23 October 1996)
-1061. Fix some NV1 problems, including clock selection problems and
-      pixel corruption problems (David McKay).
-1060. Fix some bad random() prototypes for Linux (Harald Koenig).
-1059. Fix NeqnCmd definition in NetBSD.cf (Matthieu Herrb).
-1058. Chips&Tech doc updates (David Bateman).
-1057. Cards db update for Chips&Tech (David Bateman).
-1056. Some updates to the "supported" contrib clients (Harald Koenig).
-1055. VGADriver doc updates (Stuart Lamble).
-1054. LynxOS doc updates (Thomas Mueller).
-1053. Fix a problem in mgaFillBoxSolid() (Radoslaw Kapitan).
-1052. Fix a serious probe bug in the MGA driver which causes a crash on
-      non-PCI machines (Egbert Eich).
-1051. Fix a serious probe bug in the NV driver (David Bateman).
-
-XFree86 3.1.2Za (21 October 1996)
-1052. Some documentation updates (Dirk Hohndel).
-1051. A few cleanups that have no affect on function (Harald Koenig).
-1050. Fix a problem in XF86Setup (Harald Koenig).
-
-XFree86 3.1.2Z (20 October 1996)
-1049. Update XF86_SVGA man page (Harm Hanemaayer).
-1048. Update Linux README (Dirk Hohndel).
-1047. Fix some mono/4bpp problems introduced by recent ET6000 changes
-      (Koen Gadeyne).
-1046. Updates to the Cards database (Harald Koenig).
-1045. Fix xdpyinfo core dump when the XInput extension is not available
-      (Frederic Lepied).
-1044. Fix SuperProbe mis-detection of S3 ViRGE (Harald Koenig).
-1043. S3V README (Harald Koenig).
-1042. Resync some PC98 Imakefiles (Takaaki Nomura).
-1041. Update XF86Setup card list features, and add 1152x864 video modes
-      (Harald Koenig).
-
-XFree86 3.1.2Gq (19 October 1996)
-1040. Some updates to use the native setlocale() in the GNU libc used
-      by Linux/Alpha/ELF (Ulrich Drepper, Harald Koenig).
-1039. MGA README (Andrew Vanderstock and Dirk Hohndel).
-1038. Fix REQUIREDLIBS problem with dynamic xie.so (Alan Hourihane).
-1037. Update man page versions (Takaaki Nomura).
-1036. Add xf86VTSema checks to the MGA server, move blitter init to
-      HWRestore, and wait for drawing engine before enter/leave VT
-      (Radoslaw Kapitan).
-1035. TGA and Trident doc updates (Alan Hourihane).
-1034. Remove an unused TGA server file (Alan Hourihane).
-1033. Update to the Chips&Tech screen corruption fix (Egbert Eich).
-1032. Fix a typo in the Chips&Tech driver which prevents the "hw_clocks"
-      option from working (David Bateman).
-1031. Move the SVGA 'mx' driver to after the 'chips' driver, because its
-      probe causes problems for the chips driver.  Also, fix a problem
-      in the 'mx' probe where it writes to a register without first saving
-      its contents.
-
-XFree86 3.1.2Gp (18 October 1996)
-1030. Fix the cursor colour not being correctly set in 15/16/32bpp modes
-      on the CT, ET, VT and GT chips (Kevin Martin).
-1029. Change Mach64 block_write behaviour.  Assume that block write mode is
-      initialised by the BIOS, but still allow it to be turned on or off
-      explicitly in the XF86Config (Kevin Martin).
-1028. Set the extended display FIFO LWM bit on the Mach64 CT-D (Kevin Martin).
-1027. Fix the retrace wait in mach64AdjustFrame() (Kevin Martin).
-1026. Delete Mach64 doublescan modes for chipsets that don't support any
-      accelerated doublescan modes (Kevin Martin).
-1025. Set Mach64 display FIFO setting to the values supplied by ATI for
-      various chipset/memory type/memory size/bpp combinations (Kevin Martin).
-1024. Fix some MGA accel problems (Radoslaw Kapitan).
-1023. FreeBSD and NetBSD doc updates (Takaaki Nomura).
-1022. Fix some Mach32 16bit font display problems (Bryan Feir).
-1021. Add support for the ICS1562 clockchip used by the DEC TGA (Harald
-      Koenig).
-1020. Make WaitQueue wait for three more free slots than requested to
-      allow a safety margin in case of coding bugs (the ViRGE will lock
-      up the PCI bus when the FIFO is full) (Harald Koenig).
-1019. S3V fixes for some XTEST errors, and remove debug and unused code
-      (Harald Koenig).
-1018. Preliminary support for the Trident Cyber 938x chipset (Alan Hourihane).
-1017. Update the max clock for the Cirrus 754x with LCD enabled, and
-      deal more gracefully when a clock line is encountered (Harm Hanemaayer).
-1016. Add/implement XF86DGAGetViewPortSize() and add an extra argument
-      to XF86DGAViewPortChanged() which indicates the number of pages
-      being used when multi-buffering (Harm Hanemaayer).
-1015. Move the setting of the XF86DGADirectColormap flag into
-      XF86DGAInstallColormap() so that apps which use this function but
-      don't explicitly set the flag will work correctly.
-
-XFree86 3.1.2Go (17 October 1996)
-1014. Add xterm-r6 entries to the xterm termcap and terminfo files.  These
-      are compatible with the standard X11R6 version of xterm.
-1013. Chips&Tech driver updates, including:  add an option to deal with
-      LCD panel size problems, add an option to use an 18bit bus for some
-      TFT laptops, allow imageblt to be disabled, support sync-on-green
-      for the 65550, improve some screen scrambling problems, add DGA
-      support, fix 24bpp acceleration problems, fix HW cursor colouring
-      problems, update docs (Egbert Eich, David Bateman, Nozomi Ytow,
-      Marc de Courville, Jens Mauer, Adam Sulmicki).
-1012. BlankDelay settings for ViRGE (non-VX) (Harald Koenig).
-1011. More S3V ROPs for planemask simulation for BLTs (not used yet)
-      (Harald Koenig).
-1010. S3V fix for some image ops (Harald Koenig).
-1009. LynxOS microSPARC updates (Thomas Mueller).
-1008. OS/2 updates (Holger Veit and Sebastien Marineau).
-1007. TGA server updates, including disallow interlace modes, parse /proc/pci
-      output to find the memory base address (Alan Hourihane).
-1006. Add a DGA flag (XF86DGADirectColormap) to control when the colourmap
-      is in the exclusive control of XF86DGAInstallColormap().  This allows
-      older DGA clients which don't use XF86DGAInstallColormap() to work
-      as before.
-1005. Fix mmap in libXxf86dga for FreeBSD 1.1.5.
-1004. Fix a typo in xf86writepci() which causes it to return without doing
-      anything (URATA Shuichiro).
-
-XFree86 3.1.2Gn (16 October 1996)
-1003. Fix a problem with the ospex Imakefile regarding the building of
-      a non-shared library.
-1002. Increase the listen(2) backlog value in Xtranssock.c.
-1001. VidMode extensions updates (Joe Moss).
-1000. Add QueryDirectVideo and ViewPortChanged functions to the DGA
-      extension (Harm Hanemaayer and Mark Vojkovich).
- 999. Fix a problem where parts of lines incorrectly appear black with the
-      S3V server (Berry Dijk).
- 998. Fix some S3V problems that show up when running xtest (Harald Koenig).
- 997. Change MGAAdjustPitch to choose a pitch for which acceleration is
-      possible (Ansgar Hockmann).
- 996. Fix some server compile warnings (Thomas E. Dickey).
- 995. Set HasPoll to YES for NetBSD 1.2 and OpenBSD.  This solves the
-      fundamental problem select has with the width of a fd_set
-      (Matthieu Herrb).
- 994. Use modified ROPs and colour bit patterns to simulate the planemask
-      where possible in the S3V line code (Harald Koenig).
- 993. Report the Wacom function/macro button as key events (Frederic Lepied).
- 992. Initial DSP programming of Mach64 VT-B and GT-B implemented, but not
-      enabled yet (Kevin Martin).
- 991. Mach64 CT, ET, VT, GT clock programming changed to be more accurate.
-      Previously it used integer arithmetic, now it uses floats (Kevin Martin).
- 990. Mach64 VT-B and GT-B extra clock divisors (3,6,12) implemented
-      (Kevin Martin).
- 989. Fix Mach64 VT-B and GT-B memory detection (Kevin Martin).
- 988. Updates for LinkKit and SVR4 README files (Takaaki Nomura).
- 987. Add a MGAWAITFIFOSLOTS macro for use with accel functions
-      (Andrew Vanderstock).
- 986. Fix for MGA line colour that works at all depths (Andrew Vanderstock).
- 985. Add a wait for retrace to the end of most Adjust functions when DGA
-      mode is active (Mark Vojkovich and Harm Hanemaayer).
- 984. Fix a typo in XF86Setup, and change the vsync parameters of some
-      of the default monitor types (Harm Hanemaayer).
- 983. ET6000 support for linear memory and 16/24/32bpp in the SVGA server
-      (Koen Gadeyne).
- 982. OpenBSD no longer defines __NetBSD__ in their cpp (Matthieu Herrb).
- 981. OpenBSD/NetBSD doc updates (Matthieu Herrb).
-
-XFree86 3.1.2Gm (13 October 1996)
-980. Set foreground colour for MGA line code (Ansgar Hockmann).
-979. Add weight 555 support for the Cirrus 5464 (Corin Anderson).
-978. Fix Cirrus HAVE546X macro to detect the 5464 (Corin Anderson).
-977. Updates to Cirrus docs and Cards database (Corin Anderson).
-976. Add detection of the ARK2000MI to SuperProbe (Harm Hanemaayer).
-975. Cirrus updates, including fix MMIO for the Cirrus 5446, update some
-     DAC register values, disallow clocks line and change max clock for
-     LCD displays (Harm Hanemaayer).
-974. Add some sanity checks for potential VT problems in the cirrus and
-     ARK drivers (Harm Hanemaayer).
-973. Fix for LynxOS microSPARC (Thomas Mueller).
-972. Update the LynxOS docs for 3.2 (Thomas Mueller).
-971. Change the various malloc/free calls in the XKB code to use the
-     XkbMalloc/XkbFree equivalents (Joe Moss).
-970. Update the Wacom driver to support the new stylus with two side
-     buttons.  The second side button is reported as button 4
-     (Frederic Lepied).
-969. Update the LinkKit to build the SVGA and I128 servers, and update the
-     LinkKit README (Takaaki Nomura).
-968. DGA support for the W32 server (Koen Gadeyne).
-967. Resynch some PC98 Imakefiles (Takaaki Nomura).
-966. LinkKit updates for a PC98-only LinkKit (Takaaki Nomura).
-965. Add some missing bits to the MGA solid box fill patch (Radoslaw Kapitan).
-964. Fix a typo in SuperProbe that would result in incorrect chipset
-     reporting for some Cirrus chips (Harm Hanemaayer).
-
-XFree86 3.1.2Gl (10 October 1996)
-963. PC98 doc updates (Michio "Karl" Jinbo).
-962. Add some solid box fills to the MGA driver (Radoslaw Kapitan).
-961. Cirrus and Ark doc updates (Harm Hanemaayer).
-960. Apply 959 to the Mach32 server.
-959. Ignore clipping boxes completely to the left of right of each glyph
-     for the S3, Mach8 and 8514 servers (Hans Nasten).
-958. LinkKit fixes for PC98 (Takaaki Nomura).
-957. Fix Imakefile problem related to dynamic loading for PC98
-     (Michio "Karl" Jinbo).
-956. ViRGE/VX update (Harald Koenig).
-955. Add power_saver support to the TGA server (Alan Hourihane).
-954. Some more line/seg updates for S3V (Harald Koenig).
-953. Fix some problems with the previous S3V planemask patch (Harald Koenig).
-952. Add code to read the MGA card information from the BIOS.  This
-     allows the RAMDAC type/speed to be determined (Andrew E. Mileski).
-951. Disable 24/32bpp for S3V server because it doesn't work yet.
-950. Driver for NVidia NV1 / SGS-Thomson STG2000 (David McKay).
-
-XFree86 3.1.2Gk (8 October 1996)
-949. Use cfb code in the S3V server when the planemask is non-trivial
-     (Harald Koenig).
-948. More line/seg fixes for the S3V server (Harald Koenig).
-947. Fix XORing text (and other ROPs) for the S3V server (Harald Koenig).
-946. Force 1-cycle EDO mode for the ViRGE/VX (Harald Koenig).
-945. Disable the font and pixmap caches in the S3V server (not implemented).
-944. Apply 943 to the Mach32 and S3V servers.
-943. Ignore clipping boxes completely above or below the displayed text
-     for the S3, Mach8 and 8514 servers.  This improves performance
-     when a window is partly covered by a shaped window (Hans Nasten).
-942. Resync PC98 Imakefiles, and update documentation (Michio "Karl" Jinbo).
-941. Some LinkKit changes to prevent conflicts between the xf86 and xf98
-     linkkits when doing a combined build/install.
-940. Fix for keycodes/xfree98 (Takefumi Tsukada).
-939. LinkKit support for PC98 servers (Takaaki Nomura).
-938. Fix MGA 24bpp problems (Ansgar Hockmann).
-937. Fix a potential memory interleave problem and spurious warning messages
-     in the Cirrus driver (Corin Anderson).
-
-XFree86 3.1.2Gj (6 October 1996)
-936. Build PEX, XIE as dynamically loaded modules by default where it is
-     supported.
-935. Fix some S3gendac interface changes (Koen Gadeyne).
-934. Fix a lex warning for reconfig (Koen Gadeyne).
-933. Fix a ROP problem in the W32 solid fill code (Koen Gadeyne).
-932. Dynamic PEX, XIE extension support for Linux/ELF.
-931. 24bpp packed support for the MGA driver (Ansgar Hockmann).
-930. Fix the way the list of clocks is derived for the Cirrus driver
-     (Harm Hanemaayer).
-929. Fix problems with 16bpp for a 1MB Cirrus 5434 (Harm Hanemaayer).
-928. Fix for xdm indirect query for ISC (Michael Rohleder).
-927. Remove virtual size check in the mach32ValidMode (Michael Rohleder).
-926. Fix a typo in lib/Xbsd (Michael Rohleder).
-925. Fix "nolinear" mode in the MGA driver (Radoslaw Kapitan).
-924. Add memory detection to the MGA driver (Radoslaw Kapitan).
-923. Update NetBSD/OpenBSD docs (Matthieu Herrb).
-922. Add OpenBSD/mips config support (Per Fogelstrom, Matthieu Herrb).
-921. Update OpenBSD version to 2.0 (Matthieu Herrb).
-920. Updates to the S3 ViRGE line code (Harald Koenig).
-919. Updated ViRGE/VX support (Harald Koenig).
-918. TGA server shouldn't report DGA support (Alan Hourihane).
-917. Alpha-related config updates (Harald Koenig).
-916. Updates to Cirrus probing in SuperProbe (Harm Hanemaayer).
-915. Fix a Cirrus bitmap overrun problem (Harm Hanemaayer).
-914. Fix Cirrus FIFO settings for 5436/5446 (Harm Hanemaayer).
-913. Fix Cirrus HW cursor colours at 32bpp (Harm Hanemaayer).
-912. Fix 24bpp support for Cirrus 54xx (Harm Hanemaayer).
-
-XFree86 3.1.2Gi (3 October 1996)
-911. SCO updates.  SCO5 is now the only supported version (there are
-     still problems to be resolved though) (J. Kean Johnston).
-910. LinkKit updates and related cleanups (Marc Aurele La France).
-909. Updated code to program the Ti3026 clock in the MGA server
-     (Andrew E. Mileski).
-908. Preliminary S3 ViRGE/VX support (Harald Koenig).
-907. Fix S3 PCI read burst disable problem (Harald Koenig)
-906. Fix SuperProbe memory reporting for the S3 ViRGE, ViRGE/VX, and
-     separately report off-screen memory (Harald Koenig).
-905. Fix MGA interleave and 32bpp problems (Radoslaw Kapitan).
-904. Fix a RD_MASK problem that shows with 928 cards (at least on some
-     PC98 servers) (Michio "Karl" Jinbo, Harald Koenig).
-903. Allow xterm to be statically linked with libtermcap on Linux
-     (Dirk Hohndel).
-902. Fix screen save/restore on VT switch for the TGA server (Alan Hourihane).
-901. Chips&Tech updates, including a fix for line acceleration
-     problems (David Bateman).
-900. VidMode extension changes/enhancements (not complete yet) (Joe Moss).
-899. S3 ViRGE solid line code (Harald Koenig).
-898. S3 ViRGE updates, including using cfb calls for non-implemented
-     functions (Harald Koenig).
-897. Fix for a line drawing problem in the Cirrus driver (Harm Hanemaayer).
-896. Ark driver updates, including fixes for FIFO settings, HW cursor at
-     16/32bpp, virtual panning at 24bpp, and enable BitBlt acceleration at
-     32bpp (Harm Hanemaayer).
-895. LynxOS microSPARC updates (Thomas Mueller).
-894. Add support for Japanese 106 key keyboards on PANIX.  This is enabled
-     with the 'panix106' keyword in the Keyboard section (Takefumi Tsukada).
-893. README.SVR4 update (Takaaki Nomura).
-892. ValidMode function for Mach32 (Bryan Feir).
-891. Fix a Mach32 problem with VT switch screen save/restore when the
-     virtual width is less than 1024 (Bryan Feir).
-890. Updated NetBSD aperture driver (Matthieu Herrb).
-889. Allow the PEX and XIE server extensions to be built as dynamic modules
-     (FreeBSD and NetBSD so far).  (Matthieu Herrb).
-
-XFree86 3.1.2Gh (29 September 1996)
-888. Replace virtualX by displayWidth where appropriate in many SVGA drivers.
-887. Fix virtual width/pitch checking/setting for the MGA driver.
-886. Solid line acceleration for the MGA driver (Dirk Hohndel).
-885. Improve the way scanline pitch restrictions are implemented for the
-     SVGA server.
-884. Set default W32 black/white pixel values the same as for the other
-     servers.
-883. Fix some W32 stipple problems (Glenn Lai).
-882. Allow "mclk" as a synonym for "s3mclk" (Harm Hanemaayer).
-881. Adjust mode timings in the ARK driver when required for 24bpp operation
-     and for HW cursor operation (Harm Hanemaayer).
-880. Some MGA driver cleanups.
-879. Fix selection of interleave mode for MGA (Ansgar Hockmann).
-878. Add "fifo_conservative" option for the ARK driver (Harm Hanemaayer).
-877. Possible fix for ICS5342 MCLK calculation in the Ark driver
-     (Harm Hanemaayer).
-876. Fix max clocks when ClockChip "cirrus" is used (Harm Hanemaayer).
-875. XF86Setup updates (see XF86Setup/CHANGELOG for details) (Joe Moss).
-874. LCD code for Cyber9320 in PC98_TGUI server (X98 core team).
-873. Fix typos in pc98_tgui.{c,h} (X98 core team).
-872. PC98 Imakefile updates (X98 core team).
-871. PC98 documentation updates (X98 core team).
-870. New Chips&Tech accelerations, including: multiple depth ImageGlyph
-     and PolyGlyph for 65545, 8bpp CopyPlane1to8 for 65545, 8bpp
-     FillRectTransparentStippled32 and FillRectOpaqueStippled32 for 65545,
-     modified simple BitBlt and Solid fill for 65550, stipple and tile
-     functions for 65550 (Egbert Eich, Xavier Ducoin, David Bateman).
-869. Chips&Tech driver fixes, including: improve stability of
-     suspend/resume, fix DSTN screens with 65550, reduce the size of
-     MMIO regions, fix PCI burst mode, disable line acceleration because
-     it can cause a server crash in rare circumstances (Egbert Eich,
-     Xavier Ducoin, David Bateman).
-868. Make the Cirrus fifo options work for the 546x chips (Corin Anderson).
-867. Support for the Cirrus 5464 (Corin Anderson).
-866. Add a hook to the SVGA server to allow drivers to specify a display
-     width (pitch) which is different from the virtual width.  This
-     is required for some Cirrus chipsets (Corin Anderson).
-865. 24bpp packed pixel Cirrus support (Harm Hanemaayer and Corin Anderson).
-864. Work around a problem on NetBSD/OpenBSD where dlsym() searches for
-     the symbol in the whole executable rather than just in the modules
-     specified (Matthieu Herrb).
-863. Add an X server and config/imake support for LynxOS microSPARC 2.4.0
-     (Thomas Mueller).
-862. Remove stale fb shared memory before dying on LynxOS (Thomas Mueller).
-861. Work around a popen/pclose bug on LynxOS in the server XKB code
-     (Thomas Mueller).
-860. Work around a bash problem on LynxOS which affects rstart/Imakefile
-     (Thomas Mueller).
-859. Solid vertical and horizontal lines for the S3 ViRGE server (Berry Dijk).
-858. Fix max clock for TGA (Alan Hourihane).
-857. Fix for TGA VT switching problems (Alan Hourihane).
-856. Add code to detect the ViRGE/VX (Dirk Hohndel).
-
-XFree86 3.1.2Gg (26 September 1996)
-855. Preliminary support for the Matrox Millennium (MGA 2064W)
-     (Radoslaw Kapitan, Andrew Vanderstock, Dirk Hohndel).
-
-XFree86 3.1.2Gf (25 September 1996)
-854. Mach32 documentation (Bryan Feir).
-853. Improve Mach32 ramdac probing in SuperProbe (Bryan Feir).
-852. Fix xf86writepci() prototype (Alan Hourihane).
-851. TGA server and documentation updates (Alan Hourihane).
-850. Fix missing argument in the QueryBestSize functions in the SVGA server
-     (Harm Hanemaayer).
-849. Another fix for usage of XInput defines, and make initext depend on
-     ICONFIGFILES (Marc Aurele La France).
-848. Improve reliability of detecting Mach64 cards in SuperProbe, the
-     Mach64 server and the ati driver (Marc Aurele La France).
-847. Complete s3im.c for s3_virge (Harald Koenig).
-846. Fix s3_virge framebuffer detection (Harald Koenig).
-845. Fix s3_virge compile problems when using a compiler other than gcc.
-844. Missing patch to vgaCmap.c for item 842 (Harm Hanemaayer).
-
-XFree86 3.1.2Ge (24 September 1996)
-843. Add Trio/ViRGE clock support to the "s3_svga" driver.  This is still
-     incomplete, and for development use (Harald Koenig).
-842. Add vgaGetInstalledColormaps() and support for 8-bit colour components
-     to the SVGA server (Harm Hanemaayer).
-841. ARK driver updates, including: fix problems with BitBlts at 24bpp,
-     fix hw cursor at 8bpp, fix some ZoomDAC problems, and add support
-     for 8-bit colour components (dac_8_bit) at 8bpp (Harm Hanemaayer).
-840. Fix some typos in compiler.h (Harald Koenig).
-839. Initial ViRGE s3im.c, and remove unneeded s3linear.h and bank switching
-     (Harald Koenig).
-838. Fix some XInput and XKB defines (Marc Aurele La France).
-837. LinkKit fixes (Marc Aurele La France).
-836. Add ARK Logic chipset detection to SuperProbe (Harm Hanemaayer).
-835. Fix a typo in xkbcomp/symbols/de (Thomas Mueller).
-
-XFree86 3.1.2Gd (23 September 1996)
-834. Rename ViRGE driver from s3_generic to s3_virge (Dirk Hohndel).
-833. Don't reference uninitialised s3MmioMem in ViRGE server (Harald Koenig
-     and Dirk Hohndel).
-832. Don't do S3 bug tests for 928 and earlier (Harald Koenig).
-831. ViRGE fixes, including BITBLT and text clipping (Harald Koenig).
-830. Updates to the Cards file for Cirrus and Ark (Harm Hanemaayer).
-829. xf86config updates, including 24bpp support, and making "virtual"
-     optional (Harm Hanemaayer).
-828. Fix trident probe so that it restores all registers it touches
-     (Harm Hanemaayer).
-827. ARK driver updates, including: auto-detect the ZoomDAC and print out
-     the RAMDAC type, use DRAM bandwidth for CRT FIFO setting, don't allow
-     5-5-5 weight for 16bpp with 1000PV and ZoomDAC, and add sanity check
-     for off-screen CopyWindow (Harm Hanemaayer).
-826. Fix a typo in the TGA server that could cause it to think it has found
-     a valid mode (Alan Hourihane).
-825. Don't try to use -ldl for XF86Setup on non-ELF Linux (Harald Koenig).
-824. Add "slow_dram" option for the W32 server to fix some problems with
-     older cards (Dirk Hohndel).
-
-XFree86 3.1.2Gc (22 September 1996)
-823. XKB data file updates for jp106/jp (Takaaki Nomura).
-822. S3 Virge server (preliminary version) (Harald Koenig).
-821. ARK driver updates, including basic BitBlt acceleration, improved
-     ramdac support, experimental 24bpp support, and max dot clocks take
-     the memory clock into consideration (Harm Hanemaayer).
-820. Minor xdm and xterm changes to allow them to compile on FreeBSD 1.1.5.
-819. Fix Trident probe in SuperProbe so that it doesn't corrupt ET6000
-     display (Koen Gadeyne).
-818. Fix Sierra 1502X RAMDAC handling in the W32 server (Dirk Hohndel).
-817. TGA server for Alpha machines.  Not accelerated at this stage
-     (Alan Hourihane).
-816. SuperProbe update for ELSA Gloria (Harald Koenig).
-815. Fix/add 15/16bpp support for S3 805i with AT&T 20C498 (Hermann Lauer).
-814. Improve S3 clipped text performance (Harald Koenig).
-813. Fix a typo in xkbcomp/rules/xfree86 (Joe Moss).
-812. Add detection for the Cirrus 7548, and treat it like the other 754x
-     chips (Harm Hanemaayer).
-811. Change xterm valid-response code in DECRQSS from 0 to 1 to match a
-     real VT420 terminal (Thomas E. Dickey).
-810. Add a resource 'decTerminalID' to control the reporting level of
-     xterm (e.g., VT100, VT220), and use it to implement/correct the
-     DA1, DA2 and DECRPTUI reports (Thomas E. Dickey).
-809. Fix xterm restoration of color for bold/underline color mode
-     (Thomas E. Dickey).
-
-XFree86 3.1.2Gb (15 September 1996)
-808. Update PC98 Imakefiles (Michio "Karl" Jinbo).
-807. Fixes for problems with the PC98 TGUI server (Michio "Karl" Jinbo).
-806. Fix/workaround to avoid DGAInstallColormap() being affected by
-     window managers.
-805. Fix some problems related to the change in the xf86scanpci() interface.
-
-XFree86 3.1.2Ga (14 September 1996)
-804. Implement s3ValidMode() (Mark Vojkovich).
-803. Modify the ValidMode interface in preparation for some VidMode extension
-     changes.
-802. Fix a problem with the XOpenDisplay buffer overflow fix (item 734 below)
-     (X Consortium, Kaleb Keithley).
-801. Fix FIFO setting for Cirrus Alpine (543x, 5446) cards with 1MB
-     (Harm Hanemaayer).
-800. Modify Cirrus asm code to allow PCI burst accesses (Harm Hanemaayer).
-799. Change default for MvCmd to 'mv -f'.
-798. Redo the xf86PCI code, based on that in FreeBSD-current.
-797. Update xf86PCI code to deal with PCI bridges and multi-function
-     devices (Mihoko Tanaka).
-796. Fix a problem with the Sigma L-View driver (and presumably the same
-     problem in the HGC1280 driver (Norbert Berzen).
-795. Add a "Sundeadkeys" XKB variant for European keyboards.
-794. Change the "es" XKB symbols to match a Spanish keyboard (Jon Tombs).
-793. Update Cards database.
-792. Fix panning problem with some Cirrus cards (Corin Anderson).
-791. Map the S3 MMIO area separately (Harald Koenig).
-790. Don't allow S3  newmmio to be selected for chips that don't support
-     it (Harald Koenig).
-789. Fix for Linux/m68k frame buffer device (Geert Uytterhoeven).
-788. Fix detection of some SiS chips.
-787. Turn on 32-bit mode for TGUI chips.  This allows PCI burst to be
-     turned on by default.  (Alan Hourihane).
-786. Disable 16bpp for the TGUI9320LCD since it doesn't work (Alan Hourihane).
-785. Fix ET6000 problems with the VGA16/Mono servers (Koen Gadeyne).
-784. Speedups for the W32 arc and teblt8 code (Glenn Lai).
-783. Fix W32 line-drawing using the wrong ROP for horizontal and vertical
-     lines (Koen Gadeyne).
-782. Add a new xdm access control keyword "NOBROADCAST" to disable answering
-     broadcasts from specified hosts (Kimmo Suominen).
-781. Make xf86config run the correct server by name rather than trying
-     to run 'X' (Holger Veit).
-780. Change default "gb" XKB symbols (James Hawtin).
-779. Config and documentation updates for LynxOS (Thomas Mueller).
-778. Update XF86Setup's device list for LynxOS (Thomas Mueller).
-777. Fix compile problem when XINPUT isn't defined (James Hawtin).
-776. XF86Setup needs to be linked with -ldl on Solaris (James Hawtin).
-
-XFree86 3.1.2G (3 September 1996)
-775. Fixes for some NECS3 server problems (Naofumi Honda).
-774. Fix some XF86Setup typos.
-773. OS/2 updates (Holger Veit).
-
-XFree86 3.1.2Fc (3 September 1996)
-772. XF86Setup updates (see XF86Setup/CHANGELOG for details) (Joe Moss).
-771. PCI detection for the Alliance ProMotion 6422 (Kent Hamilton).
-770. Documentation updates (Dirk Hohndel, Matthieu Herrb).
-769. Updates for OpenBSD, including support for recent changes to the
-     console drivers (Matthieu Herrb).
-768. Need rint() for ISC and Lynx (Michael Rohleder).
-
-XFree86 3.1.2Fb (1 September 1996)
-767. S3 support for the Diamond SS2410 RAMDAC (eriks).
-746. Fix resize on Linux (for terminfo) (Rik Faith).
-745. Updates to Cyrillic fonts (Andrey Chernov).
-
-XFree86 3.1.2Fa (31 August 1996)
-744. Fix xterm's handling of SGR 22, 24 and 25 in combination with colorUL
-     and colorBD resources.  Also noted & fixed reset of colored
-     underline/bold with SGR 0 (Thomas E. Dickey).
-743. Fix a typo in the xterm termcap (Thomas E. Dickey).
-742. Don't allow the "fb_debug" option when newmmio is used (Harald Koenig).
-741. Make sure s3Port59/s3Port5A are initialised before s3Init() is called
-     (Harald Koenig).
-740. Force 64MB alignment of linear FB, even when MemBase is given in
-     the config file (Harald Koenig).
-739. Disable newmmio when "nolinear" is specified, or when linear memory
-     mapping isn't available (Harald Koenig).
-738. Fix C&T driver printing out a line in its probe in cases where a
-     C&T chip hasn't been detected.
-737. Driver for the Alliance ProMotion 6422 (Alliance Semiconductor, and
-     Kent Hamilton).
-736. Make the Ark SVGA driver detect the ARK2000MT, and treat it as an
-     ARK2000PV.
-735. Updates for SCO OpenServer 5 support (J. Kean Johnston).
-734. Fix for a buffer overflow problem in XOpenDislpay (libX11)
-     (X Consortium, Kaleb Keithley).
-733. Some imake/config updates (Dirk Hohndel).
-732. Add a '-nolock' server command line option to disable the X server
-     locking (Roger Wolff).
-731. Scanpci updates: Check general pci-pci bridges, add some more
-     vendor and device IDs, and add a '-f' flag to print out the full
-     information -- otherwise just print the vendor/device name
-     (Mihoko Tanaka).
-730. Updates for ISC (Michael Rohleder).
-729. Fix typo in XF86Setup/mouse.tcl (Thomas Mueller).
-728. Fix malloc problem in TLI xtrans code (Joe Moss).
-727. Fix some WaitQueue problems with the S3 server (Naofumi Honda,
-     Takaaki Nomura, Harald Koenig).
-726. Fix for display problem with Trio64V+ at 16bpp (Harald Koenig).
-725. Fix clock limit arrays for Cirrus 754x chip (Corin Anderson).
-724. Add a "DefaultColorDepth" keyword for the Screen section of the
-     XF86Config (Dirk Hohndel).
-723. Fix problem using non-linear mode with TGUI chips (Alan Hourihane).
-722. Turn off PCI burst write by default for TGUI chips.
-
-XFree86 3.1.2F (27 August 1996)
-721. Update the QuickStart guide with details about using XF86Setup (Joe Moss).
-720. Some XF86Setup updates (Joe Moss).
-719. Avoid a possible malloc/free problem in the xtrans TLI code (Joe Moss).
-718. Some Linux a.out lib updates for libX11, libXt (Harald Koenig).
-717. Fix 32bpp S3 newmmio problem (Harald Koenig).
-
-XFree86 3.1.2Eo (26 August 1996)
-716. Disable 24bpp packed mode in S3 server because it doesn't work properly
-     yet (Harald Koenig).
-715. Don't use newmmio S3 driver by default on Alpha architecture (or
-     for ISC) (need to specify it explicitly in XF86Config) (Harald Koenig).
-714. Fix some incorrect printf-style arguments in xkbcomp (Thomas E. Dickey).
-713. Fix compiler warnings, including uninitialised variables, missing
-     prototypes, etc (Thomas E. Dickey).
-712. XF86Setup updates (Joe Moss).
-711. Fix for some potential buffer overrun problems in libXt and libX11 that
-     can lead to security holes.
-
-XFree86 3.1.2En (25 August 1996)
-710. Build/install the xkbui library regardless of whether XF86Setup is
-     being built.
-709. Fix lots of compiler warnings and related problems when building on
-     Alpha (Richard Henderson).
-708. Fix missing function prototype problem in libXi that causes problems
-     on Alpha platforms (Richard Henderson).
-707. XF86Setup updates.
-
-XFree86 3.1.2Em (24 August 1996)
-706. Swap acute and apostrophe keys in de(nodeadkeys) (Michael Rohleder).
-705. ISC documentation updates (Michael Rohleder).
-704. Chips & Tech documentation update (Egbert Eich).
-703. Chips & Tech driver updates, including a fix for a 65545 PCI problem,
-     and a hack/option for a suspend/resume problem (Egbert Eich).
-702. Major updates to XF86Setup (Joe Moss).
-701. Updates to the Cards database (various).
-700. ATI (SVGA) driver update (Marc Aurele La France).
-699. Cards file update for AGX (Henry Worth).
-698. Fix for a BIOS initialisation problem on some VideoLogic (S3) cards
-     (Harald Koenig).
-697. Fix some 32bpp problems with S3 newmmio (Harald Koenig, Bernd Lind).
-696. Fix some PCI lockups when using S3 newmmio mode (Harald Koenig).
-
-XFree86 3.1.2El (23 August 1996)
-695. NetBSD/OpenBSD doc updates (Matthieu Herrb).
-694. Fix typo in rules/xfree86 (Joe Moss).
-693. Fix some virtual desktop scrolling bugs with the CL-GD5462 in the
-     Cirrus driver (Corin Anderson).
-692. Set BSD (syscons/pcvt) keyboard to K_RAW after establishing the tty
-     settings (was done in the opposite order) (Naofumi Honda).
-691. Fix PCVT_SUPPORT in BSD xf86KbdOn/Off functions (Naofumi Honda).
-690. Add correct handling of PCI connect/disconnect for the PC98 S3 968
-     server (Naofumi Honda).
-689. Fix PCI probing for PC98 machines (Michio Jinbo).
-688. Fix mask used for TGUI fb address when membase is supplied (Michio Jinbo).
-687. Add an xterm option/resource to allow text selection to be shown
-     differently -- ie, only highlight the characters selected when selecting
-     beyond the end of a line (Thomas E. Dickey).
-686. Fix PCI base address for S3 868/968, and newmmio fixes (Harald Koenig).
-685. Fix problem with memory allocation in XKB that could cause the server
-     to crash (Joe Moss).
-
-XFree86 3.1.2Ek (21 August 1996)
-684. Fixes for m68k support (Geert Uytterhoeven).
-683. Naming changes for m68k servers and config options (Geert Uytterhoeven).
-682. Update SuperProbe to identify the amount of memory for a 65550/54,
-     and fix detection of 65545 (David Bateman).
-681. Fix for 65545 PCI problems in the C&T driver (Egbert Eich).
-680. resync os2_select.c (Holger Veit).
-
-XFree86 3.1.2Ej (20 August 1996)
-679. Fix install problem when xkbcomp is linked against shared libs.
-678. Prevent server exit if the mouse device is changed to something
-     unsuitable (Joe Moss).
-677. XF86Setup updates (Joe Moss).
-676. Update XF86Config man page and sample XF86Config file for XKB changes
-     (Joe Moss).
-675. LinkKit fixes (David Bateman).
-674. Chips & Tech driver updates (David Bateman and others?).
-673. xterm bug fixes (Thomas E. Dickey).
-672. PCI probe fix for S3 server (Harald Koenig).
-671. Support for new MMIO style for 868/968/Trio64V+, and MMIO support
-     (with optimised use of memory barriers) for Alpha/AXP.  This currently
-     has problems at 32bpp (Bernd Lind, Harald Koenig).
-670. Use POSIX termios for xterm for all Linux systems (Richard Henderson).
-669. Generalise mmap access to DENSE I/O memory for Alpha (Richard Henderson).
-668. 32/64 bit cleanup, especially in server's XIE code (Richard Henderson).
-667. Config updates for Linux/Alpha (Richard Henderson).
-666. Updates for OS/2 (Holger Veit).
-665. Fix problems building XF86Setup with BuildServersOnly set to YES.
-
-XFree86 3.1.2Ei (18 August 1996)
-664. Fix some PC98 Imakefile problems (Michio "Karl" Jinbo).
-663. Linux/m68k support (Geert Uytterhoeven, Martin Schaller, Gary Henderson).
-662. Change the S3 server's handling of situations where mode choices
-     cause problems.  It is now less likely to exit in these situations.
-661. Add a -bestRefresh command line option to the X servers to change
-     the mode selection to pick the mode with the best refresh rate when
-     multiple modes of the same name are available.
-660. XF86Setup updates (see XF86Setup/CHANGELOG) (Joe Moss).
-
-XFree86 3.1.2Eh (14 August 1996)
-659. Update Cyrillic fonts (Andrey Chernov).
-658. Add support for the CL-GD5462 to the cirrus driver, and update
-     documentation for recent cirrus driver changes (Corin Anderson).
-657. XF86Setup updates (Joe Moss).
-656. Fix some LynxOS-related typos in the config (Thomas Mueller).
-655. Add a man page for the DGA extension.
-
-XFree86 3.1.2Eg (14 August 1996)
-654  Update Japanese docs (Michio "Karl" Jinbo).
-653  Add XF98_GA968 server for GA-968V4/PCI(S3 968) (Michio "Karl" Jinbo).
-652. Bring the PC98 tree into sync with the main tree, and add XF86Setup
-     (Michio "Karl" Jinbo).
-651. Fix problems with 32bpp sparse mode that were introduced in 3.1.2Eb.
-     Need to check that this fix works OK with 24bpp packed mode.
-650. Fix some compiler warnings (Thomas E. Dickey).
-649. Mods to ct_driver.c so that it will compile on SVR4.0 (no nested
-     asm calls, and work around a code generation problem).
-648. Fix some problems with mouse changes in 3.1.2Ef (Joe Moss).
-
-XFree86 3.1.2Ef (13 August 1996)
-647. ET6000 support for the SVGA and W32 servers.  The support in the
-     W32 server is accelerated (Koen Gadeyne).
-646. Add support to xterm for most vt220 and vt320 terminal features
-     (Thomas E. Dickey).
-645. Support for I128 series II cards (Robin Cutshaw).
-644. Wacom driver updates (Frederic Lepied).
-643. Support for core motion history management through mi (Frederic Lepied).
-642. Improved integration of mouse with XInput (Frederic Lepied).
-641. Major updates to XF86Setup (Joe Moss).
-640. Update to latest version of XKB.
-639. Fix broken 32bpp sparse support in S3 server (there are still some
-     problems though, and they are also seen with the Mach64 server).
-
-XFree86 3.1.2Ee (11 August 1996)
-638. Implement ech and ech1 terminal capabilities for xterm (Thomas E. Dickey).
-637. Add blinking cursor support for xterm (disabled for now)
-     (Thomas E. Dickey).
-636. Fix a PEX font struct being freed twice (Richard Henderson).
-635. Make xterm tolerant of applications that allocate the whole colour map
-     (by disabling colour mode if the ANSI colours are set with non fg/bg
-     values) (Thomas E. Dickey).
-634. Allow ISO colour support to be #ifdef'd out in xterm.  This allows
-     xterm's memory usage to be significantly reduced when colorMode is not
-     enabled (Thomas E. Dickey).
-633. Reduce flickering during resize for ReverseVideo in xterm
-     (Thomas E. Dickey).
-632. Fix xterm core dump problem on IRIX 5.2 (Thomas E. Dickey).
-631. Update scanpci to detect the #9 I128 series II (Robin Cutshaw).
-630. Preliminary Mach32 ramdac support updates (Bryan Feir).
-629. Document new xterm control sequences (Thomas E. Dickey).
-628. Fix problem introduced in 3.1.2E with software cursor on some non-i386
-     platforms (Thomas E. Dickey and Thomas Mueller).
-627. Support for SCO Open Server 5 (J. Kean Johnston).
-626. Add detection of the S3 ViRGE chip to SuperProbe (and scanpci), and
-     use PCI probing for S3 chipset detection in SuperProbe where appropriate
-     (Harald Koenig).
-625. Add detection of newly supported C&T chips to SuperProbe.
-624. Add a TextClock keyword for the XF86Config to fix problems restoring
-     the text clock with the chips & tech driver (Egbert Eich).
-623. Updates for the LinkKit (Egbert Eich).
-622. Significantly improved driver for Chips and Technologies chipsets.
-     Includes linear addressing (65530 and above), 16/24bpp (65540 and above),
-     programmable clock support (65540 and above), HW cursor support (65545
-     and above), BitBLT acceleration (65545/46 and 48), support for the
-     65546, 65548, 65550 and 65554 (Nozomi Ytow, Egbert Eich, Ken Raeburn,
-     Xavier Ducoin and David Bateman).
-
-XFree86 3.1.2Ed (10 August 1996)
-621. Fix xterm colour translation problem (Michael Rohleder and
-     Thomas E. Dickey).
-620. xterm termcap/terminfo fixes (Thomas E. Dickey).
-619. Add escape sequences to xterm that act like CDE ddterm's window
-     operations (Thomas E. Dickey).
-618. Set the initial cleared screen colour correctly for the 8514 and Mach8
-     servers to match the default black pixel value and the -flipPixels
-     flag (Hans Nasten).
-617. Add support for LynxOS AT version 2.4.0, and client-only support for
-     LynxOS microSPARC and PowerPC (Thomas Mueller).
-616. Config updates for OpenBSD and NetBSD 1.2 (Matthieu Herrb).
-615. Fix typo in trident driver, and update XFree86 man page (Alan Hourihane).
-614. Fix problems with Trio64V+ video blanking signal.  Some undocumented
-     options "trio64v+_bug1" to "trio64v+_bug3" have been added enable/disable
-     parts of the code in case they are required later (Harald Koenig).
-613. Don't require SuperProbe to do the BIOS signature check for VGA cards
-     when the PCI probe detects a VGA card (Koen Gadeyne).
-612. Add ET6000 detection to SuperProbe (Koen Gadeyne).
-611. Add PCI detection of ET6000 to scanpci and SVGA server (Koen Gadeyne).
-610. Update AGX documentation (Henry Worth).
-609. Add DGA support to the AGX server (Henry Worth).
-608. AGX server recognises "fast_vram" and "slow_vram" options as equivalents
-     to "fast_dram" and "slow_dram" (Henry Worth).
-607. 8 bit/RGB DAC mode is now the default for the AGX server where supported
-     (Henry Worth).
-606. Fix initialisation of the Bt481 for AGX-016 based Hercules dual-DAC
-     Graphite cards (Henry Worth).
-605. Fix overscan colour correctly for the AGX server to match the change
-     to the default black pixel value and the -flipPixels flag (Henry Worth).
-604. Update et4000w32.c for ChipHas24bpp in vgaVideoChipRec (Thomas E. Dickey).
-603. Prevent Xserver from exiting when a mouse device can't be opened and
-     the '-allowMouseOpenFail' command line option is used (Joe Moss).
-602. Add CL-GD5446 detection to SuperProbe.
-601. Add support for CL-GD5446 to the cirrus driver (Corin Anderson).
-600. Add PCI detection of Cirrus CL-GD5446 to SVGA server and scanpci
-     (Corin Anderson).
-599. Add a function XF86DGAForkApp() to the dga library, which causes
-     the client to fork, with the parent remaining to clean up after the
-     child exits (Jon Tombs).
-598. Add an InstallColormap function to the DGA extension (Jon Tombs).
-597. Fix broken DGA setviewport on SVGA servers (Jon Tombs).
-
-XFree86 3.1.2Ec (8 July 1996)
-596. XF86Setup fixes and updates (Joe Moss).
-595. Fix some build problems on Solaris due to the positioning of
-     <stdlib.h> includes in xconsole and xwd (William Austin).
-594. Fix a make problem in xfree98/vga16/drivers (Takaaki Nomura).
-593. Add some minor features from ISO 6429 to xterm (Thomas E. Dickey).
-592. Fix for SiS clock programming, and implement HW cursor for SiS
-     (Alan Hourihane).
-591. XInput support for SummaSketch tablets (Steven Lang).
-590. Improve the startup of the Wacom driver (Frederic Lepied).
-589. Fix an XInput bug with extended events reporting the wrong number
-     of valuators (Frederic Lepied).
-588. Fix xterm's utmp usage for Solaris (Christos Zoulas).
-
-XFree86 3.1.2Eb (30 June 1996)
-587. Fix MMIO setting which causes problems with Trio64V+ cards in machines
-     with PCI SCSI controllers (Harald Koenig).
-586. Auto-select the ICD2061A for Diamond Stealth 64 VRAM cards (when
-     a Diamond BIOS, Bt485 and S3 964 are all detected).
-585. Fix a problem with the VGA16 server when Chipset "generic" is specified.
-584. Fix twm/gram.y and fonts/PEX/to_wfont.y problems that show up when
-     using bison-1.25 (Matthieu Herrb).
-583. Move the beta expiry check code into a separate file, and add a command
-     line option to allow the expiry date to be extended when a key is
-     provided.
-582. Preliminary 24bpp packed support for some S3 cards (Harald Koenig).
-581. Add 24bpp (packed pixel) support for cfb (cfb24), and the required
-     hooks for using it with the SVGA server (Shigehiro Nomura and
-     NoZomi Ytow).
-580. Fix some xterm background colouring problems (Thomas E. Dickey).
-579. Allow the PCI burst to be separately turned on/off for read and write
-     for the TGUI chips (Alan Hourihane).
-578. vgaHW.c fix (NoZomi Ytow).
-577. Fix for Mach64 block_write problems introduced in 3.1.2E (Kevin Martin).
-576. An alternate fix to the Makedirectories() rule, which causes only
-     one 'sh -c' to be used (Marc Aurele La France).
-575. Some sanity checks for the trident driver (Alan Hourihane).
-574. Another HSkew fix for the ATI SVGA driver (Marc Aurele La France).
-573. Add 256 colour support to the SiS driver (Alan Hourihane).
-572. Fix a stdlib.h -related problem in xwd (Joe Moss).
-571. Fix a stdlib.h -related problem in xfs/os/utils.h (Takaaki Nomura).
-570. Add a new Xserver configuration utility -- XF86Setup (Joe Moss).
-569. Remove the "-noscale" flag from the Xserver usage message (Joe Moss).
-568. Fix session handling of xdm for *BSD (Peter Wemm).
-
-XFree86 3.1.2Ea (10 June 1996)
-567. xf86config.c update in preparation for the XF86Setup utility (Joe Moss).
-566. Fix some Mach64 problems in the SVGA ati driver (Marc Aurele La France).
-565. Fix the xf86GetClocks prototype (Marc Aurele La France).
-564. Fix MakeDirectories rule (Stephen Hocking).
-563. By default, don't change PCI burst settings for TGUI (Alan Hourihane).
-562. Fix interlaced modes for the SVGA ali driver (Thomas Graichen).
-561. xfs updates for OS/2 (Sebastien Marineau).
-560. Fix some TGUI problems introduced in 3.1.2E (Alan Hourihane).
-559. Fix problems with scanpci on NetBSD (Michio "Karl" Jinbo).
-558. Some cleanups/removal of compiler warnings (Christos Zoulas).
-557. Patch for compiling on BSD/OS 2.1 (Mike Bernson).
-556. Turn off the Xaw3d arrow scrollbar support in xterm by default (it
-     causes xterm to suck CPU), and make it an option/resource
-     (Thomas E. Dickey).
-555. Reinstate the "no_program_clocks" for TGUI9440 chips (Alan Hourihane).
-554. XInput updates, including motion history support for the joystick and
-     elo devices, removing auto link speed detection for the elo -- it is
-     now set with the LinkSpeed XF86Config option, and added acceleration
-     handling for relative devices (Patrick Lecoanet and Frederic Lepied).
-553. Add VGA16 support to the ET3000 driver (Thomas Graichen).
-552. Fix for first button click in a xterm being mistaken for a double
-     click (Kaleb Keithley).
-551. Fix for server crash on Alpha when using the logo screen saver
-     (Manabe Takashi).
-550. xkb datafile updates, including more/better European keymaps, pc102
-     geometry and keycodes (Stuart Anderson, courtesy Metro Link).
-549. Fix xterm problem on *BSD (VMIN initialisation) that would cause
-     rlogin to fail (Matthieu Herrb).
-548. Fix problems when a dynamic module is specified with an absolute path.
-
-XFree86 3.1.2E (13 May 1996)
-547. Fix Trio64V+ problem with DAC entry#255 for color mode 0 (1 8bpp/DCLK)
-     by only using color mode 8 (2 8bpp pixel/DCLK, CR67=10) (Harald Koenig).
-546. Added options to the S3 server to slow down DRAM and EDO DRAM access
-     (Harald Koenig).
-545. Add inlined assembler code to do unaligned access on Alphas
-     (Harald Koenig).
-544. Fix a font corruption problem for Alphas in cfb (Harald Koenig).
-543. Fix sample Xcms.txt colour entries (Harald Koenig).
-542. Fix some problems building the a.out DLL version of libX11
-     (Harald Koenig).
-541. OS/2 updates (Sebastien Marineau).
-540. Fix(?) server crash on keyboard input when using DGA with XKB disabled.
-539. Install xterm termcap/terminfo files in lib/X11/etc for all OSs, not
-     just SYSV/SVR4.
-538. Convert egc_asm.s to the portable assembler format so it can be built
-     on SVR4 (Takaaki Nomura).
-537. Fix Mach64 ghostview scrollbar problem.  This may also fix some font
-     corruption problems seen in Netscape (Kevin Martin).
-536. Fix Mach64 ol[v]wm icon problem (Kevin Martin).
-535. Add Mach64 cursor in doublescan mode -- this still has problems
-     (Kevin Martin).
-534. Add Mach64 doublescan mode for low resolution modes (only works so far
-     for the VT chip) (Kevin Martin).
-533. Fix Mach64 264VT support in the Mach64 server (Kevin Martin).
-532. Update the xterm termcap and terminfo descriptions (Thomas E. Dickey).
-531. Fix an xterm bug where XmbLookupString is used even though an
-     IM/IC isn't open/used (Kaleb Keithley).
-530. Fix a clock roll-over bug in xterm (Kaleb Keithley).
-529. Add some new locale aliases used by Solaris 2.5 and some other OSs
-     (Kaleb Keithley).
-528. Fix some potential data overruns with long environment variables in
-     libX11 and libXt which could create security holes in suid root
-     programs like xterm (Kaleb Keithley).
-527. Fix makedepend's handling of long typed defines (eg, 1993L)
-     (Kaleb Keithley).
-526. User alloca on UnixWare (Kaleb Keithley).
-525. Improved fix for removing compiled keymap files (Kaleb Keithley).
-
-XFree86 3.1.2Dj (12 May 1996)
-524. Disable POSIX_TERMIOS in xterm for FreeBSD versions prior to 2.1.
-523. Add a document for XInput (Frederic Lepied).
-522. Have the server remove the compiled keymap file when shutting down
-     (Joe Moss).
-521. Fix problem of XkbListComponents() not listing anything in
-     subdirectories (Joe Moss).
-520. Fix passing of button events for the Joystick (Frederic Lepied).
-519. NetBSD documentation updates (Matthieu Herrb).
-
-XFree86 3.1.2Di (11 May 1996)
-518. Modify xterm to revoke() its pty before opening it on *BSD
-     (Matthieu Herrb).
-517. Fix xterm not sending SIGHUP to its children when it dies on *BSD
-     (Matthieu Herrb).
-516. Fix some problems that were preventing extended Mouse devices from
-     working.
-515. Add "Port" as a synonym for "Device" in the Pointer section.
-514. Fix Makefile dependencies for dynamically loaded XInput modules.
-513. Fix screen saver blanking for Mach64 CT at 16bpp and 32bpp.
-512. Remove the directory components from the XKB parameters in the sample
-     XF86Config files, and from the XF86Config files generated by xf86config.
-511. Fix Mach64 memory mapping bug introduced in 3.1.2Dg.
-
-XFree86 3.1.2Dh (10 May 1996)
-510. Fix for some image problems on VGAWonder V3, V4 and V5 adapters
-     (Marc Aurele La France).
-509. Enable TERMIOS for xterm on Linux/Alpha (Kazushige Goto).
-508. Make the "clkdiv2" option a valid option for most accelerated
-     servers (Koen Gadeyne).
-507. Unified the global function names to use the xf86 prefix in the XInput
-     code (Frederic Lepied).
-506. Add support for motion history for extended input devices (implemented
-     for the Wacom driver) (Frederic Lepied).
-505. Oak documentation updates (Jorge Delgado).
-504. Fix compiler warnings introduced in 3.1.2Dg (Thomas E. Dickey).
-503. OS/2 updates (Sebastien Marineau and Holger Veit).
-502. Fix formatting of xtrans error messages (Holger Veit).
-501. S3 image fixes for Alpha (Harald Koenig).
-
-XFree86 3.1.2Dg (6 May 1996)
-500. X98 updates for PANIX(98) support (X98 core team).
-499. Allow halved clocks to be used with the VGA servers (Koen Gadeyne).
-498. Use same xlfd value rounding for alpha as for i386 (Harald Koenig).
-497. Support for Linux/Alpha (Jay Estabrook, Craig Ruff, Harald Koenig
-     and others?).
-496. Fix autorepeating modifier keys (Kaleb Keithley).
-495. Fix nonMuxMaxClock for S3 864/868 (Harald Koenig).
-494. Make sure that imake, xinit and the XFree86 servers don't inherit
-     a SIGCHLD signal handler of SIG_IGN (Marc Aurele La France).
-493. Fix default HSkew for ATI 28800 cards (Marc Aurele La France).
-492. Fix typo in SuperProbe/PCI.c (Holger Veit).
-491. Colour xterm fixes -- fixes inner border being painted with the wrong
-     colour (Thomas E. Dickey).
-490. More X server prototyping fixes -- mostly for Xserver/Xext
-     (Thomas E. Dickey).
-489. DGA support for the P9000 server (Erik Nygren).
-
-XFree86 3.1.2Df (15 April 1996)
-488. Changes to xf86Config.c in preparation for XF86Setup sharing this
-     code (Joe Moss).
-487. Prevent SuperProbe from falsely detecting non-VGA PCI devices.
-486. Config/Imake support for building LBX (Holger Veit).
-485. OS/2 updates (Holger Veit and Sebastien Marineau).
-484. Add support for the I128 8MB board with the IBM528 RAMDAC (Robin Cutshaw).
-483. Add prototyping for Xserver/dix, and fix copyright notices in new
-     header files (Thomas E. Dickey).
-482. Replace the vsync wait delays in the ICD2061A code with a 20ms usleep
-     (Harald Koenig).
-481. Ensure that the S3 server clears the screen to black even when
-     '-flipPixels' is used, and erase the S3 HW bug test patterns after
-     completing the tests (Harald Koenig).
-480. Fix incorrect S3 HW cursor offset after VT switching (Harald Koenig).
-479. Fix SuperProbe's memory probing for S3 cards with more than 4MB,
-     and add detection for the TVP3030 RAMDAC (Harald Koenig).
-478. Fix some S3 TVP3026 problems introduced in 3.1.2Dc (Harald Koenig).
-477. Add support to the S3 server for the ELSA Gloria-8 card (except the
-     GLint 300SX 3D chip) (Harald Koenig).
-476. Fix for POSIX termios support in xterm (Matthieu Herrb).
-475. Add -li386 to ServerExtraSysLibs for NetBSD (Matthieu Herrb).
-474. Fix problems when XINPUT isn't defined (Kaleb Keithley).
-473. Fix for TGUI 9320 LCD support (Alan Hourihane).
-472. Imakefile updates for X98, and PCI detection added for TGUI9320
-     (Michio "Karl" Jinbo).
-
-XFree86 3.1.2De (31 March 1996)
-471. Change the default HSkew calculation (Marc Aurele La France).
-470. Add detection of the ATI 264VT, 264VT2 and 264GT to the ati driver,
-     SuperProbe, scanpci, and the Mach64 server (Marc Aurele La France).
-469. Fix the W32 server's reporting of the bits/rgb resolution (Koen Gadeyne).
-468. Add ICD2061A clockchip support to the W32 server (Koen Gadeyne and
-     Peter Chang).
-467. Add support for PowerWindow968, Cyber9320 and TGUI9680 (X98 core team).
-466. Fixes for XF98_NEC480 on PANIX-PC98 (X98 core team).
-465. Remove X98 style version info from the server startup messages
-     (X98 core team).
-464. Improve stability of the XF98_PWSK server (X98 core team).
-463. Add some missing XFreeXDGA #ifdefs (Kaleb Keithley).
-462. Fix problem of the XKB keymaps not getting loaded when using the
-     Xqueue keyboard driver on SVR4 (Joe Moss).
-461. Add POSIX termios support to xterm, and use it for BSD Net/2
-     derived systems.  This removes the need for kernels on those systems
-     to be compiled with COMPAT_43 in order to run xterm (Matthieu Herrb).
-460. Update the I/O enabling in the X servers and SuperProbe for
-     NetBSD-current (Matthieu Herrb).
-459. Save the S3 cursor colour stack (CR4A/CR4B) (Harald Koenig).
-458. Add macro button support to the Wacom driver, and handle more than
-     six valuators to post events (Frederic Lepied).
-457. Support for the Miro Magic S4 (S3 928 + Bt485).  A known problem is
-     that switching between pixmux an non-pixmux modes doesn't work
-     (Bernd Strobel).
-456. Fix banked mono for the SiS driver (Alan Hourihane).
-455. X server prototype cleanups and fixes, particularly in the Xi code
-     (Thomas E. Dickey).
-454. Possible fix for tvga9000 and tvga8900d problems (Alan Hourihane).
-
-XFree86 3.1.2Dd (17 March 1996)
-453. Include R6.1 public patch 1.
-452. Fix incorrect type in SuperProbe/PCI.c (Thomas E. Dickey).
-451. Fix a memory leak in xterm when switching fonts (Thomas E. Dickey).
-450. Fixes for mouse problems introduced in 3.1.2Dc (Joe Moss,
-     Michael Rohleder, Takaaki Nomura).
-449. Man page for the VidMode extension (Joe Moss).
-448. Modify xterm to work properly with Xaw3d's arror scrollbars (based on
-     Kaleb Keithley's R5 patch).
-447. Add tilt report for the Wacom device (Frederic Lepied).
-446. Deal with DAC/clock discrepancy for Mach64 in the ati driver
-     (Marc Aurele La France).
-445. Reduce warnings in the ati driver when compiling with 'gcc -Wall'
-     (Marc Aurele La France).
-444. Fix recognition of ATI extended VGA register I/O port number on some
-     Mach32 Mach64 PCI adapters in the ati driver (Marc Aurele La France).
-443. Add nested prototypes to xf86_HWlib.h (Marc Aurele La France).
-442. Fix typo in IBM RGB514 programming for the Mach64 (Marc Aurele La France).
-441. Fix a problem with the Mach64 server incorrectly using Block I/O mode
-     on some cards.
-
-XFree86 3.1.2Dc (11 March 1996)
-440. XKB updates from recent XC fix-tracker.
-439. Fix freeing a random pointer in the module code when an absolute
-     path is given (Thomas E. Dickey).
-438. Updates to Ti3026 PLL parameter limits (Harald Koenig).
-437. Support for ELSA Winner 2000PRO/X rev G (Harald Koenig).
-436. Fix 'make clean' problems for PC98 (Takefumi Tsukada).
-435. OS/2 updates (Holger Veit).
-434. Remove DEVINTPTR ifdefs by renaming the entrypoints of the affected
-     functions (Thomas E. Dickey).
-433. Fix for handling of long version strings in beta servers (Harald Koenig).
-432. Some XFree86-Misc cleanups (Joe Moss).
-431. Add an extended input device supporting mouse protocols.  This shares
-     code with the core mouse (Frederic Lepied).
-430. Fix the behaviour of ANSI colours in xterm when reverse video is used,
-     and some other xterm updates (Thomas E. Dickey).
-429. Fix SEGV with ark driver when no Ramdac is given in the XF86Config.
-428. Avoid retrace wait for S3 HW cursor when DGA is active (Jon Tombs).
-
-XFree86 3.1.2Db (5 March 1996)
-427. Fix a problem where hw cursors get recoloured incorrectly.
-426. Fix another possible Trio32 font cache problem (Harald Koenig).
-425. Another S3 968 dashed line fix (Harald Koenig).
-424. Fix RecolorCursor problems for S3 hw cursors in RAMDACs and for
-     sw cursor (Harald Koenig).
-423. Add a Japanese version of the FreeBSD README (Takefumi Tsukada).
-422. Fix for problems with XF86_WSNA server (X98 core team).
-421. Add a mapping for Pointer_EnableKeys to the XKB symbols/us map (Joe Moss).
-420. XC patch for XKB.
-419. Add code to the vidmode and misc extensions to print details of mode
-     keyboard and mouse setting changes (Joe Moss).
-418. Add code to recognise extra keys on Digital LK201 PC keyboards
-     (Basil Duval).
-417. Don't include Multibuffer support in xdpyinfo when it isn't included
-     in the X servers (Joe Moss).
-416. Fix core dump when XInput debugging is enabled (Frederic Lepied).
-415. Fix implicit grab problem with Wacom input device (Frederic Lepied).
-414. Add an "allowMouseOpenFail" XF86Config and command-line option to allow
-     the server to be started when no mouse can be initialised (Joe Moss).
-413. Updates for parallel make (Robin Cutshaw).
-412. Update xf86config for the I128 server (Robin Cutshaw).
-
-XFree86 3.1.2Da (3 March 1996)
-411. Add a preinst.sh script.
-410. Documentation updates.
-409. Fix for Linux/ELF rules (H.J. Lu).
-408. Always used extended I/O for SYSV/SVR4.  This is required now for
-     ISC (Michael Rohleder).
-407. Fix BootstrapCFlags in sun.cf for Solaris x86.
-406. Solaris fixes for SuperProbe and the Mach64 server (Robin Cutshaw
-     and James Hawtin).
-405. Wacom bug fix (Frederic Lepied).
-404. Add support for writing to stdout for gccmakedep, which is required
-     for NetBSD and FreeBSD (Matthieu Herrb).
-
-XFree86 3.1.2D (24 February 1996)
-403. Fix xterm SEGV if it cannot open an input method (Manabe Takashi).
-402. Update Linux/ELF SharedLibraryTarget() (H.J. Lu).
-401. Add a BinUtilsVersion parameter for Linux, and modify ExtraLoadFlags for
-     Binutils versions 2.6.0.7 and later (H.J. Lu).
-400. Set CplusplusCmd to 'c++' for Linux, set YaccCmd to byacc when
-     USE_BYACC is defined, and remove $(CBRT) from ServerExtraSysLibs
-     (H.J. Lu).
-399. Fix installation of some SCO rules/cf files (H.J. Lu).
-398. Modify imake.rules to include Motif rules/tmpl files when BUILD_MOTIF
-     is defined (H.J. Lu).
-397. Fix argument passing typo in SuperProbe (Thomas E. Dickey).
-396. Update Cards database (Joe Moss).
-395. Documentation updates (Holger Veit, Joe Moss).
-394. Fix xset/Imakefile for OS/2 (Holger Veit).
-393. Don't use the index/rindex macros with arguments for non-ANSI compilers.
-392. Uncomment xf86cleanpci() in vga.c.
-
-XFree86 3.1.2Ch (22 February 1996)
-391. Fix xset linking for Linux a.out (Harald Koenig).
-390. Disallow interlaced modes with the SiS driver (Alan Hourihane).
-389. Change SCO interface to allow for a 128K VGA aperture
-     (Marc Aurele La France).
-388. Add support to the ati driver for Mach64 cards with a base address
-     other than 0x2EC (Marc Aurele La France).
-387. Introduce a new XF86Config mode option called HSkew which sets bits
-     0x60 of CRTC[3] (Marc Aurele La France).
-386. Fix colour map problem on VGA Wonder V3 boards (Randall Hopper,
-     Marc Aurele La France).
-385. Allow multiple "-verbose" command line flags to increase the verbosity
-     level (Marc Aurele La France).
-384. Modify xf86scanpci() so that it will be able to deal with multi-headed
-     servers in the future, add an xf86cleanpci() function to allow
-     the PCI data to be freed after use, allow xf86scanpci() to be called
-     more than once, and fix a problem with it not always returning with I/O
-     permissions disabled (Marc Aurele La France).
-383. SuperProbe updates for Mach64 and PCI (Marc Aurele La France).
-382. OS/2 updates (Holger Veit).
-381. Keyboard/mouse parameter changes with XFree86-Misc can now be disabled,
-     and these are only allowable by default for local client connections
-     (Joe Moss).
-380. Only check/change relevant parameters with XFree86-Misc (Joe Moss).
-379. Add new/better protocol error messages for XFree86-Misc (Joe Moss).
-378. Man page for the XFree86-Misc library functions (Joe Moss).
-377. Add detection of the SiS 86C202 and 86C205 to SuperProbe and the SiS
-     driver (Alan Hourihane).
-
-XFree86 3.1.2Cg (20 February 1996)
-376. Modify the handling of the XF86Config xkb options to allow the
-     -xkbmap server flag to work (it overrides what is in the XF86Config).
-     The XKBKeyMap XF86Config setting will now work too, and it overrides
-     any other XKB settings given there.
-375. Fix for parts of a VT switch sequence getting passed to clients when
-     XKB is enabled.
-374. NetBSD.cf update (Matthieu Herrb).
-373. Fix various cases of nested comment delimiters (Thomas E. Dickey).
-372. Config additions/updates for CLIX and for HP with GCC2 (Thomas E. Dickey).
-371. Fix RecolorCursor for HW cursor in AGX, Mach32, Mach64, P9000, I128,
-     Cirrus, Ark and Trident server/drivers (untested).
-370. Fix xinit problem introduced in 3.1.2Cf.
-369. S3 dashed line fix, including an option "s3_968_dash_bug" to enable
-     a workaround for a 968 bug.  There is code to auto-detect this problem,
-     so the option shouldn't need to be specified explicitly (Harald Koenig).
-368. Fix for RecolorCursor problem with S3 HW cursors.  This problem is
-     also present in other accel servers (Harald Koenig).
-367. Trident linear mode updates (Alan Hourihane).
-
-XFree86 3.1.2Cf (19 February 1996)
-366. S3 update for ELSA Winner1000 cards with the AT&T 20C409 Ramdac
-     (Dirk Hohndel).
-365. PC98 updates, including a new xkbcomp/compat/pc98 description
-     (X98 core team).
-364. SiS driver updated (Alan Hourihane).
-363. Work around an S3 968 dashed line bug (Harald Koenig).
-362. OS/2 updates, including a new OS/2 README (Holger Veit and
-     Sebastien Marineau).
-361. ISC documentation updates (Michael Rohleder).
-360. NetBSD documentation updates (Matthieu Herrb).
-359. Trident driver updates (Alan Hourihane).
-
-XFree86 3.1.2Ce (18 February 1996)
-358. PC98 documentation (X98 core team).
-357. Fix a bug in the handling of the Wacom eraser as a third button
-     (Frederic Lepied).
-356. Enable the Joystick driver for NetBSD (using a port of the FreeBSD
-     joystick driver to NetBSD) (Matthieu Herrb).
-355. Allow XInput dynamic loading for NetBSD (Matthieu Herrb).
-354. Use the FreeBSD way of making dependencies in .depend files for NetBSD
-     (Matthieu Herrb).
-353. Change the XInput Dynamic module loading to allow a ModulePath to
-     be specified in the Files section of the XF86Config, and move the
-     list of loadable modules into a Modules section in XF86Config
-     (Frederic Lepied).
-352. Fix some glitches in xterm's colour behaviour (Thomas E. Dickey).
-351. Modify the xf86config utility to allow XKB information to be entered
-     (Holger Veit).
-350. Fix Xserver prototyping problems (Thomas E. Dickey).
-349. Modify PCI code for PC98 (X98 core team).
-348. Add PC98 server for WSN-A2F (X98 core team).
-347. XKB description files for a Japanese 106 key keyboard (Takefumi Tsukada).
-346. Probe the VGA sis driver before the the cl64xx to avoid mis-probing
-     (Alan Hourihane).
-345. Modify XF86VidModeGetAllModeLines() to allocate memory in one chunk
-     so it can be freed later by the client (Joe Moss).
-344. Fix incorrect handling of S3RefClock when specified in the XF86Config
-     (Harald Koenig).
-343. Clean up linear mode setup in the Trident Driver (Alan Hourihane).
-342. Disable PCI burst mode by default for the Trident driver
-     (Alan Hourihane).
-341. Fix a problem restoring 16bpp modes with the Mach32 server on OS/2
-     (Sebastien Marineau).
-340. Fix a problem that was preventing the tgui driver from working on
-     some TGUI9440 cards (Alan Hourihane).
-
-XFree86 3.1.2Cd (12 February 1996)
-339. Fix library ordering for Linux a.out for xset, xdpyinfo and xvidtune
-     (Harald Koenig).
-338. Add a version check to the XInput dynamic modules (Frederic Lepied).
-337. Fix keyboard LED initialisation.  This usually shows up as a problem
-     on *BSD where the NumLock LED is on when the server is started.
-336. Update Linux DLL jump files (Harald Koenig).
-335. PC98 updates, including XF98Conf, and the XKB nec geometry description
-     (X98 core team).
-334. Automatically treat the PS/2 protocol the same as the busmouse protocol
-     on NetBSD (since that's how NetBSD's PS/2 driver works).
-333. Add XInput dynamic loading support for FreeBSD 2.x.
-332. Fix problem with XInput on non-Linux/ELF systems.
-331. xterm fixes, including updates to allow building on R5
-     (Thomas E. Dickey).
-330. Add to the docs a file containing a list of PC98 cards that are
-     supported (X98 core team).
-329. Documentation updates for xterm (Thomas E. Dickey).
-328. Disable the TGUI HW cursor by default (Alan Hourihane).
-327. Add PCI support to SuperProbe (Alan Hourihane).
-
-XFree86 3.1.2Cc (10 February 1996)
-326. Merge in final form of R6.1.
-
-XFree86 3.1.2Cb (9 February 1996)
-325. XC fix-trackers to seq-4114 (mostly XKB).
-324. Xlib prototyping improvements/fixes (Thomas E. Dickey).
-323. OS/2 updates (Holger Veit and Sebastien Marineau).
-322. Allow the eraser button of a wacom stylus to act as a third button
-     if the WacomEraser device isn't enabled (Frederic Lepied).
-321. Allow XInput device support to be dynamically loaded.  This is for
-     Linux only so far (Frederic Lepied).
-320. Major updates to the ati driver, including support for the newer
-     Mach64 chips and clocks, preliminary support or pre- VGAWonder V3
-     adapters and generic VGA.  The default chipset name has been changed
-     back to "ati" from "vgawonder" (Marc Aurele La France).
-319. Properly implement xf86DisableIOPrivs and xf86Disable/EnableInterrupts
-     for Linux (Marc Aurele La France).
-318. ATI doc updates (Marc Aurele La France).
-317. Remove ati.test.c, and move the functionality into the ati driver
-     (Marc Aurele La France).
-316. Remove the "undoc_clocks" option (Marc Aurele La France).
-315. Make all I/O ports in compiler.h unsigned short, and all values
-     unsigned char/short/int (Marc Aurele La France).
-314. Updates Mach64 probing for SuperProbe (Marc Aurele La France).
-313. Make the Linux ELF/a.out default build the same as the system default
-     (Marc Aurele La France).
-312. Delete unneeded cmd/sh files in xfree98/vga256 (X98 core team).
-311. Fix problems with XF98_WABS (X98 core team).
-310. update xfree98/etc/Imakefile, and remove the *.sed files and their
-     related imake rules (X98 core team).
-309. XF98_WABEP server added (for Melco WAB-EP) (X98 core team).
-308. Trident driver updates including some clock probing fixes
-     (Alan Hourihane).
-307. Fix 2MB Trio64 display error problem due to incorrect parameter
-     calculation (Harald Koenig).
-
-XFree86 3.1.2Ca (5 February 1996)
-306. Improve S3 Diamond BIOS detection.
-305. XC fix-trackers to seq-4104 (mostly a new XKB snapshot).
-304. Don't include the compaq driver by default -- it is broken.
-
-XFree86 3.1.2C (31 January 1996)
-303. Allow the mouse parameters (except the device) to be changed with
-     the XFree86-Misc extension.  This causes a close/reopen of the the
-     device (Joe Moss).
-302. Fix problem introduced with the server lock code which causes a delay
-     at startup.
-301. Add some checking for the mouse baud rate given in the XF86Config
-     (Joe Moss).
-300. Fix for the bright left border problem with some Trio64V+ cards
-     (Harald Koenig).
-299. PC98 XKB support files (Kaleb Keithley, Toyonori Fujiura).
-298. Update German XKB symbols (Thomas Mueller).
-
-XFree86 3.1.2Bo (30 January 1996)
-297. Updates for XF98Conf.cpp (Takefumi Tsukada).
-296. Add an XF86Config option for disabling XKB (Kaleb Keithley).
-295. Further OS/2 support updates, including a working X server
-     (Sebastien Marineau and Holger Veit).
-294. Documentation update for PC98 (Takefumi Tsukada).
-293. Improved prototyping for Xlib.h (Thomas E. Dickey).
-292. xterm updates, including mods to allow it to be built with X11R5
-     (Thomas E. Dickey).
-291. Some XFree86-Misc extension updates (Joe Moss).
-290. GlidePoint updates (Jean-Christophe Hugly).
-289. Add XInput knowledge to xdpyinfo, and update the output format of
-     xsetpointer (Frederic Lepied).
-288. NetBSD updates for scanpci now that console.h isn't included any more
-     (Matthieu Herrb).
-287. XC fix-trackers to seq-4086 (xsm updates).
-286. xkb symbol addition for European-style keyboards (Kaleb Keithley).
-285. Possible fix for security problem related to the X server's lock files.
-
-XFree86 3.1.2Bn (28 January 1996)
-284. Fix reporting of the ATI68860 Rev C Ramdac with the Mach64 server.
-283. Support for ALPS GlidePoint.  A tap on the pad is treated as a fourth
-     button (Jean-Christophe Hugly).
-282. Improved XKB support for XFree86 servers (Kaleb Keithley).
-281. Prevent mode switching and VT switching when DGA is active (Jon Tombs).
-280. Don't include for syscons with NetBSD by default.
-279. NetBSD doc updates (Matthieu Herrb).
-278. XFree86-Misc extension updates, including more sanity checking (Joe Moss).
-277. Fix some length calculations in libXxf86vm (Joe Moss).
-
-XFree86 3.1.2Bm (26 January 1996)
-276. Remove (for now) the vertical retrace wait in the S3 SetViewPort.
-275. Updates TGUI support for SuperProbe (Alan Hourihane).
-274. TGUI driver updates (Alan Hourihane).
-273. Major updates to OS/2 support (Holger Veit).
-272. Update xdpyinfo for the latest XFree86-Misc changes, and update xset
-     to allow the keyboard repeat parameters to be changed (Joe Moss).
-271. Add functions to the XFree86-Misc extension to allow getting and
-     setting mouse and keyboard configuration (Joe Moss).
-270. Remove the low ICS5342 clock limit (Harald Koenig).
-269. Add an "XF98Config.cpp" from which a sample config file suitable for
-     the X98 servers is generated (X98 core team).
-268. Update Imakefiles under hw/xfree98 (X98 core team).
-267. Fix for make dependency problem with BSD make and the XFree86 drivers
-     subdirectories (Matthieu Herrb).
-266. X Consortium fix-trackers to seq-4084 (mostly XKB and doc updates).
-265. Allow the XInput debug level to be set from the XF86Config
-     (Frederic Lepied).
-
-XFree86 3.1.2Bl (21 January 1996)
-264. Fix xterm IM problem if *inputMethod == "" (Kaleb Keithley).
-263. Xvfb fix for systems that have mmap, but not the MS_ASYNC flag for
-     msync().
-262. XC fix-trackers to seq-4060 (some XKB and config updates).
-261. 6-bit/rgb fix for the I128 server (Robin Cutshaw).
-260. Update hw/xfree98 Imakefiles (Takefumi Tsukada).
-259. Add a GetAllModeLines function to the VidMode extension, and modify
-     xdpyinfo to use it (Joe Moss).
-
-XFree86 3.1.2Bk (17 January 1996)
-258. Don't allow DGA operations which affect the server when it isn't on
-     the active screen.
-257. Have XFree86-Misc report the power saver times in seconds rather
-     than milliseconds (to be consistent with XGetScreenSaver).
-256. Modify xset to allow setting/viewing the power saver parameters via
-     the XFree86-Misc extension.
-255. Modify the VidMode extension to disallow both mode switches and
-     the locking/unlocking of mode switching when DontZoom has been set
-     in the XF86Config.
-254. Only allow the DGA extension to accept local connections.
-253. Fix Home/End key support in xterm (Thomas Mueller).
-252. Add support for VT200 compatible cursor on/off to xterm (Thomas Mueller).
-251. Add support for the XFree86-Misc extension to xdpyinfo (Joe Moss).
-250. VidMode/xvidtune updates (Kaleb Keithley).
-249. XC fix-trackers to seq-4055 (mostly XKB fixes).
-248. Fix link ordering of new libraries (Thomas Mueller).
-247. Add some missing XKB #defines (Thomas Mueller).
-246. Fix typo in include/extensions/Imakefile (Thomas Mueller).
-
-XFree86 3.1.2Bj (16 January 1996)
-245. Remove the XExExt library, and replace it with individual libraries
-     for each extension.
-244. Remove the GetSaver/SetSaver functions from the VidMode extension
-     and add them to a new extension: XFree86-Misc.
-243. Cleanup VidMode extension code -- removing "vgahelp" references
-     (Kaleb Keithley).
-242. Allow the write functions of the VidMode extension to be disabled
-     for non-local clients (default), and all clients (Kaleb Keithley).
-241. XC fix-trackers to seq-4052 (new XKB snapshot).
-240. README.S3 updates (Paul Gortmaker).
-239. Do framebuffer address scan for all VLB Trio64 cards, not just those
-     with > 1MB.
-238. Fix typo in trident driver (Alan Hourihane).
-237. Modify the I128 server to use xf86scanpci() rather than its own PCI
-     probe (which didn't work for PCI config type 1 boards) (Robin Cutshaw).
-
-XFree86 3.1.2Bi (14 January 1996)
-236. Enable dynamic allocation of XInput devices to allow for multiple
-     instances of the same device type.  The Joystick2 device has been
-     removed (Frederic Lepied).
-235. Fix typo in a recent xconsole fix (Michael Rohleder).
-234. Add POSIX build config option for ISC, and change the Vendor name to IUS
-     (Interactive Unix System) (Michael Rohleder).
-233. Disable linear mode by default for non-PCI Trident cards (Alan Hourihane).
-232. Fix some compiler warnings in various parts of the source (Fred Appelman).
-231. Fix xterm compile problem with -DALLOWLOGGING (William Austin).
-230. Fix compile problem in resize for NetBSD (Matthieu Herrb).
-
-XFree86 3.1.2Bh (13 January 1996)
-229. Fix dga speed test problem when the bank size is less than 64k.
-228. Add DGA support to the Mach32 server (untested).
-227. Add SVGA-based servers for PC98 (Cirrus driver) (X98 core team).
-226. Update the Cirrus driver to use the vga PCI probe data (not tested).
-225. Include XC fix-trackers to seq-4035 (mostly fixes for Solaris 2.5
-     build problems).
-224. Update xdpyinfo to print some info about XKB (Joe Moss).
-223. Fix(?) problem some people see with vertical lines / black screens
-     with the Trident driver (Alan Hourihane).
-222. Update the Trident and SiS drivers to use the vga PCI probe data
-     (Alan Hourihane).
-221. Define SetTtyGroup for Linux (Kevin Martin).
-
-XFree86 3.1.2Bg (12 January 1996)
-220. Fix cursor colour for TGUI 9660/9680 (Alan Hourihane).
-219. LynxOS fix for xterm's resize (Thomas Mueller).
-218. Write beta marker file as the user's real uid rather than as root.
-217. Fix DGA for SVGA cards using banked memory, and enable it for most
-     SVGA drivers.
-216. Add a PCI probe to the VGA servers.  The happens before the chipset
-     probes, and may be disabled with the "no_pci_probe" option.
-215. Add 16bpp support for Trident 8900D, and some cleanups (Alan Hourihane).
-214. Add install.linkkit target to the top level Makefile.
-
-XFree86 3.1.2Bf (11 January 1996)
-213. Xinput updates, including: improved error handling, "Screen" option
-     renamed to "ScreenNo" for consistency, new config options for the
-     Wacom tablet, update to the Linux joystick support, and a fix
-     for xsetmode (Frederic Lepied and Patrick Lecoanet).
-212. Fix core dump when exiting an X server started with XKB enabled.
-211. Update accelerated servers' use of miZeroClipLine().
-210. Include XC fix-trackers to seq-4031 (includes update of RECORD spec
-     to version 1.13, some Xlib and xterm fixes, and preliminary ISO Latin-2
-     compose support).
-209. Add code to detect the Trio32 BITBLT bug, and automatically enable
-     the workaround when it is detected (Harald Koenig).
-208. Final changes for POSIXized ISC build (Michael Rohleder).
-207. Define NO_READAHEAD for ISC in xconsole (Michael Rohleder).
-206. Fix(?) Xalloca.h problem on Solaris 2.5.
-205. Fix missing XFreeDGA #ifdef in change 187 (Kaleb Keithley).
-
-XFree86 3.1.2Be (10 January 1996)
-204. Fix build with BuildServersOnly set to YES (Takefumi Tsukada).
-203. Major xterm cleanup (including prototyping), and fixes to the colour
-     code (Thomas E. Dickey).
-202. PC98 EGC (16 colour) server added (X98 core team).
-201. Updates for LynxOS AT, including a workaround in the xkb clients
-     for the fact that stdin/out/err isn't a valid initialiser
-     (Thomas Mueller).
-200. Modify the dga test program to use GetTimeInMillis() (Tiago Gons).
-199. Fix merge problem in xconsole (Michael Rohleder).
-198. Initial changes to POSIXize the ISC build (Michael Rohleder).
-197. Fix a clash of symbols between libX11 and the X server's libxkb which
-     shows up when building Xnest on ISC (Michael Rohleder).
-196. Fix XKB merge problem in xf86Events.c (Kaleb Keithley).
-195. Complete the logging code in xalloc (Pascal Haible).
-
-XFree86 3.1.2Bd (8 January 1996)
-194. Fix a build problem when BuildServersOnly is set to YES.
-193. Clean up the InstallManPageLong() run for NetBSD (Takefumi Tsukada).
-192. Modify ForceSubdirs() rule for NetBSD and FreeBSD so that it works
-     with GNU make (Matthieu Herrb).
-191. Fix a Ti3026 clock problem that appears on SPEA 968+Ti3026 cards
-     (Harald Koenig).
-190. Fix TGUI 9440 HW cursor problems (Alan Hourihane).
-189. Fix problems with the TGUI 9660/9680 support (Alan Hourihane).
-188. Fix 256-colour interlace problem with TGUI cards (Alan Hourihane).
-187. Fix for text mode restore problem when the DGA extension has been
-     used with the SVGA server (Alan Hourihane).
-186. Set the Block I/O bit in the PCI userconfig register for Mach64 cards
-     that report an I/O address range.
-
-XFree86 3.1.2Bc (7 January 1996)
-185. Update lnxLib.rules for new GNU elf tools which look for libname.so
-     rather than libname.so.rev at link time (Helmut Geyer).
-184. Set default ProjectRoot back to /usr/X11R6.
-183. Include fix-trackers to seq-4024 (includes more a more recent XKB snap,
-     some record updates, and some config and Xlib updates).
-182. Fix some merge problems.
-
-XFree86 3.1.2Bb (6 January 1996)
-181. Merge in X11R6.1 beta.
-180. Fix problems with the ARK/ICS5342 clock programming (Leon Bottou).
-179. Fix problem with Mach64 CT cards that incorrectly appear to be using
-     block I/O.
-
-XFree86 3.1.2Ba (3 January 1996)
-178. Fix support for the old ET4000 in the et4000 driver.
-177. Fix problem with the SIS driver that can cause a server crash
-     (Alan Hourihane).
-176. Modify linux config for building a.out binaries on Slackware 3.0.
-175. Fix Linux Joystick compilation problems.
-174. Doc updates.
-
-XFree86 3.1.2B (28 December 1995)
-173. Fix a problem with the ARK/ICS5342 clock programming (don't know if this
-     completely fixes the clock programming problems).
-172. Don't do PCI probe in S3 server for PC98 (Takefumi Tsukada).
-171. Fix bank select problem with S3 911 cards when using DGA.
-
-XFree86 3.1.2Af (26 December 1995)
-170. Added README.DGA which gives a brief outline of the API for the DGA
-     extension.  This should be converted to man pages.
-169. Added a simple standalone program (joycal) to get the Joystick
-     calibration coordinates.
-168. Modify the Joystick code to auto-detect the centre values at startup
-     if they are not given the XF86Config (this assumes that the Joystick
-     is centred when first enabled).
-167. Add XInput Joystick support for FreeBSD 2.x.
-166. Remove the strict membase checking for "orchid_p9000" in the P9000
-     server so that the correct membase can be specified for some other
-     types of P9000 cards which are not explicitly supported.
-165. Fix problem with the trident driver in the VGA16 server (Alan Hourihane).
-164. XF86Config(4/5) man page additions for the XInput section
-     (Frederic Lepied).
-163. Update xfree98/Imakefile (Takefumi Tsukada).
-162. Remove the "no_ti3026_curs" option again.
-161. Updates for xdpyinfo's Imakefile and the Xinput code for ISC
-     (Michael Rohleder).
-
-XFree86 3.1.2Ae (23 December 1995)
-160. A new document called QuickStart.doc which is a quick-start guide
-     to XFree86 setup (Joe Moss).
-159. Add a PCI probe to the S3 server, and use the membase value reported
-     when it is non-zero.  This should help for some TrioV64+ cards.
-158. Move the DGA client-side helper functions into libXExExt.
-157. XInput support for XFree86.  This includes device support for two
-     Joysticks (Linux-only so far), Wacom tablet (Wacom IV protocol only),
-     and Elographics touchscreen.  Two utility programs are included.
-     xsetpointer can be used to make an extended device the core pointer
-     or to list the extended devices.  xsetmode can be used to set a device
-     in absolute or relative mode  (Frederic Lepied and Patrick Lecoanet).
-156. Workaround for a hardware bug in some S3 Trio32 revisions which causes
-     font corruption when using the font cache.  This is currently enabled
-     with the "trio32_fc_bug" Option (Harald Koenig).
-155. Logging support for the internal xalloc code (Pascal Haible).
-154. Fix the S3 server's detection of the Trio64V+.
-153. Fix problems building the PC98 code (Takefumi Tsukada).
-152. LynxOS support for the DGA extension (Thomas Mueller).
-151. Fix a problem were XListFonts() can return fewer font names than
-     XListFontsWithInfo() (Manabe Takashi).
-150. Add knowledge of the XFree86-VidModeExtension, XFree86-DGA and LBX
-     extensions to xdpyinfo (Joe Moss).
-149. Add a benchmark function to the dga test program.  It is activated with
-     the 'b' key (Koen Gadeyne).
-148. Change all servers to default to blackPixel = 0 and whitePixel = 1,
-     and allow this default to be swapped with the -flipPixels server
-     command line flag (Michael Rohleder).
-147. Restore the "no_ti3026_curs" option to the S3 server (Harald Koenig).
-146. Trident driver and documentation updates (Alan Hourihane).
-
-XFree86 3.1.2Ad (21 December 1995)
-145. Fix for incorrect usage of S3 PIX_TRANS writing (Takefumi Tsukada).
-144. PC98 support integrated into the main XFree86 source tree.  The PC98
-     code gets built under xc/programs/Xserver/hw/xfree98 (Takefumi Tsukada
-     and the X98 team).
-
-XFree86 3.1.2Ac (17 December 1995)
-143. Modify the XDGA implementation in the server, and add support for it
-     to the Mach64 server.  Also, XDGA is now enabled for all OSs since there
-     are now no OS-specific parts on the server side.
-142. Add "no_font_cache" and "no_pixmap_cache" options to allow the font
-     cache and pixmap cache/expansion to be disabled in the S3 and Mach64
-     servers.
-141. Fix positioning and shape of the Bt485 HW cursor for doublescan modes
-     in the S3 server.
-140. Fix positioning of the HW cursor for interlaced and doublescan modes
-     with the IBM RGB RAMDACs in the S3 server.  The cursor shape still
-     isn't correct though (Trent Piepho and R.E. Wolff).
-139. HW cursor support for the Trident 9660/9680 and 9430 -- not tested
-     (Alan Hourihane).
-138. XFree86-DGA extension support for ISC SVR3 (Michael Rohleder).
-137. Fix for "XIOerror 11 (Resource temporarily unavailable)" errors while
-     running xterm on ISC (Michael Rohleder).
-136. Major Trident driver updates, including HW cursor for 9440, and
-     an option to use a set of fixed clocks instead of fully programmable
-     clocks for the TGUI chips (Alan Hourihane).
-135. I128 updates (Robin Cutshaw).
-134. Mach64 support for ATI Extended VGA register location on PCI
-     cards with block I/O (Kevin Martin).
-133. Clean up Mach64 software cursor support (Kevin Martin).
-132. "dac_8_bit" is now the default for supported RAMDACs in the Mach64
-     server.  6-bit mode can be forced with the "dac_6_bit" option
-     (Kevin Martin).
-131. Mach64 support for the ATI Graphics Pro Turbo 1600, including
-     1600x1200 mode support (Kevin Martin).
-130. Mach64 support for the IBM RGB514 RAMDAC (Kevin Martin).
-129. Mach64 support for the GX-F (GX rev 3) (Kevin Martin).
-128. Add new options "w32_interleave_on" and "w32_interleave_off" to
-     the SVGA and W32 servers.  They allow the desired mode to be
-     forced for W32i and W32p cards (Dirk Hohndel).
-127. Full STG1703 support for W32 server (Dirk Hohndel).
-126. Fix some incorrect prototype ifdefs in xf86.h (Kaleb Keithley).
-125. Modify xterm to call XtSetLanguageProc() rather than setlocale()
-     (Kaleb Keithley).
-124. Preliminary driver for the SIS 86C201 chipset (VGA2 and VGA16 only
-     so far) (Alan Hourihane).
-123. Change the Mach64 aperture mapping to map the video memory and
-     mmapped registers into two separate areas rather than mapping the
-     entire 8MB aperture range.
-122. Use an 8MB aperture for all but ISA Mach64 cards since most of the
-     newer Mach64 chips only support an 8MB aperture size.
-121. Fix typo in Mach64 server that was causing some RAMDACs to be incorrectly
-     detected.
-120. Fix aperture address detection for VLB Mach64 cards.
-119. In the Mach64 server, set RAMDAC to 20C408 if the 20C408 clock type
-     is detected, and same for STG1703.
-118. SIGWINCH support for xterm on ISC 4.x (Geoff Steckel).
-
-XFree86 3.1.2Ab (9 December 1995)
-117. FreeBSD support for the DGA extension.
-116. Split the DGA code out into a separate extension (called XFree86-DGA)
-     (Kaleb Keithley).
-115. Fix some compiler warnings when compiling on LynxOS (Thomas Mueller).
-114. Fix some byte swapping problems in XFree86-VidModeExtension
-     (Thomas Mueller).
-113. Add preliminary STG1703 support to the W32 server. No clock
-     programming and no pixmux yet (Dirk Hohndel).
-112. Add new options "pci_burst_on" and "pci_burst_off" to SVGA and
-     W32 server. They will allow to solve display problems on many
-     ET4000/W32p based cards (Dirk Hohndel).
-111. Add new clock selection scheme to SVGA and W32 server, so that
-     32 clocks are used. The first 16 are the same as before, the
-     second 16 use CS3 (Dirk Hohndel and Koen Gadeyne).
-110. Add STG1703 detection to SuperProbe for ET4000/W32 based cards (Dirk
-     Hohndel).
-109. Fix extension version checking in xvidtune.
-108. Modify xterm to call XSupportsLocale() before initialising I18N
-     support (William Volkman).
-107. Fix S3 support for clocks up to 135MHz in 8 bpp for S3 868 cards
-     with ATT20C409 Gendac (e.g., Elsa Winner 1000AVI) (Dirk Hohndel).
-106. Fix S3 HW cursor handling for doublescan modes (Jon Tombs).
-105. Config and doc updates for NetBSD 1.1 (Matthieu Herrb).
-104. Preliminary (unaccelerated) I128 server code (Robin Cutshaw).
-103. Attempt to fix problem of Mach64 server mis-detecting the CH8398
-     RAMDAC.
-102. Modify the Mach64 server to use the membase address it reads from
-     the configuration registers.
-101. Fix cursor colour problem at 16, 32bpp with the Mach64 server.
-100. Support for the Mach64 CT.
-
-XFree86 3.1.2Aa (2 December 1995)
- 99. Fix for xterm behaving badly when TERM is set to "vt100" (Joerg Wunsch).
- 98. XDGA (direct graphics access) support added via the XFree86 VidMode
-     extension.  This is primarily intended for games support.  Currently
-     it is implemented only for Linux, and for the S3 and Cirrus drivers
-     (Jon Tombs).
- 97. Fixes for Ti3026 loop clock calculation code (Dirk Hohndel).
- 96. Detection and preliminary support for the Elsa Winner2000PRO/X-2,4 Rev.G
-     which has a S3-968, Ti3026, and ICS9161A clock chip.  Clock doubling
-     doesn't work yet (Dirk Hohndel).
- 95. Mach64 code cleanups and documentation updates (Kevin Martin).
- 94. Fix Mach64 pixmap cache bug which resulted in xcalloc being called
-     with a negative size (Kevin Martin).
- 93. The state of the AT&T20C408 is now saved/restored by the Mach64 server.
-     This should fix the dim screen problem when exiting from the server
-     (Kevin Martin).
- 92. ClockChip and Ramdac can now be specified in the XF86Config for the
-     Mach64 server (Kevin Martin).
- 91. Mach64 server ATI 18818/ICS 2595 clock chip programming now works
-     (Kevin Martin).
- 90. Mach64 server now automatically programs a programmable clock chip
-     when present.  This can be overridden with the "no_program_clocks"
-     Option.  The "program_clocks" option has been removed (Kevin Martin).
- 89. Initial changes to allow for integration of the I128 server
-     (Robin Cutshaw).
- 88. Avoid defining __USLC__ for MP/RAS in compiler.h (Kaleb Keithley).
- 87. If the server can't find an XF86Config file, print out the files it
-     tried to open (Joe Moss).
- 86. Fix(?) display centering for the Cirrus 754x.
- 85. Fix text mode clock problem in ET4000/W32 server (Koen Gadeyne).
- 84. Remove the "-noscale" flag from the Xserver and xfs since it has
-     been obsoleted by the ":unscaled" fontpath attribute.
- 83. Remove the RepeatedMiddle mouse option because it doesn't work
-     properly (Jon Tombs).
- 82. Remove some casts in xf86MouseProtocol() to work around in the
-     Metaware compiler/NCR assembler (Kaleb Keithley).
- 81. When the X server exits due to an unrecognised command-line option,
-     print out the offending option (Joe Moss).
- 80. Remove '-lc_s' from ExtraLibraries for ISC (Michael Rohleder).
- 79. Add code to SuperProbe and the Cirrus driver to recognise the
-     CL-GD7542 (and a guess for the CL-GD7541).
- 78. Fix RAMDAC probe problem introduced into the S3 server in 3.1.2e
-     (Joe Moss).
-
-XFree86 3.1.2A (19 November 1995)
- 77. Added a Beta Report template form.
- 76. Update xf86config for some of the new Ramdacs.
- 75. Allow 'Ramdac "ibm_rgb526" to be recognised by the S3 server.  It
-     then treats it as an RGB524.
- 74. Modify the beta startup message usage so that it gets printed once
-     for each different server started.
- 73. Fix for AGX-010 clock probing (Henry Worth).
-
-XFree86 3.1.2e (16 November 1995)
- 72. Updates to the Cards database.
- 71. S3 868 + AT&T 20C409 support (8/15/16/24bpp) without pixmux, and
-     S3-868 + AT&T 20C499 support (untested) (8/15/16/24bpp, no pixmux).
-     Pixmux support is enabled, but not functional (Dirk Hohndel).
- 70. Update SuperProbe to recognise AT&T 20C409 and AT&T 20C499 RAMDACs
-     (Dirk Hohndel).
- 69. Allow attributes to be appended to elements of a font path.  The
-     attributes are introduced by a ':' character, and multiple attributes
-     are separated by a ':'.  Currently the attribute "unscaled" is
-     supported for bitmap fonts, and this prevents them from being scaled.
- 68. Trident driver cleanups, and fixes for interlacing (Alan Hourihane).
- 67. LynxOS updates for using MetroLink Motif (Thomas Mueller).
- 66. Preliminary AT&T 20C409 support for the S3 server (not functional
-     yet) (Dirk Hohndel).
- 65. W32 updates to Xserver and SuperProbe (Dirk Hohndel and Koen Gadeyne).
-
-XFree86 3.1.2d (12 November 1995)
- 64. Fix a typo in the iso8859-1 Compose file.
- 63. Add a '-noscale' flag to the Xserver and xfs to allow scaling of
-     bitmap fonts to be disabled.  The keyword DontScaleBitmapFonts
-     in the ServerFlags section of the XF86Config file has the same affect.
- 62. Fix problem that prevents bitmap fonts from being scaled after
-     running something like 'xset fp rehash'.
- 61. Add a Release Date to the X server startup messages.
- 60. Add a "RELNOTES" document to describe changes in beta releases.
- 59. Fix panning for ARK2000PV chips with 2MB of memory (Leon Bottou).
- 58. Support for ICS5342 programmable clock in the ARK driver (Leon Bottou).
- 57. Major updates to the Oak driver, including more accelerated functions
-     for the OTI087 (Jorge Delgado).
- 56. Option "program_clocks" added for the Mach64 server to allow
-     arbitrary clocks to be programmed for most clock chips.  This
-     currently doesn't work with the ATI18818/ICS2595 chips (Kevin Martin).
- 55. Mach64 server support for the AT&T 20C408 (Kevin Martin).
- 54. Fix problem of two undisplayed pixels with the CL-GD7543
-     (Thomas Zerucha).
- 53. Add support for three button operation with some dual protocol mice
-     when they are in Microsoft-compatible mode.  The keyword to enable
-     this is 'RepeatedMiddle' (Jon Tombs).
- 52. Fix 3 button emulation problem introduced in item 48 (Thomas Mueller).
- 51. Add support for '-crt /dev/ttyXX' command line option for the X
-     servers for SCO.  This is for compatibility with the native SCO X
-     servers (Didier Poirot).
-
-XFree86 3.1.2c (5 November 1995)
- 50. Add expiry date and startup message for beta versions.
- 49. Fix problem using a LinkKit generated with BuildLBX set to YES.
- 48. Allow a real middle button event to be passed when 3 button mouse
-     emulation is enabled (Thomas Wu).
- 47. Fix panning and some initial clock selection problems for TGUI9440
-     cards (Alan Hourihane).
- 46. Support for the Cirrus CL-GD7543 (Thomas Zerucha).
- 45. Fix for instability problems with Cirrus programmable clock
-     (Koen Gadeyne).
- 44. Fix memory overwrite problem in xterm which could be a security
-     problem.
- 43. Merge in the X Consortium's public patch 13.
- 42. Define X_LOCALE for LynxOS for compatibility with Metrolink's
-     Motif package (Thomas Mueller).
- 41. Update SuperProbe to recognise the Cirrus CL-GD7543.
- 40. The Trident driver now automatically selects the "tgui" clockchip
-     when it detects a TGUI9440 (Alan Hourihane).
- 39. Remove the dependency on -lthread for UnixWare 2.x, while still
-     allowing full MT support.  This is done by adding a threads stub
-     library with weak symbols (David Wexelblat).
-
-XFree86 3.1.2b (22 October 1995)
- 38. Updated Japanese docs, including SGML versions suitable for formatting
-     with jlinuxdoc-sgml.  These docs use EUC encoding (Kazuyuki Okamoto).
- 37. Preliminary support for the Trident TGUI9440 (Alan Hourihane).
- 36. Add an "AllowNullPasswd" resource to xdm to make it possible for xdm
-     to login to accounts with a null password.  This is set to "False"
-     by default (Joerg Wunsch).
- 35. Use dynamically allocated strings in xrdb to avoid overruns that
-     can occur otherwise (Joerg Wunsch).
- 34. Add ELSA Winner 2000PRO/X-8 to the S3 ELSA probe code (Dirk Hohndel).
- 33. Fix S3 probe of IBM RGB RAMDACs incorrectly identifying an RGB528
-     or RGB528A as an RGB524 (Dirk Hohndel).
- 32. Fix incorrect memory probe for S3 964/968 (Dirk Hohndel).
- 31. Prelim pixmux support for ICS5341 RAMDAC in W32 server (Dirk Hohndel).
- 30. Support for ICS5341 programmable clock in W32 server (Dirk Hohndel).
- 29. Add RFC1700-conformant charset names for ISO-8859 locales to
-     locale.alias.
- 28. Fix LynxOS video mapping problem that shows up when the "fb_debug"
-     option is set in the S3 server (Thomas Mueller).
- 27. Fix reference to undeclared variable in os/xalloc.c for OSs which
-     don't have MMAP_ANON or MMAP_DEV_ZERO defined (Thomas Mueller).
- 26. Fix W32 server core dump on LynxOS when run with '-probeonly'
-     and no Clocks line in the XF86Config file (Thomas Mueller).
- 25. Fix reference to uninitialised string in Hercules mono driver
-     (Paul Gortmaker).
-
-XFree86 3.1.2a (23 September 1995)
- 24. Fix HW cursor masks in Mach32 and Mach64 servers.
- 23. Add detection of C&T 65548 to SuperProbe.
- 22. Fix snow problems with WD90C24 when for clocks higher than MCLK
-     (Brad Bosch).
- 21. Add XNLS support for KOI8-R (Andrey Chernov).
- 20. Fix problem with IBM ramdac and clockchip handling in xf86config.
- 19. Change XF86Config parsing to ignore '_' characters in keywords, and
-     to ignore '_', ' ', and '\t' characters when comparing strings with
-     StrCaseCmp() (ie, all strings except paths, Device/Monitor identifiers
-     and Mode names).
- 18. Reduce nonMuxMaxClock to 80MHz (from 100MHz) for S3 864 with
-     ATT498-compatible RAMDACs because it was too high for some cards.
- 17. Fix problem installing xterm on SunOS 4.x introduced in 3.1.2.
- 16. Set -fno-strength-reduce with -O2 for gcc2 to avoid a compiler bug.
- 15. Fix xvidtune/XF86VidMode problem when the Monitor Vendor and/or Model
-     are not specified in the XF86Config file.
- 14. Colour support for xterm (David Wexelblat).
- 13. Fix usage of $LINES and $COLUMNS by xterm on SVR4 (David Wexelblat).
- 12. Fix xconsole for Unixware 2.0 (David Wexelblat).
- 11. Fix optimisation problem with inline asm on Unixware 2.0
-     (David Wexelblat).
- 10. Improve subdir/lib dependence on systems using BSD 4.4. make
-     (Matthieu Herrb)
-  9. Allow the Xserver to accept InvertVCLK, EarlySC and BlankDelay.  It
-     previously expected Invert_VCLK, Early_SC and Blank_Delay.
-  8. Fix problem selecting a StaticGray visual with the VGA16 server
-     (Olivier De Smet).
-  7. Fix compile problem on FreeBSD 1.1.5 (David Bremner).
-  6. Change index and rindex macros in Xos.h when X_NOT_STDC_ENV is not
-     defined.
-  5. Fix(?) alloca declaration in Xtos.h for Solaris 2.5.
-  4. Fix dependencies for 'make includes' to ensure that auto-generated
-     headers exist before linking them to xc/X11 (David McCullough).
-  3. Change default InvertVCLK setting for the Hercules Terminator 64 Pro
-     (Harald Koenig).
-  2. Update for lynx.cf (Thomas Mueller).
-  1. README updates.
-
-XFree86 3.1.2 (24 July 1995)
-235. Fix(?) scanpci compile problem with gcc on Solaris.
-234. Documentation updates.
-
-XFree86 3.1.1Z (22 July 1995)
-233. Code Freeze for 3.1.2.
-232. Fix an imake config problem on non-XFree86 platforms.
-231. xman update for Solaris 2.5 (William Austin).
-230. Cyrillic fonts with KOI8 encoding added (Cronyx Ltd, Serge Vakulenko,
-     Andrey A. Chernov).
-229. Allow ndbm to be used for the rgb database on NetBSD for those
-     who want it (Matthieu Herrb).
-228. Attempt to fix register corruption for Cirrus 5430/5434/5436 in
-     SuperProbe.
-227. Remove -DUNIXCONN from the default SVR3 ConnectionFlags.
-226. Fix disappearing S3 hw cursor when switching modes with xvidtune
-     (Harald Koenig).
-225. Sync-on-green support for the ELSA Winner 2000Pro/X (Harald Koenig).
-224. Add vendor options to S3 server (hercules, stb, genoa) (Harald Koenig).
-223. Documentation updates (Joe Moss, Harald Koenig, Matthieu Herrb).
-
-XFree86 3.1.1Dc (19 July 1995)
-222. Fix(?) server crash when the Cirrus driver auto-detects the linear
-     fb address for PCI cards.
-221. Support for 964+IBM (Hercules Terminator 64) (Harald Koenig).
-220. Disable >8bpp for S3 911 and 924 because it won't work.
-219. Fix some auto-apply problems in xvidtune, and added a restore hot-key "R".
-
-XFree86 3.1.1Db (17 July 1995)
-218. Documentation updates.
-217. xvidtune updates.
-216. S3 parameter updates for STB 968 card, and update to the Trio64V
-     probe (Harald Koenig).
-
-XFree86 3.1.1Da (16 July 1995)
-215. Replace xf86pci.c with the real scanpci.c (Robin Cutshaw).
-214. Updates to the code for the additional S3 mode parameters, including
-     better default settings (Harald Koenig).
-
-XFree86 3.1.1D (15 July 1995)
-213. xterm fix for crash when inputMethod is set to kinput2 (Manabe Keishi).
-212. Code to detect the AT&T20C490, and Sierra 1148[234579] ramdacs
-     (Joe Moss).
-211. Update the VidMode extension to handle extra mode-specific parameters,
-     and update xvidtune for extra S3 parameters.
-210. Allow some S3 parameters to be set in the Display SubSection for
-     individual modes.
-209. xf86config Cards database updates.
-208. Updates to README.WstDig for the 90C24 (Brad Bosch).
-207. Updates to LynxOS support, including support for version 2.2.1, and
-     a README.LynxOS (Thomas Mueller).
-206. Support for the SC1148{2,3,4} ramdacs at 15bpp, and the SC1148{5,7,9}
-     ramdacs at 15 and 16bpp in the S3 server (Joe Moss).
-205. Fix for problems with some WD90C24 TFT systems (Brad Bosch).
-
-XFree86 3.1.1Cd (12 July 1995)
-204. Allow for three verbosity levels for Xserver messages: -quiet, default,
-     and -verbose (Marc Aurele La France).
-203. Make the LinkKit self-contained.  Apart from Xnest, it no longer
-     depends on the config files, headers, and utility programs being
-     installed (Marc Aurele La France).
-202. Updates to xvidtune.  The Show button now also sets the primary
-     selection, better usage/error messages and exit codes, man page
-     updates (Joe Moss).
-201. Updates for SCO -- mostly for lbx (David McCullough).
-200. Fix a cause for some S3 lockups (Harald Koenig).
-199. Updates/fixes and SVR4 support for new malloc code.
-
-XFree86 3.1.1Cc (8 July 1995)
-198. Merge in final form of XC fix-12.
-
-XFree86 3.1.1Cb (7 July 1995)
-197. Minor IBM RGB updates (Harald Koenig).
-196. MCLK detection for STG1703 (Harald Koenig).
-195. Add detection for new S3 Trio64V+ chip to the S3 server and
-     SuperProbe (Harald Koenig).
-194. Fix some clashing option numbers (Harald Koenig).
-193. Preliminary STG1703 clock programming code.
-192. A new malloc for use by the Xserver.  It is enabled by setting
-     UseInternalMalloc to YES (Pascal Haible).
-191. Fix for threads lib problem on Unixware 2.0
-190. Support for the WD90C24 in the pvga1 driver (Bradley Bosch).
-
-XFree86 3.1.1Ca (5 July 1995)
-189. Don't enable HAS_MMAP for Xvfb on Linux (Marc Aurele La France).
-188. Code to detect the STG1703 RAMDAC in SuperProbe and the S3 server
-     (Harald Koenig).
-187. A few AGX bug fixes (Henry Worth).
-186. More pre-fix-12 fix-trackers.
-
-XFree86 3.1.1C (3 July 1995)
-185. Manual page updates.
-184. Add extended power_saver support to the VGA and Mach64 servers.
-     Suspend mode isn't currently supported by the VGA servers.
-183. Add entries for the SunFA_ dead accents to the iso8859-1 Compose file
-     (Jon Tombs).
-182. Updates to IBM RGB52x in the S3 server, including fixing the
-     8bpp problem.
-181. Documentation updates (including a README.ark) (Harm Hanemaayer).
-180. Change the Mach64 server to ignore the Clocks line in the XF86Config
-     unless the "no_bios_clocks" option is used (Kevin Martin).
-179. Fix font corruption with Mach64 server (seen when running Mosaic
-     or Netscape) (Kevin Martin).
-178. Fixes for constant-metric fonts in AGX server (Henry Worth).
-
-XFree86 3.1.1Bi (2 July 1995)
-177. Improved "power_saver" for the S3 server, and modified XFree86-VidMode
-     extension to allow its parameters to be set from a client.
-176. Fixes for AGX copyplane (Henry Worth).
-
-XFree86 3.1.1Bh (1 July 1995)
-175. Updates to AGX server.  Includes reversing previous copyplane change,
-     restoring the setting of membase for AGX chips, cleanup setting
-     of the default planemask, and fixes to the agxIm routines + some
-     speedups (Henry Worth).
-174. Some more pre-fix-12 fix-trackers.
-
-XFree86 3.1.1Bg (29 June 1995)
-173. Turn on "dac_8_bit" by default in the S3 server for RAMDACs that
-     support it.  Add "dac_6_bit" option to allow 6-bit mode to be selected.
-     Also, complain when "dac_8_bit" is used for a RAMDAC that can't do it.
-172. Improve "power_saver" operation by adding a delay between turning off
-     the video signal and the syncs (Bernhard Bender).
-171. Workaround for the NumLock modifier interfering with the xterm
-     ctrl+btn menus.
-170. More pre-fix-12 fix-trackers.  Mostly some libX11 and libXt fixes.
-     Includes a workaround for the NumLock modifier interfering with
-     Xaw pull-down menus.
-169. Preliminary support for the IBM RGB52x ramdacs in the S3 server
-     (Harald Koenig).
-
-XFree86 3.1.1Bf (27 June 1995)
-168. Another stab at the ET4000/W32p mouse droppings fix (Glenn Lai).
-167. Back out some LBX fixes that won't be in fix-12.
-
-XFree86 3.1.1Be (25 June 1995)
-166. Some documentation updates.
-165. Fix a few LinkKit problems.
-164. Fix LBXProxyOnly build.
-
-XFree86 3.1.1Bd (24 June 1995)
-163. Add a BuildLBXProxyOnly Imake config option to allow building lbxproxy
-     from a self-contained cut-down source tree.
-162. vtname was too short in Linux OS-dep code (similar change for LynxOS
-     and SCO too) (Pascal Haible).
-161. Change uses of malloc/free in Xserver to xalloc/xfree (Pascal Haible).
-160. AGX documentation updates (Henry Worth).
-159. Fixes for AGX font rendering, and copyplane (Henry Worth).
-158. AGX font cache flushed by screensaver (Henry Worth).
-157. AGX screensaver for >8bpp (Henry Worth).
-156. pre-fix-12 fix-tracker: improvement to the Xt translation manager
-     performance when high order modifiers are assigned.   Also, change
-     the servers to use Mod3 for Mode_switch instead of Mod5 to further
-     improve this.
-155. Fix some UseGnuMalloc config stuff, and set this to YES by default
-     for FreeBSD.
-154. Fix some problems with the VGA2 server, including crashes in banked
-     mode, and incorrectly switching banks when bitblting in non-banked
-     mode.
-
-XFree86 3.1.1Bc (21 June 1995)
-153. Fix for ET4000/W32p cards -- don't change the PCI burst setting.
-     This should fix mouse droppings and missing characters in text mode
-     for some cards (Glenn Lai).
-152. Fix AGX font corruption problem (Henry Worth).
-151. Disable 32bpp in AGX server by default -- it is too unstable
-     (Henry Worth).
-150. XGA clock updates in AGX server (Henry Worth).
-149. EISA XGA probing in AGX server (Henry Worth).
-148. Better scratchpad and font cache support for XGAs in AGX server
-     (Henry Worth).
-147. Font glyph blting for non-cached fonts with AGX server (Henry Worth).
-146. AGX font cache fixes (Henry Worth).
-145. pre-fix-12 fix-trackers, including:
-      - LBX fixes and additional functionality
-      - some xtrans and fontlib fixes
-      - smproxy and xsm fixes
-144. Fix sessreg (WTMP, LASTLOG, but no UTMP) for *BSD.
-143. Allow 'UseGnuMalloc' to work on all platforms.
-
-XFree86 3.1.1Bb (17 June 1995)
-142. Config updates to make LinkKit more self-contained
-     (Marc Aurele La France).
-141. Fix some problems with blocking stderr on BSD/OS 2.0 (Hans Nasten).
-140. Add auto-apply mode to xvidtune, and flesh out the xvidtune man
-     page (Joe Moss).
-139. AGX font cache bug fixes, and fix font clipping problem (Henry Worth).
-138. Some more pre-fix-12 fix-trackers, including:
-      - Xaw - removal of undocumented/broken INTERNAL selection mechanism
-      - Fix makestrs problem with -earlyR6bc.
-
-XFree86 3.1.1Ba (14 June 1995)
-137. Fix AGX problem with vertically overlapping fonts (Henry Worth).
-136. Fix some mono (VGA2) problems that can lead to a server crash.
-135. New "VGAbase" keyword for XF86Config -- currently used only by the
-     AGX server (Henry Worth).
-134. Fixes for XGA autoconfig code in the AGX server (Henry Worth).
-133. Documentation updates (Dirk Hohndel).
-132. Change default FreeBSD version in FreeBSD.cf to 2.0.5.
-131. Add a LockModeSwitch function to the VidMode extension, and modify
-     xvidtune to use it.
-130. Force VTotal to be odd for interlaced modes.
-129. Fix default Vsync/Hsync polarity setting (Marc Aurele La France).
-128. Trap a failed 'cd' in 'make Makefiles'.  This prevents the Makefile
-     in the . directory being removed (and other potential problems) when
-     one of the SUBDIRS directories is missing.
-127. Include some XC fix-trackers intended for fix-12.  Main changes include:
-      - Using -Xa for SVR4 compiles, and changing '#if __STDC__' to
-         '#ifdef __STDC__'
-      - Overhall tty setup in xterm -- should work better for Solaris now.
-      - Fix SVR4 ABI problems with libXt strings.
-126. Recognise 'Ramdac "generic"' in W32 server (Glenn Lai).
-
-XFree86 3.1.1B (10 June 1995)
-125. Fix problem with dacspeed line in files generated by xf86config.
-
-XFree86 3.1.1Ad (8 June 1995)
-124. Rename the vgahelp client to xvidtune.
-123. Rename "VGAHelp" extension to our registered name
-     "XFree86-VidModeExtension", and update API to use the XF86VidMode
-     prefix instead of the "XVGAHelp"/"VGAHelp" prefix.
-122. Undef i386 in Imake.cf for i386Architecture systems.
-121. Fix(?) WTMP problem with xterm on SYSV and Linux.
-120. Mach64 documentation updates (Kevin Martin).
-119. Power_saver support for the Mach64 server (Kevin Martin).
-118. Autodetect when block write mode should be disabled for the Mach64
-     server.  A "block_write" option has been added to override this
-     (Kevin Martin).
-117. Use "dead_*" keysyms instead of the DEC "D*" keysyms for the dead keys
-     in the Linux keyboard code and Compose file.
-116. Use our registered name for the ModeLock keysym.
-
-XFree86 3.1.1Ac (6 June 1995)
-115. Vgahelp client enhancements (Jon Tombs).
-114. Fix core dump in fslsfonts when no fontserver is specified
-     (Matthieu Herrb).
-113. Fix W32 problem introduced with modified SaveScreen code.
-112. Update "M" parameter calculation for Trio boards (Harald Koenig).
-
-XFree86 3.1.1Ab (2 June 1995)
-111. Preliminary support for the Cirrus 5436 (Harm Hanemaayer).
-110. PCI base address detection for the Cirrus driver (Harm Hanemaayer).
-109. Fix problem linking AGX server with the LinkKit (Stephen Kump).
-108. Support for LynxOS (Thomas Mueller).
-107. Update LinkKit to make it self-contained regarding X headers
-     (Marc Aurele La France).
-106. Realtek SVGA driver.  It works with the RTG3106, and possibly the
-     RTG3103 and RTG3105 (Peter Trattler).
-105. Enable the s3MCLK option for the S3 805i, and fix some bugs relating to
-     s3MCLK (Harald Koenig).
-104. Fix XF86Config problem when monitor and screen sections are interleaved.
-
-XFree86 3.1.1Aa (1 June 1995)
-103. Fix SiteIConfigFiles settings for the LinkKit (Marc Aurele La France).
-102. Fix gccmakedep problem with .s files.
-101. Updates to BSDI docs (Hans Nasten).
-100. Updates to Linux ELF config/rules (Orest Zborowski).
- 99. Check for 868 before 864 in S3 server (Harald Koenig).
- 98. Add rule for compiling/installing scanpci.
-
-XFree86 3.1.1A (28 May 1995)
- 97. vgawonder driver updates (including fix for VGA2 driver with Mach64)
-     (Marc Aurele La France).
- 97. Small TVP3026 fix (Harald Koenig).
- 95. Fix keyboard LEDs not being turned off now that the initial lock state
-     is ignored.
-
-XFree86 3.1.1h (26 May 1995)
- 94. Support for parallel make (on SVR4) (Robin Cutshaw).
- 93. Don't initialise the state of the lock keys based on their state
-     prior to server startup.
- 92. Untested changes in the AGX server for AGX-010 support (Henry Worth).
- 91. Tested support in the AGX server for the XGA-2 at 8bpp and 16bpp
-     (Henry Worth).
- 90. 16bpp and 32bpp support for the AGX server (Henry Worth).
- 89. Additional accelerations for the P9000 server (Henrik Harmsen and
-     Chris Mason).
- 88. Fix some gamma correction problems in the S3 server (Harald Koenig).
- 87. More 968/868 fixes, including code to recognise the newer ELSA cards
-     (Harald Koenig).
- 86. Further VGA16 scrolling fix (Stuart Anderson).
- 85. Fix problems with some 1MB P9000 cards (Erik Nygren).
- 84. Swap the black and white pixel values in the SVGA server's default
-     colour map.  This fixes a white line problem with some older
-     VGA Wonder boards (Marc Aurele La France).
- 83. Move sequencer resets into the driver's SaveScreen function
-     (Marc Aurele La France).
- 82. vgawonder and ati_test updates (Marc Aurele La France).
- 81. Handle "crippled" Mach32 and Mach64 chips in SuperProbe and the
-     vgawonder driver (Marc Aurele La France).
- 80. Distinguish between different types of Mach64 chips in SuperProbe and
-     the vgawonder driver (Marc Aurele La France).
- 79. Add defines to xf86Version.h for each part of the XFree86
-     version numbers (Marc Aurele La France).
- 78. LinkKit updates to make it self-contained (Marc Aurele La France).
- 77. Memleak support for NetBSD, and add UseMemLeak Imake config
-     parameter to allow compiling Xserver/os with memleak (Matthieu Herrb).
- 76. Update NetBSD aperture driver to support -current loadable kernel
-     modules (Matthieu Herrb).
- 75. Don't try to do clock doubling for 964 + Bt485 at 32bpp.
-
-XFree86 3.1.1g (7 May 1995)
- 74. i386 BSD support for the memleak utility (Jeffrey Hsu).
- 73. Fix a scrolling corruption problem with multiple regions in the VGA16
-     server (Stuart Anderson).
- 72. Modify VGA16 server to provide 4 visuals which can be selected
-     using the standard -cc flag (Stuart Anderson).
- 71. Changes to allow XDMCP broadcasts on some transports when using
-     STREAMSCONN (Stuart Anderson).
- 70. Updates for building on NCR SVR4/MP-RAS 3.0 (Stuart Anderson).
- 69. Some updates for ISC (Michael Rohleder).
- 68. Fix FillRect problem that causes a server crash for most accel servers
-     when running at 16/32bpp and X isn't on the active VC (Harald Koenig).
- 67. Fix mach32 inline asm problem (outsw) that shows up with recent gcc
-     versions.
- 66. Modify xterm to find all ptys on recent FreeBSD (Satoshi Asami).
- 65. Work around S3 Trio "white line" problem by swapping the default black
-     and white pixel values.
-
-XFree86 3.1.1f (24 April 1995)
- 64. Remove ComplexProgramTargetNoMan rule, and use NormalProgramTarget
-     instead.
- 63. Fix cirrus MMIO problem introduced in 3.1.1e, and allow 135MHz clocks
-     for a wider range of CL-GD5434 revisions (Harm Hanemaayer).
- 62. Update to S3 HW cursor fix (Harald Koenig).
- 61. Preliminary support for S3 866 and 868 boards (tested with the
-     ELSA Winner 1000AVI) (Harald Koenig).
- 60. Fix a problem with virtual resolution calculation in the Mach32 and
-     Mach64 servers (when none is given in the XF86Config file)
-     (David Holland).
-
-XFree86 3.1.1e (10 April 1995)
- 59. Fix problems that can lead to S3 crash/lockup when using HW cursor
-     (Harald Koenig).
- 58. S3 Trio updates (Harald Koenig).
- 57. Fix return value of QueryBestSize() for HW cursors.
- 56. Fix cirrus display error when scrolling without BitBLT engine
-     (Harm Hanemaayer).
- 55. Sanity check to prevent cirrus crash with negative size rectangle
-     fill (Harm Hanemaayer).
- 54. Cirrus MMIO improvements, including support for 5429 (Harm Hanemaayer).
- 53. More balanced cirrus FIFO settings to resolve display refresh errors
-     during drawing operations at high dot clocks (Harm Hanemaayer).
- 52. Support for clocks up to 135MHz for CL-GD5434 revision E and later
-     (Harm Hanemaayer).
- 51. Fix memory leak in cirrus text drawing (Harm Hanemaayer).
- 50. Updates for Linux ELF support (H.J. Lu).
- 49. Fix mail directory path in xbiff.
- 48. Fix S3 interlace mode problem for boards with programmable clocks
-     (Harald Koenig).
- 47. Fix core dump from vgahelp when started with no args (Christos Zoulas).
- 46. Fix 968 detection in SuperProbe, and add Ti3026 detection (Harald Koenig).
- 45. Preliminary S3 968 and Ti3026 support (Harald Koenig).
- 44. Added similar code for SYSV regarding I/O permission, but not enabled
-     (yet) by default.
- 43. Modify Linux I/O permission code to use IOPL rather than TSS bitmap
-     in all cases (Orest Zborowski and Harm Hanemaayer).
- 42. Fix lack of keysyms for numerical keypad when ServerNumLock is enabled
-     on Linux (Orest Zborowski).
- 41. Update _SC_OPEN_MAX code.
- 40. Fix ALLOCATE_LOCAL() not using alloca() with gcc.
-
-XFree86 3.1.1d (21 March 1995)
- 39. Preliminary mode checking for the VGAHelp extension.
- 38. Add timeout for 3 button emulation (Mike Hench).
- 37. Reorganise Ti302x code to remove S3-specifics from common_hw
-     (Robin Cutshaw).
- 36. General PCI probe code (Robin Cutshaw).
- 35. FreeBSD 1.1.5 has _SC_OPEN_MAX defined, but no sysconf().
-
-XFree86 3.1.1c (12 March 1995)
- 34. Updates for #9 GXE64Pro required due to changes in 3.1.1b (Hans Nasten).
- 33. Support for BSD/OS 2.0 (Hans Nasten).
- 32. Updates for OS/2, including work on the X server support (Holger Veit).
- 31. SVGA driver for the ARK 1000PV and 2000PV chipsets (Harm Hanemaayer).
- 30. Add predefs to makedepend for FreeBSD and NetBSD.  This allows
-     xf86_OSlib.h to be cleaned up a little.
- 29. Fix config rules for Sentinel build (David Wexelblat).
-
-XFree86 3.1.1b (8 March 1995)
- 28. Fix for byte swapped extension problem in lbxproxy (Dave Lemke).
- 27. Support for Unixware 2.0 (Robin Cutshaw and Kaleb Keithley).
- 26. Fix FIFO detection problem and bug reading BIOS video max modes in
-     Mach64 server (Kevin Martin).
- 25. Support for Chrontel 8398 and STG1703 clock programming in the Mach64
-     server (Kevin Martin).
- 24. Add "no_block_write" option to turn of block write mode in the Mach64
-     server (Kevin Martin).
- 23. Add "override_bios" option to override the Mach64 server's BIOS mode
-     checking (Kevin Martin).
- 22. Allow Membase to be given in XF86Config for the Mach64 server
-     (Kevin Martin).
- 21. Fix bug in Mach64 ATI68860 RAMDAC code which causes noisy display
-     (Kevin Martin).
- 20. Add support for STG1702, STG1703, ATI68875, CH8398 RAMDACs to Mach64
-     server (Kevin Martin).
- 19. Post events for initial lock key state differently to avoid calling
-     ProcessKeyboardEvents() before all the data it uses is initialised.
- 18. Fix and extend ISO8859-1 Compose file (Peter Dalgaard).
- 17. Update S3 SVGA driver so that it works with 3.1.1.
- 16. Fix 90C33 problem with 2MB cards when memory is not auto-probed.
- 15. Fix some ISC LOCALCONN problems (Michael Rohleder).
- 14. Put back some #9 GXE64Pro specific bits in S3 server.
- 13. Remove 1024 min virtual width restriction from Mach64 server
-     (Kevin Martin).
- 12. Fix dashed line server hang problem for Mach32.
- 11. Add UseGnuMalloc to xf86site.def (only implemented for ISC so far).
- 10. Fix POSIX_SAVED_IDS typo in xterm (Christos Zoulas).
-  9. Fix problem of attempting to include the VGAHELP extension in Xnest.
-
-XFree86 3.1.1a (12 February 1995)
-  8. VGAHELP X server extension for tuning video modes (Kaleb Keithley).
-  7. Fix libfont problem that can cause xfs to get into a loop (Jason Venner).
-  6. Fix problem with TekHVC colours (Kaz Sasayama).
-  5. Fix merge problems in hw/sun.
-  4. Fix line clipping problem in Mach32 server (can affect font cache).
-  3. Fix font cache problem on 2MB Mach32 cards.
-  2. Add detection of Trident GUI9440 to SuperProbe (untested).
-  1. Fix some ISC problems (Michael Rohleder).
-
-
-XFree86 3.1.1 (30 January 1995)
-265. --- Code freeze ---
-264. Include final form of fix-11.
-
-XFree86 3.1.0Zg (29 January 1995)
-263. Include final form of fix-10.
-262. Fix some merge problems.
-
-XFree86 3.1.0Zf (28 January 1995)
-261. Merge in prelim version of XC fix-11.
-
-XFree86 3.1.0Ze (28 January 1995)
-260. Merge in prelim version of XC fix-10.
-
-XFree86 3.1.0Zd (28 January 1995)
-259. Merge in XC fix-09.
-258. Minor updates (mostly typographical) to smooth the fix-11 merge.
-257. Define X_LOCALE for Linux.
-
-XFree86 3.1.0Zc (27 January 1995)
-256. Doc updates.
-255. Minor hw/xfree86 updates for fix-11 (Kaleb Keithley).
-254. Merge in XC fix-08.
-
-XFree86 3.1.0Zb (26 January 1995)
-253. Rename some files under hw/xfree86 to avoid clashes when truncated to
-     8.3 type names as used on ISO9660 format CDROMs.
-
-XFree86 3.1.0Za (25 January 1995)
-252. Minor pixmux clock limit update for Trio64 (Harald Koenig).
-251. Merge in XC fix-07.
-250. Some documentation updates.
-
-XFree86 3.1.0Z (23 January 1995)
-249. Restore correct key maps for 84-key keyboard, but allow alternate (old)
-     behaviour when "ServerNumLock" is set in the XF86Config.
-248. xf86config updates (Harald Koenig).
-247. Remove stripes when panning with Ti3025 (Harald Koenig).
-246. Enable linear fb probing for VLB Trio64 cards with > 1MB DRAM
-     (Harald Koenig).
-245. Put blank delay values back to what they were for non-#9 Ti3025
-     boards (Harald Koenig).
-244. Fix AGX fill problems and hangs when exiting with an AGX-016 under
-     SVR4 (Henry Worth).
-243. Fix AGX font cache problem, and other updates/cleanups
-     (Henry Worth).
-
-XFree86 3.1.0Ce (22 January 1995)
-242. Updates to vgawonder driver, including fix for 68800-6 memory probe,
-     and a reworking of the clock matching code (Marc Aurele La France).
-241. Remove most BIOS dependencies in vgawonder probe code
-     (Marc Aurele La France).
-240. Change ordering of Mach32 and Mach64 probing in SuperProbe, ati.test
-     and the vgawonder driver to avoid hanging Mach32 boards.  Also use
-     a timeout in all WaitIdle loops in the probes (Marc Aurele La France).
-239. Minor #9 GXE64Pro updates (Hans Nasten).
-238. Allow LASTLOG to be independent of SYSV_UTMP in xterm -- so it will
-     work for Linux (Helmut Geyer).
-
-XFree86 3.1.0Cd (21 January 1995)
-237. Improve positioning of pixmap expansion and font cache areas with
-     the S3 server.
-236. Fix problem with Cirrus mono server crashing (Stephen Kump).
-235. Allow the "sw_cursor" option to work for the S3 server.
-234. Fix S3 HW cursor hot spot problem when no ViewPort entry is given in
-     the XF86Config (Harald Koenig).
-233. Fix some S3 Trio64 8bpp+pixmux display errors (Harald Koenig).
-232. Fix #9 GXE64Pro problems introduced in 3.1.0Cc (Hans Nasten).
-231. SPEA auto-detection for their Trio64 cards (Norbert Distler).
-230. Possible fix for keymap problems with 84-key keyboards.
-229. Internationalisation support for xterm (Martin Forssén).
-228. Remove the need for a Virtual entry in the XF86Config for the Mach64
-     server.
-
-XFree86 3.1.0Cc (20 January 1995)
-227. Add a check to the W32 server for invalid depths.
-226. Fix bug in PaintWindow in Mach32 and AGX servers (Stuart Anderson).
-225. Chrontel 8391 programmable clock support (Richard Burdick
-     and Harald Koenig).
-224. S3 programmable clock code updates (Harald Koenig).
-223. Support for S3 Trio32 and Trio64 (Harald Koenig).
-222. Updates to S3 Ti3025 code for the Miro 40SV (Harald Koenig).
-221. Update xf86config to know about the latest clockchip changes
-     (Harm Hanemaayer).
-220. Minor cirrus HW cursor patch (Harm Hanemaayer).
-219. Updates to OAK driver, including mapping the linear fb above 64MB
-     (Jorge Delgado).
-
-XFree86 3.1.0Cb (19 January 1995)
-218. Fix XLOCAL parsing problem introduced in XC fix-06 (Steve Forsythe).
-217. Added a DocIndex (to use as a starting point for the HTML docs).
-216. README.Oak (Jorge Delgado).
-215. SuperProbe/kbd_mode updates for compiling with PCVT_SUPPORT
-     (Joerg Wunsch).
-214. Fix for 90C31 acceleration problems.
-213. Don't use '-ansi -pedantic' for Solaris versions earlier than 2.4.
-
-XFree86 3.1.0Ca (18 January 1995)
-212. S3 update for SPEA Mercury P64 (Norbert Distler).
-211. Late LBX updates from the XC.
-210. Add a "no_imageblt" option for the Cirrus driver (Harm Hanemaayer).
-209. Support for 2:1 pixmux 8bpp RAMDACs on boards with fixed clock chips.
-208. S3 changes for the ICS5342 ramdac/clock (Harald Koenig).
-207. Fix problem in miZeroClipLine() which can cause a server hang
-     (Harald Koenig).
-206. Fix register unlocking problem in S3 server (for Stealth 64 VRAM)
-     (Harald Koenig).
-
-XFree86 3.1.0C (15 January 1995)
-205. Preliminary programmable clock support for the Mach64 server
-     (Kevin Martin).
-204. Add accelerated line code for the P9000 server and fix/update some
-     other accelerated code (Chris Mason).
-203. Allow XF86Config Videoram to override autodetection with the P9000
-     server, and allow the "vram_128" option force recognition of
-     128kx8 VRAM (Erik Nygren).
-202. Change P9000 programmable clock operation to be consistent with other
-     servers (Erik Nygren).
-201. Allow Cirrus MMIO for the 5429, and change on of the fixed clocks
-     in the Cirrus programmable clock code (Harm Hanemaayer).
-
-XFree86 3.1.0Bf (14 January 1995)
-200. Preprocess Linux jump files, and allow libX11 to be built with XdmAuth
-     (Orest Zborowski).
-199. Fix VTSema-related problem in s3bstore.c (Henry Worth).
-198. Merge in XC's pre-fix-07 LBX code.
-
-XFree86 3.1.0Be (12 January 1995)
-197. Include Japanese translations of some XFree86 3.1 docs (Kazuyuki Okamoto).
-196. Updates to SPEA detection code (Norbert Distler).
-195. Fix for ICS2595 initialisation problem (Norbert Distler).
-194. Some vgawonder driver fixes (Marc Aurele La France).
-193. Prevent xf86config from crashing when some fields are missing in
-     the Cards database (Matthieu Herrb).
-192. Fix S3 cursor X position when the display address is not changed to
-     avoid display errors.
-191. Set S3 M/N parameters depending on the MCLK value (which can be probed
-     or set in XF86Config) (Harald Koenig).
-
-XFree86 3.1.0Bd (12 January 1995)
-190. Update cl64xx driver for modeRec changes.
-189. Merge in XC public fix-06.
-
-XFree86 3.1.0Bc (11 January 1995)
-188. Added a DontZoom keyword for the XF86Config "ServerFlags" section
-     to disable the mode switching key sequences.
-187. Updates for ISC.  Includes imake config support for the SVR3 mmap
-     driver, updates to install.svr3, and patches for building lbxproxy
-     (Michael Rohleder).
-186. Fix 864 + STG1700 8bpp pixmux for clocks between 67.5 and 95 MHz
-     (Harald Koenig).
-185. Change VRAM timings for Diamond Stealth 64 VRAM (Harald Koenig).
-184. Set HSyncEnd overflow in S3 server when needed (Harald Koenig).
-183. Prevent C&T driver from pretending to support the 82c45x chipsets.
-182. Don't trap <ctrl><alt><bs> when DontZap is set.
-
-XFree86 3.1.0Bb (10 January 1995)
-181. Updates to linear fb code for OTI087, and allow the FIFO threshold
-     to be set from XF86Config (Jorge Delgado).
-180. Add hooks for server/driver mode validation.  This is currently used
-     only by the NCR SVGA driver (Stuart Anderson).
-179. Fix for ET4000/W32 bank switching code in the SVGA et4000 driver
-     (David Etherton).
-178. Similar hw cursor move fix for S3 server.
-177. Fix for Cirrus crash when the hw cursor is moved while in another VT
-     (Harm Hanemaayer).
-176. Allow the "s3_964_bt485_vclk" to be used for the Diamond Stealth64 (VRAM).
-     This requires the "diamond" option (Harald Koenig).
-175. Rewrite xlfd_round_double() to speed it up on machines with no
-     hw floating point.  This reduces server startup time on such machines
-     (Harald Koenig).
-174. Reduce amount of floating-point calculation in icd2061a and S3 gendac
-     clock code (Harald Koenig).
-173. Probe code to detect some SPEA boards and correctly set the clockchip
-     (Norbert Distler).
-172. Allow Xservers to be built with only PCVT support on *BSD, and
-     clean up the console driver probing for *BSD (Joerg Wunsch).
-
-XFree86 3.1.0Ba (8 January 1995)
-171. Change "ct5??" chips&tech names to "ct655??".
-170. Fix for Xnest (and Xvfb) not calling OsInitColors().
-169. Add support for relinking the Xnest server with the LinkKit.
-168. Modify vgawonder to probe clocks when -probeonly is used
-     (Marc Aurele La France).
-167. Fix some cirrus line drawing problems and fix non-interlaced modes
-     with vertical timings > 1024 (Harm Hanemaayer).
-166. Avoid use of the threads lib for SolX86 (David Holland).
-
-XFree86 3.1.0B (4 January 1995)
-165. Support for C&T 65540/45 added to the SVGA server (Régis Cridlig).
-164. Change cirrus programmable clock code to use a tested set of clock
-     parameters when there is one close to the requested clock frequency
-     (Harm Hanemaayer).
-163. Fix cirrus BitBLTs with height > 1024 for 543x (Harm Hanemaayer).
-162. Clock-related updates to the vgawonder driver (reject invalid clocks
-     where possible) (Marc Aurele La France).
-161. Config updates (including installation of host.def and fix references
-     to cl64xx driver in xf86site.def) (Marc Aurele La France).
-
-XFree86 3.1.0Ae (2 January 1995)
-160. Replace docs with the ascii versions generated from the sgml source.
-159. Major updates to xf86config(1), including the addition of a Cards
-     database (Harm Hanemaayer).
-158. Check and reject invalid XF86Config depths for the VGA16 and Mono
-     servers.
-157. Add an "s3_964_bt485_vclk" option to fix a problem with 964+Bt485.
-     Also added code to detect the MIRO 20SV board revision (Harald Koenig).
-156. Add an S3Mclk entry to XF86Config to allow the MCLK value to be specified
-     in order to aid the calculation of the optimal M parameter
-     (Harald Koenig).
-155. Fix S3 linear fb check and allow membase to work for 864/964 boards
-     (Harald Koenig).
-154. Move server lock code back into Xserver/os so that it gets used by
-     Xnest and Xvfb.
-
-XFree86 3.1.0Ad (26 December 1994)
-153. Fix problems with DBLSCAN code introduced in 3.1.0Aa (Harm Hanemaayer).
-152. Support for adding LBX via the LinkKit.
-151. Fix some LinkKit config problems.
-150. Fix LinkKit Imakefile bug introduced in 3.1.0A.
-149. Support for SPEA Mercury P64 (Bt485 + 964) (Norbert Distler).
-148. Enable ICD2061A/SC11412 clockchip by default for S3 server if the
-     the "SPEA_Mercury" option is given and Bt485 + 964/928 is detected
-     (doesn't happen if an XF86Config entry for either ramdac or clockchip
-     is present) (Norbert Distler).
-147. Fix for PCI Type 2 probe for I128 SuperProbe code (Robin Cutshaw).
-146. Major Cirrus update.  Includes new acceleration using mmio (lines
-     tilefill and rectangles), and more acceleration for 16/32bpp
-     (Harm Hanemaayer).
-145. Fixes for AGX dashed line code (Henry Worth).
-144. Allow S3 server to put the cache in the area to the right of the screen
-     when it is larger than the area below it (Leonard N. Zubkoff).
-
-XFree86 3.1.0Ac (20 December 1994)
-143. Imake template and rules for LinuxDoc-SGML formatting.
-142. Documentation converted to LinuxDoc-SGML (Gertjan Akkerman,
-     Jayadev Billa, Matthieu Herrb, Michael Klemme).
-141. Re-enable SO_REUSEADDR code in Xtranssock.
-
-XFree86 3.1.0Ab (18 December 1994)
-140. Item 58. below (the patch didn't get included before).
-139. Add some sanity checking for horizontal timing parameters (including
-     HTotal overflow for 864 with 24bpp, pixmux and HTotal > 1024)
-     (Harald Koenig).
-138. Add check for 864 DCLK limit for 24bpp (Harald Koenig).
-137. Clean up of SDAC/GENDAC detection and related messages (Harald Koenig).
-136. Allow the following ramdac and clock chips to be specified by name:
-     att21c498 (att20c498), ics5300 (s3_gendac), ics5342 (s3_sdac),
-     ics9161a & dcs2824 (icd2061a).  (Harald Koenig)
-135. OS/2 updates, including config updates, SuperProbe support and
-     compile-time support for most of the Xserver (Holger Veit).
-134. Updated cl64xx driver, including support for the CL6440.  Note, the
-     driver name has changed from "cl6420" to "cl64xx" (Manfred Brands and
-     Randy Hendry).
-133. Fix VT switch problem with the SVGA MX driver (Frank Dikker).
-132. Add PCI config type 1 support to I128 probe in SuperProbe (Robin Cutshaw).
-131. Update support for STB Pegasus (928 + Bt485), including 16bpp and
-     32bpp (Leonard N. Zubkoff).
-130. Fix pixmux clock check in Mach32 server (Alan Hourihane).
-129. Mods to allow XFree86 servers to compile with 'gcc -ansi -pedantic'
-     on Solaris 2.x (David Holland).
-128. Fix stipple problem in S3 server.
-127. Fix for setuid-root xterm problem reading .Xauthority file on
-     nfs-mounted filesystem (so far only for systems with POSIX_SAVED_IDS)
-     (Christos Zoulas).
-126. Move server lock code into hw/xfree86 (Kaleb Keithley).
-125. Really fix Membase handling for S3 server and 805/928.
-124. Fix Mach32 probe problem.
-123. Fix SVR3 config problems (Michael Rohleder).
-
-XFree86 3.1.0Aa (11 December 1994)
-122. Fix default mapping for numpad keys.  ServerNumLock should now not
-     be required (for clients using R6 Xlib).
-121. DoubleScan modes are no longer specified with doubled vertical timings.
-120. Add extra timings fields to the ModeRec which are the CRTC values
-     used by the hardware.
-119. Update oak driver to support linear mode for the oti-087 (Jorge Delgado).
-118. Fix '-DSTATIC_COLOR' problems (Hans Nasten).
-117. Fix typos which prevented Mach64 detection in SuperProbe from working
-     (Marc Aurele La France).
-116. Allow XF86Config settings to override ELSA probe (Harald Koenig).
-115. Fix Membase handling for S3 server and 805/928.
-114. Make BSD console driver support selectable from imake.
-113. Fix some SVR4 config problems.
-
-XFree86 3.1.0A (5 December 1994)
-112. Mach64 pixmap cache fixes (Kevin Martin).
-111. Improve cirrus programmable clock handling (Harm Hanemaayer).
-110. Add code to SuperProbe to detect the #9 Imagine I128 (Robin Cutshaw).
-
-XFree86 3.1.0g (2 December 1994)
-109. Enable mmio for the Cirrus 543x (Harm Hanemaayer).
-108. Updates to xf86config (Harm Hanemaayer).
-107. Code for SuperProbe to successfully detect CL-GD543x (Harm Hanemaayer).
-106. Eliminate all references to "SYSV386".  "-Di386" should be used instead,
-     even in the BOOTSTRAPCFLAGS for SVR4 and SVR3 (Kaleb Keithley).
-105. Some typo changes to bring our code closer to what the XC has.
-
-XFree86 3.1.0f (1 December 1994)
-104. Eliminate references to SYSV386.
-103. Add check for usable linear fb for 864/964 boards.
-102. Detect and reject Mach64 boards whose ROM or VGA capability has been
-     disabled (Marc Aurele La France).
-101. Experimental code in the vgawonder driver to reset Mach* boards.  This
-     is enabled with the "noaccel" option (Marc Aurele La France).
-100. Fix clashes with K_SCROLLLOCK and related symbols defined in newer
-     Linux releases (Marc Aurele La France).
- 99. Change SuperProbe to detect the Mach64, and deal with ATI DAC classes
-     6 and 7, and recognise the ATI 28800-6 chip (Marc Aurele La France).
- 98. ISC 3.x and 4.x support (Michael Rohleder).
- 97. Add support for 640 and 800 line widths to AGX server (Henry Worth).
- 96. Fix cursor/screen scrolling problem for doublescan modes (Henry Worth).
- 95. Add missing XF86_Mach64.c file.
-
-XFree86 3.1.0e (27 November 1994)
- 94. Add missing install rule for gccmakedep.
- 93. Define CSRG_BASED for *BSD (Kaleb Keithley).
- 92. Code/prototype cleanup under hw/xfree86 (Kaleb Keithley).
- 91. Mach64 accelerated server (Kevin Martin).
-
-XFree86 3.1.0d (22 November 1994)
- 90. Updates to NetBSD aperture driver (Matthieu Herrb).
- 89. Bring back 'gccmakedep' from 2.x.  Currently only use it when
-     UseInstalled is true.
- 88. Support for additional keys on Microsoft ergonomic keyboard (may
-     require support in the OS's console driver) (Kaleb Keithley).
- 87. Updates for SCO (David McCullough).
- 86. Don't require the Virtual size to be specified for the Mach32 server.
- 85. Allow virtual widths < 1024 for Mach32 server (currently untested).
- 84. Some preliminary support for ISC (SVR3) 4.x (Michael Rohleder).
- 83. ET4000/W32 server updates.  Includes accelerated 32-bit opaque and
-     transparent stipple, acceleration for cases where the planemask != 0xFF,
-     and ramdac code changed to accommodate more ramdac types (Glenn Lai).
- 82. NetBSD support in hw/sun (Dennis Ferguson, Matthew Green, Matthieu
-     Herrb).
- 81. Fix xterm hang-on-exit problem on SolX86 2.4 (David Holland).
- 80. Speedups for AGX constant-metric and non-overlapping characters
-     (Henry Worth).
- 79. AGX accelerated dashed lines, and solid fills for arcs and polygons
-     (Henry Worth).
- 78. Doublescan support for the AGX server (Henry Worth).
- 77. Update AGX server to delete unusable modes, and to allow the virtual
-     width to be less than the display width (Henry Worth).
- 76. Fix typo in oak driver (which broke 067/077 support) (Jorge Delgado).
- 75. NetBSD updates, including SparcArchitecture support in imake config
-     (Matthieu Herrb).
- 74. 32bpp support for SPEA Mercury (928+Bt485) (Norbert Distler).
- 73. Modify Linux kbd code to read the "high_keys" mapping (Takashi Manabe).
- 72. Fix RGBPath in XF86Config being ignored.
-
-XFree86 3.1.0c (6 November 1994)
- 71. Fix xload for FreeBSD 1.1.5 (Joerg Wunsch).
- 70. Modify S3 linear fb probe to handle the non-standard CR5A[6:7] address
-     mapping used by some Diamond boards (including the Diamond Stealth Pro).
-     Also, the 10 most significant bits of a specified MemBase value are
-     now used (which leads to an incompatibility with previous usage)
-     (Dick Streefland).
- 69. Fix clock matching and some other problems in vgawonder driver
-     (Marc Aurele La France).
- 68. Reduce RAS to 6 MCLKs for SPEA Mercury (Norbert Distler).
- 67. Fix setting of CR65 for the SPEA Mercury -- fixes 1600 width at 8bpp
-     and 1152 width at 16bpp (Norbert Dislter).
- 66. Change MCLK from 46MHz to 49MHz in the SC11412 clock code (Norbert
-     Distler).
- 65. S3 code to detect 866/868/968/Trio32/Trio64 and treat them as
-     an 864 (Harald Koenig).
- 64. Update SuperProbe to detect  STG1700, S3 GENDAC and SDAC, ATT22C498,
-     S3 Vision866, 868, 968, Trio32 and Trio64 (Harald Koenig).
- 63. Enforce 95MHz limit for 864 when no pixmux (eg, 16bpp) (Harald Koenig).
- 62. Increase pixmux cut-in point for ATT20C498 to 95MHz (Harald Koenig).
- 61. ATT22C498 detection and (untested) support (Harald Koenig).
- 60. New code for S3 SDAC/GENDAC detection, and enable the programmable
-     clock when one of these is detected (Harald Koenig).
- 59. Fixes for S3 RAMDAC detection (STG1700 and SDAC) (Harald Koenig).
- 58. Fix ICD2061A code for clocks between 110MHz and 120MHz (Harald Koenig).
- 57. Chips & Technology SVGA driver (Jon Block, Mike Hollick, Régis Cridlig).
- 56. 16/32bpp support for #9 boards with Ti3020 ramdac (Robin Cutshaw).
- 55. Fix bsdi.cf problems with gcc options (Hans Nasten).
-
-XFree86 3.1.0b (30 October 1994)
- 54. 16/32bpp support for Elsa Winner2000Pro (964+Ti3020) (Dirk Hohndel).
- 53. Update to cirrus programmable clock code (Harm Hanemaayer).
- 52. Accelerated 16/32bpp bitblt for the Cirrus driver (Harm Hanemaayer).
- 51. The vgawonder driver will now attempt to determine what the board uses to
-     generate clocks (Marc Aurele La France).
- 50. Allow mode flags to specify composite sync polarity (Marc Aurele
-     La France).
- 49. ati.test and vgawonder driver updates (Marc Aurele La France).
- 48. Vgawonder driver will now attempt to use a default video mode (derived
-     from the existing CRTC settings) when no modes are specified in the
-     XF86Config (Marc Aurele La France).
- 47. Fix problem where clock probe could report high values as zero (Marc
-     Aurele La France).
- 46. SVGA driver for Avance Logic Inc. ali2301, ali2302, ali2308 and
-     ali2401 (Ching-Tai Chiu).
- 45. Enable linear aperture access for BSD/386 (Hans Nasten).
- 44. Some Linux xterm fixes (Orest Zborowski).
- 43. Fix Linux xdm groups setting problem (Orest Zborowski).
- 42. Allow Mach8 server to delete unsuitable modes (Hans Nasten).
- 41. Attempt at fixing FatalError() re-entrancy problems when aborting.
- 40. Add X server lock file code.
- 39. Modify PTS code in xtrans to remove an existing node at server startup
-     (as happens with UNIXCONN).
- 38. Set debug level to 1 in xtrans (this should allow error messages to
-     finally be seen).
- 37. Modify xtrans to use ErrorF() for debug/error messages within the
-     X server.
- 36. Updates to the S3MNAdjust option -- including no longer using global
-     variables (Harald Koenig).
- 35. Fix horizontal stripes when panning with an S3 805i (Harald Koenig).
- 34. Fix SDAC + pixmux patch (Harald Koenig).
- 33. Fix line-related crash problem when using linear addressing with
-     the SVGA server (Harm Hanemaayer).
- 32. Fix Cirrus 5434 linear addressing text blt bug (Harm Hanemaayer).
- 31. Fix Cirrus 14-pixel font bug (Harm Hanemaayer).
- 30. Improve Cirrus probing (Harm Hanemaayer).
-
-XFree86 3.1.0a (21 October 1994)
- 29. Fix some missing globals in Linux libX11 (Orest Zborowski).
- 28. Fix for TCPCONN code's checking for an existing server.
- 27. Support for building ELF dynamic libs on Linux (Michael Riepe).
- 26. Fix gcc local label usage in vgaFasm.h (Adam Richter).
- 25. OS/2 client support (Holger Veit).
- 24. Fix some data initialisation problems in libX11 and libXt
-     (Christos Zoulas).
- 23. Use '-ansi -pedantic' with GCC when building the core tree.
- 22. Changes to vgaFasm.h to allow compilation with 'gcc -ansi -pedantic'.
- 21. Revised OAK driver which includes OTI-087 support (Jorge Delgado).
- 20. Don't use -lmalloc for FreeBSD 1.1.5 -- it seems to cause some server
-     crashes.
- 19. Change FreeBSD.cf to refer to the compiler as 'cc' instead of 'gcc'
-     (Rich Murphey).
- 18. Work around some problems GNU make 3.62 has with the rstart Imakefile
-     (Jim Tsillas).
- 17. Fix HW cursor problems after switching resolutions with the SVGA
-     server (Harm Hanemaayer).
- 16. Fix I/O permission problem with AL2101 driver (Harm Hanemaayer).
- 15. Preliminary doublescan mode flag support (Harm Hanemaayer).
- 14. Accelerated transparent text for Cirrus 5426/8 (Harm Hanemaayer).
- 13. Cirrus programmable clock support (Harm Hanemaayer).
- 12. Cirrus accelerated image text for 16/32bpp (Harm Hanemaayer).
- 11. Fix Cirrus HW cursor colour map at 16/32bpp (Harm Hanemaayer).
- 10. Fix 16bpp VC switch lockup on Cirrus 5426 (Harm Hanemaayer).
-  9. Fix SDAC 15/16bpp setup and 8bpp pixmux clock selection (Harald Koenig).
-  8. New (faster) S3 stipple code (Hans Nasten).
-  7. Add the xf86config program to the source tree (Harm Hanemaayer).
-  6. Gamma correction support for Ti3025 (Hans Nasten).
-  5. Add code to set 170MHz Bt485/20C505 limits for 32bpp.
-  4. Fix incorrect clock limit for ATT20C490 + programmable clock.
-  3. Fix S3 co-ord overflow check for bpp > 8.
-  2. Fix to S3 server to support newer #9 GXE64Pro boards (Robin Cutshaw).
-  1. Documentation updates.
-
-XFree86 3.1 (29 September 1994)
-400. --- Code freeze ---
-399. Fix slow server death and VT switching problems with W32 server
-     (Glenn Lai).
-398. Fix problem with the W32 server not being installed set-uid (Hans Nasten).
-397. Fix problem with LinkKit Imakefile (Matthieu Herrb).
-396. Documentation updates.
-
-XFree86 3.0Z (27 September 1994)
-395. Fix mouse access problem when server resets while not in the active VT
-     (Orest Zborowski).
-394. Fix typo in pvga1 driver (Simon Cooper).
-393. Documentation updates.
-392. Disable MMIO for Cirrus -- doesn't work yet (Harm Hanemaayer).
-391. Workaround for Cirrus GRF corruption in SVGA probe (Harm Hanemaayer).
-390. Update colourmap/blanking for W32 server (Glenn Lai).
-389. Fix clock ordering problem for vgawonder driver (Marc Aurele La France).
-388. Fix typo in Mach32 server which prevents it from starting at 16bpp
-     (Alan Hourihane).
-
-XFree86 3.0Fe (26 September 1994)
-387. Fix for S3 line drawing overwriting HW cursor storage.
-386. Include Monitors and Devices files which contain the Monitor and Device
-     XF86Config sections that have been submitted (Gertjan Akkerman).
-385. Update Cirrus probing for 543x chips in SuperProbe (Harm Hanemaayer).
-384. Update ET4000/W32 probing for SuperProbe (Glenn Lai).
-383. 16bpp support for S3 GENDAC + 801/805 (Harald Koenig).
-382. Updates to S3 GENDAC code -- program best matching clock frequency
-     (Harald Koenig).
-381. Fix most pixel shift problems for #9GXE64Pro (Hans Nasten and
-     Robin Cutshaw).
-380. Don't allow the S3 "dac_8_bit" option to have any affect at 16/32bpp,
-     and fix related problem when using the SC15025 RAMDAC.
-379. Fix problem with Spea Mercury (Norbert Distler).
-378. Documentation updates.
-377. Updates to SolX86 aperture driver config (David Holland).
-376. Don't write mouse speed setting commands when using a non-logitech
-     protocols.
-
-XFree86 3.0Fd (25 September 1994)
-375. AGX documentation updates (Henry Worth).
-374. Fix for text-mode restore problem with AGX server (Henry Worth).
-373. Change name of XF86Vga256Drivers to XF86SvgaDrivers.
-372. Documentation updates.
-371. Enable 16bpp, 32bpp for 964+Bt485.
-370. Support for 16bpp and 32bpp on 964+Bt485 -- tested so far on
-     Miro Crystal 20SV (Eddy Olk).
-369. Fix pixel wrapping for 964+Bt485 (Eddy Olk).
-368. Fix low-res mode support for GXE64Pro (Robin Cutshaw).
-367. Fix some depth 15 vs depth 16 code for the Ti3020 (Hans Nasten).
-366. Update W32 server (Glenn Lai).
-
-XFree86 3.0Fc (24 September 1994)
-365. Fix image shift at 32bpp on GXE64Pro (Hans Nasten).
-364. Only initialise TrueColor visual for 16/32bpp since DirectColor is
-     not appropriate for the hardware.
-363. Man page updates.
-362. Fix installation problems with XF86Config man page.
-361. Disable some code in vgawonder driver that leads to problems with
-     SuperProbe (Marc Aurele La France).
-360. Change clock ordering (in some cases) for vgawonder driver so it
-     now depends only on the clock chip used (Marc Aurele La France).
-359. Fix S3 VT switching problem with #9 GXE64Pro (Robin Cutshaw).
-358. Added README.SOLX86 (David Holland).
-
-XFree86 3.0Fb (23 September 1994)
-357. Enable ICS2595 clockchip support.
-356. Enable 32bpp for Ti3025+964.
-355. Change font cache and pixmap expansion allocation policy for S3
-     server.  This allows better performance when there isn't much
-     offscreen memory available (Hans Nasten).
-354. Fix for banked ImageFill for bpp>8 (Hans Nasten).
-353. Updates to XF86_Accel man page.
-352. Remove references to 'Xconfig' in source code.
-351. Updates for ICS2595 code (Norbert Distler).
-350. Enable 16bpp for Spea Mercury.
-349. VTSema fixes for AGX server (Henry Worth).
-348. Updated 16bpp/32bpp support for 928+Bt485 (Norbert Distler).
-347. Partial support for 16bpp/32bpp with 964+Bt485 (Steve Parker).
-346. Fix Ti3025 pll save/restore, and set MCLK to 54.8MHz to eliminate
-     screen corruption (Hans Nasten).
-345. Fix for AGX tile SEGV (plus some cleanups) (Henry Worth).
-344. Update to solx86 aperture driver docs (David Holland).
-343. Fix problem with S3 mmio usage at 16bpp and 32bpp (Hans Nasten).
-342. Fix Mono VGA server crashes when compiled with gcc2.
-341. Updates to xterm for Linux to handle its UTMP style and lastlog
-     (Helmut Geyer).
-340. Remove some dependencies on removed cfb.banked.
-339. Fix Mach32 SW cursor SEGV.
-338. Prevent "nomemaccess" being used for S3 864/964.
-337. Change FreeBSD.cf to use gnumalloc for FreeBSD 2.x (Rich Murphey).
-336. Set weights correctly for Cirrus 32bpp (Harm Hanemaayer).
-335. Fix signal handling in xinit for SVR4 (David Holland).
-
-XFree86 3.0Fa (21 September 1994)
-334. Fix problems with cirrus top/left edge handling with HW cursor
-     (Simon Cooper).
-333. Fix GC problem causing S3 server crash at 16bpp and 32bpp.
-332. Added copyright to the output of reconfig.
-331. Fixes for vgawonder driver (Marc Aurele La France).
-330. Update README.ati and ati.test.c (Marc Aurele La France).
-329. Fix potential problem with transparent text for the cirrus 543x
-     (Harm Hanemaayer).
-328. Fixes for ICS2595 clock code (Norbert Distler).
-327. Remove cfb.banked.
-
-XFree86 3.0F (20 September 1994)
-326. Fix problem building reconfig when BuildServersOnly is YES.
-325. Updates to README.FreeBSD (Rich Murphey).
-324. Fix P9000 problem starting at 16bpp (Erik Nygren).
-323. Fix AGX screen saver, and a flash that occurs when switching into
-     XGA mode (Henry Worth).
-322. Preliminary support for the ICS2595 clock chip (not enabled yet)
-     (Norbert Distler).
-321. Fix pixel shift problem with GXE64Pro at 8bpp and 16bpp (Robin Cutshaw).
-320. Change clock doubler transition to 80MHz for Ti3025 (Robin Cutshaw).
-319. Add README.Bsdi (Hans Nasten).
-318. Removed the need to specify the "elsa_w1000pro" and "elsa_w1000isa"
-     Options.
-317. Remove "stealth64" and "miro_crystal20sv" Options -- they are no longer
-     needed.
-
-XFree86 3.0Ec (19 September 1994)
-316. Fixes for Ti3025 support -- fixes problem with machine lockups, and
-     adds preliminary 16bpp support (Robin Cutshaw).
-315. No longer allow 'Device' in the Keyboard section.  Must now use
-     'Protocol'.
-314. Updates to Cirrus BitBLT and fix for tile fill bug (Harm Hanemaayer).
-313. Disable Cirrus top/left edge HW cursor handling -- problems when
-     changing cursors near the edge.
-312. Fix another clock limit bug in S3 server.
-311. Disable Fresco by default.
-310. Updates to W32 server (Glenn Lai).
-
-XFree86 3.0Eb (18 September 1994)
-309. Updates to README.NetBSD (Matthieu Herrb).
-308. Fix Mode Flags error reporting in xf86Config.c.
-307. Fix sessreg for Linux and add an install rule for it (Leonard N. Zubkoff).
-306. Fix xdm support with shadow passwords for Linux (Leonard N. Zubkoff).
-305. Fix typo in bsdi.cf (Hans Nasten).
-304. Support for Ti3025/#9GXE64pro (Robin Cutshaw).
-303. Don't include s3_svga driver in SVGA server by default.
-
-XFree86 3.0Ea (17 September 1994)
-302. Update bsdi.cf so Gcc2 is default for versions 1.1 and later only
-     (Hans Nasten).
-301. Fix mfb.banked so it will compile with gcc 1.4x (Hans Nasten).
-300. Remove old Xconfig code.
-299. Fix some SEGV after FatalError() problems in xf86Config.c.
-298. Set max clock to 67.5MHz for Mach32 at 16bpp.
-297. Support for P9000 screen blanking at 16bpp and 32bpp (Erik Nygren).
-296. Merge in XC public fix-05.
-295. Trap bpp > 8 in S3 server for Bt485 and Ti RAMDACs since it doesn't work.
-294. Fixes for various xf86Config.c bugs.
-293. Fix S3 clock limits when using clock doubling RAMDACs.
-292. Fixes to  Ti3025 code to prevent lockups (Robin Cutshaw).
-291. Move S3 Bt485 probe to after the Ti3020/5 probe (Robin Cutshaw).
-290. Fix cirrus HW cursor behaviour at top and left edges (Simon Cooper).
-289. Set background colour mapping of Cirrus HW cursor correctly
-     (Simon Cooper).
-288. Allow cirrus hardware cursor to be used when accel is turned off
-     (Simon Cooper).
-287. Don't build shared lib for LBX on Linux (Orest Zborowski).
-286. Add README.Linux (Orest Zborowski).
-285. Fix P9000 cursor problems when VT switching (Erik Nygren).
-284. Update P9000 server to work with XF86Config (Erik Nygren).
-283. Fixes for Solaris 2.4 x86 build problems with reconfig and shm.c
-      (Doug Anson).
-
-XFree86 3.0E (14 September 1994)
-282. Change the 'Device' entry in the Keyboard section of XF86Config to
-     'Protocol'.
-281. Update the M magic formula for S3 server (Harald Koenig).
-280. Disable TI3025 support in S3 server -- it is incomplete.
-
-XFree86 3.0Dl (13 September 1994)
-279. XF86Config(4/5) manual page.
-278. LinkKit support for the W32 server.
-277. Change HW cursor code to position cursor next to the top/left edges
-     instead of disappearing (Harm Hanemaayer).
-276. Add code to the Cirrus driver to determine clock limits based on the
-     available DRAM bandwidth (Harm Hanemaayer).
-275. Add an "S3MNAdjust" entry to the Device section of the XF86Config
-     to allow tuning of the M and N parameters in the S3 server (Harald
-     Koenig).
-274. Add a Gamma entry to the Monitor section in the XF86Config (Harald
-     Koenig).
-273. Don't strip server binaries when installing.
-272. Set PLL limits in S3 server for S3 GENDAC and SDAC.
-
-XFree86 3.0Dk (11 September 1994)
-271. Add check for incorrect Modes line in XF86Config.
-270. Add some sanity checks to S3 server for supported depths.
-269. Fix SEGV during startup of VGA16 server.
-268. Support for HW cursor in the Cirrus driver (Simon Cooper).
-267. Fix LinkKit Imakefile for building SVGA server (Simon Cooper).
-266. Update lnxLib.rules for new dll tools (Orest Zborowski).
-265. Add code to the VGA servers to handle drivers (like tvga with 512k
-     in 256 colour mode) which require scaling of the raw clock to give
-     the pixel clock.
-264. Add code to the VGA servers to handle drivers (like the generic 256
-     colour driver) which use only builtin modes.
-263. Fix bitPerRGB reported by the SVGA server.
-262. ET4000/W32 accelerated server (Glenn Lai).
-261. Fix for AGX rect tile and stipple code (Henry Worth).
-260. Add checks for the presence of Modes lines to servers that require them.
-259. S3 code to handle limits imposed by clock chips.
-258. Fix S3 pMode->SynthClock code (Harald Koenig).
-257. Fix S3 raw clock setting for SC15025 (Harald Koenig).
-256. Fixes for Mach32ImageStipple (Mike Bernson).
-255. Improve AGX support for the Hercules dual RAMDACs, provide
-     better screen blanking at startup, and fix memory probe (Henry Worth).
-254. Add clockchip "ti3025" recognition (Hans Nasten).
-253. Fix xf86Config handling of ClockChip (Harald Koenig).
-252. Fix xf86Config handling of default colour weights (Harm Hanemaayer).
-251. P9000 updates (Erik Nygren).
-250. Fix SEGV problem in Mach32 font cache code.
-249. S3 code to handle clock/bpp/ramdac dependent raw-clock vs pixel clock
-     scaling.
-
-XFree86 3.0Dj (8 September 1994)
-248. Fixed and enabled ImageRead in CopyArea for P9000 server (Chris Mason).
-247. Fixed xdm server restart problem with P9000 server (Erik Nygren).
-246. Added a sample XF86Config file that gets installed as
-     $(LIBDIR)/XF86Config.eg.
-245. Change search method for XF86Config file.  Only allow user-specified
-     location when real-uid == 0.  Also change -xconfig flag to -xf86config,
-     and $XCONFIG to $XF86CONFIG.
-244. Fix reconfig's problem with "ps/2" (Orest Zborowski).
-243. External changes for W32 server (Glenn Lai).
-242. Change ELSA probe to check for BIOS signature first (Harald Koenig).
-241. Preliminary support for the Ti3025 & #9GXE64pro (Robin Cutshaw).
-
-XFree86 3.0Di (7 September 1994)
-240. Remove AGX server's dependence on VGA256 (Henry Worth).
-239. Fix display start address in vgawonder driver for Mach32 and Mach64
-     boards (Marc Aurele La France).
-238. Fix clock probing in vgawonder driver for Mach64 boards
-     (Marc Aurele La France).
-237. vgawonder driver now detects and rejects Mach32 boards without
-     VGA Wonder functionality (Marc Aurele La France).
-236. Add ClockChip XF86Config keyword for programmable clock chips.
-235. Add a FIFO_MODERATE option for AGX server (Henry Worth).
-234. Limited support for Big-RAMDAC and dual-RAMDAC for 2MB Hercules
-     Graphite cards (Henry Worth).
-233. Eliminate use of libvga256 in AGX server (Henry Worth).
-232. Convert AGX code to use the Ramdac keyword instead of Options (Henry
-     Worth).
-231. Fix (?) ELSA probe code's register restoral.
-230. Auto-detection code for the NetBSD aperture driver (Matthieu Herrb).
-229. Change OpStipple interface in font code (Hans Nasten and Jon Tombs).
-228. Fix clock and register restoration in P9000 server (Chris Mason,
-     Harry Langenbacher, Erik Nygren).
-227. Fix Orchid P9000 support (Harry Langenbacher).
-226. Fix BIOS Probe for Viper PCI (Bob Hollinger).
-225. 16bpp/32bpp support code for SVGA server.  Cirrus 16bpp/32bpp support
-     is now enabled (Harm Hanemaayer).
-224. Fix Mach32 cache problems (Mike Bernson).
-223. Fix Mach32 memory probe.
-222. xf86Config and reconfig bug fixes.
-
-XFree86 3.0Dh (4 September 1994)
-221. Added minimal reconfig(1) man page so that 'make install.man'
-     doesn't fail.
-220. Combine Stealth64 and Miro Crystal 20SV code.  This should fix
-     some Stealth64 problems.
-219. Fix InstallManPageAliases rule for FreeBSD (Ernest Hua).
-218. 16bpp and 32bpp support for Cirrus driver -- still requires some changes
-     to the SVGA server, so not enabled yet (Harm Hanemaayer).
-217. Fixes for Mach32 cache clipping problems (Mike Bernson).
-216. 32bpp S3 updates for ELSA cards (Harald Koenig).
-215. Updates to new XF86Config code.
-
-XFree86 3.0Dg (3 September 1994)
-214. Change over to new config file format -- XF86Config (Gertjan Akkerman).
-
-XFree86 3.0Df (31 August 1994)
-213. Amoeba support updates (Kees Verstoep).
-212. Fixes for Viper PCI support (Matt Thomas).
-211. MoveWindow acceleration for all depths on P9000, and acceleration
-     now enabled by default (Chris Mason).
-210. P9000 updates.  Includes updates to sysconfig code, Orchid and PCI
-     support now enabled by default (Erik Nygren).
-209. SuperProbe and ModeDB updates (David Wexelblat).
-208. Support for the S3 805i and 16-bit RAMDACS (including ATT20C498,
-     STG1700, SDAC) (Bernhard Bender).
-207. Support for the S3 SDAC with S3 864 (Bernhard Bender).
-206. Basic support for ET4000W32 chipsets in the VGA servers.  Includes
-     chipset detection and code to handle up to 4MB video memory (Harm
-     Hanemaayer).
-205. Mach32 server modified to use generic cache code (Mike Bernson).
-204. Allow pixmap expansion for display widths <= 800 in S3 server.
-203. Updates for SCO (including 3.2.4 and international crypt support)
-     (David McCullough).
-202. Use mi cursor for 32bpp on S3 928 because HW cursor is broken (Harald
-     Koenig).
-201. Fix nomemaccess code in s3im.c (Harald Koenig).
-200. Code to auto-detect ELSA Winner cards, and automatically enable the
-     icd2061a clock (Harald Koenig).
-199. Fix for 32bpp S3 font cache problems (Harald Koenig).
-198. Support for a linear addressing mode in the Cirrus driver (Harm
-     Hanemaayer).
-197. Performance improvements for the "fastvga256" asm code (Harm Hanemaayer).
-196. Fix for Cirrus problem caused by pvga1 probe.
-195. Code added to S3, Mach8 and VGA servers to delete modes from the
-     "Modes" line which would previously have caused the server to
-     not start (Stuart Anderson).  Note: the Mach32 server already had
-     this code.
-
-XFree86 3.0De (20 August 1994)
-194. Add run-time check for SHM kernel support on FreeBSD and NetBSD.
-193. Updates to xload for Solx86 (David Holland).
-192. Fix NULL dereference in showfont (David Holland).
-191. xconsole and doc updates for NetBSD 1.0_BETA (Matthieu Herrb).
-190. Major Cirrus driver update.  Includes faster solid, stipple and tile
-     filling, improved text acceleration, blt in background, shadow I/O
-     registers, optional MMIO support for 543x (Harm Hanemaayer).
-189. Support for the miroCRYSTAL 20SV (S3 964) (Eddy Olk).
-188. Preliminary 32bpp S3 support (Harald Koenig).
-187. Make TrueColor the default root visual for 15/16/24bpp S3 (Harald Koenig).
-186. Fix S3 16bpp for 1024x768 and 1152x900 and some panning problems
-     (Harald Koenig).
-185. Fix tiling problem, and VT switch problems for S3 16bpp (Harald Koenig).
-184. Fix for Ti3020 ramdac support at >8bpp (Robin Cutshaw).
-183. AGX server fixes.  Includes CopyPlane, (vga) save/restore, SC15021 CLUT
-     access, scratchpad config.  (Henry Worth).
-182. Merge in XC public fix-04.
-
-XFree86 3.0Dd (12 August 1994)
-181. Fix for unnecessary read-ahead in mfbblt, and remove the '-32' display
-     width restriction (Pascal Haible, Gertjan Akkerman).
-180. Support for SGS/inmos STG1700 RAMDAC -- S3 server (Bernhard Bender).
-179. Performance improvements for AGX server (Henry Worth).
-178. More 15/16bpp fixes for S3 (Harald Koenig).
-
-XFree86 3.0Dc (11 August 1994)
-177. Various 15/16bpp S3 fixes (Jon Tombs, Harald Koenig).
-176. 16bpp support for ATT 20C490 (Jon Tombs).
-175. 16/24/32bpp code for SC15025 (Harald Koenig).
-174. Support for gamma correction in S3 server (Harald Koenig).
-173. Probe code for the SC15025 (S3 server and SuperProbe) (Harald Koenig).
-
-XFree86 3.0Db (6 August 1994)
-172. Patches for N.M value trimming (Harald Koenig).
-171. ATT20C498 and 864 support for 15/16/24bpp in S3 server (Harald Koenig).
-170. Ti3020 and Bt485 Ramdac support for 15/16/24bpp in S3 server
-     (Robin Cutshaw).
-169. Fix problems building debugging libFS (Christos Zoulas).
-168. Remove XOR'd extended register addressing in S3 server.
-
-XFree86 3.0Da (3 August 1994)
-167. Use XOR'd extended register addresses for S3 server -- avoids clash
-     with "COM4" I/O address (Jon Tombs).
-166. 16bpp S3 support (no ramdac initialisation yet) (Jon Tombs).
-
-XFree86 3.0D (1 August 1994)
-165. Fix for text restore problems with cl6420 driver (Manfred Brands).
-164. Change S3 screensaver code to do the same thing as the vga256 code
-     (Bernhard Bender).
-163. Update Cirrus driver for vga256 changes (Harm Hanemaayer).
-162. Fixes for font scaling problems on SVR4 (David Wexelblat).
-161. Remove all of the old unused pixmap cache code (David Wexelblat).
-160. Use generic font cache code for S3 server (David Wexelblat).
-159. Native AGX code for Save/RestoreAreas, CopyWindow and PaintWindow
-     (Henry Worth).
-158. Change AGX clock mappings -- see README.agx for details (Henry Worth).
-157. Update AGX server for vga256 changes (Henry Worth).
-156. Xtest fix for Linux (Erik Nygren).
-155. Speedup for cached text output in Mach8 and 8514 servers (Hans Nasten).
-154. Workaround for 6225 with LCD where full on white pixels cause display
-     problems (Philip Homburg).
-153. Fix memory handling for Mach8 boards with the SVGA vgawonder driver
-     (Marc Aurele La France).
-152. Fix some build problems on NCR SVR4 (Stuart Anderson).
-151. Fix problem which caused xjewel to lock up the S3 server when running
-     in linear mode (Harald Koenig).
-150. xman support for gzip'd man pages.
-149. Fix LinkKit problems.
-148. Omit monitor ID check in 8514 server.
-147. Fix card ident problem with ati driver.
-146. Fix asm problem in new pvga1/bank.s.
-145. Fix programs/Imakefile error.
-
-XFree86 3.0Ce (24 July 1994)
-144. Alternate "SlowBcopy()" which avoids I/O (which causes problems on
-     some cards) (Glenn Lai).
-143. Restore original mouse baud rate when exiting and VT switching (Harald
-     Koenig).
-142. pvga1 driver updates.  Includes 90C33 support for 2MB, and accel code
-     updates (Bill Conn and Bill Morgart).
-141. Major updates to the SVGA ATI vgawonder driver.  Includes support for
-     4MB, probe code to detect Mach8, Mach32 and Mach64 boards, RAMDAC
-     detection, clock probe update to handle the clock chip used on Mach64
-     boards, and fixes for V3, V4 and V5 boards (Marc Aurele La France).
-140. Support for BuildServersOnly option to build only the servers using
-     a cut-down source tree (Gertjan Akkerman).
-139. Preliminary P9000 accelerated support (currently incomplete and
-     disabled by default) (Chris Mason and Erik Nygren).
-138. Preliminary Viper PCI, Orchid P9000 support (currently disabled by
-     default) (Erik Nygren).
-137. Replace the cfb.banked code with fb code which relies more on the
-     standard cfb code.  For further details see the file "Design" in
-     xfree86/vga256/vga/ (Stuart Anderson).
-
-XFree86 3.0Cd (22 July 1994)
-136. Add dacspeed Xconfig keyword, and modify the S3 server to use it.
-135. Update contrib source to the XC's full release version.
-134. Fix pixel doubling problem on #9 GXE64 cards (Robin Cutshaw).
-133. Change '--print' to 'print-libgcc-file-name' in Linux config files
-     for compatibility with gcc 2.6 (Orest Zbrowoski).
-
-XFree86 3.0Cc (19 July 1994)
-132. Make use of the Xconfig Ramdac keyword in the S3 server.
-131. Improved support for the ELSA W2000Pro (Dirk Hohndel).
-
-XFree86 3.0Cb (16 July 1994)
-130. Updated xc/bug-report for XC fix-03.
-129. Don't mark duplicate clocks as zero in VGA servers.
-128. Support for #9GXE64 in S3 server (Robin Cutshaw).
-127. Tiled pixmap/stipple expansion for the S3 server (David Wexelblat).
-126. Tiled pixmap/stipple expansion for Mach8 and 8514 servers (Hans Nasten).
-125. P9000 updates.  Includes colour restoration fix, changes in Modes
-     processing, and removal of banking support (Erik Nygren).
-124. 16 and 32 bpp TrueColor support for the P9000 server (Erik Nygren).
-123. Updates to AGX server.  Includes font cache fixes, line fixes and
-     some more tuning options (Henry Worth).
-122. Aperture driver for NetBSD (Matthieu Herrb).
-121. Added basic man page for beforelight (Rich Murphey).
-120. Swap order of libXExExt and libXext.
-119. Remove the temporary Mach32ShareCfb option.
-
-XFree86 3.0Ca (28 June 1994)
-118. NetBSD updates (Christos Zoulas).
-117. Various updates for Minix (Philip Homburg).
-116. Support for including the MIT-SCREEN-SAVER extension (David Holland).
-115. Fixes for AGX font cache code (Henry Worth).
-114. Banking support for P9000 (doesn't seem to work yet) (David Moews).
-113. Text restoration code for P9000 (Chris Mason).
-
-XFree86 3.0C (22 June 1994)
-112. Fix server crash when started with a lock key on.
-111. Recognise 864/964 PCI as capable of linear memory access.
-110. Fix ramdac access and clock probe problems with AGX server (Henry Worth).
-109. Support for Stealth 64 (S3 964 + Bt485) (Steven Parker).
-108. Fix for 4-pixel border problem with S3 864 pixmux (Harald Koenig).
-107. Allow the S3 SVGA driver to recognise the 864 and 964 (Harald Koenig).
-106. Improved 5434 support, and accelerated copyPlane1to8 for cirrus
-     (Harm Hanemaayer).
-
-XFree86 3.0Bc (19 June 1994)
-105. Fix VT switch problem in 16bpp Mach32 when sharing cfb.
-104. Add framework for a ramdac Xconfig setting (like chipset).
-103. Reorganise mode/clock matching code (Marc Aurele La France).
-102. Fix server's client count problem after authorisation failure.
-101. Option "power_saver" to enable power-down mode on "green" monitors.
-     So far this is implemented only for VGA (all depths) and S3 servers.
-100. Remove old "memaccess" S3 option.
- 99. Add Option "pci_hack" to work around a lockup problem reported with
-     some 928-P cards.
- 98. Fix S3 928-P detection/reporting.
- 97. Don't allow S3 "nomemaccess" option for 864/964 chipsets.
- 96. Make cbrt a library -- removes the need for NeedCbrt on Linux
-     (Marc Aurele La France).
- 95. Change ATI SVGA driver to Marc Aurele La France's version
-     (includes support for Vga2 and Vga16).
- 94. Function prototyping for AGX, and prototype cleanup in vga16 (Stuart
-     Anderson).
- 93. Fix (not complete?) problem with dual-headed servers.
-
-XFree86 3.0Bb (16 June 1994)
- 92. AGX server (Henry Worth).
- 91. Accelerated support for 90C33 (Bill Conn).
- 90. Use s3ImageWriteFunc to load S3 cursor.
- 89. Fix problems with SPEA Mercury for clocks > 120MHz (Norbert Distler).
- 88. Code to program S3 GENDAC clock (Clocks "s3gendac") (Jon Tombs).
- 87. Fix some build problems with lbx.
- 86. Build servers with -DAVOID_GLYPHBLT.
-
-XFree86 3.0Ba (11 June 1994)
- 85. Preliminary ELSA Winner 2000PRO support (S3 964) (Dirk Hohndel).
- 84. Updates to S3 864 support (Harald Koenig).
- 83. Merge in XC fix-02.
-
-XFree86 3.0B (6 June 1994)
- 82. bitblt fixes (including big memory leak) for 8514, Mach8, Mach32 and
-     S3 servers (Tiago Gons).
- 81. line/seg fixes for 8514 and Mach8 servers (Tiago Gons).
- 80. Remove separate cfb libs for Mach32 (only compile-tested so far).
- 79. Restore hw/xfree86/etc directory.
- 78. Update bsdinst.sh for SVR4 (use /usr/ucb/install, and run 'mcs -d'
-     as well as strip).
- 77. Cirrus driver updates (Harm Hanamaayer).
- 76. Mach support (Robert Baron).
-
-XFree86 3.0Ac (1 June 1994)
- 75. Amoeba fixes (Kees Verstoep).
- 74. Fixes for Mach32 dashed line/segment code (Mike Bernson).
- 73. Preliminary 90C33 support (Bill Conn).
- 72. NetBSD.cf updates, and README.NetBSD added (Matthieu Herrb).
- 71. Preliminary support for the ELSA Winner 1000PRO-VL-2 (Harald Koenig).
- 70. Add "weight" and "displayWidth" entries to ScrnInfoRec.
- 69. Banked vga2 server (Pascal Haible).
- 68. Font cache changes for the Mach8 and 8514 servers.  This allows them
-     to work without a font cache, and should allow their use with 512k
-     Mach8 cards.  (Hans Nasten)
- 67. Don't include XIE in the Mono and VGA16 servers (it doesn't handle
-     bit-order != byte_order).
- 66. Add LinkKit and updated VGADriverDoc.
-
-XFree86 3.0Ab (28 May 1994)
- 65. Add support for gzip'd man pages on FreeBSD.
- 64. P9000 server (Erik Nygren).
- 63. Video7 SVGA driver (Craig Struble).
- 62. CL6420 SVGA driver (Manfred Brands).
- 61. Set default paths for xdm for *BSD (so {Give,Take}Console can find chown).
- 60. Add a hw/xfree86/doc directory, and start putting the docs back.
- 59. Fixes for Amoeba support (Kees Verstoep).
-
-XFree86 3.0Aa (22 May 1994)
- 58. Merge in XC public fix-01.
- 57. Updates to FreeBSD.cf.
- 56. Add xf86site.def which can optionally be included from site.def.
- 55. SCO support and some bug fixes (David McCullough).
- 54. Some initial untested S3 864/964 code (Harald Koenig).
- 53. Fix for bsdLib.tmpl.
- 52. STREAMSCONN fixes for xdm, chooser and Xserver XDMCP code (Stuart
-     Anderson).
-
-XFree86 3.0A (15 May 1994)
- 51. SVGA driver for the AL2101 chipset (Paolo Severini).
- 50. SVGA driver for the MX68000 and MX68010 chipsets (Frank Dikker).
- 49. Updates to the Cirrus driver (Harm Hanemaayer).  Includes code cleanup,
-     mono support, improved handling of the 5430, 5434, and transparent
-     text acceleration.
- 48. Preliminary code for detecting S3 864/964 and AT&T 20C498 (Harald Koenig).
- 47. Generic VGA256 driver -- works only at 320x200 (Harm Hanemaayer)
- 46. Fixes for vga2/mfb and vga16/mfb Imakefiles.
- 45. Include SuperProbe.
-
-XFree86 3.0d (8 May 1994)
- 44. Add missing files to vga2/mfb.
- 43. Set VendorString and VendorRelease up for XFree86.
- 42. Workaround for STREAMSCONN Xdmcp problems (Xserver and xdm).
- 41. 16 bit (directcolor) support for Mach32 (Craig Groeschel).
- 40. Minix 3886vm support (Philip Homburg).
-
-XFree86 3.0c (6 May 1994)
- 39. Fixes for Solaris X86 (Doug Anson).
- 38. No longer link the Mono and VGA16 servers with Xserver/mfb/libmfb.a.
- 37. Updates to the VGA16 code (Gertjan Akkerman).  Includes banking support
-     (old-style rather than the Xsvga method), staticcolor visual, oak
-     driver enabled, added some missing files to vga16/mfb.
- 36. Fix Linux shared libs (Orest Zborowski)
- 35. Apollo mono driver (Hamish Coleman)
- 34. Support for dual-headed vga2+mono and vga16+mono servers (Pascal Haible).
- 33. Reorganisation of the mono server (Pascal Haible).  Includes removing
-     xfree86/bdm2, xfree86/hga2, and replacing them with xfree86/mono.
- 32. Fixes for PEX font compiler (from our 940327a snapshot).
- 31. Fix SIOCGIFCONF code in xdm and Xserver for SVR4 (with Lachman TCP)
-     and FreeBSD.  There are still xdm and chooser problems on SVR4.
-
-XFree86 3.0b (29 April 1994)
- 30. Add S3 driver to SVGA server.
- 29. Disable accelerated text blit for Cirrus 543x.
- 28. Reorder some of the Bt485 code, and get clock doubling working again
-     without pixmux.
- 27. Fix image shift problem for pixmux on #9 cards (Robin Cutshaw).
- 26. Fix initialisation bug for Cirrus 62{2,3}5 cards (Harm Hanemaayer).
- 25. Remove 8514 monitor ID check in Mach8 server.
- 24. Fix for problem with compaq driver.
- 23. Add "no_bitblt" option for the cirrus driver.
- 22. Recognise the 5429 in the cirrus driver.
- 21. Disable interrupts while programming the ICD2061A.
- 20. sync-on-green support for the TI3020.
- 19. Move S3 clock doubler setting from icd2061ClockSelect() to s3Init().
- 18. Fix dac_8_bit for Bt485 cursor, and fix Bt cursor blanking problem.
- 17. S3 pixmux support for STB Pegasus, and cleanup of pixmux and icd code.
-     (Leonard Zubkoff).
- 16. Change "fifo_conservative" setting for CLGD543x.
- 15. Don't reserve video memory for HW cursor on S3 when using a RAMDAC cursor.
- 14. Allow the "8clocks" option to force 9 clocks instead of 17 on WD90C3{0,1}
-     cards.
- 13. Fix some DEALLOCATE_LOCAL problems in accel servers.
- 12. Support for Bt485 on #9 cards (Robin Cutshaw).
- 11. Fixes for Cirrus driver (Harm Hanemaayer).
- 10. Fix for text restore problem on some S3 cards (Jon Tombs).
-  9. Workaround for Mach32 detection problem on some platforms.
-  8. Fix incorrect usage of $(DESTDIR) in some lnxLib.rules.
-  7. Code to detect 928-P (Harald Koenig).
-  6. Fix cbrt() in mi/ so that it can handle negative arguments.
-  5. Fix for line clipping problem in cfb.banked (Glenn Lai).
-
-XFree86 3.0a (28 April 1994)
-  4. Add XFree86 server names to the list in xinit.
-  3. Set XawI18nDefines correctly for SVR4.0.
-  2. Update ncr.cf to pick up AllocateLocalDefines when building servers.
-  1. Fold in client/lib OS support not picked up by the XC.
-
-XFree86 3.0 (26 April 1994)
-
-
-$XFree86: xc/programs/Xserver/hw/xfree86/CHANGELOG,v 3.3156 2004/02/29 04:25:24 martin Exp $
-
-
-
-
-
diff --git a/hw/xfree86/doc/changelogs/CHANGELOG.ND b/hw/xfree86/doc/changelogs/CHANGELOG.ND
deleted file mode 100644
index 5f0d877..0000000
--- a/hw/xfree86/doc/changelogs/CHANGELOG.ND
+++ /dev/null
@@ -1,418 +0,0 @@
-XFree86 3.9jw (31 July 1998)
-1327. Fix a crash in the chips driver when the chipset is specified in the
-      config file (#1846, Taketoshi Sano).
-1326. Add more Pm2 acceleration and add DPMS support for all glint chips
-      (#1844, Alan Hourihane).
-1325. Add 8x8 pattern trapezium fills, screen to screen colour expansion
-      to the MGA driver, and fix a clipping bug with colour expansion
-      (#1843, Mark Vojkovich).
-1324. Add Screen->Screen colour expansion to XAA (#1841, Mark Vojkovich).
-1323. Fix negative widths and heights in XAA's wide line code (#1840,
-      Alan Hourihane).
-1322. Fix an XAA tiled rect alignment problem (#1839, David Bateman).
-1321. Fix XAA 8x8 mono for 24bpp.
-
-XFree86 3.9jv (24 July 1998)
-1320. Fix the BitsPerPixel() macro in cfb.h for 24bpp.
-1319. Update XAA docs (#1838, Mark Vojkovich).
-1318. Add colour expansion stipples to XAA (#1837, Mark Vojkovich).
-1317. Add a stipple replacement for the MGA driver that takes into account
-      the 256K blit maximum per operation (#1836, Mark Vojkovich).
-1316. Fix C&T memory clock messages (#1834, David Bateman).
-1315. Add some new colour expansion code for older tseng chips (W32/W32i)
-      (#1832, Koen Gadeyne).
-1314. Preliminary tseng XAA support (#1832, Koen Gadeyne).
-1313. Resync the tseng driver with the main branch version (#1832,
-      Koen Gadeyne).
-1312. Some C&T updates (#1833, David Bateman).
-1311. Speed up GXcopy for XAAFillCacheBltRects (#1831, David Bateman).
-1310. Remove some code duplication in the C&T driver (#1830, David Bateman).
-1309. Add 8x8 colour and mono fills for 8bpp and 16bpp for all C&T chips
-      and 8x8 mono fills at 24bpp for HiQV chips (#1830, David Bateman).
-1308. Fix problems with XAA 8x8 patterns (#1830, David Bateman).
-1307. Get 4bpp working with C&T chipsets, and add the ShowCache option to
-      the C&T driver (#1829, David Bateman).
-
-XFree86 3.9ju (19 July 1998)
-1306. Calculate DPI from the DisplaySize entry in the Monitor section
-      if present.
-1305. Implement "tri-state" options.
-1304. Move most of cfbcmap.c to mi.
-1303. Update the C&T driver for recent XAA ImageWrite changes, and fix
-      some bugs in CHIPSHiQVWritePixmap (#1824, Nozomi Ytow).
-1302. Optimised horizontal and vertical lines for MGA (#1823, Mark Vojkovich).
-1301. Fix some XAA bugs (#1822, Mark Vojkovich).
-1300. Major updates to the XAA documentation (#1821, Mark Vojkovich).
-1299. Update XAA for the EnterVT type change (#1821, Mark Vojkovich).
-1298. Add scanline ImageWrites to XAA (#1821, Mark Vojkovich).
-1297. Make XAA Alpha friendly (#1821, Mark Vojkovich).
-1296. Set pScrn->vtSema to FALSE in ChipCloseScreen() after restoring the
-      video hardware state.
-1295. Move xf86SetDpi() calls into PreInit().
-1294. Don't show module version info on subsequent loads.
-
-XFree86 3.9jt (18 July 1998)
-1293. Add IBM 528A to the ramdac module (#1820, Alan Hourihane).
-1292. Make it a fatal error when any AddScreen() call in XFree86's InitOutput()
-      fails.
-1291. Change the type of EnterVT() from void to Bool, and make it a fatal
-      error for this to fail.
-1290. Add a helper xf86SetBlackWhitePixels() to set the values according
-      to the presence of the -flipPixels command line option.
-1289. Add xDpi and yDpi fields to the ScrnInfoRec, and a helper xf86SetDpi()
-      to set them.
-1288. Allow a bus type prefix for BusID strings.
-1287. Remove the global xf86VTSema (David Bateman, David Dawes).
-1286. Complete the XAA 8x8 pattern caching (#1817, Mark Vojkovich).
-1285. Add a missing Millennium accel flag (#1816, Mark Vojkovich).
-1284. Make the CRTC blanking setting exact rather than allowing some unblanked
-      overscan area (#1813, Koen Gadeyne).
-1283. Prelminary TGA (AXP only) driver (#1811, 1818, Alan Hourihane).
-1282. Prelminary Bt485 ramdac support for the ramdac module (#1809, 1815,
-      Alan Hourihane).
-1281. OS-support and config updates for AXP (#1808, Alan Hourihane).
-1280. Add code to the ramdac module for initialising gamma correction
-      (1807, Alan Hourihane).
-1279. Fix C&T HiQV PCI bus support (#1802, David Bateman and Nozomi Ytow).
-1278. Add HW cursor support for the Permedia2v (#1812, Alan Hourihane).
-1277. Remove most vgahw dependencies from the glint driver (#1810,
-      Alan Hourihane).
-1276. Add preliminary support for the Permedia2v to the glint driver
-      (#1800, 1810, Alan Hourihane).
-1275. Some C&T updates (#1791, 1796, Nozomi Ytow, David Bateman).
-1274. Reintegrate Harm's XAA SolidArc code (#1814, David Bateman).
-1273. Make sure assembler usage is set correctly for x86 when MakeDllModules
-      is true  (#1806, David Bateman).
-1272. Fix too little data being sent by the XAA BitmapScanline when the
-      number of dwords sent was divisible by four (#1806, David Bateman).
-1275. Fix for the swapping of fg and bg in the XAA WriteBitmap primitives
-      (#1806, David Bateman).
-1274. Add TRIPLE_BITS_24BPP code for the XAA WriteBitmap function (#1806,
-      David Bateman).
-1273. Attempts at optimised 6 and 8 pixel drawTETextScanline functions
-      in assembler (#1789, 1806, David Bateman).
-1272. Remove some redundant extern declarations (xf86Procs.h & xnest)
-      (#1790, Marc La France).
-1271. xf4bpp now loads xf1bpp (#1790, Marc La France).
-1270. Make vgahw module load cfb (re: cfbExpandDirectColors()) (#1790,
-      Marc La France).
-1269. Fix vgahw's saving/restoring of text modes, overscan handling
-      and memory leaks (#1790, Marc La France).
-1268. Fix compilation warnings in libc wrapper (Marc La France).
-1267. Rewrite VGA generic driver (Marc La France).
-1266. Fix bug that nullified the driver's mode list when deleting the
-      second-to-last mode (#1790, Marc La France).
-1265. Reduce verbosity level of the message that gets printed when
-      a driver's ValidMode() rejects a mode (#1790, Marc La France).
-1264. Allow drivers to supply a default mode (#1790, Marc La France).
-1263. Allow for more than 4 (== MAXSCREENS) drivers to probe a system
-      (1790, Marc La France).
-1262. Fix xf4bpp integration (#1790, Marc La France).
-1261. Implement -dpi flag and -flippixels flags (#1790, Marc La France).
-1260. Fix CLKDIV2 support (#1790, Marc La France).
-1259. Implement multiscanned modes (#1790, Marc La France).
-1258. Fix some depth/bitsPerPixel confusion (#1790, 1799, Marc La France).
-1257. Fix memory leaks in the MITSHM and dix pixmap code (#1790,
-      Marc La France).
-1256. Fix a minor header problem in the Type1 code (#1790, Marc La France).
-
-XFree86 3.9js (12 July 1998)
-1255. Make sure DPMSEnabled gets set correctly.
-1254. Use a BlankScreen function with xf86GetClocks() that takes more
-      appropriate arguments than SaveScreen.
-1253. Fix SEGV in TsengProbe() when there are no Tseng cards present.
-1252. Add caching of 8x8 patterns to XAA (#1787, Mark Vojkovich).
-1251. XAA updates, including TRIPPLE_BITS_24BPP, check QWORD padding in
-      the font rendering, and an attempt at Pentium optimised assembler
-      for 6 pixel wide TE font (#1785, David Bateman).
-1250. Fix an omission in xf86MatchPciInstances() (#1786, Kevin Martin).
-1249. Numerous C&T driver fixes and HW cursor support added (#1781-1783,
-      David Bateman).
-1248. Add support for 1, 8, 16, 32 and 64 bit interleaves to the XAA
-      hardware cursor code (#1780, David Bateman).
-1247. Fix a segfault in xf86DPMSInit() (#1780, David Bateman).
-1246. Some updates to the ramdac module (#1777, 1778, Alan Hourihane).
-1245. Add 500TX support to the glint driver (#1777, Alan Hourihane).
-1244. Fix parsing of ModeLine keyword (#1779, Keldon Jones).
-
-XFree86 3.9jr (5 July 1998)
-1243. Avoid mishandling 64-bit PCI base addresses, and "safely" avoid them.
-1242. Fix font modules so that clients can use the font libraries
-      (#1774, Alan Hourihane, David Dawes).
-1241. Fix for XAA GC problems that show up when backing store is enabled
-      (#1775, Mark Vojkovich).
-1240. Fix for xf86MatchPciInstances() (#1773, Alan Hourihane).
-1239. Unload drivers in InitOutput that end up not being used.
-1238. Make the ScrnInfoRec.privates persistent rather than per-generation
-      data.
-1237. Remove the "requiredModules" field from the ScrnInfoRec and have the
-      drivers load the modules they need explicitly.  The loader and parts
-      of the design have been updated to take this into account.
-1236. Remove refcount code added in change 1175, and fix problem with the
-      preexisting refcount code not incrementing the count when modules
-      are loaded second and subsequent times.
-1235. Add more info for LoaderPrint{Symbol,Address} functions (1772,
-      Stuart Anderson).
-1234. Fix some Linux/Alpha loader problem (#1772, Stuart Anderson).
-
-XFree86 3.9jq (3 July 1998)
-1233. Loadable font modules (#1767, Alan Hourihane).
-1232. Add Option "ShowCache" to allow scrolling down to see part of the
-      pixmap cache (#1770, Mark Vojkovich).
-1231. Fix MGA loss of sync problem when scrolling the desktop (#1770,
-      Mark Vojkovich).
-1230. Add XAA cursor support to the MGA driver (#1770, Mark Vojkovich).
-1229. Have XAA wrap the EnterVT and LeaveVT functions so that it can
-      invalidate the pixmap cache.  Also further progress towards
-      getting 8x8 patterns cached (#1769, Mark Vojkovich).
-1228. XAA cursor support.  Only the TVP3026's style cursor data packing
-      (ie. source and mask not interleaved) is supported at the moment
-      (#1768, 1771, Mark Vojkovich).
-1227. Implement correct CRTC blanking timings (Koen Gadeyne).
-1226. Lots up updates to the Tseng driver (Koen Gadeyne).
-1225. Chips & Technologies driver converted to ND (#1761, David Bateman).
-1224. Ramdac/colourmap module.  Support for IBM ramdac so far (#1759, 1760,
-      Alan Hourihane).
-1223. Set the Crtc[HV]Adjusted flags more appropriately in
-      xf86SetCrtcForModes() (#1757, David Bateman).
-1222. Change xf86MatchPciInstances() to work with drivers supporting chips
-      from more than one vendor (#1753, 1754, Alan Hourihane).
-
-XFree86 3.9jp (27 June 1998)
-1221. Preliminary tseng driver (Koen Gadeyne).
-1220. Add the Xv extension (from the R5 contrib) (#1749, Mark Vojkovich).
-1219. Fix a rendering error in cfb's bit expansion code that can show
-      up with a very complex clip mask (#1747, Jens Owen).
-1218. Allow XAA's pixmap cache to use smaller slots when the larger ones
-      are not available (#1751, Mark Vojkovich).
-1217. Document the offscreen memory manager (#1747, Mark Vojkovich).
-1216. Fixes and temporary workarounds for mibank problems detected by xf4bpp
-      (#1743, Marc La France).
-1215. Fix a XF68_FBDev typo (#1743, Marc La France).
-1214. Fix up cfb and mfb header files (#1743, Marc La France).
-1213. Fix up xf1bpp's integration into the new design (#1743, Marc La France).
-1212. Introduce xf4bpp, a port of vga16 to the new design (#1743,
-      Marc La France).
-1211. Allow for zero to be a valid setting for chipID and chipRev.  These
-      are now initialised to -1 to indicate when they have not been set.
-
-XFree86 3.9jo (22 June 1998)
-1210. Add accelerated solid trapezoid fills to the MGA driver (#1740,
-      Mark Vojkovich).
-1209. Add accelerated polygons and wide lines to XAA, and fix some pixmap
-      cache problems (#1739, Mark Vojkovich).
-1208. Move the offscreen memory manager from XAA to xfree86/common
-      (#1739, 1741, Mark Vojkovich).
-1207. Fix a typo in the glint driver (#1737, Alan Hourihane).
-1206. Resync the parser with the common layer data structures, removing
-      some obsolete things and adding a few missing things.
-1205. Include the class/subclass/interface values in pciVideoRec.
-
-XFree86 3.9jn (21 June 1998)
-1204. Replace the "MAGIC" module init interface with the more general
-      SetupProc/TearDownProc interface.
-1203. Fix some typos in the DESIGN doc (Koen Gadeyne).
-1202. Add some more acceleration to XAA, and support for it to the MGA
-      driver (#1732, 1733, 1735,  Mark Vojkovich).
-1201. Preliminary pixmap cache support and offscreen memory manager added
-      to XAA (#1732, 1734, 1736, Mark Vojkovich).
-1200. Fix linepitch handling in the glint driver (#1731, Alan Hourihane).
-
-XFree86 3.9jm (15 June 1998)
-1199. Add preliminary infrastructure for different pixmap and framebuffer
-      formats.
-1198. Start a module/driver name space registry.
-1197. Accelerated glint driver (#1725-1727, Alan Hourihane).
-1196. Resync the PCI IDs.
-1195. Update xf86GetPciInfoForScreen() and add a similar
-      xf86GetIsaInfoForScreen().
-1194. Update DGA support code in the common layer.
-1193. Update DPMS support code in the common layer.
-1192. Reintroduce xf86GetClocks() as a helper.
-
-XFree86 3.9jl (9 June 1998)
-1191. Bring over the serial port functions (from Metro Link).
-1190. Bring over the os-support/pmax code.
-1189. Change the interface for xf86MatchPciInstances() to use separate
-      lists of PCI chipset names and IDs.
-1188. Fix some build problems on SVR4.0 and Solaris.
-1187. Rename xf1bpp_mfb* entry points to xf1bpp (#1714, Marc La France).
-1186. Port some recent vga16 changes over to the nd branch (#1714,
-      Marc La France).
-1185. Remove CloseScreen() and SaveScreen() from ScrnInfoRec's (#1714,
-      Marc La France).
-1184. m68k's XF86_FBDev now uses low-level backing store functions
-      during VC switches (#1714, Marc La France).
-1183. Push out backing store and banking wrapper initialisation to the
-      to the callers of the various <framebuffer>ScreenInit()'s.  This allows
-      XAA to wrap screens after banking, but before backing store (#1714,
-      Marc La France).
-1182. Allow screen wrappers to free their private data on server reset and
-      termination (#1714, Marc La France).
-1181. Minimise the number of public globals in the common layer, and replace
-      those the drivers need with functions to access their values.
-1180. Update the PCI code to match that on the main branch.
-
-XFree86 3.9jk (4 June 1998)
-1179. Change the Xserver binary name to "XFree86".
-1178. Add support for building a static Xserver.
-1177. Clean up some of the module Imake config stuff.
-1176. Fix generic vga driver probe crash.
-1175. Keep a reference count for loading modules and avoid loading the
-      same module twice.
-1174. A first attempt at ABI versioning the modules and checking it
-      in the loader.
-1173. Add a canonical naming for modules, without things like the "lib"
-      prefix or "_drv" suffix.
-1172. Add the -layout and -screen options to allow a layout or screen section
-      to be specified from the command line.
-1171. Make the interface in the xf86Find{Vendor,Layout} parser functions
-      consistent with the others.
-
-XFree86 3.9jj (31 May 1998)
-1170. Add call to LoaderCheckUnresolved().
-1169. Add finding the correct Display subsection to the xf86SetDepthBpp()
-      helper (David Dawes).
-1168. Some os-support layer cleanups (more required).
-1167. Add a new helper to simplify the driver Probe() code for PCI cards
-      (David Dawes).
-1166. Remove some fields from the ScrnInfoRec.
-1165. Add a set of option handling functions and helpers to the common layer.
-      These allow the option data structures to be opaque to the drivers
-      (David Dawes).
-1164. Add xstrdup (Xstrdup) to os/utils.c, and treat xf86strdup the same way
-      as xf86malloc in the libc wrappers.
-1163. Fix XAA 14 pixel width fonts (#1699, Mark Vojkovich).
-1162. Fix XAA CopyGC crash (#1698, Mark Vojkovich).
-
-XFree86 3.9ji (23 May 1998)
-1161. MGA Support for the new XAA code (#1697, Mark Vojkovich).
-1160. New XAA code (#1695, 1696, Mark Vojkovich).
-1159. Millennium 2 (inc AGP) support for the mga driver (#1697,
-      Mark Vojkovich).
-
-XFree86 3.9jh (22 May 1998)
-1158. Fix 'Unknown symbol type 1e' messages in the a.out loader
-      (#1683, Matthieu Herrb).
-1157. Loader updates, including Alpha and PowerPC support (#1467, 1666,
-      Metro Link).
-1156. Add '-Wall' to gcc compile options
-1155. Add Xarch.h (#1399, Metro Link).
-1154. Resync libc/ansic wrappering.
-
-XFree86 3.9jg (3 May 1998)
-1153. Remove ilbm's call to miRegisterGCPrivateIndex(), which no longer
-      exists (#1670, Marc La France).
-1152. Fix problems with mi generic functions in mibank (#1670,
-      Marc La France).
-1151. Symbolically link xf86_ansic.h so osPexFont.c can #include it
-      (#1670, Marc La France).
-1150. Fix opaque types in xf86_libc.h (#1670, Marc La France).
-1149. Fix a typo in mibank which makes miScanLineWidth() always fail.
-1148. Fix various missing symbols that show up when attempting to use
-      non-dlopen modules.
-
-XFree86 3.9jf (18 April 1998)
-1147. Add xf1bpp framebuffer for use by vga2 and mono (i.e. hga2)
-      drivers.  This is just a copy of mfb compiled for the bitmapScanlinePad
-      and bitmapBitOrder needed by these hardware framebuffers (#1636,
-      Marc La France).
-1146. A mode that fails validation (for whatever reason) no longer
-      affects the resulting virtual resolution (#1636, Marc La France).
-1145. miScanlineWidth() is now passed the hardware plane pixmap format
-      rather than nBankBPP (the harware plane bpp) and nPixelBPP (the
-      "total" bpp), and have xf86ValidateModes() call miScanLineWidth()
-      to determine an appropriate line pitch for the virtual resolution
-      requested (#1636, Marc La France).
-1144. Remove the helpers' concept of pixelArea as this can be derived
-      from videoRam and bitsPerPixel, express pitchInc in bits, and
-      pass apertureSize to mode validation helper (#1636, Marc La France).
-1143. Introduce the new mi banking wrapper (not yet used) (#1636,
-      Marc La France).
-1142. Make each screen keep track of the pixmap formats and display-
-      wide attributes it needs in its ScreenInfoRec.  InitOutput()
-      can then ensure consistency before adding the screens to the
-      display (#1636, Marc La France).
-1141. Use low-level backing store functions to save/restore the
-      screen during VC switches (doesn't work with vga16) (#1636,
-      Marc La France).
-1140. Move a copy of the backing store low-level function pointers
-      into the ScreenRec.  This allows them to be wrapped (#1636,
-      Marc La France).
-1139. Rename [GS]etRootPixmap screen entries to [GS]etScreenPixmap
-      and add [GS]etWindowPixmap entries.  Some may not be needed and
-      can be removed later (#1636, Marc La France).
-1138. Remove cfbScreenInitLong() entries.  They are not needed since the
-      RGB ordering and masks can be fixed after calling cfbScreenInit()
-      (#1636, Marc La France).
-1137. Fix the saving and restoring of PSZ #define in cfb??.h headers,
-      add copyright notice to them, and get right Imakefile to include
-      them in the link kit (#1636, Marc La France).
-1136. Fix oversight in 1133 (#1636, Marc La France).
-1135. Some include file fixes (#1539, Marc La France).
-
-XFree86 3.9je (14 February 1998)
-1134. Move framebuffer ModuleInit funtions into separate files (#1475,
-      Marc La France).
-1133. Move the following GC privates to the GC structure proper:
-      pRotatedPixmap, pCompositeClip, fExpose, freeCompClip.  This is in
-      preparation for the banking mi wrapper (#1451, Marc La France).
-1132. Minor bug fix to mfb and afb framebuffers (#1443, Marc La France).
-1131. Ensure window and GC privates are aligned on a sizeof(long)
-      boundary (#1442, Marc La France).
-1130. Minor optimisation of cfb's ImageGlyphBlt entry, required for
-      the new banking code (#1431, Marc La France).
-
-XFree86 3.9jd (1 February 1998)
-1129. Update the generic VGA driver for these changes (David Dawes).
-1128. Flesh out and update the design document, and add it to the source
-      tree (in xc/programs/Xserver/hw/xfree86/DESIGN) (David Dawes).
-1127. Working non-accel MGA driver (Millennium I only) (David Dawes).
-1126. Update parser (from Metro Link).
-1125. Fill in some missing bits of infrastructure, and fix some bugs there
-      (David Dawes).
-
-XFree86 3.9jc (16 January 1998)
-1124. A start at modifying non-accel MGA driver for new design (David Dawes).
-1123. Pick up multimedia/video PCI devices in xf86GetPCIVideoInfo()
-      (David Dawes).
-1122. Fix some header usage and missing prototypes (David Dawes).
-1121. Continue filling in missing bits of the new design infrastructure
-      (David Dawes).
-1120. Get the generic vga driver working (using dll modules on FreeBSD)
-      (David Dawes).
-1119. Reorganise the vgahw module (David Dawes).
-
-XFree86 3.9jb (25 September 1997)
-1118. Continuation of 1117.
-
-XFree86 3.9ja (29 July 1997)
-1117. Start converting the generic vga driver to the new design (Dirk Hohndel,
-      David Dawes).
-1116. Add flags to allow to build some modules as shared objects (Dirk Hohndel).
-1115. Fix dll loader to work on Linux (and re-fix it to work on FreeBSD
-      again) (Dirk Hohndel, David Dawes).
-1114. Add helper functions for various stages of the server (David Dawes,
-      Dirk Hohndel).
-1113. Add glue code to interface with new parser and create internal data
-      structures (David Dawes, Dirk Hohndel).
-1112. Split up vga256/vga into vgahw and vgafb (Dirk Hohndel).
-1111. New parser for the config file (Stuart Anderson).
-1110. Start work on the new design.
-
-XFree86 3.9j (12 July 1997)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-$XFree86: xc/programs/Xserver/hw/xfree86/CHANGELOG.ND,v 1.2 1998/07/31 10:41:14 dawes Exp $
diff --git a/hw/xfree86/doc/changelogs/CHANGELOG.R5 b/hw/xfree86/doc/changelogs/CHANGELOG.R5
deleted file mode 100644
index 5f8e03a..0000000
--- a/hw/xfree86/doc/changelogs/CHANGELOG.R5
+++ /dev/null
@@ -1,1249 +0,0 @@
-XFree86 2.1.1 (4 May 1994)
- 36. Fix server crash on reset problem in Mach32 and S3 servers
- 35. Fix typos in apollo driver
- 34. Fix for Imake config problem on ISC 4.0
- 33. ET3000 memory probe fix for SuperProbe
- 32. Documentation updates
- 31. Some updates for NetBSD-current
-
-XFree86 2.1.0B (26 April 1994)
- 30. Disable accelerated text blit for Cirrus 543x
- 29. Reorder some of the Bt485 code, and get clock doubling working again
-     without pixmux
- 28. Disable the PIXMUX_SWITCH_HACK stuff -- it doesn't seem needed any more
- 27. Fix image shift problem for pixmux on #9 cards (Robin Cutshaw)
- 26. Fix initialisation bug for Cirrus 62{2,3}5 cards (Harm Hanemaayer)
- 25. Remove 8514 monitor ID check in Mach8 server
- 24. Updates to the NetBSD README (Matthieu Herrb)
- 23. Hey Rocky, watch me unbreak the Compaq driver... This time for sure...
-
-XFree86 2.1.0Ab (16 April 1994)
- 22. Rewrite of ATI SVGA driver (Marc La France)
- 21. Add "no_bitblt" option for the cirrus driver
- 20. Recognise the 5429 in the cirrus driver
- 19. Disable interrupts while programming the ICD2061A
- 18. sync-on-green support for the TI3020
- 17. Move S3 clock doubler setting from icd2061ClockSelect() to s3Init()
- 16. Fix dac_8_bit for Bt485 cursor, and fix Bt cursor blanking problem
- 15. SuperProbe updates
-
-XFree86 2.1.0Aa (10 April 1994)
- 14. BDM2 apollo driver (Hamish Coleman)
- 13. S3 support for switching between pixmux and non-pixmux modes
-     (Amancio Hasty)
- 12. S3 pixmux support for STB Pegasus, and cleanup of pixmux and icd code
-     (Leonard Zubkoff)
- 11. Change "fifo_conservative" setting for CLGD543x
- 10. Updates for NetBSD-current, including bumping shared lib revs
-
-XFree86 2.1.0A (7 April 1994)
-  9. Don't reserve video memory for HW cursor on S3 when using a RAMDAC cursor
-  8. Allow the "8clocks" option to force 9 clocks instead of 17 on WD90C3{0,1}
-     cards
-
-XFree86 2.1.0a (6 April 1994)
-  7. Fix some DEALLOCATE_LOCAL problems in accel servers
-  6. Support for Bt485 on #9 cards (Robin Cutshaw)
-  5. Fixes for Cirrus driver (Harm Hanemaayer)
-  4. Fix for text restore problem on some S3 cards (Jon Tombs)
-  3. Workaround for Mach32 detection problem on some platforms
-  2. Fix incorrect usage of $(DESTDIR) in some lnuxLib.rules and x386.cf rules
-  1. Code to detect 928-P (Harald Koenig)
-
-XFree86 2.1 (11 March 1994)
-151. OS README updates (affect individual OSs only)
-150. Fix AltGr handling for Linux (affects Linux only)
-149. Comment out the unused s3Save() and s3Restore() functions -- a typo in
-     some unreachable code may cause problems with some compilers (should not
-     affect any OSs)
-148. Linux compile-time fix for fonts/PEX/lex.l (affects Linux only)
-147. Late cirrus fix for large tiles
-146. Fix for LinkKit site.def and Imakefile (remove dbm references)
-
-XFree86 2.0Z (8 March 1994)
-145. Fix text/graphics mode switching for pixmux with SPEA Mercury.  This
-     code is now reasonably stable (interlace support is still absent though)
-     (Norbert Distler)
-144. Fix for cirrus stipple fill when virtual width is not a multiple of 32
-143. Linux keyboard updates
-
-XFree86 2.0Ce (7 March 1994)
-142. Preliminary support for Bt485 pixel multiplexing on the SPEA Mercury
-     card (Norbert Distler)
-141. More documentation updates
-140. SuperProbe updates (ATI and Weitek fixes)
-139. Fix for second MB cirrus BitBLT but -- BitBLT now turned back on for
-     2MB cards (Wolfgang Jung)
-
-XFree86 2.0Cd (6 March 1994)
-138. Default to building shared libs for FreeBSD
-137. Updates to cirrus driver: (Harm Hanemaayer)
-      New Option flag "no_2mb_banksel" for cards that have 2MB in the form
-        of 512kx8 DRAMS (4 chips)
-      Disable BitBLT engine use when using more than 1MB because there
-        are problems
-      New text bitmap transfer code
-136. Documentation updates
-135. Fix mi/cbrt.c so it handles negative arguments.
-
-XFree86 2.0Cc (5 March 1994)
-134. Update x386/etc/console.h to current version
-133. Some documentation updates (including removing README.XS3)
-132. Updates to cirrus driver: (Harm Hanemaayer)
-      New option flags "fifo_conservative" and "fifo_aggressive" to
-        control the CRTC fifo threshold.
-      Reduce clock limit for the 5420
-      Remove accelerated PolyGlyphBlt -- it causes problems
-131. Modify pvga1 driver to detect the 90C24 and treat it as a 90C30
-130. Support for the SC15025 RAMDAC in 8-bit/RGB mode (requires
-     the "sc15025" and "dac_8_bit" options) (Helmut Geyer)
-129. Fix vga colourmap save/restore when using a RAMDAC in 8-bit mode (Helmut
-     Geyer)
-
-XFree86 2.0Cb (3 March 1994)
-128. Fix for "snow" problems on WD90C3x cards with 80MHz clock (Anders Bostrom)
-127. Fixes for compilation problems on Mach and ISC
-126. Support for 8-bit/RGB for the AT&T 20C490/491 ramdacs (S3 server).
-     There is no auto-detect, so the "att_20c490_1" Option must be
-     specified (together with the "dac_8_bit" Option)
-125. Added some sample patches from Gertjan Akkerman which document some
-     useful changes which could me made to the VGA16 server (these are
-     in x386/vga16/doc/).
-124. Fix Mach8 and Mach32 server hang when run on a card with no Mach chip
-123. Update xterm's terminfo file
-122. Install mit/config/README in lib/X11/config
-121. Modify Trident driver to recognise the 9000i, 9200CX, 9100B and 9420
-     chipsets.  The first is treated as a 9000, and the last three are
-     treated as a 8900CL.
-
-XFree86 2.0Ca (2 March 1994)
-120. Fix CR60 setting for clocks > 100MHz (S3 server)
-119. Fix cirrus compilation on SVR4, and bsd_init.c typo
-118. Enable Home/End esc sequences for xterm on all OSs
-117. SuperProbe register unlock fixes
-
-XFree86 2.0C (1 March 1994)
-116. Allow the MIT-SHM extension to be disabled at run-time on BSD systems
-     when kernel support for sysv-shm isn't present
-115. Enable Home/End esc sequences for xterm (Linux only -- should this be
-     extended?)
-114. Set default xterm tty parameters to reasonable values (fixes problems
-     seen when using xdm)
-113. gccmakedep fix (David McCullough)
-112. Special-case code for lines where this is one rectangle in the clip
-     region -- for Mach32 (Craig Groeschel)
-111. Update to compaq probe code -- hopefully this will reduce the number
-     of false positives
-110. Major updates to SuperProbe
-109. Cirrus driver patches
-
-XFree86 2.0Bb (27 February 1994)
-108. Removed experimental "cr60=..." options (S3), and made CR60=0xFF
-     the default setting.  The "dram_{slow,med,fast}" options still remain
-     as un-documented options (just in case).
-107. Manual page updates
-106. Support for linear fb location on Mach32 PCI cards
-105. Include Solaris x86 "aperture driver" (Doug Anson and David Holland)
-104. Updated Thomas Wolfram's SVR3 mmap driver to version 2.2.3
-103. Allow the MemBase setting in Xconfig specify the high 5 bits of the
-     4MB aperture address for the Mach32 server, and the high 6 bits of
-     the LAW address for the S3 server
-
-XFree86 2.0Ba (25 February 1994)
-102. Fix/speedup for window->pixmap part of CopyPlane() in the accel servers
-101. Fix bits per RGB reported for S3 server when using 8bpRGB
-100. Modify code for determining when pixel multiplexing is required for
-     the S3 server, and restrict the DisplayWidth to either 1024 or 2048 when
-     pixel multiplexing is used
- 99. Preliminary support for the SC11412 clock chip used on the SPEA Mercury
-     (S3).  Use 'Clocks "sc11412"' to select this (Norbert Distler)
- 98. "icd2061a" now uses the "icd2061a_slow" clock setting algorithm.
-     The name "icd2061a_slow" will be dropped in the release after 2.1
- 97. Fixes for zero-width arcs for the VGA16 server (Gertjan Akkerman)
- 96. Support for David Holland's "aperture driver" for linear fbs on Solaris
- 95. Fix Solaris panic when no free VTs are available
- 94. Much-enhanced accelerated support for Cirrus chips (Harm Hanemaayer)
- 93. Support for up to 17 clocks on WD90C3x cards (Anders Bostrom)
- 92. Fix for Compaq avga driver
- 91. Keyboard updates to handle Linux' key remapping (Orest Zborowski)
- 90. README for Solaris (David Holland)
-
-XFree86 2.0B (21 February 1994)
- 89. Possible fix for Bt probe problem that some people see
-
-XFree86 2.0Ab (19 February 1994)
- 88. Combine DRAM and non-DRAM mach8 image assembler code into single files
-     with #ifdefs
- 87. Fix for hga2 driver to prevent it from blanking MDA displays when
-     swithching back to text mode
- 86. Code to explicitly recognise the *BSD PCVT console driver
- 85. Preliminary support for the S3 805i in interleaved mode
- 85. Fix for single-bank SVGA bitblt code (Giovanni Novelli)
- 84. Fix alu usage in mach32CopyArea() (Craig Groeschel)
- 83. Fix dash line support in Mach32 server (Mike Bernson)
-
-XFree86 2.0Aa (13 February 1994)
- 82. S3 "No_Bt485" and "No_Ti3020" options have been replaced by "Normal_DAC",
-     and a "20C505" option has been added
- 81. ATI text restore fixes for Mach32 server (Ton van Rosmalen)
- 80. Planemask fixes for Mach32GetImage() (Craig Groeschel)
- 79. Prevent S3 Ti cursor from being turned on when the screen is blanked
- 78. No longer define __386BSD__ for BSD/386, NetBSD, FreeBSD.  Change
-     the FreeBSD define from -DFreeBSD to -D__FreeBSD__.  Code outside
-     ddx/x386 now uses the value of BSD (from <sys/param.h>) and for
-     code below ddx/x386, __BSD__ is defined for all the x86 BSD OSs
- 77. Rewrite of Mach32 memory detection code (Mark Weaver)
- 76. Set clock-doubler cut-in to 67.5MHz for Bt485 and 90MHz for AT&T 20C505
- 75. Add ClearRTS option (some mice seem to need it)
- 74. Mach8 server now uses a 1024 line pitch (regardless of virtualX) for
-     cards with 1MB
- 73. Support for bank switching with the VGA16 server. Staticgray and
-     Grayscale visuals added to the VGA16 server (Gertjan Akkerman)
- 72. Slowed down image routines for DRAM based Mach8 cards (Hans Nasten)
- 71. Improvements to solx86 in/out assembler code, and removal of the
-     broken ProworksMOption
-
-XFree86 2.0A (15 January 1994)
- 70. Increase Bt485 clock-doubler cut-in point from 67.5MHz to 90MHz.  This
-     should fix the "flashing pixel" problem many have reported
- 69. Mach8 font cache performance updates
- 68. Update assembler code and SuperProbe Makefile.std for the ProWorks
-     compile on Solaris x86
- 67. Ti3020 probe code for SuperProbe (Robin Cutshaw)
- 66. Fix Mach32 server to recognise PCI cards
-
-XFree86 2.0g (9 January 1994)
- 65. Clock probe code for Mach32 server
- 64. Support for TI3020 ramdac for S3 server (Robin Cutshaw)
- 63. Fix server crash problem if reset occurs when VT switched away
- 62. Make accel servers honour the -dpi flag
- 61. Mach8 font cache updates
- 60. Support for the ProWorks compiler on Solarix x86
- 59. Add memory probe to SuperProbe (only for a couple of chipsets so far)
- 58. Support for display widths of 640, 800 and 2048 with S3 server
- 57. Generalise S3 HW cursor memory allocation -- fixes problems that showed
-     up with some virtualY/displaywidth combinations, and will work for
-     display widths < 1024
-
-XFree86 2.0f (27 December 1993)
- 56. Fix mach32RecolorCursor() SIGSEGV when VT switched away
- 55. Possible fix for cases where the S3 linear fb probe fails the first
-     time the server is started but succeeds on subsequent times
- 54. Updates to Mach32 memory probe
- 53. Fixes for ATI SVGA save/restore code (Ton van Rosmalen)
- 52. Fix xman's handling of nroff bullets and bolding (Rich Murphey)
- 51. Mach8 font cache updates (Hans Nasten)
- 50. Mach32 HW cursor fixes (Mark Weaver)
- 49. Change "makedepend" for systems with gcc to use "gcc -M" (based on
-     code from Hongjiu Lu).  This is much slower than the other version,
-     and maybe should be disabled by default for !UseInstalled
-
-XFree86 2.0e (18 December 1993)
- 48. SuperProbe updates (details in SuperProbe/ChangeLog)
- 47. Imake updates for NetBSD
- 46. Ramdac multiplexing for Mach32 cards with TLC34075 (and ATI68875?)
-     ramdacs (Mike Bernson)
- 45. Imake changes to allow easy building of just the servers with a
-     cut-down source tree
- 44. Fix ClearDTR -- now it clears *only* the DTR line
-
-XFree86 2.0d (11 December 1993)
- 43. Xconfig keyboard option: VTSysReq to enable SVR4-style VT switching
-     sequence on Linux and *BSD+syscons
- 42. Solaris 2.x x86 support (David Holland, Doug Anson)
- 41. Accelerated dline and dseg for Mach32 (Mike Bernson)
- 40. Accelerated non-cache text code for Mach8 (Hans Nasten)
- 39. VirtualY limit removed for Mach8 (cache can be disabled)
- 38. Dynamic allocation for font cache for Mach8 (Hans Nasten)
- 37. New GetImage for Mach32 (Mike Bernson)
- 36. Support for linear fb on *BSD with mmapable /dev/mem
- 35. Preliminary support for 1152 width on Rev C 801 and Rev E 928, and
-     1600 width on Rev E 928 in S3 server
-
-XFree86 2.0c (3 December 1993)
- 34. Support for 8-bit/gun for Mach32 server (Craig Groeschel)
- 33. New GetImage() for Mach8 and 8514
- 32. Fix error message printed when no appropriate graphics sections are
-     present in Xconfig
- 31. Add a "fb_debug" option to the S3 server
- 30. MemBase Xconfig parameter added to allow the fb base address to be
-     specified.  This is currently used only by some bdm2 drivers
- 29. Support added to bdm2 for Visa board (untested)
- 28. HGC-1280 now supported on both primary and secondary addresses
- 27. Sigma L-View driver tested and works now
- 26. Code from ATI to work around memory probing problems with some Mach32
-     chips (untested)
- 25. Workaround for some 2MB DRAM ATI cards (eg, CLX).  This allows the
-     VideoRam amount specified in Xconfig to override the detected value
- 24. Support for NetBSD/FreeBSD shared libraries (John Brezak & ??)
- 23. Add option "intel_gx" to handle linear fb on Intel GX/Pro (Mach32)
- 22. Composite sync support for Mach8
- 21. Allow linear fb for EISA S3 cards
- 20. Fix s3RecolorCursor() SIGSEGV when VT switched away
-
-XFree86 2.0b (14 November 1993)
- 19. Add virtualY <= 896 check to Mach8 server
- 18. Restore settings for VGA aperture mapping if linear fb access fails for,
-     S3.  Also restore those registers at exit
- 17. Merge in MIT fix-26 (mainly xterm security patch)
- 16. Fix S3 interlaced modes with VTotal > 1025.
- 15. Hack for 1280x1024 on S3 801 with 110MHz clock
- 14. Composite sync support for Mach32 (Todd Pfaff)
-
-XFree86 2.0a (9 November 1993)
- 13. Speedup for aligned <=16 bit wide stipple ops for Mach8 and 8514
- 12. Fix NULL dereference when ModeDB is empty (Bill Metzenthen)
- 11. make mit/rgb consistent with the server's usage of it.  showrgb can now
-     read rgb.txt directly, and [sng]dbm is no longer required
- 10. Attempt to clean up strerror() vs sys_errlist[] usage outside ddx/x386
-  9. Disable saving the Tek screen to a file in xterm -- a quick hack to
-     get around another security problem.  An official X Consortium fix
-     should be available soon
-  8. Fix vgaFasm.h so it works for gcc2 with '-traditional'
-  7. Fix clock probing problem in pvga1 driver
-  6. Fix typo in xf86_OSlib.h
-  5. Fix ClockProg informational message
-  4. Truncate clock values to MHz resolution when checking against the limit
-  3. Fix bug in LinkKit Imakefile
-  2. Fix malloc problem in the PEX font reader
-  1. Some documentation fixes
-
-XFree86 2.0 (24 October 1993)
-247. Documentation finalised
-246. Fix for VT switching problem with Mach32 server
-
-XFree86 1.9Za (23 October 1993)
-245. Documentation updates
-244. Fix bug in backing pixmap used for VT switching with the S3 server
-243. Fix typo which prevented nomemaccess being turned of when a localbus
-     S3 card is used without linear fb mapping
-
-XFree86 1.9Z (18 October 1993)
-242. Code freeze for 2.0.  Docs still not finished
-241. Disable linear fb mapping for BSD/386 since it doesn't appear to work
-240. Fix for dline bug in Mach8 and 8514 servers
-239. Updates to ati SVGA driver
-238. SCO doc updates
-237. Allow "nolinear" Option for Mach32 server
-
-XFree86 1.9Fe (17 October 1993)
-236. Fix S3 cursor problem when panning
-235. Mach32 HW cursor fixes
-234. Include Accel cards db
-233. Fix video mmap problem with *BSD
-
-XFree86 1.9Fd (17 October 1993)
-232. Add undocumented "showcache" Option for the S3 server
-231. Fix ALLOCATE_LOCAL/DEALLOCATE_LOCAL problem in S3 server
-230. Fix multi-screen I/O permission bug on SYSV
-229. SVR3 version of IOPL kernel patch (required for ISC 2.0.2)
-228. Get xload's compiled-in kernel name from <paths.h> for BSD
-227. Fix some compilation-related problems
-226. Sigma Lview driver doesn't work, so removed references to it
-225. DAC_MASK save/restore for 8514 server
-
-XFree86 1.9Fc (16 October 1993)
-224. Stipple and colour mapping fixes for vga16
-223. Fix for Mach8 VT switching problem
-222. Include README.Bsdi
-221. Fix SEGV in s3WarpCursor when VT not active
-220. Don't use kbd_mode for BSDI
-
-XFree86 1.9Fb (13 October 1993)
-219. Mach32 HW cursor colouring fixes (still not quite right)
-218. Change Mach8 clock probing to measure the divided-by-4 values only
-217. Correct fix for problems when some cards are in mono address mode
-216. Fix sync polarity problem with S3 server
-215. Update kbd_mode for syscons
-214. Add "memaccess" option (for S3) so that mem access can be forced on
-     for localbus cards when the linear framebuffer can't be mapped
-
-XFree86 1.9Fa (9 October 1993)
-213. 1-pixel segments fix for Mach8
-212. Trap virtual screen sizes which are too large for Mach32
-211. Turn off Mach32 HW cursor if insufficient videoram
-210. Some documentation updates
-209. Move clock limit definitions so that they can be changed when using
-     the LinkKit
-208. SuperProbe updates
-207. Fix mis-detection of ATI cards by the compaq driver
-206. Fix hard-coded path in xdpr script
-205. Print max clock before resolving modes
-204. Fix CRTC setting procedure for Mach32
-
-XFree86 1.9F (4 October 1993)
-203. Limit clock to 80MHz for Mach8 and Mach32
-202. Mach32 HW cursor fixes and mach32im cleanup
-201. Cleanup startup messages in Mach8 and Mach32 servers
-200. Disable xterm logging by default, and provide a safer(?) method of
-     opening the log file
-
-XFree86 1.9Ed (2 October 1993)
-199. Support for Cirrus 62x5 chips (Prof. Hank Dietz)
-198. Clean up handling of 'volatile', etc for 'gcc -traditional'
-197. Merge Mach8 font cache fix into Mach32
-196. Default to probe for 4 clocks on pvga1 cards
-195. Remove implicit assumption that certain mouse protocols are only used
-     by serial devices
-194. Updates/cleanups for bdm2 code
-193. Include SVR3 mmap and SCO dmmap drivers (in x386/etc)
-192. Change location of console.h to machine/ for FreeBSD
-191. Fix setting of AdmDir for *BSD
-190. Update GnuMalloc option.  Now it enables use of GNU malloc for clients
-     as well as the servers
-189. Patches for Amoeba
-188. Fix for OAK crash with SVGA server
-187. Fix for ATI SVGA restore problem
-186. HW cursor for Mach32 (Mike Bernson)
-185. Option checking in other accel servers
-
-XFree86 1.9Ec (1 October 1993)
-184. Option checking in S3 server
-183. Fix default colour visual handling for accel servers
-182. Add checking of clock limits
-181. Clean up s3Init()
-180. Fix to allow SVR3 shared libs to build when using gas
-
-XFree86 1.9Eb (29 September 1993)
-179. Updates to syscons support (requires lastest console.h  -- which is now
-     included in ddx/x386/etc)
-178. Fix for colourmap restoration problem with 8514/A cards
-177. Updates to Bt485 code
-
-XFree86 1.9Ea (28 September 1993)
-176. Man page updates
-175. Modify "number9gxe" option to use the Bt485's clock doubling for clocks
-     higher than 67.5Mhz
-174. Alternate ICD clock selection code.  Enable it with
-     'Clocks "icd2061a_slow"'
-173. site.def cleanup
-172. Fix Bt485 Cursor support
-171. Update syscons support
-170. Fix for S3 font cache server crash problem
-169. Fix for S3 xqueue problems when operating in linear mode
-168. Fix for S3 928 localbus problem
-167. Fix SuperProbe's graphics co-processor detection, and add code to detect
-     Bt485 on S3 cards.
-166. Fix text problems in Mach8 and 8514 servers
-165. Image read/write fix for Mach32
-
-XFree86 1.9E (23 September 1993)
-164. Support for the syscons driver on *BSD (S|ren Schmidt)
-163. Get/PutImage speedups for S3
-162. Accelerated image text for non-cached fonts (S3)
-161. Image read/write speedups for Mach32
-
-XFree86 1.9Dc (22 September 1993)
-160. Hooks added for HW cursor support on SVGA cards
-159. Support for ISC 4.0
-158. Accel text functions for non-cached fonts (S3 server)
-157. Fix problems with vga sequencer not being turned off in the right places
-156. Support for dmmap driver for SCO
-155. Oak driver (from Steve Goldman)
-154. Updates for Minix
-
-XFree86 1.9Db (21 September 1993)
-153. Accelerated WD90C31 support (Mike Tierney)
-152. Updates to ImageStipple code for Mach8 and 8514
-151. Fix for memory leak in mi backing store (Amancio Hasty)
-150. Accelerated Cirrus support (Simon Cooper and Bill Reynolds)
-149. Accelerated dline for Mach8 and 8514 (from Tiago Gons)
-148. Fixes for localbus 928
-147. Modify server to use rgb.txt directly and create an internal hash table
-     (from Thomas Roell)
-146. SuperProbe updates
-145. Fix cursor recolour problems in S3 server
-144. Use uname/gethostbyname for cases where SIOCGIFCONF fails
-
-XFree86 1.9Da (18 September 1993)
-143. ImageStipple speedup for Mach8 and 8514 (from Hans Nasten)
-142. Reorganise man page installation details for *BSD
-141. Fix various minor bugs
-
-XFree86 1.9D (15 September 1993)
-140. Use non-MAP_FIXED for mmap on Linux -- requires latest kernel
-139. dseg for S3
-
-XFree86 1.9Cf (14 September 1993)
-138. line updates for S3 (including dline)
-137. Support for Thomas Wolfram's mmap driver for SVR3
-136. Config changes to support NetBSD and FreeBSD
-135. Correct fix for SIOCGIFCONF on *BSD (from Mark Davies)
-134. Use Jerry Whelan's BSDselect() for SVR4 in libXt and libXbsd
-133. CopyPlane() for Mach32 server
-132. Include Berkeley str{,n}casecmp() in libXbsd
-131. Sigma LView driver for bdm2 (untested)
-130. OsMouse support for SCO (uses the SCO event driver)
-
-XFree86 1.9Ce (9 September 1993)
-129. Improve reliablilty of mmio code (thanks Thomas)
-128. Fix xdm-related server crash on Linux
-127. Support for 4MB aperture with EISA Mach32 cards
-126. CopyPlane() for 8514 server
-125. Fix "xfig" problem in accel servers
-124. Fix GetImage and PolyText in accel servers
-123. Fix problem with VT-switching and server reset
-122. Fix some more cfb.banked bugs
-
-XFree86 1.9Cd (5 September 1993)
-121. Fast image read/write for 8514 server
-120. Mmio support for 928 in S3 server
-119. Fixes for BT ramdac HW cursor (S3) (still doesn't work)
-118. CopyPlane() fixes for S3
-117. Speedup for PolyPoint() in Mach8 (and others)
-116. Fix for lines in accel servers -- now match cfb lines.
-115. CopyPlane()
-
-XFree86 1.9Cc (2 September 1993)
-114. Fix auto-repeat trapping of lock keys
-113. Support BT485 ramdac's HW cursor (S3 server) (doesn't work yet)
-112. Use mmap for BIOS access on SVR4
-111. Only protect page 0 for SVR4 when the -protect0 flag is given.  It makes
-     cores less useful
-110. bdm2 (banked dumb mono) fb/driver (from Pascal Haible)
-109. Fast image fill for Mach8 (from Hans Nasten)
-108. Update shared-lib version numbers for Linux
-107. Split bsdi os-support from 386BSD -- little code was common
-106. Modify s3Init() code to use vgaHWInit()
-
-XFree86 1.9Cb (28 August 1993)
-105. Fast image read/write for Mach8 (from Hans Nasten)
-
-XFree86 1.9Ca (28 August 1993)
-104. Default to NoMemAccess for S3 localbus cards on OSs that don't
-     support linear videomem mapping
-103. Add QueryBestSize() for S3
-102. Protect page 0 for SVR4 (to help find NULL pointer dereferences)
-101. Fix ChordMiddle
-100. Fix some compilation problems with vga16
- 99. vga16 fix for OpaqueMove bug
- 98. Work around GNU make's "different" default dependency handling.
-     Dependencies should now work reliably with GNU make.
- 97. Fast CopyPlane() for S3 server
- 96. Fix I/O port handling to deal with multiple screens
- 95. Mach8 updates
-
-XFree86 1.9C (25 August 1993)
- 94. Updated video mem <-> main mem copy code to get better performance on
-     localbus cards
- 93. Alternate fix for xqueue with S3 (previous fix degraded performance too
-     much)
-
-XFree86 1.9Be (25 August 1993)
- 92. SIOCGIFCONF fix for ISC in xdm
- 91. Mach support for mapping arbitrary video memory
- 90. Fix for performance problems in S3 server
-
-XFree86 1.9Bd (24 August 1993)
- 89. Updated version of Xconfig/probe info
- 88. Update libXt jump entries for Shm on Linux
- 87. Another S3 cursor update
- 86. Use mmap() for mapping framebuffer on SVR4
- 85. Localbus linear mapping for S3 (tested only on Linux)
-
-XFree86 1.9Bc (23 August 1993)
- 84. SuperProbe update
- 83. Improve picture stability when using high clocks (S3)
- 82. Get memory detection right for S3 911
- 81. Change localbus wait states for S3
- 80. Go back to the MAP_FIXED mmap for Linux, added xf86UnMapVidMem()
- 79. S3 cache updates and cursor changes
-
-XFree86 1.9Bb (21 August 1993)
- 78. Fix S3 server crash if it exits when its VT isn't active
- 77. Indicate where information in server startup messages comes from (ie
-     whether from Xconfig or by probing, etc)
- 76. Fix ATI/Mach probing in SuperProbe
- 75. Fix S3 cursor "shadowing" in interlaced modes
- 74. Fix problems with the S3 server when using xqueue
- 73. 16-colour generic VGA server (from Gertjan Akkerman)
-
-XFree86 1.9Ba (18 August 1993)
- 72. Support for a Hitachi Puma Plus digitising tablet's 4-button puck
-     (from Randy Terbush)
- 71. Mouse "ChordMiddle" option.  This is for a 3-button mouse which
-     generates left+right events when the middle button is used.  This is
-     for Microsoft protocol only (from Ted Goldblatt)
- 70. Reorganise the way SpeedUp options are handled so that the speedup code
-     is only linked into the server when the appropriate chipset driver is
-     included.
- 69. Fix inb/inw inlines for gcc without gas
- 68. Code to use memory to the right of the screen for caching (S3)
- 67. Various compilation-related fixes
-
-XFree86 1.9B (16 August 1993)
- 66. Fix memory leak on server reset
-
-XFree86 1.9Ai (16 August 1993)
- 65. Fix LinkKit
- 64. Cirrus driver was ignoring clocks when a VideoRam line is specified
- 63. Fix VT switching for Mach8 and ibm8514 servers
- 62. Fix server reset for S3 server
- 61. Fix problems in mach32ImageFill for virtual width != 1024
- 60. Text save/restore added to Mach32 server
-
-XFree86 1.9Ah (15 August 1993)
- 59. Updates to SuperProbe so it can detect the latest S3 chip revisions
- 58. VT switching support for the S3 server
- 57. Fix for S3 image write problems with screen width 1024 & 2MB videoram
-
-XFree86 1.9Ag (14 August 1993)
- 56. Another stipple fill fix in cfb.banked
- 55. S3 clock select fixes -- allows clock probing to work
- 54. Fix initialisation of miCacheFreeSlot
-
-XFree86 1.9Af (13 August 1993)
- 53. Allow programmable clocks to be specified with 'Clocks "prog_clk_type"'
-     in Xconfig.
- 52. Virtual size fixes for S3
-
-XFree86 1.9Ae (13 August 1993)
- 51. Extended I/O and IOPL handling for BSDI.
- 50. Set virtual size for S3 if not given.
-
-XFree86 1.9Ad (13 August 1993)
- 49. Imake config updates
- 48. Created libxf86_hw in common_hw, and moved clock probe code there.
- 47. XF86_Mach8 and XF86_8514 compilable.
-
-XFree86 1.9Ac (12 August 1993)
- 46. S3 updates (diff15)
- 45. XF86_Mach32 compilable
-
-XFree86 1.9Ab (11 August 1993)
- 44. XF86_S3 compilable and runnable on Linux
- 43a Cirrus driver updates (including fix for line problem)
- 43. Fix problem in Xlib compose-key code that caused auto-repeat problems
-     on some SVR4.
- 42. Keep /dev/console open for pccons on 386BSD to work around keyboard
-     hanging problem (from Mark Weaver)
- 41. Fix for zero width horiz, vert lines with rop other than GXcopy, GXxor
-     (from Mark Weaver)
-
-XFree86 1.9Aa (6 August 1993)
- 40. Include accel dirs (not compilable yet)
-
-XFree86 1.9A (4 August 1993)
- 39. Fix authorisation for LOCALCONN connections on SYSV.
- 38. OS-lib fixes
-
-XFree86 1.9e (1 August 1993)
- 37. Make the ET4000 Option "force_bits" standard behaviour
- 36. Fix problem of renderer config not being handled properly in the LinkKit
- 35. Update screen configuration handling to better suit multiple servers.
-
-XFree86 1.9d (29 July 1993)
- 34. Mach OS-lib fixes
-
-XFree86 1.9c (28 July 1993)
- 33. Lots of SCO patches (including fixing the bogus window problem, xterm,
-     font server, PEX)
- 32. SuperProbe updates (includes identification of AT&T RAMDACs and
-     detection of 8514/A and ATI Mach-xx chipsets)
- 31. Fix for bug in cfbgetsp.c
- 30. Include pixmap cache support in mi, mfb, cfb.
- 29. SVR3/ISC updates for gcc 2.4.5
- 28. Moved OS-specific parts of x386Io.c to the OS-lib
- 27. OS-lib fixes.
- 26. Converted the experimental ET4000 RCCONF code to an Option flag:
-     "fast_dram"
- 25. Fix SIOCGIFCONF related problems in xdm, chooser and server/os/access.c
-     on SVR4 and 386BSD (thanks to Ian Donaldson and Peter Wemm).
- 24. Support for easily adding multiple servers to server/Imakefile and
-     the LinkKit
-
-XFree86 1.9b (13 July 1993)
- 23. Fix for interlaced support in the Cirrus driver
- 22. OS-library added to separate out OS-specifics under ddx/x386
- 21. Fix initialisation of supported pixmap formats
- 20. Fix for authorisation on streams connections for SVR3
- 19. Fix other line bugs (fLineH.s, suLine.s, suVHLine.s)
- 18. Really make the horizontal panning symmetric
- 17. Fix 2MB support on Cirrus 5426
- 16. Fix line bug in non-speedup code (fLineBres.s)
-
-XFree86 1.9a (3 July 1993)
- 15. Added support for BSDI's BSD/386 (from Hans Nasten)
- 14. SuperProbe updates for C&T chipsets
- 13. Make horizontal panning symmetric
- 12. Allow Cirrus driver to address 2MB on the 5426 cards (not tested)
- 11. Add ChipRounding to the vga ChipRec so that chip-specific rounding of
-     virtualX can be handled properly
- 10. OSF/1 patches (Marc Evans)
-  9. Fix for xload problem on Linux
-  8. Fix for ATI text-mode font restore problem
-  7. Experimental code to set the RCCONF register on ET4000 cards (this is
-     only used if Et4000SetRCConf is set to YES in site.def)
-  6. Allow "black" and "white" colours to be specified in Xconfig for the mono
-     vga server
-  5. Fix Xconfig visual spec check for mono servers
-  4. Fixed some long file names (in extensions/lib/PEXlib, fonts/bdf/misc)
-  3. Fix xman bug introduced in 1.2Da
-  2. Fix bank-switching bug in cfbfillsp.c
-  1. Fix a couple problems that show up when using a XFree86 patched source
-     tree on non-i386 systems
-
-XFree86 1.3 (5 June 1993)
-98. Updates to ncr driver
-97. NCR imake config changes
-96. Docs updated for gzip extension change ".z" -> ".gz"
-95. Experimental "force_bits" option flag for ET4000
-
-XFree86 1.2Da (2 June 1993)
-94. Modify xman to use groff instead of nroff for Linux
-93. Modify xload to use /proc/loadavg for Linux
-92. Change ownership of /dev/console and /dev/tty0 for Linux
-91. Added xmodmap.std to the etc dir which lists the default key map in a form
-    that can be read by xmodmap(1)
-90. Various small SVR3 adjustments, and new README.SVR3
-89. Add a README for the LinkKit
-88. Support for banked mono in ET3000 driver (thanks to Joerg Wunsch)
-87. ET3000 probe changes
-86. README.Linux updates
-
-XFree86 1.2D (26 May 1993)
-85. Merge in MIT fix-25
-84. OSF/1 support is incomplete -- so remove references to it in the docs
-83. Add -keeptty flag to prevent server from detaching its controlling tty
-    (useful when debugging)
-82. Include support for 77C22E in ncr driver
-81. Set bank 0 for save/restore in trident driver [removed]
-80. Workaround for mouse loss when VT switching on SCO
-79. Compile-time support for SCO 3.2.4
-78. Don't include PEX in mono server (even when BuildPex is set) because it
-    only works for 8-bit PseudoColour
-77. Mach support for SuperProbe
-76. Various SVR3 shared lib fixes including fixes for AT&T SVR3.2, XDM auth
-    support and fixes for initialisation problems that showed up with Motif.
-75. Ignore SIGHUP in xterm for ISC 2.2.1, 3.0
-74. rgb/Imakefile fix
-73. Imake.tmpl updates for ISC
-
-XFree86 1.2Cb (19 May 1993)
-72. Code to slow down DAC access
-71. Possible fix for font restore bug on Linux and 386BSD (works for some
-    people, but not everyone)
-70. Merge in MIT fix-24
-69. Xosdefs.h mod for Mach
-68. Eliminate various compiler warnings with PEX
-67. Modify lndir to ignore directories called "CVS"
-66. Fix overscan restore problem when mode switching
-65. Fix a Cirrus-specific font/text restore problem
-
-XFree86 1.2Ca (16 May 1993)
-64. Fix for lndir to work with Linux (Gnu ls)
-63. Documentation updates
-62. Allow PEX to be turned on/off at link-time with the LinkKit
-61. Add "hibit_high" and "hibit_low" Option flags to handle some ET4000
-    cards when the server is started from a high-res text mode
-60. Fix screen corruption when mode-resolving fails (problem was introduced
-    in 1.2Bb)
-59. Fix to pvga1 driver for 90C11
-58. kbd_mode modified to be a no-op for codrv
-57. Imake.tmpl updates for SCO and OSF/1
-56. Remove need for <sys/ioctl_pc.h> with LinkKit on 386BSD
-
-XFree86 1.2C (8 May 1993)
-55. Modify Cirrus driver to set the reported clocks to the preset values
-    rather than probing them.  Probing can be forced with the "Probe_Clocks"
-    Option flag.
-
-XFree86 1.2Bb (6 May 1993)
-54. Compatibility support for codrv 0.1.1 (run-time only)
-53. Merge in OSF/1 support (from Marc Evans)
-52. Merge in SCO support (from David McCullough)
-
-XFree86 1.2Ba (4 May 1993)
-51. SuperProbe updates (can now be compiled with a K&R compiler)
-50. Compaq driver (from Hans Oey)
-49. Merge codrv and pccons support so that a single server can support
-    both
-48. Cirrus driver for CLGD542x cards (no accelerated support) (from Bill
-    Reynolds)
-47. Allow inline'd macros to be disabled for debugging purposes (by compiling
-    the video drivers with -DNO_INLINE)
-46. Print OS version in startup message
-
-XFree86 1.2B (19 April 1993)
-45. ET4000 text clock restoration modified -- maybe it will fix the problems
-    when restoring to a high res text mode
-44. Sample SVGA driver stubs and documentation added
-43. Xconfig option to specify VGA BIOS base address (not all are at 0xC0000)
-42. Major rewrite of tvga driver.  Now supports 8800CS, 8900B, 8900C, 8900CL,
-    9000 in all modes.
-41. Xconfig option to clear DTR after opening MouseSystems mouse (only for
-    SYSV, Linux, 386BSD)
-40. Change server names.  X386 -> XF86_SVGA, X386mono -> XF86_Mono.
-
-XFree86 1.2Aa (17 April 1993)
-39. SuperProbe will now find vga BIOS at addresses other than 0xC0000
-38. Support for building Linux shared libs (DLL version)
-37. Remove case-sensitivity of the Chipset option.
-36. Save and restore registers affected by clock probing
-35. Some more Xconfig validity checks
-34. Change 'Vendor' keyword in Xconfig to 'Option'
-33. Fix to make use of the RGBPath specified in Xconfig (this was pointed out
-    by Greg Hartman back in Sept)
-32. Use XWINHOME to specify ProjectRoot at run-time
-31. PEX patches for Linux
-30. libX11 shared lib problem fixed (for SVR4)
-
-XFree86 1.2A (3 April 1993)
-29. More pvga1/wd driver tuning, added rudimentary support for 90c20
-28. Improve overscan handling
-27. modeDB.txt updates
-
-XFree86 1.2e (27 March 1993)
-26. Minix/Amoeba updates
-25. New et3000 probe (to prevent tvga8900CL being falsly detected as et3000)
-24. More interlace tuning for pvga1 and tvga8900 drivers
-23. SuperProbe
-22. XDMCP fixes for Linux (and others)
-
-XFree86 1.2d (24 March 1993)
-21. Added support for Minix-386 and Amoeba (from Kees Verstoep)
-
-XFree86 1.2c (20 March 1993)
-20. Merged in MIT fix-23
-19. Support for 9th clock on WD90Cxx chips
-18. NCR 77C22 driver (from Stuart Anderson)
-17. Allow multiple Clocks lines in Xconfig
-16. Changes to external clock program code to handle VT switching better
-15. ISC 2.0.2 support (from Aki Atoji)
-14. Include driver source instead of objects in LinkKit
-
-XFree86 1.2b (1 March 1993)
-13. Improved ISC support for xman
-12. Improved handling of overscan colour
-11. Make the server's -pn option the default (compile time configurable)
-10. Hga2 support for 386BSD and Mach
-9.  pvga1 driver support for WD90C3x
-8.  Portable assembler macros (from Greg Sharp)
-7.  More flexible handling of Vendor strings in Xconfig
-6.  Store clock resolutions to nearest 1kHz.
-5.  Removed old SpeedUp version
-4.  Changes in LinkKit to handle distributions built with PEX support
-
-XFree86 1.2a (20 February 1993)
-3.  Xlib support for run-time selectable multiple LOCAL connection types
-    for SVR3, SVR4
-2.  Fix mapping problem when using codrv and a non-US keyboard mapping
-1.  Fix for TVGA interlaced modes
-
-
-XFree86 1.2 (8 February 1993)
-74. README updates
-73. ATI driver updates
-72. Banked mono doesn't work on ET3000 -- so turned off for that driver
-71. Merged in MIT fix-22
-70. Changes so that XFree86 patched source will build on other platforms.
-
-XFree86 1.1F (1 February 1993)
-69. Add check for presence of "Modes" line in Xconfig
-68. Add assembler code for byte-order swapping in mfb
-67. More svr3 shlib "tuning"
-
-XFree86 1.1E (26 January 1993)
-66. Change to pvga1 driver to get correct clock ordering for 90C30
-65. Fix linux problem building liboldX
-64. server locking to prevent clobbering of local connection pipes
-63. xhost fix for LOCALCONN
-62. Add missing svr3 shlib patches
-
-XFree86 1.1D (24 January 1993)
-61. Removed SVR3 shlib stubs from clients
-
-XFree86 1.1Ce (23 January 1993)
-60. SVR3 shared lib support (from Thomas Wolfram)
-59. Added Hercules driver (from Davor Matic)
-58. Re-map scancodes for Codrv so that the keycodes the server sees are the
-    same on all platforms
-57. Modify NumPad handling so that Shift works properly.
-
-XFree86 1.1Cd (13 January 1993)
-56. Commented out force VT disabling -- causes problems with Esix 4.0.3A
-55. Support for tvga9000 (from Gertjan Akkerman)
-54. Ignore FontPath in Xconfig when a FontPath is provided with the -fp option
-53. Support for new Linux VTs
-52. Turn off Alt-Sysreq-F (forced VT switch) by default for SYSV.  Added an
-    Xconfig option to prevent this disabling (AllowForceVT)
-51. X386keybd man page added
-50. mfb.banked fixes
-
-XFree86 1.1Cc (3 January 1993)
-49. tvga driver updates for banked mono
-48. Fixes to cfbblt, mfbblt for single-banked drivers
-
-XFree86 1.1Cb (1 January 1993)
-47. Added -verbose (default) and -quiet flags, and print out more information
-    in verbose mode
-46. Improved banking for mfb.banked
-
-XFree86 1.1Ca (30 December 1992)
-45. cmfb code (from Davor Matic), and an experimental mfb.banked
-44. Flush mouse input after opening
-43. Fix problem starting X from within an X session
-
-XFree86 1.1C (23 December 1992)
-42. Added -probeonly option which causes the server to exit after the
-    device probe stage.
-41. Merged in MIT fix-21
-40. Support for an external clock setting program
-39. Patches for Destiny (SVR4.2)
-
-XFree86 1.1Ba (17 December 1992)
-38. Merged in MIT fix-20
-37. Various improved error messages
-36. Improve accuracy of clock probing code -- add delay so VCO can
-    stabilise before starting the measurement
-35. Store dot-clocks to .1MHz accuracy
-34. Make the server's -dpi option work
-33. Extend fontpath validation to the compiled-in default fontpath
-32. Increase server priority while probing for clocks
-31. Fixed KDSETRAD bug introduced in 1.1a (affected DELL)
-30. Bell support for pccons driver on 386BSD
-
-XFree86 1.1B (21 November 1992)
-29. Hack for ISC local connection on SVR4 with ACP (requires the ISC
-    client binary to be edited)
-28. Added code to change IOPL on SYSV for extended I/O (including patch
-    scripts for the SVR4 kernel)
-27. Merged in MIT fix-18 and fix-19
-26. Support for PS/2 mouse
-
-XFree86 1.1A (16 November 1992)
-25. Fix problems compiling with a non-ansi compiler.
-
-XFree86 1.1c (8 November 1992)
-24. Xconfig options to set default mapping of some special keys
-23. Code to validate the fontpath given in Xconfig
-22. Patches for Logitech Trackman/Mouseman (from Christian Ziemann)
-21. Updates for version 0.1.1 of Holger's co driver
-20. Fix for et3000 text mode restoration (from Holger Veit)
-19. Fix NumLock support -- use two sets of keycodes for num keypad
-18. Add Compose / Multi-key support to Xlib (from MIT contrib)
-17. Don't reset state of lock keys when starting the server
-16. Fix code for setting visual type from Xconfig
-
-XFree86 1.1b (21 October 1992)
-15. Xload support for Linux
-14. Use Xconfig.cpp to generate the sample Xconfig with paths consistent with
-    the configuration.
-13. Allow multiple "FontPath" lines in Xconfig which are concatenated to build
-    the FontPath.
-12. Blank and clear the screen during server startup
-11. Fix tegblt code for mono server (instead of the previous workaround)
-10. Fix non-32bit tiles and stipples for mono server with 8-bit scanlines
-9.  Fix circle/ellipse drawing for mono server
-8.  Use 8-bit bitmap scanlines for mono server (can now remove pixmap hack)
-7.  Add check in server to see if euid==0.  If not, exit with a warning.
-
-XFree86 1.1a (11 October 1992)
-6.  Add a VTInit option to Xconfig to run a program on the VT during
-    screen initialisation.
-5.  Fix security holes in reading Xconfig files, and the undocumented
-    -mono and -colour options.
-4.  Use KDMKTONE for bell for systems that support it
-3.  Allow 4 clocks for generic driver
-2.  Mods to allow compile time selection of 128k display mapping for mono
-    (this is experimental and may be removed)
-1.  Holger's 386BSD co driver support (compile-time selectable)
-
-
-XFree86 1.1 (1 October 1992)
-70. Public release
-69. Set mailbox for 386bsd in Xaw
-
-XFree86 1.0Zb (30 September 1992)
-68. Mods to startx so that an absolute path is not required for a server
-67. Make the right-hand <ALt> key behave like Alt_R
-66. Updates to X386.man
-65. Add -mono and -colour (undocumented) options to server
-64. Look for Xconfig file in /etc before /usr/X386/lib/X11
-63. Print out Trident version in probe routine and add README.trident
-
-XFree86 1.0Za (27 September 1992)
-62. cfb.banked changes for Mach's BSD cpp.
-61. Add mkwhatis script for 386BSD
-60. Fix problems with xgc/lex.l
-59. Modify default keymap so Alt_L will work like both Meta_L and Alt_L.
-58. xload fixes for 386BSD
-57. Change config/x386config.sh for dumb BSD sh.
-
-XFree86 1.0Z (24 September 1992)
-56. Beta release (final for 1.1)
-55. Add ISC22, ISC30 defines
-
-XFree86 1.0Yb (21 September 1992)
-54. Included Thomas Eberhardt's updates to the compressed font code.
-53. Put Alan Hourihane's generic save/restore code into vgaHW.c
-52. Correction to xmh man page
-51. Support use of libdbm.a for ISC 3.0
-
-XFree86 1.0Ya (17 September 1992)
-50. Merge in Linux support (from Orest Zborowski)
-
-XFree86 1.0Y (14 September 1992)
-49. Beta release (second for 1.1)
-48. Removed FAS support on SVR4
-47. Changes to font and text save/restore
-
-XFree86 1.0Xc (12 September 1992)
-46. Fix xman scroll bug
-45. Update to ati driver to save more planes
-44. Single/double bank selection for drivers
-
-XFree86 1.0Xb (9 September 1992)
-43. Link Kit updates
-
-XFree86 1.0Xa (8 September 1992)
-42. Fix some Xconfig related problems
-41. Trident driver (256 colour and mono)
-40. Mono drivers for et3000, pvga1, gvga (untested)
-
-XFree86 1.0X (4 September 1992)
-39. Beta release
-38. Minor updates
-
-XFree86 1.0m (2 September 1992)
-37. Change name to XFree86
-36. Added link kit
-
-X386 1.2E 1.0l (30 August 1992)
-35. Added (experimental) ATI driver
-34. Changed configuration so that mono and colour servers can be built
-    at the same time.
-X386 1.2E 1.0k (30 August 1992)
-33. Directory re-organisation
-
-X386 1.2E 1.0j (29 August 1992)
-32. Fix problem of server crashing while resetting
-
-X386 1.2E 1.0i (28 August 1992)
-31. Portability changes to vgaFasm.h (for cc and gcc-1.??)
-30. Added a -xconfig flag to specifiy the Xconfig file from the command line.
-29. Fixed problem with xdmauth accessing memory between 640k and 1M.
-28. Round down the specified virtual width to the nearest required multiple.
-27. Fix some bugs in the Xconfig parser.
-26. Added 'vga2' keyword for Xconfig so one file can be used for both the
-    colour and mono servers.
-25. README's updated
-24. Minor speedup fix
-23. More server configuration changes
-
-X386 1.2E 1.0h (26 August 1992)
-22. cfb.banked updated for fix-17
-21. New SpeedUp code (works for any* virtual width)
-20. Monochrome VGA server
-19. Changes for compile-time selection of supported chipsets, and font
-    renderers
-18. Updated X386.man, README.Mach
-17. Fix mouse map bug for logitech (and microsoft?).
-16. Merge in changes for Mach386 (from Robert Baron, Joel Jacobson)
-15. Merge in changes for 386BSD (from Rich Murphey, Amancio Hasty)
-
-X386 1.2E 1.0g (25 August 1992)
-14. Merged in MIT fix-17
-
-X386 1.2E 1.0f (4 August 1992)
-13. SpeedUp flag for Rectangle Stipple fills
-
-X386 1.2E 1.0e (4 August 1992)
-12. Extend the trapping of unexpected fatal signals beyond just SIGSEGV.
-    The NoTrapSegV option has been changed to NoTrapSignals.
-
-X386 1.2E 1.0d (3 August 1992)
-11. Run mkfontdir in install directory rather than copying fonts.dir from
-    the build directory.
-10. Merged in MIT fix-16
-
-X386 1.2E 1.0c (1 August 1992)
-9.  Run 'mcs -d' on SVR4 shared libraries
-8.  Merged in official Type1 font patch
-7.  Merged in MIT fix-15
-6.  Fixed malloc/free problems in lib/X/XcmsLRGB.c, clients/xdm/greet.c
-5.  Merged in MIT fix-14
-
-X386 1.2E 1.0b (27 July 1992)
-4.  Updated version of fFill.s
-3.  Bug fixes (for stipple) from Jim (require GCC at the moment)
-
-X386 1.2E 1.0a (22 July 1992)
-2.  Merged in MIT fix-13
-1.  Fix problem with divide by zero when bell pitch was set to zero.
-
-
-X386 1.2E 1.0 (16 July 1992)
-97. First general release
-96. Define repz to be repe for gas.
-95. Update XdmConf.svr4 to read /etc/default/login to set ulimit, etc.
-
-X386 1.2E 0.2c (15 July 1992)
-94. Allow easy selection of ansi level when building non-core clients.
-93. Install and use sessreg (for xdm)
-92. .align changes for gas
-91. README and X386.man updates
-
-X386 1.2E 0.2b (11 July 1992)
-90. Mods to SpeedUp for gas (jcxz changes).
-89. Minor change to xdm/auth.c for ISC3.0
-88. Removed SVR4 Vendor defines.
-
-X386 1.2E 0.2a (8 July 1992)
-87. Added some missing cld's to gBitBlt.s
-86. Some portability changes to fFill.s
-85. VT release problem when using FAS/SVR4 really fixed this time.
-84. Moved libinetemul.a to lib/InetEmul; library now called libXinetem.a, and
-    used in a similar way as libXbsd.a.  Changes to top level Imakefile have
-    been removed.
-83. Updates to README (building under ISC2.2, compiling clients)
-82. Include libXbsd.a in ExtraLibraries for SVR4/SYSV
-
-X386 1.2E 0.2 (3 July 1992)
-81. Second beta version
-80. et debug option removed
-
-X386 1.2E 0.1i (2 July 1992)
-79. Fixed VT release problem when using FAS/SVR4.
-78. Added warning about using xdmauth.
-77. Updated XdmConf.svr4 to handle different auth types
-76. Reorganisation of some compiler and assembler related options in x386.cf
-
-X386 1.2E 0.1h (27 June 1992)
-75. More portability changes to assembler code.
-74. Updates to modeDB, XdmConf.svr4
-
-X386 1.2E 0.1g (25 June 1992)
-73. Assembler portability changes from Jon Block.
-72. Change startup message from 'X Windows System' to 'X Window System'
-
-X386 1.2E 0.1f (20 June 1992)
-71. Fixed line problem when compiling with SVR4 'cc'.
-70. Changes to make source compile with Esix 3.2D, ISC 3.0 (without TCPCONN)
-
-X386 1.2E 0.1e (17 June 1992)
-69. Removed Glenn's wrapper comments from cfb.banked files.
-68. Added a debug flag to check operation of hiclock selection, and hopefully
-    fixed the problem with that.
-67. Fixed PIC flag problem in sv4Lib.rules
-
-X386 1.2E 0.1d (13 June 1992)
-66. Xconfig is installed as Xconfig.sample so as not to overwrite a locally
-    configured one.
-65. Use HasSdbm to determine use of -lsdbm for server and rgb.
-64. Made SpeedUp the default when appropriate, and added 'SpeedUp "none"' and
-    'NoSpeedUp' options.
-63. Updates to README, X386.man, modeDB.txt.
-62. Added a shar file with sample configuration files for xdm.
-61. Another setpgrp() change in xdm.
-60. Added command line option to specify which VT the server runs on.
-59. Changed default pointer map to the correct 1:1 map.
-58. Fixed bug in merge of SPEEDUP_TEGBLT8 which caused problems when that
-    option was not selected.
-
-X386 1.2E 0.1c (7 June 1992)
-57. Remove some setpgrp() calls in xdm.  This allows xdm to work with
-    xqueue on Microport, Dell, AT&T versions.
-56. Default for server to open SCO Xsight connection for SVR4.  SVR4.0.4
-    supports this as part of its "Advanced Compatibility Package".  The
-    code doesn't appear to cause problems with versions of SVR4 without this
-    (the feature just can't be used on them).
-
-X386 1.2E 0.1b (3 June 1992)
-55. Fixed bug in SPEEDUP_TEGBLT8 selection in vga.c
-54. Glenn's new cfbteblt8.c
-
-X386 1.2E 0.1a (30 May 1992)
-53. Fixed problem when switching VT away too quickly after switching back.
-52. Added Vendor defines for ISC SVR4 (ISC4), AT&T SVR4 (ATT4)
-
-X386 1.2E 0.1  (29 May 1992)
-51. First beta version
-
-X386 1.2E 0.0n (28 May 1992)
-50. Added README.X386-1.2E
-49. Introductory info added to modeDB.
-48. A few missed RCS Header lines.
-
-X386 1.2E 0.0m (26 May 1992)
-47. Added options to control building 75dpi, 100dpi, and large misc fonts.
-46. More updates to modeDB.
-45. Assembly changes for more pedantic 4.0.4 assembler.
-44. Moved site-specific defines from x386.cf to site.def
-43. Define usleep as the nap syscall for all SVR4 to avoid using libucb.a
-
-X386 1.2E 0.0l (23 May 1992)
-42. Added BuildType1 option
-41. Fixed ManDir and LibmanDir in site.def
-40. Added RCS Header lines to modified files
-
-X386 1.2E 0.0k (23 May 1992)
-39. Moved Glenn's and Jim's assembler routines into ddx/x386/enhanced
-38. Local connection added to X386.man
-37. Jim's update to cfbtileodd.c
-
-X386 1.2E 0.0j (21 May 1992)
-36. Updates to ModeDB.txt
-35. New fLineH.s from Jim
-34. New gLine.s from Glenn
-
-X386 1.2E 0.0i (19 May 1992)
-33. Fixed problem with setting mouse acceleration
-32. Prettied up startup message
-
-X386 1.2E 0.0h (16 May 1992)
-31. Removed SPEEDUP_TEGBLT8 from SPEEDUP_ALL -- it causes problems for some
-    font rendering (characters coming out as solid filled blocks).
-30. Added Thomas Eberhardt's compressed bitmap font patches
-
-X386 1.2E 0.0g (15 May 1992)
-29. #undef'd SO_DONTLINGER in os/connection.c for SVR4 -- it is not properly
-    defined for SVR4, and it removes the familiar startup error message.
-28. Changed SPEEDUP_VHLINE to SPEEDUP_LINE since it's not just for V, H lines
-27. Included Glenn's gLine.s
-26. Modified auto-detect HiClock code to use Thomas' method of making 16
-    clocks available with ET4000.  HiClock option has been removed since
-    this change makes it obsolete.  X386.man and Xconfig have been updated
-    accordingly.
-25. Fix problem switching after SIGHUP is sent while VT switched away.
-24. Take x386Resetting out of os/utils.c and put it in x386Init.c
-23. Turn on screen saver before copying screen to pixmap when switching away
-22. Fixed typo in vga.c related to SPEEDUP_TEGBLT8
-
-X386 1.2E 0.0f (14 May 1992)
-21. Removed special handling of SIGSEGV when server is exiting.
-20. Take care of server exiting and resetting when VT is switched away.
-19. Copy screen to dummy pixmap when switching away, and copy it back when
-    switching back.  (The contents were of the dummy pixmap were previously
-    ignored.)  Masking window is no longer used.
-
-X386 1.2E 0.0e (13 May 1992)
-18. Add missing argument in call of GlennsFillBoxSolid -- hopefully fixes
-    SIGSEGV problem.
-17. Added x386Version.h, CHANGELOG
-16. Added a couple of #undef's in cfbhrzvert.c
-15. Fold in public-patch-9 for cfb/cfbbresd.c into cfb.banked/cfbbresd.c
-14. casting for VGABASE in cfbbitblt.c
-13. #include fix in connection.c
-12. Disable building of FontServer in site.def
-
-X386 1.2E 0.0d (12 May 1992)
-11. Changes to gFillCopy.s, gVHLine.s to improve hseg100 performance.
-10. Change the way GCOps are initialised when SpeedUp is selected
-9.  Add SpeedUp to cfbteblt8.c that assumes xdim=1024
-
-X386 1.2E 0.0c (10 May 1992)
-8.  Allow SpeedUp Xconfig option to individually select various speedups
-
-X386 1.2E 0.0b (10 May 1992)
-7.  Autodetect for HiClock option (not tested yet)
-6.  Fix for cfbblt not setting read on dst for GC ops that require it
-5.  Minor change in X386.man
-
-X386 1.2E 0.0a (09 May 1992)
-4.  Reset screen saver timer for ForceScreenSaver(Reset)
-3.  Reset screen saver when switching back
-2.  Raise masking window when switching back so all windows get expose events
-1.  Use dummy buffer for screen writes when VT is switched away
-
-X386 1.2E 0.0  (07 May 1992)
diff-tree 5a40448f2d0ac2c86c617bebe3fb649174bf0d7f (from 05f1c302460a14c8fa9a943a12d69adcd3c30d58)
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Nov 7 15:48:05 2006 -0800

    A couple more cases of error message before freeing strings.

diff --git a/config/config.c b/config/config.c
index d597222..b95128d 100644
--- a/config/config.c
+++ b/config/config.c
@@ -274,23 +274,23 @@ configInitialise()
     snprintf(busname, sizeof(busname), "org.x.config.display%d", atoi(display));
     if (!dbus_bus_request_name(bus, busname, 0, &error) ||
         dbus_error_is_set(&error)) {
-        dbus_error_free(&error);
         dbus_connection_unref(bus);
         configfd = -1;
         FatalError("[dbus] couldn't take over org.x.config: %s (%s)\n",
                    error.name, error.message);
+        dbus_error_free(&error);
         return;
     }
 
     /* blocks until we get a reply. */
     dbus_bus_add_match(bus, MATCH_RULE, &error);
     if (dbus_error_is_set(&error)) {
-        dbus_error_free(&error);
         dbus_bus_release_name(bus, busname, &error);
         dbus_connection_unref(bus);
         configfd = -1;
         FatalError("[dbus] couldn't match X.Org rule: %s (%s)\n", error.name,
                    error.message);
+        dbus_error_free(&error);
         return;
     }
 
diff-tree 05f1c302460a14c8fa9a943a12d69adcd3c30d58 (from parents)
Merge: 3e7e0e35094d09e0e764818ed125314be75be01a 46af6d1e953f1eefb6edbba3d29fb9700e42c2bb
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Tue Nov 7 18:42:54 2006 -0500

    Merge branch 'autoconfig-for-7.2'

diff-tree 3e7e0e35094d09e0e764818ed125314be75be01a (from 4e6e4baead6c565363abbcd9e06cc685be121596)
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Nov 7 14:13:23 2006 -0800

    Report the error before freeing the error strings.

diff --git a/config/config.c b/config/config.c
index 5b0d90d..d597222 100644
--- a/config/config.c
+++ b/config/config.c
@@ -258,9 +258,9 @@ configInitialise()
     dbus_error_init(&error);
     bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
     if (!bus || dbus_error_is_set(&error)) {
-        dbus_error_free(&error);
         FatalError("[dbus] some kind of error occurred: %s (%s)\n", error.name,
                    error.message);
+        dbus_error_free(&error);
         return;
     }
 
diff-tree 4e6e4baead6c565363abbcd9e06cc685be121596 (from 5e946dd853a4ebc2722ae023429ce5797de3d7a6)
Author: Eric Anholt <eric at anholt.net>
Date:   Tue Nov 7 13:13:53 2006 -0800

    Fix build on FreeBSD after input-hotplug.

diff --git a/hw/xfree86/os-support/bsd/bsd_bell.c b/hw/xfree86/os-support/bsd/bsd_bell.c
index 60c2ffc..b7a0c48 100644
--- a/hw/xfree86/os-support/bsd/bsd_bell.c
+++ b/hw/xfree86/os-support/bsd/bsd_bell.c
@@ -27,10 +27,15 @@
 #include <xorg-config.h>
 #endif
 
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+#include <sys/kbio.h>
+#endif
+
 #include <termios.h>
 
 #include "xf86.h"
 #include "xf86Priv.h"
+#include "xf86_OSlib.h"
 
 #ifdef WSCONS_SUPPORT
 #define KBD_FD(i) ((i).kbdFd != -1 ? (i).kbdFd : (i).consoleFd)
diff-tree 20e9144c0746943624ff77a61791b8596f3f8458 (from 1dcda4f3c56214464c0b6123fea6daa69aae69fc)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Nov 7 12:49:28 2006 -0800

    Add $(DIX_CFLAGS) to remaining Makefile.am files

diff --git a/hw/dmx/config/Makefile.am b/hw/dmx/config/Makefile.am
index fbc7f35..c31e049 100644
--- a/hw/dmx/config/Makefile.am
+++ b/hw/dmx/config/Makefile.am
@@ -27,7 +27,7 @@ endif	    
 
 AM_YFLAGS = -d
 AM_CFLAGS = \
-	 \
+	$(DIX_CFLAGS) \
 	-I$(top_srcdir)/hw/dmx \
 	$(GLX_INCS) \
 	-DHAVE_DMX_CONFIG_H \
diff --git a/hw/dmx/glxProxy/Makefile.am b/hw/dmx/glxProxy/Makefile.am
index 2f4a3b7..1fbc8d7 100644
--- a/hw/dmx/glxProxy/Makefile.am
+++ b/hw/dmx/glxProxy/Makefile.am
@@ -32,7 +32,7 @@ libglxproxy_a_SOURCES = compsize.c \
                         unpack.h
 
 AM_CFLAGS = \
- \
+            $(DIX_CFLAGS) \
             -I$(top_srcdir)/hw/dmx \
             -I$(top_srcdir)/include \
             -I$(top_srcdir)/GL/include \
diff --git a/hw/dmx/input/Makefile.am b/hw/dmx/input/Makefile.am
index 326506e..da8de05 100644
--- a/hw/dmx/input/Makefile.am
+++ b/hw/dmx/input/Makefile.am
@@ -60,7 +60,7 @@ GLX_DEFS = @GL_CFLAGS@
 GLX_INCS = -I at MESA_SOURCE@/include
 endif	    
 
-AM_CFLAGS = \
+AM_CFLAGS = $(DIX_CFLAGS) \
             -I$(top_srcdir)/hw/dmx \
             -I$(top_srcdir)/hw/xfree86/common \
             $(GLX_INCS) \
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 72befea..b373242 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -22,7 +22,7 @@ DIST_SUBDIRS = common ddc dummylib i2c x
 
 bin_PROGRAMS = Xorg
 
-AM_CFLAGS = @XORG_CFLAGS@
+AM_CFLAGS = $(DIX_CFLAGS) @XORG_CFLAGS@
 INCLUDES = @XORG_INCS@ 
 
 Xorg_SOURCES = xorg.c
diff --git a/hw/xfree86/os-support/bsd/Makefile.am b/hw/xfree86/os-support/bsd/Makefile.am
index e456328..0992404 100644
--- a/hw/xfree86/os-support/bsd/Makefile.am
+++ b/hw/xfree86/os-support/bsd/Makefile.am
@@ -50,7 +50,7 @@ ARCH_SOURCES = \
 endif
 
 # FIXME: NetBSD Aperture defines (configure.ac)
-AM_CFLAGS = -DUSESTDRES $(XORG_CFLAGS)
+AM_CFLAGS = -DUSESTDRES $(XORG_CFLAGS) $(DIX_CFLAGS)
 
 INCLUDES = $(XORG_INCS)
 
diff --git a/hw/xfree86/os-support/bus/Makefile.am b/hw/xfree86/os-support/bus/Makefile.am
index c56f3d7..fba6e54 100644
--- a/hw/xfree86/os-support/bus/Makefile.am
+++ b/hw/xfree86/os-support/bus/Makefile.am
@@ -53,6 +53,6 @@ libbus_la_SOURCES = Pci.c Pci.h $(PCI_SO
 
 INCLUDES = $(XORG_INCS)
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(XORG_CFLAGS) $(DIX_CFLAGS)
 
 EXTRA_DIST = $(sdk_HEADERS)
diff --git a/hw/xfree86/os-support/hurd/Makefile.am b/hw/xfree86/os-support/hurd/Makefile.am
index b80fdde..731ff08 100644
--- a/hw/xfree86/os-support/hurd/Makefile.am
+++ b/hw/xfree86/os-support/hurd/Makefile.am
@@ -12,6 +12,6 @@ libhurd_la_SOURCES = hurd_bell.c hurd_in
 		$(srcdir)/../shared/kmod_noop.c \
 		$(srcdir)/../shared/agp_noop.c
 
-AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS)
+AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS) $(DIX_CFLAGS)
 
 INCLUDES = $(XORG_INCS)
diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am
index caf6007..9c4fa49 100644
--- a/hw/xfree86/os-support/linux/Makefile.am
+++ b/hw/xfree86/os-support/linux/Makefile.am
@@ -34,7 +34,7 @@ liblinux_la_SOURCES = lnx_init.c lnx_vid
                      $(APM_SRCS) \
                      $(PLATFORM_PCI_SUPPORT)
 
-AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS) $(PLATFORM_DEFINES)
+AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(DIX_CFLAGS) $(XORG_CFLAGS) $(PLATFORM_DEFINES)
 
 INCLUDES = $(XORG_INCS) $(PLATFORM_INCLUDES) -I/usr/include/drm # FIXME this last part is crack
 
diff --git a/hw/xfree86/os-support/misc/Makefile.am b/hw/xfree86/os-support/misc/Makefile.am
index 8bec350..65fbe92 100644
--- a/hw/xfree86/os-support/misc/Makefile.am
+++ b/hw/xfree86/os-support/misc/Makefile.am
@@ -18,6 +18,6 @@ libmisc_la_SOURCES = xf86_Util.c Delay.c
 
 INCLUDES = $(XORG_INCS)
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(XORG_CFLAGS) $(DIX_CFLAGS)
 
 EXTRA_DIST = $(I386_SRCS) $(PORTIO_SRCS) $(ILHACK_SRCS)
diff --git a/hw/xfree86/os-support/solaris/Makefile.am b/hw/xfree86/os-support/solaris/Makefile.am
index 291c329..57ec89e 100644
--- a/hw/xfree86/os-support/solaris/Makefile.am
+++ b/hw/xfree86/os-support/solaris/Makefile.am
@@ -30,7 +30,7 @@ nodist_libsolaris_la_SOURCES = $(SOLARIS
 sdk_HEADERS = agpgart.h
 nodist_sdk_HEADERS = solaris-$(SOLARIS_INOUT_ARCH).il
 
-AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS)
+AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS) $(DIX_CFLAGS)
 
 INCLUDES = $(XORG_INCS) 
 
diff --git a/hw/xgl/Makefile.am b/hw/xgl/Makefile.am
index 48a9825..965060c 100644
--- a/hw/xgl/Makefile.am
+++ b/hw/xgl/Makefile.am
@@ -19,7 +19,7 @@ SUBDIRS = 		\
 	$(XEGL_SUBDIRS)
 
 AM_CFLAGS = \
-	 \
+	 $(DIX_CFLAGS) \
 	-DHAVE_XGL_CONFIG_H \
 	-DHAVE_DIX_CONFIG_H \
 	-I$(top_srcdir)/GL/glx			\
diff --git a/hw/xgl/egl/Makefile.am b/hw/xgl/egl/Makefile.am
index ded4a15..5136e58 100644
--- a/hw/xgl/egl/Makefile.am
+++ b/hw/xgl/egl/Makefile.am
@@ -9,7 +9,7 @@ SUBDIRS =		  \
 	$(XGL_MODULE_DIRS)
 
 AM_CFLAGS = \
-	 \
+	$(DIX_CFLAGS) \
 	-DHAVE_XGL_CONFIG_H \
 	-DHAVE_DIX_CONFIG_H \
 	$(XEGLMODULES_CFLAGS)
diff --git a/hw/xgl/egl/module/Makefile.am b/hw/xgl/egl/module/Makefile.am
index 7ed2173..c84f85c 100644
--- a/hw/xgl/egl/module/Makefile.am
+++ b/hw/xgl/egl/module/Makefile.am
@@ -1,4 +1,5 @@
 AM_CFLAGS = \
+        $(DIX_CFLAGS) \
 	-I$(srcdir)/.. \
 	-I$(srcdir)/../.. \
 	$(XEGLMODULES_CFLAGS)
diff --git a/hw/xgl/glx/Makefile.am b/hw/xgl/glx/Makefile.am
index 10a831f..314c02e 100644
--- a/hw/xgl/glx/Makefile.am
+++ b/hw/xgl/glx/Makefile.am
@@ -15,7 +15,7 @@ AM_CFLAGS = \
 	-I$(top_srcdir)/GL/include \
 	-I at MESA_SOURCE@/include \
 	-I at MESA_SOURCE@/src/mesa/glapi \
-	 \
+	 $(DIX_CFLAGS) \
 	-DHAVE_XGL_CONFIG_H \
 	-DHAVE_DIX_CONFIG_H \
 	$(XGLXMODULES_CFLAGS)
diff --git a/hw/xgl/glx/module/Makefile.am b/hw/xgl/glx/module/Makefile.am
index 846942a..bd1c4b0 100644
--- a/hw/xgl/glx/module/Makefile.am
+++ b/hw/xgl/glx/module/Makefile.am
@@ -2,7 +2,7 @@ if GLX
 GLX_LIB = $(top_builddir)/hw/xgl/glxext/libxglglxext.la
 endif
 
-AM_CFLAGS = \
+AM_CFLAGS = $(DIX_CFLAGS) \
 	-I$(srcdir)/.. \
 	-I$(srcdir)/../.. \
 	$(XGLXMODULES_CFLAGS)
diff --git a/hw/xgl/glxext/Makefile.am b/hw/xgl/glxext/Makefile.am
index c400f36..98a9b13 100644
--- a/hw/xgl/glxext/Makefile.am
+++ b/hw/xgl/glxext/Makefile.am
@@ -1,7 +1,7 @@
 SUBDIRS = module
 
 AM_CFLAGS =		 \
-	 \
+	 $(DIX_CFLAGS) \
 	-DHAVE_XGL_CONFIG_H \
 	-DHAVE_DIX_CONFIG_H \
 	$(XGLMODULES_CFLAGS) \
diff --git a/hw/xgl/glxext/module/Makefile.am b/hw/xgl/glxext/module/Makefile.am
index 82c4211..4633f7f 100644
--- a/hw/xgl/glxext/module/Makefile.am
+++ b/hw/xgl/glxext/module/Makefile.am
@@ -1,5 +1,5 @@
 AM_CFLAGS = \
-	    \
+	$(DIX_CFLAGS) \
 	-DHAVE_XGL_CONFIG_H \
 	-DHAVE_DIX_CONFIG_H \
 	$(XGLMODULES_CFLAGS) \
diff --git a/hw/xwin/Makefile.am b/hw/xwin/Makefile.am
index dbbcb05..57e2010 100644
--- a/hw/xwin/Makefile.am
+++ b/hw/xwin/Makefile.am
@@ -161,7 +161,7 @@ CLEANFILES = $(BUILT_SOURCES)
 
 AM_YFLAGS = -d
 AM_LFLAGS = -i
-AM_CFLAGS = -DHAVE_XWIN_CONFIG_H \
+AM_CFLAGS = -DHAVE_XWIN_CONFIG_H $(DIX_CFLAGS) \
             $(XWINMODULES_CFLAGS)
 
 dist_man1_MANS = XWin.man XWinrc.man
diff-tree 5e946dd853a4ebc2722ae023429ce5797de3d7a6 (from 3d39c02fe6aaa602c52f1d4f0ea6cd3bd000cf9f)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Tue Nov 7 13:50:19 2006 -0500

    Bug #8937: Extension setup functions not called on server resets

diff --git a/mi/miinitext.c b/mi/miinitext.c
index f618595..cb34473 100644
--- a/mi/miinitext.c
+++ b/mi/miinitext.c
@@ -754,6 +754,16 @@ InitExtensions(argc, argv)
 	/* Sort the extensions according the init dependencies. */
 	LoaderSortExtensions();
 	listInitialised = TRUE;
+    } else {
+	/* Call the setup functions on subsequent server resets as well */
+	for (i = 0; ExtensionModuleList[i].name != NULL; i++) {
+	    ext = &ExtensionModuleList[i];
+	    if (ext->setupFunc != NULL &&
+		(ext->disablePtr == NULL ||
+		 (ext->disablePtr != NULL && !*ext->disablePtr))) {
+		(ext->setupFunc)();
+	    }
+	}
     }
 
     for (i = 0; ExtensionModuleList[i].name != NULL; i++) {
diff-tree 1dcda4f3c56214464c0b6123fea6daa69aae69fc (from c20d3bf7533da0bf26beaf7d8c359d18edbd70e8)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Nov 7 01:29:51 2006 -0800

    Avoid dereferencing sprite.screen when Xinerama is not running. (#8925)
    
    With Xinerama support built into the X server but not in use,
    sprite.screen is NULL and yet the SyntheticMotion
    macro would dereference it. Avoid that by just passing sprite.screen
    to PostSyntheticMotion which can then dereference it when Xinerama is
    enabled.
    
    Also, define PostSyntheticMotion in dixevents.h and include dixevents.h in
    getevents.c

diff --git a/dix/events.c b/dix/events.c
index 3b1a0aa..ce053b3 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -327,11 +327,10 @@ static CARD8 criticalEvents[32] =
 
 #ifdef PANORAMIX
 static void ConfineToShape(RegionPtr shape, int *px, int *py);
-extern void PostSyntheticMotion(int x, int y, int screenNum, int time);
 static void PostNewCursor(void);
 
 #define SyntheticMotion(x, y) \
-    PostSyntheticMotion(x, y, sprite.screen->myNum, \
+    PostSyntheticMotion(x, y, sprite.screen, \
                         syncEvents.playingEvents ? \
                           syncEvents.time.milliseconds : \
                           currentTime.milliseconds);
diff --git a/dix/getevents.c b/dix/getevents.c
index b19a73f..1d95028 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -38,6 +38,7 @@
 
 #include "dixstruct.h"
 #include "globals.h"
+#include "dixevents.h"
 
 #include "mipointer.h"
 
@@ -758,7 +759,7 @@ SwitchCorePointer(DeviceIntPtr pDev)
  * to shift the pointer to get it inside the new bounds.
  */
 void
-PostSyntheticMotion(int x, int y, int screenNum, unsigned long time)
+PostSyntheticMotion(int x, int y, ScreenPtr pScreen, unsigned long time)
 {
     xEvent xE;
 
@@ -767,8 +768,8 @@ PostSyntheticMotion(int x, int y, int sc
        will translate from sprite screen to screen 0 upon reentry
        to the DIX layer. */
     if (!noPanoramiXExtension) {
-        x += panoramiXdataPtr[0].x - panoramiXdataPtr[screenNum].x;
-        y += panoramiXdataPtr[0].y - panoramiXdataPtr[screenNum].y;
+        x += panoramiXdataPtr[0].x - panoramiXdataPtr[pScreen->myNum].x;
+        y += panoramiXdataPtr[0].y - panoramiXdataPtr[pScreen->myNum].y;
     }
 #endif
 
@@ -776,6 +777,7 @@ PostSyntheticMotion(int x, int y, int sc
     xE.u.u.type = MotionNotify;
     xE.u.keyButtonPointer.rootX = x;
     xE.u.keyButtonPointer.rootY = y;
+    xE.u.keyButtonPointer.time = time;
 
     (*inputInfo.pointer->public.processInputProc)(&xE, inputInfo.pointer, 1);
 }
diff --git a/include/dixevents.h b/include/dixevents.h
index 2a9458f..c78fb0e 100644
--- a/include/dixevents.h
+++ b/include/dixevents.h
@@ -102,4 +102,8 @@ extern int ProcUngrabButton(ClientPtr /*
 
 extern int ProcRecolorCursor(ClientPtr /* client */);
 
+#ifdef PANORAMIX
+extern void PostSyntheticMotion(int x, int y, ScreenPtr pScreen, unsigned long time);
+#endif
+
 #endif /* DIXEVENTS_H */
diff-tree c20d3bf7533da0bf26beaf7d8c359d18edbd70e8 (from parents)
Merge: 028bbdc0417173803695808ba9f48498519273a3 3d39c02fe6aaa602c52f1d4f0ea6cd3bd000cf9f
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Nov 7 01:21:28 2006 -0800

    Merge branch 'origin' into randr-1.2

diff-tree 3d39c02fe6aaa602c52f1d4f0ea6cd3bd000cf9f (from 75fe0670eb1f71144246f1c20759d58788bbee00)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Mon Nov 6 21:25:52 2006 -0500

    More work on Bug #8875: revert previous fix and try using client argument
    instead of serverClient.  Also don't use totalClientSize as it is not
    initialized until after the first call to InitClient.

diff --git a/Xext/security.c b/Xext/security.c
index c5181ed..ac76279 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -1122,10 +1122,8 @@ CALLBACK(SecurityClientStateCallback)
     switch (client->clientState)
     {
     case ClientStateInitial:
-	if (client == serverClient) {
-	    TRUSTLEVEL(serverClient) = XSecurityClientTrusted;
-	    AUTHID(serverClient) = None;
-	}
+	TRUSTLEVEL(client) = XSecurityClientTrusted;
+	AUTHID(client) = None;
 	break;
 
     case ClientStateRunning:
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 2e7fa79..d8e3ae7 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -3682,7 +3682,6 @@ extern unsigned totalClientSize;
 
 void InitClient(ClientPtr client, int i, pointer ospriv)
 {
-    bzero(client, totalClientSize);
     client->index = i;
     client->sequence = 0; 
     client->clientAsMask = ((Mask)i) << CLIENTOFFSET;
diff-tree 75fe0670eb1f71144246f1c20759d58788bbee00 (from 0539d9cf2423fc0bed6f5c413beba3080f8abd85)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Mon Nov 6 15:30:25 2006 -0500

    whitespace adjust

diff --git a/Xext/security.c b/Xext/security.c
index 2a73b60..c5181ed 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -1128,7 +1128,7 @@ CALLBACK(SecurityClientStateCallback)
 	}
 	break;
 
-	case ClientStateRunning:
+    case ClientStateRunning:
 	{ 
 	    XID authId = AuthorizationIDOfClient(client);
 	    SecurityAuthorizationPtr pAuth;
@@ -1148,8 +1148,8 @@ CALLBACK(SecurityClientStateCallback)
 	    }
 	    break;
 	}
-	case ClientStateGone:
-	case ClientStateRetained: /* client disconnected */
+    case ClientStateGone:
+    case ClientStateRetained: /* client disconnected */
 	{
 	    SecurityAuthorizationPtr pAuth;
 
@@ -1169,7 +1169,7 @@ CALLBACK(SecurityClientStateCallback)
 	    }	    
 	    break;
 	}
-	default: break; 
+    default: break; 
     }
 } /* SecurityClientStateCallback */
 
diff-tree 0539d9cf2423fc0bed6f5c413beba3080f8abd85 (from aa0261a98e9d5b1349b33e2639bd83c556dd4000)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Mon Nov 6 15:29:17 2006 -0500

    Bug #8875: Security extension causes Xorg to core dump on server reset

diff --git a/Xext/security.c b/Xext/security.c
index 54a2b3e..2a73b60 100644
--- a/Xext/security.c
+++ b/Xext/security.c
@@ -1122,8 +1122,10 @@ CALLBACK(SecurityClientStateCallback)
     switch (client->clientState)
     {
     case ClientStateInitial:
-	TRUSTLEVEL(serverClient) = XSecurityClientTrusted;
-	AUTHID(serverClient) = None;
+	if (client == serverClient) {
+	    TRUSTLEVEL(serverClient) = XSecurityClientTrusted;
+	    AUTHID(serverClient) = None;
+	}
 	break;
 
 	case ClientStateRunning:
diff-tree aa0261a98e9d5b1349b33e2639bd83c556dd4000 (from 6b2c65fdd169037c6ede250d4a8fec3d29a080ae)
Author: Juliusz Chroboczek <jch at pps.jussieu.fr>
Date:   Mon Nov 6 02:29:49 2006 +0100

    Improve vm86 error handling in Xvesa.

diff --git a/hw/kdrive/vesa/vm86.c b/hw/kdrive/vesa/vm86.c
index c4aadbd..d09a36d 100644
--- a/hw/kdrive/vesa/vm86.c
+++ b/hw/kdrive/vesa/vm86.c
@@ -235,13 +235,9 @@ Vm86DoInterrupt(Vm86InfoPtr vi, int num)
     OsBlockSignals ();
     code = vm86_loop(vi);
     OsReleaseSignals ();
-    if(code < 0) {
-	ErrorF("vm86 failed (errno %d)\n", errno);
+    if(code != 0)
 	return -1;
-    } else if(code != 0) {
-	ErrorF("vm86 returned 0x%04X\n", code);
-	return -1;
-    } else
+    else
 	return 0;
 }
 
@@ -269,14 +265,10 @@ Vm86DoPOST(Vm86InfoPtr vi)
     OsBlockSignals ();
     code = vm86_loop(vi);
     OsReleaseSignals ();
-    if(code < 0) {
-	ErrorF("vm86 failed (errno %d)\n", errno);
-	return -1;
-    } else if(code != 0) {
-	ErrorF("vm86 returned 0x%04X\n", code);
+    if(code != 0)
 	return -1;
-    } else
-	return 0;
+    else
+        return 0;
 }
 
 #define DEBUG_VBE 0
@@ -573,8 +565,17 @@ vm86_loop(Vm86InfoPtr vi)
             Vm86Debug(vi);
             return -1;
         default:
-            ErrorF("Unexpected result code 0x%X from vm86\n", code);
-            Vm86Debug(vi);
+            if(code < 0) {
+                if(errno == ENOSYS) {
+                    ErrorF("No vm86 support.  Are you running on AMD64?\n");
+                } else {
+                    ErrorF("vm86 failed (errno = %d).\n", errno);
+                    Vm86Debug(vi);
+                }
+            } else {
+                ErrorF("Unexpected result code 0x%X from vm86\n", code);
+                Vm86Debug(vi);
+            }
             return -1;
         }
     }
diff-tree 6b2c65fdd169037c6ede250d4a8fec3d29a080ae (from 8deaaa312ad7f9b492a2ae8ad17d74650112c25c)
Author: Juliusz Chroboczek <jch at pps.jussieu.fr>
Date:   Mon Nov 6 00:30:09 2006 +0100

    Fix typo in Xvesa: incorrect reporting of DAC capabilities.

diff --git a/hw/kdrive/vesa/vbe.c b/hw/kdrive/vesa/vbe.c
index 5fbd8ab..08f0b03 100644
--- a/hw/kdrive/vesa/vbe.c
+++ b/hw/kdrive/vesa/vbe.c
@@ -101,7 +101,7 @@ VbeReportVib(Vm86InfoPtr vi, VbeInfoBloc
     }
     ErrorF(")\n");
     ErrorF("DAC is %s, controller is %sVGA compatible%s\n",
-           (vib->Capabilities[0]&1)?"fixed":"switchable",
+           (vib->Capabilities[0]&1)?"switchable":"fixed",
            (vib->Capabilities[0]&2)?"not ":"",
            (vib->Capabilities[0]&3)?", RAMDAC causes snow":"");
     ErrorF("Total memory: %lu kilobytes\n", 64L*vib->TotalMemory);
diff-tree 028bbdc0417173803695808ba9f48498519273a3 (from parents)
Merge: 50504c68e1d407232cf83465981b235e542ef31f 8deaaa312ad7f9b492a2ae8ad17d74650112c25c
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sat Nov 4 17:46:26 2006 -0800

    Merge master back to randr-1.2

diff --cc hw/xfree86/int10/Makefile.am
index 868954f,3a18afb..28e20d5
@@@ -13,8 -13,12 +13,12 @@@
  	xf86int10.c \
  	xf86int10module.c
  
+ if I386_VIDEO
+ I386_VIDEO_CFLAGS = -D_PC
+ endif
+ 
  if INT10_VM86
- AM_CFLAGS = -D_PC -D_VM86_LINUX $(DIX_CFLAGS) $(XORG_CFLAGS) $(EXTRA_CFLAGS)
 -AM_CFLAGS = $(I386_VIDEO_CFLAGS) -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS)
++AM_CFLAGS = $(I386_VIDEO_CFLAGS) -D_VM86_LINUX $(DIX_CFLAGS) $(XORG_CFLAGS) $(EXTRA_CFLAGS)
  INCLUDES = $(XORG_INCS)
  libint10_la_SOURCES = \
  	$(COMMON_SOURCES) \
@@@ -23,7 -27,8 +27,8 @@@
  endif
  
  if INT10_X86EMU
- AM_CFLAGS = -D_X86EMU -DNO_SYS_HEADERS -D_PC $(DIX_CFLAGS) $(XORG_CFLAGS) $(EXTRA_CFLAGS)
+ AM_CFLAGS = $(I386_VIDEO_CFLAGS) -D_X86EMU -DNO_SYS_HEADERS \
 -           $(XORG_CFLAGS) $(EXTRA_CFLAGS)
++           $(XORG_CFLAGS) $(EXTRA_CFLAGS) $(DIX_CFLAGS)
  INCLUDES = $(XORG_INCS) -I$(srcdir)/../x86emu
  libint10_la_SOURCES = \
  	$(COMMON_SOURCES) \
@@@ -33,7 -38,7 +38,7 @@@
  endif
  
  if INT10_STUB
- AM_CFLAGS = -D_PC -D_VM86_LINUX $(DIX_CFLAGS) $(XORG_CFLAGS) $(EXTRA_CFLAGS)
 -AM_CFLAGS = $(I386_VIDEO_CFLAGS) -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS)
++AM_CFLAGS = $(I386_VIDEO_CFLAGS) -D_VM86_LINUX $(DIX_CFLAGS) $(XORG_CFLAGS) $(EXTRA_CFLAGS)
  libint10_la_SOURCES = stub.c xf86int10module.c
  endif
  
diff-tree 50504c68e1d407232cf83465981b235e542ef31f (from parents)
Merge: 8b87ce19741753eafbd99e7093bc3dea8f26e838 cde8806c2930788ba8076e94651d391e45f3ccdb
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sat Nov 4 17:43:19 2006 -0800

    Merge branch 'randr-1.2-origin' into randr-1.2

diff-tree 8b87ce19741753eafbd99e7093bc3dea8f26e838 (from 7ffbe9d232e3a4621a204448d67e434736465cbe)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sat Nov 4 17:41:25 2006 -0800

    Allow X server to build against libdrm 2.1

diff --git a/configure.ac b/configure.ac
index 195211c..cb194ae 100644
--- a/configure.ac
+++ b/configure.ac
@@ -619,6 +619,9 @@ if test "x$DRI" = xyes; then
 	PKG_CHECK_MODULES([DRIPROTO], [xf86driproto])
 	PKG_CHECK_MODULES([LIBDRM], [libdrm])
 	PKG_CHECK_MODULES([GL], [glproto >= 1.4.1])
+	PKG_CHECK_EXISTS(libdrm >= 2.2.0,
+			 [AC_DEFINE([HAVE_LIBDRM_2_2], 1,
+			 [Has version 2.2 (or newer) of the drm library])])
 	AC_SUBST(DRIPROTO_CFLAGS)
 	AC_SUBST(LIBDRM_CFLAGS)
 	AC_SUBST(GL_CFLAGS)
diff --git a/hw/xfree86/os-support/drm/xf86drm.c b/hw/xfree86/os-support/drm/xf86drm.c
index e990e28..8bcccee 100644
--- a/hw/xfree86/os-support/drm/xf86drm.c
+++ b/hw/xfree86/os-support/drm/xf86drm.c
@@ -2307,6 +2307,7 @@ int drmRemoveSIGIOHandler(int fd)
     return xf86RemoveSIGIOHandler(fd);
 }
 
+#if HAVE_LIBDRM_2_2
 /*
  * Valid flags are 
  * DRM_FENCE_FLAG_EMIT
@@ -3260,3 +3261,4 @@ int drmMMUnlock(int fd, unsigned memType
     
     return ret;	
 }
+#endif /* HAVE_LIBDRM_2_2 */
diff --git a/hw/xfree86/os-support/xf86drm.h b/hw/xfree86/os-support/xf86drm.h
index 18e4564..1d93f6f 100644
--- a/hw/xfree86/os-support/xf86drm.h
+++ b/hw/xfree86/os-support/xf86drm.h
@@ -36,7 +36,9 @@
 #define _XF86DRM_H_
 
 #include <drm.h>
+#if HAVE_LIBDRM_2_2
 #include <xf86mm.h>
+#endif
 
 				/* Defaults, if nothing set in xf86config */
 #define DRM_DEV_UID	 0
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 35700e4..84d693f 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -127,6 +127,9 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* Define to 1 if you have version 2.2 (or newer) of the drm library */
+#undef HAVE_LIBDRM_2_2
+
 /* Define to 1 if you have the `m' library (-lm). */
 #undef HAVE_LIBM
 
diff-tree 7ffbe9d232e3a4621a204448d67e434736465cbe (from 2db62bce0725ba2d88cbe40fc440b6bda45046f3)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sat Nov 4 17:41:09 2006 -0800

    Add DIX_CFLAGS to hw/vfb/Makefile.am

diff --git a/hw/vfb/Makefile.am b/hw/vfb/Makefile.am
index baab5ca..2a0151f 100644
--- a/hw/vfb/Makefile.am
+++ b/hw/vfb/Makefile.am
@@ -21,8 +21,8 @@ Xvfb_LDFLAGS =
 AM_CFLAGS = -DHAVE_DIX_CONFIG_H \
             -DNO_HW_ONLY_EXTS \
             -DNO_MODULE_EXTS \
- \
-            $(XVFBMODULES_CFLAGS)
+            $(XVFBMODULES_CFLAGS) \
+	    $(DIX_CFLAGS)
 
 # Man page
 include $(top_srcdir)/cpprules.in
diff-tree 2db62bce0725ba2d88cbe40fc440b6bda45046f3 (from 543b397277d1f03b8091e44812010abcd5d80102)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sat Nov 4 17:40:34 2006 -0800

    Define fbHasVisualTypes in fb.h as it is exported

diff --git a/fb/fb.h b/fb/fb.h
index de0b3a8..e605078 100644
--- a/fb/fb.h
+++ b/fb/fb.h
@@ -1342,6 +1342,9 @@ void
 fbClearVisualTypes(void);
 
 Bool
+fbHasVisualTypes (int depth);
+
+Bool
 fbSetVisualTypes (int depth, int visuals, int bitsPerRGB);
 
 Bool
diff-tree 8deaaa312ad7f9b492a2ae8ad17d74650112c25c (from f72927d26cd112d321f7bf187df3c740b3129d22)
Author: Bernhard Rosenkraenzer <bero at arklinux.org>
Date:   Sat Nov 4 18:59:39 2006 +0200

    automake: avoid use of reserved _SOURCES keyword (bug #8866)
    Avoid using _SOURCES unless we're directly referencing a program or
    library to be built; use _SRCS instead.  Shuts automake 1.10 up.

diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am
index 9e09fb6..caf6007 100644
--- a/hw/xfree86/os-support/linux/Makefile.am
+++ b/hw/xfree86/os-support/linux/Makefile.am
@@ -12,12 +12,12 @@ PLATFORM_PCI_SUPPORT = lnx_ev56.c \
 endif
 
 if LNXACPI
-ACPI_SOURCES = lnx_acpi.c lnx_apm.c
+ACPI_SRCS = lnx_acpi.c lnx_apm.c
 XORG_CFLAGS += -DHAVE_ACPI
 endif
 
 if LNXAPM
-APM_SOURCES = lnx_apm.c
+APM_SRCS = lnx_apm.c
 XORG_CFLAGS += -DHAVE_APM
 endif
 
@@ -30,8 +30,8 @@ liblinux_la_SOURCES = lnx_init.c lnx_vid
 		     $(srcdir)/../shared/sigio.c \
                      $(srcdir)/../shared/stdResource.c \
 		     $(srcdir)/../shared/libc_wrapper.c \
-                     $(ACPI_SOURCES) \
-                     $(APM_SOURCES) \
+                     $(ACPI_SRCS) \
+                     $(APM_SRCS) \
                      $(PLATFORM_PCI_SUPPORT)
 
 AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS) $(PLATFORM_DEFINES)
@@ -39,12 +39,12 @@ AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC 
 INCLUDES = $(XORG_INCS) $(PLATFORM_INCLUDES) -I/usr/include/drm # FIXME this last part is crack
 
 # FIXME: These need to be added to the build
-LNX_EXTRA_SOURCES = \
+LNX_EXTRA_SRCS = \
 	lnx_font.c \
 	lnx_jstk.c \
 	lnxResource.c
 
 EXTRA_DIST = \
-	$(LNX_EXTRA_SOURCES) \
+	$(LNX_EXTRA_SRCS) \
 	lnx.h \
 	$(srcdir)/../shared/xf86Axp.h
diff --git a/hw/xfree86/os-support/misc/Makefile.am b/hw/xfree86/os-support/misc/Makefile.am
index f546e1a..8bec350 100644
--- a/hw/xfree86/os-support/misc/Makefile.am
+++ b/hw/xfree86/os-support/misc/Makefile.am
@@ -1,18 +1,18 @@
 # FIXME: Add the *.S files to build when applicable
-I386_SOURCES = BUSmemcpy.S IODelay.S SlowBcopy.S
-OTHER_SOURCES = BUSmemcpy.c IODelay.c SlowBcopy.c
+I386_SRCS = BUSmemcpy.S IODelay.S SlowBcopy.S
+OTHER_SRCS = BUSmemcpy.c IODelay.c SlowBcopy.c
 
-ARCH_SOURCES = $(OTHER_SOURCES)
+ARCH_SRCS = $(OTHER_SRCS)
 
 # FIXME: Add to the build (NeedPortIO)
-PORTIO_SOURCES = PortIO.S
+PORTIO_SRCS = PortIO.S
 
 # FIXME: Add to the build (if HasGcc || HasGcc2)
-ILHACK_SOURCES = xf86_IlHack.c
+ILHACK_SRCS = xf86_IlHack.c
 
 noinst_LTLIBRARIES = libmisc.la
 
-libmisc_la_SOURCES = xf86_Util.c Delay.c $(ARCH_SOURCES)
+libmisc_la_SOURCES = xf86_Util.c Delay.c $(ARCH_SRCS)
 
 #AM_LDFLAGS = -r
 
@@ -20,4 +20,4 @@ INCLUDES = $(XORG_INCS)
 
 AM_CFLAGS = $(XORG_CFLAGS)
 
-EXTRA_DIST = $(I386_SOURCES) $(PORTIO_SOURCES) $(ILHACK_SOURCES)
+EXTRA_DIST = $(I386_SRCS) $(PORTIO_SRCS) $(ILHACK_SRCS)
diff --git a/os/Makefile.am b/os/Makefile.am
index dcfe80a..7381797 100644
--- a/os/Makefile.am
+++ b/os/Makefile.am
@@ -3,14 +3,14 @@ noinst_LTLIBRARIES = libos.la libcwrappe
 AM_CFLAGS = $(DIX_CFLAGS)
 
 # FIXME: Add support for these in configure.ac
-K5AUTH_SOURCES = k5auth.c
-SECURERPC_SOURCES = rpcauth.c
-INTERNALMALLOC_SOURCES = xalloc.c
-
-XCSECURITY_SOURCES = secauth.c
-XDMCP_SOURCES = xdmcp.c
-STRLCAT_SOURCES = strlcat.c strlcpy.c
-XORG_SOURCES = log.c
+K5AUTH_SRCS = k5auth.c
+SECURERPC_SRCS = rpcauth.c
+INTERNALMALLOC_SRCS = xalloc.c
+
+XCSECURITY_SRCS = secauth.c
+XDMCP_SRCS = xdmcp.c
+STRLCAT_SRCS = strlcat.c strlcpy.c
+XORG_SRCS = log.c
 
 libos_la_SOURCES = 	\
 	WaitFor.c	\
@@ -27,18 +27,18 @@ libos_la_SOURCES = 	\
 	xdmauth.c	\
 	xstrans.c	\
 	xprintf.c	\
-	$(XORG_SOURCES)
+	$(XORG_SRCS)
 
 if XCSECURITY
-libos_la_SOURCES += $(XCSECURITY_SOURCES)
+libos_la_SOURCES += $(XCSECURITY_SRCS)
 endif
 
 if XDMCP
-libos_la_SOURCES += $(XDMCP_SOURCES)
+libos_la_SOURCES += $(XDMCP_SRCS)
 endif
 
 if NEED_STRLCAT
-libos_la_SOURCES += $(STRLCAT_SOURCES)
+libos_la_SOURCES += $(STRLCAT_SRCS)
 endif
 
 libcwrapper_la_SOURCES = \
@@ -48,8 +48,8 @@ libcwrapper_la_CFLAGS = \
 	-I$(top_srcdir)/hw/xfree86/os-support \
 	$(AM_CFLAGS)
 
-EXTRA_DIST = $(K5AUTH_SOURCES) $(SECURERPC_SOURCES) $(INTERNALMALLOC_SOURCES) \
-     $(XCSECURITY_SOURCES) $(XDMCP_SOURCES) $(LBX_SOURCES) $(STRLCAT_SOURCES)
+EXTRA_DIST = $(K5AUTH_SRCS) $(SECURERPC_SRCS) $(INTERNALMALLOC_SRCS) \
+     $(XCSECURITY_SRCS) $(XDMCP_SRCS) $(STRLCAT_SRCS)
 
 if XSERVER_DTRACE
 # Generate dtrace object code for probes in libos & libdix
diff-tree f72927d26cd112d321f7bf187df3c740b3129d22 (from 0273610578485564c3c0be11b336b6554cc31b43)
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Sat Nov 4 19:00:57 2006 +0200

    xfree86/hurd: remove OsMouseProc (bug #5613)
    Remove OsMouseProc, let the mouse driver deal with it.

diff --git a/hw/xfree86/os-support/hurd/hurd_mouse.c b/hw/xfree86/os-support/hurd/hurd_mouse.c
index e7a2da8..ccc08a2 100644
--- a/hw/xfree86/os-support/hurd/hurd_mouse.c
+++ b/hw/xfree86/os-support/hurd/hurd_mouse.c
@@ -77,85 +77,6 @@ typedef struct {
 #define NUMEVENTS	64
 
 /*
- * OsMouseProc --
- *      Handle the initialization, etc. of a mouse
- */
-static int
-OsMouseProc(DeviceIntPtr pPointer, int what)
-{
-    InputInfoPtr pInfo;
-    MouseDevPtr pMse;
-    unsigned char map[MSE_MAXBUTTONS + 1];
-    int nbuttons;
-
-    pInfo = pPointer->public.devicePrivate;
-    pMse = pInfo->private;
-    pMse->device = pPointer;
-
-    switch (what) {
-    case DEVICE_INIT: 
-	pPointer->public.on = FALSE;
-
-	for (nbuttons = 0; nbuttons < MSE_MAXBUTTONS; ++nbuttons)
-	    map[nbuttons + 1] = nbuttons + 1;
-
-	InitPointerDeviceStruct((DevicePtr)pPointer, 
-				map, 
-				min(pMse->buttons, MSE_MAXBUTTONS),
-				miPointerGetMotionEvents, 
-				pMse->Ctrl,
-				miPointerGetMotionBufferSize());
-
-	/* X valuator */
-	xf86InitValuatorAxisStruct(pPointer, 0, 0, -1, 1, 0, 1);
-	xf86InitValuatorDefaults(pPointer, 0);
-	/* Y valuator */
-	xf86InitValuatorAxisStruct(pPointer, 1, 0, -1, 1, 0, 1);
-	xf86InitValuatorDefaults(pPointer, 1);
-	xf86MotionHistoryAllocate(pInfo);
-	break;
-
-    case DEVICE_ON:
-	pInfo->fd = xf86OpenSerial(pInfo->options);
-	if (pInfo->fd == -1)
-	    xf86Msg(X_WARNING, "%s: cannot open input device\n", pInfo->name);
-	else {
-	    pMse->buffer = XisbNew(pInfo->fd,
-				   NUMEVENTS * sizeof(kd_event));
-	    if (!pMse->buffer) {
-		xfree(pMse);
-		xf86CloseSerial(pInfo->fd);
-		pInfo->fd = -1;
-	    } else {
-		xf86FlushInput(pInfo->fd);
-		AddEnabledDevice(pInfo->fd);
-	    }
-	}
-	pMse->lastButtons = 0;
-	pMse->lastMappedButtons = 0;
-	pMse->emulateState = 0;
-	pPointer->public.on = TRUE;
-	break;
-
-    case DEVICE_OFF:
-    case DEVICE_CLOSE:
-	if (pInfo->fd != -1) {
-	    RemoveEnabledDevice(pInfo->fd);
-	    if (pMse->buffer) {
-		XisbFree(pMse->buffer);
-		pMse->buffer = NULL;
-	    }
-	    xf86CloseSerial(pInfo->fd);
-	    pInfo->fd = -1;
-	}
-	pPointer->public.on = FALSE;
-	usleep(300000);
-	break;
-    }
-    return Success;
-}
-
-/*
  * OsMouseReadInput --
  *      Get some events from our queue.  Process all outstanding events now.
  */
@@ -240,7 +161,6 @@ OsMousePreInit(InputInfoPtr pInfo, const
     pMse->CommonOptions(pInfo);
 
     /* Setup the local procs. */
-    pInfo->device_control = OsMouseProc;
     pInfo->read_input = OsMouseReadInput;
     
     pInfo->flags |= XI86_CONFIGURED;
diff-tree 0273610578485564c3c0be11b336b6554cc31b43 (from ade4bf09076d13dbf3549c0a2d987a0afe76d5c1)
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Sat Nov 4 19:02:04 2006 +0200

    xfree86/hurd: add bell support, remove SERVER/LOADER defines (bug #5613)
    Add no-op bell ringing support, and remove obsolete @SERVER_DEFINES@ and
    @LOADER_DEFINES@ from CFLAGS.

diff --git a/hw/xfree86/os-support/hurd/Makefile.am b/hw/xfree86/os-support/hurd/Makefile.am
index a050876..b80fdde 100644
--- a/hw/xfree86/os-support/hurd/Makefile.am
+++ b/hw/xfree86/os-support/hurd/Makefile.am
@@ -1,6 +1,6 @@
 noinst_LTLIBRARIES = libhurd.la
 
-libhurd_la_SOURCES = hurd_init.c hurd_mmap.c \
+libhurd_la_SOURCES = hurd_bell.c hurd_init.c hurd_mmap.c \
 		hurd_mouse.c hurd_video.c \
 		$(srcdir)/../shared/VTsw_noop.c \
 		$(srcdir)/../shared/posix_tty.c \
@@ -12,6 +12,6 @@ libhurd_la_SOURCES = hurd_init.c hurd_mm
 		$(srcdir)/../shared/kmod_noop.c \
 		$(srcdir)/../shared/agp_noop.c
 
-AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS) @SERVER_DEFINES@ @LOADER_DEFINES@
+AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS)
 
 INCLUDES = $(XORG_INCS)
diff --git a/hw/xfree86/os-support/hurd/hurd_bell.c b/hw/xfree86/os-support/hurd/hurd_bell.c
new file mode 100644
index 0000000..2726611
--- /dev/null
+++ b/hw/xfree86/os-support/hurd/hurd_bell.c
@@ -0,0 +1,35 @@
+/*
+ * Copyright © 2006 Daniel Stone
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and that
+ * both that this copyright notice and this permission notice appear in
+ * supporting electronic documentation.
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR AUTHORS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Daniel Stone <daniel at fooishbar.org>
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include "xf86.h"
+#include "xf86Priv.h"
+
+_X_EXPORT void
+xf86OSRingBell(int loudness, int pitch, int duration)
+{
+    return;
+}
diff-tree ade4bf09076d13dbf3549c0a2d987a0afe76d5c1 (from 412e93349e1656c9650115328af4be0e59a66f74)
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Sat Nov 4 19:03:13 2006 +0200

    mesa/indirect: include byteswap.h on GNU userland (bug #5613)
    Include byteswap.h on all GNU-userland systems (including with the Hurd
    and FreeBSD kernels), not just Linux.

diff --git a/GL/glx/indirect_dispatch_swap.c b/GL/glx/indirect_dispatch_swap.c
index 9c58ef1..1d45676 100644
--- a/GL/glx/indirect_dispatch_swap.c
+++ b/GL/glx/indirect_dispatch_swap.c
@@ -28,7 +28,7 @@
 #include <X11/Xmd.h>
 #include <GL/gl.h>
 #include <GL/glxproto.h>
-#ifdef __linux__
+#if defined(__linux__) || defined(__GNU__)
 #include <byteswap.h>
 #elif defined(__OpenBSD__)
 #include <sys/endian.h>
diff --git a/GL/glx/indirect_reqsize.c b/GL/glx/indirect_reqsize.c
index 3906bd1..1c332da 100644
--- a/GL/glx/indirect_reqsize.c
+++ b/GL/glx/indirect_reqsize.c
@@ -31,7 +31,7 @@
 #include "indirect_size.h"
 #include "indirect_reqsize.h"
 
-#if defined(linux)
+#if defined(__linux__) || defined(__GNU__)
 #  include <byteswap.h>
 #  define SWAP_32(v)  do { (v) = bswap_32(v); } while(0)
 #else
diff --git a/GL/glx/indirect_util.c b/GL/glx/indirect_util.c
index 93f1484..2d64f33 100644
--- a/GL/glx/indirect_util.c
+++ b/GL/glx/indirect_util.c
@@ -28,7 +28,7 @@
 #include <X11/Xmd.h>
 #include <GL/gl.h>
 #include <GL/glxproto.h>
-#ifdef __linux__
+#if defined(__linux__) || defined(__GNU__)
 #include <byteswap.h>
 #elif defined(__OpenBSD__)
 #include <sys/endian.h>
diff-tree 412e93349e1656c9650115328af4be0e59a66f74 (from 97fd471a627be185bee8cda3f709cfccea3fa12d)
Author: Samuel Thibault <samuel.thibault at ens-lyon.org>
Date:   Sat Nov 4 19:05:02 2006 +0200

    kdrive: make building of Linux support conditional (bug #5613)
    Only try to build Linux support on Linux.  We should probably disable all
    OS-dependent DDXes if we don't have a workable OS (and only build
    Xephyr/Xfake), but that's future work.

diff --git a/configure.ac b/configure.ac
index c23bf50..6bfa74c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1625,7 +1625,12 @@ if test "$KDRIVE" = yes; then
     #    $MIEXT_SHADOW_LIB $XPSTUBS_LIB"
     KDRIVE_PURE_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $OS_LIB"
     KDRIVE_LIB='$(top_builddir)/hw/kdrive/src/libkdrive.a'
-    KDRIVE_OS_LIB='$(top_builddir)/hw/kdrive/linux/liblinux.a'
+    case $host_os in
+	*linux*)
+	    KDRIVE_OS_LIB='$(top_builddir)/hw/kdrive/linux/liblinux.a'
+            KDRIVELINUX=yes
+	    ;;
+    esac
     KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.a'
     KDRIVE_LIBS="$XSERVERLIBS_LIBS $DIX_LIB $CONFIG_LIB $KDRIVE_LIB $TSLIB_LIBS $KDRIVE_OS_LIB $KDRIVE_PURE_LIBS $KDRIVE_STUB_LIB"
 
@@ -1653,6 +1658,7 @@ AC_SUBST([KDRIVE_PURE_INCS])
 AC_SUBST([KDRIVE_CFLAGS])
 AC_SUBST([KDRIVE_PURE_LIBS])
 AC_SUBST([KDRIVE_LIBS])
+AM_CONDITIONAL(KDRIVELINUX, [test "x$KDRIVELINUX" = xyes])
 AM_CONDITIONAL(TSLIB, [test "x$HAVE_TSLIB" = xyes])
 AM_CONDITIONAL(H3600_TS, false)
 AM_CONDITIONAL(KDRIVEVESA, [test "x$KDRIVEVESA" = xyes])
diff --git a/hw/kdrive/Makefile.am b/hw/kdrive/Makefile.am
index fa1dba9..e078049 100644
--- a/hw/kdrive/Makefile.am
+++ b/hw/kdrive/Makefile.am
@@ -19,9 +19,13 @@ if XEPHYR
 XEPHYR_SUBDIRS = ephyr
 endif
 
+if KDRIVELINUX
+LINUX_SUBDIRS = linux
+endif
+
 SUBDIRS =			\
 	src			\
-	linux			\
+	$(LINUX_SUBDIRS)	\
 	$(XSDL_SUBDIRS)		\
 	$(FBDEV_SUBDIRS)	\
 	$(VESA_SUBDIRS)		\
diff-tree cde8806c2930788ba8076e94651d391e45f3ccdb (from 4056e6e79a4e37101d298ae29139c83d3816368b)
Author: Eric Anholt <eric at anholt.net>
Date:   Fri Nov 3 16:36:34 2006 -0800

    Don't bump the refcnt if the new mode is NULL.

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index c40dac1..76d0b6b 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -174,7 +174,8 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	if (crtc->mode)
 	    RRModeDestroy (crtc->mode);
 	crtc->mode = mode;
-	mode->refcnt++;
+	if (mode != NULL)
+	    mode->refcnt++;
 	RRCrtcChanged (crtc, TRUE);
     }
     if (x != crtc->x)
diff-tree 97fd471a627be185bee8cda3f709cfccea3fa12d (from 22ee2e4e1f1d9fd9ca9f25c9bf25370034b771d4)
Author: Aaron Plattner <aplattner at nvidia.com>
Date:   Fri Oct 27 12:36:56 2006 -0700

    Fix standard VESA modes.
    
    The built-in mode timings were off slightly for the 640x480 at 60, 640x480 at 72,
    and 1024x768 at 75 modes.

diff --git a/hw/xfree86/common/vesamodes b/hw/xfree86/common/vesamodes
index 851643f..2bc8862 100644
--- a/hw/xfree86/common/vesamodes
+++ b/hw/xfree86/common/vesamodes
@@ -16,10 +16,10 @@ ModeLine "640x400"    31.5  640  672  73
 ModeLine "720x400"    35.5  720  756  828  936    400  401  404  446 -hsync +vsync
 
 # 640x480 @ 60Hz (Industry standard) hsync: 31.5kHz
-ModeLine "640x480"    25.2  640  656  752  800    480  490  492  525 -hsync -vsync
+ModeLine "640x480"    25.175 640  656  752  800    480  490  492  525 -hsync -vsync
 
 # 640x480 @ 72Hz (VESA) hsync: 37.9kHz
-ModeLine "640x480"    31.5  640  664  704  832    480  489  491  520 -hsync -vsync
+ModeLine "640x480"    31.5  640  664  704  832    480  489  492  520 -hsync -vsync
 
 # 640x480 @ 75Hz (VESA) hsync: 37.5kHz
 ModeLine "640x480"    31.5  640  656  720  840    480  481  484  500 -hsync -vsync
@@ -52,7 +52,7 @@ ModeLine "1024x768"   65.0 1024 1048 118
 ModeLine "1024x768"   75.0 1024 1048 1184 1328    768  771  777  806 -hsync -vsync
 
 # 1024x768 @ 75Hz (VESA) hsync: 60.0kHz
-ModeLine "1024x768"   78.8 1024 1040 1136 1312    768  769  772  800 +hsync +vsync
+ModeLine "1024x768"   78.75 1024 1040 1136 1312    768  769  772  800 +hsync +vsync
 
 # 1024x768 @ 85Hz (VESA) hsync: 68.7kHz
 ModeLine "1024x768"   94.5 1024 1072 1168 1376    768  769  772  808 +hsync +vsync
diff-tree 22ee2e4e1f1d9fd9ca9f25c9bf25370034b771d4 (from parents)
Merge: 49a26681b2bdd95ed65c425f1fa1441d2f092a6e bd0c829654903ca45543dfa59cda967c4fafd8ac
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Fri Nov 3 12:54:56 2006 -0800

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver

diff-tree 49a26681b2bdd95ed65c425f1fa1441d2f092a6e (from 037f23e6f8fbe6e6fc8e71ed21958fc553df72d0)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Fri Nov 3 12:54:43 2006 -0800

    Add DTrace probe points for X server <-> client communications
    
    See http://people.freedesktop.org/~alanc/dtrace/ for more details

diff --git a/configure.ac b/configure.ac
index 473ff9b..c23bf50 100644
--- a/configure.ac
+++ b/configure.ac
@@ -66,6 +66,26 @@ AC_PROG_YACC
 AC_SYS_LARGEFILE
 XORG_PROG_RAWCPP
 
+dnl Check for dtrace program (needed to build Xserver dtrace probes)
+AC_ARG_WITH(dtrace, AS_HELP_STRING([--with-dtrace=PATH],
+	     [Enable dtrace probes (default: enabled if dtrace found)]),
+	     [WDTRACE=$withval], [WDTRACE=auto])
+if test "x$WDTRACE" = "xyes" -o "x$WDTRACE" = "xauto" ; then
+	AC_PATH_PROG(DTRACE, [dtrace], [not_found], [$PATH:/usr/sbin])
+	if test "x$DTRACE" = "xnot_found" ; then
+		if test "x$WDTRACE" = "xyes" ; then
+			AC_MSG_FAILURE([dtrace requested but not found])
+		fi
+		WDTRACE="no"
+	fi
+fi
+if test "x$WDTRACE" != "xno" ; then
+  AC_DEFINE(XSERVER_DTRACE, 1, 
+      [Define to 1 if the DTrace Xserver provider probes should be built in.])
+fi
+AM_CONDITIONAL(XSERVER_DTRACE, [test "x$WDTRACE" != "xno"])
+AC_DEFINE_DIR(XERRORDB_PATH, libdir/XErrorDB, [Path to XErrorDB file])
+
 AC_HEADER_DIRENT
 AC_HEADER_STDC
 AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h])
@@ -873,8 +893,13 @@ AC_DEFINE(XCMISC, 1, [Support XCMisc ext
 AC_DEFINE(BIGREQS, 1, [Support BigRequests extension])
 AC_DEFINE(PIXPRIV, 1, [Support pixmap privates])
 
-DIX_LIB='$(top_builddir)/dix/libdix.la'
-OS_LIB='$(top_builddir)/os/libos.la'
+if test "x$WDTRACE" != "xno" ; then
+  DIX_LIB='$(top_builddir)/dix/dix.O'
+  OS_LIB='$(top_builddir)/os/os.O'
+else
+  DIX_LIB='$(top_builddir)/dix/libdix.la'
+  OS_LIB='$(top_builddir)/os/libos.la'
+fi
 CWRAP_LIB='$(top_builddir)/os/libcwrapper.la'
 MI_LIB='$(top_builddir)/mi/libmi.la'
 MINIMI_LIB='$(top_builddir)/mi/libminimi.la'
diff --git a/dix/Makefile.am b/dix/Makefile.am
index 724d1d1..d0d6e87 100644
--- a/dix/Makefile.am
+++ b/dix/Makefile.am
@@ -38,4 +38,22 @@ libxpstubs_la_SOURCES =	\
 
 INCLUDES = -I$(top_srcdir)/Xprint
 
-EXTRA_DIST = buildatoms BuiltInAtoms CHANGES
+EXTRA_DIST = buildatoms BuiltInAtoms CHANGES Xserver.d Xserver-dtrace.h.in
+
+if XSERVER_DTRACE
+# Generate dtrace header file for C sources to include
+BUILT_SOURCES = Xserver-dtrace.h
+
+Xserver-dtrace.h: $(srcdir)/Xserver.d
+	$(DTRACE) -C -h -o $@ -s $(srcdir)/Xserver.d \
+		|| cp Xserver-dtrace.h.in $@
+
+# Generate dtrace object code for probes in libdix
+dtrace-dix.o: $(top_srcdir)/dix/Xserver.d $(am_libdix_la_OBJECTS)
+	$(DTRACE) -G -C -o $@ -s $(top_srcdir)/dix/Xserver.d .libs/*.o
+
+noinst_LIBRARIES = dix.O
+
+dix.O: dtrace-dix.o $(am_libdix_la_OBJECTS)
+	ld -r -o $@ .libs/*.o
+endif
diff --git a/dix/Xserver-dtrace.h.in b/dix/Xserver-dtrace.h.in
new file mode 100644
index 0000000..26a8b40
--- /dev/null
+++ b/dix/Xserver-dtrace.h.in
@@ -0,0 +1,100 @@
+/* Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ */ 
+
+/*
+ * Generated by dtrace(1M), and then modified for backwards compatibility
+ * with older versions of dtrace.   Used if dtrace -h fails.
+ * (Since _ENABLED support was added after dtrace -h, this  assumes if 
+ *  dtrace -h fails, _ENABLED will too.)
+ */
+
+#ifndef	_XSERVER_DTRACE_H
+#define	_XSERVER_DTRACE_H
+
+#include <unistd.h>
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#if _DTRACE_VERSION
+
+#define	XSERVER_CLIENT_AUTH(arg0, arg1, arg2, arg3) \
+	__dtrace_Xserver___client__auth(arg0, arg1, arg2, arg3)
+#define	XSERVER_CLIENT_CONNECT(arg0, arg1) \
+	__dtrace_Xserver___client__connect(arg0, arg1)
+#define	XSERVER_CLIENT_DISCONNECT(arg0) \
+	__dtrace_Xserver___client__disconnect(arg0)
+#define	XSERVER_REQUEST_DONE(arg0, arg1, arg2, arg3, arg4) \
+	__dtrace_Xserver___request__done(arg0, arg1, arg2, arg3, arg4)
+#define	XSERVER_REQUEST_START(arg0, arg1, arg2, arg3, arg4) \
+	__dtrace_Xserver___request__start(arg0, arg1, arg2, arg3, arg4)
+#define	XSERVER_RESOURCE_ALLOC(arg0, arg1, arg2, arg3) \
+	__dtrace_Xserver___resource__alloc(arg0, arg1, arg2, arg3)
+#define	XSERVER_RESOURCE_FREE(arg0, arg1, arg2, arg3) \
+	__dtrace_Xserver___resource__free(arg0, arg1, arg2, arg3)
+#define	XSERVER_SEND_EVENT(arg0, arg1, arg2) \
+	__dtrace_Xserver___send__event(arg0, arg1, arg2)
+
+
+extern void __dtrace_Xserver___client__auth(int, string, pid_t, zoneid_t);
+extern void __dtrace_Xserver___client__connect(int, int);
+extern void __dtrace_Xserver___client__disconnect(int);
+extern void __dtrace_Xserver___request__done(string, uint8_t, uint32_t, int, int);
+extern void __dtrace_Xserver___request__start(string, uint8_t, uint16_t, int, void *);
+extern void __dtrace_Xserver___resource__alloc(uint32_t, uint32_t, void *, string);
+extern void __dtrace_Xserver___resource__free(uint32_t, uint32_t, void *, string);
+extern void __dtrace_Xserver___send__event(int, uint8_t, void *);
+
+#else
+
+#define	XSERVER_CLIENT_AUTH(arg0, arg1, arg2, arg3)
+#define	XSERVER_CLIENT_CONNECT(arg0, arg1)
+#define	XSERVER_CLIENT_DISCONNECT(arg0)
+#define	XSERVER_REQUEST_DONE(arg0, arg1, arg2, arg3, arg4)
+#define	XSERVER_REQUEST_START(arg0, arg1, arg2, arg3, arg4)
+#define	XSERVER_RESOURCE_ALLOC(arg0, arg1, arg2, arg3)
+#define	XSERVER_RESOURCE_FREE(arg0, arg1, arg2, arg3)
+#define	XSERVER_SEND_EVENT(arg0, arg1, arg2)
+
+#endif
+
+#define	XSERVER_CLIENT_AUTH_ENABLED() (1)
+#define	XSERVER_CLIENT_CONNECT_ENABLED() (1)
+#define	XSERVER_CLIENT_DISCONNECT_ENABLED() (1)
+#define	XSERVER_REQUEST_DONE_ENABLED() (1)
+#define	XSERVER_REQUEST_START_ENABLED() (1)
+#define	XSERVER_RESOURCE_ALLOC_ENABLED() (1)
+#define	XSERVER_RESOURCE_FREE_ENABLED() (1)
+#define	XSERVER_SEND_EVENT_ENABLED() (1)
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif	/* _XSERVER_DTRACE_H */
diff --git a/dix/Xserver.d b/dix/Xserver.d
new file mode 100644
index 0000000..e4c9b83
--- /dev/null
+++ b/dix/Xserver.d
@@ -0,0 +1,59 @@
+/* Copyright 2005-2006 Sun Microsystems, Inc.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ */
+
+/*
+ * Xserver dtrace provider definition
+ */
+
+#include <sys/types.h>
+
+provider Xserver {
+	/* reqType, data, length, client id, request buffer */
+	probe request__start(string, uint8_t, uint16_t, int, void *);
+	/* reqType, data, sequence, client id, result */
+	probe request__done(string, uint8_t, uint32_t, int, int);
+	/* client id, client fd */
+	probe client__connect(int, int);
+	/* client id, client address, client pid, client zone id */
+	probe client__auth(int, string, pid_t, zoneid_t);
+	/* client id */
+	probe client__disconnect(int);
+	/* resource id, resource type, value, resource type name */
+	probe resource__alloc(uint32_t, uint32_t, void *, string);
+	/* resource id, resource type, value, resource type name */
+	probe resource__free(uint32_t, uint32_t, void *, string);
+	/* client id, event type, event* */
+	probe send__event(int, uint8_t, void *);
+};
+
+#pragma D attributes Unstable/Unstable/Common provider Xserver provider
+#pragma D attributes Private/Private/Unknown  provider Xserver module
+#pragma D attributes Private/Private/Unknown  provider Xserver function
+#pragma D attributes Unstable/Unstable/Common provider Xserver name
+#pragma D attributes Unstable/Unstable/Common provider Xserver args
+
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 6347e39..2e7fa79 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -74,6 +74,36 @@ Equipment Corporation.
 
 ******************************************************************/
 
+/* XSERVER_DTRACE additions:
+ * Copyright 2005-2006 Sun Microsystems, Inc.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ */
+
+
 
 #ifdef HAVE_DIX_CONFIG_H
 #include <dix-config.h>
@@ -119,6 +149,17 @@ int ProcInitialConnection();
 #include <X11/extensions/XKBsrv.h>
 #endif
 
+#ifdef XSERVER_DTRACE
+#include <sys/types.h>
+typedef const char *string;
+#include "Xserver-dtrace.h"
+
+char *RequestNames[256];
+static void LoadRequestNames(void);
+static void FreeRequestNames(void);
+#define GetRequestName(i) (RequestNames[i])
+#endif
+
 #define mskcnt ((MAXCLIENTS + 31) / 32)
 #define BITMASK(i) (1U << ((i) & 31))
 #define MASKIDX(i) ((i) >> 5)
@@ -373,6 +414,10 @@ Dispatch(void)
     if (!clientReady)
 	return;
 
+#ifdef XSERVER_DTRACE
+    LoadRequestNames();
+#endif
+
     while (!dispatchException)
     {
         if (*icheck[0] != *icheck[1])
@@ -452,6 +497,11 @@ Dispatch(void)
 		client->requestLog[client->requestLogIndex] = MAJOROP;
 		client->requestLogIndex++;
 #endif
+#ifdef XSERVER_DTRACE
+		XSERVER_REQUEST_START(GetRequestName(MAJOROP), MAJOROP,
+			      ((xReq *)client->requestBuffer)->length,
+			      client->index, client->requestBuffer);
+#endif
 		if (result > (maxBigRequestSize << 2))
 		    result = BadLength;
 		else
@@ -464,7 +514,11 @@ Dispatch(void)
 #else
     		    result = (* client->requestVector[MAJOROP])(client);
 #endif /* XACE */
-	    
+#ifdef XSERVER_DTRACE
+		XSERVER_REQUEST_DONE(GetRequestName(MAJOROP), MAJOROP,
+			      client->sequence, client->index, result);
+#endif
+
 		if (result != Success) 
 		{
 		    if (client->noClientException != Success)
@@ -495,6 +549,9 @@ Dispatch(void)
     KillAllClients();
     DEALLOCATE_LOCAL(clientReady);
     dispatchException &= ~DE_RESET;
+#ifdef XSERVER_DTRACE
+    FreeRequestNames();
+#endif
 }
 
 #undef MAJOROP
@@ -3569,6 +3626,9 @@ CloseDownClient(register ClientPtr clien
 	    CallCallbacks((&ClientStateCallback), (pointer)&clientinfo);
 	} 	    
 	FreeClientResources(client);
+#ifdef XSERVER_DTRACE
+	XSERVER_CLIENT_DISCONNECT(client->index);
+#endif	
 	if (client->index < nextFreeClientID)
 	    nextFreeClientID = client->index;
 	clients[client->index] = NullClient;
@@ -3995,3 +4055,60 @@ MarkClientException(ClientPtr client)
 {
     client->noClientException = -1;
 }
+
+#ifdef XSERVER_DTRACE
+#include <ctype.h>
+
+/* Load table of request names for dtrace probes */
+static void LoadRequestNames(void)
+{
+    int i;
+    FILE *xedb;
+    extern void LoadExtensionNames(char **RequestNames);
+
+    bzero(RequestNames, 256 * sizeof(char *));
+
+    xedb = fopen(XERRORDB_PATH, "r");
+    if (xedb != NULL) {
+	char buf[256];
+	while (fgets(buf, sizeof(buf), xedb)) {
+	    if ((strncmp("XRequest.", buf, 9) == 0) && (isdigit(buf[9]))) {
+		char *name;
+		i = strtol(buf + 9, &name, 10);
+		if (RequestNames[i] == 0) {
+		    char *end = strchr(name, '\n');
+		    if (end) { *end = '\0'; }
+		    RequestNames[i] = strdup(name + 1);
+		}
+	    }
+	}
+	fclose(xedb);
+    }
+
+    LoadExtensionNames(RequestNames);
+
+    for (i = 0; i < 256; i++) {
+	if (RequestNames[i] == 0) {
+#define RN_SIZE 12 /* "Request#' + up to 3 digits + \0 */
+	    RequestNames[i] = xalloc(RN_SIZE);
+	    if (RequestNames[i]) {
+		snprintf(RequestNames[i], RN_SIZE, "Request#%d", i);
+	    }
+	}
+	/* fprintf(stderr, "%d: %s\n", i, RequestNames[i]); */
+    }
+}
+
+static void FreeRequestNames(void)
+{
+    int i;
+
+    for (i = 0; i < 256; i++) {
+	if (RequestNames[i] != 0) {
+	    free(RequestNames[i]);
+	    RequestNames[i] = 0;
+	}
+    }
+}
+
+#endif
diff --git a/dix/events.c b/dix/events.c
index 3425cb4..3b1a0aa 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -141,6 +141,12 @@ extern Bool XkbFilterEvents(ClientPtr, i
 #include "xace.h"
 #endif
 
+#ifdef XSERVER_DTRACE
+#include <sys/types.h>
+typedef const char *string;
+#include "Xserver-dtrace.h"
+#endif
+
 #ifdef XEVIE
 extern WindowPtr *WindowTable;
 extern int       xevieFlag;
@@ -4553,6 +4559,14 @@ WriteEventsToClient(ClientPtr pClient, i
 	eventinfo.count = count;
 	CallCallbacks(&EventCallback, (pointer)&eventinfo);
     }
+#ifdef XSERVER_DTRACE
+    if (XSERVER_SEND_EVENT_ENABLED()) {
+	for (i = 0; i < count; i++)
+	{
+	    XSERVER_SEND_EVENT(pClient->index, events[i].u.u.type, &events[i]);
+	}
+    }
+#endif	
     if(pClient->swapped)
     {
 	for(i = 0; i < count; i++)
diff --git a/dix/extension.c b/dix/extension.c
index f58c731..fe779b2 100644
--- a/dix/extension.c
+++ b/dix/extension.c
@@ -482,3 +482,17 @@ RegisterScreenProc(char *name, ScreenPtr
     }
     return TRUE;
 }
+
+#ifdef XSERVER_DTRACE
+void LoadExtensionNames(char **RequestNames) {
+    int i;
+
+    for (i=0; i<NumExtensions; i++) {
+	int r = extensions[i]->base;
+
+	if (RequestNames[r] == NULL) {
+	    RequestNames[r] = strdup(extensions[i]->name);
+	}
+    }
+}
+#endif
diff --git a/dix/resource.c b/dix/resource.c
index b2d01c8..efb759e 100644
--- a/dix/resource.c
+++ b/dix/resource.c
@@ -72,6 +72,34 @@ dealings in this Software without prior 
 Equipment Corporation.
 
 ******************************************************************/
+/* XSERVER_DTRACE additions:
+ * Copyright 2005-2006 Sun Microsystems, Inc.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ */
 
 /* $TOG: resource.c /main/41 1998/02/09 14:20:31 kaleb $ */
 
@@ -125,6 +153,14 @@ Equipment Corporation.
 #endif
 #include <assert.h>
 
+#ifdef XSERVER_DTRACE
+#include <sys/types.h>
+typedef const char *string;
+#include "Xserver-dtrace.h"
+
+#define TypeNameString(t) NameForAtom(ResourceNames[t & TypeMask])
+#endif
+
 static void RebuildTable(
     int /*client*/
 );
@@ -429,6 +465,9 @@ AddResource(XID id, RESTYPE type, pointe
     register ClientResourceRec *rrec;
     register ResourcePtr res, *head;
     	
+#ifdef XSERVER_DTRACE
+    XSERVER_RESOURCE_ALLOC(id, type, value, TypeNameString(type));
+#endif
     client = CLIENT_ID(id);
     rrec = &clientTable[client];
     if (!rrec->buckets)
@@ -528,6 +567,11 @@ FreeResource(XID id, RESTYPE skipDeleteF
 	    if (res->id == id)
 	    {
 		RESTYPE rtype = res->type;
+
+#ifdef XSERVER_DTRACE
+		XSERVER_RESOURCE_FREE(res->id, res->type,
+			      res->value, TypeNameString(res->type));
+#endif		    
 		*prev = res->next;
 		elements = --*eltptr;
 		if (rtype & RC_CACHED)
@@ -569,6 +613,10 @@ FreeResourceByType(XID id, RESTYPE type,
 	{
 	    if (res->id == id && res->type == type)
 	    {
+#ifdef XSERVER_DTRACE
+		XSERVER_RESOURCE_FREE(res->id, res->type,
+			      res->value, TypeNameString(res->type));
+#endif		    		    
 		*prev = res->next;
 		if (type & RC_CACHED)
 		    FlushClientCaches(res->id);
@@ -731,6 +779,10 @@ FreeClientNeverRetainResources(ClientPtr
 	    RESTYPE rtype = this->type;
 	    if (rtype & RC_NEVERRETAIN)
 	    {
+#ifdef XSERVER_DTRACE
+		XSERVER_RESOURCE_FREE(this->id, this->type,
+			      this->value, TypeNameString(this->type));
+#endif		    
 		*prev = this->next;
 		if (rtype & RC_CACHED)
 		    FlushClientCaches(this->id);
@@ -777,6 +829,10 @@ FreeClientResources(ClientPtr client)
         for (this = *head; this; this = *head)
 	{
 	    RESTYPE rtype = this->type;
+#ifdef XSERVER_DTRACE
+	    XSERVER_RESOURCE_FREE(this->id, this->type,
+			  this->value, TypeNameString(this->type));
+#endif		    
 	    *head = this->next;
 	    if (rtype & RC_CACHED)
 		FlushClientCaches(this->id);
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index fc1e69a..1120337 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -460,4 +460,10 @@
 /* Have a monotonic clock from clock_gettime() */
 #undef MONOTONIC_CLOCK
 
+/* Define to 1 if the DTrace Xserver provider probes should be built in */
+#undef XSERVER_DTRACE
+
+/* Path to XErrorDB file */
+#undef XERRORDB_PATH
+
 #endif /* _DIX_CONFIG_H_ */
diff --git a/os/Makefile.am b/os/Makefile.am
index 71e24c0..dcfe80a 100644
--- a/os/Makefile.am
+++ b/os/Makefile.am
@@ -50,3 +50,15 @@ libcwrapper_la_CFLAGS = \
 
 EXTRA_DIST = $(K5AUTH_SOURCES) $(SECURERPC_SOURCES) $(INTERNALMALLOC_SOURCES) \
      $(XCSECURITY_SOURCES) $(XDMCP_SOURCES) $(LBX_SOURCES) $(STRLCAT_SOURCES)
+
+if XSERVER_DTRACE
+# Generate dtrace object code for probes in libos & libdix
+dtrace.o: $(top_srcdir)/dix/Xserver.d $(am_libos_la_OBJECTS)
+	$(DTRACE) -G -C -o $@ -s $(top_srcdir)/dix/Xserver.d .libs/*.o ../dix/.libs/*.o
+
+noinst_LIBRARIES = os.O
+
+os.O: dtrace.o $(am_libos_la_OBJECTS)
+	ld -r -o $@ dtrace.o .libs/*.o
+
+endif
diff --git a/os/connection.c b/os/connection.c
index ecdae0f..cdd1d18 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -170,6 +170,13 @@ extern __const__ int _nfiles;
 # include <zone.h>
 #endif
 
+#ifdef XSERVER_DTRACE
+# include <sys/types.h>
+typedef const char *string;
+# include "../dix/Xserver-dtrace.h"
+# include <ucred.h>
+#endif
+
 int lastfdesc;			/* maximum file descriptor */
 
 fd_set WellKnownConnections;	/* Listener mask */
@@ -619,14 +626,22 @@ AuthAudit (ClientPtr client, Bool letin,
 	client_uid_string[0] = '\0';
     }
     
-    if (proto_n)
+#ifdef XSERVER_DTRACE
+    XSERVER_CLIENT_AUTH(client->index, addr, client_pid, client_zid);
+    if (auditTrailLevel > 1) {
+#endif
+      if (proto_n)
 	AuditF("client %d %s from %s%s\n  Auth name: %.*s ID: %d\n", 
 	       client->index, letin ? "connected" : "rejected", addr,
 	       client_uid_string, (int)proto_n, auth_proto, auth_id);
-    else 
+      else 
 	AuditF("client %d %s from %s%s\n", 
 	       client->index, letin ? "connected" : "rejected", addr,
 	       client_uid_string);
+
+#ifdef XSERVER_DTRACE
+    }
+#endif	
 }
 
 XID
@@ -693,7 +708,11 @@ ClientAuthorized(ClientPtr client, 
 	    else
 	    {
 		auth_id = (XID) 0;
+#ifdef XSERVER_DTRACE
+		if ((auditTrailLevel > 1) || XSERVER_CLIENT_AUTH_ENABLED())
+#else
 		if (auditTrailLevel > 1)
+#endif
 		    AuthAudit(client, TRUE,
 			(struct sockaddr *) from, fromlen,
 			proto_n, auth_proto, auth_id);
@@ -709,7 +728,11 @@ ClientAuthorized(ClientPtr client, 
 		return "Client is not authorized to connect to Server";
 	}
     }
+#ifdef XSERVER_DTRACE
+    else if ((auditTrailLevel > 1) || XSERVER_CLIENT_AUTH_ENABLED())
+#else
     else if (auditTrailLevel > 1)
+#endif
     {
 	if (_XSERVTransGetPeerAddr (trans_conn,
 	    &family, &fromlen, &from) != -1)
@@ -787,6 +810,9 @@ AllocNewConnection (XtransConnInfo trans
     ErrorF("AllocNewConnection: client index = %d, socket fd = %d\n",
 	   client->index, fd);
 #endif
+#ifdef XSERVER_DTRACE
+    XSERVER_CLIENT_CONNECT(client->index, fd);
+#endif	
 
     return client;
 }
diff-tree bd0c829654903ca45543dfa59cda967c4fafd8ac (from c1828a8ff51c8db326c47e6710f4f42fab94fb6d)
Author: Bjorn Helgaas <bjorn.helgaas at hp.com>
Date:   Fri Nov 3 18:54:06 2006 +0100

    Do not map full 0-1MB legacy range
    
    If we're mapping something in the "legacy range" (0-1Mb), we shouldn't
    expand the requested range to the entire 0-1Mb range.  Typically this
    is for mapping the VGA frame buffer, and some platforms support mmap of
    the frame buffer but not the entire 0-1Mb range.
    
    For example, HP sx1000 and sx2000 ia64 platforms can have memory from
    0-0x9ffff, VGA frame buffer from 0xa0000-0xbffff, and memory from
    0xc0000-0xfffff.  On these platforms, we can't map the entire 0-1Mb
    range with the same attribute because the memory only supports WB,
    while the frame buffer supports only UC.  But an mmap of just the
    frame buffer should work fine.

diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c
index afb3819..15fc2b8 100644
--- a/hw/xfree86/os-support/bus/linuxPci.c
+++ b/hw/xfree86/os-support/bus/linuxPci.c
@@ -627,7 +627,6 @@ linuxMapPci(int ScreenNum, int Flags, PC
 
 #define MAX_DOMAINS 257
 static pointer DomainMmappedIO[MAX_DOMAINS];
-static pointer DomainMmappedMem[MAX_DOMAINS];
 
 static int
 linuxOpenLegacy(PCITAG Tag, char *name)
@@ -685,6 +684,7 @@ xf86MapDomainMemory(int ScreenNum, int F
 {
     int domain = xf86GetPciDomain(Tag);
     int fd;
+    pointer addr;
 
     /*
      * We use /proc/bus/pci on non-legacy addresses or if the Linux sysfs
@@ -698,20 +698,14 @@ xf86MapDomainMemory(int ScreenNum, int F
 	return linuxMapPci(ScreenNum, Flags, Tag, Base, Size,
 			   PCIIOC_MMAP_IS_MEM);
 
-
-    /* If we haven't already mapped this legacy space, try to. */
-    if (!DomainMmappedMem[domain]) {
-	DomainMmappedMem[domain] = mmap(NULL, 1024*1024, PROT_READ|PROT_WRITE,
-					MAP_SHARED, fd, 0);
-	if (DomainMmappedMem[domain] == MAP_FAILED) {
-	    close(fd);
-	    perror("mmap failure");
-	    FatalError("xf86MapDomainMem():  mmap() failure\n");
-	}
+    addr = mmap(NULL, Size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, Base);
+    if (addr == MAP_FAILED) {
+	close (fd);
+	perror("mmap failure");
+	FatalError("xf86MapDomainMem():  mmap() failure\n");
     }
-
     close(fd);
-    return (pointer)((char *)DomainMmappedMem[domain] + Base);
+    return addr;
 }
 
 /*
diff-tree c1828a8ff51c8db326c47e6710f4f42fab94fb6d (from d50fc413b39f52663b46084c28e81fc4933a7b49)
Author: Egbert Eich <eich at freedesktop.org>
Date:   Fri Nov 3 18:32:48 2006 +0100

    Fixing mach64 driver bailing out on ia64
    
    Mach64 driver bails out on ia64 because it cannot map device
    memory. It turns out that some bogus and unneeded code attempts
    to find the root bridge of the device and fails to do so proberly
    as there this host-to-pci bridge is not existant. This code has
    been around for years although it completely unclear what it had
    been intended for. Fixing this by eliminating the bogus code.

diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c
index 97d60f5..afb3819 100644
--- a/hw/xfree86/os-support/bus/linuxPci.c
+++ b/hw/xfree86/os-support/bus/linuxPci.c
@@ -570,9 +570,7 @@ linuxMapPci(int ScreenNum, int Flags, PC
 
 	xf86InitVidMem();
 
-	pPCI = xf86GetPciHostConfigFromTag(Tag);
-
-	if (((fd = linuxPciOpenFile(pPCI ? pPCI->tag : 0,FALSE)) < 0) ||
+	if (((fd = linuxPciOpenFile(Tag ,FALSE)) < 0) ||
 	    (ioctl(fd, mmap_ioctl, 0) < 0))
 	    break;
 
diff-tree d50fc413b39f52663b46084c28e81fc4933a7b49 (from 1d731fc54a2cf5d3f353d8ee1c7c4989df27f011)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Nov 2 18:53:41 2006 +0100

    Fix device path in altixPCI.c to be domain aware.

diff --git a/hw/xfree86/os-support/bus/altixPCI.c b/hw/xfree86/os-support/bus/altixPCI.c
index 010f661..7a72ec6 100644
--- a/hw/xfree86/os-support/bus/altixPCI.c
+++ b/hw/xfree86/os-support/bus/altixPCI.c
@@ -41,13 +41,14 @@ static pciDevice *get_dev_on_bus(unsigne
 static void get_bridge_info(pciBusInfo_t *bus_info, pciDevice *pdev)
 {
 	unsigned int parent_segnum, segnum = PCI_DOM_FROM_TAG(pdev->tag);
-	unsigned int parent_busnum, busnum = pdev->busnum;
+	unsigned int parent_busnum, parent_nodombus, busnum = pdev->busnum;
+	unsigned int nodombus = PCI_BUS_NO_DOMAIN(PCI_BUS_FROM_TAG(pdev->tag));
 	char bridge_path[] = "/sys/class/pci_bus/0000:00/bridge";
 	char bridge_target[] = "../../../devices/pci0000:00";
 
 	/* Path to this device's bridge */
 	sprintf(bridge_path, "/sys/class/pci_bus/%04x:%02x/bridge", segnum,
-		busnum);
+		nodombus);
 
 	if (readlink(bridge_path, bridge_target, strlen(bridge_target)) < 0) {
 		perror("failed to dereference bridge link");
@@ -56,7 +57,9 @@ static void get_bridge_info(pciBusInfo_t
 	}
 
 	sscanf(bridge_target, "../../../devices/pci%04x:%02x", &parent_segnum,
-	       &parent_busnum);
+	       &parent_nodombus);
+
+	parent_busnum = PCI_MAKE_BUS(parent_segnum, parent_nodombus);
 
 	/*
 	 * If there's no bridge or the bridge points to the device, use
diff-tree 1d731fc54a2cf5d3f353d8ee1c7c4989df27f011 (from caaa113acf4144fd47a1ac93ca440d78d1983e54)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Nov 2 18:50:15 2006 +0100

    Add domain support to linuxPciOpenFile().
    
    Loosely based on patch from David S. Miller <davem at davemloft.net>
    See also bug #2368.

diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c
index 0f7fc47..97d60f5 100644
--- a/hw/xfree86/os-support/bus/linuxPci.c
+++ b/hw/xfree86/os-support/bus/linuxPci.c
@@ -54,6 +54,7 @@
 #include "xf86Priv.h"
 #include "xf86_OSlib.h"
 #include "Pci.h"
+#include <dirent.h>
 
 /*
  * linux platform specific PCI access functions -- using /proc/bus/pci
@@ -73,6 +74,7 @@ static void linuxPciCfgWriteByte(PCITAG 
 static CARD16 linuxPciCfgReadWord(PCITAG tag, int off);
 static void linuxPciCfgWriteWord(PCITAG tag, int off, CARD16 val);
 static int linuxPciHandleBIOS(PCITAG Tag, int basereg, unsigned char *buf, int len);
+static Bool linuxDomainSupport(void);
 
 static pciBusFuncs_t linuxFuncs0 = {
 /* pciReadLong      */	linuxPciCfgRead,
@@ -116,6 +118,8 @@ static pciBusInfo_t linuxPci0 = {
 /* from lnx_pci.c. */
 extern int lnxPciInit(void);
 
+static Bool	domain_support = FALSE;
+
 void
 linuxPciInit()
 {
@@ -126,6 +130,9 @@ linuxPciInit()
 		   we'll need a fallback for 2.0 kernels here */
 		return;
 	}
+#ifndef INCLUDE_XF86_NO_DOMAIN
+	domain_support = linuxDomainSupport();
+#endif
 	pciNumBuses    = 1;
 	pciBusInfo[0]  = &linuxPci0;
 	pciFindFirstFP = pciGenFindFirst;
@@ -137,13 +144,14 @@ linuxPciInit()
 static int
 linuxPciOpenFile(PCITAG tag, Bool write)
 {
-	static int	lbus,ldev,lfunc,fd = -1,is_write = 0;
-	int		bus, dev, func;
+	static int	ldomain, lbus,ldev,lfunc,fd = -1,is_write = 0;
+	int		domain, bus, dev, func;
 	char		file[64];
 	struct stat	ignored;
 	static int is26 = -1;
 
-	bus  = PCI_BUS_FROM_TAG(tag);
+	domain = PCI_DOM_FROM_TAG(tag);
+	bus  = PCI_BUS_NO_DOMAIN(PCI_BUS_FROM_TAG(tag));
 	dev  = PCI_DEV_FROM_TAG(tag);
 	func = PCI_FUNC_FROM_TAG(tag);
 	if (is26 == -1) {
@@ -153,30 +161,41 @@ linuxPciOpenFile(PCITAG tag, Bool write)
 			is26 = 1;
 	}
 	
-	if (fd == -1 || (write && (!is_write))
+	if (!domain_support && domain > 0)
+	    return -1;
+
+	if (fd == -1 || (write && (!is_write)) || domain != ldomain
 	    || bus != lbus || dev != ldev || func != lfunc) {
-		if (fd != -1)
+		if (fd != -1) {
 			close(fd);
+			fd = -1;
+		}
 		if (is26)
-			sprintf(file,"/sys/bus/pci/devices/0000:%02x:%02x.%01x/config",
-				bus, dev, func);
+			sprintf(file,"/sys/bus/pci/devices/%04x:%02x:%02x.%01x/config",
+				domain, bus, dev, func);
 		else {
 			if (bus < 256) {
-				sprintf(file,"/proc/bus/pci/%02x",bus);
-				if (stat(file, &ignored) < 0)
-					sprintf(file, "/proc/bus/pci/0000:%02x/%02x.%1x",
-						bus, dev, func);
-				else
-					sprintf(file, "/proc/bus/pci/%02x/%02x.%1x",
-						bus, dev, func);
+				sprintf(file, "/proc/bus/pci/%04x:%02x", domain, bus);
+				if (stat(file, &ignored) < 0) {
+					if (domain == 0) 
+						sprintf(file, "/proc/bus/pci/%02x/%02x.%1x",
+							bus, dev, func);
+					else
+						goto bail;
+				} else
+					sprintf(file, "/proc/bus/pci/%04x:%02x/%02x.%1x",
+						domain, bus, dev, func);
 			} else {
-				sprintf(file,"/proc/bus/pci/%04x",bus);
-				if (stat(file, &ignored) < 0)
-					sprintf(file, "/proc/bus/pci/0000:%04x/%02x.%1x",
-						bus, dev, func);
-				else
-					sprintf(file, "/proc/bus/pci/%04x/%02x.%1x",
-						bus, dev, func);
+				sprintf(file, "/proc/bus/pci/%04x:%04x", domain, bus);
+				if (stat(file, &ignored) < 0) {
+					if (domain == 0)
+						sprintf(file, "/proc/bus/pci/%04x/%02x.%1x",
+							bus, dev, func);
+					else
+						goto bail;
+				} else
+					sprintf(file, "/proc/bus/pci/%04x:%04x/%02x.%1x",
+						domain, bus, dev, func);
 			}
 		}
 		if (write) {
@@ -191,7 +210,8 @@ linuxPciOpenFile(PCITAG tag, Bool write)
 			    fd = open(file,O_RDONLY);
 			    is_write = FALSE;
 		}
-		
+	bail:
+		ldomain = domain;
 		lbus  = bus;
 		ldev  = dev;
 		lfunc = func;
@@ -489,6 +509,32 @@ linuxGetSizes(PCITAG Tag, unsigned long 
     *mem_size = sizes->mem_size;
 }
 
+static Bool
+linuxDomainSupport(void)
+{
+    DIR *dir;
+    struct dirent *dirent;
+    char *end;
+
+    if (!(dir = opendir("/proc/bus/pci")))
+       return FALSE;
+    while (1) {
+	if (!(dirent = readdir(dir)))
+	    return FALSE;
+	strtol(dirent->d_name,&end,16);
+	/* entry of the form xx or xxxx : x=[0..f] no domain */
+	if (*end == '\0')
+	    return FALSE;
+	else if (*end == ':') {
+	    /* ':' found immediately after: verify for xxxx:xx or xxxx:xxxx */
+	    strtol(end + 1,&end,16);
+	    if (*end == '\0')
+		return TRUE;
+	}
+    }
+    return FALSE;
+} 
+
 _X_EXPORT int
 xf86GetPciDomain(PCITAG Tag)
 {
diff-tree caaa113acf4144fd47a1ac93ca440d78d1983e54 (from 16c5043fc0c84b14323cd211c2645106455ac320)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Nov 2 18:38:45 2006 +0100

    Fixing domain support for ia64
    
    ia64 specific functions + defines.
    Still uses /proc interface for some scaning code.
    Based on code from Egbert Eich <eich at freedesktop.org>.

diff --git a/hw/xfree86/os-support/bus/Pci.h b/hw/xfree86/os-support/bus/Pci.h
index 0f1af20..7cc882d 100644
--- a/hw/xfree86/os-support/bus/Pci.h
+++ b/hw/xfree86/os-support/bus/Pci.h
@@ -119,7 +119,7 @@
 				/* by xf86scanpci		     */
 #if defined(sun) && defined(SVR4) && defined(sparc)
 # define MAX_PCI_BUSES   4096	/* Max number of PCI buses           */
-#elif defined(__alpha__) && defined (linux)
+#elif (defined(__alpha__) || defined(__ia64__)) && defined (linux)
 # define MAX_PCI_DOMAINS	512
 # define PCI_DOM_MASK	0x01fful
 # define MAX_PCI_BUSES	(MAX_PCI_DOMAINS*256) /* 256 per domain      */
@@ -258,7 +258,7 @@
 # endif
 #elif defined(__ia64__)
 # if defined(linux)
-#  define ARCH_PCI_INIT linuxPciInit
+#  define ARCH_PCI_INIT ia64linuxPciInit
 #  define INCLUDE_XF86_MAP_PCI_MEM
 # elif defined(FreeBSD)
 #  define ARCH_PCI_INIT freebsdPciInit
diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c
index bda265c..0f7fc47 100644
--- a/hw/xfree86/os-support/bus/linuxPci.c
+++ b/hw/xfree86/os-support/bus/linuxPci.c
@@ -940,3 +940,106 @@ int linuxPciHandleBIOS(PCITAG Tag, int b
   }
   return 0;
 }
+
+#ifdef __ia64__
+static PCITAG ia64linuxPciFindFirst(void);
+static PCITAG ia64linuxPciFindNext(void);
+
+void   
+ia64linuxPciInit()
+{
+    struct stat st;
+
+    linuxPciInit();
+	   
+    if (!stat("/proc/sgi_sn/licenseID", &st) && pciNumBuses) {
+       /* Be a little paranoid here and only use this code for Altix systems.
+	* It is generic, so it should work on any system, but depends on
+	* /proc/bus/pci entries for each domain/bus combination. Altix is
+	* guaranteed a recent enough kernel to have them.
+	*/
+       pciFindFirstFP = ia64linuxPciFindFirst;
+       pciFindNextFP  = ia64linuxPciFindNext;
+    }
+}
+
+static DIR *busdomdir;
+static DIR *devdir;
+	       
+static PCITAG
+ia64linuxPciFindFirst(void)
+{   
+       busdomdir = opendir("/proc/bus/pci");
+       devdir = NULL;
+
+       return ia64linuxPciFindNext();
+}   
+
+static struct dirent *getnextbus(int *domain, int *bus)
+{
+    struct dirent *entry;
+    int dombus;
+
+    for (;;) {
+	entry = readdir(busdomdir);
+	if (entry == NULL) {
+	    *domain = 0;
+	    *bus = 0;
+	    closedir(busdomdir);
+	    return NULL;
+	}
+	if (sscanf(entry->d_name, "%04x:%02x", domain, bus) != 2)
+	    continue;
+	dombus = PCI_MAKE_BUS(*domain, *bus);
+
+	if (pciNumBuses <= dombus)
+	    pciNumBuses = dombus + 1;
+	if (!pciBusInfo[dombus]) {
+	    pciBusInfo[dombus] = xnfalloc(sizeof(pciBusInfo_t));
+	    *pciBusInfo[dombus] = *pciBusInfo[0];
+	}
+
+	return entry;
+    }
+}
+
+static PCITAG
+ia64linuxPciFindNext(void)
+{
+    struct dirent *entry;
+    char file[40];
+    static int bus, dev, func, domain;
+    PCITAG pciDeviceTag;
+    CARD32 devid;
+
+    for (;;) {
+	if (devdir == NULL) {
+	    entry = getnextbus(&domain, &bus);
+	    if (!entry)
+		return PCI_NOT_FOUND;
+	    snprintf(file, 40, "/proc/bus/pci/%s", entry->d_name);
+	    devdir = opendir(file);
+	    if (!devdir)
+		return PCI_NOT_FOUND;
+
+	}
+
+	entry = readdir(devdir);
+
+	if (entry == NULL) {
+	    closedir(devdir);
+	    devdir = NULL;
+	    continue;
+	}
+
+	if (sscanf(entry->d_name, "%02x . %01x", &dev, &func) == 2) {
+	    pciDeviceTag = PCI_MAKE_TAG(PCI_MAKE_BUS(domain, bus), dev, func);
+	    devid = pciReadLong(pciDeviceTag, PCI_ID_REG);
+	    if ((devid & pciDevidMask) == pciDevid)
+		/* Yes - Return it.  Otherwise, next device */
+		return pciDeviceTag;
+	}
+    }
+}
+#endif
+
diff-tree 16c5043fc0c84b14323cd211c2645106455ac320 (from 072c022e731c3aadf34096f16364e29df47280d2)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Nov 2 18:22:09 2006 +0100

    Fix 2 warnings.

diff --git a/hw/xfree86/common/xf86pciBus.c b/hw/xfree86/common/xf86pciBus.c
index b763042..ae33568 100644
--- a/hw/xfree86/common/xf86pciBus.c
+++ b/hw/xfree86/common/xf86pciBus.c
@@ -1398,7 +1398,7 @@ fixPciResource(int prt, memType alignmen
     (*p_base) = H2B(tag,range.rBegin,type);
 #ifdef DEBUG
     ErrorF("New PCI res %i base: 0x%lx, size: 0x%lx, type %s\n",
-	   res_n,(*p_base),(1 << (*p_size)),
+	   res_n,(*p_base),(1L << (*p_size)),
 	   ((type & ResPhysMask) == ResMem) ? "Mem" : "Io");
 #endif
     if (res_n != 0xff) {
@@ -1577,8 +1577,8 @@ findPciRange(PCITAG tag, resPtr m, resPt
     return 0;
 }
 
-pciVideoPtr
-getPciVideoPtr(tag)
+static pciVideoPtr
+getPciVideoPtr(PCITAG tag)
 {
     int n = 0;
 
diff-tree 072c022e731c3aadf34096f16364e29df47280d2 (from 5afc6c1a14fea2966017493b045fa7209faeb8eb)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Nov 2 17:58:19 2006 +0100

    Fix obviously wrong boundary checks + cleanup unused vars.
    
    Also disable compilation of code that is no longer used anywhere in the whole
    Xserver tree.

diff --git a/hw/xfree86/os-support/linux/lnx_pci.c b/hw/xfree86/os-support/linux/lnx_pci.c
index aff6bb0..a957038 100644
--- a/hw/xfree86/os-support/linux/lnx_pci.c
+++ b/hw/xfree86/os-support/linux/lnx_pci.c
@@ -149,11 +149,10 @@ int lnxPciInit(void) {
 Bool
 xf86GetPciSizeFromOS(PCITAG tag, int index, int* bits)
 {
-    unsigned int dev, fn;
     signed PCIADDR_TYPE Size;
     struct pci_dev *device;
 
-    if (index > 7)
+    if (index >= 7)
         return FALSE;
     
     if (!xf86OSLinuxPCIDevs) {
@@ -181,14 +180,14 @@ xf86GetPciSizeFromOS(PCITAG tag, int ind
 
 
 
+#if 0
 /* Query the kvirt address (64bit) of a BAR range from TAG */
 Bool
 xf86GetPciOffsetFromOS(PCITAG tag, int index, unsigned long* bases)
 {
-    unsigned int dev, fn;
     struct pci_dev *device;
 
-    if (index > 7)
+    if (index >= 7)
         return FALSE;
 
     if (!xf86OSLinuxPCIDevs) {
@@ -208,12 +207,12 @@ xf86GetPciOffsetFromOS(PCITAG tag, int i
 
     return FALSE;
 }
+#endif
 
 /* Query the kvirt address (64bit) of a BAR range from size for a given TAG */
 unsigned long
 xf86GetOSOffsetFromPCI(PCITAG tag, int space, unsigned long base)
 {
-    unsigned int dev, fn;
     unsigned int ndx;
     struct pci_dev *device;
 
diff-tree 5afc6c1a14fea2966017493b045fa7209faeb8eb (from 6319f7d713971f70f06166480f069eca3bcace36)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Nov 2 15:42:03 2006 +0100

    Added linux 2.6 compatible domain aware device scanning code.
    
    Additional scanning code uses the /sys interface of 2.6 kernels.
    Cleaned up the use of tags and already split domain/bus/dev/fn.

diff --git a/hw/xfree86/os-support/bus/Pci.c b/hw/xfree86/os-support/bus/Pci.c
index ea6ac4e..b80371d 100644
--- a/hw/xfree86/os-support/bus/Pci.c
+++ b/hw/xfree86/os-support/bus/Pci.c
@@ -20,6 +20,8 @@
  *	pciSetBitsByte()       - Write an 8 bit value against a mask
  *	pciTag()               - Return tag for a given PCI bus, device, &
  *                               function
+ *	pciDomTag()            - Return tag for a given PCI domain, bus,
+ *                               device & function
  *	pciBusAddrToHostAddr() - Convert a PCI address to a host address
  *	pciHostAddrToBusAddr() - Convert a host address to a PCI address
  *	pciGetBaseSize()       - Returns the number of bits in a PCI base
@@ -614,6 +616,12 @@ pciTag(int busnum, int devnum, int funcn
 	return(PCI_MAKE_TAG(busnum,devnum,funcnum));
 }
 
+_X_EXPORT PCITAG
+pciDomTag(int domnum, int busnum, int devnum, int funcnum)
+{
+	return(PCI_MAKE_TAG(PCI_MAKE_BUS(domnum,busnum),devnum,funcnum));
+}
+
 #if defined(PCI_MFDEV_SUPPORT)
 
 Bool
diff --git a/hw/xfree86/os-support/bus/xf86Pci.h b/hw/xfree86/os-support/bus/xf86Pci.h
index fdb88e8..c444a0c 100644
--- a/hw/xfree86/os-support/bus/xf86Pci.h
+++ b/hw/xfree86/os-support/bus/xf86Pci.h
@@ -766,6 +766,7 @@ void	      pciSetBitsByte(PCITAG tag, in
 ADDRESS	      pciBusAddrToHostAddr(PCITAG tag, PciAddrType type, ADDRESS addr);
 ADDRESS	      pciHostAddrToBusAddr(PCITAG tag, PciAddrType type, ADDRESS addr);
 PCITAG	      pciTag(int busnum, int devnum, int funcnum);
+PCITAG	      pciDomTag(int domnum, int busnum, int devnum, int funcnum);
 int	      pciGetBaseSize(PCITAG tag, int indx, Bool destructive, Bool *min);
 CARD32	      pciCheckForBrokenBase(PCITAG tag,int basereg);
 pointer	      xf86MapPciMem(int ScreenNum, int Flags, PCITAG Tag,
diff --git a/hw/xfree86/os-support/linux/lnx_pci.c b/hw/xfree86/os-support/linux/lnx_pci.c
index a1dbc76..aff6bb0 100644
--- a/hw/xfree86/os-support/linux/lnx_pci.c
+++ b/hw/xfree86/os-support/linux/lnx_pci.c
@@ -3,7 +3,9 @@
 #include <xorg-config.h>
 #endif
 
+#include <sys/types.h>
 #include <stdio.h>
+#include <dirent.h>
 #include <X11/X.h>
 #include "os.h"
 #include "xf86.h"
@@ -25,8 +27,10 @@
 int lnxPciInit(void);
 
 struct pci_dev {
+    unsigned int domain;
     unsigned int bus;
-    unsigned int devfn;
+    unsigned int dev;
+    unsigned int fn;
     PCIADDR_TYPE offset[7];
     PCIADDR_TYPE size[7];
     struct pci_dev *next;
@@ -38,10 +42,53 @@ int xf86OSLinuxNumPciDevs = 0;
 static struct pci_dev *xf86OSLinuxGetPciDevs(void) {
     char c[0x200];
     FILE *file = NULL;
+    DIR  *dir;
+    struct dirent *dirent;
     struct pci_dev *tmp, *ret = NULL;
-    unsigned int num;
+    unsigned int i, num, devfn;
+    unsigned PCIADDR_TYPE begin, end;
     char *res;
     
+    /* Try 2.6 devices first, with domain support */
+    if ( (dir = opendir ("/sys/bus/pci/devices")) ) {
+	xf86OSLinuxNumPciDevs = 0;
+	while ( (dirent = readdir (dir)) ) {
+	    unsigned int domain, bus, dev, fn;
+	    if (sscanf (dirent->d_name, "%04x:%02x:%02x.%01x",
+			&domain, &bus, &dev, &fn) == 4) {
+		tmp = xcalloc (sizeof(struct pci_dev), 1);
+		tmp->domain = domain;
+		tmp->bus    = bus;
+		tmp->dev    = dev;
+		tmp->fn     = fn;
+		sprintf (c, "/sys/bus/pci/devices/%12s/resource",
+			 dirent->d_name);
+		i = 0;
+		if ( (file = fopen (c, "r")) ) {
+		    while (i < 7 && fgets (c, 0x200, file)) {
+			if (sscanf (c, PCIADDR_FMT " " PCIADDR_FMT " "
+				    PCIADDR_IGNORE_FMT, &begin, &end) == 2) {
+			    tmp->offset[i] = begin;
+			    tmp->size[i]   = begin ? end-begin+1 : 0;
+			    i++;
+			}
+		    }
+		    fclose (file);
+		}
+		if (i > 0) {
+		    tmp->next = ret;
+		    ret       = tmp;
+		    xf86OSLinuxNumPciDevs++;
+		} else
+		    xfree (tmp);
+	    }
+	}
+	closedir (dir);
+    }
+
+    if (ret)
+	return ret;
+
     file = fopen("/proc/bus/pci/devices", "r");
     if (!file) return NULL;
 
@@ -70,9 +117,11 @@ static struct pci_dev *xf86OSLinuxGetPci
                 "\t" PCIADDR_FMT
                 "\t" PCIADDR_FMT
                 "\t" PCIADDR_FMT,
-                &tmp->bus,&tmp->devfn,&tmp->offset[0],&tmp->offset[1],&tmp->offset[2],&tmp->offset[3],
+                &tmp->bus,&devfn,&tmp->offset[0],&tmp->offset[1],&tmp->offset[2],&tmp->offset[3],
                 &tmp->offset[4],&tmp->offset[5],&tmp->offset[6], &tmp->size[0], &tmp->size[1], &tmp->size[2],
                 &tmp->size[3], &tmp->size[4], &tmp->size[5], &tmp->size[6]);
+            tmp->dev = devfn >> 3;
+            tmp->fn  = devfn & 0x7;
             if (num != 16) {  /* apparantly not 2.3 style */
                 xfree(tmp);
                 fclose(file);
@@ -114,10 +163,8 @@ xf86GetPciSizeFromOS(PCITAG tag, int ind
         return FALSE;
     
     for (device = xf86OSLinuxPCIDevs; device; device = device->next) {
-        dev = device->devfn >> 3;
-	fn = device->devfn & 0x7;
-        if (tag == pciTag(device->bus,dev,fn)) {
-            *bits = 0;
+        if (tag == pciDomTag (device->domain, device->bus,
+			      device->dev, device->fn)) {
             if (device->size[index] != 0) {
                 Size = device->size[index] - ((PCIADDR_TYPE) 1);
                 while (Size & ((PCIADDR_TYPE) 0x01)) {
@@ -151,9 +198,8 @@ xf86GetPciOffsetFromOS(PCITAG tag, int i
         return FALSE;
 
     for (device = xf86OSLinuxPCIDevs; device; device = device->next) {
-        dev = device->devfn >> 3;
-        fn = device->devfn & 0x7;
-        if (tag == pciTag(device->bus,dev,fn)) {
+        if (tag == pciDomTag (device->domain, device->bus,
+			      device->dev, device->fn)) {
             /* return the offset for the index requested */
             *bases = device->offset[index];
             return TRUE;
@@ -179,9 +225,8 @@ xf86GetOSOffsetFromPCI(PCITAG tag, int s
     }
 
     for (device = xf86OSLinuxPCIDevs; device; device = device->next) {
-        dev = device->devfn >> 3;
-        fn = device->devfn & 0x7;
-        if (tag == pciTag(device->bus, dev, fn)) {
+        if (tag == pciDomTag (device->domain, device->bus,
+			      device->dev, device->fn)) {
             /* ok now look through all the BAR values of this device */
             pciConfigPtr pDev = xf86GetPciConfigFromTag(tag);
 
diff-tree 6319f7d713971f70f06166480f069eca3bcace36 (from f4dd2665b0f9aa9c00a5152c73bc72cb7514eeb5)
Author: Egbert Eich <eich at freedesktop.org>
Date:   Thu Nov 2 12:50:52 2006 +0100

    Make int10 fully domain aware.

diff --git a/hw/xfree86/int10/helper_exec.c b/hw/xfree86/int10/helper_exec.c
index 734d847..d80de89 100644
--- a/hw/xfree86/int10/helper_exec.c
+++ b/hw/xfree86/int10/helper_exec.c
@@ -469,7 +469,6 @@ Mem_wl(CARD32 addr, CARD32 val)
 
 static CARD32 PciCfg1Addr = 0;
 
-#define TAG(Cfg1Addr) (Cfg1Addr & 0xffff00)
 #define OFFSET(Cfg1Addr) (Cfg1Addr & 0xff)
 
 static int
@@ -480,7 +479,7 @@ pciCfg1in(CARD16 addr, CARD32 *val)
 	return 1;
     }
     if (addr == 0xCFC) {
-	*val = pciReadLong(TAG(PciCfg1Addr), OFFSET(PciCfg1Addr));
+	*val = pciReadLong(Int10Current->Tag, OFFSET(PciCfg1Addr));
 	return 1;
     }
     return 0;
@@ -494,7 +493,7 @@ pciCfg1out(CARD16 addr, CARD32 val)
 	return 1;
     }
     if (addr == 0xCFC) {
-	pciWriteLong(TAG(PciCfg1Addr), OFFSET(PciCfg1Addr), val);
+	pciWriteLong(Int10Current->Tag, OFFSET(PciCfg1Addr), val);
 	return 1;
     }
     return 0;
@@ -512,7 +511,7 @@ pciCfg1inw(CARD16 addr, CARD16 *val)
     }
     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
 	offset = addr - 0xCFC;
-	*val = pciReadWord(TAG(PciCfg1Addr), OFFSET(PciCfg1Addr) + offset);
+	*val = pciReadWord(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset);
 	return 1;
     }
     return 0;
@@ -531,7 +530,7 @@ pciCfg1outw(CARD16 addr, CARD16 val)
     }
     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
 	offset = addr - 0xCFC;
-	pciWriteWord(TAG(PciCfg1Addr), OFFSET(PciCfg1Addr) + offset, val);
+	pciWriteWord(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset, val);
 	return 1;
     }
     return 0;
@@ -549,7 +548,7 @@ pciCfg1inb(CARD16 addr, CARD8 *val)
     }
     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
 	offset = addr - 0xCFC;
-	*val = pciReadByte(TAG(PciCfg1Addr), OFFSET(PciCfg1Addr) + offset);
+	*val = pciReadByte(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset);
 	return 1;
     }
     return 0;
@@ -568,7 +567,7 @@ pciCfg1outb(CARD16 addr, CARD8 val)
     }
     if ((addr >= 0xCFC) && (addr <= 0xCFF)) {
 	offset = addr - 0xCFC;
-	pciWriteByte(TAG(PciCfg1Addr), OFFSET(PciCfg1Addr) + offset, val);
+	pciWriteByte(Int10Current->Tag, OFFSET(PciCfg1Addr) + offset, val);
 	return 1;
     }
     return 0;
diff-tree f4dd2665b0f9aa9c00a5152c73bc72cb7514eeb5 (from 46901063e8edc82b67989f4e5eec39d17c67dc98)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Nov 2 12:36:12 2006 +0100

    Added missing domain stripping in already domain aware code.

diff --git a/hw/xfree86/os-support/bus/linuxPci.c b/hw/xfree86/os-support/bus/linuxPci.c
index 7d220d0..bda265c 100644
--- a/hw/xfree86/os-support/bus/linuxPci.c
+++ b/hw/xfree86/os-support/bus/linuxPci.c
@@ -731,7 +731,7 @@ xf86ReadDomainMemory(PCITAG Tag, ADDRESS
     struct stat st;
 
     dom  = PCI_DOM_FROM_TAG(Tag);
-    bus  = PCI_BUS_FROM_TAG(Tag);
+    bus  = PCI_BUS_NO_DOMAIN(PCI_BUS_FROM_TAG(Tag));
     dev  = PCI_DEV_FROM_TAG(Tag);
     func = PCI_FUNC_FROM_TAG(Tag);
     sprintf(file, "/sys/devices/pci%04x:%02x/%04x:%02x:%02x.%1x/rom",
@@ -910,7 +910,7 @@ int linuxPciHandleBIOS(PCITAG Tag, int b
   int sofar = 0;
 
   dom  = PCI_DOM_FROM_TAG(Tag);
-  bus  = PCI_BUS_FROM_TAG(Tag);
+  bus  = PCI_BUS_NO_DOMAIN(PCI_BUS_FROM_TAG(Tag));
   dev  = PCI_DEV_FROM_TAG(Tag);
   func = PCI_FUNC_FROM_TAG(Tag);
   sprintf(file, "/sys/bus/pci/devices/%04x:%02x:%02x.%1x/rom",
diff-tree 46901063e8edc82b67989f4e5eec39d17c67dc98 (from 037f23e6f8fbe6e6fc8e71ed21958fc553df72d0)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Thu Nov 2 12:25:03 2006 +0100

    Build with -D_PC on ix86 only.

diff --git a/hw/xfree86/int10/Makefile.am b/hw/xfree86/int10/Makefile.am
index c059070..3a18afb 100644
--- a/hw/xfree86/int10/Makefile.am
+++ b/hw/xfree86/int10/Makefile.am
@@ -13,8 +13,12 @@ COMMON_SOURCES = \
 	xf86int10.c \
 	xf86int10module.c
 
+if I386_VIDEO
+I386_VIDEO_CFLAGS = -D_PC
+endif
+
 if INT10_VM86
-AM_CFLAGS = -D_PC -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS)
+AM_CFLAGS = $(I386_VIDEO_CFLAGS) -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS)
 INCLUDES = $(XORG_INCS)
 libint10_la_SOURCES = \
 	$(COMMON_SOURCES) \
@@ -23,7 +27,8 @@ libint10_la_SOURCES = \
 endif
 
 if INT10_X86EMU
-AM_CFLAGS = -D_X86EMU -DNO_SYS_HEADERS -D_PC $(XORG_CFLAGS) $(EXTRA_CFLAGS)
+AM_CFLAGS = $(I386_VIDEO_CFLAGS) -D_X86EMU -DNO_SYS_HEADERS \
+           $(XORG_CFLAGS) $(EXTRA_CFLAGS)
 INCLUDES = $(XORG_INCS) -I$(srcdir)/../x86emu
 libint10_la_SOURCES = \
 	$(COMMON_SOURCES) \
@@ -33,7 +38,7 @@ libint10_la_SOURCES = \
 endif
 
 if INT10_STUB
-AM_CFLAGS = -D_PC -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS)
+AM_CFLAGS = $(I386_VIDEO_CFLAGS) -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS)
 libint10_la_SOURCES = stub.c xf86int10module.c
 endif
 
diff-tree 543b397277d1f03b8091e44812010abcd5d80102 (from parents)
Merge: 4056e6e79a4e37101d298ae29139c83d3816368b 645d0576205532a3610ae351267d5b84d76236bd
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Thu Nov 2 19:00:35 2006 -0800

    Merge branch 'origin' into randr-1.2

diff-tree 037f23e6f8fbe6e6fc8e71ed21958fc553df72d0 (from 7dc54a40e900cbea1e509620623b091d54a3c2d1)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Nov 2 18:30:58 2006 -0800

    Convert Xprt DDX to new motion history api

diff --git a/hw/xprint/ddxInit.c b/hw/xprint/ddxInit.c
index 77b532f..8e7ec2e 100644
--- a/hw/xprint/ddxInit.c
+++ b/hw/xprint/ddxInit.c
@@ -156,9 +156,9 @@ PointerProc(
 	  {
 	      map[0] = 0;
 	      InitPointerDeviceStruct(pPtr, map, NUM_BUTTONS, 
-				      miPointerGetMotionEvents, 
+				      GetMotionHistory,
 				      (PtrCtrlProcPtr)_XpVoidNoop,
-				      miPointerGetMotionBufferSize());
+				      GetMotionHistorySize(), 2);
 	      break;
 	  }
         case DEVICE_ON:
diff-tree 7dc54a40e900cbea1e509620623b091d54a3c2d1 (from e46f7f78b362e76f5a553184e3f5ec7e109aa39d)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Nov 2 16:38:47 2006 -0800

    Remove references to xf86Info.kbd* from solaris code

diff --git a/hw/xfree86/os-support/solaris/sun_init.c b/hw/xfree86/os-support/solaris/sun_init.c
index 691cb3f..08d35c5 100644
--- a/hw/xfree86/os-support/solaris/sun_init.c
+++ b/hw/xfree86/os-support/solaris/sun_init.c
@@ -291,23 +291,6 @@ xf86CloseConsole(void)
 #endif /* HAS_USL_VTS */
 
     close(xf86Info.consoleFd);
-
-#if defined(__SOL8__) || !defined(i386)
-
-    /*
-     * This probably shouldn't be here.  However, there is no corresponding
-     * xf86CloseKbd() routine - DWH
-     */
-
-    /* Set the keyboard into "indirect" mode and turn off even translation */
-    tmp = 0;
-    (void) ioctl(xf86Info.kbdFd, KIOCSDIRECT, &tmp);
-    tmp = TR_ASCII;
-    (void) ioctl(xf86Info.kbdFd, KIOCTRANS, &tmp);
-
-    close(xf86Info.kbdFd);
-
-#endif
 }
 
 int
@@ -357,16 +340,6 @@ xf86ProcessArgument(int argc, char **arg
 	    fb_dev[PATH_MAX - 1] = '\0';
 	    return 2;
 	}
-
-	if (!strcmp(argv[i], "-ar1")) {
-	    xf86Info.kbdDelay = atoi(argv[i + 1]) * 1000;
-	    return 2;
-	}
-
-	if (!strcmp(argv[i], "-ar2")) {
-	    xf86Info.kbdRate = atoi(argv[i + 1]) * 1000;
-	    return 2;
-	}
     }
 
 #endif
@@ -381,10 +354,6 @@ void xf86UseMsg()
 #endif
 #if defined(__SOL8__) || !defined(i386)
     ErrorF("-dev <fb>              Framebuffer device\n");
-    ErrorF("-ar1 <float>           Set autorepeat initiate time (sec)\n");
-    ErrorF("                       (if not using XKB)\n");
-    ErrorF("-ar2 <float>           Set autorepeat interval time (sec)\n");
-    ErrorF("                       (if not using XKB)\n");
 #endif
     ErrorF("-keeptty               Don't detach controlling tty\n");
     ErrorF("                       (for debugging only)\n");
diff-tree e46f7f78b362e76f5a553184e3f5ec7e109aa39d (from 58bf9a142d1957f4d77038ee4ce7b1116b1f7955)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Nov 2 16:38:12 2006 -0800

    sun_bell.c needs to #include "xf86_OSlib.h"

diff --git a/hw/xfree86/os-support/solaris/sun_bell.c b/hw/xfree86/os-support/solaris/sun_bell.c
index 369103f..b3a9bfe 100644
--- a/hw/xfree86/os-support/solaris/sun_bell.c
+++ b/hw/xfree86/os-support/solaris/sun_bell.c
@@ -38,6 +38,7 @@
 
 #include "xf86.h"
 #include "xf86Priv.h"
+#include "xf86_OSlib.h"
 
 #define BELL_RATE       48000   /* Samples per second */
 #define BELL_HZ         50      /* Fraction of a second i.e. 1/x */
diff-tree 58bf9a142d1957f4d77038ee4ce7b1116b1f7955 (from 1ecd45fb8e4250fb51daa2bdf1a960af0f8b53fb)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Nov 2 14:43:02 2006 -0800

    PostSyntheticMotion needs to be extern, not static, since it's in getevents.c

diff --git a/dix/events.c b/dix/events.c
index 321c552..3425cb4 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -321,7 +321,7 @@ static CARD8 criticalEvents[32] =
 
 #ifdef PANORAMIX
 static void ConfineToShape(RegionPtr shape, int *px, int *py);
-static void PostSyntheticMotion(int x, int y, int screenNum, int time);
+extern void PostSyntheticMotion(int x, int y, int screenNum, int time);
 static void PostNewCursor(void);
 
 #define SyntheticMotion(x, y) \
diff-tree 1ecd45fb8e4250fb51daa2bdf1a960af0f8b53fb (from 01afa533aa872d1a101a41153f95d800e68fea3e)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 04:51:03 2006 +0200

    Makefile.am: add config to DIST_SUBDIRS as well

diff --git a/Makefile.am b/Makefile.am
index eebdd0a..f35539e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -91,6 +91,7 @@ DIST_SUBDIRS = \
 	composite \
 	GL \
 	exa \
+	config \
 	hw
 
 # gross hack
diff-tree 01afa533aa872d1a101a41153f95d800e68fea3e (from 57c1409151cb1f6e0e528fb92ebda58f86f12c1a)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 04:32:37 2006 +0200

    xfree86/os-support: axe more unused files

diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am
index 0301a74..9e09fb6 100644
--- a/hw/xfree86/os-support/linux/Makefile.am
+++ b/hw/xfree86/os-support/linux/Makefile.am
@@ -47,5 +47,4 @@ LNX_EXTRA_SOURCES = \
 EXTRA_DIST = \
 	$(LNX_EXTRA_SOURCES) \
 	lnx.h \
-	lnx_kbd.h \
 	$(srcdir)/../shared/xf86Axp.h
diff --git a/hw/xfree86/os-support/lynxos/Makefile.am b/hw/xfree86/os-support/lynxos/Makefile.am
index 0bb514b..4085c49 100644
--- a/hw/xfree86/os-support/lynxos/Makefile.am
+++ b/hw/xfree86/os-support/lynxos/Makefile.am
@@ -1,6 +1,5 @@
 EXTRA_DIST = \
 	lynx_init.c \
-	lynx_io.c \
 	lynx_mmap.c \
 	lynx_mouse.c \
 	lynx_noinline.c \
diff --git a/hw/xfree86/os-support/sysv/Makefile.am b/hw/xfree86/os-support/sysv/Makefile.am
index 85aa764..f9d2f23 100644
--- a/hw/xfree86/os-support/sysv/Makefile.am
+++ b/hw/xfree86/os-support/sysv/Makefile.am
@@ -1 +1 @@
-EXTRA_DIST = sysv_init.c sysv_io.c sysv_mouse.c sysv_video.c
+EXTRA_DIST = sysv_init.c sysv_mouse.c sysv_video.c
diff-tree 57c1409151cb1f6e0e528fb92ebda58f86f12c1a (from de5a4c63747a417cdece919f4fb5a4004a3ee7bb)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 04:21:06 2006 +0200

    xfree86/os-support: remove unused file from dist

diff --git a/hw/xfree86/os-support/Makefile.am b/hw/xfree86/os-support/Makefile.am
index 131c495..b07e3c9 100644
--- a/hw/xfree86/os-support/Makefile.am
+++ b/hw/xfree86/os-support/Makefile.am
@@ -27,5 +27,4 @@ DISTCLEANFILES = xorgos.c
 # FIXME: These don't seem to be used anywhere
 EXTRA_DIST += \
 	shared/bios_devmem.c \
-	shared/inout.S \
-	shared/kbd.c
+	shared/inout.S
diff-tree de5a4c63747a417cdece919f4fb5a4004a3ee7bb (from 1d65429a9e03871969552d0c31b022546cc46b12)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 04:18:33 2006 +0200

    xkb: note that we allow full xi interaction
    We now allow maps to be set (etc) on different keyboards, so stop putting
    XkbXI_KeyboardsMask in unsupported.

diff --git a/xkb/xkb.c b/xkb/xkb.c
index bceaf49..2c97e05 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5720,7 +5720,6 @@ char *			str;
 	wanted&= ~XkbXI_ButtonActionsMask;
     if ((!dev->kbdfeed)&&(!dev->leds))
 	wanted&= ~XkbXI_IndicatorsMask;
-    wanted&= ~XkbXI_KeyboardsMask;
 
     nameLen= XkbSizeCountedString(dev->name);
     bzero((char *)&rep,SIZEOF(xkbGetDeviceInfoReply));
@@ -5729,8 +5728,8 @@ char *			str;
     rep.sequenceNumber = client->sequence;
     rep.length = nameLen/4;
     rep.present = wanted;
-    rep.supported = XkbXI_AllDeviceFeaturesMask&(~XkbXI_KeyboardsMask);
-    rep.unsupported = XkbXI_KeyboardsMask;
+    rep.supported = XkbXI_AllDeviceFeaturesMask;
+    rep.unsupported = 0;
     rep.firstBtnWanted = rep.nBtnsWanted = 0;
     rep.firstBtnRtrn = rep.nBtnsRtrn = 0;
     if (dev->button)
@@ -6044,7 +6043,7 @@ xkbExtensionDeviceNotify ed;
     change= stuff->change;
 
     CHK_ANY_DEVICE(dev,stuff->deviceSpec);
-    CHK_MASK_LEGAL(0x01,change,(XkbXI_AllFeaturesMask&(~XkbXI_KeyboardsMask)));
+    CHK_MASK_LEGAL(0x01,change,XkbXI_AllFeaturesMask);
 
     wire= (char *)&stuff[1];
     if (change&XkbXI_ButtonActionsMask) {
diff --git a/xkb/xkbLEDs.c b/xkb/xkbLEDs.c
index ec8e7b1..e94e0bf 100644
--- a/xkb/xkbLEDs.c
+++ b/xkb/xkbLEDs.c
@@ -675,13 +675,13 @@ xkbExtensionDeviceNotify	my_ed;
 	changes->names.changed_indicators|= changed_names;
     }
 
-    ed->reason|=	(XkbXI_IndicatorNamesMask&(~XkbXI_KeyboardsMask));
+    ed->reason|=	XkbXI_IndicatorNamesMask;
     ed->ledClass= 	sli->class;
     ed->ledID=		sli->id;
     ed->ledsDefined=	sli->namesPresent|sli->mapsPresent;
     ed->ledState=	sli->effectiveState;
-    ed->unsupported=	XkbXI_KeyboardsMask;
-    ed->supported=	XkbXI_AllFeaturesMask&(~XkbXI_KeyboardsMask);
+    ed->unsupported=	0;
+    ed->supported=	XkbXI_AllFeaturesMask;
 
     if (changes!=&my_changes)	changes= NULL;
     if (ed!=&my_ed)		ed= NULL;
@@ -753,13 +753,13 @@ xkbExtensionDeviceNotify	my_ed;
 
     XkbCheckIndicatorMaps(dev,sli,changed_maps);
 
-    ed->reason|=	(XkbXI_IndicatorMapsMask&(~XkbXI_KeyboardsMask));
+    ed->reason|=	XkbXI_IndicatorMapsMask;
     ed->ledClass= 	sli->class;
     ed->ledID=		sli->id;
     ed->ledsDefined=	sli->namesPresent|sli->mapsPresent;
     ed->ledState=	sli->effectiveState;
-    ed->unsupported|=	XkbXI_KeyboardsMask&XkbXI_IndicatorMapsMask;
-    ed->supported=	XkbXI_AllFeaturesMask&(~XkbXI_KeyboardsMask);
+    ed->unsupported|=	XkbXI_IndicatorMapsMask;
+    ed->supported=	XkbXI_AllFeaturesMask;
 
     XkbUpdateLedAutoState(dev,sli,changed_maps,ed,changes,cause);
 
@@ -834,13 +834,13 @@ Bool				kb_changed;
     if ((kbd==dev)&&(sli->flags&XkbSLI_IsDefault))
 	changes->indicators.state_changes|= affected;
     if (affected) {
-	ed->reason|=		(XkbXI_IndicatorStateMask&(~XkbXI_KeyboardsMask));
+	ed->reason|=		XkbXI_IndicatorStateMask;
 	ed->ledClass= 		sli->class;
 	ed->ledID=		sli->id;
 	ed->ledsDefined=	sli->namesPresent|sli->mapsPresent;
 	ed->ledState=		sli->effectiveState;
-	ed->unsupported|=	XkbXI_KeyboardsMask&XkbXI_IndicatorStateMask;
-	ed->supported=		XkbXI_AllFeaturesMask&(~XkbXI_KeyboardsMask);
+	ed->unsupported|=	XkbXI_IndicatorStateMask;
+	ed->supported=		XkbXI_AllFeaturesMask;
     }
 
     if (kb_changed) {
@@ -918,13 +918,13 @@ unsigned			oldState;
 	changes->indicators.state_changes|= affected;
     }
 
-    ed->reason|=	(XkbXI_IndicatorStateMask&(~XkbXI_KeyboardsMask));
+    ed->reason|=	XkbXI_IndicatorStateMask;
     ed->ledClass= 	sli->class;
     ed->ledID=		sli->id;
     ed->ledsDefined=	sli->namesPresent|sli->mapsPresent;
     ed->ledState=	sli->effectiveState;
-    ed->unsupported|=	XkbXI_KeyboardsMask&XkbXI_IndicatorStateMask;
-    ed->supported=	XkbXI_AllFeaturesMask&(~XkbXI_KeyboardsMask);
+    ed->unsupported|=	XkbXI_IndicatorStateMask;
+    ed->supported=	XkbXI_AllFeaturesMask;
 
     if (changes!=&my_changes)	changes= NULL;
     if (ed!=&my_ed)		ed= NULL;
diff-tree 1d65429a9e03871969552d0c31b022546cc46b12 (from 64139c1950ea825c0a0124abc5f88499e91f797f)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 04:12:55 2006 +0200

    xfree86: don't attempt to enable and disable non-DIX devices
    Don't try to enable and disable devices with no entry in the DIX, such as
    the evdev brain.

diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 4a9f369..6ce9319 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -887,7 +887,8 @@ xf86VTSwitch()
      */
     pInfo = xf86InputDevs;
     while (pInfo) {
-      DisableDevice(pInfo->dev);
+      if (pInfo->dev)
+          DisableDevice(pInfo->dev);
       pInfo = pInfo->next;
     }
 #endif /* !__UNIXOS2__ */
@@ -927,8 +928,10 @@ xf86VTSwitch()
 #if !defined(__UNIXOS2__)
       pInfo = xf86InputDevs;
       while (pInfo) {
-        xf86ReleaseKeys(pInfo->dev);
-	EnableDevice(pInfo->dev);
+        if (pInfo->dev) {
+            xf86ReleaseKeys(pInfo->dev);
+            EnableDevice(pInfo->dev);
+        }
 	pInfo = pInfo->next;
       }
       /* XXX HACK */
@@ -991,8 +994,10 @@ xf86VTSwitch()
 #if !defined(__UNIXOS2__)
     pInfo = xf86InputDevs;
     while (pInfo) {
-      xf86ReleaseKeys(pInfo->dev);
-      EnableDevice(pInfo->dev);
+      if (pInfo->dev) {
+          xf86ReleaseKeys(pInfo->dev);
+          EnableDevice(pInfo->dev);
+      }
       pInfo = pInfo->next;
     }
     /* XXX HACK */
diff-tree 64139c1950ea825c0a0124abc5f88499e91f797f (from 18c246a13b887b865de6a17e6cd1c259b9bc383d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 03:22:09 2006 +0200

    bump to 1.2.99.0

diff --git a/configure.ac b/configure.ac
index 9322a2d..473ff9b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -25,7 +25,7 @@ dnl Process this file with autoconf to c
 AC_PREREQ(2.57)
 dnl This is the not the Xorg version number, it's the server version number.
 dnl Yes, that's weird.
-AC_INIT([xorg-server], 1.1.99.3, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+AC_INIT([xorg-server], 1.2.99.0, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([dist-bzip2 foreign])
 AM_MAINTAINER_MODE
diff-tree 18c246a13b887b865de6a17e6cd1c259b9bc383d (from parents)
Merge: 794f2e7291ccb4e48f9fbfc8f08302e3aac0f79f 4843d823f4d38d8bd468ce3a8feddbff229ed416
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 03:21:37 2006 +0200

    Merge branch 'input-hotplug'

diff-tree 4843d823f4d38d8bd468ce3a8feddbff229ed416 (from parents)
Merge: ba9f5138fc32a7a7b97bcf941bc92751b7c6c2c0 a7b944f0d96c3e0e15e75378a04def1ac96089fb
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 03:18:13 2006 +0200

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree ba9f5138fc32a7a7b97bcf941bc92751b7c6c2c0 (from be291a6d9764cf29a7d9a8114d47d9f41ce856e9)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 03:16:10 2006 +0200

    xfree86: allow starting with no input devices
    Add a server flag (AllowEmptyInput), which will inhibit adding the
    standard keyboard and mouse drivers, if there are no input devices in the
    config file.

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 6777f43..4138eb1 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -747,7 +747,8 @@ typedef enum {
     FLAG_HANDLE_SPECIAL_KEYS,
     FLAG_RANDR,
     FLAG_AIGLX,
-    FLAG_IGNORE_ABI
+    FLAG_IGNORE_ABI,
+    FLAG_ALLOW_EMPTY_INPUT,
 } FlagValues;
    
 static OptionInfoRec FlagOptions[] = {
@@ -819,6 +820,8 @@ static OptionInfoRec FlagOptions[] = {
 	{0}, FALSE },
   { FLAG_AIGLX,			"AIGLX",			OPTV_BOOLEAN,
 	{0}, FALSE },
+  { FLAG_ALLOW_EMPTY_INPUT,     "AllowEmptyInput",              OPTV_BOOLEAN,
+        {0}, FALSE },
   { FLAG_IGNORE_ABI,			"IgnoreABI",			OPTV_BOOLEAN,
 	{0}, FALSE },
   { -1,				NULL,				OPTV_NONE,
@@ -1016,6 +1019,10 @@ configServerFlags(XF86ConfFlagsPtr flags
 	xf86Info.aiglxFrom = X_CONFIG;
     }
 
+    xf86Info.allowEmptyInput = FALSE;
+    if (xf86GetOptValBool(FlagOptions, FLAG_ALLOW_EMPTY_INPUT, &value))
+        xf86Info.allowEmptyInput = TRUE;
+
 /* Make sure that timers don't overflow CARD32's after multiplying */
 #define MAX_TIME_IN_MIN (0x7fffffff / MILLI_PER_MIN)
 
@@ -1657,8 +1664,6 @@ configLayout(serverLayoutPtr servlayoutp
     servlayoutp->options = conf_layout->lay_option_lst;
     from = X_DEFAULT;
 
-    if (!checkCoreInputDevices(servlayoutp, FALSE))
-	return FALSE;
     return TRUE;
 }
 
@@ -1717,7 +1722,7 @@ configImpliedLayout(serverLayoutPtr serv
     indp = xnfalloc(sizeof(IDevRec));
     indp->identifier = NULL;
     servlayoutp->inputs = indp;
-    if (!checkCoreInputDevices(servlayoutp, TRUE))
+    if (!xf86Info.allowEmptyInput && checkCoreInputDevices(servlayoutp, TRUE))
 	return FALSE;
     
     return TRUE;
@@ -2303,6 +2308,12 @@ addDefaultModes(MonPtr monitorp)
     return TRUE;
 }
 
+static void
+checkInput(serverLayoutPtr layout) {
+    if (!xf86Info.allowEmptyInput)
+        checkCoreInputDevices(layout, FALSE);
+}
+
 /*
  * load the config file and fill the global data structure
  */
@@ -2424,6 +2435,8 @@ xf86HandleConfigFile(Bool autoconfig)
              return CONFIG_PARSE_ERROR;
     }
 
+    checkInput(&xf86ConfigLayout);
+
     /*
      * Handle some command line options that can override some of the
      * ServerFlags settings.
diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
index 7dfcfea..659e566 100644
--- a/hw/xfree86/common/xf86Privstr.h
+++ b/hw/xfree86/common/xf86Privstr.h
@@ -133,6 +133,9 @@ typedef struct {
 	Bool		allowClosedown;
 	ServerGrabInfoRec server;
     } grabInfo;
+
+    Bool        allowEmptyInput;  /* Allow the server to start with no input
+                                   * devices. */
 } xf86InfoRec, *xf86InfoPtr;
 
 #ifdef DPMSExtension
diff-tree be291a6d9764cf29a7d9a8114d47d9f41ce856e9 (from parents)
Merge: a2d6242106bb3a440faa9cad157e0120dbfa7b6e 6fdfd9dad91d7b7aa292f8c4d268dd27c34de8d3
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 03:15:25 2006 +0200

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff --cc configure.ac
index 8935aa0,058759d..9322a2d
@@@ -889,32 -874,9 +891,32 @@@
  PKG_CHECK_MODULES([XSERVERLIBS], [$REQUIRED_LIBS])
  
  XSERVER_CFLAGS="${XSERVERCFLAGS_CFLAGS}"
- XSERVER_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} -lm"
+ XSERVER_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} ${LIBS}"
  AC_SUBST([SYS_LIBS])
  
 +# The Xorg binary needs to export symbols so that they can be used from modules
 +# Some platforms require extra flags to do this.   gcc should set these flags
 +# when -rdynamic is passed to it, other compilers/linkers may need to be added
 +# here.
 +if test "x$GCC" = "xyes"; then
 +       GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
 +       GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
 +       GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
 +       GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
 +       if test "x$WERROR" = "xyes"; then
 +               GCC_WARNINGS="${GCC_WARNINGS} -Werror"
 +       fi
 +       XSERVER_CFLAGS="$GCC_WARNINGS $XSERVER_CFLAGS"
 +
 +       LD_EXPORT_SYMBOLS_FLAG="-rdynamic"
 +fi
 +case $host_os in
 +       openbsd*)
 +       LD_EXPORT_SYMBOLS_FLAG="-Wl,--export-dynamic"
 +       ;;
 +esac
 +AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
 +
  AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes],
                 [AC_CHECK_LIB([rt], [clock_gettime], [have_clock_gettime=-lrt],
                               [have_clock_gettime=no])])
@@@ -1044,7 -1007,7 +1047,7 @@@
  AM_CONDITIONAL(XNEST, [test "x$XNEST" = xyes])
  
  if test "x$XNEST" = xyes; then
- 	XNEST_LIBS="$XSERVER_LIBS $FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB"
 -	XNEST_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB $LIBS"
++	XNEST_LIBS="$XSERVER_LIBS $FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $CONFIG_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB $LIBS"
  	AC_SUBST([XNEST_LIBS])
  fi
  
@@@ -1394,7 -1370,7 +1397,7 @@@
  if test "x$XPRINT" = xyes; then
  	PKG_CHECK_MODULES([XPRINT], [printproto x11 xfont $XDMCP_MODULES xau])
  	XPRINT_EXTENSIONS="$XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $RENDER_LIB $COMPOSITE_LIB $RANDR_LIB $XI_LIB $FIXES_LIB $DAMAGE_LIB $XI_LIB $GLX_LIBS"
- 	XPRINT_LIBS="$XPRINT_LIBS $DIX_LIB $CONFIG_LIB $XKB_LIB $XKB_STUB_LIB $XPRINT_EXTENSIONS $MI_LIB $MIEXT_DAMAGE_LIB $CWRAP_LIB $OS_LIB"
 -	XPRINT_LIBS="$XPRINT_LIBS $DIX_LIB $XKB_LIB $XKB_STUB_LIB $XPRINT_EXTENSIONS $MI_LIB $MIEXT_DAMAGE_LIB $CWRAP_LIB $OS_LIB $LIBS"
++	XPRINT_LIBS="$XPRINT_LIBS $DIX_LIB $CONFIG_LIB $XKB_LIB $XKB_STUB_LIB $XPRINT_EXTENSIONS $MI_LIB $MIEXT_DAMAGE_LIB $CWRAP_LIB $OS_LIB $LIBS"
  	AC_SUBST([XPRINT_CFLAGS])
  	AC_SUBST([XPRINT_LIBS])
  
diff-tree a7b944f0d96c3e0e15e75378a04def1ac96089fb (from fbfb35189ef6666707097704b43e052cb2f919ae)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Wed Nov 1 16:17:49 2006 -0800

    If getpeerucred() is available, include pid & zoneid in audit messages too

diff --git a/os/connection.c b/os/connection.c
index 60f3b9f..6ca4010 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -165,6 +165,11 @@ extern __const__ int _nfiles;
 #include <netdnet/dn.h>
 #endif /* DNETCONN */
 
+#ifdef HAS_GETPEERUCRED
+# include <ucred.h>
+# include <zone.h>
+#endif
+
 int lastfdesc;			/* maximum file descriptor */
 
 fd_set WellKnownConnections;	/* Listener mask */
@@ -550,8 +555,13 @@ AuthAudit (ClientPtr client, Bool letin,
     char addr[128];
     char *out = addr;
     int client_uid;
-    char client_uid_string[32];
-    
+    char client_uid_string[64];
+#ifdef HAS_GETPEERUCRED
+    ucred_t *peercred = NULL;
+    pid_t client_pid = -1;
+    zoneid_t client_zid = -1;
+#endif
+
     if (!len)
         strcpy(out, "local host");
     else
@@ -588,10 +598,24 @@ AuthAudit (ClientPtr client, Bool letin,
 	    strcpy(out, "unknown address");
 	}
 
+#ifdef HAS_GETPEERUCRED
+    if (getpeerucred(((OsCommPtr)client->osPrivate)->fd, &peercred) >= 0) {
+	client_uid = ucred_geteuid(peercred);
+	client_pid = ucred_getpid(peercred);
+	client_zid = ucred_getzoneid(peercred);
+
+	ucred_free(peercred);
+	snprintf(client_uid_string, sizeof(client_uid_string),
+		 " (uid %ld, pid %ld, zone %ld)",
+		 (long) client_uid, (long) client_pid, (long) client_zid);
+    }
+#else    
     if (LocalClientCred(client, &client_uid, NULL) != -1) {
 	snprintf(client_uid_string, sizeof(client_uid_string),
 		 " (uid %d)", client_uid);
-    } else {
+    }
+#endif
+    else {
 	client_uid_string[0] = '\0';
     }
     
diff-tree fbfb35189ef6666707097704b43e052cb2f919ae (from 6fdfd9dad91d7b7aa292f8c4d268dd27c34de8d3)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Wed Nov 1 15:11:48 2006 -0800

    Bug #1997: AUDIT messages should contain uid for local accesses
    
    <https://bugs.freedesktop.org/show_bug.cgi?id=1997>

diff --git a/os/connection.c b/os/connection.c
index 571ba58..60f3b9f 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -549,7 +549,9 @@ AuthAudit (ClientPtr client, Bool letin,
 {
     char addr[128];
     char *out = addr;
-
+    int client_uid;
+    char client_uid_string[32];
+    
     if (!len)
         strcpy(out, "local host");
     else
@@ -585,14 +587,22 @@ AuthAudit (ClientPtr client, Bool letin,
 	default:
 	    strcpy(out, "unknown address");
 	}
+
+    if (LocalClientCred(client, &client_uid, NULL) != -1) {
+	snprintf(client_uid_string, sizeof(client_uid_string),
+		 " (uid %d)", client_uid);
+    } else {
+	client_uid_string[0] = '\0';
+    }
     
     if (proto_n)
-	AuditF("client %d %s from %s\n  Auth name: %.*s ID: %d\n", 
+	AuditF("client %d %s from %s%s\n  Auth name: %.*s ID: %d\n", 
 	       client->index, letin ? "connected" : "rejected", addr,
-	       (int)proto_n, auth_proto, auth_id);
+	       client_uid_string, (int)proto_n, auth_proto, auth_id);
     else 
-	AuditF("client %d %s from %s\n", 
-	       client->index, letin ? "connected" : "rejected", addr);
+	AuditF("client %d %s from %s%s\n", 
+	       client->index, letin ? "connected" : "rejected", addr,
+	       client_uid_string);
 }
 
 XID
diff-tree a2d6242106bb3a440faa9cad157e0120dbfa7b6e (from d9a5e3e964b6c91fbca88b50674fce9660b972a4)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 00:46:33 2006 +0200

    kdrive:remove Change{Keyboard,Pointer}Device
    This was removed in the DIX, so just axe it.

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index be18586..83da67f 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -2269,21 +2269,6 @@ ProcessInputEvents ()
     KdCheckLock ();
 }
 
-/* We don't want to allow people to change the core devices, because the DIX
- * does magical repeating goodness for us. */
-int
-ChangeKeyboardDevice(DeviceIntPtr pOldDev, DeviceIntPtr pDev)
-{
-    return BadDevice;
-}
-
-int
-ChangePointerDevice(DeviceIntPtr pOldDev, DeviceIntPtr pDev, unsigned char x,
-                    unsigned char y)
-{
-    return BadDevice;
-}
-
 /* FIXME use XSECURITY to work out whether the client should be allowed to
  * open and close. */
 void
diff-tree d9a5e3e964b6c91fbca88b50674fce9660b972a4 (from d7d931abe01a8cf555b027f2bcfcccd5e9053e52)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Nov 2 00:45:23 2006 +0200

    XkbCopyKeymap: be more careful with levels, allocate compat/geom
    Take various extra precautions with copying levels across (thanks Chris
    Lee for a gdb session), including allocating when we don't already have a
    coherent map.
    Only free type components if they're present.
    Allocate geometry and compat components if we don't already have them in
    the dest map.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 0c1ac9c..627ab20 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -1082,52 +1082,61 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
             stype = src->map->types;
             dtype = dst->map->types;
             for (i = 0; i < src->map->num_types; i++, dtype++, stype++) {
-                if (stype->num_levels != dtype->num_levels) {
-                    if (dtype->level_names)
+                if (stype->num_levels) {
+                    if (stype->num_levels != dtype->num_levels &&
+                        dtype->num_levels && dtype->level_names) {
                         tmp = xrealloc(dtype->level_names,
                                        stype->num_levels * sizeof(Atom));
-                    else
+                        if (!tmp)
+                            continue;
+                        dtype->level_names = tmp;
+                    }
+                    else if (!dtype->num_levels || !dtype->level_names) {
                         tmp = xalloc(stype->num_levels * sizeof(Atom));
-                    if (!tmp)
-                        continue; /* don't return FALSE here, try to whack
-                                     all the pointers we can, so we don't
-                                     double-free when going down. */
-                    dtype->level_names = tmp;
+                        if (!tmp)
+                            continue;
+                        dtype->level_names = tmp;
+                    }
                     dtype->num_levels = stype->num_levels;
+                    memcpy(dtype->level_names, stype->level_names,
+                           stype->num_levels * sizeof(Atom));
+                }
+                else {
+                    if (dtype->num_levels && dtype->level_names)
+                        xfree(dtype->level_names);
+                    dtype->num_levels = 0;
+                    dtype->level_names = NULL;
                 }
-                memcpy(dtype->level_names, stype->level_names,
-                       stype->num_levels * sizeof(Atom));
 
                 dtype->name = stype->name;
                 memcpy(&dtype->mods, &stype->mods, sizeof(XkbModsRec));
 
-                if (stype->map) {
-                    if (dtype->map) {
-                        if (stype->map_count != dtype->map_count) {
+                if (stype->map_count) {
+                    if (stype->map) {
+                        if (stype->map_count != dtype->map_count &&
+                            dtype->map_count && dtype->map) {
                             tmp = xrealloc(dtype->map,
                                            stype->map_count *
                                              sizeof(XkbKTMapEntryRec));
                             if (!tmp)
                                 return FALSE;
                             dtype->map = tmp;
+                       }
+                        else if (!dtype->map_count || !dtype->map) {
+                            tmp = xalloc(stype->map_count *
+                                           sizeof(XkbKTMapEntryRec));
+                            if (!tmp)
+                                return FALSE;
+                            dtype->map = tmp;
                         }
-                    }
-                    else {
-                        tmp = xalloc(stype->map_count *
-                                       sizeof(XkbKTMapEntryRec));
-                        if (!tmp)
-                            return FALSE;
-                        dtype->map = tmp;
-                    }
 
-                    dtype->map_count = stype->map_count;
-                    memcpy(dtype->map, stype->map, stype->map_count *
-                                               sizeof(XkbKTMapEntryRec));
-                }
+                        memcpy(dtype->map, stype->map,
+                               stype->map_count * sizeof(XkbKTMapEntryRec));
+                    }
 
-                if (stype->preserve) {
-                    if (dtype->preserve) {
-                        if (stype->map_count != dtype->map_count) {
+                    if (stype->preserve) {
+                        if (stype->map_count != dtype->map_count &&
+                            dtype->map_count && dtype->preserve) {
                             tmp = xrealloc(dtype->preserve,
                                            stype->map_count *
                                              sizeof(XkbModsRec));
@@ -1135,22 +1144,30 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                                 return FALSE;
                             dtype->preserve = tmp;
                         }
-                    }
-                    else {
-                        tmp = xalloc(stype->map_count * sizeof(XkbModsRec));
-                        if (!tmp)
-                            return FALSE;
-                        dtype->preserve = tmp;
+                        else if (!dtype->preserve || !dtype->map_count) {
+                            tmp = xalloc(stype->map_count *
+                                         sizeof(XkbModsRec));
+                            if (!tmp)
+                                return FALSE;
+                            dtype->preserve = tmp;
+                        }
+
+                        memcpy(dtype->preserve, stype->preserve,
+                               stype->map_count * sizeof(XkbModsRec));
                     }
 
-                    memcpy(dtype->preserve, stype->preserve,
-                           stype->map_count * sizeof(XkbModsRec));
+                    dtype->map_count = stype->map_count;
                 }
                 else {
-                    if (dtype->preserve) {
-                        xfree(dtype->preserve);
-                        dtype->preserve = NULL;
+                    if (dtype->map_count) {
+                        if (dtype->map)
+                            xfree(dtype->map);
+                        if (dtype->preserve)
+                            xfree(dtype->preserve);
+                        dtype->map_count = 0;
                     }
+                    dtype->map = NULL;
+                    dtype->preserve = NULL;
                 }
             }
         }
@@ -1160,9 +1177,9 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                      i++, dtype++) {
                     if (dtype->level_names)
                         xfree(dtype->level_names);
-                    if (dtype->map)
+                    if (dtype->map && dtype->map_count)
                         xfree(dtype->map);
-                    if (dtype->preserve)
+                    if (dtype->preserve && dtype->preserve)
                         xfree(dtype->preserve);
                 }
                 xfree(dst->map->types);
@@ -1451,6 +1468,12 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
 
     /* compat */
     if (src->compat) {
+        if (!dst->compat) {
+            dst->compat = xcalloc(1, sizeof(XkbCompatMapRec));
+            if (!dst->compat)
+                return FALSE;
+        }
+
         if (src->compat->sym_interpret) {
             if (src->compat->size_si != dst->compat->size_si) {
                 if (dst->compat->sym_interpret)
@@ -1486,6 +1509,12 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
 
     /* geometry */
     if (src->geom) {
+        if (!dst->geom) {
+            dst->geom = xcalloc(sizeof(XkbGeometryRec), 1);
+            if (!dst->geom)
+                return FALSE;
+        }
+
         /* properties */
         if (src->geom->num_properties) {
             if (src->geom->num_properties != dst->geom->sz_properties) {
diff-tree 6fdfd9dad91d7b7aa292f8c4d268dd27c34de8d3 (from 40f84793bca40dcc6883d51aefa1bda44bd1ac61)
Author: Eric Anholt <eric at anholt.net>
Date:   Wed Nov 1 14:29:59 2006 -0800

    Fix several cases where optimized paths were hit when they shouldn't be.
    
    This fixes a number of rendercheck cases.

diff --git a/fb/fbpict.c b/fb/fbpict.c
index d839994..28503c0 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -930,9 +930,8 @@ fbComposite (CARD8      op,
     case PictOpOver:
 	if (pMask)
 	{
-	    if (srcRepeat &&
-		pSrc->pDrawable->width == 1 &&
-		pSrc->pDrawable->height == 1)
+	    if (fbCanGetSolid(pSrc) &&
+		!maskRepeat)
 	    {
 		srcRepeat = FALSE;
 		if (PICT_FORMAT_COLOR(pSrc->format)) {
@@ -1044,7 +1043,7 @@ fbComposite (CARD8      op,
 	    {
 		if (pSrc->pDrawable == pMask->pDrawable &&
 		    xSrc == xMask && ySrc == yMask &&
-		    !pMask->componentAlpha)
+		    !pMask->componentAlpha && !maskRepeat)
 		{
 		    /* source == mask: non-premultiplied data */
 		    switch (pSrc->format) {
@@ -1108,9 +1107,7 @@ fbComposite (CARD8      op,
 		else
 		{
 		    /* non-repeating source, repeating mask => translucent window */
-		    if (maskRepeat &&
-			pMask->pDrawable->width == 1 &&
-			pMask->pDrawable->height == 1)
+		    if (fbCanGetSolid(pMask))
 		    {
 			if (pSrc->format == PICT_x8r8g8b8 &&
 			    pDst->format == PICT_x8r8g8b8 &&
@@ -1127,9 +1124,7 @@ fbComposite (CARD8      op,
 	}
 	else /* no mask */
 	{
-	    if (srcRepeat &&
-		pSrc->pDrawable->width == 1 &&
-		pSrc->pDrawable->height == 1)
+	    if (fbCanGetSolid(pSrc))
 	    {
 		/* no mask and repeating source */
 		switch (pSrc->format) {
diff --git a/fb/fbpict.h b/fb/fbpict.h
index 19d5557..5cdde9e 100644
--- a/fb/fbpict.h
+++ b/fb/fbpict.h
@@ -30,6 +30,13 @@
 
 #include "renderedge.h"
 
+
+#if defined(__GNUC__)
+#define INLINE __inline__
+#else
+#define INLINE
+#endif
+
 #define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) )
 #define FbIntDiv(a,b)	 (((CARD16) (a) * 255) / (b))
 
@@ -67,6 +74,40 @@
 #define Green(x) (((x) >> 8) & 0xff)
 #define Blue(x) ((x) & 0xff)
 
+/**
+ * Returns TRUE if the fbComposeGetSolid can be used to get a single solid
+ * color representing every source sampling location of the picture.
+ */
+static INLINE Bool
+fbCanGetSolid(PicturePtr pict)
+{
+    if (pict->pDrawable == NULL ||
+	pict->pDrawable->width != 1 ||
+	pict->pDrawable->height != 1)
+    {
+	return FALSE;
+    }
+    if (pict->repeat != RepeatNormal)
+	return FALSE;
+
+    switch (pict->format) {
+    case PICT_a8r8g8b8:
+    case PICT_x8r8g8b8:
+    case PICT_a8b8g8r8:
+    case PICT_x8b8g8r8:
+    case PICT_r8g8b8:
+    case PICT_b8g8r8:
+    case PICT_r5g6b5:
+    case PICT_b5g6r5:
+	return TRUE;
+    default:
+	return FALSE;
+    }
+}
+
+#define fbCanGetSolid(pict) \
+(pict->pDrawable != NULL && pict->pDrawable->width == 1 && pict->pDrawable->height == 1)
+
 #define fbComposeGetSolid(pict, bits, fmt) { \
     FbBits	*__bits__; \
     FbStride	__stride__; \
@@ -322,12 +363,6 @@
 #define FASTCALL
 #endif
 
-#if defined(__GNUC__)
-#define INLINE __inline__
-#else
-#define INLINE
-#endif
-
 typedef struct _FbComposeData {
     CARD8	op;
     PicturePtr	src;
diff-tree 40f84793bca40dcc6883d51aefa1bda44bd1ac61 (from c03311a1e78daa291477a67b1bb7206772108c5d)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Wed Nov 1 14:34:46 2006 -0800

    Propogate $LIBS for xtrans, clock_gettime, libm, etc. to libs used for each server

diff --git a/configure.ac b/configure.ac
index 6676ea6..058759d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -874,7 +874,7 @@ PKG_CHECK_MODULES([XSERVERCFLAGS], [$REQ
 PKG_CHECK_MODULES([XSERVERLIBS], [$REQUIRED_LIBS])
 
 XSERVER_CFLAGS="${XSERVERCFLAGS_CFLAGS}"
-XSERVER_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} -lm"
+XSERVER_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} ${LIBS}"
 AC_SUBST([SYS_LIBS])
 
 AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes],
@@ -885,9 +885,9 @@ AC_MSG_CHECKING([for a useful monotonic 
 
 if ! test "x$have_clock_gettime" = xno; then
     if ! test "x$have_clock_gettime" = xyes; then
-        LIBS="$have_clock_gettime"
+        CLOCK_LIBS="$have_clock_gettime"
     else
-        LIBS=""
+        CLOCK_LIBS=""
     fi
 
     AC_RUN_IFELSE([
@@ -912,7 +912,8 @@ AC_MSG_RESULT([$MONOTONIC_CLOCK])
 
 if test "x$MONOTONIC_CLOCK" = xyes; then
     AC_DEFINE(MONOTONIC_CLOCK, 1, [Have monotonic clock from clock_gettime()])
-    XSERVER_LIBS="$XSERVER_LIBS $LIBS"
+    XSERVER_LIBS="$XSERVER_LIBS $CLOCK_LIBS"
+    LIBS="$LIBS $CLOCK_LIBS"
 fi
 
 dnl Imake defines SVR4 on SVR4 systems, and many files check for it, so
@@ -990,7 +991,7 @@ AC_MSG_RESULT([$XVFB])
 AM_CONDITIONAL(XVFB, [test "x$XVFB" = xyes])
 
 if test "x$XVFB" = xyes; then
-	XVFB_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB"
+	XVFB_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB $LIBS"
 	AC_SUBST([XVFB_LIBS])
 fi
 
@@ -1006,7 +1007,7 @@ AC_MSG_RESULT([$XNEST])
 AM_CONDITIONAL(XNEST, [test "x$XNEST" = xyes])
 
 if test "x$XNEST" = xyes; then
-	XNEST_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB"
+	XNEST_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB $LIBS"
 	AC_SUBST([XNEST_LIBS])
 fi
 
@@ -1369,7 +1370,7 @@ AC_MSG_RESULT([$XPRINT])
 if test "x$XPRINT" = xyes; then
 	PKG_CHECK_MODULES([XPRINT], [printproto x11 xfont $XDMCP_MODULES xau])
 	XPRINT_EXTENSIONS="$XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $RENDER_LIB $COMPOSITE_LIB $RANDR_LIB $XI_LIB $FIXES_LIB $DAMAGE_LIB $XI_LIB $GLX_LIBS"
-	XPRINT_LIBS="$XPRINT_LIBS $DIX_LIB $XKB_LIB $XKB_STUB_LIB $XPRINT_EXTENSIONS $MI_LIB $MIEXT_DAMAGE_LIB $CWRAP_LIB $OS_LIB"
+	XPRINT_LIBS="$XPRINT_LIBS $DIX_LIB $XKB_LIB $XKB_STUB_LIB $XPRINT_EXTENSIONS $MI_LIB $MIEXT_DAMAGE_LIB $CWRAP_LIB $OS_LIB $LIBS"
 	AC_SUBST([XPRINT_CFLAGS])
 	AC_SUBST([XPRINT_LIBS])
 
diff-tree d7d931abe01a8cf555b027f2bcfcccd5e9053e52 (from 81728558a044fdde0e1d63da7b6314755f77296e)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 1 23:48:58 2006 +0200

    configure.ac: remove check for rate/period
    Keyboard stuff is now handled in the kbd driver.

diff --git a/configure.ac b/configure.ac
index aa6c607..8935aa0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1194,25 +1194,6 @@ dnl has it in libc), or if libdl is need
 		  *)
 			;;
 		esac
-
-		# check whether struct kbd_repeat has the 'period' field.
-		# on kernels < 2.5.42 it's called 'rate' instead.
-		AC_TRY_COMPILE([
-#include <linux/kd.h>
-#ifdef __sparc__
-#include <asm/param.h>
-#include <asm/kbio.h>
-#endif
-],[
-int main () { 
-	struct kbd_repeat k;
-	k.period = 0;
-	return 0;
-}],
-		[period_field="period"],
-		[period_field="rate"])
-		AC_DEFINE_UNQUOTED(LNX_KBD_PERIOD_NAME, [$period_field],
-		                   [Name of the period field in struct kbd_repeat])
 		;;
 	  freebsd* | kfreebsd*-gnu)
 	  	XORG_OS="freebsd"
diff-tree 81728558a044fdde0e1d63da7b6314755f77296e (from 3df454719f9cbf6a046cb7458019ec621b3b42ee)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 1 23:10:26 2006 +0200

    input: add non-keyboard bell ringing function
    Add a generic 'ring the bell' function (console bell on Linux and BSD,
    /dev/audio on Solaris), and add DDX functions for this.  Make this the
    core keyboard's bell.
    Port Xvfb and Xnest to this.
    Port XFree86 to this, with OS-specific hooks for Linux, BSD, and Solaris
    taken from foo_io.c in the old layer.

diff --git a/dix/devices.c b/dix/devices.c
index a554f2f..aa04862 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -211,9 +211,11 @@ ActivateDevice(DeviceIntPtr dev)
 }
 
 static void
-CoreKeyboardBell(int volume, DeviceIntPtr pDev, pointer ctrl, int something)
+CoreKeyboardBell(int volume, DeviceIntPtr pDev, pointer arg, int something)
 {
-    return;
+    KeybdCtrl *ctrl = arg;
+
+    DDXRingBell(volume, ctrl->bell_pitch, ctrl->bell_duration);
 }
 
 static void
diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index 9cb1c02..99cf56c 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -55,6 +55,10 @@ ProcessInputEvents()
     miPointerUpdate();
 }
 
+void DDXRingBell(int volume, int pitch, int duration)
+{
+}
+
 #define VFB_MIN_KEY 8
 #define VFB_MAX_KEY 255
 KeySym  map[MAP_LENGTH * LK201_GLYPHS_PER_KEY];
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 3df201a..4a9f369 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -1128,6 +1128,11 @@ xf86ReloadInputDevs(int sig)
   return;
 }
 
+_X_EXPORT void
+DDXRingBell(int volume, int pitch, int duration) {
+    xf86OSRingBell(volume, pitch, duration);
+}
+
 #ifdef WSCONS_SUPPORT
 
 /* XXX Currently XKB is mandatory. */
diff --git a/hw/xfree86/os-support/bsd/Makefile.am b/hw/xfree86/os-support/bsd/Makefile.am
index 0a0bcab..e456328 100644
--- a/hw/xfree86/os-support/bsd/Makefile.am
+++ b/hw/xfree86/os-support/bsd/Makefile.am
@@ -63,6 +63,7 @@ libbsd_la_SOURCES = \
 	bsd_VTsw.c \
 	bsd_init.c \
 	bsd_mouse.c \
+	bsd_bell.c \
 	$(ARCH_SOURCES) \
 	$(AGP_SOURCES) \
 	$(APM_SOURCES) \
diff --git a/hw/xfree86/os-support/bsd/bsd_bell.c b/hw/xfree86/os-support/bsd/bsd_bell.c
new file mode 100644
index 0000000..60c2ffc
--- /dev/null
+++ b/hw/xfree86/os-support/bsd/bsd_bell.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright 1992 by Rich Murphey <Rich at Rice.edu>
+ * Copyright 1993 by David Dawes <dawes at xfree86.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the names of Rich Murphey and David Dawes 
+ * not be used in advertising or publicity pertaining to distribution of 
+ * the software without specific, written prior permission.  Rich Murphey and
+ * David Dawes make no representations about the suitability of this 
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * RICH MURPHEY AND DAVID DAWES DISCLAIM ALL WARRANTIES WITH REGARD TO 
+ * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 
+ * FITNESS, IN NO EVENT SHALL RICH MURPHEY OR DAVID DAWES BE LIABLE FOR 
+ * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER 
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF 
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <termios.h>
+
+#include "xf86.h"
+#include "xf86Priv.h"
+
+#ifdef WSCONS_SUPPORT
+#define KBD_FD(i) ((i).kbdFd != -1 ? (i).kbdFd : (i).consoleFd)
+#endif
+
+_X_EXPORT void
+xf86OSRingBell(int loudness, int pitch, int duration)
+{
+#ifdef WSCONS_SUPPORT
+        struct wskbd_bell_data wsb;
+#endif
+
+        if (loudness && pitch)
+        {
+#ifdef PCCONS_SUPPORT
+                int data[2];
+#endif
+
+                switch (xf86Info.consType) {
+
+#ifdef PCCONS_SUPPORT
+                case PCCONS:
+                        data[0] = pitch;
+                        data[1] = (duration * loudness) / 50;
+                        ioctl(xf86Info.consoleFd, CONSOLE_X_BELL, data);
+                        break;
+#endif
+#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
+                case SYSCONS:
+                case PCVT:
+                        ioctl(xf86Info.consoleFd, KDMKTONE,
+                              ((1193190 / pitch) & 0xffff) |
+                              (((unsigned long)duration*loudness/50)<<16));
+                        break;
+#endif
+#if defined (WSCONS_SUPPORT)
+                case WSCONS:
+                        wsb.which = WSKBD_BELL_DOALL;
+                        wsb.pitch = pitch;
+                        wsb.period = duration;
+                        wsb.volume = loudness;
+                        ioctl(KBD_FD(xf86Info), WSKBDIO_COMPLEXBELL,
+                                      &wsb);
+                        break;
+#endif
+                }
+        }
+}
diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am
index fc4243b..673a4e1 100644
--- a/hw/xfree86/os-support/linux/Makefile.am
+++ b/hw/xfree86/os-support/linux/Makefile.am
@@ -20,7 +20,7 @@ XORG_CFLAGS += -DHAVE_APM
 endif
 
 liblinux_la_SOURCES = lnx_init.c lnx_video.c lnx_mouse.c \
-                     lnx_pci.c lnx_agp.c lnx_kmod.c \
+                     lnx_pci.c lnx_agp.c lnx_kmod.c lnx_bell.c \
                      $(srcdir)/../shared/bios_mmap.c \
 		     $(srcdir)/../shared/VTsw_usl.c \
 		     $(srcdir)/../shared/posix_tty.c \
diff --git a/hw/xfree86/os-support/linux/lnx_bell.c b/hw/xfree86/os-support/linux/lnx_bell.c
new file mode 100644
index 0000000..6ef881b
--- /dev/null
+++ b/hw/xfree86/os-support/linux/lnx_bell.c
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2006 Daniel Stone
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and that
+ * both that this copyright notice and this permission notice appear in
+ * supporting electronic documentation.
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR AUTHORS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Daniel Stone <daniel at fooishbar.org>
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <sys/ioctl.h>
+#include <linux/kd.h>
+
+#include "xf86.h"
+#include "xf86Priv.h"
+
+_X_EXPORT void
+xf86OSRingBell(int loudness, int pitch, int duration)
+{
+    if (xf86Info.consoleFd == -1 || !pitch || !loudness)
+        return;
+
+    ioctl(xf86Info.consoleFd, KDMKTONE,
+          ((1193190 / pitch) & 0xffff) |
+          (((unsigned long)duration * loudness / 50) << 16));
+}
diff --git a/hw/xfree86/os-support/solaris/Makefile.am b/hw/xfree86/os-support/solaris/Makefile.am
index 9c86079..291c329 100644
--- a/hw/xfree86/os-support/solaris/Makefile.am
+++ b/hw/xfree86/os-support/solaris/Makefile.am
@@ -19,7 +19,7 @@ solaris-$(SOLARIS_INOUT_ARCH).il: solari
 
 noinst_LTLIBRARIES = libsolaris.la
 libsolaris_la_SOURCES = sun_bios.c sun_init.c \
-	sun_mouse.c sun_vid.c $(AGP_SRC) \
+	sun_mouse.c sun_vid.c sun_bell.c $(AGP_SRC) \
 	$(srcdir)/../shared/libc_wrapper.c \
 	$(srcdir)/../shared/kmod_noop.c $(srcdir)/../shared/pm_noop.c \
 	$(srcdir)/../shared/posix_tty.c $(srcdir)/../shared/sigiostubs.c \
diff --git a/hw/xfree86/os-support/solaris/sun_bell.c b/hw/xfree86/os-support/solaris/sun_bell.c
new file mode 100644
index 0000000..369103f
--- /dev/null
+++ b/hw/xfree86/os-support/solaris/sun_bell.c
@@ -0,0 +1,184 @@
+/* Copyright 2004-2005 Sun Microsystems, Inc.  All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, and/or sell copies of the Software, and to permit persons
+ * to whom the Software is furnished to do so, provided that the above
+ * copyright notice(s) and this permission notice appear in all copies of
+ * the Software and that both the above copyright notice(s) and this
+ * permission notice appear in supporting documentation.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+ * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+ * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+ * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * 
+ * Except as contained in this notice, the name of a copyright holder
+ * shall not be used in advertising or otherwise to promote the sale, use
+ * or other dealings in this Software without prior written authorization
+ * of the copyright holder.
+ */
+
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <sys/audio.h>
+#include <sys/uio.h>
+#include <limits.h>
+#include <math.h>
+#include <poll.h>
+
+#include "xf86.h"
+#include "xf86Priv.h"
+
+#define BELL_RATE       48000   /* Samples per second */
+#define BELL_HZ         50      /* Fraction of a second i.e. 1/x */
+#define BELL_MS         (1000/BELL_HZ)  /* MS */
+#define BELL_SAMPLES    (BELL_RATE / BELL_HZ)
+#define BELL_MIN        3       /* Min # of repeats */
+
+#define AUDIO_DEVICE    "/dev/audio"
+
+_X_EXPORT int
+xf86OSRingBell(int loudness, int pitch, int duration)
+{
+    static short    samples[BELL_SAMPLES];
+    static short    silence[BELL_SAMPLES]; /* "The Sound of Silence" */
+    static int      lastFreq;
+    int             cnt; 
+    int             i;
+    int             written;
+    int             repeats;
+    int             freq;
+    audio_info_t    audioInfo;
+    struct iovec    iov[IOV_MAX];
+    int             iovcnt;
+    double          ampl, cyclen, phase;
+    int             audioFD;
+
+    if ((loudness <= 0) || (pitch <= 0) || (duration <= 0)) {
+        return 0;
+    }
+
+    lastFreq = 0;
+    bzero(silence, sizeof(silence));
+
+    audioFD = open(AUDIO_DEVICE, O_WRONLY | O_NONBLOCK);
+    if (audioFD == -1) {
+        xf86Msg(X_ERROR, "Bell: cannot open audio device \"%s\": %s\n",
+                AUDIO_DEVICE, strerror(errno));
+        return -1;
+    }
+
+    freq = pitch;
+    freq = min(freq, (BELL_RATE / 2) - 1);
+    freq = max(freq, 2 * BELL_HZ);
+
+    /*
+     * Ensure full waves per buffer
+     */
+    freq -= freq % BELL_HZ;
+
+    if (freq != lastFreq) {
+        lastFreq = freq;
+        ampl =  16384.0;
+
+        cyclen = (double) freq / (double) BELL_RATE;
+        phase = 0.0;
+
+        for (i = 0; i < BELL_SAMPLES; i++) {
+            samples[i] = (short) (ampl * sin(2.0 * M_PI * phase));
+            phase += cyclen;
+            if (phase >= 1.0)
+                phase -= 1.0;
+        }
+    }
+
+    repeats = (duration + (BELL_MS / 2)) / BELL_MS;
+    repeats = max(repeats, BELL_MIN);
+
+    loudness = max(0, loudness);
+    loudness = min(loudness, 100);
+
+#ifdef DEBUG
+    ErrorF("BELL : freq %d volume %d duration %d repeats %d\n",
+           freq, loudness, duration, repeats);
+#endif
+
+    AUDIO_INITINFO(&audioInfo);
+    audioInfo.play.encoding = AUDIO_ENCODING_LINEAR;
+    audioInfo.play.sample_rate = BELL_RATE;
+    audioInfo.play.channels = 2;
+    audioInfo.play.precision = 16;
+    audioInfo.play.gain = min(AUDIO_MAX_GAIN, AUDIO_MAX_GAIN * loudness / 100);
+
+    if (ioctl(audioFD, AUDIO_SETINFO, &audioInfo) < 0){
+        xf86Msg(X_ERROR,
+                "Bell: AUDIO_SETINFO failed on audio device \"%s\": %s\n",
+                AUDIO_DEVICE, strerror(errno));
+        close(audioFD);
+        return -1;
+    }
+
+    iovcnt = 0;
+
+    for (cnt = 0; cnt <= repeats; cnt++) {
+        iov[iovcnt].iov_base = (char *) samples;
+        iov[iovcnt++].iov_len = sizeof(samples);
+        if (cnt == repeats) {
+            /* Insert a bit of silence so that multiple beeps are distinct and
+             * not compressed into a single tone.
+             */
+            iov[iovcnt].iov_base = (char *) silence;
+            iov[iovcnt++].iov_len = sizeof(silence);
+        }
+        if ((iovcnt >= IOV_MAX) || (cnt == repeats)) {
+            written = writev(audioFD, iov, iovcnt);
+
+            if ((written < ((int)(sizeof(samples) * iovcnt)))) {
+                /* audio buffer was full! */
+
+                int naptime;
+
+                if (written == -1) {
+                    if (errno != EAGAIN) {
+                        xf86Msg(X_ERROR,
+                               "Bell: writev failed on audio device \"%s\": %s\n",
+                                AUDIO_DEVICE, strerror(errno));
+                        close(audioFD);
+                        return -1;
+                    }
+                    i = iovcnt;
+                } else {
+                    i = ((sizeof(samples) * iovcnt) - written)
+                        / sizeof(samples);
+                }
+                cnt -= i;
+
+                /* sleep a little to allow audio buffer to drain */
+                naptime = BELL_MS * i;
+                poll(NULL, 0, naptime);
+
+                i = ((sizeof(samples) * iovcnt) - written) % sizeof(samples);
+                iovcnt = 0;
+                if ((written != -1) && (i > 0)) {
+                    iov[iovcnt].iov_base = ((char *) samples) + i;
+                    iov[iovcnt++].iov_len = sizeof(samples) - i;
+                }
+            } else {
+                iovcnt = 0;
+            }
+        }
+    }
+
+    close(audioFD);
+    return 0;
+}
diff --git a/hw/xfree86/os-support/xf86_OSproc.h b/hw/xfree86/os-support/xf86_OSproc.h
index c987d75..0311b81 100644
--- a/hw/xfree86/os-support/xf86_OSproc.h
+++ b/hw/xfree86/os-support/xf86_OSproc.h
@@ -174,6 +174,7 @@ extern int xf86GetSerialModemState(int f
 extern int xf86SerialModemSetBits(int fd, int bits);
 extern int xf86SerialModemClearBits(int fd, int bits);
 extern int xf86LoadKernelModule(const char *pathname);
+extern void xf86RingBell(int volume, int pitch, int duration);
 
 /* AGP GART interface */
 
diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c
index 26a5ed3..0dacae7 100644
--- a/hw/xnest/Keyboard.c
+++ b/hw/xnest/Keyboard.c
@@ -94,6 +94,12 @@ xnestBell(int volume, DeviceIntPtr pDev,
 }
 
 void
+DDXRingBell(int volume, int pitch, int duration)
+{
+  XBell(xnestDisplay, volume);
+}
+
+void
 xnestChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
 {
 #if 0
diff --git a/include/input.h b/include/input.h
index 3fe6944..f2fe6d1 100644
--- a/include/input.h
+++ b/include/input.h
@@ -441,7 +441,9 @@ extern DeviceIntPtr LookupDeviceIntRec(
 extern int NewInputDeviceRequest(
     InputOption *options);
 
-extern DeviceIntPtr LookupDeviceIntRec(
-    CARD8 deviceid);
+extern void DDXRingBell(
+    int volume,
+    int pitch,
+    int duration);
 
 #endif /* INPUT_H */
diff-tree 3df454719f9cbf6a046cb7458019ec621b3b42ee (from 644ee2434a4e09f5baea00a486911f8c24b9a261)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Nov 1 23:02:57 2006 +0200

    kdrive: add KdRingBell prototype

diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index f0fc909..ced48d7 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -872,6 +872,12 @@ KdEnableInput (void);
 void
 ProcessInputEvents (void);
 
+void
+KdRingBell (KdKeyboardInfo      *ki,
+            int                 volume,
+            int                 pitch,
+            int                 duration);
+
 extern KdPointerDriver	LinuxMouseDriver;
 extern KdPointerDriver	LinuxEvdevDriver;
 extern KdPointerDriver	Ps2MouseDriver;
diff-tree 4056e6e79a4e37101d298ae29139c83d3816368b (from e21604914dccece6bc64c69b55512d1f1a969235)
Author: Keith Packard <keithp at mandolin.keithp.com>
Date:   Wed Nov 1 00:29:46 2006 -0800

    Move physical size from mode to output.
    
    Modes can be shared across different sized monitors this way.
    
    Also caught some missing byteswapping and an incorrect return type.

diff --git a/randr/mirandr.c b/randr/mirandr.c
index 8d79e8a..11c2991 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -111,8 +111,6 @@ miRandRInit (ScreenPtr pScreen)
     memset (&modeInfo, '\0', sizeof (modeInfo));
     modeInfo.width = pScreen->width;
     modeInfo.height = pScreen->height;
-    modeInfo.mmWidth = pScreen->mmWidth;
-    modeInfo.mmHeight = pScreen->mmHeight;
     modeInfo.nameLength = strlen (name);
     
     mode = RRModeGet (pScreen, &modeInfo, name);
diff --git a/randr/randrstr.h b/randr/randrstr.h
index a8a9950..60877a3 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -107,6 +107,8 @@ struct _rrOutput {
     int		    nameLength;
     CARD8	    connection;
     CARD8	    subpixelOrder;
+    int		    mmWidth;
+    int		    mmHeight;
     RRCrtcPtr	    crtc;
     CARD32	    currentOptions;
     CARD32	    possibleOptions;
@@ -642,6 +644,11 @@ Bool
 RROutputSetCurrentOptions (RROutputPtr output,
 			   CARD32      currentOptions);
 
+Bool
+RROutputSetPhysicalSize (RROutputPtr	output,
+			 int		mmWidth,
+			 int		mmHeight);
+
 void
 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output);
 
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index ee51cc2..c40dac1 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -270,8 +270,16 @@ RRCrtcSet (RRCrtcPtr    crtc,
 
 	size.width = mode->mode.width;
 	size.height = mode->mode.height;
-	size.mmWidth = mode->mode.mmWidth;
-	size.mmHeight = mode->mode.mmHeight;
+	if (outputs[0].output->mmWidth && outputs[0].output->mmHeight)
+	{
+	    size.mmWidth = outputs[0].output->mmWidth;
+	    size.mmHeight = outputs[0].output->mmHeight;
+	}
+	else
+	{
+	    size.mmWidth = pScreen->mmWidth;
+	    size.mmHeight = pScreen->mmHeight;
+	}
 	size.nRates = 1;
 	rate.rate = RRVerticalRefresh (&mode->mode);
 	size.pRates = &rate;
diff --git a/randr/rrinfo.c b/randr/rrinfo.c
index 6fd4ee5..e92caad 100644
--- a/randr/rrinfo.c
+++ b/randr/rrinfo.c
@@ -39,8 +39,6 @@ RROldModeAdd (RROutputPtr output, RRScre
     
     modeInfo.width = size->width;
     modeInfo.height = size->height;
-    modeInfo.mmWidth = size->mmWidth;
-    modeInfo.mmHeight = size->mmHeight;
     modeInfo.hTotal = size->width;
     modeInfo.vTotal = size->height;
     modeInfo.dotClock = ((CARD32) size->width * (CARD32) size->height *
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 07cd0c1..fb4b5eb 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -29,8 +29,6 @@ RRModeEqual (xRRModeInfo *a, xRRModeInfo
 {
     if (a->width != b->width) return FALSE;
     if (a->height != b->height) return FALSE;
-    if (a->mmWidth != b->mmWidth) return FALSE;
-    if (a->mmHeight != b->mmHeight) return FALSE;
     if (a->dotClock != b->dotClock) return FALSE;
     if (a->hSyncStart != b->hSyncStart) return FALSE;
     if (a->hSyncEnd != b->hSyncEnd) return FALSE;
diff --git a/randr/rroutput.c b/randr/rroutput.c
index fc84ec1..1f6f330 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -72,6 +72,8 @@ RROutputCreate (ScreenPtr   pScreen,
     output->name[nameLength] = '\0';
     output->connection = RR_UnknownConnection;
     output->subpixelOrder = SubPixelUnknown;
+    output->mmWidth = 0;
+    output->mmHeight = 0;
     output->crtc = NULL;
     output->currentOptions = 0;
     output->possibleOptions = 0;
@@ -262,6 +264,20 @@ RROutputSetCurrentOptions (RROutputPtr o
     return TRUE;
 }
 
+Bool
+RROutputSetPhysicalSize (RROutputPtr	output,
+			 int		mmWidth,
+			 int		mmHeight)
+{
+    if (output->mmWidth == mmWidth && output->mmHeight == mmHeight)
+	return TRUE;
+    output->mmWidth = mmWidth;
+    output->mmHeight = mmHeight;
+    RROutputChanged (output);
+    return TRUE;
+}
+
+
 void
 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output)
 {
@@ -381,6 +397,8 @@ ProcRRGetOutputInfo (ClientPtr client)
     rep.timestamp = pScrPriv->lastSetTime.milliseconds;
     rep.crtc = output->crtc ? output->crtc->id : None;
     rep.currentOptions = output->currentOptions;
+    rep.mmWidth = output->mmWidth;
+    rep.mmHeight = output->mmHeight;
     rep.connection = output->connection;
     rep.subpixelOrder = output->subpixelOrder;
     rep.nCrtcs = output->numCrtcs;
@@ -434,10 +452,15 @@ ProcRRGetOutputInfo (ClientPtr client)
 	swapl(&rep.length, n);
 	swapl(&rep.timestamp, n);
 	swapl(&rep.crtc, n);
+	swapl(&rep.currentOptions, n);
+	swapl(&rep.mmWidth, n);
+	swapl(&rep.mmHeight, n);
 	swaps(&rep.nCrtcs, n);
 	swaps(&rep.nModes, n);
 	swaps(&rep.nClones, n);
+	swapl(&rep.possibleOptions, n);
 	swaps(&rep.nameLength, n);
+	swapl(&rep.possibleOptions, n);
     }
     WriteToClient(client, sizeof(xRRGetOutputInfoReply), (char *)&rep);
     if (extraLen)
diff --git a/randr/rrpointer.c b/randr/rrpointer.c
index 7ba0460..c092e49 100644
--- a/randr/rrpointer.c
+++ b/randr/rrpointer.c
@@ -131,7 +131,7 @@ RRPointerScreenConfigured (ScreenPtr pSc
     int		x, y;
 
     if (pScreen != pCurrentScreen)
-	return FALSE;
+	return;
     GetSpritePosition (&x, &y);
     RRPointerToNearestCrtc (pScreen, x, y, NULL);
 }
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index b4d3618..705e7d7 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -126,8 +126,8 @@ RRDeliverScreenEvent (ClientPtr client, 
 	    }
 	se.widthInPixels = mode->mode.width;
 	se.heightInPixels = mode->mode.height;
-	se.widthInMillimeters = mode->mode.mmWidth;
-	se.heightInMillimeters = mode->mode.mmHeight;
+	se.widthInMillimeters = pScreen->mmWidth;
+	se.heightInMillimeters = pScreen->mmHeight;
     }
     else
     {
@@ -415,8 +415,6 @@ ProcRRGetScreenResources (ClientPtr clie
 		swapl (&modeinfos[i].id, n);
 		swaps (&modeinfos[i].width, n);
 		swaps (&modeinfos[i].height, n);
-		swapl (&modeinfos[i].mmWidth, n);
-		swapl (&modeinfos[i].mmHeight, n);
 		swapl (&modeinfos[i].dotClock, n);
 		swaps (&modeinfos[i].hSyncStart, n);
 		swaps (&modeinfos[i].hSyncEnd, n);
@@ -501,8 +499,13 @@ RR10GetData (ScreenPtr pScreen, RROutput
 	    size[j].id = j;
 	    size[j].width = mode->mode.width;
 	    size[j].height = mode->mode.height;
-	    size[j].mmWidth = mode->mode.mmWidth;
-	    size[j].mmHeight = mode->mode.mmHeight;
+	    if (output->mmWidth && output->mmHeight) {
+		size[j].mmWidth = output->mmWidth;
+		size[j].mmHeight = output->mmHeight;
+	    } else {
+		size[j].mmWidth = pScreen->mmWidth;
+		size[j].mmHeight = pScreen->mmHeight;
+	    }
 	    size[j].nRates = 0;
 	    size[j].pRates = &refresh[data->nrefresh];
 	    data->nsize++;
diff-tree c03311a1e78daa291477a67b1bb7206772108c5d (from a2434ec5f3c9dc79d1f05c2d704a82a766718ed4)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Tue Oct 31 16:05:48 2006 -0800

    Fix automake error: BUILT_SOURCES was defined multiple times on Solaris

diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 64c54f8..72befea 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -58,12 +58,15 @@ Xorg_LDADD = $(XORG_LIBS) \
 
 Xorg_LDFLAGS = $(LD_EXPORT_SYMBOLS_FLAG)
 
+BUILT_SOURCES = xorg.conf.example
+CLEAN = xorg.conf.example xorg.conf.example.pre
+EXTRA_DIST = xorgconf.cpp
 
 if SOLARIS_ASM_INLINE
 # Needs to be built before any files are compiled when using Sun compilers
 # so in*/out* inline definitions are properly processed.
 
-BUILT_SOURCES = os-support/solaris/solaris-$(SOLARIS_INOUT_ARCH).il
+BUILT_SOURCES += os-support/solaris/solaris-$(SOLARIS_INOUT_ARCH).il
 
 os-support/solaris/solaris-$(SOLARIS_INOUT_ARCH).il:
 	cd os-support/solaris ; make solaris-$(SOLARIS_INOUT_ARCH).il
@@ -84,10 +87,6 @@ endif
 optionsdir = $(libdir)/X11
 dist_options_DATA = Options
 
-BUILT_SOURCES = xorg.conf.example
-CLEAN = xorg.conf.example xorg.conf.example.pre
-EXTRA_DIST = xorgconf.cpp
-
 CPP_FILES_FLAGS = \
 	-DRGBPATH=\"$(RGB_DB)\" \
 	-DLOCALFONTPATH="\"$(BASE_FONT_PATH)/local\"" \
diff-tree a2434ec5f3c9dc79d1f05c2d704a82a766718ed4 (from 645d0576205532a3610ae351267d5b84d76236bd)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Tue Oct 31 15:57:59 2006 -0800

    Make _POSIX_C_SOURCE hack work with Solaris headers
    
    Solaris headers are very literal - if you ask for POSIX_C_SOURCE 199309L,
    they limit to only the functions in that standard and no more, unless you
    also specify __EXTENSIONS__ to allow functions beyond the standard base.

diff --git a/os/utils.c b/os/utils.c
index 7d258a4..f7cdb82 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -58,6 +58,8 @@ OR PERFORMANCE OF THIS SOFTWARE.
 #ifdef _POSIX_C_SOURCE
 #define _SAVED_POSIX_C_SOURCE _POSIX_C_SOURCE
 #undef _POSIX_C_SOURCE
+#else if defined(sun)	/* Needed to tell Solaris headers not to restrict to */
+#define __EXTENSIONS__	/* only the functions defined in POSIX 199309.       */
 #endif
 #define _POSIX_C_SOURCE 199309L
 #include <time.h>
diff-tree 645d0576205532a3610ae351267d5b84d76236bd (from 59584c375f4e4b2670a92002ecb7a78a0bc50cce)
Author: Matthieu Herrb <matthieu.herrb at laas.fr>
Date:   Sun Oct 29 18:19:56 2006 +0100

    Handle building in a separate objdir

diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index b62ceaf..64c54f8 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -103,4 +103,4 @@ relink:
 	rm -f Xorg && $(MAKE) Xorg
 
 xorg.conf.example.pre: xorgconf.cpp
-	cp xorgconf.cpp $@
+	cp $(srcdir)/xorgconf.cpp $@
diff-tree 59584c375f4e4b2670a92002ecb7a78a0bc50cce (from 0107320fac0913aae2cb169992e31c670b4bd2f7)
Author: Matthieu Herrb <matthieu.herrb at laas.fr>
Date:   Sun Oct 29 17:49:46 2006 +0100

    kill GNU-make'ism.

diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 79d2ec5..b62ceaf 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -103,4 +103,4 @@ relink:
 	rm -f Xorg && $(MAKE) Xorg
 
 xorg.conf.example.pre: xorgconf.cpp
-	cp $< $@
+	cp xorgconf.cpp $@
diff-tree 0107320fac0913aae2cb169992e31c670b4bd2f7 (from parents)
Merge: 06b6b971d065226b983ba25da7ea8236ec37df04 a34446f5b3d90714969a90583c49cb1eae1c9651
Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Sun Oct 29 15:23:35 2006 +0100

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver

diff-tree 06b6b971d065226b983ba25da7ea8236ec37df04 (from 92d04e746bd9b8ad3ee217c165ace20468e079cf)
Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Sun Oct 29 15:22:37 2006 +0100

    Make sure we have 64-bit file-offsets in libdrm.

diff --git a/configure.ac b/configure.ac
index 140757f..6676ea6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -49,7 +49,8 @@ dnl xwin-config.h covers the XWin DDX.
 AC_CONFIG_HEADERS(include/xwin-config.h)
 dnl kdrive-config.h covers the kdrive DDX
 AC_CONFIG_HEADERS(include/kdrive-config.h)
-
+dnl libdrm now needs 64-bit file offsets
+AC_CONFIG_HEADERS(include/libdrm-config.h)
 
 AC_PROG_CC
 AM_PROG_AS
@@ -62,7 +63,6 @@ AC_PROG_MAKE_SET
 PKG_PROG_PKG_CONFIG
 AC_PROG_LEX
 AC_PROG_YACC
-dnl for libdrm
 AC_SYS_LARGEFILE
 XORG_PROG_RAWCPP
 
diff --git a/hw/xfree86/os-support/drm/xf86drm.c b/hw/xfree86/os-support/drm/xf86drm.c
index ade4266..e990e28 100644
--- a/hw/xfree86/os-support/drm/xf86drm.c
+++ b/hw/xfree86/os-support/drm/xf86drm.c
@@ -33,6 +33,7 @@
 
 
 #ifdef HAVE_XORG_CONFIG_H
+#include <libdrm-config.h>
 #include <xorg-config.h>
 #endif
 
diff --git a/include/libdrm-config.h.in b/include/libdrm-config.h.in
new file mode 100644
index 0000000..286004b
--- /dev/null
+++ b/include/libdrm-config.h.in
@@ -0,0 +1,10 @@
+/* 
+ * libdrm-config.h.in: not at all generated.
+ */
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#undef _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#undef _LARGE_FILES
+
diff-tree 644ee2434a4e09f5baea00a486911f8c24b9a261 (from 738d2e88171bcce8782d670a1cda9a1d941d7977)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 29 03:52:11 2006 +0300

    kdrive: avoid null dereferences
    Avoid jumping into NULL pointers for OS or card functions which do not
    exist.

diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index f29fdb9..b6ac0b0 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -281,7 +281,7 @@ KdSuspend (void)
 	    for (screen = card->screenList; screen; screen = screen->next)
 		if (screen->mynum == card->selected && screen->pScreen)
 		    KdDisableScreen (screen->pScreen);
-	    if (card->driver)
+	    if (card->driver && card->cfuncs->restore)
 		(*card->cfuncs->restore) (card);
 	}
 	KdDisableInput ();
@@ -295,7 +295,8 @@ KdDisableScreens (void)
     KdSuspend ();
     if (kdEnabled)
     {
-	(*kdOsFuncs->Disable) ();
+        if (kdOsFuncs->Disable)
+            (*kdOsFuncs->Disable) ();
 	kdEnabled = FALSE;
     }
 }
@@ -353,7 +354,8 @@ KdEnableScreens (void)
     if (!kdEnabled)
     {
 	kdEnabled = TRUE;
-	(*kdOsFuncs->Enable) ();
+        if (kdOsFuncs->Enable)
+            (*kdOsFuncs->Enable) ();
     }
     KdResume ();
 }
@@ -373,9 +375,10 @@ AbortDDX(void)
     KdDisableScreens ();
     if (kdOsFuncs)
     {
-	if (kdEnabled)
+	if (kdEnabled && kdOsFuncs->Disable)
 	    (*kdOsFuncs->Disable) ();
-	(*kdOsFuncs->Fini) ();
+        if (kdOsFuncs->Fini)
+            (*kdOsFuncs->Fini) ();
 	KdDoSwitchCmd ("stop");
     }
 
@@ -768,7 +771,8 @@ KdOsInit (KdOsFuncs *pOsFuncs)
 	if (serverGeneration == 1) 
 	{
 	    KdDoSwitchCmd ("start");
-	    (*pOsFuncs->Init) ();
+            if (pOsFuncs->Init)
+                (*pOsFuncs->Init) ();
 	}
     }
 }
diff-tree 738d2e88171bcce8782d670a1cda9a1d941d7977 (from 96e32805d12fc36f0fa0926dbfb0dd8a5cadb739)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 29 03:48:02 2006 +0300

    kdrive: move bell ringing into an OS function
    Move the bell into an OS function, and use that if it's declared; else,
    fall back to using the driver's function.
    Remove the Linux keyboard bell function; just move it into the OS layer.
    Use named initialisers when converting the old structures, and eliminate
    unused functions.

diff --git a/hw/kdrive/ephyr/os.c b/hw/kdrive/ephyr/os.c
index ead1586..1a42495 100644
--- a/hw/kdrive/ephyr/os.c
+++ b/hw/kdrive/ephyr/os.c
@@ -34,34 +34,8 @@ EphyrInit (void)
   return hostx_init();
 }
 
-static void
-EphyrEnable (void)
-{
-  EPHYR_DBG("mark");
-}
-
-static Bool
-EphyrSpecialKey (KeySym sym)
-{
-    return FALSE;
-}
-
-static void
-EphyrDisable (void)
-{
-}
-
-static void
-EphyrFini (void)
-{
-}
-
 KdOsFuncs   EphyrOsFuncs = {
-    EphyrInit,
-    EphyrEnable,
-    EphyrSpecialKey,
-    EphyrDisable,
-    EphyrFini,
-    ephyrPoll
+    .Init = EphyrInit,
+    .pollEvents = ephyrPoll,
 };
 
diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c
index 24653ad..b7571f6 100644
--- a/hw/kdrive/linux/keyboard.c
+++ b/hw/kdrive/linux/keyboard.c
@@ -791,11 +791,6 @@ LinuxKeyboardInit (KdKeyboardInfo *ki)
 }
 
 static void
-LinuxKeyboardFini (KdKeyboardInfo *ki)
-{
-}
-
-static void
 LinuxKeyboardLeds (KdKeyboardInfo *ki, int leds)
 {
     if (!ki)
@@ -804,29 +799,10 @@ LinuxKeyboardLeds (KdKeyboardInfo *ki, i
     ioctl ((int)ki->driverPrivate, KDSETLED, leds & 7);
 }
 
-static void
-LinuxKeyboardBell (KdKeyboardInfo *ki, int volume, int pitch, int duration)
-{
-    if (!ki)
-        return;
-
-    if (volume && pitch)
-    {
-	ioctl((int)ki->driverPrivate, KDMKTONE,
-	      ((1193190 / pitch) & 0xffff) |
-	      (((unsigned long)duration *
-		volume / 50) << 16));
-
-    }
-}
-
 KdKeyboardDriver LinuxKeyboardDriver = {
     "keyboard",
-    LinuxKeyboardInit,
-    LinuxKeyboardEnable,
-    LinuxKeyboardLeds,
-    LinuxKeyboardBell,
-    LinuxKeyboardDisable,
-    LinuxKeyboardFini,
-    NULL,
+    .Init = LinuxKeyboardInit,
+    .Enable = LinuxKeyboardEnable,
+    .Leds = LinuxKeyboardLeds,
+    .Disable = LinuxKeyboardDisable,
 };
diff --git a/hw/kdrive/linux/linux.c b/hw/kdrive/linux/linux.c
index 7ba99b4..c1fe185 100644
--- a/hw/kdrive/linux/linux.c
+++ b/hw/kdrive/linux/linux.c
@@ -373,26 +373,6 @@ LinuxEnable (void)
     enabled = TRUE;
 }
 
-static Bool
-LinuxSpecialKey (KeySym sym)
-{
-    struct vt_stat  vts;
-    int		    con;
-    
-    if (XK_F1 <= sym && sym <= XK_F12)
-    {
-	con = sym - XK_F1 + 1;
-	memset (&vts, '\0', sizeof (vts));	/* valgrind */
-	ioctl (LinuxConsoleFd, VT_GETSTATE, &vts);
-	if (con != vts.v_active && (vts.v_state & (1 << con)))
-	{
-	    ioctl (LinuxConsoleFd, VT_ACTIVATE, con);
-	    return TRUE;
-	}
-    }
-    return FALSE;
-}
-
 static void
 LinuxDisable (void)
 {
@@ -481,13 +461,20 @@ KdOsAddInputDrivers ()
     KdAddKeyboardDriver(&LinuxKeyboardDriver);
 }
 
+static void
+LinuxBell(int volume, int pitch, int duration)
+{
+    if (volume && pitch)
+        ioctl(LinuxConsoleFd, KDMKTONE, ((1193190 / pitch) & 0xffff) |
+              (((unsigned long)duration * volume / 50) << 16));
+}
+
 KdOsFuncs   LinuxFuncs = {
-    LinuxInit,
-    LinuxEnable,
-    LinuxSpecialKey,
-    LinuxDisable,
-    LinuxFini,
-    0
+    .Init = LinuxInit,
+    .Enable = LinuxEnable,
+    .Disable = LinuxDisable,
+    .Fini = LinuxFini,
+    .Bell = LinuxBell,
 };
 
 void
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index 15d7031..f0fc909 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -369,6 +369,7 @@ typedef struct _KdOsFuncs {
     void	    (*Disable) (void);
     void	    (*Fini) (void);
     void	    (*pollEvents) (void);
+    void            (*Bell) (int, int, int);
 } KdOsFuncs;
 
 typedef enum _KdSyncPolarity {
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index fdeed82..be18586 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -523,22 +523,46 @@ LegalModifier(unsigned int key, DeviceIn
 }
 
 static void
-KdBell (int volume, DeviceIntPtr pDev, pointer ctrl, int something)
+KdBell (int volume, DeviceIntPtr pDev, pointer arg, int something)
 {
+    KeybdCtrl *ctrl = arg;
     KdKeyboardInfo *ki = NULL;
-
+    
     for (ki = kdKeyboards; ki; ki = ki->next) {
-        if (ki->dixdev && (ki->dixdev->id == pDev->id))
+        if (ki->dixdev && ki->dixdev->id == pDev->id)
             break;
     }
 
     if (!ki || !ki->dixdev || ki->dixdev->id != pDev->id || !ki->driver)
         return;
-        
-    if (kdInputEnabled) {
-        if (ki->driver->Bell)
-            (*ki->driver->Bell) (ki, volume, ki->bellPitch, ki->bellDuration);
+    
+    KdRingBell(ki, volume, ctrl->bell_pitch, ctrl->bell_duration);
+}
+
+void
+DDXRingBell(int volume, int pitch, int duration)
+{
+    KdKeyboardInfo *ki = NULL;
+
+    if (kdOsFuncs->Bell) {
+        (*kdOsFuncs->Bell)(volume, pitch, duration);
     }
+    else {
+        for (ki = kdKeyboards; ki; ki = ki->next) {
+            if (ki->dixdev->coreEvents)
+                KdRingBell(ki, volume, pitch, duration);
+        }
+    }
+}
+
+void
+KdRingBell(KdKeyboardInfo *ki, int volume, int pitch, int duration)
+{
+    if (!ki || !ki->driver || !ki->driver->Bell)
+        return;
+        
+    if (kdInputEnabled)
+        (*ki->driver->Bell) (ki, volume, pitch, duration);
 }
 
 
diff --git a/hw/kdrive/vxworks/vxworks.c b/hw/kdrive/vxworks/vxworks.c
index aa46001..688de62 100644
--- a/hw/kdrive/vxworks/vxworks.c
+++ b/hw/kdrive/vxworks/vxworks.c
@@ -12,17 +12,6 @@
 #include "kdrive.h"
 #include <X11/keysym.h>
 
-int
-VxWorksInit (void)
-{
-    return 1;
-}
-
-void
-VxWorksEnable (void)
-{
-}
-
 Bool
 VxWorksSpecialKey (KeySym sym)
 {
@@ -38,16 +27,6 @@ VxWorksSpecialKey (KeySym sym)
 }
 
 void
-VxWorksDisable (void)
-{
-}
-
-void
-VxWorksFini (void)
-{
-}
-
-void
 KdOsAddInputDrivers (void)
 {
     KdAddPointerDriver(&VxWorksMouseDriver);
@@ -55,12 +34,7 @@ KdOsAddInputDrivers (void)
 }
 
 KdOsFuncs   VxWorksFuncs = {
-    VxWorksInit,
-    VxWorksEnable,
-    VxWorksSpecialKey,
-    VxWorksDisable,
-    VxWorksFini,
-    0
+    .SpecialKey = VxWorksSpecialKey,
 };
 
 void
diff-tree 96e32805d12fc36f0fa0926dbfb0dd8a5cadb739 (from 68f595ca6c7883e030947b7f95c50e92aa733f2b)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 29 03:43:34 2006 +0300

    Xi: disallow changing core keyboard and pointer
    Just short-circuit the change core keyboard/pointer requests.

diff --git a/Xi/chgkbd.c b/Xi/chgkbd.c
index 289bd85..8134b40 100644
--- a/Xi/chgkbd.c
+++ b/Xi/chgkbd.c
@@ -64,7 +64,6 @@ SOFTWARE.
 #include "XIstubs.h"
 #include "globals.h"
 #include "extnsionst.h"
-#include "extinit.h"	/* LookupDeviceIntRec */
 
 #include "exevents.h"
 #include "exglobals.h"
@@ -99,107 +98,10 @@ SProcXChangeKeyboardDevice(register Clie
 int
 ProcXChangeKeyboardDevice(register ClientPtr client)
 {
-    int i;
-    DeviceIntPtr xkbd = inputInfo.keyboard;
-    DeviceIntPtr dev;
-    FocusClassPtr xf = xkbd->focus;
-    FocusClassPtr df;
-    KeyClassPtr k;
-    xChangeKeyboardDeviceReply rep;
-    changeDeviceNotify ev;
-
     REQUEST(xChangeKeyboardDeviceReq);
     REQUEST_SIZE_MATCH(xChangeKeyboardDeviceReq);
 
-    rep.repType = X_Reply;
-    rep.RepType = X_ChangeKeyboardDevice;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-
-    dev = LookupDeviceIntRec(stuff->deviceid);
-    if (dev == NULL) {
-	rep.status = -1;
-	SendErrorToClient(client, IReqCode, X_ChangeKeyboardDevice, 0,
-			  BadDevice);
-	return Success;
-    }
-
-    k = dev->key;
-    if (k == NULL) {
-	rep.status = -1;
-	SendErrorToClient(client, IReqCode, X_ChangeKeyboardDevice, 0,
-			  BadMatch);
-	return Success;
-    }
-
-    if (((dev->grab) && !SameClient(dev->grab, client)) ||
-	((xkbd->grab) && !SameClient(xkbd->grab, client)))
-	rep.status = AlreadyGrabbed;
-    else if ((dev->sync.frozen &&
-	      dev->sync.other && !SameClient(dev->sync.other, client)) ||
-	     (xkbd->sync.frozen &&
-	      xkbd->sync.other && !SameClient(xkbd->sync.other, client)))
-	rep.status = GrabFrozen;
-    else {
-	if (ChangeKeyboardDevice(xkbd, dev) != Success) {
-	    SendErrorToClient(client, IReqCode, X_ChangeKeyboardDevice, 0,
-			      BadDevice);
-	    return Success;
-	}
-	if (!dev->focus)
-	    InitFocusClassDeviceStruct(dev);
-	if (!dev->kbdfeed)
-	    InitKbdFeedbackClassDeviceStruct(dev, (BellProcPtr) NoopDDA,
-					     (KbdCtrlProcPtr) NoopDDA);
-	df = dev->focus;
-	df->win = xf->win;
-	df->revert = xf->revert;
-	df->time = xf->time;
-	df->traceGood = xf->traceGood;
-	if (df->traceSize != xf->traceSize) {
-	    Must_have_memory = TRUE;	/* XXX */
-	    df->trace = (WindowPtr *) xrealloc(df->trace,
-					       xf->traceSize *
-					       sizeof(WindowPtr));
-	    Must_have_memory = FALSE;	/* XXX */
-	}
-	df->traceSize = xf->traceSize;
-	for (i = 0; i < df->traceSize; i++)
-	    df->trace[i] = xf->trace[i];
-	RegisterOtherDevice(xkbd);
-	RegisterKeyboardDevice(dev);
-
-	ev.type = ChangeDeviceNotify;
-	ev.deviceid = stuff->deviceid;
-	ev.time = currentTime.milliseconds;
-	ev.request = NewKeyboard;
-
-	SendEventToAllWindows(dev, ChangeDeviceNotifyMask, (xEvent *) & ev, 1);
-	SendMappingNotify(MappingKeyboard, k->curKeySyms.minKeyCode,
-			  k->curKeySyms.maxKeyCode - k->curKeySyms.minKeyCode +
-			  1, client);
-
-	rep.status = 0;
-    }
-
-    WriteReplyToClient(client, sizeof(xChangeKeyboardDeviceReply), &rep);
+    SendErrorToClient(client, IReqCode, X_ChangeKeyboardDevice, 0,
+                      BadDevice);
     return Success;
 }
-
-/***********************************************************************
- *
- * This procedure writes the reply for the XChangeKeyboardDevice 
- * function, if the client and server have a different byte ordering.
- *
- */
-
-void
-SRepXChangeKeyboardDevice(ClientPtr client, int size,
-			  xChangeKeyboardDeviceReply * rep)
-{
-    register char n;
-
-    swaps(&rep->sequenceNumber, n);
-    swapl(&rep->length, n);
-    WriteToClient(client, size, (char *)rep);
-}
diff --git a/Xi/chgkbd.h b/Xi/chgkbd.h
index 7a883b7..5f99223 100644
--- a/Xi/chgkbd.h
+++ b/Xi/chgkbd.h
@@ -36,9 +36,4 @@ int SProcXChangeKeyboardDevice(ClientPtr
 int ProcXChangeKeyboardDevice(ClientPtr	/* client */
     );
 
-void SRepXChangeKeyboardDevice(ClientPtr /* client */ ,
-			       int /* size */ ,
-			       xChangeKeyboardDeviceReply *	/* rep */
-    );
-
 #endif /* CHGKBD_H */
diff --git a/Xi/chgptr.c b/Xi/chgptr.c
index b799092..22c8a5f 100644
--- a/Xi/chgptr.c
+++ b/Xi/chgptr.c
@@ -101,97 +101,10 @@ SProcXChangePointerDevice(register Clien
 int
 ProcXChangePointerDevice(register ClientPtr client)
 {
-    DeviceIntPtr xptr = inputInfo.pointer;
-    DeviceIntPtr dev;
-    ValuatorClassPtr v;
-    xChangePointerDeviceReply rep;
-    changeDeviceNotify ev;
-
     REQUEST(xChangePointerDeviceReq);
     REQUEST_SIZE_MATCH(xChangePointerDeviceReq);
 
-    rep.repType = X_Reply;
-    rep.RepType = X_ChangePointerDevice;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-
-    dev = LookupDeviceIntRec(stuff->deviceid);
-    if (dev == NULL) {
-	rep.status = -1;
-	SendErrorToClient(client, IReqCode, X_ChangePointerDevice, 0,
-			  BadDevice);
-	return Success;
-    }
-
-    v = dev->valuator;
-    if (v == NULL || v->numAxes < 2 ||
-	stuff->xaxis >= v->numAxes || stuff->yaxis >= v->numAxes) {
-	rep.status = -1;
-	SendErrorToClient(client, IReqCode, X_ChangePointerDevice, 0, BadMatch);
-	return Success;
-    }
-
-    if (((dev->grab) && !SameClient(dev->grab, client)) ||
-	((xptr->grab) && !SameClient(xptr->grab, client)))
-	rep.status = AlreadyGrabbed;
-    else if ((dev->sync.frozen &&
-	      dev->sync.other && !SameClient(dev->sync.other, client)) ||
-	     (xptr->sync.frozen &&
-	      xptr->sync.other && !SameClient(xptr->sync.other, client)))
-	rep.status = GrabFrozen;
-    else {
-	if (ChangePointerDevice(xptr, dev, stuff->xaxis, stuff->yaxis) !=
-	    Success) {
-	    SendErrorToClient(client, IReqCode, X_ChangePointerDevice, 0,
-			      BadDevice);
-	    return Success;
-	}
-	if (dev->focus)
-	    DeleteFocusClassDeviceStruct(dev);
-	if (!dev->button)
-	    InitButtonClassDeviceStruct(dev, 0, NULL);
-	if (!dev->ptrfeed)
-	    InitPtrFeedbackClassDeviceStruct(dev, (PtrCtrlProcPtr) NoopDDA);
-	RegisterOtherDevice(xptr);
-	RegisterPointerDevice(dev);
-
-	ev.type = ChangeDeviceNotify;
-	ev.deviceid = stuff->deviceid;
-	ev.time = currentTime.milliseconds;
-	ev.request = NewPointer;
-
-	SendEventToAllWindows(dev, ChangeDeviceNotifyMask, (xEvent *) & ev, 1);
-	SendMappingNotify(MappingPointer, 0, 0, client);
-
-	rep.status = 0;
-    }
-
-    WriteReplyToClient(client, sizeof(xChangePointerDeviceReply), &rep);
+    SendErrorToClient(client, IReqCode, X_ChangePointerDevice, 0,
+                      BadDevice);
     return Success;
 }
-
-void
-DeleteFocusClassDeviceStruct(DeviceIntPtr dev)
-{
-    xfree(dev->focus->trace);
-    xfree(dev->focus);
-    dev->focus = NULL;
-}
-
-/***********************************************************************
- *
- * This procedure writes the reply for the XChangePointerDevice 
- * function, if the client and server have a different byte ordering.
- *
- */
-
-void
-SRepXChangePointerDevice(ClientPtr client, int size,
-			 xChangePointerDeviceReply * rep)
-{
-    register char n;
-
-    swaps(&rep->sequenceNumber, n);
-    swapl(&rep->length, n);
-    WriteToClient(client, size, (char *)rep);
-}
diff --git a/Xi/chgptr.h b/Xi/chgptr.h
index aeda822..fb3b5cc 100644
--- a/Xi/chgptr.h
+++ b/Xi/chgptr.h
@@ -53,9 +53,4 @@ void FindInterestedChildren(	/* FIXME: c
 			       int	/* count */
     );
 
-void SRepXChangePointerDevice(ClientPtr /* client */ ,
-			      int /* size */ ,
-			      xChangePointerDeviceReply *	/* rep */
-    );
-
 #endif /* CHGPTR_H */
diff --git a/Xi/extinit.c b/Xi/extinit.c
index c35a964..4548837 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -465,12 +465,6 @@ SReplyIDispatch(ClientPtr client, int le
     else if (rep->RepType == X_GetDeviceMotionEvents)
 	SRepXGetDeviceMotionEvents(client, len,
 				   (xGetDeviceMotionEventsReply *) rep);
-    else if (rep->RepType == X_ChangeKeyboardDevice)
-	SRepXChangeKeyboardDevice(client, len,
-				  (xChangeKeyboardDeviceReply *) rep);
-    else if (rep->RepType == X_ChangePointerDevice)
-	SRepXChangePointerDevice(client, len,
-				 (xChangePointerDeviceReply *) rep);
     else if (rep->RepType == X_GrabDevice)
 	SRepXGrabDevice(client, len, (xGrabDeviceReply *) rep);
     else if (rep->RepType == X_GetDeviceFocus)
diff --git a/Xi/stubs.c b/Xi/stubs.c
index 28ecd8b..e2ed1ce 100644
--- a/Xi/stubs.c
+++ b/Xi/stubs.c
@@ -68,86 +68,6 @@ SOFTWARE.
 
 /***********************************************************************
  *
- * Caller:	ProcXChangeKeyboardDevice
- *
- * This procedure does the implementation-dependent portion of the work
- * needed to change the keyboard device.
- *
- * The X keyboard device has a FocusRec.  If the device that has been 
- * made into the new X keyboard did not have a FocusRec, 
- * ProcXChangeKeyboardDevice will allocate one for it.
- *
- * If you do not want clients to be able to focus the old X keyboard
- * device, call DeleteFocusClassDeviceStruct to free the FocusRec.
- *
- * If you support input devices with keys that you do not want to be 
- * used as the X keyboard, you need to check for them here and return 
- * a BadDevice error.
- *
- * The default implementation is to do nothing (assume you do want
- * clients to be able to focus the old X keyboard).  The commented-out
- * sample code shows what you might do if you don't want the default.
- *
- */
-
-int
-ChangeKeyboardDevice(DeviceIntPtr old_dev, DeviceIntPtr new_dev)
-{
-    /***********************************************************************
-     DeleteFocusClassDeviceStruct(old_dev);	 * defined in xchgptr.c *
-    **********************************************************************/
-    return BadMatch;
-}
-
-/***********************************************************************
- *
- * Caller:	ProcXChangePointerDevice
- *
- * This procedure does the implementation-dependent portion of the work
- * needed to change the pointer device.
- *
- * The X pointer device does not have a FocusRec.  If the device that
- * has been made into the new X pointer had a FocusRec, 
- * ProcXChangePointerDevice will free it.
- *
- * If you want clients to be able to focus the old pointer device that
- * has now become accessible through the input extension, you need to 
- * add a FocusRec to it here.
- *
- * The XChangePointerDevice protocol request also allows the client
- * to choose which axes of the new pointer device are used to move 
- * the X cursor in the X- and Y- directions.  If the axes are different
- * than the default ones, you need to keep track of that here.
- *
- * If you support input devices with valuators that you do not want to be 
- * used as the X pointer, you need to check for them here and return a 
- * BadDevice error.
- *
- * The default implementation is to do nothing (assume you don't want
- * clients to be able to focus the old X pointer).  The commented-out
- * sample code shows what you might do if you don't want the default.
- *
- */
-
-int
-ChangePointerDevice(DeviceIntPtr old_dev,
-		    DeviceIntPtr new_dev, unsigned char x, unsigned char y)
-{
-    /***********************************************************************
-    InitFocusClassDeviceStruct(old_dev);	* allow focusing old ptr*
-
-    x_axis = x;					* keep track of new x-axis*
-    y_axis = y;					* keep track of new y-axis*
-    if (x_axis != 0 || y_axis != 1)
-	axes_changed = TRUE;			* remember axes have changed*
-    else
-	axes_changed = FALSE;
-    *************************************************************************/
-    return BadMatch;
-}
-
-/***********************************************************************
- *
  * Caller:	ProcXCloseDevice
  *
  * Take care of implementation-dependent details of closing a device.
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 915a219..be3368d 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -251,148 +251,12 @@ OpenInputDevice(DeviceIntPtr	dev,
     *status = Success;
 }
 
-
-/***********************************************************************
- *
- * Caller:	ProcXChangeKeyboardDevice
- *
- * This procedure does the implementation-dependent portion of the work
- * needed to change the keyboard device.
- *
- * The X keyboard device has a FocusRec.  If the device that has been 
- * made into the new X keyboard did not have a FocusRec, 
- * ProcXChangeKeyboardDevice will allocate one for it.
- *
- * If you do not want clients to be able to focus the old X keyboard
- * device, call DeleteFocusClassDeviceStruct to free the FocusRec.
- *
- * If you support input devices with keys that you do not want to be 
- * used as the X keyboard, you need to check for them here and return 
- * a BadDevice error.
- *
- * The default implementation is to do nothing (assume you do want
- * clients to be able to focus the old X keyboard).  The commented-out
- * sample code shows what you might do if you don't want the default.
- *
- ***********************************************************************
- */
-
-int
-ChangeKeyboardDevice (DeviceIntPtr old_dev, DeviceIntPtr new_dev)
-{
-  /**********************************************************************
-   * DeleteFocusClassDeviceStruct(old_dev);	 * defined in xchgptr.c *
-   **********************************************************************/
-  return !Success;
-}
-
-
-/***********************************************************************
- *
- * Caller:	ProcXChangePointerDevice
- *
- * This procedure does the implementation-dependent portion of the work
- * needed to change the pointer device.
- *
- * The X pointer device does not have a FocusRec.  If the device that
- * has been made into the new X pointer had a FocusRec, 
- * ProcXChangePointerDevice will free it.
- *
- * If you want clients to be able to focus the old pointer device that
- * has now become accessible through the input extension, you need to 
- * add a FocusRec to it here.
- *
- * The XChangePointerDevice protocol request also allows the client
- * to choose which axes of the new pointer device are used to move 
- * the X cursor in the X- and Y- directions.  If the axes are different
- * than the default ones, you need to keep track of that here.
- *
- * If you support input devices with valuators that you do not want to be 
- * used as the X pointer, you need to check for them here and return a 
- * BadDevice error.
- *
- * The default implementation is to do nothing (assume you don't want
- * clients to be able to focus the old X pointer).  The commented-out
- * sample code shows what you might do if you don't want the default.
- *
- ***********************************************************************
- */
-
-int
-ChangePointerDevice (
-     DeviceIntPtr	old_dev,
-     DeviceIntPtr	new_dev,
-     unsigned char	x,
-     unsigned char	y)
-{
-  /************************************************************************
-    InitFocusClassDeviceStruct(old_dev);	* allow focusing old ptr*
-    
-    x_axis = x;					* keep track of new x-axis*
-    y_axis = y;					* keep track of new y-axis*
-    if (x_axis != 0 || y_axis != 1)
-    axes_changed = TRUE;			* remember axes have changed*
-    else
-    axes_changed = FALSE;
-   *************************************************************************/
-
-    return !Success;
-}
-
-
-/***********************************************************************
- *
- * Caller:	ProcXCloseDevice
- *
- * Take care of implementation-dependent details of closing a device.
- * Some implementations may actually close the device, others may just
- * remove this clients interest in that device.
- *
- * The default implementation is to do nothing (assume all input devices
- * are initialized during X server initialization and kept open).
- *
- ***********************************************************************
- */
-
-void
-CloseInputDevice (DeviceIntPtr d, ClientPtr client)
-{
-}
-
-
-/***********************************************************************
- *
- * Caller:	ProcXListInputDevices
- *
- * This is the implementation-dependent routine to initialize an input 
- * device to the point that information about it can be listed.
- * Some implementations open all input devices when the server is first
- * initialized, and never close them.  Other implementations open only
- * the X pointer and keyboard devices during server initialization,
- * and only open other input devices when some client makes an
- * XOpenDevice request.  If some other process has the device open, the
- * server may not be able to get information about the device to list it.
- *
- * This procedure should be used by implementations that do not initialize
- * all input devices at server startup.  It should do device-dependent
- * initialization for any devices not previously initialized, and call
- * AddInputDevice for each of those devices so that a DeviceIntRec will be 
- * created for them.
- *
- * The default implementation is to do nothing (assume all input devices
- * are initialized during X server initialization and kept open).
- * The commented-out sample code shows what you might do if you don't want 
- * the default.
- *
- ***********************************************************************
- */
-
 void
-AddOtherInputDevices ()
+CloseInputDevice(DeviceIntPtr dev,
+                 ClientPtr client)
 {
 }
 
-
 /****************************************************************************
  *
  * Caller:	ProcXSetDeviceMode
@@ -475,6 +339,11 @@ ChangeDeviceControl (ClientPtr client, D
       return (*local->control_proc)(local, control);
   }
 }
+
+void
+AddOtherInputDevices()
+{
+}
 #endif
 
 int
diff --git a/include/XIstubs.h b/include/XIstubs.h
index 45f6eb1..6797e07 100644
--- a/include/XIstubs.h
+++ b/include/XIstubs.h
@@ -26,18 +26,6 @@ OR IN CONNECTION WITH THE USE OR PERFORM
 #ifndef XI_STUBS_H
 #define XI_STUBS_H 1
 
-int
-ChangeKeyboardDevice (
-	DeviceIntPtr           /* old_dev */,
-	DeviceIntPtr           /* new_dev */);
-
-int
-ChangePointerDevice (
-	DeviceIntPtr           /* old_dev */,
-	DeviceIntPtr           /* new_dev */,
-	unsigned char          /* x */,
-	unsigned char          /* y */);
-
 void
 CloseInputDevice (
 	DeviceIntPtr           /* d */,
diff-tree 68f595ca6c7883e030947b7f95c50e92aa733f2b (from 51a06b3c44509c72279b5cfcf2b52b9a35c461b0)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 29 03:41:34 2006 +0300

    GetTimeInMillis: use correct units for clock_gettime
    Make sure we're treating the nanoseconds as a long, not an int, so we
    don't overflow.

diff --git a/os/utils.c b/os/utils.c
index 7d258a4..c7a8964 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -552,7 +552,7 @@ GetTimeInMillis(void)
 #ifdef MONOTONIC_CLOCK
     struct timespec tp;
     if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
-        return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000);
+        return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000L);
 #endif
 
     X_GETTIMEOFDAY(&tv);
diff-tree 51a06b3c44509c72279b5cfcf2b52b9a35c461b0 (from 196c5836f463c28f633bbba847f59acd5935359d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 29 03:40:57 2006 +0300

    WaitForSomething: only rewind when delta is more than 250ms
    Only rewind time when we're more than (original delta + 250ms) away from
    executing the timer.
    When we're walking the timer list, use a goto to iterate all of them from
    the start again, since timers may drop out of the list.
    Don't bother trying to be smart in TimerSet, we'll pick it up in
    WaitForSomething anyway.

diff --git a/os/WaitFor.c b/os/WaitFor.c
index 896fdf1..6109e34 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -202,11 +202,12 @@ WaitForSomething(int *pClientsReady)
         {
             now = GetTimeInMillis();
 	    timeout = timers->expires - now;
-            /* time has rewound.  reset the timers. */
-            if (timeout > timers->delta) {
+            if (timeout > 0 && timeout > timers->delta + 250) {
+                /* time has rewound.  reset the timers. */
                 CheckAllTimers(now);
                 timeout = timers->expires - now;
             }
+
             if (timeout < 0)
                 timeout = 0;
 	    waittime.tv_sec = timeout / MILLI_PER_SECOND;
@@ -434,17 +435,18 @@ ANYSET(FdMask *src)
 #endif
 
 /* If time has rewound, re-run every affected timer.
- * TimerForce will change timer->next, but it will _generally_ only
- * promote timers in the list, meaning that we should still be
- * walking every timer. */
+ * Timers might drop out of the list, so we have to restart every time. */
 static void
 CheckAllTimers(CARD32 now)
 {
     OsTimerPtr timer;
 
+start:
     for (timer = timers; timer; timer = timer->next) {
-        if (timer->expires - now > timer->delta)
+        if (timer->expires - now > timer->delta + 250) {
             TimerForce(timer);
+            goto start;
+        }
     }
 }
 
@@ -507,10 +509,8 @@ TimerSet(OsTimerPtr timer, int flags, CA
     }
     for (prev = &timers;
 	 *prev && (int) ((*prev)->expires - millis) <= 0;
-	 prev = &(*prev)->next) {
-        if ((*prev)->expires - now > (*prev)->delta)
-            CheckAllTimers(now);
-    }
+	 prev = &(*prev)->next)
+        ;
     timer->next = *prev;
     *prev = timer;
     return timer;
diff-tree a34446f5b3d90714969a90583c49cb1eae1c9651 (from 004d00e6689f452fc9fdf91f5ffc6d6aed697d54)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Fri Oct 27 13:43:43 2006 -0400

    Add missing file to list in Makefile.am

diff --git a/GL/mesa/main/Makefile.am b/GL/mesa/main/Makefile.am
index 4d5b0cd..64b383d 100644
--- a/GL/mesa/main/Makefile.am
+++ b/GL/mesa/main/Makefile.am
@@ -60,6 +60,7 @@ nodist_libmain_la_SOURCES = accum.c \
                     light.c \
                     lines.c \
                     matrix.c \
+                    mipmap.c \
                     mm.c \
                     occlude.c \
                     pixel.c \
diff-tree 92d04e746bd9b8ad3ee217c165ace20468e079cf (from 004d00e6689f452fc9fdf91f5ffc6d6aed697d54)
Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Date:   Fri Oct 27 18:26:30 2006 +0200

    Import libdrm functions for the drm memory manager.

diff --git a/configure.ac b/configure.ac
index c0cc003..140757f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -62,6 +62,8 @@ AC_PROG_MAKE_SET
 PKG_PROG_PKG_CONFIG
 AC_PROG_LEX
 AC_PROG_YACC
+dnl for libdrm
+AC_SYS_LARGEFILE
 XORG_PROG_RAWCPP
 
 AC_HEADER_DIRENT
diff --git a/hw/xfree86/os-support/drm/xf86drm.c b/hw/xfree86/os-support/drm/xf86drm.c
index 214e58b..ade4266 100644
--- a/hw/xfree86/os-support/drm/xf86drm.c
+++ b/hw/xfree86/os-support/drm/xf86drm.c
@@ -2305,3 +2305,957 @@ int drmRemoveSIGIOHandler(int fd)
 
     return xf86RemoveSIGIOHandler(fd);
 }
+
+/*
+ * Valid flags are 
+ * DRM_FENCE_FLAG_EMIT
+ * DRM_FENCE_FLAG_SHAREABLE
+ * DRM_FENCE_MASK_DRIVER
+ */
+
+int drmFenceCreate(int fd, unsigned flags, int class,unsigned type, 
+		   drmFence *fence)
+{
+    drm_fence_arg_t arg;
+    
+    memset(&arg, 0, sizeof(arg));
+    arg.type = type;
+    arg.class = class;
+    arg.op = drm_fence_create;
+    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
+	return -errno;
+    fence->handle = arg.handle;
+    fence->class = arg.class;
+    fence->type = arg.type;
+    fence->flags = arg.flags;
+    fence->signaled = 0;
+    return 0;
+}
+
+/*
+ * Valid flags are 
+ * DRM_FENCE_FLAG_SHAREABLE
+ * DRM_FENCE_MASK_DRIVER
+ */
+
+int drmFenceBuffers(int fd, unsigned flags, drmFence *fence)
+{
+    drm_fence_arg_t arg;
+    
+    memset(&arg, 0, sizeof(arg));
+    arg.flags = flags;
+    arg.op = drm_fence_buffers;
+    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
+	return -errno;
+    fence->handle = arg.handle;
+    fence->class = arg.class;
+    fence->type = arg.type;
+    fence->flags = arg.flags;
+    fence->signaled = 0;
+    return 0;
+}
+    
+int drmFenceDestroy(int fd, const drmFence *fence)
+{
+    drm_fence_arg_t arg;
+   
+    memset(&arg, 0, sizeof(arg));
+    arg.handle = fence->handle;
+    arg.op = drm_fence_destroy;
+    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
+	return -errno;
+    return 0;
+}
+
+int drmFenceReference(int fd, unsigned handle, drmFence *fence)
+{
+    drm_fence_arg_t arg;
+   
+    memset(&arg, 0, sizeof(arg));
+    arg.handle = handle;
+    arg.op = drm_fence_reference;
+    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
+	return -errno;
+    fence->handle = arg.handle;
+    fence->class = arg.class;
+    fence->type = arg.type;
+    fence->flags = arg.flags;
+    fence->signaled = arg.signaled;
+    return 0;
+}
+
+int drmFenceUnreference(int fd, const drmFence *fence)
+{
+    drm_fence_arg_t arg;
+   
+    memset(&arg, 0, sizeof(arg));
+    arg.handle = fence->handle;
+    arg.op = drm_fence_unreference;
+    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
+	return -errno;
+    return 0;
+}
+
+int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type)
+{
+    drm_fence_arg_t arg;
+   
+    memset(&arg, 0, sizeof(arg));
+    arg.handle = fence->handle;
+    arg.type = flush_type;
+    arg.op = drm_fence_flush;
+    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
+	return -errno;
+    fence->class = arg.class;
+    fence->type = arg.type;
+    fence->signaled = arg.signaled;
+    return 0;
+}
+
+int drmFenceUpdate(int fd, drmFence *fence)
+{
+    drm_fence_arg_t arg;
+	
+    memset(&arg, 0, sizeof(arg));
+    arg.handle = fence->handle;
+    arg.op = drm_fence_signaled;
+    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
+	return -errno;
+    fence->class = arg.class;
+    fence->type = arg.type;
+    fence->signaled = arg.signaled;
+    return 0;
+}
+
+int drmFenceSignaled(int fd, drmFence *fence, unsigned fenceType, 
+		     int *signaled)
+{
+    int 
+	ret;
+
+    if ((fence->flags & DRM_FENCE_FLAG_SHAREABLE) ||
+	((fenceType & fence->signaled) != fenceType)) {
+
+	ret = drmFenceFlush(fd, fence, fenceType);
+	if (ret)
+	    return ret;
+    }
+
+    *signaled = ((fenceType & fence->signaled) == fenceType);
+
+    return 0;
+}
+
+/*
+ * Valid flags are 
+ * DRM_FENCE_FLAG_SHAREABLE
+ * DRM_FENCE_MASK_DRIVER
+ */
+
+
+int drmFenceEmit(int fd, unsigned flags, drmFence *fence, unsigned emit_type)
+{
+    drm_fence_arg_t arg;
+   
+    memset(&arg, 0, sizeof(arg));
+    arg.flags = flags;
+    arg.handle = fence->handle;
+    arg.type = emit_type;
+    arg.op = drm_fence_emit;
+    if (ioctl(fd, DRM_IOCTL_FENCE, &arg))
+	return -errno;
+    fence->class = arg.class;
+    fence->type = arg.type;
+    fence->signaled = arg.signaled;
+    return 0;
+}
+
+/*
+ * Valid flags are 
+ * DRM_FENCE_FLAG_WAIT_LAZY
+ * DRM_FENCE_FLAG_WAIT_IGNORE_SIGNALS
+ */
+    
+int drmFenceWait(int fd, unsigned flags, drmFence *fence, unsigned flush_type)
+{
+    drm_fence_arg_t arg;
+    int ret;
+
+    if (flush_type == 0) {
+	flush_type = fence->type;
+    }
+
+    if (!(fence->flags & DRM_FENCE_FLAG_SHAREABLE)) {
+	if ((flush_type & fence->signaled) == flush_type) {
+	    return 0;
+	}
+    }
+
+    memset(&arg, 0, sizeof(arg));
+    arg.handle = fence->handle;
+    arg.type = flush_type;
+    arg.flags = flags;
+    arg.op = drm_fence_wait;
+    do {
+	ret = ioctl(fd, DRM_IOCTL_FENCE, &arg);
+    } while (ret != 0 && errno == EAGAIN);
+
+    if (ret)
+	return -errno;
+
+    fence->class = arg.class;
+    fence->type = arg.type;
+    fence->signaled = arg.signaled;
+    return 0;
+}    
+
+static int drmAdjustListNodes(drmBOList *list)
+{
+    drmBONode *node;
+    drmMMListHead *l;
+    int ret = 0;
+
+    while(list->numCurrent < list->numTarget) {
+	node = (drmBONode *) malloc(sizeof(*node));
+	if (!node) {
+	    ret = -ENOMEM;
+	    break;
+	}
+	list->numCurrent++;
+	DRMLISTADD(&node->head, &list->free);
+    }
+
+    while(list->numCurrent > list->numTarget) {
+	l = list->free.next;
+	if (l == &list->free)
+	    break;
+	DRMLISTDEL(l);
+	node = DRMLISTENTRY(drmBONode, l, head);
+	free(node);
+	list->numCurrent--;
+    }
+    return ret;
+}
+
+void drmBOFreeList(drmBOList *list)
+{
+    drmBONode *node;
+    drmMMListHead *l;
+
+    l = list->list.next;
+    while(l != &list->list) {
+	DRMLISTDEL(l);
+	node = DRMLISTENTRY(drmBONode, l, head);
+	free(node);
+	l = list->free.next;
+	list->numCurrent--;
+	list->numOnList--;
+    }
+
+    l = list->free.next;
+    while(l != &list->free) {
+	DRMLISTDEL(l);
+	node = DRMLISTENTRY(drmBONode, l, head);
+	free(node);
+	l = list->free.next;
+	list->numCurrent--;
+    }
+}
+	
+int drmBOResetList(drmBOList *list) {
+
+    drmMMListHead *l;
+    int ret;
+
+    ret = drmAdjustListNodes(list);
+    if (ret)
+	return ret;
+
+    l = list->list.next;
+    while(l != &list->list) {
+	DRMLISTDEL(l);
+	DRMLISTADD(l, &list->free);
+	list->numOnList--;
+	l = list->list.next;
+    }
+    return drmAdjustListNodes(list);
+}
+	
+static drmBONode *drmAddListItem(drmBOList *list, drmBO *item, 
+				 unsigned long arg0,
+				 unsigned long arg1)
+{
+    drmBONode *node;
+    drmMMListHead *l;
+
+    l = list->free.next;
+    if (l == &list->free) {
+	node = (drmBONode *) malloc(sizeof(*node));
+	if (!node) {
+	    return NULL;
+	}
+	list->numCurrent++;
+    } else {
+	DRMLISTDEL(l);
+	node = DRMLISTENTRY(drmBONode, l, head);
+    }
+    node->buf = item;
+    node->arg0 = arg0;
+    node->arg1 = arg1;
+    DRMLISTADD(&node->head, &list->list);
+    list->numOnList++;
+    return node;
+}
+     	
+void *drmBOListIterator(drmBOList *list)
+{
+    void *ret = list->list.next;
+
+    if (ret == &list->list)
+	return NULL;
+    return ret;
+}
+
+void *drmBOListNext(drmBOList *list, void *iterator)
+{
+    void *ret;
+
+    drmMMListHead *l = (drmMMListHead *) iterator;
+    ret = l->next;
+    if (ret == &list->list)
+	return NULL;
+    return ret;
+}
+
+drmBO *drmBOListBuf(void *iterator)
+{
+    drmBONode *node;
+    drmMMListHead *l = (drmMMListHead *) iterator;
+    node = DRMLISTENTRY(drmBONode, l, head);
+    
+    return node->buf;
+}
+
+
+int drmBOCreateList(int numTarget, drmBOList *list)
+{
+    DRMINITLISTHEAD(&list->list);
+    DRMINITLISTHEAD(&list->free);
+    list->numTarget = numTarget;
+    list->numCurrent = 0;
+    list->numOnList = 0;
+    return drmAdjustListNodes(list);
+}
+
+static void drmBOCopyReply(const drm_bo_arg_reply_t *rep, 
+			   drmBO *buf)
+{
+    buf->handle = rep->handle;
+    buf->flags = rep->flags;
+    buf->size = rep->size;
+    buf->offset = rep->offset;
+    buf->mapHandle = rep->arg_handle;
+    buf->mask = rep->mask;
+    buf->start = rep->buffer_start;
+    buf->fenceFlags = rep->fence_flags;
+    buf->replyFlags = rep->rep_flags;
+    buf->pageAlignment = rep->page_alignment;
+}
+    
+    
+
+int drmBOCreate(int fd, unsigned long start, unsigned long size, 
+		unsigned pageAlignment, void *user_buffer, drm_bo_type_t type, 
+		unsigned mask,
+		unsigned hint, drmBO *buf)
+{
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+    int ret;
+
+    memset(buf, 0, sizeof(*buf));
+    memset(&arg, 0, sizeof(arg));
+    req->mask = mask;
+    req->hint = hint;
+    req->size = size;
+    req->type = type;
+    req->page_alignment = pageAlignment;
+
+    buf->virtual = NULL;
+
+    switch(type) {
+    case drm_bo_type_dc:
+        req->buffer_start = start;
+	break;
+    case drm_bo_type_user:
+	req->buffer_start = (unsigned long) user_buffer;
+	buf->virtual = user_buffer;
+	break;
+    case drm_bo_type_fake:
+        req->buffer_start = start;
+	break;
+    default:
+	return -EINVAL;
+    }
+    req->op = drm_bo_create;
+
+    do {
+	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
+    } while (ret != 0 && errno == EAGAIN);
+
+    if (ret)
+	return -errno;
+    if (!arg.handled) {
+	return -EFAULT;
+    }
+    if (rep->ret) {
+        fprintf(stderr, "Error %d\n", rep->ret);
+	return rep->ret;
+    }
+    
+    drmBOCopyReply(rep, buf);
+    buf->mapVirtual = NULL;
+    buf->mapCount = 0;
+
+    return 0;
+}
+
+int drmBODestroy(int fd, drmBO *buf)
+{
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+    
+    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) {
+	(void) drmUnmap(buf->mapVirtual, buf->start + buf->size);
+	buf->mapVirtual = NULL;
+	buf->virtual = NULL;
+    }
+
+    memset(&arg, 0, sizeof(arg));
+    req->handle = buf->handle;
+    req->op = drm_bo_destroy;
+
+    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
+	return -errno;
+    if (!arg.handled) {
+	return -EFAULT;
+    }
+    if (rep->ret) {
+	return rep->ret;
+    }
+
+    buf->handle = 0;
+    return 0;
+}
+ 
+int drmBOReference(int fd, unsigned handle, drmBO *buf)
+{
+
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+    
+    memset(&arg, 0, sizeof(arg));
+    req->handle = handle;
+    req->op = drm_bo_reference;
+    
+    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
+	return -errno;
+    if (!arg.handled) {
+	return -EFAULT;
+    }
+    if (rep->ret) {
+	return rep->ret;
+    }
+
+    drmBOCopyReply(rep, buf);
+    buf->type = drm_bo_type_dc;
+    buf->mapVirtual = NULL;
+    buf->mapCount = 0;
+    buf->virtual = NULL;
+
+    return 0;
+}
+
+int drmBOUnReference(int fd, drmBO *buf)
+{
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+    
+
+    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) {
+	(void) munmap(buf->mapVirtual, buf->start + buf->size);
+	buf->mapVirtual = NULL;
+	buf->virtual = NULL;
+    }
+
+    memset(&arg, 0, sizeof(arg));
+    req->handle = buf->handle;
+    req->op = drm_bo_unreference;
+
+    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg))
+	return -errno;
+    if (!arg.handled) {
+	return -EFAULT;
+    }
+    if (rep->ret) {
+	return rep->ret;
+    }
+
+    buf->handle = 0;
+    return 0;
+}   
+
+/*
+ * Flags can be  DRM_BO_FLAG_READ, DRM_BO_FLAG_WRITE or'ed together
+ * Hint currently be DRM_BO_HINT_DONT_BLOCK, which makes the
+ * call return an -EBUSY if it can' immediately honor the mapping request.
+ */
+
+int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
+	     void **address)
+{
+
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+    int ret = 0;
+
+    /*
+     * Make sure we have a virtual address of the buffer.
+     */
+
+    if (!buf->virtual && buf->type != drm_bo_type_fake) {
+	drmAddress virtual;
+	virtual = mmap(0, buf->size + buf->start, 
+		       PROT_READ | PROT_WRITE, MAP_SHARED,
+		       fd, buf->mapHandle);
+	if (virtual == MAP_FAILED) {
+	    ret = -errno;
+	}
+	if (ret) 
+	    return ret;
+	buf->mapVirtual = virtual;
+	buf->virtual = ((char *) virtual) + buf->start;
+    }
+
+    memset(&arg, 0, sizeof(arg));
+    req->handle = buf->handle;
+    req->mask = mapFlags;
+    req->hint = mapHint;
+    req->op = drm_bo_map;
+
+    /*
+     * May hang if the buffer object is busy.
+     * This IOCTL synchronizes the buffer.
+     */
+    
+    do {
+	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
+    } while (ret != 0 && errno == EAGAIN);
+
+    if (ret) 
+	return ret;
+    if (!arg.handled) 
+	return -EFAULT;
+    if (rep->ret)
+	return rep->ret;
+
+    drmBOCopyReply(rep, buf);	
+    buf->mapFlags = mapFlags;
+    ++buf->mapCount;
+    *address = buf->virtual;
+
+    return 0;
+}
+
+int drmBOUnmap(int fd, drmBO *buf)
+{
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+
+	
+    memset(&arg, 0, sizeof(arg));
+    req->handle = buf->handle;
+    req->op = drm_bo_unmap;
+
+    if (ioctl(fd, DRM_IOCTL_BUFOBJ, &arg)) {
+	return -errno;
+    }
+    if (!arg.handled) 
+        return -EFAULT;
+    if (rep->ret)
+	return rep->ret;
+
+    return 0;
+}
+    
+int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask, 
+		  unsigned hint)
+{
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+    int ret = 0;
+
+    memset(&arg, 0, sizeof(arg));
+    req->handle = buf->handle;
+    req->mask = flags;
+    req->hint = hint;
+    req->arg_handle = mask; /* Encode mask in the arg_handle field :/ */
+    req->op = drm_bo_validate;
+
+    do{
+	ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
+    } while (ret && errno == EAGAIN);
+    
+    if (ret) 
+	return ret;
+    if (!arg.handled)
+	return -EFAULT;
+    if (rep->ret)
+	return rep->ret;
+
+    drmBOCopyReply(rep, buf);
+    return 0;
+}
+	    
+
+int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle)
+{
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+    int ret = 0;
+
+    memset(&arg, 0, sizeof(arg));
+    req->handle = buf->handle;
+    req->mask = flags;
+    req->arg_handle = fenceHandle;
+    req->op = drm_bo_validate;
+
+    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
+    
+    if (ret) 
+	return ret;
+    if (!arg.handled)
+	return -EFAULT;
+    if (rep->ret)
+	return rep->ret;
+    return 0;
+}
+
+int drmBOInfo(int fd, drmBO *buf)
+{
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+    int ret = 0;
+
+    memset(&arg, 0, sizeof(arg));
+    req->handle = buf->handle;
+    req->op = drm_bo_info;
+
+    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
+    
+    if (ret) 
+	return ret;
+    if (!arg.handled)
+	return -EFAULT;
+    if (rep->ret)
+	return rep->ret;
+    drmBOCopyReply(rep, buf);
+    return 0;
+}
+
+int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint)
+{
+    drm_bo_arg_t arg;
+    drm_bo_arg_request_t *req = &arg.d.req;
+    drm_bo_arg_reply_t *rep = &arg.d.rep;
+    int ret = 0;
+
+    if ((buf->flags & DRM_BO_FLAG_SHAREABLE) ||
+	(buf->replyFlags & DRM_BO_REP_BUSY)) {
+        memset(&arg, 0, sizeof(arg));
+	req->handle = buf->handle;
+	req->op = drm_bo_wait_idle;
+	req->hint = hint;
+
+	do {
+	    ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
+	} while (ret && errno == EAGAIN);
+
+	if (ret) 
+	    return ret;
+	if (!arg.handled)
+	    return -EFAULT;
+	if (rep->ret)
+	    return rep->ret;
+	drmBOCopyReply(rep, buf);
+    }
+    return 0;
+}
+	
+int drmBOBusy(int fd, drmBO *buf, int *busy)
+{
+    if (!(buf->flags & DRM_BO_FLAG_SHAREABLE) &&
+	!(buf->replyFlags & DRM_BO_REP_BUSY)) {
+	*busy = 0;
+	return 0;
+    } else {
+	int ret = drmBOInfo(fd, buf);
+	if (ret)
+	    return ret;
+	*busy = (buf->replyFlags & DRM_BO_REP_BUSY);
+	return 0;
+    }
+}
+    
+    
+int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags, 
+		       unsigned mask,
+		       int *newItem)
+{
+    drmBONode *node, *cur;
+    drmMMListHead *l;
+
+    *newItem = 0;
+    cur = NULL;
+
+    for (l = list->list.next; l != &list->list; l = l->next) {
+	node = DRMLISTENTRY(drmBONode, l, head);
+	if (node->buf == buf) {
+	    cur = node;
+	    break;
+	}
+    }
+    if (!cur) {
+	cur = drmAddListItem(list, buf, flags, mask);
+	if (!cur) {
+	    drmMsg("Out of memory creating validate list node.\n");
+	    return -ENOMEM;
+	}
+	*newItem = 1;
+	cur->arg0 = flags;
+	cur->arg1 = mask;
+    } else {
+	unsigned memMask = (cur->arg1 | mask) & DRM_BO_MASK_MEM;
+	unsigned memFlags = cur->arg0 & flags & memMask;
+	
+	if (!memFlags) {
+	    drmMsg("Incompatible memory location requests "
+		   "on validate list.\n");
+	    drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n",
+		   cur->arg0, cur->arg1);
+	    drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n",
+		   flags, mask);
+	    return -EINVAL;
+	}
+	if (mask & cur->arg1 & ~DRM_BO_MASK_MEM  & (cur->arg0 ^ flags)) {
+	    drmMsg("Incompatible buffer flag requests "
+		   "on validate list.\n");
+	    drmMsg("Previous flag: 0x%08lx, mask: 0x%08lx\n",
+		   cur->arg0, cur->arg1);
+	    drmMsg("Current flag: 0x%08lx, mask: 0x%08lx\n",
+		   flags, mask);
+	    return -EINVAL;
+	}
+	cur->arg1 |= mask;
+	cur->arg0 = memFlags | ((cur->arg0 | flags) & 
+				cur->arg1 & ~DRM_BO_MASK_MEM);	
+    }
+    return 0;
+}
+
+
+int drmBOValidateList(int fd, drmBOList *list)
+{
+   
+  drmBONode *node;
+  drmMMListHead *l;
+  drm_bo_arg_t *arg, *first;
+  drm_bo_arg_request_t *req;
+  drm_bo_arg_reply_t *rep;
+  drm_u64_t *prevNext = NULL;
+  drmBO *buf;
+  int ret;
+
+  first = NULL;
+
+  for (l = list->list.next; l != &list->list; l = l->next) {
+      node = DRMLISTENTRY(drmBONode, l, head);
+
+      arg = &node->bo_arg;
+      req = &arg->d.req;
+
+      if (!first)
+	  first = arg;
+
+      if (prevNext)
+	  *prevNext = (unsigned long) arg;
+
+      memset(arg, 0, sizeof(*arg));
+      prevNext = &arg->next;
+      req->handle = node->buf->handle;
+      req->op = drm_bo_validate;
+      req->mask = node->arg0;
+      req->hint = 0;
+      req->arg_handle = node->arg1;
+  }
+  
+  if (!first) 
+      return 0;
+
+  do{
+      ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
+  } while (ret && errno == EAGAIN);
+
+
+  if (ret)
+      return -errno;
+  
+  for (l = list->list.next; l != &list->list; l = l->next) {
+      node = DRMLISTENTRY(drmBONode, l, head);
+      arg = &node->bo_arg;
+      rep = &arg->d.rep;
+      
+      if (!arg->handled) {
+	  drmMsg("Unhandled request\n");
+	  return -EFAULT;
+      }
+      if (rep->ret)
+	  return rep->ret;
+
+      buf = node->buf;
+      drmBOCopyReply(rep, buf);
+  }
+
+  return 0;
+}
+	  
+
+int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle)
+{
+   
+  drmBONode *node;
+  drmMMListHead *l;
+  drm_bo_arg_t *arg, *first;
+  drm_bo_arg_request_t *req;
+  drm_bo_arg_reply_t *rep;
+  drm_u64_t *prevNext = NULL;
+  int ret;
+
+  first = NULL;
+
+  for (l = list->list.next; l != &list->list; l = l->next) {
+      node = DRMLISTENTRY(drmBONode, l, head);
+
+      arg = &node->bo_arg;
+      req = &arg->d.req;
+
+      if (!first)
+	  first = arg;
+
+      if (prevNext)
+	  *prevNext = (unsigned long) arg;
+
+      memset(arg, 0, sizeof(*arg));
+      prevNext = &arg->next;
+      req->handle = node->buf->handle;
+      req->op = drm_bo_fence;
+      req->mask = node->arg0;
+      req->arg_handle = fenceHandle;
+  }
+  
+  if (!first) 
+      return 0;
+
+  ret = ioctl(fd, DRM_IOCTL_BUFOBJ, first);
+
+  if (ret)
+      return -errno;
+  
+  for (l = list->list.next; l != &list->list; l = l->next) {
+      node = DRMLISTENTRY(drmBONode, l, head);
+
+      arg = &node->bo_arg;
+      rep = &arg->d.rep;
+      
+      if (!arg->handled)
+	  return -EFAULT;
+      if (rep->ret)
+	  return rep->ret;
+      drmBOCopyReply(rep, node->buf);
+  }
+
+  return 0;
+}
+
+int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
+	      unsigned memType)
+{
+    drm_mm_init_arg_t arg;
+    
+    memset(&arg, 0, sizeof(arg));
+    arg.req.op = mm_init;
+    arg.req.p_offset = pOffset;
+    arg.req.p_size = pSize;
+    arg.req.mem_type = memType;
+
+    if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))
+	return -errno;
+    
+    return 0;	
+}
+
+int drmMMTakedown(int fd, unsigned memType)
+{
+    drm_mm_init_arg_t arg;
+
+
+    memset(&arg, 0, sizeof(arg));
+    arg.req.op = mm_takedown;
+    arg.req.mem_type = memType;
+
+    if (ioctl(fd, DRM_IOCTL_MM_INIT, &arg))
+	return -errno;
+    
+    return 0;	
+}
+
+int drmMMLock(int fd, unsigned memType)
+{
+    drm_mm_init_arg_t arg;
+    int ret;
+
+    memset(&arg, 0, sizeof(arg));
+    arg.req.op = mm_lock;
+    arg.req.mem_type = memType;
+
+    do{
+	ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg);
+    } while (ret && errno == EAGAIN);
+    
+    return ret;	
+}
+
+int drmMMUnlock(int fd, unsigned memType)
+{
+    drm_mm_init_arg_t arg;
+    int ret;
+
+    memset(&arg, 0, sizeof(arg));
+    arg.req.op = mm_unlock;
+    arg.req.mem_type = memType;
+
+    do{
+	ret = ioctl(fd, DRM_IOCTL_MM_INIT, &arg);
+    } while (ret && errno == EAGAIN);
+    
+    return ret;	
+}
diff --git a/hw/xfree86/os-support/xf86drm.h b/hw/xfree86/os-support/xf86drm.h
index 1076706..18e4564 100644
--- a/hw/xfree86/os-support/xf86drm.h
+++ b/hw/xfree86/os-support/xf86drm.h
@@ -36,6 +36,7 @@
 #define _XF86DRM_H_
 
 #include <drm.h>
+#include <xf86mm.h>
 
 				/* Defaults, if nothing set in xf86config */
 #define DRM_DEV_UID	 0
diff --git a/hw/xfree86/os-support/xf86mm.h b/hw/xfree86/os-support/xf86mm.h
new file mode 100644
index 0000000..e1a4e3e
--- /dev/null
+++ b/hw/xfree86/os-support/xf86mm.h
@@ -0,0 +1,210 @@
+/**************************************************************************
+ * 
+ * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND. USA.
+ * All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 
+ * USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * 
+ **************************************************************************/
+
+#ifndef _XF86MM_H_
+#define _XF86MM_H_
+#include <stddef.h>
+#include "drm.h"
+
+/*
+ * Note on multithreaded applications using this interface.
+ * Libdrm is not threadsafe, so common buffer, TTM, and fence objects need to
+ * be protected using an external mutex.
+ *
+ * Note: Don't protect the following functions, as it may lead to deadlocks:
+ * drmBOUnmap(), drmFenceBuffers().
+ * The kernel is synchronizing and refcounting buffer maps. 
+ * User space only needs to refcount object usage within the same application.
+ */
+
+
+/*
+ * List macros heavily inspired by the Linux kernel
+ * list handling. No list looping yet.
+ */
+
+typedef struct _drmMMListHead
+{
+    struct _drmMMListHead *prev;
+    struct _drmMMListHead *next;
+} drmMMListHead;
+
+#define DRMINITLISTHEAD(__item)		       \
+  do{					       \
+    (__item)->prev = (__item);		       \
+    (__item)->next = (__item);		       \
+  } while (0)
+
+#define DRMLISTADD(__item, __list)			\
+  do {						\
+    (__item)->prev = (__list);			\
+    (__item)->next = (__list)->next;		\
+    (__list)->next->prev = (__item);		\
+    (__list)->next = (__item);			\
+  } while (0)
+
+#define DRMLISTADDTAIL(__item, __list)		\
+  do {						\
+    (__item)->next = (__list);			\
+    (__item)->prev = (__list)->prev;		\
+    (__list)->prev->next = (__item);		\
+    (__list)->prev = (__item);			\
+  } while(0)
+
+#define DRMLISTDEL(__item)			\
+  do {						\
+    (__item)->prev->next = (__item)->next;	\
+    (__item)->next->prev = (__item)->prev;	\
+  } while(0)
+
+#define DRMLISTDELINIT(__item)			\
+  do {						\
+    (__item)->prev->next = (__item)->next;	\
+    (__item)->next->prev = (__item)->prev;	\
+    (__item)->next = (__item);			\
+    (__item)->prev = (__item);			\
+  } while(0)
+
+#define DRMLISTENTRY(__type, __item, __field)   \
+    ((__type *)(((char *) (__item)) - offsetof(__type, __field)))
+
+typedef struct _drmFence{
+        unsigned handle;
+        int class;
+        unsigned type; 
+        unsigned flags;
+        unsigned signaled;
+        unsigned pad[4]; /* for future expansion */
+} drmFence;
+
+typedef struct _drmBO{
+    drm_bo_type_t type;
+    unsigned handle;
+    drm_u64_t mapHandle;
+    unsigned flags;
+    unsigned mask;
+    unsigned mapFlags;
+    unsigned long size;
+    unsigned long offset;
+    unsigned long start;
+    unsigned replyFlags;
+    unsigned fenceFlags;
+    unsigned pageAlignment;
+    void *virtual;
+    void *mapVirtual;
+    int mapCount;
+    unsigned pad[8];     /* for future expansion */
+} drmBO;
+
+
+typedef struct _drmBONode {
+    drmMMListHead head;
+    drmBO *buf;
+    drm_bo_arg_t bo_arg;
+    unsigned long arg0;
+    unsigned long arg1;
+} drmBONode;
+
+typedef struct _drmBOList {
+    unsigned numTarget;
+    unsigned numCurrent;
+    unsigned numOnList;
+    drmMMListHead list;
+    drmMMListHead free;
+} drmBOList;
+
+/* Fencing */
+
+extern int drmFenceCreate(int fd, unsigned flags, int class,
+			  unsigned type, 
+			  drmFence *fence);
+extern int drmFenceDestroy(int fd, const drmFence *fence);
+extern int drmFenceReference(int fd, unsigned handle, drmFence *fence);
+extern int drmFenceUnreference(int fd, const drmFence *fence);
+extern int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type);
+extern int drmFenceSignaled(int fd, drmFence *fence, 
+			    unsigned fenceType, int *signaled);
+extern int drmFenceWait(int fd, unsigned flags, drmFence *fence, 
+			unsigned flush_type);
+extern int drmFenceEmit(int fd, unsigned flags, drmFence *fence, 
+			unsigned emit_type);
+extern int drmFenceBuffers(int fd, unsigned flags, drmFence *fence);
+extern int drmFenceUpdate(int fd, drmFence *fence);
+
+
+/*
+ * Buffer object list functions.
+ */
+
+extern void drmBOFreeList(drmBOList *list);
+extern int drmBOResetList(drmBOList *list);
+extern void *drmBOListIterator(drmBOList *list);
+extern void *drmBOListNext(drmBOList *list, void *iterator);
+extern drmBO *drmBOListBuf(void *iterator);
+extern int drmBOCreateList(int numTarget, drmBOList *list);
+
+/*
+ * Buffer object functions.
+ */
+
+extern int drmBOCreate(int fd, unsigned long start, unsigned long size,
+		       unsigned pageAlignment,void *user_buffer, 
+		       drm_bo_type_t type, unsigned mask,
+		       unsigned hint, drmBO *buf);
+extern int drmBODestroy(int fd, drmBO *buf);
+extern int drmBOReference(int fd, unsigned handle, drmBO *buf);
+extern int drmBOUnReference(int fd, drmBO *buf);
+extern int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
+		    void **address);
+extern int drmBOUnmap(int fd, drmBO *buf);
+extern int drmBOValidate(int fd, drmBO *buf, unsigned flags, unsigned mask, 
+			 unsigned hint);
+extern int drmBOFence(int fd, drmBO *buf, unsigned flags, unsigned fenceHandle);
+extern int drmBOInfo(int fd, drmBO *buf);
+extern int drmBOBusy(int fd, drmBO *buf, int *busy);
+
+
+extern int drmAddValidateItem(drmBOList *list, drmBO *buf, unsigned flags, 
+		       unsigned mask,
+		       int *newItem);
+extern int drmBOValidateList(int fd, drmBOList *list);
+extern int drmBOFenceList(int fd, drmBOList *list, unsigned fenceHandle);
+extern int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint);
+
+/*
+ * Initialization functions.
+ */
+
+extern int drmMMInit(int fd, unsigned long pOffset, unsigned long pSize,
+		     unsigned memType);
+extern int drmMMTakedown(int fd, unsigned memType);
+extern int drmMMLock(int fd, unsigned memType);
+extern int drmMMUnlock(int fd, unsigned memType);
+
+
+#endif
diff-tree e3d3d29db5eef057b4e8294377c9c3147436bc2f (from parents)
Merge: 92387e99d085b0b081fcedb2f20304eb0ac536b1 004d00e6689f452fc9fdf91f5ffc6d6aed697d54
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Oct 26 20:21:16 2006 -0400

    Merge branch 'master' into my-XACE-SELINUX

diff-tree 92387e99d085b0b081fcedb2f20304eb0ac536b1 (from 4b53a5e4b147ab748b28dffc1d330b7148d8efa6)
Author: Eamon Walsh <ewalsh at tycho.nsa.gov>
Date:   Thu Oct 26 20:20:57 2006 -0400

    Change symbol in libaudit library test.

diff --git a/configure.ac b/configure.ac
index fe48e4f..1fd4a1b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -642,7 +642,7 @@ if test "x$XSELINUX" = xyes; then
 	AC_CHECK_HEADERS([selinux/selinux.h selinux/avc.h], [], AC_MSG_ERROR([SELinux include files not found]))
 	AC_CHECK_LIB(selinux, avc_init, [], AC_MSG_ERROR([SELinux library not found])) 
 	AC_CHECK_HEADERS([libaudit.h], [], AC_MSG_ERROR([SELinux extension requires audit system headers]))
-	AC_CHECK_LIB(audit, audit_log_avc, [], AC_MSG_ERROR([SELinux extension requires audit system library]))
+	AC_CHECK_LIB(audit, audit_open, [], AC_MSG_ERROR([SELinux extension requires audit system library]))
 	AC_DEFINE(XSELINUX, 1, [Build SELinux extension])
 	SELINUX_LIB="-lselinux -laudit"
 fi
diff-tree 196c5836f463c28f633bbba847f59acd5935359d (from f9a1e456f8a4eaa1a9c71fd0fe5231140975c22d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 27 01:27:31 2006 +0300

    CoreKeyboardProc: annotate with FIXME
    Setting an empty keymap by default isn't wildly useful.

diff --git a/dix/devices.c b/dix/devices.c
index 01404db..a554f2f 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -261,8 +261,11 @@ CoreKeyboardProc(DeviceIntPtr pDev, int 
         }
         else
 #endif
-        InitKeyboardDeviceStruct((DevicePtr)pDev, &keySyms, modMap,
-                                 CoreKeyboardBell, CoreKeyboardCtl);
+        {
+            /* FIXME Our keymap here isn't exactly useful. */
+            InitKeyboardDeviceStruct((DevicePtr)pDev, &keySyms, modMap,
+                                     CoreKeyboardBell, CoreKeyboardCtl);
+        }
 
         xfree(keySyms.map);
         xfree(modMap);
diff-tree f9a1e456f8a4eaa1a9c71fd0fe5231140975c22d (from a5be65401769fabcb5001dc63035c69f9e4a2712)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 27 01:25:39 2006 +0300

    CoreKeyboardProc: don't leak keymap and modmap
    SetKeySymsMap does a copy here, so try not to leak them.

diff --git a/dix/devices.c b/dix/devices.c
index a5110ff..01404db 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -263,6 +263,10 @@ CoreKeyboardProc(DeviceIntPtr pDev, int 
 #endif
         InitKeyboardDeviceStruct((DevicePtr)pDev, &keySyms, modMap,
                                  CoreKeyboardBell, CoreKeyboardCtl);
+
+        xfree(keySyms.map);
+        xfree(modMap);
+
         break;
 
     case DEVICE_CLOSE:
diff-tree a5be65401769fabcb5001dc63035c69f9e4a2712 (from 85212eb504f860b054eb0f0a5029fed86cb8d1c0)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 27 01:25:21 2006 +0300

    mieqEnqueue: only compare DEVICE_BITS of deviceid
    Only compare DEVICE_BITS of the two deviceids, so we don't decide that
    a valuator event isn't for us, because (id | MORE_EVENTS) != id.

diff --git a/mi/mieq.c b/mi/mieq.c
index 63cd6e1..be76580 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -117,7 +117,8 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e
             !(lastkbp->type == DeviceMotionNotify ||
               lastkbp->type == DeviceButtonPress ||
               lastkbp->type == DeviceButtonRelease) ||
-            (lastkbp->deviceid != v->deviceid)) {
+            ((lastkbp->deviceid & DEVICE_BITS) !=
+             (v->deviceid & DEVICE_BITS))) {
             ErrorF("mieqEnequeue: out-of-order valuator event; dropping.\n");
             return;
         }
diff-tree 85212eb504f860b054eb0f0a5029fed86cb8d1c0 (from 8c0556e7cb1de8c387ddd886a03a8f8afff1fd0e)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 27 01:23:58 2006 +0300

    getValuatorEvents: make sure we put MORE_EVENTS in the right places
    Make sure we put MORE_EVENTS in with the device id if there are, in fact,
    more valuator events coming.

diff --git a/dix/getevents.c b/dix/getevents.c
index e34058c..b19a73f 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -365,6 +365,9 @@ getValuatorEvents(xEvent *events, Device
         case 1:
             xv->valuator0 = valuators[i];
         }
+
+        if (i + 6 < final_valuator)
+            xv->deviceid |= MORE_EVENTS;
     }
 
     return events;
diff-tree 794f2e7291ccb4e48f9fbfc8f08302e3aac0f79f (from 004d00e6689f452fc9fdf91f5ffc6d6aed697d54)
Author: Myron Stowe <myron.stowe at hp.com>
Date:   Thu Oct 26 20:38:58 2006 +0300

    xfree86: re-enable chipset-specific drivers for Linux/ia64
    Re-enable chipset-specific support for Linux/ia64, by linking in
    lnx_ia64.c.

diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am
index 6fdc1bc..7f71022 100644
--- a/hw/xfree86/os-support/linux/Makefile.am
+++ b/hw/xfree86/os-support/linux/Makefile.am
@@ -1,7 +1,9 @@
 noinst_LTLIBRARIES = liblinux.la
 
 if LINUX_IA64
-PLATFORM_PCI_SUPPORT = $(srcdir)/../shared/ia64Pci.c
+PLATFORM_PCI_SUPPORT = $(srcdir)/lnx_ia64.c $(srcdir)/../shared/ia64Pci.c
+PLATFORM_DEFINES = -DOS_PROBE_PCI_CHIPSET=lnxProbePciChipset
+PLATFORM_INCLUDES = -I$(srcdir)/../shared
 endif
 if LINUX_ALPHA
 PLATFORM_PCI_SUPPORT = lnx_ev56.c \
@@ -34,14 +36,13 @@ liblinux_la_SOURCES = lnx_init.c lnx_vid
                      $(APM_SOURCES) \
                      $(PLATFORM_PCI_SUPPORT)
 
-AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS)
+AM_CFLAGS = -DUSESTDRES -DHAVE_SYSV_IPC $(XORG_CFLAGS) $(PLATFORM_DEFINES)
 
-INCLUDES = $(XORG_INCS) -I/usr/include/drm # FIXME this last part is crack
+INCLUDES = $(XORG_INCS) $(PLATFORM_INCLUDES) -I/usr/include/drm # FIXME this last part is crack
 
 # FIXME: These need to be added to the build
 LNX_EXTRA_SOURCES = \
 	lnx_font.c \
-	lnx_ia64.c \
 	lnx_jstk.c \
 	lnxResource.c
 
@@ -49,5 +50,4 @@ EXTRA_DIST = \
 	$(LNX_EXTRA_SOURCES) \
 	lnx.h \
 	lnx_kbd.h \
-	$(srcdir)/../shared/ia64Pci.h \
 	$(srcdir)/../shared/xf86Axp.h
diff-tree 8c0556e7cb1de8c387ddd886a03a8f8afff1fd0e (from parents)
Merge: cdc8a4b7b2f099b8860a54c5c9f488e6f7c4913a 004d00e6689f452fc9fdf91f5ffc6d6aed697d54
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Oct 26 15:21:22 2006 +0300

    Merge branch 'master' into input-hotplug

diff-tree 004d00e6689f452fc9fdf91f5ffc6d6aed697d54 (from d285833290316cb5dd1e7f1e52c96be3e9cf21cd)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Oct 26 01:10:08 2006 +0300

    GetTimeInMillis: simplify monotonic test
    We don't actually need to get the CPU clock ID, which means we don't need
    the monotonic_usable test.  Since there's now only one branch, the
    compiler will treat that as likely, so we don't need xproto 7.0.9 anymore.
    
    The fallthrough to gettimeofday() is preserved.

diff --git a/configure.ac b/configure.ac
index 0f2ddd5..c0cc003 100644
--- a/configure.ac
+++ b/configure.ac
@@ -515,7 +515,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.l
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto [xproto >= 7.0.9] xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]"
+REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc"
 
 AM_CONDITIONAL(XV, [test "x$XV" = xyes])
diff --git a/os/utils.c b/os/utils.c
index 379291c..7d258a4 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -268,8 +268,6 @@ int auditTrailLevel = 1;
 
 _X_EXPORT Bool Must_have_memory = FALSE;
 
-static int monotonic_usable = -1;
-
 #ifdef AIXV3
 int SyncOn  = 0;
 extern int SelectWaitTime;
@@ -550,22 +548,11 @@ _X_EXPORT CARD32
 GetTimeInMillis(void)
 {
     struct timeval tv;
+
 #ifdef MONOTONIC_CLOCK
     struct timespec tp;
-    int spare = 0;
-
-    if (_X_UNLIKELY(monotonic_usable == -1)) {
-        if (clock_gettime(0, &tp) == 0 &&
-            clock_getcpuclockid(0, &spare) == 0)
-            monotonic_usable = 1;
-        else
-            monotonic_usable = 0;
-    }
-
-    if (_X_LIKELY(monotonic_usable == 1)) {
-        if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
-            return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000);
-    }
+    if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
+        return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000);
 #endif
 
     X_GETTIMEOFDAY(&tv);
diff-tree cdc8a4b7b2f099b8860a54c5c9f488e6f7c4913a (from parents)
Merge: 3da918a16c8908fdfaf89f2a1bcaec19e01528a9 d285833290316cb5dd1e7f1e52c96be3e9cf21cd
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Oct 26 00:28:30 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff --cc configure.ac
index a6eb8cc,0f2ddd5..aa6c607
@@@ -890,32 -873,46 +890,69 @@@
  
  XSERVER_CFLAGS="${XSERVERCFLAGS_CFLAGS}"
  XSERVER_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} -lm"
- AC_SUBST([XSERVER_LIBS])
  AC_SUBST([SYS_LIBS])
  
 +# The Xorg binary needs to export symbols so that they can be used from modules
 +# Some platforms require extra flags to do this.   gcc should set these flags
 +# when -rdynamic is passed to it, other compilers/linkers may need to be added
 +# here.
 +if test "x$GCC" = "xyes"; then
 +       GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
 +       GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
 +       GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
 +       GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
 +       if test "x$WERROR" = "xyes"; then
 +               GCC_WARNINGS="${GCC_WARNINGS} -Werror"
 +       fi
 +       XSERVER_CFLAGS="$GCC_WARNINGS $XSERVER_CFLAGS"
 +
 +       LD_EXPORT_SYMBOLS_FLAG="-rdynamic"
 +fi
 +case $host_os in
 +       openbsd*)
 +       LD_EXPORT_SYMBOLS_FLAG="-Wl,--export-dynamic"
 +       ;;
 +esac
 +AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
 +
+ AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes],
+                [AC_CHECK_LIB([rt], [clock_gettime], [have_clock_gettime=-lrt],
+                              [have_clock_gettime=no])])
+ 
+ AC_MSG_CHECKING([for a useful monotonic clock ...])
+ 
+ if ! test "x$have_clock_gettime" = xno; then
+     if ! test "x$have_clock_gettime" = xyes; then
+         LIBS="$have_clock_gettime"
+     else
+         LIBS=""
+     fi
+ 
+     AC_RUN_IFELSE([
+ #define _POSIX_C_SOURCE 199309L
+ #include <time.h>
+ 
+ int main(int argc, char *argv[]) {
+     struct timespec tp;
+ 
+     if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
+         return 0;
+     else
+         return 1;
+ }
+     ], [MONOTONIC_CLOCK=yes], [MONOTONIC_CLOCK=no],
+        [MONOTONIC_CLOCK="cross compiling"])
+ else
+     MONOTONIC_CLOCK=no
+ fi
+ 
+ AC_MSG_RESULT([$MONOTONIC_CLOCK])
+ 
+ if test "x$MONOTONIC_CLOCK" = xyes; then
+     AC_DEFINE(MONOTONIC_CLOCK, 1, [Have monotonic clock from clock_gettime()])
+     XSERVER_LIBS="$XSERVER_LIBS $LIBS"
+ fi
+ 
  dnl Imake defines SVR4 on SVR4 systems, and many files check for it, so
  dnl we need to replicate that here until those can all be fixed
  AC_MSG_CHECKING([if SVR4 needs to be defined])
diff --cc include/dix-config.h.in
index a920242,35700e4..fc1e69a
@@@ -445,16 -445,7 +445,19 @@@
  /* Define to 1 if modules should avoid the libcwrapper */
  #undef NO_LIBCWRAPPER
  
 +/* Support D-BUS */
 +#undef HAVE_DBUS
 +
 +/* Use only built-in fonts */
 +#undef BUILTIN_FONTS
 +
 +/* Avoid using font servers */
 +#undef NOFONTSERVERACCESS
 +
 +/* Use an empty root cursor */
 +#undef NULL_ROOT_CURSOR
 +
+ /* Have a monotonic clock from clock_gettime() */
+ #undef MONOTONIC_CLOCK
+ 
  #endif /* _DIX_CONFIG_H_ */
diff-tree d285833290316cb5dd1e7f1e52c96be3e9cf21cd (from d3e57faffee63df1424a209d0418d3a712f91ae6)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 23:57:00 2006 +0300

    GetTimeInMillis: spuport monotonic clock
    Add support for CLOCK_MONOTONIC from clock_gettime, and use that in
    GetTimeInMillis() if available, falling back to the old gettimeofday()
    implementation.
    
    This is _slightly_ faster on some 64-bit architectures, and _slightly_
    slower on others (though barely measurable).

diff --git a/configure.ac b/configure.ac
index 444b021..0f2ddd5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -515,7 +515,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.l
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]"
+REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto [xproto >= 7.0.9] xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]"
 REQUIRED_LIBS="xfont xau fontenc"
 
 AM_CONDITIONAL(XV, [test "x$XV" = xyes])
@@ -873,9 +873,46 @@ PKG_CHECK_MODULES([XSERVERLIBS], [$REQUI
 
 XSERVER_CFLAGS="${XSERVERCFLAGS_CFLAGS}"
 XSERVER_LIBS="${XSERVERLIBS_LIBS} ${SYS_LIBS} -lm"
-AC_SUBST([XSERVER_LIBS])
 AC_SUBST([SYS_LIBS])
 
+AC_CHECK_FUNCS([clock_gettime], [have_clock_gettime=yes],
+               [AC_CHECK_LIB([rt], [clock_gettime], [have_clock_gettime=-lrt],
+                             [have_clock_gettime=no])])
+
+AC_MSG_CHECKING([for a useful monotonic clock ...])
+
+if ! test "x$have_clock_gettime" = xno; then
+    if ! test "x$have_clock_gettime" = xyes; then
+        LIBS="$have_clock_gettime"
+    else
+        LIBS=""
+    fi
+
+    AC_RUN_IFELSE([
+#define _POSIX_C_SOURCE 199309L
+#include <time.h>
+
+int main(int argc, char *argv[]) {
+    struct timespec tp;
+
+    if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
+        return 0;
+    else
+        return 1;
+}
+    ], [MONOTONIC_CLOCK=yes], [MONOTONIC_CLOCK=no],
+       [MONOTONIC_CLOCK="cross compiling"])
+else
+    MONOTONIC_CLOCK=no
+fi
+
+AC_MSG_RESULT([$MONOTONIC_CLOCK])
+
+if test "x$MONOTONIC_CLOCK" = xyes; then
+    AC_DEFINE(MONOTONIC_CLOCK, 1, [Have monotonic clock from clock_gettime()])
+    XSERVER_LIBS="$XSERVER_LIBS $LIBS"
+fi
+
 dnl Imake defines SVR4 on SVR4 systems, and many files check for it, so
 dnl we need to replicate that here until those can all be fixed
 AC_MSG_CHECKING([if SVR4 needs to be defined])
@@ -890,6 +927,8 @@ AC_MSG_RESULT([yes])], AC_MSG_RESULT([no
 XSERVER_CFLAGS="$XSERVER_CFLAGS $CORE_INCS $XEXT_INC $COMPOSITE_INC $DAMAGE_INC $FIXES_INC $XI_INC $MI_INC $MIEXT_SHADOW_INC $MIEXT_LAYER_INC $MIEXT_DAMAGE_INC $RENDER_INC $RANDR_INC $FB_INC"
 AC_DEFINE_UNQUOTED(X_BYTE_ORDER,[$ENDIAN],[Endian order])
 
+AC_SUBST([XSERVER_LIBS])
+
 dnl ---------------------------------------------------------------------------
 dnl DDX section.
 dnl ---------------------------------------------------------------------------
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 65c42e6..35700e4 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -445,4 +445,7 @@
 /* Define to 1 if modules should avoid the libcwrapper */
 #undef NO_LIBCWRAPPER
 
+/* Have a monotonic clock from clock_gettime() */
+#undef MONOTONIC_CLOCK
+
 #endif /* _DIX_CONFIG_H_ */
diff --git a/os/utils.c b/os/utils.c
index 31ae26a..379291c 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -53,6 +53,19 @@ OR PERFORMANCE OF THIS SOFTWARE.
 #include <dix-config.h>
 #endif
 
+/* The world's most shocking hack, to ensure we get clock_gettime() and
+ * CLOCK_MONOTONIC. */
+#ifdef _POSIX_C_SOURCE
+#define _SAVED_POSIX_C_SOURCE _POSIX_C_SOURCE
+#undef _POSIX_C_SOURCE
+#endif
+#define _POSIX_C_SOURCE 199309L
+#include <time.h>
+#undef _POSIX_C_SOURCE
+#ifdef _SAVED_POSIX_C_SOURCE
+#define _POSIX_C_SOURCE _SAVED_POSIX_C_SOURCE
+#endif
+
 #ifdef __CYGWIN__
 #include <stdlib.h>
 #include <signal.h>
@@ -92,7 +105,6 @@ OR PERFORMANCE OF THIS SOFTWARE.
 #if !defined(SYSV) && !defined(WIN32) && !defined(Lynx) && !defined(QNX4)
 #include <sys/resource.h>
 #endif
-#include <time.h>
 #include <sys/stat.h>
 #include <ctype.h>    /* for isspace */
 #include <stdarg.h>
@@ -256,6 +268,8 @@ int auditTrailLevel = 1;
 
 _X_EXPORT Bool Must_have_memory = FALSE;
 
+static int monotonic_usable = -1;
+
 #ifdef AIXV3
 int SyncOn  = 0;
 extern int SelectWaitTime;
@@ -535,10 +549,27 @@ GiveUp(int sig)
 _X_EXPORT CARD32
 GetTimeInMillis(void)
 {
-    struct timeval  tp;
+    struct timeval tv;
+#ifdef MONOTONIC_CLOCK
+    struct timespec tp;
+    int spare = 0;
+
+    if (_X_UNLIKELY(monotonic_usable == -1)) {
+        if (clock_gettime(0, &tp) == 0 &&
+            clock_getcpuclockid(0, &spare) == 0)
+            monotonic_usable = 1;
+        else
+            monotonic_usable = 0;
+    }
+
+    if (_X_LIKELY(monotonic_usable == 1)) {
+        if (clock_gettime(CLOCK_MONOTONIC, &tp) == 0)
+            return (tp.tv_sec * 1000) + (tp.tv_nsec / 1000000);
+    }
+#endif
 
-    X_GETTIMEOFDAY(&tp);
-    return(tp.tv_sec * 1000) + (tp.tv_usec / 1000);
+    X_GETTIMEOFDAY(&tv);
+    return(tv.tv_sec * 1000) + (tv.tv_usec / 1000);
 }
 
 _X_EXPORT void
diff-tree d3e57faffee63df1424a209d0418d3a712f91ae6 (from becbda6d519a11c2c211afb8d46f9ea1a2676bc3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 23:55:43 2006 +0300

    WaitForSomething: allow time to rewind
    If time rewinds dramatically, reset all the timers to fix their expiry.

diff --git a/os/WaitFor.c b/os/WaitFor.c
index 0457678..896fdf1 100644
--- a/os/WaitFor.c
+++ b/os/WaitFor.c
@@ -119,11 +119,13 @@ mffs(fd_mask mask)
 struct _OsTimerRec {
     OsTimerPtr		next;
     CARD32		expires;
+    CARD32              delta;
     OsTimerCallback	callback;
     pointer		arg;
 };
 
 static void DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev);
+static void CheckAllTimers(CARD32 now);
 static OsTimerPtr timers = NULL;
 
 /*****************
@@ -200,6 +202,11 @@ WaitForSomething(int *pClientsReady)
         {
             now = GetTimeInMillis();
 	    timeout = timers->expires - now;
+            /* time has rewound.  reset the timers. */
+            if (timeout > timers->delta) {
+                CheckAllTimers(now);
+                timeout = timers->expires - now;
+            }
             if (timeout < 0)
                 timeout = 0;
 	    waittime.tv_sec = timeout / MILLI_PER_SECOND;
@@ -426,6 +433,20 @@ ANYSET(FdMask *src)
 }
 #endif
 
+/* If time has rewound, re-run every affected timer.
+ * TimerForce will change timer->next, but it will _generally_ only
+ * promote timers in the list, meaning that we should still be
+ * walking every timer. */
+static void
+CheckAllTimers(CARD32 now)
+{
+    OsTimerPtr timer;
+
+    for (timer = timers; timer; timer = timer->next) {
+        if (timer->expires - now > timer->delta)
+            TimerForce(timer);
+    }
+}
 
 static void
 DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev)
@@ -467,8 +488,13 @@ TimerSet(OsTimerPtr timer, int flags, CA
     }
     if (!millis)
 	return timer;
-    if (!(flags & TimerAbsolute))
+    if (flags & TimerAbsolute) {
+        timer->delta = millis - now;
+    }
+    else {
+        timer->delta = millis;
 	millis += now;
+    }
     timer->expires = millis;
     timer->callback = func;
     timer->arg = arg;
@@ -481,8 +507,10 @@ TimerSet(OsTimerPtr timer, int flags, CA
     }
     for (prev = &timers;
 	 *prev && (int) ((*prev)->expires - millis) <= 0;
-	 prev = &(*prev)->next)
-	;
+	 prev = &(*prev)->next) {
+        if ((*prev)->expires - now > (*prev)->delta)
+            CheckAllTimers(now);
+    }
     timer->next = *prev;
     *prev = timer;
     return timer;
diff-tree e21604914dccece6bc64c69b55512d1f1a969235 (from 59511974db843fa7e11133894cfc10c20fdaf60f)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Wed Oct 25 09:48:23 2006 -0700

    Merge master back in and clean up some unfinished code (closes 8745)

diff --git a/randr/mirandr.c b/randr/mirandr.c
index fab0fd1..8d79e8a 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -57,6 +57,21 @@ miRRCrtcSet (ScreenPtr	pScreen,
     return TRUE;
 }
 
+static Bool
+miRRCrtcSetGamma (ScreenPtr	pScreen,
+		  RRCrtcPtr	crtc)
+{
+    return TRUE;
+}
+
+static Bool
+miRROutputSetProperty (ScreenPtr	pScreen,
+		       RROutputPtr	output,
+		       Atom	property)
+{
+    return TRUE;
+}
+
 /*
  * This function assumes that only a single depth can be
  * displayed at a time, but that all visuals of that depth
@@ -85,7 +100,7 @@ miRandRInit (ScreenPtr pScreen)
 #if RANDR_12_INTERFACE
     pScrPriv->rrCrtcSet = miRRCrtcSet;
     pScrPriv->rrCrtcSetGamma = miRRCrtcSetGamma;
-    pScrPriv->rrOutputSetProperty = miRROutput
+    pScrPriv->rrOutputSetProperty = miRROutputSetProperty;
     
     
     RRScreenSetSizeRange (pScreen,
diff --git a/randr/randr.c b/randr/randr.c
index 5494428..7b39e80 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -42,9 +42,6 @@
 int	RRGeneration;
 int	RRNScreens;
 
-static int ProcRRDispatch (ClientPtr pClient);
-static int SProcRRDispatch (ClientPtr pClient);
-
 #define wrap(priv,real,mem,func) {\
     priv->mem = real->mem; \
     real->mem = func; \
@@ -54,6 +51,9 @@ static int SProcRRDispatch (ClientPtr pC
     real->mem = priv->mem; \
 }
 
+static int ProcRRDispatch (ClientPtr pClient);
+static int SProcRRDispatch (ClientPtr pClient);
+
 int	RREventBase;
 int	RRErrorBase;
 RESTYPE RRClientType, RREventType; /* resource types for event masks */
@@ -467,54 +467,6 @@ ProcRRDispatch (ClientPtr client)
 }
 
 static int
-SProcRRGetScreenInfo (ClientPtr client)
-{
-    register int n;
-    REQUEST(xRRGetScreenInfoReq);
-
-    swaps(&stuff->length, n);
-    swapl(&stuff->window, n);
-    return ProcRRGetScreenInfo(client);
-}
-
-static int
-SProcRRSetScreenConfig (ClientPtr client)
-{
-    register int n;
-    REQUEST(xRRSetScreenConfigReq);
-
-    if (RRClientKnowsRates (client))
-    {
-	REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
-	swaps (&stuff->rate, n);
-    }
-    else
-    {
-	REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
-    }
-    
-    swaps(&stuff->length, n);
-    swapl(&stuff->drawable, n);
-    swapl(&stuff->timestamp, n);
-    swaps(&stuff->sizeID, n);
-    swaps(&stuff->rotation, n);
-    return ProcRRSetScreenConfig(client);
-}
-
-static int
-SProcRRSelectInput (ClientPtr client)
-{
-    register int n;
-    REQUEST(xRRSelectInputReq);
-
-    swaps(&stuff->length, n);
-    swapl(&stuff->window, n);
-    swaps(&stuff->enable, n);
-    return ProcRRSelectInput(client);
-}
-
-
-static int
 SProcRRDispatch (ClientPtr client)
 {
     REQUEST(xReq);
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index c662899..ee51cc2 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -280,7 +280,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	 * Old 1.0 interface tied screen size to mode size
 	 */
 	if (ret)
-	    RRCrtcNotify (crtc, mode, x, y, rotation, 
+	    RRCrtcNotify (crtc, mode, x, y, rotation, 1, &outputs[0].output);
 	return ret;
     }
 #endif
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 6d38e96..b4d3618 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -164,7 +164,7 @@ RRScreenSizeNotify (ScreenPtr	pScreen)
     pScrPriv->width = pScreen->width;
     pScrPriv->height = pScreen->height;
     pScrPriv->changed = TRUE;
-    pScrPriv->sizeChanged = TRUE;
+/*    pScrPriv->sizeChanged = TRUE; */
 
     RRTellChanged (pScreen);
     RRSendConfigNotify (pScreen);
@@ -850,7 +850,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 
 	for (c = 0; c < pScrPriv->numCrtcs; c++)
 	{
-	    rep.status = RRCrtcSet (pScrPriv->->crtc, NULL, 0, 0, RR_Rotate_0,
+	    rep.status = RRCrtcSet (pScrPriv->crtcs[c], NULL, 0, 0, RR_Rotate_0,
 				    0, NULL);
 	    if (rep.status != Success)
 		goto sendReply;
@@ -858,7 +858,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	if (!RRScreenSizeSet (pScreen, mode->mode.width, mode->mode.height,
 			      pScreen->mmWidth, pScreen->mmHeight))
 	{
-	    rep.status  RRSetConfigFailed;
+	    rep.status = RRSetConfigFailed;
 	    goto sendReply;
 	}
     }
diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
index bf81f8b..67af753 100644
--- a/randr/rrsdispatch.c
+++ b/randr/rrsdispatch.c
@@ -77,6 +77,7 @@ SProcRRSelectInput (ClientPtr client)
 
     swaps(&stuff->length, n);
     swapl(&stuff->window, n);
+    swaps(&stuff->enable, n);
     return (*ProcRandrVector[stuff->randrReqType]) (client);
 }
 
diff --git a/randr/rrxinerama.c b/randr/rrxinerama.c
index 31f60cc..a8e4b39 100644
--- a/randr/rrxinerama.c
+++ b/randr/rrxinerama.c
@@ -259,6 +259,9 @@ ProcRRXineramaQueryScreens(ClientPtr cli
 
     REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
 
+    if (RRXineramaScreenActive (pScreen))
+	RRGetInfo (pScreen);
+    
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
     rep.number = RRXineramaScreenCount (pScreen);
diff-tree becbda6d519a11c2c211afb8d46f9ea1a2676bc3 (from 598ac7a83698327b607084abaebcbd22f8d25fbb)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Wed Oct 25 11:39:27 2006 +0200

    Fix test for Option "IgnoreABI".
    
    This option has plenty of potential for wasting the time of bug triagers
    without pretending it's always on.

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 87b8a0b..bff9233 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -895,7 +895,7 @@ configServerFlags(XF86ConfFlagsPtr flags
     xf86GetOptValBool(FlagOptions, FLAG_ALLOW_CLOSEDOWN_GRABS,
 		      &(xf86Info.grabInfo.allowClosedown));
     xf86GetOptValBool(FlagOptions, FLAG_IGNORE_ABI, &xf86Info.ignoreABI);
-    if (&xf86Info.ignoreABI) {
+    if (xf86Info.ignoreABI) {
 	    xf86Msg(X_CONFIG, "Ignoring ABI Version\n");
     }
 
diff-tree 59511974db843fa7e11133894cfc10c20fdaf60f (from parents)
Merge: 054f8cd2675a80b14bc1ce266377fcfee2335cee 598ac7a83698327b607084abaebcbd22f8d25fbb
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Oct 24 17:26:20 2006 -0700

    Merge branch 'master' into randr-1.2

diff-tree 598ac7a83698327b607084abaebcbd22f8d25fbb (from parents)
Merge: 828c34e83ccdf3bcd2844d5af8b0cac4164b04ab 948a97b97e93cee05a23f1f1ae699c5e181bc8ce
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Oct 24 17:23:12 2006 -0700

    Merge branch 'origin'

diff-tree 828c34e83ccdf3bcd2844d5af8b0cac4164b04ab (from cf948b7b04dfeb61a294889027b9a54f6b9b478e)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Tue Oct 24 17:23:02 2006 -0700

    Byte swap RRSelectInput enable flags.

diff --git a/randr/randr.c b/randr/randr.c
index 946aad3..d0bbfe5 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -1187,6 +1187,7 @@ SProcRRSelectInput (ClientPtr client)
 
     swaps(&stuff->length, n);
     swapl(&stuff->window, n);
+    swaps(&stuff->enable, n);
     return ProcRRSelectInput(client);
 }
 
diff-tree 3da918a16c8908fdfaf89f2a1bcaec19e01528a9 (from aabc087998e680c2fcf0ebc1c5022c1fe8f58f0c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 02:22:07 2006 +0300

    mipointer: remember to update pointer location
    Update pointer location so it doesn't get quickly reset by the next
    pointer update.

diff --git a/mi/mipointer.c b/mi/mipointer.c
index 679b760..dbe2aae 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -484,4 +484,8 @@ miPointerMoved (DeviceIntPtr pDev, Scree
 	if(!miPointer.pCursor->bits->emptyMask)
 	    (*pScreenPriv->spriteFuncs->MoveCursor) (pScreen, x, y);
     }
+
+    miPointer.x = x;
+    miPointer.y = y;
+    miPointer.pScreen = pScreen;
 }
diff-tree aabc087998e680c2fcf0ebc1c5022c1fe8f58f0c (from 65cd5aa4d754624566c2263015f1a018d137fce1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 02:21:39 2006 +0300

    GetPointerEvents: always ensure correct number of events
    Ensure correct number of valuator events are returned, and that we always
    increment events correctly.

diff --git a/dix/getevents.c b/dix/getevents.c
index 0a228cd..e34058c 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -504,7 +504,7 @@ GetPointerEvents(xEvent *events, DeviceI
         num_events = 1;
 
     /* Do we need to send a DeviceValuator event? */
-    if ((num_valuators + first_valuator) >= 2 && sendValuators) {
+    if ((num_valuators + first_valuator) > 2 && sendValuators) {
         if ((((num_valuators - 1) / 6) + 1) > MAX_VALUATOR_EVENTS)
             num_valuators = MAX_VALUATOR_EVENTS * 6;
         num_events += ((num_valuators - 1) / 6) + 1;
@@ -614,9 +614,9 @@ GetPointerEvents(xEvent *events, DeviceI
     kbp->root_x = x;
     kbp->root_y = y;
 
+    events++;
     if (final_valuator > 2 && sendValuators) {
         kbp->deviceid |= MORE_EVENTS;
-        events++;
         clipValuators(pDev, first_valuator, num_valuators, valuators);
         events = getValuatorEvents(events, pDev, first_valuator,
                                    num_valuators, valuators);
diff-tree 65cd5aa4d754624566c2263015f1a018d137fce1 (from 0514d53e10b3521bb708a9cbde4bab525248eadb)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 01:12:45 2006 +0300

    kdrive/input: remove unnecessary #ifdef XINPUTs
    Xi is now mandatory, so don't bother with the ifdefs.

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 724f724..fdeed82 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -45,14 +45,12 @@
 #include <X11/extensions/XKBsrv.h>
 #endif
 
-#ifdef XINPUT
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
 #include "XIstubs.h" /* even though we don't use stubs.  cute, no? */
 #include "exevents.h"
 #include "extinit.h"
 #include "exglobals.h"
-#endif
 
 #define AtomFromName(x) MakeAtom(x, strlen(x), 1)
 
@@ -394,9 +392,7 @@ KdPointerProc(DeviceIntPtr pDevice, int 
 {
     DevicePtr       pDev = (DevicePtr)pDevice;
     KdPointerInfo   *pi;
-#ifdef XINPUT
     Atom            xiclass;
-#endif
 
     if (!pDev)
 	return BadImplementation;
@@ -719,9 +715,7 @@ KdKeyboardProc(DeviceIntPtr pDevice, int
     Bool        ret;
     DevicePtr   pDev = (DevicePtr)pDevice;
     KdKeyboardInfo *ki;
-#ifdef XINPUT
     Atom xiclass;
-#endif
 
     if (!pDev)
 	return BadImplementation;
@@ -794,11 +788,9 @@ KdKeyboardProc(DeviceIntPtr pDevice, int
 	    return BadImplementation;
         }
 
-#ifdef XINPUT
         xiclass = AtomFromName(XI_KEYBOARD);
         AssignTypeAndName(pDevice, xiclass,
                           ki->name ? ki->name : "Generic KDrive Keyboard");
-#endif
 
         KdResetInputMachine();
 
@@ -987,9 +979,7 @@ KdAddKeyboard (KdKeyboardInfo *ki)
         return !Success;
     }
 
-#ifdef XINPUT
     RegisterOtherDevice(ki->dixdev);
-#endif
 
 #ifdef DEBUG
     ErrorF("added keyboard %s with dix id %d\n", ki->name, ki->dixdev->id);
@@ -1058,9 +1048,7 @@ KdAddPointer (KdPointerInfo *pi)
         return BadDevice;
     }
 
-#ifdef XINPUT
     RegisterOtherDevice(pi->dixdev);
-#endif
 
     for (prev = &kdPointers; *prev; prev = &(*prev)->next);
     *prev = pi;
diff-tree 0514d53e10b3521bb708a9cbde4bab525248eadb (from b1debebf8fe20ded20ba27e871fd1a6a9de029e3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 01:10:44 2006 +0300

    xfree86: remove motion history handling
    Remove motion history handling, as we now deal with this in the DIX.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 36f2362..915a219 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -138,13 +138,6 @@ xf86ProcessCommonOptions(LocalDevicePtr 
     } else {
         xf86Msg(X_CONFIG, "%s: doesn't report drag events\n", local->name);
     }
-    
-    local->history_size = xf86SetIntOption(list, "HistorySize", 0);
-
-    if (local->history_size > 0) {
-        xf86Msg(X_CONFIG, "%s: has a history of %d motions\n", local->name,
-                local->history_size);
-    }
 }
 
 void
@@ -736,57 +729,6 @@ xf86PostKeyboardEvent(DeviceIntPtr      
         mieqEnqueue(device, xf86Events + i);
 }
 
-/* 
- * Motion history management.
- */
-
-_X_EXPORT void
-xf86MotionHistoryAllocate(LocalDevicePtr	local)
-{
-    ValuatorClassPtr	valuator = local->dev->valuator;
-    
-    if (!HAS_MOTION_HISTORY(local))
-        return;
-    if (local->motion_history) xfree(local->motion_history);
-    local->motion_history = xalloc((sizeof(INT32) * valuator->numAxes + sizeof(Time))
-                                   * valuator->numMotionEvents);
-    local->first = 0;
-    local->last	 = 0;
-}
-
-_X_EXPORT int
-xf86GetMotionEvents(DeviceIntPtr	dev,
-                    xTimecoord		*buff,
-                    unsigned long	start,
-                    unsigned long	stop,
-                    ScreenPtr		pScreen)
-{
-    LocalDevicePtr	local	 = (LocalDevicePtr)dev->public.devicePrivate;
-    ValuatorClassPtr	valuator = dev->valuator;
-    int			num  	 = 0;
-    int			loop	 = local->first;
-    int			size;
-    Time		current;
-    
-    if (!HAS_MOTION_HISTORY(local))
-        return 0;
-
-    size = (sizeof(INT32) * valuator->numAxes + sizeof(Time));
-
-    while (loop != local->last) {
-        current = *(Time*)(((char *)local->motion_history)+loop*size);
-        if (current > stop)
-            return num;
-        if (current >= start) {
-            memcpy(((char *)buff)+size*num,
-                   ((char *)local->motion_history)+loop*size, size);
-            num++;
-        }
-        loop = (loop + 1) % valuator->numMotionEvents;
-    }
-    return num;
-}
-
 _X_EXPORT LocalDevicePtr
 xf86FirstLocalDevice()
 {
diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h
index 73dcdb7..fe65643 100644
--- a/hw/xfree86/common/xf86Xinput.h
+++ b/hw/xfree86/common/xf86Xinput.h
@@ -86,10 +86,6 @@
 #define XI_PRIVATE(dev) \
 	(((LocalDevicePtr)((dev)->public.devicePrivate))->private)
 
-#ifdef HAS_MOTION_HISTORY
-#undef HAS_MOTION_HISTORY
-#endif
-#define HAS_MOTION_HISTORY(local) ((local)->dev->valuator && (local)->dev->valuator->numMotionEvents)
 
 #ifdef XINPUT
 /* This holds the input driver entry and module information. */
@@ -138,9 +134,6 @@ typedef struct _LocalDeviceRec {
     DeviceIntPtr	    dev;
     pointer		    private;
     int			    private_flags;
-    pointer		    motion_history;
-    ValuatorMotionProcPtr   motion_history_proc;
-    unsigned int	    history_size;   /* only for configuration purpose */
     unsigned int	    first;
     unsigned int	    last;
     int			    old_x;
@@ -176,10 +169,6 @@ void xf86PostKeyEvent(DeviceIntPtr devic
 		      ...);
 void xf86PostKeyboardEvent(DeviceIntPtr device, unsigned int key_code,
                            int is_down);
-void xf86MotionHistoryAllocate(LocalDevicePtr local);
-int xf86GetMotionEvents(DeviceIntPtr dev, xTimecoord *buff,
-			unsigned long start, unsigned long stop,
-			ScreenPtr pScreen);
 void xf86XinputFinalizeInit(DeviceIntPtr dev);
 void xf86ActivateDevice(LocalDevicePtr local);
 Bool xf86CheckButton(int button, int down);
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
index 8e39373..3051ded 100644
--- a/hw/xfree86/loader/xf86sym.c
+++ b/hw/xfree86/loader/xf86sym.c
@@ -697,8 +697,6 @@ _X_HIDDEN void *xfree86LookupTab[] = {
     SYMFUNC(xf86PostButtonEvent)
     SYMFUNC(xf86PostKeyEvent)
     SYMFUNC(xf86PostKeyboardEvent)
-    SYMFUNC(xf86GetMotionEvents)
-    SYMFUNC(xf86MotionHistoryAllocate)
     SYMFUNC(xf86FirstLocalDevice)
     SYMFUNC(xf86ActivateDevice)
     SYMFUNC(xf86XInputSetScreen)
diff-tree b1debebf8fe20ded20ba27e871fd1a6a9de029e3 (from b9e180e632d04bf685ade9e32bd0b20882794486)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 01:10:20 2006 +0300

    mi: remove mi motion history
    This is now unneeded as we do motion history in the DIX.

diff --git a/hw/xfree86/loader/misym.c b/hw/xfree86/loader/misym.c
index 3f959fa..46d6a02 100644
--- a/hw/xfree86/loader/misym.c
+++ b/hw/xfree86/loader/misym.c
@@ -191,8 +191,6 @@ _X_HIDDEN void *miLookupTab[] = {
     SYMFUNC(miSegregateChildren)
     SYMFUNC(miHookInitVisuals)
     SYMFUNC(miPointerAbsoluteCursor)
-    SYMFUNC(miPointerGetMotionEvents)
-    SYMFUNC(miPointerGetMotionBufferSize)
     SYMFUNC(miOverlayCopyUnderlay)
     SYMFUNC(miOverlaySetTransFunction)
     SYMFUNC(miOverlayCollectUnderlayRegions)
diff --git a/mi/mipointer.c b/mi/mipointer.c
index 7f850ad..679b760 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -128,7 +128,6 @@ miPointerInitialize (pScreen, spriteFunc
     miPointer.confined = FALSE;
     miPointer.x = 0;
     miPointer.y = 0;
-    miPointer.history_start = miPointer.history_end = 0;
     return TRUE;
 }
 
@@ -267,39 +266,6 @@ miPointerWarpCursor (pScreen, x, y)
  * Pointer/CursorDisplay interface routines
  */
 
-_X_EXPORT int
-miPointerGetMotionBufferSize ()
-{
-    return MOTION_SIZE;
-}
-
-_X_EXPORT int
-miPointerGetMotionEvents (pPtr, coords, start, stop, pScreen)
-    DeviceIntPtr    pPtr;
-    xTimecoord	    *coords;
-    unsigned long   start, stop;
-    ScreenPtr	    pScreen;
-{
-    int		    i;
-    int		    count = 0;
-    miHistoryPtr    h;
-
-    for (i = miPointer.history_start; i != miPointer.history_end;)
-    {
-	h = &miPointer.history[i];
-	if (h->event.time >= stop)
-	    break;
-	if (h->event.time >= start)
-	{
-	    *coords++ = h->event;
-	    count++;
-	}
-	if (++i == MOTION_SIZE) i = 0;
-    }
-    return count;
-}
-
-    
 /*
  * miPointerUpdate
  *
@@ -518,44 +484,4 @@ miPointerMoved (DeviceIntPtr pDev, Scree
 	if(!miPointer.pCursor->bits->emptyMask)
 	    (*pScreenPriv->spriteFuncs->MoveCursor) (pScreen, x, y);
     }
-
-    miPointerUpdateHistory(pDev, pScreen, x, y, time);
-}
-
-/* The pointer has moved to x, y; update the motion history. */
-void
-miPointerUpdateHistory (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
-                        unsigned long time)
-{
-    miHistoryPtr	history;
-    int			prev, end, start;
-
-    miPointer.x = x;
-    miPointer.y = y;
-    miPointer.pScreen = pScreen;
-
-    end = miPointer.history_end;
-    start = miPointer.history_start;
-    prev = end - 1;
-    if (end == 0)
-	prev = MOTION_SIZE - 1;
-    history = &miPointer.history[prev];
-    if (end == start || history->event.time != time)
-    {
-    	history = &miPointer.history[end];
-    	if (++end == MOTION_SIZE) 
-	    end = 0;
-    	if (end == start)
-    	{
-	    start = end + 1;
-	    if (start == MOTION_SIZE)
-	    	start = 0;
-	    miPointer.history_start = start;
-    	}
-    	miPointer.history_end = end;
-    }
-    history->event.x = x;
-    history->event.y = y;
-    history->event.time = time;
-    history->pScreen = pScreen;
 }
diff --git a/mi/mipointer.h b/mi/mipointer.h
index 21b55fa..30e8944 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -181,14 +181,6 @@ extern void miPointerMoved(
     int y,
     unsigned long time);
 
-/* Updates the event history. */
-extern void miPointerUpdateHistory(
-    DeviceIntPtr pDev,
-    ScreenPtr pScreen,
-    int x,
-    int y,
-    unsigned long time);
-
 extern int miPointerScreenIndex;
 
 #endif /* MIPOINTER_H */
diff --git a/mi/mipointrst.h b/mi/mipointrst.h
index 2ebf327..a80c52e 100644
--- a/mi/mipointrst.h
+++ b/mi/mipointrst.h
@@ -32,13 +32,6 @@ in this Software without prior written a
 #include "mipointer.h"
 #include "scrnintstr.h"
 
-#define MOTION_SIZE	256
-
-typedef struct {
-    xTimecoord	    event;
-    ScreenPtr	    pScreen;
-} miHistoryRec, *miHistoryPtr;
-
 typedef struct {
     ScreenPtr		    pScreen;    /* current screen */
     ScreenPtr		    pSpriteScreen;/* screen containing current sprite */
@@ -48,8 +41,6 @@ typedef struct {
     Bool		    confined;	/* pointer can't change screens */
     int			    x, y;	/* hot spot location */
     int			    devx, devy;	/* sprite position */
-    miHistoryRec	    history[MOTION_SIZE];
-    int			    history_start, history_end;
 } miPointerRec, *miPointerPtr;
 
 typedef struct {
diff-tree b9e180e632d04bf685ade9e32bd0b20882794486 (from 5b38eb69cdaa154791c7f74e35dbe4d3256b19bd)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 01:09:19 2006 +0300

    port all users to the new DIX motion history API
    Port KDrive, Xvfb, and Xnest, as well as the virtual core devices, to the
    new motion history API.  Make GetPointerEvents also update the history.

diff --git a/dix/devices.c b/dix/devices.c
index 86e1e7a..a5110ff 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -285,10 +285,9 @@ CorePointerProc(DeviceIntPtr pDev, int w
     case DEVICE_INIT:
         for (i = 1; i <= 32; i++)
             map[i] = i;
-        /* we don't keep history, for now. */
         InitPointerDeviceStruct((DevicePtr)pDev, map, 32,
-                                NULL, (PtrCtrlProcPtr)NoopDDA,
-                                0, 2);
+                                GetMotionHistory, (PtrCtrlProcPtr)NoopDDA,
+                                GetMotionHistorySize(), 2);
         pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
         pDev->valuator->lastx = pDev->valuator->axisVal[0];
         pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
diff --git a/dix/getevents.c b/dix/getevents.c
index 8e22ad6..0a228cd 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -591,6 +591,8 @@ GetPointerEvents(xEvent *events, DeviceI
     if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
         valuators[1 - first_valuator] = y;
 
+    updateMotionHistory(pDev, ms, first_valuator, num_valuators, valuators);
+
     if (pDev->coreEvents) {
         cp->valuator->lastx = x;
         cp->valuator->lasty = y;
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 78943e4..724f724 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -445,11 +445,10 @@ KdPointerProc(DeviceIntPtr pDevice, int 
         }
 
 	InitPointerDeviceStruct(pDev, pi->map, pi->nButtons,
-	    miPointerGetMotionEvents,
+	    GetMotionHistory,
 	    (PtrCtrlProcPtr)NoopDDA,
-	    miPointerGetMotionBufferSize(), pi->nAxes);
+	    GetMotionHistorySize(), pi->nAxes);
 
-#ifdef XINPUT
         if (pi->inputClass == KD_TOUCHSCREEN) {
             InitAbsoluteClassDeviceStruct(pDevice);
             xiclass = AtomFromName(XI_TOUCHSCREEN);
@@ -460,7 +459,6 @@ KdPointerProc(DeviceIntPtr pDevice, int 
 
         AssignTypeAndName(pi->dixdev, xiclass,
                           pi->name ? pi->name : "Generic KDrive Pointer");
-#endif
 
 	return Success;
 	
diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index c0bfb55..9cb1c02 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -292,8 +292,8 @@ vfbMouseProc(DeviceIntPtr pDevice, int o
 	    map[1] = 1;
 	    map[2] = 2;
 	    map[3] = 3;
-	    InitPointerDeviceStruct(pDev, map, 3, miPointerGetMotionEvents,
-		(PtrCtrlProcPtr)NoopDDA, miPointerGetMotionBufferSize(), 2);
+	    InitPointerDeviceStruct(pDev, map, 3, GetMotionHistory,
+		(PtrCtrlProcPtr)NoopDDA, GetMotionHistorySize(), 2);
 	    break;
 
     case DEVICE_ON:
diff --git a/hw/xnest/Pointer.c b/hw/xnest/Pointer.c
index b5e45db..912b6fa 100644
--- a/hw/xnest/Pointer.c
+++ b/hw/xnest/Pointer.c
@@ -57,9 +57,9 @@ xnestPointerProc(DeviceIntPtr pDev, int 
       for (i = 0; i <= nmap; i++)
 	map[i] = i; /* buttons are already mapped */
       InitPointerDeviceStruct(&pDev->public, map, nmap,
-			      miPointerGetMotionEvents,
+			      GetMotionHistory,
 			      xnestChangePointerControl,
-			      miPointerGetMotionBufferSize(), 2);
+			      GetMotionHistorySize(), 2);
       break;
     case DEVICE_ON: 
       xnestEventMask |= XNEST_POINTER_EVENT_MASK;
diff-tree 5b38eb69cdaa154791c7f74e35dbe4d3256b19bd (from 11fb58be77ac163844e494b2b0a260cf28a7ecd1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 01:08:29 2006 +0300

    dix: add motion history support
    Add motion history support (sort of based on the XFree86 DDX's
    implementation) to the DIX.

diff --git a/dix/devices.c b/dix/devices.c
index 5ea7b14..86e1e7a 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -793,7 +793,12 @@ InitValuatorClassDeviceStruct(DeviceIntP
 				    numAxes * sizeof(unsigned int));
     if (!valc)
 	return FALSE;
+
+    valc->motion = NULL;
+    valc->first_motion = 0;
+    valc->last_motion = 0;
     valc->GetMotionProc = motionProc;
+
     valc->numMotionEvents = numMotionEvents;
     valc->motionHintWindow = NullWindow;
     valc->numAxes = numAxes;
@@ -805,6 +810,11 @@ InitValuatorClassDeviceStruct(DeviceIntP
     valc->dxremaind = 0;
     valc->dyremaind = 0;
     dev->valuator = valc;
+
+    /* biggest hack ever. */
+    if (motionProc == GetMotionHistory)
+        AllocateMotionHistory(dev);
+
     for (i=0; i<numAxes; i++) {
         InitValuatorAxisStruct(dev, i, 0, -1, 0, 0, 0);
 	valc->axisVal[i]=0;
diff --git a/dix/getevents.c b/dix/getevents.c
index bec3c3b..8e22ad6 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -66,6 +66,9 @@ extern Bool XkbCopyKeymap(XkbDescPtr src
 /* Maximum number of valuators, divided by six, rounded up. */
 #define MAX_VALUATOR_EVENTS 6
 
+/* Number of motion history events to store. */
+#define MOTION_HISTORY_SIZE 256
+
 /**
  * Returns the maximum number of events GetKeyboardEvents,
  * GetKeyboardValuatorEvents, and GetPointerEvents will ever return.
@@ -368,6 +371,108 @@ getValuatorEvents(xEvent *events, Device
 }
 
 /**
+ * Pick some arbitrary size for Xi motion history.
+ */
+_X_EXPORT int
+GetMotionHistorySize()
+{
+    return MOTION_HISTORY_SIZE;
+}
+
+/**
+ * Allocate the motion history buffer.
+ */
+_X_EXPORT void
+AllocateMotionHistory(DeviceIntPtr pDev)
+{
+    if (pDev->valuator->motion)
+        xfree(pDev->valuator->motion);
+
+    if (pDev->valuator->numMotionEvents < 1)
+        return;
+
+    pDev->valuator->motion = xalloc(((sizeof(INT32) * pDev->valuator->numAxes) +
+                                     sizeof(Time)) *
+                                    pDev->valuator->numMotionEvents);
+    pDev->valuator->first_motion = 0;
+    pDev->valuator->last_motion = 0;
+}
+
+/**
+ * Dump the motion history between start and stop into the supplied buffer.
+ * Only records the event for a given screen in theory, but in practice, we
+ * sort of ignore this.
+ */
+_X_EXPORT int
+GetMotionHistory(DeviceIntPtr pDev, xTimecoord *buff, unsigned long start,
+                 unsigned long stop, ScreenPtr pScreen)
+{
+    int i = 0, ret = 0;
+    /* The size of a single motion event. */
+    int size = (sizeof(INT32) * pDev->valuator->numAxes) + sizeof(Time);
+    Time current;
+    char *ibuff = NULL, *obuff = (char *) buff;
+
+    if (!pDev->valuator || !pDev->valuator->numMotionEvents)
+        return 0;
+
+    for (i = pDev->valuator->first_motion;
+         i != pDev->valuator->last_motion;
+         i = (i + 1) % pDev->valuator->numMotionEvents) {
+        /* We index the input buffer by which element we're accessing, which
+         * is not monotonic, and the output buffer by how many events we've
+         * written so far. */
+        ibuff = (char *) pDev->valuator->motion + (i * size);
+        memcpy(&current, ibuff, sizeof(Time));
+
+        if (current > stop) {
+            return ret;
+        }
+        else if (current >= start) {
+            memcpy(obuff, ibuff, size);
+            obuff += size;
+            ret++;
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * Update the motion history for a specific device, with the list of
+ * valuators.
+ */
+static void
+updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator,
+                    int num_valuators, int *valuators)
+{
+    char *buff = (char *) pDev->valuator->motion;
+
+    if (!pDev->valuator->numMotionEvents)
+        return;
+
+    buff += ((sizeof(INT32) * pDev->valuator->numAxes) + sizeof(CARD32)) *
+            pDev->valuator->last_motion;
+    memcpy(buff, &ms, sizeof(Time));
+
+    buff += sizeof(Time);
+    bzero(buff, sizeof(INT32) * pDev->valuator->numAxes);
+
+    buff += sizeof(INT32) * first_valuator;
+    memcpy(buff, valuators, sizeof(INT32) * num_valuators);
+
+    pDev->valuator->last_motion = (pDev->valuator->last_motion + 1) %
+                                  pDev->valuator->numMotionEvents;
+    
+    /* If we're wrapping around, just keep the circular buffer going. */
+    if (pDev->valuator->first_motion == pDev->valuator->last_motion)
+        pDev->valuator->first_motion = (pDev->valuator->first_motion + 1) %
+                                       pDev->valuator->numMotionEvents;
+
+    return;
+}
+
+/**
  * Generate a series of xEvents (returned in xE) representing pointer
  * motion, or button presses.  Xi and XKB-aware.
  *
diff --git a/include/input.h b/include/input.h
index f6ef337..3fe6944 100644
--- a/include/input.h
+++ b/include/input.h
@@ -418,6 +418,19 @@ extern int GetProximityEvents(
     int num_valuators,
     int *valuators);
 
+extern int GetMotionHistorySize(
+    void);
+
+extern void AllocateMotionHistory(
+    DeviceIntPtr pDev);
+
+extern int GetMotionHistory(
+    DeviceIntPtr pDev,
+    xTimecoord *buff,
+    unsigned long start,
+    unsigned long stop,
+    ScreenPtr pScreen);
+
 extern void SwitchCoreKeyboard(DeviceIntPtr pDev);
 extern void SwitchCorePointer(DeviceIntPtr pDev);
 
diff --git a/include/inputstr.h b/include/inputstr.h
index 4a48c9d..ada94e6 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -146,15 +146,20 @@ typedef struct _AxisInfo {
 
 typedef struct _ValuatorClassRec {
     ValuatorMotionProcPtr GetMotionProc;
-    int		 	numMotionEvents;
-    WindowPtr    	motionHintWindow;
-    AxisInfoPtr 	axes;
-    unsigned short	numAxes;
-    int			*axisVal;
-    CARD8	 	mode;
-    int                 lastx, lasty; /* last event recorded, not posted to
-                                       * client; see dix/devices.c */
-    int                 dxremaind, dyremaind; /* for acceleration */
+    int		 	  numMotionEvents;
+    int                   first_motion;
+    int                   last_motion;
+    void                  *motion;
+
+    WindowPtr    	  motionHintWindow;
+
+    AxisInfoPtr 	  axes;
+    unsigned short	  numAxes;
+    int			  *axisVal;
+    int                   lastx, lasty; /* last event recorded, not posted to
+                                         * client; see dix/devices.c */
+    int                   dxremaind, dyremaind; /* for acceleration */
+    CARD8	 	  mode;
 } ValuatorClassRec, *ValuatorClassPtr;
 
 typedef struct _ButtonClassRec {
diff-tree 11fb58be77ac163844e494b2b0a260cf28a7ecd1 (from 2a74b8a91da1a98669993078f7fe9081f2d743ce)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 01:07:36 2006 +0300

    miscellaneous warning fixes
    Use the correct type for time, and fix the mi prototype of EnqueueEvent.

diff --git a/dix/getevents.c b/dix/getevents.c
index 17a8cb4..bec3c3b 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -117,7 +117,8 @@ _X_EXPORT int
 GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type,
                           int key_code, int first_valuator,
                           int num_valuators, int *valuators) {
-    int numEvents = 0, ms = 0, i = 0;
+    int numEvents = 0, i = 0;
+    CARD32 ms = 0;
     int final_valuator = first_valuator + num_valuators;
     KeySym sym = pDev->key->curKeySyms.map[key_code *
                                            pDev->key->curKeySyms.mapWidth];
@@ -378,7 +379,8 @@ _X_EXPORT int
 GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
                  int flags, int first_valuator, int num_valuators,
                  int *valuators) {
-    int num_events = 0, ms = 0, final_valuator = 0;
+    int num_events = 0, final_valuator = 0;
+    CARD32 ms = 0;
     deviceKeyButtonPointer *kbp = NULL;
     Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
     DeviceIntPtr cp = inputInfo.pointer;
diff --git a/mi/mipointer.h b/mi/mipointer.h
index 82ff045..21b55fa 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -73,6 +73,7 @@ typedef struct _miPointerScreenFuncRec {
                     int  /* y */
                     );
     void	(*EnqueueEvent)(
+                    DeviceIntPtr /* pDev */,
                     xEventPtr /* event */
                     );
     void	(*NewEventScreen)(
diff-tree 2a74b8a91da1a98669993078f7fe9081f2d743ce (from 37d1fffe79c35ada056ce9a56292c000014fe48a)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 25 01:04:53 2006 +0300

    xfree86: re-bump input abi to 1.0, yet again

diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index cf404fb..3c3247e 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -85,7 +85,7 @@ typedef enum {
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 3)
 #define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(1, 1)
-#define ABI_XINPUT_VERSION	SET_ABI_VERSION(0, 6)
+#define ABI_XINPUT_VERSION	SET_ABI_VERSION(1, 0)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(0, 3)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 5)
 
diff-tree 37d1fffe79c35ada056ce9a56292c000014fe48a (from 9f9ac01a819ee96fb5be5d7d346c91f461bf3979)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Oct 24 23:06:57 2006 +0300

    inputstr: try to keep device structs the same size
    Try to make sure DeviceIntRec and friends stay the same size,
    regardless of whether or not XKB is enabled.

diff --git a/include/inputstr.h b/include/inputstr.h
index 1df66da..4a48c9d 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -131,6 +131,8 @@ typedef struct _KeyClassRec {
     unsigned short	prev_state;
 #ifdef XKB
     struct _XkbSrvInfo *xkbInfo;
+#else
+    void               *pad0;
 #endif
 } KeyClassRec, *KeyClassPtr;
 
@@ -163,7 +165,9 @@ typedef struct _ButtonClassRec {
     CARD8		down[DOWN_LENGTH];
     CARD8		map[MAP_LENGTH];
 #ifdef XKB
-    union _XkbAction *	xkb_acts;
+    union _XkbAction    *xkb_acts;
+#else
+    void                *pad0;
 #endif
 } ButtonClassRec, *ButtonClassPtr;
 
@@ -214,6 +218,8 @@ typedef struct _KbdFeedbackClassRec {
     KbdFeedbackPtr	next;
 #ifdef XKB
     struct _XkbSrvLedInfo *xkb_sli;
+#else
+    void                *pad0;
 #endif
 } KbdFeedbackClassRec;
 
@@ -248,6 +254,8 @@ typedef struct _LedFeedbackClassRec {
     LedFeedbackPtr	next;
 #ifdef XKB
     struct _XkbSrvLedInfo *xkb_sli;
+#else
+    void                *pad0;
 #endif
 } LedFeedbackClassRec;
 
@@ -309,7 +317,9 @@ typedef struct _DeviceIntRec {
     BellFeedbackPtr	bell;
     LedFeedbackPtr	leds;
 #ifdef XKB
-    struct _XkbInterest *	xkb_interest;
+    struct _XkbInterest *xkb_interest;
+#else
+    void                *pad0;
 #endif
     DevUnion		*devPrivates;
     int			nPrivates;
diff-tree 9f9ac01a819ee96fb5be5d7d346c91f461bf3979 (from 0cd6a3d8efb5cc1ce4f85ab95bcdf4fb66c7245d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Oct 24 23:01:05 2006 +0300

    inputstr: fix indentation

diff --git a/include/inputstr.h b/include/inputstr.h
index 2c64e0d..1df66da 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -93,15 +93,15 @@ typedef struct _OtherInputMasks {
  */
 
 #define MasksPerDetailMask 8		/* 256 keycodes and 256 possible
-						modifier combinations, but only	
-						3 buttons. */
+                                           modifier combinations, but only	
+                                           3 buttons. */
 
-  typedef struct _DetailRec {		/* Grab details may be bit masks */
-	unsigned short exact;
-	Mask *pMask;
-  } DetailRec;
+typedef struct _DetailRec {		/* Grab details may be bit masks */
+    unsigned short      exact;
+    Mask                *pMask;
+} DetailRec;
 
-  typedef struct _GrabRec {
+typedef struct _GrabRec {
     GrabPtr		next;		/* for chain of passive grabs */
     XID			resource;
     DeviceIntPtr	device;
diff-tree 0cd6a3d8efb5cc1ce4f85ab95bcdf4fb66c7245d (from cccf7ae0ff24d0c84b5144c457f3f86bbbc36e12)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 06:56:07 2006 +0300

    xfree86/input: add proximity support, free valuators
    Re-add support for proximity events, and remember to both va_end our
    varargs, and free our valuators.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index ebd5f72..36f2362 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -585,9 +585,9 @@ xf86PostMotionEvent(DeviceIntPtr	device,
     valuators = xcalloc(sizeof(int), num_valuators);
 
     va_start(var, num_valuators);
-    for (i = 0; i < num_valuators; i++) {
+    for (i = 0; i < num_valuators; i++)
         valuators[i] = va_arg(var, int);
-    }
+    va_end(var);
 
     if (!xf86Events)
         xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
@@ -600,6 +600,8 @@ xf86PostMotionEvent(DeviceIntPtr	device,
 
     for (i = 0; i < nevents; i++)
         mieqEnqueue(device, xf86Events + i);
+
+    xfree(valuators);
 }
 
 _X_EXPORT void
@@ -609,88 +611,28 @@ xf86PostProximityEvent(DeviceIntPtr	devi
                        int		num_valuators,
                        ...)
 {
-    va_list			var;
-    int				loop;
-    Bool			is_core = device->coreEvents;
-
-    ErrorF("xf86PostProximityEvent: no-op event called\n");
-
-#if 0
-    DBG(5, ErrorF("xf86PostProximityEvent BEGIN 0x%x(%s) prox=%s is_core=%s is_absolute=%s\n",
-                  device, device->name, is_in ? "true" : "false",
-                  is_core ? "True" : "False",
-                  is_absolute ? "True" : "False"));
-    
-    if (is_core) {
-        return;
-    }
-  
-    if (num_valuators && (!val || (first_valuator + num_valuators > val->numAxes))) {
-        ErrorF("Bad valuators reported for device \"%s\"\n", device->name);
-        return;
-    }
+    va_list var;
+    int i, nevents, *valuators = NULL;
 
-    xev->type = is_in ? ProximityIn : ProximityOut;
-    xev->detail = 0;
-    xev->deviceid = device->id | MORE_EVENTS;
-        
-    xv->type = DeviceValuator;
-    xv->deviceid = device->id;
-    xv->device_state = 0;
+    valuators = xcalloc(sizeof(int), num_valuators);
 
-    if ((device->valuator->mode & 1) == Relative) {
-        num_valuators = 0;
-    }
-  
-    if (num_valuators != 0) {
-        int	*axisvals = val->axisVal;
-            
-        va_start(var, num_valuators);
+    va_start(var, num_valuators);
+    for (i = 0; i < num_valuators; i++)
+        valuators[i] = va_arg(var, int);
+    va_end(var);
 
-        for(loop=0; loop<num_valuators; loop++) {
-            switch (loop % 6) {
-            case 0:
-                xv->valuator0 = is_absolute ? va_arg(var, int) : axisvals[loop]; 
-                break;
-            case 1:
-                xv->valuator1 = is_absolute ? va_arg(var, int) : axisvals[loop];
-                break;
-            case 2:
-                xv->valuator2 = is_absolute ? va_arg(var, int) : axisvals[loop];
-                break;
-            case 3:
-                xv->valuator3 = is_absolute ? va_arg(var, int) : axisvals[loop];
-                break;
-            case 4:
-                xv->valuator4 = is_absolute ? va_arg(var, int) : axisvals[loop];
-                break;
-            case 5:
-                xv->valuator5 = is_absolute ? va_arg(var, int) : axisvals[loop];
-                break;
-            }
-            if ((loop % 6 == 5) || (loop == num_valuators - 1)) {
-                xf86Info.lastEventTime = xev->time = GetTimeInMillis();
-
-                xv->num_valuators = (loop % 6) + 1;
-                xv->first_valuator = first_valuator + (loop / 6) * 6;
-                mieqEnqueue(xE);
-            }
-        }
-        va_end(var);
-    }
-    else {
-        /* no valuator */
-        xf86Info.lastEventTime = xev->time = GetTimeInMillis();
+    if (!xf86Events)
+        xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+    if (!xf86Events)
+        FatalError("Couldn't allocate event store\n");
 
-        xv->num_valuators = 0;
-        xv->first_valuator = 0;
-        mieqEnqueue(xE);
-    }
-    DBG(5, ErrorF("xf86PostProximityEvent END   0x%x(%s) prox=%s is_core=%s is_absolute=%s\n",
-                  device, device->name, is_in ? "true" : "false",
-                  is_core ? "True" : "False",
-                  is_absolute ? "True" : "False"));
-#endif
+    nevents = GetProximityEvents(xf86Events, device,
+                                 is_in ? ProximityIn : ProximityOut, 
+                                 first_valuator, num_valuators, valuators);
+    for (i = 0; i < nevents; i++)
+        mieqEnqueue(device, xf86Events + i);
+
+    xfree(valuators);
 }
 
 _X_EXPORT void
@@ -709,9 +651,9 @@ xf86PostButtonEvent(DeviceIntPtr	device,
     valuators = xcalloc(sizeof(int), num_valuators);
 
     va_start(var, num_valuators);
-    for (i = 0; i < num_valuators; i++) {
+    for (i = 0; i < num_valuators; i++)
         valuators[i] = va_arg(var, int);
-    }
+    va_end(var);
 
     if (!xf86Events)
         xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
@@ -726,6 +668,8 @@ xf86PostButtonEvent(DeviceIntPtr	device,
 
     for (i = 0; i < nevents; i++)
         mieqEnqueue(device, xf86Events + i);
+
+    xfree(valuators);
 }
 
 _X_EXPORT void
@@ -761,6 +705,7 @@ xf86PostKeyEvent(DeviceIntPtr	device,
                                             is_down ? KeyPress : KeyRelease,
                                             key_code, first_valuator,
                                             num_valuators, valuators);
+        xfree(valuators);
     }
     else {
         nevents = GetKeyboardEvents(xf86Events, device,
diff-tree cccf7ae0ff24d0c84b5144c457f3f86bbbc36e12 (from 35fa4ac12b3da33f81e2a12bc9661ed075f323ed)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 06:55:21 2006 +0300

    GetProximityEvents: add (untested) function
    Add untested first guess at what GetProximityEvents should look like.

diff --git a/dix/getevents.c b/dix/getevents.c
index 802c4e6..17a8cb4 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -56,6 +56,7 @@ extern Bool XkbCopyKeymap(XkbDescPtr src
 #include "panoramiXsrv.h"
 #endif
 
+#include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
 #include "exevents.h"
@@ -533,6 +534,57 @@ GetPointerEvents(xEvent *events, DeviceI
 }
 
 /**
+ * Post ProximityIn/ProximityOut events, accompanied by valuators.
+ *
+ * events is not NULL-terminated; the return value is the number of events.
+ * The DDX is responsible for allocating the event structure in the first
+ * place via GetMaximumEventsNum(), and for freeing it.
+ */
+_X_EXPORT int
+GetProximityEvents(xEvent *events, DeviceIntPtr pDev, int type,
+                   int first_valuator, int num_valuators, int *valuators)
+{
+    int num_events = 0;
+    deviceKeyButtonPointer *kbp = (deviceKeyButtonPointer *) events;
+
+    /* Sanity checks. */
+    if (type != ProximityIn && type != ProximityOut)
+        return 0;
+
+    if (!pDev->valuator)
+        return 0;
+
+    /* Do we need to send a DeviceValuator event? */
+    if ((pDev->valuator->mode & 1) == Relative)
+        num_valuators = 0;
+
+    if (num_valuators) {
+        if ((((num_valuators - 1) / 6) + 1) > MAX_VALUATOR_EVENTS)
+            num_valuators = MAX_VALUATOR_EVENTS * 6;
+        num_events += ((num_valuators - 1) / 6) + 1;
+    }
+
+    /* You fail. */
+    if (first_valuator < 0 ||
+        (num_valuators + first_valuator) > pDev->valuator->numAxes)
+        return 0;
+
+    kbp->type = type;
+    kbp->deviceid = pDev->id;
+    kbp->detail = 0;
+    kbp->time = GetTimeInMillis();
+
+    if (num_valuators) {
+        kbp->deviceid |= MORE_EVENTS;
+        events++;
+        events = getValuatorEvents(events, pDev, first_valuator,
+                                   num_valuators, valuators);
+    }
+
+    return num_events;
+}
+
+/**
  * Note that pDev was the last device to send a core event.  This function
  * copies the complete keymap from the originating device to the core
  * device, and makes sure the appropriate notifications are generated.
diff --git a/include/input.h b/include/input.h
index 4acc856..f6ef337 100644
--- a/include/input.h
+++ b/include/input.h
@@ -410,6 +410,14 @@ extern int GetKeyboardValuatorEvents(
     int num_valuator,
     int *valuators);
 
+extern int GetProximityEvents(
+    xEvent *events,
+    DeviceIntPtr pDev,
+    int type,
+    int first_valuator,
+    int num_valuators,
+    int *valuators);
+
 extern void SwitchCoreKeyboard(DeviceIntPtr pDev);
 extern void SwitchCorePointer(DeviceIntPtr pDev);
 
diff-tree 35fa4ac12b3da33f81e2a12bc9661ed075f323ed (from a7c2d9a15dc2ff253bb69c3b0738ad993521b9c7)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 06:23:45 2006 +0300

    GetPointerEvents: break into separate functions
    Break out clipAxis, clipValuators, and getValuatorEvents, into
    separate functions, to be used by the proximity event code.

diff --git a/dix/getevents.c b/dix/getevents.c
index ca199c6..802c4e6 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -303,6 +303,69 @@ acceleratePointer(DeviceIntPtr pDev, int
 }
 
 /**
+ * Clip an axis to its bounds.
+ */
+static void
+clipAxis(DeviceIntPtr pDev, int axisNum, int *val)
+{
+    AxisInfoPtr axes = pDev->valuator->axes + axisNum;
+
+    if (*val < axes->min_value)
+        *val = axes->min_value;
+    if (axes->max_value >= 0 && *val > axes->max_value)
+        *val = axes->max_value;
+}
+
+/**
+ * Compare the list of valuators against the limits for each axis, and clip
+ * them to those bounds.
+ */
+static void
+clipValuators(DeviceIntPtr pDev, int first_valuator, int num_valuators,
+              int *valuators)
+{
+    AxisInfoPtr axes = pDev->valuator->axes + first_valuator;
+    int i;
+
+    for (i = 0; i < num_valuators; i++, axes++)
+        clipAxis(pDev, i + first_valuator, &(valuators[i]));
+}
+
+/**
+ * Fills events with valuator events for pDev, as given by the other
+ * parameters.
+ */
+static xEvent *
+getValuatorEvents(xEvent *events, DeviceIntPtr pDev, int first_valuator,
+                  int num_valuators, int *valuators) {
+    deviceValuator *xv = (deviceValuator *) events;
+    int i = 0, final_valuator = first_valuator + num_valuators;
+
+    for (i = first_valuator; i < final_valuator; i += 6, xv++, events++) {
+        xv->type = DeviceValuator;
+        xv->first_valuator = i;
+        xv->num_valuators = num_valuators;
+        xv->deviceid = pDev->id;
+        switch (final_valuator - i) {
+        case 6:
+            xv->valuator5 = valuators[i + 5];
+        case 5:
+            xv->valuator4 = valuators[i + 4];
+        case 4:
+            xv->valuator3 = valuators[i + 3];
+        case 3:
+            xv->valuator2 = valuators[i + 2];
+        case 2:
+            xv->valuator1 = valuators[i + 1];
+        case 1:
+            xv->valuator0 = valuators[i];
+        }
+    }
+
+    return events;
+}
+
+/**
  * Generate a series of xEvents (returned in xE) representing pointer
  * motion, or button presses.  Xi and XKB-aware.
  *
@@ -314,22 +377,17 @@ _X_EXPORT int
 GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
                  int flags, int first_valuator, int num_valuators,
                  int *valuators) {
-    int num_events = 0, ms = 0, final_valuator = 0, i = 0;
+    int num_events = 0, ms = 0, final_valuator = 0;
     deviceKeyButtonPointer *kbp = NULL;
-    deviceValuator *xv = NULL;
-    AxisInfoPtr axes = NULL;
     Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
     DeviceIntPtr cp = inputInfo.pointer;
     int x = 0, y = 0;
 
+    /* Sanity checks. */
     if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
         return 0;
 
-    if (!pDev->button || (pDev->coreEvents && (!cp->button || !cp->valuator)))
-        return 0;
-
-    /* You fail. */
-    if (first_valuator < 0)
+    if ((type == ButtonPress || type == ButtonRelease) && !pDev->button)
         return 0;
 
     if (pDev->coreEvents)
@@ -339,9 +397,9 @@ GetPointerEvents(xEvent *events, DeviceI
 
     /* Do we need to send a DeviceValuator event? */
     if ((num_valuators + first_valuator) >= 2 && sendValuators) {
-        if (((num_valuators / 6) + 1) > MAX_VALUATOR_EVENTS)
-            num_valuators = MAX_VALUATOR_EVENTS;
-        num_events += (num_valuators / 6) + 1;
+        if ((((num_valuators - 1) / 6) + 1) > MAX_VALUATOR_EVENTS)
+            num_valuators = MAX_VALUATOR_EVENTS * 6;
+        num_events += ((num_valuators - 1) / 6) + 1;
     }
     else if (type == MotionNotify && num_valuators <= 0) {
         return 0;
@@ -349,6 +407,10 @@ GetPointerEvents(xEvent *events, DeviceI
 
     final_valuator = num_valuators + first_valuator;
 
+    /* You fail. */
+    if (first_valuator < 0 || final_valuator > pDev->valuator->numAxes)
+        return 0;
+
     ms = GetTimeInMillis();
 
     kbp = (deviceKeyButtonPointer *) events;
@@ -405,24 +467,22 @@ GetPointerEvents(xEvent *events, DeviceI
         }
     }
 
-
-    axes = pDev->valuator->axes;
-    if (x < axes->min_value)
-        x = axes->min_value;
-    if (axes->max_value > 0 && x > axes->max_value)
-        x = axes->max_value;
-
-    axes++;
-    if (y < axes->min_value)
-        y = axes->min_value;
-    if (axes->max_value > 0 && y > axes->max_value)
-        y = axes->max_value;
+    /* Clip both x and y to the defined limits (usually co-ord space limit). */
+    clipAxis(pDev, 0, &x);
+    clipAxis(pDev, 1, &y);
 
     /* This takes care of crossing screens for us, as well as clipping
      * to the current screen.  Right now, we only have one history buffer,
      * so we don't set this for both the device and core.*/
     miPointerSetPosition(pDev, &x, &y, ms);
 
+    /* Drop x and y back into the valuators list, if they were originally
+     * present. */
+    if (first_valuator == 0 && num_valuators >= 1)
+        valuators[0] = x;
+    if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
+        valuators[1 - first_valuator] = y;
+
     if (pDev->coreEvents) {
         cp->valuator->lastx = x;
         cp->valuator->lasty = y;
@@ -446,39 +506,13 @@ GetPointerEvents(xEvent *events, DeviceI
 
     if (final_valuator > 2 && sendValuators) {
         kbp->deviceid |= MORE_EVENTS;
-        for (i = first_valuator; i < final_valuator; i += 6) {
-            xv = (deviceValuator *) ++events;
-            xv->type = DeviceValuator;
-            xv->first_valuator = i;
-            xv->num_valuators = num_valuators;
-            xv->deviceid = kbp->deviceid;
-            switch (final_valuator - i) {
-            case 6:
-                xv->valuator5 = valuators[i + 5];
-            case 5:
-                xv->valuator4 = valuators[i + 4];
-            case 4:
-                xv->valuator3 = valuators[i + 3];
-            case 3:
-                xv->valuator2 = valuators[i + 2];
-            case 2:
-                /* x and y may have been accelerated. */
-                if (i == 0)
-                    xv->valuator1 = kbp->root_y;
-                else
-                    xv->valuator1 = valuators[i + 1];
-            case 1:
-                /* x and y may have been accelerated. */
-                if (i == 0)
-                    xv->valuator0 = kbp->root_x;
-                else
-                    xv->valuator0 = valuators[i];
-            }
-        }
+        events++;
+        clipValuators(pDev, first_valuator, num_valuators, valuators);
+        events = getValuatorEvents(events, pDev, first_valuator,
+                                   num_valuators, valuators);
     }
 
     if (pDev->coreEvents) {
-        events++;
         events->u.u.type = type;
         events->u.keyButtonPointer.time = ms;
         events->u.keyButtonPointer.rootX = x;
@@ -562,7 +596,7 @@ SwitchCorePointer(DeviceIntPtr pDev)
 void
 PostSyntheticMotion(int x, int y, int screenNum, unsigned long time)
 {
-    xEvent xE = { 0, };
+    xEvent xE;
 
 #ifdef PANORAMIX
     /* Translate back to the sprite screen since processInputProc
@@ -574,6 +608,7 @@ PostSyntheticMotion(int x, int y, int sc
     }
 #endif
 
+    memset(&xE, 0, sizeof(xEvent));
     xE.u.u.type = MotionNotify;
     xE.u.keyButtonPointer.rootX = x;
     xE.u.keyButtonPointer.rootY = y;
diff-tree a7c2d9a15dc2ff253bb69c3b0738ad993521b9c7 (from c8f76fb3a473a022d497bd0acd6c84f58fc6efbe)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 06:08:27 2006 +0300

    kdrive: numerous warning fixes

diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index 1cc2932..f29fdb9 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -619,8 +619,6 @@ KdProcessArgument (int argc, char **argv
 {
     KdCardInfo	    *card;
     KdScreenInfo    *screen;
-    KdPointerInfo   *pi;
-    KdKeyboardInfo  *ki;
 
     if (!strcmp (argv[i], "-card"))
     {
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index 7f752e9..15d7031 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -816,6 +816,9 @@ void
 KdUnregisterFds (void *closure, Bool do_close);
 
 void
+KdUnregisterFd (void *closure, int fd, Bool do_close);
+
+void
 KdEnqueueKeyboardEvent(KdKeyboardInfo *ki, unsigned char scan_code,
                     unsigned char is_up);
 
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index c900266..78943e4 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -48,6 +48,7 @@
 #ifdef XINPUT
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
+#include "XIstubs.h" /* even though we don't use stubs.  cute, no? */
 #include "exevents.h"
 #include "extinit.h"
 #include "exglobals.h"
@@ -131,7 +132,7 @@ KdUnblockSigio (void)
     sigprocmask (SIG_UNBLOCK, &set, 0);
 }
 
-#ifdef DEBUG
+#ifdef DEBUG_SIGIO
 
 void
 KdAssertSigioBlocked (char *where)
@@ -244,7 +245,7 @@ KdUnregisterFd (void *closure, int fd, B
 
     for (i = 0; i < kdNumInputFds; i++) {
 	if (kdInputFds[i].closure == closure &&
-            kdInputFds[i].fd == fd) {
+            (fd == -1 || kdInputFds[i].fd == fd)) {
 	    if (kdInputEnabled)
 		KdRemoveFd (kdInputFds[i].fd);
 	    if (do_close)
@@ -258,6 +259,12 @@ KdUnregisterFd (void *closure, int fd, B
 }
 
 void
+KdUnregisterFds (void *closure, Bool do_close)
+{
+    KdUnregisterFd(closure, -1, do_close);
+}
+
+void
 KdDisableInput (void)
 {
     KdKeyboardInfo *ki;
@@ -348,7 +355,7 @@ KdEnableInput (void)
     KdUnblockSigio ();
 }
 
-KdKeyboardDriver *
+static KdKeyboardDriver *
 KdFindKeyboardDriver (char *name)
 {
     KdKeyboardDriver *ret;
@@ -365,7 +372,7 @@ KdFindKeyboardDriver (char *name)
     return NULL;
 }
 
-KdPointerDriver *
+static KdPointerDriver *
 KdFindPointerDriver (char *name)
 {
     KdPointerDriver *ret;
@@ -444,7 +451,7 @@ KdPointerProc(DeviceIntPtr pDevice, int 
 
 #ifdef XINPUT
         if (pi->inputClass == KD_TOUCHSCREEN) {
-            InitAbsoluteClassDeviceStruct(pDev);
+            InitAbsoluteClassDeviceStruct(pDevice);
             xiclass = AtomFromName(XI_TOUCHSCREEN);
         }
         else {
@@ -2261,7 +2268,8 @@ ChangeKeyboardDevice(DeviceIntPtr pOldDe
 }
 
 int
-ChangePointerDevice(DeviceIntPtr pOldDev, DeviceIntPtr pDev, int x, int y)
+ChangePointerDevice(DeviceIntPtr pOldDev, DeviceIntPtr pDev, unsigned char x,
+                    unsigned char y)
 {
     return BadDevice;
 }
@@ -2277,20 +2285,17 @@ OpenInputDevice(DeviceIntPtr pDev, Clien
         *status = Success;
 }
 
-int
+void
 CloseInputDevice(DeviceIntPtr pDev, ClientPtr client)
 {
-    if (!pDev)
-        return BadDevice;
-
-    return Success;
+    return;
 }
 
 /* We initialise all input devices at startup. */
-int
+void
 AddOtherInputDevices(void)
 {
-    return Success;
+    return;
 }
 
 /* At the moment, absolute/relative is up to the client. */
@@ -2396,4 +2401,6 @@ NewInputDeviceRequest(InputOption *optio
             return BadImplementation;
         }
     }
+
+    return Success;
 }
diff --git a/include/kdrive-config.h.in b/include/kdrive-config.h.in
index 2f454d7..3bc7792 100644
--- a/include/kdrive-config.h.in
+++ b/include/kdrive-config.h.in
@@ -25,4 +25,10 @@
 /* Verbose debugging output hilarity */
 #undef DEBUG
 
+/* Have the backtrace() function. */
+#undef HAVE_BACKTRACE
+
+/* Have execinfo.h for backtrace(). */
+#undef HAVE_EXECINFO_H
+
 #endif /* _KDRIVE_CONFIG_H_ */
diff-tree c8f76fb3a473a022d497bd0acd6c84f58fc6efbe (from c5b5b046e86b159a9d32451308f38246cc4587f7)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 05:12:15 2006 +0300

    xfree86/input: disallow pointer device changes, fix drag event calculation
    Don't allow users to change the core pointer.
    Fix xf86SendDragEvents to check the device button state, not the core
    pointer's.
    Remove unused xf86CheckButton.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index e1fa9c1..ebd5f72 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -107,7 +107,7 @@ xf86SendDragEvents(DeviceIntPtr	device)
 {
     LocalDevicePtr local = (LocalDevicePtr) device->public.devicePrivate;
     
-    if (inputInfo.pointer->button->buttonsDown > 0)
+    if (device->button->buttonsDown > 0)
         return (local->flags & XI86_SEND_DRAG_EVENTS);
     else
         return (TRUE);
@@ -115,40 +115,6 @@ xf86SendDragEvents(DeviceIntPtr	device)
 
 /***********************************************************************
  *
- * xf86CheckButton --
- *	
- *	Test if the core pointer button state is coherent with
- * the button event to send.
- *
- ***********************************************************************
- */
-Bool
-xf86CheckButton(int	button,
-                int	down)
-{
-    int	check;
-    int bit = (1 << (button - 1));
-
-    /* XXX FIXME VERDAMMT */
-#if 0
-    check = xf86CoreButtonState & bit;
-    
-    DBG(5, ErrorF("xf86CheckButton "
-                  "button=%d down=%d state=%d check=%d returns ",
-                   button, down, xf86CoreButtonState, check));
-    if ((check && down) || (!check && !down)) {
-        DBG(5, ErrorF("FALSE\n"));
-        return FALSE;
-    }
-    xf86CoreButtonState ^= bit;
-
-    DBG(5, ErrorF("TRUE\n"));
-#endif
-    return TRUE;
-}
-
-/***********************************************************************
- *
  * xf86ProcessCommonOptions --
  * 
  *	Process global options.
@@ -377,30 +343,6 @@ ChangePointerDevice (
     axes_changed = FALSE;
    *************************************************************************/
 
-  /*
-   * We don't allow axis swap or other exotic features.
-   */
-  if (x == 0 && y == 1) {
-      LocalDevicePtr	old_local = (LocalDevicePtr)old_dev->public.devicePrivate;
-      LocalDevicePtr	new_local = (LocalDevicePtr)new_dev->public.devicePrivate;
-      
-      InitFocusClassDeviceStruct(old_dev);
-    
-      /* Restore Extended motion history information */
-      old_dev->valuator->GetMotionProc   = old_local->motion_history_proc;
-      old_dev->valuator->numMotionEvents = old_local->history_size;
-
-      /* Save Extended motion history information */
-      new_local->motion_history_proc = new_dev->valuator->GetMotionProc;
-      new_local->history_size	     = new_dev->valuator->numMotionEvents;
-      
-      /* Set Core motion history information */
-      new_dev->valuator->GetMotionProc   = miPointerGetMotionEvents;
-      new_dev->valuator->numMotionEvents = miPointerGetMotionBufferSize();
-      
-    return Success;
-  }
-  else
     return !Success;
 }
 
diff-tree c5b5b046e86b159a9d32451308f38246cc4587f7 (from parents)
Merge: fab1d37ecbeee9777ad1485b0cc62b55042d5014 948a97b97e93cee05a23f1f1ae699c5e181bc8ce
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:58:30 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree fab1d37ecbeee9777ad1485b0cc62b55042d5014 (from 523fe64ba16cf7a40f4095432d81300726d83e8d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:57:00 2006 +0300

    xfree86/options: don't blindly dereference NULL pointers
    Sure, conf_idev should be initialised, but if it's not, try to make the
    best of a bad situation.

diff --git a/hw/xfree86/common/xf86Option.c b/hw/xfree86/common/xf86Option.c
index 0a4c11d..7afb63a 100644
--- a/hw/xfree86/common/xf86Option.c
+++ b/hw/xfree86/common/xf86Option.c
@@ -142,14 +142,14 @@ xf86CollectInputOptions(InputInfoPtr pIn
     if (defaultOpts) {
 	pInfo->options = xf86OptionListCreate(defaultOpts, -1, 0);
     }
-    if (pInfo->conf_idev->commonOptions) {
+    if (pInfo->conf_idev && pInfo->conf_idev->commonOptions) {
 	tmp = xf86optionListDup(pInfo->conf_idev->commonOptions);
 	if (pInfo->options)
 	    pInfo->options = xf86optionListMerge(pInfo->options, tmp);
 	else
 	    pInfo->options = tmp;
     }
-    if (pInfo->conf_idev->extraOptions) {
+    if (pInfo->conf_idev && pInfo->conf_idev->extraOptions) {
 	tmp = xf86optionListDup(pInfo->conf_idev->extraOptions);
 	if (pInfo->options)
 	    pInfo->options = xf86optionListMerge(pInfo->options, tmp);
diff-tree 523fe64ba16cf7a40f4095432d81300726d83e8d (from 57f98e2b72d5c7fea93a9f6da86228ffb4856bf3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:56:28 2006 +0300

    kdrive/lots of DDXes: make stubs use KdOsAddInputDrivers()
    In theory, removing LinuxPciScan should make these drivers OS-independent.

diff --git a/hw/kdrive/chips/chipsstub.c b/hw/kdrive/chips/chipsstub.c
index 3499a48..7fec1c7 100644
--- a/hw/kdrive/chips/chipsstub.c
+++ b/hw/kdrive/chips/chipsstub.c
@@ -48,7 +48,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/epson/epson13806stub.c b/hw/kdrive/epson/epson13806stub.c
index 125d902..7981782 100644
--- a/hw/kdrive/epson/epson13806stub.c
+++ b/hw/kdrive/epson/epson13806stub.c
@@ -53,10 +53,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
-#ifdef TOUCHSCREEN
-    KdAddMouseDriver (&TsFuncs);
-#endif
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 int
diff --git a/hw/kdrive/i810/i810stub.c b/hw/kdrive/i810/i810stub.c
index c195947..364d16b 100644
--- a/hw/kdrive/i810/i810stub.c
+++ b/hw/kdrive/i810/i810stub.c
@@ -73,7 +73,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/igs/igsstub.c b/hw/kdrive/igs/igsstub.c
index b0ce151..39c6fd4 100644
--- a/hw/kdrive/igs/igsstub.c
+++ b/hw/kdrive/igs/igsstub.c
@@ -56,7 +56,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/mach64/mach64stub.c b/hw/kdrive/mach64/mach64stub.c
index 60808c2..f3fef3c 100644
--- a/hw/kdrive/mach64/mach64stub.c
+++ b/hw/kdrive/mach64/mach64stub.c
@@ -56,7 +56,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/mga/mgastub.c b/hw/kdrive/mga/mgastub.c
index ebb40fd..5afbf7f 100644
--- a/hw/kdrive/mga/mgastub.c
+++ b/hw/kdrive/mga/mgastub.c
@@ -45,7 +45,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/neomagic/neomagicstub.c b/hw/kdrive/neomagic/neomagicstub.c
index 308f4a2..c7ec83b 100644
--- a/hw/kdrive/neomagic/neomagicstub.c
+++ b/hw/kdrive/neomagic/neomagicstub.c
@@ -51,10 +51,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
-#ifdef TOUCHSCREEN
-    KdAddMouseDriver (&TsFuncs);
-#endif
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/nvidia/nvidiastub.c b/hw/kdrive/nvidia/nvidiastub.c
index ea2dd0f..2309419 100644
--- a/hw/kdrive/nvidia/nvidiastub.c
+++ b/hw/kdrive/nvidia/nvidiastub.c
@@ -45,7 +45,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/pcmcia/pcmciastub.c b/hw/kdrive/pcmcia/pcmciastub.c
index c509553..a56d2cb 100644
--- a/hw/kdrive/pcmcia/pcmciastub.c
+++ b/hw/kdrive/pcmcia/pcmciastub.c
@@ -45,7 +45,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 extern pcmciaDisplayModeRec pcmciaDefaultModes[];
diff --git a/hw/kdrive/pm2/pm2stub.c b/hw/kdrive/pm2/pm2stub.c
index fe46951..1f824b3 100644
--- a/hw/kdrive/pm2/pm2stub.c
+++ b/hw/kdrive/pm2/pm2stub.c
@@ -32,7 +32,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/r128/r128stub.c b/hw/kdrive/r128/r128stub.c
index 221648d..dbf3c0e 100644
--- a/hw/kdrive/r128/r128stub.c
+++ b/hw/kdrive/r128/r128stub.c
@@ -48,7 +48,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/savage/s3stub.c b/hw/kdrive/savage/s3stub.c
index 41553e6..776f8da 100644
--- a/hw/kdrive/savage/s3stub.c
+++ b/hw/kdrive/savage/s3stub.c
@@ -60,12 +60,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-#ifdef VXWORKS
-    KdInitInput (&VxWorksMouseFuncs, &VxWorksKeyboardFuncs);
-#endif
-#ifdef linux
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
-#endif
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 extern int	s3CpuTimeout;
diff --git a/hw/kdrive/sis300/sis_stub.c b/hw/kdrive/sis300/sis_stub.c
index 7f2e482..8a4c06c 100644
--- a/hw/kdrive/sis300/sis_stub.c
+++ b/hw/kdrive/sis300/sis_stub.c
@@ -53,7 +53,8 @@ InitOutput(ScreenInfo *pScreenInfo, int 
 void
 InitInput(int argc, char **argv)
 {
-	KdInitInput(&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+        KdOsAddInputDrivers();
+	KdInitInput();
 }
 
 void
diff --git a/hw/kdrive/sis530/sisstub.c b/hw/kdrive/sis530/sisstub.c
index a377dd5..2375f65 100644
--- a/hw/kdrive/sis530/sisstub.c
+++ b/hw/kdrive/sis530/sisstub.c
@@ -53,7 +53,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/smi/smistub.c b/hw/kdrive/smi/smistub.c
index e0f33fe..1db6708 100644
--- a/hw/kdrive/smi/smistub.c
+++ b/hw/kdrive/smi/smistub.c
@@ -47,7 +47,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/trident/tridentstub.c b/hw/kdrive/trident/tridentstub.c
index ebfd7ee..650206a 100644
--- a/hw/kdrive/trident/tridentstub.c
+++ b/hw/kdrive/trident/tridentstub.c
@@ -49,7 +49,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/trio/s3stub.c b/hw/kdrive/trio/s3stub.c
index 68178ed..7531858 100644
--- a/hw/kdrive/trio/s3stub.c
+++ b/hw/kdrive/trio/s3stub.c
@@ -52,7 +52,8 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdOsAddInputDrivers ();
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/via/viastub.c b/hw/kdrive/via/viastub.c
index f63ee0d..1439010 100644
--- a/hw/kdrive/via/viastub.c
+++ b/hw/kdrive/via/viastub.c
@@ -87,7 +87,8 @@ InitOutput( ScreenInfo* pScreenInfo, int
 */
 void
 InitInput( int argc, char** argv ) {
-	KdInitInput( &LinuxMouseFuncs, &LinuxKeyboardFuncs );
+        KdOsAddInputDrivers();
+	KdInitInput();
 }
 
 /*
diff-tree 57f98e2b72d5c7fea93a9f6da86228ffb4856bf3 (from a6dc629052f0ad509cfa30e98217043a63c09552)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:55:41 2006 +0300

    kdrive/tslib: port to new absolute API, remove debugging
    Port to new absolute device (not touchscreen) API, and remove some
    leftover debugging.

diff --git a/hw/kdrive/linux/tslib.c b/hw/kdrive/linux/tslib.c
index bf2a3db..44b4b54 100644
--- a/hw/kdrive/linux/tslib.c
+++ b/hw/kdrive/linux/tslib.c
@@ -74,11 +74,8 @@ TsRead (int fd, void *closure)
     }
 
     while (ts_read(private->tsDev, &event, 1) == 1) {
-#ifdef DEBUG
-        ErrorF("[tslib] originally from (%d, %d)\n", event.x, event.y);
-#endif
         if (event.pressure) {
-            if (event.pressure > pi->dixdev->touchscreen->button_threshold) 
+            if (event.pressure > pi->dixdev->absolute->button_threshold) 
                 flags = KD_BUTTON_8;
             else
                 flags = KD_BUTTON_1;
@@ -109,9 +106,6 @@ TsRead (int fd, void *closure)
             y = private->lasty;
         }
 
-#ifdef DEBUG
-        ErrorF("event at (%lu, %lu), pressure is %d, sending flags %lu\n", x, y, event.pressure, flags);
-#endif
         KdEnqueuePointerEvent (pi, flags, x, y, event.pressure);
     }
 }
@@ -132,13 +126,9 @@ TslibEnable (KdPointerInfo *pi)
             close(private->fd);
         return BadAlloc;
     }
-    if (pi->dixdev && pi->dixdev->touchscreen &&
-        pi->dixdev->touchscreen->button_threshold == 0)
-        pi->dixdev->touchscreen->button_threshold = 115;
-
-#ifdef DEBUG
-    ErrorF("[tslib/TslibEnable] successfully enabled %s\n", pi->path);
-#endif
+    if (pi->dixdev && pi->dixdev->absolute &&
+        pi->dixdev->absolute->button_threshold == 0)
+        pi->dixdev->absolute->button_threshold = 115;
 
     KdRegisterFd(private->fd, TsRead, pi);
   
@@ -186,9 +176,6 @@ TslibInit (KdPointerInfo *pi)
     pi->nAxes = 3;
     pi->name = KdSaveString("Touchscreen");
     pi->inputClass = KD_TOUCHSCREEN;
-#ifdef DEBUG
-    ErrorF("[tslib/TslibInit] successfully inited for device %s\n", pi->path);
-#endif
 
     return Success;
 }
diff-tree a6dc629052f0ad509cfa30e98217043a63c09552 (from ac240b00ff6fc354c1aa641406ae8b49244c0b8b)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:54:59 2006 +0300

    kdrive/os: add KdOsAddInputDrivers
    Add KdOsAddInputDrivers, which adds all relevant input drivers.
    
    Could possibly be refactored to KdAddInputDrivers, which called through
    OsFuncs to a new function, if it existed.

diff --git a/hw/kdrive/linux/linux.c b/hw/kdrive/linux/linux.c
index e75f8d5..7ba99b4 100644
--- a/hw/kdrive/linux/linux.c
+++ b/hw/kdrive/linux/linux.c
@@ -469,6 +469,18 @@ LinuxFini (void)
     return;
 }
 
+void
+KdOsAddInputDrivers ()
+{
+    KdAddPointerDriver(&LinuxMouseDriver);
+    KdAddPointerDriver(&MsMouseDriver);
+    KdAddPointerDriver(&Ps2MouseDriver);
+#ifdef TSLIB
+    KdAddPointerDriver(&TsDriver);
+#endif
+    KdAddKeyboardDriver(&LinuxKeyboardDriver);
+}
+
 KdOsFuncs   LinuxFuncs = {
     LinuxInit,
     LinuxEnable,
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index 7e8712c..7f752e9 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -739,6 +739,9 @@ KdProcessArgument (int argc, char **argv
 void
 KdOsInit (KdOsFuncs *pOsFuncs);
 
+void
+KdOsAddInputDrivers (void);
+
 Bool
 KdAllocatePrivates (ScreenPtr pScreen);
 
diff --git a/hw/kdrive/vxworks/vxworks.c b/hw/kdrive/vxworks/vxworks.c
index ce214ff..aa46001 100644
--- a/hw/kdrive/vxworks/vxworks.c
+++ b/hw/kdrive/vxworks/vxworks.c
@@ -33,12 +33,6 @@ VxWorksSpecialKey (KeySym sym)
     case XK_Break:
 	download(1, "launcher", 0);
 	return TRUE;
-    case XK_Delete:
-	dispatchException |= DE_REBOOT;
-	return TRUE;
-    case XK_BackSpace:
-	dispatchException |= DE_RESET;
-	return TRUE;
     }
     return FALSE;
 }
@@ -53,6 +47,13 @@ VxWorksFini (void)
 {
 }
 
+void
+KdOsAddInputDrivers (void)
+{
+    KdAddPointerDriver(&VxWorksMouseDriver);
+    KdAddPointerDriver(&VxWorksKeyboardDriver);
+}
+
 KdOsFuncs   VxWorksFuncs = {
     VxWorksInit,
     VxWorksEnable,
diff-tree ac240b00ff6fc354c1aa641406ae8b49244c0b8b (from b1ba4b3e8ad427af1fa8618b0bd839f741ec2ce3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:54:07 2006 +0300

    kdrive/input: use Absolute instead of Touchscreen
    Adjust to suit Zepheniah's new absolute device API.

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index a2e2c0f..c900266 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -444,7 +444,7 @@ KdPointerProc(DeviceIntPtr pDevice, int 
 
 #ifdef XINPUT
         if (pi->inputClass == KD_TOUCHSCREEN) {
-            InitTouchscreenClassDeviceStruct(pDevice);
+            InitAbsoluteClassDeviceStruct(pDev);
             xiclass = AtomFromName(XI_TOUCHSCREEN);
         }
         else {
diff-tree b1ba4b3e8ad427af1fa8618b0bd839f741ec2ce3 (from 29f28dd1a8a7ed07e945a67946e3510f4b32d12a)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:53:15 2006 +0300

    kdrive/neomagic: include vesa.h, use DebugF

diff --git a/hw/kdrive/neomagic/neomagic.h b/hw/kdrive/neomagic/neomagic.h
index b91e81e..9b10005 100644
--- a/hw/kdrive/neomagic/neomagic.h
+++ b/hw/kdrive/neomagic/neomagic.h
@@ -26,14 +26,10 @@
 #include <backend.h>
 #include "kxv.h"
 #include "klinux.h"
+#include "vesa.h"
 
 
-#define DEBUG
-#ifdef DEBUG
-#define DBGOUT(fmt,a...) fprintf (stderr, fmt, ##a)
-#else
-#define DBGOUT(fmt,a...)
-#endif
+#define DBGOUT DebugF
 
 #define ENTER()    DBGOUT("Enter %s\n", __FUNCTION__)
 #define LEAVE() DBGOUT("Leave %s\n", __FUNCTION__)
diff-tree 29f28dd1a8a7ed07e945a67946e3510f4b32d12a (from 2f33f4065d89ae2b6fdda43c7105d72f89920cae)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:52:52 2006 +0300

    configure.ac: add XSERVER_LIBS to XNEST_LIBS

diff --git a/configure.ac b/configure.ac
index 9700d61..a6eb8cc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1005,7 +1005,7 @@ AC_MSG_RESULT([$XNEST])
 AM_CONDITIONAL(XNEST, [test "x$XNEST" = xyes])
 
 if test "x$XNEST" = xyes; then
-	XNEST_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB"
+	XNEST_LIBS="$XSERVER_LIBS $FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $CWRAP_LIB $OS_LIB"
 	AC_SUBST([XNEST_LIBS])
 fi
 
diff-tree 2f33f4065d89ae2b6fdda43c7105d72f89920cae (from 08928afb0500d46b0caa0a1d1244dee2ed80e6a0)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:52:35 2006 +0300

    Xnest: port to new input API
    Port Xnest to Get{Pointer,Keyboard}Events, plus the new mieq API.

diff --git a/hw/xnest/Events.c b/hw/xnest/Events.c
index e5cf99e..a209241 100644
--- a/hw/xnest/Events.c
+++ b/hw/xnest/Events.c
@@ -37,10 +37,13 @@ is" without express or implied warranty.
 #include "XNWindow.h"
 #include "Events.h"
 #include "Keyboard.h"
+#include "Pointer.h"
 #include "mipointer.h"
 
 CARD32 lastEventTime = 0;
 
+extern xEvent *xnestEvents;
+
 void
 ProcessInputEvents()
 {
@@ -101,11 +104,12 @@ xnestCollectExposures()
 void
 xnestQueueKeyEvent(int type, unsigned int keycode)
 {
-  xEvent x;
-  x.u.u.type = type;
-  x.u.u.detail = keycode;
-  x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
-  mieqEnqueue(&x);
+  int i, n;
+
+  lastEventTime = GetTimeInMillis();
+  n = GetKeyboardEvents(xnestEvents, xnestKeyboardDevice, type, keycode);
+  for (i = 0; i < n; i++)
+    mieqEnqueue(xnestKeyboardDevice, xnestEvents + i);
 }
 
 void
@@ -113,6 +117,7 @@ xnestCollectEvents()
 {
   XEvent X;
   xEvent x;
+  int i, n, valuators[2];
   ScreenPtr pScreen;
 
   while (XCheckIfEvent(xnestDisplay, &X, xnestNotExposurePredicate, NULL)) {
@@ -129,30 +134,30 @@ xnestCollectEvents()
       
     case ButtonPress:
       xnestUpdateModifierState(X.xkey.state);
-      x.u.u.type = ButtonPress;
-      x.u.u.detail = X.xbutton.button;
-      x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
-      mieqEnqueue(&x);
+      lastEventTime = GetTimeInMillis();
+      n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonPress,
+                           X.xbutton.button, POINTER_RELATIVE, 0, 0, NULL);
+      for (i = 0; i < n; i++)
+        mieqEnqueue(xnestPointerDevice, xnestEvents + i);
       break;
       
     case ButtonRelease:
       xnestUpdateModifierState(X.xkey.state);
-      x.u.u.type = ButtonRelease;
-      x.u.u.detail = X.xbutton.button;
-      x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
-      mieqEnqueue(&x);
+      lastEventTime = GetTimeInMillis();
+      n = GetPointerEvents(xnestEvents, xnestPointerDevice, ButtonRelease,
+                           X.xbutton.button, POINTER_RELATIVE, 0, 0, NULL);
+      for (i = 0; i < n; i++)
+        mieqEnqueue(xnestPointerDevice, xnestEvents + i);
       break;
       
     case MotionNotify:
-#if 0
-      x.u.u.type = MotionNotify;
-      x.u.keyButtonPointer.rootX = X.xmotion.x;
-      x.u.keyButtonPointer.rootY = X.xmotion.y;
-      x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
-      mieqEnqueue(&x);
-#endif 
-      miPointerAbsoluteCursor (X.xmotion.x, X.xmotion.y, 
-			       lastEventTime = GetTimeInMillis());
+      valuators[0] = X.xmotion.x;
+      valuators[1] = X.xmotion.y;
+      lastEventTime = GetTimeInMillis();
+      n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify,
+                           0, POINTER_ABSOLUTE, 0, 2, valuators);
+      for (i = 0; i < n; i++)
+        mieqEnqueue(xnestPointerDevice, xnestEvents + i);
       break;
       
     case FocusIn:
@@ -179,15 +184,13 @@ xnestCollectEvents()
 	pScreen = xnestScreen(X.xcrossing.window);
 	if (pScreen) {
 	  NewCurrentScreen(pScreen, X.xcrossing.x, X.xcrossing.y);
-#if 0
-	  x.u.u.type = MotionNotify;
-	  x.u.keyButtonPointer.rootX = X.xcrossing.x;
-	  x.u.keyButtonPointer.rootY = X.xcrossing.y;
-	  x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
-	  mieqEnqueue(&x);
-#endif
-	  miPointerAbsoluteCursor (X.xcrossing.x, X.xcrossing.y, 
-				   lastEventTime = GetTimeInMillis());
+          valuators[0] = X.xcrossing.x;
+          valuators[1] = X.xcrossing.y;
+          lastEventTime = GetTimeInMillis();
+          n = GetPointerEvents(xnestEvents, xnestPointerDevice, MotionNotify,
+                               0, POINTER_ABSOLUTE, 0, 2, valuators);
+          for (i = 0; i < n; i++)
+            mieqEnqueue(xnestPointerDevice, xnestEvents + i);
 	  xnestDirectInstallColormaps(pScreen);
 	}
       }
diff --git a/hw/xnest/Init.c b/hw/xnest/Init.c
index 8c397a7..5bf0300 100644
--- a/hw/xnest/Init.c
+++ b/hw/xnest/Init.c
@@ -45,6 +45,8 @@ is" without express or implied warranty.
 
 Bool xnestDoFullGeneration = True;
 
+xEvent *xnestEvents = NULL;
+
 void
 InitOutput(ScreenInfo *screenInfo, int argc, char *argv[])
 {
@@ -92,10 +94,15 @@ InitInput(int argc, char *argv[])
   xnestPointerDevice = AddInputDevice(xnestPointerProc, TRUE);
   xnestKeyboardDevice = AddInputDevice(xnestKeyboardProc, TRUE);
 
+  if (!xnestEvents)
+      xnestEvents = (xEvent *) xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+  if (!xnestEvents)
+      FatalError("couldn't allocate room for events\n");
+
   RegisterPointerDevice(xnestPointerDevice);
   RegisterKeyboardDevice(xnestKeyboardDevice);
 
-  mieqInit((DevicePtr)xnestKeyboardDevice, (DevicePtr)xnestPointerDevice);
+  mieqInit();
 
   AddEnabledDevice(XConnectionNumber(xnestDisplay));
 
diff --git a/hw/xnest/Pointer.c b/hw/xnest/Pointer.c
index 4544497..b5e45db 100644
--- a/hw/xnest/Pointer.c
+++ b/hw/xnest/Pointer.c
@@ -59,7 +59,7 @@ xnestPointerProc(DeviceIntPtr pDev, int 
       InitPointerDeviceStruct(&pDev->public, map, nmap,
 			      miPointerGetMotionEvents,
 			      xnestChangePointerControl,
-			      miPointerGetMotionBufferSize());
+			      miPointerGetMotionBufferSize(), 2);
       break;
     case DEVICE_ON: 
       xnestEventMask |= XNEST_POINTER_EVENT_MASK;
diff-tree 08928afb0500d46b0caa0a1d1244dee2ed80e6a0 (from cd3b16a57efaf89108054f18a94c91e2dd74fafa)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:51:52 2006 +0300

    Xnest: disable XKB, reshuffle code
    Disable XKB, as we can't yet use it; move Composite disabling to
    ddxInitGlobals, along with XKB.

diff --git a/hw/xnest/Args.c b/hw/xnest/Args.c
index 5d0a0c0..c2e8b0d 100644
--- a/hw/xnest/Args.c
+++ b/hw/xnest/Args.c
@@ -53,18 +53,21 @@ Window xnestParentWindow = 0;
 /* ddxInitGlobals - called by |InitGlobals| from os/util.c */
 void ddxInitGlobals(void)
 {
-}
-
-int
-ddxProcessArgument (int argc, char *argv[], int i)
-{
-
 #ifdef COMPOSITE
     /* XXX terrible hack */
     extern Bool noCompositeExtension;
     noCompositeExtension = TRUE;
 #endif
 
+#ifdef XKB
+    extern Bool noXkbExtension;
+    noXkbExtension = TRUE;
+#endif
+}
+
+int
+ddxProcessArgument (int argc, char *argv[], int i)
+{
   if (!strcmp(argv[i], "-display")) {
     if (++i < argc) {
       xnestDisplayName = argv[i];
diff-tree cd3b16a57efaf89108054f18a94c91e2dd74fafa (from bf4df9b73f0c1a84093aaf9a2e2cbc56fb341c60)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:51:13 2006 +0300

    Xvfb: port to new mieq API

diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index 17e023a..c0bfb55 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -293,7 +293,7 @@ vfbMouseProc(DeviceIntPtr pDevice, int o
 	    map[2] = 2;
 	    map[3] = 3;
 	    InitPointerDeviceStruct(pDev, map, 3, miPointerGetMotionEvents,
-		(PtrCtrlProcPtr)NoopDDA, miPointerGetMotionBufferSize());
+		(PtrCtrlProcPtr)NoopDDA, miPointerGetMotionBufferSize(), 2);
 	    break;
 
     case DEVICE_ON:
@@ -318,6 +318,5 @@ InitInput(int argc, char *argv[])
     k = AddInputDevice(vfbKeybdProc, TRUE);
     RegisterPointerDevice(p);
     RegisterKeyboardDevice(k);
-    miRegisterPointerDevice(screenInfo.screens[0], p);
-    (void)mieqInit ((DevicePtr) k, (DevicePtr) p);
+    (void)mieqInit();
 }
diff-tree bf4df9b73f0c1a84093aaf9a2e2cbc56fb341c60 (from 4dd91c45abea9fb561a5acb10290e29487df6722)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:50:53 2006 +0300

    include: move POINTER_* flags from inputstr.h to input.h
    Given they're just numeric constants, they should be included in
    input.h, not inputstr.h.

diff --git a/include/input.h b/include/input.h
index e598963..4acc856 100644
--- a/include/input.h
+++ b/include/input.h
@@ -59,6 +59,10 @@ SOFTWARE.
 #define DEVICE_OFF	2
 #define DEVICE_CLOSE	3
 
+#define POINTER_RELATIVE (1 << 1)
+#define POINTER_ABSOLUTE (1 << 2)
+#define POINTER_ACCELERATE (1 << 3)
+
 #define MAP_LENGTH	256
 #define DOWN_LENGTH	32	/* 256/8 => number of bytes to hold 256 bits */
 #define NullGrab ((GrabPtr)NULL)
diff --git a/include/inputstr.h b/include/inputstr.h
index 52175ad..2c64e0d 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -62,10 +62,6 @@ SOFTWARE.
 
 #define EMASKSIZE	MAX_DEVICES
 
-#define POINTER_RELATIVE (1 << 1)
-#define POINTER_ABSOLUTE (1 << 2)
-#define POINTER_ACCELERATE (1 << 3)
-
 extern int CoreDevicePrivatesIndex, CoreDevicePrivatesGeneration;
 
 /* Kludge: OtherClients and InputClients must be compatible, see code */
diff-tree 4dd91c45abea9fb561a5acb10290e29487df6722 (from 562096a012f4bb8f44d5ec6320a32f4010c189e4)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:50:03 2006 +0300

    miinitext: Xi and XKB are not hardware-only extensions
    Xi is now a required extension, and XKB can be used without hardware,
    so include them both when NO_HW_ONLY_EXTS is defined.

diff --git a/mi/miinitext.c b/mi/miinitext.c
index aafd014..f618595 100644
--- a/mi/miinitext.c
+++ b/mi/miinitext.c
@@ -549,7 +549,7 @@ InitExtensions(argc, argv)
 #ifdef MULTIBUFFER
     if (!noMultibufferExtension) MultibufferExtensionInit();
 #endif
-#if defined(XINPUT) && !defined(NO_HW_ONLY_EXTS)
+#if defined(XINPUT)
     if (!noXInputExtension) XInputExtensionInit();
 #endif
 #ifdef XTEST
@@ -579,7 +579,7 @@ InitExtensions(argc, argv)
 #ifdef XSYNC
     if (!noSyncExtension) SyncExtensionInit();
 #endif
-#if defined(XKB) && !defined(PRINT_ONLY_SERVER) && !defined(NO_HW_ONLY_EXTS)
+#if defined(XKB) && !defined(PRINT_ONLY_SERVER)
     if (!noXkbExtension) XkbExtensionInit();
 #endif
 #ifdef XCMISC
diff-tree 562096a012f4bb8f44d5ec6320a32f4010c189e4 (from eec182259112fba240751f974f7e5ca09fce8b9d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:49:22 2006 +0300

    XkbCopyKeymap: increment shapes and outlines when copying
    Remember to increment the source and destination shapes when copying,
    instead of just endlessly copying the first one.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index cddeb9e..0c1ac9c 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -1665,7 +1665,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
 
             for (i = 0, sshape = src->geom->shapes, dshape = dst->geom->shapes;
                  i < src->geom->num_shapes;
-                 i++) {
+                 i++, sshape++, dshape++) {
                 if (sshape->num_outlines) {
                     tmp = xcalloc(sshape->num_outlines, sizeof(XkbOutlineRec));
                     if (!tmp)
@@ -1676,7 +1676,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                           soutline = sshape->outlines,
                           doutline = dshape->outlines;
                          j < sshape->num_outlines;
-                         j++) {
+                         j++, soutline++, doutline++) {
                         if (soutline->num_points) {
                             tmp = xalloc(soutline->num_points *
                                           sizeof(XkbPointRec));
diff-tree eec182259112fba240751f974f7e5ca09fce8b9d (from bc701a14292da5abfb601e3a040651a74f46df8f)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 02:48:30 2006 +0300

    dix/getevents: move SyntheticMotion to getevents.c
    Mostly, this is just a cheesy hack to ensure that getevents.o gets
    included when linking.  Sigh.

diff --git a/dix/events.c b/dix/events.c
index e1a3e75..321c552 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -320,11 +320,16 @@ static CARD8 criticalEvents[32] =
 };
 
 #ifdef PANORAMIX
-
 static void ConfineToShape(RegionPtr shape, int *px, int *py);
-static void SyntheticMotion(int x, int y);
+static void PostSyntheticMotion(int x, int y, int screenNum, int time);
 static void PostNewCursor(void);
 
+#define SyntheticMotion(x, y) \
+    PostSyntheticMotion(x, y, sprite.screen->myNum, \
+                        syncEvents.playingEvents ? \
+                          syncEvents.time.milliseconds : \
+                          currentTime.milliseconds);
+
 static Bool
 XineramaSetCursorPosition(
     int x, 
@@ -667,30 +672,6 @@ SetCriticalEvent(int event)
     criticalEvents[event >> 3] |= 1 << (event & 7);
 }
 
-static void
-SyntheticMotion(int x, int y)
-{
-    xEvent xE;
-
-#ifdef PANORAMIX
-    /* Translate back to the sprite screen since processInputProc
-       will translate from sprite screen to screen 0 upon reentry
-       to the DIX layer */
-    if(!noPanoramiXExtension) {
-	x += panoramiXdataPtr[0].x - panoramiXdataPtr[sprite.screen->myNum].x;
-	y += panoramiXdataPtr[0].y - panoramiXdataPtr[sprite.screen->myNum].y;
-    }
-#endif
-    xE.u.keyButtonPointer.rootX = x;
-    xE.u.keyButtonPointer.rootY = y;
-    if (syncEvents.playingEvents)
-	xE.u.keyButtonPointer.time = syncEvents.time.milliseconds;
-    else
-	xE.u.keyButtonPointer.time = currentTime.milliseconds;
-    xE.u.u.type = MotionNotify;
-    (*inputInfo.pointer->public.processInputProc)(&xE, inputInfo.pointer, 1);
-}
-
 #ifdef SHAPE
 static void
 ConfineToShape(RegionPtr shape, int *px, int *py)
diff --git a/dix/getevents.c b/dix/getevents.c
index 03fe5fe..ca199c6 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -51,6 +51,11 @@ extern Bool XkbCopyKeymap(XkbDescPtr src
 #include "xace.h"
 #endif
 
+#ifdef PANORAMIX
+#include "panoramiX.h"
+#include "panoramiXsrv.h"
+#endif
+
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
 #include "exevents.h"
@@ -546,3 +551,32 @@ SwitchCorePointer(DeviceIntPtr pDev)
     if (inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr != pDev)
         inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
 }
+
+
+/**
+ * Synthesize a single motion event for the core pointer.
+ *
+ * Used in cursor functions, e.g. when cursor confinement changes, and we need
+ * to shift the pointer to get it inside the new bounds.
+ */
+void
+PostSyntheticMotion(int x, int y, int screenNum, unsigned long time)
+{
+    xEvent xE = { 0, };
+
+#ifdef PANORAMIX
+    /* Translate back to the sprite screen since processInputProc
+       will translate from sprite screen to screen 0 upon reentry
+       to the DIX layer. */
+    if (!noPanoramiXExtension) {
+        x += panoramiXdataPtr[0].x - panoramiXdataPtr[screenNum].x;
+        y += panoramiXdataPtr[0].y - panoramiXdataPtr[screenNum].y;
+    }
+#endif
+
+    xE.u.u.type = MotionNotify;
+    xE.u.keyButtonPointer.rootX = x;
+    xE.u.keyButtonPointer.rootY = y;
+
+    (*inputInfo.pointer->public.processInputProc)(&xE, inputInfo.pointer, 1);
+}
diff-tree bc701a14292da5abfb601e3a040651a74f46df8f (from b03e2f7029506640a8fe5cb88818b329c23503ff)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 23 00:08:32 2006 +0300

    dix/getevents: cosmetic cleanups, remove keymap copy from GKVE
    Remove keymap copy from GetKeyboardValuatorEvents, as
    SwitchCoreKeyboard now takes care of this for us.
    Remove unused variable and function prototype.
    Update comments to be as informative as possible.

diff --git a/dix/getevents.c b/dix/getevents.c
index c6a35ba..03fe5fe 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -44,7 +44,6 @@
 #ifdef XKB
 #include <X11/extensions/XKBproto.h>
 #include <X11/extensions/XKBsrv.h>
-extern Bool XkbFilterEvents(ClientPtr, int, xEvent *);
 extern Bool XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies);
 #endif
 
@@ -99,9 +98,10 @@ GetKeyboardEvents(xEvent *events, Device
  * The DDX is responsible for allocating the event structure in the first
  * place via GetMaximumEventsNum(), and for freeing it.
  *
- * If pDev is set to send core events, then the keymap on the core
- * keyboard will be pivoted to that of the new keyboard and the appropriate
- * MapNotify events (both core and XKB) will be sent.
+ * This function does not change the core keymap to that of the device;
+ * that is done by SwitchCoreKeyboard, which is called from
+ * mieqProcessInputEvents.  If replacing function, take care to call
+ * SetCoreKeyboard before processInputProc, so keymaps are altered to suit.
  *
  * Note that this function recurses!  If called for non-XKB, a repeating
  * key press will trigger a matching KeyRelease, as well as the
@@ -117,7 +117,6 @@ GetKeyboardValuatorEvents(xEvent *events
                                            pDev->key->curKeySyms.mapWidth];
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
-    KeyClassPtr ckeyc;
 
     if (!events)
         return 0;
@@ -220,40 +219,13 @@ GetKeyboardValuatorEvents(xEvent *events
         events->u.keyButtonPointer.time = ms;
         events->u.u.type = type;
         events->u.u.detail = key_code;
-
-        if (inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr !=
-            pDev) {
-            ckeyc = inputInfo.keyboard->key;
-            memcpy(ckeyc->modifierMap, pDev->key->modifierMap, MAP_LENGTH);
-            if (ckeyc->modifierKeyMap)
-                xfree(ckeyc->modifierKeyMap);
-            ckeyc->modifierKeyMap = xalloc(8 * pDev->key->maxKeysPerModifier);
-            memcpy(ckeyc->modifierKeyMap, pDev->key->modifierKeyMap,
-                    (8 * pDev->key->maxKeysPerModifier));
-            ckeyc->maxKeysPerModifier = pDev->key->maxKeysPerModifier;
-            ckeyc->curKeySyms.minKeyCode = pDev->key->curKeySyms.minKeyCode;
-            ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode;
-            SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms);
-#ifdef XKB
-            if (!noXkbExtension && pDev->key->xkbInfo &&
-                pDev->key->xkbInfo->desc) {
-                if (!XkbCopyKeymap(pDev->key->xkbInfo->desc,
-                                   ckeyc->xkbInfo->desc, True))
-                    FatalError("Couldn't pivot keymap from device to core!\n");
-            }
-#endif
-            SendMappingNotify(MappingKeyboard, ckeyc->curKeySyms.minKeyCode,
-                              (ckeyc->curKeySyms.maxKeyCode -
-                               ckeyc->curKeySyms.minKeyCode),
-                              serverClient);
-            inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
-        }
     }
 
     return numEvents;
 }
 
-/* Originally a part of xf86PostMotionEvent. */
+/* Originally a part of xf86PostMotionEvent; modifies valuators
+ * in-place. */
 static void
 acceleratePointer(DeviceIntPtr pDev, int first_valuator, int num_valuators,
                   int *valuators)
@@ -277,9 +249,6 @@ acceleratePointer(DeviceIntPtr pDev, int
     if (!dx && !dy)
         return;
 
-    /*
-     * Accelerate
-     */
     if (pDev->ptrfeed && pDev->ptrfeed->ctrl.num) {
         /* modeled from xf86Events.c */
         if (pDev->ptrfeed->ctrl.threshold) {
@@ -524,7 +493,15 @@ GetPointerEvents(xEvent *events, DeviceI
     return num_events;
 }
 
-void SwitchCoreKeyboard(DeviceIntPtr pDev)
+/**
+ * Note that pDev was the last device to send a core event.  This function
+ * copies the complete keymap from the originating device to the core
+ * device, and makes sure the appropriate notifications are generated.
+ *
+ * Call this just before processInputProc.
+ */
+_X_EXPORT void
+SwitchCoreKeyboard(DeviceIntPtr pDev)
 {
     KeyClassPtr ckeyc = inputInfo.keyboard->key;
 
@@ -557,8 +534,14 @@ void SwitchCoreKeyboard(DeviceIntPtr pDe
     }
 }
 
-/* Currently a no-op. */
-void SwitchCorePointer(DeviceIntPtr pDev)
+/**
+ * Note that pDev was the last function to send a core pointer event.
+ * Currently a no-op.
+ *
+ * Call this just before processInputProc.
+ */ 
+_X_EXPORT void
+SwitchCorePointer(DeviceIntPtr pDev)
 {
     if (inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr != pDev)
         inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
diff-tree b03e2f7029506640a8fe5cb88818b329c23503ff (from 90de7ce25a84cfe6c6790f9af2bc2399d25b9b9c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 22 19:56:49 2006 +0300

    xi: fix NIDR return yet again
    For a one-line function, it was pretty broken.

diff --git a/Xi/stubs.c b/Xi/stubs.c
index 88afec0..28ecd8b 100644
--- a/Xi/stubs.c
+++ b/Xi/stubs.c
@@ -308,5 +308,5 @@ ChangeDeviceControl(register ClientPtr c
 int
 NewInputDeviceRequest(InputOption *options)
 {
-    return;
+    return BadValue;
 }
diff-tree 90de7ce25a84cfe6c6790f9af2bc2399d25b9b9c (from f46dc272913ffb6b5b234a7ec6f4ba5cae44a831)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 22 19:54:36 2006 +0300

    xi: fix return type for NIDR

diff --git a/Xi/stubs.c b/Xi/stubs.c
index 0678c4c..88afec0 100644
--- a/Xi/stubs.c
+++ b/Xi/stubs.c
@@ -305,7 +305,7 @@ ChangeDeviceControl(register ClientPtr c
  * Add a new device with the specified options.
  *
  */
-void
+int
 NewInputDeviceRequest(InputOption *options)
 {
     return;
diff-tree f46dc272913ffb6b5b234a7ec6f4ba5cae44a831 (from 31a6307b7ba5adaa96deb8101ddfcda0262f537d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 22 19:51:35 2006 +0300

    xi: add NewInputDeviceRequest to stubs

diff --git a/Xi/stubs.c b/Xi/stubs.c
index 27afcea..0678c4c 100644
--- a/Xi/stubs.c
+++ b/Xi/stubs.c
@@ -296,3 +296,17 @@ ChangeDeviceControl(register ClientPtr c
 	return (BadMatch);
     }
 }
+
+
+/****************************************************************************
+ *
+ * Caller: configAddDevice (and others)
+ *
+ * Add a new device with the specified options.
+ *
+ */
+void
+NewInputDeviceRequest(InputOption *options)
+{
+    return;
+}
diff-tree 31a6307b7ba5adaa96deb8101ddfcda0262f537d (from eae6594d03a606ddf1f433b5897b5938aa940c1e)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 22 19:49:31 2006 +0300

    xi: change DEVICE_TOUCHSCREEN to ABS_{AREA_CALIB} for stubs

diff --git a/Xi/stubs.c b/Xi/stubs.c
index 90aeddb..27afcea 100644
--- a/Xi/stubs.c
+++ b/Xi/stubs.c
@@ -287,7 +287,8 @@ ChangeDeviceControl(register ClientPtr c
     switch (control->control) {
     case DEVICE_RESOLUTION:
 	return (BadMatch);
-    case DEVICE_TOUCHSCREEN:
+    case DEVICE_ABS_CALIB:
+    case DEVICE_ABS_AREA:
         return (BadMatch);
     case DEVICE_CORE:
         return (BadMatch);
diff-tree eae6594d03a606ddf1f433b5897b5938aa940c1e (from be21630164e865eca72ff2a686a38ae4e30fd79c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 22 16:39:44 2006 +0300

    Xi: swap control in DevicePresenceNotify

diff --git a/Xi/extinit.c b/Xi/extinit.c
index c1ba462..c35a964 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -658,6 +658,7 @@ SDevicePresenceNotifyEvent (devicePresen
     *to = *from;
     swaps(&to->sequenceNumber,n);
     swapl(&to->time, n);
+    swaps(&to->control, n);
 }
 
 /************************************************************************
diff-tree be21630164e865eca72ff2a686a38ae4e30fd79c (from f08b6b2367705cb5b60e996e6328197430bf1919)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 22 16:33:02 2006 +0300

    dix, Xi: make use of deviceid in DevicePresenceNotify
    Use the deviceid and control fields in DevicePresenceNotify since
    the last push to inputproto to send a DPN whenever a control changes
    on a device.

diff --git a/Xi/chgdctl.c b/Xi/chgdctl.c
index 597955c..badd938 100644
--- a/Xi/chgdctl.c
+++ b/Xi/chgdctl.c
@@ -66,6 +66,7 @@ SOFTWARE.
 #include "extnsionst.h"
 #include "extinit.h"	/* LookupDeviceIntRec */
 #include "exglobals.h"
+#include "exevents.h"
 
 #include "chgdctl.h"
 
@@ -98,7 +99,7 @@ int
 ProcXChangeDeviceControl(ClientPtr client)
 {
     unsigned len;
-    int i, status;
+    int i, status, ret = BadValue;
     DeviceIntPtr dev;
     xDeviceResolutionCtl *r;
     xChangeDeviceControlReply rep;
@@ -108,6 +109,7 @@ ProcXChangeDeviceControl(ClientPtr clien
     xDeviceAbsAreaCtl *area;
     xDeviceCoreCtl *c;
     xDeviceEnableCtl *e;
+    devicePresenceNotify dpn;
 
     REQUEST(xChangeDeviceControlReq);
     REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq);
@@ -115,9 +117,8 @@ ProcXChangeDeviceControl(ClientPtr clien
     len = stuff->length - (sizeof(xChangeDeviceControlReq) >> 2);
     dev = LookupDeviceIntRec(stuff->deviceid);
     if (dev == NULL) {
-	SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
-			  BadDevice);
-	return Success;
+        ret = BadDevice;
+        goto out;
     }
 
     rep.repType = X_Reply;
@@ -130,25 +131,22 @@ ProcXChangeDeviceControl(ClientPtr clien
 	r = (xDeviceResolutionCtl *) & stuff[1];
 	if ((len < (sizeof(xDeviceResolutionCtl) >> 2)) ||
 	    (len != (sizeof(xDeviceResolutionCtl) >> 2) + r->num_valuators)) {
-	    SendErrorToClient(client, IReqCode, X_ChangeDeviceControl,
-			      0, BadLength);
-	    return Success;
+            ret = BadLength;
+            goto out;
 	}
 	if (!dev->valuator) {
-	    SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
-			      BadMatch);
-	    return Success;
+            ret = BadMatch;
+            goto out;
 	}
 	if ((dev->grab) && !SameClient(dev->grab, client)) {
 	    rep.status = AlreadyGrabbed;
-	    WriteReplyToClient(client, sizeof(xChangeDeviceControlReply), &rep);
-	    return Success;
+            ret = Success;
+            goto out;
 	}
 	resolution = (CARD32 *) (r + 1);
 	if (r->first_valuator + r->num_valuators > dev->valuator->numAxes) {
-	    SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
-			      BadValue);
-	    return Success;
+            ret = BadValue;
+            goto out;
 	}
 	status = ChangeDeviceControl(client, dev, (xDeviceCtl *) r);
 	if (status == Success) {
@@ -162,23 +160,21 @@ ProcXChangeDeviceControl(ClientPtr clien
 		}
 	    for (i = 0; i < r->num_valuators; i++)
 		(a++)->resolution = *resolution++;
+
+            ret = Success;
 	} else if (status == DeviceBusy) {
 	    rep.status = DeviceBusy;
-	    WriteReplyToClient(client, sizeof(xChangeDeviceControlReply), &rep);
-	    return Success;
+            ret = Success;
 	} else {
-	    SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
-			      BadMatch);
-	    return Success;
+            ret = BadMatch;
 	}
 	break;
     case DEVICE_ABS_CALIB:
         calib = (xDeviceAbsCalibCtl *)&stuff[1];
 
         if (calib->button_threshold < 0 || calib->button_threshold > 255) {
-            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
-                              BadValue);
-            return Success;
+            ret = BadValue;
+            goto out;
         }
 
         status = ChangeDeviceControl(client, dev, (xDeviceCtl *) calib);
@@ -192,15 +188,12 @@ ProcXChangeDeviceControl(ClientPtr clien
             dev->absolute->flip_y = calib->flip_y;
             dev->absolute->rotation = calib->rotation;
             dev->absolute->button_threshold = calib->button_threshold;
+            ret = Success;
         } else if (status == DeviceBusy || status == BadValue) {
             rep.status = status;
-            WriteReplyToClient(client, sizeof(xChangeDeviceControlReply),
-                               &rep);
-            return Success;
+            ret = Success;
         } else {
-            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
-                              BadMatch);
-            return Success;
+            ret = BadMatch;
         }
 
         break;
@@ -216,15 +209,12 @@ ProcXChangeDeviceControl(ClientPtr clien
             dev->absolute->height = area->height;
             dev->absolute->screen = area->screen;
             dev->absolute->following = area->following;
+            ret = Success;
         } else if (status == DeviceBusy || status == BadValue) {
             rep.status = status;
-            WriteReplyToClient(client, sizeof(xChangeDeviceControlReply),
-                               &rep);
-            return Success;
+            ret = Success;
         } else {
-            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
-                              BadMatch);
-            return Success;
+            ret = Success;
         }
 
         break;
@@ -235,15 +225,12 @@ ProcXChangeDeviceControl(ClientPtr clien
 
         if (status == Success) {
             dev->coreEvents = c->status;
+            ret = Success;
         } else if (status == DeviceBusy) {
             rep.status = DeviceBusy;
-            WriteReplyToClient(client, sizeof(xChangeDeviceControlReply),
-                               &rep);
-            return Success;
+            ret = Success;
         } else {
-            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
-                              BadMatch);
-            return Success;
+            ret = BadMatch;
         }
 
         break;
@@ -257,23 +244,35 @@ ProcXChangeDeviceControl(ClientPtr clien
                 EnableDevice(dev);
             else
                 DisableDevice(dev);
+            ret = Success;
         } else if (status == DeviceBusy) {
             rep.status = DeviceBusy;
-            WriteReplyToClient(client, sizeof(xChangeDeviceControlReply),
-                               &rep);
-            return Success;
+            ret = Success;
         } else {
-            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
-                              BadMatch);
-            return Success;
+            ret = BadMatch;
         }
 
         break;
     default:
-	SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0, BadValue);
-	return Success;
+        ret = BadValue;
+    }
+
+out:
+    if (ret == Success) {
+        dpn.type = DevicePresenceNotify;
+        dpn.time = currentTime.milliseconds;
+        dpn.devchange = 1;
+        dpn.deviceid = dev->id;
+        dpn.control = stuff->control;
+        SendEventToAllWindows(dev, DevicePresenceNotifyMask,
+                              (xEvent *) &dpn, 1);
+
+        WriteReplyToClient(client, sizeof(xChangeDeviceControlReply), &rep);
+    }
+    else {
+        SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0, ret);
     }
-    WriteReplyToClient(client, sizeof(xChangeDeviceControlReply), &rep);
+
     return Success;
 }
 
diff --git a/dix/devices.c b/dix/devices.c
index c906bcd..5ea7b14 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -201,6 +201,8 @@ ActivateDevice(DeviceIntPtr dev)
     
     ev.type = DevicePresenceNotify;
     ev.time = currentTime.milliseconds;
+    ev.devchange = 0;
+    ev.deviceid = 0;
     dummyDev.id = 0;
     SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
                           (xEvent *) &ev, 1);
@@ -557,6 +559,8 @@ RemoveDevice(DeviceIntPtr dev)
     if (ret == Success) {
         ev.type = DevicePresenceNotify;
         ev.time = currentTime.milliseconds;
+        ev.devchange = 0;
+        ev.deviceid = 0;
         dummyDev.id = 0;
         SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
                               (xEvent *) &ev, 1);
diff-tree f08b6b2367705cb5b60e996e6328197430bf1919 (from 77e724585f6c53feb55475b94d8cfcb6acf1159b)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 22 12:30:02 2006 +0300

    kdrive: change DEVICE_TOUCHSCREEN to DEVICE_ABS_{CALIB,AREA}

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 449be9e..a2e2c0f 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -2316,11 +2316,9 @@ ChangeDeviceControl(register ClientPtr c
         /* FIXME do something more intelligent here */
         return BadMatch;
 
-    case DEVICE_TOUCHSCREEN:
-        if (!pDev->touchscreen)
-            return BadDevice;
-        else
-            return Success;
+    case DEVICE_ABS_CALIB:
+    case DEVICE_ABS_AREA:
+        return Success;
 
     case DEVICE_CORE:
         return Success;
diff-tree 77e724585f6c53feb55475b94d8cfcb6acf1159b (from e26a494f417c3c700636ee68892c3015b2e0f27a)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 20 00:44:46 2006 +0300

    minor formatting fixes

diff --git a/dix/getevents.c b/dix/getevents.c
index 42b9df9..c6a35ba 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1,6 +1,6 @@
 /*
  * Copyright © 2006 Nokia Corporation
- * 
+ *
  * Permission to use, copy, modify, distribute, and sell this software and
  * its documentation for any purpose is hereby granted without fee,
  * provided that the above copyright notice appear in all copies and that
@@ -121,7 +121,7 @@ GetKeyboardValuatorEvents(xEvent *events
 
     if (!events)
         return 0;
-    
+
     if (type != KeyPress && type != KeyRelease)
         return 0;
 
@@ -179,7 +179,6 @@ GetKeyboardValuatorEvents(xEvent *events
             events += numEvents;
         }
     }
-    
 
     ms = GetTimeInMillis();
 
diff --git a/mi/mieq.c b/mi/mieq.c
index 0ac68d6..63cd6e1 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -113,7 +113,7 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e
             ErrorF("mieqEnqueue: more than six valuator events; dropping.\n");
             return;
         }
-        if (oldtail == miEventQueue.head || 
+        if (oldtail == miEventQueue.head ||
             !(lastkbp->type == DeviceMotionNotify ||
               lastkbp->type == DeviceButtonPress ||
               lastkbp->type == DeviceButtonRelease) ||
diff-tree 948a97b97e93cee05a23f1f1ae699c5e181bc8ce (from 04554a3adcddc32de5fdb0b3122da0bcdd4c24a9)
Author: Drew Parsons <dparsons at debian.org>
Date:   Sat Oct 21 23:09:22 2006 +1000

    Minor typo fix to xorg.conf man page.

diff --git a/hw/xfree86/doc/man/xorg.conf.man.pre b/hw/xfree86/doc/man/xorg.conf.man.pre
index e94804c..abf3146 100644
--- a/hw/xfree86/doc/man/xorg.conf.man.pre
+++ b/hw/xfree86/doc/man/xorg.conf.man.pre
@@ -1081,7 +1081,7 @@ Include the set of modes listed in the
 .B Modes
 section called
 .IR modesection-id.
-This make all of the modes defined in that section available for use by
+This makes all of the modes defined in that section available for use by
 this monitor.
 .TP 7
 .BI "Mode  \*q" name \*q
diff-tree 04554a3adcddc32de5fdb0b3122da0bcdd4c24a9 (from edd5f1745461f995670969cb736d1569ca94643f)
Author: Drew Parsons <dparsons at debian.org>
Date:   Sat Oct 21 22:06:43 2006 +1000

    Minor typos in Xserver man page.

diff --git a/doc/Xserver.man.pre b/doc/Xserver.man.pre
index b9597f1..d65acde 100644
--- a/doc/Xserver.man.pre
+++ b/doc/Xserver.man.pre
@@ -181,7 +181,7 @@ prints a usage message.
 causes all remaining command line arguments to be ignored.
 .TP 8
 .B \-maxbigreqsize \fIsize\fP
-sets the maxmium big request to
+sets the maximum big request to
 .I size
 MB.
 .TP 8
@@ -449,7 +449,7 @@ the text after the /; it is used to dist
 
 <action> ::= a | i | e
 
-<string> ::= <dbl quoted string> | <single quoted string> | <unqouted string>
+<string> ::= <dbl quoted string> | <single quoted string> | <unquoted string>
 
 <dbl quoted string> ::= <space> " <not dqoute>* " <space>
 
diff-tree e26a494f417c3c700636ee68892c3015b2e0f27a (from parents)
Merge: 736b0d5078597abbda80444deef852879260af90 aeba855b07832354f59678e20cc29a085e42bd99
Author: Zephaniah E. Hull <warp at agamemnon.b5>
Date:   Sat Oct 21 04:26:14 2006 -0400

    Merge branch 'input-hotplug' of git+ssh://git.freedesktop.org/git/xorg/xserver

diff --cc Xi/chgdctl.c
index 32533c4,4b9c2b6..597955c
@@@ -104,9 -104,9 +104,10 @@@
      xChangeDeviceControlReply rep;
      AxisInfoPtr a;
      CARD32 *resolution;
 -    xDeviceTSCtl *ts;
 +    xDeviceAbsCalibCtl *calib;
 +    xDeviceAbsAreaCtl *area;
      xDeviceCoreCtl *c;
+     xDeviceEnableCtl *e;
  
      REQUEST(xChangeDeviceControlReq);
      REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq);
diff-tree 736b0d5078597abbda80444deef852879260af90 (from 1b1698af41b9038d9f9dbf521737d0baab5a2237)
Author: Zephaniah E. Hull <warp at agamemnon.b5>
Date:   Sat Oct 21 04:24:49 2006 -0400

    DEVICE_TOUCHSCREEN becomes DEVICE_ABS_CALIB.
    
    Update the DEVICE_ABS_CALIB stuff to include the new elements.
    
    New DEVICE_ABS_AREA support.
    
    dev->touchscreen becomes dev->absolute, with _CALIB and _AREA stuff in it.
    
    Update xfree86 to compile with this, kdrive needs an update too.

diff --git a/Xi/chgdctl.c b/Xi/chgdctl.c
index ebe0865..32533c4 100644
--- a/Xi/chgdctl.c
+++ b/Xi/chgdctl.c
@@ -104,7 +104,8 @@ ProcXChangeDeviceControl(ClientPtr clien
     xChangeDeviceControlReply rep;
     AxisInfoPtr a;
     CARD32 *resolution;
-    xDeviceTSCtl *ts;
+    xDeviceAbsCalibCtl *calib;
+    xDeviceAbsAreaCtl *area;
     xDeviceCoreCtl *c;
 
     REQUEST(xChangeDeviceControlReq);
@@ -170,25 +171,52 @@ ProcXChangeDeviceControl(ClientPtr clien
 	    return Success;
 	}
 	break;
-    case DEVICE_TOUCHSCREEN:
-        ts = (xDeviceTSCtl *)&stuff[1];
+    case DEVICE_ABS_CALIB:
+        calib = (xDeviceAbsCalibCtl *)&stuff[1];
 
-        if (ts->button_threshold < 0 || ts->button_threshold > 255) {
+        if (calib->button_threshold < 0 || calib->button_threshold > 255) {
             SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
                               BadValue);
             return Success;
         }
 
-        status = ChangeDeviceControl(client, dev, (xDeviceCtl *) ts);
+        status = ChangeDeviceControl(client, dev, (xDeviceCtl *) calib);
 
         if (status == Success) {
-            dev->touchscreen->min_x = ts->min_x;
-            dev->touchscreen->max_x = ts->max_x;
-            dev->touchscreen->min_y = ts->min_y;
-            dev->touchscreen->max_y = ts->max_y;
-            dev->touchscreen->button_threshold = ts->button_threshold;
-        } else if (status == DeviceBusy) {
-            rep.status = DeviceBusy;
+            dev->absolute->min_x = calib->min_x;
+            dev->absolute->max_x = calib->max_x;
+            dev->absolute->min_y = calib->min_y;
+            dev->absolute->max_y = calib->max_y;
+            dev->absolute->flip_x = calib->flip_x;
+            dev->absolute->flip_y = calib->flip_y;
+            dev->absolute->rotation = calib->rotation;
+            dev->absolute->button_threshold = calib->button_threshold;
+        } else if (status == DeviceBusy || status == BadValue) {
+            rep.status = status;
+            WriteReplyToClient(client, sizeof(xChangeDeviceControlReply),
+                               &rep);
+            return Success;
+        } else {
+            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
+                              BadMatch);
+            return Success;
+        }
+
+        break;
+    case DEVICE_ABS_AREA:
+        area = (xDeviceAbsAreaCtl *)&stuff[1];
+
+        status = ChangeDeviceControl(client, dev, (xDeviceCtl *) area);
+
+        if (status == Success) {
+            dev->absolute->offset_x = area->offset_x;
+            dev->absolute->offset_y = area->offset_y;
+            dev->absolute->width = area->width;
+            dev->absolute->height = area->height;
+            dev->absolute->screen = area->screen;
+            dev->absolute->following = area->following;
+        } else if (status == DeviceBusy || status == BadValue) {
+            rep.status = status;
             WriteReplyToClient(client, sizeof(xChangeDeviceControlReply),
                                &rep);
             return Success;
diff --git a/Xi/getdctl.c b/Xi/getdctl.c
index 66342b3..61798f2 100644
--- a/Xi/getdctl.c
+++ b/Xi/getdctl.c
@@ -124,14 +124,23 @@ ProcXGetDeviceControl(ClientPtr client)
 	total_length = sizeof(xDeviceResolutionState) +
 	    (3 * sizeof(int) * dev->valuator->numAxes);
 	break;
-    case DEVICE_TOUCHSCREEN:
-        if (!dev->touchscreen) {
+    case DEVICE_ABS_CALIB:
+        if (!dev->absolute) {
             SendErrorToClient(client, IReqCode, X_GetDeviceControl, 0,
                               BadMatch);
             return Success;
         }
 
-        total_length = sizeof(xDeviceTSCtl);
+        total_length = sizeof(xDeviceAbsCalibCtl);
+        break;
+    case DEVICE_ABS_AREA:
+        if (!dev->absolute) {
+            SendErrorToClient(client, IReqCode, X_GetDeviceControl, 0,
+                              BadMatch);
+            return Success;
+        }
+
+        total_length = sizeof(xDeviceAbsAreaCtl);
         break;
     case DEVICE_CORE:
         total_length = sizeof(xDeviceCoreCtl);
@@ -152,8 +161,11 @@ ProcXGetDeviceControl(ClientPtr client)
     case DEVICE_RESOLUTION:
 	CopySwapDeviceResolution(client, dev->valuator, buf, total_length);
 	break;
-    case DEVICE_TOUCHSCREEN:
-        CopySwapDeviceTouchscreen(client, dev->touchscreen, buf);
+    case DEVICE_ABS_CALIB:
+        CopySwapDeviceAbsCalib(client, dev->absolute, buf);
+        break;
+    case DEVICE_ABS_AREA:
+        CopySwapDeviceAbsArea(client, dev->absolute, buf);
         break;
     case DEVICE_CORE:
         CopySwapDeviceCore(client, dev, buf);
@@ -206,28 +218,61 @@ CopySwapDeviceResolution(ClientPtr clien
     }
 }
 
-void CopySwapDeviceTouchscreen (ClientPtr client, TouchscreenClassPtr dts,
+void CopySwapDeviceAbsCalib (ClientPtr client, AbsoluteClassPtr dts,
+                                char *buf)
+{
+    register char n;
+    xDeviceAbsCalibState *calib = (xDeviceAbsCalibState *) buf;
+
+    calib->control = DEVICE_ABS_CALIB;
+    calib->length = sizeof(calib);
+    calib->min_x = dts->min_x;
+    calib->max_x = dts->max_x;
+    calib->min_y = dts->min_y;
+    calib->max_y = dts->max_y;
+    calib->flip_x = dts->flip_x;
+    calib->flip_y = dts->flip_y;
+    calib->rotation = dts->rotation;
+    calib->button_threshold = dts->button_threshold;
+
+    if (client->swapped) {
+        swaps(&calib->control, n);
+        swaps(&calib->length, n);
+        swapl(&calib->min_x, n);
+        swapl(&calib->max_x, n);
+        swapl(&calib->min_y, n);
+        swapl(&calib->max_y, n);
+        swapl(&calib->flip_x, n);
+        swapl(&calib->flip_y, n);
+        swapl(&calib->rotation, n);
+        swapl(&calib->button_threshold, n);
+    }
+}
+
+void CopySwapDeviceAbsArea (ClientPtr client, AbsoluteClassPtr dts,
                                 char *buf)
 {
     register char n;
-    xDeviceTSState *ts = (xDeviceTSState *) buf;
+    xDeviceAbsAreaState *area = (xDeviceAbsAreaState *) buf;
 
-    ts->control = DEVICE_TOUCHSCREEN;
-    ts->length = sizeof(ts);
-    ts->min_x = dts->min_x;
-    ts->max_x = dts->max_x;
-    ts->min_y = dts->min_y;
-    ts->max_y = dts->max_y;
-    ts->button_threshold = dts->button_threshold;
+    area->control = DEVICE_ABS_AREA;
+    area->length = sizeof(area);
+    area->offset_x = dts->offset_x;
+    area->offset_y = dts->offset_y;
+    area->width = dts->width;
+    area->height = dts->height;
+    area->screen = dts->screen;
+    area->following = dts->following;
 
     if (client->swapped) {
-        swaps(&ts->control, n);
-        swaps(&ts->length, n);
-        swapl(&ts->min_x, n);
-        swapl(&ts->max_x, n);
-        swapl(&ts->min_y, n);
-        swapl(&ts->max_y, n);
-        swapl(&ts->button_threshold, n);
+        swaps(&area->control, n);
+        swaps(&area->length, n);
+        swapl(&area->offset_x, n);
+        swapl(&area->offset_y, n);
+        swapl(&area->width, n);
+        swapl(&area->height, n);
+        swapl(&area->screen, n);
+        swapl(&area->following, n);
     }
 }
 
diff --git a/Xi/getdctl.h b/Xi/getdctl.h
index 1417d1b..f6febb2 100644
--- a/Xi/getdctl.h
+++ b/Xi/getdctl.h
@@ -42,10 +42,13 @@ void CopySwapDeviceResolution(ClientPtr 
 			      int	/* length */
     );
 
-void CopySwapDeviceTouchscreen(ClientPtr /* client */ ,
-                               TouchscreenClassPtr /* ts */ ,
-                               char * /* buf */
-    );
+void CopySwapDeviceAbsCalib (ClientPtr client,
+                             AbsoluteClassPtr dts,
+                             char *buf);
+
+void CopySwapDeviceAbsArea (ClientPtr client,
+                            AbsoluteClassPtr dts,
+                            char *buf);
 
 void CopySwapDeviceCore(ClientPtr /* client */ ,
                         DeviceIntPtr /* dev */ ,
diff --git a/dix/devices.c b/dix/devices.c
index 0121eea..bf7592b 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -116,7 +116,7 @@ AddInputDevice(DeviceProc deviceProc, Bo
     dev->button = (ButtonClassPtr)NULL;
     dev->focus = (FocusClassPtr)NULL;
     dev->proximity = (ProximityClassPtr)NULL;
-    dev->touchscreen = (TouchscreenClassPtr)NULL;
+    dev->absolute = (AbsoluteClassPtr)NULL;
     dev->kbdfeed = (KbdFeedbackPtr)NULL;
     dev->ptrfeed = (PtrFeedbackPtr)NULL;
     dev->intfeed = (IntegerFeedbackPtr)NULL;
@@ -805,22 +805,31 @@ InitValuatorClassDeviceStruct(DeviceIntP
 }
 
 _X_EXPORT Bool
-InitTouchscreenClassDeviceStruct(DeviceIntPtr dev)
+InitAbsoluteClassDeviceStruct(DeviceIntPtr dev)
 {
-    register TouchscreenClassPtr tsc;
+    register AbsoluteClassPtr abs;
 
-    tsc = (TouchscreenClassPtr)xalloc(sizeof(TouchscreenClassRec));
-    if (!tsc)
+    abs = (AbsoluteClassPtr)xalloc(sizeof(AbsoluteClassRec));
+    if (!abs)
         return FALSE;
 
     /* we don't do anything sensible with these, but should */
-    tsc->min_x = -1;
-    tsc->min_y = -1;
-    tsc->max_x = -1;
-    tsc->max_y = -1;
+    abs->min_x = -1;
+    abs->min_y = -1;
+    abs->max_x = -1;
+    abs->max_y = -1;
+    abs->flip_x = 0;
+    abs->flip_y = 0;
+    abs->rotation = 0;
+    abs->button_threshold = 0;
+
+    abs->offset_x = 0;
+    abs->offset_y = 0;
+    abs->width = -1;
+    abs->height = -1;
+    abs->following = 0;
 
-    tsc->button_threshold = 0;
-    dev->touchscreen = tsc;
+    dev->absolute = abs;
 
     return TRUE;
 }
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 411dedd..8a5d5b3 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -529,7 +529,8 @@ ChangeDeviceControl (ClientPtr client, D
       switch (control->control) {
       case DEVICE_CORE:
       case DEVICE_RESOLUTION:
-      case DEVICE_TOUCHSCREEN:
+      case DEVICE_ABS_CALIB:
+      case DEVICE_ABS_AREA:
         return Success;
       default:
         return BadMatch;
diff --git a/include/input.h b/include/input.h
index 3e3d16d..79e1de2 100644
--- a/include/input.h
+++ b/include/input.h
@@ -236,7 +236,7 @@ extern Bool InitValuatorClassDeviceStruc
     int /*numMotionEvents*/,
     int /*mode*/);
 
-extern Bool InitTouchscreenClassDeviceStruct(
+extern Bool InitAbsoluteClassDeviceStruct(
     DeviceIntPtr /*device*/);
 
 extern Bool InitFocusClassDeviceStruct(
diff --git a/include/inputstr.h b/include/inputstr.h
index e12b641..1aa16d4 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -184,13 +184,25 @@ typedef struct _ProximityClassRec {
     char	pad;
 } ProximityClassRec, *ProximityClassPtr;
 
-typedef struct _TouchscreenClassRec {
+typedef struct _AbsoluteClassRec {
+    /* Calibration. */
     int         min_x;
     int         max_x;
     int         min_y;
     int         max_y;
+    int         flip_x;
+    int         flip_y;
+    int		rotation;
     int         button_threshold;
-} TouchscreenClassRec, *TouchscreenClassPtr;
+
+    /* Area. */
+    int         offset_x;
+    int         offset_y;
+    int         width;
+    int         height;
+    int         screen;
+    XID		following;
+} AbsoluteClassRec, *AbsoluteClassPtr;
 
 typedef struct _KbdFeedbackClassRec *KbdFeedbackPtr;
 typedef struct _PtrFeedbackClassRec *PtrFeedbackPtr;
@@ -292,7 +304,7 @@ typedef struct _DeviceIntRec {
     ButtonClassPtr	button;
     FocusClassPtr	focus;
     ProximityClassPtr	proximity;
-    TouchscreenClassPtr touchscreen;
+    AbsoluteClassPtr    absolute;
     KbdFeedbackPtr	kbdfeed;
     PtrFeedbackPtr	ptrfeed;
     IntegerFeedbackPtr	intfeed;
diff-tree edd5f1745461f995670969cb736d1569ca94643f (from e1dd1904c6c7ce33f347d822272831d54a6497c8)
Author: Carl Switzky <Carl.Switzky at Sun.COM>
Date:   Thu Oct 19 17:30:54 2006 -0700

    Add ast driver/device info to Xorg server & config utilities

diff --git a/hw/xfree86/common/xf86PciInfo.h b/hw/xfree86/common/xf86PciInfo.h
index b8ba73f..0630cfa 100644
--- a/hw/xfree86/common/xf86PciInfo.h
+++ b/hw/xfree86/common/xf86PciInfo.h
@@ -92,6 +92,7 @@
 #define PCI_VENDOR_TRITECH		0x1292
 #define PCI_VENDOR_NVIDIA_SGS		0x12D2
 #define PCI_VENDOR_VMWARE		0x15AD
+#define PCI_VENDOR_AST			0x1A03
 #define PCI_VENDOR_3DLABS		0x3D3D
 #define PCI_VENDOR_AVANCE_2		0x4005
 #define PCI_VENDOR_HERCULES		0x4843
@@ -358,6 +359,9 @@
 #define PCI_CHIP_RS350_7834             0x7834
 #define PCI_CHIP_RS350_7835             0x7835
 
+/* ASPEED Technology (AST) */
+#define PCI_CHIP_AST2000		0x2000
+
 /* Avance Logic */
 #define PCI_CHIP_ALG2064		0x2064
 #define PCI_CHIP_ALG2301		0x2301
diff --git a/hw/xfree86/utils/xorgcfg/text-mode.c b/hw/xfree86/utils/xorgcfg/text-mode.c
index 10f4b69..0fc5770 100644
--- a/hw/xfree86/utils/xorgcfg/text-mode.c
+++ b/hw/xfree86/utils/xorgcfg/text-mode.c
@@ -1128,6 +1128,7 @@ CardConfig(void)
     static char *xdrivers[] = {
 	"apm",
 	"ark",
+	"ast",
 	"ati",
 	"r128",
 	"radeon",
diff --git a/hw/xfree86/utils/xorgconfig/Cards b/hw/xfree86/utils/xorgconfig/Cards
index bf30eab..b95928c 100644
--- a/hw/xfree86/utils/xorgconfig/Cards
+++ b/hw/xfree86/utils/xorgconfig/Cards
@@ -51,6 +51,11 @@ NAME ** Ark Logic (generic)             
 SERVER SVGA
 DRIVER ark
 
+NAME ** ASPEED Technology (generic)        [ast]
+#CHIPSET ast
+SERVER SVGA
+DRIVER ast
+
 NAME ** ATI (generic)                      [ati]
 #CHIPSET ati
 SERVER SVGA
diff-tree aeba855b07832354f59678e20cc29a085e42bd99 (from a8d3dad9d9f2b9053843e655abe463a68ba8dcb7)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 20 00:30:28 2006 +0300

    move keymap copy to event processing, from enqueuing
    
    Move the keymap copying to event processing time (in
    ProcessInputEvents), instead of being at event enqueuing time.
    Break SetCore{Pointer,Keyboard} out into separate functions.
    Change mieqEnqueue to take a device pointer, that asks for the
    _original_ device associated with this event.

diff --git a/dix/getevents.c b/dix/getevents.c
index 4f96080..42b9df9 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -481,19 +481,19 @@ GetPointerEvents(xEvent *events, DeviceI
             xv->deviceid = kbp->deviceid;
             switch (final_valuator - i) {
             case 6:
-                xv->valuator5 = valuators[i+5];
+                xv->valuator5 = valuators[i + 5];
             case 5:
-                xv->valuator4 = valuators[i+4];
+                xv->valuator4 = valuators[i + 4];
             case 4:
-                xv->valuator3 = valuators[i+3];
+                xv->valuator3 = valuators[i + 3];
             case 3:
-                xv->valuator2 = valuators[i+2];
+                xv->valuator2 = valuators[i + 2];
             case 2:
                 /* x and y may have been accelerated. */
                 if (i == 0)
                     xv->valuator1 = kbp->root_y;
                 else
-                    xv->valuator1 = valuators[i+1];
+                    xv->valuator1 = valuators[i + 1];
             case 1:
                 /* x and y may have been accelerated. */
                 if (i == 0)
@@ -520,11 +520,47 @@ GetPointerEvents(xEvent *events, DeviceI
         else {
             events->u.u.detail = 0;
         }
-
-        if (inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr !=
-            pDev)
-            inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
     }
 
     return num_events;
 }
+
+void SwitchCoreKeyboard(DeviceIntPtr pDev)
+{
+    KeyClassPtr ckeyc = inputInfo.keyboard->key;
+
+    if (inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr != pDev) {
+        memcpy(ckeyc->modifierMap, pDev->key->modifierMap, MAP_LENGTH);
+        if (ckeyc->modifierKeyMap)
+            xfree(ckeyc->modifierKeyMap);
+        ckeyc->modifierKeyMap = xalloc(8 * pDev->key->maxKeysPerModifier);
+        memcpy(ckeyc->modifierKeyMap, pDev->key->modifierKeyMap,
+                (8 * pDev->key->maxKeysPerModifier));
+
+        ckeyc->maxKeysPerModifier = pDev->key->maxKeysPerModifier;
+        ckeyc->curKeySyms.minKeyCode = pDev->key->curKeySyms.minKeyCode;
+        ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode;
+        SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms);
+
+#ifdef XKB
+        if (!noXkbExtension && pDev->key->xkbInfo && pDev->key->xkbInfo->desc) {
+            if (!XkbCopyKeymap(pDev->key->xkbInfo->desc, ckeyc->xkbInfo->desc,
+                               True))
+                FatalError("Couldn't pivot keymap from device to core!\n");
+        }
+#endif
+
+        SendMappingNotify(MappingKeyboard, ckeyc->curKeySyms.minKeyCode,
+                          (ckeyc->curKeySyms.maxKeyCode -
+                           ckeyc->curKeySyms.minKeyCode),
+                          serverClient);
+        inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
+    }
+}
+
+/* Currently a no-op. */
+void SwitchCorePointer(DeviceIntPtr pDev)
+{
+    if (inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr != pDev)
+        inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
+}
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 8dd3728..449be9e 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -1656,10 +1656,10 @@ char *kdActionNames[] = {
 #endif
 
 static void
-KdQueueEvent (xEvent *ev)
+KdQueueEvent (DeviceIntPtr pDev, xEvent *ev)
 {
     KdAssertSigioBlocked ("KdQueueEvent");
-    mieqEnqueue (ev);
+    mieqEnqueue (pDev, ev);
 }
 
 /* We return true if we're stealing the event. */
@@ -1862,7 +1862,7 @@ KdReleaseAllKeys (void)
                 KdHandleKeyboardEvent(ki, KeyRelease, key);
                 nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, KeyRelease, key);
                 for (i = 0; i < nEvents; i++)
-                    KdQueueEvent (kdEvents + i);
+                    KdQueueEvent (ki->dixdev, kdEvents + i);
             }
         }
     }
@@ -1934,7 +1934,7 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   
         ErrorF("KdEnqueueKeyboardEvent: got %d events from GKE\n", nEvents);
 #endif
         for (i = 0; i < nEvents; i++)
-            KdQueueEvent(kdEvents + i);
+            KdQueueEvent(ki->dixdev, kdEvents + i);
     }
     else {
         ErrorF("driver %s wanted to post scancode %d outside of [%d, %d]!\n",
@@ -2052,7 +2052,7 @@ _KdEnqueuePointerEvent (KdPointerInfo *p
     nEvents = GetPointerEvents(kdEvents, pi->dixdev, type, b, absrel, 0, 3,
                                valuators);
     for (i = 0; i < nEvents; i++)
-        KdQueueEvent(kdEvents + i);
+        KdQueueEvent(pi->dixdev, kdEvents + i);
 }
 
 void
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index cb77839..204457f 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -909,22 +909,6 @@ DGAVTSwitch(void)
 Bool
 DGAStealKeyEvent(int index, xEvent *e)
 {
-   DGAScreenPtr pScreenPriv;
-    dgaEvent	de;
-
-   if(DGAScreenIndex < 0) /* no DGA */
-	return FALSE;
-
-   pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
-
-   if(!pScreenPriv || !pScreenPriv->grabKeyboard) /* no direct mode */
-	return FALSE;
-
-    de.u.u.type = e->u.u.type + *XDGAEventBase;
-    de.u.u.detail = e->u.u.detail;
-    de.u.event.time = e->u.keyButtonPointer.time;
-    mieqEnqueue ((xEvent *) &de);
-   return TRUE;
 }
 
 static int  DGAMouseX, DGAMouseY;
@@ -932,36 +916,6 @@ static int  DGAMouseX, DGAMouseY;
 Bool
 DGAStealMouseEvent(int index, xEvent *e, int dx, int dy)
 {
-   DGAScreenPtr pScreenPriv;
-    dgaEvent	de;
-
-   if(DGAScreenIndex < 0) /* no DGA */
-	return FALSE;
-
-   pScreenPriv = DGA_GET_SCREEN_PRIV(screenInfo.screens[index]);
-
-   if(!pScreenPriv || !pScreenPriv->grabMouse) /* no direct mode */
-	return FALSE;
-    
-    DGAMouseX += dx;
-    if (DGAMouseX < 0)
-	DGAMouseX = 0;
-    else if (DGAMouseX > screenInfo.screens[index]->width)
-	DGAMouseX = screenInfo.screens[index]->width;
-    DGAMouseY += dy;
-    if (DGAMouseY < 0)
-	DGAMouseY = 0;
-    else if (DGAMouseY > screenInfo.screens[index]->height)
-	DGAMouseY = screenInfo.screens[index]->height;
-    de.u.u.type = e->u.u.type + *XDGAEventBase;
-    de.u.u.detail = e->u.u.detail;
-    de.u.event.time = e->u.keyButtonPointer.time;
-    de.u.event.dx = dx;
-    de.u.event.dy = dy;
-    de.u.event.pad1 = DGAMouseX;
-    de.u.event.pad2 = DGAMouseY;
-    mieqEnqueue ((xEvent *) &de);
-    return TRUE;
 }
 
 Bool
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index db259b3..3df201a 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -104,19 +104,12 @@ extern Bool noXkbExtension;
 #define XE_POINTER  1
 #define XE_KEYBOARD 2
 
-#define __EqEnqueue(ev) mieqEnqueue(ev)
-
-#define EqEnqueue(ev) { \
+#define EqEnqueue(pDev, ev) { \
     int __sigstate = xf86BlockSIGIO (); \
-    __EqEnqueue (ev); \
+    mieqEnqueue (pDev, ev); \
     xf86UnblockSIGIO(__sigstate); \
 }
 
-#define ENQUEUE(ev, code, direction, dev_type) \
-  (ev)->u.u.detail = (code); \
-  (ev)->u.u.type   = (direction); \
-  EqEnqueue((ev))
-
 /*
  * The first of many hacks to get VT switching to work under
  * Solaris 2.1 for x86. The basic problem is that Solaris is supposed
@@ -839,7 +832,7 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
                 else {
                     nevents = GetKeyboardEvents(xf86Events, pDev, KeyRelease, i);
                     for (j = 0; j < nevents; j++)
-                        mieqEnqueue(xf86Events + i);
+                        EqEnqueue(pDev, xf86Events + i);
                 }
                 break;
             }
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 411dedd..97c038f 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -656,20 +656,7 @@ xf86PostMotionEvent(DeviceIntPtr	device,
                                valuators);
 
     for (i = 0; i < nevents; i++)
-        mieqEnqueue(xf86Events + i);
-    
-#if 0
-    if (HAS_MOTION_HISTORY(local)) {
-      buff = ((char *)local->motion_history +
-              (sizeof(INT32) * local->dev->valuator->numAxes + sizeof(Time)) * local->last);
-    }
-
-    if (HAS_MOTION_HISTORY(local)) {
-        local->last = (local->last + 1) % device->valuator->numMotionEvents;
-        if (local->last == local->first)
-            local->first = (local->first + 1) % device->valuator->numMotionEvents;
-    }
-#endif
+        mieqEnqueue(device, xf86Events + i);
 }
 
 _X_EXPORT void
@@ -795,7 +782,7 @@ xf86PostButtonEvent(DeviceIntPtr	device,
                                first_valuator, num_valuators, valuators);
 
     for (i = 0; i < nevents; i++)
-        mieqEnqueue(xf86Events + i);
+        mieqEnqueue(device, xf86Events + i);
 }
 
 _X_EXPORT void
@@ -839,7 +826,7 @@ xf86PostKeyEvent(DeviceIntPtr	device,
     }
 
     for (i = 0; i < nevents; i++)
-        mieqEnqueue(xf86Events + i);
+        mieqEnqueue(device, xf86Events + i);
 }
 
 _X_EXPORT void
@@ -858,7 +845,7 @@ xf86PostKeyboardEvent(DeviceIntPtr      
                                 is_down ? KeyPress : KeyRelease, key_code);
 
     for (i = 0; i < nevents; i++)
-        mieqEnqueue(xf86Events + i);
+        mieqEnqueue(device, xf86Events + i);
 }
 
 /* 
diff --git a/include/input.h b/include/input.h
index 3e3d16d..a9eeb3f 100644
--- a/include/input.h
+++ b/include/input.h
@@ -406,6 +406,9 @@ extern int GetKeyboardValuatorEvents(
     int num_valuator,
     int *valuators);
 
+extern void SwitchCoreKeyboard(DeviceIntPtr pDev);
+extern void SwitchCorePointer(DeviceIntPtr pDev);
+
 extern DeviceIntPtr LookupDeviceIntRec(
     CARD8 deviceid);
 
diff --git a/mi/mi.h b/mi/mi.h
index 89d460f..8d9d120 100644
--- a/mi/mi.h
+++ b/mi/mi.h
@@ -173,6 +173,7 @@ extern Bool mieqInit(
 );
 
 extern void mieqEnqueue(
+    DeviceIntPtr /*pDev*/,
     xEventPtr /*e*/
 );
 
diff --git a/mi/mieq.c b/mi/mieq.c
index 16e638c..0ac68d6 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -73,14 +73,14 @@ typedef struct _EventQueue {
 static EventQueueRec miEventQueue;
 
 Bool
-mieqInit ()
+mieqInit()
 {
     miEventQueue.head = miEventQueue.tail = 0;
     miEventQueue.lastEventTime = GetTimeInMillis ();
     miEventQueue.lastMotion = FALSE;
     miEventQueue.pEnqueueScreen = screenInfo.screens[0];
     miEventQueue.pDequeueScreen = miEventQueue.pEnqueueScreen;
-    SetInputCheck (&miEventQueue.head, &miEventQueue.tail);
+    SetInputCheck(&miEventQueue.head, &miEventQueue.tail);
     return TRUE;
 }
 
@@ -92,57 +92,39 @@ mieqInit ()
  */
 
 void
-mieqEnqueue (xEvent *e)
+mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
 {
     HWEventQueueType       oldtail = miEventQueue.tail, newtail;
     int                    isMotion = 0;
-    DeviceIntPtr           pDev = NULL;
-    deviceKeyButtonPointer *kbp = (deviceKeyButtonPointer *) e;
     deviceValuator         *v = (deviceValuator *) e;
     EventPtr               laste = &miEventQueue.events[oldtail - 1];
     deviceKeyButtonPointer *lastkbp = (deviceKeyButtonPointer *)
                                       &laste->event[0];
 
-    if (e->u.u.type == MotionNotify) {
-        pDev = inputInfo.pointer;
-        isMotion = inputInfo.pointer->id & DEVICE_BITS;
-    }
-    else if (e->u.u.type == KeyPress || e->u.u.type == KeyRelease) {
-        pDev = inputInfo.keyboard;
-    }
-    else if (e->u.u.type == ButtonPress || e->u.u.type == ButtonRelease) {
-        pDev = inputInfo.pointer;
-    }
-    else {
-        pDev = LookupDeviceIntRec(kbp->deviceid & DEVICE_BITS);
-
-        /* We silently steal valuator events: just tack them on to the last
-         * motion event they need to be attached to.  Sigh. */
-        if (e->u.u.type == DeviceValuator) {
-            if (laste->nevents > 6) {
-                ErrorF("mieqEnqueue: more than six valuator events; dropping.\n");
-                return;
-            }
-            if (oldtail == miEventQueue.head || 
-                !(lastkbp->type == DeviceMotionNotify ||
-                  lastkbp->type == DeviceButtonPress ||
-                  lastkbp->type == DeviceButtonRelease) ||
-                ((lastkbp->deviceid & DEVICE_BITS) !=
-                 (v->deviceid & DEVICE_BITS))) {
-                ErrorF("mieqEnequeue: out-of-order valuator event; dropping.\n");
-                return;
-            }
-            memcpy(&(laste->event[laste->nevents++]), e, sizeof(xEvent));
+    if (e->u.u.type == MotionNotify)
+        isMotion = inputInfo.pointer->id;
+    else if (e->u.u.type == DeviceMotionNotify)
+        isMotion = pDev->id;
+
+    /* We silently steal valuator events: just tack them on to the last
+     * motion event they need to be attached to.  Sigh. */
+    if (e->u.u.type == DeviceValuator) {
+        if (laste->nevents > 6) {
+            ErrorF("mieqEnqueue: more than six valuator events; dropping.\n");
             return;
         }
-        else if (e->u.u.type == DeviceMotionNotify) {
-            isMotion = pDev->id & DEVICE_BITS;
+        if (oldtail == miEventQueue.head || 
+            !(lastkbp->type == DeviceMotionNotify ||
+              lastkbp->type == DeviceButtonPress ||
+              lastkbp->type == DeviceButtonRelease) ||
+            (lastkbp->deviceid != v->deviceid)) {
+            ErrorF("mieqEnequeue: out-of-order valuator event; dropping.\n");
+            return;
         }
+        memcpy(&(laste->event[laste->nevents++]), e, sizeof(xEvent));
+        return;
     }
 
-    if (!pDev)
-        FatalError("Couldn't find device for event!\n");
-
     if (isMotion && isMotion == miEventQueue.lastMotion &&
         oldtail != miEventQueue.head) {
 	if (oldtail == 0)
@@ -164,10 +146,8 @@ mieqEnqueue (xEvent *e)
     memcpy(&(miEventQueue.events[oldtail].event[0]), e, sizeof(xEvent));
     miEventQueue.events[oldtail].nevents = 1;
 
-    /*
-     * Make sure that event times don't go backwards - this
-     * is "unnecessary", but very useful
-     */
+    /* Make sure that event times don't go backwards - this
+     * is "unnecessary", but very useful. */
     if (e->u.keyButtonPointer.time < miEventQueue.lastEventTime &&
 	miEventQueue.lastEventTime - e->u.keyButtonPointer.time < 10000)
 	miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time =
@@ -182,49 +162,59 @@ mieqEnqueue (xEvent *e)
 }
 
 void
-mieqSwitchScreen (ScreenPtr pScreen, Bool fromDIX)
+mieqSwitchScreen(ScreenPtr pScreen, Bool fromDIX)
 {
     miEventQueue.pEnqueueScreen = pScreen;
     if (fromDIX)
 	miEventQueue.pDequeueScreen = pScreen;
 }
 
-/*
- * Call this from ProcessInputEvents()
- */
-
-void mieqProcessInputEvents ()
+/* Call this from ProcessInputEvents(). */
+void
+mieqProcessInputEvents()
 {
-    EventRec	*e;
-    int		x, y;
+    EventRec *e = NULL;
+    int x = 0, y = 0;
+    DeviceIntPtr dev = NULL;
+
+    while (miEventQueue.head != miEventQueue.tail) {
+        if (screenIsSaved == SCREEN_SAVER_ON)
+            SaveScreens (SCREEN_SAVER_OFF, ScreenSaverReset);
+
+        e = &miEventQueue.events[miEventQueue.head];
+        /* Assumption - screen switching can only occur on motion events. */
+        if (e->pScreen != miEventQueue.pDequeueScreen) {
+            miEventQueue.pDequeueScreen = e->pScreen;
+            x = e->event[0].u.keyButtonPointer.rootX;
+            y = e->event[0].u.keyButtonPointer.rootY;
+            if (miEventQueue.head == QUEUE_SIZE - 1)
+                miEventQueue.head = 0;
+            else
+                ++miEventQueue.head;
+            NewCurrentScreen (miEventQueue.pDequeueScreen, x, y);
+        }
+        else {
+            if (miEventQueue.head == QUEUE_SIZE - 1)
+                miEventQueue.head = 0;
+            else
+                ++miEventQueue.head;
+
+            if (e->event[0].u.u.type == KeyPress ||
+                e->event[0].u.u.type == KeyRelease) {
+                SwitchCoreKeyboard(e->pDev);
+                dev = inputInfo.keyboard;
+            }
+            else if (e->event[0].u.u.type == MotionNotify ||
+                     e->event[0].u.u.type == ButtonPress ||
+                     e->event[0].u.u.type == ButtonRelease) {
+                SwitchCorePointer(e->pDev);
+                dev = inputInfo.pointer;
+            }
+            else {
+                dev = e->pDev;
+            }
 
-    while (miEventQueue.head != miEventQueue.tail)
-    {
-	if (screenIsSaved == SCREEN_SAVER_ON)
-	    SaveScreens (SCREEN_SAVER_OFF, ScreenSaverReset);
-
-	e = &miEventQueue.events[miEventQueue.head];
-	/*
-	 * Assumption - screen switching can only occur on motion events
-	 */
-	if (e->pScreen != miEventQueue.pDequeueScreen)
-	{
-	    miEventQueue.pDequeueScreen = e->pScreen;
-	    x = e->event[0].u.keyButtonPointer.rootX;
-	    y = e->event[0].u.keyButtonPointer.rootY;
-	    if (miEventQueue.head == QUEUE_SIZE - 1)
-	    	miEventQueue.head = 0;
-	    else
-	    	++miEventQueue.head;
-	    NewCurrentScreen (miEventQueue.pDequeueScreen, x, y);
-	}
-	else
-	{
-	    if (miEventQueue.head == QUEUE_SIZE - 1)
-	    	miEventQueue.head = 0;
-	    else
-	    	++miEventQueue.head;
-            (*e->pDev->public.processInputProc)(e->event, e->pDev, e->nevents);
-	}
+            dev->public.processInputProc(e->event, dev, e->nevents);
+        }
     }
 }
diff-tree a8d3dad9d9f2b9053843e655abe463a68ba8dcb7 (from b0780312d80ea4af0136227f90fdd7ada3db71c5)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 20 00:28:40 2006 +0300

    xi: add DEVICE_ENABLE control
    
    Add DEVICE_ENABLE control, which allows runtime enabling and disabling
    of specific devices.

diff --git a/Xi/chgdctl.c b/Xi/chgdctl.c
index ebe0865..4b9c2b6 100644
--- a/Xi/chgdctl.c
+++ b/Xi/chgdctl.c
@@ -106,6 +106,7 @@ ProcXChangeDeviceControl(ClientPtr clien
     CARD32 *resolution;
     xDeviceTSCtl *ts;
     xDeviceCoreCtl *c;
+    xDeviceEnableCtl *e;
 
     REQUEST(xChangeDeviceControlReq);
     REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq);
@@ -218,6 +219,28 @@ ProcXChangeDeviceControl(ClientPtr clien
         }
 
         break;
+    case DEVICE_ENABLE:
+        e = (xDeviceEnableCtl *)&stuff[1];
+
+        status = ChangeDeviceControl(client, dev, (xDeviceCtl *) e);
+
+        if (status == Success) {
+            if (e->enable)
+                EnableDevice(dev);
+            else
+                DisableDevice(dev);
+        } else if (status == DeviceBusy) {
+            rep.status = DeviceBusy;
+            WriteReplyToClient(client, sizeof(xChangeDeviceControlReply),
+                               &rep);
+            return Success;
+        } else {
+            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
+                              BadMatch);
+            return Success;
+        }
+
+        break;
     default:
 	SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0, BadValue);
 	return Success;
diff --git a/Xi/getdctl.c b/Xi/getdctl.c
index 66342b3..2ae6ef3 100644
--- a/Xi/getdctl.c
+++ b/Xi/getdctl.c
@@ -136,6 +136,9 @@ ProcXGetDeviceControl(ClientPtr client)
     case DEVICE_CORE:
         total_length = sizeof(xDeviceCoreCtl);
         break;
+    case DEVICE_ENABLE:
+        total_length = sizeof(xDeviceEnableCtl);
+        break;
     default:
 	SendErrorToClient(client, IReqCode, X_GetDeviceControl, 0, BadValue);
 	return Success;
@@ -157,6 +160,10 @@ ProcXGetDeviceControl(ClientPtr client)
         break;
     case DEVICE_CORE:
         CopySwapDeviceCore(client, dev, buf);
+        break;
+    case DEVICE_ENABLE:
+        CopySwapDeviceEnable(client, dev, buf);
+        break;
     default:
 	break;
     }
@@ -239,6 +246,7 @@ void CopySwapDeviceCore (ClientPtr clien
     c->control = DEVICE_CORE;
     c->length = sizeof(c);
     c->status = dev->coreEvents;
+    c->iscore = (dev == inputInfo.keyboard || dev == inputInfo.pointer);
 
     if (client->swapped) {
         swaps(&c->control, n);
@@ -247,6 +255,22 @@ void CopySwapDeviceCore (ClientPtr clien
     }
 }
 
+void CopySwapDeviceEnable (ClientPtr client, DeviceIntPtr dev, char *buf)
+{
+    register char n;
+    xDeviceEnableState *e = (xDeviceEnableState *) buf;
+
+    e->control = DEVICE_ENABLE;
+    e->length = sizeof(e);
+    e->enable = dev->enabled;
+
+    if (client->swapped) {
+        swaps(&e->control, n);
+        swaps(&e->length, n);
+        swaps(&e->enable, n);
+    }
+}
+
 
 /***********************************************************************
  *
diff --git a/Xi/getdctl.h b/Xi/getdctl.h
index 1417d1b..1331a32 100644
--- a/Xi/getdctl.h
+++ b/Xi/getdctl.h
@@ -52,6 +52,11 @@ void CopySwapDeviceCore(ClientPtr /* cli
                         char * /* buf */
     );
 
+void CopySwapDeviceEnable(ClientPtr /* client */ ,
+                          DeviceIntPtr /* dev */ ,
+                          char * /* buf */
+    );
+
 void SRepXGetDeviceControl(ClientPtr /* client */ ,
 			   int /* size */ ,
 			   xGetDeviceControlReply *	/* rep */
diff --git a/dix/devices.c b/dix/devices.c
index 0121eea..7b4be0e 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -130,6 +130,8 @@ AddInputDevice(DeviceProc deviceProc, Bo
     dev->devPrivates = NULL;
     dev->unwrapProc = NULL;
     dev->coreEvents = TRUE;
+    dev->inited = FALSE;
+    dev->enabled = FALSE;
 
     for (prev = &inputInfo.off_devices; *prev; prev = &(*prev)->next)
         ;
@@ -154,6 +156,7 @@ EnableDevice(register DeviceIntPtr dev)
         ErrorF("couldn't enable device %d\n", dev->id);
 	return FALSE;
     }
+    dev->enabled = TRUE;
     *prev = dev->next;
 
     for (prev = &inputInfo.devices; *prev; prev = &(*prev)->next)
@@ -176,6 +179,7 @@ DisableDevice(register DeviceIntPtr dev)
     if (*prev != dev)
 	return FALSE;
     (void)(*dev->deviceProc)(dev, DEVICE_OFF);
+    dev->enabled = FALSE;
     *prev = dev->next;
     dev->next = inputInfo.off_devices;
     inputInfo.off_devices = dev;
diff --git a/include/inputstr.h b/include/inputstr.h
index e12b641..6476321 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -265,6 +265,7 @@ typedef struct _DeviceIntRec {
 					  used to initialize, turn on, or
 					  turn off the device */
     Bool	inited;			/* TRUE if INIT returns Success */
+    Bool        enabled;                /* TRUE if ON returns Success */
     Bool        coreEvents;             /* TRUE if device also sends core */
     GrabPtr	grab;			/* the grabber - used by DIX */
     struct {
diff-tree b0780312d80ea4af0136227f90fdd7ada3db71c5 (from c5dc997baf57ffa08025efadbbaf761296ce4bc4)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Oct 19 13:51:53 2006 -0700

    Pre-release message should tell users to check git, not CVS, for updates

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index a49bd54..33351f2 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -1651,8 +1651,8 @@ xf86PrintBanner()
     "Bugs may be filed in the bugzilla at http://bugs.freedesktop.org/.\n"
     "Select the \"xorg\" product for bugs you find in this release.\n"
     "Before reporting bugs in pre-release versions please check the\n"
-    "latest version in the X.Org Foundation CVS repository.\n"
-    "See http://wiki.x.org/wiki/CvsPage for CVS access instructions.\n");
+    "latest version in the X.Org Foundation git repository.\n"
+    "See http://wiki.x.org/wiki/GitPage for git access instructions.\n");
 #endif
   ErrorF("\nX Window System Version %d.%d.%d",
 	 XORG_VERSION_MAJOR,
diff-tree c5dc997baf57ffa08025efadbbaf761296ce4bc4 (from d029c8f1b72019446a5c873f55ffa43504b03dfb)
Author: Joshua Baergen <joshuabaergen at gentoo.org>
Date:   Thu Oct 19 11:14:26 2006 -0700

    Create xorg.conf.example (Gentoo bug #138623).

diff --git a/configure.ac b/configure.ac
index 2467e79..9700d61 100644
--- a/configure.ac
+++ b/configure.ac
@@ -836,6 +836,7 @@ VENDOR_MAN_VERSION="Version ${VENDOR_VER
 
 AC_DEFINE_DIR(COMPILEDDEFAULTFONTPATH, FONTPATH, [Default font path])
 AC_DEFINE_DIR(RGB_DB, RGBPATH, [Default RGB path])
+AC_DEFINE_DIR(BASE_FONT_PATH, FONTDIR, [Default base font path])
 AC_DEFINE_DIR(DRI_DRIVER_PATH, DRI_DRIVER_PATH, [Default DRI driver path])
 AC_DEFINE_UNQUOTED(XVENDORNAME, ["$VENDOR_STRING"], [Vendor name])
 AC_DEFINE_UNQUOTED(XVENDORNAMESHORT, ["$VENDOR_STRING_SHORT"], [Short vendor name])
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 5cce11d..79d2ec5 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/cpprules.in
+
 if DRI
 DRI_SUBDIR = dri
 endif
@@ -82,7 +84,23 @@ endif
 optionsdir = $(libdir)/X11
 dist_options_DATA = Options
 
+BUILT_SOURCES = xorg.conf.example
+CLEAN = xorg.conf.example xorg.conf.example.pre
 EXTRA_DIST = xorgconf.cpp
 
+CPP_FILES_FLAGS = \
+	-DRGBPATH=\"$(RGB_DB)\" \
+	-DLOCALFONTPATH="\"$(BASE_FONT_PATH)/local\"" \
+	-DMISCFONTPATH="\"$(BASE_FONT_PATH)/misc\"" \
+	-DT1FONTPATH="\"$(BASE_FONT_PATH)/Type1\"" \
+	-DTRUETYPEFONTPATH="\"$(BASE_FONT_PATH)/TTF\"" \
+	-DCIDFONTPATH="\"$(BASE_FONT_PATH)/CID\"" \
+	-DDPI75FONTPATH="\"$(BASE_FONT_PATH)/75dpi\"" \
+	-DDPI100FONTPATH="\"$(BASE_FONT_PATH)/100dpi\"" \
+	-DMODULEPATH=\"$(DEFAULT_MODULE_PATH)\"
+
 relink:
 	rm -f Xorg && $(MAKE) Xorg
+
+xorg.conf.example.pre: xorgconf.cpp
+	cp $< $@
diff --git a/hw/xfree86/xorgconf.cpp b/hw/xfree86/xorgconf.cpp
index df6704f..71abe13 100644
--- a/hw/xfree86/xorgconf.cpp
+++ b/hw/xfree86/xorgconf.cpp
@@ -54,12 +54,9 @@ XCOMM command (or a combination of both 
 
     FontPath	LOCALFONTPATH
     FontPath	MISCFONTPATH
-    FontPath	DPI75USFONTPATH
-    FontPath	DPI100USFONTPATH
     FontPath	T1FONTPATH
-    FontPath    TRUETYPEFONTPATH
+    FontPath	TRUETYPEFONTPATH
     FontPath	CIDFONTPATH
-    FontPath	SPFONTPATH
     FontPath	DPI75FONTPATH
     FontPath	DPI100FONTPATH
 
diff-tree d029c8f1b72019446a5c873f55ffa43504b03dfb (from a8a0abdbea0573c861a5af9d58f3ce66790455ca)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Wed Oct 18 18:11:06 2006 -0700

    Use getisax() instead of asm code to determine available x86 ISA extensions on Solaris

diff --git a/configure.ac b/configure.ac
index 0d7fb6c..2467e79 100644
--- a/configure.ac
+++ b/configure.ac
@@ -82,7 +82,8 @@ AC_TYPE_PID_T
 dnl Checks for library functions.
 AC_FUNC_VPRINTF
 AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp strchr strrchr \
-		strtol getopt getopt_long vsnprintf walkcontext backtrace])
+		strtol getopt getopt_long vsnprintf walkcontext backtrace \
+		getisax])
 AC_FUNC_ALLOCA
 dnl Old HAS_* names used in os/*.c.
 AC_CHECK_FUNC([getdtablesize],
diff --git a/fb/fbpict.c b/fb/fbpict.c
index eb305b9..d839994 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -1435,6 +1435,10 @@ fbPictureInit (ScreenPtr pScreen, PictFo
  */
 #if !defined(__amd64__) && !defined(__x86_64__)
 
+#ifdef HAVE_GETISAX
+#include <sys/auxv.h>
+#endif
+
 enum CPUFeatures {
     NoFeatures = 0,
     MMX = 0x1,
@@ -1445,7 +1449,23 @@ enum CPUFeatures {
 };
 
 static unsigned int detectCPUFeatures(void) {
+    unsigned int features = 0;
     unsigned int result;
+
+#ifdef HAVE_GETISAX
+    if (getisax(&result, 1)) {
+        if (result & AV_386_CMOV)
+            features |= CMOV;
+        if (result & AV_386_MMX)
+            features |= MMX;
+        if (result & AV_386_AMD_MMX)
+            features |= MMX_Extensions;
+        if (result & AV_386_SSE)
+            features |= SSE;
+        if (result & AV_386_SSE2)
+            features |= SSE2;
+    }
+#else
     char vendor[13];
     vendor[0] = 0;
     vendor[12] = 0;
@@ -1454,7 +1474,8 @@ static unsigned int detectCPUFeatures(vo
      * %esp here. We can't declare either one as clobbered
      * since they are special registers (%ebx is the "PIC
      * register" holding an offset to global data, %esp the
-     * stack pointer), so we need to make sure they have their+      * original values when we access the output operands.
+     * stack pointer), so we need to make sure they have their
+     * original values when we access the output operands.
      */
     __asm__ ("pushf\n"
              "pop %%eax\n"
@@ -1490,7 +1511,6 @@ static unsigned int detectCPUFeatures(vo
              : "%eax", "%ecx", "%edx"
         );
 
-    unsigned int features = 0;
     if (result) {
         /* result now contains the standard feature bits */
         if (result & (1 << 15))
@@ -1524,6 +1544,7 @@ static unsigned int detectCPUFeatures(vo
                 features |= MMX_Extensions;
         }
     }
+#endif /* HAVE_GETISAX */
     return features;
 }
 
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 53858e9..a920242 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -112,6 +112,9 @@
 /* Define to 1 if you have the `geteuid' function. */
 #undef HAVE_GETEUID
 
+/* Define to 1 if you have the `getisax' function. */
+#undef HAVE_GETISAX
+
 /* Define to 1 if you have the `getopt' function. */
 #undef HAVE_GETOPT
 
diff-tree a8a0abdbea0573c861a5af9d58f3ce66790455ca (from 80642f37d40216035786eaf490952d16f6b5f597)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 18 10:59:07 2006 +0300

    config/dbus: always unref the connection, not close

diff --git a/config/config.c b/config/config.c
index 4d12a07..5b0d90d 100644
--- a/config/config.c
+++ b/config/config.c
@@ -265,7 +265,7 @@ configInitialise()
     }
 
     if (!dbus_connection_get_unix_fd(bus, &configfd)) {
-        dbus_connection_close(bus);
+        dbus_connection_unref(bus);
         configfd = -1;
         FatalError("[dbus] couldn't get fd for bus\n");
         return;
@@ -275,7 +275,7 @@ configInitialise()
     if (!dbus_bus_request_name(bus, busname, 0, &error) ||
         dbus_error_is_set(&error)) {
         dbus_error_free(&error);
-        dbus_connection_close(bus);
+        dbus_connection_unref(bus);
         configfd = -1;
         FatalError("[dbus] couldn't take over org.x.config: %s (%s)\n",
                    error.name, error.message);
@@ -287,7 +287,7 @@ configInitialise()
     if (dbus_error_is_set(&error)) {
         dbus_error_free(&error);
         dbus_bus_release_name(bus, busname, &error);
-        dbus_connection_close(bus);
+        dbus_connection_unref(bus);
         configfd = -1;
         FatalError("[dbus] couldn't match X.Org rule: %s (%s)\n", error.name,
                    error.message);
@@ -299,7 +299,7 @@ configInitialise()
         configfd = -1;
         dbus_bus_release_name(bus, busname, &error);
         dbus_bus_remove_match(bus, MATCH_RULE, &error);
-        dbus_connection_close(bus);
+        dbus_connection_unref(bus);
         FatalError("[dbus] couldn't register object path\n");
         return;
     }
diff-tree 80642f37d40216035786eaf490952d16f6b5f597 (from 5e17cde27b064174584d478130b0f95dcef78deb)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Tue Oct 17 14:53:28 2006 -0400

    Stop building xorgcfg by default.

diff --git a/configure.ac b/configure.ac
index 7992d77..0d7fb6c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1665,13 +1665,9 @@ fi
 
 dnl xorgcfg GUI configuration utility
 AC_ARG_ENABLE(xorgcfg, AS_HELP_STRING([--enable-xorgcfg], 
-	[Build xorgcfg GUI configuration utility (default: auto)]),
-	[XORGCFG=$enableval],[XORGCFG=auto])
-if test "x$XORGCFG" = xauto && test "x$XORG" = xyes; then
-    XORGCFG=yes
-fi
-
-if test "x$XORGCFG" = xyes; then
+	[Build xorgcfg GUI configuration utility (default: no)]),
+	[XORGCFG=$enableval],[XORGCFG=no])
+if test x$XORGCFG = xyes ; then
 	PKG_CHECK_MODULES([XORGCFG_DEP], 
 	    [xkbui >= 1.0.2 xkbfile xxf86misc xxf86vm xaw7 xmu xt xpm xext x11])
 	AC_CHECK_LIB([curses],[waddstr],
diff-tree 5e17cde27b064174584d478130b0f95dcef78deb (from 205c6788d7a34704e36b23f1a93d89e9b986266a)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Tue Oct 17 17:06:44 2006 +0200

    StorePixels() macro could create invalid *x++=*x... code - fixed.

diff --git a/cfb/cfbteblt8.c b/cfb/cfbteblt8.c
index 1db2996..9d4ce57 100644
--- a/cfb/cfbteblt8.c
+++ b/cfb/cfbteblt8.c
@@ -301,7 +301,7 @@ typedef unsigned int	*glyphPointer;
 #define StorePixels(o,p)    dst[o] = p
 #define Loop		    dst += widthDst;
 #else
-#define StorePixels(o,p)    *dst++ = (p)
+#define StorePixels(o,p)    do { *dst = (p); dst++; } while (0)
 #define Loop		    dst += widthLeft;
 #endif
 
diff-tree 205c6788d7a34704e36b23f1a93d89e9b986266a (from 85ac2f16abe9f6e88b4e71609da334d336a9a600)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 16 23:48:09 2006 +0300

    config/dbus: properly initialise vtable
    
    Properly initialise the vtable, so we don't end up with an unregister_function
    pointing to god knows where.

diff --git a/config/config.c b/config/config.c
index a50302f..4d12a07 100644
--- a/config/config.c
+++ b/config/config.c
@@ -251,7 +251,7 @@ configInitialise()
 {
     DBusConnection *bus = NULL;
     DBusError error;
-    DBusObjectPathVTable vtable;
+    DBusObjectPathVTable vtable = { .message_function = configMessage };
 
     configConnection = NULL;
 
@@ -294,7 +294,6 @@ configInitialise()
         return;
     }
 
-    vtable.message_function = configMessage;
     snprintf(busobject, sizeof(busobject), "/org/x/config/%d", atoi(display));
     if (!dbus_connection_register_object_path(bus, busobject, &vtable, bus)) {
         configfd = -1;
@@ -319,10 +318,7 @@ configFini()
 
     if (configConnection) {
         dbus_error_init(&error);
-        /* This causes a segfault inside libdbus.  Sigh. */
-#if 0
         dbus_connection_unregister_object_path(configConnection, busobject);
-#endif
         dbus_bus_remove_match(configConnection, MATCH_RULE, &error);
         dbus_bus_release_name(configConnection, busname, &error);
         dbus_connection_unref(configConnection);
diff-tree 85ac2f16abe9f6e88b4e71609da334d336a9a600 (from 0901eec87ee9f3a2a067695bdbd569ff42149879)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Mon Oct 16 12:39:05 2006 +0100

    Small modification to blocking signals when switching modes.

diff --git a/hw/xfree86/common/xf86Cursor.c b/hw/xfree86/common/xf86Cursor.c
index 20905b0..46d8128 100644
--- a/hw/xfree86/common/xf86Cursor.c
+++ b/hw/xfree86/common/xf86Cursor.c
@@ -208,7 +208,6 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
   ScreenPtr   pCursorScreen;
   Bool        Switched;
   int         px, py;
-  int         sigstate;
 
   if (!pScr->vtSema || !mode || !pScr->SwitchMode)
     return FALSE;
@@ -228,10 +227,8 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
   if (pScreen == pCursorScreen)
     miPointerGetPosition(inputInfo.pointer, &px, &py);
 
-  sigstate = xf86BlockSIGIO ();
   xf86EnterServerState(SETUP);
   Switched = (*pScr->SwitchMode)(pScr->scrnIndex, mode, 0);
-  xf86EnterServerState(OPERATING);
   if (Switched) {
     pScr->currentMode = mode;
 
@@ -266,7 +263,7 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
       pScr->frameY1 = pScr->virtualY - 1;
     }
   }
-  xf86UnblockSIGIO (sigstate);
+  xf86EnterServerState(OPERATING);
 
   if (pScr->AdjustFrame)
     (*pScr->AdjustFrame)(pScr->scrnIndex, pScr->frameX0, pScr->frameY0, 0);
diff-tree 0901eec87ee9f3a2a067695bdbd569ff42149879 (from a232693c8c2a206aac47c07b133c071938204e0b)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Sun Oct 15 16:57:09 2006 +0200

    Fix __glXDRIbindTexImage() for 32 bpp on big endian platforms.

diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c
index b572304..170662c 100644
--- a/GL/glx/glxdri.c
+++ b/GL/glx/glxdri.c
@@ -359,7 +359,12 @@ __glXDRIbindTexImage(__GLXcontext *baseC
     if (pixmap->drawable.depth >= 24) {
 	bpp = 4;
 	format = GL_BGRA;
-	type = GL_UNSIGNED_BYTE;
+	type =
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+	    GL_UNSIGNED_BYTE;
+#else
+	    GL_UNSIGNED_INT_8_8_8_8_REV;
+#endif
     } else {
 	bpp = 2;
 	format = GL_RGB;
diff-tree a232693c8c2a206aac47c07b133c071938204e0b (from 5563861ab7e56ec891cfce6b34af43fec53ccee3)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Sun Oct 15 16:48:59 2006 +0200

    Add per-drawable Xv colour key helper function.
    
    This allows overlay Xv adaptors to work slightly better with compositing
    managers.
    
    Bump the video driver ABI minor so drivers only need to check for this at build
    time.

diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index f0cf5eb..3c3247e 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -84,7 +84,7 @@ typedef enum {
  * mask is 0xFFFF0000.
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 3)
-#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(1, 0)
+#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(1, 1)
 #define ABI_XINPUT_VERSION	SET_ABI_VERSION(1, 0)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(0, 3)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 5)
diff --git a/hw/xfree86/common/xf86xv.c b/hw/xfree86/common/xf86xv.c
index 89cb6ba..3e908b8 100644
--- a/hw/xfree86/common/xf86xv.c
+++ b/hw/xfree86/common/xf86xv.c
@@ -974,6 +974,7 @@ xf86XVEnlistPortInWindow(WindowPtr pWin,
    if(!winPriv) {
 	winPriv = xalloc(sizeof(XF86XVWindowRec));
 	if(!winPriv) return BadAlloc;
+	memset(winPriv, 0, sizeof(XF86XVWindowRec));
 	winPriv->PortRec = portPriv;
 	winPriv->next = PrivRoot;
 	pWin->devPrivates[XF86XVWindowIndex].ptr = (pointer)winPriv;
@@ -1026,6 +1027,9 @@ xf86XVDestroyWindow(WindowPtr pWin)
 
      pPriv->pDraw = NULL;
      tmp = WinPriv;
+     if(WinPriv->pGC) {
+       FreeGC(WinPriv->pGC, 0);
+     }
      WinPriv = WinPriv->next;
      xfree(tmp);
   }
@@ -1118,6 +1122,8 @@ xf86XVClipNotify(WindowPtr pWin, int dx,
   while(WinPriv) {
      pPriv = WinPriv->PortRec;
 
+     if(!pPriv) goto next;
+ 
      if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
 	REGION_DESTROY(pScreen, pPriv->pCompositeClip);
 
@@ -1148,6 +1154,7 @@ xf86XVClipNotify(WindowPtr pWin, int dx,
 	}
      }
 
+next:
      pPrev = WinPriv;
      WinPriv = WinPriv->next;
   }
@@ -1739,9 +1746,13 @@ xf86XVPutImage(
      REGION_UNINIT(pScreen, &VPReg);
   }
 
-  if(portPriv->pDraw) {
+  /* If we are changing windows, unregister our port in the old window */
+  if(portPriv->pDraw && (portPriv->pDraw != pDraw))
      xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
-  }
+
+  /* Register our port with the new window */
+  ret =  xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
+  if(ret != Success) goto PUT_IMAGE_BAILOUT;
 
   if(!REGION_NOTEMPTY(pScreen, &ClipRegion)) {
      clippedAway = TRUE;
@@ -1772,7 +1783,6 @@ xf86XVPutImage(
   if((ret == Success) &&
 	(portPriv->AdaptorRec->flags & VIDEO_OVERLAID_IMAGES)) {
 
-     xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
      portPriv->isOn = XV_ON;
      portPriv->pDraw = pDraw;
      portPriv->drw_x = drw_x;  portPriv->drw_y = drw_y;
@@ -1813,6 +1823,56 @@ xf86XVQueryImageAttributes(
 			format->id, width, height, pitches, offsets);
 }
 
+
+_X_EXPORT void
+xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr clipboxes)
+{
+   ScreenPtr pScreen = pDraw->pScreen;
+   WindowPtr pWin = (WindowPtr)pDraw;
+   XF86XVWindowPtr pPriv = GET_XF86XV_WINDOW(pWin);
+   GCPtr pGC = NULL;
+   XID pval[2];
+   BoxPtr pbox = REGION_RECTS(clipboxes);
+   int i, nbox = REGION_NUM_RECTS(clipboxes);
+   xRectangle *rects;
+
+   if(!xf86Screens[pScreen->myNum]->vtSema) return;
+
+   if(pPriv)
+      pGC = pPriv->pGC;
+
+   if(!pGC) {
+       int status;
+       pval[0] = key;
+       pval[1] = IncludeInferiors;
+       pGC = CreateGC(pDraw, GCForeground | GCSubwindowMode, pval, &status);
+       if(!pGC) return;
+       ValidateGC(pDraw, pGC);
+       if (pPriv) pPriv->pGC = pGC;
+   } else if (key != pGC->fgPixel){
+       pval[0] = key;
+       ChangeGC(pGC, GCForeground, pval);
+       ValidateGC(pDraw, pGC);
+   }
+
+   REGION_TRANSLATE(pDraw->pScreen, clipboxes, -pDraw->x, -pDraw->y);
+
+   rects = ALLOCATE_LOCAL(nbox * sizeof(xRectangle));
+
+   for(i = 0; i < nbox; i++, pbox++) {
+      rects[i].x = pbox->x1;
+      rects[i].y = pbox->y1;
+      rects[i].width = pbox->x2 - pbox->x1;
+      rects[i].height = pbox->y2 - pbox->y1;
+   }
+
+   (*pGC->ops->PolyFillRect)(pDraw, pGC, nbox, rects);
+
+   if (!pPriv) FreeGC(pGC, 0);
+
+   DEALLOCATE_LOCAL(rects);
+}
+
 _X_EXPORT void
 xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes)
 {
diff --git a/hw/xfree86/common/xf86xv.h b/hw/xfree86/common/xf86xv.h
index e0feb57..817e2b9 100644
--- a/hw/xfree86/common/xf86xv.h
+++ b/hw/xfree86/common/xf86xv.h
@@ -232,6 +232,9 @@ void xf86XVFreeVideoAdaptorRec(XF86Video
 void
 xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes);
 
+void
+xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr clipboxes);
+
 Bool
 xf86XVClipVideoHelper(
     BoxPtr dst,
diff --git a/hw/xfree86/common/xf86xvpriv.h b/hw/xfree86/common/xf86xvpriv.h
index ced0536..e716c9c 100644
--- a/hw/xfree86/common/xf86xvpriv.h
+++ b/hw/xfree86/common/xf86xvpriv.h
@@ -80,6 +80,7 @@ typedef struct {
 typedef struct _XF86XVWindowRec{
    XvPortRecPrivatePtr PortRec;
    struct _XF86XVWindowRec *next;
+   GCPtr pGC;
 } XF86XVWindowRec, *XF86XVWindowPtr;
 
 #endif  /* _XF86XVPRIV_H_ */
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
index 586d5dc..8e39373 100644
--- a/hw/xfree86/loader/xf86sym.c
+++ b/hw/xfree86/loader/xf86sym.c
@@ -621,6 +621,7 @@ _X_HIDDEN void *xfree86LookupTab[] = {
     SYMFUNC(xf86XVAllocateVideoAdaptorRec)
     SYMFUNC(xf86XVFreeVideoAdaptorRec)
     SYMFUNC(xf86XVFillKeyHelper)
+    SYMFUNC(xf86XVFillKeyHelperDrawable)
     SYMFUNC(xf86XVClipVideoHelper)
     SYMFUNC(xf86XVCopyYUV12ToPacked)
     SYMFUNC(xf86XVCopyPacked)
diff-tree 5563861ab7e56ec891cfce6b34af43fec53ccee3 (from 1b1698af41b9038d9f9dbf521737d0baab5a2237)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Fri Oct 13 19:05:28 2006 -0700

    Make sure xorgcfg files are included even when dist made with --disable-xorgcfg

diff --git a/hw/xfree86/utils/xorgcfg/Makefile.am b/hw/xfree86/utils/xorgcfg/Makefile.am
index 73e4042..309ed5c 100644
--- a/hw/xfree86/utils/xorgcfg/Makefile.am
+++ b/hw/xfree86/utils/xorgcfg/Makefile.am
@@ -56,6 +56,7 @@ endif
 if NEED_STRLCAT
 STRL_SRCS = $(top_srcdir)/os/strlcat.c $(top_srcdir)/os/strlcpy.c
 endif
+endif BUILD_XORGCFG
 
 xorgcfg_SOURCES =	\
         accessx.c \
@@ -95,10 +96,7 @@ xorgcfg_SOURCES =	\
         xf86config.h \
 	$(STRL_SRCS)
 
-XBMdir = $(includedir)/X11/bitmaps
-XPMdir = $(includedir)/X11/pixmaps
-
-XBM_DATA = \
+BITMAPS = \
         card.xbm \
         keyboard.xbm \
         monitor.xbm \
@@ -112,7 +110,7 @@ XBM_DATA = \
         shorter.xbm \
         taller.xbm
 
-XPM_DATA = \
+PIXMAPS = \
         card.xpm \
         computer.xpm \
         keyboard.xpm \
@@ -122,6 +120,13 @@ XPM_DATA = \
 # Rules needed to cpp man page & app-defaults
 include $(top_srcdir)/cpprules.in
 
+if BUILD_XORGCFG
+XBMdir = $(includedir)/X11/bitmaps
+XPMdir = $(includedir)/X11/pixmaps
+
+XBM_DATA = $(BITMAPS)
+XPM_DATA = $(PIXMAPS)
+
 # App default files  (*.ad)
 
 appdefaultdir = @APPDEFAULTDIR@
@@ -146,7 +151,6 @@ appman_DATA = $(appman_PRE:man=@APP_MAN_
 
 all-local: $(appman_PRE) $(appman_DATA)
 
-EXTRA_DIST = $(XBM_DATA) $(XPM_DATA) XOrgCfg.pre xorgcfg.man.pre
 BUILT_SOURCES = $(appman_PRE)
 CLEANFILES = $(APPDEFAULTFILES) $(BUILT_SOURCES) $(appman_DATA)
 
@@ -156,4 +160,6 @@ SUFFIXES += .$(APP_MAN_SUFFIX) .man
 	-rm -f $@
 	$(LN_S) $< $@
 
-endif
+endif BUILD_XORGCFG
+
+EXTRA_DIST = $(BITMAPS) $(PIXMAPS) XOrgCfg.pre xorgcfg.man.pre
diff-tree e1dd1904c6c7ce33f347d822272831d54a6497c8 (from 62d24097932708fbbb62a23614fe63b4b7acf3bd)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Thu Oct 19 13:51:53 2006 -0700

    Pre-release message should tell users to check git, not CVS, for updates

diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 8b4bf14..8f0a26d 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -1763,8 +1763,8 @@ xf86PrintBanner()
     "Bugs may be filed in the bugzilla at http://bugs.freedesktop.org/.\n"
     "Select the \"xorg\" product for bugs you find in this release.\n"
     "Before reporting bugs in pre-release versions please check the\n"
-    "latest version in the X.Org Foundation CVS repository.\n"
-    "See http://wiki.x.org/wiki/CvsPage for CVS access instructions.\n");
+    "latest version in the X.Org Foundation git repository.\n"
+    "See http://wiki.x.org/wiki/GitPage for git access instructions.\n");
 #endif
   ErrorF("\nX Window System Version %d.%d.%d",
 	 XORG_VERSION_MAJOR,
diff-tree 62d24097932708fbbb62a23614fe63b4b7acf3bd (from 357b37b3826fa6e9878c0bd895164259c2ed3c0d)
Author: Joshua Baergen <joshuabaergen at gentoo.org>
Date:   Thu Oct 19 11:14:26 2006 -0700

    Create xorg.conf.example (Gentoo bug #138623).

diff --git a/configure.ac b/configure.ac
index 693da13..444b021 100644
--- a/configure.ac
+++ b/configure.ac
@@ -821,6 +821,7 @@ VENDOR_MAN_VERSION="Version ${VENDOR_VER
 
 AC_DEFINE_DIR(COMPILEDDEFAULTFONTPATH, FONTPATH, [Default font path])
 AC_DEFINE_DIR(RGB_DB, RGBPATH, [Default RGB path])
+AC_DEFINE_DIR(BASE_FONT_PATH, FONTDIR, [Default base font path])
 AC_DEFINE_DIR(DRI_DRIVER_PATH, DRI_DRIVER_PATH, [Default DRI driver path])
 AC_DEFINE_UNQUOTED(XVENDORNAME, ["$VENDOR_STRING"], [Vendor name])
 AC_DEFINE_UNQUOTED(XVENDORNAMESHORT, ["$VENDOR_STRING_SHORT"], [Short vendor name])
diff --git a/hw/xfree86/Makefile.am b/hw/xfree86/Makefile.am
index 5cce11d..79d2ec5 100644
--- a/hw/xfree86/Makefile.am
+++ b/hw/xfree86/Makefile.am
@@ -1,3 +1,5 @@
+include $(top_srcdir)/cpprules.in
+
 if DRI
 DRI_SUBDIR = dri
 endif
@@ -82,7 +84,23 @@ endif
 optionsdir = $(libdir)/X11
 dist_options_DATA = Options
 
+BUILT_SOURCES = xorg.conf.example
+CLEAN = xorg.conf.example xorg.conf.example.pre
 EXTRA_DIST = xorgconf.cpp
 
+CPP_FILES_FLAGS = \
+	-DRGBPATH=\"$(RGB_DB)\" \
+	-DLOCALFONTPATH="\"$(BASE_FONT_PATH)/local\"" \
+	-DMISCFONTPATH="\"$(BASE_FONT_PATH)/misc\"" \
+	-DT1FONTPATH="\"$(BASE_FONT_PATH)/Type1\"" \
+	-DTRUETYPEFONTPATH="\"$(BASE_FONT_PATH)/TTF\"" \
+	-DCIDFONTPATH="\"$(BASE_FONT_PATH)/CID\"" \
+	-DDPI75FONTPATH="\"$(BASE_FONT_PATH)/75dpi\"" \
+	-DDPI100FONTPATH="\"$(BASE_FONT_PATH)/100dpi\"" \
+	-DMODULEPATH=\"$(DEFAULT_MODULE_PATH)\"
+
 relink:
 	rm -f Xorg && $(MAKE) Xorg
+
+xorg.conf.example.pre: xorgconf.cpp
+	cp $< $@
diff --git a/hw/xfree86/xorgconf.cpp b/hw/xfree86/xorgconf.cpp
index c94c1e5..6c52213 100644
--- a/hw/xfree86/xorgconf.cpp
+++ b/hw/xfree86/xorgconf.cpp
@@ -54,12 +54,9 @@ XCOMM command (or a combination of both 
 
     FontPath	LOCALFONTPATH
     FontPath	MISCFONTPATH
-    FontPath	DPI75USFONTPATH
-    FontPath	DPI100USFONTPATH
     FontPath	T1FONTPATH
-    FontPath    TRUETYPEFONTPATH
+    FontPath	TRUETYPEFONTPATH
     FontPath	CIDFONTPATH
-    FontPath	SPFONTPATH
     FontPath	DPI75FONTPATH
     FontPath	DPI100FONTPATH
 
diff-tree 357b37b3826fa6e9878c0bd895164259c2ed3c0d (from 5eca750fe2f3f243fb352271ad8da196af0cb16a)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Wed Oct 18 18:11:06 2006 -0700

    Use getisax() instead of asm code to determine available x86 ISA extensions on Solaris

diff --git a/configure.ac b/configure.ac
index 444dd4c..693da13 100644
--- a/configure.ac
+++ b/configure.ac
@@ -82,7 +82,8 @@ AC_TYPE_PID_T
 dnl Checks for library functions.
 AC_FUNC_VPRINTF
 AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp strchr strrchr \
-		strtol getopt getopt_long vsnprintf walkcontext backtrace])
+		strtol getopt getopt_long vsnprintf walkcontext backtrace \
+		getisax])
 AC_FUNC_ALLOCA
 dnl Old HAS_* names used in os/*.c.
 AC_CHECK_FUNC([getdtablesize],
diff --git a/fb/fbpict.c b/fb/fbpict.c
index eb305b9..d839994 100644
--- a/fb/fbpict.c
+++ b/fb/fbpict.c
@@ -1435,6 +1435,10 @@ fbPictureInit (ScreenPtr pScreen, PictFo
  */
 #if !defined(__amd64__) && !defined(__x86_64__)
 
+#ifdef HAVE_GETISAX
+#include <sys/auxv.h>
+#endif
+
 enum CPUFeatures {
     NoFeatures = 0,
     MMX = 0x1,
@@ -1445,7 +1449,23 @@ enum CPUFeatures {
 };
 
 static unsigned int detectCPUFeatures(void) {
+    unsigned int features = 0;
     unsigned int result;
+
+#ifdef HAVE_GETISAX
+    if (getisax(&result, 1)) {
+        if (result & AV_386_CMOV)
+            features |= CMOV;
+        if (result & AV_386_MMX)
+            features |= MMX;
+        if (result & AV_386_AMD_MMX)
+            features |= MMX_Extensions;
+        if (result & AV_386_SSE)
+            features |= SSE;
+        if (result & AV_386_SSE2)
+            features |= SSE2;
+    }
+#else
     char vendor[13];
     vendor[0] = 0;
     vendor[12] = 0;
@@ -1454,7 +1474,8 @@ static unsigned int detectCPUFeatures(vo
      * %esp here. We can't declare either one as clobbered
      * since they are special registers (%ebx is the "PIC
      * register" holding an offset to global data, %esp the
-     * stack pointer), so we need to make sure they have their+      * original values when we access the output operands.
+     * stack pointer), so we need to make sure they have their
+     * original values when we access the output operands.
      */
     __asm__ ("pushf\n"
              "pop %%eax\n"
@@ -1490,7 +1511,6 @@ static unsigned int detectCPUFeatures(vo
              : "%eax", "%ecx", "%edx"
         );
 
-    unsigned int features = 0;
     if (result) {
         /* result now contains the standard feature bits */
         if (result & (1 << 15))
@@ -1524,6 +1544,7 @@ static unsigned int detectCPUFeatures(vo
                 features |= MMX_Extensions;
         }
     }
+#endif /* HAVE_GETISAX */
     return features;
 }
 
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 571a867..65c42e6 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -112,6 +112,9 @@
 /* Define to 1 if you have the `geteuid' function. */
 #undef HAVE_GETEUID
 
+/* Define to 1 if you have the `getisax' function. */
+#undef HAVE_GETISAX
+
 /* Define to 1 if you have the `getopt' function. */
 #undef HAVE_GETOPT
 
diff-tree 1b1698af41b9038d9f9dbf521737d0baab5a2237 (from 6dd4fc4652f942724039dc2317c560ea7276ab59)
Author: Zephaniah E. Hull <warp at agamemnon.b5>
Date:   Wed Oct 18 04:57:22 2006 -0400

    Pass SetDeviceValuators down to the driver.
    NOTE: This changes the LocalDeviceRec struct, which breaks input drivers.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 6927720..411dedd 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -501,7 +501,13 @@ int
 SetDeviceValuators (ClientPtr client, DeviceIntPtr dev, int *valuators,
                     int first_valuator, int num_valuators)
 {
-  return BadMatch;
+    LocalDevicePtr local = (LocalDevicePtr) dev->public.devicePrivate;
+
+    if (local->set_device_valuators)
+	return (*local->set_device_valuators)(local, valuators, first_valuator,
+					      num_valuators);
+
+    return BadMatch;
 }
 
 
diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h
index 444b2d4..73dcdb7 100644
--- a/hw/xfree86/common/xf86Xinput.h
+++ b/hw/xfree86/common/xf86Xinput.h
@@ -113,7 +113,7 @@ typedef struct _LocalDeviceRec {
     struct _LocalDeviceRec *next;
     char *		    name;
     int			    flags;
-    
+
     Bool		    (*device_control)(DeviceIntPtr device, int what);
     void		    (*read_input)(struct _LocalDeviceRec *local);
     int			    (*control_proc)(struct _LocalDeviceRec *local,
@@ -128,7 +128,11 @@ typedef struct _LocalDeviceRec {
     Bool		    (*reverse_conversion_proc)(
 					struct _LocalDeviceRec *local,
 					int x, int y, int *valuators);
-    
+    int                     (*set_device_valuators)
+				(struct _LocalDeviceRec *local,
+				 int *valuators, int first_valuator,
+				 int num_valuators);
+
     int			    fd;
     Atom		    atom;
     DeviceIntPtr	    dev;
diff-tree 5eca750fe2f3f243fb352271ad8da196af0cb16a (from df979b75c8cd8a7e0566aea58031bb9b8f5cd3d3)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Tue Oct 17 14:53:28 2006 -0400

    Stop building xorgcfg by default.

diff --git a/configure.ac b/configure.ac
index 7222106..444dd4c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1579,8 +1579,8 @@ AC_SUBST(XORGCONFIG_DEP_LIBS)
 
 dnl xorgcfg GUI configuration utility
 AC_ARG_ENABLE(xorgcfg, AS_HELP_STRING([--enable-xorgcfg], 
-	[Build xorgcfg GUI configuration utility (default: yes)]),
-	[XORGCFG=$enableval],[XORGCFG=yes])
+	[Build xorgcfg GUI configuration utility (default: no)]),
+	[XORGCFG=$enableval],[XORGCFG=no])
 if test x$XORGCFG = xyes ; then
 	PKG_CHECK_MODULES([XORGCFG_DEP], 
 	    [xkbui >= 1.0.2 xkbfile xxf86misc xxf86vm xaw7 xmu xt xpm xext x11])
diff-tree df979b75c8cd8a7e0566aea58031bb9b8f5cd3d3 (from d430e76a161c963169067875c3654f5fd8f42b19)
Author: Matthias Hopf <mhopf at suse.de>
Date:   Tue Oct 17 17:06:44 2006 +0200

    StorePixels() macro could create invalid  *x++=*x...  code - fixed.

diff --git a/cfb/cfbteblt8.c b/cfb/cfbteblt8.c
index 1db2996..9d4ce57 100644
--- a/cfb/cfbteblt8.c
+++ b/cfb/cfbteblt8.c
@@ -301,7 +301,7 @@ typedef unsigned int	*glyphPointer;
 #define StorePixels(o,p)    dst[o] = p
 #define Loop		    dst += widthDst;
 #else
-#define StorePixels(o,p)    *dst++ = (p)
+#define StorePixels(o,p)    do { *dst = (p); dst++; } while (0)
 #define Loop		    dst += widthLeft;
 #endif
 
diff-tree d430e76a161c963169067875c3654f5fd8f42b19 (from 3ad1642f1bbaa5f96558cdf3384b40f7122f8781)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Mon Oct 16 12:39:05 2006 +0100

    Small modification to blocking signals when switching modes.

diff --git a/hw/xfree86/common/xf86Cursor.c b/hw/xfree86/common/xf86Cursor.c
index 8bb12ae..dcdf466 100644
--- a/hw/xfree86/common/xf86Cursor.c
+++ b/hw/xfree86/common/xf86Cursor.c
@@ -213,7 +213,6 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
   ScreenPtr   pCursorScreen;
   Bool        Switched;
   int         px, py;
-  int         sigstate;
 
   if (!pScr->vtSema || !mode || !pScr->SwitchMode)
     return FALSE;
@@ -233,10 +232,8 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
   if (pScreen == pCursorScreen)
     miPointerPosition(&px, &py);
 
-  sigstate = xf86BlockSIGIO ();
   xf86EnterServerState(SETUP);
   Switched = (*pScr->SwitchMode)(pScr->scrnIndex, mode, 0);
-  xf86EnterServerState(OPERATING);
   if (Switched) {
     pScr->currentMode = mode;
 
@@ -271,7 +268,7 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
       pScr->frameY1 = pScr->virtualY - 1;
     }
   }
-  xf86UnblockSIGIO (sigstate);
+  xf86EnterServerState(OPERATING);
 
   if (pScr->AdjustFrame)
     (*pScr->AdjustFrame)(pScr->scrnIndex, pScr->frameX0, pScr->frameY0, 0);
diff-tree 6dd4fc4652f942724039dc2317c560ea7276ab59 (from a484ba15277e66e7ef9b21b238dcbf760695bc63)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 16 00:22:00 2006 +0300

    xkb: fix virtual modmap size computation
    Compute virtual modmap size bounded by nVModMapKeys-1, rather than
    nVModMapKeys.
    
    This is sort of a best guess.  The other way seems a little more
    logical, but also leads to segfaults pretty quickly if you hammer
    GetMap hard enough.  So let's try this one.

diff --git a/xkb/xkb.c b/xkb/xkb.c
index ba8fc7f..bceaf49 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -1325,7 +1325,7 @@ unsigned short *	pMap;
 
     wire= (xkbVModMapWireDesc *)buf;
     pMap= &xkb->server->vmodmap[rep->firstVModMapKey];
-    for (i=0;i<rep->nVModMapKeys;i++,pMap++) {
+    for (i=0;i<rep->nVModMapKeys-1;i++,pMap++) {
 	if (*pMap!=0) {
 	    wire->key= i+rep->firstVModMapKey;
 	    wire->vmods= *pMap;
diff-tree a484ba15277e66e7ef9b21b238dcbf760695bc63 (from ad355fecee3965be576596aeed5da54d776edf1d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 15 23:47:34 2006 +0300

    XkbCopyKeymap: copy server vmods, and name atoms
    Copy server->vmods, and all the atoms in names.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index c8044c7..cddeb9e 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -1294,6 +1294,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
             }
         }
 
+        memcpy(dst->server->vmods, src->server->vmods, XkbNumVirtualMods);
+
         if (src->server->vmodmap) {
             if (src->max_key_code != dst->max_key_code) {
                 if (dst->server->vmodmap)
@@ -1427,6 +1429,20 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                 xfree(dst->names->radio_groups);
         }
         dst->names->num_rg = src->names->num_rg;
+
+        dst->names->keycodes = src->names->keycodes;
+        dst->names->geometry = src->names->geometry;
+        dst->names->symbols = src->names->symbols;
+        dst->names->types = src->names->types;
+        dst->names->compat = src->names->compat;
+        dst->names->phys_symbols = src->names->phys_symbols;
+
+        memcpy(dst->names->vmods, src->names->vmods,
+               XkbNumVirtualMods * sizeof(Atom));
+        memcpy(dst->names->indicators, src->names->indicators,
+               XkbNumIndicators * sizeof(Atom));
+        memcpy(dst->names->groups, src->names->groups,
+               XkbNumKbdGroups * sizeof(Atom));
     }
     else {
         if (dst->names)
diff-tree ad355fecee3965be576596aeed5da54d776edf1d (from 4ae7745a0dc86de6346409a69c1e396e0b954514)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 15 21:59:06 2006 +0300

    xkb: make sure we set the map on the right device, not necessarily core
    Forgot that all XKB requests took a device spec: the comparison of
    'if working on the core keyboard, does this device send core events; or,
    is this device the core keyboard?' was broken.  Instead, what we want is
    'if working on the core keyboard, does this device send core events; or,
    is this device the one we're working on?'.

diff --git a/xkb/xkb.c b/xkb/xkb.c
index 880f113..ba8fc7f 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -555,7 +555,7 @@ ProcXkbLatchLockState(ClientPtr client)
 
     for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
         if ((dev == inputInfo.keyboard && tmpd->key && tmpd->coreEvents) ||
-            tmpd == inputInfo.keyboard) {
+            tmpd == dev) {
             if (!tmpd->key->xkbInfo)
                 continue;
 
@@ -697,7 +697,7 @@ ProcXkbSetControls(ClientPtr client)
 
     for (tmpd = inputInfo.keyboard; tmpd; tmpd = tmpd->next) {
         if ((dev == inputInfo.keyboard && tmpd->key && tmpd->coreEvents) ||
-            tmpd == inputInfo.keyboard) {
+            tmpd == dev) {
 
             xkbi = tmpd->key->xkbInfo;
             ctrl = xkbi->desc->ctrls;
@@ -5441,12 +5441,13 @@ ProcXkbGetKbdByName(ClientPtr client)
 	xkb->ctrls->num_groups= nTG;
 
         for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
-            if ((dev == inputInfo.keyboard && tmpd->key && tmpd->coreEvents) ||
-                tmpd == inputInfo.keyboard) {
+            if (tmpd == dev ||
+                (dev->id == inputInfo.keyboard->id && tmpd->key &&
+                 tmpd->coreEvents)) {
 
                 memcpy(tmpd->key->modifierMap, xkb->map->modmap,
                        xkb->max_key_code + 1);
-                if (dev != inputInfo.keyboard)
+                if (tmpd != dev)
                     XkbCopyKeymap(dev->key->xkbInfo->desc,
                                   tmpd->key->xkbInfo->desc, True);
                 XkbUpdateCoreDescription(tmpd, True);
diff-tree 4ae7745a0dc86de6346409a69c1e396e0b954514 (from acd8419948003032056a56d46adbef7c35e7739c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 15 21:48:01 2006 +0300

    xfree86 input: always open devices on NewInputDeviceRequest

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index a398740..6927720 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -222,15 +222,8 @@ xf86ActivateDevice(LocalDevicePtr local)
     DeviceIntPtr	dev;
 
     if (local->flags & XI86_CONFIGURED) {
-        int	open_on_init;
-        
-        open_on_init = local->flags & (XI86_OPEN_ON_INIT | XI86_ALWAYS_CORE);
-        
-        dev = AddInputDevice(local->device_control,
-                             open_on_init);
-#ifdef DEBUG
-        ErrorF("activated device %d: %s\n", dev->id, local->name);
-#endif
+        dev = AddInputDevice(local->device_control, TRUE);
+
         if (dev == NULL)
             FatalError("Too many input devices");
         
diff-tree acd8419948003032056a56d46adbef7c35e7739c (from fc9b5f84b244ea08480b73bd15ac919b875800fb)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 15 20:42:31 2006 +0300

    config: unref connection, don't close it
    Just unref the connection instead of explicitly closing it (thanks, Rob
    McQueen).
    Add a commented-out unregister_object_path call: unfortunately, when we
    call it, libdbus segfaults.  But if we don't unregister the path, we
    can't register it again.  So regenerations are broken either way, but a
    little less violently like this.

diff --git a/config/config.c b/config/config.c
index e3c33aa..a50302f 100644
--- a/config/config.c
+++ b/config/config.c
@@ -319,9 +319,13 @@ configFini()
 
     if (configConnection) {
         dbus_error_init(&error);
+        /* This causes a segfault inside libdbus.  Sigh. */
+#if 0
+        dbus_connection_unregister_object_path(configConnection, busobject);
+#endif
         dbus_bus_remove_match(configConnection, MATCH_RULE, &error);
         dbus_bus_release_name(configConnection, busname, &error);
-        dbus_connection_close(configConnection);
+        dbus_connection_unref(configConnection);
         RemoveGeneralSocket(configfd);
         configConnection = NULL;
         configfd = -1;
diff-tree fc9b5f84b244ea08480b73bd15ac919b875800fb (from ec35e7198debf938f1115f584e675ce5995743e3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 15 20:01:01 2006 +0300

    dix/devices: add devices in proper forward order
    Add devices in forward order with the normal linked list convention.
    Previously, AddInputDevice would add all the devices in reverse order to
    off_devices, before they were added again in reverse order to devices with
    EnableDevice.
    This just makes both work in forward order, which provides the ordering as
    you'd expect when hotplugging devices (i.e. adds them to the head, not the
    tail).

diff --git a/dix/devices.c b/dix/devices.c
index bf8c58a..0121eea 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -86,7 +86,7 @@ int CoreDevicePrivatesIndex = 0, CoreDev
 DeviceIntPtr
 AddInputDevice(DeviceProc deviceProc, Bool autoStart)
 {
-    register DeviceIntPtr dev;
+    register DeviceIntPtr dev, *prev; /* not a typo */
 
     if (inputInfo.numDevices >= MAX_DEVICES)
 	return (DeviceIntPtr)NULL;
@@ -130,8 +130,12 @@ AddInputDevice(DeviceProc deviceProc, Bo
     dev->devPrivates = NULL;
     dev->unwrapProc = NULL;
     dev->coreEvents = TRUE;
-    dev->next = inputInfo.off_devices;
-    inputInfo.off_devices = dev;
+
+    for (prev = &inputInfo.off_devices; *prev; prev = &(*prev)->next)
+        ;
+    *prev = dev;
+    dev->next = NULL;
+
     return dev;
 }
 
@@ -151,8 +155,12 @@ EnableDevice(register DeviceIntPtr dev)
 	return FALSE;
     }
     *prev = dev->next;
-    dev->next = inputInfo.devices;
-    inputInfo.devices = dev;
+
+    for (prev = &inputInfo.devices; *prev; prev = &(*prev)->next)
+        ;
+    *prev = dev;
+    dev->next = NULL;
+
     return TRUE;
 }
 
diff-tree ec35e7198debf938f1115f584e675ce5995743e3 (from a05044cfc14a8bc6cc31236dcecada60bec09924)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 15 19:44:49 2006 +0300

    config: add replies and dbus api documentation
    Add replies, which use standard X error values, to the two currently-supported
    input configuration requests.
    Document the D-BUS API we use.
    Make sure we free everything when we encounter an error.
    Add a _source option to all incoming requests, noting that it came from a
    client.
    Reject all requests to add a device where an option name contains an
    underscore.

diff --git a/config/config.c b/config/config.c
index 8cb4406..e3c33aa 100644
--- a/config/config.c
+++ b/config/config.c
@@ -29,17 +29,26 @@
 #define DBUS_API_SUBJECT_TO_CHANGE
 #include <dbus/dbus.h>
 #include <string.h>
+
+#include <X11/X.h>
+
 #include "opaque.h" /* for 'display': there has to be a better way */
                     /* the above comment lies.  there is no better way. */
 #include "input.h"
+#include "inputstr.h"
 #include "config.h"
+#include "os.h"
 
 #define MATCH_RULE "type='method_call',interface='org.x.config.input'"
 
-#define MALFORMED_MSG "config: malformed message, dropping"
-#define MALFORMED_MESSAGE() DebugF(MALFORMED_MSG)
-#define MALFORMED_MESSAGE_ERROR() DebugF(MALFORMED_MSG ": %s, %s", \
-                                       error.name, error.message)
+#define MALFORMED_MSG "[config] malformed message, dropping"
+#define MALFORMED_MESSAGE() { DebugF(MALFORMED_MSG "\n"); \
+                            ret = BadValue; \
+                            goto unwind; }
+#define MALFORMED_MESSAGE_ERROR() { DebugF(MALFORMED_MSG ": %s, %s", \
+                                       error->name, error->message); \
+                                  ret = BadValue; \
+                                  goto unwind; }
 
 static DBusConnection *configConnection = NULL;
 static int configfd = -1;
@@ -55,130 +64,186 @@ configDispatch()
     dbus_connection_read_write_dispatch(configConnection, 0);
 }
 
-static DBusHandlerResult
-configMessage(DBusConnection *connection, DBusMessage *message, void *closure)
+static int
+configAddDevice(DBusMessage *message, DBusMessageIter *iter, DBusError *error)
 {
-    InputOption *option = NULL, *ret = NULL;
-    DBusMessageIter iter, subiter;
-    DBusError error;
+    DBusMessageIter subiter;
+    InputOption *tmpo = NULL, *options = NULL;
     char *tmp = NULL;
+    int ret = BadMatch;
+
+    DebugF("[config] adding device\n");
+
+    /* signature should be [ss][ss]... */
+    options = (InputOption *) xcalloc(sizeof(InputOption), 1);
+    if (!options) {
+        ErrorF("[config] couldn't allocate option\n");
+        return BadAlloc;
+    }
+
+    options->key = xstrdup("_source");
+    options->value = xstrdup("client/dbus");
+
+    while (dbus_message_iter_get_arg_type(iter) == DBUS_TYPE_ARRAY) {
+        tmpo = (InputOption *) xcalloc(sizeof(InputOption), 1);
+        if (!tmpo) {
+            ErrorF("[config] couldn't allocate option\n");
+            ret = BadAlloc;
+            goto unwind;
+        }
+
+        dbus_message_iter_recurse(iter, &subiter);
+
+        if (dbus_message_iter_get_arg_type(&subiter) != DBUS_TYPE_STRING)
+            MALFORMED_MESSAGE();
+
+        dbus_message_iter_get_basic(&subiter, &tmp);
+        if (!tmp)
+            MALFORMED_MESSAGE();
+        if (tmp[0] == '_') {
+            ErrorF("[config] attempted subterfuge: option name %s given\n",
+                   tmp);
+            MALFORMED_MESSAGE();
+        }
+        tmpo->key = xstrdup(tmp);
+        if (!tmpo->key) {
+            ErrorF("[config] couldn't duplicate key!\n");
+            ret = BadAlloc;
+            goto unwind;
+        }
+
+        if (!dbus_message_iter_has_next(&subiter))
+            MALFORMED_MESSAGE();
+        dbus_message_iter_next(&subiter);
+        if (dbus_message_iter_get_arg_type(&subiter) != DBUS_TYPE_STRING)
+            MALFORMED_MESSAGE();
+
+        dbus_message_iter_get_basic(&subiter, &tmp);
+        if (!tmp)
+            MALFORMED_MESSAGE();
+        tmpo->value = xstrdup(tmp);
+        if (!tmpo->value) {
+            ErrorF("[config] couldn't duplicate option!\n");
+            ret = BadAlloc;
+            goto unwind;
+        }
+
+        tmpo->next = options;
+        options = tmpo;
+        dbus_message_iter_next(iter);
+    }
+
+    ret = NewInputDeviceRequest(options);
+    if (ret != Success)
+        DebugF("[config] NewInputDeviceRequest failed\n");
+
+    return ret;
+
+unwind:
+    if (tmpo->key)
+        xfree(tmpo->key);
+    if (tmpo->value)
+        xfree(tmpo->value);
+    if (tmpo)
+        xfree(tmpo);
+
+    while (options) {
+        tmpo = options;
+        options = options->next;
+        if (tmpo->key)
+            xfree(tmpo->key);
+        if (tmpo->value)
+            xfree(tmpo->value);
+        xfree(tmpo);
+    }
+
+    return ret;
+}
+
+static int
+configRemoveDevice(DBusMessage *message, DBusMessageIter *iter,
+                   DBusError *error)
+{
     int deviceid = -1;
+    int ret = BadMatch;
     DeviceIntPtr pDev = NULL;
 
+    if (!dbus_message_get_args(message, error, DBUS_TYPE_INT32,
+                               &deviceid, DBUS_TYPE_INVALID)) {
+        MALFORMED_MESSAGE_ERROR();
+    }
+
+    if (deviceid < 0 || !(pDev = LookupDeviceIntRec(deviceid))) {
+        DebugF("[config] bogus device id %d given\n", deviceid);
+        ret = BadMatch;
+        goto unwind;
+    }
+
+    DebugF("[config] removing device %s (id %d)\n", pDev->name, deviceid);
+
+    /* Call PIE here so we don't try to dereference a device that's
+     * already been removed. */
+    OsBlockSignals();
+    ProcessInputEvents();
+    RemoveDevice(pDev);
+    OsReleaseSignals();
+
+    return Success;
+
+unwind:
+    return ret;
+}
+
+static DBusHandlerResult
+configMessage(DBusConnection *connection, DBusMessage *message, void *closure)
+{
+    DBusMessageIter iter;
+    DBusError error;
+    DBusMessage *reply;
+    DBusConnection *bus = closure;
+    int ret = BadDrawable; /* nonsensical value */
+
     dbus_error_init(&error);
 
     if (strcmp(dbus_message_get_interface(message),
                "org.x.config.input") == 0) {
         if (!dbus_message_iter_init(message, &iter)) {
-            ErrorF("config: failed to init iterator\n");
+            ErrorF("[config] failed to init iterator\n");
             dbus_error_free(&error);
             return DBUS_HANDLER_RESULT_NEED_MEMORY; /* ?? */
         }
-        if (strcmp(dbus_message_get_member(message), "add") == 0) {
-            DebugF("config: adding device\n");
-            /* signature should be [ss][ss]... */
-            while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_ARRAY) {
-                option = (InputOption *)xcalloc(sizeof(InputOption), 1);
-                if (!option) {
-                    while (ret) {
-                        option = ret;
-                        ret = ret->next;
-                        xfree(option);
-                    }
-                    dbus_error_free(&error);
-                    return DBUS_HANDLER_RESULT_NEED_MEMORY;
-                }
-
-                dbus_message_iter_recurse(&iter, &subiter);
-
-                if (dbus_message_iter_get_arg_type(&subiter) !=
-                    DBUS_TYPE_STRING) {
-                    MALFORMED_MESSAGE();
-                    xfree(option);
-                    dbus_error_free(&error);
-                    return DBUS_HANDLER_RESULT_HANDLED;
-                }
-                dbus_message_iter_get_basic(&subiter, &tmp);
-                if (!tmp) {
-                    MALFORMED_MESSAGE();
-                    xfree(option);
-                    break;
-                }
-                option->key = xstrdup(tmp);
-                if (!option->key) {
-                    ErrorF("couldn't duplicate the key!\n");
-                    xfree(option);
-                    break;
-                }
-
-                if (!dbus_message_iter_has_next(&subiter)) {
-                    MALFORMED_MESSAGE();
-                    xfree(option->key);
-                    xfree(option);
-                    dbus_error_free(&error);
-                    return DBUS_HANDLER_RESULT_HANDLED;
-                }
-                dbus_message_iter_next(&subiter);
-
-                if (dbus_message_iter_get_arg_type(&subiter) !=
-                    DBUS_TYPE_STRING) {
-                    MALFORMED_MESSAGE();
-                    xfree(option);
-                    dbus_error_free(&error);
-                    return DBUS_HANDLER_RESULT_HANDLED;
-                }
-                dbus_message_iter_get_basic(&subiter, &tmp);
-                if (!tmp) {
-                    MALFORMED_MESSAGE();
-                    xfree(option->key);
-                    xfree(option);
-                    break;
-                }
-                option->value = xstrdup(tmp);
-                if (!option->value) {
-                    ErrorF("couldn't duplicate the option!\n");
-                    xfree(option->value);
-                    xfree(option);
-                    break;
-                }
-
-                option->next = ret;
-                ret = option;
-                dbus_message_iter_next(&iter);
-            }
-
-            if (NewInputDeviceRequest(ret) != Success) {
-                DebugF("config: NewInputDeviceRequest failed\n");
-            }
-            dbus_error_free(&error);
-            return DBUS_HANDLER_RESULT_HANDLED;
-        }
-        else if (strcmp(dbus_message_get_member(message), "remove") == 0) {
-            ErrorF("config: removing device\n");
-            if (!dbus_message_get_args(message, &error, DBUS_TYPE_INT32,
-                                       &deviceid, DBUS_TYPE_INVALID)) {
-                MALFORMED_MESSAGE_ERROR();
-                dbus_error_free(&error);
-                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
-            }
-            if (deviceid < 0 || !(pDev = LookupDeviceIntRec(deviceid))) {
-                DebugF("config: bogus device id %d given\n", deviceid);
-                dbus_error_free(&error);
-                return DBUS_HANDLER_RESULT_HANDLED;
-            }
-            /* Call PIE here so we don't try to dereference a device that's
-             * already been removed.  Technically there's still a small race
-             * here, so we should ensure that SIGIO is blocked. */
-            ProcessInputEvents();
-            RemoveDevice(pDev);
+
+        if (strcmp(dbus_message_get_member(message), "add") == 0)
+            ret = configAddDevice(message, &iter, &error);
+        else if (strcmp(dbus_message_get_member(message), "remove") == 0)
+            ret = configRemoveDevice(message, &iter, &error);
+    }
+
+    if (ret != BadDrawable && ret != BadAlloc) {
+        reply = dbus_message_new_method_return(message);
+        dbus_message_iter_init_append(reply, &iter);
+
+        if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &ret)) {
+            ErrorF("[config] couldn't append to iterator\n");
             dbus_error_free(&error);
             return DBUS_HANDLER_RESULT_HANDLED;
         }
+
+        if (!dbus_connection_send(bus, reply, NULL))
+            ErrorF("[config] failed to send reply\n");
+        dbus_connection_flush(bus);
+
+        dbus_message_unref(reply);
     }
 
     dbus_error_free(&error);
 
-    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    if (ret == BadAlloc)
+        return DBUS_HANDLER_RESULT_NEED_MEMORY;
+    else if (ret == BadDrawable)
+        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+    else
+        return DBUS_HANDLER_RESULT_HANDLED;
 }
 
 void
@@ -231,7 +296,7 @@ configInitialise()
 
     vtable.message_function = configMessage;
     snprintf(busobject, sizeof(busobject), "/org/x/config/%d", atoi(display));
-    if (!dbus_connection_register_object_path(bus, busobject, &vtable, NULL)) {
+    if (!dbus_connection_register_object_path(bus, busobject, &vtable, bus)) {
         configfd = -1;
         dbus_bus_release_name(bus, busname, &error);
         dbus_bus_remove_match(bus, MATCH_RULE, &error);
@@ -243,9 +308,7 @@ configInitialise()
     DebugF("[dbus] registered object path %s\n", busobject);
 
     dbus_error_free(&error);
-
     configConnection = bus;
-
     AddGeneralSocket(configfd);
 }
 
@@ -265,7 +328,9 @@ configFini()
         dbus_error_free(&error);
     }
 }
-#else
+
+#else /* !HAVE_DBUS */
+
 void
 configDispatch()
 {
@@ -280,4 +345,5 @@ void
 configFini()
 {
 }
-#endif
+
+#endif /* HAVE_DBUS */
diff --git a/config/dbus-api b/config/dbus-api
new file mode 100644
index 0000000..53bb3e4
--- /dev/null
+++ b/config/dbus-api
@@ -0,0 +1,35 @@
+D-BUS Configuration API v0.1
+----------------------------
+
+The X server will register the bus name org.x.config.displayN, and the 
+object /org/x/config/N, where N is the display number.
+
+Currently only hotplugging of input devices is supported.
+
+org.x.config.input:
+    org.x.config.input.add:
+        Takes an argument of key/value option pairs in arrays, e.g.:
+         [ss][ss][ss][ss]
+        is the signature for four options.  These options will be passed
+        to the input driver as with any others.
+        Option names beginning with _ are not allowed; they are reserved
+        for internal use.
+
+        Returns one int32, which is an X Status, as defined in X.h.  If
+        everything is successful, Success will be returned.  BadMatch will
+        be returned if the options given do not match any device.  BadValue
+        is returned for a malformed message.
+
+        Notably, BadAlloc is never returned: the server internally signals
+        to D-BUS that the attempt failed for lack of memory.
+
+        The return does not notify the client of which devices were created
+        or modified as a result of this request: clients are encouraged to
+        listen for the XInput DevicePresenceNotify event to monitor changes
+        in the device list.
+
+    org.x.config.input.remove:
+        Takes one int32 argument, which is the device ID to remove, i.e.:
+         i
+        is the signature.
+        Same return values as org.x.config.input.add.
diff-tree 3ad1642f1bbaa5f96558cdf3384b40f7122f8781 (from f9bfee50981006a2c58d3f73e2b0d123bb2a41b7)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Sun Oct 15 16:57:09 2006 +0200

    Fix __glXDRIbindTexImage() for 32 bpp on big endian platforms.

diff --git a/GL/glx/glxdri.c b/GL/glx/glxdri.c
index b572304..170662c 100644
--- a/GL/glx/glxdri.c
+++ b/GL/glx/glxdri.c
@@ -359,7 +359,12 @@ __glXDRIbindTexImage(__GLXcontext *baseC
     if (pixmap->drawable.depth >= 24) {
 	bpp = 4;
 	format = GL_BGRA;
-	type = GL_UNSIGNED_BYTE;
+	type =
+#if X_BYTE_ORDER == X_LITTLE_ENDIAN
+	    GL_UNSIGNED_BYTE;
+#else
+	    GL_UNSIGNED_INT_8_8_8_8_REV;
+#endif
     } else {
 	bpp = 2;
 	format = GL_RGB;
diff-tree f9bfee50981006a2c58d3f73e2b0d123bb2a41b7 (from b9108a13fc126d97c0393f911a1d9292563444ce)
Author: Michel Dänzer <michel at tungstengraphics.com>
Date:   Sun Oct 15 16:48:59 2006 +0200

    Add per-drawable Xv colour key helper function.
    
    This allows overlay Xv adaptors to work slightly better with compositing
    managers.
    
    Bump the video driver ABI minor so drivers only need to check for this at build
    time.

diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index f54be49..cf404fb 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -84,7 +84,7 @@ typedef enum {
  * mask is 0xFFFF0000.
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 3)
-#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(1, 0)
+#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(1, 1)
 #define ABI_XINPUT_VERSION	SET_ABI_VERSION(0, 6)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(0, 3)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 5)
diff --git a/hw/xfree86/common/xf86xv.c b/hw/xfree86/common/xf86xv.c
index 89cb6ba..3e908b8 100644
--- a/hw/xfree86/common/xf86xv.c
+++ b/hw/xfree86/common/xf86xv.c
@@ -974,6 +974,7 @@ xf86XVEnlistPortInWindow(WindowPtr pWin,
    if(!winPriv) {
 	winPriv = xalloc(sizeof(XF86XVWindowRec));
 	if(!winPriv) return BadAlloc;
+	memset(winPriv, 0, sizeof(XF86XVWindowRec));
 	winPriv->PortRec = portPriv;
 	winPriv->next = PrivRoot;
 	pWin->devPrivates[XF86XVWindowIndex].ptr = (pointer)winPriv;
@@ -1026,6 +1027,9 @@ xf86XVDestroyWindow(WindowPtr pWin)
 
      pPriv->pDraw = NULL;
      tmp = WinPriv;
+     if(WinPriv->pGC) {
+       FreeGC(WinPriv->pGC, 0);
+     }
      WinPriv = WinPriv->next;
      xfree(tmp);
   }
@@ -1118,6 +1122,8 @@ xf86XVClipNotify(WindowPtr pWin, int dx,
   while(WinPriv) {
      pPriv = WinPriv->PortRec;
 
+     if(!pPriv) goto next;
+ 
      if(pPriv->pCompositeClip && pPriv->FreeCompositeClip)
 	REGION_DESTROY(pScreen, pPriv->pCompositeClip);
 
@@ -1148,6 +1154,7 @@ xf86XVClipNotify(WindowPtr pWin, int dx,
 	}
      }
 
+next:
      pPrev = WinPriv;
      WinPriv = WinPriv->next;
   }
@@ -1739,9 +1746,13 @@ xf86XVPutImage(
      REGION_UNINIT(pScreen, &VPReg);
   }
 
-  if(portPriv->pDraw) {
+  /* If we are changing windows, unregister our port in the old window */
+  if(portPriv->pDraw && (portPriv->pDraw != pDraw))
      xf86XVRemovePortFromWindow((WindowPtr)(portPriv->pDraw), portPriv);
-  }
+
+  /* Register our port with the new window */
+  ret =  xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
+  if(ret != Success) goto PUT_IMAGE_BAILOUT;
 
   if(!REGION_NOTEMPTY(pScreen, &ClipRegion)) {
      clippedAway = TRUE;
@@ -1772,7 +1783,6 @@ xf86XVPutImage(
   if((ret == Success) &&
 	(portPriv->AdaptorRec->flags & VIDEO_OVERLAID_IMAGES)) {
 
-     xf86XVEnlistPortInWindow((WindowPtr)pDraw, portPriv);
      portPriv->isOn = XV_ON;
      portPriv->pDraw = pDraw;
      portPriv->drw_x = drw_x;  portPriv->drw_y = drw_y;
@@ -1813,6 +1823,56 @@ xf86XVQueryImageAttributes(
 			format->id, width, height, pitches, offsets);
 }
 
+
+_X_EXPORT void
+xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr clipboxes)
+{
+   ScreenPtr pScreen = pDraw->pScreen;
+   WindowPtr pWin = (WindowPtr)pDraw;
+   XF86XVWindowPtr pPriv = GET_XF86XV_WINDOW(pWin);
+   GCPtr pGC = NULL;
+   XID pval[2];
+   BoxPtr pbox = REGION_RECTS(clipboxes);
+   int i, nbox = REGION_NUM_RECTS(clipboxes);
+   xRectangle *rects;
+
+   if(!xf86Screens[pScreen->myNum]->vtSema) return;
+
+   if(pPriv)
+      pGC = pPriv->pGC;
+
+   if(!pGC) {
+       int status;
+       pval[0] = key;
+       pval[1] = IncludeInferiors;
+       pGC = CreateGC(pDraw, GCForeground | GCSubwindowMode, pval, &status);
+       if(!pGC) return;
+       ValidateGC(pDraw, pGC);
+       if (pPriv) pPriv->pGC = pGC;
+   } else if (key != pGC->fgPixel){
+       pval[0] = key;
+       ChangeGC(pGC, GCForeground, pval);
+       ValidateGC(pDraw, pGC);
+   }
+
+   REGION_TRANSLATE(pDraw->pScreen, clipboxes, -pDraw->x, -pDraw->y);
+
+   rects = ALLOCATE_LOCAL(nbox * sizeof(xRectangle));
+
+   for(i = 0; i < nbox; i++, pbox++) {
+      rects[i].x = pbox->x1;
+      rects[i].y = pbox->y1;
+      rects[i].width = pbox->x2 - pbox->x1;
+      rects[i].height = pbox->y2 - pbox->y1;
+   }
+
+   (*pGC->ops->PolyFillRect)(pDraw, pGC, nbox, rects);
+
+   if (!pPriv) FreeGC(pGC, 0);
+
+   DEALLOCATE_LOCAL(rects);
+}
+
 _X_EXPORT void
 xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes)
 {
diff --git a/hw/xfree86/common/xf86xv.h b/hw/xfree86/common/xf86xv.h
index e0feb57..817e2b9 100644
--- a/hw/xfree86/common/xf86xv.h
+++ b/hw/xfree86/common/xf86xv.h
@@ -232,6 +232,9 @@ void xf86XVFreeVideoAdaptorRec(XF86Video
 void
 xf86XVFillKeyHelper (ScreenPtr pScreen, CARD32 key, RegionPtr clipboxes);
 
+void
+xf86XVFillKeyHelperDrawable (DrawablePtr pDraw, CARD32 key, RegionPtr clipboxes);
+
 Bool
 xf86XVClipVideoHelper(
     BoxPtr dst,
diff --git a/hw/xfree86/common/xf86xvpriv.h b/hw/xfree86/common/xf86xvpriv.h
index ced0536..e716c9c 100644
--- a/hw/xfree86/common/xf86xvpriv.h
+++ b/hw/xfree86/common/xf86xvpriv.h
@@ -80,6 +80,7 @@ typedef struct {
 typedef struct _XF86XVWindowRec{
    XvPortRecPrivatePtr PortRec;
    struct _XF86XVWindowRec *next;
+   GCPtr pGC;
 } XF86XVWindowRec, *XF86XVWindowPtr;
 
 #endif  /* _XF86XVPRIV_H_ */
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
index 69e11d5..a498ccc 100644
--- a/hw/xfree86/loader/xf86sym.c
+++ b/hw/xfree86/loader/xf86sym.c
@@ -625,6 +625,7 @@ _X_HIDDEN void *xfree86LookupTab[] = {
     SYMFUNC(xf86XVAllocateVideoAdaptorRec)
     SYMFUNC(xf86XVFreeVideoAdaptorRec)
     SYMFUNC(xf86XVFillKeyHelper)
+    SYMFUNC(xf86XVFillKeyHelperDrawable)
     SYMFUNC(xf86XVClipVideoHelper)
     SYMFUNC(xf86XVCopyYUV12ToPacked)
     SYMFUNC(xf86XVCopyPacked)
diff-tree a05044cfc14a8bc6cc31236dcecada60bec09924 (from 4d8030076ed1a7680bdfcb7b89af1045bdc40304)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Oct 14 22:14:56 2006 +0300

    xkb: better support of XkbDfltXIId
    XKB.h specifies that XkbDfltXIId should be used where the client doesn't
    care about the device identifier.  We take this to mean core devices,
    where practical.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 9a3be31..c8044c7 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -78,6 +78,8 @@ _XkbLookupKeyboard(int id,int *why_rtrn)
 {
 DeviceIntPtr dev = NULL;
 
+    if (id == XkbDfltXIId)
+        id = XkbUseCoreKbd;
     if ((dev= _XkbLookupAnyDevice(id,why_rtrn))==NULL)
 	return NULL;
     else if ((!dev->key)||(!dev->key->xkbInfo)) {
@@ -108,6 +110,8 @@ _XkbLookupLedDevice(int id,int *why_rtrn
 {
 DeviceIntPtr dev = NULL;
 
+    if (id == XkbDfltXIId)
+        id = XkbUseCorePtr;
     if ((dev= _XkbLookupAnyDevice(id,why_rtrn))==NULL)
 	return NULL;
     else if ((!dev->kbdfeed)&&(!dev->leds)) {
diff-tree 4d8030076ed1a7680bdfcb7b89af1045bdc40304 (from 6afc7c284690b1e2bb7544b5bc4f31a3f6a05519)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Oct 14 22:14:07 2006 +0300

    dix: move GetKeyboardEvents/GetPointerEvents to a new file, export symbols
    Move GKE and GPE to a separate file, to help stem the events.c explosion.
    Mark GKE/GKVE/GPE as _X_EXPORT.

diff --git a/dix/Makefile.am b/dix/Makefile.am
index d26d9ea..724d1d1 100644
--- a/dix/Makefile.am
+++ b/dix/Makefile.am
@@ -17,6 +17,7 @@ libdix_la_SOURCES = 	\
 	extension.c	\
 	ffs.c		\
 	gc.c		\
+	getevents.c	\
 	globals.c	\
 	glyphcurs.c	\
 	grabs.c		\
diff --git a/dix/events.c b/dix/events.c
index ebc43b0..e1a3e75 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -131,13 +131,10 @@ of the copyright holder.
 #endif
 #include "globals.h"
 
-#include "mipointer.h"
-
 #ifdef XKB
 #include <X11/extensions/XKBproto.h>
 #include <X11/extensions/XKBsrv.h>
 extern Bool XkbFilterEvents(ClientPtr, int, xEvent *);
-extern Bool XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies);
 #endif
 
 #ifdef XACE
@@ -4592,473 +4589,3 @@ WriteEventsToClient(ClientPtr pClient, i
 	(void)WriteToClient(pClient, count * sizeof(xEvent), (char *) events);
     }
 }
-
-/* Maximum number of valuators, divided by six, rounded up. */
-#define MAX_VALUATOR_EVENTS 6
-
-/**
- * Returns the maximum number of events GetKeyboardEvents,
- * GetKeyboardValuatorEvents, and GetPointerEvents will ever return.
- *
- * Should be used in DIX as:
- * xEvent *events = xcalloc(sizeof(xEvent), GetMaximumEventsNum());
- */
-int
-GetMaximumEventsNum() {
-    /* Two base events -- core and device, plus valuator events.  Multiply
-     * by two if we're doing key repeats. */
-    int ret = 2 + MAX_VALUATOR_EVENTS;
-
-#ifdef XKB
-    if (noXkbExtension)
-#endif
-        ret *= 2;
-
-    return ret;
-}
-
-/**
- * Convenience wrapper around GetKeyboardValuatorEvents, that takes no
- * valuators.
- */
-int
-GetKeyboardEvents(xEvent *events, DeviceIntPtr pDev, int type, int key_code) {
-    return GetKeyboardValuatorEvents(events, pDev, type, key_code, 0, 0, NULL);
-}
-
-/**
- * Returns a set of keyboard events for KeyPress/KeyRelease, optionally
- * also with valuator events.  Handles Xi and XKB.
- *
- * events is not NULL-terminated; the return value is the number of events.
- * The DDX is responsible for allocating the event structure in the first
- * place via GetMaximumEventsNum(), and for freeing it.
- *
- * If pDev is set to send core events, then the keymap on the core
- * keyboard will be pivoted to that of the new keyboard and the appropriate
- * MapNotify events (both core and XKB) will be sent.
- *
- * Note that this function recurses!  If called for non-XKB, a repeating
- * key press will trigger a matching KeyRelease, as well as the
- * KeyPresses.
- */
-int GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type,
-                              int key_code, int first_valuator,
-                              int num_valuators, int *valuators) {
-    int numEvents = 0, ms = 0, i = 0;
-    int final_valuator = first_valuator + num_valuators;
-    KeySym sym = pDev->key->curKeySyms.map[key_code *
-                                           pDev->key->curKeySyms.mapWidth];
-    deviceKeyButtonPointer *kbp = NULL;
-    deviceValuator *xv = NULL;
-    KeyClassPtr ckeyc;
-
-    if (!events)
-        return 0;
-    
-    if (type != KeyPress && type != KeyRelease)
-        return 0;
-
-    if (!pDev->key || !pDev->focus || !pDev->kbdfeed ||
-        (pDev->coreEvents && !inputInfo.keyboard->key))
-        return 0;
-
-    if (pDev->coreEvents)
-        numEvents = 2;
-    else
-        numEvents = 1;
-
-    if (num_valuators) {
-        if ((num_valuators / 6) + 1 > MAX_VALUATOR_EVENTS)
-            num_valuators = MAX_VALUATOR_EVENTS;
-        numEvents += (num_valuators / 6) + 1;
-    }
-
-#ifdef XKB
-    if (noXkbExtension)
-#endif
-    {
-        switch (sym) {
-            case XK_Num_Lock:
-            case XK_Caps_Lock:
-            case XK_Scroll_Lock:
-            case XK_Shift_Lock:
-                if (type == KeyRelease)
-                    return 0;
-                else if (type == KeyPress &&
-                         (pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
-                        type = KeyRelease;
-        }
-    }
-
-    /* Handle core repeating, via press/release/press/release.
-     * FIXME: In theory, if you're repeating with two keyboards,
-     *        you could get unbalanced events here. */
-    if (type == KeyPress &&
-        (((pDev->key->down[key_code >> 3] & (key_code & 7))) & 1)) {
-        if (!pDev->kbdfeed->ctrl.autoRepeat ||
-            pDev->key->modifierMap[key_code] ||
-            !(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3]
-                & (1 << (key_code & 7))))
-            return 0;
-
-#ifdef XKB
-        if (noXkbExtension)
-#endif
-        {
-            numEvents += GetKeyboardValuatorEvents(events, pDev,
-                                                   KeyRelease, key_code,
-                                                   first_valuator, num_valuators,
-                                                   valuators);
-            events += numEvents;
-        }
-    }
-    
-
-    ms = GetTimeInMillis();
-
-    kbp = (deviceKeyButtonPointer *) events;
-    kbp->time = ms;
-    kbp->deviceid = pDev->id;
-    if (type == KeyPress)
-        kbp->type = DeviceKeyPress;
-    else if (type == KeyRelease)
-        kbp->type = DeviceKeyRelease;
-
-    if (num_valuators) {
-        kbp->deviceid |= MORE_EVENTS;
-        for (i = first_valuator; i < final_valuator; i += 6) {
-            xv = (deviceValuator *) ++events;
-            xv->type = DeviceValuator;
-            xv->first_valuator = i;
-            xv->num_valuators = num_valuators;
-            xv->deviceid = kbp->deviceid;
-            switch (num_valuators - first_valuator) {
-            case 6:
-                xv->valuator5 = valuators[i+5];
-            case 5:
-                xv->valuator4 = valuators[i+4];
-            case 4:
-                xv->valuator3 = valuators[i+3];
-            case 3:
-                xv->valuator2 = valuators[i+2];
-            case 2:
-                xv->valuator1 = valuators[i+1];
-            case 1:
-                xv->valuator0 = valuators[i];
-            }
-        }
-    }
-
-    if (pDev->coreEvents) {
-        events++;
-        events->u.keyButtonPointer.time = ms;
-        events->u.u.type = type;
-        events->u.u.detail = key_code;
-
-        if (inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr !=
-            pDev) {
-            ckeyc = inputInfo.keyboard->key;
-            memcpy(ckeyc->modifierMap, pDev->key->modifierMap, MAP_LENGTH);
-            if (ckeyc->modifierKeyMap)
-                xfree(ckeyc->modifierKeyMap);
-            ckeyc->modifierKeyMap = xalloc(8 * pDev->key->maxKeysPerModifier);
-            memcpy(ckeyc->modifierKeyMap, pDev->key->modifierKeyMap,
-                    (8 * pDev->key->maxKeysPerModifier));
-            ckeyc->maxKeysPerModifier = pDev->key->maxKeysPerModifier;
-            ckeyc->curKeySyms.minKeyCode = pDev->key->curKeySyms.minKeyCode;
-            ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode;
-            SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms);
-#ifdef XKB
-            if (!noXkbExtension && pDev->key->xkbInfo &&
-                pDev->key->xkbInfo->desc) {
-                if (!XkbCopyKeymap(pDev->key->xkbInfo->desc,
-                                   ckeyc->xkbInfo->desc, True))
-                    FatalError("Couldn't pivot keymap from device to core!\n");
-            }
-#endif
-            SendMappingNotify(MappingKeyboard, ckeyc->curKeySyms.minKeyCode,
-                              (ckeyc->curKeySyms.maxKeyCode -
-                               ckeyc->curKeySyms.minKeyCode),
-                              serverClient);
-            inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
-        }
-    }
-
-    return numEvents;
-}
-
-/* Originally a part of xf86PostMotionEvent. */
-static void
-acceleratePointer(DeviceIntPtr pDev, int first_valuator, int num_valuators,
-                  int *valuators)
-{
-    float mult = 0.0;
-    int dx = 0, dy = 0;
-    int *px = NULL, *py = NULL;
-
-    if (!num_valuators || !valuators)
-        return;
-
-    if (first_valuator == 0) {
-        dx = valuators[0];
-        px = &valuators[0];
-    }
-    if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
-        dy = valuators[1 - first_valuator];
-        py = &valuators[1 - first_valuator];
-    }
-
-    if (!dx && !dy)
-        return;
-
-    /*
-     * Accelerate
-     */
-    if (pDev->ptrfeed && pDev->ptrfeed->ctrl.num) {
-        /* modeled from xf86Events.c */
-        if (pDev->ptrfeed->ctrl.threshold) {
-            if ((abs(dx) + abs(dy)) >= pDev->ptrfeed->ctrl.threshold) {
-                pDev->valuator->dxremaind = ((float)dx *
-                                             (float)(pDev->ptrfeed->ctrl.num)) /
-                                             (float)(pDev->ptrfeed->ctrl.den) +
-                                            pDev->valuator->dxremaind;
-                if (px) {
-                    *px = (int)pDev->valuator->dxremaind;
-                    pDev->valuator->dxremaind = pDev->valuator->dxremaind -
-                                                (float)(*px);
-                }
-
-                pDev->valuator->dyremaind = ((float)dy *
-                                             (float)(pDev->ptrfeed->ctrl.num)) /
-                                             (float)(pDev->ptrfeed->ctrl.den) +
-                                            pDev->valuator->dyremaind;
-                if (py) {
-                    *py = (int)pDev->valuator->dyremaind;
-                    pDev->valuator->dyremaind = pDev->valuator->dyremaind -
-                                                (float)(*py);
-                }
-            }
-        }
-        else {
-            mult = pow((float)(dx * dx + dy * dy),
-                       ((float)(pDev->ptrfeed->ctrl.num) /
-                        (float)(pDev->ptrfeed->ctrl.den) - 1.0) /
-                       2.0) / 2.0;
-            if (dx) {
-                pDev->valuator->dxremaind = mult * (float)dx +
-                                            pDev->valuator->dxremaind;
-                *px = (int)pDev->valuator->dxremaind;
-                pDev->valuator->dxremaind = pDev->valuator->dxremaind -
-                                            (float)(*px);
-            }
-            if (dy) {
-                pDev->valuator->dyremaind = mult * (float)dy +
-                                            pDev->valuator->dyremaind;
-                *py = (int)pDev->valuator->dyremaind;
-                pDev->valuator->dyremaind = pDev->valuator->dyremaind -
-                                            (float)(*py);
-            }
-        }
-    }
-}
-
-/**
- * Generate a series of xEvents (returned in xE) representing pointer
- * motion, or button presses.  Xi and XKB-aware.
- *
- * events is not NULL-terminated; the return value is the number of events.
- * The DDX is responsible for allocating the event structure in the first
- * place via GetMaximumEventsNum(), and for freeing it.
- */
-int
-GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
-                 int flags, int first_valuator, int num_valuators,
-                 int *valuators) {
-    int num_events = 0, ms = 0, final_valuator = 0, i = 0;
-    deviceKeyButtonPointer *kbp = NULL;
-    deviceValuator *xv = NULL;
-    AxisInfoPtr axes = NULL;
-    Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
-    DeviceIntPtr cp = inputInfo.pointer;
-    int x = 0, y = 0;
-
-    if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
-        return 0;
-
-    if (!pDev->button || (pDev->coreEvents && (!cp->button || !cp->valuator)))
-        return 0;
-
-    /* You fail. */
-    if (first_valuator < 0)
-        return 0;
-
-    if (pDev->coreEvents)
-        num_events = 2;
-    else
-        num_events = 1;
-
-    /* Do we need to send a DeviceValuator event? */
-    if ((num_valuators + first_valuator) >= 2 && sendValuators) {
-        if (((num_valuators / 6) + 1) > MAX_VALUATOR_EVENTS)
-            num_valuators = MAX_VALUATOR_EVENTS;
-        num_events += (num_valuators / 6) + 1;
-    }
-    else if (type == MotionNotify && num_valuators <= 0) {
-        return 0;
-    }
-
-    final_valuator = num_valuators + first_valuator;
-
-    ms = GetTimeInMillis();
-
-    kbp = (deviceKeyButtonPointer *) events;
-    kbp->time = ms;
-    kbp->deviceid = pDev->id;
-
-    if (flags & POINTER_ABSOLUTE) {
-        if (num_valuators >= 1 && first_valuator == 0) {
-            x = valuators[0];
-        }
-        else {
-            if (pDev->coreEvents)
-                x = cp->valuator->lastx;
-            else
-                x = pDev->valuator->lastx;
-        }
-
-        if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
-            y = valuators[1 - first_valuator];
-        }
-        else {
-            if (pDev->coreEvents)
-                x = cp->valuator->lasty;
-            else
-                y = pDev->valuator->lasty;
-        }
-    }
-    else {
-        if (flags & POINTER_ACCELERATE)
-            acceleratePointer(pDev, first_valuator, num_valuators,
-                              valuators);
-
-        if (pDev->coreEvents) {
-            if (first_valuator == 0 && num_valuators >= 1)
-                x = cp->valuator->lastx + valuators[0];
-            else
-                x = cp->valuator->lastx;
-
-            if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
-                y = cp->valuator->lasty + valuators[1 - first_valuator];
-            else
-                y = cp->valuator->lasty;
-        }
-        else {
-            if (first_valuator == 0 && num_valuators >= 1)
-                x = pDev->valuator->lastx + valuators[0];
-            else
-                x = pDev->valuator->lastx;
-
-            if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
-                y = pDev->valuator->lasty + valuators[1 - first_valuator];
-            else
-                y = pDev->valuator->lasty;
-        }
-    }
-
-
-    axes = pDev->valuator->axes;
-    if (x < axes->min_value)
-        x = axes->min_value;
-    if (axes->max_value > 0 && x > axes->max_value)
-        x = axes->max_value;
-
-    axes++;
-    if (y < axes->min_value)
-        y = axes->min_value;
-    if (axes->max_value > 0 && y > axes->max_value)
-        y = axes->max_value;
-
-    /* This takes care of crossing screens for us, as well as clipping
-     * to the current screen.  Right now, we only have one history buffer,
-     * so we don't set this for both the device and core.*/
-    miPointerSetPosition(pDev, &x, &y, ms);
-
-    if (pDev->coreEvents) {
-        cp->valuator->lastx = x;
-        cp->valuator->lasty = y;
-    }
-    pDev->valuator->lastx = x;
-    pDev->valuator->lasty = y;
-
-    if (type == MotionNotify) {
-        kbp->type = DeviceMotionNotify;
-    }
-    else {
-        if (type == ButtonPress)
-            kbp->type = DeviceButtonPress;
-        else if (type == ButtonRelease)
-            kbp->type = DeviceButtonRelease;
-        kbp->detail = pDev->button->map[buttons];
-    }
-
-    kbp->root_x = x;
-    kbp->root_y = y;
-
-    if (final_valuator > 2 && sendValuators) {
-        kbp->deviceid |= MORE_EVENTS;
-        for (i = first_valuator; i < final_valuator; i += 6) {
-            xv = (deviceValuator *) ++events;
-            xv->type = DeviceValuator;
-            xv->first_valuator = i;
-            xv->num_valuators = num_valuators;
-            xv->deviceid = kbp->deviceid;
-            switch (final_valuator - i) {
-            case 6:
-                xv->valuator5 = valuators[i+5];
-            case 5:
-                xv->valuator4 = valuators[i+4];
-            case 4:
-                xv->valuator3 = valuators[i+3];
-            case 3:
-                xv->valuator2 = valuators[i+2];
-            case 2:
-                /* x and y may have been accelerated. */
-                if (i == 0)
-                    xv->valuator1 = kbp->root_y;
-                else
-                    xv->valuator1 = valuators[i+1];
-            case 1:
-                /* x and y may have been accelerated. */
-                if (i == 0)
-                    xv->valuator0 = kbp->root_x;
-                else
-                    xv->valuator0 = valuators[i];
-            }
-        }
-    }
-
-    if (pDev->coreEvents) {
-        events++;
-        events->u.u.type = type;
-        events->u.keyButtonPointer.time = ms;
-        events->u.keyButtonPointer.rootX = x;
-        events->u.keyButtonPointer.rootY = y;
-
-        if (type == ButtonPress || type == ButtonRelease) {
-            /* We hijack SetPointerMapping to work on all core-sending
-             * devices, so we use the device-specific map here instead of
-             * the core one. */
-            events->u.u.detail = pDev->button->map[buttons];
-        }
-        else {
-            events->u.u.detail = 0;
-        }
-
-        if (inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr !=
-            pDev)
-            inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
-    }
-
-    return num_events;
-}
diff --git a/dix/getevents.c b/dix/getevents.c
new file mode 100644
index 0000000..4f96080
--- /dev/null
+++ b/dix/getevents.c
@@ -0,0 +1,530 @@
+/*
+ * Copyright © 2006 Nokia Corporation
+ * 
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and that
+ * both that this copyright notice and this permission notice appear in
+ * supporting electronic documentation.
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR AUTHORS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Author: Daniel Stone <daniel at fooishbar.org>
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#include <X11/X.h>
+#include <X11/keysym.h>
+#include "misc.h"
+#include "resource.h"
+#define NEED_EVENTS
+#define NEED_REPLIES
+#include <X11/Xproto.h>
+#include "inputstr.h"
+#include "scrnintstr.h"
+#include "cursorstr.h"
+
+#include "dixstruct.h"
+#include "globals.h"
+
+#include "mipointer.h"
+
+#ifdef XKB
+#include <X11/extensions/XKBproto.h>
+#include <X11/extensions/XKBsrv.h>
+extern Bool XkbFilterEvents(ClientPtr, int, xEvent *);
+extern Bool XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies);
+#endif
+
+#ifdef XACE
+#include "xace.h"
+#endif
+
+#include <X11/extensions/XIproto.h>
+#include "exglobals.h"
+#include "exevents.h"
+#include "exglobals.h"
+#include "extnsionst.h"
+
+/* Maximum number of valuators, divided by six, rounded up. */
+#define MAX_VALUATOR_EVENTS 6
+
+/**
+ * Returns the maximum number of events GetKeyboardEvents,
+ * GetKeyboardValuatorEvents, and GetPointerEvents will ever return.
+ *
+ * Should be used in DIX as:
+ * xEvent *events = xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+ */
+_X_EXPORT int
+GetMaximumEventsNum() {
+    /* Two base events -- core and device, plus valuator events.  Multiply
+     * by two if we're doing key repeats. */
+    int ret = 2 + MAX_VALUATOR_EVENTS;
+
+#ifdef XKB
+    if (noXkbExtension)
+#endif
+        ret *= 2;
+
+    return ret;
+}
+
+/**
+ * Convenience wrapper around GetKeyboardValuatorEvents, that takes no
+ * valuators.
+ */
+_X_EXPORT int
+GetKeyboardEvents(xEvent *events, DeviceIntPtr pDev, int type, int key_code) {
+    return GetKeyboardValuatorEvents(events, pDev, type, key_code, 0, 0, NULL);
+}
+
+/**
+ * Returns a set of keyboard events for KeyPress/KeyRelease, optionally
+ * also with valuator events.  Handles Xi and XKB.
+ *
+ * events is not NULL-terminated; the return value is the number of events.
+ * The DDX is responsible for allocating the event structure in the first
+ * place via GetMaximumEventsNum(), and for freeing it.
+ *
+ * If pDev is set to send core events, then the keymap on the core
+ * keyboard will be pivoted to that of the new keyboard and the appropriate
+ * MapNotify events (both core and XKB) will be sent.
+ *
+ * Note that this function recurses!  If called for non-XKB, a repeating
+ * key press will trigger a matching KeyRelease, as well as the
+ * KeyPresses.
+ */
+_X_EXPORT int
+GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type,
+                          int key_code, int first_valuator,
+                          int num_valuators, int *valuators) {
+    int numEvents = 0, ms = 0, i = 0;
+    int final_valuator = first_valuator + num_valuators;
+    KeySym sym = pDev->key->curKeySyms.map[key_code *
+                                           pDev->key->curKeySyms.mapWidth];
+    deviceKeyButtonPointer *kbp = NULL;
+    deviceValuator *xv = NULL;
+    KeyClassPtr ckeyc;
+
+    if (!events)
+        return 0;
+    
+    if (type != KeyPress && type != KeyRelease)
+        return 0;
+
+    if (!pDev->key || !pDev->focus || !pDev->kbdfeed ||
+        (pDev->coreEvents && !inputInfo.keyboard->key))
+        return 0;
+
+    if (pDev->coreEvents)
+        numEvents = 2;
+    else
+        numEvents = 1;
+
+    if (num_valuators) {
+        if ((num_valuators / 6) + 1 > MAX_VALUATOR_EVENTS)
+            num_valuators = MAX_VALUATOR_EVENTS;
+        numEvents += (num_valuators / 6) + 1;
+    }
+
+#ifdef XKB
+    if (noXkbExtension)
+#endif
+    {
+        switch (sym) {
+            case XK_Num_Lock:
+            case XK_Caps_Lock:
+            case XK_Scroll_Lock:
+            case XK_Shift_Lock:
+                if (type == KeyRelease)
+                    return 0;
+                else if (type == KeyPress &&
+                         (pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
+                        type = KeyRelease;
+        }
+    }
+
+    /* Handle core repeating, via press/release/press/release.
+     * FIXME: In theory, if you're repeating with two keyboards,
+     *        you could get unbalanced events here. */
+    if (type == KeyPress &&
+        (((pDev->key->down[key_code >> 3] & (key_code & 7))) & 1)) {
+        if (!pDev->kbdfeed->ctrl.autoRepeat ||
+            pDev->key->modifierMap[key_code] ||
+            !(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3]
+                & (1 << (key_code & 7))))
+            return 0;
+
+#ifdef XKB
+        if (noXkbExtension)
+#endif
+        {
+            numEvents += GetKeyboardValuatorEvents(events, pDev,
+                                                   KeyRelease, key_code,
+                                                   first_valuator, num_valuators,
+                                                   valuators);
+            events += numEvents;
+        }
+    }
+    
+
+    ms = GetTimeInMillis();
+
+    kbp = (deviceKeyButtonPointer *) events;
+    kbp->time = ms;
+    kbp->deviceid = pDev->id;
+    if (type == KeyPress)
+        kbp->type = DeviceKeyPress;
+    else if (type == KeyRelease)
+        kbp->type = DeviceKeyRelease;
+
+    if (num_valuators) {
+        kbp->deviceid |= MORE_EVENTS;
+        for (i = first_valuator; i < final_valuator; i += 6) {
+            xv = (deviceValuator *) ++events;
+            xv->type = DeviceValuator;
+            xv->first_valuator = i;
+            xv->num_valuators = num_valuators;
+            xv->deviceid = kbp->deviceid;
+            switch (num_valuators - first_valuator) {
+            case 6:
+                xv->valuator5 = valuators[i+5];
+            case 5:
+                xv->valuator4 = valuators[i+4];
+            case 4:
+                xv->valuator3 = valuators[i+3];
+            case 3:
+                xv->valuator2 = valuators[i+2];
+            case 2:
+                xv->valuator1 = valuators[i+1];
+            case 1:
+                xv->valuator0 = valuators[i];
+            }
+        }
+    }
+
+    if (pDev->coreEvents) {
+        events++;
+        events->u.keyButtonPointer.time = ms;
+        events->u.u.type = type;
+        events->u.u.detail = key_code;
+
+        if (inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr !=
+            pDev) {
+            ckeyc = inputInfo.keyboard->key;
+            memcpy(ckeyc->modifierMap, pDev->key->modifierMap, MAP_LENGTH);
+            if (ckeyc->modifierKeyMap)
+                xfree(ckeyc->modifierKeyMap);
+            ckeyc->modifierKeyMap = xalloc(8 * pDev->key->maxKeysPerModifier);
+            memcpy(ckeyc->modifierKeyMap, pDev->key->modifierKeyMap,
+                    (8 * pDev->key->maxKeysPerModifier));
+            ckeyc->maxKeysPerModifier = pDev->key->maxKeysPerModifier;
+            ckeyc->curKeySyms.minKeyCode = pDev->key->curKeySyms.minKeyCode;
+            ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode;
+            SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms);
+#ifdef XKB
+            if (!noXkbExtension && pDev->key->xkbInfo &&
+                pDev->key->xkbInfo->desc) {
+                if (!XkbCopyKeymap(pDev->key->xkbInfo->desc,
+                                   ckeyc->xkbInfo->desc, True))
+                    FatalError("Couldn't pivot keymap from device to core!\n");
+            }
+#endif
+            SendMappingNotify(MappingKeyboard, ckeyc->curKeySyms.minKeyCode,
+                              (ckeyc->curKeySyms.maxKeyCode -
+                               ckeyc->curKeySyms.minKeyCode),
+                              serverClient);
+            inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
+        }
+    }
+
+    return numEvents;
+}
+
+/* Originally a part of xf86PostMotionEvent. */
+static void
+acceleratePointer(DeviceIntPtr pDev, int first_valuator, int num_valuators,
+                  int *valuators)
+{
+    float mult = 0.0;
+    int dx = 0, dy = 0;
+    int *px = NULL, *py = NULL;
+
+    if (!num_valuators || !valuators)
+        return;
+
+    if (first_valuator == 0) {
+        dx = valuators[0];
+        px = &valuators[0];
+    }
+    if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
+        dy = valuators[1 - first_valuator];
+        py = &valuators[1 - first_valuator];
+    }
+
+    if (!dx && !dy)
+        return;
+
+    /*
+     * Accelerate
+     */
+    if (pDev->ptrfeed && pDev->ptrfeed->ctrl.num) {
+        /* modeled from xf86Events.c */
+        if (pDev->ptrfeed->ctrl.threshold) {
+            if ((abs(dx) + abs(dy)) >= pDev->ptrfeed->ctrl.threshold) {
+                pDev->valuator->dxremaind = ((float)dx *
+                                             (float)(pDev->ptrfeed->ctrl.num)) /
+                                             (float)(pDev->ptrfeed->ctrl.den) +
+                                            pDev->valuator->dxremaind;
+                if (px) {
+                    *px = (int)pDev->valuator->dxremaind;
+                    pDev->valuator->dxremaind = pDev->valuator->dxremaind -
+                                                (float)(*px);
+                }
+
+                pDev->valuator->dyremaind = ((float)dy *
+                                             (float)(pDev->ptrfeed->ctrl.num)) /
+                                             (float)(pDev->ptrfeed->ctrl.den) +
+                                            pDev->valuator->dyremaind;
+                if (py) {
+                    *py = (int)pDev->valuator->dyremaind;
+                    pDev->valuator->dyremaind = pDev->valuator->dyremaind -
+                                                (float)(*py);
+                }
+            }
+        }
+        else {
+            mult = pow((float)(dx * dx + dy * dy),
+                       ((float)(pDev->ptrfeed->ctrl.num) /
+                        (float)(pDev->ptrfeed->ctrl.den) - 1.0) /
+                       2.0) / 2.0;
+            if (dx) {
+                pDev->valuator->dxremaind = mult * (float)dx +
+                                            pDev->valuator->dxremaind;
+                *px = (int)pDev->valuator->dxremaind;
+                pDev->valuator->dxremaind = pDev->valuator->dxremaind -
+                                            (float)(*px);
+            }
+            if (dy) {
+                pDev->valuator->dyremaind = mult * (float)dy +
+                                            pDev->valuator->dyremaind;
+                *py = (int)pDev->valuator->dyremaind;
+                pDev->valuator->dyremaind = pDev->valuator->dyremaind -
+                                            (float)(*py);
+            }
+        }
+    }
+}
+
+/**
+ * Generate a series of xEvents (returned in xE) representing pointer
+ * motion, or button presses.  Xi and XKB-aware.
+ *
+ * events is not NULL-terminated; the return value is the number of events.
+ * The DDX is responsible for allocating the event structure in the first
+ * place via GetMaximumEventsNum(), and for freeing it.
+ */
+_X_EXPORT int
+GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
+                 int flags, int first_valuator, int num_valuators,
+                 int *valuators) {
+    int num_events = 0, ms = 0, final_valuator = 0, i = 0;
+    deviceKeyButtonPointer *kbp = NULL;
+    deviceValuator *xv = NULL;
+    AxisInfoPtr axes = NULL;
+    Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
+    DeviceIntPtr cp = inputInfo.pointer;
+    int x = 0, y = 0;
+
+    if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
+        return 0;
+
+    if (!pDev->button || (pDev->coreEvents && (!cp->button || !cp->valuator)))
+        return 0;
+
+    /* You fail. */
+    if (first_valuator < 0)
+        return 0;
+
+    if (pDev->coreEvents)
+        num_events = 2;
+    else
+        num_events = 1;
+
+    /* Do we need to send a DeviceValuator event? */
+    if ((num_valuators + first_valuator) >= 2 && sendValuators) {
+        if (((num_valuators / 6) + 1) > MAX_VALUATOR_EVENTS)
+            num_valuators = MAX_VALUATOR_EVENTS;
+        num_events += (num_valuators / 6) + 1;
+    }
+    else if (type == MotionNotify && num_valuators <= 0) {
+        return 0;
+    }
+
+    final_valuator = num_valuators + first_valuator;
+
+    ms = GetTimeInMillis();
+
+    kbp = (deviceKeyButtonPointer *) events;
+    kbp->time = ms;
+    kbp->deviceid = pDev->id;
+
+    if (flags & POINTER_ABSOLUTE) {
+        if (num_valuators >= 1 && first_valuator == 0) {
+            x = valuators[0];
+        }
+        else {
+            if (pDev->coreEvents)
+                x = cp->valuator->lastx;
+            else
+                x = pDev->valuator->lastx;
+        }
+
+        if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
+            y = valuators[1 - first_valuator];
+        }
+        else {
+            if (pDev->coreEvents)
+                x = cp->valuator->lasty;
+            else
+                y = pDev->valuator->lasty;
+        }
+    }
+    else {
+        if (flags & POINTER_ACCELERATE)
+            acceleratePointer(pDev, first_valuator, num_valuators,
+                              valuators);
+
+        if (pDev->coreEvents) {
+            if (first_valuator == 0 && num_valuators >= 1)
+                x = cp->valuator->lastx + valuators[0];
+            else
+                x = cp->valuator->lastx;
+
+            if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
+                y = cp->valuator->lasty + valuators[1 - first_valuator];
+            else
+                y = cp->valuator->lasty;
+        }
+        else {
+            if (first_valuator == 0 && num_valuators >= 1)
+                x = pDev->valuator->lastx + valuators[0];
+            else
+                x = pDev->valuator->lastx;
+
+            if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
+                y = pDev->valuator->lasty + valuators[1 - first_valuator];
+            else
+                y = pDev->valuator->lasty;
+        }
+    }
+
+
+    axes = pDev->valuator->axes;
+    if (x < axes->min_value)
+        x = axes->min_value;
+    if (axes->max_value > 0 && x > axes->max_value)
+        x = axes->max_value;
+
+    axes++;
+    if (y < axes->min_value)
+        y = axes->min_value;
+    if (axes->max_value > 0 && y > axes->max_value)
+        y = axes->max_value;
+
+    /* This takes care of crossing screens for us, as well as clipping
+     * to the current screen.  Right now, we only have one history buffer,
+     * so we don't set this for both the device and core.*/
+    miPointerSetPosition(pDev, &x, &y, ms);
+
+    if (pDev->coreEvents) {
+        cp->valuator->lastx = x;
+        cp->valuator->lasty = y;
+    }
+    pDev->valuator->lastx = x;
+    pDev->valuator->lasty = y;
+
+    if (type == MotionNotify) {
+        kbp->type = DeviceMotionNotify;
+    }
+    else {
+        if (type == ButtonPress)
+            kbp->type = DeviceButtonPress;
+        else if (type == ButtonRelease)
+            kbp->type = DeviceButtonRelease;
+        kbp->detail = pDev->button->map[buttons];
+    }
+
+    kbp->root_x = x;
+    kbp->root_y = y;
+
+    if (final_valuator > 2 && sendValuators) {
+        kbp->deviceid |= MORE_EVENTS;
+        for (i = first_valuator; i < final_valuator; i += 6) {
+            xv = (deviceValuator *) ++events;
+            xv->type = DeviceValuator;
+            xv->first_valuator = i;
+            xv->num_valuators = num_valuators;
+            xv->deviceid = kbp->deviceid;
+            switch (final_valuator - i) {
+            case 6:
+                xv->valuator5 = valuators[i+5];
+            case 5:
+                xv->valuator4 = valuators[i+4];
+            case 4:
+                xv->valuator3 = valuators[i+3];
+            case 3:
+                xv->valuator2 = valuators[i+2];
+            case 2:
+                /* x and y may have been accelerated. */
+                if (i == 0)
+                    xv->valuator1 = kbp->root_y;
+                else
+                    xv->valuator1 = valuators[i+1];
+            case 1:
+                /* x and y may have been accelerated. */
+                if (i == 0)
+                    xv->valuator0 = kbp->root_x;
+                else
+                    xv->valuator0 = valuators[i];
+            }
+        }
+    }
+
+    if (pDev->coreEvents) {
+        events++;
+        events->u.u.type = type;
+        events->u.keyButtonPointer.time = ms;
+        events->u.keyButtonPointer.rootX = x;
+        events->u.keyButtonPointer.rootY = y;
+
+        if (type == ButtonPress || type == ButtonRelease) {
+            /* We hijack SetPointerMapping to work on all core-sending
+             * devices, so we use the device-specific map here instead of
+             * the core one. */
+            events->u.u.detail = pDev->button->map[buttons];
+        }
+        else {
+            events->u.u.detail = 0;
+        }
+
+        if (inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr !=
+            pDev)
+            inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
+    }
+
+    return num_events;
+}
diff-tree 6afc7c284690b1e2bb7544b5bc4f31a3f6a05519 (from 93302452e737bd91a893eb495592538d40d921e5)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Oct 14 15:54:35 2006 +0300

    dix/devices: remove XACE merge debris

diff --git a/dix/devices.c b/dix/devices.c
index 09e36c7..bf8c58a 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1438,12 +1438,6 @@ DoChangeKeyboardControl (ClientPtr clien
     BITS32 index2;
     int mask = vmask, i;
 
-    REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
-    vmask = stuff->mask;
-    if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
-	return BadLength;
-
-    vlist = (XID *)&stuff[1];		/* first word of values */
     ctrl = keybd->kbdfeed->ctrl;
     while (vmask) {
 	index2 = (BITS32) lowbit (vmask);
diff-tree 93302452e737bd91a893eb495592538d40d921e5 (from 335b503c5e7041bb0c44611e496d1c46f554e630)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Oct 14 15:54:12 2006 +0300

    XkbCopyKeymap: add geometry support
    Add a first cut at geometry support, which seems to generally work.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 86983c8..9a3be31 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -964,13 +964,22 @@ XkbConvertCase(register KeySym sym, KeyS
  * Returns TRUE on success, or FALSE on failure.  If this function fails,
  * dst may be in an inconsistent state: all its pointers are guaranteed
  * to remain valid, but part of the map may be from src and part from dst.
+ *
+ * FIXME: This function wants to be broken up into multiple functions.
  */
 Bool
 XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
 {
-    int i = 0, j = 0;
+    int i = 0, j = 0, k = 0;
     void *tmp = NULL;
+    XkbColorPtr scolor = NULL, dcolor = NULL;
+    XkbDoodadPtr sdoodad = NULL, ddoodad = NULL;
     XkbKeyTypePtr stype = NULL, dtype = NULL;
+    XkbOutlinePtr soutline = NULL, doutline = NULL;
+    XkbPropertyPtr sprop = NULL, dprop = NULL;
+    XkbRowPtr srow = NULL, drow = NULL;
+    XkbSectionPtr ssection = NULL, dsection = NULL;
+    XkbShapePtr sshape = NULL, dshape = NULL;
     DeviceIntPtr pDev = NULL, tmpDev = NULL;
     xkbMapNotify mn;
     xkbNewKeyboardNotify nkn;
@@ -1456,19 +1465,491 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
     }
 
     /* geometry */
-    /* not implemented yet because oh god the pain. */
-#if 0
     if (src->geom) {
         /* properties */
+        if (src->geom->num_properties) {
+            if (src->geom->num_properties != dst->geom->sz_properties) {
+                if (src->geom->num_properties < dst->geom->sz_properties) {
+                    for (i = src->geom->num_properties,
+                          dprop = dst->geom->properties +
+                                  src->geom->num_properties;
+                         i < dst->geom->num_properties;
+                         i++, dprop++) {
+                        xfree(dprop->name);
+                        xfree(dprop->value);
+                    }
+                }
+
+                if (dst->geom->sz_properties)
+                    tmp = xrealloc(dst->geom->properties,
+                                   src->geom->num_properties *
+                                    sizeof(XkbPropertyRec));
+                else
+                    tmp = xalloc(src->geom->num_properties *
+                                  sizeof(XkbPropertyRec));
+                if (!tmp)
+                    return FALSE;
+                dst->geom->properties = tmp;
+            }
+
+            dst->geom->sz_properties = src->geom->num_properties;
+
+            if (dst->geom->sz_properties > dst->geom->num_properties) {
+                bzero(dst->geom->properties + dst->geom->num_properties,
+                      (dst->geom->sz_properties - dst->geom->num_properties) *
+                      sizeof(XkbPropertyRec));
+            }
+
+            for (i = 0,
+                  sprop = src->geom->properties,
+                  dprop = dst->geom->properties;
+                 i < src->geom->num_properties;
+                 i++, sprop++, dprop++) {
+                if (i < dst->geom->num_properties) {
+                    if (strlen(sprop->name) != strlen(dprop->name)) {
+                        tmp = xrealloc(dprop->name, strlen(sprop->name) + 1);
+                        if (!tmp)
+                            return FALSE;
+                        dprop->name = tmp;
+                    }
+                    if (strlen(sprop->value) != strlen(dprop->value)) {
+                        tmp = xrealloc(dprop->value, strlen(sprop->value) + 1);
+                        if (!tmp)
+                            return FALSE;
+                        dprop->value = tmp;
+                    }
+                    strcpy(dprop->name, sprop->name);
+                    strcpy(dprop->value, sprop->value);
+                }
+                else {
+                    dprop->name = xstrdup(sprop->name);
+                    dprop->value = xstrdup(sprop->value);
+                }
+            }
+
+            dst->geom->num_properties = dst->geom->sz_properties;
+        }
+        else {
+            if (dst->geom->sz_properties) {
+                for (i = 0, dprop = dst->geom->properties;
+                     i < dst->geom->num_properties;
+                     i++, dprop++) {
+                    xfree(dprop->name);
+                    xfree(dprop->value);
+                }
+                xfree(dst->geom->properties);
+                dst->geom->properties = NULL;
+            }
+
+            dst->geom->num_properties = 0;
+            dst->geom->sz_properties = 0;
+        }
+
         /* colors */
+        if (src->geom->num_colors) {
+            if (src->geom->num_colors != dst->geom->sz_colors) {
+                if (src->geom->num_colors < dst->geom->sz_colors) {
+                    for (i = src->geom->num_colors,
+                          dcolor = dst->geom->colors +
+                                   src->geom->num_colors;
+                         i < dst->geom->num_colors;
+                         i++, dcolor++) {
+                        xfree(dcolor->spec);
+                    }
+                }
+
+                if (dst->geom->sz_colors)
+                    tmp = xrealloc(dst->geom->colors,
+                                   src->geom->num_colors *
+                                    sizeof(XkbColorRec));
+                else
+                    tmp = xalloc(src->geom->num_colors *
+                                  sizeof(XkbColorRec));
+                if (!tmp)
+                    return FALSE;
+                dst->geom->colors = tmp;
+            }
+
+            dst->geom->sz_colors = src->geom->num_colors;
+
+            if (dst->geom->sz_colors > dst->geom->num_colors) {
+                bzero(dst->geom->colors + dst->geom->num_colors,
+                      (dst->geom->sz_colors - dst->geom->num_colors) *
+                      sizeof(XkbColorRec));
+            }
+
+            for (i = 0,
+                  scolor = src->geom->colors,
+                  dcolor = dst->geom->colors;
+                 i < src->geom->num_colors;
+                 i++, scolor++, dcolor++) {
+                if (i < dst->geom->num_colors) {
+                    if (strlen(scolor->spec) != strlen(dcolor->spec)) {
+                        tmp = xrealloc(dcolor->spec, strlen(scolor->spec) + 1);
+                        if (!tmp)
+                            return FALSE;
+                        dcolor->spec = tmp;
+                    }
+                    strcpy(dcolor->spec, scolor->spec);
+                }
+                else {
+                    dcolor->spec = xstrdup(scolor->spec);
+                }
+            }
+
+            dst->geom->num_colors = dst->geom->sz_colors;
+        }
+        else {
+            if (dst->geom->sz_colors) {
+                for (i = 0, dcolor = dst->geom->colors;
+                     i < dst->geom->num_colors;
+                     i++, dcolor++) {
+                    xfree(dcolor->spec);
+                }
+                xfree(dst->geom->colors);
+                dst->geom->colors = NULL;
+            }
+
+            dst->geom->num_colors = 0;
+            dst->geom->sz_colors = 0;
+        }
+
         /* shapes */
+        /* shapes break down into outlines, which break down into points. */
+        if (dst->geom->num_shapes) {
+            for (i = 0, dshape = dst->geom->shapes;
+                 i < dst->geom->num_shapes;
+                 i++, dshape++) {
+                for (j = 0, doutline = dshape->outlines;
+                     j < dshape->num_outlines;
+                     j++, doutline++) {
+                    if (doutline->sz_points)
+                        xfree(doutline->points);
+                }
+
+                if (dshape->sz_outlines) {
+                    xfree(dshape->outlines);
+                    dshape->outlines = NULL;
+                }
+
+                dshape->num_outlines = 0;
+                dshape->sz_outlines = 0;
+            }
+        }
+
+        if (src->geom->num_shapes) {
+            tmp = xcalloc(src->geom->num_shapes, sizeof(XkbShapeRec));
+            if (!tmp)
+                return FALSE;
+            dst->geom->shapes = tmp;
+
+            for (i = 0, sshape = src->geom->shapes, dshape = dst->geom->shapes;
+                 i < src->geom->num_shapes;
+                 i++) {
+                if (sshape->num_outlines) {
+                    tmp = xcalloc(sshape->num_outlines, sizeof(XkbOutlineRec));
+                    if (!tmp)
+                        return FALSE;
+                    dshape->outlines = tmp;
+                    
+                    for (j = 0,
+                          soutline = sshape->outlines,
+                          doutline = dshape->outlines;
+                         j < sshape->num_outlines;
+                         j++) {
+                        if (soutline->num_points) {
+                            tmp = xalloc(soutline->num_points *
+                                          sizeof(XkbPointRec));
+                            if (!tmp)
+                                return FALSE;
+                            doutline->points = tmp;
+
+                            memcpy(doutline->points, soutline->points,
+                                   soutline->num_points * sizeof(XkbPointRec));
+                        }
+
+                        doutline->num_points = soutline->num_points;
+                        doutline->sz_points = soutline->sz_points;
+                    }
+                }
+
+                dshape->num_outlines = sshape->num_outlines;
+                dshape->sz_outlines = sshape->num_outlines;
+            }
+
+            dst->geom->num_shapes = src->geom->num_shapes;
+            dst->geom->sz_shapes = src->geom->num_shapes;
+        }
+        else {
+            if (dst->geom->sz_shapes) {
+                xfree(dst->geom->shapes);
+                dst->geom->shapes = NULL;
+            }
+            
+            dst->geom->num_shapes = 0;
+            dst->geom->sz_shapes = 0;
+        }
+
         /* sections */
+        /* sections break down into doodads, and also into rows, which break
+         * down into keys. */
+        if (dst->geom->num_sections) {
+            for (i = 0, dsection = dst->geom->sections;
+                 i < dst->geom->num_sections;
+                 i++, dsection++) {
+                for (j = 0, drow = dsection->rows;
+                     j < dsection->num_rows;
+                     j++, drow++) {
+                    if (drow->num_keys)
+                        xfree(drow->keys);
+                }
+
+                if (dsection->num_rows)
+                    xfree(dsection->rows);
+
+                /* cut and waste from geom/doodad below. */
+                for (j = 0, ddoodad = dsection->doodads;
+                     j < dsection->num_doodads;
+                     j++, ddoodad++) {
+                    if (ddoodad->any.type == XkbTextDoodad) {
+                        if (ddoodad->text.text) {
+                            xfree(ddoodad->text.text);
+                            ddoodad->text.text = NULL;
+                        }
+                        if (ddoodad->text.font) {
+                            xfree(ddoodad->text.font);
+                            ddoodad->text.font = NULL;
+                        }
+                     }
+                     else if (ddoodad->any.type == XkbLogoDoodad) {
+                        if (ddoodad->logo.logo_name) {
+                            xfree(ddoodad->logo.logo_name);
+                            ddoodad->logo.logo_name = NULL;
+                        }
+                    }
+                }
+
+                if (dsection->num_doodads)
+                    xfree(dsection->doodads);
+            }
+
+            dst->geom->num_sections = 0;
+        }
+
+        if (src->geom->num_sections) {
+            if (dst->geom->sz_sections)
+                tmp = xrealloc(dst->geom->sections,
+                               src->geom->num_sections *
+                                sizeof(XkbSectionRec));
+            else
+                tmp = xalloc(src->geom->num_sections * sizeof(XkbSectionRec));
+            if (!tmp)
+                return FALSE;
+            dst->geom->sections = tmp;
+
+            for (i = 0,
+                  ssection = src->geom->sections,
+                  dsection = dst->geom->sections;
+                 i < src->geom->num_sections;
+                 i++, ssection++, dsection++) {
+                if (ssection->num_rows) {
+                    tmp = xcalloc(ssection->num_rows, sizeof(XkbRowRec));
+                    if (!tmp)
+                        return FALSE;
+                    dsection->rows = tmp;
+                }
+                for (j = 0, srow = ssection->rows, drow = dsection->rows;
+                     j < ssection->num_rows;
+                     j++, srow++, drow++) {
+                    if (srow->num_keys) {
+                        tmp = xalloc(srow->num_keys * sizeof(XkbKeyRec));
+                        if (!tmp)
+                            return FALSE;
+                        drow->keys = tmp;
+                        memcpy(drow->keys, srow->keys,
+                               srow->num_keys * sizeof(XkbKeyRec));
+                    }
+                    drow->num_keys = srow->num_keys;
+                    drow->sz_keys = srow->num_keys;
+                }
+
+                if (ssection->num_doodads) {
+                    tmp = xcalloc(ssection->num_doodads, sizeof(XkbDoodadRec));
+                    if (!tmp)
+                        return FALSE;
+                    dsection->doodads = tmp;
+                }
+                for (k = 0,
+                      sdoodad = ssection->doodads,
+                      ddoodad = dsection->doodads;
+                     k < ssection->num_doodads;
+                     k++, sdoodad++, ddoodad++) {
+                    if (sdoodad->any.type == XkbTextDoodad) {
+                        if (sdoodad->text.text)
+                            ddoodad->text.text =
+                             xstrdup(sdoodad->text.text);
+                        if (sdoodad->text.font)
+                            ddoodad->text.font =
+                             xstrdup(sdoodad->text.font);
+                    }
+                    else if (sdoodad->any.type == XkbLogoDoodad) {
+                        if (sdoodad->logo.logo_name)
+                            ddoodad->logo.logo_name =
+                             xstrdup(sdoodad->logo.logo_name);
+                    }
+                    ddoodad->any.type = sdoodad->any.type;
+                }
+                dsection->num_doodads = ssection->num_doodads;
+                dsection->sz_doodads = ssection->num_doodads;
+            }
+        }
+        else {
+            if (dst->geom->sz_sections) {
+                xfree(dst->geom->sections);
+                dst->geom->sections = NULL;
+            }
+
+            dst->geom->num_sections = 0;
+            dst->geom->sz_sections = 0;
+        }
+
         /* doodads */
+        if (dst->geom->num_doodads) {
+            for (i = src->geom->num_doodads,
+                  ddoodad = dst->geom->doodads +
+                             src->geom->num_doodads;
+                 i < dst->geom->num_doodads;
+                 i++, ddoodad++) {
+                 if (ddoodad->any.type == XkbTextDoodad) {
+                    if (ddoodad->text.text) {
+                        xfree(ddoodad->text.text);
+                        ddoodad->text.text = NULL;
+                    }
+                    if (ddoodad->text.font) {
+                        xfree(ddoodad->text.font);
+                        ddoodad->text.font = NULL;
+                    }
+                 }
+                 else if (ddoodad->any.type == XkbLogoDoodad) {
+                    if (ddoodad->logo.logo_name) {
+                        xfree(ddoodad->logo.logo_name);
+                        ddoodad->logo.logo_name = NULL;
+                    }
+                }
+            }
+        }
+
+        if (src->geom->num_doodads) {
+            if (dst->geom->sz_doodads)
+                tmp = xrealloc(dst->geom->doodads,
+                               src->geom->num_doodads *
+                                sizeof(XkbDoodadRec));
+            else
+                tmp = xalloc(src->geom->num_doodads *
+                              sizeof(XkbDoodadRec));
+            if (!tmp)
+                return FALSE;
+            bzero(tmp, src->geom->num_doodads * sizeof(XkbDoodadRec));
+            dst->geom->doodads = tmp;
+
+            dst->geom->sz_doodads = src->geom->num_doodads;
+
+            for (i = 0,
+                  sdoodad = src->geom->doodads,
+                  ddoodad = dst->geom->doodads;
+                 i < src->geom->num_doodads;
+                 i++, sdoodad++, ddoodad++) {
+                ddoodad->any.type = sdoodad->any.type;
+                if (sdoodad->any.type == XkbTextDoodad) {
+                    if (sdoodad->text.text)
+                        ddoodad->text.text = xstrdup(sdoodad->text.text);
+                    if (sdoodad->text.font)
+                        ddoodad->text.font = xstrdup(sdoodad->text.font);
+                }
+                else if (sdoodad->any.type == XkbLogoDoodad) {
+                    if (sdoodad->logo.logo_name)
+                        ddoodad->logo.logo_name =
+                          xstrdup(sdoodad->logo.logo_name);
+                }
+            }
+
+            dst->geom->num_doodads = dst->geom->sz_doodads;
+        }
+        else {
+            if (dst->geom->sz_doodads) {
+                xfree(dst->geom->doodads);
+                dst->geom->doodads = NULL;
+            }
+
+            dst->geom->num_doodads = 0;
+            dst->geom->sz_doodads = 0;
+        }
+
         /* key aliases */
-        /* font?!? */
+        if (src->geom->num_key_aliases) {
+            if (src->geom->num_key_aliases != dst->geom->sz_key_aliases) {
+                if (dst->geom->sz_key_aliases)
+                    tmp = xrealloc(dst->geom->key_aliases,
+                                   src->geom->num_key_aliases *
+                                    2 * XkbKeyNameLength);
+                else
+                    tmp = xalloc(src->geom->num_key_aliases *
+                                  2 * XkbKeyNameLength);
+                if (!tmp)
+                    return FALSE;
+                dst->geom->key_aliases = tmp;
+
+                dst->geom->sz_key_aliases = src->geom->num_key_aliases;
+            }
+
+            memcpy(dst->geom->key_aliases, src->geom->key_aliases,
+                   src->geom->num_key_aliases * 2 * XkbKeyNameLength);
+
+            dst->geom->num_key_aliases = dst->geom->sz_key_aliases;
+        }
+        else {
+            if (dst->geom->sz_key_aliases) {
+                xfree(dst->geom->key_aliases);
+                dst->geom->key_aliases = NULL;
+            }
+            dst->geom->num_key_aliases = 0;
+            dst->geom->sz_key_aliases = 0;
+        }
+        
+        /* font */
+        if (src->geom->label_font) {
+            if (strlen(src->geom->label_font) !=
+                strlen(dst->geom->label_font)) {
+                if (dst->geom->label_font)
+                    tmp = xrealloc(dst->geom->label_font,
+                                   strlen(src->geom->label_font));
+                else
+                    tmp = xalloc(strlen(src->geom->label_font));
+                if (!tmp)
+                    return FALSE;
+                dst->geom->label_font = tmp;
+            }
+
+            strcpy(dst->geom->label_font, src->geom->label_font);
+            i = XkbGeomColorIndex(src->geom, src->geom->label_color);
+            dst->geom->label_color = &(src->geom->colors[i]);
+            i = XkbGeomColorIndex(src->geom, src->geom->base_color);
+            dst->geom->base_color = &(src->geom->colors[i]);
+        }
+        else {
+            if (dst->geom->label_font) {
+                xfree(dst->geom->label_font);
+                dst->geom->label_font = NULL;
+            }
+            dst->geom->label_color = NULL;
+            dst->geom->base_color = NULL;
+        }
+
+        dst->geom->name = src->geom->name;
+        dst->geom->width_mm = src->geom->width_mm;
+        dst->geom->height_mm = src->geom->height_mm;
     }
     else
-#endif
     {
         if (dst->geom) {
             /* I LOVE THE DIFFERENT CALL SIGNATURE.  REALLY, I DO. */
diff-tree b9108a13fc126d97c0393f911a1d9292563444ce (from cf948b7b04dfeb61a294889027b9a54f6b9b478e)
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Fri Oct 13 19:05:28 2006 -0700

    Make sure xorgcfg files are included even when dist made with --disable-xorgcfg

diff --git a/hw/xfree86/utils/xorgcfg/Makefile.am b/hw/xfree86/utils/xorgcfg/Makefile.am
index 73e4042..309ed5c 100644
--- a/hw/xfree86/utils/xorgcfg/Makefile.am
+++ b/hw/xfree86/utils/xorgcfg/Makefile.am
@@ -56,6 +56,7 @@ endif
 if NEED_STRLCAT
 STRL_SRCS = $(top_srcdir)/os/strlcat.c $(top_srcdir)/os/strlcpy.c
 endif
+endif BUILD_XORGCFG
 
 xorgcfg_SOURCES =	\
         accessx.c \
@@ -95,10 +96,7 @@ xorgcfg_SOURCES =	\
         xf86config.h \
 	$(STRL_SRCS)
 
-XBMdir = $(includedir)/X11/bitmaps
-XPMdir = $(includedir)/X11/pixmaps
-
-XBM_DATA = \
+BITMAPS = \
         card.xbm \
         keyboard.xbm \
         monitor.xbm \
@@ -112,7 +110,7 @@ XBM_DATA = \
         shorter.xbm \
         taller.xbm
 
-XPM_DATA = \
+PIXMAPS = \
         card.xpm \
         computer.xpm \
         keyboard.xpm \
@@ -122,6 +120,13 @@ XPM_DATA = \
 # Rules needed to cpp man page & app-defaults
 include $(top_srcdir)/cpprules.in
 
+if BUILD_XORGCFG
+XBMdir = $(includedir)/X11/bitmaps
+XPMdir = $(includedir)/X11/pixmaps
+
+XBM_DATA = $(BITMAPS)
+XPM_DATA = $(PIXMAPS)
+
 # App default files  (*.ad)
 
 appdefaultdir = @APPDEFAULTDIR@
@@ -146,7 +151,6 @@ appman_DATA = $(appman_PRE:man=@APP_MAN_
 
 all-local: $(appman_PRE) $(appman_DATA)
 
-EXTRA_DIST = $(XBM_DATA) $(XPM_DATA) XOrgCfg.pre xorgcfg.man.pre
 BUILT_SOURCES = $(appman_PRE)
 CLEANFILES = $(APPDEFAULTFILES) $(BUILT_SOURCES) $(appman_DATA)
 
@@ -156,4 +160,6 @@ SUFFIXES += .$(APP_MAN_SUFFIX) .man
 	-rm -f $@
 	$(LN_S) $< $@
 
-endif
+endif BUILD_XORGCFG
+
+EXTRA_DIST = $(BITMAPS) $(PIXMAPS) XOrgCfg.pre xorgcfg.man.pre
diff-tree 054f8cd2675a80b14bc1ce266377fcfee2335cee (from 1178796a4dff5ebf0bd9fb3cacb35be9709b41e5)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Fri Oct 13 17:34:53 2006 -0700

    Limit pointer to valid crtc areas. Add event swapping. Fix change tracking.
    
    Add function to keep pointer within valid crtc areas.
    Finish event delivery and swapping code.
    Separate configuration from layout changes to send correct events.

diff --git a/randr/Makefile.am b/randr/Makefile.am
index 91c4bc6..9bf0e65 100644
--- a/randr/Makefile.am
+++ b/randr/Makefile.am
@@ -15,6 +15,7 @@ librandr_la_SOURCES =	\
 	rrinfo.c	\
 	rrmode.c	\
 	rroutput.c	\
+	rrpointer.c	\
 	rrproperty.c	\
 	rrscreen.c	\
 	rrsdispatch.c	\
diff --git a/randr/mirandr.c b/randr/mirandr.c
index 918e55d..fab0fd1 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -84,6 +84,9 @@ miRandRInit (ScreenPtr pScreen)
     pScrPriv->rrGetInfo = miRRGetInfo;
 #if RANDR_12_INTERFACE
     pScrPriv->rrCrtcSet = miRRCrtcSet;
+    pScrPriv->rrCrtcSetGamma = miRRCrtcSetGamma;
+    pScrPriv->rrOutputSetProperty = miRROutput
+    
     
     RRScreenSetSizeRange (pScreen,
 			  pScreen->width, pScreen->height,
diff --git a/randr/randr.c b/randr/randr.c
index 35f9a4c..b422efe 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -130,38 +130,71 @@ SRRScreenChangeNotifyEvent(xRRScreenChan
     cpswaps(from->subpixelOrder, to->subpixelOrder);
 }
 
-#if 0
 static void
-SRRMonitorChangeNotifyEvent(xRRMonitorChangeNotifyEvent *from,
-			    xRRMonitorChangeNotifyEvent *to)
+SRRCrtcChangeNotifyEvent(xRRCrtcChangeNotifyEvent *from,
+			 xRRCrtcChangeNotifyEvent *to)
 {
     to->type = from->type;
     to->subCode = from->subCode;
     cpswaps(from->sequenceNumber, to->sequenceNumber);
     cpswapl(from->timestamp, to->timestamp);
-    cpswapl(from->configTimestamp, to->configTimestamp);
-    cpswapl(from->root, to->root);
     cpswapl(from->window, to->window);
-    cpswaps(from->monitor, to->monitor);
-    cpswaps(from->modeID, to->modeID);
+    cpswapl(from->crtc, to->crtc);
+    cpswapl(from->mode, to->mode);
+    cpswapl(from->window, to->window);
     cpswaps(from->rotation, to->rotation);
-    cpswaps(from->subpixelOrder, to->subpixelOrder);
     cpswaps(from->x, to->x);
     cpswaps(from->y, to->y);
+    cpswaps(from->width, to->width);
+    cpswaps(from->height, to->height);
+}
+
+static void
+SRROutputChangeNotifyEvent(xRROutputChangeNotifyEvent *from,
+			   xRROutputChangeNotifyEvent *to)
+{
+    to->type = from->type;
+    to->subCode = from->subCode;
+    cpswaps(from->sequenceNumber, to->sequenceNumber);
+    cpswapl(from->timestamp, to->timestamp);
+    cpswapl(from->configTimestamp, to->configTimestamp);
+    cpswapl(from->window, to->window);
+    cpswapl(from->output, to->output);
+    cpswapl(from->crtc, to->crtc);
+    cpswapl(from->mode, to->mode);
+    cpswaps(from->rotation, to->rotation);
+}
+
+static void
+SRROutputPropertyNotifyEvent(xRROutputPropertyNotifyEvent *from,
+			     xRROutputPropertyNotifyEvent *to)
+{
+    to->type = from->type;
+    to->subCode = from->subCode;
+    cpswaps(from->sequenceNumber, to->sequenceNumber);
+    cpswapl(from->window, to->window);
+    cpswapl(from->output, to->output);
+    cpswapl(from->atom, to->atom);
+    cpswapl(from->timestamp, to->timestamp);
 }
-#endif
 
 static void
 SRRNotifyEvent (xEvent *from,
 		xEvent *to)
 {
     switch (from->u.u.detail) {
-#if 0
-    case RRNotify_MonitorChange:
-	SRRMonitorChangeNotifyEvent ((xRRMonitorChangeNotifyEvent *) from,
-				     (xRRMonitorChangeNotifyEvent *) to);
+    case RRNotify_CrtcChange:
+	SRRCrtcChangeNotifyEvent ((xRRCrtcChangeNotifyEvent *) from,
+				  (xRRCrtcChangeNotifyEvent *) to);
+	break;
+    case RRNotify_OutputChange:
+	SRROutputChangeNotifyEvent ((xRROutputChangeNotifyEvent *) from,
+				    (xRROutputChangeNotifyEvent *) to);
+	break;
+    case RRNotify_OutputProperty:
+	SRROutputPropertyNotifyEvent ((xRROutputPropertyNotifyEvent *) from,
+				      (xRROutputPropertyNotifyEvent *) to);
 	break;
-#endif
     default:
 	break;
     }
@@ -359,6 +392,9 @@ TellChanged (WindowPtr pWin, pointer val
     return WT_WALKCHILDREN;
 }
 
+/*
+ * Something changed; send events and adjust pointer position
+ */
 void
 RRTellChanged (ScreenPtr pScreen)
 {
@@ -369,12 +405,18 @@ RRTellChanged (ScreenPtr pScreen)
     {
 	UpdateCurrentTime ();
 	pScrPriv->lastConfigTime = currentTime;
-	WalkTree (pScreen, TellChanged, (pointer) pScreen);
 	pScrPriv->changed = FALSE;
+	WalkTree (pScreen, TellChanged, (pointer) pScreen);
 	for (i = 0; i < pScrPriv->numOutputs; i++)
 	    pScrPriv->outputs[i]->changed = FALSE;
 	for (i = 0; i < pScrPriv->numCrtcs; i++)
 	    pScrPriv->crtcs[i]->changed = FALSE;
+	if (pScrPriv->layoutChanged)
+	{
+	    pScrPriv->layoutChanged = FALSE;
+	    RRPointerScreenConfigured (pScreen);
+	    RRSendConfigNotify (pScreen);
+	}
     }
 }
 
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 6690556..a8a9950 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -202,10 +202,11 @@ typedef struct _rrScrPriv {
     TimeStamp		    lastSetTime;	/* last changed by client */
     TimeStamp		    lastConfigTime;	/* possible configs changed */
     RRCloseScreenProcPtr    CloseScreen;
-    Bool		    changed;
+    Bool		    changed;		/* some config changed */
     CARD16		    minWidth, minHeight;
     CARD16		    maxWidth, maxHeight;
     CARD16		    width, height;	/* last known screen size */
+    Bool		    layoutChanged;	/* screen layout changed */
 
     /* modes, outputs and crtcs */
     int			    numModes;
@@ -217,6 +218,9 @@ typedef struct _rrScrPriv {
     int			    numCrtcs;
     RRCrtcPtr		    *crtcs;
 
+    /* Last known pointer position */
+    RRCrtcPtr		    pointerCrtc;
+
 #ifdef RANDR_10_INTERFACE
     /*
      * Configuration information
@@ -439,6 +443,14 @@ RRSetScreenConfig (ScreenPtr		pScreen,
 #endif					
 
 /* rrcrtc.c */
+
+/*
+ * Notify the CRTC of some change; layoutChanged indicates that
+ * some position or size element changed
+ */
+void
+RRCrtcChanged (RRCrtcPtr crtc, Bool layoutChanged);
+
 /*
  * Create a CRTC
  */
@@ -575,6 +587,13 @@ int
 ProcRRDeleteOutputMode (ClientPtr client);
 
 /* rroutput.c */
+
+/*
+ * Notify the output of some change
+ */
+void
+RROutputChanged (RROutputPtr output);
+
 /*
  * Create an output
  */
@@ -638,6 +657,13 @@ ProcRRGetOutputInfo (ClientPtr client);
 Bool
 RROutputInit (void);
     
+/* rrpointer.c */
+void
+RRPointerMoved (ScreenPtr pScreen, int x, int y);
+
+void
+RRPointerScreenConfigured (ScreenPtr pScreen);
+
 /* rrproperty.c */
 
 void
@@ -668,3 +694,79 @@ void
 RRXineramaExtensionInit(void);
 
 #endif /* _RANDRSTR_H_ */
+
+/*
+ 
+randr extension implementation structure
+
+Query state:
+    ProcRRGetScreenInfo/ProcRRGetScreenResources
+	RRGetInfo
+ 
+	    • Request configuration from driver, either 1.0 or 1.2 style
+	    • These functions only record state changes, all
+	      other actions are pended until RRTellChanged is called
+ 
+	    ->rrGetInfo
+	    1.0:
+		RRRegisterSize
+		RRRegisterRate
+		RRSetCurrentConfig
+	    1.2:
+		RRScreenSetSizeRange
+		RROutputSetCrtcs
+		RROutputSetCrtc
+		RROutputSetPossibleOptions
+		RRSetCurrentOptions
+		RRModeGet
+		RROutputSetModes
+		RROutputSetConnection
+		RROutputSetSubpixelOrder
+		RROutputSetClones
+		RRCrtcNotify
+ 
+	• Must delay scanning configuration until after ->rrGetInfo returns
+	  because some drivers will call SetCurrentConfig in the middle
+	  of the ->rrGetInfo operation.
+ 
+	1.0:
+
+	    • Scan old configuration, mirror to new structures
+ 
+	    RRScanOldConfig
+		RRCrtcCreate
+		RROutputCreate
+		RROutputSetCrtcs
+		RROutputSetCrtc
+		RROutputSetConnection
+		RROutputSetSubpixelOrder
+		RROldModeAdd	• This adds modes one-at-a-time
+		    RRModeGet
+		RRCrtcNotify
+ 
+	• send events, reset pointer if necessary
+ 
+	RRTellChanged
+	    WalkTree (sending events)
+ 
+	    • when layout has changed:
+		RRPointerScreenConfigured
+		RRSendConfigNotify
+ 
+Asynchronous state setting (1.2 only)
+    When setting state asynchronously, the driver invokes the
+    ->rrGetInfo function and then calls RRTellChanged to flush
+    the changes to the clients and reset pointer if necessary
+
+Set state
+
+    ProcRRSetScreenConfig
+	RRCrtcSet
+	    1.2:
+		->rrCrtcSet
+		    RRCrtcNotify
+	    1.0:
+		->rrSetConfig
+		RRCrtcNotify
+	    RRTellChanged
+ */
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index baefd3a..c662899 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -26,6 +26,24 @@
 RESTYPE	RRCrtcType;
 
 /*
+ * Notify the CRTC of some change
+ */
+void
+RRCrtcChanged (RRCrtcPtr crtc, Bool layoutChanged)
+{
+    ScreenPtr	pScreen = crtc->pScreen;
+    rrScrPriv(pScreen);
+
+    crtc->changed = TRUE;
+    pScrPriv->changed = TRUE;
+    /*
+     * Send ConfigureNotify on any layout change
+     */
+    if (layoutChanged)
+	pScrPriv->layoutChanged = TRUE;
+}
+
+/*
  * Create a CRTC
  */
 RRCrtcPtr
@@ -60,7 +78,7 @@ RRCrtcCreate (ScreenPtr	pScreen,
     crtc->numOutputs = 0;
     crtc->gammaSize = 0;
     crtc->gammaRed = crtc->gammaBlue = crtc->gammaGreen = NULL;
-    crtc->changed = TRUE;
+    crtc->changed = FALSE;
     crtc->devPrivate = devPrivate;
 
     if (!AddResource (crtc->id, RRCrtcType, (pointer) crtc))
@@ -68,7 +86,8 @@ RRCrtcCreate (ScreenPtr	pScreen,
 
     pScrPriv->crtcs = crtcs;
     pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc;
-    pScrPriv->changed = TRUE;
+
+    RRCrtcChanged (crtc, TRUE);
     return crtc;
 }
 
@@ -85,8 +104,6 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	      int	    numOutputs,
 	      RROutputPtr   *outputs)
 {
-    ScreenPtr	pScreen = crtc->pScreen;
-    rrScrPriv(pScreen);
     int	    i, j;
     
     /*
@@ -100,8 +117,8 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 		break;
 	if (j == crtc->numOutputs)
 	{
-	    outputs[i]->changed = TRUE;
-	    crtc->changed = TRUE;
+	    RROutputChanged (outputs[i]);
+	    RRCrtcChanged (crtc, FALSE);
 	}
     }
     /*
@@ -115,8 +132,8 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 		break;
 	if (i == numOutputs)
 	{
-	    crtc->outputs[j]->changed = TRUE;
-	    crtc->changed = TRUE;
+	    RROutputChanged (crtc->outputs[j]);
+	    RRCrtcChanged (crtc, FALSE);
 	}
     }
     /*
@@ -158,31 +175,22 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	    RRModeDestroy (crtc->mode);
 	crtc->mode = mode;
 	mode->refcnt++;
-	crtc->changed = TRUE;
+	RRCrtcChanged (crtc, TRUE);
     }
     if (x != crtc->x)
     {
 	crtc->x = x;
-	crtc->changed = TRUE;
+	RRCrtcChanged (crtc, TRUE);
     }
     if (y != crtc->y)
     {
 	crtc->y = y;
-	crtc->changed = TRUE;
+	RRCrtcChanged (crtc, TRUE);
     }
     if (rotation != crtc->rotation)
     {
 	crtc->rotation = rotation;
-	crtc->changed = TRUE;
-    }
-    /*
-     * Send events if anything changed
-     */
-    if (crtc->changed)
-    {
-	if (!pScrPriv->changed)
-	    RRSendConfigNotify (pScreen);
-	pScrPriv->changed = TRUE;
+	RRCrtcChanged (crtc, TRUE);
     }
     return TRUE;
 }
@@ -272,10 +280,11 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	 * Old 1.0 interface tied screen size to mode size
 	 */
 	if (ret)
-	    RRScreenSizeNotify (pScreen);
+	    RRCrtcNotify (crtc, mode, x, y, rotation, 
 	return ret;
     }
 #endif
+    RRTellChanged (pScreen);
     return FALSE;
 }
 
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 618ef1f..fc84ec1 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -25,6 +25,19 @@
 RESTYPE	RROutputType;
 
 /*
+ * Notify the output of some change
+ */
+void
+RROutputChanged (RROutputPtr output)
+{
+    ScreenPtr	pScreen = output->pScreen;
+    rrScrPriv (pScreen);
+
+    output->changed = TRUE;
+    pScrPriv->changed = TRUE;
+}
+
+/*
  * Create an output
  */
 
@@ -70,7 +83,7 @@ RROutputCreate (ScreenPtr   pScreen,
     output->numPreferred = 0;
     output->modes = NULL;
     output->properties = NULL;
-    output->changed = TRUE;
+    output->changed = FALSE;
     output->devPrivate = devPrivate;
     
     if (!AddResource (output->id, RROutputType, (pointer) output))
@@ -78,7 +91,7 @@ RROutputCreate (ScreenPtr   pScreen,
 
     pScrPriv->outputs = outputs;
     pScrPriv->outputs[pScrPriv->numOutputs++] = output;
-    pScrPriv->changed = TRUE;
+    RROutputChanged (output);
     return output;
 }
 
@@ -114,7 +127,7 @@ RROutputSetClones (RROutputPtr  output,
     memcpy (newClones, clones, numClones * sizeof (RROutputPtr));
     output->clones = newClones;
     output->numClones = numClones;
-    output->changed = TRUE;
+    RROutputChanged (output);
     return TRUE;
 }
 
@@ -158,7 +171,7 @@ RROutputSetModes (RROutputPtr	output,
     output->modes = newModes;
     output->numModes = numModes;
     output->numPreferred = numPreferred;
-    output->changed = TRUE;
+    RROutputChanged (output);
     return TRUE;
 }
 
@@ -191,7 +204,7 @@ RROutputSetCrtcs (RROutputPtr	output,
     memcpy (newCrtcs, crtcs, numCrtcs * sizeof (RRCrtcPtr));
     output->crtcs = newCrtcs;
     output->numCrtcs = numCrtcs;
-    output->changed = TRUE;
+    RROutputChanged (output);
     return TRUE;
 }
 
@@ -202,7 +215,7 @@ RROutputSetPossibleOptions (RROutputPtr	
     if (output->possibleOptions == possibleOptions)
 	return TRUE;
     output->possibleOptions = possibleOptions;
-    output->changed = TRUE;
+    RROutputChanged (output);
     return TRUE;
 }
 
@@ -212,7 +225,7 @@ RROutputSetCrtc (RROutputPtr output, RRC
     if (output->crtc == crtc)
 	return;
     output->crtc = crtc;
-    output->changed = TRUE;
+    RROutputChanged (output);
 }
 
 Bool
@@ -222,7 +235,7 @@ RROutputSetConnection (RROutputPtr  outp
     if (output->connection == connection)
 	return TRUE;
     output->connection = connection;
-    output->changed = TRUE;
+    RROutputChanged (output);
     return TRUE;
 }
 
@@ -234,7 +247,7 @@ RROutputSetSubpixelOrder (RROutputPtr ou
 	return TRUE;
 
     output->subpixelOrder = subpixelOrder;
-    output->changed = TRUE;
+    RROutputChanged (output);
     return TRUE;
 }
 
@@ -245,13 +258,41 @@ RROutputSetCurrentOptions (RROutputPtr o
     if (output->currentOptions == currentOptions)
 	return TRUE;
     output->currentOptions = currentOptions;
-    output->changed = TRUE;
+    RROutputChanged (output);
     return TRUE;
 }
 
 void
 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output)
 {
+    ScreenPtr pScreen = pWin->drawable.pScreen;
+    rrScrPriv (pScreen);
+    xRROutputChangeNotifyEvent	oe;
+    RRCrtcPtr	crtc = output->crtc;
+    RRModePtr	mode = crtc ? crtc->mode : 0;
+    
+    oe.type = RRNotify + RREventBase;
+    oe.subCode = RRNotify_OutputChange;
+    oe.sequenceNumber = client->sequence;
+    oe.timestamp = pScrPriv->lastSetTime.milliseconds;
+    oe.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+    oe.window = pWin->drawable.id;
+    oe.output = output->id;
+    if (crtc)
+    {
+	oe.crtc = crtc->id;
+	oe.mode = mode ? mode->mode.id : None;
+	oe.rotation = crtc->rotation;
+    }
+    else
+    {
+	oe.crtc = None;
+	oe.mode = None;
+	oe.rotation = RR_Rotate_0;
+    }
+    oe.connection = output->connection;
+    oe.subpixelOrder = output->subpixelOrder;
+    WriteEventsToClient (client, 1, (xEvent *) &oe);
 }
 
 /*
diff --git a/randr/rrpointer.c b/randr/rrpointer.c
new file mode 100644
index 0000000..7ba0460
--- /dev/null
+++ b/randr/rrpointer.c
@@ -0,0 +1,137 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+/*
+ * When the pointer moves, check to see if the specified position is outside
+ * any of theavailable CRTCs and move it to a 'sensible' place if so, where
+ * sensible is the closest monitor to the departing edge.
+ *
+ * Returns whether the position was adjusted
+ */
+
+static Bool
+RRCrtcContainsPosition (RRCrtcPtr crtc, int x, int y)
+{
+    RRModePtr   mode = crtc->mode;
+    
+    if (!mode)
+	return FALSE;
+    if (crtc->x <= x && x < crtc->x + mode->mode.width &&
+	crtc->y <= y && y < crtc->y + mode->mode.height)
+	return TRUE;
+    return FALSE;
+}
+
+/*
+ * Find the CRTC nearest the specified position, ignoring 'skip'
+ */
+static void
+RRPointerToNearestCrtc (ScreenPtr pScreen, int x, int y, RRCrtcPtr skip)
+{
+    rrScrPriv (pScreen);
+    int		c;
+    RRCrtcPtr	nearest = NULL;
+    int		best = 0;
+    int		best_dx = 0, best_dy = 0;
+    
+    for (c = 0; c < pScrPriv->numCrtcs; c++)
+    {
+	RRCrtcPtr   crtc = pScrPriv->crtcs[c];
+	RRModePtr   mode = crtc->mode;
+	int	    dx, dy;
+	int	    dist;
+
+	if (!mode)
+	    continue;
+	if (crtc == skip)
+	    continue;
+	if (x < crtc->x)
+	    dx = crtc->x - x;
+	else if (x > crtc->x + mode->mode.width)
+	    dx = x - (crtc->x + mode->mode.width);
+	else
+	    dx = 0;
+	if (y < crtc->y)
+	    dy = crtc->y - x;
+	else if (y > crtc->y + mode->mode.height)
+	    dy = y - (crtc->y + mode->mode.height);
+	else
+	    dy = 0;
+	dist = dx + dy;
+	if (!nearest || dist < best)
+	{
+	    nearest = crtc;
+	    best_dx = dx;
+	    best_dy = dy;
+	}
+    }
+    if (best_dx || best_dy)
+	(*pScreen->SetCursorPosition) (pScreen, x + best_dx, y + best_dy, TRUE);
+    pScrPriv->pointerCrtc = nearest;
+}
+
+void
+RRPointerMoved (ScreenPtr pScreen, int x, int y)
+{
+    rrScrPriv (pScreen);
+    RRCrtcPtr	pointerCrtc = pScrPriv->pointerCrtc;;
+    int	c;
+
+    /* Check last known CRTC */
+    if (pointerCrtc && RRCrtcContainsPosition (pointerCrtc, x, y))
+	return;
+    
+    /* Check all CRTCs */
+    for (c = 0; c < pScrPriv->numCrtcs; c++)
+    {
+	RRCrtcPtr   crtc = pScrPriv->crtcs[c];
+	
+	if (RRCrtcContainsPosition (crtc, x, y))
+	{
+	    /* Remember containing CRTC */
+	    pScrPriv->pointerCrtc = crtc;
+	    return;
+	}
+    }
+
+    /* None contain pointer, find nearest */
+    RRPointerToNearestCrtc (pScreen, x, y, pointerCrtc);
+}
+
+/*
+ * When the screen is reconfigured, move the pointer to the nearest
+ * CRTC
+ */
+void
+RRPointerScreenConfigured (ScreenPtr pScreen)
+{
+    WindowPtr	pRoot = GetCurrentRootWindow ();
+    ScreenPtr	pCurrentScreen = pRoot ? pRoot->drawable.pScreen : NULL;
+    int		x, y;
+
+    if (pScreen != pCurrentScreen)
+	return FALSE;
+    GetSpritePosition (&x, &y);
+    RRPointerToNearestCrtc (pScreen, x, y, NULL);
+}
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
index cdafb5c..44f1f0a 100644
--- a/randr/rrproperty.c
+++ b/randr/rrproperty.c
@@ -27,6 +27,7 @@
 static void
 RRDeliverEvent (ScreenPtr pScreen, xEvent *event, CARD32 mask)
 {
+    
 }
 
 void
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 7b53f04..6d38e96 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -164,10 +164,13 @@ RRScreenSizeNotify (ScreenPtr	pScreen)
     pScrPriv->width = pScreen->width;
     pScrPriv->height = pScreen->height;
     pScrPriv->changed = TRUE;
+    pScrPriv->sizeChanged = TRUE;
 
+    RRTellChanged (pScreen);
     RRSendConfigNotify (pScreen);
     RREditConnectionInfo (pScreen);
     
+    RRPointerScreenConfigured (pScreen);
     /*
      * Fix pointer bounds and location
      */
@@ -836,9 +839,37 @@ ProcRRSetScreenConfig (ClientPtr client)
 	goto sendReply;
     }
 
+    /*
+     * If the screen size is changing, adjust all of the other outputs
+     * to fit the new size, mirroring as much as possible
+     */
+    if (mode->mode.width != pScreen->width || 
+	mode->mode.height != pScreen->height)
+    {
+	int	c;
+
+	for (c = 0; c < pScrPriv->numCrtcs; c++)
+	{
+	    rep.status = RRCrtcSet (pScrPriv->->crtc, NULL, 0, 0, RR_Rotate_0,
+				    0, NULL);
+	    if (rep.status != Success)
+		goto sendReply;
+	}
+	if (!RRScreenSizeSet (pScreen, mode->mode.width, mode->mode.height,
+			      pScreen->mmWidth, pScreen->mmHeight))
+	{
+	    rep.status  RRSetConfigFailed;
+	    goto sendReply;
+	}
+    }
+    
     rep.status = RRCrtcSet (output.output->crtc, mode, 0, 0, stuff->rotation,
 			    1, &output);
     
+    /*
+     * XXX Configure other crtcs to mirror as much as possible
+     */
+    
 sendReply:
     
     if (pData)
diff-tree 335b503c5e7041bb0c44611e496d1c46f554e630 (from parents)
Merge: bd3d93be82d91e4cf35ae317dfd658d1706257ea cf948b7b04dfeb61a294889027b9a54f6b9b478e
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 13 18:10:45 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff --cc configure.ac
index e1342f1,7222106..7992d77
@@@ -417,9 -411,11 +417,11 @@@
  AC_ARG_ENABLE(glx-tls,        AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: disabled)]), [GLX_USE_TLS=$enableval], [GLX_USE_TLS=no])
  AC_ARG_ENABLE(dri,            AS_HELP_STRING([--enable-dri], [Build DRI extension (default: auto)]), [DRI=$enableval])
  AC_ARG_ENABLE(xinerama,	      AS_HELP_STRING([--disable-xinerama], [Build Xinerama extension (default: enabled)]), [XINERAMA=$enableval], [XINERAMA=yes])
 -AC_ARG_ENABLE(xf86vidmode,    AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: enabled)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=yes])
 -AC_ARG_ENABLE(xf86misc,       AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: enabled)]), [XF86MISC=$enableval], [XF86MISC=yes])
 +AC_ARG_ENABLE(xf86vidmode,    AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: auto)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=auto])
 +AC_ARG_ENABLE(xf86misc,       AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: auto)]), [XF86MISC=$enableval], [XF86MISC=auto])
- AC_ARG_ENABLE(xcsecurity,     AS_HELP_STRING([--disable-xcsecurity], [Build Security extension (default: enabled)]), [XCSECURITY=$enableval], [XCSECURITY=yes])
+ AC_ARG_ENABLE(xace,     AS_HELP_STRING([--disable-xace], [Build X-ACE extension (default: enabled)]), [XACE=$enableval], [XACE=yes])
+ AC_ARG_ENABLE(xcsecurity,     AS_HELP_STRING([--disable-xcsecurity], [Build Security extension (default: enabled)]), [XCSECURITY=$enableval], [XCSECURITY=$XACE])
+ AC_ARG_ENABLE(appgroup,       AS_HELP_STRING([--disable-appgroup], [Build XC-APPGROUP extension (default: enabled)]), [APPGROUP=$enableval], [APPGROUP=$XCSECURITY])
  AC_ARG_ENABLE(xcalibrate,     AS_HELP_STRING([--enable-xcalibrate], [Build XCalibrate extension (default: disabled)]), [XCALIBRATE=$enableval], [XCALIBRATE=no])
  AC_ARG_ENABLE(tslib,          AS_HELP_STRING([--enable-tslib], [Build kdrive tslib touchscreen support (default: disabled)]), [TSLIB=$enableval], [TSLIB=no])
  AC_ARG_ENABLE(xevie,          AS_HELP_STRING([--disable-xevie], [Build XEvIE extension (default: enabled)]), [XEVIE=$enableval], [XEVIE=yes])
diff --cc dix/devices.c
index 2149769,6075102..09e36c7
@@@ -1115,75 -909,6 +1115,78 @@@
      return TRUE;
  }
  
 +static int
 +DoSetModifierMapping(ClientPtr client, KeyCode *inputMap,
 +                     int numKeyPerModifier)
 +{
 +    DeviceIntPtr pDev = NULL;
 +    int i = 0, inputMapLen = numKeyPerModifier * 8;
 +
 +    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
 +        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
 +            for (i = 0; i < inputMapLen; i++) {
 +                /* Check that all the new modifiers fall within the advertised
 +                 * keycode range, and are okay with the DDX. */
 +                if (inputMap[i] && ((inputMap[i] < pDev->key->curKeySyms.minKeyCode ||
 +                                    inputMap[i] > pDev->key->curKeySyms.maxKeyCode) ||
 +                                    !LegalModifier(inputMap[i], pDev))) {
 +                    client->errorValue = inputMap[i];
 +                    return BadValue;
 +                }
 +            }
- #ifdef XCSECURITY
-             if (!SecurityCheckDeviceAccess(client, pDev, TRUE))
++
++#ifdef XACE
++            if (!XaceHook(XACE_DEVICE_ACCESS, client, pDev, TRUE))
 +                return BadAccess;
 +#endif 
++
 +            /* None of the modifiers (old or new) may be down while we change
 +             * the map. */
 +            if (!AllModifierKeysAreUp(pDev, pDev->key->modifierKeyMap,
 +                                      pDev->key->maxKeysPerModifier,
 +                                      inputMap, numKeyPerModifier) ||
 +                !AllModifierKeysAreUp(pDev, inputMap, numKeyPerModifier,
 +                                      pDev->key->modifierKeyMap,
 +                                      pDev->key->maxKeysPerModifier)) {
 +                return MappingBusy;
 +            }
 +        }
 +    }
 +
 +    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
++
 +        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
 +            bzero(pDev->key->modifierMap, MAP_LENGTH);
 +
 +            /* Annoyingly, we lack a modifierKeyMap size, so we have to just free
 +             * and re-alloc it every time. */
 +            if (pDev->key->modifierKeyMap)
 +                xfree(pDev->key->modifierKeyMap);
 +
 +            if (inputMapLen) {
 +                pDev->key->modifierKeyMap = (KeyCode *) xalloc(inputMapLen);
 +                if (!pDev->key->modifierKeyMap)
 +                    return BadAlloc;
 +
 +                memcpy(pDev->key->modifierKeyMap, inputMap, inputMapLen);
 +                pDev->key->maxKeysPerModifier = numKeyPerModifier;
 +
 +                for (i = 0; i < inputMapLen; i++) {
 +                    if (inputMap[i]) {
 +                        pDev->key->modifierMap[inputMap[i]] |=
 +                            (1 << (((unsigned int)i) / numKeyPerModifier));
 +                    }
 +                }
 +            }
 +            else {
 +                pDev->key->modifierKeyMap = NULL;
 +            }
 +        }
 +    }
 +
 +    return Success;
 +}
 +
  int 
  ProcSetModifierMapping(ClientPtr client)
  {
@@@ -1255,16 -1063,10 +1258,16 @@@
  	    client->errorValue = stuff->keySymsPerKeyCode;
  	    return BadValue;
      }
 +
- #ifdef XCSECURITY
+ #ifdef XACE
 -    if (!XaceHook(XACE_DEVICE_ACCESS, client, inputInfo.keyboard, TRUE))
 -	return BadAccess;
 +    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
 +        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
-             if (!SecurityCheckDeviceAccess(client, pDev, TRUE))
++            if (!XaceHook(XACE_DEVICE_ACCESS, client, pDev, TRUE))
 +                return BadAccess;
 +        }
 +    }
  #endif 
 +
      keysyms.minKeyCode = stuff->firstKeyCode;
      keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1;
      keysyms.mapWidth = stuff->keySymsPerKeyCode;
@@@ -1432,14 -1200,28 +1435,20 @@@
 -    DeviceIntPtr keybd = inputInfo.keyboard;
 -    XID *vlist;
      int t;
      int led = DO_ALL;
      int key = DO_ALL;
 -    BITS32 vmask, index2;
 -    int mask, i;
 -    REQUEST(xChangeKeyboardControlReq);
 +    BITS32 index2;
 +    int mask = vmask, i;
  
+     REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
+     vmask = stuff->mask;
+     if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
+ 	return BadLength;
 -#ifdef XACE
 -    if (!XaceHook(XACE_DEVICE_ACCESS, client, keybd, TRUE))
 -	return BadAccess;
 -#endif 
++
+     vlist = (XID *)&stuff[1];		/* first word of values */
      ctrl = keybd->kbdfeed->ctrl;
 -    while (vmask)
 -    {
 +    while (vmask) {
  	index2 = (BITS32) lowbit (vmask);
  	vmask &= ~index2;
 -	switch (index2)
 -	{
 +	switch (index2) {
  	case KBKeyClickPercent: 
  	    t = (INT8)*vlist;
  	    vlist++;
@@@ -1593,45 -1383,6 +1602,45 @@@
  } 
  
  int
 +ProcChangeKeyboardControl (ClientPtr client)
 +{
 +    XID *vlist;
 +    BITS32 vmask;
 +    int ret = Success, error = Success;
 +    DeviceIntPtr pDev = NULL;
 +    REQUEST(xChangeKeyboardControlReq);
 +
 +    REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
 +
 +    vmask = stuff->mask;
 +    vlist = (XID *)&stuff[1];
 +
 +    if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
 +	return BadLength;
 +
- #ifdef XCSECURITY
++#ifdef XACE
 +    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
 +        if ((pDev->coreEvents || pDev == inputInfo.keyboard) &&
 +            pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
-             if (!SecurityCheckDeviceAccess(client, pDev, TRUE))
++            if (!XaceHook(XACE_DEVICE_ACCESS, client, pDev, TRUE))
 +                return BadAccess;
 +        }
 +    }
 +#endif 
 +
 +    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
 +        if ((pDev->coreEvents || pDev == inputInfo.keyboard) &&
 +            pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
 +            ret = DoChangeKeyboardControl(client, pDev, vlist, vmask);
 +            if (ret != Success)
 +                error = ret;
 +        }
 +    }
 +
 +    return error;
 +}
 +
 +int
  ProcGetKeyboardControl (ClientPtr client)
  {
      int i;
diff --cc dix/events.c
index 646a9ba,c57a30e..ebc43b0
@@@ -131,17 -130,13 +131,17 @@@
  #endif
  #include "globals.h"
  
 +#include "mipointer.h"
 +
  #ifdef XKB
 +#include <X11/extensions/XKBproto.h>
  #include <X11/extensions/XKBsrv.h>
  extern Bool XkbFilterEvents(ClientPtr, int, xEvent *);
 +extern Bool XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies);
  #endif
  
- #ifdef XCSECURITY
- #include "securitysrv.h"
+ #ifdef XACE
+ #include "xace.h"
  #endif
  
  #ifdef XEVIE
diff --cc hw/xfree86/common/xf86Cursor.c
index ee42b75,8bb12ae..20905b0
@@@ -223,10 -229,11 +224,11 @@@
    if (mode->HDisplay > pScr->virtualX || mode->VDisplay > pScr->virtualY)
      return FALSE;
  
 -  pCursorScreen = miPointerCurrentScreen();
 +  pCursorScreen = miPointerGetScreen(inputInfo.pointer);
    if (pScreen == pCursorScreen)
 -    miPointerPosition(&px, &py);
 +    miPointerGetPosition(inputInfo.pointer, &px, &py);
  
+   sigstate = xf86BlockSIGIO ();
    xf86EnterServerState(SETUP);
    Switched = (*pScr->SwitchMode)(pScr->scrnIndex, mode, 0);
    xf86EnterServerState(OPERATING);
diff-tree cf948b7b04dfeb61a294889027b9a54f6b9b478e (from a6df780e4d3f90cc699b0b864bade03d6f15afd7)
Author: Alan Hourihane <alanh at fairlite.demon.co.uk>
Date:   Fri Oct 13 14:48:10 2006 +0100

    Block IO on switchmode just as we do for VT switching
    to avoid cursor movements signalling io.

diff --git a/hw/xfree86/common/xf86Cursor.c b/hw/xfree86/common/xf86Cursor.c
index 61f0ce5..8bb12ae 100644
--- a/hw/xfree86/common/xf86Cursor.c
+++ b/hw/xfree86/common/xf86Cursor.c
@@ -213,6 +213,7 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
   ScreenPtr   pCursorScreen;
   Bool        Switched;
   int         px, py;
+  int         sigstate;
 
   if (!pScr->vtSema || !mode || !pScr->SwitchMode)
     return FALSE;
@@ -232,6 +233,7 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
   if (pScreen == pCursorScreen)
     miPointerPosition(&px, &py);
 
+  sigstate = xf86BlockSIGIO ();
   xf86EnterServerState(SETUP);
   Switched = (*pScr->SwitchMode)(pScr->scrnIndex, mode, 0);
   xf86EnterServerState(OPERATING);
@@ -269,6 +271,7 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
       pScr->frameY1 = pScr->virtualY - 1;
     }
   }
+  xf86UnblockSIGIO (sigstate);
 
   if (pScr->AdjustFrame)
     (*pScr->AdjustFrame)(pScr->scrnIndex, pScr->frameX0, pScr->frameY0, 0);
diff-tree a6df780e4d3f90cc699b0b864bade03d6f15afd7 (from 042d4a407d0eca9131d0420b0b9189559aac326d)
Author: Ian Romanick <idr at us.ibm.com>
Date:   Wed Oct 11 15:41:22 2006 -0700

    Fix bug #8608.
    
    Regenerate files based on recent commits to Mesa (that fix Mesa bug
    that return pixel data.

diff --git a/GL/glx/indirect_dispatch.c b/GL/glx/indirect_dispatch.c
index d43afeb..d86dedf 100644
--- a/GL/glx/indirect_dispatch.c
+++ b/GL/glx/indirect_dispatch.c
@@ -2756,6 +2756,31 @@ int __glXDisp_AreTexturesResident(__GLXc
     return error;
 }
 
+int __glXDisp_AreTexturesResidentEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLsizei n = *(GLsizei  *)(pc +  0);
+
+        GLboolean retval;
+        GLboolean answerBuffer[200];
+        GLboolean * residences = __glXGetAnswerBuffer(cl, n, answerBuffer, sizeof(answerBuffer), 1);
+        retval = CALL_AreTexturesResident( GET_DISPATCH(), (
+            n,
+             (const GLuint *)(pc +  4),
+            residences
+        ) );
+        __glXSendReply(cl->client, residences, n, 1, GL_TRUE, retval);
+        error = Success;
+    }
+
+    return error;
+}
+
 void __glXDisp_CopyTexImage1D(GLbyte * pc)
 {
     CALL_CopyTexImage1D( GET_DISPATCH(), (
@@ -2811,6 +2836,26 @@ void __glXDisp_CopyTexSubImage2D(GLbyte 
 
 int __glXDisp_DeleteTextures(__GLXclientState *cl, GLbyte *pc)
 {
+    xGLXSingleReq * const req = (xGLXSingleReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_SINGLE_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLsizei n = *(GLsizei  *)(pc +  0);
+
+        CALL_DeleteTextures( GET_DISPATCH(), (
+            n,
+             (const GLuint *)(pc +  4)
+        ) );
+        error = Success;
+    }
+
+    return error;
+}
+
+int __glXDisp_DeleteTexturesEXT(__GLXclientState *cl, GLbyte *pc)
+{
     xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
     int error;
     __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
@@ -2852,6 +2897,29 @@ int __glXDisp_GenTextures(__GLXclientSta
     return error;
 }
 
+int __glXDisp_GenTexturesEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLsizei n = *(GLsizei  *)(pc +  0);
+
+        GLuint answerBuffer[200];
+        GLuint * textures = __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), 4);
+        CALL_GenTextures( GET_DISPATCH(), (
+            n,
+            textures
+        ) );
+        __glXSendReply(cl->client, textures, n, 4, GL_TRUE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDisp_IsTexture(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -2871,6 +2939,25 @@ int __glXDisp_IsTexture(__GLXclientState
     return error;
 }
 
+int __glXDisp_IsTextureEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        GLboolean retval;
+        retval = CALL_IsTexture( GET_DISPATCH(), (
+            *(GLuint   *)(pc +  0)
+        ) );
+        __glXSendReply(cl->client, dummy_answer, 0, 0, GL_FALSE, retval);
+        error = Success;
+    }
+
+    return error;
+}
+
 void __glXDisp_PrioritizeTextures(GLbyte * pc)
 {
     const GLsizei n = *(GLsizei  *)(pc +  0);
@@ -3039,6 +3126,35 @@ int __glXDisp_GetColorTableParameterfv(_
     return error;
 }
 
+int __glXDisp_GetColorTableParameterfvSGI(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname = *(GLenum   *)(pc +  4);
+
+        const GLuint compsize = __glGetColorTableParameterfv_size(pname);
+        GLfloat answerBuffer[200];
+        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetColorTableParameterfv( GET_DISPATCH(), (
+            *(GLenum   *)(pc +  0),
+            pname,
+            params
+        ) );
+        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDisp_GetColorTableParameteriv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3068,6 +3184,35 @@ int __glXDisp_GetColorTableParameteriv(_
     return error;
 }
 
+int __glXDisp_GetColorTableParameterivSGI(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname = *(GLenum   *)(pc +  4);
+
+        const GLuint compsize = __glGetColorTableParameteriv_size(pname);
+        GLint answerBuffer[200];
+        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetColorTableParameteriv( GET_DISPATCH(), (
+            *(GLenum   *)(pc +  0),
+            pname,
+            params
+        ) );
+        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 void __glXDisp_ColorSubTable(GLbyte * pc)
 {
     const GLvoid * const data = (const GLvoid *) (pc + 40);
@@ -3244,6 +3389,35 @@ int __glXDisp_GetConvolutionParameterfv(
     return error;
 }
 
+int __glXDisp_GetConvolutionParameterfvEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname = *(GLenum   *)(pc +  4);
+
+        const GLuint compsize = __glGetConvolutionParameterfv_size(pname);
+        GLfloat answerBuffer[200];
+        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetConvolutionParameterfv( GET_DISPATCH(), (
+            *(GLenum   *)(pc +  0),
+            pname,
+            params
+        ) );
+        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDisp_GetConvolutionParameteriv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3273,6 +3447,35 @@ int __glXDisp_GetConvolutionParameteriv(
     return error;
 }
 
+int __glXDisp_GetConvolutionParameterivEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname = *(GLenum   *)(pc +  4);
+
+        const GLuint compsize = __glGetConvolutionParameteriv_size(pname);
+        GLint answerBuffer[200];
+        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetConvolutionParameteriv( GET_DISPATCH(), (
+            *(GLenum   *)(pc +  0),
+            pname,
+            params
+        ) );
+        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDisp_GetHistogramParameterfv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3302,6 +3505,35 @@ int __glXDisp_GetHistogramParameterfv(__
     return error;
 }
 
+int __glXDisp_GetHistogramParameterfvEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname = *(GLenum   *)(pc +  4);
+
+        const GLuint compsize = __glGetHistogramParameterfv_size(pname);
+        GLfloat answerBuffer[200];
+        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetHistogramParameterfv( GET_DISPATCH(), (
+            *(GLenum   *)(pc +  0),
+            pname,
+            params
+        ) );
+        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDisp_GetHistogramParameteriv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3331,6 +3563,35 @@ int __glXDisp_GetHistogramParameteriv(__
     return error;
 }
 
+int __glXDisp_GetHistogramParameterivEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname = *(GLenum   *)(pc +  4);
+
+        const GLuint compsize = __glGetHistogramParameteriv_size(pname);
+        GLint answerBuffer[200];
+        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetHistogramParameteriv( GET_DISPATCH(), (
+            *(GLenum   *)(pc +  0),
+            pname,
+            params
+        ) );
+        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDisp_GetMinmaxParameterfv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3360,6 +3621,35 @@ int __glXDisp_GetMinmaxParameterfv(__GLX
     return error;
 }
 
+int __glXDisp_GetMinmaxParameterfvEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname = *(GLenum   *)(pc +  4);
+
+        const GLuint compsize = __glGetMinmaxParameterfv_size(pname);
+        GLfloat answerBuffer[200];
+        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetMinmaxParameterfv( GET_DISPATCH(), (
+            *(GLenum   *)(pc +  0),
+            pname,
+            params
+        ) );
+        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDisp_GetMinmaxParameteriv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3389,6 +3679,35 @@ int __glXDisp_GetMinmaxParameteriv(__GLX
     return error;
 }
 
+int __glXDisp_GetMinmaxParameterivEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname = *(GLenum   *)(pc +  4);
+
+        const GLuint compsize = __glGetMinmaxParameteriv_size(pname);
+        GLint answerBuffer[200];
+        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetMinmaxParameteriv( GET_DISPATCH(), (
+            *(GLenum   *)(pc +  0),
+            pname,
+            params
+        ) );
+        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 void __glXDisp_Histogram(GLbyte * pc)
 {
     CALL_Histogram( GET_DISPATCH(), (
@@ -4414,131 +4733,6 @@ void __glXDisp_DrawBuffersARB(GLbyte * p
     ) );
 }
 
-int __glXDisp_GetColorTableParameterfvSGI(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        const GLenum pname = *(GLenum   *)(pc +  4);
-
-        const GLuint compsize = __glGetColorTableParameterfvSGI_size(pname);
-        GLfloat answerBuffer[200];
-        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
-
-        if (params == NULL) return BadAlloc;
-        __glXClearErrorOccured();
-
-        CALL_GetColorTableParameterfvSGI( GET_DISPATCH(), (
-            *(GLenum   *)(pc +  0),
-            pname,
-            params
-        ) );
-        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
-        error = Success;
-    }
-
-    return error;
-}
-
-int __glXDisp_GetColorTableParameterivSGI(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        const GLenum pname = *(GLenum   *)(pc +  4);
-
-        const GLuint compsize = __glGetColorTableParameterivSGI_size(pname);
-        GLint answerBuffer[200];
-        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
-
-        if (params == NULL) return BadAlloc;
-        __glXClearErrorOccured();
-
-        CALL_GetColorTableParameterivSGI( GET_DISPATCH(), (
-            *(GLenum   *)(pc +  0),
-            pname,
-            params
-        ) );
-        __glXSendReply(cl->client, params, compsize, 4, GL_FALSE, 0);
-        error = Success;
-    }
-
-    return error;
-}
-
-int __glXDisp_AreTexturesResidentEXT(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        const GLsizei n = *(GLsizei  *)(pc +  0);
-
-        GLboolean retval;
-        GLboolean answerBuffer[200];
-        GLboolean * residences = __glXGetAnswerBuffer(cl, n, answerBuffer, sizeof(answerBuffer), 1);
-        retval = CALL_AreTexturesResidentEXT( GET_DISPATCH(), (
-            n,
-             (const GLuint *)(pc +  4),
-            residences
-        ) );
-        __glXSendReply(cl->client, residences, n, 1, GL_TRUE, retval);
-        error = Success;
-    }
-
-    return error;
-}
-
-int __glXDisp_GenTexturesEXT(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        const GLsizei n = *(GLsizei  *)(pc +  0);
-
-        GLuint answerBuffer[200];
-        GLuint * textures = __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), 4);
-        CALL_GenTexturesEXT( GET_DISPATCH(), (
-            n,
-            textures
-        ) );
-        __glXSendReply(cl->client, textures, n, 4, GL_TRUE, 0);
-        error = Success;
-    }
-
-    return error;
-}
-
-int __glXDisp_IsTextureEXT(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, req->contextTag, &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        GLboolean retval;
-        retval = CALL_IsTextureEXT( GET_DISPATCH(), (
-            *(GLuint   *)(pc +  0)
-        ) );
-        __glXSendReply(cl->client, dummy_answer, 0, 0, GL_FALSE, retval);
-        error = Success;
-    }
-
-    return error;
-}
-
 void __glXDisp_SampleMaskSGIS(GLbyte * pc)
 {
     CALL_SampleMaskSGIS( GET_DISPATCH(), (
diff --git a/GL/glx/indirect_dispatch.h b/GL/glx/indirect_dispatch.h
index c259fd9..9bf74eb 100644
--- a/GL/glx/indirect_dispatch.h
+++ b/GL/glx/indirect_dispatch.h
@@ -61,8 +61,6 @@ extern HIDDEN void __glXDisp_ActiveTextu
 extern HIDDEN void __glXDispSwap_ActiveTextureARB(GLbyte * pc);
 extern HIDDEN void __glXDisp_VertexAttrib4ubvNV(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_VertexAttrib4ubvNV(GLbyte * pc);
-extern HIDDEN int __glXDisp_GetColorTableParameterfvSGI(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_GetColorTableParameterfvSGI(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetProgramNamedParameterdvNV(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetProgramNamedParameterdvNV(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_Histogram(GLbyte * pc);
@@ -163,6 +161,8 @@ extern HIDDEN void __glXDisp_Color3sv(GL
 extern HIDDEN void __glXDispSwap_Color3sv(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetConvolutionParameteriv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetConvolutionParameteriv(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetConvolutionParameterivEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetConvolutionParameterivEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_Vertex2dv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Vertex2dv(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetVisualConfigs(struct __GLXclientStateRec *, GLbyte *);
@@ -251,6 +251,8 @@ extern HIDDEN void __glXDisp_Color3usv(G
 extern HIDDEN void __glXDispSwap_Color3usv(GLbyte * pc);
 extern HIDDEN int __glXDisp_AreTexturesResident(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_AreTexturesResident(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_AreTexturesResidentEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_AreTexturesResidentEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_IsRenderbufferEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_IsRenderbufferEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_PointParameterfvEXT(GLbyte * pc);
@@ -319,6 +321,8 @@ extern HIDDEN int __glXDisp_CreateNewCon
 extern HIDDEN int __glXDispSwap_CreateNewContext(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetMinmax(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetMinmax(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetMinmaxEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetMinmaxEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetVertexAttribdvNV(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetVertexAttribdvNV(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_Normal3fv(GLbyte * pc);
@@ -409,6 +413,8 @@ extern HIDDEN void __glXDisp_VertexAttri
 extern HIDDEN void __glXDispSwap_VertexAttrib1dvNV(GLbyte * pc);
 extern HIDDEN int __glXDisp_GenTextures(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GenTextures(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GenTexturesEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GenTexturesEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_FramebufferTexture1DEXT(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_FramebufferTexture1DEXT(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetDrawableAttributes(struct __GLXclientStateRec *, GLbyte *);
@@ -469,6 +475,8 @@ extern HIDDEN void __glXDisp_CopyTexSubI
 extern HIDDEN void __glXDispSwap_CopyTexSubImage3D(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetColorTable(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetColorTable(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetColorTableSGI(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetColorTableSGI(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_Indexiv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Indexiv(GLbyte * pc);
 extern HIDDEN int __glXDisp_CreateContext(struct __GLXclientStateRec *, GLbyte *);
@@ -477,6 +485,8 @@ extern HIDDEN void __glXDisp_CopyColorTa
 extern HIDDEN void __glXDispSwap_CopyColorTable(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetHistogramParameterfv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetHistogramParameterfv(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetHistogramParameterfvEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetHistogramParameterfvEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_Frustum(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Frustum(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetString(struct __GLXclientStateRec *, GLbyte *);
@@ -493,6 +503,8 @@ extern HIDDEN void __glXDisp_VertexAttri
 extern HIDDEN void __glXDispSwap_VertexAttrib1dvARB(GLbyte * pc);
 extern HIDDEN int __glXDisp_DeleteTextures(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_DeleteTextures(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_DeleteTexturesEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_DeleteTexturesEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetTexLevelParameteriv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetTexLevelParameteriv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_ClearAccum(GLbyte * pc);
@@ -587,6 +599,8 @@ extern HIDDEN void __glXDisp_Color3dv(GL
 extern HIDDEN void __glXDispSwap_Color3dv(GLbyte * pc);
 extern HIDDEN int __glXDisp_IsTexture(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_IsTexture(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_IsTextureEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_IsTextureEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_DeleteQueriesARB(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_DeleteQueriesARB(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetMapdv(struct __GLXclientStateRec *, GLbyte *);
@@ -617,6 +631,8 @@ extern HIDDEN int __glXDisp_GetVertexAtt
 extern HIDDEN int __glXDispSwap_GetVertexAttribdvARB(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetSeparableFilter(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetSeparableFilter(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetSeparableFilterEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetSeparableFilterEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_RequestResidentProgramsNV(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_RequestResidentProgramsNV(GLbyte * pc);
 extern HIDDEN int __glXDisp_FeedbackBuffer(struct __GLXclientStateRec *, GLbyte *);
@@ -635,8 +651,6 @@ extern HIDDEN void __glXDisp_PolygonOffs
 extern HIDDEN void __glXDispSwap_PolygonOffset(GLbyte * pc);
 extern HIDDEN void __glXDisp_ExecuteProgramNV(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_ExecuteProgramNV(GLbyte * pc);
-extern HIDDEN int __glXDisp_GetColorTableParameterivSGI(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_GetColorTableParameterivSGI(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_Normal3dv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Normal3dv(GLbyte * pc);
 extern HIDDEN void __glXDisp_Lightf(GLbyte * pc);
@@ -685,6 +699,8 @@ extern HIDDEN int __glXDisp_SwapInterval
 extern HIDDEN int __glXDispSwap_SwapIntervalSGI(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetColorTableParameterfv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetColorTableParameterfv(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetColorTableParameterfvSGI(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetColorTableParameterfvSGI(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_Bitmap(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Bitmap(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetTexLevelParameterfv(struct __GLXclientStateRec *, GLbyte *);
@@ -725,6 +741,8 @@ extern HIDDEN int __glXDisp_ChangeDrawab
 extern HIDDEN int __glXDispSwap_ChangeDrawableAttributes(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetMinmaxParameteriv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetMinmaxParameteriv(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetMinmaxParameterivEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetMinmaxParameterivEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_PixelTransferf(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_PixelTransferf(GLbyte * pc);
 extern HIDDEN void __glXDisp_CopyTexImage1D(GLbyte * pc);
@@ -755,6 +773,8 @@ extern HIDDEN void __glXDisp_Convolution
 extern HIDDEN void __glXDispSwap_ConvolutionParameterf(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetColorTableParameteriv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetColorTableParameteriv(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetColorTableParameterivSGI(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetColorTableParameterivSGI(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_ReleaseTexImageEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_ReleaseTexImageEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_CallList(GLbyte * pc);
@@ -773,8 +793,6 @@ extern HIDDEN void __glXDisp_BindRenderb
 extern HIDDEN void __glXDispSwap_BindRenderbufferEXT(GLbyte * pc);
 extern HIDDEN void __glXDisp_Vertex3sv(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_Vertex3sv(GLbyte * pc);
-extern HIDDEN int __glXDisp_GetColorTableSGI(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_GetColorTableSGI(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_BindTexImageEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_BindTexImageEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_ProgramLocalParameter4fvARB(GLbyte * pc);
@@ -797,10 +815,10 @@ extern HIDDEN void __glXDisp_TexGendv(GL
 extern HIDDEN void __glXDispSwap_TexGendv(GLbyte * pc);
 extern HIDDEN void __glXDisp_ResetMinmax(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_ResetMinmax(GLbyte * pc);
-extern HIDDEN int __glXDisp_GenTexturesEXT(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_GenTexturesEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetConvolutionParameterfv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetConvolutionParameterfv(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetConvolutionParameterfvEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetConvolutionParameterfvEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_VertexAttribs4dvNV(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_VertexAttribs4dvNV(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetMaterialfv(struct __GLXclientStateRec *, GLbyte *);
@@ -827,8 +845,12 @@ extern HIDDEN int __glXDisp_GetProgramLo
 extern HIDDEN int __glXDispSwap_GetProgramLocalParameterdvARB(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetHistogramParameteriv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetHistogramParameteriv(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetHistogramParameterivEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetHistogramParameterivEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetConvolutionFilter(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetConvolutionFilter(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetConvolutionFilterEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetConvolutionFilterEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetProgramivARB(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetProgramivARB(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_BlendFuncSeparateEXT(GLbyte * pc);
@@ -841,8 +863,6 @@ extern HIDDEN void __glXDisp_EvalPoint1(
 extern HIDDEN void __glXDispSwap_EvalPoint1(GLbyte * pc);
 extern HIDDEN void __glXDisp_PopMatrix(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_PopMatrix(GLbyte * pc);
-extern HIDDEN int __glXDisp_AreTexturesResidentEXT(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_AreTexturesResidentEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_MakeCurrentReadSGI(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_MakeCurrentReadSGI(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetTexGeniv(struct __GLXclientStateRec *, GLbyte *);
@@ -861,6 +881,8 @@ extern HIDDEN int __glXDisp_GetTexGenfv(
 extern HIDDEN int __glXDispSwap_GetTexGenfv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetHistogram(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetHistogram(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetHistogramEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetHistogramEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_ActiveStencilFaceEXT(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_ActiveStencilFaceEXT(GLbyte * pc);
 extern HIDDEN void __glXDisp_Materialf(GLbyte * pc);
@@ -921,8 +943,6 @@ extern HIDDEN void __glXDisp_VertexAttri
 extern HIDDEN void __glXDispSwap_VertexAttrib4uivARB(GLbyte * pc);
 extern HIDDEN void __glXDisp_ClipPlane(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_ClipPlane(GLbyte * pc);
-extern HIDDEN int __glXDisp_IsTextureEXT(struct __GLXclientStateRec *, GLbyte *);
-extern HIDDEN int __glXDispSwap_IsTextureEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDisp_GetPixelMapuiv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetPixelMapuiv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_Indexfv(GLbyte * pc);
@@ -1005,6 +1025,8 @@ extern HIDDEN void __glXDisp_VertexAttri
 extern HIDDEN void __glXDispSwap_VertexAttribs4svNV(GLbyte * pc);
 extern HIDDEN int __glXDisp_GetMinmaxParameterfv(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN int __glXDispSwap_GetMinmaxParameterfv(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDisp_GetMinmaxParameterfvEXT(struct __GLXclientStateRec *, GLbyte *);
+extern HIDDEN int __glXDispSwap_GetMinmaxParameterfvEXT(struct __GLXclientStateRec *, GLbyte *);
 extern HIDDEN void __glXDisp_VertexAttrib1fvARB(GLbyte * pc);
 extern HIDDEN void __glXDispSwap_VertexAttrib1fvARB(GLbyte * pc);
 extern HIDDEN void __glXDisp_VertexAttribs1svNV(GLbyte * pc);
diff --git a/GL/glx/indirect_dispatch_swap.c b/GL/glx/indirect_dispatch_swap.c
index a84879a..9c58ef1 100644
--- a/GL/glx/indirect_dispatch_swap.c
+++ b/GL/glx/indirect_dispatch_swap.c
@@ -2887,6 +2887,31 @@ int __glXDispSwap_AreTexturesResident(__
     return error;
 }
 
+int __glXDispSwap_AreTexturesResidentEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLsizei n =  (GLsizei )bswap_CARD32 ( pc +  0 );
+
+        GLboolean retval;
+        GLboolean answerBuffer[200];
+        GLboolean * residences = __glXGetAnswerBuffer(cl, n, answerBuffer, sizeof(answerBuffer), 1);
+        retval = CALL_AreTexturesResident( GET_DISPATCH(), (
+            n,
+             (const GLuint *)bswap_32_array( (uint32_t *) (pc +  4), 0 ),
+            residences
+        ) );
+        __glXSendReplySwap(cl->client, residences, n, 1, GL_TRUE, retval);
+        error = Success;
+    }
+
+    return error;
+}
+
 void __glXDispSwap_CopyTexImage1D(GLbyte * pc)
 {
     CALL_CopyTexImage1D( GET_DISPATCH(), (
@@ -2942,6 +2967,26 @@ void __glXDispSwap_CopyTexSubImage2D(GLb
 
 int __glXDispSwap_DeleteTextures(__GLXclientState *cl, GLbyte *pc)
 {
+    xGLXSingleReq * const req = (xGLXSingleReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_SINGLE_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLsizei n =  (GLsizei )bswap_CARD32 ( pc +  0 );
+
+        CALL_DeleteTextures( GET_DISPATCH(), (
+            n,
+             (const GLuint *)bswap_32_array( (uint32_t *) (pc +  4), 0 )
+        ) );
+        error = Success;
+    }
+
+    return error;
+}
+
+int __glXDispSwap_DeleteTexturesEXT(__GLXclientState *cl, GLbyte *pc)
+{
     xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
     int error;
     __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
@@ -2984,6 +3029,30 @@ int __glXDispSwap_GenTextures(__GLXclien
     return error;
 }
 
+int __glXDispSwap_GenTexturesEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLsizei n =  (GLsizei )bswap_CARD32 ( pc +  0 );
+
+        GLuint answerBuffer[200];
+        GLuint * textures = __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), 4);
+        CALL_GenTextures( GET_DISPATCH(), (
+            n,
+            textures
+        ) );
+        (void) bswap_32_array( (uint32_t *) textures, n );
+        __glXSendReplySwap(cl->client, textures, n, 4, GL_TRUE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDispSwap_IsTexture(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3003,6 +3072,25 @@ int __glXDispSwap_IsTexture(__GLXclientS
     return error;
 }
 
+int __glXDispSwap_IsTextureEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        GLboolean retval;
+        retval = CALL_IsTexture( GET_DISPATCH(), (
+             (GLuint  )bswap_CARD32 ( pc +  0 )
+        ) );
+        __glXSendReplySwap(cl->client, dummy_answer, 0, 0, GL_FALSE, retval);
+        error = Success;
+    }
+
+    return error;
+}
+
 void __glXDispSwap_PrioritizeTextures(GLbyte * pc)
 {
     const GLsizei n =  (GLsizei )bswap_CARD32 ( pc +  0 );
@@ -3172,6 +3260,36 @@ int __glXDispSwap_GetColorTableParameter
     return error;
 }
 
+int __glXDispSwap_GetColorTableParameterfvSGI(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
+
+        const GLuint compsize = __glGetColorTableParameterfv_size(pname);
+        GLfloat answerBuffer[200];
+        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetColorTableParameterfv( GET_DISPATCH(), (
+             (GLenum  )bswap_ENUM   ( pc +  0 ),
+            pname,
+            params
+        ) );
+        (void) bswap_32_array( (uint32_t *) params, compsize );
+        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDispSwap_GetColorTableParameteriv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3202,6 +3320,36 @@ int __glXDispSwap_GetColorTableParameter
     return error;
 }
 
+int __glXDispSwap_GetColorTableParameterivSGI(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
+
+        const GLuint compsize = __glGetColorTableParameteriv_size(pname);
+        GLint answerBuffer[200];
+        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetColorTableParameteriv( GET_DISPATCH(), (
+             (GLenum  )bswap_ENUM   ( pc +  0 ),
+            pname,
+            params
+        ) );
+        (void) bswap_32_array( (uint32_t *) params, compsize );
+        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 void __glXDispSwap_ColorSubTable(GLbyte * pc)
 {
     const GLvoid * const data = (const GLvoid *) (pc + 40);
@@ -3379,6 +3527,36 @@ int __glXDispSwap_GetConvolutionParamete
     return error;
 }
 
+int __glXDispSwap_GetConvolutionParameterfvEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
+
+        const GLuint compsize = __glGetConvolutionParameterfv_size(pname);
+        GLfloat answerBuffer[200];
+        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetConvolutionParameterfv( GET_DISPATCH(), (
+             (GLenum  )bswap_ENUM   ( pc +  0 ),
+            pname,
+            params
+        ) );
+        (void) bswap_32_array( (uint32_t *) params, compsize );
+        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDispSwap_GetConvolutionParameteriv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3409,6 +3587,36 @@ int __glXDispSwap_GetConvolutionParamete
     return error;
 }
 
+int __glXDispSwap_GetConvolutionParameterivEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
+
+        const GLuint compsize = __glGetConvolutionParameteriv_size(pname);
+        GLint answerBuffer[200];
+        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetConvolutionParameteriv( GET_DISPATCH(), (
+             (GLenum  )bswap_ENUM   ( pc +  0 ),
+            pname,
+            params
+        ) );
+        (void) bswap_32_array( (uint32_t *) params, compsize );
+        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDispSwap_GetHistogramParameterfv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3439,6 +3647,36 @@ int __glXDispSwap_GetHistogramParameterf
     return error;
 }
 
+int __glXDispSwap_GetHistogramParameterfvEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
+
+        const GLuint compsize = __glGetHistogramParameterfv_size(pname);
+        GLfloat answerBuffer[200];
+        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetHistogramParameterfv( GET_DISPATCH(), (
+             (GLenum  )bswap_ENUM   ( pc +  0 ),
+            pname,
+            params
+        ) );
+        (void) bswap_32_array( (uint32_t *) params, compsize );
+        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDispSwap_GetHistogramParameteriv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3469,6 +3707,36 @@ int __glXDispSwap_GetHistogramParameteri
     return error;
 }
 
+int __glXDispSwap_GetHistogramParameterivEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
+
+        const GLuint compsize = __glGetHistogramParameteriv_size(pname);
+        GLint answerBuffer[200];
+        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetHistogramParameteriv( GET_DISPATCH(), (
+             (GLenum  )bswap_ENUM   ( pc +  0 ),
+            pname,
+            params
+        ) );
+        (void) bswap_32_array( (uint32_t *) params, compsize );
+        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDispSwap_GetMinmaxParameterfv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3499,6 +3767,36 @@ int __glXDispSwap_GetMinmaxParameterfv(_
     return error;
 }
 
+int __glXDispSwap_GetMinmaxParameterfvEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
+
+        const GLuint compsize = __glGetMinmaxParameterfv_size(pname);
+        GLfloat answerBuffer[200];
+        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetMinmaxParameterfv( GET_DISPATCH(), (
+             (GLenum  )bswap_ENUM   ( pc +  0 ),
+            pname,
+            params
+        ) );
+        (void) bswap_32_array( (uint32_t *) params, compsize );
+        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 int __glXDispSwap_GetMinmaxParameteriv(__GLXclientState *cl, GLbyte *pc)
 {
     xGLXSingleReq * const req = (xGLXSingleReq *) pc;
@@ -3529,6 +3827,36 @@ int __glXDispSwap_GetMinmaxParameteriv(_
     return error;
 }
 
+int __glXDispSwap_GetMinmaxParameterivEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
+    int error;
+    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
+
+    pc += __GLX_VENDPRIV_HDR_SIZE;
+    if ( cx != NULL ) {
+        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
+
+        const GLuint compsize = __glGetMinmaxParameteriv_size(pname);
+        GLint answerBuffer[200];
+        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
+
+        if (params == NULL) return BadAlloc;
+        __glXClearErrorOccured();
+
+        CALL_GetMinmaxParameteriv( GET_DISPATCH(), (
+             (GLenum  )bswap_ENUM   ( pc +  0 ),
+            pname,
+            params
+        ) );
+        (void) bswap_32_array( (uint32_t *) params, compsize );
+        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
+        error = Success;
+    }
+
+    return error;
+}
+
 void __glXDispSwap_Histogram(GLbyte * pc)
 {
     CALL_Histogram( GET_DISPATCH(), (
@@ -4566,134 +4894,6 @@ void __glXDispSwap_DrawBuffersARB(GLbyte
     ) );
 }
 
-int __glXDispSwap_GetColorTableParameterfvSGI(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
-
-        const GLuint compsize = __glGetColorTableParameterfvSGI_size(pname);
-        GLfloat answerBuffer[200];
-        GLfloat * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
-
-        if (params == NULL) return BadAlloc;
-        __glXClearErrorOccured();
-
-        CALL_GetColorTableParameterfvSGI( GET_DISPATCH(), (
-             (GLenum  )bswap_ENUM   ( pc +  0 ),
-            pname,
-            params
-        ) );
-        (void) bswap_32_array( (uint32_t *) params, compsize );
-        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
-        error = Success;
-    }
-
-    return error;
-}
-
-int __glXDispSwap_GetColorTableParameterivSGI(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        const GLenum pname =  (GLenum  )bswap_ENUM   ( pc +  4 );
-
-        const GLuint compsize = __glGetColorTableParameterivSGI_size(pname);
-        GLint answerBuffer[200];
-        GLint * params = __glXGetAnswerBuffer(cl, compsize * 4, answerBuffer, sizeof(answerBuffer), 4);
-
-        if (params == NULL) return BadAlloc;
-        __glXClearErrorOccured();
-
-        CALL_GetColorTableParameterivSGI( GET_DISPATCH(), (
-             (GLenum  )bswap_ENUM   ( pc +  0 ),
-            pname,
-            params
-        ) );
-        (void) bswap_32_array( (uint32_t *) params, compsize );
-        __glXSendReplySwap(cl->client, params, compsize, 4, GL_FALSE, 0);
-        error = Success;
-    }
-
-    return error;
-}
-
-int __glXDispSwap_AreTexturesResidentEXT(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        const GLsizei n =  (GLsizei )bswap_CARD32 ( pc +  0 );
-
-        GLboolean retval;
-        GLboolean answerBuffer[200];
-        GLboolean * residences = __glXGetAnswerBuffer(cl, n, answerBuffer, sizeof(answerBuffer), 1);
-        retval = CALL_AreTexturesResidentEXT( GET_DISPATCH(), (
-            n,
-             (const GLuint *)bswap_32_array( (uint32_t *) (pc +  4), 0 ),
-            residences
-        ) );
-        __glXSendReplySwap(cl->client, residences, n, 1, GL_TRUE, retval);
-        error = Success;
-    }
-
-    return error;
-}
-
-int __glXDispSwap_GenTexturesEXT(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        const GLsizei n =  (GLsizei )bswap_CARD32 ( pc +  0 );
-
-        GLuint answerBuffer[200];
-        GLuint * textures = __glXGetAnswerBuffer(cl, n * 4, answerBuffer, sizeof(answerBuffer), 4);
-        CALL_GenTexturesEXT( GET_DISPATCH(), (
-            n,
-            textures
-        ) );
-        (void) bswap_32_array( (uint32_t *) textures, n );
-        __glXSendReplySwap(cl->client, textures, n, 4, GL_TRUE, 0);
-        error = Success;
-    }
-
-    return error;
-}
-
-int __glXDispSwap_IsTextureEXT(__GLXclientState *cl, GLbyte *pc)
-{
-    xGLXVendorPrivateReq * const req = (xGLXVendorPrivateReq *) pc;
-    int error;
-    __GLXcontext * const cx = __glXForceCurrent(cl, bswap_CARD32( &req->contextTag ), &error);
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    if ( cx != NULL ) {
-        GLboolean retval;
-        retval = CALL_IsTextureEXT( GET_DISPATCH(), (
-             (GLuint  )bswap_CARD32 ( pc +  0 )
-        ) );
-        __glXSendReplySwap(cl->client, dummy_answer, 0, 0, GL_FALSE, retval);
-        error = Success;
-    }
-
-    return error;
-}
-
 void __glXDispSwap_SampleMaskSGIS(GLbyte * pc)
 {
     CALL_SampleMaskSGIS( GET_DISPATCH(), (
diff --git a/GL/glx/indirect_size_get.c b/GL/glx/indirect_size_get.c
index 6ca9a35..150c6a1 100644
--- a/GL/glx/indirect_size_get.c
+++ b/GL/glx/indirect_size_get.c
@@ -67,1100 +67,1124 @@
 
 
 INTERNAL PURE FASTCALL GLint
-__glCallLists_size( GLenum e )
+__glCallLists_size(GLenum e)
 {
-    switch( e ) {
-        case GL_BYTE:
-        case GL_UNSIGNED_BYTE:
-            return 1;
-        case GL_SHORT:
-        case GL_UNSIGNED_SHORT:
-        case GL_2_BYTES:
-            return 2;
-        case GL_3_BYTES:
-            return 3;
-        case GL_INT:
-        case GL_UNSIGNED_INT:
-        case GL_FLOAT:
-        case GL_4_BYTES:
-            return 4;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glFogfv_size( GLenum e )
-{
-    switch( e ) {
-        case GL_FOG_INDEX:
-        case GL_FOG_DENSITY:
-        case GL_FOG_START:
-        case GL_FOG_END:
-        case GL_FOG_MODE:
-        case GL_FOG_OFFSET_VALUE_SGIX:
-        case GL_FOG_DISTANCE_MODE_NV:
-            return 1;
-        case GL_FOG_COLOR:
-            return 4;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glLightfv_size( GLenum e )
-{
-    switch( e ) {
-        case GL_SPOT_EXPONENT:
-        case GL_SPOT_CUTOFF:
-        case GL_CONSTANT_ATTENUATION:
-        case GL_LINEAR_ATTENUATION:
-        case GL_QUADRATIC_ATTENUATION:
-            return 1;
-        case GL_SPOT_DIRECTION:
-            return 3;
-        case GL_AMBIENT:
-        case GL_DIFFUSE:
-        case GL_SPECULAR:
-        case GL_POSITION:
-            return 4;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glLightModelfv_size( GLenum e )
-{
-    switch( e ) {
-        case GL_LIGHT_MODEL_LOCAL_VIEWER:
-        case GL_LIGHT_MODEL_TWO_SIDE:
-        case GL_LIGHT_MODEL_COLOR_CONTROL:
+    switch (e) {
+    case GL_BYTE:
+    case GL_UNSIGNED_BYTE:
+        return 1;
+    case GL_SHORT:
+    case GL_UNSIGNED_SHORT:
+    case GL_2_BYTES:
+        return 2;
+    case GL_3_BYTES:
+        return 3;
+    case GL_INT:
+    case GL_UNSIGNED_INT:
+    case GL_FLOAT:
+    case GL_4_BYTES:
+        return 4;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glFogfv_size(GLenum e)
+{
+    switch (e) {
+    case GL_FOG_INDEX:
+    case GL_FOG_DENSITY:
+    case GL_FOG_START:
+    case GL_FOG_END:
+    case GL_FOG_MODE:
+    case GL_FOG_OFFSET_VALUE_SGIX:
+    case GL_FOG_DISTANCE_MODE_NV:
+        return 1;
+    case GL_FOG_COLOR:
+        return 4;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glLightfv_size(GLenum e)
+{
+    switch (e) {
+    case GL_SPOT_EXPONENT:
+    case GL_SPOT_CUTOFF:
+    case GL_CONSTANT_ATTENUATION:
+    case GL_LINEAR_ATTENUATION:
+    case GL_QUADRATIC_ATTENUATION:
+        return 1;
+    case GL_SPOT_DIRECTION:
+        return 3;
+    case GL_AMBIENT:
+    case GL_DIFFUSE:
+    case GL_SPECULAR:
+    case GL_POSITION:
+        return 4;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glLightModelfv_size(GLenum e)
+{
+    switch (e) {
+    case GL_LIGHT_MODEL_LOCAL_VIEWER:
+    case GL_LIGHT_MODEL_TWO_SIDE:
+    case GL_LIGHT_MODEL_COLOR_CONTROL:
 /*      case GL_LIGHT_MODEL_COLOR_CONTROL_EXT:*/
-            return 1;
-        case GL_LIGHT_MODEL_AMBIENT:
-            return 4;
-        default: return 0;
+        return 1;
+    case GL_LIGHT_MODEL_AMBIENT:
+        return 4;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glMaterialfv_size( GLenum e )
+__glMaterialfv_size(GLenum e)
 {
-    switch( e ) {
-        case GL_SHININESS:
-            return 1;
-        case GL_COLOR_INDEXES:
-            return 3;
-        case GL_AMBIENT:
-        case GL_DIFFUSE:
-        case GL_SPECULAR:
-        case GL_EMISSION:
-        case GL_AMBIENT_AND_DIFFUSE:
-            return 4;
-        default: return 0;
+    switch (e) {
+    case GL_SHININESS:
+        return 1;
+    case GL_COLOR_INDEXES:
+        return 3;
+    case GL_AMBIENT:
+    case GL_DIFFUSE:
+    case GL_SPECULAR:
+    case GL_EMISSION:
+    case GL_AMBIENT_AND_DIFFUSE:
+        return 4;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glTexParameterfv_size( GLenum e )
+__glTexParameterfv_size(GLenum e)
 {
-    switch( e ) {
-        case GL_TEXTURE_MAG_FILTER:
-        case GL_TEXTURE_MIN_FILTER:
-        case GL_TEXTURE_WRAP_S:
-        case GL_TEXTURE_WRAP_T:
-        case GL_TEXTURE_PRIORITY:
-        case GL_TEXTURE_WRAP_R:
-        case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
+    switch (e) {
+    case GL_TEXTURE_MAG_FILTER:
+    case GL_TEXTURE_MIN_FILTER:
+    case GL_TEXTURE_WRAP_S:
+    case GL_TEXTURE_WRAP_T:
+    case GL_TEXTURE_PRIORITY:
+    case GL_TEXTURE_WRAP_R:
+    case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
 /*      case GL_SHADOW_AMBIENT_SGIX:*/
-        case GL_TEXTURE_MIN_LOD:
-        case GL_TEXTURE_MAX_LOD:
-        case GL_TEXTURE_BASE_LEVEL:
-        case GL_TEXTURE_MAX_LEVEL:
-        case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
-        case GL_TEXTURE_LOD_BIAS_S_SGIX:
-        case GL_TEXTURE_LOD_BIAS_T_SGIX:
-        case GL_TEXTURE_LOD_BIAS_R_SGIX:
-        case GL_GENERATE_MIPMAP:
+    case GL_TEXTURE_MIN_LOD:
+    case GL_TEXTURE_MAX_LOD:
+    case GL_TEXTURE_BASE_LEVEL:
+    case GL_TEXTURE_MAX_LEVEL:
+    case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
+    case GL_TEXTURE_LOD_BIAS_S_SGIX:
+    case GL_TEXTURE_LOD_BIAS_T_SGIX:
+    case GL_TEXTURE_LOD_BIAS_R_SGIX:
+    case GL_GENERATE_MIPMAP:
 /*      case GL_GENERATE_MIPMAP_SGIS:*/
-        case GL_TEXTURE_COMPARE_SGIX:
-        case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
-        case GL_TEXTURE_MAX_CLAMP_S_SGIX:
-        case GL_TEXTURE_MAX_CLAMP_T_SGIX:
-        case GL_TEXTURE_MAX_CLAMP_R_SGIX:
-        case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-        case GL_TEXTURE_LOD_BIAS:
+    case GL_TEXTURE_COMPARE_SGIX:
+    case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
+    case GL_TEXTURE_MAX_CLAMP_S_SGIX:
+    case GL_TEXTURE_MAX_CLAMP_T_SGIX:
+    case GL_TEXTURE_MAX_CLAMP_R_SGIX:
+    case GL_TEXTURE_MAX_ANISOTROPY_EXT:
+    case GL_TEXTURE_LOD_BIAS:
 /*      case GL_TEXTURE_LOD_BIAS_EXT:*/
-        case GL_DEPTH_TEXTURE_MODE:
+    case GL_DEPTH_TEXTURE_MODE:
 /*      case GL_DEPTH_TEXTURE_MODE_ARB:*/
-        case GL_TEXTURE_COMPARE_MODE:
+    case GL_TEXTURE_COMPARE_MODE:
 /*      case GL_TEXTURE_COMPARE_MODE_ARB:*/
-        case GL_TEXTURE_COMPARE_FUNC:
+    case GL_TEXTURE_COMPARE_FUNC:
 /*      case GL_TEXTURE_COMPARE_FUNC_ARB:*/
-        case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
-            return 1;
-        case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
-        case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
-            return 2;
-        case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
-            return 3;
-        case GL_TEXTURE_BORDER_COLOR:
-        case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
-        case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
-            return 4;
-        default: return 0;
+    case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
+        return 1;
+    case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
+    case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
+        return 2;
+    case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
+        return 3;
+    case GL_TEXTURE_BORDER_COLOR:
+    case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
+    case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
+        return 4;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glTexEnvfv_size( GLenum e )
-{
-    switch( e ) {
-        case GL_ALPHA_SCALE:
-        case GL_TEXTURE_ENV_MODE:
-        case GL_TEXTURE_LOD_BIAS:
-        case GL_COMBINE_RGB:
-        case GL_COMBINE_ALPHA:
-        case GL_RGB_SCALE:
-        case GL_SOURCE0_RGB:
-        case GL_SOURCE1_RGB:
-        case GL_SOURCE2_RGB:
-        case GL_SOURCE3_RGB_NV:
-        case GL_SOURCE0_ALPHA:
-        case GL_SOURCE1_ALPHA:
-        case GL_SOURCE2_ALPHA:
-        case GL_SOURCE3_ALPHA_NV:
-        case GL_OPERAND0_RGB:
-        case GL_OPERAND1_RGB:
-        case GL_OPERAND2_RGB:
-        case GL_OPERAND3_RGB_NV:
-        case GL_OPERAND0_ALPHA:
-        case GL_OPERAND1_ALPHA:
-        case GL_OPERAND2_ALPHA:
-        case GL_OPERAND3_ALPHA_NV:
-        case GL_COORD_REPLACE_ARB:
+__glTexEnvfv_size(GLenum e)
+{
+    switch (e) {
+    case GL_ALPHA_SCALE:
+    case GL_TEXTURE_ENV_MODE:
+    case GL_TEXTURE_LOD_BIAS:
+    case GL_COMBINE_RGB:
+    case GL_COMBINE_ALPHA:
+    case GL_RGB_SCALE:
+    case GL_SOURCE0_RGB:
+    case GL_SOURCE1_RGB:
+    case GL_SOURCE2_RGB:
+    case GL_SOURCE3_RGB_NV:
+    case GL_SOURCE0_ALPHA:
+    case GL_SOURCE1_ALPHA:
+    case GL_SOURCE2_ALPHA:
+    case GL_SOURCE3_ALPHA_NV:
+    case GL_OPERAND0_RGB:
+    case GL_OPERAND1_RGB:
+    case GL_OPERAND2_RGB:
+    case GL_OPERAND3_RGB_NV:
+    case GL_OPERAND0_ALPHA:
+    case GL_OPERAND1_ALPHA:
+    case GL_OPERAND2_ALPHA:
+    case GL_OPERAND3_ALPHA_NV:
+    case GL_COORD_REPLACE_ARB:
 /*      case GL_COORD_REPLACE_NV:*/
-            return 1;
-        case GL_TEXTURE_ENV_COLOR:
-            return 4;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glTexGendv_size( GLenum e )
-{
-    switch( e ) {
-        case GL_TEXTURE_GEN_MODE:
-            return 1;
-        case GL_OBJECT_PLANE:
-        case GL_EYE_PLANE:
-            return 4;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glMap1d_size( GLenum e )
-{
-    switch( e ) {
-        case GL_MAP1_INDEX:
-        case GL_MAP1_TEXTURE_COORD_1:
-            return 1;
-        case GL_MAP1_TEXTURE_COORD_2:
-            return 2;
-        case GL_MAP1_NORMAL:
-        case GL_MAP1_TEXTURE_COORD_3:
-        case GL_MAP1_VERTEX_3:
-            return 3;
-        case GL_MAP1_COLOR_4:
-        case GL_MAP1_TEXTURE_COORD_4:
-        case GL_MAP1_VERTEX_4:
-            return 4;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glMap2d_size( GLenum e )
-{
-    switch( e ) {
-        case GL_MAP2_INDEX:
-        case GL_MAP2_TEXTURE_COORD_1:
-            return 1;
-        case GL_MAP2_TEXTURE_COORD_2:
-            return 2;
-        case GL_MAP2_NORMAL:
-        case GL_MAP2_TEXTURE_COORD_3:
-        case GL_MAP2_VERTEX_3:
-            return 3;
-        case GL_MAP2_COLOR_4:
-        case GL_MAP2_TEXTURE_COORD_4:
-        case GL_MAP2_VERTEX_4:
-            return 4;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glGetBooleanv_size( GLenum e )
-{
-    switch( e ) {
-        case GL_CURRENT_INDEX:
-        case GL_CURRENT_RASTER_INDEX:
-        case GL_CURRENT_RASTER_POSITION_VALID:
-        case GL_CURRENT_RASTER_DISTANCE:
-        case GL_POINT_SMOOTH:
-        case GL_POINT_SIZE:
-        case GL_SMOOTH_POINT_SIZE_GRANULARITY:
-        case GL_LINE_SMOOTH:
-        case GL_LINE_WIDTH:
-        case GL_LINE_WIDTH_GRANULARITY:
-        case GL_LINE_STIPPLE:
-        case GL_LINE_STIPPLE_PATTERN:
-        case GL_LINE_STIPPLE_REPEAT:
-        case GL_LIST_MODE:
-        case GL_MAX_LIST_NESTING:
-        case GL_LIST_BASE:
-        case GL_LIST_INDEX:
-        case GL_POLYGON_SMOOTH:
-        case GL_POLYGON_STIPPLE:
-        case GL_EDGE_FLAG:
-        case GL_CULL_FACE:
-        case GL_CULL_FACE_MODE:
-        case GL_FRONT_FACE:
-        case GL_LIGHTING:
-        case GL_LIGHT_MODEL_LOCAL_VIEWER:
-        case GL_LIGHT_MODEL_TWO_SIDE:
-        case GL_SHADE_MODEL:
-        case GL_COLOR_MATERIAL_FACE:
-        case GL_COLOR_MATERIAL_PARAMETER:
-        case GL_COLOR_MATERIAL:
-        case GL_FOG:
-        case GL_FOG_INDEX:
-        case GL_FOG_DENSITY:
-        case GL_FOG_START:
-        case GL_FOG_END:
-        case GL_FOG_MODE:
-        case GL_DEPTH_TEST:
-        case GL_DEPTH_WRITEMASK:
-        case GL_DEPTH_CLEAR_VALUE:
-        case GL_DEPTH_FUNC:
-        case GL_STENCIL_TEST:
-        case GL_STENCIL_CLEAR_VALUE:
-        case GL_STENCIL_FUNC:
-        case GL_STENCIL_VALUE_MASK:
-        case GL_STENCIL_FAIL:
-        case GL_STENCIL_PASS_DEPTH_FAIL:
-        case GL_STENCIL_PASS_DEPTH_PASS:
-        case GL_STENCIL_REF:
-        case GL_STENCIL_WRITEMASK:
-        case GL_MATRIX_MODE:
-        case GL_NORMALIZE:
-        case GL_MODELVIEW_STACK_DEPTH:
-        case GL_PROJECTION_STACK_DEPTH:
-        case GL_TEXTURE_STACK_DEPTH:
-        case GL_ATTRIB_STACK_DEPTH:
-        case GL_ALPHA_TEST:
-        case GL_ALPHA_TEST_FUNC:
-        case GL_ALPHA_TEST_REF:
-        case GL_DITHER:
-        case GL_BLEND_DST:
-        case GL_BLEND_SRC:
-        case GL_BLEND:
-        case GL_LOGIC_OP_MODE:
-        case GL_LOGIC_OP:
-        case GL_AUX_BUFFERS:
-        case GL_DRAW_BUFFER:
-        case GL_READ_BUFFER:
-        case GL_SCISSOR_TEST:
-        case GL_INDEX_CLEAR_VALUE:
-        case GL_INDEX_WRITEMASK:
-        case GL_INDEX_MODE:
-        case GL_RGBA_MODE:
-        case GL_DOUBLEBUFFER:
-        case GL_STEREO:
-        case GL_RENDER_MODE:
-        case GL_PERSPECTIVE_CORRECTION_HINT:
-        case GL_POINT_SMOOTH_HINT:
-        case GL_LINE_SMOOTH_HINT:
-        case GL_POLYGON_SMOOTH_HINT:
-        case GL_FOG_HINT:
-        case GL_TEXTURE_GEN_S:
-        case GL_TEXTURE_GEN_T:
-        case GL_TEXTURE_GEN_R:
-        case GL_TEXTURE_GEN_Q:
-        case GL_PIXEL_MAP_I_TO_I:
-        case GL_PIXEL_MAP_I_TO_I_SIZE:
-        case GL_PIXEL_MAP_S_TO_S_SIZE:
-        case GL_PIXEL_MAP_I_TO_R_SIZE:
-        case GL_PIXEL_MAP_I_TO_G_SIZE:
-        case GL_PIXEL_MAP_I_TO_B_SIZE:
-        case GL_PIXEL_MAP_I_TO_A_SIZE:
-        case GL_PIXEL_MAP_R_TO_R_SIZE:
-        case GL_PIXEL_MAP_G_TO_G_SIZE:
-        case GL_PIXEL_MAP_B_TO_B_SIZE:
-        case GL_PIXEL_MAP_A_TO_A_SIZE:
-        case GL_UNPACK_SWAP_BYTES:
-        case GL_UNPACK_LSB_FIRST:
-        case GL_UNPACK_ROW_LENGTH:
-        case GL_UNPACK_SKIP_ROWS:
-        case GL_UNPACK_SKIP_PIXELS:
-        case GL_UNPACK_ALIGNMENT:
-        case GL_PACK_SWAP_BYTES:
-        case GL_PACK_LSB_FIRST:
-        case GL_PACK_ROW_LENGTH:
-        case GL_PACK_SKIP_ROWS:
-        case GL_PACK_SKIP_PIXELS:
-        case GL_PACK_ALIGNMENT:
-        case GL_MAP_COLOR:
-        case GL_MAP_STENCIL:
-        case GL_INDEX_SHIFT:
-        case GL_INDEX_OFFSET:
-        case GL_RED_SCALE:
-        case GL_RED_BIAS:
-        case GL_ZOOM_X:
-        case GL_ZOOM_Y:
-        case GL_GREEN_SCALE:
-        case GL_GREEN_BIAS:
-        case GL_BLUE_SCALE:
-        case GL_BLUE_BIAS:
-        case GL_ALPHA_SCALE:
-        case GL_ALPHA_BIAS:
-        case GL_DEPTH_SCALE:
-        case GL_DEPTH_BIAS:
-        case GL_MAX_EVAL_ORDER:
-        case GL_MAX_LIGHTS:
-        case GL_MAX_CLIP_PLANES:
-        case GL_MAX_TEXTURE_SIZE:
-        case GL_MAX_PIXEL_MAP_TABLE:
-        case GL_MAX_ATTRIB_STACK_DEPTH:
-        case GL_MAX_MODELVIEW_STACK_DEPTH:
-        case GL_MAX_NAME_STACK_DEPTH:
-        case GL_MAX_PROJECTION_STACK_DEPTH:
-        case GL_MAX_TEXTURE_STACK_DEPTH:
-        case GL_SUBPIXEL_BITS:
-        case GL_INDEX_BITS:
-        case GL_RED_BITS:
-        case GL_GREEN_BITS:
-        case GL_BLUE_BITS:
-        case GL_ALPHA_BITS:
-        case GL_DEPTH_BITS:
-        case GL_STENCIL_BITS:
-        case GL_ACCUM_RED_BITS:
-        case GL_ACCUM_GREEN_BITS:
-        case GL_ACCUM_BLUE_BITS:
-        case GL_ACCUM_ALPHA_BITS:
-        case GL_NAME_STACK_DEPTH:
-        case GL_AUTO_NORMAL:
-        case GL_MAP1_COLOR_4:
-        case GL_MAP1_INDEX:
-        case GL_MAP1_NORMAL:
-        case GL_MAP1_TEXTURE_COORD_1:
-        case GL_MAP1_TEXTURE_COORD_2:
-        case GL_MAP1_TEXTURE_COORD_3:
-        case GL_MAP1_TEXTURE_COORD_4:
-        case GL_MAP1_VERTEX_3:
-        case GL_MAP1_VERTEX_4:
-        case GL_MAP2_COLOR_4:
-        case GL_MAP2_INDEX:
-        case GL_MAP2_NORMAL:
-        case GL_MAP2_TEXTURE_COORD_1:
-        case GL_MAP2_TEXTURE_COORD_2:
-        case GL_MAP2_TEXTURE_COORD_3:
-        case GL_MAP2_TEXTURE_COORD_4:
-        case GL_MAP2_VERTEX_3:
-        case GL_MAP2_VERTEX_4:
-        case GL_MAP1_GRID_SEGMENTS:
-        case GL_TEXTURE_1D:
-        case GL_TEXTURE_2D:
-        case GL_POLYGON_OFFSET_UNITS:
-        case GL_CLIP_PLANE0:
-        case GL_CLIP_PLANE1:
-        case GL_CLIP_PLANE2:
-        case GL_CLIP_PLANE3:
-        case GL_CLIP_PLANE4:
-        case GL_CLIP_PLANE5:
-        case GL_LIGHT0:
-        case GL_LIGHT1:
-        case GL_LIGHT2:
-        case GL_LIGHT3:
-        case GL_LIGHT4:
-        case GL_LIGHT5:
-        case GL_LIGHT6:
-        case GL_LIGHT7:
-        case GL_BLEND_EQUATION:
+        return 1;
+    case GL_TEXTURE_ENV_COLOR:
+        return 4;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glTexGendv_size(GLenum e)
+{
+    switch (e) {
+    case GL_TEXTURE_GEN_MODE:
+        return 1;
+    case GL_OBJECT_PLANE:
+    case GL_EYE_PLANE:
+        return 4;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glMap1d_size(GLenum e)
+{
+    switch (e) {
+    case GL_MAP1_INDEX:
+    case GL_MAP1_TEXTURE_COORD_1:
+        return 1;
+    case GL_MAP1_TEXTURE_COORD_2:
+        return 2;
+    case GL_MAP1_NORMAL:
+    case GL_MAP1_TEXTURE_COORD_3:
+    case GL_MAP1_VERTEX_3:
+        return 3;
+    case GL_MAP1_COLOR_4:
+    case GL_MAP1_TEXTURE_COORD_4:
+    case GL_MAP1_VERTEX_4:
+        return 4;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glMap2d_size(GLenum e)
+{
+    switch (e) {
+    case GL_MAP2_INDEX:
+    case GL_MAP2_TEXTURE_COORD_1:
+        return 1;
+    case GL_MAP2_TEXTURE_COORD_2:
+        return 2;
+    case GL_MAP2_NORMAL:
+    case GL_MAP2_TEXTURE_COORD_3:
+    case GL_MAP2_VERTEX_3:
+        return 3;
+    case GL_MAP2_COLOR_4:
+    case GL_MAP2_TEXTURE_COORD_4:
+    case GL_MAP2_VERTEX_4:
+        return 4;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glGetBooleanv_size(GLenum e)
+{
+    switch (e) {
+    case GL_CURRENT_INDEX:
+    case GL_CURRENT_RASTER_INDEX:
+    case GL_CURRENT_RASTER_POSITION_VALID:
+    case GL_CURRENT_RASTER_DISTANCE:
+    case GL_POINT_SMOOTH:
+    case GL_POINT_SIZE:
+    case GL_SMOOTH_POINT_SIZE_GRANULARITY:
+    case GL_LINE_SMOOTH:
+    case GL_LINE_WIDTH:
+    case GL_LINE_WIDTH_GRANULARITY:
+    case GL_LINE_STIPPLE:
+    case GL_LINE_STIPPLE_PATTERN:
+    case GL_LINE_STIPPLE_REPEAT:
+    case GL_LIST_MODE:
+    case GL_MAX_LIST_NESTING:
+    case GL_LIST_BASE:
+    case GL_LIST_INDEX:
+    case GL_POLYGON_SMOOTH:
+    case GL_POLYGON_STIPPLE:
+    case GL_EDGE_FLAG:
+    case GL_CULL_FACE:
+    case GL_CULL_FACE_MODE:
+    case GL_FRONT_FACE:
+    case GL_LIGHTING:
+    case GL_LIGHT_MODEL_LOCAL_VIEWER:
+    case GL_LIGHT_MODEL_TWO_SIDE:
+    case GL_SHADE_MODEL:
+    case GL_COLOR_MATERIAL_FACE:
+    case GL_COLOR_MATERIAL_PARAMETER:
+    case GL_COLOR_MATERIAL:
+    case GL_FOG:
+    case GL_FOG_INDEX:
+    case GL_FOG_DENSITY:
+    case GL_FOG_START:
+    case GL_FOG_END:
+    case GL_FOG_MODE:
+    case GL_DEPTH_TEST:
+    case GL_DEPTH_WRITEMASK:
+    case GL_DEPTH_CLEAR_VALUE:
+    case GL_DEPTH_FUNC:
+    case GL_STENCIL_TEST:
+    case GL_STENCIL_CLEAR_VALUE:
+    case GL_STENCIL_FUNC:
+    case GL_STENCIL_VALUE_MASK:
+    case GL_STENCIL_FAIL:
+    case GL_STENCIL_PASS_DEPTH_FAIL:
+    case GL_STENCIL_PASS_DEPTH_PASS:
+    case GL_STENCIL_REF:
+    case GL_STENCIL_WRITEMASK:
+    case GL_MATRIX_MODE:
+    case GL_NORMALIZE:
+    case GL_MODELVIEW_STACK_DEPTH:
+    case GL_PROJECTION_STACK_DEPTH:
+    case GL_TEXTURE_STACK_DEPTH:
+    case GL_ATTRIB_STACK_DEPTH:
+    case GL_ALPHA_TEST:
+    case GL_ALPHA_TEST_FUNC:
+    case GL_ALPHA_TEST_REF:
+    case GL_DITHER:
+    case GL_BLEND_DST:
+    case GL_BLEND_SRC:
+    case GL_BLEND:
+    case GL_LOGIC_OP_MODE:
+    case GL_LOGIC_OP:
+    case GL_AUX_BUFFERS:
+    case GL_DRAW_BUFFER:
+    case GL_READ_BUFFER:
+    case GL_SCISSOR_TEST:
+    case GL_INDEX_CLEAR_VALUE:
+    case GL_INDEX_WRITEMASK:
+    case GL_INDEX_MODE:
+    case GL_RGBA_MODE:
+    case GL_DOUBLEBUFFER:
+    case GL_STEREO:
+    case GL_RENDER_MODE:
+    case GL_PERSPECTIVE_CORRECTION_HINT:
+    case GL_POINT_SMOOTH_HINT:
+    case GL_LINE_SMOOTH_HINT:
+    case GL_POLYGON_SMOOTH_HINT:
+    case GL_FOG_HINT:
+    case GL_TEXTURE_GEN_S:
+    case GL_TEXTURE_GEN_T:
+    case GL_TEXTURE_GEN_R:
+    case GL_TEXTURE_GEN_Q:
+    case GL_PIXEL_MAP_I_TO_I:
+    case GL_PIXEL_MAP_I_TO_I_SIZE:
+    case GL_PIXEL_MAP_S_TO_S_SIZE:
+    case GL_PIXEL_MAP_I_TO_R_SIZE:
+    case GL_PIXEL_MAP_I_TO_G_SIZE:
+    case GL_PIXEL_MAP_I_TO_B_SIZE:
+    case GL_PIXEL_MAP_I_TO_A_SIZE:
+    case GL_PIXEL_MAP_R_TO_R_SIZE:
+    case GL_PIXEL_MAP_G_TO_G_SIZE:
+    case GL_PIXEL_MAP_B_TO_B_SIZE:
+    case GL_PIXEL_MAP_A_TO_A_SIZE:
+    case GL_UNPACK_SWAP_BYTES:
+    case GL_UNPACK_LSB_FIRST:
+    case GL_UNPACK_ROW_LENGTH:
+    case GL_UNPACK_SKIP_ROWS:
+    case GL_UNPACK_SKIP_PIXELS:
+    case GL_UNPACK_ALIGNMENT:
+    case GL_PACK_SWAP_BYTES:
+    case GL_PACK_LSB_FIRST:
+    case GL_PACK_ROW_LENGTH:
+    case GL_PACK_SKIP_ROWS:
+    case GL_PACK_SKIP_PIXELS:
+    case GL_PACK_ALIGNMENT:
+    case GL_MAP_COLOR:
+    case GL_MAP_STENCIL:
+    case GL_INDEX_SHIFT:
+    case GL_INDEX_OFFSET:
+    case GL_RED_SCALE:
+    case GL_RED_BIAS:
+    case GL_ZOOM_X:
+    case GL_ZOOM_Y:
+    case GL_GREEN_SCALE:
+    case GL_GREEN_BIAS:
+    case GL_BLUE_SCALE:
+    case GL_BLUE_BIAS:
+    case GL_ALPHA_SCALE:
+    case GL_ALPHA_BIAS:
+    case GL_DEPTH_SCALE:
+    case GL_DEPTH_BIAS:
+    case GL_MAX_EVAL_ORDER:
+    case GL_MAX_LIGHTS:
+    case GL_MAX_CLIP_PLANES:
+    case GL_MAX_TEXTURE_SIZE:
+    case GL_MAX_PIXEL_MAP_TABLE:
+    case GL_MAX_ATTRIB_STACK_DEPTH:
+    case GL_MAX_MODELVIEW_STACK_DEPTH:
+    case GL_MAX_NAME_STACK_DEPTH:
+    case GL_MAX_PROJECTION_STACK_DEPTH:
+    case GL_MAX_TEXTURE_STACK_DEPTH:
+    case GL_SUBPIXEL_BITS:
+    case GL_INDEX_BITS:
+    case GL_RED_BITS:
+    case GL_GREEN_BITS:
+    case GL_BLUE_BITS:
+    case GL_ALPHA_BITS:
+    case GL_DEPTH_BITS:
+    case GL_STENCIL_BITS:
+    case GL_ACCUM_RED_BITS:
+    case GL_ACCUM_GREEN_BITS:
+    case GL_ACCUM_BLUE_BITS:
+    case GL_ACCUM_ALPHA_BITS:
+    case GL_NAME_STACK_DEPTH:
+    case GL_AUTO_NORMAL:
+    case GL_MAP1_COLOR_4:
+    case GL_MAP1_INDEX:
+    case GL_MAP1_NORMAL:
+    case GL_MAP1_TEXTURE_COORD_1:
+    case GL_MAP1_TEXTURE_COORD_2:
+    case GL_MAP1_TEXTURE_COORD_3:
+    case GL_MAP1_TEXTURE_COORD_4:
+    case GL_MAP1_VERTEX_3:
+    case GL_MAP1_VERTEX_4:
+    case GL_MAP2_COLOR_4:
+    case GL_MAP2_INDEX:
+    case GL_MAP2_NORMAL:
+    case GL_MAP2_TEXTURE_COORD_1:
+    case GL_MAP2_TEXTURE_COORD_2:
+    case GL_MAP2_TEXTURE_COORD_3:
+    case GL_MAP2_TEXTURE_COORD_4:
+    case GL_MAP2_VERTEX_3:
+    case GL_MAP2_VERTEX_4:
+    case GL_MAP1_GRID_SEGMENTS:
+    case GL_TEXTURE_1D:
+    case GL_TEXTURE_2D:
+    case GL_POLYGON_OFFSET_UNITS:
+    case GL_CLIP_PLANE0:
+    case GL_CLIP_PLANE1:
+    case GL_CLIP_PLANE2:
+    case GL_CLIP_PLANE3:
+    case GL_CLIP_PLANE4:
+    case GL_CLIP_PLANE5:
+    case GL_LIGHT0:
+    case GL_LIGHT1:
+    case GL_LIGHT2:
+    case GL_LIGHT3:
+    case GL_LIGHT4:
+    case GL_LIGHT5:
+    case GL_LIGHT6:
+    case GL_LIGHT7:
+    case GL_BLEND_EQUATION:
 /*      case GL_BLEND_EQUATION_EXT:*/
-        case GL_CONVOLUTION_1D:
-        case GL_CONVOLUTION_2D:
-        case GL_SEPARABLE_2D:
-        case GL_MAX_CONVOLUTION_WIDTH:
+    case GL_CONVOLUTION_1D:
+    case GL_CONVOLUTION_2D:
+    case GL_SEPARABLE_2D:
+    case GL_MAX_CONVOLUTION_WIDTH:
 /*      case GL_MAX_CONVOLUTION_WIDTH_EXT:*/
-        case GL_MAX_CONVOLUTION_HEIGHT:
+    case GL_MAX_CONVOLUTION_HEIGHT:
 /*      case GL_MAX_CONVOLUTION_HEIGHT_EXT:*/
-        case GL_POST_CONVOLUTION_RED_SCALE:
+    case GL_POST_CONVOLUTION_RED_SCALE:
 /*      case GL_POST_CONVOLUTION_RED_SCALE_EXT:*/
-        case GL_POST_CONVOLUTION_GREEN_SCALE:
+    case GL_POST_CONVOLUTION_GREEN_SCALE:
 /*      case GL_POST_CONVOLUTION_GREEN_SCALE_EXT:*/
-        case GL_POST_CONVOLUTION_BLUE_SCALE:
+    case GL_POST_CONVOLUTION_BLUE_SCALE:
 /*      case GL_POST_CONVOLUTION_BLUE_SCALE_EXT:*/
-        case GL_POST_CONVOLUTION_ALPHA_SCALE:
+    case GL_POST_CONVOLUTION_ALPHA_SCALE:
 /*      case GL_POST_CONVOLUTION_ALPHA_SCALE_EXT:*/
-        case GL_POST_CONVOLUTION_RED_BIAS:
+    case GL_POST_CONVOLUTION_RED_BIAS:
 /*      case GL_POST_CONVOLUTION_RED_BIAS_EXT:*/
-        case GL_POST_CONVOLUTION_GREEN_BIAS:
+    case GL_POST_CONVOLUTION_GREEN_BIAS:
 /*      case GL_POST_CONVOLUTION_GREEN_BIAS_EXT:*/
-        case GL_POST_CONVOLUTION_BLUE_BIAS:
+    case GL_POST_CONVOLUTION_BLUE_BIAS:
 /*      case GL_POST_CONVOLUTION_BLUE_BIAS_EXT:*/
-        case GL_POST_CONVOLUTION_ALPHA_BIAS:
+    case GL_POST_CONVOLUTION_ALPHA_BIAS:
 /*      case GL_POST_CONVOLUTION_ALPHA_BIAS_EXT:*/
-        case GL_HISTOGRAM:
-        case GL_MINMAX:
-        case GL_POLYGON_OFFSET_FACTOR:
-        case GL_RESCALE_NORMAL:
+    case GL_HISTOGRAM:
+    case GL_MINMAX:
+    case GL_POLYGON_OFFSET_FACTOR:
+    case GL_RESCALE_NORMAL:
 /*      case GL_RESCALE_NORMAL_EXT:*/
-        case GL_TEXTURE_BINDING_1D:
-        case GL_TEXTURE_BINDING_2D:
-        case GL_TEXTURE_BINDING_3D:
-        case GL_PACK_SKIP_IMAGES:
-        case GL_PACK_IMAGE_HEIGHT:
-        case GL_UNPACK_SKIP_IMAGES:
-        case GL_UNPACK_IMAGE_HEIGHT:
-        case GL_TEXTURE_3D:
-        case GL_VERTEX_ARRAY:
-        case GL_NORMAL_ARRAY:
-        case GL_COLOR_ARRAY:
-        case GL_INDEX_ARRAY:
-        case GL_TEXTURE_COORD_ARRAY:
-        case GL_EDGE_FLAG_ARRAY:
-        case GL_VERTEX_ARRAY_SIZE:
-        case GL_VERTEX_ARRAY_TYPE:
-        case GL_VERTEX_ARRAY_STRIDE:
-        case GL_NORMAL_ARRAY_TYPE:
-        case GL_NORMAL_ARRAY_STRIDE:
-        case GL_COLOR_ARRAY_SIZE:
-        case GL_COLOR_ARRAY_TYPE:
-        case GL_COLOR_ARRAY_STRIDE:
-        case GL_INDEX_ARRAY_TYPE:
-        case GL_INDEX_ARRAY_STRIDE:
-        case GL_TEXTURE_COORD_ARRAY_SIZE:
-        case GL_TEXTURE_COORD_ARRAY_TYPE:
-        case GL_TEXTURE_COORD_ARRAY_STRIDE:
-        case GL_EDGE_FLAG_ARRAY_STRIDE:
-        case GL_MULTISAMPLE:
+    case GL_TEXTURE_BINDING_1D:
+    case GL_TEXTURE_BINDING_2D:
+    case GL_TEXTURE_BINDING_3D:
+    case GL_PACK_SKIP_IMAGES:
+    case GL_PACK_IMAGE_HEIGHT:
+    case GL_UNPACK_SKIP_IMAGES:
+    case GL_UNPACK_IMAGE_HEIGHT:
+    case GL_TEXTURE_3D:
+    case GL_VERTEX_ARRAY:
+    case GL_NORMAL_ARRAY:
+    case GL_COLOR_ARRAY:
+    case GL_INDEX_ARRAY:
+    case GL_TEXTURE_COORD_ARRAY:
+    case GL_EDGE_FLAG_ARRAY:
+    case GL_VERTEX_ARRAY_SIZE:
+    case GL_VERTEX_ARRAY_TYPE:
+    case GL_VERTEX_ARRAY_STRIDE:
+    case GL_NORMAL_ARRAY_TYPE:
+    case GL_NORMAL_ARRAY_STRIDE:
+    case GL_COLOR_ARRAY_SIZE:
+    case GL_COLOR_ARRAY_TYPE:
+    case GL_COLOR_ARRAY_STRIDE:
+    case GL_INDEX_ARRAY_TYPE:
+    case GL_INDEX_ARRAY_STRIDE:
+    case GL_TEXTURE_COORD_ARRAY_SIZE:
+    case GL_TEXTURE_COORD_ARRAY_TYPE:
+    case GL_TEXTURE_COORD_ARRAY_STRIDE:
+    case GL_EDGE_FLAG_ARRAY_STRIDE:
+    case GL_MULTISAMPLE:
 /*      case GL_MULTISAMPLE_ARB:*/
-        case GL_SAMPLE_ALPHA_TO_COVERAGE:
+    case GL_SAMPLE_ALPHA_TO_COVERAGE:
 /*      case GL_SAMPLE_ALPHA_TO_COVERAGE_ARB:*/
-        case GL_SAMPLE_ALPHA_TO_ONE:
+    case GL_SAMPLE_ALPHA_TO_ONE:
 /*      case GL_SAMPLE_ALPHA_TO_ONE_ARB:*/
-        case GL_SAMPLE_COVERAGE:
+    case GL_SAMPLE_COVERAGE:
 /*      case GL_SAMPLE_COVERAGE_ARB:*/
-        case GL_SAMPLE_BUFFERS:
+    case GL_SAMPLE_BUFFERS:
 /*      case GL_SAMPLE_BUFFERS_ARB:*/
-        case GL_SAMPLES:
+    case GL_SAMPLES:
 /*      case GL_SAMPLES_ARB:*/
-        case GL_SAMPLE_COVERAGE_VALUE:
+    case GL_SAMPLE_COVERAGE_VALUE:
 /*      case GL_SAMPLE_COVERAGE_VALUE_ARB:*/
-        case GL_SAMPLE_COVERAGE_INVERT:
+    case GL_SAMPLE_COVERAGE_INVERT:
 /*      case GL_SAMPLE_COVERAGE_INVERT_ARB:*/
-        case GL_COLOR_MATRIX_STACK_DEPTH:
-        case GL_MAX_COLOR_MATRIX_STACK_DEPTH:
-        case GL_POST_COLOR_MATRIX_RED_SCALE:
-        case GL_POST_COLOR_MATRIX_GREEN_SCALE:
-        case GL_POST_COLOR_MATRIX_BLUE_SCALE:
-        case GL_POST_COLOR_MATRIX_ALPHA_SCALE:
-        case GL_POST_COLOR_MATRIX_RED_BIAS:
-        case GL_POST_COLOR_MATRIX_GREEN_BIAS:
-        case GL_POST_COLOR_MATRIX_BLUE_BIAS:
-        case GL_POST_COLOR_MATRIX_ALPHA_BIAS:
-        case GL_BLEND_DST_RGB:
-        case GL_BLEND_SRC_RGB:
-        case GL_BLEND_DST_ALPHA:
-        case GL_BLEND_SRC_ALPHA:
-        case GL_COLOR_TABLE:
-        case GL_POST_CONVOLUTION_COLOR_TABLE:
-        case GL_POST_COLOR_MATRIX_COLOR_TABLE:
-        case GL_MAX_ELEMENTS_VERTICES:
-        case GL_MAX_ELEMENTS_INDICES:
-        case GL_CLIP_VOLUME_CLIPPING_HINT_EXT:
-        case GL_OCCLUSION_TEST_HP:
-        case GL_OCCLUSION_TEST_RESULT_HP:
-        case GL_LIGHT_MODEL_COLOR_CONTROL:
-        case GL_CURRENT_FOG_COORD:
-        case GL_FOG_COORDINATE_ARRAY_TYPE:
-        case GL_FOG_COORDINATE_ARRAY_STRIDE:
-        case GL_FOG_COORD_ARRAY:
-        case GL_COLOR_SUM_ARB:
-        case GL_SECONDARY_COLOR_ARRAY_SIZE:
-        case GL_SECONDARY_COLOR_ARRAY_TYPE:
-        case GL_SECONDARY_COLOR_ARRAY_STRIDE:
-        case GL_SECONDARY_COLOR_ARRAY:
-        case GL_ACTIVE_TEXTURE:
+    case GL_COLOR_MATRIX_STACK_DEPTH:
+    case GL_MAX_COLOR_MATRIX_STACK_DEPTH:
+    case GL_POST_COLOR_MATRIX_RED_SCALE:
+    case GL_POST_COLOR_MATRIX_GREEN_SCALE:
+    case GL_POST_COLOR_MATRIX_BLUE_SCALE:
+    case GL_POST_COLOR_MATRIX_ALPHA_SCALE:
+    case GL_POST_COLOR_MATRIX_RED_BIAS:
+    case GL_POST_COLOR_MATRIX_GREEN_BIAS:
+    case GL_POST_COLOR_MATRIX_BLUE_BIAS:
+    case GL_POST_COLOR_MATRIX_ALPHA_BIAS:
+    case GL_BLEND_DST_RGB:
+    case GL_BLEND_SRC_RGB:
+    case GL_BLEND_DST_ALPHA:
+    case GL_BLEND_SRC_ALPHA:
+    case GL_COLOR_TABLE:
+    case GL_POST_CONVOLUTION_COLOR_TABLE:
+    case GL_POST_COLOR_MATRIX_COLOR_TABLE:
+    case GL_MAX_ELEMENTS_VERTICES:
+    case GL_MAX_ELEMENTS_INDICES:
+    case GL_CLIP_VOLUME_CLIPPING_HINT_EXT:
+    case GL_OCCLUSION_TEST_HP:
+    case GL_OCCLUSION_TEST_RESULT_HP:
+    case GL_LIGHT_MODEL_COLOR_CONTROL:
+    case GL_CURRENT_FOG_COORD:
+    case GL_FOG_COORDINATE_ARRAY_TYPE:
+    case GL_FOG_COORDINATE_ARRAY_STRIDE:
+    case GL_FOG_COORD_ARRAY:
+    case GL_COLOR_SUM_ARB:
+    case GL_SECONDARY_COLOR_ARRAY_SIZE:
+    case GL_SECONDARY_COLOR_ARRAY_TYPE:
+    case GL_SECONDARY_COLOR_ARRAY_STRIDE:
+    case GL_SECONDARY_COLOR_ARRAY:
+    case GL_ACTIVE_TEXTURE:
 /*      case GL_ACTIVE_TEXTURE_ARB:*/
-        case GL_CLIENT_ACTIVE_TEXTURE:
+    case GL_CLIENT_ACTIVE_TEXTURE:
 /*      case GL_CLIENT_ACTIVE_TEXTURE_ARB:*/
-        case GL_MAX_TEXTURE_UNITS:
+    case GL_MAX_TEXTURE_UNITS:
 /*      case GL_MAX_TEXTURE_UNITS_ARB:*/
-        case GL_TEXTURE_COMPRESSION_HINT:
+    case GL_TEXTURE_COMPRESSION_HINT:
 /*      case GL_TEXTURE_COMPRESSION_HINT_ARB:*/
-        case GL_TEXTURE_RECTANGLE_ARB:
+    case GL_TEXTURE_RECTANGLE_ARB:
 /*      case GL_TEXTURE_RECTANGLE_NV:*/
-        case GL_TEXTURE_BINDING_RECTANGLE_ARB:
+    case GL_TEXTURE_BINDING_RECTANGLE_ARB:
 /*      case GL_TEXTURE_BINDING_RECTANGLE_NV:*/
-        case GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB:
+    case GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB:
 /*      case GL_MAX_RECTANGLE_TEXTURE_SIZE_NV:*/
-        case GL_MAX_TEXTURE_LOD_BIAS:
-        case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
-        case GL_MAX_SHININESS_NV:
-        case GL_MAX_SPOT_EXPONENT_NV:
-        case GL_TEXTURE_CUBE_MAP:
+    case GL_MAX_TEXTURE_LOD_BIAS:
+    case GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT:
+    case GL_MAX_SHININESS_NV:
+    case GL_MAX_SPOT_EXPONENT_NV:
+    case GL_TEXTURE_CUBE_MAP:
 /*      case GL_TEXTURE_CUBE_MAP_ARB:*/
-        case GL_TEXTURE_BINDING_CUBE_MAP:
+    case GL_TEXTURE_BINDING_CUBE_MAP:
 /*      case GL_TEXTURE_BINDING_CUBE_MAP_ARB:*/
-        case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
+    case GL_MAX_CUBE_MAP_TEXTURE_SIZE:
 /*      case GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB:*/
-        case GL_MULTISAMPLE_FILTER_HINT_NV:
-        case GL_FOG_DISTANCE_MODE_NV:
-        case GL_VERTEX_PROGRAM_ARB:
-        case GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB:
-        case GL_MAX_PROGRAM_MATRICES_ARB:
-        case GL_CURRENT_MATRIX_STACK_DEPTH_ARB:
-        case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
-        case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
-        case GL_PROGRAM_ERROR_POSITION_ARB:
-        case GL_DEPTH_CLAMP_NV:
-        case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
+    case GL_MULTISAMPLE_FILTER_HINT_NV:
+    case GL_FOG_DISTANCE_MODE_NV:
+    case GL_VERTEX_PROGRAM_ARB:
+    case GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB:
+    case GL_MAX_PROGRAM_MATRICES_ARB:
+    case GL_CURRENT_MATRIX_STACK_DEPTH_ARB:
+    case GL_VERTEX_PROGRAM_POINT_SIZE_ARB:
+    case GL_VERTEX_PROGRAM_TWO_SIDE_ARB:
+    case GL_PROGRAM_ERROR_POSITION_ARB:
+    case GL_DEPTH_CLAMP_NV:
+    case GL_NUM_COMPRESSED_TEXTURE_FORMATS:
 /*      case GL_NUM_TEXTURE_COMPRESSED_FORMATS_ARB:*/
-        case GL_MAX_VERTEX_UNITS_ARB:
-        case GL_ACTIVE_VERTEX_UNITS_ARB:
-        case GL_WEIGHT_SUM_UNITY_ARB:
-        case GL_VERTEX_BLEND_ARB:
-        case GL_CURRENT_WEIGHT_ARB:
-        case GL_WEIGHT_ARRAY_TYPE_ARB:
-        case GL_WEIGHT_ARRAY_STRIDE_ARB:
-        case GL_WEIGHT_ARRAY_SIZE_ARB:
-        case GL_WEIGHT_ARRAY_ARB:
-        case GL_PACK_INVERT_MESA:
-        case GL_FRAGMENT_PROGRAM_ARB:
-        case GL_MAX_DRAW_BUFFERS_ARB:
+    case GL_MAX_VERTEX_UNITS_ARB:
+    case GL_ACTIVE_VERTEX_UNITS_ARB:
+    case GL_WEIGHT_SUM_UNITY_ARB:
+    case GL_VERTEX_BLEND_ARB:
+    case GL_CURRENT_WEIGHT_ARB:
+    case GL_WEIGHT_ARRAY_TYPE_ARB:
+    case GL_WEIGHT_ARRAY_STRIDE_ARB:
+    case GL_WEIGHT_ARRAY_SIZE_ARB:
+    case GL_WEIGHT_ARRAY_ARB:
+    case GL_PACK_INVERT_MESA:
+    case GL_FRAGMENT_PROGRAM_ARB:
+    case GL_MAX_DRAW_BUFFERS_ARB:
 /*      case GL_MAX_DRAW_BUFFERS_ATI:*/
-        case GL_DRAW_BUFFER0_ARB:
+    case GL_DRAW_BUFFER0_ARB:
 /*      case GL_DRAW_BUFFER0_ATI:*/
-        case GL_DRAW_BUFFER1_ARB:
+    case GL_DRAW_BUFFER1_ARB:
 /*      case GL_DRAW_BUFFER1_ATI:*/
-        case GL_DRAW_BUFFER2_ARB:
+    case GL_DRAW_BUFFER2_ARB:
 /*      case GL_DRAW_BUFFER2_ATI:*/
-        case GL_DRAW_BUFFER3_ARB:
+    case GL_DRAW_BUFFER3_ARB:
 /*      case GL_DRAW_BUFFER3_ATI:*/
-        case GL_DRAW_BUFFER4_ARB:
+    case GL_DRAW_BUFFER4_ARB:
 /*      case GL_DRAW_BUFFER4_ATI:*/
-        case GL_DRAW_BUFFER5_ARB:
+    case GL_DRAW_BUFFER5_ARB:
 /*      case GL_DRAW_BUFFER5_ATI:*/
-        case GL_DRAW_BUFFER6_ARB:
+    case GL_DRAW_BUFFER6_ARB:
 /*      case GL_DRAW_BUFFER6_ATI:*/
-        case GL_DRAW_BUFFER7_ARB:
+    case GL_DRAW_BUFFER7_ARB:
 /*      case GL_DRAW_BUFFER7_ATI:*/
-        case GL_DRAW_BUFFER8_ARB:
+    case GL_DRAW_BUFFER8_ARB:
 /*      case GL_DRAW_BUFFER8_ATI:*/
-        case GL_DRAW_BUFFER9_ARB:
+    case GL_DRAW_BUFFER9_ARB:
 /*      case GL_DRAW_BUFFER9_ATI:*/
-        case GL_DRAW_BUFFER10_ARB:
+    case GL_DRAW_BUFFER10_ARB:
 /*      case GL_DRAW_BUFFER10_ATI:*/
-        case GL_DRAW_BUFFER11_ARB:
+    case GL_DRAW_BUFFER11_ARB:
 /*      case GL_DRAW_BUFFER11_ATI:*/
-        case GL_DRAW_BUFFER12_ARB:
+    case GL_DRAW_BUFFER12_ARB:
 /*      case GL_DRAW_BUFFER12_ATI:*/
-        case GL_DRAW_BUFFER13_ARB:
+    case GL_DRAW_BUFFER13_ARB:
 /*      case GL_DRAW_BUFFER13_ATI:*/
-        case GL_DRAW_BUFFER14_ARB:
+    case GL_DRAW_BUFFER14_ARB:
 /*      case GL_DRAW_BUFFER14_ATI:*/
-        case GL_DRAW_BUFFER15_ARB:
+    case GL_DRAW_BUFFER15_ARB:
 /*      case GL_DRAW_BUFFER15_ATI:*/
-        case GL_BLEND_EQUATION_ALPHA_EXT:
-        case GL_MATRIX_PALETTE_ARB:
-        case GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB:
-        case GL_MAX_PALETTE_MATRICES_ARB:
-        case GL_CURRENT_PALETTE_MATRIX_ARB:
-        case GL_MATRIX_INDEX_ARRAY_ARB:
-        case GL_CURRENT_MATRIX_INDEX_ARB:
-        case GL_MATRIX_INDEX_ARRAY_SIZE_ARB:
-        case GL_MATRIX_INDEX_ARRAY_TYPE_ARB:
-        case GL_MATRIX_INDEX_ARRAY_STRIDE_ARB:
-        case GL_POINT_SPRITE_ARB:
+    case GL_BLEND_EQUATION_ALPHA_EXT:
+    case GL_MATRIX_PALETTE_ARB:
+    case GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB:
+    case GL_MAX_PALETTE_MATRICES_ARB:
+    case GL_CURRENT_PALETTE_MATRIX_ARB:
+    case GL_MATRIX_INDEX_ARRAY_ARB:
+    case GL_CURRENT_MATRIX_INDEX_ARB:
+    case GL_MATRIX_INDEX_ARRAY_SIZE_ARB:
+    case GL_MATRIX_INDEX_ARRAY_TYPE_ARB:
+    case GL_MATRIX_INDEX_ARRAY_STRIDE_ARB:
+    case GL_POINT_SPRITE_ARB:
 /*      case GL_POINT_SPRITE_NV:*/
-        case GL_POINT_SPRITE_R_MODE_NV:
-        case GL_MAX_VERTEX_ATTRIBS_ARB:
-        case GL_DEPTH_BOUNDS_TEST_EXT:
-        case GL_STENCIL_TEST_TWO_SIDE_EXT:
-        case GL_ACTIVE_STENCIL_FACE_EXT:
-        case GL_RASTER_POSITION_UNCLIPPED_IBM:
-            return 1;
-        case GL_SMOOTH_POINT_SIZE_RANGE:
-        case GL_LINE_WIDTH_RANGE:
-        case GL_POLYGON_MODE:
-        case GL_DEPTH_RANGE:
-        case GL_MAX_VIEWPORT_DIMS:
-        case GL_MAP1_GRID_DOMAIN:
-        case GL_MAP2_GRID_SEGMENTS:
-        case GL_ALIASED_POINT_SIZE_RANGE:
-        case GL_ALIASED_LINE_WIDTH_RANGE:
-        case GL_DEPTH_BOUNDS_EXT:
-            return 2;
-        case GL_CURRENT_NORMAL:
-            return 3;
-        case GL_CURRENT_COLOR:
-        case GL_CURRENT_TEXTURE_COORDS:
-        case GL_CURRENT_RASTER_COLOR:
-        case GL_CURRENT_RASTER_TEXTURE_COORDS:
-        case GL_CURRENT_RASTER_POSITION:
-        case GL_LIGHT_MODEL_AMBIENT:
-        case GL_FOG_COLOR:
-        case GL_ACCUM_CLEAR_VALUE:
-        case GL_VIEWPORT:
-        case GL_SCISSOR_BOX:
-        case GL_COLOR_CLEAR_VALUE:
-        case GL_COLOR_WRITEMASK:
-        case GL_MAP2_GRID_DOMAIN:
-        case GL_BLEND_COLOR:
+    case GL_POINT_SPRITE_R_MODE_NV:
+    case GL_MAX_VERTEX_ATTRIBS_ARB:
+    case GL_DEPTH_BOUNDS_TEST_EXT:
+    case GL_STENCIL_TEST_TWO_SIDE_EXT:
+    case GL_ACTIVE_STENCIL_FACE_EXT:
+    case GL_RASTER_POSITION_UNCLIPPED_IBM:
+        return 1;
+    case GL_SMOOTH_POINT_SIZE_RANGE:
+    case GL_LINE_WIDTH_RANGE:
+    case GL_POLYGON_MODE:
+    case GL_DEPTH_RANGE:
+    case GL_MAX_VIEWPORT_DIMS:
+    case GL_MAP1_GRID_DOMAIN:
+    case GL_MAP2_GRID_SEGMENTS:
+    case GL_ALIASED_POINT_SIZE_RANGE:
+    case GL_ALIASED_LINE_WIDTH_RANGE:
+    case GL_DEPTH_BOUNDS_EXT:
+        return 2;
+    case GL_CURRENT_NORMAL:
+        return 3;
+    case GL_CURRENT_COLOR:
+    case GL_CURRENT_TEXTURE_COORDS:
+    case GL_CURRENT_RASTER_COLOR:
+    case GL_CURRENT_RASTER_TEXTURE_COORDS:
+    case GL_CURRENT_RASTER_POSITION:
+    case GL_LIGHT_MODEL_AMBIENT:
+    case GL_FOG_COLOR:
+    case GL_ACCUM_CLEAR_VALUE:
+    case GL_VIEWPORT:
+    case GL_SCISSOR_BOX:
+    case GL_COLOR_CLEAR_VALUE:
+    case GL_COLOR_WRITEMASK:
+    case GL_MAP2_GRID_DOMAIN:
+    case GL_BLEND_COLOR:
 /*      case GL_BLEND_COLOR_EXT:*/
-        case GL_CURRENT_SECONDARY_COLOR:
-            return 4;
-        case GL_MODELVIEW_MATRIX:
-        case GL_PROJECTION_MATRIX:
-        case GL_TEXTURE_MATRIX:
-        case GL_MODELVIEW0_ARB:
-        case GL_COLOR_MATRIX:
-        case GL_MODELVIEW1_ARB:
-        case GL_CURRENT_MATRIX_ARB:
-        case GL_MODELVIEW2_ARB:
-        case GL_MODELVIEW3_ARB:
-        case GL_MODELVIEW4_ARB:
-        case GL_MODELVIEW5_ARB:
-        case GL_MODELVIEW6_ARB:
-        case GL_MODELVIEW7_ARB:
-        case GL_MODELVIEW8_ARB:
-        case GL_MODELVIEW9_ARB:
-        case GL_MODELVIEW10_ARB:
-        case GL_MODELVIEW11_ARB:
-        case GL_MODELVIEW12_ARB:
-        case GL_MODELVIEW13_ARB:
-        case GL_MODELVIEW14_ARB:
-        case GL_MODELVIEW15_ARB:
-        case GL_MODELVIEW16_ARB:
-        case GL_MODELVIEW17_ARB:
-        case GL_MODELVIEW18_ARB:
-        case GL_MODELVIEW19_ARB:
-        case GL_MODELVIEW20_ARB:
-        case GL_MODELVIEW21_ARB:
-        case GL_MODELVIEW22_ARB:
-        case GL_MODELVIEW23_ARB:
-        case GL_MODELVIEW24_ARB:
-        case GL_MODELVIEW25_ARB:
-        case GL_MODELVIEW26_ARB:
-        case GL_MODELVIEW27_ARB:
-        case GL_MODELVIEW28_ARB:
-        case GL_MODELVIEW29_ARB:
-        case GL_MODELVIEW30_ARB:
-        case GL_MODELVIEW31_ARB:
-        case GL_TRANSPOSE_CURRENT_MATRIX_ARB:
-            return 16;
-        case GL_FOG_COORDINATE_SOURCE:
-        case GL_COMPRESSED_TEXTURE_FORMATS:
-            return __glGetBooleanv_variable_size( e );
-        default: return 0;
+    case GL_CURRENT_SECONDARY_COLOR:
+        return 4;
+    case GL_MODELVIEW_MATRIX:
+    case GL_PROJECTION_MATRIX:
+    case GL_TEXTURE_MATRIX:
+    case GL_MODELVIEW0_ARB:
+    case GL_COLOR_MATRIX:
+    case GL_MODELVIEW1_ARB:
+    case GL_CURRENT_MATRIX_ARB:
+    case GL_MODELVIEW2_ARB:
+    case GL_MODELVIEW3_ARB:
+    case GL_MODELVIEW4_ARB:
+    case GL_MODELVIEW5_ARB:
+    case GL_MODELVIEW6_ARB:
+    case GL_MODELVIEW7_ARB:
+    case GL_MODELVIEW8_ARB:
+    case GL_MODELVIEW9_ARB:
+    case GL_MODELVIEW10_ARB:
+    case GL_MODELVIEW11_ARB:
+    case GL_MODELVIEW12_ARB:
+    case GL_MODELVIEW13_ARB:
+    case GL_MODELVIEW14_ARB:
+    case GL_MODELVIEW15_ARB:
+    case GL_MODELVIEW16_ARB:
+    case GL_MODELVIEW17_ARB:
+    case GL_MODELVIEW18_ARB:
+    case GL_MODELVIEW19_ARB:
+    case GL_MODELVIEW20_ARB:
+    case GL_MODELVIEW21_ARB:
+    case GL_MODELVIEW22_ARB:
+    case GL_MODELVIEW23_ARB:
+    case GL_MODELVIEW24_ARB:
+    case GL_MODELVIEW25_ARB:
+    case GL_MODELVIEW26_ARB:
+    case GL_MODELVIEW27_ARB:
+    case GL_MODELVIEW28_ARB:
+    case GL_MODELVIEW29_ARB:
+    case GL_MODELVIEW30_ARB:
+    case GL_MODELVIEW31_ARB:
+    case GL_TRANSPOSE_CURRENT_MATRIX_ARB:
+        return 16;
+    case GL_FOG_COORDINATE_SOURCE:
+    case GL_COMPRESSED_TEXTURE_FORMATS:
+        return __glGetBooleanv_variable_size(e);
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetTexParameterfv_size( GLenum e )
-{
-    switch( e ) {
-        case GL_TEXTURE_MAG_FILTER:
-        case GL_TEXTURE_MIN_FILTER:
-        case GL_TEXTURE_WRAP_S:
-        case GL_TEXTURE_WRAP_T:
-        case GL_TEXTURE_PRIORITY:
-        case GL_TEXTURE_RESIDENT:
-        case GL_TEXTURE_WRAP_R:
-        case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
+__glGetTexParameterfv_size(GLenum e)
+{
+    switch (e) {
+    case GL_TEXTURE_MAG_FILTER:
+    case GL_TEXTURE_MIN_FILTER:
+    case GL_TEXTURE_WRAP_S:
+    case GL_TEXTURE_WRAP_T:
+    case GL_TEXTURE_PRIORITY:
+    case GL_TEXTURE_RESIDENT:
+    case GL_TEXTURE_WRAP_R:
+    case GL_TEXTURE_COMPARE_FAIL_VALUE_ARB:
 /*      case GL_SHADOW_AMBIENT_SGIX:*/
-        case GL_TEXTURE_MIN_LOD:
-        case GL_TEXTURE_MAX_LOD:
-        case GL_TEXTURE_BASE_LEVEL:
-        case GL_TEXTURE_MAX_LEVEL:
-        case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
-        case GL_TEXTURE_LOD_BIAS_S_SGIX:
-        case GL_TEXTURE_LOD_BIAS_T_SGIX:
-        case GL_TEXTURE_LOD_BIAS_R_SGIX:
-        case GL_GENERATE_MIPMAP:
+    case GL_TEXTURE_MIN_LOD:
+    case GL_TEXTURE_MAX_LOD:
+    case GL_TEXTURE_BASE_LEVEL:
+    case GL_TEXTURE_MAX_LEVEL:
+    case GL_TEXTURE_CLIPMAP_FRAME_SGIX:
+    case GL_TEXTURE_LOD_BIAS_S_SGIX:
+    case GL_TEXTURE_LOD_BIAS_T_SGIX:
+    case GL_TEXTURE_LOD_BIAS_R_SGIX:
+    case GL_GENERATE_MIPMAP:
 /*      case GL_GENERATE_MIPMAP_SGIS:*/
-        case GL_TEXTURE_COMPARE_SGIX:
-        case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
-        case GL_TEXTURE_MAX_CLAMP_S_SGIX:
-        case GL_TEXTURE_MAX_CLAMP_T_SGIX:
-        case GL_TEXTURE_MAX_CLAMP_R_SGIX:
-        case GL_TEXTURE_MAX_ANISOTROPY_EXT:
-        case GL_TEXTURE_LOD_BIAS:
+    case GL_TEXTURE_COMPARE_SGIX:
+    case GL_TEXTURE_COMPARE_OPERATOR_SGIX:
+    case GL_TEXTURE_MAX_CLAMP_S_SGIX:
+    case GL_TEXTURE_MAX_CLAMP_T_SGIX:
+    case GL_TEXTURE_MAX_CLAMP_R_SGIX:
+    case GL_TEXTURE_MAX_ANISOTROPY_EXT:
+    case GL_TEXTURE_LOD_BIAS:
 /*      case GL_TEXTURE_LOD_BIAS_EXT:*/
-        case GL_DEPTH_TEXTURE_MODE:
+    case GL_DEPTH_TEXTURE_MODE:
 /*      case GL_DEPTH_TEXTURE_MODE_ARB:*/
-        case GL_TEXTURE_COMPARE_MODE:
+    case GL_TEXTURE_COMPARE_MODE:
 /*      case GL_TEXTURE_COMPARE_MODE_ARB:*/
-        case GL_TEXTURE_COMPARE_FUNC:
+    case GL_TEXTURE_COMPARE_FUNC:
 /*      case GL_TEXTURE_COMPARE_FUNC_ARB:*/
-        case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
-            return 1;
-        case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
-        case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
-            return 2;
-        case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
-            return 3;
-        case GL_TEXTURE_BORDER_COLOR:
-        case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
-        case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
-            return 4;
-        default: return 0;
+    case GL_TEXTURE_UNSIGNED_REMAP_MODE_NV:
+        return 1;
+    case GL_TEXTURE_CLIPMAP_CENTER_SGIX:
+    case GL_TEXTURE_CLIPMAP_OFFSET_SGIX:
+        return 2;
+    case GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX:
+        return 3;
+    case GL_TEXTURE_BORDER_COLOR:
+    case GL_POST_TEXTURE_FILTER_BIAS_SGIX:
+    case GL_POST_TEXTURE_FILTER_SCALE_SGIX:
+        return 4;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetTexLevelParameterfv_size( GLenum e )
-{
-    switch( e ) {
-        case GL_TEXTURE_WIDTH:
-        case GL_TEXTURE_HEIGHT:
-        case GL_TEXTURE_COMPONENTS:
-        case GL_TEXTURE_BORDER:
-        case GL_TEXTURE_RED_SIZE:
+__glGetTexLevelParameterfv_size(GLenum e)
+{
+    switch (e) {
+    case GL_TEXTURE_WIDTH:
+    case GL_TEXTURE_HEIGHT:
+    case GL_TEXTURE_COMPONENTS:
+    case GL_TEXTURE_BORDER:
+    case GL_TEXTURE_RED_SIZE:
 /*      case GL_TEXTURE_RED_SIZE_EXT:*/
-        case GL_TEXTURE_GREEN_SIZE:
+    case GL_TEXTURE_GREEN_SIZE:
 /*      case GL_TEXTURE_GREEN_SIZE_EXT:*/
-        case GL_TEXTURE_BLUE_SIZE:
+    case GL_TEXTURE_BLUE_SIZE:
 /*      case GL_TEXTURE_BLUE_SIZE_EXT:*/
-        case GL_TEXTURE_ALPHA_SIZE:
+    case GL_TEXTURE_ALPHA_SIZE:
 /*      case GL_TEXTURE_ALPHA_SIZE_EXT:*/
-        case GL_TEXTURE_LUMINANCE_SIZE:
+    case GL_TEXTURE_LUMINANCE_SIZE:
 /*      case GL_TEXTURE_LUMINANCE_SIZE_EXT:*/
-        case GL_TEXTURE_INTENSITY_SIZE:
+    case GL_TEXTURE_INTENSITY_SIZE:
 /*      case GL_TEXTURE_INTENSITY_SIZE_EXT:*/
-        case GL_TEXTURE_DEPTH:
-        case GL_TEXTURE_INDEX_SIZE_EXT:
-        case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
+    case GL_TEXTURE_DEPTH:
+    case GL_TEXTURE_INDEX_SIZE_EXT:
+    case GL_TEXTURE_COMPRESSED_IMAGE_SIZE:
 /*      case GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB:*/
-        case GL_TEXTURE_COMPRESSED:
+    case GL_TEXTURE_COMPRESSED:
 /*      case GL_TEXTURE_COMPRESSED_ARB:*/
-        case GL_TEXTURE_DEPTH_SIZE:
+    case GL_TEXTURE_DEPTH_SIZE:
 /*      case GL_TEXTURE_DEPTH_SIZE_ARB:*/
-            return 1;
-        default: return 0;
+        return 1;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glColorTableParameterfv_size( GLenum e )
+__glColorTableParameterfv_size(GLenum e)
 {
-    switch( e ) {
-        case GL_COLOR_TABLE_SCALE:
-        case GL_COLOR_TABLE_BIAS:
-            return 4;
-        default: return 0;
+    switch (e) {
+    case GL_COLOR_TABLE_SCALE:
+    case GL_COLOR_TABLE_BIAS:
+        return 4;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetColorTableParameterfv_size( GLenum e )
+__glGetColorTableParameterfv_size(GLenum e)
 {
-    switch( e ) {
-        case GL_COLOR_TABLE_FORMAT:
+    switch (e) {
+    case GL_COLOR_TABLE_FORMAT:
 /*      case GL_COLOR_TABLE_FORMAT_EXT:*/
-        case GL_COLOR_TABLE_WIDTH:
+    case GL_COLOR_TABLE_WIDTH:
 /*      case GL_COLOR_TABLE_WIDTH_EXT:*/
-        case GL_COLOR_TABLE_RED_SIZE:
+    case GL_COLOR_TABLE_RED_SIZE:
 /*      case GL_COLOR_TABLE_RED_SIZE_EXT:*/
-        case GL_COLOR_TABLE_GREEN_SIZE:
+    case GL_COLOR_TABLE_GREEN_SIZE:
 /*      case GL_COLOR_TABLE_GREEN_SIZE_EXT:*/
-        case GL_COLOR_TABLE_BLUE_SIZE:
+    case GL_COLOR_TABLE_BLUE_SIZE:
 /*      case GL_COLOR_TABLE_BLUE_SIZE_EXT:*/
-        case GL_COLOR_TABLE_ALPHA_SIZE:
+    case GL_COLOR_TABLE_ALPHA_SIZE:
 /*      case GL_COLOR_TABLE_ALPHA_SIZE_EXT:*/
-        case GL_COLOR_TABLE_LUMINANCE_SIZE:
+    case GL_COLOR_TABLE_LUMINANCE_SIZE:
 /*      case GL_COLOR_TABLE_LUMINANCE_SIZE_EXT:*/
-        case GL_COLOR_TABLE_INTENSITY_SIZE:
+    case GL_COLOR_TABLE_INTENSITY_SIZE:
 /*      case GL_COLOR_TABLE_INTENSITY_SIZE_EXT:*/
-            return 1;
-        case GL_COLOR_TABLE_SCALE:
-        case GL_COLOR_TABLE_BIAS:
-            return 4;
-        default: return 0;
+        return 1;
+    case GL_COLOR_TABLE_SCALE:
+    case GL_COLOR_TABLE_BIAS:
+        return 4;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glConvolutionParameterfv_size( GLenum e )
+__glConvolutionParameterfv_size(GLenum e)
 {
-    switch( e ) {
-        case GL_CONVOLUTION_BORDER_MODE:
+    switch (e) {
+    case GL_CONVOLUTION_BORDER_MODE:
 /*      case GL_CONVOLUTION_BORDER_MODE_EXT:*/
-            return 1;
-        case GL_CONVOLUTION_FILTER_SCALE:
+        return 1;
+    case GL_CONVOLUTION_FILTER_SCALE:
 /*      case GL_CONVOLUTION_FILTER_SCALE_EXT:*/
-        case GL_CONVOLUTION_FILTER_BIAS:
+    case GL_CONVOLUTION_FILTER_BIAS:
 /*      case GL_CONVOLUTION_FILTER_BIAS_EXT:*/
-        case GL_CONVOLUTION_BORDER_COLOR:
+    case GL_CONVOLUTION_BORDER_COLOR:
 /*      case GL_CONVOLUTION_BORDER_COLOR_HP:*/
-            return 4;
-        default: return 0;
+        return 4;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetConvolutionParameterfv_size( GLenum e )
+__glGetConvolutionParameterfv_size(GLenum e)
 {
-    switch( e ) {
-        case GL_CONVOLUTION_BORDER_MODE:
+    switch (e) {
+    case GL_CONVOLUTION_BORDER_MODE:
 /*      case GL_CONVOLUTION_BORDER_MODE_EXT:*/
-        case GL_CONVOLUTION_FORMAT:
+    case GL_CONVOLUTION_FORMAT:
 /*      case GL_CONVOLUTION_FORMAT_EXT:*/
-        case GL_CONVOLUTION_WIDTH:
+    case GL_CONVOLUTION_WIDTH:
 /*      case GL_CONVOLUTION_WIDTH_EXT:*/
-        case GL_CONVOLUTION_HEIGHT:
+    case GL_CONVOLUTION_HEIGHT:
 /*      case GL_CONVOLUTION_HEIGHT_EXT:*/
-        case GL_MAX_CONVOLUTION_WIDTH:
+    case GL_MAX_CONVOLUTION_WIDTH:
 /*      case GL_MAX_CONVOLUTION_WIDTH_EXT:*/
-        case GL_MAX_CONVOLUTION_HEIGHT:
+    case GL_MAX_CONVOLUTION_HEIGHT:
 /*      case GL_MAX_CONVOLUTION_HEIGHT_EXT:*/
-            return 1;
-        case GL_CONVOLUTION_FILTER_SCALE:
+        return 1;
+    case GL_CONVOLUTION_FILTER_SCALE:
 /*      case GL_CONVOLUTION_FILTER_SCALE_EXT:*/
-        case GL_CONVOLUTION_FILTER_BIAS:
+    case GL_CONVOLUTION_FILTER_BIAS:
 /*      case GL_CONVOLUTION_FILTER_BIAS_EXT:*/
-        case GL_CONVOLUTION_BORDER_COLOR:
+    case GL_CONVOLUTION_BORDER_COLOR:
 /*      case GL_CONVOLUTION_BORDER_COLOR_HP:*/
-            return 4;
-        default: return 0;
+        return 4;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetHistogramParameterfv_size( GLenum e )
+__glGetHistogramParameterfv_size(GLenum e)
 {
-    switch( e ) {
-        case GL_HISTOGRAM_WIDTH:
-        case GL_HISTOGRAM_FORMAT:
-        case GL_HISTOGRAM_RED_SIZE:
-        case GL_HISTOGRAM_GREEN_SIZE:
-        case GL_HISTOGRAM_BLUE_SIZE:
-        case GL_HISTOGRAM_ALPHA_SIZE:
-        case GL_HISTOGRAM_LUMINANCE_SIZE:
-        case GL_HISTOGRAM_SINK:
-            return 1;
-        default: return 0;
+    switch (e) {
+    case GL_HISTOGRAM_WIDTH:
+    case GL_HISTOGRAM_FORMAT:
+    case GL_HISTOGRAM_RED_SIZE:
+    case GL_HISTOGRAM_GREEN_SIZE:
+    case GL_HISTOGRAM_BLUE_SIZE:
+    case GL_HISTOGRAM_ALPHA_SIZE:
+    case GL_HISTOGRAM_LUMINANCE_SIZE:
+    case GL_HISTOGRAM_SINK:
+        return 1;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetMinmaxParameterfv_size( GLenum e )
+__glGetMinmaxParameterfv_size(GLenum e)
 {
-    switch( e ) {
-        case GL_MINMAX_FORMAT:
-        case GL_MINMAX_SINK:
-            return 1;
-        default: return 0;
+    switch (e) {
+    case GL_MINMAX_FORMAT:
+    case GL_MINMAX_SINK:
+        return 1;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetProgramivARB_size( GLenum e )
+__glGetProgramivARB_size(GLenum e)
 {
-    switch( e ) {
-        case GL_PROGRAM_LENGTH_ARB:
-        case GL_PROGRAM_BINDING_ARB:
-        case GL_PROGRAM_ALU_INSTRUCTIONS_ARB:
-        case GL_PROGRAM_TEX_INSTRUCTIONS_ARB:
-        case GL_PROGRAM_TEX_INDIRECTIONS_ARB:
-        case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
-        case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
-        case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
-        case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB:
-        case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB:
-        case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB:
-        case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
-        case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
-        case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
-        case GL_MAX_TEXTURE_COORDS_ARB:
-        case GL_MAX_TEXTURE_IMAGE_UNITS_ARB:
-        case GL_PROGRAM_FORMAT_ARB:
-        case GL_PROGRAM_INSTRUCTIONS_ARB:
-        case GL_MAX_PROGRAM_INSTRUCTIONS_ARB:
-        case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
-        case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
-        case GL_PROGRAM_TEMPORARIES_ARB:
-        case GL_MAX_PROGRAM_TEMPORARIES_ARB:
-        case GL_PROGRAM_NATIVE_TEMPORARIES_ARB:
-        case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB:
-        case GL_PROGRAM_PARAMETERS_ARB:
-        case GL_MAX_PROGRAM_PARAMETERS_ARB:
-        case GL_PROGRAM_NATIVE_PARAMETERS_ARB:
-        case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB:
-        case GL_PROGRAM_ATTRIBS_ARB:
-        case GL_MAX_PROGRAM_ATTRIBS_ARB:
-        case GL_PROGRAM_NATIVE_ATTRIBS_ARB:
-        case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB:
-        case GL_PROGRAM_ADDRESS_REGISTERS_ARB:
-        case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB:
-        case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
-        case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
-        case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB:
-        case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB:
-        case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB:
-        case GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV:
-        case GL_MAX_PROGRAM_CALL_DEPTH_NV:
-        case GL_MAX_PROGRAM_IF_DEPTH_NV:
-        case GL_MAX_PROGRAM_LOOP_DEPTH_NV:
-        case GL_MAX_PROGRAM_LOOP_COUNT_NV:
-            return 1;
-        default: return 0;
+    switch (e) {
+    case GL_PROGRAM_LENGTH_ARB:
+    case GL_PROGRAM_BINDING_ARB:
+    case GL_PROGRAM_ALU_INSTRUCTIONS_ARB:
+    case GL_PROGRAM_TEX_INSTRUCTIONS_ARB:
+    case GL_PROGRAM_TEX_INDIRECTIONS_ARB:
+    case GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
+    case GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
+    case GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
+    case GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB:
+    case GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB:
+    case GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB:
+    case GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB:
+    case GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB:
+    case GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB:
+    case GL_MAX_TEXTURE_COORDS_ARB:
+    case GL_MAX_TEXTURE_IMAGE_UNITS_ARB:
+    case GL_PROGRAM_FORMAT_ARB:
+    case GL_PROGRAM_INSTRUCTIONS_ARB:
+    case GL_MAX_PROGRAM_INSTRUCTIONS_ARB:
+    case GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
+    case GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB:
+    case GL_PROGRAM_TEMPORARIES_ARB:
+    case GL_MAX_PROGRAM_TEMPORARIES_ARB:
+    case GL_PROGRAM_NATIVE_TEMPORARIES_ARB:
+    case GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB:
+    case GL_PROGRAM_PARAMETERS_ARB:
+    case GL_MAX_PROGRAM_PARAMETERS_ARB:
+    case GL_PROGRAM_NATIVE_PARAMETERS_ARB:
+    case GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB:
+    case GL_PROGRAM_ATTRIBS_ARB:
+    case GL_MAX_PROGRAM_ATTRIBS_ARB:
+    case GL_PROGRAM_NATIVE_ATTRIBS_ARB:
+    case GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB:
+    case GL_PROGRAM_ADDRESS_REGISTERS_ARB:
+    case GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB:
+    case GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
+    case GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB:
+    case GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB:
+    case GL_MAX_PROGRAM_ENV_PARAMETERS_ARB:
+    case GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB:
+    case GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV:
+    case GL_MAX_PROGRAM_CALL_DEPTH_NV:
+    case GL_MAX_PROGRAM_IF_DEPTH_NV:
+    case GL_MAX_PROGRAM_LOOP_DEPTH_NV:
+    case GL_MAX_PROGRAM_LOOP_COUNT_NV:
+        return 1;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetVertexAttribdvARB_size( GLenum e )
+__glGetVertexAttribdvARB_size(GLenum e)
 {
-    switch( e ) {
-        case GL_VERTEX_PROGRAM_ARB:
-        case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
-        case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
-        case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
-        case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
-        case GL_CURRENT_VERTEX_ATTRIB_ARB:
-            return 1;
-        default: return 0;
+    switch (e) {
+    case GL_VERTEX_PROGRAM_ARB:
+    case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
+    case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
+    case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
+    case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
+    case GL_CURRENT_VERTEX_ATTRIB_ARB:
+        return 1;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetQueryObjectivARB_size( GLenum e )
+__glGetQueryObjectivARB_size(GLenum e)
 {
-    switch( e ) {
-        case GL_QUERY_RESULT_ARB:
-        case GL_QUERY_RESULT_AVAILABLE_ARB:
-            return 1;
-        default: return 0;
+    switch (e) {
+    case GL_QUERY_RESULT_ARB:
+    case GL_QUERY_RESULT_AVAILABLE_ARB:
+        return 1;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glGetQueryivARB_size( GLenum e )
+__glGetQueryivARB_size(GLenum e)
 {
-    switch( e ) {
-        case GL_QUERY_COUNTER_BITS_ARB:
-        case GL_CURRENT_QUERY_ARB:
-            return 1;
-        default: return 0;
+    switch (e) {
+    case GL_QUERY_COUNTER_BITS_ARB:
+    case GL_CURRENT_QUERY_ARB:
+        return 1;
+    default:
+        return 0;
     }
 }
 
 INTERNAL PURE FASTCALL GLint
-__glPointParameterfvEXT_size( GLenum e )
+__glPointParameterfvEXT_size(GLenum e)
 {
-    switch( e ) {
-        case GL_POINT_SIZE_MIN:
+    switch (e) {
+    case GL_POINT_SIZE_MIN:
 /*      case GL_POINT_SIZE_MIN_ARB:*/
 /*      case GL_POINT_SIZE_MIN_SGIS:*/
-        case GL_POINT_SIZE_MAX:
+    case GL_POINT_SIZE_MAX:
 /*      case GL_POINT_SIZE_MAX_ARB:*/
 /*      case GL_POINT_SIZE_MAX_SGIS:*/
-        case GL_POINT_FADE_THRESHOLD_SIZE:
+    case GL_POINT_FADE_THRESHOLD_SIZE:
 /*      case GL_POINT_FADE_THRESHOLD_SIZE_ARB:*/
 /*      case GL_POINT_FADE_THRESHOLD_SIZE_SGIS:*/
-        case GL_POINT_SPRITE_R_MODE_NV:
-        case GL_POINT_SPRITE_COORD_ORIGIN:
-            return 1;
-        case GL_POINT_DISTANCE_ATTENUATION:
+    case GL_POINT_SPRITE_R_MODE_NV:
+    case GL_POINT_SPRITE_COORD_ORIGIN:
+        return 1;
+    case GL_POINT_DISTANCE_ATTENUATION:
 /*      case GL_POINT_DISTANCE_ATTENUATION_ARB:*/
 /*      case GL_POINT_DISTANCE_ATTENUATION_SGIS:*/
-            return 3;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glGetProgramivNV_size( GLenum e )
-{
-    switch( e ) {
-        case GL_PROGRAM_LENGTH_NV:
-        case GL_PROGRAM_TARGET_NV:
-        case GL_PROGRAM_RESIDENT_NV:
-            return 1;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glGetVertexAttribdvNV_size( GLenum e )
-{
-    switch( e ) {
-        case GL_ATTRIB_ARRAY_SIZE_NV:
-        case GL_ATTRIB_ARRAY_STRIDE_NV:
-        case GL_ATTRIB_ARRAY_TYPE_NV:
-        case GL_CURRENT_ATTRIB_NV:
-            return 1;
-        default: return 0;
-    }
-}
-
-INTERNAL PURE FASTCALL GLint
-__glGetFramebufferAttachmentParameterivEXT_size( GLenum e )
-{
-    switch( e ) {
-        case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT:
-        case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT:
-        case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT:
-        case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT:
-        case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT:
-            return 1;
-        default: return 0;
-    }
-}
-
-ALIAS( Fogiv, Fogfv )
-ALIAS( Lightiv, Lightfv )
-ALIAS( LightModeliv, LightModelfv )
-ALIAS( Materialiv, Materialfv )
-ALIAS( TexParameteriv, TexParameterfv )
-ALIAS( TexEnviv, TexEnvfv )
-ALIAS( TexGenfv, TexGendv )
-ALIAS( TexGeniv, TexGendv )
-ALIAS( Map1f, Map1d )
-ALIAS( Map2f, Map2d )
-ALIAS( GetDoublev, GetBooleanv )
-ALIAS( GetFloatv, GetBooleanv )
-ALIAS( GetIntegerv, GetBooleanv )
-ALIAS( GetLightfv, Lightfv )
-ALIAS( GetLightiv, Lightfv )
-ALIAS( GetMaterialfv, Materialfv )
-ALIAS( GetMaterialiv, Materialfv )
-ALIAS( GetTexEnvfv, TexEnvfv )
-ALIAS( GetTexEnviv, TexEnvfv )
-ALIAS( GetTexGendv, TexGendv )
-ALIAS( GetTexGenfv, TexGendv )
-ALIAS( GetTexGeniv, TexGendv )
-ALIAS( GetTexParameteriv, GetTexParameterfv )
-ALIAS( GetTexLevelParameteriv, GetTexLevelParameterfv )
-ALIAS( ColorTableParameteriv, ColorTableParameterfv )
-ALIAS( GetColorTableParameteriv, GetColorTableParameterfv )
-ALIAS( ConvolutionParameteriv, ConvolutionParameterfv )
-ALIAS( GetConvolutionParameteriv, GetConvolutionParameterfv )
-ALIAS( GetHistogramParameteriv, GetHistogramParameterfv )
-ALIAS( GetMinmaxParameteriv, GetMinmaxParameterfv )
-ALIAS( GetVertexAttribfvARB, GetVertexAttribdvARB )
-ALIAS( GetVertexAttribivARB, GetVertexAttribdvARB )
-ALIAS( GetQueryObjectuivARB, GetQueryObjectivARB )
-ALIAS( GetColorTableParameterfvSGI, GetColorTableParameterfv )
-ALIAS( GetColorTableParameterivSGI, GetColorTableParameterfv )
-ALIAS( GetVertexAttribfvNV, GetVertexAttribdvNV )
-ALIAS( GetVertexAttribivNV, GetVertexAttribdvNV )
-ALIAS( PointParameterivNV, PointParameterfvEXT )
-
+        return 3;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glGetProgramivNV_size(GLenum e)
+{
+    switch (e) {
+    case GL_PROGRAM_LENGTH_NV:
+    case GL_PROGRAM_TARGET_NV:
+    case GL_PROGRAM_RESIDENT_NV:
+        return 1;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glGetVertexAttribdvNV_size(GLenum e)
+{
+    switch (e) {
+    case GL_ATTRIB_ARRAY_SIZE_NV:
+    case GL_ATTRIB_ARRAY_STRIDE_NV:
+    case GL_ATTRIB_ARRAY_TYPE_NV:
+    case GL_CURRENT_ATTRIB_NV:
+        return 1;
+    default:
+        return 0;
+    }
+}
+
+INTERNAL PURE FASTCALL GLint
+__glGetFramebufferAttachmentParameterivEXT_size(GLenum e)
+{
+    switch (e) {
+    case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT:
+    case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT:
+    case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT:
+    case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT:
+    case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT:
+        return 1;
+    default:
+        return 0;
+    }
+}
+
+ALIAS(Fogiv, Fogfv)
+    ALIAS(Lightiv, Lightfv)
+    ALIAS(LightModeliv, LightModelfv)
+    ALIAS(Materialiv, Materialfv)
+    ALIAS(TexParameteriv, TexParameterfv)
+    ALIAS(TexEnviv, TexEnvfv)
+    ALIAS(TexGenfv, TexGendv)
+    ALIAS(TexGeniv, TexGendv)
+    ALIAS(Map1f, Map1d)
+    ALIAS(Map2f, Map2d)
+    ALIAS(GetDoublev, GetBooleanv)
+    ALIAS(GetFloatv, GetBooleanv)
+    ALIAS(GetIntegerv, GetBooleanv)
+    ALIAS(GetLightfv, Lightfv)
+    ALIAS(GetLightiv, Lightfv)
+    ALIAS(GetMaterialfv, Materialfv)
+    ALIAS(GetMaterialiv, Materialfv)
+    ALIAS(GetTexEnvfv, TexEnvfv)
+    ALIAS(GetTexEnviv, TexEnvfv)
+    ALIAS(GetTexGendv, TexGendv)
+    ALIAS(GetTexGenfv, TexGendv)
+    ALIAS(GetTexGeniv, TexGendv)
+    ALIAS(GetTexParameteriv, GetTexParameterfv)
+    ALIAS(GetTexLevelParameteriv, GetTexLevelParameterfv)
+    ALIAS(ColorTableParameteriv, ColorTableParameterfv)
+    ALIAS(GetColorTableParameteriv, GetColorTableParameterfv)
+    ALIAS(ConvolutionParameteriv, ConvolutionParameterfv)
+    ALIAS(GetConvolutionParameteriv, GetConvolutionParameterfv)
+    ALIAS(GetHistogramParameteriv, GetHistogramParameterfv)
+    ALIAS(GetMinmaxParameteriv, GetMinmaxParameterfv)
+    ALIAS(GetVertexAttribfvARB, GetVertexAttribdvARB)
+    ALIAS(GetVertexAttribivARB, GetVertexAttribdvARB)
+    ALIAS(GetQueryObjectuivARB, GetQueryObjectivARB)
+    ALIAS(GetVertexAttribfvNV, GetVertexAttribdvNV)
+    ALIAS(GetVertexAttribivNV, GetVertexAttribdvNV)
+    ALIAS(PointParameterivNV, PointParameterfvEXT)
 #  undef PURE
 #  undef FASTCALL
 #  undef INTERNAL
diff --git a/GL/glx/indirect_size_get.h b/GL/glx/indirect_size_get.h
index c6f9532..4fcb55b 100644
--- a/GL/glx/indirect_size_get.h
+++ b/GL/glx/indirect_size_get.h
@@ -73,8 +73,10 @@ extern INTERNAL PURE FASTCALL GLint __gl
 extern INTERNAL PURE FASTCALL GLint __glGetTexLevelParameteriv_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetColorTableParameterfv_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetColorTableParameteriv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glGetConvolutionParameterfv_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glGetConvolutionParameteriv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint
+__glGetConvolutionParameterfv_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint
+__glGetConvolutionParameteriv_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetHistogramParameterfv_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetHistogramParameteriv_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetMinmaxParameterfv_size(GLenum);
@@ -86,13 +88,12 @@ extern INTERNAL PURE FASTCALL GLint __gl
 extern INTERNAL PURE FASTCALL GLint __glGetQueryObjectivARB_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetQueryObjectuivARB_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetQueryivARB_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glGetColorTableParameterfvSGI_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glGetColorTableParameterivSGI_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetProgramivNV_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetVertexAttribdvNV_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetVertexAttribfvNV_size(GLenum);
 extern INTERNAL PURE FASTCALL GLint __glGetVertexAttribivNV_size(GLenum);
-extern INTERNAL PURE FASTCALL GLint __glGetFramebufferAttachmentParameterivEXT_size(GLenum);
+extern INTERNAL PURE FASTCALL GLint
+__glGetFramebufferAttachmentParameterivEXT_size(GLenum);
 
 #  undef PURE
 #  undef FASTCALL
diff --git a/GL/glx/indirect_table.c b/GL/glx/indirect_table.c
index 57712f4..a6fd3a3 100644
--- a/GL/glx/indirect_table.c
+++ b/GL/glx/indirect_table.c
@@ -163,7 +163,7 @@ static const void *Single_function_table
     /* [ 85] =   141 */ {__glXDisp_IsList, __glXDispSwap_IsList},
     /* [ 86] =   142 */ {__glXDisp_Flush, __glXDispSwap_Flush},
     /* [ 87] =   143 */ {__glXDisp_AreTexturesResident, __glXDispSwap_AreTexturesResident},
-    /* [ 88] =   144 */ {NULL, NULL},
+    /* [ 88] =   144 */ {__glXDisp_DeleteTextures, __glXDispSwap_DeleteTextures},
     /* [ 89] =   145 */ {__glXDisp_GenTextures, __glXDispSwap_GenTextures},
     /* [ 90] =   146 */ {__glXDisp_IsTexture, __glXDispSwap_IsTexture},
     /* [ 91] =   147 */ {__glXDisp_GetColorTable, __glXDispSwap_GetColorTable},
@@ -1232,12 +1232,12 @@ const struct __glXDispatchInfo Render_di
 
 /*****************************************************************/
 /* tree depth = 13 */
-static const int_fast16_t VendorPriv_dispatch_tree[158] = {
+static const int_fast16_t VendorPriv_dispatch_tree[155] = {
     /* [0] -> opcode range [0, 131072], node depth 1 */
     2,
     5,
     EMPTY_LEAF,
-    122,
+    119,
     EMPTY_LEAF,
 
     /* [5] -> opcode range [0, 32768], node depth 2 */
@@ -1254,14 +1254,14 @@ static const int_fast16_t VendorPriv_dis
     2,
     16,
     EMPTY_LEAF,
-    81,
+    78,
     EMPTY_LEAF,
 
     /* [16] -> opcode range [0, 2048], node depth 5 */
     2,
     21,
     EMPTY_LEAF,
-    39,
+    36,
     EMPTY_LEAF,
 
     /* [21] -> opcode range [0, 512], node depth 6 */
@@ -1286,298 +1286,301 @@ static const int_fast16_t VendorPriv_dis
 
     /* [33] -> opcode range [0, 32], node depth 10 */
     1,
-    36,
+    LEAF(0),
     EMPTY_LEAF,
 
-    /* [36] -> opcode range [0, 16], node depth 11 */
-    1,
+    /* [36] -> opcode range [1024, 1536], node depth 6 */
+    2,
+    41,
     EMPTY_LEAF,
-    LEAF(0),
+    53,
+    67,
 
-    /* [39] -> opcode range [1024, 1536], node depth 6 */
-    2,
+    /* [41] -> opcode range [1024, 1152], node depth 7 */
+    1,
     44,
     EMPTY_LEAF,
-    56,
-    70,
 
-    /* [44] -> opcode range [1024, 1152], node depth 7 */
+    /* [44] -> opcode range [1024, 1088], node depth 8 */
     1,
     47,
     EMPTY_LEAF,
 
-    /* [47] -> opcode range [1024, 1088], node depth 8 */
+    /* [47] -> opcode range [1024, 1056], node depth 9 */
     1,
     50,
     EMPTY_LEAF,
 
-    /* [50] -> opcode range [1024, 1056], node depth 9 */
+    /* [50] -> opcode range [1024, 1040], node depth 10 */
     1,
-    53,
-    EMPTY_LEAF,
-
-    /* [53] -> opcode range [1024, 1040], node depth 10 */
-    1,
-    LEAF(8),
+    LEAF(16),
     EMPTY_LEAF,
 
-    /* [56] -> opcode range [1280, 1408], node depth 7 */
+    /* [53] -> opcode range [1280, 1408], node depth 7 */
     1,
-    59,
+    56,
     EMPTY_LEAF,
 
-    /* [59] -> opcode range [1280, 1344], node depth 8 */
+    /* [56] -> opcode range [1280, 1344], node depth 8 */
     2,
-    64,
-    LEAF(16),
+    61,
+    LEAF(24),
     EMPTY_LEAF,
-    67,
+    64,
 
-    /* [64] -> opcode range [1280, 1296], node depth 9 */
+    /* [61] -> opcode range [1280, 1296], node depth 9 */
     1,
     EMPTY_LEAF,
-    LEAF(32),
+    LEAF(40),
 
-    /* [67] -> opcode range [1328, 1344], node depth 9 */
+    /* [64] -> opcode range [1328, 1344], node depth 9 */
     1,
-    LEAF(40),
+    LEAF(48),
     EMPTY_LEAF,
 
-    /* [70] -> opcode range [1408, 1536], node depth 7 */
+    /* [67] -> opcode range [1408, 1536], node depth 7 */
     1,
-    73,
+    70,
     EMPTY_LEAF,
 
-    /* [73] -> opcode range [1408, 1472], node depth 8 */
+    /* [70] -> opcode range [1408, 1472], node depth 8 */
     1,
-    76,
+    73,
     EMPTY_LEAF,
 
-    /* [76] -> opcode range [1408, 1440], node depth 9 */
+    /* [73] -> opcode range [1408, 1440], node depth 9 */
     2,
     EMPTY_LEAF,
-    LEAF(48),
     LEAF(56),
+    LEAF(64),
     EMPTY_LEAF,
 
-    /* [81] -> opcode range [4096, 6144], node depth 5 */
+    /* [78] -> opcode range [4096, 6144], node depth 5 */
     2,
-    86,
+    83,
     EMPTY_LEAF,
-    104,
+    101,
     EMPTY_LEAF,
 
-    /* [86] -> opcode range [4096, 4608], node depth 6 */
+    /* [83] -> opcode range [4096, 4608], node depth 6 */
+    1,
+    86,
+    EMPTY_LEAF,
+
+    /* [86] -> opcode range [4096, 4352], node depth 7 */
     1,
     89,
     EMPTY_LEAF,
 
-    /* [89] -> opcode range [4096, 4352], node depth 7 */
+    /* [89] -> opcode range [4096, 4224], node depth 8 */
     1,
     92,
     EMPTY_LEAF,
 
-    /* [92] -> opcode range [4096, 4224], node depth 8 */
+    /* [92] -> opcode range [4096, 4160], node depth 9 */
     1,
     95,
     EMPTY_LEAF,
 
-    /* [95] -> opcode range [4096, 4160], node depth 9 */
+    /* [95] -> opcode range [4096, 4128], node depth 10 */
     1,
     98,
     EMPTY_LEAF,
 
-    /* [98] -> opcode range [4096, 4128], node depth 10 */
+    /* [98] -> opcode range [4096, 4112], node depth 11 */
     1,
-    101,
+    LEAF(72),
     EMPTY_LEAF,
 
-    /* [101] -> opcode range [4096, 4112], node depth 11 */
+    /* [101] -> opcode range [5120, 5632], node depth 6 */
     1,
-    LEAF(64),
+    104,
     EMPTY_LEAF,
 
-    /* [104] -> opcode range [5120, 5632], node depth 6 */
+    /* [104] -> opcode range [5120, 5376], node depth 7 */
     1,
     107,
     EMPTY_LEAF,
 
-    /* [107] -> opcode range [5120, 5376], node depth 7 */
+    /* [107] -> opcode range [5120, 5248], node depth 8 */
     1,
     110,
     EMPTY_LEAF,
 
-    /* [110] -> opcode range [5120, 5248], node depth 8 */
+    /* [110] -> opcode range [5120, 5184], node depth 9 */
     1,
-    113,
     EMPTY_LEAF,
+    113,
 
-    /* [113] -> opcode range [5120, 5184], node depth 9 */
+    /* [113] -> opcode range [5152, 5184], node depth 10 */
     1,
-    EMPTY_LEAF,
     116,
+    EMPTY_LEAF,
 
-    /* [116] -> opcode range [5152, 5184], node depth 10 */
+    /* [116] -> opcode range [5152, 5168], node depth 11 */
     1,
-    119,
+    LEAF(80),
     EMPTY_LEAF,
 
-    /* [119] -> opcode range [5152, 5168], node depth 11 */
+    /* [119] -> opcode range [65536, 98304], node depth 2 */
     1,
-    LEAF(72),
+    122,
     EMPTY_LEAF,
 
-    /* [122] -> opcode range [65536, 98304], node depth 2 */
+    /* [122] -> opcode range [65536, 81920], node depth 3 */
     1,
     125,
     EMPTY_LEAF,
 
-    /* [125] -> opcode range [65536, 81920], node depth 3 */
+    /* [125] -> opcode range [65536, 73728], node depth 4 */
     1,
     128,
     EMPTY_LEAF,
 
-    /* [128] -> opcode range [65536, 73728], node depth 4 */
+    /* [128] -> opcode range [65536, 69632], node depth 5 */
     1,
     131,
     EMPTY_LEAF,
 
-    /* [131] -> opcode range [65536, 69632], node depth 5 */
+    /* [131] -> opcode range [65536, 67584], node depth 6 */
     1,
     134,
     EMPTY_LEAF,
 
-    /* [134] -> opcode range [65536, 67584], node depth 6 */
+    /* [134] -> opcode range [65536, 66560], node depth 7 */
     1,
     137,
     EMPTY_LEAF,
 
-    /* [137] -> opcode range [65536, 66560], node depth 7 */
+    /* [137] -> opcode range [65536, 66048], node depth 8 */
     1,
     140,
     EMPTY_LEAF,
 
-    /* [140] -> opcode range [65536, 66048], node depth 8 */
+    /* [140] -> opcode range [65536, 65792], node depth 9 */
     1,
     143,
     EMPTY_LEAF,
 
-    /* [143] -> opcode range [65536, 65792], node depth 9 */
+    /* [143] -> opcode range [65536, 65664], node depth 10 */
     1,
     146,
     EMPTY_LEAF,
 
-    /* [146] -> opcode range [65536, 65664], node depth 10 */
+    /* [146] -> opcode range [65536, 65600], node depth 11 */
     1,
     149,
     EMPTY_LEAF,
 
-    /* [149] -> opcode range [65536, 65600], node depth 11 */
+    /* [149] -> opcode range [65536, 65568], node depth 12 */
     1,
     152,
     EMPTY_LEAF,
 
-    /* [152] -> opcode range [65536, 65568], node depth 12 */
+    /* [152] -> opcode range [65536, 65552], node depth 13 */
     1,
-    155,
-    EMPTY_LEAF,
-
-    /* [155] -> opcode range [65536, 65552], node depth 13 */
-    1,
-    LEAF(80),
+    LEAF(88),
     EMPTY_LEAF,
 
 };
 
-static const void *VendorPriv_function_table[88][2] = {
-    /* [  0] =     8 */ {NULL, NULL},
-    /* [  1] =     9 */ {NULL, NULL},
-    /* [  2] =    10 */ {NULL, NULL},
-    /* [  3] =    11 */ {__glXDisp_AreTexturesResidentEXT, __glXDispSwap_AreTexturesResidentEXT},
-    /* [  4] =    12 */ {__glXDisp_DeleteTextures, __glXDispSwap_DeleteTextures},
-    /* [  5] =    13 */ {__glXDisp_GenTexturesEXT, __glXDispSwap_GenTexturesEXT},
-    /* [  6] =    14 */ {__glXDisp_IsTextureEXT, __glXDispSwap_IsTextureEXT},
-    /* [  7] =    15 */ {NULL, NULL},
-    /* [  8] =  1024 */ {__glXDisp_QueryContextInfoEXT, __glXDispSwap_QueryContextInfoEXT},
-    /* [  9] =  1025 */ {NULL, NULL},
-    /* [ 10] =  1026 */ {NULL, NULL},
-    /* [ 11] =  1027 */ {NULL, NULL},
-    /* [ 12] =  1028 */ {NULL, NULL},
-    /* [ 13] =  1029 */ {NULL, NULL},
-    /* [ 14] =  1030 */ {NULL, NULL},
-    /* [ 15] =  1031 */ {NULL, NULL},
-    /* [ 16] =  1296 */ {__glXDisp_GetProgramEnvParameterfvARB, __glXDispSwap_GetProgramEnvParameterfvARB},
-    /* [ 17] =  1297 */ {__glXDisp_GetProgramEnvParameterdvARB, __glXDispSwap_GetProgramEnvParameterdvARB},
-    /* [ 18] =  1298 */ {__glXDisp_GetProgramivNV, __glXDispSwap_GetProgramivNV},
-    /* [ 19] =  1299 */ {__glXDisp_GetProgramStringNV, __glXDispSwap_GetProgramStringNV},
-    /* [ 20] =  1300 */ {__glXDisp_GetTrackMatrixivNV, __glXDispSwap_GetTrackMatrixivNV},
-    /* [ 21] =  1301 */ {__glXDisp_GetVertexAttribdvARB, __glXDispSwap_GetVertexAttribdvARB},
-    /* [ 22] =  1302 */ {__glXDisp_GetVertexAttribfvNV, __glXDispSwap_GetVertexAttribfvNV},
-    /* [ 23] =  1303 */ {__glXDisp_GetVertexAttribivNV, __glXDispSwap_GetVertexAttribivNV},
-    /* [ 24] =  1304 */ {__glXDisp_IsProgramNV, __glXDispSwap_IsProgramNV},
-    /* [ 25] =  1305 */ {__glXDisp_GetProgramLocalParameterfvARB, __glXDispSwap_GetProgramLocalParameterfvARB},
-    /* [ 26] =  1306 */ {__glXDisp_GetProgramLocalParameterdvARB, __glXDispSwap_GetProgramLocalParameterdvARB},
-    /* [ 27] =  1307 */ {__glXDisp_GetProgramivARB, __glXDispSwap_GetProgramivARB},
-    /* [ 28] =  1308 */ {__glXDisp_GetProgramStringARB, __glXDispSwap_GetProgramStringARB},
-    /* [ 29] =  1309 */ {NULL, NULL},
-    /* [ 30] =  1310 */ {__glXDisp_GetProgramNamedParameterfvNV, __glXDispSwap_GetProgramNamedParameterfvNV},
-    /* [ 31] =  1311 */ {__glXDisp_GetProgramNamedParameterdvNV, __glXDispSwap_GetProgramNamedParameterdvNV},
-    /* [ 32] =  1288 */ {NULL, NULL},
-    /* [ 33] =  1289 */ {NULL, NULL},
-    /* [ 34] =  1290 */ {NULL, NULL},
-    /* [ 35] =  1291 */ {NULL, NULL},
-    /* [ 36] =  1292 */ {NULL, NULL},
-    /* [ 37] =  1293 */ {__glXDisp_AreProgramsResidentNV, __glXDispSwap_AreProgramsResidentNV},
-    /* [ 38] =  1294 */ {__glXDisp_DeleteProgramsNV, __glXDispSwap_DeleteProgramsNV},
-    /* [ 39] =  1295 */ {__glXDisp_GenProgramsNV, __glXDispSwap_GenProgramsNV},
-    /* [ 40] =  1328 */ {NULL, NULL},
-    /* [ 41] =  1329 */ {NULL, NULL},
-    /* [ 42] =  1330 */ {__glXDisp_BindTexImageEXT, __glXDispSwap_BindTexImageEXT},
-    /* [ 43] =  1331 */ {__glXDisp_ReleaseTexImageEXT, __glXDispSwap_ReleaseTexImageEXT},
-    /* [ 44] =  1332 */ {NULL, NULL},
-    /* [ 45] =  1333 */ {NULL, NULL},
-    /* [ 46] =  1334 */ {NULL, NULL},
-    /* [ 47] =  1335 */ {NULL, NULL},
-    /* [ 48] =  1416 */ {NULL, NULL},
-    /* [ 49] =  1417 */ {NULL, NULL},
-    /* [ 50] =  1418 */ {NULL, NULL},
-    /* [ 51] =  1419 */ {NULL, NULL},
-    /* [ 52] =  1420 */ {NULL, NULL},
-    /* [ 53] =  1421 */ {NULL, NULL},
-    /* [ 54] =  1422 */ {__glXDisp_IsRenderbufferEXT, __glXDispSwap_IsRenderbufferEXT},
-    /* [ 55] =  1423 */ {__glXDisp_GenRenderbuffersEXT, __glXDispSwap_GenRenderbuffersEXT},
-    /* [ 56] =  1424 */ {__glXDisp_GetRenderbufferParameterivEXT, __glXDispSwap_GetRenderbufferParameterivEXT},
-    /* [ 57] =  1425 */ {__glXDisp_IsFramebufferEXT, __glXDispSwap_IsFramebufferEXT},
-    /* [ 58] =  1426 */ {__glXDisp_GenFramebuffersEXT, __glXDispSwap_GenFramebuffersEXT},
-    /* [ 59] =  1427 */ {__glXDisp_CheckFramebufferStatusEXT, __glXDispSwap_CheckFramebufferStatusEXT},
-    /* [ 60] =  1428 */ {__glXDisp_GetFramebufferAttachmentParameterivEXT, __glXDispSwap_GetFramebufferAttachmentParameterivEXT},
-    /* [ 61] =  1429 */ {NULL, NULL},
-    /* [ 62] =  1430 */ {NULL, NULL},
-    /* [ 63] =  1431 */ {NULL, NULL},
-    /* [ 64] =  4096 */ {NULL, NULL},
-    /* [ 65] =  4097 */ {NULL, NULL},
-    /* [ 66] =  4098 */ {__glXDisp_GetColorTableSGI, __glXDispSwap_GetColorTableSGI},
-    /* [ 67] =  4099 */ {__glXDisp_GetColorTableParameterfvSGI, __glXDispSwap_GetColorTableParameterfvSGI},
-    /* [ 68] =  4100 */ {__glXDisp_GetColorTableParameterivSGI, __glXDispSwap_GetColorTableParameterivSGI},
-    /* [ 69] =  4101 */ {NULL, NULL},
-    /* [ 70] =  4102 */ {NULL, NULL},
-    /* [ 71] =  4103 */ {NULL, NULL},
-    /* [ 72] =  5152 */ {NULL, NULL},
-    /* [ 73] =  5153 */ {NULL, NULL},
-    /* [ 74] =  5154 */ {__glXDisp_CopySubBufferMESA, __glXDispSwap_CopySubBufferMESA},
-    /* [ 75] =  5155 */ {NULL, NULL},
-    /* [ 76] =  5156 */ {NULL, NULL},
-    /* [ 77] =  5157 */ {NULL, NULL},
-    /* [ 78] =  5158 */ {NULL, NULL},
-    /* [ 79] =  5159 */ {NULL, NULL},
-    /* [ 80] = 65536 */ {__glXDisp_SwapIntervalSGI, __glXDispSwap_SwapIntervalSGI},
-    /* [ 81] = 65537 */ {__glXDisp_MakeCurrentReadSGI, __glXDispSwap_MakeCurrentReadSGI},
-    /* [ 82] = 65538 */ {NULL, NULL},
-    /* [ 83] = 65539 */ {NULL, NULL},
-    /* [ 84] = 65540 */ {__glXDisp_GetFBConfigsSGIX, __glXDispSwap_GetFBConfigsSGIX},
-    /* [ 85] = 65541 */ {__glXDisp_CreateContextWithConfigSGIX, __glXDispSwap_CreateContextWithConfigSGIX},
-    /* [ 86] = 65542 */ {__glXDisp_CreateGLXPixmapWithConfigSGIX, __glXDispSwap_CreateGLXPixmapWithConfigSGIX},
-    /* [ 87] = 65543 */ {NULL, NULL},
+static const void *VendorPriv_function_table[96][2] = {
+    /* [  0] =     0 */ {NULL, NULL},
+    /* [  1] =     1 */ {__glXDisp_GetConvolutionFilterEXT, __glXDispSwap_GetConvolutionFilterEXT},
+    /* [  2] =     2 */ {__glXDisp_GetConvolutionParameterfvEXT, __glXDispSwap_GetConvolutionParameterfvEXT},
+    /* [  3] =     3 */ {__glXDisp_GetConvolutionParameterivEXT, __glXDispSwap_GetConvolutionParameterivEXT},
+    /* [  4] =     4 */ {__glXDisp_GetSeparableFilterEXT, __glXDispSwap_GetSeparableFilterEXT},
+    /* [  5] =     5 */ {__glXDisp_GetHistogramEXT, __glXDispSwap_GetHistogramEXT},
+    /* [  6] =     6 */ {__glXDisp_GetHistogramParameterfvEXT, __glXDispSwap_GetHistogramParameterfvEXT},
+    /* [  7] =     7 */ {__glXDisp_GetHistogramParameterivEXT, __glXDispSwap_GetHistogramParameterivEXT},
+    /* [  8] =     8 */ {__glXDisp_GetMinmaxEXT, __glXDispSwap_GetMinmaxEXT},
+    /* [  9] =     9 */ {__glXDisp_GetMinmaxParameterfvEXT, __glXDispSwap_GetMinmaxParameterfvEXT},
+    /* [ 10] =    10 */ {__glXDisp_GetMinmaxParameterivEXT, __glXDispSwap_GetMinmaxParameterivEXT},
+    /* [ 11] =    11 */ {__glXDisp_AreTexturesResidentEXT, __glXDispSwap_AreTexturesResidentEXT},
+    /* [ 12] =    12 */ {__glXDisp_DeleteTexturesEXT, __glXDispSwap_DeleteTexturesEXT},
+    /* [ 13] =    13 */ {__glXDisp_GenTexturesEXT, __glXDispSwap_GenTexturesEXT},
+    /* [ 14] =    14 */ {__glXDisp_IsTextureEXT, __glXDispSwap_IsTextureEXT},
+    /* [ 15] =    15 */ {NULL, NULL},
+    /* [ 16] =  1024 */ {__glXDisp_QueryContextInfoEXT, __glXDispSwap_QueryContextInfoEXT},
+    /* [ 17] =  1025 */ {NULL, NULL},
+    /* [ 18] =  1026 */ {NULL, NULL},
+    /* [ 19] =  1027 */ {NULL, NULL},
+    /* [ 20] =  1028 */ {NULL, NULL},
+    /* [ 21] =  1029 */ {NULL, NULL},
+    /* [ 22] =  1030 */ {NULL, NULL},
+    /* [ 23] =  1031 */ {NULL, NULL},
+    /* [ 24] =  1296 */ {__glXDisp_GetProgramEnvParameterfvARB, __glXDispSwap_GetProgramEnvParameterfvARB},
+    /* [ 25] =  1297 */ {__glXDisp_GetProgramEnvParameterdvARB, __glXDispSwap_GetProgramEnvParameterdvARB},
+    /* [ 26] =  1298 */ {__glXDisp_GetProgramivNV, __glXDispSwap_GetProgramivNV},
+    /* [ 27] =  1299 */ {__glXDisp_GetProgramStringNV, __glXDispSwap_GetProgramStringNV},
+    /* [ 28] =  1300 */ {__glXDisp_GetTrackMatrixivNV, __glXDispSwap_GetTrackMatrixivNV},
+    /* [ 29] =  1301 */ {__glXDisp_GetVertexAttribdvARB, __glXDispSwap_GetVertexAttribdvARB},
+    /* [ 30] =  1302 */ {__glXDisp_GetVertexAttribfvNV, __glXDispSwap_GetVertexAttribfvNV},
+    /* [ 31] =  1303 */ {__glXDisp_GetVertexAttribivNV, __glXDispSwap_GetVertexAttribivNV},
+    /* [ 32] =  1304 */ {__glXDisp_IsProgramNV, __glXDispSwap_IsProgramNV},
+    /* [ 33] =  1305 */ {__glXDisp_GetProgramLocalParameterfvARB, __glXDispSwap_GetProgramLocalParameterfvARB},
+    /* [ 34] =  1306 */ {__glXDisp_GetProgramLocalParameterdvARB, __glXDispSwap_GetProgramLocalParameterdvARB},
+    /* [ 35] =  1307 */ {__glXDisp_GetProgramivARB, __glXDispSwap_GetProgramivARB},
+    /* [ 36] =  1308 */ {__glXDisp_GetProgramStringARB, __glXDispSwap_GetProgramStringARB},
+    /* [ 37] =  1309 */ {NULL, NULL},
+    /* [ 38] =  1310 */ {__glXDisp_GetProgramNamedParameterfvNV, __glXDispSwap_GetProgramNamedParameterfvNV},
+    /* [ 39] =  1311 */ {__glXDisp_GetProgramNamedParameterdvNV, __glXDispSwap_GetProgramNamedParameterdvNV},
+    /* [ 40] =  1288 */ {NULL, NULL},
+    /* [ 41] =  1289 */ {NULL, NULL},
+    /* [ 42] =  1290 */ {NULL, NULL},
+    /* [ 43] =  1291 */ {NULL, NULL},
+    /* [ 44] =  1292 */ {NULL, NULL},
+    /* [ 45] =  1293 */ {__glXDisp_AreProgramsResidentNV, __glXDispSwap_AreProgramsResidentNV},
+    /* [ 46] =  1294 */ {__glXDisp_DeleteProgramsNV, __glXDispSwap_DeleteProgramsNV},
+    /* [ 47] =  1295 */ {__glXDisp_GenProgramsNV, __glXDispSwap_GenProgramsNV},
+    /* [ 48] =  1328 */ {NULL, NULL},
+    /* [ 49] =  1329 */ {NULL, NULL},
+    /* [ 50] =  1330 */ {__glXDisp_BindTexImageEXT, __glXDispSwap_BindTexImageEXT},
+    /* [ 51] =  1331 */ {__glXDisp_ReleaseTexImageEXT, __glXDispSwap_ReleaseTexImageEXT},
+    /* [ 52] =  1332 */ {NULL, NULL},
+    /* [ 53] =  1333 */ {NULL, NULL},
+    /* [ 54] =  1334 */ {NULL, NULL},
+    /* [ 55] =  1335 */ {NULL, NULL},
+    /* [ 56] =  1416 */ {NULL, NULL},
+    /* [ 57] =  1417 */ {NULL, NULL},
+    /* [ 58] =  1418 */ {NULL, NULL},
+    /* [ 59] =  1419 */ {NULL, NULL},
+    /* [ 60] =  1420 */ {NULL, NULL},
+    /* [ 61] =  1421 */ {NULL, NULL},
+    /* [ 62] =  1422 */ {__glXDisp_IsRenderbufferEXT, __glXDispSwap_IsRenderbufferEXT},
+    /* [ 63] =  1423 */ {__glXDisp_GenRenderbuffersEXT, __glXDispSwap_GenRenderbuffersEXT},
+    /* [ 64] =  1424 */ {__glXDisp_GetRenderbufferParameterivEXT, __glXDispSwap_GetRenderbufferParameterivEXT},
+    /* [ 65] =  1425 */ {__glXDisp_IsFramebufferEXT, __glXDispSwap_IsFramebufferEXT},
+    /* [ 66] =  1426 */ {__glXDisp_GenFramebuffersEXT, __glXDispSwap_GenFramebuffersEXT},
+    /* [ 67] =  1427 */ {__glXDisp_CheckFramebufferStatusEXT, __glXDispSwap_CheckFramebufferStatusEXT},
+    /* [ 68] =  1428 */ {__glXDisp_GetFramebufferAttachmentParameterivEXT, __glXDispSwap_GetFramebufferAttachmentParameterivEXT},
+    /* [ 69] =  1429 */ {NULL, NULL},
+    /* [ 70] =  1430 */ {NULL, NULL},
+    /* [ 71] =  1431 */ {NULL, NULL},
+    /* [ 72] =  4096 */ {NULL, NULL},
+    /* [ 73] =  4097 */ {NULL, NULL},
+    /* [ 74] =  4098 */ {__glXDisp_GetColorTableSGI, __glXDispSwap_GetColorTableSGI},
+    /* [ 75] =  4099 */ {__glXDisp_GetColorTableParameterfvSGI, __glXDispSwap_GetColorTableParameterfvSGI},
+    /* [ 76] =  4100 */ {__glXDisp_GetColorTableParameterivSGI, __glXDispSwap_GetColorTableParameterivSGI},
+    /* [ 77] =  4101 */ {NULL, NULL},
+    /* [ 78] =  4102 */ {NULL, NULL},
+    /* [ 79] =  4103 */ {NULL, NULL},
+    /* [ 80] =  5152 */ {NULL, NULL},
+    /* [ 81] =  5153 */ {NULL, NULL},
+    /* [ 82] =  5154 */ {__glXDisp_CopySubBufferMESA, __glXDispSwap_CopySubBufferMESA},
+    /* [ 83] =  5155 */ {NULL, NULL},
+    /* [ 84] =  5156 */ {NULL, NULL},
+    /* [ 85] =  5157 */ {NULL, NULL},
+    /* [ 86] =  5158 */ {NULL, NULL},
+    /* [ 87] =  5159 */ {NULL, NULL},
+    /* [ 88] = 65536 */ {__glXDisp_SwapIntervalSGI, __glXDispSwap_SwapIntervalSGI},
+    /* [ 89] = 65537 */ {__glXDisp_MakeCurrentReadSGI, __glXDispSwap_MakeCurrentReadSGI},
+    /* [ 90] = 65538 */ {NULL, NULL},
+    /* [ 91] = 65539 */ {NULL, NULL},
+    /* [ 92] = 65540 */ {__glXDisp_GetFBConfigsSGIX, __glXDispSwap_GetFBConfigsSGIX},
+    /* [ 93] = 65541 */ {__glXDisp_CreateContextWithConfigSGIX, __glXDispSwap_CreateContextWithConfigSGIX},
+    /* [ 94] = 65542 */ {__glXDisp_CreateGLXPixmapWithConfigSGIX, __glXDispSwap_CreateGLXPixmapWithConfigSGIX},
+    /* [ 95] = 65543 */ {NULL, NULL},
 };
 
 const struct __glXDispatchInfo VendorPriv_dispatch_info = {
diff --git a/GL/glx/singlepix.c b/GL/glx/singlepix.c
index 3f76e5e..98898aa 100644
--- a/GL/glx/singlepix.c
+++ b/GL/glx/singlepix.c
@@ -195,7 +195,7 @@ int __glXDisp_GetPolygonStipple(__GLXcli
     return Success;
 }
 
-int __glXDisp_GetSeparableFilter(__GLXclientState *cl, GLbyte *pc)
+static int GetSeparableFilter(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
 {
     GLint compsize, compsize2;
     GLenum format, type, target;
@@ -206,12 +206,11 @@ int __glXDisp_GetSeparableFilter(__GLXcl
     char *answer, answerBuffer[200];
     GLint width=0, height=0;
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     format = *(GLenum *)(pc + 4);
     type = *(GLenum *)(pc + 8);
     target = *(GLenum *)(pc + 0);
@@ -220,8 +219,8 @@ int __glXDisp_GetSeparableFilter(__GLXcl
     /* target must be SEPARABLE_2D, however I guess we can let the GL
        barf on this one.... */
 
-    CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_WIDTH, &width) );
-    CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_HEIGHT, &height) );
+    CALL_GetConvolutionParameteriv(GET_DISPATCH(), (target, GL_CONVOLUTION_WIDTH, &width));
+    CALL_GetConvolutionParameteriv(GET_DISPATCH(), (target, GL_CONVOLUTION_HEIGHT, &height));
     /*
      * The two queries above might fail if we're in a state where queries
      * are illegal, but then width and height would still be zero anyway.
@@ -234,7 +233,7 @@ int __glXDisp_GetSeparableFilter(__GLXcl
     compsize = __GLX_PAD(compsize);
     compsize2 = __GLX_PAD(compsize2);
 
-    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes) );
+    CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes));
     __GLX_GET_ANSWER_BUFFER(answer,cl,compsize + compsize2,1);
     __glXClearErrorOccured();
     CALL_GetSeparableFilter( GET_DISPATCH(), (
@@ -260,7 +259,22 @@ int __glXDisp_GetSeparableFilter(__GLXcl
     return Success;
 }
 
-int __glXDisp_GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc)
+int __glXDisp_GetSeparableFilter(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
+
+    return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
+
+int __glXDisp_GetSeparableFilterEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
+
+    return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
+}
+
+static int GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc,
+				GLXContextTag tag)
 {
     GLint compsize;
     GLenum format, type, target;
@@ -271,22 +285,23 @@ int __glXDisp_GetConvolutionFilter(__GLX
     char *answer, answerBuffer[200];
     GLint width=0, height=0;
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     format = *(GLenum *)(pc + 4);
     type = *(GLenum *)(pc + 8);
     target = *(GLenum *)(pc + 0);
     swapBytes = *(GLboolean *)(pc + 12);
 
-    CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_WIDTH, &width) );
+    CALL_GetConvolutionParameteriv(GET_DISPATCH(), 
+				   (target, GL_CONVOLUTION_WIDTH, &width));
     if (target == GL_CONVOLUTION_1D) {
         height = 1;
     } else {
-	CALL_GetConvolutionParameteriv( GET_DISPATCH(), (target, GL_CONVOLUTION_HEIGHT, &height) );
+	CALL_GetConvolutionParameteriv(GET_DISPATCH(),
+				       (target, GL_CONVOLUTION_HEIGHT, &height));
     }
     /*
      * The two queries above might fail if we're in a state where queries
@@ -295,7 +310,7 @@ int __glXDisp_GetConvolutionFilter(__GLX
     compsize = __glGetTexImage_size(target,1,format,type,width,height,1);
     if (compsize < 0) compsize = 0;
 
-    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes) );
+    CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes));
     __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
     __glXClearErrorOccured();
     CALL_GetConvolutionFilter( GET_DISPATCH(), (
@@ -319,7 +334,21 @@ int __glXDisp_GetConvolutionFilter(__GLX
     return Success;
 }
 
-int __glXDisp_GetHistogram(__GLXclientState *cl, GLbyte *pc)
+int __glXDisp_GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
+
+    return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
+
+int __glXDisp_GetConvolutionFilterEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
+
+    return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
+}
+
+static int GetHistogram(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
 {
     GLint compsize;
     GLenum format, type, target;
@@ -330,19 +359,19 @@ int __glXDisp_GetHistogram(__GLXclientSt
     char *answer, answerBuffer[200];
     GLint width=0;
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     format = *(GLenum *)(pc + 4);
     type = *(GLenum *)(pc + 8);
     target = *(GLenum *)(pc + 0);
     swapBytes = *(GLboolean *)(pc + 12);
     reset = *(GLboolean *)(pc + 13);
 
-    CALL_GetHistogramParameteriv( GET_DISPATCH(), (target, GL_HISTOGRAM_WIDTH, &width) );
+    CALL_GetHistogramParameteriv(GET_DISPATCH(),
+				 (target, GL_HISTOGRAM_WIDTH, &width));
     /*
      * The one query above might fail if we're in a state where queries
      * are illegal, but then width would still be zero anyway.
@@ -350,10 +379,10 @@ int __glXDisp_GetHistogram(__GLXclientSt
     compsize = __glGetTexImage_size(target,1,format,type,width,1,1);
     if (compsize < 0) compsize = 0;
 
-    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes) );
+    CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes));
     __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
     __glXClearErrorOccured();
-    CALL_GetHistogram( GET_DISPATCH(), (target, reset, format, type, answer) );
+    CALL_GetHistogram(GET_DISPATCH(), (target, reset, format, type, answer));
 
     if (__glXErrorOccured()) {
 	__GLX_BEGIN_REPLY(0);
@@ -368,7 +397,21 @@ int __glXDisp_GetHistogram(__GLXclientSt
     return Success;
 }
 
-int __glXDisp_GetMinmax(__GLXclientState *cl, GLbyte *pc)
+int __glXDisp_GetHistogram(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
+
+    return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
+
+int __glXDisp_GetHistogramEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
+
+    return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
+}
+
+static int GetMinmax(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
 {
     GLint compsize;
     GLenum format, type, target;
@@ -378,12 +421,11 @@ int __glXDisp_GetMinmax(__GLXclientState
     int error;
     char *answer, answerBuffer[200];
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     format = *(GLenum *)(pc + 4);
     type = *(GLenum *)(pc + 8);
     target = *(GLenum *)(pc + 0);
@@ -393,10 +435,10 @@ int __glXDisp_GetMinmax(__GLXclientState
     compsize = __glGetTexImage_size(target,1,format,type,2,1,1);
     if (compsize < 0) compsize = 0;
 
-    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes) );
+    CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes));
     __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
     __glXClearErrorOccured();
-    CALL_GetMinmax( GET_DISPATCH(), (target, reset, format, type, answer) );
+    CALL_GetMinmax(GET_DISPATCH(), (target, reset, format, type, answer));
 
     if (__glXErrorOccured()) {
 	__GLX_BEGIN_REPLY(0);
@@ -410,7 +452,21 @@ int __glXDisp_GetMinmax(__GLXclientState
     return Success;
 }
 
-int __glXDisp_GetColorTable(__GLXclientState *cl, GLbyte *pc)
+int __glXDisp_GetMinmax(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
+
+    return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
+
+int __glXDisp_GetMinmaxEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
+
+    return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
+}
+
+static int GetColorTable(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
 {
     GLint compsize;
     GLenum format, type, target;
@@ -421,18 +477,18 @@ int __glXDisp_GetColorTable(__GLXclientS
     char *answer, answerBuffer[200];
     GLint width=0;
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     target = *(GLenum *)(pc + 0);
     format = *(GLenum *)(pc + 4);
     type = *(GLenum *)(pc + 8);
     swapBytes = *(GLboolean *)(pc + 12);
 
-    CALL_GetColorTableParameteriv( GET_DISPATCH(), (target, GL_COLOR_TABLE_WIDTH, &width) );
+    CALL_GetColorTableParameteriv(GET_DISPATCH(), 
+				  (target, GL_COLOR_TABLE_WIDTH, &width));
     /*
      * The one query above might fail if we're in a state where queries
      * are illegal, but then width would still be zero anyway.
@@ -440,7 +496,7 @@ int __glXDisp_GetColorTable(__GLXclientS
     compsize = __glGetTexImage_size(target,1,format,type,width,1,1);
     if (compsize < 0) compsize = 0;
 
-    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes) );
+    CALL_PixelStorei(GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes));
     __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
     __glXClearErrorOccured();
     CALL_GetColorTable( GET_DISPATCH(), (
@@ -463,55 +519,16 @@ int __glXDisp_GetColorTable(__GLXclientS
     return Success;
 }
 
-int __glXDisp_GetColorTableSGI(__GLXclientState *cl, GLbyte *pc)
+int __glXDisp_GetColorTable(__GLXclientState *cl, GLbyte *pc)
 {
-    GLint compsize;
-    GLenum format, type, target;
-    GLboolean swapBytes;
-    __GLXcontext *cx;
-    ClientPtr client = cl->client;
-    int error;
-    char *answer, answerBuffer[200];
-    GLint width=0;
-
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
-    if (!cx) {
-	return error;
-    }
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
 
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    target = *(GLenum *)(pc + 0);
-    format = *(GLenum *)(pc + 4);
-    type = *(GLenum *)(pc + 8);
-    swapBytes = *(GLboolean *)(pc + 12);
-
-    CALL_GetColorTableParameterivSGI( GET_DISPATCH(), (target, GL_COLOR_TABLE_WIDTH, &width) );
-    /*
-     * The one query above might fail if we're in a state where queries
-     * are illegal, but then width would still be zero anyway.
-     */
-    compsize = __glGetTexImage_size(target,1,format,type,width,1,1);
-    if (compsize < 0) compsize = 0;
-
-    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, swapBytes) );
-    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
-    __glXClearErrorOccured();
-    CALL_GetColorTableSGI( GET_DISPATCH(), (
-		  *(GLenum   *)(pc + 0),
-		  *(GLenum   *)(pc + 4),
-		  *(GLenum   *)(pc + 8),
-		  answer
-		  ) );
+    return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
 
-    if (__glXErrorOccured()) {
-	__GLX_BEGIN_REPLY(0);
-	__GLX_SEND_HEADER();
-    } else {
-	__GLX_BEGIN_REPLY(compsize);
-	((xGLXGetColorTableReply *)&__glXReply)->width = width;
-	__GLX_SEND_HEADER();
-	__GLX_SEND_VOID_ARRAY(compsize);
-    }
+int __glXDisp_GetColorTableSGI(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
 
-    return Success;
+    return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
 }
diff --git a/GL/glx/singlepixswap.c b/GL/glx/singlepixswap.c
index c2e06d1..032b427 100644
--- a/GL/glx/singlepixswap.c
+++ b/GL/glx/singlepixswap.c
@@ -219,7 +219,7 @@ int __glXDispSwap_GetPolygonStipple(__GL
     return Success;
 }
 
-int __glXDispSwap_GetSeparableFilter(__GLXclientState *cl, GLbyte *pc)
+static int GetSeparableFilter(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
 {
     GLint compsize, compsize2;
     GLenum format, type, target;
@@ -231,12 +231,11 @@ int __glXDispSwap_GetSeparableFilter(__G
     char *answer, answerBuffer[200];
     GLint width=0, height=0;
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     __GLX_SWAP_INT(pc+0);
     __GLX_SWAP_INT(pc+4);
     __GLX_SWAP_INT(pc+8);
@@ -291,7 +290,21 @@ int __glXDispSwap_GetSeparableFilter(__G
     return Success;
 }
 
-int __glXDispSwap_GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc)
+int __glXDispSwap_GetSeparableFilter(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
+
+    return GetSeparableFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
+
+int __glXDispSwap_GetSeparableFilterEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
+
+    return GetSeparableFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
+}
+
+static int GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
 {
     GLint compsize;
     GLenum format, type, target;
@@ -303,12 +316,11 @@ int __glXDispSwap_GetConvolutionFilter(_
     char *answer, answerBuffer[200];
     GLint width=0, height=0;
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     __GLX_SWAP_INT(pc+0);
     __GLX_SWAP_INT(pc+4);
     __GLX_SWAP_INT(pc+8);
@@ -357,7 +369,21 @@ int __glXDispSwap_GetConvolutionFilter(_
     return Success;
 }
 
-int __glXDispSwap_GetHistogram(__GLXclientState *cl, GLbyte *pc)
+int __glXDispSwap_GetConvolutionFilter(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
+
+    return GetConvolutionFilter(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
+
+int __glXDispSwap_GetConvolutionFilterEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
+
+    return GetConvolutionFilter(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
+}
+
+static int GetHistogram(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
 {
     GLint compsize;
     GLenum format, type, target;
@@ -369,12 +395,11 @@ int __glXDispSwap_GetHistogram(__GLXclie
     char *answer, answerBuffer[200];
     GLint width=0;
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     __GLX_SWAP_INT(pc+0);
     __GLX_SWAP_INT(pc+4);
     __GLX_SWAP_INT(pc+8);
@@ -412,7 +437,21 @@ int __glXDispSwap_GetHistogram(__GLXclie
     return Success;
 }
 
-int __glXDispSwap_GetMinmax(__GLXclientState *cl, GLbyte *pc)
+int __glXDispSwap_GetHistogram(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
+
+    return GetHistogram(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
+
+int __glXDispSwap_GetHistogramEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
+
+    return GetHistogram(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
+}
+
+static int GetMinmax(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
 {
     GLint compsize;
     GLenum format, type, target;
@@ -423,12 +462,11 @@ int __glXDispSwap_GetMinmax(__GLXclientS
     __GLX_DECLARE_SWAP_VARIABLES;
     char *answer, answerBuffer[200];
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     __GLX_SWAP_INT(pc+0);
     __GLX_SWAP_INT(pc+4);
     __GLX_SWAP_INT(pc+8);
@@ -459,7 +497,21 @@ int __glXDispSwap_GetMinmax(__GLXclientS
     return Success;
 }
 
-int __glXDispSwap_GetColorTable(__GLXclientState *cl, GLbyte *pc)
+int __glXDispSwap_GetMinmax(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
+
+    return GetMinmax(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
+
+int __glXDispSwap_GetMinmaxEXT(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
+
+    return GetMinmax(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
+}
+
+static int GetColorTable(__GLXclientState *cl, GLbyte *pc, GLXContextTag tag)
 {
     GLint compsize;
     GLenum format, type, target;
@@ -471,12 +523,11 @@ int __glXDispSwap_GetColorTable(__GLXcli
     char *answer, answerBuffer[200];
     GLint width=0;
 
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
+    cx = __glXForceCurrent(cl, tag, &error);
     if (!cx) {
 	return error;
     }
 
-    pc += __GLX_SINGLE_HDR_SIZE;
     __GLX_SWAP_INT(pc+0);
     __GLX_SWAP_INT(pc+4);
     __GLX_SWAP_INT(pc+8);
@@ -518,61 +569,16 @@ int __glXDispSwap_GetColorTable(__GLXcli
     return Success;
 }
 
-int __glXDispSwap_GetColorTableSGI(__GLXclientState *cl, GLbyte *pc)
+int __glXDispSwap_GetColorTable(__GLXclientState *cl, GLbyte *pc)
 {
-    GLint compsize;
-    GLenum format, type, target;
-    GLboolean swapBytes;
-    __GLXcontext *cx;
-    ClientPtr client = cl->client;
-    int error;
-    __GLX_DECLARE_SWAP_VARIABLES;
-    char *answer, answerBuffer[200];
-    GLint width=0;
-
-    cx = __glXForceCurrent(cl, __GLX_GET_SINGLE_CONTEXT_TAG(pc), &error);
-    if (!cx) {
-	return error;
-    }
-
-    pc += __GLX_VENDPRIV_HDR_SIZE;
-    __GLX_SWAP_INT(pc+0);
-    __GLX_SWAP_INT(pc+4);
-    __GLX_SWAP_INT(pc+8);
-
-    format = *(GLenum *)(pc + 4);
-    type = *(GLenum *)(pc + 8);
-    target = *(GLenum *)(pc + 0);
-    swapBytes = *(GLboolean *)(pc + 12);
+    const GLXContextTag tag = __GLX_GET_SINGLE_CONTEXT_TAG(pc);
 
-    CALL_GetColorTableParameterivSGI( GET_DISPATCH(), (target, GL_COLOR_TABLE_WIDTH, &width) );
-    /*
-     * The one query above might fail if we're in a state where queries
-     * are illegal, but then width would still be zero anyway.
-     */
-    compsize = __glGetTexImage_size(target,1,format,type,width,1,1);
-    if (compsize < 0) compsize = 0;
-
-    CALL_PixelStorei( GET_DISPATCH(), (GL_PACK_SWAP_BYTES, !swapBytes) );
-    __GLX_GET_ANSWER_BUFFER(answer,cl,compsize,1);
-    __glXClearErrorOccured();
-    CALL_GetColorTableSGI( GET_DISPATCH(), (
-		  *(GLenum   *)(pc + 0),
-		  *(GLenum   *)(pc + 4),
-		  *(GLenum   *)(pc + 8),
-		  answer
-		  ) );
+    return GetColorTable(cl, pc + __GLX_SINGLE_HDR_SIZE, tag);
+}
 
-    if (__glXErrorOccured()) {
-	__GLX_BEGIN_REPLY(0);
-	__GLX_SWAP_REPLY_HEADER();
-    } else {
-	__GLX_BEGIN_REPLY(compsize);
-	__GLX_SWAP_REPLY_HEADER();
-	__GLX_SWAP_INT(&width);
-	((xGLXGetColorTableReply *)&__glXReply)->width = width;
-	__GLX_SEND_VOID_ARRAY(compsize);
-    }
+int __glXDispSwap_GetColorTableSGI(__GLXclientState *cl, GLbyte *pc)
+{
+    const GLXContextTag tag = __GLX_GET_VENDPRIV_CONTEXT_TAG(pc);
 
-    return Success;
+    return GetColorTable(cl, pc + __GLX_VENDPRIV_HDR_SIZE, tag);
 }
diff-tree bd3d93be82d91e4cf35ae317dfd658d1706257ea (from 33406da096b4ae21134484113b280e07d0c8f0d9)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 23:21:12 2006 +0300

    xkb: remove random broken vendor workarounds

diff --git a/xkb/ddxBeep.c b/xkb/ddxBeep.c
index ff9dd99..53f3a6f 100644
--- a/xkb/ddxBeep.c
+++ b/xkb/ddxBeep.c
@@ -39,12 +39,6 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include <X11/extensions/XKBsrv.h>
 #include <X11/extensions/XI.h>
 
-#if (defined(__osf__) && defined(__alpha))
-#include <sys/sysinfo.h>
-#include <alpha/hal_sysinfo.h>
-#include <alpha/prom.h>
-#endif
-
 /*#define FALLING_TONE	1*/
 /*#define RISING_TONE	1*/
 #define FALLING_TONE	10
@@ -116,32 +110,6 @@ _XkbDDXBeepInitAtoms(void)
     stickyLock=		MAKE_ATOM(STICKY_LOCK);
     stickyUnlock= 	MAKE_ATOM(STICKY_UNLOCK);
     bounceReject= 	MAKE_ATOM(BOUNCE_REJECT);
-#if (defined(__osf__) && defined(__alpha))
-    /* [[[ WDW - Some bells do not allow for pitch changes.
-     * Maybe this could become part of the keymap? ]]]
-     */
-    {
-	char keyboard[8];
-
-	/* Find the class of keyboard being used.
-	 */
-	keyboard[0] = '\0';
-	if (-1 == getsysinfo(GSI_KEYBOARD, 
-			     keyboard, sizeof(keyboard), 
-			     0, NULL))
-	    keyboard[0] = '\0';
-
-	if ((strcmp(keyboard,"LK201") == 0) ||
-	    (strcmp(keyboard,"LK401") == 0) ||
-	    (strcmp(keyboard,"LK421") == 0) ||
-	    (strcmp(keyboard,"LK443") == 0))
-	    doesPitch = 0;
-    }
-#else
-#if defined(sun)
-    doesPitch = 0;
-#endif
-#endif
     return;
 }
 
diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index 7b57611..0ab3dad 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -361,10 +361,7 @@ XkbControlsPtr	ctrls;
 	if (keybd->kbdfeed->ctrl.autoRepeat && 
 	    ((xkbi->slowKey != xkbi->mouseKey) || (!xkbi->mouseKeysAccel)) &&
 	     (ctrls->enabled_ctrls&XkbRepeatKeysMask)) {
-#ifndef AIXV3
-	    if (BitIsOn(keybd->kbdfeed->ctrl.autoRepeats,xkbi->slowKey))
-#endif
-	    {
+	    if (BitIsOn(keybd->kbdfeed->ctrl.autoRepeats,xkbi->slowKey)) {
 		xkbi->repeatKey = xkbi->slowKey;
 		xkbi->repeatKeyTimer= TimerSet(xkbi->repeatKeyTimer,
 					0, ctrls->repeat_delay,
@@ -530,10 +527,7 @@ KeySym *	sym = XkbKeySymsPtr(xkbi->desc,
 	if ((keybd->kbdfeed->ctrl.autoRepeat) &&
 		((ctrls->enabled_ctrls&(XkbSlowKeysMask|XkbRepeatKeysMask))==
 							XkbRepeatKeysMask)) {
-#ifndef AIXV3
-	    if (BitIsOn(keybd->kbdfeed->ctrl.autoRepeats,key))
-#endif
-	    {
+	    if (BitIsOn(keybd->kbdfeed->ctrl.autoRepeats,key)) {
 #ifdef DEBUG
 		if (xkbDebugFlags&0x10)
 		    ErrorF("Starting software autorepeat...\n");
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 9f6af30..86983c8 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -45,24 +45,10 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include <X11/extensions/XKBgeom.h>
 #include "xkb.h"
 
-#ifdef MODE_SWITCH
-extern Bool noKME; /* defined in os/utils.c */
-#endif
-
 int	XkbDisableLockActions = 0;
 
 /***====================================================================***/
 
-#ifndef RETURN_SHOULD_REPEAT
-#if (defined(__osf__) && defined(__alpha))
-#define RETURN_SHOULD_REPEAT 1
-#else
-#define	RETURN_SHOULD_REPEAT 0
-#endif
-#endif
-
-/***====================================================================***/
-
 DeviceIntPtr
 _XkbLookupAnyDevice(int id,int *why_rtrn)
 {
@@ -560,12 +546,6 @@ CARD8			keysPerMod[XkbNumModifiers];
 	    }
 	}
     }
-#ifdef MODE_SWITCH
-    /* Fix up any of the KME stuff if we changed the core description.
-     */
-    if (!noKME)
-	HandleKeyBinding(keyc, &keyc->curKeySyms);
-#endif
     return;
 }
 
diff-tree 33406da096b4ae21134484113b280e07d0c8f0d9 (from ef7e05e9de57b9c9c27ed3307eede6d8fc6c1af3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 23:20:56 2006 +0300

    GetKeyboardEvents: add first_valuator argument to GKVE

diff --git a/dix/events.c b/dix/events.c
index 91aa673..646a9ba 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4619,7 +4619,7 @@ GetMaximumEventsNum() {
  */
 int
 GetKeyboardEvents(xEvent *events, DeviceIntPtr pDev, int type, int key_code) {
-    return GetKeyboardValuatorEvents(events, pDev, type, key_code, 0, NULL);
+    return GetKeyboardValuatorEvents(events, pDev, type, key_code, 0, 0, NULL);
 }
 
 /**
@@ -4704,7 +4704,8 @@ int GetKeyboardValuatorEvents(xEvent *ev
         {
             numEvents += GetKeyboardValuatorEvents(events, pDev,
                                                    KeyRelease, key_code,
-                                                   num_valuators, valuators);
+                                                   first_valuator, num_valuators,
+                                                   valuators);
             events += numEvents;
         }
     }
diff-tree ef7e05e9de57b9c9c27ed3307eede6d8fc6c1af3 (from 1546a398144619a14ff06aaf84ebc1bf293eac66)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 21:42:15 2006 +0300

    xfree86/xinput: pass first_valuator params, don't clip to first screen bound
    Pass first_valuator to GetPointerEvents/GetKeyboardValuatorEvents.
    Don't clip axis bounds to that of screen 0 when initialising axes.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index ee32adc..a398740 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -653,7 +653,8 @@ xf86PostMotionEvent(DeviceIntPtr	device,
         FatalError("Couldn't allocate event store\n");
 
     nevents = GetPointerEvents(xf86Events, device, MotionNotify, 0,
-                               flags, 0, num_valuators, valuators);
+                               flags, first_valuator, num_valuators,
+                               valuators);
 
     for (i = 0; i < nevents; i++)
         mieqEnqueue(xf86Events + i);
@@ -792,7 +793,7 @@ xf86PostButtonEvent(DeviceIntPtr	device,
                                is_down ? ButtonPress : ButtonRelease, button,
                                is_absolute ? POINTER_ABSOLUTE :
                                              POINTER_RELATIVE,
-                               0, num_valuators, valuators);
+                               first_valuator, num_valuators, valuators);
 
     for (i = 0; i < nevents; i++)
         mieqEnqueue(xf86Events + i);
@@ -829,8 +830,8 @@ xf86PostKeyEvent(DeviceIntPtr	device,
 
         nevents = GetKeyboardValuatorEvents(xf86Events, device,
                                             is_down ? KeyPress : KeyRelease,
-                                            key_code, num_valuators,
-                                            valuators);
+                                            key_code, first_valuator,
+                                            num_valuators, valuators);
     }
     else {
         nevents = GetKeyboardEvents(xf86Events, device,
@@ -971,10 +972,9 @@ xf86XInputSetScreen(LocalDevicePtr	local
 		    int			x,
 		    int			y)
 {
-    if (local->dev->coreEvents &&
-	(miPointerGetScreen(inputInfo.pointer) !=
-          screenInfo.screens[screen_number])) {
-	miPointerSetScreen(inputInfo.pointer, screen_number, x, y);
+    if (miPointerGetScreen(local->dev) !=
+          screenInfo.screens[screen_number]) {
+	miPointerSetScreen(local->dev, screen_number, x, y);
     }
 }
 
@@ -983,20 +983,11 @@ _X_EXPORT void
 xf86InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval, int maxval,
 			   int resolution, int min_res, int max_res)
 {
-#ifdef XINPUT
     if (!dev || !dev->valuator)
         return;
 
-    if (maxval == -1) {
-	if (axnum == 0)
-	    maxval = screenInfo.screens[0]->width - 1;
-	else if (axnum == 1)
-	    maxval = screenInfo.screens[0]->height - 1;
-	/* else? */
-    }
     InitValuatorAxisStruct(dev, axnum, minval, maxval, resolution, min_res,
 			   max_res);
-#endif
 }
 
 /*
@@ -1006,7 +997,6 @@ xf86InitValuatorAxisStruct(DeviceIntPtr 
 _X_EXPORT void
 xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum)
 {
-#ifdef XINPUT
     if (axnum == 0) {
 	dev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
         dev->valuator->lastx = dev->valuator->axisVal[0];
@@ -1015,7 +1005,6 @@ xf86InitValuatorDefaults(DeviceIntPtr de
 	dev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
         dev->valuator->lasty = dev->valuator->axisVal[1];
     }
-#endif
 }
 
 /* end of xf86Xinput.c */
diff-tree 1546a398144619a14ff06aaf84ebc1bf293eac66 (from b05a11478edc7e6d1e38ef7f8d6788c7bd917493)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 21:40:53 2006 +0300

    GetKeyboardValuatorEvents: also take first_valuator param
    Take a first_valuator parameter, which specifies the first valuator.

diff --git a/dix/events.c b/dix/events.c
index e6d6c77..91aa673 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4639,9 +4639,10 @@ GetKeyboardEvents(xEvent *events, Device
  * KeyPresses.
  */
 int GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type,
-                              int key_code, int num_valuators,
-                              int *valuators) {
-    int numEvents = 0, ms = 0, first_valuator = 0;
+                              int key_code, int first_valuator,
+                              int num_valuators, int *valuators) {
+    int numEvents = 0, ms = 0, i = 0;
+    int final_valuator = first_valuator + num_valuators;
     KeySym sym = pDev->key->curKeySyms.map[key_code *
                                            pDev->key->curKeySyms.mapWidth];
     deviceKeyButtonPointer *kbp = NULL;
@@ -4721,27 +4722,26 @@ int GetKeyboardValuatorEvents(xEvent *ev
 
     if (num_valuators) {
         kbp->deviceid |= MORE_EVENTS;
-        while (first_valuator < num_valuators) {
+        for (i = first_valuator; i < final_valuator; i += 6) {
             xv = (deviceValuator *) ++events;
             xv->type = DeviceValuator;
-            xv->first_valuator = first_valuator;
+            xv->first_valuator = i;
             xv->num_valuators = num_valuators;
             xv->deviceid = kbp->deviceid;
             switch (num_valuators - first_valuator) {
             case 6:
-                xv->valuator5 = valuators[first_valuator+5];
+                xv->valuator5 = valuators[i+5];
             case 5:
-                xv->valuator4 = valuators[first_valuator+4];
+                xv->valuator4 = valuators[i+4];
             case 4:
-                xv->valuator3 = valuators[first_valuator+3];
+                xv->valuator3 = valuators[i+3];
             case 3:
-                xv->valuator2 = valuators[first_valuator+2];
+                xv->valuator2 = valuators[i+2];
             case 2:
-                xv->valuator1 = valuators[first_valuator+1];
+                xv->valuator1 = valuators[i+1];
             case 1:
-                xv->valuator0 = valuators[first_valuator];
+                xv->valuator0 = valuators[i];
             }
-            first_valuator += 6;
         }
     }
 
diff --git a/include/input.h b/include/input.h
index 72f67c2..3e3d16d 100644
--- a/include/input.h
+++ b/include/input.h
@@ -402,7 +402,8 @@ extern int GetKeyboardValuatorEvents(
     DeviceIntPtr pDev,
     int type,
     int key_code,
-    int num_axes,
+    int first_valuator,
+    int num_valuator,
     int *valuators);
 
 extern DeviceIntPtr LookupDeviceIntRec(
diff-tree b05a11478edc7e6d1e38ef7f8d6788c7bd917493 (from 41bb9fce47f6366cc3f7d45790f7883f74289b5a)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 21:23:12 2006 +0300

    doc/extensions: rename to c-extensions
    The old name could be somewhat confusing.

diff --git a/doc/c-extensions b/doc/c-extensions
new file mode 100644
index 0000000..db2ba7d
--- /dev/null
+++ b/doc/c-extensions
@@ -0,0 +1,32 @@
+Use of extensions throughout the X server tree
+----------------------------------------------
+
+Optional extensions:
+The server will still build if your toolchain does not support these
+extensions, although the results may not be optimal.
+
+    * _X_SENTINEL(x): member x of the passed structure must be NULL, e.g.:
+                      void parseOptions(Option *options _X_SENTINEL(0));
+                      parseOptions("foo", "bar", NULL); /* this is OK */
+                      parseOptions("foo", "bar", "baz"); /* this is not */
+                      This definition comes from Xfuncproto.h in the core
+                      protocol headers.
+    * _X_ATTRIBUTE_PRINTF(x, y): This function has printf-like semantics;
+                                 check the format string when built with
+                                 -Wformat (gcc) or similar.
+    * _X_EXPORT: this function should appear in symbol tables.
+    * _X_HIDDEN: this function should not appear in the _dynamic_ symbol
+                 table.
+    * _X_INTERNAL: like _X_HIDDEN, but attempt to ensure that this function
+                   is never called from another module.
+    * _X_INLINE: inline this functon if possible (generally obeyed unless
+                 disabling optimisations).
+    * _X_DEPRECATED: warn on use of this function.
+
+Mandatory extensions:
+The server will not build if your toolchain does not support these extensions.
+
+    * named initialisers: explicitly initialising structure members, e.g.:
+                          struct foo bar = { .baz = quux, .brian = "dog" };
+    * variadic macros: macros with a variable number of arguments, e.g.:
+                       #define DebugF(x, ...) /**/
diff --git a/doc/extensions b/doc/extensions
deleted file mode 100644
index db2ba7d..0000000
--- a/doc/extensions
+++ /dev/null
@@ -1,32 +0,0 @@
-Use of extensions throughout the X server tree
-----------------------------------------------
-
-Optional extensions:
-The server will still build if your toolchain does not support these
-extensions, although the results may not be optimal.
-
-    * _X_SENTINEL(x): member x of the passed structure must be NULL, e.g.:
-                      void parseOptions(Option *options _X_SENTINEL(0));
-                      parseOptions("foo", "bar", NULL); /* this is OK */
-                      parseOptions("foo", "bar", "baz"); /* this is not */
-                      This definition comes from Xfuncproto.h in the core
-                      protocol headers.
-    * _X_ATTRIBUTE_PRINTF(x, y): This function has printf-like semantics;
-                                 check the format string when built with
-                                 -Wformat (gcc) or similar.
-    * _X_EXPORT: this function should appear in symbol tables.
-    * _X_HIDDEN: this function should not appear in the _dynamic_ symbol
-                 table.
-    * _X_INTERNAL: like _X_HIDDEN, but attempt to ensure that this function
-                   is never called from another module.
-    * _X_INLINE: inline this functon if possible (generally obeyed unless
-                 disabling optimisations).
-    * _X_DEPRECATED: warn on use of this function.
-
-Mandatory extensions:
-The server will not build if your toolchain does not support these extensions.
-
-    * named initialisers: explicitly initialising structure members, e.g.:
-                          struct foo bar = { .baz = quux, .brian = "dog" };
-    * variadic macros: macros with a variable number of arguments, e.g.:
-                       #define DebugF(x, ...) /**/
diff-tree 41bb9fce47f6366cc3f7d45790f7883f74289b5a (from be8dfafd1d58b27bbfd953fc1216311523353db1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 20:34:32 2006 +0300

    mipointer: take device arguments, split miPointerAbsoluteCursor
    Update mipointer API to take a device argument to (almost) all functions,
    and split miPointerAbsoluteCursor into a couple of separate functions.
    Remove miPointerAbsoluteCursor call from mieq, as we now deal with it in
    GetPointerEvents.
    Make miPointerSetPosition (successor of miPointerAbsoluteCursor) take
    pointers to x and y, so it can return the clipped values.
    Modify callers of miPointer*() functions to generally use the new
    functions.
    This should fix things with multi-head setups.

diff --git a/dix/events.c b/dix/events.c
index f81de5f..e6d6c77 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -131,6 +131,8 @@ of the copyright holder.
 #endif
 #include "globals.h"
 
+#include "mipointer.h"
+
 #ifdef XKB
 #include <X11/extensions/XKBproto.h>
 #include <X11/extensions/XKBsrv.h>
@@ -4874,6 +4876,7 @@ GetPointerEvents(xEvent *events, DeviceI
     AxisInfoPtr axes = NULL;
     Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
     DeviceIntPtr cp = inputInfo.pointer;
+    int x = 0, y = 0;
 
     if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
         return 0;
@@ -4910,23 +4913,23 @@ GetPointerEvents(xEvent *events, DeviceI
 
     if (flags & POINTER_ABSOLUTE) {
         if (num_valuators >= 1 && first_valuator == 0) {
-            kbp->root_x = valuators[0];
+            x = valuators[0];
         }
         else {
             if (pDev->coreEvents)
-                kbp->root_x = cp->valuator->lastx;
+                x = cp->valuator->lastx;
             else
-                kbp->root_x = pDev->valuator->lastx;
+                x = pDev->valuator->lastx;
         }
 
         if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
-            kbp->root_y = valuators[1 - first_valuator];
+            y = valuators[1 - first_valuator];
         }
         else {
             if (pDev->coreEvents)
-                kbp->root_x = cp->valuator->lasty;
+                x = cp->valuator->lasty;
             else
-                kbp->root_y = pDev->valuator->lasty;
+                y = pDev->valuator->lasty;
         }
     }
     else {
@@ -4936,49 +4939,52 @@ GetPointerEvents(xEvent *events, DeviceI
 
         if (pDev->coreEvents) {
             if (first_valuator == 0 && num_valuators >= 1)
-                kbp->root_x = cp->valuator->lastx + valuators[0];
+                x = cp->valuator->lastx + valuators[0];
             else
-                kbp->root_x = cp->valuator->lastx;
+                x = cp->valuator->lastx;
 
             if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
-                kbp->root_y = cp->valuator->lasty +
-                              valuators[1 - first_valuator];
+                y = cp->valuator->lasty + valuators[1 - first_valuator];
             else
-                kbp->root_y = cp->valuator->lasty;
+                y = cp->valuator->lasty;
         }
         else {
             if (first_valuator == 0 && num_valuators >= 1)
-                kbp->root_x = pDev->valuator->lastx + valuators[0];
+                x = pDev->valuator->lastx + valuators[0];
             else
-                kbp->root_x = pDev->valuator->lastx;
+                x = pDev->valuator->lastx;
 
             if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
-                kbp->root_y = pDev->valuator->lasty +
-                              valuators[1 - first_valuator];
+                y = pDev->valuator->lasty + valuators[1 - first_valuator];
             else
-                kbp->root_y = pDev->valuator->lasty;
+                y = pDev->valuator->lasty;
         }
     }
 
-    /* FIXME: need mipointer-like semantics to move on to different screens. */
+
     axes = pDev->valuator->axes;
-    if (kbp->root_x < axes->min_value)
-        kbp->root_x = axes->min_value;
-    if (axes->max_value > 0 && kbp->root_x > axes->max_value)
-        kbp->root_x = axes->max_value;
+    if (x < axes->min_value)
+        x = axes->min_value;
+    if (axes->max_value > 0 && x > axes->max_value)
+        x = axes->max_value;
 
     axes++;
-    if (kbp->root_y < axes->min_value)
-        kbp->root_y = axes->min_value;
-    if (axes->max_value > 0 && kbp->root_y > axes->max_value)
-        kbp->root_y = axes->max_value;
+    if (y < axes->min_value)
+        y = axes->min_value;
+    if (axes->max_value > 0 && y > axes->max_value)
+        y = axes->max_value;
+
+    /* This takes care of crossing screens for us, as well as clipping
+     * to the current screen.  Right now, we only have one history buffer,
+     * so we don't set this for both the device and core.*/
+    miPointerSetPosition(pDev, &x, &y, ms);
 
     if (pDev->coreEvents) {
-        cp->valuator->lastx = kbp->root_x;
-        cp->valuator->lasty = kbp->root_y;
+        cp->valuator->lastx = x;
+        cp->valuator->lasty = y;
     }
-    pDev->valuator->lastx = kbp->root_x;
-    pDev->valuator->lasty = kbp->root_y;
+    pDev->valuator->lastx = x;
+    pDev->valuator->lasty = y;
 
     if (type == MotionNotify) {
         kbp->type = DeviceMotionNotify;
@@ -4991,6 +4997,9 @@ GetPointerEvents(xEvent *events, DeviceI
         kbp->detail = pDev->button->map[buttons];
     }
 
+    kbp->root_x = x;
+    kbp->root_y = y;
+
     if (final_valuator > 2 && sendValuators) {
         kbp->deviceid |= MORE_EVENTS;
         for (i = first_valuator; i < final_valuator; i += 6) {
@@ -5028,10 +5037,8 @@ GetPointerEvents(xEvent *events, DeviceI
         events++;
         events->u.u.type = type;
         events->u.keyButtonPointer.time = ms;
-        events->u.keyButtonPointer.rootX = kbp->root_x;
-        events->u.keyButtonPointer.rootY = kbp->root_y;
-        cp->valuator->lastx = kbp->root_x;
-        cp->valuator->lasty = kbp->root_y;
+        events->u.keyButtonPointer.rootX = x;
+        events->u.keyButtonPointer.rootY = y;
 
         if (type == ButtonPress || type == ButtonRelease) {
             /* We hijack SetPointerMapping to work on all core-sending
diff --git a/hw/xfree86/common/xf86Cursor.c b/hw/xfree86/common/xf86Cursor.c
index c7b9710..ee42b75 100644
--- a/hw/xfree86/common/xf86Cursor.c
+++ b/hw/xfree86/common/xf86Cursor.c
@@ -223,9 +223,9 @@ xf86SwitchMode(ScreenPtr pScreen, Displa
   if (mode->HDisplay > pScr->virtualX || mode->VDisplay > pScr->virtualY)
     return FALSE;
 
-  pCursorScreen = miPointerCurrentScreen();
+  pCursorScreen = miPointerGetScreen(inputInfo.pointer);
   if (pScreen == pCursorScreen)
-    miPointerPosition(&px, &py);
+    miPointerGetPosition(inputInfo.pointer, &px, &py);
 
   xf86EnterServerState(SETUP);
   Switched = (*pScr->SwitchMode)(pScr->scrnIndex, mode, 0);
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index ff3840c..db259b3 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -253,9 +253,9 @@ ProcessInputEvents ()
   xf86Info.inputPending = FALSE;
 
   mieqProcessInputEvents();
-  miPointerUpdate();
+  miPointerUpdateSprite(inputInfo.pointer);
 
-  miPointerPosition(&x, &y);
+  miPointerGetPosition(inputInfo.pointer, &x, &y);
   xf86SetViewport(xf86Info.currentScreen, x, y);
 }
 
@@ -793,7 +793,7 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
 {
     KeyClassPtr keyc = NULL;
     KeySym *map = NULL;
-    xEvent *events = NULL, ke;
+    xEvent ke;
     int i = 0, j = 0, nevents = 0;
 
     ErrorF("releasekeys: called on device %s (%d)\n", pDev->name, pDev->id);
@@ -818,7 +818,6 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
     for (i = keyc->curKeySyms.minKeyCode, map = keyc->curKeySyms.map;
          i < keyc->curKeySyms.maxKeyCode;
          i++, map += keyc->curKeySyms.mapWidth) {
-        ErrorF("key %d: pressed is %s\n", i, KeyPressed(i) ? "true" : "false");
         if (KeyPressed(i)) {
             switch (*map) {
             /* Don't release the lock keys */
@@ -838,10 +837,9 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
                     (*pDev->public.processInputProc) (&ke, pDev, 1);
                 }
                 else {
-                    nevents = GetKeyboardEvents(&events, pDev, KeyRelease, i);
-                    ErrorF("device %s: got %d events for %d key\n", pDev->name, nevents, i);
+                    nevents = GetKeyboardEvents(xf86Events, pDev, KeyRelease, i);
                     for (j = 0; j < nevents; j++)
-                        mieqEnqueue(events++);
+                        mieqEnqueue(xf86Events + i);
                 }
                 break;
             }
diff --git a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h
index cd6a4ab..9279dbd 100644
--- a/hw/xfree86/common/xf86Priv.h
+++ b/hw/xfree86/common/xf86Priv.h
@@ -203,6 +203,9 @@ void xf86UnlockServer(void);
 
 void xf86InitXkb(void);
 
+/* xf86Xinput.c */
+extern xEvent *xf86Events;
+
 #endif /* _NO_XF86_PROTOTYPES */
 
 
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index e5bff0c..ee32adc 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -88,27 +88,19 @@
 #include <X11/Xpoll.h>
 #include "xf86_OSproc.h"	/* sigio stuff */
 
+#include "mi.h"
+
 /******************************************************************************
  * debugging macro
  *****************************************************************************/
-#ifdef DBG
-#undef DBG
-#endif
 #ifdef DEBUG
-#undef DEBUG
-#endif
-
-#define DEBUG 0
-
-#if DEBUG
 static int      debug_level = 0;
-
 #define DBG(lvl, f) {if ((lvl) <= debug_level) f;}
 #else
 #define DBG(lvl, f)
 #endif
 
-static xEvent *xf86Events = NULL;
+xEvent *xf86Events = NULL;
 
 static Bool
 xf86SendDragEvents(DeviceIntPtr	device)
@@ -558,7 +550,6 @@ NewInputDeviceRequest (InputOption *opti
     InputInfoPtr pInfo = NULL;
     InputOption *option = NULL;
     DeviceIntPtr dev = NULL;
-    int i;
 
     idev = xcalloc(sizeof(*idev), 1);
     if (!idev)
@@ -981,8 +972,9 @@ xf86XInputSetScreen(LocalDevicePtr	local
 		    int			y)
 {
     if (local->dev->coreEvents &&
-	(miPointerCurrentScreen() != screenInfo.screens[screen_number])) {
-	miPointerSetNewScreen (screen_number, x, y);
+	(miPointerGetScreen(inputInfo.pointer) !=
+          screenInfo.screens[screen_number])) {
+	miPointerSetScreen(inputInfo.pointer, screen_number, x, y);
     }
 }
 
diff --git a/mi/mieq.c b/mi/mieq.c
index 856aa25..16e638c 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -104,9 +104,6 @@ mieqEnqueue (xEvent *e)
                                       &laste->event[0];
 
     if (e->u.u.type == MotionNotify) {
-        miPointerSetPosition(pDev, e->u.keyButtonPointer.rootX,
-                             e->u.keyButtonPointer.rootY,
-                             e->u.keyButtonPointer.time);
         pDev = inputInfo.pointer;
         isMotion = inputInfo.pointer->id & DEVICE_BITS;
     }
diff --git a/mi/mipointer.c b/mi/mipointer.c
index c9b80bf..7f850ad 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -320,13 +320,18 @@ miPointerUpdateSprite (DeviceIntPtr pDev
     CursorPtr		pCursor;
     int			x, y, devx, devy;
 
+    if (!pDev || !(pDev->coreEvents || pDev == inputInfo.pointer))
+        return;
+
     pScreen = miPointer.pScreen;
+    if (!pScreen)
+	return;
+
     x = miPointer.x;
     y = miPointer.y;
     devx = miPointer.devx;
     devy = miPointer.devy;
-    if (!pScreen)
-	return;
+
     pScreenPriv = GetScreenPrivate (pScreen);
     /*
      * if the cursor has switched screens, disable the sprite
@@ -385,13 +390,20 @@ miPointerUpdateSprite (DeviceIntPtr pDev
 void
 miPointerDeltaCursor (int dx, int dy, unsigned long time)
 {
-    miPointerSetPosition(inputInfo.pointer, miPointer.x + dx,
-                         miPointer.y + dy, time);
+    int x = miPointer.x + dx, y = miPointer.y + dy;
+
+    miPointerSetPosition(inputInfo.pointer, &x, &y, time);
 }
 
 void
 miPointerSetNewScreen(int screen_no, int x, int y)
 {
+    miPointerSetScreen(inputInfo.pointer, screen_no, x, y);
+}
+
+void
+miPointerSetScreen(DeviceIntPtr pDev, int screen_no, int x, int y)
+{
 	miPointerScreenPtr pScreenPriv;
 	ScreenPtr pScreen;
 
@@ -406,21 +418,26 @@ miPointerSetNewScreen(int screen_no, int
 _X_EXPORT ScreenPtr
 miPointerCurrentScreen ()
 {
-	return (miPointer.pScreen);
+    return miPointerGetScreen(inputInfo.pointer);
 }
 
-/*
- * miPointerAbsoluteCursor.  The pointer has moved to x,y
- */
+_X_EXPORT ScreenPtr
+miPointerGetScreen(DeviceIntPtr pDev)
+{
+    return miPointer.pScreen;
+}
 
+/* Move the pointer to x, y on the current screen, update the sprite, and
+ * the motion history.  Generates no events.  Does not return changed x
+ * and y if they are clipped; use miPointerSetPosition instead. */
 _X_EXPORT void
 miPointerAbsoluteCursor (int x, int y, unsigned long time)
 {
-    miPointerSetPosition(inputInfo.pointer, x, y, time);
+    miPointerSetPosition(inputInfo.pointer, &x, &y, time);
 }
 
 _X_EXPORT void
-miPointerSetPosition(DeviceIntPtr pDev, int x, int y, unsigned long time)
+miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time)
 {
     miPointerScreenPtr	pScreenPriv;
     ScreenPtr		pScreen;
@@ -430,13 +447,16 @@ miPointerSetPosition(DeviceIntPtr pDev, 
     if (!pScreen)
 	return;	    /* called before ready */
 
-    if (x < 0 || x >= pScreen->width || y < 0 || y >= pScreen->height)
+    if (!pDev || !(pDev->coreEvents || pDev == inputInfo.pointer))
+        return;
+
+    if (*x < 0 || *x >= pScreen->width || *y < 0 || *y >= pScreen->height)
     {
 	pScreenPriv = GetScreenPrivate (pScreen);
 	if (!miPointer.confined)
 	{
 	    newScreen = pScreen;
-	    (*pScreenPriv->screenFuncs->CursorOffScreen) (&newScreen, &x, &y);
+	    (*pScreenPriv->screenFuncs->CursorOffScreen) (&newScreen, x, y);
 	    if (newScreen != pScreen)
 	    {
 		pScreen = newScreen;
@@ -448,21 +468,20 @@ miPointerSetPosition(DeviceIntPtr pDev, 
 	    }
 	}
     }
-    /*
-     * constrain the hot-spot to the current
-     * limits
-     */
-    if (x < miPointer.limits.x1)
-	x = miPointer.limits.x1;
-    if (x >= miPointer.limits.x2)
-	x = miPointer.limits.x2 - 1;
-    if (y < miPointer.limits.y1)
-	y = miPointer.limits.y1;
-    if (y >= miPointer.limits.y2)
-	y = miPointer.limits.y2 - 1;
-    if (miPointer.x == x && miPointer.y == y && miPointer.pScreen == pScreen)
+    /* Constrain the sprite to the current limits. */
+    if (*x < miPointer.limits.x1)
+	*x = miPointer.limits.x1;
+    if (*x >= miPointer.limits.x2)
+	*x = miPointer.limits.x2 - 1;
+    if (*y < miPointer.limits.y1)
+	*y = miPointer.limits.y1;
+    if (*y >= miPointer.limits.y2)
+	*y = miPointer.limits.y2 - 1;
+
+    if (miPointer.x == *x && miPointer.y == *y && miPointer.pScreen == pScreen)
 	return;
-    miPointerMove (pScreen, x, y, time);
+
+    miPointerMoved(pDev, pScreen, *x, *y, time);
 }
 
 _X_EXPORT void
@@ -478,27 +497,39 @@ miPointerGetPosition(DeviceIntPtr pDev, 
     *y = miPointer.y;
 }
 
-/*
- * miPointerMove.  The pointer has moved to x,y on current screen
- */
+void
+miPointerMove (ScreenPtr pScreen, int x, int y, unsigned long time)
+{
+    miPointerMoved(inputInfo.pointer, pScreen, x, y, time);
+}
 
-static void
-miPointerMove (pScreen, x, y, time)
-    ScreenPtr	    pScreen;
-    int		    x, y;
-    unsigned long   time;
+/* Move the pointer on the current screen,  and update the sprite. */
+void
+miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
+                     unsigned long time)
 {
     SetupScreen(pScreen);
-    miHistoryPtr	history;
-    int			prev, end, start;
 
-    if (!pScreenPriv->waitForUpdate && pScreen == miPointer.pSpriteScreen)
+    if (pDev && (pDev->coreEvents || pDev == inputInfo.pointer) &&
+        !pScreenPriv->waitForUpdate && pScreen == miPointer.pSpriteScreen)
     {
 	miPointer.devx = x;
 	miPointer.devy = y;
 	if(!miPointer.pCursor->bits->emptyMask)
 	    (*pScreenPriv->spriteFuncs->MoveCursor) (pScreen, x, y);
     }
+
+    miPointerUpdateHistory(pDev, pScreen, x, y, time);
+}
+
+/* The pointer has moved to x, y; update the motion history. */
+void
+miPointerUpdateHistory (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
+                        unsigned long time)
+{
+    miHistoryPtr	history;
+    int			prev, end, start;
+
     miPointer.x = x;
     miPointer.y = y;
     miPointer.pScreen = pScreen;
diff --git a/mi/mipointer.h b/mi/mipointer.h
index a910de6..82ff045 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -149,22 +149,45 @@ extern ScreenPtr miPointerCurrentScreen(
 extern ScreenPtr miPointerGetScreen(
     DeviceIntPtr pDev);
 extern void miPointerSetScreen(
-    DeviceIntPtr pDev);
+    DeviceIntPtr pDev,
+    int screen_num,
+    int x,
+    int y);
 
+/* Returns the current cursor position. */
 extern void miPointerGetPosition(
     DeviceIntPtr pDev,
     int *x,
     int *y);
 
+/* Moves the cursor to the specified position.  May clip the co-ordinates:
+ * x and y are modified in-place. */
 extern void miPointerSetPosition(
     DeviceIntPtr pDev,
-    int x,
-    int y,
+    int *x,
+    int *y,
     unsigned long time);
 
 extern void miPointerUpdateSprite(
     DeviceIntPtr pDev);
 
+/* Moves the sprite to x, y on the current screen, and updates the event
+ * history. */
+extern void miPointerMoved(
+    DeviceIntPtr pDev,
+    ScreenPtr pScreen,
+    int x,
+    int y,
+    unsigned long time);
+
+/* Updates the event history. */
+extern void miPointerUpdateHistory(
+    DeviceIntPtr pDev,
+    ScreenPtr pScreen,
+    int x,
+    int y,
+    unsigned long time);
+
 extern int miPointerScreenIndex;
 
 #endif /* MIPOINTER_H */
diff-tree be8dfafd1d58b27bbfd953fc1216311523353db1 (from ca474e0920dd29ebe7ccf346cddc526732ad01ba)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 20:32:16 2006 +0300

    warning cleanups
    Fix still more warnings.

diff --git a/dix/devices.c b/dix/devices.c
index 54332e7..2149769 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -77,10 +77,9 @@ SOFTWARE.
 #include "swaprep.h"
 #include "dixevents.h"
 
-#ifdef XINPUT
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
-#endif
+#include "exevents.h"
 
 int CoreDevicePrivatesIndex = 0, CoreDevicePrivatesGeneration = -1;
 
@@ -179,10 +178,8 @@ int
 ActivateDevice(DeviceIntPtr dev)
 {
     int ret = Success;
-#ifdef XINPUT
     devicePresenceNotify ev;
     DeviceIntRec dummyDev;
-#endif
 
     if (!dev || !dev->deviceProc)
         return BadImplementation;
@@ -190,13 +187,11 @@ ActivateDevice(DeviceIntPtr dev)
     ret = (*dev->deviceProc) (dev, DEVICE_INIT);
     dev->inited = (ret == Success);
     
-#ifdef XINPUT
     ev.type = DevicePresenceNotify;
     ev.time = currentTime.milliseconds;
     dummyDev.id = 0;
     SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
-                          &ev, 1);
-#endif
+                          (xEvent *) &ev, 1);
 
     return ret;
 }
@@ -509,10 +504,8 @@ RemoveDevice(DeviceIntPtr dev)
 {
     DeviceIntPtr prev,tmp,next;
     int ret = BadMatch;
-#ifdef XINPUT
     devicePresenceNotify ev;
     DeviceIntRec dummyDev;
-#endif
 
     DebugF("(dix) removing device %d\n", dev->id);
 
@@ -549,15 +542,13 @@ RemoveDevice(DeviceIntPtr dev)
 	}
     }
     
-#ifdef XINPUT
     if (ret == Success) {
         ev.type = DevicePresenceNotify;
         ev.time = currentTime.milliseconds;
         dummyDev.id = 0;
         SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
-                              &ev, 1);
+                              (xEvent *) &ev, 1);
     }
-#endif
 
     return ret;
 }
@@ -1128,9 +1119,7 @@ static int
 DoSetModifierMapping(ClientPtr client, KeyCode *inputMap,
                      int numKeyPerModifier)
 {
-    KeyClassPtr keyc = NULL;
     DeviceIntPtr pDev = NULL;
-    KeyCode *map = NULL;
     int i = 0, inputMapLen = numKeyPerModifier * 8;
 
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
@@ -1200,8 +1189,6 @@ ProcSetModifierMapping(ClientPtr client)
 {
     xSetModifierMappingReply rep;
     REQUEST(xSetModifierMappingReq);
-    register int i;
-    DeviceIntPtr keybd = inputInfo.keyboard;
     
     REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq);
 
@@ -1332,7 +1319,6 @@ ProcSetPointerMapping(ClientPtr client)
     BYTE *map;
     int ret;
     xSetPointerMappingReply rep;
-    unsigned int i;
 
     REQUEST_AT_LEAST_SIZE(xSetPointerMappingReq);
     if (client->req_len != (sizeof(xSetPointerMappingReq)+stuff->nElts+3) >> 2)
@@ -1448,7 +1434,6 @@ DoChangeKeyboardControl (ClientPtr clien
     int key = DO_ALL;
     BITS32 index2;
     int mask = vmask, i;
-    DeviceIntPtr dev = NULL;
 
     ctrl = keybd->kbdfeed->ctrl;
     while (vmask) {
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 7ef411c..cb77839 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -47,6 +47,8 @@
 #endif
 #include "xf86Xinput.h"
 
+#include "mi.h"
+
 static unsigned long DGAGeneration = 0;
 static int DGAScreenIndex = -1;
 
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index ff1c904..a49bd54 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -981,7 +981,6 @@ InitInput(argc, argv)
     IDevPtr pDev;
     InputDriverPtr pDrv;
     InputInfoPtr pInfo;
-    static InputInfoPtr coreKeyboard = NULL, corePointer = NULL;
 
     xf86Info.vtRequestsPending = FALSE;
     xf86Info.inputPending = FALSE;
diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h
index 4658f23..444b2d4 100644
--- a/hw/xfree86/common/xf86Xinput.h
+++ b/hw/xfree86/common/xf86Xinput.h
@@ -86,11 +86,6 @@
 #define XI_PRIVATE(dev) \
 	(((LocalDevicePtr)((dev)->public.devicePrivate))->private)
 
-#ifdef DBG
-#undef DBG
-#endif
-#define DBG(lvl, f) {if ((lvl) <= xf86GetVerbosity()) f;}
-
 #ifdef HAS_MOTION_HISTORY
 #undef HAS_MOTION_HISTORY
 #endif
diff-tree ca474e0920dd29ebe7ccf346cddc526732ad01ba (from c2fab469b66f2796c541e911202faa411d116b04)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 20:30:49 2006 +0300

    Xi: move SendEventToAllWindows and FindInterestedChildren to exevents
    Move SendEventToAllWindows and FindInterestedChildren from chgptr to exevents,
    so the DIX can more easily use it.
    Clean up two warnings (type mismatch, unused variable) in exevents.c.

diff --git a/Xi/chgptr.c b/Xi/chgptr.c
index f6f4b8b..b799092 100644
--- a/Xi/chgptr.c
+++ b/Xi/chgptr.c
@@ -180,47 +180,6 @@ DeleteFocusClassDeviceStruct(DeviceIntPt
 
 /***********************************************************************
  *
- * Send an event to interested clients in all windows on all screens.
- *
- */
-
-void
-SendEventToAllWindows(DeviceIntPtr dev, Mask mask, xEvent * ev, int count)
-{
-    int i;
-    WindowPtr pWin, p1;
-
-    for (i = 0; i < screenInfo.numScreens; i++) {
-	pWin = WindowTable[i];
-	(void)DeliverEventsToWindow(pWin, ev, count, mask, NullGrab, dev->id);
-	p1 = pWin->firstChild;
-	FindInterestedChildren(dev, p1, mask, ev, count);
-    }
-}
-
-/***********************************************************************
- *
- * Walk through the window tree, finding all clients that want to know
- * about the ChangeDeviceNotify Event.
- *
- */
-
-void
-FindInterestedChildren(DeviceIntPtr dev, WindowPtr p1, Mask mask,
-		       xEvent * ev, int count)
-{
-    WindowPtr p2;
-
-    while (p1) {
-	p2 = p1->firstChild;
-	(void)DeliverEventsToWindow(p1, ev, count, mask, NullGrab, dev->id);
-	FindInterestedChildren(dev, p2, mask, ev, count);
-	p1 = p1->nextSib;
-    }
-}
-
-/***********************************************************************
- *
  * This procedure writes the reply for the XChangePointerDevice 
  * function, if the client and server have a different byte ordering.
  *
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 9fdea6d..92a5f05 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -71,8 +71,7 @@ SOFTWARE.
 #include "exglobals.h"
 #include "dixevents.h"	/* DeliverFocusedEvent */
 #include "dixgrabs.h"	/* CreateGrab() */
-
-#include "chgptr.h"
+#include "scrnintstr.h"
 
 #define WID(w) ((w) ? ((w)->drawable.id) : 0)
 #define AllModifiersMask ( \
@@ -305,7 +304,7 @@ InitValuatorAxisStruct(DeviceIntPtr dev,
     register AxisInfoPtr ax;
    
     if (!dev || !dev->valuator)
-        return NULL;
+        return;
 
     ax = dev->valuator->axes + axnum;
 
@@ -903,7 +902,7 @@ SetModifierMapping(ClientPtr client, Dev
 	return MappingBusy;
     } else {
 	for (i = 0; i < inputMapLen; i++) {
-	    if (inputMap[i] && !LegalModifier(inputMap[i], (DevicePtr) dev)) {
+	    if (inputMap[i] && !LegalModifier(inputMap[i], dev)) {
 		return MappingFailed;
 	    }
 	}
@@ -1214,3 +1213,44 @@ ShouldFreeInputMasks(WindowPtr pWin, Boo
     else
 	return FALSE;
 }
+
+/***********************************************************************
+ *
+ * Walk through the window tree, finding all clients that want to know
+ * about the Event.
+ *
+ */
+
+void
+FindInterestedChildren(DeviceIntPtr dev, WindowPtr p1, Mask mask,
+                       xEvent * ev, int count)
+{
+    WindowPtr p2;
+
+    while (p1) {
+        p2 = p1->firstChild;
+        (void)DeliverEventsToWindow(p1, ev, count, mask, NullGrab, dev->id);
+        FindInterestedChildren(dev, p2, mask, ev, count);
+        p1 = p1->nextSib;
+    }
+}
+
+/***********************************************************************
+ *
+ * Send an event to interested clients in all windows on all screens.
+ *
+ */
+
+void
+SendEventToAllWindows(DeviceIntPtr dev, Mask mask, xEvent * ev, int count)
+{
+    int i;
+    WindowPtr pWin, p1;
+
+    for (i = 0; i < screenInfo.numScreens; i++) {
+        pWin = WindowTable[i];
+        (void)DeliverEventsToWindow(pWin, ev, count, mask, NullGrab, dev->id);
+        p1 = pWin->firstChild;
+        FindInterestedChildren(dev, p1, mask, ev, count);
+    }
+}
diff --git a/include/exevents.h b/include/exevents.h
index 1169a6c..7fbaddb 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -179,4 +179,17 @@ extern int DeviceEventSuppressForWindow(
 	Mask                   /* mask */,
 	int                    /* maskndx */);
 
+void FindInterestedChildren(
+        DeviceIntPtr           /* dev */,
+        WindowPtr              /* p1 */,
+        Mask                   /* mask */,
+        xEvent *               /* ev */,
+        int                    /* count */);
+
+void SendEventToAllWindows(
+        DeviceIntPtr           /* dev */,
+        Mask                   /* mask */,
+        xEvent *               /* ev */,
+        int                    /* count */);
+
 #endif /* EXEVENTS_H */
diff-tree c2fab469b66f2796c541e911202faa411d116b04 (from 4493acb88c59721f7807093a3ed3c39396c2076d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 18:26:26 2006 +0300

    dix/devices: clean up debugging

diff --git a/dix/devices.c b/dix/devices.c
index 74474c9..54332e7 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -149,9 +149,6 @@ EnableDevice(register DeviceIntPtr dev)
     if ((*prev != dev) || !dev->inited ||
 	((ret = (*dev->deviceProc)(dev, DEVICE_ON)) != Success)) {
         ErrorF("couldn't enable device %d\n", dev->id);
-#ifdef DEBUG
-        ErrorF("prev is %p, dev is %p, dev->inited is %d, ret is %d\n", prev, dev, dev->inited, ret);
-#endif
 	return FALSE;
     }
     *prev = dev->next;
@@ -365,25 +362,15 @@ InitAndStartDevices()
     register DeviceIntPtr dev, next;
 
     for (dev = inputInfo.off_devices; dev; dev = dev->next) {
-#ifdef DEBUG
-        ErrorF("(dix) initialising device %d\n", dev->id);
-#endif
+        DebugF("(dix) initialising device %d\n", dev->id);
 	ActivateDevice(dev);
-#ifdef DEBUG
-        ErrorF("(dix) finished device %d, inited is %d\n", dev->id, dev->inited);
-#endif
     }
     for (dev = inputInfo.off_devices; dev; dev = next)
     {
-#ifdef DEBUG
-        ErrorF("(dix) enabling device %d\n", dev->id);
-#endif
+        DebugF("(dix) enabling device %d\n", dev->id);
 	next = dev->next;
 	if (dev->inited && dev->startup)
 	    (void)EnableDevice(dev);
-#ifdef DEBUG
-        ErrorF("(dix) finished device %d\n", dev->id);
-#endif
     }
     for (dev = inputInfo.devices;
 	 dev && (dev != inputInfo.keyboard);
@@ -527,9 +514,7 @@ RemoveDevice(DeviceIntPtr dev)
     DeviceIntRec dummyDev;
 #endif
 
-#ifdef DEBUG
-    ErrorF("want to remove device %p, kb is %p, pointer is %p\n", dev, inputInfo.keyboard, inputInfo.pointer);
-#endif
+    DebugF("(dix) removing device %d\n", dev->id);
 
     if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
         return BadImplementation;
diff-tree 4493acb88c59721f7807093a3ed3c39396c2076d (from ef68273f5bdb27a492ec0b69548ec4fbede46c08)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 17:51:03 2006 +0300

    xkb: add FIXMEs to procedures which need to act on all core devices
    Add FIXME comments above request handlers which need to act on all core-sending
    devices if called on the core keyboard.

diff --git a/xkb/xkb.c b/xkb/xkb.c
index 4655d8a..880f113 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -347,6 +347,7 @@ ProcXkbSelectEvents(ClientPtr client)
 
 /***====================================================================***/
 
+/* FIXME: Needs to ding on all core-sending devices. */
 int
 ProcXkbBell(ClientPtr client)
 {
@@ -894,6 +895,7 @@ ProcXkbSetControls(ClientPtr client)
     return client->noClientException;
 }
 
+/* FIXME: Needs to set rate on all core-sending devices. */
 int
 XkbSetRepeatRate(DeviceIntPtr dev,int timeout,int interval,int major,int minor)
 {
@@ -2325,6 +2327,7 @@ XkbServerMapPtr		srv = xkbi->desc->serve
     return (char *)wire;
 }
 
+/* FIXME: Needs to set map on all core-sending devices. */
 int
 ProcXkbSetMap(ClientPtr client)
 {
@@ -2641,6 +2644,7 @@ ProcXkbGetCompatMap(ClientPtr client)
     return XkbSendCompatMap(client,compat,&rep);
 }
 
+/* FIXME: Needs to set compat map on all core-sending devices. */
 int
 ProcXkbSetCompatMap(ClientPtr client)
 {
@@ -2918,6 +2922,7 @@ XkbIndicatorPtr		leds;
     return XkbSendIndicatorMap(client,leds,&rep);
 }
 
+/* FIXME: Needs to set indicator map on all core-sending devices. */
 int
 ProcXkbSetIndicatorMap(ClientPtr client)
 {
@@ -3081,6 +3086,7 @@ ProcXkbGetNamedIndicator(ClientPtr clien
     return client->noClientException;
 }
 
+/* FIXME: Needs to set indicator on all core-sending devices. */
 int
 ProcXkbSetNamedIndicator(ClientPtr client)
 {
@@ -3569,6 +3575,7 @@ char *	str;
     return True;
 }
 
+/* FIXME: Needs to set names on all core-sending devices. */
 int
 ProcXkbSetNames(ClientPtr client)
 {
@@ -4866,6 +4873,7 @@ char *		wire;
     return Success;
 }
 
+/* FIXME: Needs to set geom on all core-sending devices. */
 int
 ProcXkbSetGeometry(ClientPtr client)
 {
@@ -6017,6 +6025,7 @@ DeviceIntPtr			kbd;
     return (char *)ledWire;
 }
 
+/* FIXME: Needs to set info on all core-sending devices. */
 int
 ProcXkbSetDeviceInfo(ClientPtr client)
 {
diff-tree ef68273f5bdb27a492ec0b69548ec4fbede46c08 (from 6eab4c55890660089067da0e944256b1ed3a8c67)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 17:44:37 2006 +0300

    mi/mipointer: deprecate functions which don't take a device
    Deprecate all mi pointer functions which don't take a device argument, and
    replace them with versions which do, in preparation for MPX.

diff --git a/mi/mieq.c b/mi/mieq.c
index 63b900c..856aa25 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -104,9 +104,9 @@ mieqEnqueue (xEvent *e)
                                       &laste->event[0];
 
     if (e->u.u.type == MotionNotify) {
-        miPointerAbsoluteCursor(e->u.keyButtonPointer.rootX,
-                                e->u.keyButtonPointer.rootY,
-                                e->u.keyButtonPointer.time);
+        miPointerSetPosition(pDev, e->u.keyButtonPointer.rootX,
+                             e->u.keyButtonPointer.rootY,
+                             e->u.keyButtonPointer.time);
         pDev = inputInfo.pointer;
         isMotion = inputInfo.pointer->id & DEVICE_BITS;
     }
diff --git a/mi/mipointer.c b/mi/mipointer.c
index 206a3fc..c9b80bf 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -44,6 +44,7 @@ in this Software without prior written a
 # include   "mipointrst.h"
 # include   "cursorstr.h"
 # include   "dixstruct.h"
+# include   "inputstr.h"
 
 _X_EXPORT int miPointerScreenIndex;
 static unsigned long miPointerGeneration = 0;
@@ -178,7 +179,7 @@ miPointerDisplayCursor (pScreen, pCursor
 {
     miPointer.pCursor = pCursor;
     miPointer.pScreen = pScreen;
-    miPointerUpdate ();
+    miPointerUpdateSprite(inputInfo.pointer);
     return TRUE;
 }
 
@@ -225,7 +226,7 @@ miPointerSetCursorPosition(pScreen, x, y
     /* device dependent - must pend signal and call miPointerWarpCursor */
     (*pScreenPriv->screenFuncs->WarpCursor) (pScreen, x, y);
     if (!generateEvent)
-	miPointerUpdate();
+	miPointerUpdateSprite(inputInfo.pointer);
     return TRUE;
 }
 
@@ -308,6 +309,12 @@ miPointerGetMotionEvents (pPtr, coords, 
 void
 miPointerUpdate ()
 {
+    miPointerUpdateSprite(inputInfo.pointer);
+}
+
+void
+miPointerUpdateSprite (DeviceIntPtr pDev)
+{
     ScreenPtr		pScreen;
     miPointerScreenPtr	pScreenPriv;
     CursorPtr		pCursor;
@@ -376,11 +383,10 @@ miPointerUpdate ()
  */
 
 void
-miPointerDeltaCursor (dx, dy, time)
-    int		    dx, dy;
-    unsigned long   time;
+miPointerDeltaCursor (int dx, int dy, unsigned long time)
 {
-    miPointerAbsoluteCursor (miPointer.x + dx, miPointer.y + dy, time);
+    miPointerSetPosition(inputInfo.pointer, miPointer.x + dx,
+                         miPointer.y + dy, time);
 }
 
 void
@@ -408,9 +414,13 @@ miPointerCurrentScreen ()
  */
 
 _X_EXPORT void
-miPointerAbsoluteCursor (x, y, time)
-    int		    x, y;
-    unsigned long   time;
+miPointerAbsoluteCursor (int x, int y, unsigned long time)
+{
+    miPointerSetPosition(inputInfo.pointer, x, y, time);
+}
+
+_X_EXPORT void
+miPointerSetPosition(DeviceIntPtr pDev, int x, int y, unsigned long time)
 {
     miPointerScreenPtr	pScreenPriv;
     ScreenPtr		pScreen;
@@ -419,6 +429,7 @@ miPointerAbsoluteCursor (x, y, time)
     pScreen = miPointer.pScreen;
     if (!pScreen)
 	return;	    /* called before ready */
+
     if (x < 0 || x >= pScreen->width || y < 0 || y >= pScreen->height)
     {
 	pScreenPriv = GetScreenPrivate (pScreen);
@@ -455,8 +466,13 @@ miPointerAbsoluteCursor (x, y, time)
 }
 
 _X_EXPORT void
-miPointerPosition (x, y)
-    int	    *x, *y;
+miPointerPosition (int *x, int *y)
+{
+    miPointerGetPosition(inputInfo.pointer, x, y);
+}
+
+_X_EXPORT void
+miPointerGetPosition(DeviceIntPtr pDev, int *x, int *y)
 {
     *x = miPointer.x;
     *y = miPointer.y;
@@ -473,7 +489,6 @@ miPointerMove (pScreen, x, y, time)
     unsigned long   time;
 {
     SetupScreen(pScreen);
-    xEvent		xE;
     miHistoryPtr	history;
     int			prev, end, start;
 
diff --git a/mi/mipointer.h b/mi/mipointer.h
index b4e74ea..a910de6 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -111,40 +111,59 @@ extern int miPointerGetMotionEvents(
     ScreenPtr /*pScreen*/
 );
 
+/* Deprecated in favour of miPointerUpdateSprite. */
 extern void miPointerUpdate(
     void
 ) _X_DEPRECATED;
 
+/* Deprecated in favour of miSetPointerPosition. */
 extern void miPointerDeltaCursor(
     int /*dx*/,
     int /*dy*/,
     unsigned long /*time*/
 ) _X_DEPRECATED;
-
 extern void miPointerAbsoluteCursor(
     int /*x*/,
     int /*y*/,
     unsigned long /*time*/
 ) _X_DEPRECATED;
 
+/* Deprecated in favour of miGetPointerPosition. */
 extern void miPointerPosition(
     int * /*x*/,
     int * /*y*/
 ) _X_DEPRECATED;
 
+/* Deprecated in favour of miPointerSetScreen. */
 extern void miPointerSetNewScreen(
     int, /*screen_no*/
-	int, /*x*/
-	int /*y*/
+    int, /*x*/
+    int /*y*/
 ) _X_DEPRECATED;
+
+/* Deprecated in favour of miPointerGetScreen. */
 extern ScreenPtr miPointerCurrentScreen(
     void
 ) _X_DEPRECATED;
 
-extern void miRegisterPointerDevice(
-    ScreenPtr /*pScreen*/,
-    DeviceIntPtr /*pDevice*/
-);
+extern ScreenPtr miPointerGetScreen(
+    DeviceIntPtr pDev);
+extern void miPointerSetScreen(
+    DeviceIntPtr pDev);
+
+extern void miPointerGetPosition(
+    DeviceIntPtr pDev,
+    int *x,
+    int *y);
+
+extern void miPointerSetPosition(
+    DeviceIntPtr pDev,
+    int x,
+    int y,
+    unsigned long time);
+
+extern void miPointerUpdateSprite(
+    DeviceIntPtr pDev);
 
 extern int miPointerScreenIndex;
 
diff-tree 6eab4c55890660089067da0e944256b1ed3a8c67 (from 80cdd26581508dd17c5d0a5739cd540113996bbb)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 17:24:33 2006 +0300

    doc/extensions: document C extension use in the X server

diff --git a/doc/extensions b/doc/extensions
new file mode 100644
index 0000000..db2ba7d
--- /dev/null
+++ b/doc/extensions
@@ -0,0 +1,32 @@
+Use of extensions throughout the X server tree
+----------------------------------------------
+
+Optional extensions:
+The server will still build if your toolchain does not support these
+extensions, although the results may not be optimal.
+
+    * _X_SENTINEL(x): member x of the passed structure must be NULL, e.g.:
+                      void parseOptions(Option *options _X_SENTINEL(0));
+                      parseOptions("foo", "bar", NULL); /* this is OK */
+                      parseOptions("foo", "bar", "baz"); /* this is not */
+                      This definition comes from Xfuncproto.h in the core
+                      protocol headers.
+    * _X_ATTRIBUTE_PRINTF(x, y): This function has printf-like semantics;
+                                 check the format string when built with
+                                 -Wformat (gcc) or similar.
+    * _X_EXPORT: this function should appear in symbol tables.
+    * _X_HIDDEN: this function should not appear in the _dynamic_ symbol
+                 table.
+    * _X_INTERNAL: like _X_HIDDEN, but attempt to ensure that this function
+                   is never called from another module.
+    * _X_INLINE: inline this functon if possible (generally obeyed unless
+                 disabling optimisations).
+    * _X_DEPRECATED: warn on use of this function.
+
+Mandatory extensions:
+The server will not build if your toolchain does not support these extensions.
+
+    * named initialisers: explicitly initialising structure members, e.g.:
+                          struct foo bar = { .baz = quux, .brian = "dog" };
+    * variadic macros: macros with a variable number of arguments, e.g.:
+                       #define DebugF(x, ...) /**/
diff-tree 80cdd26581508dd17c5d0a5739cd540113996bbb (from 97030b6c6b0fb6ff629ae31e483704d0a2207a53)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 17:23:54 2006 +0300

    mi/pointer: mark public pointer functions as deprecated
    Deprecate miPointer functions which don't take a device pointer.  Pointer
    movement should be handled through GetPointerEvents, and functions which
    take a device as an argument (e.g. miPointerPosition) will be added.

diff --git a/mi/mipointer.h b/mi/mipointer.h
index aae3837..b4e74ea 100644
--- a/mi/mipointer.h
+++ b/mi/mipointer.h
@@ -97,11 +97,11 @@ extern void miPointerWarpCursor(
     ScreenPtr /*pScreen*/,
     int /*x*/,
     int /*y*/
-);
+) _X_DEPRECATED;
 
 extern int miPointerGetMotionBufferSize(
     void
-);
+) _X_DEPRECATED;
 
 extern int miPointerGetMotionEvents(
     DeviceIntPtr /*pPtr*/,
@@ -113,33 +113,33 @@ extern int miPointerGetMotionEvents(
 
 extern void miPointerUpdate(
     void
-);
+) _X_DEPRECATED;
 
 extern void miPointerDeltaCursor(
     int /*dx*/,
     int /*dy*/,
     unsigned long /*time*/
-);
+) _X_DEPRECATED;
 
 extern void miPointerAbsoluteCursor(
     int /*x*/,
     int /*y*/,
     unsigned long /*time*/
-);
+) _X_DEPRECATED;
 
 extern void miPointerPosition(
     int * /*x*/,
     int * /*y*/
-);
+) _X_DEPRECATED;
 
 extern void miPointerSetNewScreen(
     int, /*screen_no*/
 	int, /*x*/
 	int /*y*/
-);
+) _X_DEPRECATED;
 extern ScreenPtr miPointerCurrentScreen(
     void
-);
+) _X_DEPRECATED;
 
 extern void miRegisterPointerDevice(
     ScreenPtr /*pScreen*/,
diff-tree 97030b6c6b0fb6ff629ae31e483704d0a2207a53 (from 14b157bdb1f2cd5feba03ba0815d7c5b2dd6633f)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 17:07:05 2006 +0300

    config: fix compilation
    Accidentally built with --disable-config, didn't notice that the previous
    commit to clean up the debugging broke things horribly.

diff --git a/config/config.c b/config/config.c
index f74495e..8cb4406 100644
--- a/config/config.c
+++ b/config/config.c
@@ -37,8 +37,8 @@
 #define MATCH_RULE "type='method_call',interface='org.x.config.input'"
 
 #define MALFORMED_MSG "config: malformed message, dropping"
-#define MALFORMED_MESSAGE DebugF(MALFORMED_MSG)
-#define MALFORMED_MESSAGE_ERROR DEBUGF(MALFORMED_MSG ": %s, %s", \
+#define MALFORMED_MESSAGE() DebugF(MALFORMED_MSG)
+#define MALFORMED_MESSAGE_ERROR() DebugF(MALFORMED_MSG ": %s, %s", \
                                        error.name, error.message)
 
 static DBusConnection *configConnection = NULL;
diff-tree 14b157bdb1f2cd5feba03ba0815d7c5b2dd6633f (from 9e37de193f5d7412ffd8de76d5eed0158c0a3609)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 17:04:12 2006 +0300

    include: actually declare DebugF
    DebugF is ErrorF when DEBUG is defined, else a no-op.

diff --git a/include/os.h b/include/os.h
index fbe1592..d4eed22 100644
--- a/include/os.h
+++ b/include/os.h
@@ -510,6 +510,12 @@ __attribute((noreturn))
 #endif
 ;
 
+#ifdef DEBUG
+#define DebugF ErrorF
+#else
+#define DebugF(x, ...) /* */
+#endif
+
 extern void VErrorF(const char *f, va_list args);
 extern void ErrorF(const char *f, ...) _printf_attribute(1,2);
 extern void Error(char *str);
diff-tree 9e37de193f5d7412ffd8de76d5eed0158c0a3609 (from b559cbb1601f93cb03ea3dcfb2c5ca94ee6b73bb)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 16:32:15 2006 +0300

    configure.ac: reactivate warnings when building with gcc
    We were inadvertently stomping XSERVER_CFLAGS after adding the warnings, so
    move them after we do that.

diff --git a/configure.ac b/configure.ac
index 0397b58..e1342f1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -848,28 +848,6 @@ else
 fi
 AM_CONDITIONAL(DEBUG, [test "x$DEBUGGING" = xyes])
 
-# The Xorg binary needs to export symbols so that they can be used from modules
-# Some platforms require extra flags to do this.   gcc should set these flags
-# when -rdynamic is passed to it, other compilers/linkers may need to be added
-# here.
-if test "x$GCC" = "xyes"; then
-       GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
-       GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
-       GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
-       GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
-       if test "x$WERROR" = "xyes"; then
-               GCC_WARNINGS="${GCC_WARNINGS} -Werror"
-       fi
-       XSERVER_CFLAGS="$GCC_WARNINGS $XSERVER_CFLAGS"
-       LD_EXPORT_SYMBOLS_FLAG="-rdynamic"
-fi
-case $host_os in
-       openbsd*)
-       LD_EXPORT_SYMBOLS_FLAG="-Wl,--export-dynamic"
-       ;;
-esac
-AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
-
 AC_DEFINE(USE_RGB_TXT, 1, [Use rgb.txt directly])
 AC_DEFINE(MITMISC, 1, [Support MIT Misc extension])
 AC_DEFINE(XTEST, 1, [Support XTest extension])
@@ -900,6 +878,29 @@ XSERVER_LIBS="${XSERVERLIBS_LIBS} ${SYS_
 AC_SUBST([XSERVER_LIBS])
 AC_SUBST([SYS_LIBS])
 
+# The Xorg binary needs to export symbols so that they can be used from modules
+# Some platforms require extra flags to do this.   gcc should set these flags
+# when -rdynamic is passed to it, other compilers/linkers may need to be added
+# here.
+if test "x$GCC" = "xyes"; then
+       GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
+       GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
+       GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
+       GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
+       if test "x$WERROR" = "xyes"; then
+               GCC_WARNINGS="${GCC_WARNINGS} -Werror"
+       fi
+       XSERVER_CFLAGS="$GCC_WARNINGS $XSERVER_CFLAGS"
+
+       LD_EXPORT_SYMBOLS_FLAG="-rdynamic"
+fi
+case $host_os in
+       openbsd*)
+       LD_EXPORT_SYMBOLS_FLAG="-Wl,--export-dynamic"
+       ;;
+esac
+AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
+
 dnl Imake defines SVR4 on SVR4 systems, and many files check for it, so
 dnl we need to replicate that here until those can all be fixed
 AC_MSG_CHECKING([if SVR4 needs to be defined])
diff-tree b559cbb1601f93cb03ea3dcfb2c5ca94ee6b73bb (from 3ae4d250185e71a0a218c062426f92b9b1adbf05)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 16:23:14 2006 +0300

    dix/CoreProcessKeyboardEvent: remove debugging for every key event
    Also change #ifdef DEBUG/ErrorF/#endif to DebugF in FixKeyState.

diff --git a/dix/events.c b/dix/events.c
index 24fa50d..f81de5f 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2777,12 +2777,6 @@ drawable.id:0;
     }
 #endif
 
-#ifdef DEBUG
-    if (((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease))) {
-	ErrorF("CoreProcessKbdEvent: Key %d %s\n",key,
-			(xE->u.u.type==KeyPress?"down":"up"));
-    }
-#endif
     switch (xE->u.u.type)
     {
 	case KeyPress: 
@@ -2863,12 +2857,12 @@ FixKeyState (register xEvent *xE, regist
     key = xE->u.u.detail;
     kptr = &keyc->down[key >> 3];
     bit = 1 << (key & 7);
-#ifdef DEBUG
+
     if (((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease))) {
-	ErrorF("FixKeyState: Key %d %s\n",key,
+	DebugF("FixKeyState: Key %d %s\n",key,
 			(xE->u.u.type==KeyPress?"down":"up"));
     }
-#endif
+
     switch (xE->u.u.type)
     {
 	case KeyPress: 
diff-tree 3ae4d250185e71a0a218c062426f92b9b1adbf05 (from 58314756aeecbb8fb04706c3e04d98e9ac531a02)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 16:20:42 2006 +0300

    xfree86 Xinput: remove still more excessive debugging
    There isn't any more debugging left for input events in the XFree86 DDX.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 4bbca71..e5bff0c 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -644,10 +644,6 @@ xf86PostMotionEvent(DeviceIntPtr	device,
     int *valuators = NULL;
     int flags = 0;
 
-#ifdef DEBUG
-    ErrorF("xf8PostMotionEvent enter: is_absolute %s\n",
-           is_absolute ? "yes" : "no");
-#endif
     if (is_absolute)
         flags = POINTER_ABSOLUTE;
     else
@@ -658,9 +654,6 @@ xf86PostMotionEvent(DeviceIntPtr	device,
     va_start(var, num_valuators);
     for (i = 0; i < num_valuators; i++) {
         valuators[i] = va_arg(var, int);
-#ifdef DEBUG
-        ErrorF("valuator %d: %d\n", i, valuators[i]);
-#endif
     }
 
     if (!xf86Events)
@@ -699,10 +692,8 @@ xf86PostProximityEvent(DeviceIntPtr	devi
     int				loop;
     Bool			is_core = device->coreEvents;
 
-#ifdef DEBUG
-    ErrorF("xf86PostProximityEvent enter\n");
-#endif
-    
+    ErrorF("xf86PostProximityEvent: no-op event called\n");
+
 #if 0
     DBG(5, ErrorF("xf86PostProximityEvent BEGIN 0x%x(%s) prox=%s is_core=%s is_absolute=%s\n",
                   device, device->name, is_in ? "true" : "false",
@@ -794,20 +785,10 @@ xf86PostButtonEvent(DeviceIntPtr	device,
     int *valuators = NULL;
     int i = 0, nevents = 0;
     
-#ifdef DEBUG
-    ErrorF("xf86PostButtonEvent BEGIN 0x%x(%s) button=%d down=%s is_absolute=%s\n",
-                  device, device->name, button,
-                  is_down ? "True" : "False",
-                  is_absolute ? "True" : "False");
-#endif
-
     valuators = xcalloc(sizeof(int), num_valuators);
 
     va_start(var, num_valuators);
     for (i = 0; i < num_valuators; i++) {
-#ifdef DEBUG
-        ErrorF("valuator %d: %d\n", i, valuators[i]);
-#endif
         valuators[i] = va_arg(var, int);
     }
 
@@ -839,7 +820,7 @@ xf86PostKeyEvent(DeviceIntPtr	device,
     int i = 0, nevents = 0, *valuators = NULL;
 
     /* instil confidence in the user */
-    ErrorF("this function has never been tested properly.  if things go quite "
+    DebugF("this function has never been tested properly.  if things go quite "
            "badly south after this message, then xf86PostKeyEvent is "
            "broken.\n");
 
@@ -848,8 +829,6 @@ xf86PostKeyEvent(DeviceIntPtr	device,
     if (!xf86Events)
         FatalError("Couldn't allocate event store\n");
 
-    /* the spec says that dkp/dkr events should only get valuators in
-     * absolute mode.  the spec knows all.  BOW BEFORE etc. */
     if (is_absolute) {
         valuators = xcalloc(sizeof(int), num_valuators);
         va_start(var, num_valuators);
@@ -879,11 +858,6 @@ xf86PostKeyboardEvent(DeviceIntPtr      
 {
     int nevents = 0, i = 0;
 
-#ifdef DEBUG
-    ErrorF("xf86PKE enter: keycode %d is %s, device %d\n", key_code,
-           is_down ? "down" : "up", device->id);
-#endif
-
     if (!xf86Events)
         xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
     if (!xf86Events)
diff-tree 58314756aeecbb8fb04706c3e04d98e9ac531a02 (from 84f5d2291c1fe92fd8358e999e909bf3aab86c98)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 16:18:05 2006 +0300

    GetPointerEvents: add first_valuator parameter
    Add a first_valuator parameter.  Looks correct by inspection, but untested
    with first_valuator != 0 as yet.

diff --git a/dix/events.c b/dix/events.c
index 07cf03f..24fa50d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4789,15 +4789,28 @@ int GetKeyboardValuatorEvents(xEvent *ev
 
 /* Originally a part of xf86PostMotionEvent. */
 static void
-acceleratePointer(DeviceIntPtr pDev, int num_valuators, int *valuators)
+acceleratePointer(DeviceIntPtr pDev, int first_valuator, int num_valuators,
+                  int *valuators)
 {
     float mult = 0.0;
-    int dx = num_valuators >= 1 ? valuators[0] : 0;
-    int dy = num_valuators >= 2 ? valuators[1] : 0;
+    int dx = 0, dy = 0;
+    int *px = NULL, *py = NULL;
 
     if (!num_valuators || !valuators)
         return;
 
+    if (first_valuator == 0) {
+        dx = valuators[0];
+        px = &valuators[0];
+    }
+    if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
+        dy = valuators[1 - first_valuator];
+        py = &valuators[1 - first_valuator];
+    }
+
+    if (!dx && !dy)
+        return;
+
     /*
      * Accelerate
      */
@@ -4809,20 +4822,24 @@ acceleratePointer(DeviceIntPtr pDev, int
                                              (float)(pDev->ptrfeed->ctrl.num)) /
                                              (float)(pDev->ptrfeed->ctrl.den) +
                                             pDev->valuator->dxremaind;
-                valuators[0] = (int)pDev->valuator->dxremaind;
-                pDev->valuator->dxremaind = pDev->valuator->dxremaind -
-                                            (float)valuators[0];
+                if (px) {
+                    *px = (int)pDev->valuator->dxremaind;
+                    pDev->valuator->dxremaind = pDev->valuator->dxremaind -
+                                                (float)(*px);
+                }
 
                 pDev->valuator->dyremaind = ((float)dy *
                                              (float)(pDev->ptrfeed->ctrl.num)) /
                                              (float)(pDev->ptrfeed->ctrl.den) +
                                             pDev->valuator->dyremaind;
-                valuators[1] = (int)pDev->valuator->dyremaind;
-                pDev->valuator->dyremaind = pDev->valuator->dyremaind -
-                                            (float)valuators[1];
+                if (py) {
+                    *py = (int)pDev->valuator->dyremaind;
+                    pDev->valuator->dyremaind = pDev->valuator->dyremaind -
+                                                (float)(*py);
+                }
             }
         }
-        else if (dx || dy) {
+        else {
             mult = pow((float)(dx * dx + dy * dy),
                        ((float)(pDev->ptrfeed->ctrl.num) /
                         (float)(pDev->ptrfeed->ctrl.den) - 1.0) /
@@ -4830,16 +4847,16 @@ acceleratePointer(DeviceIntPtr pDev, int
             if (dx) {
                 pDev->valuator->dxremaind = mult * (float)dx +
                                             pDev->valuator->dxremaind;
-                valuators[0] = (int)pDev->valuator->dxremaind;
+                *px = (int)pDev->valuator->dxremaind;
                 pDev->valuator->dxremaind = pDev->valuator->dxremaind -
-                                            (float)valuators[0];
+                                            (float)(*px);
             }
             if (dy) {
                 pDev->valuator->dyremaind = mult * (float)dy +
                                             pDev->valuator->dyremaind;
-                valuators[1] = (int)pDev->valuator->dyremaind;
+                *py = (int)pDev->valuator->dyremaind;
                 pDev->valuator->dyremaind = pDev->valuator->dyremaind -
-                                            (float)valuators[1];
+                                            (float)(*py);
             }
         }
     }
@@ -4855,8 +4872,9 @@ acceleratePointer(DeviceIntPtr pDev, int
  */
 int
 GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
-                 int flags, int num_valuators, int *valuators) {
-    int numEvents = 0, ms = 0, first_valuator = 0;
+                 int flags, int first_valuator, int num_valuators,
+                 int *valuators) {
+    int num_events = 0, ms = 0, final_valuator = 0, i = 0;
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
     AxisInfoPtr axes = NULL;
@@ -4869,20 +4887,27 @@ GetPointerEvents(xEvent *events, DeviceI
     if (!pDev->button || (pDev->coreEvents && (!cp->button || !cp->valuator)))
         return 0;
 
+    /* You fail. */
+    if (first_valuator < 0)
+        return 0;
+
     if (pDev->coreEvents)
-        numEvents = 2;
+        num_events = 2;
     else
-        numEvents = 1;
+        num_events = 1;
 
-    if (num_valuators > 2 && sendValuators) {
+    /* Do we need to send a DeviceValuator event? */
+    if ((num_valuators + first_valuator) >= 2 && sendValuators) {
         if (((num_valuators / 6) + 1) > MAX_VALUATOR_EVENTS)
             num_valuators = MAX_VALUATOR_EVENTS;
-        numEvents += (num_valuators / 6) + 1;
+        num_events += (num_valuators / 6) + 1;
     }
-    else if (type == MotionNotify && num_valuators < 2) {
+    else if (type == MotionNotify && num_valuators <= 0) {
         return 0;
     }
 
+    final_valuator = num_valuators + first_valuator;
+
     ms = GetTimeInMillis();
 
     kbp = (deviceKeyButtonPointer *) events;
@@ -4890,7 +4915,7 @@ GetPointerEvents(xEvent *events, DeviceI
     kbp->deviceid = pDev->id;
 
     if (flags & POINTER_ABSOLUTE) {
-        if (num_valuators >= 1) {
+        if (num_valuators >= 1 && first_valuator == 0) {
             kbp->root_x = valuators[0];
         }
         else {
@@ -4899,8 +4924,9 @@ GetPointerEvents(xEvent *events, DeviceI
             else
                 kbp->root_x = pDev->valuator->lastx;
         }
-        if (num_valuators >= 2) {
-            kbp->root_y = valuators[1];
+
+        if (first_valuator <= 1 && num_valuators >= (2 - first_valuator)) {
+            kbp->root_y = valuators[1 - first_valuator];
         }
         else {
             if (pDev->coreEvents)
@@ -4911,25 +4937,30 @@ GetPointerEvents(xEvent *events, DeviceI
     }
     else {
         if (flags & POINTER_ACCELERATE)
-            acceleratePointer(pDev, num_valuators, valuators);
+            acceleratePointer(pDev, first_valuator, num_valuators,
+                              valuators);
 
         if (pDev->coreEvents) {
-            if (num_valuators >= 1)
+            if (first_valuator == 0 && num_valuators >= 1)
                 kbp->root_x = cp->valuator->lastx + valuators[0];
             else
                 kbp->root_x = cp->valuator->lastx;
-            if (num_valuators >= 2)
-                kbp->root_y = cp->valuator->lasty + valuators[1];
+
+            if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
+                kbp->root_y = cp->valuator->lasty +
+                              valuators[1 - first_valuator];
             else
                 kbp->root_y = cp->valuator->lasty;
         }
         else {
-            if (num_valuators >= 1)
+            if (first_valuator == 0 && num_valuators >= 1)
                 kbp->root_x = pDev->valuator->lastx + valuators[0];
             else
                 kbp->root_x = pDev->valuator->lastx;
-            if (num_valuators >= 2)
-                kbp->root_y = pDev->valuator->lasty + valuators[1];
+
+            if (first_valuator <= 1 && num_valuators >= (2 - first_valuator))
+                kbp->root_y = pDev->valuator->lasty +
+                              valuators[1 - first_valuator];
             else
                 kbp->root_y = pDev->valuator->lasty;
         }
@@ -4941,6 +4972,7 @@ GetPointerEvents(xEvent *events, DeviceI
         kbp->root_x = axes->min_value;
     if (axes->max_value > 0 && kbp->root_x > axes->max_value)
         kbp->root_x = axes->max_value;
+
     axes++;
     if (kbp->root_y < axes->min_value)
         kbp->root_y = axes->min_value;
@@ -4965,35 +4997,36 @@ GetPointerEvents(xEvent *events, DeviceI
         kbp->detail = pDev->button->map[buttons];
     }
 
-    if (num_valuators > 2 && sendValuators) {
+    if (final_valuator > 2 && sendValuators) {
         kbp->deviceid |= MORE_EVENTS;
-        while (first_valuator < num_valuators) {
+        for (i = first_valuator; i < final_valuator; i += 6) {
             xv = (deviceValuator *) ++events;
             xv->type = DeviceValuator;
-            xv->first_valuator = first_valuator;
+            xv->first_valuator = i;
             xv->num_valuators = num_valuators;
             xv->deviceid = kbp->deviceid;
-            switch (num_valuators - first_valuator) {
+            switch (final_valuator - i) {
             case 6:
-                xv->valuator5 = valuators[first_valuator+5];
+                xv->valuator5 = valuators[i+5];
             case 5:
-                xv->valuator4 = valuators[first_valuator+4];
+                xv->valuator4 = valuators[i+4];
             case 4:
-                xv->valuator3 = valuators[first_valuator+3];
+                xv->valuator3 = valuators[i+3];
             case 3:
-                xv->valuator2 = valuators[first_valuator+2];
+                xv->valuator2 = valuators[i+2];
             case 2:
-                if (first_valuator == 0)
+                /* x and y may have been accelerated. */
+                if (i == 0)
                     xv->valuator1 = kbp->root_y;
                 else
-                    xv->valuator1 = valuators[first_valuator+1];
+                    xv->valuator1 = valuators[i+1];
             case 1:
-                if (first_valuator == 0)
+                /* x and y may have been accelerated. */
+                if (i == 0)
                     xv->valuator0 = kbp->root_x;
                 else
-                    xv->valuator0 = valuators[first_valuator];
+                    xv->valuator0 = valuators[i];
             }
-            first_valuator += 6;
         }
     }
 
@@ -5005,8 +5038,11 @@ GetPointerEvents(xEvent *events, DeviceI
         events->u.keyButtonPointer.rootY = kbp->root_y;
         cp->valuator->lastx = kbp->root_x;
         cp->valuator->lasty = kbp->root_y;
+
         if (type == ButtonPress || type == ButtonRelease) {
-            /* Core buttons remapping shouldn't be transitive. */
+            /* We hijack SetPointerMapping to work on all core-sending
+             * devices, so we use the device-specific map here instead of
+             * the core one. */
             events->u.u.detail = pDev->button->map[buttons];
         }
         else {
@@ -5018,5 +5054,5 @@ GetPointerEvents(xEvent *events, DeviceI
             inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
     }
 
-    return numEvents;
+    return num_events;
 }
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index cdb26b1..8dd3728 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -2049,7 +2049,7 @@ _KdEnqueuePointerEvent (KdPointerInfo *p
     if (!force && KdHandlePointerEvent(pi, type, x, y, z, b, absrel))
         return;
 
-    nEvents = GetPointerEvents(kdEvents, pi->dixdev, type, b, absrel, 3,
+    nEvents = GetPointerEvents(kdEvents, pi->dixdev, type, b, absrel, 0, 3,
                                valuators);
     for (i = 0; i < nEvents; i++)
         KdQueueEvent(kdEvents + i);
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 070645d..4bbca71 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -669,7 +669,7 @@ xf86PostMotionEvent(DeviceIntPtr	device,
         FatalError("Couldn't allocate event store\n");
 
     nevents = GetPointerEvents(xf86Events, device, MotionNotify, 0,
-                               flags, num_valuators, valuators);
+                               flags, 0, num_valuators, valuators);
 
     for (i = 0; i < nevents; i++)
         mieqEnqueue(xf86Events + i);
@@ -820,7 +820,7 @@ xf86PostButtonEvent(DeviceIntPtr	device,
                                is_down ? ButtonPress : ButtonRelease, button,
                                is_absolute ? POINTER_ABSOLUTE :
                                              POINTER_RELATIVE,
-                               num_valuators, valuators);
+                               0, num_valuators, valuators);
 
     for (i = 0; i < nevents; i++)
         mieqEnqueue(xf86Events + i);
diff --git a/include/input.h b/include/input.h
index 66d03d0..72f67c2 100644
--- a/include/input.h
+++ b/include/input.h
@@ -387,7 +387,8 @@ extern int GetPointerEvents(
     int type,
     int buttons,
     int flags,
-    int num_axes,
+    int first_valuator,
+    int num_valuators,
     int *valuators);
 
 extern int GetKeyboardEvents(
diff-tree 84f5d2291c1fe92fd8358e999e909bf3aab86c98 (from cfc3e9ede2dc83741bd38bf3df13f096ecb8adc0)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 15:30:24 2006 +0300

    GetPointerEvents: fix relatively harmless typo
    Change !(cp->button || !cp->valuator) to (!cp->button || !cp->valuator).

diff --git a/dix/events.c b/dix/events.c
index c95a942..07cf03f 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4866,7 +4866,7 @@ GetPointerEvents(xEvent *events, DeviceI
     if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
         return 0;
 
-    if (!pDev->button || (pDev->coreEvents && !(cp->button || !cp->valuator)))
+    if (!pDev->button || (pDev->coreEvents && (!cp->button || !cp->valuator)))
         return 0;
 
     if (pDev->coreEvents)
diff-tree cfc3e9ede2dc83741bd38bf3df13f096ecb8adc0 (from 8d8e7f8bae4099f9e90ef9aac687607dae1d32bf)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 15:27:52 2006 +0300

    config: remove excessive debugging

diff --git a/config/config.c b/config/config.c
index d980f76..f74495e 100644
--- a/config/config.c
+++ b/config/config.c
@@ -36,6 +36,11 @@
 
 #define MATCH_RULE "type='method_call',interface='org.x.config.input'"
 
+#define MALFORMED_MSG "config: malformed message, dropping"
+#define MALFORMED_MESSAGE DebugF(MALFORMED_MSG)
+#define MALFORMED_MESSAGE_ERROR DEBUGF(MALFORMED_MSG ": %s, %s", \
+                                       error.name, error.message)
+
 static DBusConnection *configConnection = NULL;
 static int configfd = -1;
 static char busobject[32] = { 0 };
@@ -60,32 +65,17 @@ configMessage(DBusConnection *connection
     int deviceid = -1;
     DeviceIntPtr pDev = NULL;
 
-#ifdef DEBUG
-    ErrorF("[dbus] new message!\n");
-    ErrorF("       source: %s\n", dbus_message_get_sender(message));
-    ErrorF("       destination: %s\n", dbus_message_get_destination(message));
-    ErrorF("       signature: %s\n", dbus_message_get_signature(message));
-    ErrorF("       path: %s\n", dbus_message_get_path(message));
-    ErrorF("       interface: %s\n", dbus_message_get_interface(message));
-    ErrorF("       member: %s\n", dbus_message_get_member(message));
-    ErrorF("       method call? %s\n", (dbus_message_get_type(message) ==
-                                         DBUS_MESSAGE_TYPE_METHOD_CALL) ?
-                                        "yes" : "no");
-#endif
-
     dbus_error_init(&error);
 
     if (strcmp(dbus_message_get_interface(message),
                "org.x.config.input") == 0) {
         if (!dbus_message_iter_init(message, &iter)) {
-            ErrorF("failed to init iterator! this is probably bad.\n");
+            ErrorF("config: failed to init iterator\n");
             dbus_error_free(&error);
             return DBUS_HANDLER_RESULT_NEED_MEMORY; /* ?? */
         }
         if (strcmp(dbus_message_get_member(message), "add") == 0) {
-#ifdef DEBUG
-            ErrorF("       we want to add a device!\n");
-#endif
+            DebugF("config: adding device\n");
             /* signature should be [ss][ss]... */
             while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_ARRAY) {
                 option = (InputOption *)xcalloc(sizeof(InputOption), 1);
@@ -103,14 +93,14 @@ configMessage(DBusConnection *connection
 
                 if (dbus_message_iter_get_arg_type(&subiter) !=
                     DBUS_TYPE_STRING) {
-                    ErrorF("couldn't get the arg type\n");
+                    MALFORMED_MESSAGE();
                     xfree(option);
                     dbus_error_free(&error);
                     return DBUS_HANDLER_RESULT_HANDLED;
                 }
                 dbus_message_iter_get_basic(&subiter, &tmp);
                 if (!tmp) {
-                    ErrorF("couldn't get the key!\n");
+                    MALFORMED_MESSAGE();
                     xfree(option);
                     break;
                 }
@@ -122,7 +112,7 @@ configMessage(DBusConnection *connection
                 }
 
                 if (!dbus_message_iter_has_next(&subiter)) {
-                    ErrorF("broken message: no next\n");
+                    MALFORMED_MESSAGE();
                     xfree(option->key);
                     xfree(option);
                     dbus_error_free(&error);
@@ -132,14 +122,14 @@ configMessage(DBusConnection *connection
 
                 if (dbus_message_iter_get_arg_type(&subiter) !=
                     DBUS_TYPE_STRING) {
-                    ErrorF("couldn't get the arg type\n");
+                    MALFORMED_MESSAGE();
                     xfree(option);
                     dbus_error_free(&error);
                     return DBUS_HANDLER_RESULT_HANDLED;
                 }
                 dbus_message_iter_get_basic(&subiter, &tmp);
                 if (!tmp) {
-                    ErrorF("couldn't get the value!\n");
+                    MALFORMED_MESSAGE();
                     xfree(option->key);
                     xfree(option);
                     break;
@@ -158,23 +148,21 @@ configMessage(DBusConnection *connection
             }
 
             if (NewInputDeviceRequest(ret) != Success) {
-                ErrorF("[config] NIDR failed\n");
+                DebugF("config: NewInputDeviceRequest failed\n");
             }
             dbus_error_free(&error);
             return DBUS_HANDLER_RESULT_HANDLED;
         }
         else if (strcmp(dbus_message_get_member(message), "remove") == 0) {
-#ifdef DEBUG
-            ErrorF("        we want to remove a device!\n");
-#endif
+            ErrorF("config: removing device\n");
             if (!dbus_message_get_args(message, &error, DBUS_TYPE_INT32,
                                        &deviceid, DBUS_TYPE_INVALID)) {
-                ErrorF("couldn't get args: %s %s\n", error.name, error.message);
+                MALFORMED_MESSAGE_ERROR();
                 dbus_error_free(&error);
                 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
             }
             if (deviceid < 0 || !(pDev = LookupDeviceIntRec(deviceid))) {
-                ErrorF("bogus device id %d\n", deviceid);
+                DebugF("config: bogus device id %d given\n", deviceid);
                 dbus_error_free(&error);
                 return DBUS_HANDLER_RESULT_HANDLED;
             }
@@ -251,10 +239,8 @@ configInitialise()
         FatalError("[dbus] couldn't register object path\n");
         return;
     }
-#ifdef DEBUG
-    ErrorF("[dbus] registered object path %s\n", busobject);
-    ErrorF("[dbus] registered and listening\n");
-#endif
+
+    DebugF("[dbus] registered object path %s\n", busobject);
 
     dbus_error_free(&error);
 
diff-tree 8d8e7f8bae4099f9e90ef9aac687607dae1d32bf (from 22a836fafd39a8ef413826dc2c94bc5f96990e2d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Oct 8 15:26:54 2006 +0300

    kdrive/input: remove excessive debugging in NIDR

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 3915436..cdb26b1 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -2362,7 +2362,6 @@ NewInputDeviceRequest(InputOption *optio
     }
 
     for (option = options; option; option = option->next) {
-        ErrorF("option '%s': '%s'\n", option->key, option->value);
         if (strcmp(option->key, "driver") == 0) {
             if (pi) {
                 pi->driver = KdFindPointerDriver(option->value);
diff-tree 22a836fafd39a8ef413826dc2c94bc5f96990e2d (from 3686cd0fbf56d883f2f3b3fda11ffba1058b74e4)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Oct 7 14:16:51 2006 +0300

    xfree86/loader: bump input major ABI version
    Bump input major ABI version to 1.0, since we removed the OS keyboard
    layer.

diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index f54be49..f0cf5eb 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -85,7 +85,7 @@ typedef enum {
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 3)
 #define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(1, 0)
-#define ABI_XINPUT_VERSION	SET_ABI_VERSION(0, 6)
+#define ABI_XINPUT_VERSION	SET_ABI_VERSION(1, 0)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(0, 3)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 5)
 
diff-tree 3686cd0fbf56d883f2f3b3fda11ffba1058b74e4 (from 7b4dc171b036107cfba87a1a16bf692b982005a5)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 6 17:20:42 2006 +0300

    xkb: make XkbSetControls work on all core-sending devices

diff --git a/xkb/xkb.c b/xkb/xkb.c
index 7a17db6..4655d8a 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -677,7 +677,7 @@ ProcXkbGetControls(ClientPtr client)
 int
 ProcXkbSetControls(ClientPtr client)
 {
-    DeviceIntPtr 	dev;
+    DeviceIntPtr 	dev, tmpd;
     XkbSrvInfoPtr	xkbi;
     XkbControlsPtr	ctrl;
     XkbControlsRec	new,old;
@@ -688,159 +688,207 @@ ProcXkbSetControls(ClientPtr client)
     REQUEST(xkbSetControlsReq);
     REQUEST_SIZE_MATCH(xkbSetControlsReq);
 
-    if (!(client->xkbClientFlags&_XkbClientInitialized))
+    if (!(client->xkbClientFlags & _XkbClientInitialized))
 	return BadAccess;
 
-    CHK_KBD_DEVICE(dev,stuff->deviceSpec);
-    CHK_MASK_LEGAL(0x01,stuff->changeCtrls,XkbAllControlsMask);
+    CHK_KBD_DEVICE(dev, stuff->deviceSpec);
+    CHK_MASK_LEGAL(0x01, stuff->changeCtrls, XkbAllControlsMask);
 
-    xkbi = dev->key->xkbInfo;
-    ctrl = xkbi->desc->ctrls;
-    new = *ctrl;
-    XkbSetCauseXkbReq(&cause,X_kbSetControls,client);
-    if (stuff->changeCtrls&XkbInternalModsMask) {
-	CHK_MASK_MATCH(0x02,stuff->affectInternalMods,stuff->internalMods);
-	CHK_MASK_MATCH(0x03,stuff->affectInternalVMods,stuff->internalVMods);
-	new.internal.real_mods&=~stuff->affectInternalMods;
-	new.internal.real_mods|=(stuff->affectInternalMods&stuff->internalMods);
-	new.internal.vmods&=~stuff->affectInternalVMods;
-	new.internal.vmods|= (stuff->affectInternalVMods&stuff->internalVMods);
-	new.internal.mask= new.internal.real_mods|
-	      XkbMaskForVMask(xkbi->desc,new.internal.vmods);
-    }
-    if (stuff->changeCtrls&XkbIgnoreLockModsMask) {
-	CHK_MASK_MATCH(0x4,stuff->affectIgnoreLockMods,stuff->ignoreLockMods);
-	CHK_MASK_MATCH(0x5,stuff->affectIgnoreLockVMods,stuff->ignoreLockVMods);
-	new.ignore_lock.real_mods&=~stuff->affectIgnoreLockMods;
-	new.ignore_lock.real_mods|=
-	      (stuff->affectIgnoreLockMods&stuff->ignoreLockMods);
-	new.ignore_lock.vmods&= ~stuff->affectIgnoreLockVMods;
-	new.ignore_lock.vmods|=
-	      (stuff->affectIgnoreLockVMods&stuff->ignoreLockVMods);
-	new.ignore_lock.mask= new.ignore_lock.real_mods|
-	      XkbMaskForVMask(xkbi->desc,new.ignore_lock.vmods);
-    }
-    CHK_MASK_MATCH(0x06,stuff->affectEnabledCtrls,stuff->enabledCtrls);
-    if (stuff->affectEnabledCtrls) {
-	CHK_MASK_LEGAL(0x07,stuff->affectEnabledCtrls,XkbAllBooleanCtrlsMask);
-	new.enabled_ctrls&= ~stuff->affectEnabledCtrls;
-	new.enabled_ctrls|= (stuff->affectEnabledCtrls&stuff->enabledCtrls);
-    }
-    if (stuff->changeCtrls&XkbRepeatKeysMask) {
-	if ((stuff->repeatDelay<1)||(stuff->repeatInterval<1)) {
-	   client->errorValue = _XkbErrCode3(0x08,stuff->repeatDelay,
-							stuff->repeatInterval);
-	   return BadValue;
-	}
-	new.repeat_delay = stuff->repeatDelay;
-	new.repeat_interval = stuff->repeatInterval;
-    }
-    if (stuff->changeCtrls&XkbSlowKeysMask) {
-	if (stuff->slowKeysDelay<1) {
-	    client->errorValue = _XkbErrCode2(0x09,stuff->slowKeysDelay);
-	    return BadValue;
-	}
-	new.slow_keys_delay = stuff->slowKeysDelay;
-    }
-    if (stuff->changeCtrls&XkbBounceKeysMask) {
-	if (stuff->debounceDelay<1) {
-	    client->errorValue = _XkbErrCode2(0x0A,stuff->debounceDelay);
-	    return BadValue;
-	}
-	new.debounce_delay = stuff->debounceDelay;
-    }
-    if (stuff->changeCtrls&XkbMouseKeysMask) {
-	if (stuff->mkDfltBtn>XkbMaxMouseKeysBtn) {
-	    client->errorValue = _XkbErrCode2(0x0B,stuff->mkDfltBtn);
-	    return BadValue;
-	}
-	new.mk_dflt_btn = stuff->mkDfltBtn;
-    }
-    if (stuff->changeCtrls&XkbMouseKeysAccelMask) {
-	if ((stuff->mkDelay<1) || (stuff->mkInterval<1) ||
-	    (stuff->mkTimeToMax<1) || (stuff->mkMaxSpeed<1)||
-	    (stuff->mkCurve<-1000)) {
-	    client->errorValue = _XkbErrCode2(0x0C,0);
-	    return BadValue;
-	}
-	new.mk_delay = stuff->mkDelay;
-	new.mk_interval = stuff->mkInterval;
-	new.mk_time_to_max = stuff->mkTimeToMax;
-	new.mk_max_speed = stuff->mkMaxSpeed;
-	new.mk_curve = stuff->mkCurve;
-	AccessXComputeCurveFactor(xkbi,&new);
-    }
-    if (stuff->changeCtrls&XkbGroupsWrapMask) {
-	unsigned act,num;
-	act= XkbOutOfRangeGroupAction(stuff->groupsWrap);
-	switch (act) {
-	    case XkbRedirectIntoRange:
-		num= XkbOutOfRangeGroupNumber(stuff->groupsWrap);
-		if (num>=new.num_groups) {
-		    client->errorValue= _XkbErrCode3(0x0D,new.num_groups,num);
-		    return BadValue;
-		}
-	    case XkbWrapIntoRange:
-	    case XkbClampIntoRange:
-		break;
-	    default:
-		client->errorValue= _XkbErrCode2(0x0E,act);
-		return BadValue;
-	}
-	new.groups_wrap= stuff->groupsWrap;
-    }
-    CHK_MASK_LEGAL(0x0F,stuff->axOptions,XkbAX_AllOptionsMask);
-    if (stuff->changeCtrls&XkbAccessXKeysMask)
-	new.ax_options = stuff->axOptions&XkbAX_AllOptionsMask;
-    else {
-	if (stuff->changeCtrls&XkbStickyKeysMask) {
-	   new.ax_options&= ~XkbAX_SKOptionsMask;
-	   new.ax_options|= stuff->axOptions&XkbAX_SKOptionsMask;
-	}
-	if (stuff->changeCtrls&XkbAccessXFeedbackMask) {
-	   new.ax_options&= ~XkbAX_FBOptionsMask;
-	   new.ax_options|= stuff->axOptions&XkbAX_FBOptionsMask;
-	}
-    }
+    for (tmpd = inputInfo.keyboard; tmpd; tmpd = tmpd->next) {
+        if ((dev == inputInfo.keyboard && tmpd->key && tmpd->coreEvents) ||
+            tmpd == inputInfo.keyboard) {
+
+            xkbi = tmpd->key->xkbInfo;
+            ctrl = xkbi->desc->ctrls;
+            new = *ctrl;
+            XkbSetCauseXkbReq(&cause, X_kbSetControls, client);
+
+            if (stuff->changeCtrls & XkbInternalModsMask) {
+                CHK_MASK_MATCH(0x02, stuff->affectInternalMods,
+                               stuff->internalMods);
+                CHK_MASK_MATCH(0x03, stuff->affectInternalVMods,
+                               stuff->internalVMods);
+
+                new.internal.real_mods &= ~(stuff->affectInternalMods);
+                new.internal.real_mods |= (stuff->affectInternalMods &
+                                           stuff->internalMods);
+                new.internal.vmods &= ~(stuff->affectInternalVMods);
+                new.internal.vmods |= (stuff->affectInternalVMods &
+                                       stuff->internalVMods);
+                new.internal.mask = new.internal.real_mods |
+                                    XkbMaskForVMask(xkbi->desc,
+                                                    new.internal.vmods);
+            }
 
-    if (stuff->changeCtrls&XkbAccessXTimeoutMask) {
-	if (stuff->axTimeout<1) {
-	    client->errorValue = _XkbErrCode2(0x10,stuff->axTimeout);
-	    return BadValue;
-	}
-	CHK_MASK_MATCH(0x11,stuff->axtCtrlsMask,stuff->axtCtrlsValues);
-	CHK_MASK_LEGAL(0x12,stuff->axtCtrlsMask,XkbAllBooleanCtrlsMask);
-	CHK_MASK_MATCH(0x13,stuff->axtOptsMask,stuff->axtOptsValues);
-	CHK_MASK_LEGAL(0x14,stuff->axtOptsMask,XkbAX_AllOptionsMask);
-	new.ax_timeout = stuff->axTimeout;
-	new.axt_ctrls_mask = stuff->axtCtrlsMask;
-	new.axt_ctrls_values = (stuff->axtCtrlsValues&stuff->axtCtrlsMask);
-	new.axt_opts_mask = stuff->axtOptsMask;
-	new.axt_opts_values= (stuff->axtOptsValues&stuff->axtOptsMask);
-    }
-    if (stuff->changeCtrls&XkbPerKeyRepeatMask) {
-	memcpy(new.per_key_repeat,stuff->perKeyRepeat,XkbPerKeyBitArraySize);
-    }
-
-    old= *ctrl;
-    *ctrl= new;
-    XkbDDXChangeControls(dev,&old,ctrl);
+            if (stuff->changeCtrls & XkbIgnoreLockModsMask) {
+                CHK_MASK_MATCH(0x4, stuff->affectIgnoreLockMods,
+                               stuff->ignoreLockMods);
+                CHK_MASK_MATCH(0x5, stuff->affectIgnoreLockVMods,
+                               stuff->ignoreLockVMods);
+
+                new.ignore_lock.real_mods &= ~(stuff->affectIgnoreLockMods);
+                new.ignore_lock.real_mods |= (stuff->affectIgnoreLockMods &
+                                              stuff->ignoreLockMods);
+                new.ignore_lock.vmods &= ~(stuff->affectIgnoreLockVMods);
+                new.ignore_lock.vmods |= (stuff->affectIgnoreLockVMods &
+                                          stuff->ignoreLockVMods);
+                new.ignore_lock.mask = new.ignore_lock.real_mods |
+                                       XkbMaskForVMask(xkbi->desc,
+                                                       new.ignore_lock.vmods);
+            }
 
-    if (XkbComputeControlsNotify(dev,&old,ctrl,&cn,False)) {
-	cn.keycode= 0;
-	cn.eventType = 0;
-	cn.requestMajor = XkbReqCode;
-	cn.requestMinor = X_kbSetControls;
-	XkbSendControlsNotify(dev,&cn);
-    }
+            CHK_MASK_MATCH(0x06, stuff->affectEnabledCtrls,
+                           stuff->enabledCtrls);
+            if (stuff->affectEnabledCtrls) {
+                CHK_MASK_LEGAL(0x07, stuff->affectEnabledCtrls,
+                               XkbAllBooleanCtrlsMask);
+
+                new.enabled_ctrls &= ~(stuff->affectEnabledCtrls);
+                new.enabled_ctrls |= (stuff->affectEnabledCtrls &
+                                      stuff->enabledCtrls);
+            }
+
+            if (stuff->changeCtrls & XkbRepeatKeysMask) {
+                if (stuff->repeatDelay < 1 || stuff->repeatInterval < 1) {
+                    client->errorValue = _XkbErrCode3(0x08, stuff->repeatDelay,
+                                                      stuff->repeatInterval);
+                    return BadValue;
+                }
 
-    if ((sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0))!=NULL)
-	XkbUpdateIndicators(dev,sli->usesControls,True,NULL,&cause);
-
-    /* If sticky keys were disabled, clear all locks and latches */
-    if ((old.enabled_ctrls&XkbStickyKeysMask)&&
-	(!(ctrl->enabled_ctrls&XkbStickyKeysMask))) {
-	XkbClearAllLatchesAndLocks(dev,xkbi,True,&cause);
+                new.repeat_delay = stuff->repeatDelay;
+                new.repeat_interval = stuff->repeatInterval;
+            }
+
+            if (stuff->changeCtrls & XkbSlowKeysMask) {
+                if (stuff->slowKeysDelay < 1) {
+                    client->errorValue = _XkbErrCode2(0x09,
+                                                      stuff->slowKeysDelay);
+                    return BadValue;
+                }
+
+                new.slow_keys_delay = stuff->slowKeysDelay;
+            }
+
+            if (stuff->changeCtrls & XkbBounceKeysMask) {
+                if (stuff->debounceDelay < 1) {
+                    client->errorValue = _XkbErrCode2(0x0A,
+                                                      stuff->debounceDelay);
+                    return BadValue;
+                }
+
+                new.debounce_delay = stuff->debounceDelay;
+            }
+
+            if (stuff->changeCtrls & XkbMouseKeysMask) {
+                if (stuff->mkDfltBtn > XkbMaxMouseKeysBtn) {
+                    client->errorValue = _XkbErrCode2(0x0B, stuff->mkDfltBtn);
+                    return BadValue;
+                }
+
+                new.mk_dflt_btn = stuff->mkDfltBtn;
+            }
+
+            if (stuff->changeCtrls & XkbMouseKeysAccelMask) {
+                if (stuff->mkDelay < 1 || stuff->mkInterval < 1 ||
+                    stuff->mkTimeToMax < 1 || stuff->mkMaxSpeed < 1 ||
+                    stuff->mkCurve < -1000) {
+                    client->errorValue = _XkbErrCode2(0x0C,0);
+                    return BadValue;
+                }
+
+                new.mk_delay = stuff->mkDelay;
+                new.mk_interval = stuff->mkInterval;
+                new.mk_time_to_max = stuff->mkTimeToMax;
+                new.mk_max_speed = stuff->mkMaxSpeed;
+                new.mk_curve = stuff->mkCurve;
+                AccessXComputeCurveFactor(xkbi, &new);
+            }
+
+            if (stuff->changeCtrls & XkbGroupsWrapMask) {
+                unsigned act, num;
+
+                act = XkbOutOfRangeGroupAction(stuff->groupsWrap);
+                switch (act) {
+                case XkbRedirectIntoRange:
+                    num = XkbOutOfRangeGroupNumber(stuff->groupsWrap);
+                    if (num >= new.num_groups) {
+                        client->errorValue = _XkbErrCode3(0x0D, new.num_groups,
+                                                          num);
+                        return BadValue;
+                    }
+                case XkbWrapIntoRange:
+                case XkbClampIntoRange:
+                    break;
+                default:
+                    client->errorValue = _XkbErrCode2(0x0E, act);
+                    return BadValue;
+                }
+
+                new.groups_wrap= stuff->groupsWrap;
+            }
+
+            CHK_MASK_LEGAL(0x0F, stuff->axOptions, XkbAX_AllOptionsMask);
+            if (stuff->changeCtrls & XkbAccessXKeysMask) {
+                new.ax_options = stuff->axOptions & XkbAX_AllOptionsMask;
+            }
+            else {
+                if (stuff->changeCtrls & XkbStickyKeysMask) {
+                    new.ax_options &= ~(XkbAX_SKOptionsMask);
+                    new.ax_options |= (stuff->axOptions & XkbAX_SKOptionsMask);
+                }
+            
+                if (stuff->changeCtrls & XkbAccessXFeedbackMask) {
+                    new.ax_options &= ~(XkbAX_FBOptionsMask);
+                    new.ax_options |= (stuff->axOptions & XkbAX_FBOptionsMask);
+                }
+            }
+
+            if (stuff->changeCtrls & XkbAccessXTimeoutMask) {
+                if (stuff->axTimeout < 1) {
+                    client->errorValue = _XkbErrCode2(0x10, stuff->axTimeout);
+                    return BadValue;
+                }
+                CHK_MASK_MATCH(0x11, stuff->axtCtrlsMask,
+                               stuff->axtCtrlsValues);
+                CHK_MASK_LEGAL(0x12, stuff->axtCtrlsMask,
+                               XkbAllBooleanCtrlsMask);
+                CHK_MASK_MATCH(0x13, stuff->axtOptsMask, stuff->axtOptsValues);
+                CHK_MASK_LEGAL(0x14, stuff->axtOptsMask, XkbAX_AllOptionsMask);
+                new.ax_timeout = stuff->axTimeout;
+                new.axt_ctrls_mask = stuff->axtCtrlsMask;
+                new.axt_ctrls_values = (stuff->axtCtrlsValues &
+                                        stuff->axtCtrlsMask);
+                new.axt_opts_mask = stuff->axtOptsMask;
+                new.axt_opts_values = (stuff->axtOptsValues &
+                                       stuff->axtOptsMask);
+            }
+
+            if (stuff->changeCtrls & XkbPerKeyRepeatMask)
+                memcpy(new.per_key_repeat, stuff->perKeyRepeat,
+                       XkbPerKeyBitArraySize);
+
+            old= *ctrl;
+            *ctrl= new;
+            XkbDDXChangeControls(tmpd, &old, ctrl);
+
+            if (XkbComputeControlsNotify(tmpd, &old, ctrl, &cn, False)) {
+                cn.keycode = 0;
+                cn.eventType = 0;
+                cn.requestMajor = XkbReqCode;
+                cn.requestMinor = X_kbSetControls;
+                XkbSendControlsNotify(tmpd, &cn);
+            }
+
+            sli = XkbFindSrvLedInfo(tmpd, XkbDfltXIClass, XkbDfltXIId, 0);
+            if (sli)
+                XkbUpdateIndicators(tmpd, sli->usesControls, True, NULL,
+                                    &cause);
+
+            /* If sticky keys were disabled, clear all locks and latches */
+            if ((old.enabled_ctrls & XkbStickyKeysMask) &&
+                !(ctrl->enabled_ctrls & XkbStickyKeysMask))
+                XkbClearAllLatchesAndLocks(tmpd, xkbi, True, &cause);
+        }
     }
 
     return client->noClientException;
diff-tree 7b4dc171b036107cfba87a1a16bf692b982005a5 (from ab56f0c5b516269bb99ae8b5f479e49e61a3af76)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 6 16:26:54 2006 +0300

    xkb: remove unused #ifndef

diff --git a/xkb/xkb.c b/xkb/xkb.c
index d4830b9..7a17db6 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -821,9 +821,11 @@ ProcXkbSetControls(ClientPtr client)
     if (stuff->changeCtrls&XkbPerKeyRepeatMask) {
 	memcpy(new.per_key_repeat,stuff->perKeyRepeat,XkbPerKeyBitArraySize);
     }
+
     old= *ctrl;
     *ctrl= new;
     XkbDDXChangeControls(dev,&old,ctrl);
+
     if (XkbComputeControlsNotify(dev,&old,ctrl,&cn,False)) {
 	cn.keycode= 0;
 	cn.eventType = 0;
@@ -831,15 +833,16 @@ ProcXkbSetControls(ClientPtr client)
 	cn.requestMinor = X_kbSetControls;
 	XkbSendControlsNotify(dev,&cn);
     }
+
     if ((sli= XkbFindSrvLedInfo(dev,XkbDfltXIClass,XkbDfltXIId,0))!=NULL)
 	XkbUpdateIndicators(dev,sli->usesControls,True,NULL,&cause);
-#ifndef NO_CLEAR_LATCHES_FOR_STICKY_KEYS_OFF
+
     /* If sticky keys were disabled, clear all locks and latches */
     if ((old.enabled_ctrls&XkbStickyKeysMask)&&
 	(!(ctrl->enabled_ctrls&XkbStickyKeysMask))) {
 	XkbClearAllLatchesAndLocks(dev,xkbi,True,&cause);
     }
-#endif
+
     return client->noClientException;
 }
 
diff-tree ab56f0c5b516269bb99ae8b5f479e49e61a3af76 (from 4b6e2f12f7296e17b2850f36b3adcf8156125cbe)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 6 16:12:36 2006 +0300

    xkb: simplify core device loop in GetKeyboardByName

diff --git a/xkb/xkb.c b/xkb/xkb.c
index 3052288..d4830b9 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -570,7 +570,7 @@ ProcXkbLatchLockState(ClientPtr client)
                 status = XkbLatchModifiers(tmpd, stuff->affectModLatches,
                                            stuff->modLatches);
             if (status == Success && stuff->latchGroup)
-                status = XkbLatchGroup(tmp, stuff->groupLatch);
+                status = XkbLatchGroup(tmpd, stuff->groupLatch);
 
             if (status != Success)
                 return status;
@@ -5111,6 +5111,8 @@ ProcXkbGetKbdByName(ClientPtr client)
     unsigned			fwant,fneed,reported;
     int				status;
     Bool			geom_changed;
+    XkbSrvLedInfoPtr            old_sli;
+    XkbSrvLedInfoPtr            sli;
 
     REQUEST(xkbGetKbdByNameReq);
     REQUEST_AT_LEAST_SIZE(xkbGetKbdByNameReq);
@@ -5379,45 +5381,27 @@ ProcXkbGetKbdByName(ClientPtr client)
 	}
 	xkb->ctrls->num_groups= nTG;
 
-	memcpy(dev->key->modifierMap,xkb->map->modmap,xkb->max_key_code+1);
-	XkbUpdateCoreDescription(dev,True);
-
-	if (dev->kbdfeed && dev->kbdfeed->xkb_sli) {
-            XkbSrvLedInfoPtr	old_sli;
-            XkbSrvLedInfoPtr	sli;
-            old_sli = dev->kbdfeed->xkb_sli;
-            dev->kbdfeed->xkb_sli = NULL;
-	    sli = XkbAllocSrvLedInfo(dev,dev->kbdfeed,NULL,0);
-            if (sli) {
-               sli->explicitState = old_sli->explicitState;
-               sli->effectiveState = old_sli->effectiveState;
-            }
-            dev->kbdfeed->xkb_sli = sli;
-	    XkbFreeSrvLedInfo(old_sli);
-	}
-
-        if (dev == inputInfo.keyboard) {
-            for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
-                if (tmpd->key && tmpd->coreEvents) {
-                    memcpy(tmpd->key->modifierMap, xkb->map->modmap,
-                           xkb->max_key_code + 1);
+        for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
+            if ((dev == inputInfo.keyboard && tmpd->key && tmpd->coreEvents) ||
+                tmpd == inputInfo.keyboard) {
+
+                memcpy(tmpd->key->modifierMap, xkb->map->modmap,
+                       xkb->max_key_code + 1);
+                if (dev != inputInfo.keyboard)
                     XkbCopyKeymap(dev->key->xkbInfo->desc,
                                   tmpd->key->xkbInfo->desc, True);
-                    XkbUpdateCoreDescription(tmpd, True);
+                XkbUpdateCoreDescription(tmpd, True);
 
-	            if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) {
-                        XkbSrvLedInfoPtr old_sli;
-                        XkbSrvLedInfoPtr sli;
-                        old_sli = tmpd->kbdfeed->xkb_sli;
-                        tmpd->kbdfeed->xkb_sli = NULL;
-                        sli = XkbAllocSrvLedInfo(tmpd, tmpd->kbdfeed, NULL, 0);
-                        if (sli) {
-                            sli->explicitState = old_sli->explicitState;
-                            sli->effectiveState = old_sli->effectiveState;
-                        }
-                        tmpd->kbdfeed->xkb_sli = sli;
-                        XkbFreeSrvLedInfo(old_sli);
+                if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) {
+                    old_sli = tmpd->kbdfeed->xkb_sli;
+                    tmpd->kbdfeed->xkb_sli = NULL;
+                    sli = XkbAllocSrvLedInfo(tmpd, tmpd->kbdfeed, NULL, 0);
+                    if (sli) {
+                        sli->explicitState = old_sli->explicitState;
+                        sli->effectiveState = old_sli->effectiveState;
                     }
+                    tmpd->kbdfeed->xkb_sli = sli;
+                    XkbFreeSrvLedInfo(old_sli);
                 }
             }
         }
diff-tree 4b6e2f12f7296e17b2850f36b3adcf8156125cbe (from ebf9b3bbbb04acb78cdf8a84e47a96755fbfe854)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 6 16:08:21 2006 +0300

    xkb: make LatchLockGroup work on all core-sending devices
    Apply the settings to all devices sending core events, if we're working on the
    core keyboard.

diff --git a/xkb/xkb.c b/xkb/xkb.c
index 23b9798..3052288 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -534,56 +534,67 @@ int
 ProcXkbLatchLockState(ClientPtr client)
 {
     int status;
-    DeviceIntPtr dev;
+    DeviceIntPtr dev, tmpd;
     XkbStateRec	oldState,*newState;
     CARD16 changed;
+    xkbStateNotify sn;
+    XkbEventCauseRec cause;
 
     REQUEST(xkbLatchLockStateReq);
     REQUEST_SIZE_MATCH(xkbLatchLockStateReq);
 
-    if (!(client->xkbClientFlags&_XkbClientInitialized))
+    if (!(client->xkbClientFlags & _XkbClientInitialized))
 	return BadAccess;
 
-    CHK_KBD_DEVICE(dev,stuff->deviceSpec);
-    CHK_MASK_MATCH(0x01,stuff->affectModLocks,stuff->modLocks);
-    CHK_MASK_MATCH(0x01,stuff->affectModLatches,stuff->modLatches);
+    CHK_KBD_DEVICE(dev, stuff->deviceSpec);
+    CHK_MASK_MATCH(0x01, stuff->affectModLocks, stuff->modLocks);
+    CHK_MASK_MATCH(0x01, stuff->affectModLatches, stuff->modLatches);
 
     status = Success;
-    oldState= dev->key->xkbInfo->state;
-    newState= &dev->key->xkbInfo->state;
-    if ( stuff->affectModLocks ) {
-	newState->locked_mods&= ~stuff->affectModLocks;
-	newState->locked_mods|= (stuff->affectModLocks&stuff->modLocks);
-    }
-    if (( status == Success ) && stuff->lockGroup )
-	newState->locked_group = stuff->groupLock;
-    if (( status == Success ) && stuff->affectModLatches )
-	status=XkbLatchModifiers(dev,stuff->affectModLatches,stuff->modLatches);
-    if (( status == Success ) && stuff->latchGroup )
-	status=XkbLatchGroup(dev,stuff->groupLatch);
-
-    if ( status != Success )
-	return status;
-
-    XkbComputeDerivedState(dev->key->xkbInfo);
-    dev->key->state= XkbStateFieldFromRec(newState);
 
-    changed = XkbStateChangedFlags(&oldState,newState);
-    if (changed) {
-	xkbStateNotify	sn;
-	sn.keycode= 0;
-	sn.eventType= 0;
-	sn.requestMajor = XkbReqCode;
-	sn.requestMinor = X_kbLatchLockState;
-	sn.changed= changed;
-	XkbSendStateNotify(dev,&sn);
-	changed= XkbIndicatorsToUpdate(dev,changed,False);
-	if (changed) {
-	    XkbEventCauseRec	cause;
-	    XkbSetCauseXkbReq(&cause,X_kbLatchLockState,client);
-	    XkbUpdateIndicators(dev,changed,True,NULL,&cause);
-	}
+    for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
+        if ((dev == inputInfo.keyboard && tmpd->key && tmpd->coreEvents) ||
+            tmpd == inputInfo.keyboard) {
+            if (!tmpd->key->xkbInfo)
+                continue;
+
+            oldState = tmpd->key->xkbInfo->state;
+            newState = &tmpd->key->xkbInfo->state;
+            if (stuff->affectModLocks) {
+                newState->locked_mods &= ~stuff->affectModLocks;
+                newState->locked_mods |= (stuff->affectModLocks & stuff->modLocks);
+            }
+            if (status == Success && stuff->lockGroup)
+                newState->locked_group = stuff->groupLock;
+            if (status == Success && stuff->affectModLatches)
+                status = XkbLatchModifiers(tmpd, stuff->affectModLatches,
+                                           stuff->modLatches);
+            if (status == Success && stuff->latchGroup)
+                status = XkbLatchGroup(tmp, stuff->groupLatch);
+
+            if (status != Success)
+                return status;
+
+            XkbComputeDerivedState(tmpd->key->xkbInfo);
+            tmpd->key->state = XkbStateFieldFromRec(newState);
+
+            changed = XkbStateChangedFlags(&oldState, newState);
+            if (changed) {
+                sn.keycode = 0;
+                sn.eventType = 0;
+                sn.requestMajor = XkbReqCode;
+                sn.requestMinor = X_kbLatchLockState;
+                sn.changed = changed;
+                XkbSendStateNotify(tmpd, &sn);
+                changed = XkbIndicatorsToUpdate(tmpd, changed, False);
+                if (changed) {
+                    XkbSetCauseXkbReq(&cause, X_kbLatchLockState, client);
+                    XkbUpdateIndicators(tmpd, changed, True, NULL, &cause);
+	        }
+            }
+        }
     }
+
     return client->noClientException;
 }
 
diff-tree ebf9b3bbbb04acb78cdf8a84e47a96755fbfe854 (from de63a469dcd0a8ae98554bca540ac0106cccf2a5)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Oct 6 14:17:59 2006 +0300

    xkb: update all core-sending keyboards on GetKeyboardByName
    Update the keymaps of all keyboards which send core events on
    GetKeyboardByName; still a few other procedures which need this treatment.

diff --git a/xkb/xkb.c b/xkb/xkb.c
index f892c43..23b9798 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5084,6 +5084,7 @@ int
 ProcXkbGetKbdByName(ClientPtr client)
 {
     DeviceIntPtr 		dev;
+    DeviceIntPtr                tmpd;
     XkbFileInfo			finfo;
     xkbGetKbdByNameReply 	rep;
     xkbGetMapReply		mrep;
@@ -5169,8 +5170,10 @@ ProcXkbGetKbdByName(ClientPtr client)
 	fneed|= XkmKeyNamesIndex|XkmTypesIndex;
 	fwant|= XkmIndicatorsIndex;
     }
+
+    /* We pass dev in here so we can get the old names out if needed. */
     rep.found = XkbDDXLoadKeymapByNames(dev,&names,fwant,fneed,&finfo,
-							mapFile,PATH_MAX);
+                                        mapFile,PATH_MAX);
     rep.newKeyboard= False;
     rep.pad1= rep.pad2= rep.pad3= rep.pad4= 0;
 
@@ -5382,6 +5385,34 @@ ProcXkbGetKbdByName(ClientPtr client)
 	    XkbFreeSrvLedInfo(old_sli);
 	}
 
+        if (dev == inputInfo.keyboard) {
+            for (tmpd = inputInfo.devices; tmpd; tmpd = tmpd->next) {
+                if (tmpd->key && tmpd->coreEvents) {
+                    memcpy(tmpd->key->modifierMap, xkb->map->modmap,
+                           xkb->max_key_code + 1);
+                    XkbCopyKeymap(dev->key->xkbInfo->desc,
+                                  tmpd->key->xkbInfo->desc, True);
+                    XkbUpdateCoreDescription(tmpd, True);
+
+	            if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) {
+                        XkbSrvLedInfoPtr old_sli;
+                        XkbSrvLedInfoPtr sli;
+                        old_sli = tmpd->kbdfeed->xkb_sli;
+                        tmpd->kbdfeed->xkb_sli = NULL;
+                        sli = XkbAllocSrvLedInfo(tmpd, tmpd->kbdfeed, NULL, 0);
+                        if (sli) {
+                            sli->explicitState = old_sli->explicitState;
+                            sli->effectiveState = old_sli->effectiveState;
+                        }
+                        tmpd->kbdfeed->xkb_sli = sli;
+                        XkbFreeSrvLedInfo(old_sli);
+                    }
+                }
+            }
+        }
+
+        /* this should be either a MN or an NKN, depending on whether or not
+         * the keycode range changed? */
 	nkn.deviceID= nkn.oldDeviceID= dev->id;
 	nkn.minKeyCode= finfo.xkb->min_key_code;
 	nkn.maxKeyCode= finfo.xkb->max_key_code;
diff-tree 1178796a4dff5ebf0bd9fb3cacb35be9709b41e5 (from b4659faf9b455b44ac8e691cc7a8fc00a967c80b)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Thu Oct 5 22:31:35 2006 -0700

    Add preferred modes for each output. Round vrefresh. Deliver crtc events.

diff --git a/randr/mirandr.c b/randr/mirandr.c
index 7300cfe..918e55d 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -110,7 +110,7 @@ miRandRInit (ScreenPtr pScreen)
 	return FALSE;
     if (!RROutputSetClones (output, NULL, 0))
 	return FALSE;
-    if (!RROutputSetModes (output, &mode, 1))
+    if (!RROutputSetModes (output, &mode, 1, 0))
 	return FALSE;
     if (!RROutputSetCrtcs (output, &crtc, 1))
 	return FALSE;
diff --git a/randr/randr.c b/randr/randr.c
index 4ea72e5..35f9a4c 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -406,9 +406,10 @@ CARD16
 RRVerticalRefresh (xRRModeInfo *mode)
 {
     CARD32  refresh;
-    if (!mode->hTotal || !mode->vTotal)
+    CARD32  dots = mode->hTotal * mode->vTotal;
+    if (!dots)
 	return 0;
-    refresh = mode->dotClock / (mode->hTotal * mode->vTotal);
+    refresh = (mode->dotClock + dots/2) / dots;
     if (refresh > 0xffff)
 	refresh = 0xffff;
     return (CARD16) refresh;
diff --git a/randr/randrstr.h b/randr/randrstr.h
index a4e5589..6690556 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -80,6 +80,7 @@ struct _rrMode {
     char	    *name;
     void	    *devPrivate;
     ScreenPtr	    screen;
+    Bool	    userDefined;
 };
 
 struct _rrCrtc {
@@ -114,6 +115,7 @@ struct _rrOutput {
     int		    numClones;
     RROutputPtr	    *clones;
     int		    numModes;
+    int		    numPreferred;
     RRModePtr	    *modes;
     Bool	    changed;
     PropertyPtr	    properties;
@@ -144,6 +146,10 @@ typedef Bool (*RRCrtcSetProcPtr) (Screen
 typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr	pScreen,
 				       RRCrtcPtr	crtc);
 
+typedef Bool (*RROutputSetPropertyProcPtr) (ScreenPtr	pScreen,
+					    RROutputPtr	output,
+					    Atom	property);
+
 #endif
 
 typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations);
@@ -187,6 +193,7 @@ typedef struct _rrScrPriv {
     RRScreenSetSizeProcPtr  rrScreenSetSize;
     RRCrtcSetProcPtr	    rrCrtcSet;
     RRCrtcSetGammaProcPtr   rrCrtcSetGamma;
+    RROutputSetPropertyProcPtr	rrOutputSetProperty;
 #endif
     
     /*
@@ -589,7 +596,8 @@ RROutputSetClones (RROutputPtr  output,
 Bool
 RROutputSetModes (RROutputPtr	output,
 		  RRModePtr	*modes,
-		  int		numModes);
+		  int		numModes,
+		  int		numPreferred);
 
 Bool
 RROutputSetCrtcs (RROutputPtr	output,
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 3108f14..baefd3a 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -88,9 +88,41 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
     ScreenPtr	pScreen = crtc->pScreen;
     rrScrPriv(pScreen);
     int	    i, j;
-    int	    prevNumOutputs = crtc->numOutputs;
     
-    if (numOutputs != prevNumOutputs)
+    /*
+     * Check to see if any of the new outputs were
+     * not in the old list and mark them as changed
+     */
+    for (i = 0; i < numOutputs; i++)
+    {
+	for (j = 0; j < crtc->numOutputs; j++)
+	    if (outputs[i] == crtc->outputs[j])
+		break;
+	if (j == crtc->numOutputs)
+	{
+	    outputs[i]->changed = TRUE;
+	    crtc->changed = TRUE;
+	}
+    }
+    /*
+     * Check to see if any of the old outputs are
+     * not in the new list and mark them as changed
+     */
+    for (j = 0; j < crtc->numOutputs; j++)
+    {
+	for (i = 0; i < numOutputs; i++)
+	    if (outputs[i] == crtc->outputs[j])
+		break;
+	if (i == numOutputs)
+	{
+	    crtc->outputs[j]->changed = TRUE;
+	    crtc->changed = TRUE;
+	}
+    }
+    /*
+     * Reallocate the crtc output array if necessary
+     */
+    if (numOutputs != crtc->numOutputs)
     {
 	RROutputPtr *newoutputs;
 	
@@ -113,28 +145,13 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	crtc->outputs = newoutputs;
 	crtc->numOutputs = numOutputs;
     }
-    for (i = 0; i < numOutputs; i++)
-    {
-	for (j = 0; j < crtc->numOutputs; j++)
-	    if (outputs[i] == crtc->outputs[j])
-		break;
-	if (j != crtc->numOutputs)
-	{
-	    outputs[i]->changed = TRUE;
-	    crtc->changed = TRUE;
-	}
-    }
-    for (j = 0; j < crtc->numOutputs; j++)
-    {
-	for (i = 0; i < numOutputs; i++)
-	    if (outputs[i] == crtc->outputs[j])
-		break;
-	if (i != numOutputs)
-	{
-	    crtc->outputs[j]->changed = TRUE;
-	    crtc->changed = TRUE;
-	}
-    }
+    /*
+     * Copy the new list of outputs into the crtc
+     */
+    memcpy (crtc->outputs, outputs, numOutputs * sizeof (RROutputPtr));
+    /*
+     * Update remaining crtc fields
+     */
     if (mode != crtc->mode)
     {
 	if (crtc->mode)
@@ -158,6 +175,9 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	crtc->rotation = rotation;
 	crtc->changed = TRUE;
     }
+    /*
+     * Send events if anything changed
+     */
     if (crtc->changed)
     {
 	if (!pScrPriv->changed)
@@ -170,7 +190,35 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 void
 RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
 {
-    
+    ScreenPtr pScreen = pWin->drawable.pScreen;
+    rrScrPriv (pScreen);
+    xRRCrtcChangeNotifyEvent	ce;
+    RRModePtr	mode = crtc->mode;
+    
+    ce.type = RRNotify + RREventBase;
+    ce.subCode = RRNotify_CrtcChange;
+    ce.sequenceNumber = client->sequence;
+    ce.timestamp = pScrPriv->lastSetTime.milliseconds;
+    ce.window = pWin->drawable.id;
+    ce.crtc = crtc->id;
+    ce.rotation = crtc->rotation;
+    if (mode)
+    {
+	ce.mode = mode->mode.id;
+	ce.x = crtc->x;
+	ce.y = crtc->y;
+	ce.width = mode->mode.width;
+	ce.height = mode->mode.height;
+    }
+    else
+    {
+	ce.mode = None;
+	ce.x = 0;
+	ce.y = 0;
+	ce.width = 0;
+	ce.height = 0;
+    }
+    WriteEventsToClient (client, 1, (xEvent *) &ce);
 }
 
 /*
@@ -381,7 +429,7 @@ ProcRRGetCrtcInfo (ClientPtr client)
     rep.y = crtc->y;
     rep.width = mode ? mode->mode.width : 0;
     rep.height = mode ? mode->mode.height : 0;
-    rep.mode = mode->mode.id;
+    rep.mode = mode ? mode->mode.id : 0;
     rep.rotation = crtc->rotation;
     rep.rotations = crtc->rotations;
     rep.nOutput = crtc->numOutputs;
@@ -572,30 +620,30 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	goto sendReply;
     }
     
-    if (mode)
-    {
+    /*
+     * Validate requested rotation
+     */
+    rotation = (Rotation) stuff->rotation;
+
+    /* test the rotation bits only! */
+    switch (rotation & 0xf) {
+    case RR_Rotate_0:
+    case RR_Rotate_90:
+    case RR_Rotate_180:
+    case RR_Rotate_270:
+	break;
+    default:
 	/*
-	 * Validate requested rotation
+	 * Invalid rotation
 	 */
-	rotation = (Rotation) stuff->rotation;
-    
-	/* test the rotation bits only! */
-	switch (rotation & 0xf) {
-	case RR_Rotate_0:
-	case RR_Rotate_90:
-	case RR_Rotate_180:
-	case RR_Rotate_270:
-	    break;
-	default:
-	    /*
-	     * Invalid rotation
-	     */
-	    client->errorValue = stuff->rotation;
-	    if (outputs)
-		xfree (outputs);
-	    return BadValue;
-	}
-    
+	client->errorValue = stuff->rotation;
+	if (outputs)
+	    xfree (outputs);
+	return BadValue;
+    }
+
+    if (mode)
+    {
 	if ((~crtc->rotations) & rotation)
 	{
 	    /*
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 3a67486..07cd0c1 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -41,7 +41,6 @@ RRModeEqual (xRRModeInfo *a, xRRModeInfo
     if (a->vTotal != b->vTotal) return FALSE;
     if (a->nameLength != b->nameLength) return FALSE;
     if (a->modeFlags != b->modeFlags) return FALSE;
-    if (a->origin != b->origin) return FALSE;
     return TRUE;
 }
 
@@ -75,6 +74,7 @@ RRModeGet (ScreenPtr	pScreen,
     memcpy (mode->name, name, modeInfo->nameLength);
     mode->name[modeInfo->nameLength] = '\0';
     mode->screen = pScreen;
+    mode->userDefined = FALSE;
 
     if (pScrPriv->numModes)
 	modes = xrealloc (pScrPriv->modes,
@@ -162,7 +162,7 @@ RRModePruneUnused (ScreenPtr pScreen)
     memcpy (unused, pScrPriv->modes, num * sizeof (RRModePtr));
     for (m = 0; m < num; m++) {
 	mode = unused[m];
-	if (mode->refcnt == 1 && mode->mode.origin != RRModeOriginUser)
+	if (mode->refcnt == 1 && !mode->userDefined)
 	    FreeResource (mode->mode.id, 0);
     }
     xfree (unused);
diff --git a/randr/rroutput.c b/randr/rroutput.c
index b252d7d..618ef1f 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -67,6 +67,7 @@ RROutputCreate (ScreenPtr   pScreen,
     output->numClones = 0;
     output->clones = NULL;
     output->numModes = 0;
+    output->numPreferred = 0;
     output->modes = NULL;
     output->properties = NULL;
     output->changed = TRUE;
@@ -120,12 +121,13 @@ RROutputSetClones (RROutputPtr  output,
 Bool
 RROutputSetModes (RROutputPtr	output,
 		  RRModePtr	*modes,
-		  int		numModes)
+		  int		numModes,
+		  int		numPreferred)
 {
     RRModePtr	*newModes;
     int		i;
 
-    if (numModes == output->numModes)
+    if (numModes == output->numModes && numPreferred == output->numPreferred)
     {
 	for (i = 0; i < numModes; i++)
 	    if (output->modes[i] != modes[i])
@@ -155,6 +157,7 @@ RROutputSetModes (RROutputPtr	output,
     memcpy (newModes, modes, numModes * sizeof (RRModePtr));
     output->modes = newModes;
     output->numModes = numModes;
+    output->numPreferred = numPreferred;
     output->changed = TRUE;
     return TRUE;
 }
@@ -341,10 +344,10 @@ ProcRRGetOutputInfo (ClientPtr client)
     rep.subpixelOrder = output->subpixelOrder;
     rep.nCrtcs = output->numCrtcs;
     rep.nModes = output->numModes;
+    rep.nPreferred = output->numPreferred;
     rep.nClones = output->numClones;
     rep.nameLength = output->nameLength;
     rep.possibleOptions = output->possibleOptions;
-    rep.pad1 = 42;
     
     extraLen = ((output->numCrtcs + 
 		 output->numModes + 
diff-tree de63a469dcd0a8ae98554bca540ac0106cccf2a5 (from parents)
Merge: 9c7440bdf5a4ecd113e102004c804a2ba354c422 8382234a7f318057de66490299d63807cefb5201
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Oct 5 20:29:19 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree b4659faf9b455b44ac8e691cc7a8fc00a967c80b (from parents)
Merge: c4f30c63538e1451f15ed1991439869127d9b148 8382234a7f318057de66490299d63807cefb5201
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Wed Oct 4 14:46:04 2006 -0700

    Merge branch 'master' into randr-1.2

diff-tree c4f30c63538e1451f15ed1991439869127d9b148 (from b36fde9257263fa502147df37e8331184c323e14)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Tue Oct 3 21:06:11 2006 -0700

    Add mode origins and output options. Fix memmoves in resource free funcs.
    
    Output options and mode origins both affected driver ABI.  memmove mistakes
    were causing 'Freeing resource which isn't there' messages.
    
    Prune unused non-user defined modes from available list now.

diff --git a/randr/mirandr.c b/randr/mirandr.c
index bcc8e0f..7300cfe 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -52,7 +52,7 @@ miRRCrtcSet (ScreenPtr	pScreen,
 	     int	y,
 	     Rotation	rotation,
 	     int	numOutput,
-	     RROutputPtr    *outputs)
+	     RROutputConfigPtr    outputs)
 {
     return TRUE;
 }
@@ -114,6 +114,10 @@ miRandRInit (ScreenPtr pScreen)
 	return FALSE;
     if (!RROutputSetCrtcs (output, &crtc, 1))
 	return FALSE;
+    if (!RROutputSetPossibleOptions (output, 0))
+	return FALSE;
+    if (!RROutputSetCurrentOptions (output, 0))
+	return FALSE;
     if (!RROutputSetConnection (output, RR_Connected))
 	return FALSE;
     RRCrtcNotify (crtc, mode, 0, 0, RR_Rotate_0, 1, &output);
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 0b8c61e..a4e5589 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -72,12 +72,14 @@ extern int (*SProcRandrVector[RRNumberRe
 typedef struct _rrMode	    RRModeRec, *RRModePtr;
 typedef struct _rrCrtc	    RRCrtcRec, *RRCrtcPtr;
 typedef struct _rrOutput    RROutputRec, *RROutputPtr;
+typedef struct _rrOutputConfig	RROutputConfigRec, *RROutputConfigPtr;
 
 struct _rrMode {
     int		    refcnt;
     xRRModeInfo	    mode;
     char	    *name;
     void	    *devPrivate;
+    ScreenPtr	    screen;
 };
 
 struct _rrCrtc {
@@ -105,6 +107,8 @@ struct _rrOutput {
     CARD8	    connection;
     CARD8	    subpixelOrder;
     RRCrtcPtr	    crtc;
+    CARD32	    currentOptions;
+    CARD32	    possibleOptions;
     int		    numCrtcs;
     RRCrtcPtr	    *crtcs;
     int		    numClones;
@@ -116,6 +120,11 @@ struct _rrOutput {
     void	    *devPrivate;
 };
 
+struct _rrOutputConfig {
+    RROutputPtr	    output;
+    CARD32	    options;
+};
+
 #if RANDR_12_INTERFACE
 typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr	pScreen,
 					CARD16		width,
@@ -130,7 +139,7 @@ typedef Bool (*RRCrtcSetProcPtr) (Screen
 				  int			y,
 				  Rotation		rotation,
 				  int			numOutputs,
-				  RROutputPtr		*outputs);
+				  RROutputConfigPtr	outputs);
 
 typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr	pScreen,
 				       RRCrtcPtr	crtc);
@@ -352,7 +361,7 @@ miRRCrtcSet (ScreenPtr	pScreen,
 	     int	y,
 	     Rotation	rotation,
 	     int	numOutput,
-	     RROutputPtr    *outputs);
+	     RROutputConfigPtr    outputs);
 
 /* randr.c */
 /*
@@ -440,7 +449,7 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	      int	    x,
 	      int	    y,
 	      Rotation	    rotation,
-	      int	    numOutput,
+	      int	    numOutputs,
 	      RROutputPtr   *outputs);
 
 void
@@ -456,7 +465,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	   int		y,
 	   Rotation	rotation,
 	   int		numOutput,
-	   RROutputPtr  *outputs);
+	   RROutputConfigPtr  outputs);
 
 /*
  * Request that the Crtc gamma be changed
@@ -530,6 +539,9 @@ RRModeGet (ScreenPtr	pScreen,
 	   xRRModeInfo	*modeInfo,
 	   const char	*name);
 
+void
+RRModePruneUnused (ScreenPtr pScreen);
+
 /*
  * Destroy a mode.
  */
@@ -584,6 +596,10 @@ RROutputSetCrtcs (RROutputPtr	output,
 		  RRCrtcPtr	*crtcs,
 		  int		numCrtcs);
 
+Bool
+RROutputSetPossibleOptions (RROutputPtr	output,
+			    CARD32	possibleOptions);
+
 void
 RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc);
     
@@ -595,6 +611,10 @@ Bool
 RROutputSetSubpixelOrder (RROutputPtr output,
 			  int	      subpixelOrder);
 
+Bool
+RROutputSetCurrentOptions (RROutputPtr output,
+			   CARD32      currentOptions);
+
 void
 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output);
 
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 77cba29..3108f14 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -92,25 +92,25 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
     
     if (numOutputs != prevNumOutputs)
     {
-	RROutputPtr *outputs;
+	RROutputPtr *newoutputs;
 	
 	if (numOutputs)
 	{
 	    if (crtc->numOutputs)
-		outputs = xrealloc (crtc->outputs,
+		newoutputs = xrealloc (crtc->outputs,
 				    numOutputs * sizeof (RROutputPtr));
 	    else
-		outputs = xalloc (numOutputs * sizeof (RROutputPtr));
-	    if (!outputs)
+		newoutputs = xalloc (numOutputs * sizeof (RROutputPtr));
+	    if (!newoutputs)
 		return FALSE;
 	}
 	else
 	{
 	    if (crtc->outputs)
 		xfree (crtc->outputs);
-	    outputs = NULL;
+	    newoutputs = NULL;
 	}
-	crtc->outputs = outputs;
+	crtc->outputs = newoutputs;
 	crtc->numOutputs = numOutputs;
     }
     for (i = 0; i < numOutputs; i++)
@@ -183,7 +183,7 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	   int		y,
 	   Rotation	rotation,
 	   int		numOutputs,
-	   RROutputPtr  *outputs)
+	   RROutputConfigPtr  outputs)
 {
     ScreenPtr	pScreen = crtc->pScreen;
     rrScrPriv(pScreen);
@@ -252,7 +252,7 @@ RRCrtcDestroyResource (pointer value, XI
     {
 	if (pScrPriv->crtcs[i] == crtc)
 	{
-	    memmove (pScrPriv->crtcs, pScrPriv->crtcs + 1,
+	    memmove (pScrPriv->crtcs + i, pScrPriv->crtcs + i + 1,
 		     (pScrPriv->numCrtcs - (i - 1)) * sizeof (RRCrtcPtr));
 	    --pScrPriv->numCrtcs;
 	    break;
@@ -458,15 +458,15 @@ ProcRRSetCrtcConfig (ClientPtr client)
     RRCrtcPtr		    crtc;
     RRModePtr		    mode;
     int			    numOutputs;
-    RROutputPtr		    *outputs = NULL;
-    RROutput		    *outputIds;
+    RROutputConfigPtr	    outputs = NULL;
+    xRROutputConfig 	    *outputConfigs;
     TimeStamp		    configTime;
     TimeStamp		    time;
     Rotation		    rotation;
     int			    i, j;
     
     REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
-    numOutputs = stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2);
+    numOutputs = (stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2)) >> 1;
     
     crtc = LookupIDByType (stuff->crtc, RRCrtcType);
     if (!crtc)
@@ -493,39 +493,47 @@ ProcRRSetCrtcConfig (ClientPtr client)
     }
     if (numOutputs)
     {
-	outputs = xalloc (numOutputs * sizeof (RROutputPtr));
+	outputs = xalloc (numOutputs * sizeof (RROutputConfigRec));
 	if (!outputs)
 	    return BadAlloc;
     }
     else
 	outputs = NULL;
     
-    outputIds = (RROutput *) (stuff + 1);
+    outputConfigs = (xRROutputConfig *) (stuff + 1);
     for (i = 0; i < numOutputs; i++)
     {
-	outputs[i] = LookupIDByType (outputIds[i], RROutputType);
-	if (!outputs[i])
+	outputs[i].output = LookupIDByType (outputConfigs[i].output, RROutputType);
+	if (!outputs[i].output)
 	{
-	    client->errorValue = outputIds[i];
+	    client->errorValue = outputConfigs[i].output;
 	    if (outputs)
 		xfree (outputs);
 	    return RRErrorBase + BadRROutput;
 	}
+	outputs[i].options = outputConfigs[i].options;
+	if (outputs[i].options & ~outputs[i].output->possibleOptions)
+	{
+	    client->errorValue = outputConfigs[i].options;
+	    if (outputs)
+		xfree (outputs);
+	    return BadMatch;
+	}
 	/* validate crtc for this output */
-	for (j = 0; j < outputs[i]->numCrtcs; j++)
-	    if (outputs[i]->crtcs[j] == crtc)
+	for (j = 0; j < outputs[i].output->numCrtcs; j++)
+	    if (outputs[i].output->crtcs[j] == crtc)
 		break;
-	if (j == outputs[j]->numCrtcs)
+	if (j == outputs[j].output->numCrtcs)
 	{
 	    if (outputs)
 		xfree (outputs);
 	    return BadMatch;
 	}
 	/* validate mode for this output */
-	for (j = 0; j < outputs[i]->numModes; j++)
-	    if (outputs[i]->modes[j] == mode)
+	for (j = 0; j < outputs[i].output->numModes; j++)
+	    if (outputs[i].output->modes[j] == mode)
 		break;
-	if (j == outputs[i]->numModes)
+	if (j == outputs[i].output->numModes)
 	{
 	    if (outputs)
 		xfree (outputs);
diff --git a/randr/rrinfo.c b/randr/rrinfo.c
index 491ac21..6fd4ee5 100644
--- a/randr/rrinfo.c
+++ b/randr/rrinfo.c
@@ -208,6 +208,7 @@ RRGetInfo (ScreenPtr pScreen)
     if (pScrPriv->nSizes)
 	RRScanOldConfig (pScreen, rotations);
 #endif
+    RRModePruneUnused (pScreen);
     RRTellChanged (pScreen);
     return TRUE;
 }
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 23ac530..3a67486 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -24,6 +24,27 @@
 
 RESTYPE	RRModeType;
 
+static Bool
+RRModeEqual (xRRModeInfo *a, xRRModeInfo *b)
+{
+    if (a->width != b->width) return FALSE;
+    if (a->height != b->height) return FALSE;
+    if (a->mmWidth != b->mmWidth) return FALSE;
+    if (a->mmHeight != b->mmHeight) return FALSE;
+    if (a->dotClock != b->dotClock) return FALSE;
+    if (a->hSyncStart != b->hSyncStart) return FALSE;
+    if (a->hSyncEnd != b->hSyncEnd) return FALSE;
+    if (a->hTotal != b->hTotal) return FALSE;
+    if (a->hSkew != b->hSkew) return FALSE;
+    if (a->vSyncStart != b->vSyncStart) return FALSE;
+    if (a->vSyncEnd != b->vSyncEnd) return FALSE;
+    if (a->vTotal != b->vTotal) return FALSE;
+    if (a->nameLength != b->nameLength) return FALSE;
+    if (a->modeFlags != b->modeFlags) return FALSE;
+    if (a->origin != b->origin) return FALSE;
+    return TRUE;
+}
+
 RRModePtr
 RRModeGet (ScreenPtr	pScreen,
 	   xRRModeInfo	*modeInfo,
@@ -37,8 +58,7 @@ RRModeGet (ScreenPtr	pScreen,
     for (i = 0; i < pScrPriv->numModes; i++)
     {
 	mode = pScrPriv->modes[i];
-	modeInfo->id = mode->mode.id;
-	if (!memcmp (modeInfo, &mode->mode, sizeof (xRRModeInfo)) &&
+	if (RRModeEqual (&mode->mode, modeInfo) &&
 	    !memcmp (name, mode->name, modeInfo->nameLength))
 	{
 	    ++mode->refcnt;
@@ -54,6 +74,7 @@ RRModeGet (ScreenPtr	pScreen,
     mode->name = (char *) (mode + 1);
     memcpy (mode->name, name, modeInfo->nameLength);
     mode->name[modeInfo->nameLength] = '\0';
+    mode->screen = pScreen;
 
     if (pScrPriv->numModes)
 	modes = xrealloc (pScrPriv->modes,
@@ -80,8 +101,31 @@ RRModeGet (ScreenPtr	pScreen,
 void
 RRModeDestroy (RRModePtr mode)
 {
+    ScreenPtr	    pScreen;
+    rrScrPrivPtr    pScrPriv;
+    int	m;
+    
     if (--mode->refcnt > 0)
 	return;
+    pScreen = mode->screen;
+    pScrPriv = rrGetScrPriv (pScreen);
+    for (m = 0; m < pScrPriv->numModes; m++)
+    {
+	if (pScrPriv->modes[m] == mode)
+	{
+	    memmove (pScrPriv->modes + m, pScrPriv->modes + m + 1,
+		     (pScrPriv->numModes - m - 1) * sizeof (RRModePtr));
+	    pScrPriv->numModes--;
+	    if (!pScrPriv->numModes)
+	    {
+		xfree (pScrPriv->modes);
+		pScrPriv->modes = NULL;
+	    }
+	    pScrPriv->changed = TRUE;
+	    break;
+	}
+    }
+    
     xfree (mode);
 }
 
@@ -104,6 +148,26 @@ RRModeInit (void)
     return TRUE;
 }
 
+void
+RRModePruneUnused (ScreenPtr pScreen)
+{
+    rrScrPriv (pScreen);
+    RRModePtr	*unused, mode;
+    int		m;
+    int		num = pScrPriv->numModes;
+
+    unused = xalloc (num * sizeof (RRModePtr));
+    if (!unused)
+	return;
+    memcpy (unused, pScrPriv->modes, num * sizeof (RRModePtr));
+    for (m = 0; m < num; m++) {
+	mode = unused[m];
+	if (mode->refcnt == 1 && mode->mode.origin != RRModeOriginUser)
+	    FreeResource (mode->mode.id, 0);
+    }
+    xfree (unused);
+}
+
 int
 ProcRRCreateMode (ClientPtr client)
 {
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 90b2b98..b252d7d 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -60,6 +60,8 @@ RROutputCreate (ScreenPtr   pScreen,
     output->connection = RR_UnknownConnection;
     output->subpixelOrder = SubPixelUnknown;
     output->crtc = NULL;
+    output->currentOptions = 0;
+    output->possibleOptions = 0;
     output->numCrtcs = 0;
     output->crtcs = NULL;
     output->numClones = 0;
@@ -190,6 +192,17 @@ RROutputSetCrtcs (RROutputPtr	output,
     return TRUE;
 }
 
+Bool
+RROutputSetPossibleOptions (RROutputPtr	output,
+			    CARD32	possibleOptions)
+{
+    if (output->possibleOptions == possibleOptions)
+	return TRUE;
+    output->possibleOptions = possibleOptions;
+    output->changed = TRUE;
+    return TRUE;
+}
+
 void
 RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc)
 {
@@ -222,6 +235,17 @@ RROutputSetSubpixelOrder (RROutputPtr ou
     return TRUE;
 }
 
+Bool
+RROutputSetCurrentOptions (RROutputPtr output,
+			   CARD32      currentOptions)
+{
+    if (output->currentOptions == currentOptions)
+	return TRUE;
+    output->currentOptions = currentOptions;
+    output->changed = TRUE;
+    return TRUE;
+}
+
 void
 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output)
 {
@@ -248,7 +272,7 @@ RROutputDestroyResource (pointer value, 
     {
 	if (pScrPriv->outputs[i] == output)
 	{
-	    memmove (pScrPriv->outputs, pScrPriv->outputs + 1,
+	    memmove (pScrPriv->outputs + i, pScrPriv->outputs + i + 1,
 		     (pScrPriv->numOutputs - (i - 1)) * sizeof (RROutputPtr));
 	    --pScrPriv->numOutputs;
 	    break;
@@ -280,6 +304,8 @@ RROutputInit (void)
     return TRUE;
 }
 
+#define OutputInfoExtra	(SIZEOF(xRRGetOutputInfoReply) - 32)
+				
 int
 ProcRRGetOutputInfo (ClientPtr client)
 {
@@ -307,24 +333,27 @@ ProcRRGetOutputInfo (ClientPtr client)
 
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.length = 0;
+    rep.length = OutputInfoExtra >> 2;
     rep.timestamp = pScrPriv->lastSetTime.milliseconds;
     rep.crtc = output->crtc ? output->crtc->id : None;
+    rep.currentOptions = output->currentOptions;
     rep.connection = output->connection;
     rep.subpixelOrder = output->subpixelOrder;
     rep.nCrtcs = output->numCrtcs;
     rep.nModes = output->numModes;
     rep.nClones = output->numClones;
     rep.nameLength = output->nameLength;
+    rep.possibleOptions = output->possibleOptions;
+    rep.pad1 = 42;
     
-    rep.length = (output->numCrtcs + 
-		  output->numModes + 
-		  output->numClones +
-		  ((rep.nameLength + 3) >> 2));
+    extraLen = ((output->numCrtcs + 
+		 output->numModes + 
+		 output->numClones +
+		 ((rep.nameLength + 3) >> 2)) << 2);
 
-    extraLen = rep.length << 2;
     if (extraLen)
     {
+	rep.length += extraLen >> 2;
 	extra = xalloc (extraLen);
 	if (!extra)
 	    return BadAlloc;
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index e382540..7b53f04 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -372,7 +372,7 @@ ProcRRGetScreenResources (ClientPtr clie
 
 	rep.length = (pScrPriv->numCrtcs + 
 		      pScrPriv->numOutputs + 
-		      pScrPriv->numModes * 10 +
+		      pScrPriv->numModes * (SIZEOF(xRRModeInfo) >> 2) +
 		      ((rep.nbytesNames + 3) >> 2));
 	
 	extraLen = rep.length << 2;
@@ -429,7 +429,7 @@ ProcRRGetScreenResources (ClientPtr clie
 		    pScrPriv->modes[i]->mode.nameLength);
 	    names += pScrPriv->modes[i]->mode.nameLength;
 	}
-	assert ((names + 3 >> 3) == rep.length);
+	assert (((((char *) names - (char *) extra) + 3) >> 2) == rep.length);
     }
     
     if (client->swapped) {
@@ -694,7 +694,7 @@ ProcRRSetScreenConfig (ClientPtr client)
     Rotation		    rotation;
     int			    rate;
     Bool		    has_rate;
-    RROutputPtr		    output;
+    RROutputConfigRec	    output;
     RRModePtr		    mode;
     RR10DataPtr		    pData = NULL;
     RRScreenSizePtr    	    pSize;
@@ -731,13 +731,14 @@ ProcRRSetScreenConfig (ClientPtr client)
     if (!RRGetInfo (pScreen))
 	return BadAlloc;
     
-    output = RRFirstOutput (pScreen);
-    if (!output)
+    output.output = RRFirstOutput (pScreen);
+    if (!output.output)
     {
 	time = currentTime;
 	rep.status = RRSetConfigFailed;
 	goto sendReply;
     }
+    output.options = output.output->currentOptions;
     
     /*
      * if the client's config timestamp is not the same as the last config
@@ -750,7 +751,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	goto sendReply;
     }
     
-    pData = RR10GetData (pScreen, output);
+    pData = RR10GetData (pScreen, output.output);
     if (!pData)
 	return BadAlloc;
     
@@ -786,7 +787,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	return BadValue;
     }
 
-    if ((~output->crtc->rotations) & rotation)
+    if ((~output.output->crtc->rotations) & rotation)
     {
 	/*
 	 * requested rotation or reflection not supported by screen
@@ -835,7 +836,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	goto sendReply;
     }
 
-    rep.status = RRCrtcSet (output->crtc, mode, 0, 0, stuff->rotation,
+    rep.status = RRCrtcSet (output.output->crtc, mode, 0, 0, stuff->rotation,
 			    1, &output);
     
 sendReply:
diff-tree 9c7440bdf5a4ecd113e102004c804a2ba354c422 (from 3c98cebb6e954855528794fec46830f456cbdec1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 2 20:58:33 2006 +0300

    xkb: remove the world's most staggeringly broken vendor workaround
    Certain versions of LynxOS needed to sleep up to five seconds for closing a
    pipe to actually, y'know, be useful.

diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index 5795f8b..6e8f892 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -403,30 +403,6 @@ char tmpname[PATH_MAX];
 		strncpy(nameRtrn,keymap,nameRtrnLen);
 		nameRtrn[nameRtrnLen-1]= '\0';
 	    }
-#if defined(Lynx) && defined(__i386__) && defined(NEED_POPEN_WORKAROUND)
-	/* somehow popen/pclose is broken on LynxOS AT 2.3.0/2.4.0!
-	 * the problem usually shows up with XF86Setup
-	 * this hack waits at max 5 seconds after pclose() returns
-	 * for the output of the xkbcomp output file.
-	 * I didn't manage to get a patch in time for the 3.2 release
-	 */
-            {
-		int i;
-		char name[PATH_MAX];
-                if (XkbBaseDirectory!=NULL)
-		    sprintf(name,"%s/%s%s.xkm", XkbBaseDirectory
-			,xkm_output_dir, keymap);
-		else
-                    sprintf(name,"%s%s.xkm", xkm_output_dir, keymap);
-		for (i = 0; i < 10; i++) {
-	            if (access(name, 0) == 0) break;
-		    usleep(500000);
-		}
-#ifdef DEBUG
-		if (i) ErrorF(">>>> Waited %d times for %s\n", i, name);
-#endif
-	    }
-#endif
             if (buf != NULL)
                 xfree (buf);
 	    return True;
diff-tree 3c98cebb6e954855528794fec46830f456cbdec1 (from parents)
Merge: fa1ac94178cf976d4c8dae9a4dc8703303a62d4b 2cf1098436d6b4382d9ed3f6b88214d37bdd8ddb
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 2 02:18:17 2006 +0300

    Merge branch 'input-hotplug' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree fa1ac94178cf976d4c8dae9a4dc8703303a62d4b (from c31672e6aab168262bd7824a8082ecdf841fc3c0)
Author: Ivan Pascal <pascal at info.tsu.ru>
Date:   Mon Oct 2 02:17:14 2006 +0300

    xkb: fix wrapping when switching between groups
    Use XkbCharToInt as that's what we're doing.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index ee0abbe..26ff35e 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -754,12 +754,12 @@ unsigned char	grp;
 
 
     grp= state->locked_group;
-    if (grp>=ctrls->num_groups || grp < 0)
-	state->locked_group= XkbAdjustGroup(grp,ctrls);
+    if (grp>=ctrls->num_groups)
+	state->locked_group= XkbAdjustGroup(XkbCharToInt(grp),ctrls);
 
     grp= state->locked_group+state->base_group+state->latched_group;
-    if (grp>=ctrls->num_groups || grp < 0)
-	 state->group= XkbAdjustGroup(grp,ctrls);
+    if (grp>=ctrls->num_groups)
+	 state->group= XkbAdjustGroup(XkbCharToInt(grp),ctrls);
     else state->group= grp;
     XkbComputeCompatState(xkbi);
     return;
diff-tree c31672e6aab168262bd7824a8082ecdf841fc3c0 (from 84eb2c0a06de60e88e14bb03fabe661d7cd8f1d3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Oct 2 02:15:36 2006 +0300

    symlink-mesa.sh: expand *.{c,h}

diff --git a/GL/symlink-mesa.sh b/GL/symlink-mesa.sh
index 88dddfc..c14c683 100755
--- a/GL/symlink-mesa.sh
+++ b/GL/symlink-mesa.sh
@@ -62,7 +62,7 @@ symlink_mesa_glapi() {
     src_dir src/mesa/glapi
     dst_dir mesa/glapi
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -71,7 +71,7 @@ symlink_mesa_main() {
     src_dir src/mesa/main
     dst_dir mesa/main
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -80,7 +80,7 @@ symlink_mesa_math() {
     src_dir src/mesa/math
     dst_dir mesa/math
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -89,7 +89,7 @@ symlink_mesa_ac() {
     src_dir src/mesa/array_cache
     dst_dir mesa/array_cache
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -98,7 +98,7 @@ symlink_mesa_swrast() {
     src_dir src/mesa/swrast
     dst_dir mesa/swrast
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -107,7 +107,7 @@ symlink_mesa_ss() {
     src_dir src/mesa/swrast_setup
     dst_dir mesa/swrast_setup
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -116,7 +116,7 @@ symlink_mesa_tnl() {
     src_dir src/mesa/tnl
     dst_dir mesa/tnl
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -125,7 +125,7 @@ symlink_mesa_shader() {
     src_dir src/mesa/shader
     dst_dir mesa/shader
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -134,7 +134,7 @@ symlink_mesa_shader_grammar() {
     src_dir src/mesa/shader/grammar
     dst_dir mesa/shader/grammar
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -143,7 +143,7 @@ symlink_mesa_shader_slang() {
     src_dir src/mesa/shader/slang
     dst_dir mesa/shader/slang
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }
@@ -152,7 +152,7 @@ symlink_mesa_shader_slang_library() {
     src_dir src/mesa/shader/slang/library
     dst_dir mesa/shader/slang/library
 
-    for src in $REAL_SRC_DIR/*.{c,h}; do
+    for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do
         action `basename $src`
     done
 }        
diff-tree 2cf1098436d6b4382d9ed3f6b88214d37bdd8ddb (from 518db35ca3f569e7cb95dbddeddb93f3691de498)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Sep 30 17:05:46 2006 +0300

    dix/events, mi/eq: remove utterly ridiculous debugging
    Remove debugging which can cause long-lived Xorg logs to grow well above 1GB
    if built with --enable-debug.

diff --git a/dix/events.c b/dix/events.c
index 34ee9fb..c95a942 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -211,9 +211,6 @@ _X_EXPORT CallbackListPtr DeviceEventCal
 Mask DontPropagateMasks[DNPMCOUNT];
 static int DontPropagateRefCnts[DNPMCOUNT];
 
-#ifdef DEBUG
-static int debug_events = 0;
-#endif
 _X_EXPORT InputInfo inputInfo;
 
 static struct {
@@ -1536,9 +1533,8 @@ TryClientEvents (ClientPtr client, xEven
     int i;
     int type;
 
-#ifdef DEBUG
-    if (debug_events) ErrorF(
-	"Event([%d, %d], mask=0x%x), client=%d",
+#ifdef DEBUG_EVENTS
+    ErrorF("Event([%d, %d], mask=0x%x), client=%d",
 	pEvents->u.u.type, pEvents->u.u.detail, mask, client->index);
 #endif
     if ((client) && (client != serverClient) && (!client->clientGone) &&
@@ -1554,9 +1550,9 @@ TryClientEvents (ClientPtr client, xEven
 		if (WID(inputInfo.pointer->valuator->motionHintWindow) ==
 		    pEvents->u.keyButtonPointer.event)
 		{
-#ifdef DEBUG
-		    if (debug_events) ErrorF("\n");
-	    fprintf(stderr,"motionHintWindow == keyButtonPointer.event\n");
+#ifdef DEBUG_EVENTS
+		    ErrorF("\n");
+	    ErrorF("motionHintWindow == keyButtonPointer.event\n");
 #endif
 		    return 1; /* don't send, but pretend we did */
 		}
@@ -1594,15 +1590,15 @@ TryClientEvents (ClientPtr client, xEven
 	}
 
 	WriteEventsToClient(client, count, pEvents);
-#ifdef DEBUG
-	if (debug_events) ErrorF(  " delivered\n");
+#ifdef DEBUG_EVENTS
+	ErrorF(  " delivered\n");
 #endif
 	return 1;
     }
     else
     {
-#ifdef DEBUG
-	if (debug_events) ErrorF("\n");
+#ifdef DEBUG_EVENTS
+	ErrorF("\n");
 #endif
 	return 0;
     }
@@ -2782,8 +2778,7 @@ drawable.id:0;
 #endif
 
 #ifdef DEBUG
-    if ((xkbDebugFlags&0x4)&&
-	((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease))) {
+    if (((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease))) {
 	ErrorF("CoreProcessKbdEvent: Key %d %s\n",key,
 			(xE->u.u.type==KeyPress?"down":"up"));
     }
@@ -2869,8 +2864,7 @@ FixKeyState (register xEvent *xE, regist
     kptr = &keyc->down[key >> 3];
     bit = 1 << (key & 7);
 #ifdef DEBUG
-    if ((xkbDebugFlags&0x4)&&
-	((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease))) {
+    if (((xE->u.u.type==KeyPress)||(xE->u.u.type==KeyRelease))) {
 	ErrorF("FixKeyState: Key %d %s\n",key,
 			(xE->u.u.type==KeyPress?"down":"up"));
     }
@@ -4753,9 +4747,6 @@ int GetKeyboardValuatorEvents(xEvent *ev
             }
             first_valuator += 6;
         }
-#ifdef DEBUG
-        ErrorF("GKVE: DV event with %d valuators\n", xv->num_valuators);
-#endif
     }
 
     if (pDev->coreEvents) {
@@ -4793,10 +4784,6 @@ int GetKeyboardValuatorEvents(xEvent *ev
         }
     }
 
-#ifdef DEBUG
-    ErrorF("GKVE: putting out %d events with detail %d\n", numEvents, key_code);
-#endif
-
     return numEvents;
 }
 
@@ -4882,12 +4869,6 @@ GetPointerEvents(xEvent *events, DeviceI
     if (!pDev->button || (pDev->coreEvents && !(cp->button || !cp->valuator)))
         return 0;
 
-#ifdef DEBUG
-    ErrorF("GPE: called with device %d, type %d\n", pDev->id, type);
-    ErrorF("GPE: relative %s, accelerate %s\n", flags & POINTER_RELATIVE ? "yes" : "no",
-           flags & POINTER_ACCELERATE ? "yes" : "no");
-#endif
-
     if (pDev->coreEvents)
         numEvents = 2;
     else
@@ -4967,15 +4948,7 @@ GetPointerEvents(xEvent *events, DeviceI
         kbp->root_y = axes->max_value;
 
     if (pDev->coreEvents) {
-#ifdef DEBUG
-        ErrorF("warping core lastx from %d to %d\n", cp->valuator->lastx, kbp->root_x);
-        ErrorF("x value given was %d\n", valuators[0]);
-#endif
         cp->valuator->lastx = kbp->root_x;
-#ifdef DEBUG
-        ErrorF("warping core lasty from %d to %d\n", cp->valuator->lasty, kbp->root_y);
-        ErrorF("y value given was %d\n", valuators[1]);
-#endif
         cp->valuator->lasty = kbp->root_y;
     }
     pDev->valuator->lastx = kbp->root_x;
@@ -4983,18 +4956,12 @@ GetPointerEvents(xEvent *events, DeviceI
 
     if (type == MotionNotify) {
         kbp->type = DeviceMotionNotify;
-#ifdef DEBUG
-        ErrorF("GPE: motion at %d, %d\n", kbp->root_x, kbp->root_y);
-#endif
     }
     else {
         if (type == ButtonPress)
             kbp->type = DeviceButtonPress;
         else if (type == ButtonRelease)
             kbp->type = DeviceButtonRelease;
-#ifdef DEBUG
-        ErrorF("GPE: detail is %d\n", buttons);
-#endif
         kbp->detail = pDev->button->map[buttons];
     }
 
@@ -5028,29 +4995,17 @@ GetPointerEvents(xEvent *events, DeviceI
             }
             first_valuator += 6;
         }
-#ifdef DEBUG
-        ErrorF("GPE: DV event with %d valuators\n", xv->num_valuators);
-#endif
     }
 
     if (pDev->coreEvents) {
         events++;
         events->u.u.type = type;
-#ifdef DEBUG
-        ErrorF("GPE: core type is %d\n", type);
-#endif
         events->u.keyButtonPointer.time = ms;
         events->u.keyButtonPointer.rootX = kbp->root_x;
         events->u.keyButtonPointer.rootY = kbp->root_y;
         cp->valuator->lastx = kbp->root_x;
         cp->valuator->lasty = kbp->root_y;
-#ifdef DEBUG
-        ErrorF("GPE: core co-ords at %d, %d\n", kbp->root_x, kbp->root_y);
-#endif
         if (type == ButtonPress || type == ButtonRelease) {
-#ifdef DEBUG
-            ErrorF("GPE: core detail is %d\n", buttons);
-#endif
             /* Core buttons remapping shouldn't be transitive. */
             events->u.u.detail = pDev->button->map[buttons];
         }
diff --git a/mi/mieq.c b/mi/mieq.c
index aec2371..63b900c 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -103,11 +103,6 @@ mieqEnqueue (xEvent *e)
     deviceKeyButtonPointer *lastkbp = (deviceKeyButtonPointer *)
                                       &laste->event[0];
 
-#ifdef DEBUG
-    ErrorF("mieqEnqueue: slamming an event on to the queue from %d\n", kbp->deviceid & DEVICE_BITS);
-    ErrorF("    type %d, detail %d\n", e->u.u.type, e->u.u.detail);
-#endif
-
     if (e->u.u.type == MotionNotify) {
         miPointerAbsoluteCursor(e->u.keyButtonPointer.rootX,
                                 e->u.keyButtonPointer.rootY,
@@ -178,15 +173,9 @@ mieqEnqueue (xEvent *e)
      */
     if (e->u.keyButtonPointer.time < miEventQueue.lastEventTime &&
 	miEventQueue.lastEventTime - e->u.keyButtonPointer.time < 10000)
-    {
-#ifdef DEBUG
-        ErrorF("mieq: rewinding event time from %d to %d\n",
-               miEventQueue.lastEventTime,
-               miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time);
-#endif
 	miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time =
 	    miEventQueue.lastEventTime;
-    }
+
     miEventQueue.lastEventTime =
 	miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time;
     miEventQueue.events[oldtail].pScreen = miEventQueue.pEnqueueScreen;
diff-tree 518db35ca3f569e7cb95dbddeddb93f3691de498 (from parents)
Merge: 5d99e05f05a42a82a9f02844df9bfebaa673759d 84eb2c0a06de60e88e14bb03fabe661d7cd8f1d3
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Sep 29 00:35:21 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree 5d99e05f05a42a82a9f02844df9bfebaa673759d (from parents)
Merge: ad631afcf3fbc74024cddaaacd05d38addc047a2 58933757862c458e2da39bd464e50d9c0e41b313
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Sep 29 00:35:07 2006 +0300

    Merge branch 'input-hotplug' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree ad631afcf3fbc74024cddaaacd05d38addc047a2 (from a5d639cd87f30f9b3d765352d27253940f33b2b7)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Sep 29 00:34:23 2006 +0300

    make core keyboard/pointer map functions act on all core-sending devices
    Make Set{Keyboard,Modifier,Pointer}Mapping act on all devices which send core
    events.
    Change LegalModifier to accept a DeviceIntPtr.

diff --git a/dix/devices.c b/dix/devices.c
index 60c2d29..74474c9 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1139,112 +1139,102 @@ AllModifierKeysAreUp(dev, map1, per1, ma
     return TRUE;
 }
 
+static int
+DoSetModifierMapping(ClientPtr client, KeyCode *inputMap,
+                     int numKeyPerModifier)
+{
+    KeyClassPtr keyc = NULL;
+    DeviceIntPtr pDev = NULL;
+    KeyCode *map = NULL;
+    int i = 0, inputMapLen = numKeyPerModifier * 8;
+
+    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
+            for (i = 0; i < inputMapLen; i++) {
+                /* Check that all the new modifiers fall within the advertised
+                 * keycode range, and are okay with the DDX. */
+                if (inputMap[i] && ((inputMap[i] < pDev->key->curKeySyms.minKeyCode ||
+                                    inputMap[i] > pDev->key->curKeySyms.maxKeyCode) ||
+                                    !LegalModifier(inputMap[i], pDev))) {
+                    client->errorValue = inputMap[i];
+                    return BadValue;
+                }
+            }
+#ifdef XCSECURITY
+            if (!SecurityCheckDeviceAccess(client, pDev, TRUE))
+                return BadAccess;
+#endif 
+            /* None of the modifiers (old or new) may be down while we change
+             * the map. */
+            if (!AllModifierKeysAreUp(pDev, pDev->key->modifierKeyMap,
+                                      pDev->key->maxKeysPerModifier,
+                                      inputMap, numKeyPerModifier) ||
+                !AllModifierKeysAreUp(pDev, inputMap, numKeyPerModifier,
+                                      pDev->key->modifierKeyMap,
+                                      pDev->key->maxKeysPerModifier)) {
+                return MappingBusy;
+            }
+        }
+    }
+
+    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
+            bzero(pDev->key->modifierMap, MAP_LENGTH);
+
+            /* Annoyingly, we lack a modifierKeyMap size, so we have to just free
+             * and re-alloc it every time. */
+            if (pDev->key->modifierKeyMap)
+                xfree(pDev->key->modifierKeyMap);
+
+            if (inputMapLen) {
+                pDev->key->modifierKeyMap = (KeyCode *) xalloc(inputMapLen);
+                if (!pDev->key->modifierKeyMap)
+                    return BadAlloc;
+
+                memcpy(pDev->key->modifierKeyMap, inputMap, inputMapLen);
+                pDev->key->maxKeysPerModifier = numKeyPerModifier;
+
+                for (i = 0; i < inputMapLen; i++) {
+                    if (inputMap[i]) {
+                        pDev->key->modifierMap[inputMap[i]] |=
+                            (1 << (((unsigned int)i) / numKeyPerModifier));
+                    }
+                }
+            }
+            else {
+                pDev->key->modifierKeyMap = NULL;
+            }
+        }
+    }
+
+    return Success;
+}
+
 int 
 ProcSetModifierMapping(ClientPtr client)
 {
     xSetModifierMappingReply rep;
     REQUEST(xSetModifierMappingReq);
-    KeyCode *inputMap;
-    int inputMapLen;
     register int i;
     DeviceIntPtr keybd = inputInfo.keyboard;
-    register KeyClassPtr keyc = keybd->key;
     
     REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq);
 
-    if (client->req_len != ((stuff->numKeyPerModifier<<1) +
-			    (sizeof (xSetModifierMappingReq)>>2)))
+    if (client->req_len != ((stuff->numKeyPerModifier << 1) +
+			    (sizeof (xSetModifierMappingReq) >> 2)))
 	return BadLength;
 
-    inputMapLen = 8*stuff->numKeyPerModifier;
-    inputMap = (KeyCode *)&stuff[1];
-
-    /*
-     *	Now enforce the restriction that "all of the non-zero keycodes must be
-     *	in the range specified by min-keycode and max-keycode in the
-     *	connection setup (else a Value error)"
-     */
-    i = inputMapLen;
-    while (i--)
-    {
-	if (inputMap[i]
-	    && (inputMap[i] < keyc->curKeySyms.minKeyCode
-		|| inputMap[i] > keyc->curKeySyms.maxKeyCode))
-	{
-	    client->errorValue = inputMap[i];
-	    return BadValue;
-	}
-    }
-
-#ifdef XCSECURITY
-    if (!SecurityCheckDeviceAccess(client, keybd, TRUE))
-	return BadAccess;
-#endif 
-
     rep.type = X_Reply;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
-    rep.success = MappingSuccess;
 
-    /*
-     *	Now enforce the restriction that none of the old or new
-     *	modifier keys may be down while we change the mapping,  and
-     *	that the DDX layer likes the choice.
-     */
-    if (!AllModifierKeysAreUp(keybd, keyc->modifierKeyMap,
-			      (int)keyc->maxKeysPerModifier,
-			      inputMap, (int)stuff->numKeyPerModifier)
-	    ||
-	!AllModifierKeysAreUp(keybd, inputMap, (int)stuff->numKeyPerModifier,
-			      keyc->modifierKeyMap,
-			      (int)keyc->maxKeysPerModifier))
-    {
-	rep.success = MappingBusy;
-    }
-    else
-    {
-	for (i = 0; i < inputMapLen; i++)
-	{
-	    if (inputMap[i] && !LegalModifier(inputMap[i], (DevicePtr)keybd))
-	    {
-		rep.success = MappingFailed;
-		break;
-	    }
-	}
-    }
-
-    if (rep.success == MappingSuccess)
-    {
-	KeyCode *map;
-	/*
-	 *	Now build the keyboard's modifier bitmap from the
-	 *	list of keycodes.
-	 */
-	map = (KeyCode *)xalloc(inputMapLen);
-	if (!map && inputMapLen)
-	    return BadAlloc;
-	if (keyc->modifierKeyMap)
-	    xfree(keyc->modifierKeyMap);
-	keyc->modifierKeyMap = map;
-	memmove((char *)map, (char *)inputMap, inputMapLen);
-
-	keyc->maxKeysPerModifier = stuff->numKeyPerModifier;
-	for (i = 0; i < MAP_LENGTH; i++)
-	    keyc->modifierMap[i] = 0;
-	for (i = 0; i < inputMapLen; i++)
-	{
-	    if (inputMap[i])
-		keyc->modifierMap[inputMap[i]] |=
-		    (1<<(((unsigned int)i)/keyc->maxKeysPerModifier));
-	}
-    }
-
-    if (rep.success == MappingSuccess)
-        SendMappingNotify(MappingModifier, 0, 0, client);
+    rep.success = DoSetModifierMapping(client, (KeyCode *)&stuff[1],
+                                       stuff->numKeyPerModifier);
 
+    /* FIXME: Send mapping notifies for all the extended devices as well. */
+    SendMappingNotify(MappingModifier, 0, 0, client);
     WriteReplyToClient(client, sizeof(xSetModifierMappingReply), &rep);
-
-    return(client->noClientException);
+    return client->noClientException;
 }
 
 int
@@ -1274,40 +1264,80 @@ ProcChangeKeyboardMapping(ClientPtr clie
     REQUEST(xChangeKeyboardMappingReq);
     unsigned len;
     KeySymsRec keysyms;
-    register KeySymsPtr curKeySyms = &inputInfo.keyboard->key->curKeySyms;
+    KeySymsPtr curKeySyms = &inputInfo.keyboard->key->curKeySyms;
+    DeviceIntPtr pDev = NULL;
     REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
 
     len = client->req_len - (sizeof(xChangeKeyboardMappingReq) >> 2);  
     if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode))
             return BadLength;
+
     if ((stuff->firstKeyCode < curKeySyms->minKeyCode) ||
-	(stuff->firstKeyCode > curKeySyms->maxKeyCode))
-    {
+	(stuff->firstKeyCode > curKeySyms->maxKeyCode)) {
 	    client->errorValue = stuff->firstKeyCode;
 	    return BadValue;
+
     }
-    if ( ((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) >
-	  curKeySyms->maxKeyCode) ||
-	(stuff->keySymsPerKeyCode == 0))
-    {
+    if (((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) >
+        curKeySyms->maxKeyCode) || (stuff->keySymsPerKeyCode == 0)) {
 	    client->errorValue = stuff->keySymsPerKeyCode;
 	    return BadValue;
     }
+
 #ifdef XCSECURITY
-    if (!SecurityCheckDeviceAccess(client, inputInfo.keyboard,
-				   TRUE))
-	return BadAccess;
+    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
+            if (!SecurityCheckDeviceAccess(client, pDev, TRUE))
+                return BadAccess;
+        }
+    }
 #endif 
+
     keysyms.minKeyCode = stuff->firstKeyCode;
     keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1;
     keysyms.mapWidth = stuff->keySymsPerKeyCode;
     keysyms.map = (KeySym *)&stuff[1];
-    if (!SetKeySymsMap(curKeySyms, &keysyms))
-	return BadAlloc;
+    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
+            if (!SetKeySymsMap(&pDev->key->curKeySyms, &keysyms))
+                return BadAlloc;
+        }
+    }
+
+    /* FIXME: Send mapping notifies for all the extended devices as well. */
     SendMappingNotify(MappingKeyboard, stuff->firstKeyCode, stuff->keyCodes,
-									client);
+                      client);
     return client->noClientException;
+}
+
+static int
+DoSetPointerMapping(DeviceIntPtr device, BYTE *map, int n)
+{
+    int i = 0;
+    DeviceIntPtr dev = NULL;
+
+    if (!device || !device->button)
+        return BadDevice;
+
+    for (dev = inputInfo.devices; dev; dev = dev->next) {
+        if ((dev->coreEvents || dev == inputInfo.pointer) && dev->button) {
+            for (i = 0; i < n; i++) {
+                if ((device->button->map[i + 1] != map[i]) &&
+                    BitIsOn(device->button->down, i + 1)) {
+                    return MappingBusy;
+                }
+            }
+        }
+    }
+
+    for (dev = inputInfo.devices; dev; dev = dev->next) {
+        if ((dev->coreEvents || dev == inputInfo.pointer) && dev->button) {
+            for (i = 0; i < n; i++)
+                dev->button->map[i + 1] = map[i];
+        }
+    }
 
+    return Success;
 }
 
 int
@@ -1315,9 +1345,9 @@ ProcSetPointerMapping(ClientPtr client)
 {
     REQUEST(xSetPointerMappingReq);
     BYTE *map;
+    int ret;
     xSetPointerMappingReply rep;
-    register unsigned int i;
-    DeviceIntPtr mouse = inputInfo.pointer;
+    unsigned int i;
 
     REQUEST_AT_LEAST_SIZE(xSetPointerMappingReq);
     if (client->req_len != (sizeof(xSetPointerMappingReq)+stuff->nElts+3) >> 2)
@@ -1327,23 +1357,24 @@ ProcSetPointerMapping(ClientPtr client)
     rep.sequenceNumber = client->sequence;
     rep.success = MappingSuccess;
     map = (BYTE *)&stuff[1];
-    if (stuff->nElts != mouse->button->numButtons)
-    {
+    
+    /* So we're bounded here by the number of core buttons.  This check
+     * probably wants disabling through XFixes. */
+    if (stuff->nElts != inputInfo.pointer->button->numButtons) {
 	client->errorValue = stuff->nElts;
 	return BadValue;
     }
     if (BadDeviceMap(&map[0], (int)stuff->nElts, 1, 255, &client->errorValue))
 	return BadValue;
-    for (i=0; i < stuff->nElts; i++)
-	if ((mouse->button->map[i + 1] != map[i]) &&
-	    BitIsOn(mouse->button->down, i + 1))
-	{
-    	    rep.success = MappingBusy;
-	    WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
-            return Success;
-	}
-    for (i = 0; i < stuff->nElts; i++)
-	mouse->button->map[i + 1] = map[i];
+
+    ret = DoSetPointerMapping(inputInfo.pointer, map, stuff->nElts);
+    if (ret != Success) {
+        rep.success = ret;
+        WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
+        return Success;
+    }
+
+    /* FIXME: Send mapping notifies for all the extended devices as well. */
     SendMappingNotify(MappingPointer, 0, 0, client);
     WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
     return Success;
@@ -1359,14 +1390,12 @@ ProcGetKeyboardMapping(ClientPtr client)
     REQUEST_SIZE_MATCH(xGetKeyboardMappingReq);
 
     if ((stuff->firstKeyCode < curKeySyms->minKeyCode) ||
-        (stuff->firstKeyCode > curKeySyms->maxKeyCode))
-    {
+        (stuff->firstKeyCode > curKeySyms->maxKeyCode)) {
 	client->errorValue = stuff->firstKeyCode;
 	return BadValue;
     }
     if (stuff->firstKeyCode + stuff->count >
-	(unsigned)(curKeySyms->maxKeyCode + 1))
-    {
+	(unsigned)(curKeySyms->maxKeyCode + 1)) {
 	client->errorValue = stuff->count;
         return BadValue;
     }
@@ -1423,47 +1452,31 @@ Ones(unsigned long mask)             /* 
     return (((y + (y >> 3)) & 030707070707) % 077);
 }
 
-int
-ProcChangeKeyboardControl (ClientPtr client)
+static int
+DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
+                         BITS32 vmask)
 {
 #define DO_ALL    (-1)
     KeybdCtrl ctrl;
-    DeviceIntPtr keybd = inputInfo.keyboard;
-    XID *vlist;
     int t;
     int led = DO_ALL;
     int key = DO_ALL;
-    BITS32 vmask, index2;
-    int mask, i;
-    REQUEST(xChangeKeyboardControlReq);
-
-    REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
+    BITS32 index2;
+    int mask = vmask, i;
+    DeviceIntPtr dev = NULL;
 
-    if (!keybd->kbdfeed->CtrlProc)
-        return BadDevice;
-    
-    vmask = stuff->mask;
-    if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
-	return BadLength;
-#ifdef XCSECURITY
-    if (!SecurityCheckDeviceAccess(client, keybd, TRUE))
-	return BadAccess;
-#endif 
-    vlist = (XID *)&stuff[1];		/* first word of values */
     ctrl = keybd->kbdfeed->ctrl;
-    while (vmask)
-    {
+    while (vmask) {
 	index2 = (BITS32) lowbit (vmask);
 	vmask &= ~index2;
-	switch (index2)
-	{
+	switch (index2) {
 	case KBKeyClickPercent: 
 	    t = (INT8)*vlist;
 	    vlist++;
-	    if (t == -1)
+	    if (t == -1) {
 		t = defaultKeyboardControl.click;
-	    else if (t < 0 || t > 100)
-	    {
+            }
+	    else if (t < 0 || t > 100) {
 		client->errorValue = t;
 		return BadValue;
 	    }
@@ -1472,10 +1485,10 @@ ProcChangeKeyboardControl (ClientPtr cli
 	case KBBellPercent:
 	    t = (INT8)*vlist;
 	    vlist++;
-	    if (t == -1)
+	    if (t == -1) {
 		t = defaultKeyboardControl.bell;
-	    else if (t < 0 || t > 100)
-	    {
+            }
+	    else if (t < 0 || t > 100) {
 		client->errorValue = t;
 		return BadValue;
 	    }
@@ -1484,10 +1497,10 @@ ProcChangeKeyboardControl (ClientPtr cli
 	case KBBellPitch:
 	    t = (INT16)*vlist;
 	    vlist++;
-	    if (t == -1)
+	    if (t == -1) {
 		t = defaultKeyboardControl.bell_pitch;
-	    else if (t < 0)
-	    {
+            }
+	    else if (t < 0) {
 		client->errorValue = t;
 		return BadValue;
 	    }
@@ -1498,8 +1511,7 @@ ProcChangeKeyboardControl (ClientPtr cli
 	    vlist++;
 	    if (t == -1)
 		t = defaultKeyboardControl.bell_duration;
-	    else if (t < 0)
-	    {
+	    else if (t < 0) {
 		client->errorValue = t;
 		return BadValue;
 	    }
@@ -1508,56 +1520,51 @@ ProcChangeKeyboardControl (ClientPtr cli
 	case KBLed:
 	    led = (CARD8)*vlist;
 	    vlist++;
-	    if (led < 1 || led > 32)
-	    {
+	    if (led < 1 || led > 32) {
 		client->errorValue = led;
 		return BadValue;
 	    }
-	    if (!(stuff->mask & KBLedMode))
+	    if (!(mask & KBLedMode))
 		return BadMatch;
 	    break;
 	case KBLedMode:
 	    t = (CARD8)*vlist;
 	    vlist++;
-	    if (t == LedModeOff)
-	    {
+	    if (t == LedModeOff) {
 		if (led == DO_ALL)
 		    ctrl.leds = 0x0;
 		else
 		    ctrl.leds &= ~(((Leds)(1)) << (led - 1));
 	    }
-	    else if (t == LedModeOn)
-	    {
+	    else if (t == LedModeOn) {
 		if (led == DO_ALL)
 		    ctrl.leds = ~0L;
 		else
 		    ctrl.leds |= (((Leds)(1)) << (led - 1));
 	    }
-	    else
-	    {
+	    else {
 		client->errorValue = t;
 		return BadValue;
 	    }
 #ifdef XKB
-	    if (!noXkbExtension) {
-		XkbEventCauseRec	cause;
-		XkbSetCauseCoreReq(&cause,X_ChangeKeyboardControl,client);
-		XkbSetIndicators(keybd,((led == DO_ALL) ? ~0L : (1L<<(led-1))),
+            if (!noXkbExtension) {
+                XkbEventCauseRec cause;
+                XkbSetCauseCoreReq(&cause,X_ChangeKeyboardControl,client);
+                XkbSetIndicators(keybd,((led == DO_ALL) ? ~0L : (1L<<(led-1))),
 				 			ctrl.leds, &cause);
-		ctrl.leds = keybd->kbdfeed->ctrl.leds;
-	    }
+                ctrl.leds = keybd->kbdfeed->ctrl.leds;
+            }
 #endif
 	    break;
 	case KBKey:
 	    key = (KeyCode)*vlist;
 	    vlist++;
 	    if ((KeyCode)key < inputInfo.keyboard->key->curKeySyms.minKeyCode ||
-		(KeyCode)key > inputInfo.keyboard->key->curKeySyms.maxKeyCode)
-	    {
+		(KeyCode)key > inputInfo.keyboard->key->curKeySyms.maxKeyCode) {
 		client->errorValue = key;
 		return BadValue;
 	    }
-	    if (!(stuff->mask & KBAutoRepeatMode))
+	    if (!(mask & KBAutoRepeatMode))
 		return BadMatch;
 	    break;
 	case KBAutoRepeatMode:
@@ -1566,25 +1573,22 @@ ProcChangeKeyboardControl (ClientPtr cli
 	    t = (CARD8)*vlist;
 	    vlist++;
 #ifdef XKB
-	    if (!noXkbExtension && key != DO_ALL)
-		XkbDisableComputedAutoRepeats(keybd,key);
+            if (!noXkbExtension && key != DO_ALL)
+                XkbDisableComputedAutoRepeats(keybd,key);
 #endif
-	    if (t == AutoRepeatModeOff)
-	    {
+	    if (t == AutoRepeatModeOff) {
 		if (key == DO_ALL)
 		    ctrl.autoRepeat = FALSE;
 		else
 		    ctrl.autoRepeats[i] &= ~mask;
 	    }
-	    else if (t == AutoRepeatModeOn)
-	    {
+	    else if (t == AutoRepeatModeOn) {
 		if (key == DO_ALL)
 		    ctrl.autoRepeat = TRUE;
 		else
 		    ctrl.autoRepeats[i] |= mask;
 	    }
-	    else if (t == AutoRepeatModeDefault)
-	    {
+	    else if (t == AutoRepeatModeDefault) {
 		if (key == DO_ALL)
 		    ctrl.autoRepeat = defaultKeyboardControl.autoRepeat;
 		else
@@ -1592,32 +1596,72 @@ ProcChangeKeyboardControl (ClientPtr cli
 			    (ctrl.autoRepeats[i] & ~mask) |
 			    (defaultKeyboardControl.autoRepeats[i] & mask);
 	    }
-	    else
-	    {
+	    else {
 		client->errorValue = t;
 		return BadValue;
 	    }
 	    break;
 	default:
-	    client->errorValue = stuff->mask;
+	    client->errorValue = mask;
 	    return BadValue;
 	}
     }
     keybd->kbdfeed->ctrl = ctrl;
+
 #ifdef XKB
     /* The XKB RepeatKeys control and core protocol global autorepeat */
     /* value are linked	*/
-    if (!noXkbExtension) {
-	XkbSetRepeatKeys(keybd,key,keybd->kbdfeed->ctrl.autoRepeat);
-    }
+    if (!noXkbExtension)
+        XkbSetRepeatKeys(keybd, key, keybd->kbdfeed->ctrl.autoRepeat);
     else
 #endif
-    (*keybd->kbdfeed->CtrlProc)(keybd, &keybd->kbdfeed->ctrl);
+        (*keybd->kbdfeed->CtrlProc)(keybd, &keybd->kbdfeed->ctrl);
+
     return Success;
+
 #undef DO_ALL
 } 
 
 int
+ProcChangeKeyboardControl (ClientPtr client)
+{
+    XID *vlist;
+    BITS32 vmask;
+    int ret = Success, error = Success;
+    DeviceIntPtr pDev = NULL;
+    REQUEST(xChangeKeyboardControlReq);
+
+    REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
+
+    vmask = stuff->mask;
+    vlist = (XID *)&stuff[1];
+
+    if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
+	return BadLength;
+
+#ifdef XCSECURITY
+    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+        if ((pDev->coreEvents || pDev == inputInfo.keyboard) &&
+            pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
+            if (!SecurityCheckDeviceAccess(client, pDev, TRUE))
+                return BadAccess;
+        }
+    }
+#endif 
+
+    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
+        if ((pDev->coreEvents || pDev == inputInfo.keyboard) &&
+            pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
+            ret = DoChangeKeyboardControl(client, pDev, vlist, vmask);
+            if (ret != Success)
+                error = ret;
+        }
+    }
+
+    return error;
+}
+
+int
 ProcGetKeyboardControl (ClientPtr client)
 {
     int i;
@@ -1652,24 +1696,31 @@ ProcBell(ClientPtr client)
     if (!keybd->kbdfeed->BellProc)
         return BadDevice;
     
-    if (stuff->percent < -100 || stuff->percent > 100)
-    {
+    if (stuff->percent < -100 || stuff->percent > 100) {
 	client->errorValue = stuff->percent;
 	return BadValue;
     }
+
     newpercent = (base * stuff->percent) / 100;
     if (stuff->percent < 0)
         newpercent = base + newpercent;
     else
     	newpercent = base - newpercent + stuff->percent;
+
+    for (keybd = inputInfo.devices; keybd; keybd = keybd->next) {
+        if ((keybd->coreEvents || keybd == inputInfo.keyboard) &&
+            keybd->kbdfeed && keybd->kbdfeed->BellProc) {
 #ifdef XKB
-    if (!noXkbExtension)
-	XkbHandleBell(FALSE,FALSE, keybd, newpercent, &keybd->kbdfeed->ctrl, 0, 
-		      None, NULL, client);
-	else
+            if (!noXkbExtension)
+                XkbHandleBell(FALSE, FALSE, keybd, newpercent,
+                              &keybd->kbdfeed->ctrl, 0, None, NULL, client);
+            else
 #endif
-    (*keybd->kbdfeed->BellProc)(newpercent, keybd,
-                                (pointer) &keybd->kbdfeed->ctrl, 0);
+                (*keybd->kbdfeed->BellProc)(newpercent, keybd,
+                                            &keybd->kbdfeed->ctrl, 0);
+        }
+    }
+
     return Success;
 } 
 
@@ -1686,48 +1737,59 @@ ProcChangePointerControl(ClientPtr clien
         return BadDevice;
     
     ctrl = mouse->ptrfeed->ctrl;
-    if ((stuff->doAccel != xTrue) && (stuff->doAccel != xFalse))
-    {
+    if ((stuff->doAccel != xTrue) && (stuff->doAccel != xFalse)) {
 	client->errorValue = stuff->doAccel;
 	return(BadValue);
     }
-    if ((stuff->doThresh != xTrue) && (stuff->doThresh != xFalse))
-    {
+    if ((stuff->doThresh != xTrue) && (stuff->doThresh != xFalse)) {
 	client->errorValue = stuff->doThresh;
 	return(BadValue);
     }
-    if (stuff->doAccel)
-    {
-	if (stuff->accelNum == -1)
+    if (stuff->doAccel) {
+	if (stuff->accelNum == -1) {
 	    ctrl.num = defaultPointerControl.num;
-	else if (stuff->accelNum < 0)
-	{
+        }
+	else if (stuff->accelNum < 0) {
 	    client->errorValue = stuff->accelNum;
 	    return BadValue;
 	}
-	else ctrl.num = stuff->accelNum;
-	if (stuff->accelDenum == -1)
+	else {
+            ctrl.num = stuff->accelNum;
+        }
+
+	if (stuff->accelDenum == -1) {
 	    ctrl.den = defaultPointerControl.den;
-	else if (stuff->accelDenum <= 0)
-	{
+        }
+	else if (stuff->accelDenum <= 0) {
 	    client->errorValue = stuff->accelDenum;
 	    return BadValue;
 	}
-	else ctrl.den = stuff->accelDenum;
+	else {
+            ctrl.den = stuff->accelDenum;
+        }
     }
-    if (stuff->doThresh)
-    {
-	if (stuff->threshold == -1)
+    if (stuff->doThresh) {
+	if (stuff->threshold == -1) {
 	    ctrl.threshold = defaultPointerControl.threshold;
-	else if (stuff->threshold < 0)
-	{
+        }
+	else if (stuff->threshold < 0) {
 	    client->errorValue = stuff->threshold;
 	    return BadValue;
 	}
-	else ctrl.threshold = stuff->threshold;
+	else {
+            ctrl.threshold = stuff->threshold;
+        }
     }
-    mouse->ptrfeed->ctrl = ctrl;
-    (*mouse->ptrfeed->CtrlProc)(mouse, &mouse->ptrfeed->ctrl);
+
+
+    for (mouse = inputInfo.devices; mouse; mouse = mouse->next) {
+        if ((mouse->coreEvents || mouse == inputInfo.pointer) &&
+            mouse->ptrfeed && mouse->ptrfeed->CtrlProc) {
+            mouse->ptrfeed->ctrl = ctrl;
+            (*mouse->ptrfeed->CtrlProc)(mouse, &mouse->ptrfeed->ctrl);
+        }
+    }
+
     return Success;
 } 
 
diff --git a/hw/darwin/darwinKeyboard.c b/hw/darwin/darwinKeyboard.c
index c148d96..1cc49fe 100644
--- a/hw/darwin/darwinKeyboard.c
+++ b/hw/darwin/darwinKeyboard.c
@@ -1020,7 +1020,7 @@ int DarwinModifierStringToNXKey(const ch
  *      This allows the ddx layer to prevent some keys from being remapped
  *      as modifier keys.
  */
-Bool LegalModifier(unsigned int key, DevicePtr pDev)
+Bool LegalModifier(unsigned int key, DeviceIntPtr pDev)
 {
     return 1;
 }
diff --git a/hw/dmx/dmxinput.c b/hw/dmx/dmxinput.c
index 7c376de..37f4583 100644
--- a/hw/dmx/dmxinput.c
+++ b/hw/dmx/dmxinput.c
@@ -53,7 +53,7 @@
 /** Returns TRUE if the key is a valid modifier.  For PC-class
  * keyboards, all keys can be used as modifiers, so return TRUE
  * always. */
-Bool LegalModifier(unsigned int key, DevicePtr pDev)
+Bool LegalModifier(unsigned int key, DeviceIntPtr pDev)
 {
     return TRUE;
 }
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index a41fddb..3915436 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -516,7 +516,7 @@ KdPointerProc(DeviceIntPtr pDevice, int 
 }
 
 Bool
-LegalModifier(unsigned int key, DevicePtr pDev)
+LegalModifier(unsigned int key, DeviceIntPtr pDev)
 {
     return TRUE;
 }
diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index 773c454..17e023a 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -43,7 +43,7 @@ from The Open Group.
 #include <X11/keysym.h>
 
 Bool
-LegalModifier(unsigned int key, DevicePtr pDev)
+LegalModifier(unsigned int key, DeviceIntPtr pDev)
 {
     return TRUE;
 }
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 45a50d8..ff3840c 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -164,7 +164,7 @@ static IHPtr InputHandlers = NULL;
 
 
 Bool
-LegalModifier(unsigned int key, DevicePtr pDev)
+LegalModifier(unsigned int key, DeviceIntPtr pDev)
 {
     return TRUE;
 }
diff --git a/hw/xgl/egl/module/xeglmodule.c b/hw/xgl/egl/module/xeglmodule.c
index ff695f6..abd0d0d 100644
--- a/hw/xgl/egl/module/xeglmodule.c
+++ b/hw/xgl/egl/module/xeglmodule.c
@@ -52,7 +52,7 @@ InitOutput (ScreenInfo *pScreenInfo,
 
 Bool
 LegalModifier (unsigned int key,
-	       DevicePtr    pDev)
+	       DeviceIntPtr    pDev)
 {
     return xeglLegalModifier (key, pDev);
 }
diff --git a/hw/xgl/egl/xegl.c b/hw/xgl/egl/xegl.c
index 70db7c0..c671dbe 100644
--- a/hw/xgl/egl/xegl.c
+++ b/hw/xgl/egl/xegl.c
@@ -252,7 +252,7 @@ xeglInitInput (int  argc,
 
 Bool
 xeglLegalModifier (unsigned int key,
-		   DevicePtr    pDev)
+		   DeviceIntPtr pDev)
 {
     return KdLegalModifier (key, pDev);
 }
diff --git a/hw/xgl/egl/xegl.h b/hw/xgl/egl/xegl.h
index cf21fca..be9b48c 100644
--- a/hw/xgl/egl/xegl.h
+++ b/hw/xgl/egl/xegl.h
@@ -173,7 +173,7 @@ KdWakeupHandler (pointer data,
 
 Bool
 KdLegalModifier (unsigned int key, 
-		 DevicePtr    pDev);
+		 DeviceIntPtr pDev);
 
 void
 KdProcessInputEvents (void);
diff --git a/hw/xgl/egl/xeglinit.c b/hw/xgl/egl/xeglinit.c
index 51100a4..c28d946 100644
--- a/hw/xgl/egl/xeglinit.c
+++ b/hw/xgl/egl/xeglinit.c
@@ -58,7 +58,7 @@ InitOutput (ScreenInfo *pScreenInfo,
 
 Bool
 LegalModifier (unsigned int key,
-	       DevicePtr    pDev)
+	       DeviceIntPtr pDev)
 {
     return xeglLegalModifier (key, pDev);
 }
diff --git a/hw/xgl/glx/module/xglxmodule.c b/hw/xgl/glx/module/xglxmodule.c
index 066cb80..40af890 100644
--- a/hw/xgl/glx/module/xglxmodule.c
+++ b/hw/xgl/glx/module/xglxmodule.c
@@ -52,7 +52,7 @@ InitOutput (ScreenInfo *pScreenInfo,
 
 Bool
 LegalModifier (unsigned int key,
-	       DevicePtr    pDev)
+	       DeviceIntPtr pDev)
 {
     return xglxLegalModifier (key, pDev);
 }
diff --git a/hw/xgl/glx/xglx.c b/hw/xgl/glx/xglx.c
index 1ded3e3..57cb847 100644
--- a/hw/xgl/glx/xglx.c
+++ b/hw/xgl/glx/xglx.c
@@ -1243,7 +1243,7 @@ xglxKeybdProc (DeviceIntPtr pDevice,
 
 Bool
 xglxLegalModifier (unsigned int key,
-		   DevicePtr    pDev)
+		   DeviceIntPtr pDev)
 {
     return TRUE;
 }
diff --git a/hw/xgl/glx/xglx.h b/hw/xgl/glx/xglx.h
index b0c5d3d..a8c8946 100644
--- a/hw/xgl/glx/xglx.h
+++ b/hw/xgl/glx/xglx.h
@@ -91,7 +91,7 @@ xglxInitOutput (ScreenInfo *pScreenInfo,
 
 Bool
 xglxLegalModifier (unsigned int key,
-		   DevicePtr    pDev);
+		   DeviceIntPtr pDev);
 
 void
 xglxProcessInputEvents (void);
diff --git a/hw/xgl/glx/xglxinit.c b/hw/xgl/glx/xglxinit.c
index 50bbca5..b87e5d6 100644
--- a/hw/xgl/glx/xglxinit.c
+++ b/hw/xgl/glx/xglxinit.c
@@ -81,7 +81,7 @@ InitOutput (ScreenInfo *pScreenInfo,
 
 Bool
 LegalModifier (unsigned int key,
-	       DevicePtr    pDev)
+	       DeviceIntPtr pDev)
 {
     return xglxLegalModifier (key, pDev);
 }
diff --git a/hw/xgl/xglinit.c b/hw/xgl/xglinit.c
index 3d93c46..e0c9e7d 100644
--- a/hw/xgl/xglinit.c
+++ b/hw/xgl/xglinit.c
@@ -192,7 +192,7 @@ InitOutput (ScreenInfo *pScreenInfo,
 
 Bool
 LegalModifier (unsigned int key,
-	       DevicePtr    pDev)
+	       DeviceIntPtr    pDev)
 {
     return (*__ddxFunc.legalModifier) (key, pDev);
 }
diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c
index f18cc97..26a5ed3 100644
--- a/hw/xnest/Keyboard.c
+++ b/hw/xnest/Keyboard.c
@@ -253,7 +253,7 @@ XkbError:
 }
 
 Bool
-LegalModifier(unsigned int key, DevicePtr pDev)
+LegalModifier(unsigned int key, DeviceIntPtr pDev)
 {
   return TRUE;
 }
diff --git a/hw/xprint/ddxInit.c b/hw/xprint/ddxInit.c
index 6cd3cfd..77b532f 100644
--- a/hw/xprint/ddxInit.c
+++ b/hw/xprint/ddxInit.c
@@ -189,7 +189,7 @@ InitInput(
 Bool
 LegalModifier(
      unsigned int key,
-     DevicePtr dev)
+     DeviceIntPtr dev)
 {
     return TRUE;
 }
diff --git a/hw/xwin/InitInput.c b/hw/xwin/InitInput.c
index f4796e0..52f837e 100644
--- a/hw/xwin/InitInput.c
+++ b/hw/xwin/InitInput.c
@@ -79,7 +79,7 @@ extern winDispatchProcPtr	winProcQueryTr
  */
 
 Bool
-LegalModifier (unsigned int uiKey, DevicePtr pDevice)
+LegalModifier (unsigned int uiKey, DeviceIntPtr pDevice)
 {
   return TRUE;
 }
diff --git a/include/input.h b/include/input.h
index 6573a1f..66d03d0 100644
--- a/include/input.h
+++ b/include/input.h
@@ -371,7 +371,7 @@ extern void CoreProcessKeyboardEvent(
 
 extern Bool LegalModifier(
     unsigned int /*key*/, 
-    DevicePtr /*pDev*/);
+    DeviceIntPtr /*pDev*/);
 
 extern void ProcessInputEvents(void);
 
diff-tree a5d639cd87f30f9b3d765352d27253940f33b2b7 (from ad321fad4b9ab3a2c70cfff37ca6c8faaa5cce9c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Sep 27 16:15:27 2006 +0300

    remove merge detritus

diff --git a/configure.ac b/configure.ac
index 0a9fe52..0397b58 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1507,7 +1507,6 @@ if test "$KDRIVE" = yes; then
     fi
     
     # tslib...
-<<<<<<< HEAD/configure.ac
     AC_CHECK_LIB(ts, ts_open, [HAVE_TSLIB="yes"])
     if test "x$TSLIB" = xauto && test "x$HAVE_TSLIB" = xyes; then
         TSLIB=yes
diff-tree ad321fad4b9ab3a2c70cfff37ca6c8faaa5cce9c (from parents)
Merge: 5e9d33fe87f9d24e55c468d4b2bb761c9efdb26a f7c1d942416db8d0d4c5a21f5ece1ccacb926b69
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Sep 24 17:56:43 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff --cc configure.ac
index 8aa6a34,76f5e04..0a9fe52
@@@ -431,7 -425,8 +431,8 @@@
  AC_ARG_ENABLE(dbe,            AS_HELP_STRING([--disable-dbe], [Build DBE extension (default: enabled)]), [DBE=$enableval], [DBE=yes])
  AC_ARG_ENABLE(xf86bigfont,    AS_HELP_STRING([--disable-xf86bigfont], [Build XF86 Big Font extension (default: enabled)]), [XF86BIGFONT=$enableval], [XF86BIGFONT=yes])
  AC_ARG_ENABLE(dpms,           AS_HELP_STRING([--disable-dpms], [Build DPMS extension (default: enabled)]), [DPMSExtension=$enableval], [DPMSExtension=yes])
 -AC_ARG_ENABLE(xinput,         AS_HELP_STRING([--disable-xinput], [Build XInput Extension (default: enabled)]), [XINPUT=$enableval], [XINPUT=yes])
 +AC_ARG_ENABLE(dbus,           AS_HELP_STRING([--disable-dbus], [Build D-BUS support (default: auto)]), [DBUS=$enableval], [DBUS=auto])
+ AC_ARG_ENABLE(xfree86-utils,     AS_HELP_STRING([--enable-xfree86-utils], [Build xfree86 DDX utilities (default: enabled)]), [XF86UTILS=$enableval], [XF86UTILS=yes])
  
  dnl DDXes.
  AC_ARG_ENABLE(xorg,    	      AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto])
@@@ -742,10 -729,15 +743,12 @@@
  fi
  MIEXT_DAMAGE_INC='-I$(top_srcdir)/miext/damage'
  
 -AM_CONDITIONAL(XINPUT, [test "x$XINPUT" = xyes])
 -if test "x$XINPUT" = xyes; then
 -   	AC_DEFINE(XINPUT, 1, [Support X Input extension])
 -	XI_LIB='$(top_builddir)/Xi/libXi.la'
 -	XI_INC='-I$(top_srcdir)/Xi'
 -fi
 +AC_DEFINE(XINPUT, 1, [Support X Input extension])
 +XI_LIB='$(top_builddir)/Xi/libXi.la'
 +XI_INC='-I$(top_srcdir)/Xi'
  
+ AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes)
+ 
  AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
  
  AC_DEFINE(XKB, 1, [Build XKB])
diff-tree b36fde9257263fa502147df37e8331184c323e14 (from 219546fd76750f358ffb6738f17b9237c58c15a6)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Thu Sep 21 09:52:04 2006 -0700

    When no mode is specified, don't validate mode-specific parameters.

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index ebb2540..77cba29 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -564,64 +564,67 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	goto sendReply;
     }
     
-    /*
-     * Validate requested rotation
-     */
-    rotation = (Rotation) stuff->rotation;
-
-    /* test the rotation bits only! */
-    switch (rotation & 0xf) {
-    case RR_Rotate_0:
-    case RR_Rotate_90:
-    case RR_Rotate_180:
-    case RR_Rotate_270:
-	break;
-    default:
-	/*
-	 * Invalid rotation
-	 */
-	client->errorValue = stuff->rotation;
-	if (outputs)
-	    xfree (outputs);
-	return BadValue;
-    }
-
-    if ((~crtc->rotations) & rotation)
+    if (mode)
     {
 	/*
-	 * requested rotation or reflection not supported by screen
+	 * Validate requested rotation
 	 */
-	client->errorValue = stuff->rotation;
-	if (outputs)
-	    xfree (outputs);
-	return BadMatch;
-    }
-
-#ifdef RANDR_12_INTERFACE
-    /*
-     * Check screen size bounds if the DDX provides a 1.2 interface
-     * for setting screen size. Else, assume the CrtcSet sets
-     * the size along with the mode
-     */
-    if (pScrPriv->rrScreenSetSize)
-    {
-	if (stuff->x + mode->mode.width > pScreen->width)
-	{
-	    client->errorValue = stuff->x;
+	rotation = (Rotation) stuff->rotation;
+    
+	/* test the rotation bits only! */
+	switch (rotation & 0xf) {
+	case RR_Rotate_0:
+	case RR_Rotate_90:
+	case RR_Rotate_180:
+	case RR_Rotate_270:
+	    break;
+	default:
+	    /*
+	     * Invalid rotation
+	     */
+	    client->errorValue = stuff->rotation;
 	    if (outputs)
 		xfree (outputs);
 	    return BadValue;
 	}
-	
-	if (stuff->y + mode->mode.height > pScreen->height)
+    
+	if ((~crtc->rotations) & rotation)
 	{
-	    client->errorValue = stuff->y;
+	    /*
+	     * requested rotation or reflection not supported by screen
+	     */
+	    client->errorValue = stuff->rotation;
 	    if (outputs)
 		xfree (outputs);
-	    return BadValue;
+	    return BadMatch;
+	}
+    
+#ifdef RANDR_12_INTERFACE
+	/*
+	 * Check screen size bounds if the DDX provides a 1.2 interface
+	 * for setting screen size. Else, assume the CrtcSet sets
+	 * the size along with the mode
+	 */
+	if (pScrPriv->rrScreenSetSize)
+	{
+	    if (stuff->x + mode->mode.width > pScreen->width)
+	    {
+		client->errorValue = stuff->x;
+		if (outputs)
+		    xfree (outputs);
+		return BadValue;
+	    }
+	    
+	    if (stuff->y + mode->mode.height > pScreen->height)
+	    {
+		client->errorValue = stuff->y;
+		if (outputs)
+		    xfree (outputs);
+		return BadValue;
+	    }
 	}
-    }
 #endif
+    }
     
     /*
      * Make sure the requested set-time is not older than
diff-tree 219546fd76750f358ffb6738f17b9237c58c15a6 (from bde0a4c12cb393a6d7f1552b067624da1b0502ae)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Wed Sep 20 22:43:05 2006 -0700

    Steal Xinerama code from SiS driver. Add missing files.
    
    Provide a Xinerama implementation when DIX version isn't enabled. This
    version exposes each crtc as a separate 'screen' and reports the size of
    that patch. The extension also sends ConfigureNotify events to the root
    window whenever crtcs change so that applications will re-fetch xinerama
    information. This actually works for metacity.

diff --git a/randr/Makefile.am b/randr/Makefile.am
index a28ead0..91c4bc6 100644
--- a/randr/Makefile.am
+++ b/randr/Makefile.am
@@ -17,4 +17,5 @@ librandr_la_SOURCES =	\
 	rroutput.c	\
 	rrproperty.c	\
 	rrscreen.c	\
-	rrsdispatch.c
+	rrsdispatch.c	\
+	rrxinerama.c
diff --git a/randr/randr.c b/randr/randr.c
index 5f54dea..4ea72e5 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -311,7 +311,7 @@ RRExtensionInit (void)
     EventSwapVector[RREventBase + RRNotify] = (EventSwapPtr)
 	SRRNotifyEvent;
 
-    return;
+    RRXineramaExtensionInit();
 }
 
 static int
diff --git a/randr/randrstr.h b/randr/randrstr.h
index e459452..0b8c61e 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -305,6 +305,12 @@ RRScreenSizeSet (ScreenPtr  pScreen,
 		 CARD32	    mmHeight);
 
 /*
+ * Send ConfigureNotify event to root window when 'something' happens
+ */
+void
+RRSendConfigNotify (ScreenPtr pScreen);
+    
+/*
  * screen dispatch
  */
 int 
@@ -629,4 +635,8 @@ ProcRRListOutputProperties (ClientPtr cl
 int
 ProcRRDeleteOutputProperty (ClientPtr client);
 
+/* rrxinerama.c */
+void
+RRXineramaExtensionInit(void);
+
 #endif /* _RANDRSTR_H_ */
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index dfa9ca6..ebb2540 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -111,6 +111,7 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	    outputs = NULL;
 	}
 	crtc->outputs = outputs;
+	crtc->numOutputs = numOutputs;
     }
     for (i = 0; i < numOutputs; i++)
     {
@@ -158,7 +159,11 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	crtc->changed = TRUE;
     }
     if (crtc->changed)
+    {
+	if (!pScrPriv->changed)
+	    RRSendConfigNotify (pScreen);
 	pScrPriv->changed = TRUE;
+    }
     return TRUE;
 }
 
diff --git a/randr/rrinfo.c b/randr/rrinfo.c
new file mode 100644
index 0000000..491ac21
--- /dev/null
+++ b/randr/rrinfo.c
@@ -0,0 +1,337 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+#ifdef RANDR_10_INTERFACE
+static RRModePtr
+RROldModeAdd (RROutputPtr output, RRScreenSizePtr size, int refresh)
+{
+    ScreenPtr	pScreen = output->pScreen;
+    rrScrPriv(pScreen);
+    xRRModeInfo	modeInfo;
+    char	name[100];
+    RRModePtr	mode;
+    int		i;
+    RRModePtr   *modes;
+    
+    memset (&modeInfo, '\0', sizeof (modeInfo));
+    sprintf (name, "%dx%d", size->width, size->height);
+    
+    modeInfo.width = size->width;
+    modeInfo.height = size->height;
+    modeInfo.mmWidth = size->mmWidth;
+    modeInfo.mmHeight = size->mmHeight;
+    modeInfo.hTotal = size->width;
+    modeInfo.vTotal = size->height;
+    modeInfo.dotClock = ((CARD32) size->width * (CARD32) size->height *
+			 (CARD32) refresh);
+    modeInfo.nameLength = strlen (name);
+    mode = RRModeGet (pScreen, &modeInfo, name);
+    if (!mode)
+	return NULL;
+    for (i = 0; i < output->numModes; i++)
+	if (output->modes[i] == mode)
+	{
+	    RRModeDestroy (mode);
+	    return mode;
+	}
+    
+    if (output->numModes)
+	modes = xrealloc (output->modes, 
+			  (output->numModes + 1) * sizeof (RRModePtr));
+    else
+	modes = xalloc (sizeof (RRModePtr));
+    if (!modes)
+    {
+	RRModeDestroy (mode);
+	FreeResource (mode->mode.id, 0);
+	return NULL;
+    }
+    modes[output->numModes++] = mode;
+    output->modes = modes;
+    output->changed = TRUE;
+    pScrPriv->changed = TRUE;
+    return mode;
+}
+
+static void
+RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
+{
+    rrScrPriv(pScreen);
+    RROutputPtr	output;
+    RRCrtcPtr	crtc;
+    RRModePtr	mode, newMode = NULL;
+    int		i;
+    CARD16	minWidth = MAXSHORT, minHeight = MAXSHORT;
+    CARD16	maxWidth = 0, maxHeight = 0;
+    
+    /*
+     * First time through, create a crtc and output and hook
+     * them together
+     */
+    if (pScrPriv->numOutputs == 0 &&
+	pScrPriv->numCrtcs == 0)
+    {
+	crtc = RRCrtcCreate (pScreen, NULL);
+	if (!crtc)
+	    return;
+	output = RROutputCreate (pScreen, "default", 7, NULL);
+	if (!output)
+	    return;
+	RROutputSetCrtcs (output, &crtc, 1);
+	RROutputSetCrtc (output, crtc);
+	RROutputSetConnection (output, RR_Connected);
+#ifdef RENDER
+	RROutputSetSubpixelOrder (output, PictureGetSubpixelOrder (pScreen));
+#endif
+    }
+
+    output = RRFirstOutput (pScreen);
+    if (!output)
+	return;
+    crtc = output->crtc;
+
+    /* check rotations */
+    if (rotations != crtc->rotations)
+    {
+        crtc->rotations = rotations;
+	crtc->changed = TRUE;
+	pScrPriv->changed = TRUE;
+    }
+	
+    /* regenerate mode list */
+    for (i = 0; i < pScrPriv->nSizes; i++)
+    {
+	RRScreenSizePtr	size = &pScrPriv->pSizes[i];
+	int		r;
+
+	if (size->nRates)
+	{
+	    for (r = 0; r < size->nRates; r++)
+	    {
+		mode = RROldModeAdd (output, size, size->pRates[r].rate);
+		if (i == pScrPriv->size && 
+		    size->pRates[r].rate == pScrPriv->rate)
+		{
+		    newMode = mode;
+		}
+	    }
+	    xfree (size->pRates);
+	}
+	else
+	{
+	    mode = RROldModeAdd (output, size, 0);
+	    if (i == pScrPriv->size)
+		newMode = mode;
+	}
+    }
+    if (pScrPriv->nSizes)
+	xfree (pScrPriv->pSizes);
+    pScrPriv->pSizes = NULL;
+    pScrPriv->nSizes = 0;
+	    
+    /* find size bounds */
+    for (i = 0; i < output->numModes; i++) 
+    {
+	RRModePtr   mode = output->modes[i];
+        CARD16	    width = mode->mode.width;
+        CARD16	    height = mode->mode.height;
+	
+	if (width < minWidth) minWidth = width;
+	if (width > maxWidth) maxWidth = width;
+	if (height < minHeight) minHeight = height;
+	if (height > maxHeight) maxHeight = height;
+    }
+
+    if (minWidth != pScrPriv->minWidth) {
+	pScrPriv->minWidth = minWidth; pScrPriv->changed = TRUE;
+    }
+    if (maxWidth != pScrPriv->maxWidth) {
+	pScrPriv->maxWidth = maxWidth; pScrPriv->changed = TRUE;
+    }
+    if (minHeight != pScrPriv->minHeight) {
+	pScrPriv->minHeight = minHeight; pScrPriv->changed = TRUE;
+    }
+    if (maxHeight != pScrPriv->maxHeight) {
+	pScrPriv->maxHeight = maxHeight; pScrPriv->changed = TRUE;
+    }
+
+    /* notice current mode */
+    if (newMode)
+	RRCrtcNotify (output->crtc, newMode, 0, 0, pScrPriv->rotation,
+		      1, &output);
+}
+#endif
+
+/*
+ * Poll the driver for changed information
+ */
+Bool
+RRGetInfo (ScreenPtr pScreen)
+{
+    rrScrPriv (pScreen);
+    Rotation	    rotations;
+    int		    i;
+
+    for (i = 0; i < pScrPriv->numOutputs; i++)
+	pScrPriv->outputs[i]->changed = FALSE;
+    for (i = 0; i < pScrPriv->numCrtcs; i++)
+	pScrPriv->crtcs[i]->changed = FALSE;
+    
+    rotations = 0;
+    pScrPriv->changed = FALSE;
+    
+    if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
+	return FALSE;
+
+#if RANDR_10_INTERFACE
+    if (pScrPriv->nSizes)
+	RRScanOldConfig (pScreen, rotations);
+#endif
+    RRTellChanged (pScreen);
+    return TRUE;
+}
+
+#if RANDR_12_INTERFACE
+/*
+ * Register the range of sizes for the screen
+ */
+void
+RRScreenSetSizeRange (ScreenPtr	pScreen,
+		      CARD16	minWidth,
+		      CARD16	minHeight,
+		      CARD16	maxWidth,
+		      CARD16	maxHeight)
+{
+    rrScrPriv (pScreen);
+
+    if (!pScrPriv)
+	return;
+    pScrPriv->minWidth  = minWidth;
+    pScrPriv->minHeight = minHeight;
+    pScrPriv->maxWidth  = maxWidth;
+    pScrPriv->maxHeight = maxHeight;
+}
+#endif
+
+#ifdef RANDR_10_INTERFACE
+static Bool
+RRScreenSizeMatches (RRScreenSizePtr  a,
+		   RRScreenSizePtr  b)
+{
+    if (a->width != b->width)
+	return FALSE;
+    if (a->height != b->height)
+	return FALSE;
+    if (a->mmWidth != b->mmWidth)
+	return FALSE;
+    if (a->mmHeight != b->mmHeight)
+	return FALSE;
+    return TRUE;
+}
+
+RRScreenSizePtr
+RRRegisterSize (ScreenPtr	    pScreen,
+		short		    width, 
+		short		    height,
+		short		    mmWidth,
+		short		    mmHeight)
+{
+    rrScrPriv (pScreen);
+    int		    i;
+    RRScreenSize    tmp;
+    RRScreenSizePtr pNew;
+
+    if (!pScrPriv)
+	return 0;
+    
+    tmp.id = 0;
+    tmp.width = width;
+    tmp.height= height;
+    tmp.mmWidth = mmWidth;
+    tmp.mmHeight = mmHeight;
+    tmp.pRates = 0;
+    tmp.nRates = 0;
+    for (i = 0; i < pScrPriv->nSizes; i++)
+	if (RRScreenSizeMatches (&tmp, &pScrPriv->pSizes[i]))
+	    return &pScrPriv->pSizes[i];
+    pNew = xrealloc (pScrPriv->pSizes,
+		     (pScrPriv->nSizes + 1) * sizeof (RRScreenSize));
+    if (!pNew)
+	return 0;
+    pNew[pScrPriv->nSizes++] = tmp;
+    pScrPriv->pSizes = pNew;
+    return &pNew[pScrPriv->nSizes-1];
+}
+
+Bool RRRegisterRate (ScreenPtr		pScreen,
+		     RRScreenSizePtr	pSize,
+		     int		rate)
+{
+    rrScrPriv(pScreen);
+    int		    i;
+    RRScreenRatePtr pNew, pRate;
+
+    if (!pScrPriv)
+	return FALSE;
+    
+    for (i = 0; i < pSize->nRates; i++)
+	if (pSize->pRates[i].rate == rate)
+	    return TRUE;
+
+    pNew = xrealloc (pSize->pRates,
+		     (pSize->nRates + 1) * sizeof (RRScreenRate));
+    if (!pNew)
+	return FALSE;
+    pRate = &pNew[pSize->nRates++];
+    pRate->rate = rate;
+    pSize->pRates = pNew;
+    return TRUE;
+}
+
+Rotation
+RRGetRotation(ScreenPtr pScreen)
+{
+    RROutputPtr	output = RRFirstOutput (pScreen);
+
+    if (!output)
+	return RR_Rotate_0;
+
+    return output->crtc->rotation;
+}
+
+void
+RRSetCurrentConfig (ScreenPtr		pScreen,
+		    Rotation		rotation,
+		    int			rate,
+		    RRScreenSizePtr	pSize)
+{
+    rrScrPriv (pScreen);
+
+    if (!pScrPriv)
+	return;
+    pScrPriv->size = pSize - pScrPriv->pSizes;
+    pScrPriv->rotation = rotation;
+    pScrPriv->rate = rate;
+}
+#endif
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
new file mode 100644
index 0000000..cdafb5c
--- /dev/null
+++ b/randr/rrproperty.c
@@ -0,0 +1,430 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+#include "propertyst.h"
+#include "swaprep.h"
+
+static void
+RRDeliverEvent (ScreenPtr pScreen, xEvent *event, CARD32 mask)
+{
+}
+
+void
+RRDeleteAllOutputProperties (RROutputPtr output)
+{
+    PropertyPtr prop, next;
+    xRROutputPropertyNotifyEvent    event;
+
+    for (prop = output->properties; prop; prop = next)
+    {
+	next = prop->next;
+	event.type = RREventBase + RRNotify;
+	event.subCode = RRNotify_OutputProperty;
+	event.output = output->id;
+	event.state = PropertyDelete;
+	event.atom = prop->propertyName;
+	event.timestamp = currentTime.milliseconds;
+	RRDeliverEvent (output->pScreen, (xEvent *) &event, RROutputPropertyNotifyMask);
+        xfree(prop->data);
+        xfree(prop);
+    }
+}
+
+void
+RRDeleteOutputProperty (RROutputPtr output, Atom property)
+{
+    PropertyPtr	prop, *prev;
+    xRROutputPropertyNotifyEvent    event;
+
+    for (prev = &output->properties; (prop = *prev); prev = &(prop->next))
+	if (prop->propertyName == property)
+	    break;
+    if (prop)
+    {
+	*prev = prop->next;
+	event.type = RREventBase + RRNotify;
+	event.subCode = RRNotify_OutputProperty;
+	event.output = output->id;
+	event.state = PropertyDelete;
+	event.atom = prop->propertyName;
+	event.timestamp = currentTime.milliseconds;
+	RRDeliverEvent (output->pScreen, (xEvent *) &event, RROutputPropertyNotifyMask);
+        xfree(prop->data);
+        xfree(prop);
+    }
+}
+
+int
+RRChangeOutputProperty (RROutputPtr output, Atom property, Atom type,
+			int format, int mode, unsigned long len,
+			pointer value, Bool sendevent)
+{
+    PropertyPtr			    prop;
+    xRROutputPropertyNotifyEvent    event;
+    int				    sizeInBytes;
+    int				    totalSize;
+    pointer			    data;
+
+    sizeInBytes = format >> 3;
+    totalSize = len * sizeInBytes;
+
+    /* first see if property already exists */
+
+    for (prop = output->properties; prop; prop = prop->next)
+	if (prop->propertyName == property)
+	    break;
+    
+    if (!prop)   /* just add to list */
+    {
+        prop = (PropertyPtr)xalloc(sizeof(PropertyRec));
+	if (!prop)
+	    return(BadAlloc);
+        data = (pointer)xalloc(totalSize);
+	if (!data && len)
+	{
+	    xfree(prop);
+	    return(BadAlloc);
+	}
+        prop->propertyName = property;
+        prop->type = type;
+        prop->format = format;
+        prop->data = data;
+	if (len)
+	    memmove((char *)data, (char *)value, totalSize);
+	prop->size = len;
+        prop->next = output->properties;
+        output->properties = prop;
+    }
+    else
+    {
+	/* To append or prepend to a property the request format and type
+		must match those of the already defined property.  The
+		existing format and type are irrelevant when using the mode
+		"PropModeReplace" since they will be written over. */
+
+        if ((format != prop->format) && (mode != PropModeReplace))
+	    return(BadMatch);
+        if ((prop->type != type) && (mode != PropModeReplace))
+            return(BadMatch);
+        if (mode == PropModeReplace)
+        {
+	    if (totalSize != prop->size * (prop->format >> 3))
+	    {
+	    	data = (pointer)xrealloc(prop->data, totalSize);
+	    	if (!data && len)
+		    return(BadAlloc);
+            	prop->data = data;
+	    }
+	    if (len)
+		memmove((char *)prop->data, (char *)value, totalSize);
+	    prop->size = len;
+    	    prop->type = type;
+	    prop->format = format;
+	}
+	else if (len == 0)
+	{
+	    /* do nothing */
+	}
+        else if (mode == PropModeAppend)
+        {
+	    data = (pointer)xrealloc(prop->data,
+				     sizeInBytes * (len + prop->size));
+	    if (!data)
+		return(BadAlloc);
+            prop->data = data;
+	    memmove(&((char *)data)[prop->size * sizeInBytes], 
+		    (char *)value,
+		  totalSize);
+            prop->size += len;
+	}
+        else if (mode == PropModePrepend)
+        {
+            data = (pointer)xalloc(sizeInBytes * (len + prop->size));
+	    if (!data)
+		return(BadAlloc);
+	    memmove(&((char *)data)[totalSize], (char *)prop->data, 
+		  (int)(prop->size * sizeInBytes));
+            memmove((char *)data, (char *)value, totalSize);
+	    xfree(prop->data);
+            prop->data = data;
+            prop->size += len;
+	}
+    }
+    if (sendevent)
+    {
+	event.type = RREventBase + RRNotify;
+	event.subCode = RRNotify_OutputProperty;
+	event.output = output->id;
+	event.state = PropertyNewValue;
+	event.atom = prop->propertyName;
+	event.timestamp = currentTime.milliseconds;
+	RRDeliverEvent (output->pScreen, (xEvent *) &event, RROutputPropertyNotifyMask);
+    }
+    return(Success);
+}
+
+int
+ProcRRListOutputProperties (ClientPtr client)
+{
+    REQUEST(xRRListOutputPropertiesReq);
+    Atom			    *pAtoms = NULL, *temppAtoms;
+    xRRListOutputPropertiesReply    rep;
+    int				    numProps = 0;
+    RROutputPtr			    output;
+    PropertyPtr			    prop;
+    
+    REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
+
+    output = LookupOutput (client, stuff->output, SecurityReadAccess);
+    
+    if (!output)
+        return RRErrorBase + BadRROutput;
+
+    for (prop = output->properties; prop; prop = prop->next)
+	numProps++;
+    if (numProps)
+        if(!(pAtoms = (Atom *)ALLOCATE_LOCAL(numProps * sizeof(Atom))))
+            return(BadAlloc);
+
+    rep.type = X_Reply;
+    rep.nProperties = numProps;
+    rep.length = (numProps * sizeof(Atom)) >> 2;
+    rep.sequenceNumber = client->sequence;
+    temppAtoms = pAtoms;
+    for (prop = output->properties; prop; prop = prop->next)
+	*temppAtoms++ = prop->propertyName;
+
+    WriteReplyToClient(client, sizeof(xRRListOutputPropertiesReply), &rep);
+    if (numProps)
+    {
+        client->pSwapReplyFunc = (ReplySwapPtr)Swap32Write;
+        WriteSwappedDataToClient(client, numProps * sizeof(Atom), pAtoms);
+        DEALLOCATE_LOCAL(pAtoms);
+    }
+    return(client->noClientException);
+}
+
+int
+ProcRRChangeOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRChangeOutputPropertyReq);
+    RROutputPtr	    output;
+    char	    format, mode;
+    unsigned long   len;
+    int		    sizeInBytes;
+    int		    totalSize;
+    int		    err;
+
+    REQUEST_AT_LEAST_SIZE(xRRChangeOutputPropertyReq);
+    UpdateCurrentTime();
+    format = stuff->format;
+    mode = stuff->mode;
+    if ((mode != PropModeReplace) && (mode != PropModeAppend) &&
+	(mode != PropModePrepend))
+    {
+	client->errorValue = mode;
+	return BadValue;
+    }
+    if ((format != 8) && (format != 16) && (format != 32))
+    {
+	client->errorValue = format;
+        return BadValue;
+    }
+    len = stuff->nUnits;
+    if (len > ((0xffffffff - sizeof(xChangePropertyReq)) >> 2))
+	return BadLength;
+    sizeInBytes = format>>3;
+    totalSize = len * sizeInBytes;
+    REQUEST_FIXED_SIZE(xRRChangeOutputPropertyReq, totalSize);
+
+    output = LookupOutput (client, stuff->output, SecurityWriteAccess);
+    if (!output)
+	return RRErrorBase + BadRROutput;
+    
+    if (!ValidAtom(stuff->property))
+    {
+	client->errorValue = stuff->property;
+	return(BadAtom);
+    }
+    if (!ValidAtom(stuff->type))
+    {
+	client->errorValue = stuff->type;
+	return(BadAtom);
+    }
+
+    err = RRChangeOutputProperty(output, stuff->property,
+				 stuff->type, (int)format,
+				 (int)mode, len, (pointer)&stuff[1], TRUE);
+    if (err != Success)
+	return err;
+    else
+	return client->noClientException;
+}
+
+int
+ProcRRDeleteOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRDeleteOutputPropertyReq);
+    RROutputPtr	output;
+              
+    REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
+    UpdateCurrentTime();
+    output = LookupOutput (client, stuff->output, SecurityWriteAccess);
+    if (!output)
+        return RRErrorBase + BadRROutput;
+    
+    if (!ValidAtom(stuff->property))
+    {
+	client->errorValue = stuff->property;
+	return (BadAtom);
+    }
+
+
+    RRDeleteOutputProperty(output, stuff->property);
+    return client->noClientException;
+}
+
+int
+ProcRRGetOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRGetOutputPropertyReq);
+    PropertyPtr			prop, *prev;
+    unsigned long		n, len, ind;
+    RROutputPtr			output;
+    xRRGetOutputPropertyReply	reply;
+
+    REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq);
+    if (stuff->delete)
+	UpdateCurrentTime();
+    output = LookupOutput (client, stuff->output, 
+			   stuff->delete ? SecurityWriteAccess :
+			   SecurityReadAccess);
+    if (!output)
+	return RRErrorBase + BadRROutput;
+
+    if (!ValidAtom(stuff->property))
+    {
+	client->errorValue = stuff->property;
+	return(BadAtom);
+    }
+    if ((stuff->delete != xTrue) && (stuff->delete != xFalse))
+    {
+	client->errorValue = stuff->delete;
+	return(BadValue);
+    }
+    if ((stuff->type != AnyPropertyType) && !ValidAtom(stuff->type))
+    {
+	client->errorValue = stuff->type;
+	return(BadAtom);
+    }
+
+    for (prev = &output->properties; (prop = *prev); prev = &prop->next)
+	if (prop->propertyName == stuff->property) 
+	    break;
+
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    if (!prop) 
+    {
+	reply.nItems = 0;
+	reply.length = 0;
+	reply.bytesAfter = 0;
+	reply.propertyType = None;
+	reply.format = 0;
+	WriteReplyToClient(client, sizeof(xRRGetOutputPropertyReply), &reply);
+	return(client->noClientException);
+    }
+
+    /* If the request type and actual type don't match. Return the
+    property information, but not the data. */
+
+    if (((stuff->type != prop->type) &&
+	 (stuff->type != AnyPropertyType))
+       )
+    {
+	reply.bytesAfter = prop->size;
+	reply.format = prop->format;
+	reply.length = 0;
+	reply.nItems = 0;
+	reply.propertyType = prop->type;
+	WriteReplyToClient(client, sizeof(xRRGetOutputPropertyReply), &reply);
+	return(client->noClientException);
+    }
+
+/*
+ *  Return type, format, value to client
+ */
+    n = (prop->format/8) * prop->size; /* size (bytes) of prop */
+    ind = stuff->longOffset << 2;        
+
+   /* If longOffset is invalid such that it causes "len" to
+	    be negative, it's a value error. */
+
+    if (n < ind)
+    {
+	client->errorValue = stuff->longOffset;
+	return BadValue;
+    }
+
+    len = min(n - ind, 4 * stuff->longLength);
+
+    reply.bytesAfter = n - (ind + len);
+    reply.format = prop->format;
+    reply.length = (len + 3) >> 2;
+    reply.nItems = len / (prop->format / 8 );
+    reply.propertyType = prop->type;
+
+    if (stuff->delete && (reply.bytesAfter == 0))
+    {
+	xRROutputPropertyNotifyEvent    event;
+
+	event.type = RREventBase + RRNotify;
+	event.subCode = RRNotify_OutputProperty;
+	event.output = output->id;
+	event.state = PropertyDelete;
+	event.atom = prop->propertyName;
+	event.timestamp = currentTime.milliseconds;
+	RRDeliverEvent (output->pScreen, (xEvent *) &event, RROutputPropertyNotifyMask);
+    }
+
+    WriteReplyToClient(client, sizeof(xGenericReply), &reply);
+    if (len)
+    {
+	switch (reply.format) {
+	case 32: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap32Write; break;
+	case 16: client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write; break;
+	default: client->pSwapReplyFunc = (ReplySwapPtr)WriteToClient; break;
+	}
+	WriteSwappedDataToClient(client, len,
+				 (char *)prop->data + ind);
+    }
+
+    if (stuff->delete && (reply.bytesAfter == 0))
+    { /* delete the Property */
+	*prev = prop->next;
+	xfree(prop->data);
+	xfree(prop);
+    }
+    return(client->noClientException);
+}
+
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index e59947b..e382540 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -69,7 +69,7 @@ RREditConnectionInfo (ScreenPtr pScreen)
     root->mmHeight = pScreen->mmHeight;
 }
 
-static void
+void
 RRSendConfigNotify (ScreenPtr pScreen)
 {
     WindowPtr	pWin = WindowTable[pScreen->myNum];
diff --git a/randr/rrxinerama.c b/randr/rrxinerama.c
new file mode 100644
index 0000000..31f60cc
--- /dev/null
+++ b/randr/rrxinerama.c
@@ -0,0 +1,424 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+/*
+ * This Xinerama implementation comes from the SiS driver which has
+ * the following notice:
+ */
+/* 
+ * SiS driver main code
+ *
+ * Copyright (C) 2001-2005 by Thomas Winischhofer, Vienna, Austria.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1) Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2) Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3) The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Thomas Winischhofer <thomas at winischhofer.net>
+ *	- driver entirely rewritten since 2001, only basic structure taken from
+ *	  old code (except sis_dri.c, sis_shadow.c, sis_accel.c and parts of
+ *	  sis_dga.c; these were mostly taken over; sis_dri.c was changed for
+ *	  new versions of the DRI layer)
+ *
+ * This notice covers the entire driver code unless indicated otherwise.
+ *
+ * Formerly based on code which was
+ * 	     Copyright (C) 1998, 1999 by Alan Hourihane, Wigan, England.
+ * 	     Written by:
+ *           Alan Hourihane <alanh at fairlite.demon.co.uk>,
+ *           Mike Chapman <mike at paranoia.com>,
+ *           Juanjo Santamarta <santamarta at ctv.es>,
+ *           Mitani Hiroshi <hmitani at drl.mei.co.jp>,
+ *           David Thomas <davtom at dream.org.uk>.
+ */
+
+#include "randrstr.h"
+#include "swaprep.h"
+#include <X11/extensions/panoramiXproto.h>
+
+#define RR_XINERAMA_MAJOR_VERSION   1
+#define RR_XINERAMA_MINOR_VERSION   1
+
+/* Xinerama is not multi-screen capable; just report about screen 0 */
+#define RR_XINERAMA_SCREEN  0
+
+static int ProcRRXineramaQueryVersion(ClientPtr client);
+static int ProcRRXineramaGetState(ClientPtr client);
+static int ProcRRXineramaGetScreenCount(ClientPtr client);
+static int ProcRRXineramaGetScreenSize(ClientPtr client);
+static int ProcRRXineramaIsActive(ClientPtr client);
+static int ProcRRXineramaQueryScreens(ClientPtr client);
+static int SProcRRXineramaDispatch(ClientPtr client);
+
+/* Proc */
+
+int
+ProcRRXineramaQueryVersion(ClientPtr client)
+{
+    xPanoramiXQueryVersionReply	  rep;
+    register int		  n;
+
+    REQUEST_SIZE_MATCH(xPanoramiXQueryVersionReq);
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.majorVersion = RR_XINERAMA_MAJOR_VERSION;
+    rep.minorVersion = RR_XINERAMA_MINOR_VERSION;
+    if(client->swapped) {
+        swaps(&rep.sequenceNumber, n);
+        swapl(&rep.length, n);
+        swaps(&rep.majorVersion, n);
+        swaps(&rep.minorVersion, n);
+    }
+    WriteToClient(client, sizeof(xPanoramiXQueryVersionReply), (char *)&rep);
+    return (client->noClientException);
+}
+
+int
+ProcRRXineramaGetState(ClientPtr client)
+{
+    REQUEST(xPanoramiXGetStateReq);
+    WindowPtr			pWin;
+    xPanoramiXGetStateReply	rep;
+    register int		n;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    Bool			active = FALSE;
+
+    REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
+    pWin = LookupWindow(stuff->window, client);
+    if(!pWin) return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    if (pScrPriv)
+    {
+	/* XXX do we need more than this? */
+	active = TRUE;
+    }
+
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.state = active;
+    if(client->swapped) {
+       swaps (&rep.sequenceNumber, n);
+       swapl (&rep.length, n);
+       swaps (&rep.state, n);
+    }
+    WriteToClient(client, sizeof(xPanoramiXGetStateReply), (char *)&rep);
+    return client->noClientException;
+}
+
+static Bool
+RRXineramaScreenActive (ScreenPtr pScreen)
+{
+    return rrGetScrPriv(pScreen) != NULL;
+}
+
+static Bool
+RRXineramaCrtcActive (RRCrtcPtr crtc)
+{
+    return crtc->mode != NULL && crtc->numOutputs > 0;
+}
+
+static int
+RRXineramaScreenCount (ScreenPtr pScreen)
+{
+    int	i, n;
+    
+    n = 0;
+    if (RRXineramaScreenActive (pScreen))
+    {
+	rrScrPriv(pScreen);
+	for (i = 0; i < pScrPriv->numCrtcs; i++)
+	    if (RRXineramaCrtcActive (pScrPriv->crtcs[i]))
+		n++;
+    }
+    return n;
+}
+
+int
+ProcRRXineramaGetScreenCount(ClientPtr client)
+{
+    REQUEST(xPanoramiXGetScreenCountReq);
+    WindowPtr				pWin;
+    xPanoramiXGetScreenCountReply	rep;
+    register int			n;
+
+    REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
+    pWin = LookupWindow(stuff->window, client);
+    if(!pWin) return BadWindow;
+    
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.ScreenCount = RRXineramaScreenCount (pWin->drawable.pScreen);
+    if(client->swapped) {
+       swaps(&rep.sequenceNumber, n);
+       swapl(&rep.length, n);
+       swaps(&rep.ScreenCount, n);
+    }
+    WriteToClient(client, sizeof(xPanoramiXGetScreenCountReply), (char *)&rep);
+    return client->noClientException;
+}
+
+int
+ProcRRXineramaGetScreenSize(ClientPtr client)
+{
+    REQUEST(xPanoramiXGetScreenSizeReq);
+    WindowPtr				pWin, pRoot;
+    ScreenPtr				pScreen;
+    xPanoramiXGetScreenSizeReply	rep;
+    register int			n;
+
+    REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
+    pWin = LookupWindow (stuff->window, client);
+    if(!pWin)  return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pRoot = WindowTable[pScreen->myNum];
+    
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.width  = pRoot->drawable.width;
+    rep.height = pRoot->drawable.height;
+    if(client->swapped) {
+       swaps(&rep.sequenceNumber, n);
+       swapl(&rep.length, n);
+       swaps(&rep.width, n);
+       swaps(&rep.height, n);
+    }
+    WriteToClient(client, sizeof(xPanoramiXGetScreenSizeReply), (char *)&rep);
+    return client->noClientException;
+}
+
+int
+ProcRRXineramaIsActive(ClientPtr client)
+{
+    xXineramaIsActiveReply	rep;
+
+    REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
+	
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.state = RRXineramaScreenActive (screenInfo.screens[RR_XINERAMA_SCREEN]);
+    if(client->swapped) {
+	register int n;
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swapl(&rep.state, n);
+    }
+    WriteToClient(client, sizeof(xXineramaIsActiveReply), (char *) &rep);
+    return client->noClientException;
+}
+
+int
+ProcRRXineramaQueryScreens(ClientPtr client)
+{
+    xXineramaQueryScreensReply	rep;
+    ScreenPtr	pScreen = screenInfo.screens[RR_XINERAMA_SCREEN];
+
+    REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
+
+    rep.type = X_Reply;
+    rep.sequenceNumber = client->sequence;
+    rep.number = RRXineramaScreenCount (pScreen);
+    rep.length = rep.number * sz_XineramaScreenInfo >> 2;
+    if(client->swapped) {
+	register int n;
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swapl(&rep.number, n);
+    }
+    WriteToClient(client, sizeof(xXineramaQueryScreensReply), (char *)&rep);
+
+    if(rep.number) {
+	rrScrPriv(pScreen);
+	xXineramaScreenInfo scratch;
+	int i;
+
+	for(i = 0; i < pScrPriv->numCrtcs; i++) {
+	    RRCrtcPtr	crtc = pScrPriv->crtcs[i];
+	    if (RRXineramaCrtcActive (crtc))
+	    {
+		scratch.x_org  = crtc->x;
+		scratch.y_org  = crtc->y;
+		scratch.width  = crtc->mode->mode.width;
+		scratch.height = crtc->mode->mode.height;
+		if(client->swapped) {
+		    register int n;
+		    swaps(&scratch.x_org, n);
+		    swaps(&scratch.y_org, n);
+		    swaps(&scratch.width, n);
+		    swaps(&scratch.height, n);
+		}
+		WriteToClient(client, sz_XineramaScreenInfo, (char *)&scratch);
+	    }
+	}
+    }
+
+    return client->noClientException;
+}
+
+static int
+ProcRRXineramaDispatch(ClientPtr client)
+{
+    REQUEST(xReq);
+    switch (stuff->data) {
+	case X_PanoramiXQueryVersion:
+	     return ProcRRXineramaQueryVersion(client);
+	case X_PanoramiXGetState:
+	     return ProcRRXineramaGetState(client);
+	case X_PanoramiXGetScreenCount:
+	     return ProcRRXineramaGetScreenCount(client);
+	case X_PanoramiXGetScreenSize:
+	     return ProcRRXineramaGetScreenSize(client);
+	case X_XineramaIsActive:
+	     return ProcRRXineramaIsActive(client);
+	case X_XineramaQueryScreens:
+	     return ProcRRXineramaQueryScreens(client);
+    }
+    return BadRequest;
+}
+
+/* SProc */
+
+static int
+SProcRRXineramaQueryVersion (ClientPtr client)
+{
+    REQUEST(xPanoramiXQueryVersionReq);
+    register int n;
+    swaps(&stuff->length,n);
+    REQUEST_SIZE_MATCH (xPanoramiXQueryVersionReq);
+    return ProcRRXineramaQueryVersion(client);
+}
+
+static int
+SProcRRXineramaGetState(ClientPtr client)
+{
+    REQUEST(xPanoramiXGetStateReq);
+    register int n;
+    swaps (&stuff->length, n);
+    REQUEST_SIZE_MATCH(xPanoramiXGetStateReq);
+    return ProcRRXineramaGetState(client);
+}
+
+static int
+SProcRRXineramaGetScreenCount(ClientPtr client)
+{
+    REQUEST(xPanoramiXGetScreenCountReq);
+    register int n;
+    swaps (&stuff->length, n);
+    REQUEST_SIZE_MATCH(xPanoramiXGetScreenCountReq);
+    return ProcRRXineramaGetScreenCount(client);
+}
+
+static int
+SProcRRXineramaGetScreenSize(ClientPtr client)
+{
+    REQUEST(xPanoramiXGetScreenSizeReq);
+    register int n;
+    swaps (&stuff->length, n);
+    REQUEST_SIZE_MATCH(xPanoramiXGetScreenSizeReq);
+    return ProcRRXineramaGetScreenSize(client);
+}
+
+static int
+SProcRRXineramaIsActive(ClientPtr client)
+{
+    REQUEST(xXineramaIsActiveReq);
+    register int n;
+    swaps (&stuff->length, n);
+    REQUEST_SIZE_MATCH(xXineramaIsActiveReq);
+    return ProcRRXineramaIsActive(client);
+}
+
+static int
+SProcRRXineramaQueryScreens(ClientPtr client)
+{
+    REQUEST(xXineramaQueryScreensReq);
+    register int n;
+    swaps (&stuff->length, n);
+    REQUEST_SIZE_MATCH(xXineramaQueryScreensReq);
+    return ProcRRXineramaQueryScreens(client);
+}
+
+int
+SProcRRXineramaDispatch(ClientPtr client)
+{
+    REQUEST(xReq);
+    switch (stuff->data) {
+	case X_PanoramiXQueryVersion:
+	     return SProcRRXineramaQueryVersion(client);
+	case X_PanoramiXGetState:
+	     return SProcRRXineramaGetState(client);
+	case X_PanoramiXGetScreenCount:
+	     return SProcRRXineramaGetScreenCount(client);
+	case X_PanoramiXGetScreenSize:
+	     return SProcRRXineramaGetScreenSize(client);
+	case X_XineramaIsActive:
+	     return SProcRRXineramaIsActive(client);
+	case X_XineramaQueryScreens:
+	     return SProcRRXineramaQueryScreens(client);
+    }
+    return BadRequest;
+}
+
+static void
+RRXineramaResetProc(ExtensionEntry* extEntry)
+{
+}
+
+void
+RRXineramaExtensionInit(void)
+{
+#ifdef PANORAMIX
+    if(!noPanoramiXExtension)
+	return;
+#endif
+
+    (void) AddExtension(PANORAMIX_PROTOCOL_NAME, 0,0,
+			ProcRRXineramaDispatch,
+			SProcRRXineramaDispatch,
+			RRXineramaResetProc,
+			StandardMinorOpcode);
+}
diff-tree bde0a4c12cb393a6d7f1552b067624da1b0502ae (from 09f7499851bd2f2eba1e30460c61c7a82ed9e853)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Wed Sep 20 19:42:34 2006 -0700

    RRSetCrtcConfig status fix. RRGetScreenResources timestamp fix.
    
    RRSetCrtcConfig was returning the wrong status values.
    RRGetScreenResources was always returning currentTime.

diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index 90d609e..dfa9ca6 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -628,8 +628,13 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	goto sendReply;
     }
 
-    rep.status = RRCrtcSet (crtc, mode, stuff->x, stuff->y,
-			    rotation, numOutputs, outputs);
+    if (!RRCrtcSet (crtc, mode, stuff->x, stuff->y,
+		   rotation, numOutputs, outputs))
+    {
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    rep.status = RRSetConfigSuccess;
     
 sendReply:
     if (outputs)
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 617ae41..e59947b 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -360,8 +360,8 @@ ProcRRGetScreenResources (ClientPtr clie
 	rep.type = X_Reply;
 	rep.sequenceNumber = client->sequence;
 	rep.length = 0;
-	rep.timestamp = currentTime.milliseconds;
-	rep.configTimestamp = currentTime.milliseconds;
+	rep.timestamp = pScrPriv->lastSetTime.milliseconds;
+	rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
 	rep.nCrtcs = pScrPriv->numCrtcs;
 	rep.nOutputs = pScrPriv->numOutputs;
 	rep.nModes = pScrPriv->numModes;;
diff-tree 09f7499851bd2f2eba1e30460c61c7a82ed9e853 (from 9f870e0aa1ada238d6a0cd099996e8c47f6ba1d9)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Wed Sep 20 13:15:20 2006 -0700

    typo

diff --git a/randr/rroutput.c b/randr/rroutput.c
index a4f5a66..90b2b98 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -194,7 +194,7 @@ void
 RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc)
 {
     if (output->crtc == crtc)
-	return TRUE;
+	return;
     output->crtc = crtc;
     output->changed = TRUE;
 }
diff-tree 9f870e0aa1ada238d6a0cd099996e8c47f6ba1d9 (from d08718d8fd31477e90f13b9e122504c515b46ee0)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Wed Sep 20 13:14:53 2006 -0700

    When setting output state, leave output unchanged when setting to current.

diff --git a/randr/randrstr.h b/randr/randrstr.h
index 8027262..e459452 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -77,6 +77,7 @@ struct _rrMode {
     int		    refcnt;
     xRRModeInfo	    mode;
     char	    *name;
+    void	    *devPrivate;
 };
 
 struct _rrCrtc {
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 3d4c163..a4f5a66 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -88,7 +88,16 @@ RROutputSetClones (RROutputPtr  output,
 		   int		numClones)
 {
     RROutputPtr	*newClones;
+    int		i;
 
+    if (numClones == output->numClones)
+    {
+	for (i = 0; i < numClones; i++)
+	    if (output->clones[i] != clones[i])
+		break;
+	if (i == numClones)
+	    return TRUE;
+    }
     if (numClones)
     {
 	newClones = xalloc (numClones * sizeof (RROutputPtr));
@@ -112,6 +121,20 @@ RROutputSetModes (RROutputPtr	output,
 		  int		numModes)
 {
     RRModePtr	*newModes;
+    int		i;
+
+    if (numModes == output->numModes)
+    {
+	for (i = 0; i < numModes; i++)
+	    if (output->modes[i] != modes[i])
+		break;
+	if (i == numModes)
+	{
+	    for (i = 0; i < numModes; i++)
+		RRModeDestroy (modes[i]);
+	    return TRUE;
+	}
+    }
 
     if (numModes)
     {
@@ -122,7 +145,11 @@ RROutputSetModes (RROutputPtr	output,
     else
 	newModes = NULL;
     if (output->modes)
+    {
+	for (i = 0; i < output->numModes; i++)
+	    RRModeDestroy (output->modes[i]);
 	xfree (output->modes);
+    }
     memcpy (newModes, modes, numModes * sizeof (RRModePtr));
     output->modes = newModes;
     output->numModes = numModes;
@@ -136,7 +163,16 @@ RROutputSetCrtcs (RROutputPtr	output,
 		  int		numCrtcs)
 {
     RRCrtcPtr	*newCrtcs;
+    int		i;
 
+    if (numCrtcs == output->numCrtcs)
+    {
+	for (i = 0; i < numCrtcs; i++)
+	    if (output->crtcs[i] != crtcs[i])
+		break;
+	if (i == numCrtcs)
+	    return TRUE;
+    }
     if (numCrtcs)
     {
 	newCrtcs = xalloc (numCrtcs * sizeof (RRCrtcPtr));
@@ -157,6 +193,8 @@ RROutputSetCrtcs (RROutputPtr	output,
 void
 RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc)
 {
+    if (output->crtc == crtc)
+	return TRUE;
     output->crtc = crtc;
     output->changed = TRUE;
 }
@@ -165,6 +203,8 @@ Bool
 RROutputSetConnection (RROutputPtr  output,
 		       CARD8	    connection)
 {
+    if (output->connection == connection)
+	return TRUE;
     output->connection = connection;
     output->changed = TRUE;
     return TRUE;
@@ -174,6 +214,9 @@ Bool
 RROutputSetSubpixelOrder (RROutputPtr output,
 			  int	      subpixelOrder)
 {
+    if (output->subpixelOrder == subpixelOrder)
+	return TRUE;
+
     output->subpixelOrder = subpixelOrder;
     output->changed = TRUE;
     return TRUE;
diff-tree d08718d8fd31477e90f13b9e122504c515b46ee0 (from ef1f3248cb5fff0a02c0059f865c4d931eba23a6)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Wed Sep 20 12:05:52 2006 -0700

    Avoid calling xalloc(0). Change rrScreenSizeSet to rrScreenSetSize.

diff --git a/randr/randr.c b/randr/randr.c
index 5f6ef62..5f54dea 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -198,7 +198,7 @@ Bool RRScreenInit(ScreenPtr pScreen)
     pScrPriv->maxHeight = pScrPriv->minHeight = pScreen->height;
     
 #if RANDR_12_INTERFACE
-    pScrPriv->rrScreenSizeSet = NULL;
+    pScrPriv->rrScreenSetSize = NULL;
     pScrPriv->rrCrtcSet = NULL;
     pScrPriv->rrCrtcSetGamma = NULL;
 #endif
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 26c1806..8027262 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -174,7 +174,7 @@ typedef struct _rrScrPriv {
 #endif
     RRGetInfoProcPtr	    rrGetInfo;
 #if RANDR_12_INTERFACE
-    RRScreenSetSizeProcPtr  rrScreenSizeSet;
+    RRScreenSetSizeProcPtr  rrScreenSetSize;
     RRCrtcSetProcPtr	    rrCrtcSet;
     RRCrtcSetGammaProcPtr   rrCrtcSetGamma;
 #endif
@@ -521,7 +521,7 @@ RRClientKnowsRates (ClientPtr	pClient);
 RRModePtr
 RRModeGet (ScreenPtr	pScreen,
 	   xRRModeInfo	*modeInfo,
-	   char		*name);
+	   const char	*name);
 
 /*
  * Destroy a mode.
@@ -555,7 +555,7 @@ ProcRRDeleteOutputMode (ClientPtr client
 
 RROutputPtr
 RROutputCreate (ScreenPtr   pScreen,
-		char	    *name,
+		const char  *name,
 		int	    nameLength,
 		void	    *devPrivate);
 
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index c55e088..90d609e 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -94,13 +94,22 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
     {
 	RROutputPtr *outputs;
 	
-	if (crtc->numOutputs)
-	    outputs = xrealloc (crtc->outputs,
-				numOutputs * sizeof (RROutputPtr));
+	if (numOutputs)
+	{
+	    if (crtc->numOutputs)
+		outputs = xrealloc (crtc->outputs,
+				    numOutputs * sizeof (RROutputPtr));
+	    else
+		outputs = xalloc (numOutputs * sizeof (RROutputPtr));
+	    if (!outputs)
+		return FALSE;
+	}
 	else
-	    outputs = xalloc (numOutputs * sizeof (RROutputPtr));
-	if (!outputs)
-	    return FALSE;
+	{
+	    if (crtc->outputs)
+		xfree (crtc->outputs);
+	    outputs = NULL;
+	}
 	crtc->outputs = outputs;
     }
     for (i = 0; i < numOutputs; i++)
@@ -300,9 +309,14 @@ RRCrtcGammaSetSize (RRCrtcPtr	crtc,
 
     if (size == crtc->gammaSize)
 	return TRUE;
-    gamma = xalloc (size * 3 * sizeof (CARD16));
-    if (!gamma)
-	return FALSE;
+    if (size)
+    {
+	gamma = xalloc (size * 3 * sizeof (CARD16));
+	if (!gamma)
+	    return FALSE;
+    }
+    else
+	gamma = NULL;
     if (crtc->gammaRed)
 	xfree (crtc->gammaRed);
     crtc->gammaRed = gamma;
@@ -376,9 +390,14 @@ ProcRRGetCrtcInfo (ClientPtr client)
     rep.length = rep.nOutput + rep.nPossibleOutput;
 
     extraLen = rep.length << 2;
-    extra = xalloc (extraLen);
-    if (!extra)
-	return BadAlloc;
+    if (extraLen)
+    {
+	extra = xalloc (extraLen);
+	if (!extra)
+	    return BadAlloc;
+    }
+    else
+	extra = NULL;
 
     outputs = (RROutput *) extra;
     possible = (RROutput *) (outputs + rep.nOutput);
@@ -467,9 +486,14 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	if (numOutputs == 0)
 	    return BadMatch;
     }
-    outputs = xalloc (numOutputs * sizeof (RROutputPtr));
-    if (!outputs)
-	return BadAlloc;
+    if (numOutputs)
+    {
+	outputs = xalloc (numOutputs * sizeof (RROutputPtr));
+	if (!outputs)
+	    return BadAlloc;
+    }
+    else
+	outputs = NULL;
     
     outputIds = (RROutput *) (stuff + 1);
     for (i = 0; i < numOutputs; i++)
@@ -574,7 +598,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
      * for setting screen size. Else, assume the CrtcSet sets
      * the size along with the mode
      */
-    if (pScrPriv->rrScreenSizeSet)
+    if (pScrPriv->rrScreenSetSize)
     {
 	if (stuff->x + mode->mode.width > pScreen->width)
 	{
diff --git a/randr/rrmode.c b/randr/rrmode.c
index ab0ea18..23ac530 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -27,7 +27,7 @@ RESTYPE	RRModeType;
 RRModePtr
 RRModeGet (ScreenPtr	pScreen,
 	   xRRModeInfo	*modeInfo,
-	   char		*name)
+	   const char	*name)
 {
     rrScrPriv (pScreen);
     int	i;
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 07dabad..3d4c163 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -30,7 +30,7 @@ RESTYPE	RROutputType;
 
 RROutputPtr
 RROutputCreate (ScreenPtr   pScreen,
-		char	    *name,
+		const char  *name,
 		int	    nameLength,
 		void	    *devPrivate)
 {
@@ -89,9 +89,14 @@ RROutputSetClones (RROutputPtr  output,
 {
     RROutputPtr	*newClones;
 
-    newClones = xalloc (numClones * sizeof (RROutputPtr));
-    if (!newClones)
-	return FALSE;
+    if (numClones)
+    {
+	newClones = xalloc (numClones * sizeof (RROutputPtr));
+	if (!newClones)
+	    return FALSE;
+    }
+    else
+	newClones = NULL;
     if (output->clones)
 	xfree (output->clones);
     memcpy (newClones, clones, numClones * sizeof (RROutputPtr));
@@ -108,9 +113,14 @@ RROutputSetModes (RROutputPtr	output,
 {
     RRModePtr	*newModes;
 
-    newModes = xalloc (numModes * sizeof (RRModePtr));
-    if (!newModes)
-	return FALSE;
+    if (numModes)
+    {
+	newModes = xalloc (numModes * sizeof (RRModePtr));
+	if (!newModes)
+	    return FALSE;
+    }
+    else
+	newModes = NULL;
     if (output->modes)
 	xfree (output->modes);
     memcpy (newModes, modes, numModes * sizeof (RRModePtr));
@@ -127,9 +137,14 @@ RROutputSetCrtcs (RROutputPtr	output,
 {
     RRCrtcPtr	*newCrtcs;
 
-    newCrtcs = xalloc (numCrtcs * sizeof (RRCrtcPtr));
-    if (!newCrtcs)
-	return FALSE;
+    if (numCrtcs)
+    {
+	newCrtcs = xalloc (numCrtcs * sizeof (RRCrtcPtr));
+	if (!newCrtcs)
+	    return FALSE;
+    }
+    else
+	newCrtcs = NULL;
     if (output->crtcs)
 	xfree (output->crtcs);
     memcpy (newCrtcs, crtcs, numCrtcs * sizeof (RRCrtcPtr));
@@ -265,9 +280,14 @@ ProcRRGetOutputInfo (ClientPtr client)
 		  ((rep.nameLength + 3) >> 2));
 
     extraLen = rep.length << 2;
-    extra = xalloc (extraLen);
-    if (!extra)
-	return BadAlloc;
+    if (extraLen)
+    {
+	extra = xalloc (extraLen);
+	if (!extra)
+	    return BadAlloc;
+    }
+    else
+	extra = NULL;
 
     crtcs = (RRCrtc *) extra;
     modes = (RRMode *) (crtcs + output->numCrtcs);
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 58d5152..617ae41 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -187,9 +187,9 @@ RRScreenSizeSet (ScreenPtr  pScreen,
     rrScrPriv(pScreen);
 
 #if RANDR_12_INTERFACE
-    if (pScrPriv->rrScreenSizeSet)
+    if (pScrPriv->rrScreenSetSize)
     {
-	return (*pScrPriv->rrScreenSizeSet) (pScreen,
+	return (*pScrPriv->rrScreenSetSize) (pScreen,
 					     width, height,
 					     mmWidth, mmHeight);
     }
@@ -376,9 +376,14 @@ ProcRRGetScreenResources (ClientPtr clie
 		      ((rep.nbytesNames + 3) >> 2));
 	
 	extraLen = rep.length << 2;
-	extra = xalloc (extraLen);
-	if (!extra)
-	    return BadAlloc;
+	if (extraLen)
+	{
+	    extra = xalloc (extraLen);
+	    if (!extra)
+		return BadAlloc;
+	}
+	else
+	    extra = NULL;
 
 	crtcs = (RRCrtc *) extra;
 	outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs);
@@ -595,12 +600,18 @@ ProcRRGetScreenInfo (ClientPtr client)
 	extraLen = (rep.nSizes * sizeof (xScreenSizes) +
 		    rep.nrateEnts * sizeof (CARD16));
 
-	extra = (CARD8 *) xalloc (extraLen);
-	if (!extra)
+	if (extraLen)
 	{
-	    xfree (pData);
-	    return BadAlloc;
+	    extra = (CARD8 *) xalloc (extraLen);
+	    if (!extra)
+	    {
+		xfree (pData);
+		return BadAlloc;
+	    }
 	}
+	else
+	    extra = NULL;
+
 	/*
 	 * First comes the size information
 	 */
diff-tree ef1f3248cb5fff0a02c0059f865c4d931eba23a6 (from 07112adb0802d28488de5a495aa61bb3cfc280b6)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Tue Sep 19 22:48:54 2006 -0700

    Split out 1.0-style info and new property routines to their own files.

diff --git a/randr/Makefile.am b/randr/Makefile.am
index 0a73557..a28ead0 100644
--- a/randr/Makefile.am
+++ b/randr/Makefile.am
@@ -12,7 +12,9 @@ librandr_la_SOURCES =	\
 	randrstr.h	\
 	rrcrtc.c	\
 	rrdispatch.c	\
+	rrinfo.c	\
 	rrmode.c	\
 	rroutput.c	\
+	rrproperty.c	\
 	rrscreen.c	\
 	rrsdispatch.c
diff --git a/randr/mirandr.c b/randr/mirandr.c
index a57a157..bcc8e0f 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -108,11 +108,13 @@ miRandRInit (ScreenPtr pScreen)
     output = RROutputCreate (pScreen, "screen", 6, NULL);
     if (!output)
 	return FALSE;
-    if (!RROutputSet (output, 
-		      NULL, 0,  /* clones */
-		      &mode, 1, /* modes */
-		      &crtc, 1, /* crtcs */
-		      RR_Connected))
+    if (!RROutputSetClones (output, NULL, 0))
+	return FALSE;
+    if (!RROutputSetModes (output, &mode, 1))
+	return FALSE;
+    if (!RROutputSetCrtcs (output, &crtc, 1))
+	return FALSE;
+    if (!RROutputSetConnection (output, RR_Connected))
 	return FALSE;
     RRCrtcNotify (crtc, mode, 0, 0, RR_Rotate_0, 1, &output);
 #endif
diff --git a/randr/randr.c b/randr/randr.c
index beddb50..5f6ef62 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -198,7 +198,9 @@ Bool RRScreenInit(ScreenPtr pScreen)
     pScrPriv->maxHeight = pScrPriv->minHeight = pScreen->height;
     
 #if RANDR_12_INTERFACE
-    pScrPriv->rrCrtcSet = 0;
+    pScrPriv->rrScreenSizeSet = NULL;
+    pScrPriv->rrCrtcSet = NULL;
+    pScrPriv->rrCrtcSetGamma = NULL;
 #endif
 #if RANDR_10_INTERFACE    
     pScrPriv->rrSetConfig = 0;
@@ -400,196 +402,6 @@ RRFirstOutput (ScreenPtr pScreen)
     return NULL;
 }
 
-#ifdef RANDR_10_INTERFACE
-static RRModePtr
-RROldModeAdd (RROutputPtr output, RRScreenSizePtr size, int refresh)
-{
-    ScreenPtr	pScreen = output->pScreen;
-    rrScrPriv(pScreen);
-    xRRModeInfo	modeInfo;
-    char	name[100];
-    RRModePtr	mode;
-    int		i;
-    RRModePtr   *modes;
-    
-    memset (&modeInfo, '\0', sizeof (modeInfo));
-    sprintf (name, "%dx%d", size->width, size->height);
-    
-    modeInfo.width = size->width;
-    modeInfo.height = size->height;
-    modeInfo.mmWidth = size->mmWidth;
-    modeInfo.mmHeight = size->mmHeight;
-    modeInfo.hTotal = size->width;
-    modeInfo.vTotal = size->height;
-    modeInfo.dotClock = ((CARD32) size->width * (CARD32) size->width *
-			 (CARD32) refresh);
-    modeInfo.nameLength = strlen (name);
-    mode = RRModeGet (pScreen, &modeInfo, name);
-    if (!mode)
-	return NULL;
-    for (i = 0; i < output->numModes; i++)
-	if (output->modes[i] == mode)
-	{
-	    RRModeDestroy (mode);
-	    return mode;
-	}
-    
-    if (output->numModes)
-	modes = xrealloc (output->modes, 
-			  (output->numModes + 1) * sizeof (RRModePtr));
-    else
-	modes = xalloc (sizeof (RRModePtr));
-    if (!modes)
-    {
-	RRModeDestroy (mode);
-	FreeResource (mode->mode.id, 0);
-	return NULL;
-    }
-    modes[output->numModes++] = mode;
-    output->modes = modes;
-    output->changed = TRUE;
-    pScrPriv->changed = TRUE;
-    return mode;
-}
-
-static void
-RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
-{
-    rrScrPriv(pScreen);
-    RROutputPtr	output;
-    RRCrtcPtr	crtc;
-    RRModePtr	mode, newMode = NULL;
-    int		i;
-    CARD16	minWidth = MAXSHORT, minHeight = MAXSHORT;
-    CARD16	maxWidth = 0, maxHeight = 0;
-    
-    /*
-     * First time through, create a crtc and output and hook
-     * them together
-     */
-    if (pScrPriv->numOutputs == 0 &&
-	pScrPriv->numCrtcs == 0)
-    {
-	crtc = RRCrtcCreate (pScreen, NULL);
-	if (!crtc)
-	    return;
-	output = RROutputCreate (pScreen, "default", 7, NULL);
-	if (!output)
-	    return;
-	RROutputSetCrtcs (output, &crtc, 1);
-	RROutputSetCrtc (output, crtc);
-	RROutputSetConnection (output, RR_Connected);
-#ifdef RENDER
-	RROutputSetSubpixelOrder (output, PictureGetSubpixelOrder (pScreen));
-#endif
-    }
-
-    output = RRFirstOutput (pScreen);
-    if (!output)
-	return;
-    crtc = output->crtc;
-
-    /* check rotations */
-    if (rotations != crtc->rotations)
-    {
-        crtc->rotations = rotations;
-	crtc->changed = TRUE;
-	pScrPriv->changed = TRUE;
-    }
-	
-    /* regenerate mode list */
-    for (i = 0; i < pScrPriv->nSizes; i++)
-    {
-	RRScreenSizePtr	size = &pScrPriv->pSizes[i];
-	int		r;
-
-	if (size->nRates)
-	{
-	    for (r = 0; r < size->nRates; r++)
-	    {
-		mode = RROldModeAdd (output, size, size->pRates[r].rate);
-		if (i == pScrPriv->size && 
-		    size->pRates[r].rate == pScrPriv->rate)
-		{
-		    newMode = mode;
-		}
-	    }
-	    xfree (size->pRates);
-	}
-	else
-	{
-	    mode = RROldModeAdd (output, size, 0);
-	    if (i == pScrPriv->size)
-		newMode = mode;
-	}
-    }
-    if (pScrPriv->nSizes)
-	xfree (pScrPriv->pSizes);
-    pScrPriv->pSizes = NULL;
-    pScrPriv->nSizes = 0;
-	    
-    /* find size bounds */
-    for (i = 0; i < output->numModes; i++) 
-    {
-	RRModePtr   mode = output->modes[i];
-        CARD16	    width = mode->mode.width;
-        CARD16	    height = mode->mode.height;
-	
-	if (width < minWidth) minWidth = width;
-	if (width > maxWidth) maxWidth = width;
-	if (height < minHeight) minHeight = height;
-	if (height > maxHeight) maxHeight = height;
-    }
-
-    if (minWidth != pScrPriv->minWidth) {
-	pScrPriv->minWidth = minWidth; pScrPriv->changed = TRUE;
-    }
-    if (maxWidth != pScrPriv->maxWidth) {
-	pScrPriv->maxWidth = maxWidth; pScrPriv->changed = TRUE;
-    }
-    if (minHeight != pScrPriv->minHeight) {
-	pScrPriv->minHeight = minHeight; pScrPriv->changed = TRUE;
-    }
-    if (maxHeight != pScrPriv->maxHeight) {
-	pScrPriv->maxHeight = maxHeight; pScrPriv->changed = TRUE;
-    }
-
-    /* notice current mode */
-    if (newMode)
-	RRCrtcNotify (output->crtc, newMode, 0, 0, pScrPriv->rotation,
-		      1, &output);
-}
-#endif
-
-/*
- * Poll the driver for changed information
- */
-Bool
-RRGetInfo (ScreenPtr pScreen)
-{
-    rrScrPriv (pScreen);
-    Rotation	    rotations;
-    int		    i;
-
-    for (i = 0; i < pScrPriv->numOutputs; i++)
-	pScrPriv->outputs[i]->changed = FALSE;
-    for (i = 0; i < pScrPriv->numCrtcs; i++)
-	pScrPriv->crtcs[i]->changed = FALSE;
-    
-    rotations = 0;
-    pScrPriv->changed = FALSE;
-    
-    if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
-	return FALSE;
-
-#if RANDR_10_INTERFACE
-    if (pScrPriv->nSizes)
-	RRScanOldConfig (pScreen, rotations);
-#endif
-    RRTellChanged (pScreen);
-    return TRUE;
-}
-
 CARD16
 RRVerticalRefresh (xRRModeInfo *mode)
 {
@@ -602,83 +414,6 @@ RRVerticalRefresh (xRRModeInfo *mode)
     return (CARD16) refresh;
 }
 
-#if 0
-int
-RRSetScreenConfig (ScreenPtr		pScreen,
-		   Rotation		rotation,
-		   int			rate,
-		   RRScreenSizePtr	pSize)
-{
-    rrScrPrivPtr	    pScrPriv;
-    RRMonitorPtr	    pMonitor;
-    short		    oldWidth, oldHeight;
-    RRModePtr		    pMode;
-    int			    status;
-
-    pScrPriv = rrGetScrPriv(pScreen);
-    
-    if (!pScrPriv)
-	return BadImplementation;
-    
-    pMonitor = pScrPriv->pMonitors;
-    if (!pMonitor)
-	return BadImplementation;
-
-    oldWidth = pScreen->width;
-    oldHeight = pScreen->height;
-    
-    if (!RRGetInfo (pScreen))
-	return BadAlloc;
-    
-    /*
-     * Validate requested rotation
-     */
-
-    /* test the rotation bits only! */
-    switch (rotation & 0xf) {
-    case RR_Rotate_0:
-    case RR_Rotate_90:
-    case RR_Rotate_180:
-    case RR_Rotate_270:
-	break;
-    default:
-	/*
-	 * Invalid rotation
-	 */
-	return BadValue;
-    }
-
-    if ((~pScrPriv->rotations) & rotation)
-    {
-	/*
-	 * requested rotation or reflection not supported by screen
-	 */
-	return BadMatch;
-    }
-
-    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
-    {
-	if (pMode->mode.width == pSize->width &&
-	    pMode->mode.height == pSize->height &&
-	    pMode->mode.widthInMillimeters == pSize->mmWidth &&
-	    pMode->mode.heightInMillimeters == pSize->mmHeight &&
-	    (RRVerticalRefresh (&pMode->mode) == rate || rate == 0))
-	{
-	    break;
-	}
-    }
-    if (!pMode)
-	return BadValue;
-    
-    status = RRMonitorSetMode (pScreen, pMonitor, pMode, 0, 0, 
-			       rotation, currentTime);
-    
-    if (status != RRSetConfigSuccess)
-	return BadImplementation;
-    return Success;
-}
-#endif
-
 static int
 ProcRRDispatch (ClientPtr client)
 {
@@ -697,126 +432,3 @@ SProcRRDispatch (ClientPtr client)
     return (*SProcRandrVector[stuff->data]) (client);
 }
 
-#if RANDR_12_INTERFACE
-/*
- * Register the range of sizes for the screen
- */
-void
-RRScreenSetSizeRange (ScreenPtr	pScreen,
-		      CARD16	minWidth,
-		      CARD16	minHeight,
-		      CARD16	maxWidth,
-		      CARD16	maxHeight)
-{
-    rrScrPriv (pScreen);
-
-    if (!pScrPriv)
-	return;
-    pScrPriv->minWidth  = minWidth;
-    pScrPriv->minHeight = minHeight;
-    pScrPriv->maxWidth  = maxWidth;
-    pScrPriv->maxHeight = maxHeight;
-}
-#endif
-
-#ifdef RANDR_10_INTERFACE
-static Bool
-RRScreenSizeMatches (RRScreenSizePtr  a,
-		   RRScreenSizePtr  b)
-{
-    if (a->width != b->width)
-	return FALSE;
-    if (a->height != b->height)
-	return FALSE;
-    if (a->mmWidth != b->mmWidth)
-	return FALSE;
-    if (a->mmHeight != b->mmHeight)
-	return FALSE;
-    return TRUE;
-}
-
-RRScreenSizePtr
-RRRegisterSize (ScreenPtr	    pScreen,
-		short		    width, 
-		short		    height,
-		short		    mmWidth,
-		short		    mmHeight)
-{
-    rrScrPriv (pScreen);
-    int		    i;
-    RRScreenSize    tmp;
-    RRScreenSizePtr pNew;
-
-    if (!pScrPriv)
-	return 0;
-    
-    tmp.id = 0;
-    tmp.width = width;
-    tmp.height= height;
-    tmp.mmWidth = mmWidth;
-    tmp.mmHeight = mmHeight;
-    tmp.pRates = 0;
-    tmp.nRates = 0;
-    for (i = 0; i < pScrPriv->nSizes; i++)
-	if (RRScreenSizeMatches (&tmp, &pScrPriv->pSizes[i]))
-	    return &pScrPriv->pSizes[i];
-    pNew = xrealloc (pScrPriv->pSizes,
-		     (pScrPriv->nSizes + 1) * sizeof (RRScreenSize));
-    if (!pNew)
-	return 0;
-    pNew[pScrPriv->nSizes++] = tmp;
-    pScrPriv->pSizes = pNew;
-    return &pNew[pScrPriv->nSizes-1];
-}
-
-Bool RRRegisterRate (ScreenPtr		pScreen,
-		     RRScreenSizePtr	pSize,
-		     int		rate)
-{
-    rrScrPriv(pScreen);
-    int		    i;
-    RRScreenRatePtr pNew, pRate;
-
-    if (!pScrPriv)
-	return FALSE;
-    
-    for (i = 0; i < pSize->nRates; i++)
-	if (pSize->pRates[i].rate == rate)
-	    return TRUE;
-
-    pNew = xrealloc (pSize->pRates,
-		     (pSize->nRates + 1) * sizeof (RRScreenRate));
-    if (!pNew)
-	return FALSE;
-    pRate = &pNew[pSize->nRates++];
-    pRate->rate = rate;
-    pSize->pRates = pNew;
-    return TRUE;
-}
-
-Rotation
-RRGetRotation(ScreenPtr pScreen)
-{
-    RROutputPtr	output = RRFirstOutput (pScreen);
-
-    if (!output)
-	return RR_Rotate_0;
-
-    return output->crtc->rotation;
-}
-
-void
-RRSetCurrentConfig (ScreenPtr		pScreen,
-		    Rotation		rotation,
-		    int			rate,
-		    RRScreenSizePtr	pSize)
-{
-    rrScrPriv (pScreen);
-
-    if (!pScrPriv)
-	return;
-    pScrPriv->size = pSize - pScrPriv->pSizes;
-    pScrPriv->rotation = rotation;
-    pScrPriv->rate = rate;
-}
-#endif
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 682ebbf..26c1806 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -53,7 +53,7 @@
 
 /* required for ABI compatibility for now */
 #define RANDR_10_INTERFACE 1
-/* #define RANDR_12_INTERFACE 1 */
+#define RANDR_12_INTERFACE 1
 
 typedef XID	RRMode;
 typedef XID	RROutput;
@@ -89,6 +89,10 @@ struct _rrCrtc {
     Bool	    changed;
     int		    numOutputs;
     RROutputPtr	    *outputs;
+    int		    gammaSize;
+    CARD16	    *gammaRed;
+    CARD16	    *gammaBlue;
+    CARD16	    *gammaGreen;
     void	    *devPrivate;
 };
 
@@ -107,11 +111,12 @@ struct _rrOutput {
     int		    numModes;
     RRModePtr	    *modes;
     Bool	    changed;
+    PropertyPtr	    properties;
     void	    *devPrivate;
 };
 
 #if RANDR_12_INTERFACE
-typedef Bool (*RRScreentSizeSetProcPtr) (ScreenPtr	pScreen,
+typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr	pScreen,
 					CARD16		width,
 					CARD16		height,
 					CARD32		mmWidth,
@@ -125,6 +130,10 @@ typedef Bool (*RRCrtcSetProcPtr) (Screen
 				  Rotation		rotation,
 				  int			numOutputs,
 				  RROutputPtr		*outputs);
+
+typedef Bool (*RRCrtcSetGammaProcPtr) (ScreenPtr	pScreen,
+				       RRCrtcPtr	crtc);
+
 #endif
 
 typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations);
@@ -167,6 +176,7 @@ typedef struct _rrScrPriv {
 #if RANDR_12_INTERFACE
     RRScreenSetSizeProcPtr  rrScreenSizeSet;
     RRCrtcSetProcPtr	    rrCrtcSet;
+    RRCrtcSetGammaProcPtr   rrCrtcSetGamma;
 #endif
     
     /*
@@ -245,6 +255,16 @@ extern RESTYPE	RRClientType, RREventType
 extern int	RRClientPrivateIndex;
 extern RESTYPE	RRCrtcType, RRModeType, RROutputType;
 
+#define LookupOutput(client,id,a) ((RROutputPtr) \
+				   (SecurityLookupIDByType (client, id, \
+							    RROutputType, a)))
+#define LookupCrtc(client,id,a) ((RRCrtcPtr) \
+				 (SecurityLookupIDByType (client, id, \
+							  RRCrtcType, a)))
+#define LookupMode(client,id,a) ((RRModePtr) \
+				 (SecurityLookupIDByType (client, id, \
+							  RRModeType, a)))
+
 #define GetRRClient(pClient)    ((RRClientPtr) (pClient)->devPrivates[RRClientPrivateIndex].ptr)
 #define rrClientPriv(pClient)	RRClientPtr pRRClient = GetRRClient(pClient)
 
@@ -284,6 +304,24 @@ RRScreenSizeSet (ScreenPtr  pScreen,
 		 CARD32	    mmHeight);
 
 /*
+ * screen dispatch
+ */
+int 
+ProcRRGetScreenSizeRange (ClientPtr client);
+
+int
+ProcRRSetScreenSize (ClientPtr client);
+
+int
+ProcRRGetScreenResources (ClientPtr client);
+
+int
+ProcRRSetScreenConfig (ClientPtr client);
+
+int
+ProcRRGetScreenInfo (ClientPtr client);
+
+/*
  * Deliver a ScreenNotify event
  */
 void
@@ -414,6 +452,33 @@ RRCrtcSet (RRCrtcPtr    crtc,
 	   RROutputPtr  *outputs);
 
 /*
+ * Request that the Crtc gamma be changed
+ */
+
+Bool
+RRCrtcGammaSet (RRCrtcPtr   crtc,
+		CARD16	    *red,
+		CARD16	    *green,
+		CARD16	    *blue);
+
+/*
+ * Notify the extension that the Crtc gamma has been changed
+ * The driver calls this whenever it has changed the gamma values
+ * in the RRCrtcRec
+ */
+
+Bool
+RRCrtcGammaNotify (RRCrtcPtr	crtc);
+
+/*
+ * Set the size of the gamma table at server startup time
+ */
+
+Bool
+RRCrtcGammaSetSize (RRCrtcPtr	crtc,
+		    int		size);
+
+/*
  * Destroy a Crtc at shutdown
  */
 void
@@ -425,6 +490,25 @@ RRCrtcDestroy (RRCrtcPtr crtc);
 Bool
 RRCrtcInit (void);
 
+/*
+ * Crtc dispatch
+ */
+
+int
+ProcRRGetCrtcInfo (ClientPtr client);
+
+int
+ProcRRSetCrtcConfig (ClientPtr client);
+
+int
+ProcRRGetCrtcGammaSize (ClientPtr client);
+
+int
+ProcRRGetCrtcGamma (ClientPtr client);
+
+int
+ProcRRSetCrtcGamma (ClientPtr client);
+
 /* rrdispatch.c */
 Bool
 RRClientKnowsRates (ClientPtr	pClient);
@@ -452,6 +536,18 @@ RRModeDestroy (RRModePtr mode);
 Bool
 RRModeInit (void);
     
+int
+ProcRRCreateMode (ClientPtr client);
+
+int
+ProcRRDestroyMode (ClientPtr client);
+
+int
+ProcRRAddOutputMode (ClientPtr client);
+
+int
+ProcRRDeleteOutputMode (ClientPtr client);
+
 /* rroutput.c */
 /*
  * Create an output
@@ -498,10 +594,38 @@ RRDeliverOutputEvent(ClientPtr client, W
 void
 RROutputDestroy (RROutputPtr	output);
 
+int
+ProcRRGetOutputInfo (ClientPtr client);
+
 /*
  * Initialize output type
  */
 Bool
 RROutputInit (void);
     
+/* rrproperty.c */
+
+void
+RRDeleteAllOutputProperties (RROutputPtr output);
+
+void
+RRDeleteOutputProperty (RROutputPtr output, Atom property);
+
+int
+RRChangeOutputProperty (RROutputPtr output, Atom property, Atom type,
+			int format, int mode, unsigned long len,
+			pointer value, Bool sendevent);
+
+int
+ProcRRChangeOutputProperty (ClientPtr client);
+
+int
+ProcRRGetOutputProperty (ClientPtr client);
+
+int
+ProcRRListOutputProperties (ClientPtr client);
+
+int
+ProcRRDeleteOutputProperty (ClientPtr client);
+
 #endif /* _RANDRSTR_H_ */
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index d1328e7..c55e088 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -21,6 +21,7 @@
  */
 
 #include "randrstr.h"
+#include "swaprep.h"
 
 RESTYPE	RRCrtcType;
 
@@ -57,6 +58,8 @@ RRCrtcCreate (ScreenPtr	pScreen,
     crtc->rotations = RR_Rotate_0;
     crtc->outputs = NULL;
     crtc->numOutputs = 0;
+    crtc->gammaSize = 0;
+    crtc->gammaRed = crtc->gammaBlue = crtc->gammaGreen = NULL;
     crtc->changed = TRUE;
     crtc->devPrivate = devPrivate;
 
@@ -241,11 +244,75 @@ RRCrtcDestroyResource (pointer value, XI
 	    break;
 	}
     }
-    free (value);
+    if (crtc->gammaRed)
+	xfree (crtc->gammaRed);
+    xfree (value);
     return 1;
 }
 
 /*
+ * Request that the Crtc gamma be changed
+ */
+
+Bool
+RRCrtcGammaSet (RRCrtcPtr   crtc,
+		CARD16	    *red,
+		CARD16	    *green,
+		CARD16	    *blue)
+{
+    Bool	ret = TRUE;
+#if RANDR_12_INTERFACE
+    ScreenPtr	pScreen = crtc->pScreen;
+    rrScrPriv(pScreen);
+#endif
+    
+    memcpy (crtc->gammaRed, red, crtc->gammaSize * sizeof (CARD16));
+    memcpy (crtc->gammaGreen, green, crtc->gammaSize * sizeof (CARD16));
+    memcpy (crtc->gammaBlue, blue, crtc->gammaSize * sizeof (CARD16));
+#if RANDR_12_INTERFACE
+    if (pScrPriv->rrCrtcSetGamma)
+	ret = (*pScrPriv->rrCrtcSetGamma) (pScreen, crtc);
+#endif
+    return ret;
+}
+
+/*
+ * Notify the extension that the Crtc gamma has been changed
+ * The driver calls this whenever it has changed the gamma values
+ * in the RRCrtcRec
+ */
+
+Bool
+RRCrtcGammaNotify (RRCrtcPtr	crtc)
+{
+    return TRUE;    /* not much going on here */
+}
+
+/*
+ * Set the size of the gamma table at server startup time
+ */
+
+Bool
+RRCrtcGammaSetSize (RRCrtcPtr	crtc,
+		    int		size)
+{
+    CARD16  *gamma;
+
+    if (size == crtc->gammaSize)
+	return TRUE;
+    gamma = xalloc (size * 3 * sizeof (CARD16));
+    if (!gamma)
+	return FALSE;
+    if (crtc->gammaRed)
+	xfree (crtc->gammaRed);
+    crtc->gammaRed = gamma;
+    crtc->gammaGreen = gamma + size;
+    crtc->gammaBlue = gamma + size*2;
+    crtc->gammaSize = size;
+    return TRUE;
+}
+
+/*
  * Initialize crtc type
  */
 Bool
@@ -259,3 +326,395 @@ RRCrtcInit (void)
 #endif
     return TRUE;
 }
+
+int
+ProcRRGetCrtcInfo (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcInfoReq);;
+    xRRGetCrtcInfoReply	rep;
+    RRCrtcPtr			crtc;
+    CARD8			*extra;
+    unsigned long		extraLen;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    RRModePtr			mode;
+    RROutput			*outputs;
+    RROutput			*possible;
+    int				i, j, k, n;
+    
+    REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
+    crtc = LookupCrtc(client, stuff->crtc, SecurityReadAccess);
+
+    if (!crtc)
+	return RRErrorBase + BadRRCrtc;
+
+    pScreen = crtc->pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+
+    mode = crtc->mode;
+    
+    rep.type = X_Reply;
+    rep.status = RRSetConfigSuccess;
+    rep.sequenceNumber = client->sequence;
+    rep.length = 0;
+    rep.timestamp = pScrPriv->lastSetTime.milliseconds;
+    rep.x = crtc->x;
+    rep.y = crtc->y;
+    rep.width = mode ? mode->mode.width : 0;
+    rep.height = mode ? mode->mode.height : 0;
+    rep.mode = mode->mode.id;
+    rep.rotation = crtc->rotation;
+    rep.rotations = crtc->rotations;
+    rep.nOutput = crtc->numOutputs;
+    k = 0;
+    for (i = 0; i < pScrPriv->numOutputs; i++)
+	for (j = 0; j < pScrPriv->outputs[i]->numCrtcs; j++)
+	    if (pScrPriv->outputs[i]->crtcs[j] == crtc)
+		k++;
+    rep.nPossibleOutput = k;
+    
+    rep.length = rep.nOutput + rep.nPossibleOutput;
+
+    extraLen = rep.length << 2;
+    extra = xalloc (extraLen);
+    if (!extra)
+	return BadAlloc;
+
+    outputs = (RROutput *) extra;
+    possible = (RROutput *) (outputs + rep.nOutput);
+    
+    for (i = 0; i < crtc->numOutputs; i++)
+    {
+	outputs[i] = crtc->outputs[i]->id;
+	if (client->swapped)
+	    swapl (&outputs[i], n);
+    }
+    k = 0;
+    for (i = 0; i < pScrPriv->numOutputs; i++)
+	for (j = 0; j < pScrPriv->outputs[i]->numCrtcs; j++)
+	    if (pScrPriv->outputs[i]->crtcs[j] == crtc)
+	    {
+		possible[k] = pScrPriv->outputs[i]->id;
+		if (client->swapped)
+		    swapl (&possible[k], n);
+		k++;
+	    }
+    
+    if (client->swapped) {
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swapl(&rep.timestamp, n);
+	swaps(&rep.x, n);
+	swaps(&rep.y, n);
+	swaps(&rep.width, n);
+	swaps(&rep.height, n);
+	swapl(&rep.mode, n);
+	swaps(&rep.rotation, n);
+	swaps(&rep.rotations, n);
+	swaps(&rep.nOutput, n);
+	swaps(&rep.nPossibleOutput, n);
+    }
+    WriteToClient(client, sizeof(xRRGetCrtcInfoReply), (char *)&rep);
+    if (extraLen)
+    {
+	WriteToClient (client, extraLen, (char *) extra);
+	xfree (extra);
+    }
+    
+    return client->noClientException;
+}
+
+int
+ProcRRSetCrtcConfig (ClientPtr client)
+{
+    REQUEST(xRRSetCrtcConfigReq);
+    xRRSetCrtcConfigReply   rep;
+    ScreenPtr		    pScreen;
+    rrScrPrivPtr	    pScrPriv;
+    RRCrtcPtr		    crtc;
+    RRModePtr		    mode;
+    int			    numOutputs;
+    RROutputPtr		    *outputs = NULL;
+    RROutput		    *outputIds;
+    TimeStamp		    configTime;
+    TimeStamp		    time;
+    Rotation		    rotation;
+    int			    i, j;
+    
+    REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
+    numOutputs = stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2);
+    
+    crtc = LookupIDByType (stuff->crtc, RRCrtcType);
+    if (!crtc)
+    {
+	client->errorValue = stuff->crtc;
+	return RRErrorBase + BadRRCrtc;
+    }
+    if (stuff->mode == None)
+    {
+	mode = NULL;
+	if (numOutputs > 0)
+	    return BadMatch;
+    }
+    else
+    {
+	mode = LookupIDByType (stuff->mode, RRModeType);
+	if (!mode)
+	{
+	    client->errorValue = stuff->mode;
+	    return RRErrorBase + BadRRMode;
+	}
+	if (numOutputs == 0)
+	    return BadMatch;
+    }
+    outputs = xalloc (numOutputs * sizeof (RROutputPtr));
+    if (!outputs)
+	return BadAlloc;
+    
+    outputIds = (RROutput *) (stuff + 1);
+    for (i = 0; i < numOutputs; i++)
+    {
+	outputs[i] = LookupIDByType (outputIds[i], RROutputType);
+	if (!outputs[i])
+	{
+	    client->errorValue = outputIds[i];
+	    if (outputs)
+		xfree (outputs);
+	    return RRErrorBase + BadRROutput;
+	}
+	/* validate crtc for this output */
+	for (j = 0; j < outputs[i]->numCrtcs; j++)
+	    if (outputs[i]->crtcs[j] == crtc)
+		break;
+	if (j == outputs[j]->numCrtcs)
+	{
+	    if (outputs)
+		xfree (outputs);
+	    return BadMatch;
+	}
+	/* validate mode for this output */
+	for (j = 0; j < outputs[i]->numModes; j++)
+	    if (outputs[i]->modes[j] == mode)
+		break;
+	if (j == outputs[i]->numModes)
+	{
+	    if (outputs)
+		xfree (outputs);
+	    return BadMatch;
+	}
+    }
+
+    pScreen = crtc->pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    
+    if (!RRGetInfo (pScreen))
+    {
+	if (outputs)
+	    xfree (outputs);
+	return BadAlloc;
+    }
+    
+    time = ClientTimeToServerTime(stuff->timestamp);
+    configTime = ClientTimeToServerTime(stuff->configTimestamp);
+    
+    if (!pScrPriv)
+    {
+	time = currentTime;
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    
+    /*
+     * if the client's config timestamp is not the same as the last config
+     * timestamp, then the config information isn't up-to-date and
+     * can't even be validated
+     */
+    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
+    {
+	rep.status = RRSetConfigInvalidConfigTime;
+	goto sendReply;
+    }
+    
+    /*
+     * Validate requested rotation
+     */
+    rotation = (Rotation) stuff->rotation;
+
+    /* test the rotation bits only! */
+    switch (rotation & 0xf) {
+    case RR_Rotate_0:
+    case RR_Rotate_90:
+    case RR_Rotate_180:
+    case RR_Rotate_270:
+	break;
+    default:
+	/*
+	 * Invalid rotation
+	 */
+	client->errorValue = stuff->rotation;
+	if (outputs)
+	    xfree (outputs);
+	return BadValue;
+    }
+
+    if ((~crtc->rotations) & rotation)
+    {
+	/*
+	 * requested rotation or reflection not supported by screen
+	 */
+	client->errorValue = stuff->rotation;
+	if (outputs)
+	    xfree (outputs);
+	return BadMatch;
+    }
+
+#ifdef RANDR_12_INTERFACE
+    /*
+     * Check screen size bounds if the DDX provides a 1.2 interface
+     * for setting screen size. Else, assume the CrtcSet sets
+     * the size along with the mode
+     */
+    if (pScrPriv->rrScreenSizeSet)
+    {
+	if (stuff->x + mode->mode.width > pScreen->width)
+	{
+	    client->errorValue = stuff->x;
+	    if (outputs)
+		xfree (outputs);
+	    return BadValue;
+	}
+	
+	if (stuff->y + mode->mode.height > pScreen->height)
+	{
+	    client->errorValue = stuff->y;
+	    if (outputs)
+		xfree (outputs);
+	    return BadValue;
+	}
+    }
+#endif
+    
+    /*
+     * Make sure the requested set-time is not older than
+     * the last set-time
+     */
+    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
+    {
+	rep.status = RRSetConfigInvalidTime;
+	goto sendReply;
+    }
+
+    rep.status = RRCrtcSet (crtc, mode, stuff->x, stuff->y,
+			    rotation, numOutputs, outputs);
+    
+sendReply:
+    if (outputs)
+	xfree (outputs);
+    
+    rep.type = X_Reply;
+    /* rep.status has already been filled in */
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.newTimestamp = pScrPriv->lastConfigTime.milliseconds;
+
+    if (client->swapped) 
+    {
+	int n;
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swapl(&rep.newTimestamp, n);
+    }
+    WriteToClient(client, sizeof(xRRSetCrtcConfigReply), (char *)&rep);
+    
+    return client->noClientException;
+}
+
+int
+ProcRRGetCrtcGammaSize (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcGammaSizeReq);
+    xRRGetCrtcGammaSizeReply	reply;
+    RRCrtcPtr			crtc;
+    int				n;
+
+    REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
+    crtc = LookupCrtc (client, stuff->crtc, SecurityReadAccess);
+    if (!crtc)
+	return RRErrorBase + BadRRCrtc;
+    
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.length = 0;
+    reply.size = crtc->gammaSize;
+    if (client->swapped) {
+	swaps (&reply.sequenceNumber, n);
+	swapl (&reply.length, n);
+	swaps (&reply.size, n);
+    }
+    WriteToClient (client, sizeof (xRRGetCrtcGammaSizeReply), (char *) &reply);
+    return client->noClientException;
+}
+
+int
+ProcRRGetCrtcGamma (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcGammaReq);
+    xRRGetCrtcGammaReply	reply;
+    RRCrtcPtr			crtc;
+    int				n;
+    unsigned long		len;
+    
+    REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
+    crtc = LookupCrtc (client, stuff->crtc, SecurityReadAccess);
+    if (!crtc)
+	return RRErrorBase + BadRRCrtc;
+    
+    len = crtc->gammaSize * 3 * 2;
+    
+    reply.type = X_Reply;
+    reply.sequenceNumber = client->sequence;
+    reply.length = (len + 3) >> 2;
+    reply.size = crtc->gammaSize;
+    if (client->swapped) {
+	swaps (&reply.sequenceNumber, n);
+	swapl (&reply.length, n);
+	swaps (&reply.size, n);
+    }
+    WriteToClient (client, sizeof (xRRGetCrtcGammaReply), (char *) &reply);
+    if (crtc->gammaSize)
+    {
+	client->pSwapReplyFunc = (ReplySwapPtr)CopySwap16Write;
+	WriteSwappedDataToClient (client, len, (char *) crtc->gammaRed);
+    }
+    return client->noClientException;
+}
+
+int
+ProcRRSetCrtcGamma (ClientPtr client)
+{
+    REQUEST(xRRSetCrtcGammaReq);
+    RRCrtcPtr			crtc;
+    unsigned long		len;
+    CARD16			*red, *green, *blue;
+    
+    REQUEST_SIZE_MATCH(xRRSetCrtcGammaReq);
+    crtc = LookupCrtc (client, stuff->crtc, SecurityWriteAccess);
+    if (!crtc)
+	return RRErrorBase + BadRRCrtc;
+    
+    len = client->req_len - (sizeof (xRRSetCrtcGammaReq) >> 2);
+    if (len < (stuff->size * 3 + 1) >> 1)
+	return BadLength;
+
+    if (stuff->size != crtc->gammaSize)
+	return BadMatch;
+    
+    red = (CARD16 *) (stuff + 1);
+    green = red + crtc->gammaSize;
+    blue = green + crtc->gammaSize;
+    
+    RRCrtcGammaSet (crtc, red, green, blue);
+
+    return Success;
+}
+
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index aca0e54..49ba10b 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -31,79 +31,6 @@ RRClientKnowsRates (ClientPtr	pClient)
 	    (pRRClient->major_version == 1 && pRRClient->minor_version >= 1));
 }
 
-typedef struct _RR10Data {
-    RRScreenSizePtr sizes;
-    int		    nsize;
-    int		    nrefresh;
-    int		    size;
-    CARD16	    refresh;
-} RR10DataRec, *RR10DataPtr;
-
-/*
- * Convert 1.2 monitor data into 1.0 screen data
- */
-static RR10DataPtr
-RR10GetData (ScreenPtr pScreen, RROutputPtr output)
-{
-    RR10DataPtr	    data;
-    RRScreenSizePtr size;
-    int		    nmode = output->numModes;
-    int		    i, j, k;
-    RRScreenRatePtr refresh;
-    CARD16	    vRefresh;
-    RRModePtr	    mode;
-
-    /* Make sure there is plenty of space for any combination */
-    data = malloc (sizeof (RR10DataRec) + 
-		   sizeof (RRScreenSize) * nmode + 
-		   sizeof (RRScreenRate) * nmode);
-    if (!data)
-	return NULL;
-    size = (RRScreenSizePtr) (data + 1);
-    refresh = (RRScreenRatePtr) (size + nmode);
-    data->sizes = size;
-    data->nsize = 0;
-    data->nrefresh = 0;
-    data->size = 0;
-    data->refresh = 0;
-    for (i = 0; i < output->numModes; i++)
-    {
-	mode = output->modes[i];
-	for (j = 0; j < data->nsize; j++)
-	    if (mode->mode.width == size[j].width &&
-		mode->mode.height == size[j].height)
-		break;
-	if (j == data->nsize)
-	{
-	    size[j].id = j;
-	    size[j].width = mode->mode.width;
-	    size[j].height = mode->mode.height;
-	    size[j].mmWidth = mode->mode.mmWidth;
-	    size[j].mmHeight = mode->mode.mmHeight;
-	    size[j].nRates = 0;
-	    size[j].pRates = &refresh[data->nrefresh];
-	    data->nsize++;
-	}
-	vRefresh = RRVerticalRefresh (&mode->mode);
-	for (k = 0; k < size[j].nRates; k++)
-	    if (vRefresh == size[j].pRates[k].rate)
-		break;
-	if (k == size[j].nRates)
-	{
-	    size[j].pRates[k].rate = vRefresh;
-	    size[j].pRates[k].mode = mode;
-	    size[j].nRates++;
-	    data->nrefresh++;
-	}
-	if (mode == output->crtc->mode)
-	{
-	    data->size = j;
-	    data->refresh = vRefresh;
-	}
-    }
-    return data;
-}
-
 static int
 ProcRRQueryVersion (ClientPtr client)
 {
@@ -135,341 +62,6 @@ ProcRRQueryVersion (ClientPtr client)
 }
 
 static int
-ProcRRGetScreenInfo (ClientPtr client)
-{
-    REQUEST(xRRGetScreenInfoReq);
-    xRRGetScreenInfoReply   rep;
-    WindowPtr	    	    pWin;
-    int			    n;
-    ScreenPtr		    pScreen;
-    rrScrPrivPtr	    pScrPriv;
-    CARD8		    *extra;
-    unsigned long	    extraLen;
-    RROutputPtr		    output;
-
-    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
-    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
-					   SecurityReadAccess);
-
-    if (!pWin)
-	return BadWindow;
-
-    pScreen = pWin->drawable.pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    rep.pad = 0;
-    
-    if (pScrPriv)
-	RRGetInfo (pScreen);
-
-    output = RRFirstOutput (pScreen);
-    
-    if (!pScrPriv || !output)
-    {
-	rep.type = X_Reply;
-	rep.setOfRotations = RR_Rotate_0;;
-	rep.sequenceNumber = client->sequence;
-	rep.length = 0;
-	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
-	rep.timestamp = currentTime.milliseconds;
-	rep.configTimestamp = currentTime.milliseconds;
-	rep.nSizes = 0;
-	rep.sizeID = 0;
-	rep.rotation = RR_Rotate_0;
-	rep.rate = 0;
-	rep.nrateEnts = 0;
-	extra = 0;
-	extraLen = 0;
-    }
-    else
-    {
-	int			i, j;
-	xScreenSizes		*size;
-	CARD16			*rates;
-	CARD8			*data8;
-	Bool			has_rate = RRClientKnowsRates (client);
-	RR10DataPtr		pData;
-	RRScreenSizePtr		pSize;
-    
-	pData = RR10GetData (pScreen, output);
-	if (!pData)
-	    return BadAlloc;
-	
-	rep.type = X_Reply;
-	rep.setOfRotations = output->crtc->rotations;
-	rep.sequenceNumber = client->sequence;
-	rep.length = 0;
-	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
-	rep.timestamp = pScrPriv->lastSetTime.milliseconds;
-	rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
-	rep.rotation = output->crtc->rotation;
-	rep.nSizes = pData->nsize;
-        rep.nrateEnts = pData->nrefresh + pData->nsize;
-	rep.sizeID = pData->size;
-	rep.rate = pData->refresh;
-
-	extraLen = (rep.nSizes * sizeof (xScreenSizes) +
-		    rep.nrateEnts * sizeof (CARD16));
-
-	extra = (CARD8 *) xalloc (extraLen);
-	if (!extra)
-	{
-	    xfree (pData);
-	    return BadAlloc;
-	}
-	/*
-	 * First comes the size information
-	 */
-	size = (xScreenSizes *) extra;
-	rates = (CARD16 *) (size + rep.nSizes);
-	for (i = 0; i < pData->nsize; i++)
-	{
-	    pSize = &pData->sizes[i];
-	    size->widthInPixels = pSize->width;
-	    size->heightInPixels = pSize->height;
-	    size->widthInMillimeters = pSize->mmWidth;
-	    size->heightInMillimeters = pSize->mmHeight;
-	    if (client->swapped)
-	    {
-	        swaps (&size->widthInPixels, n);
-	        swaps (&size->heightInPixels, n);
-	        swaps (&size->widthInMillimeters, n);
-	        swaps (&size->heightInMillimeters, n);
-	    }
-	    size++;
-	    if (has_rate)
-	    {
-		*rates = pSize->nRates;
-		if (client->swapped)
-		{
-		    swaps (rates, n);
-		}
-		rates++;
-		for (j = 0; j < pSize->nRates; j++)
-		{
-		    *rates = pSize->pRates[j].rate;
-		    if (client->swapped)
-		    {
-			swaps (rates, n);
-		    }
-		    rates++;
-		}
-	    }
-	}
-        xfree (pData);
-	
-	data8 = (CARD8 *) rates;
-
-	if (data8 - (CARD8 *) extra != extraLen)
-	    FatalError ("RRGetScreenInfo bad extra len %ld != %ld\n",
-			(unsigned long)(data8 - (CARD8 *) extra), extraLen);
-	rep.length =  (extraLen + 3) >> 2;
-    }
-    if (client->swapped) {
-	swaps(&rep.sequenceNumber, n);
-	swapl(&rep.length, n);
-	swapl(&rep.timestamp, n);
-	swaps(&rep.rotation, n);
-	swaps(&rep.nSizes, n);
-	swaps(&rep.sizeID, n);
-	swaps(&rep.rate, n);
-	swaps(&rep.nrateEnts, n);
-    }
-    WriteToClient(client, sizeof(xRRGetScreenInfoReply), (char *)&rep);
-    if (extraLen)
-    {
-	WriteToClient (client, extraLen, (char *) extra);
-	xfree (extra);
-    }
-    return (client->noClientException);
-}
-
-static int
-ProcRRSetScreenConfig (ClientPtr client)
-{
-    REQUEST(xRRSetScreenConfigReq);
-    xRRSetScreenConfigReply rep;
-    DrawablePtr		    pDraw;
-    int			    n;
-    ScreenPtr		    pScreen;
-    rrScrPrivPtr	    pScrPriv;
-    TimeStamp		    configTime;
-    TimeStamp		    time;
-    int			    i;
-    Rotation		    rotation;
-    int			    rate;
-    Bool		    has_rate;
-    RROutputPtr		    output;
-    RRModePtr		    mode;
-    RR10DataPtr		    pData = NULL;
-    RRScreenSizePtr    	    pSize;
-    
-    UpdateCurrentTime ();
-
-    if (RRClientKnowsRates (client))
-    {
-	REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
-	has_rate = TRUE;
-    }
-    else
-    {
-	REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
-	has_rate = FALSE;
-    }
-    
-    SECURITY_VERIFY_DRAWABLE(pDraw, stuff->drawable, client,
-			     SecurityWriteAccess);
-
-    pScreen = pDraw->pScreen;
-
-    pScrPriv = rrGetScrPriv(pScreen);
-    
-    time = ClientTimeToServerTime(stuff->timestamp);
-    configTime = ClientTimeToServerTime(stuff->configTimestamp);
-    
-    if (!pScrPriv)
-    {
-	time = currentTime;
-	rep.status = RRSetConfigFailed;
-	goto sendReply;
-    }
-    if (!RRGetInfo (pScreen))
-	return BadAlloc;
-    
-    output = RRFirstOutput (pScreen);
-    if (!output)
-    {
-	time = currentTime;
-	rep.status = RRSetConfigFailed;
-	goto sendReply;
-    }
-    
-    /*
-     * if the client's config timestamp is not the same as the last config
-     * timestamp, then the config information isn't up-to-date and
-     * can't even be validated
-     */
-    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
-    {
-	rep.status = RRSetConfigInvalidConfigTime;
-	goto sendReply;
-    }
-    
-    pData = RR10GetData (pScreen, output);
-    if (!pData)
-	return BadAlloc;
-    
-    if (stuff->sizeID >= pData->nsize)
-    {
-	/*
-	 * Invalid size ID
-	 */
-	client->errorValue = stuff->sizeID;
-	xfree (pData);
-	return BadValue;
-    }
-    pSize = &pData->sizes[stuff->sizeID];
-    
-    /*
-     * Validate requested rotation
-     */
-    rotation = (Rotation) stuff->rotation;
-
-    /* test the rotation bits only! */
-    switch (rotation & 0xf) {
-    case RR_Rotate_0:
-    case RR_Rotate_90:
-    case RR_Rotate_180:
-    case RR_Rotate_270:
-	break;
-    default:
-	/*
-	 * Invalid rotation
-	 */
-	client->errorValue = stuff->rotation;
-	xfree (pData);
-	return BadValue;
-    }
-
-    if ((~output->crtc->rotations) & rotation)
-    {
-	/*
-	 * requested rotation or reflection not supported by screen
-	 */
-	client->errorValue = stuff->rotation;
-	xfree (pData);
-	return BadMatch;
-    }
-
-    /*
-     * Validate requested refresh
-     */
-    if (has_rate)
-	rate = (int) stuff->rate;
-    else
-	rate = 0;
-
-    if (rate)
-    {
-	for (i = 0; i < pSize->nRates; i++)
-	{
-	    if (pSize->pRates[i].rate == rate)
-		break;
-	}
-	if (i == pSize->nRates)
-	{
-	    /*
-	     * Invalid rate
-	     */
-	    client->errorValue = rate;
-	    xfree (pData);
-	    return BadValue;
-	}
-	mode = pSize->pRates[i].mode;
-    }
-    else
-	mode = pSize->pRates[0].mode;
-    
-    /*
-     * Make sure the requested set-time is not older than
-     * the last set-time
-     */
-    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
-    {
-	rep.status = RRSetConfigInvalidTime;
-	goto sendReply;
-    }
-
-    rep.status = RRCrtcSet (output->crtc, mode, 0, 0, stuff->rotation,
-			    1, &output);
-    
-sendReply:
-    
-    if (pData)
-	xfree (pData);
-
-    rep.type = X_Reply;
-    /* rep.status has already been filled in */
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-
-    rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
-    rep.newConfigTimestamp = pScrPriv->lastConfigTime.milliseconds;
-    rep.root = WindowTable[pDraw->pScreen->myNum]->drawable.id;
-
-    if (client->swapped) 
-    {
-    	swaps(&rep.sequenceNumber, n);
-    	swapl(&rep.length, n);
-	swapl(&rep.newTimestamp, n);
-	swapl(&rep.newConfigTimestamp, n);
-	swapl(&rep.root, n);
-    }
-    WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char *)&rep);
-
-    return (client->noClientException);
-}
-
-static int
 ProcRRSelectInput (ClientPtr client)
 {
     REQUEST(xRRSelectInputReq);
@@ -584,633 +176,6 @@ ProcRRSelectInput (ClientPtr client)
     return Success;
 }
 
-/*
- * Retrieve valid screen size range
- */
-static int 
-ProcRRGetScreenSizeRange (ClientPtr client)
-{
-    REQUEST(xRRGetScreenSizeRangeReq);
-    xRRGetScreenSizeRangeReply	rep;
-    WindowPtr			pWin;
-    ScreenPtr			pScreen;
-    rrScrPrivPtr		pScrPriv;
-    
-    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
-    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
-					   SecurityReadAccess);
-
-    if (!pWin)
-	return BadWindow;
-
-    pScreen = pWin->drawable.pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    
-    rep.type = X_Reply;
-    rep.pad = 0;
-    rep.sequenceNumber = client->sequence;
-    rep.length = 0;
-    
-    if (pScrPriv) 
-    {
-	RRGetInfo (pScreen);
-	rep.minWidth  = pScrPriv->minWidth;
-	rep.minHeight = pScrPriv->minHeight;
-	rep.maxWidth  = pScrPriv->maxWidth;
-	rep.maxHeight = pScrPriv->maxHeight;
-    }
-    else
-    {
-	rep.maxWidth  = rep.minWidth  = pScreen->width;
-	rep.maxHeight = rep.minHeight = pScreen->height;
-    }
-    if (client->swapped) 
-    {
-	int n;
-	
-    	swaps(&rep.sequenceNumber, n);
-    	swapl(&rep.length, n);
-	swaps(&rep.minWidth, n);
-	swaps(&rep.minHeight, n);
-	swaps(&rep.maxWidth, n);
-	swaps(&rep.maxHeight, n);
-    }
-    WriteToClient(client, sizeof(xRRGetScreenSizeRangeReply), (char *)&rep);
-    return (client->noClientException);
-}
-
-static int ProcRRSetScreenSize (ClientPtr client)
-{
-    REQUEST(xRRSetScreenSizeReq);
-    WindowPtr		pWin;
-    ScreenPtr		pScreen;
-    rrScrPrivPtr	pScrPriv;
-    RRCrtcPtr		crtc;
-    int			i;
-    
-    REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
-    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
-					   SecurityReadAccess);
-
-    if (!pWin)
-	return BadWindow;
-
-    pScreen = pWin->drawable.pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    if (stuff->width < pScrPriv->minWidth || pScrPriv->maxWidth < stuff->width)
-    {
-	client->errorValue = stuff->width;
-	return BadValue;
-    }
-    if (stuff->height < pScrPriv->minHeight || 
-	pScrPriv->maxHeight < stuff->height)
-    {
-	client->errorValue = stuff->height;
-	return BadValue;
-    }
-    for (i = 0; i < pScrPriv->numCrtcs; i++) {
-	crtc = pScrPriv->crtcs[i];
-	if (crtc->mode &&
-	    (crtc->x + crtc->mode->mode.width > stuff->width ||
-	     crtc->y + crtc->mode->mode.height > stuff->height))
-	    return BadMatch;
-    }
-    if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
-    {
-	client->errorValue = 0;
-	return BadValue;
-    }
-    if (!RRScreenSizeSet (pScreen, 
-			  stuff->width, stuff->height,
-			  stuff->widthInMillimeters,
-			  stuff->heightInMillimeters))
-    {
-	return BadMatch;
-    }
-    return Success;
-}
-
-static int
-ProcRRGetScreenResources (ClientPtr client)
-{
-    REQUEST(xRRGetScreenResourcesReq);
-    xRRGetScreenResourcesReply  rep;
-    WindowPtr			pWin;
-    ScreenPtr			pScreen;
-    rrScrPrivPtr		pScrPriv;
-    CARD8			*extra;
-    unsigned long		extraLen;
-    int				i;
-    RRCrtc			*crtcs;
-    RROutput			*outputs;
-    xRRModeInfo			*modeinfos;
-    CARD8			*names;
-    int				n;
-    
-    REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
-    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
-					   SecurityReadAccess);
-
-    if (!pWin)
-	return BadWindow;
-    
-    pScreen = pWin->drawable.pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    rep.pad = 0;
-    
-    if (pScrPriv)
-	RRGetInfo (pScreen);
-
-    if (!pScrPriv)
-    {
-	rep.type = X_Reply;
-	rep.sequenceNumber = client->sequence;
-	rep.length = 0;
-	rep.timestamp = currentTime.milliseconds;
-	rep.configTimestamp = currentTime.milliseconds;
-	rep.nCrtcs = 0;
-	rep.nOutputs = 0;
-	rep.nModes = 0;
-	rep.nbytesNames = 0;
-	extra = NULL;
-	extraLen = 0;
-    }
-    else
-    {
-	rep.type = X_Reply;
-	rep.sequenceNumber = client->sequence;
-	rep.length = 0;
-	rep.timestamp = currentTime.milliseconds;
-	rep.configTimestamp = currentTime.milliseconds;
-	rep.nCrtcs = pScrPriv->numCrtcs;
-	rep.nOutputs = pScrPriv->numOutputs;
-	rep.nModes = pScrPriv->numModes;;
-	rep.nbytesNames = 0;
-
-	for (i = 0; i < pScrPriv->numModes; i++)
-	    rep.nbytesNames += pScrPriv->modes[i]->mode.nameLength;
-
-	rep.length = (pScrPriv->numCrtcs + 
-		      pScrPriv->numOutputs + 
-		      pScrPriv->numModes * 10 +
-		      ((rep.nbytesNames + 3) >> 2));
-	
-	extraLen = rep.length << 2;
-	extra = xalloc (extraLen);
-	if (!extra)
-	    return BadAlloc;
-
-	crtcs = (RRCrtc *) extra;
-	outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs);
-	modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
-	names = (CARD8 *) (modeinfos + pScrPriv->numModes);
-	
-	for (i = 0; i < pScrPriv->numCrtcs; i++)
-	{
-	    crtcs[i] = pScrPriv->crtcs[i]->id;
-	    if (client->swapped)
-		swapl (&crtcs[i], n);
-	}
-	
-	for (i = 0; i < pScrPriv->numOutputs; i++)
-	{
-	    outputs[i] = pScrPriv->outputs[i]->id;
-	    if (client->swapped)
-		swapl (&outputs[i], n);
-	}
-	
-	for (i = 0; i < pScrPriv->numModes; i++)
-	{
-	    modeinfos[i] = pScrPriv->modes[i]->mode;
-	    if (client->swapped)
-	    {
-		swapl (&modeinfos[i].id, n);
-		swaps (&modeinfos[i].width, n);
-		swaps (&modeinfos[i].height, n);
-		swapl (&modeinfos[i].mmWidth, n);
-		swapl (&modeinfos[i].mmHeight, n);
-		swapl (&modeinfos[i].dotClock, n);
-		swaps (&modeinfos[i].hSyncStart, n);
-		swaps (&modeinfos[i].hSyncEnd, n);
-		swaps (&modeinfos[i].hTotal, n);
-		swaps (&modeinfos[i].hSkew, n);
-		swaps (&modeinfos[i].vSyncStart, n);
-		swaps (&modeinfos[i].vSyncEnd, n);
-		swaps (&modeinfos[i].vTotal, n);
-		swaps (&modeinfos[i].nameLength, n);
-		swapl (&modeinfos[i].modeFlags, n);
-	    }
-	    memcpy (names, pScrPriv->modes[i]->name, 
-		    pScrPriv->modes[i]->mode.nameLength);
-	    names += pScrPriv->modes[i]->mode.nameLength;
-	}
-	assert ((names + 3 >> 3) == rep.length);
-    }
-    
-    if (client->swapped) {
-	swaps(&rep.sequenceNumber, n);
-	swapl(&rep.length, n);
-	swapl(&rep.timestamp, n);
-	swapl(&rep.configTimestamp, n);
-	swaps(&rep.nCrtcs, n);
-	swaps(&rep.nOutputs, n);
-	swaps(&rep.nModes, n);
-	swaps(&rep.nbytesNames, n);
-    }
-    WriteToClient(client, sizeof(xRRGetScreenResourcesReply), (char *)&rep);
-    if (extraLen)
-    {
-	WriteToClient (client, extraLen, (char *) extra);
-	xfree (extra);
-    }
-    return client->noClientException;
-}
-
-static int
-ProcRRGetOutputInfo (ClientPtr client)
-{
-    REQUEST(xRRGetOutputInfoReq);;
-    xRRGetOutputInfoReply	rep;
-    RROutputPtr			output;
-    CARD8			*extra;
-    unsigned long		extraLen;
-    ScreenPtr			pScreen;
-    rrScrPrivPtr		pScrPriv;
-    RRCrtc			*crtcs;
-    RRMode			*modes;
-    RROutput			*clones;
-    char			*name;
-    int				i, n;
-    
-    REQUEST_SIZE_MATCH(xRRGetOutputInfoReq);
-    output = (RROutputPtr)SecurityLookupIDByType(client, stuff->output, 
-						 RROutputType, 
-						 SecurityReadAccess);
-
-    if (!output)
-	return RRErrorBase + BadRROutput;
-
-    pScreen = output->pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-
-    rep.type = X_Reply;
-    rep.sequenceNumber = client->sequence;
-    rep.length = 0;
-    rep.timestamp = pScrPriv->lastSetTime.milliseconds;
-    rep.crtc = output->crtc ? output->crtc->id : None;
-    rep.connection = output->connection;
-    rep.subpixelOrder = output->subpixelOrder;
-    rep.nCrtcs = output->numCrtcs;
-    rep.nModes = output->numModes;
-    rep.nClones = output->numClones;
-    rep.nameLength = output->nameLength;
-    
-    rep.length = (output->numCrtcs + 
-		  output->numModes + 
-		  output->numClones +
-		  ((rep.nameLength + 3) >> 2));
-
-    extraLen = rep.length << 2;
-    extra = xalloc (extraLen);
-    if (!extra)
-	return BadAlloc;
-
-    crtcs = (RRCrtc *) extra;
-    modes = (RRMode *) (crtcs + output->numCrtcs);
-    clones = (RROutput *) (modes + output->numModes);
-    name = (char *) (clones + output->numClones);
-    
-    for (i = 0; i < output->numCrtcs; i++)
-    {
-	crtcs[i] = output->crtcs[i]->id;
-	if (client->swapped)
-	    swapl (&crtcs[i], n);
-    }
-    for (i = 0; i < output->numModes; i++)
-    {
-	modes[i] = output->modes[i]->mode.id;
-	if (client->swapped)
-	    swapl (&modes[i], n);
-    }
-    for (i = 0; i < output->numClones; i++)
-    {
-	clones[i] = output->clones[i]->id;
-	if (client->swapped)
-	    swapl (&clones[i], n);
-    }
-    memcpy (name, output->name, output->nameLength);
-    if (client->swapped) {
-	swaps(&rep.sequenceNumber, n);
-	swapl(&rep.length, n);
-	swapl(&rep.timestamp, n);
-	swapl(&rep.crtc, n);
-	swaps(&rep.nCrtcs, n);
-	swaps(&rep.nModes, n);
-	swaps(&rep.nClones, n);
-	swaps(&rep.nameLength, n);
-    }
-    WriteToClient(client, sizeof(xRRGetOutputInfoReply), (char *)&rep);
-    if (extraLen)
-    {
-	WriteToClient (client, extraLen, (char *) extra);
-	xfree (extra);
-    }
-    
-    return client->noClientException;
-}
-
-static int
-ProcRRListOutputProperties (ClientPtr client)
-{
-    REQUEST(xRRListOutputPropertiesReq);
-    
-    REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRChangeOutputProperty (ClientPtr client)
-{
-    REQUEST(xRRChangeOutputPropertyReq);
-    
-    REQUEST_SIZE_MATCH(xRRChangeOutputPropertyReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRDeleteOutputProperty (ClientPtr client)
-{
-    REQUEST(xRRDeleteOutputPropertyReq);
-    
-    REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRGetOutputProperty (ClientPtr client)
-{
-    REQUEST(xRRGetOutputPropertyReq);
-    
-    REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRCreateMode (ClientPtr client)
-{
-    REQUEST(xRRCreateModeReq);
-    
-    REQUEST_SIZE_MATCH(xRRCreateModeReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRDestroyMode (ClientPtr client)
-{
-    REQUEST(xRRDestroyModeReq);
-    
-    REQUEST_SIZE_MATCH(xRRDestroyModeReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRAddOutputMode (ClientPtr client)
-{
-    REQUEST(xRRAddOutputModeReq);
-    
-    REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRDeleteOutputMode (ClientPtr client)
-{
-    REQUEST(xRRDeleteOutputModeReq);
-    
-    REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRGetCrtcInfo (ClientPtr client)
-{
-    REQUEST(xRRGetCrtcInfoReq);
-    
-    REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRSetCrtcConfig (ClientPtr client)
-{
-    REQUEST(xRRSetCrtcConfigReq);
-    xRRSetCrtcConfigReply   rep;
-    ScreenPtr		    pScreen;
-    rrScrPrivPtr	    pScrPriv;
-    RRCrtcPtr		    crtc;
-    RRModePtr		    mode;
-    int			    numOutputs;
-    RROutputPtr		    *outputs = NULL;
-    RROutput		    *outputIds;
-    TimeStamp		    configTime;
-    TimeStamp		    time;
-    Rotation		    rotation;
-    int			    i, j;
-    
-    REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
-    numOutputs = stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2);
-    
-    crtc = LookupIDByType (stuff->crtc, RRCrtcType);
-    if (!crtc)
-    {
-	client->errorValue = stuff->crtc;
-	return RRErrorBase + BadRRCrtc;
-    }
-    if (stuff->mode == None)
-    {
-	mode = NULL;
-	if (numOutputs > 0)
-	    return BadMatch;
-    }
-    else
-    {
-	mode = LookupIDByType (stuff->mode, RRModeType);
-	if (!mode)
-	{
-	    client->errorValue = stuff->mode;
-	    return RRErrorBase + BadRRMode;
-	}
-	if (numOutputs == 0)
-	    return BadMatch;
-    }
-    outputs = xalloc (numOutputs * sizeof (RROutputPtr));
-    if (!outputs)
-	return BadAlloc;
-    
-    outputIds = (RROutput *) (stuff + 1);
-    for (i = 0; i < numOutputs; i++)
-    {
-	outputs[i] = LookupIDByType (outputIds[i], RROutputType);
-	if (!outputs[i])
-	{
-	    client->errorValue = outputIds[i];
-	    return RRErrorBase + BadRROutput;
-	}
-	/* validate crtc for this output */
-	for (j = 0; j < outputs[i]->numCrtcs; j++)
-	    if (outputs[i]->crtcs[j] == crtc)
-		break;
-	if (j == outputs[j]->numCrtcs)
-	    return BadMatch;
-	/* validate mode for this output */
-	for (j = 0; j < outputs[i]->numModes; j++)
-	    if (outputs[i]->modes[j] == mode)
-		break;
-	if (j == outputs[j]->numModes)
-	    return BadMatch;
-    }
-
-    pScreen = crtc->pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    
-    time = ClientTimeToServerTime(stuff->timestamp);
-    configTime = ClientTimeToServerTime(stuff->configTimestamp);
-    
-    if (!pScrPriv)
-    {
-	time = currentTime;
-	rep.status = RRSetConfigFailed;
-	goto sendReply;
-    }
-    if (!RRGetInfo (pScreen))
-	return BadAlloc;
-    
-    /*
-     * if the client's config timestamp is not the same as the last config
-     * timestamp, then the config information isn't up-to-date and
-     * can't even be validated
-     */
-    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
-    {
-	rep.status = RRSetConfigInvalidConfigTime;
-	goto sendReply;
-    }
-    
-    /*
-     * Validate requested rotation
-     */
-    rotation = (Rotation) stuff->rotation;
-
-    /* test the rotation bits only! */
-    switch (rotation & 0xf) {
-    case RR_Rotate_0:
-    case RR_Rotate_90:
-    case RR_Rotate_180:
-    case RR_Rotate_270:
-	break;
-    default:
-	/*
-	 * Invalid rotation
-	 */
-	client->errorValue = stuff->rotation;
-	return BadValue;
-    }
-
-    if ((~crtc->rotations) & rotation)
-    {
-	/*
-	 * requested rotation or reflection not supported by screen
-	 */
-	client->errorValue = stuff->rotation;
-	return BadMatch;
-    }
-
-    if (stuff->x + mode->mode.width > pScreen->width)
-    {
-	client->errorValue = stuff->x;
-	return BadValue;
-    }
-    
-    if (stuff->y + mode->mode.height > pScreen->height)
-    {
-	client->errorValue = stuff->y;
-	return BadValue;
-    }
-    
-    /*
-     * Make sure the requested set-time is not older than
-     * the last set-time
-     */
-    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
-    {
-	rep.status = RRSetConfigInvalidTime;
-	goto sendReply;
-    }
-
-    rep.status = RRCrtcSet (crtc, mode, stuff->x, stuff->y,
-			    rotation, numOutputs, outputs);
-    
-sendReply:
-    if (outputs)
-	xfree (outputs);
-    
-    rep.type = X_Reply;
-    /* rep.status has already been filled in */
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    rep.newTimestamp = pScrPriv->lastConfigTime.milliseconds;
-
-    if (client->swapped) 
-    {
-	int n;
-    	swaps(&rep.sequenceNumber, n);
-    	swapl(&rep.length, n);
-	swapl(&rep.newTimestamp, n);
-    }
-    WriteToClient(client, sizeof(xRRSetCrtcConfigReply), (char *)&rep);
-    
-    return client->noClientException;
-}
-
-static int
-ProcRRGetCrtcGammaSize (ClientPtr client)
-{
-    REQUEST(xRRGetCrtcGammaSizeReq);
-    
-    REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRGetCrtcGamma (ClientPtr client)
-{
-    REQUEST(xRRGetCrtcGammaReq);
-    
-    REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
-static int
-ProcRRSetCrtcGamma (ClientPtr client)
-{
-    REQUEST(xRRSetCrtcGammaReq);
-    
-    REQUEST_SIZE_MATCH(xRRSetCrtcGammaReq);
-    (void) stuff;
-    return BadImplementation; 
-}
-
 int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
     ProcRRQueryVersion,	/* 0 */
 /* we skip 1 to make old clients fail pretty immediately */
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 4e44e7d..ab0ea18 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -103,3 +103,44 @@ RRModeInit (void)
 #endif
     return TRUE;
 }
+
+int
+ProcRRCreateMode (ClientPtr client)
+{
+    REQUEST(xRRCreateModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRCreateModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+int
+ProcRRDestroyMode (ClientPtr client)
+{
+    REQUEST(xRRDestroyModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRDestroyModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+int
+ProcRRAddOutputMode (ClientPtr client)
+{
+    REQUEST(xRRAddOutputModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+int
+ProcRRDeleteOutputMode (ClientPtr client)
+{
+    REQUEST(xRRDeleteOutputModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 4780023..07dabad 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -66,6 +66,7 @@ RROutputCreate (ScreenPtr   pScreen,
     output->clones = NULL;
     output->numModes = 0;
     output->modes = NULL;
+    output->properties = NULL;
     output->changed = TRUE;
     output->devPrivate = devPrivate;
     
@@ -201,12 +202,13 @@ RROutputDestroyResource (pointer value, 
 	xfree (output->crtcs);
     if (output->clones)
 	xfree (output->clones);
+    RRDeleteAllOutputProperties (output);
     xfree (output);
     return 1;
 }
 
 /*
- * Initialize crtc type
+ * Initialize output type
  */
 Bool
 RROutputInit (void)
@@ -219,3 +221,95 @@ RROutputInit (void)
 #endif
     return TRUE;
 }
+
+int
+ProcRRGetOutputInfo (ClientPtr client)
+{
+    REQUEST(xRRGetOutputInfoReq);;
+    xRRGetOutputInfoReply	rep;
+    RROutputPtr			output;
+    CARD8			*extra;
+    unsigned long		extraLen;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    RRCrtc			*crtcs;
+    RRMode			*modes;
+    RROutput			*clones;
+    char			*name;
+    int				i, n;
+    
+    REQUEST_SIZE_MATCH(xRRGetOutputInfoReq);
+    output = LookupOutput(client, stuff->output, SecurityReadAccess);
+
+    if (!output)
+	return RRErrorBase + BadRROutput;
+
+    pScreen = output->pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+
+    rep.type = X_Reply;
+    rep.sequenceNumber = client->sequence;
+    rep.length = 0;
+    rep.timestamp = pScrPriv->lastSetTime.milliseconds;
+    rep.crtc = output->crtc ? output->crtc->id : None;
+    rep.connection = output->connection;
+    rep.subpixelOrder = output->subpixelOrder;
+    rep.nCrtcs = output->numCrtcs;
+    rep.nModes = output->numModes;
+    rep.nClones = output->numClones;
+    rep.nameLength = output->nameLength;
+    
+    rep.length = (output->numCrtcs + 
+		  output->numModes + 
+		  output->numClones +
+		  ((rep.nameLength + 3) >> 2));
+
+    extraLen = rep.length << 2;
+    extra = xalloc (extraLen);
+    if (!extra)
+	return BadAlloc;
+
+    crtcs = (RRCrtc *) extra;
+    modes = (RRMode *) (crtcs + output->numCrtcs);
+    clones = (RROutput *) (modes + output->numModes);
+    name = (char *) (clones + output->numClones);
+    
+    for (i = 0; i < output->numCrtcs; i++)
+    {
+	crtcs[i] = output->crtcs[i]->id;
+	if (client->swapped)
+	    swapl (&crtcs[i], n);
+    }
+    for (i = 0; i < output->numModes; i++)
+    {
+	modes[i] = output->modes[i]->mode.id;
+	if (client->swapped)
+	    swapl (&modes[i], n);
+    }
+    for (i = 0; i < output->numClones; i++)
+    {
+	clones[i] = output->clones[i]->id;
+	if (client->swapped)
+	    swapl (&clones[i], n);
+    }
+    memcpy (name, output->name, output->nameLength);
+    if (client->swapped) {
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swapl(&rep.timestamp, n);
+	swapl(&rep.crtc, n);
+	swaps(&rep.nCrtcs, n);
+	swaps(&rep.nModes, n);
+	swaps(&rep.nClones, n);
+	swaps(&rep.nameLength, n);
+    }
+    WriteToClient(client, sizeof(xRRGetOutputInfoReply), (char *)&rep);
+    if (extraLen)
+    {
+	WriteToClient (client, extraLen, (char *) extra);
+	xfree (extra);
+    }
+    
+    return client->noClientException;
+}
+
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
index 47ba12d..58d5152 100644
--- a/randr/rrscreen.c
+++ b/randr/rrscreen.c
@@ -203,3 +203,654 @@ RRScreenSizeSet (ScreenPtr  pScreen,
     return FALSE;
 }
 
+/*
+ * Retrieve valid screen size range
+ */
+int 
+ProcRRGetScreenSizeRange (ClientPtr client)
+{
+    REQUEST(xRRGetScreenSizeRangeReq);
+    xRRGetScreenSizeRangeReply	rep;
+    WindowPtr			pWin;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    
+    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    
+    rep.type = X_Reply;
+    rep.pad = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.length = 0;
+    
+    if (pScrPriv) 
+    {
+	RRGetInfo (pScreen);
+	rep.minWidth  = pScrPriv->minWidth;
+	rep.minHeight = pScrPriv->minHeight;
+	rep.maxWidth  = pScrPriv->maxWidth;
+	rep.maxHeight = pScrPriv->maxHeight;
+    }
+    else
+    {
+	rep.maxWidth  = rep.minWidth  = pScreen->width;
+	rep.maxHeight = rep.minHeight = pScreen->height;
+    }
+    if (client->swapped) 
+    {
+	int n;
+	
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swaps(&rep.minWidth, n);
+	swaps(&rep.minHeight, n);
+	swaps(&rep.maxWidth, n);
+	swaps(&rep.maxHeight, n);
+    }
+    WriteToClient(client, sizeof(xRRGetScreenSizeRangeReply), (char *)&rep);
+    return (client->noClientException);
+}
+
+int
+ProcRRSetScreenSize (ClientPtr client)
+{
+    REQUEST(xRRSetScreenSizeReq);
+    WindowPtr		pWin;
+    ScreenPtr		pScreen;
+    rrScrPrivPtr	pScrPriv;
+    RRCrtcPtr		crtc;
+    int			i;
+    
+    REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    if (stuff->width < pScrPriv->minWidth || pScrPriv->maxWidth < stuff->width)
+    {
+	client->errorValue = stuff->width;
+	return BadValue;
+    }
+    if (stuff->height < pScrPriv->minHeight || 
+	pScrPriv->maxHeight < stuff->height)
+    {
+	client->errorValue = stuff->height;
+	return BadValue;
+    }
+    for (i = 0; i < pScrPriv->numCrtcs; i++) {
+	crtc = pScrPriv->crtcs[i];
+	if (crtc->mode &&
+	    (crtc->x + crtc->mode->mode.width > stuff->width ||
+	     crtc->y + crtc->mode->mode.height > stuff->height))
+	    return BadMatch;
+    }
+    if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
+    {
+	client->errorValue = 0;
+	return BadValue;
+    }
+    if (!RRScreenSizeSet (pScreen, 
+			  stuff->width, stuff->height,
+			  stuff->widthInMillimeters,
+			  stuff->heightInMillimeters))
+    {
+	return BadMatch;
+    }
+    return Success;
+}
+
+int
+ProcRRGetScreenResources (ClientPtr client)
+{
+    REQUEST(xRRGetScreenResourcesReq);
+    xRRGetScreenResourcesReply  rep;
+    WindowPtr			pWin;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    CARD8			*extra;
+    unsigned long		extraLen;
+    int				i;
+    RRCrtc			*crtcs;
+    RROutput			*outputs;
+    xRRModeInfo			*modeinfos;
+    CARD8			*names;
+    int				n;
+    
+    REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+    
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    rep.pad = 0;
+    
+    if (pScrPriv)
+	RRGetInfo (pScreen);
+
+    if (!pScrPriv)
+    {
+	rep.type = X_Reply;
+	rep.sequenceNumber = client->sequence;
+	rep.length = 0;
+	rep.timestamp = currentTime.milliseconds;
+	rep.configTimestamp = currentTime.milliseconds;
+	rep.nCrtcs = 0;
+	rep.nOutputs = 0;
+	rep.nModes = 0;
+	rep.nbytesNames = 0;
+	extra = NULL;
+	extraLen = 0;
+    }
+    else
+    {
+	rep.type = X_Reply;
+	rep.sequenceNumber = client->sequence;
+	rep.length = 0;
+	rep.timestamp = currentTime.milliseconds;
+	rep.configTimestamp = currentTime.milliseconds;
+	rep.nCrtcs = pScrPriv->numCrtcs;
+	rep.nOutputs = pScrPriv->numOutputs;
+	rep.nModes = pScrPriv->numModes;;
+	rep.nbytesNames = 0;
+
+	for (i = 0; i < pScrPriv->numModes; i++)
+	    rep.nbytesNames += pScrPriv->modes[i]->mode.nameLength;
+
+	rep.length = (pScrPriv->numCrtcs + 
+		      pScrPriv->numOutputs + 
+		      pScrPriv->numModes * 10 +
+		      ((rep.nbytesNames + 3) >> 2));
+	
+	extraLen = rep.length << 2;
+	extra = xalloc (extraLen);
+	if (!extra)
+	    return BadAlloc;
+
+	crtcs = (RRCrtc *) extra;
+	outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs);
+	modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
+	names = (CARD8 *) (modeinfos + pScrPriv->numModes);
+	
+	for (i = 0; i < pScrPriv->numCrtcs; i++)
+	{
+	    crtcs[i] = pScrPriv->crtcs[i]->id;
+	    if (client->swapped)
+		swapl (&crtcs[i], n);
+	}
+	
+	for (i = 0; i < pScrPriv->numOutputs; i++)
+	{
+	    outputs[i] = pScrPriv->outputs[i]->id;
+	    if (client->swapped)
+		swapl (&outputs[i], n);
+	}
+	
+	for (i = 0; i < pScrPriv->numModes; i++)
+	{
+	    modeinfos[i] = pScrPriv->modes[i]->mode;
+	    if (client->swapped)
+	    {
+		swapl (&modeinfos[i].id, n);
+		swaps (&modeinfos[i].width, n);
+		swaps (&modeinfos[i].height, n);
+		swapl (&modeinfos[i].mmWidth, n);
+		swapl (&modeinfos[i].mmHeight, n);
+		swapl (&modeinfos[i].dotClock, n);
+		swaps (&modeinfos[i].hSyncStart, n);
+		swaps (&modeinfos[i].hSyncEnd, n);
+		swaps (&modeinfos[i].hTotal, n);
+		swaps (&modeinfos[i].hSkew, n);
+		swaps (&modeinfos[i].vSyncStart, n);
+		swaps (&modeinfos[i].vSyncEnd, n);
+		swaps (&modeinfos[i].vTotal, n);
+		swaps (&modeinfos[i].nameLength, n);
+		swapl (&modeinfos[i].modeFlags, n);
+	    }
+	    memcpy (names, pScrPriv->modes[i]->name, 
+		    pScrPriv->modes[i]->mode.nameLength);
+	    names += pScrPriv->modes[i]->mode.nameLength;
+	}
+	assert ((names + 3 >> 3) == rep.length);
+    }
+    
+    if (client->swapped) {
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swapl(&rep.timestamp, n);
+	swapl(&rep.configTimestamp, n);
+	swaps(&rep.nCrtcs, n);
+	swaps(&rep.nOutputs, n);
+	swaps(&rep.nModes, n);
+	swaps(&rep.nbytesNames, n);
+    }
+    WriteToClient(client, sizeof(xRRGetScreenResourcesReply), (char *)&rep);
+    if (extraLen)
+    {
+	WriteToClient (client, extraLen, (char *) extra);
+	xfree (extra);
+    }
+    return client->noClientException;
+}
+
+typedef struct _RR10Data {
+    RRScreenSizePtr sizes;
+    int		    nsize;
+    int		    nrefresh;
+    int		    size;
+    CARD16	    refresh;
+} RR10DataRec, *RR10DataPtr;
+
+/*
+ * Convert 1.2 monitor data into 1.0 screen data
+ */
+static RR10DataPtr
+RR10GetData (ScreenPtr pScreen, RROutputPtr output)
+{
+    RR10DataPtr	    data;
+    RRScreenSizePtr size;
+    int		    nmode = output->numModes;
+    int		    i, j, k;
+    RRScreenRatePtr refresh;
+    CARD16	    vRefresh;
+    RRModePtr	    mode;
+
+    /* Make sure there is plenty of space for any combination */
+    data = malloc (sizeof (RR10DataRec) + 
+		   sizeof (RRScreenSize) * nmode + 
+		   sizeof (RRScreenRate) * nmode);
+    if (!data)
+	return NULL;
+    size = (RRScreenSizePtr) (data + 1);
+    refresh = (RRScreenRatePtr) (size + nmode);
+    data->sizes = size;
+    data->nsize = 0;
+    data->nrefresh = 0;
+    data->size = 0;
+    data->refresh = 0;
+    for (i = 0; i < output->numModes; i++)
+    {
+	mode = output->modes[i];
+	for (j = 0; j < data->nsize; j++)
+	    if (mode->mode.width == size[j].width &&
+		mode->mode.height == size[j].height)
+		break;
+	if (j == data->nsize)
+	{
+	    size[j].id = j;
+	    size[j].width = mode->mode.width;
+	    size[j].height = mode->mode.height;
+	    size[j].mmWidth = mode->mode.mmWidth;
+	    size[j].mmHeight = mode->mode.mmHeight;
+	    size[j].nRates = 0;
+	    size[j].pRates = &refresh[data->nrefresh];
+	    data->nsize++;
+	}
+	vRefresh = RRVerticalRefresh (&mode->mode);
+	for (k = 0; k < size[j].nRates; k++)
+	    if (vRefresh == size[j].pRates[k].rate)
+		break;
+	if (k == size[j].nRates)
+	{
+	    size[j].pRates[k].rate = vRefresh;
+	    size[j].pRates[k].mode = mode;
+	    size[j].nRates++;
+	    data->nrefresh++;
+	}
+	if (mode == output->crtc->mode)
+	{
+	    data->size = j;
+	    data->refresh = vRefresh;
+	}
+    }
+    return data;
+}
+
+int
+ProcRRGetScreenInfo (ClientPtr client)
+{
+    REQUEST(xRRGetScreenInfoReq);
+    xRRGetScreenInfoReply   rep;
+    WindowPtr	    	    pWin;
+    int			    n;
+    ScreenPtr		    pScreen;
+    rrScrPrivPtr	    pScrPriv;
+    CARD8		    *extra;
+    unsigned long	    extraLen;
+    RROutputPtr		    output;
+
+    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    rep.pad = 0;
+    
+    if (pScrPriv)
+	RRGetInfo (pScreen);
+
+    output = RRFirstOutput (pScreen);
+    
+    if (!pScrPriv || !output)
+    {
+	rep.type = X_Reply;
+	rep.setOfRotations = RR_Rotate_0;;
+	rep.sequenceNumber = client->sequence;
+	rep.length = 0;
+	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
+	rep.timestamp = currentTime.milliseconds;
+	rep.configTimestamp = currentTime.milliseconds;
+	rep.nSizes = 0;
+	rep.sizeID = 0;
+	rep.rotation = RR_Rotate_0;
+	rep.rate = 0;
+	rep.nrateEnts = 0;
+	extra = 0;
+	extraLen = 0;
+    }
+    else
+    {
+	int			i, j;
+	xScreenSizes		*size;
+	CARD16			*rates;
+	CARD8			*data8;
+	Bool			has_rate = RRClientKnowsRates (client);
+	RR10DataPtr		pData;
+	RRScreenSizePtr		pSize;
+    
+	pData = RR10GetData (pScreen, output);
+	if (!pData)
+	    return BadAlloc;
+	
+	rep.type = X_Reply;
+	rep.setOfRotations = output->crtc->rotations;
+	rep.sequenceNumber = client->sequence;
+	rep.length = 0;
+	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
+	rep.timestamp = pScrPriv->lastSetTime.milliseconds;
+	rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+	rep.rotation = output->crtc->rotation;
+	rep.nSizes = pData->nsize;
+        rep.nrateEnts = pData->nrefresh + pData->nsize;
+	rep.sizeID = pData->size;
+	rep.rate = pData->refresh;
+
+	extraLen = (rep.nSizes * sizeof (xScreenSizes) +
+		    rep.nrateEnts * sizeof (CARD16));
+
+	extra = (CARD8 *) xalloc (extraLen);
+	if (!extra)
+	{
+	    xfree (pData);
+	    return BadAlloc;
+	}
+	/*
+	 * First comes the size information
+	 */
+	size = (xScreenSizes *) extra;
+	rates = (CARD16 *) (size + rep.nSizes);
+	for (i = 0; i < pData->nsize; i++)
+	{
+	    pSize = &pData->sizes[i];
+	    size->widthInPixels = pSize->width;
+	    size->heightInPixels = pSize->height;
+	    size->widthInMillimeters = pSize->mmWidth;
+	    size->heightInMillimeters = pSize->mmHeight;
+	    if (client->swapped)
+	    {
+	        swaps (&size->widthInPixels, n);
+	        swaps (&size->heightInPixels, n);
+	        swaps (&size->widthInMillimeters, n);
+	        swaps (&size->heightInMillimeters, n);
+	    }
+	    size++;
+	    if (has_rate)
+	    {
+		*rates = pSize->nRates;
+		if (client->swapped)
+		{
+		    swaps (rates, n);
+		}
+		rates++;
+		for (j = 0; j < pSize->nRates; j++)
+		{
+		    *rates = pSize->pRates[j].rate;
+		    if (client->swapped)
+		    {
+			swaps (rates, n);
+		    }
+		    rates++;
+		}
+	    }
+	}
+        xfree (pData);
+	
+	data8 = (CARD8 *) rates;
+
+	if (data8 - (CARD8 *) extra != extraLen)
+	    FatalError ("RRGetScreenInfo bad extra len %ld != %ld\n",
+			(unsigned long)(data8 - (CARD8 *) extra), extraLen);
+	rep.length =  (extraLen + 3) >> 2;
+    }
+    if (client->swapped) {
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swapl(&rep.timestamp, n);
+	swaps(&rep.rotation, n);
+	swaps(&rep.nSizes, n);
+	swaps(&rep.sizeID, n);
+	swaps(&rep.rate, n);
+	swaps(&rep.nrateEnts, n);
+    }
+    WriteToClient(client, sizeof(xRRGetScreenInfoReply), (char *)&rep);
+    if (extraLen)
+    {
+	WriteToClient (client, extraLen, (char *) extra);
+	xfree (extra);
+    }
+    return (client->noClientException);
+}
+
+int
+ProcRRSetScreenConfig (ClientPtr client)
+{
+    REQUEST(xRRSetScreenConfigReq);
+    xRRSetScreenConfigReply rep;
+    DrawablePtr		    pDraw;
+    int			    n;
+    ScreenPtr		    pScreen;
+    rrScrPrivPtr	    pScrPriv;
+    TimeStamp		    configTime;
+    TimeStamp		    time;
+    int			    i;
+    Rotation		    rotation;
+    int			    rate;
+    Bool		    has_rate;
+    RROutputPtr		    output;
+    RRModePtr		    mode;
+    RR10DataPtr		    pData = NULL;
+    RRScreenSizePtr    	    pSize;
+    
+    UpdateCurrentTime ();
+
+    if (RRClientKnowsRates (client))
+    {
+	REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
+	has_rate = TRUE;
+    }
+    else
+    {
+	REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
+	has_rate = FALSE;
+    }
+    
+    SECURITY_VERIFY_DRAWABLE(pDraw, stuff->drawable, client,
+			     SecurityWriteAccess);
+
+    pScreen = pDraw->pScreen;
+
+    pScrPriv = rrGetScrPriv(pScreen);
+    
+    time = ClientTimeToServerTime(stuff->timestamp);
+    configTime = ClientTimeToServerTime(stuff->configTimestamp);
+    
+    if (!pScrPriv)
+    {
+	time = currentTime;
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    if (!RRGetInfo (pScreen))
+	return BadAlloc;
+    
+    output = RRFirstOutput (pScreen);
+    if (!output)
+    {
+	time = currentTime;
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    
+    /*
+     * if the client's config timestamp is not the same as the last config
+     * timestamp, then the config information isn't up-to-date and
+     * can't even be validated
+     */
+    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
+    {
+	rep.status = RRSetConfigInvalidConfigTime;
+	goto sendReply;
+    }
+    
+    pData = RR10GetData (pScreen, output);
+    if (!pData)
+	return BadAlloc;
+    
+    if (stuff->sizeID >= pData->nsize)
+    {
+	/*
+	 * Invalid size ID
+	 */
+	client->errorValue = stuff->sizeID;
+	xfree (pData);
+	return BadValue;
+    }
+    pSize = &pData->sizes[stuff->sizeID];
+    
+    /*
+     * Validate requested rotation
+     */
+    rotation = (Rotation) stuff->rotation;
+
+    /* test the rotation bits only! */
+    switch (rotation & 0xf) {
+    case RR_Rotate_0:
+    case RR_Rotate_90:
+    case RR_Rotate_180:
+    case RR_Rotate_270:
+	break;
+    default:
+	/*
+	 * Invalid rotation
+	 */
+	client->errorValue = stuff->rotation;
+	xfree (pData);
+	return BadValue;
+    }
+
+    if ((~output->crtc->rotations) & rotation)
+    {
+	/*
+	 * requested rotation or reflection not supported by screen
+	 */
+	client->errorValue = stuff->rotation;
+	xfree (pData);
+	return BadMatch;
+    }
+
+    /*
+     * Validate requested refresh
+     */
+    if (has_rate)
+	rate = (int) stuff->rate;
+    else
+	rate = 0;
+
+    if (rate)
+    {
+	for (i = 0; i < pSize->nRates; i++)
+	{
+	    if (pSize->pRates[i].rate == rate)
+		break;
+	}
+	if (i == pSize->nRates)
+	{
+	    /*
+	     * Invalid rate
+	     */
+	    client->errorValue = rate;
+	    xfree (pData);
+	    return BadValue;
+	}
+	mode = pSize->pRates[i].mode;
+    }
+    else
+	mode = pSize->pRates[0].mode;
+    
+    /*
+     * Make sure the requested set-time is not older than
+     * the last set-time
+     */
+    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
+    {
+	rep.status = RRSetConfigInvalidTime;
+	goto sendReply;
+    }
+
+    rep.status = RRCrtcSet (output->crtc, mode, 0, 0, stuff->rotation,
+			    1, &output);
+    
+sendReply:
+    
+    if (pData)
+	xfree (pData);
+
+    rep.type = X_Reply;
+    /* rep.status has already been filled in */
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+
+    rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
+    rep.newConfigTimestamp = pScrPriv->lastConfigTime.milliseconds;
+    rep.root = WindowTable[pDraw->pScreen->myNum]->drawable.id;
+
+    if (client->swapped) 
+    {
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swapl(&rep.newTimestamp, n);
+	swapl(&rep.newConfigTimestamp, n);
+	swapl(&rep.root, n);
+    }
+    WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char *)&rep);
+
+    return (client->noClientException);
+}
+
diff-tree 07112adb0802d28488de5a495aa61bb3cfc280b6 (from afe5e9483b352ed06075ed68a6ffa50799194e2d)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Tue Sep 19 00:46:27 2006 -0700

    RRGetScreenResources and RRGetOutputInfo are working now.
    
    Removed separate id field in RRModeRec.
    Pull screen subpixel order from Render extension.
    Implement RGetScreenResources and RRGetOutputInfo

diff --git a/randr/randr.c b/randr/randr.c
index 926e32f..beddb50 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -442,7 +442,7 @@ RROldModeAdd (RROutputPtr output, RRScre
     if (!modes)
     {
 	RRModeDestroy (mode);
-	FreeResource (mode->id, 0);
+	FreeResource (mode->mode.id, 0);
 	return NULL;
     }
     modes[output->numModes++] = mode;
@@ -479,6 +479,9 @@ RRScanOldConfig (ScreenPtr pScreen, Rota
 	RROutputSetCrtcs (output, &crtc, 1);
 	RROutputSetCrtc (output, crtc);
 	RROutputSetConnection (output, RR_Connected);
+#ifdef RENDER
+	RROutputSetSubpixelOrder (output, PictureGetSubpixelOrder (pScreen));
+#endif
     }
 
     output = RRFirstOutput (pScreen);
diff --git a/randr/randrstr.h b/randr/randrstr.h
index a7f91b7..682ebbf 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -74,7 +74,6 @@ typedef struct _rrCrtc	    RRCrtcRec, *R
 typedef struct _rrOutput    RROutputRec, *RROutputPtr;
 
 struct _rrMode {
-    RRMode	    id;
     int		    refcnt;
     xRRModeInfo	    mode;
     char	    *name;
@@ -489,6 +488,10 @@ Bool
 RROutputSetConnection (RROutputPtr  output,
 		       CARD8	    connection);
 
+Bool
+RROutputSetSubpixelOrder (RROutputPtr output,
+			  int	      subpixelOrder);
+
 void
 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output);
 
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index 279acfd..aca0e54 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -694,20 +694,229 @@ static int
 ProcRRGetScreenResources (ClientPtr client)
 {
     REQUEST(xRRGetScreenResourcesReq);
+    xRRGetScreenResourcesReply  rep;
+    WindowPtr			pWin;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    CARD8			*extra;
+    unsigned long		extraLen;
+    int				i;
+    RRCrtc			*crtcs;
+    RROutput			*outputs;
+    xRRModeInfo			*modeinfos;
+    CARD8			*names;
+    int				n;
     
     REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
-    (void) stuff;
-    return BadImplementation; 
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+    
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    rep.pad = 0;
+    
+    if (pScrPriv)
+	RRGetInfo (pScreen);
+
+    if (!pScrPriv)
+    {
+	rep.type = X_Reply;
+	rep.sequenceNumber = client->sequence;
+	rep.length = 0;
+	rep.timestamp = currentTime.milliseconds;
+	rep.configTimestamp = currentTime.milliseconds;
+	rep.nCrtcs = 0;
+	rep.nOutputs = 0;
+	rep.nModes = 0;
+	rep.nbytesNames = 0;
+	extra = NULL;
+	extraLen = 0;
+    }
+    else
+    {
+	rep.type = X_Reply;
+	rep.sequenceNumber = client->sequence;
+	rep.length = 0;
+	rep.timestamp = currentTime.milliseconds;
+	rep.configTimestamp = currentTime.milliseconds;
+	rep.nCrtcs = pScrPriv->numCrtcs;
+	rep.nOutputs = pScrPriv->numOutputs;
+	rep.nModes = pScrPriv->numModes;;
+	rep.nbytesNames = 0;
+
+	for (i = 0; i < pScrPriv->numModes; i++)
+	    rep.nbytesNames += pScrPriv->modes[i]->mode.nameLength;
+
+	rep.length = (pScrPriv->numCrtcs + 
+		      pScrPriv->numOutputs + 
+		      pScrPriv->numModes * 10 +
+		      ((rep.nbytesNames + 3) >> 2));
+	
+	extraLen = rep.length << 2;
+	extra = xalloc (extraLen);
+	if (!extra)
+	    return BadAlloc;
+
+	crtcs = (RRCrtc *) extra;
+	outputs = (RROutput *) (crtcs + pScrPriv->numCrtcs);
+	modeinfos = (xRRModeInfo *) (outputs + pScrPriv->numOutputs);
+	names = (CARD8 *) (modeinfos + pScrPriv->numModes);
+	
+	for (i = 0; i < pScrPriv->numCrtcs; i++)
+	{
+	    crtcs[i] = pScrPriv->crtcs[i]->id;
+	    if (client->swapped)
+		swapl (&crtcs[i], n);
+	}
+	
+	for (i = 0; i < pScrPriv->numOutputs; i++)
+	{
+	    outputs[i] = pScrPriv->outputs[i]->id;
+	    if (client->swapped)
+		swapl (&outputs[i], n);
+	}
+	
+	for (i = 0; i < pScrPriv->numModes; i++)
+	{
+	    modeinfos[i] = pScrPriv->modes[i]->mode;
+	    if (client->swapped)
+	    {
+		swapl (&modeinfos[i].id, n);
+		swaps (&modeinfos[i].width, n);
+		swaps (&modeinfos[i].height, n);
+		swapl (&modeinfos[i].mmWidth, n);
+		swapl (&modeinfos[i].mmHeight, n);
+		swapl (&modeinfos[i].dotClock, n);
+		swaps (&modeinfos[i].hSyncStart, n);
+		swaps (&modeinfos[i].hSyncEnd, n);
+		swaps (&modeinfos[i].hTotal, n);
+		swaps (&modeinfos[i].hSkew, n);
+		swaps (&modeinfos[i].vSyncStart, n);
+		swaps (&modeinfos[i].vSyncEnd, n);
+		swaps (&modeinfos[i].vTotal, n);
+		swaps (&modeinfos[i].nameLength, n);
+		swapl (&modeinfos[i].modeFlags, n);
+	    }
+	    memcpy (names, pScrPriv->modes[i]->name, 
+		    pScrPriv->modes[i]->mode.nameLength);
+	    names += pScrPriv->modes[i]->mode.nameLength;
+	}
+	assert ((names + 3 >> 3) == rep.length);
+    }
+    
+    if (client->swapped) {
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swapl(&rep.timestamp, n);
+	swapl(&rep.configTimestamp, n);
+	swaps(&rep.nCrtcs, n);
+	swaps(&rep.nOutputs, n);
+	swaps(&rep.nModes, n);
+	swaps(&rep.nbytesNames, n);
+    }
+    WriteToClient(client, sizeof(xRRGetScreenResourcesReply), (char *)&rep);
+    if (extraLen)
+    {
+	WriteToClient (client, extraLen, (char *) extra);
+	xfree (extra);
+    }
+    return client->noClientException;
 }
 
 static int
 ProcRRGetOutputInfo (ClientPtr client)
 {
     REQUEST(xRRGetOutputInfoReq);;
+    xRRGetOutputInfoReply	rep;
+    RROutputPtr			output;
+    CARD8			*extra;
+    unsigned long		extraLen;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    RRCrtc			*crtcs;
+    RRMode			*modes;
+    RROutput			*clones;
+    char			*name;
+    int				i, n;
     
     REQUEST_SIZE_MATCH(xRRGetOutputInfoReq);
-    (void) stuff;
-    return BadImplementation; 
+    output = (RROutputPtr)SecurityLookupIDByType(client, stuff->output, 
+						 RROutputType, 
+						 SecurityReadAccess);
+
+    if (!output)
+	return RRErrorBase + BadRROutput;
+
+    pScreen = output->pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+
+    rep.type = X_Reply;
+    rep.sequenceNumber = client->sequence;
+    rep.length = 0;
+    rep.timestamp = pScrPriv->lastSetTime.milliseconds;
+    rep.crtc = output->crtc ? output->crtc->id : None;
+    rep.connection = output->connection;
+    rep.subpixelOrder = output->subpixelOrder;
+    rep.nCrtcs = output->numCrtcs;
+    rep.nModes = output->numModes;
+    rep.nClones = output->numClones;
+    rep.nameLength = output->nameLength;
+    
+    rep.length = (output->numCrtcs + 
+		  output->numModes + 
+		  output->numClones +
+		  ((rep.nameLength + 3) >> 2));
+
+    extraLen = rep.length << 2;
+    extra = xalloc (extraLen);
+    if (!extra)
+	return BadAlloc;
+
+    crtcs = (RRCrtc *) extra;
+    modes = (RRMode *) (crtcs + output->numCrtcs);
+    clones = (RROutput *) (modes + output->numModes);
+    name = (char *) (clones + output->numClones);
+    
+    for (i = 0; i < output->numCrtcs; i++)
+    {
+	crtcs[i] = output->crtcs[i]->id;
+	if (client->swapped)
+	    swapl (&crtcs[i], n);
+    }
+    for (i = 0; i < output->numModes; i++)
+    {
+	modes[i] = output->modes[i]->mode.id;
+	if (client->swapped)
+	    swapl (&modes[i], n);
+    }
+    for (i = 0; i < output->numClones; i++)
+    {
+	clones[i] = output->clones[i]->id;
+	if (client->swapped)
+	    swapl (&clones[i], n);
+    }
+    memcpy (name, output->name, output->nameLength);
+    if (client->swapped) {
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swapl(&rep.timestamp, n);
+	swapl(&rep.crtc, n);
+	swaps(&rep.nCrtcs, n);
+	swaps(&rep.nModes, n);
+	swaps(&rep.nClones, n);
+	swaps(&rep.nameLength, n);
+    }
+    WriteToClient(client, sizeof(xRRGetOutputInfoReply), (char *)&rep);
+    if (extraLen)
+    {
+	WriteToClient (client, extraLen, (char *) extra);
+	xfree (extra);
+    }
+    
+    return client->noClientException;
 }
 
 static int
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 52585d9..4e44e7d 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -37,6 +37,7 @@ RRModeGet (ScreenPtr	pScreen,
     for (i = 0; i < pScrPriv->numModes; i++)
     {
 	mode = pScrPriv->modes[i];
+	modeInfo->id = mode->mode.id;
 	if (!memcmp (modeInfo, &mode->mode, sizeof (xRRModeInfo)) &&
 	    !memcmp (name, mode->name, modeInfo->nameLength))
 	{
@@ -66,8 +67,8 @@ RRModeGet (ScreenPtr	pScreen,
 	return NULL;
     }
 
-    mode->id = FakeClientID(0);
-    if (!AddResource (mode->id, RRModeType, (pointer) mode))
+    mode->mode.id = FakeClientID(0);
+    if (!AddResource (mode->mode.id, RRModeType, (pointer) mode))
 	return NULL;
     ++mode->refcnt;
     pScrPriv->modes = modes;
diff --git a/randr/rroutput.c b/randr/rroutput.c
index ba5bcb4..4780023 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -154,6 +154,15 @@ RROutputSetConnection (RROutputPtr  outp
     return TRUE;
 }
 
+Bool
+RROutputSetSubpixelOrder (RROutputPtr output,
+			  int	      subpixelOrder)
+{
+    output->subpixelOrder = subpixelOrder;
+    output->changed = TRUE;
+    return TRUE;
+}
+
 void
 RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output)
 {
diff-tree afe5e9483b352ed06075ed68a6ffa50799194e2d (from 2be1ac15aee592782d7693b8de2c3815478a094e)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Mon Sep 18 12:18:22 2006 -0700

    RandR working with old clients and old API.

diff --git a/randr/randr.c b/randr/randr.c
index 63d471c..926e32f 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -477,6 +477,7 @@ RRScanOldConfig (ScreenPtr pScreen, Rota
 	if (!output)
 	    return;
 	RROutputSetCrtcs (output, &crtc, 1);
+	RROutputSetCrtc (output, crtc);
 	RROutputSetConnection (output, RR_Connected);
     }
 
@@ -552,8 +553,8 @@ RRScanOldConfig (ScreenPtr pScreen, Rota
 
     /* notice current mode */
     if (newMode)
-	RRCrtcSet (output->crtc, newMode, 0, 0, pScrPriv->rotation,
-		   1, &output);
+	RRCrtcNotify (output->crtc, newMode, 0, 0, pScrPriv->rotation,
+		      1, &output);
 }
 #endif
 
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 3346157..a7f91b7 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -482,6 +482,9 @@ RROutputSetCrtcs (RROutputPtr	output,
 		  RRCrtcPtr	*crtcs,
 		  int		numCrtcs);
 
+void
+RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc);
+    
 Bool
 RROutputSetConnection (RROutputPtr  output,
 		       CARD8	    connection);
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index d343c3a..d1328e7 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -59,7 +59,13 @@ RRCrtcCreate (ScreenPtr	pScreen,
     crtc->numOutputs = 0;
     crtc->changed = TRUE;
     crtc->devPrivate = devPrivate;
+
+    if (!AddResource (crtc->id, RRCrtcType, (pointer) crtc))
+	return NULL;
+
+    pScrPriv->crtcs = crtcs;
     pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc;
+    pScrPriv->changed = TRUE;
     return crtc;
 }
 
@@ -165,6 +171,16 @@ RRCrtcSet (RRCrtcPtr    crtc,
     ScreenPtr	pScreen = crtc->pScreen;
     rrScrPriv(pScreen);
 
+    /* See if nothing changed */
+    if (crtc->mode == mode &&
+	crtc->x == x &&
+	crtc->y == y &&
+	crtc->rotation == rotation &&
+	crtc->numOutputs == numOutputs &&
+	!memcmp (crtc->outputs, outputs, numOutputs * sizeof (RROutputPtr)))
+    {
+	return TRUE;
+    }
 #if RANDR_12_INTERFACE
     if (pScrPriv->rrCrtcSet)
     {
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
index acf6298..279acfd 100644
--- a/randr/rrdispatch.c
+++ b/randr/rrdispatch.c
@@ -824,7 +824,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
     if (!crtc)
     {
 	client->errorValue = stuff->crtc;
-	return RRErrorBase + BadCrtc;
+	return RRErrorBase + BadRRCrtc;
     }
     if (stuff->mode == None)
     {
@@ -838,7 +838,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	if (!mode)
 	{
 	    client->errorValue = stuff->mode;
-	    return RRErrorBase + BadMode;
+	    return RRErrorBase + BadRRMode;
 	}
 	if (numOutputs == 0)
 	    return BadMatch;
@@ -854,7 +854,7 @@ ProcRRSetCrtcConfig (ClientPtr client)
 	if (!outputs[i])
 	{
 	    client->errorValue = outputIds[i];
-	    return RRErrorBase + BadOutput;
+	    return RRErrorBase + BadRROutput;
 	}
 	/* validate crtc for this output */
 	for (j = 0; j < outputs[i]->numCrtcs; j++)
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 3a9d556..52585d9 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -32,6 +32,7 @@ RRModeGet (ScreenPtr	pScreen,
     rrScrPriv (pScreen);
     int	i;
     RRModePtr	mode;
+    RRModePtr	*modes;
 
     for (i = 0; i < pScrPriv->numModes; i++)
     {
@@ -43,16 +44,34 @@ RRModeGet (ScreenPtr	pScreen,
 	    return mode;
 	}
     }
+
     mode = xalloc (sizeof (RRModeRec) + modeInfo->nameLength + 1);
+    if (!mode)
+	return NULL;
     mode->refcnt = 1;
     mode->mode = *modeInfo;
     mode->name = (char *) (mode + 1);
     memcpy (mode->name, name, modeInfo->nameLength);
     mode->name[modeInfo->nameLength] = '\0';
+
+    if (pScrPriv->numModes)
+	modes = xrealloc (pScrPriv->modes,
+			  (pScrPriv->numModes + 1) * sizeof (RRModePtr));
+    else
+	modes = xalloc (sizeof (RRModePtr));
+
+    if (!modes)
+    {
+	xfree (mode);
+	return NULL;
+    }
+
     mode->id = FakeClientID(0);
     if (!AddResource (mode->id, RRModeType, (pointer) mode))
 	return NULL;
     ++mode->refcnt;
+    pScrPriv->modes = modes;
+    pScrPriv->modes[pScrPriv->numModes++] = mode;
     pScrPriv->changed = TRUE;
     return mode;
 }
diff --git a/randr/rroutput.c b/randr/rroutput.c
index 6b67f19..ba5bcb4 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -56,6 +56,7 @@ RROutputCreate (ScreenPtr   pScreen,
     output->name = (char *) (output + 1);
     output->nameLength = nameLength;
     memcpy (output->name, name, nameLength);
+    output->name[nameLength] = '\0';
     output->connection = RR_UnknownConnection;
     output->subpixelOrder = SubPixelUnknown;
     output->crtc = NULL;
@@ -67,7 +68,13 @@ RROutputCreate (ScreenPtr   pScreen,
     output->modes = NULL;
     output->changed = TRUE;
     output->devPrivate = devPrivate;
+    
+    if (!AddResource (output->id, RROutputType, (pointer) output))
+	return NULL;
+
+    pScrPriv->outputs = outputs;
     pScrPriv->outputs[pScrPriv->numOutputs++] = output;
+    pScrPriv->changed = TRUE;
     return output;
 }
 
@@ -89,6 +96,7 @@ RROutputSetClones (RROutputPtr  output,
     memcpy (newClones, clones, numClones * sizeof (RROutputPtr));
     output->clones = newClones;
     output->numClones = numClones;
+    output->changed = TRUE;
     return TRUE;
 }
 
@@ -107,6 +115,7 @@ RROutputSetModes (RROutputPtr	output,
     memcpy (newModes, modes, numModes * sizeof (RRModePtr));
     output->modes = newModes;
     output->numModes = numModes;
+    output->changed = TRUE;
     return TRUE;
 }
 
@@ -125,14 +134,23 @@ RROutputSetCrtcs (RROutputPtr	output,
     memcpy (newCrtcs, crtcs, numCrtcs * sizeof (RRCrtcPtr));
     output->crtcs = newCrtcs;
     output->numCrtcs = numCrtcs;
+    output->changed = TRUE;
     return TRUE;
 }
 
+void
+RROutputSetCrtc (RROutputPtr output, RRCrtcPtr crtc)
+{
+    output->crtc = crtc;
+    output->changed = TRUE;
+}
+
 Bool
 RROutputSetConnection (RROutputPtr  output,
 		       CARD8	    connection)
 {
     output->connection = connection;
+    output->changed = TRUE;
     return TRUE;
 }
 
diff-tree 2be1ac15aee592782d7693b8de2c3815478a094e (from bf07893947cfca945598e194ed416fda6162b11c)
Author: Keith Packard <keithp at guitar.keithp.com>
Date:   Mon Sep 18 12:11:18 2006 -0700

    Remove smashing of CFLAGS from server build.
    
    CFLAGS is a user variable, extracted from the environment at configure time
    and settable by the user at build time. We must not override this variable.

diff --git a/configure.ac b/configure.ac
index 798c8f0..d1afa78 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1605,13 +1605,11 @@ AM_CONDITIONAL(BUILD_KBD_MODE, [test x$B
 AM_CONDITIONAL(BSD_KBD_MODE, [test x$KBD_MODE_TYPE = xbsd])
 AM_CONDITIONAL(SUN_KBD_MODE, [test x$KBD_MODE_TYPE = xsun])
 
-CFLAGS="$XSERVER_CFLAGS $CFLAGS"
-AC_SUBST([CFLAGS])
-
 BUILD_DATE="$(date +'%Y%m%d')"
 AC_SUBST([BUILD_DATE])
 
-DIX_CFLAGS="-DHAVE_DIX_CONFIG_H"
+DIX_CFLAGS="-DHAVE_DIX_CONFIG_H $XSERVER_CFLAGS"
+
 AC_SUBST([DIX_CFLAGS])
 
 AC_SUBST([libdir exec_prefix prefix])
diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
index d983ee9..08a3a87 100644
--- a/hw/xfree86/common/Makefile.am
+++ b/hw/xfree86/common/Makefile.am
@@ -103,4 +103,4 @@ if LNXACPI
 XORG_CFLAGS += -DHAVE_ACPI
 endif
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
diff --git a/hw/xfree86/ddc/Makefile.am b/hw/xfree86/ddc/Makefile.am
index 7cfff47..aff8cd3 100644
--- a/hw/xfree86/ddc/Makefile.am
+++ b/hw/xfree86/ddc/Makefile.am
@@ -8,6 +8,6 @@ libddc_la_SOURCES = xf86DDC.c edid.c int
 
 INCLUDES = $(XORG_INCS) -I$(srcdir)/../i2c
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 EXTRA_DIST = ddcPriv.h DDC.HOWTO
diff --git a/hw/xfree86/dixmods/extmod/Makefile.am b/hw/xfree86/dixmods/extmod/Makefile.am
index 229d4e5..9f6c408 100644
--- a/hw/xfree86/dixmods/extmod/Makefile.am
+++ b/hw/xfree86/dixmods/extmod/Makefile.am
@@ -11,7 +11,7 @@ if XV
 XV_SRCS = xvmod.c xvmodproc.h
 endif
 
-AM_CFLAGS = @XORG_CFLAGS@
+AM_CFLAGS = @DIX_CFLAGS@ @XORG_CFLAGS@
 INCLUDES = @XORG_INCS@ \
            -I$(top_srcdir)/afb \
            -I$(top_srcdir)/mfb \
diff --git a/hw/xfree86/dri/Makefile.am b/hw/xfree86/dri/Makefile.am
index e711846..bc7124b 100644
--- a/hw/xfree86/dri/Makefile.am
+++ b/hw/xfree86/dri/Makefile.am
@@ -10,7 +10,7 @@ libdri_la_CFLAGS = -I$(top_srcdir)/hw/xf
 		 \
 		 \
  \
-                   @DRIPROTO_CFLAGS@ \
+                   @DIX_CFLAGS@ @DRIPROTO_CFLAGS@ \
                    @LIBDRM_CFLAGS@ \
                    @GL_CFLAGS@
 libdri_la_LDFLAGS = -module -avoid-version
diff --git a/hw/xfree86/dummylib/Makefile.am b/hw/xfree86/dummylib/Makefile.am
index d89ee59..6299a1f 100644
--- a/hw/xfree86/dummylib/Makefile.am
+++ b/hw/xfree86/dummylib/Makefile.am
@@ -6,7 +6,7 @@ noinst_LIBRARIES = libdummy-nonserver.a
 
 INCLUDES = $(XORG_INCS)
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 if NEED_STRLCAT
 STRL_SRCS = $(top_srcdir)/os/strlcat.c $(top_srcdir)/os/strlcpy.c
diff --git a/hw/xfree86/exa/Makefile.am b/hw/xfree86/exa/Makefile.am
index 31682c4..9eb2e17 100644
--- a/hw/xfree86/exa/Makefile.am
+++ b/hw/xfree86/exa/Makefile.am
@@ -7,7 +7,7 @@ INCLUDES = \
 	-I$(srcdir)/../../../exa \
 	-I$(srcdir)/../../../miext/cw
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 libexa_la_SOURCES = \
 	examodule.c
diff --git a/hw/xfree86/fbdevhw/Makefile.am b/hw/xfree86/fbdevhw/Makefile.am
index 10de50e..6a4a6e4 100644
--- a/hw/xfree86/fbdevhw/Makefile.am
+++ b/hw/xfree86/fbdevhw/Makefile.am
@@ -11,7 +11,7 @@ endif
 
 INCLUDES = $(XORG_INCS) -I$(srcdir)/../i2c
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 sdk_HEADERS = fbdevhw.h
 
diff --git a/hw/xfree86/i2c/Makefile.am b/hw/xfree86/i2c/Makefile.am
index cbf4f65..e73fcae 100644
--- a/hw/xfree86/i2c/Makefile.am
+++ b/hw/xfree86/i2c/Makefile.am
@@ -15,7 +15,7 @@ libi2c_la_SOURCES = xf86i2c.c xf86i2cmod
 
 INCLUDES = $(XORG_INCS)
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 sdk_HEADERS = xf86i2c.h bt829.h fi1236.h msp3430.h tda8425.h tda9850.h tda9885.h uda1380.h i2c_def.h
 
diff --git a/hw/xfree86/int10/Makefile.am b/hw/xfree86/int10/Makefile.am
index c059070..868954f 100644
--- a/hw/xfree86/int10/Makefile.am
+++ b/hw/xfree86/int10/Makefile.am
@@ -14,7 +14,7 @@ COMMON_SOURCES = \
 	xf86int10module.c
 
 if INT10_VM86
-AM_CFLAGS = -D_PC -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS)
+AM_CFLAGS = -D_PC -D_VM86_LINUX $(DIX_CFLAGS) $(XORG_CFLAGS) $(EXTRA_CFLAGS)
 INCLUDES = $(XORG_INCS)
 libint10_la_SOURCES = \
 	$(COMMON_SOURCES) \
@@ -23,7 +23,7 @@ libint10_la_SOURCES = \
 endif
 
 if INT10_X86EMU
-AM_CFLAGS = -D_X86EMU -DNO_SYS_HEADERS -D_PC $(XORG_CFLAGS) $(EXTRA_CFLAGS)
+AM_CFLAGS = -D_X86EMU -DNO_SYS_HEADERS -D_PC $(DIX_CFLAGS) $(XORG_CFLAGS) $(EXTRA_CFLAGS)
 INCLUDES = $(XORG_INCS) -I$(srcdir)/../x86emu
 libint10_la_SOURCES = \
 	$(COMMON_SOURCES) \
@@ -33,7 +33,7 @@ libint10_la_SOURCES = \
 endif
 
 if INT10_STUB
-AM_CFLAGS = -D_PC -D_VM86_LINUX $(XORG_CFLAGS) $(EXTRA_CFLAGS)
+AM_CFLAGS = -D_PC -D_VM86_LINUX $(DIX_CFLAGS) $(XORG_CFLAGS) $(EXTRA_CFLAGS)
 libint10_la_SOURCES = stub.c xf86int10module.c
 endif
 
diff --git a/hw/xfree86/loader/Makefile.am b/hw/xfree86/loader/Makefile.am
index 0306723..2066002 100644
--- a/hw/xfree86/loader/Makefile.am
+++ b/hw/xfree86/loader/Makefile.am
@@ -5,7 +5,7 @@ INCLUDES = $(XORG_INCS) -I$(srcdir)/../p
 	   -I$(srcdir)/../ddc -I$(srcdir)/../i2c
 
 #AM_LDFLAGS = -r
-AM_CFLAGS = -DIN_LOADER $(XORG_CFLAGS)
+AM_CFLAGS = -DIN_LOADER $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 if XORG_LOADER_SPARC
 SPARC_SOURCES = SparcMulDiv.S
diff --git a/hw/xfree86/os-support/Makefile.am b/hw/xfree86/os-support/Makefile.am
index e64703a..58b0e95 100644
--- a/hw/xfree86/os-support/Makefile.am
+++ b/hw/xfree86/os-support/Makefile.am
@@ -19,6 +19,8 @@ libxorgos_la_LIBADD = @XORG_OS_SUBDIR@/l
                       bus/libbus.la \
                       misc/libmisc.la
 
+AM_CFLAGS = $(DIX_CFLAGS) 
+
 xorgos.c:
 	touch $@
 
diff --git a/hw/xfree86/parser/Makefile.am b/hw/xfree86/parser/Makefile.am
index 46ef790..a9491a1 100644
--- a/hw/xfree86/parser/Makefile.am
+++ b/hw/xfree86/parser/Makefile.am
@@ -26,7 +26,7 @@ libxf86config_a_SOURCES = \
 	DRI.c \
 	Extensions.c
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 EXTRA_DIST = \
 	Configint.h \
diff --git a/hw/xfree86/rac/Makefile.am b/hw/xfree86/rac/Makefile.am
index 2d8d879..b250682 100644
--- a/hw/xfree86/rac/Makefile.am
+++ b/hw/xfree86/rac/Makefile.am
@@ -5,4 +5,4 @@ sdk_HEADERS = xf86RAC.h
 
 INCLUDES = $(XORG_INCS)
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
diff --git a/hw/xfree86/ramdac/Makefile.am b/hw/xfree86/ramdac/Makefile.am
index c9afdad..8d94445 100644
--- a/hw/xfree86/ramdac/Makefile.am
+++ b/hw/xfree86/ramdac/Makefile.am
@@ -13,7 +13,7 @@ EXTRA_DIST = BTPriv.h IBMPriv.h TIPriv.h
 	CURSOR.NOTES
 
 AM_CFLAGS = -DXAAReverseBitOrder=xf86ReverseBitOrder -DRAMDAC_MODULE \
-            $(XORG_CFLAGS)
+            $(DIX_CFLAGS) $(XORG_CFLAGS)
 INCLUDES = $(XORG_INCS)
 
 xf86BitOrder.c:
diff --git a/hw/xfree86/scanpci/Makefile.am b/hw/xfree86/scanpci/Makefile.am
index 7e5671a..d4d9da2 100644
--- a/hw/xfree86/scanpci/Makefile.am
+++ b/hw/xfree86/scanpci/Makefile.am
@@ -8,7 +8,7 @@ libscanpci_la_SOURCES = xf86ScanPci.c
 
 INCLUDES = $(XORG_INCS)
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 BUILT_SOURCES = xf86PciIds.h
 
diff --git a/hw/xfree86/shadowfb/Makefile.am b/hw/xfree86/shadowfb/Makefile.am
index cb5ebb1..02d2dd4 100644
--- a/hw/xfree86/shadowfb/Makefile.am
+++ b/hw/xfree86/shadowfb/Makefile.am
@@ -6,4 +6,4 @@ sdk_HEADERS = shadowfb.h
 
 INCLUDES = $(XORG_INCS)
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
diff --git a/hw/xfree86/vbe/Makefile.am b/hw/xfree86/vbe/Makefile.am
index 02fdb48..85c6fd8 100644
--- a/hw/xfree86/vbe/Makefile.am
+++ b/hw/xfree86/vbe/Makefile.am
@@ -4,7 +4,7 @@ libvbe_la_SOURCES = vbe.c vbeModes.c vbe
 
 sdk_HEADERS = vbe.h vbeModes.h
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 INCLUDES = $(XORG_INCS) -I$(srcdir)/../ddc -I$(srcdir)/../i2c \
            -I$(srcdir)/../int10
diff --git a/hw/xfree86/vgahw/Makefile.am b/hw/xfree86/vgahw/Makefile.am
index 2aa27fa..f48e46a 100644
--- a/hw/xfree86/vgahw/Makefile.am
+++ b/hw/xfree86/vgahw/Makefile.am
@@ -2,7 +2,7 @@ module_LTLIBRARIES = libvgahw.la
 libvgahw_la_LDFLAGS = -avoid-version
 libvgahw_la_SOURCES = vgaHW.c vgaHWmodule.c
 INCLUDES = $(XORG_INCS) -I$(srcdir)/../ddc -I$(srcdir)/../i2c
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 sdk_HEADERS = vgaHW.h
 
diff --git a/hw/xfree86/x86emu/Makefile.am b/hw/xfree86/x86emu/Makefile.am
index 5959c86..9f9c87f 100644
--- a/hw/xfree86/x86emu/Makefile.am
+++ b/hw/xfree86/x86emu/Makefile.am
@@ -11,7 +11,7 @@ libx86emu_a_SOURCES = debug.c \
 
 INCLUDES = 
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 EXTRA_DIST = validate.c \
              x86emu/debug.h \
diff --git a/hw/xfree86/xaa/Makefile.am b/hw/xfree86/xaa/Makefile.am
index 23b7e16..5d529b1 100644
--- a/hw/xfree86/xaa/Makefile.am
+++ b/hw/xfree86/xaa/Makefile.am
@@ -68,4 +68,4 @@ EXTRA_DIST = xaacexp.h xaawrap.h xaaLine
 
 INCLUDES = $(XORG_INCS)
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
diff --git a/hw/xfree86/xf4bpp/Makefile.am b/hw/xfree86/xf4bpp/Makefile.am
index 7cb4ac2..9af3364 100644
--- a/hw/xfree86/xf4bpp/Makefile.am
+++ b/hw/xfree86/xf4bpp/Makefile.am
@@ -59,4 +59,4 @@ mfbseg.c:
 
 INCLUDES = $(XORG_INCS) -I$(srcdir)/../xf1bpp -I$(top_srcdir)/mfb
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
diff --git a/hw/xfree86/xf8_16bpp/Makefile.am b/hw/xfree86/xf8_16bpp/Makefile.am
index 5b30f45..3c5b8c9 100644
--- a/hw/xfree86/xf8_16bpp/Makefile.am
+++ b/hw/xfree86/xf8_16bpp/Makefile.am
@@ -4,7 +4,7 @@ sdk_HEADERS = cfb8_16.h
 
 INCLUDES = $(XORG_INCS) -I$(top_srcdir)/fb
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 libxf8_16bpp_la_LDFLAGS = -avoid-version
 
diff --git a/hw/xfree86/xf8_32bpp/Makefile.am b/hw/xfree86/xf8_32bpp/Makefile.am
index 3050b81..bbcd10f 100644
--- a/hw/xfree86/xf8_32bpp/Makefile.am
+++ b/hw/xfree86/xf8_32bpp/Makefile.am
@@ -4,7 +4,7 @@ sdk_HEADERS = cfb8_32.h
 
 INCLUDES = $(XORG_INCS) -I$(top_srcdir)/mfb -I$(top_srcdir)/cfb
 
-AM_CFLAGS = $(XORG_CFLAGS)
+AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
 
 libxf8_32bpp_la_LDFLAGS = -avoid-version
 
diff-tree bf07893947cfca945598e194ed416fda6162b11c (from 3e745745fecef1cb59e53bde52ded311b51e1dac)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sun Sep 17 23:03:23 2006 -0700

    Split out RandR dispatch code from randr.c to rr*dispatch.c.
    
    More disassembly to ease ongoing development.

diff --git a/randr/Makefile.am b/randr/Makefile.am
index 868786e..0a73557 100644
--- a/randr/Makefile.am
+++ b/randr/Makefile.am
@@ -11,6 +11,8 @@ librandr_la_SOURCES =	\
 	randr.c		\
 	randrstr.h	\
 	rrcrtc.c	\
+	rrdispatch.c	\
 	rrmode.c	\
 	rroutput.c	\
-	rrscreen.c
+	rrscreen.c	\
+	rrsdispatch.c
diff --git a/randr/randr.c b/randr/randr.c
index 2305b60..63d471c 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -42,10 +42,8 @@
 int	RRGeneration;
 int	RRNScreens;
 
-static int ProcRRQueryVersion (ClientPtr pClient);
 static int ProcRRDispatch (ClientPtr pClient);
 static int SProcRRDispatch (ClientPtr pClient);
-static int SProcRRQueryVersion (ClientPtr pClient);
 
 #define wrap(priv,real,mem,func) {\
     priv->mem = real->mem; \
@@ -56,57 +54,13 @@ static int SProcRRQueryVersion (ClientPt
     real->mem = priv->mem; \
 }
 
-#if 0
-static CARD8	RRReqCode;
-static int	RRErrBase;
-#endif
 int	RREventBase;
-static RESTYPE ClientType, EventType; /* resource types for event masks */
-static int	RRClientPrivateIndex;
-
-typedef struct _RRTimes {
-    TimeStamp	setTime;
-    TimeStamp	configTime;
-} RRTimesRec, *RRTimesPtr;
-
-typedef struct _RRClient {
-    int		major_version;
-    int		minor_version;
-/*  RRTimesRec	times[0]; */
-} RRClientRec, *RRClientPtr;
-
-/*
- * each window has a list of clients requesting
- * RRNotify events.  Each client has a resource
- * for each window it selects RRNotify input for,
- * this resource is used to delete the RRNotifyRec
- * entry from the per-window queue.
- */
-
-typedef struct _RREvent *RREventPtr;
-
-typedef struct _RREvent {
-    RREventPtr  next;
-    ClientPtr	client;
-    WindowPtr	window;
-    XID		clientResource;
-    int		mask;
-} RREventRec;
+int	RRErrorBase;
+RESTYPE RRClientType, RREventType; /* resource types for event masks */
+int	RRClientPrivateIndex;
 
 int	rrPrivIndex = -1;
 
-#define GetRRClient(pClient)    ((RRClientPtr) (pClient)->devPrivates[RRClientPrivateIndex].ptr)
-#define rrClientPriv(pClient)	RRClientPtr pRRClient = GetRRClient(pClient)
-
-static Bool
-RRClientKnowsRates (ClientPtr	pClient)
-{
-    rrClientPriv(pClient);
-
-    return (pRRClient->major_version > 1 ||
-	    (pRRClient->major_version == 1 && pRRClient->minor_version >= 1));
-}
-
 static void
 RRClientCallback (CallbackListPtr	*list,
 		  pointer		closure,
@@ -289,7 +243,7 @@ RRFreeClient (pointer data, XID id)
 
     pRREvent = (RREventPtr) data;
     pWin = pRREvent->window;
-    pHead = (RREventPtr *) LookupIDByType(pWin->drawable.id, EventType);
+    pHead = (RREventPtr *) LookupIDByType(pWin->drawable.id, RREventType);
     if (pHead) {
 	pPrev = 0;
 	for (pCur = *pHead; pCur && pCur != pRREvent; pCur=pCur->next)
@@ -315,7 +269,7 @@ RRFreeEvents (pointer data, XID id)
     pHead = (RREventPtr *) data;
     for (pCur = *pHead; pCur; pCur = pNext) {
 	pNext = pCur->next;
-	FreeResource (pCur->clientResource, ClientType);
+	FreeResource (pCur->clientResource, RRClientType);
 	xfree ((pointer) pCur);
     }
     xfree ((pointer) pHead);
@@ -337,38 +291,26 @@ RRExtensionInit (void)
     if (!AddCallback (&ClientStateCallback, RRClientCallback, 0))
 	return;
 
-    ClientType = CreateNewResourceType(RRFreeClient);
-    if (!ClientType)
+    RRClientType = CreateNewResourceType(RRFreeClient);
+    if (!RRClientType)
 	return;
-    EventType = CreateNewResourceType(RRFreeEvents);
-    if (!EventType)
+    RREventType = CreateNewResourceType(RRFreeEvents);
+    if (!RREventType)
 	return;
     extEntry = AddExtension (RANDR_NAME, RRNumberEvents, RRNumberErrors,
 			     ProcRRDispatch, SProcRRDispatch,
 			     RRResetProc, StandardMinorOpcode);
     if (!extEntry)
 	return;
-#if 0
-    RRReqCode = (CARD8) extEntry->base;
-    RRErrBase = extEntry->errorBase;
-#endif
+    RRErrorBase = extEntry->errorBase;
     RREventBase = extEntry->eventBase;
     EventSwapVector[RREventBase + RRScreenChangeNotify] = (EventSwapPtr) 
-      SRRScreenChangeNotifyEvent;
+	SRRScreenChangeNotifyEvent;
     EventSwapVector[RREventBase + RRNotify] = (EventSwapPtr)
 	SRRNotifyEvent;
 
     return;
 }
-static void
-DeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
-{
-}
-
-static void
-DeliverOutputEvent (ClientPtr client, WindowPtr pWin, RROutputPtr output)
-{
-}
 
 static int
 TellChanged (WindowPtr pWin, pointer value)
@@ -379,7 +321,7 @@ TellChanged (WindowPtr pWin, pointer val
     rrScrPriv(pScreen);
     int				i;
 
-    pHead = (RREventPtr *) LookupIDByType (pWin->drawable.id, EventType);
+    pHead = (RREventPtr *) LookupIDByType (pWin->drawable.id, RREventType);
     if (!pHead)
 	return WT_WALKCHILDREN;
 
@@ -398,7 +340,7 @@ TellChanged (WindowPtr pWin, pointer val
 	    {
 		RRCrtcPtr   crtc = pScrPriv->crtcs[i];
 		if (crtc->changed)
-		    DeliverCrtcEvent (client, pWin, crtc);
+		    RRDeliverCrtcEvent (client, pWin, crtc);
 	    }
 	}
 	
@@ -408,7 +350,7 @@ TellChanged (WindowPtr pWin, pointer val
 	    {
 		RROutputPtr   output = pScrPriv->outputs[i];
 		if (output->changed)
-		    DeliverOutputEvent (client, pWin, output);
+		    RRDeliverOutputEvent (client, pWin, output);
 	    }
 	}
     }
@@ -438,7 +380,7 @@ RRTellChanged (ScreenPtr pScreen)
  * Return the first output which is connected to an active CRTC
  * Used in emulating 1.0 behaviour
  */
-static RROutputPtr
+RROutputPtr
 RRFirstOutput (ScreenPtr pScreen)
 {
     rrScrPriv(pScreen);
@@ -459,7 +401,6 @@ RRFirstOutput (ScreenPtr pScreen)
 }
 
 #ifdef RANDR_10_INTERFACE
-
 static RRModePtr
 RROldModeAdd (RROutputPtr output, RRScreenSizePtr size, int refresh)
 {
@@ -515,13 +456,31 @@ static void
 RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
 {
     rrScrPriv(pScreen);
-    RROutputPtr	output = RRFirstOutput (pScreen);
+    RROutputPtr	output;
     RRCrtcPtr	crtc;
     RRModePtr	mode, newMode = NULL;
     int		i;
     CARD16	minWidth = MAXSHORT, minHeight = MAXSHORT;
     CARD16	maxWidth = 0, maxHeight = 0;
     
+    /*
+     * First time through, create a crtc and output and hook
+     * them together
+     */
+    if (pScrPriv->numOutputs == 0 &&
+	pScrPriv->numCrtcs == 0)
+    {
+	crtc = RRCrtcCreate (pScreen, NULL);
+	if (!crtc)
+	    return;
+	output = RROutputCreate (pScreen, "default", 7, NULL);
+	if (!output)
+	    return;
+	RROutputSetCrtcs (output, &crtc, 1);
+	RROutputSetConnection (output, RR_Connected);
+    }
+
+    output = RRFirstOutput (pScreen);
     if (!output)
 	return;
     crtc = output->crtc;
@@ -601,7 +560,7 @@ RRScanOldConfig (ScreenPtr pScreen, Rota
 /*
  * Poll the driver for changed information
  */
-static Bool
+Bool
 RRGetInfo (ScreenPtr pScreen)
 {
     rrScrPriv (pScreen);
@@ -627,44 +586,6 @@ RRGetInfo (ScreenPtr pScreen)
     return TRUE;
 }
 
-static int
-ProcRRQueryVersion (ClientPtr client)
-{
-    xRRQueryVersionReply rep;
-    register int n;
-    REQUEST(xRRQueryVersionReq);
-    rrClientPriv(client);
-
-    REQUEST_SIZE_MATCH(xRRQueryVersionReq);
-    pRRClient->major_version = stuff->majorVersion;
-    pRRClient->minor_version = stuff->minorVersion;
-    rep.type = X_Reply;
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-    /*
-     * Report the current version; the current
-     * spec says they're all compatible after 1.0
-     */
-    rep.majorVersion = RANDR_MAJOR;
-    rep.minorVersion = RANDR_MINOR;
-    if (client->swapped) {
-    	swaps(&rep.sequenceNumber, n);
-    	swapl(&rep.length, n);
-	swapl(&rep.majorVersion, n);
-	swapl(&rep.minorVersion, n);
-    }
-    WriteToClient(client, sizeof(xRRQueryVersionReply), (char *)&rep);
-    return (client->noClientException);
-}
-
-typedef struct _RR10Data {
-    RRScreenSizePtr sizes;
-    int		    nsize;
-    int		    nrefresh;
-    int		    size;
-    CARD16	    refresh;
-} RR10DataRec, *RR10DataPtr;
-
 CARD16
 RRVerticalRefresh (xRRModeInfo *mode)
 {
@@ -677,411 +598,6 @@ RRVerticalRefresh (xRRModeInfo *mode)
     return (CARD16) refresh;
 }
 
-/*
- * Convert 1.2 monitor data into 1.0 screen data
- */
-static RR10DataPtr
-RR10GetData (ScreenPtr pScreen, RROutputPtr output)
-{
-    RR10DataPtr	    data;
-    RRScreenSizePtr size;
-    int		    nmode = output->numModes;
-    int		    i, j, k;
-    RRScreenRatePtr refresh;
-    CARD16	    vRefresh;
-    RRModePtr	    mode;
-
-    /* Make sure there is plenty of space for any combination */
-    data = malloc (sizeof (RR10DataRec) + 
-		   sizeof (RRScreenSize) * nmode + 
-		   sizeof (RRScreenRate) * nmode);
-    if (!data)
-	return NULL;
-    size = (RRScreenSizePtr) (data + 1);
-    refresh = (RRScreenRatePtr) (size + nmode);
-    data->sizes = size;
-    data->nsize = 0;
-    data->nrefresh = 0;
-    data->size = 0;
-    data->refresh = 0;
-    for (i = 0; i < output->numModes; i++)
-    {
-	mode = output->modes[i];
-	for (j = 0; j < data->nsize; j++)
-	    if (mode->mode.width == size[j].width &&
-		mode->mode.height == size[j].height)
-		break;
-	if (j == data->nsize)
-	{
-	    size[j].id = j;
-	    size[j].width = mode->mode.width;
-	    size[j].height = mode->mode.height;
-	    size[j].mmWidth = mode->mode.mmWidth;
-	    size[j].mmHeight = mode->mode.mmHeight;
-	    size[j].nRates = 0;
-	    size[j].pRates = &refresh[data->nrefresh];
-	    data->nsize++;
-	}
-	vRefresh = RRVerticalRefresh (&mode->mode);
-	for (k = 0; k < size[j].nRates; k++)
-	    if (vRefresh == size[j].pRates[k].rate)
-		break;
-	if (k == size[j].nRates)
-	{
-	    size[j].pRates[k].rate = vRefresh;
-	    size[j].pRates[k].mode = mode;
-	    size[j].nRates++;
-	    data->nrefresh++;
-	}
-	if (mode == output->crtc->mode)
-	{
-	    data->size = j;
-	    data->refresh = vRefresh;
-	}
-    }
-    return data;
-}
-
-static int
-ProcRRGetScreenInfo (ClientPtr client)
-{
-    REQUEST(xRRGetScreenInfoReq);
-    xRRGetScreenInfoReply   rep;
-    WindowPtr	    	    pWin;
-    int			    n;
-    ScreenPtr		    pScreen;
-    rrScrPrivPtr	    pScrPriv;
-    CARD8		    *extra;
-    unsigned long	    extraLen;
-    RROutputPtr		    output;
-
-    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
-    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
-					   SecurityReadAccess);
-
-    if (!pWin)
-	return BadWindow;
-
-    pScreen = pWin->drawable.pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    rep.pad = 0;
-    
-    if (pScrPriv)
-	RRGetInfo (pScreen);
-
-    output = RRFirstOutput (pScreen);
-    
-    if (!pScrPriv || !output)
-    {
-	rep.type = X_Reply;
-	rep.setOfRotations = RR_Rotate_0;;
-	rep.sequenceNumber = client->sequence;
-	rep.length = 0;
-	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
-	rep.timestamp = currentTime.milliseconds;
-	rep.configTimestamp = currentTime.milliseconds;
-	rep.nSizes = 0;
-	rep.sizeID = 0;
-	rep.rotation = RR_Rotate_0;
-	rep.rate = 0;
-	rep.nrateEnts = 0;
-	extra = 0;
-	extraLen = 0;
-    }
-    else
-    {
-	int			i, j;
-	xScreenSizes		*size;
-	CARD16			*rates;
-	CARD8			*data8;
-	Bool			has_rate = RRClientKnowsRates (client);
-	RR10DataPtr		pData;
-	RRScreenSizePtr		pSize;
-    
-	pData = RR10GetData (pScreen, output);
-	if (!pData)
-	    return BadAlloc;
-	
-	rep.type = X_Reply;
-	rep.setOfRotations = output->crtc->rotations;
-	rep.sequenceNumber = client->sequence;
-	rep.length = 0;
-	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
-	rep.timestamp = pScrPriv->lastSetTime.milliseconds;
-	rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
-	rep.rotation = output->crtc->rotation;
-	rep.nSizes = pData->nsize;
-        rep.nrateEnts = pData->nrefresh + pData->nsize;
-	rep.sizeID = pData->size;
-	rep.rate = pData->refresh;
-
-	extraLen = (rep.nSizes * sizeof (xScreenSizes) +
-		    rep.nrateEnts * sizeof (CARD16));
-
-	extra = (CARD8 *) xalloc (extraLen);
-	if (!extra)
-	{
-	    xfree (pData);
-	    return BadAlloc;
-	}
-	/*
-	 * First comes the size information
-	 */
-	size = (xScreenSizes *) extra;
-	rates = (CARD16 *) (size + rep.nSizes);
-	for (i = 0; i < pData->nsize; i++)
-	{
-	    pSize = &pData->sizes[i];
-	    size->widthInPixels = pSize->width;
-	    size->heightInPixels = pSize->height;
-	    size->widthInMillimeters = pSize->mmWidth;
-	    size->heightInMillimeters = pSize->mmHeight;
-	    if (client->swapped)
-	    {
-	        swaps (&size->widthInPixels, n);
-	        swaps (&size->heightInPixels, n);
-	        swaps (&size->widthInMillimeters, n);
-	        swaps (&size->heightInMillimeters, n);
-	    }
-	    size++;
-	    if (has_rate)
-	    {
-		*rates = pSize->nRates;
-		if (client->swapped)
-		{
-		    swaps (rates, n);
-		}
-		rates++;
-		for (j = 0; j < pSize->nRates; j++)
-		{
-		    *rates = pSize->pRates[j].rate;
-		    if (client->swapped)
-		    {
-			swaps (rates, n);
-		    }
-		    rates++;
-		}
-	    }
-	}
-        xfree (pData);
-	
-	data8 = (CARD8 *) rates;
-
-	if (data8 - (CARD8 *) extra != extraLen)
-	    FatalError ("RRGetScreenInfo bad extra len %ld != %ld\n",
-			(unsigned long)(data8 - (CARD8 *) extra), extraLen);
-	rep.length =  (extraLen + 3) >> 2;
-    }
-    if (client->swapped) {
-	swaps(&rep.sequenceNumber, n);
-	swapl(&rep.length, n);
-	swapl(&rep.timestamp, n);
-	swaps(&rep.rotation, n);
-	swaps(&rep.nSizes, n);
-	swaps(&rep.sizeID, n);
-	swaps(&rep.rate, n);
-	swaps(&rep.nrateEnts, n);
-    }
-    WriteToClient(client, sizeof(xRRGetScreenInfoReply), (char *)&rep);
-    if (extraLen)
-    {
-	WriteToClient (client, extraLen, (char *) extra);
-	xfree (extra);
-    }
-    return (client->noClientException);
-}
-
-#if 0
-    return RRSetConfigSuccess;
-}
-#endif
-
-static int
-ProcRRSetScreenConfig (ClientPtr client)
-{
-    REQUEST(xRRSetScreenConfigReq);
-    xRRSetScreenConfigReply rep;
-    DrawablePtr		    pDraw;
-    int			    n;
-    ScreenPtr		    pScreen;
-    rrScrPrivPtr	    pScrPriv;
-    TimeStamp		    configTime;
-    TimeStamp		    time;
-    int			    i;
-    Rotation		    rotation;
-    int			    rate;
-    Bool		    has_rate;
-    RROutputPtr		    output;
-    RRModePtr		    mode;
-    RR10DataPtr		    pData = NULL;
-    RRScreenSizePtr    	    pSize;
-    
-    UpdateCurrentTime ();
-
-    if (RRClientKnowsRates (client))
-    {
-	REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
-	has_rate = TRUE;
-    }
-    else
-    {
-	REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
-	has_rate = FALSE;
-    }
-    
-    SECURITY_VERIFY_DRAWABLE(pDraw, stuff->drawable, client,
-			     SecurityWriteAccess);
-
-    pScreen = pDraw->pScreen;
-
-    pScrPriv = rrGetScrPriv(pScreen);
-    
-    time = ClientTimeToServerTime(stuff->timestamp);
-    configTime = ClientTimeToServerTime(stuff->configTimestamp);
-    
-    if (!pScrPriv)
-    {
-	time = currentTime;
-	rep.status = RRSetConfigFailed;
-	goto sendReply;
-    }
-    if (!RRGetInfo (pScreen))
-	return BadAlloc;
-    
-    output = RRFirstOutput (pScreen);
-    if (!output)
-    {
-	time = currentTime;
-	rep.status = RRSetConfigFailed;
-	goto sendReply;
-    }
-    
-    /*
-     * if the client's config timestamp is not the same as the last config
-     * timestamp, then the config information isn't up-to-date and
-     * can't even be validated
-     */
-    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
-    {
-	rep.status = RRSetConfigInvalidConfigTime;
-	goto sendReply;
-    }
-    
-    pData = RR10GetData (pScreen, output);
-    if (!pData)
-	return BadAlloc;
-    
-    if (stuff->sizeID >= pData->nsize)
-    {
-	/*
-	 * Invalid size ID
-	 */
-	client->errorValue = stuff->sizeID;
-	xfree (pData);
-	return BadValue;
-    }
-    pSize = &pData->sizes[stuff->sizeID];
-    
-    /*
-     * Validate requested rotation
-     */
-    rotation = (Rotation) stuff->rotation;
-
-    /* test the rotation bits only! */
-    switch (rotation & 0xf) {
-    case RR_Rotate_0:
-    case RR_Rotate_90:
-    case RR_Rotate_180:
-    case RR_Rotate_270:
-	break;
-    default:
-	/*
-	 * Invalid rotation
-	 */
-	client->errorValue = stuff->rotation;
-	xfree (pData);
-	return BadValue;
-    }
-
-    if ((~output->crtc->rotations) & rotation)
-    {
-	/*
-	 * requested rotation or reflection not supported by screen
-	 */
-	client->errorValue = stuff->rotation;
-	xfree (pData);
-	return BadMatch;
-    }
-
-    /*
-     * Validate requested refresh
-     */
-    if (has_rate)
-	rate = (int) stuff->rate;
-    else
-	rate = 0;
-
-    if (rate)
-    {
-	for (i = 0; i < pSize->nRates; i++)
-	{
-	    if (pSize->pRates[i].rate == rate)
-		break;
-	}
-	if (i == pSize->nRates)
-	{
-	    /*
-	     * Invalid rate
-	     */
-	    client->errorValue = rate;
-	    xfree (pData);
-	    return BadValue;
-	}
-	mode = pSize->pRates[i].mode;
-    }
-    else
-	mode = pSize->pRates[0].mode;
-    
-    /*
-     * Make sure the requested set-time is not older than
-     * the last set-time
-     */
-    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
-    {
-	rep.status = RRSetConfigInvalidTime;
-	goto sendReply;
-    }
-
-    rep.status = RRCrtcSet (output->crtc, mode, 0, 0, stuff->rotation,
-			    1, &output);
-    
-sendReply:
-    
-    if (pData)
-	xfree (pData);
-
-    rep.type = X_Reply;
-    /* rep.status has already been filled in */
-    rep.length = 0;
-    rep.sequenceNumber = client->sequence;
-
-    rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
-    rep.newConfigTimestamp = pScrPriv->lastConfigTime.milliseconds;
-    rep.root = WindowTable[pDraw->pScreen->myNum]->drawable.id;
-
-    if (client->swapped) 
-    {
-    	swaps(&rep.sequenceNumber, n);
-    	swapl(&rep.length, n);
-	swapl(&rep.newTimestamp, n);
-	swapl(&rep.newConfigTimestamp, n);
-	swapl(&rep.root, n);
-    }
-    WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char *)&rep);
-
-    return (client->noClientException);
-}
-
 #if 0
 int
 RRSetScreenConfig (ScreenPtr		pScreen,
@@ -1160,478 +676,6 @@ RRSetScreenConfig (ScreenPtr		pScreen,
 #endif
 
 static int
-ProcRRSelectInput (ClientPtr client)
-{
-    REQUEST(xRRSelectInputReq);
-    rrClientPriv(client);
-    RRTimesPtr	pTimes;
-    WindowPtr	pWin;
-    RREventPtr	pRREvent, *pHead;
-    XID		clientResource;
-
-    REQUEST_SIZE_MATCH(xRRSelectInputReq);
-    pWin = SecurityLookupWindow (stuff->window, client, SecurityWriteAccess);
-    if (!pWin)
-	return BadWindow;
-    pHead = (RREventPtr *)SecurityLookupIDByType(client,
-						 pWin->drawable.id, EventType,
-						 SecurityWriteAccess);
-
-    if (stuff->enable & (RRScreenChangeNotifyMask|
-			 RRCrtcChangeNotifyMask|
-			 RROutputChangeNotifyMask)) 
-    {
-	ScreenPtr	pScreen = pWin->drawable.pScreen;
-	rrScrPriv	(pScreen);
-
-	pRREvent = NULL;
-	if (pHead) 
-	{
-	    /* check for existing entry. */
-	    for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next)
-		if (pRREvent->client == client)
-		    break;
-	}
-
-	if (!pRREvent)
-	{
-	    /* build the entry */
-	    pRREvent = (RREventPtr) xalloc (sizeof (RREventRec));
-	    if (!pRREvent)
-		return BadAlloc;
-	    pRREvent->next = 0;
-	    pRREvent->client = client;
-	    pRREvent->window = pWin;
-	    pRREvent->mask = stuff->enable;
-	    /*
-	     * add a resource that will be deleted when
-	     * the client goes away
-	     */
-	    clientResource = FakeClientID (client->index);
-	    pRREvent->clientResource = clientResource;
-	    if (!AddResource (clientResource, ClientType, (pointer)pRREvent))
-		return BadAlloc;
-	    /*
-	     * create a resource to contain a pointer to the list
-	     * of clients selecting input.  This must be indirect as
-	     * the list may be arbitrarily rearranged which cannot be
-	     * done through the resource database.
-	     */
-	    if (!pHead)
-	    {
-		pHead = (RREventPtr *) xalloc (sizeof (RREventPtr));
-		if (!pHead ||
-		    !AddResource (pWin->drawable.id, EventType, (pointer)pHead))
-		{
-		    FreeResource (clientResource, RT_NONE);
-		    return BadAlloc;
-		}
-		*pHead = 0;
-	    }
-	    pRREvent->next = *pHead;
-	    *pHead = pRREvent;
-	}
-	/*
-	 * Now see if the client needs an event
-	 */
-	if (pScrPriv && (pRREvent->mask & RRScreenChangeNotifyMask))
-	{
-	    pTimes = &((RRTimesPtr) (pRRClient + 1))[pScreen->myNum];
-	    if (CompareTimeStamps (pTimes->setTime, 
-				   pScrPriv->lastSetTime) != 0 ||
-		CompareTimeStamps (pTimes->configTime, 
-				   pScrPriv->lastConfigTime) != 0)
-	    {
-		RRDeliverScreenEvent (client, pWin, pScreen);
-	    }
-	}
-    }
-    else if (stuff->enable == 0) 
-    {
-	/* delete the interest */
-	if (pHead) {
-	    RREventPtr pNewRREvent = 0;
-	    for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next) {
-		if (pRREvent->client == client)
-		    break;
-		pNewRREvent = pRREvent;
-	    }
-	    if (pRREvent) {
-		FreeResource (pRREvent->clientResource, ClientType);
-		if (pNewRREvent)
-		    pNewRREvent->next = pRREvent->next;
-		else
-		    *pHead = pRREvent->next;
-		xfree (pRREvent);
-	    }
-	}
-    }
-    else 
-    {
-	client->errorValue = stuff->enable;
-	return BadValue;
-    }
-    return Success;
-}
-
-/*
- * Retrieve valid screen size range
- */
-static int ProcRRGetScreenSizeRange (ClientPtr client)
-{
-    REQUEST(xRRGetScreenSizeRangeReq);
-    xRRGetScreenSizeRangeReply	rep;
-    WindowPtr			pWin;
-    ScreenPtr			pScreen;
-    rrScrPrivPtr		pScrPriv;
-    
-    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
-    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
-					   SecurityReadAccess);
-
-    if (!pWin)
-	return BadWindow;
-
-    pScreen = pWin->drawable.pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    
-    rep.type = X_Reply;
-    rep.pad = 0;
-    rep.sequenceNumber = client->sequence;
-    rep.length = 0;
-    
-    if (pScrPriv) 
-    {
-	RRGetInfo (pScreen);
-	rep.minWidth  = pScrPriv->minWidth;
-	rep.minHeight = pScrPriv->minHeight;
-	rep.maxWidth  = pScrPriv->maxWidth;
-	rep.maxHeight = pScrPriv->maxHeight;
-    }
-    else
-    {
-	rep.maxWidth  = rep.minWidth  = pScreen->width;
-	rep.maxHeight = rep.minHeight = pScreen->height;
-    }
-    if (client->swapped) 
-    {
-	int n;
-	
-    	swaps(&rep.sequenceNumber, n);
-    	swapl(&rep.length, n);
-	swaps(&rep.minWidth, n);
-	swaps(&rep.minHeight, n);
-	swaps(&rep.maxWidth, n);
-	swaps(&rep.maxHeight, n);
-    }
-    WriteToClient(client, sizeof(xRRGetScreenSizeRangeReply), (char *)&rep);
-    return (client->noClientException);
-}
-
-static int ProcRRSetScreenSize (ClientPtr client)
-{
-    REQUEST(xRRSetScreenSizeReq);
-    WindowPtr		pWin;
-    ScreenPtr		pScreen;
-    rrScrPrivPtr	pScrPriv;
-    RRCrtcPtr		crtc;
-    int			i;
-    
-    REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
-    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
-					   SecurityReadAccess);
-
-    if (!pWin)
-	return BadWindow;
-
-    pScreen = pWin->drawable.pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    if (stuff->width < pScrPriv->minWidth || pScrPriv->maxWidth < stuff->width)
-    {
-	client->errorValue = stuff->width;
-	return BadValue;
-    }
-    if (stuff->height < pScrPriv->minHeight || 
-	pScrPriv->maxHeight < stuff->height)
-    {
-	client->errorValue = stuff->height;
-	return BadValue;
-    }
-    for (i = 0; i < pScrPriv->numCrtcs; i++) {
-	crtc = pScrPriv->crtcs[i];
-	if (crtc->mode &&
-	    (crtc->x + crtc->mode->mode.width > stuff->width ||
-	     crtc->y + crtc->mode->mode.height > stuff->height))
-	    return BadMatch;
-    }
-    if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
-    {
-	client->errorValue = 0;
-	return BadValue;
-    }
-    if (!RRScreenSizeSet (pScreen, 
-			  stuff->width, stuff->height,
-			  stuff->widthInMillimeters,
-			  stuff->heightInMillimeters))
-    {
-	return BadMatch;
-    }
-    return Success;
-}
-
-#if 0
-static int ProcRRGetMonitorInfo (ClientPtr client)
-{
-    REQUEST(xRRGetMonitorInfoReq);
-    xRRGetMonitorInfoReply	rep;
-    WindowPtr			pWin;
-    ScreenPtr			pScreen;
-    rrScrPrivPtr		pScrPriv;
-    RRMonitorPtr		pMonitor;
-    RRModePtr			pMode;
-    int				extraLen;
-    CARD8			*extra;
-    xRRMonitorInfo		*monitor;
-    xRRMonitorMode		*mode;
-    CARD8			*names;
-    
-    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
-    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
-					   SecurityReadAccess);
-
-    if (!pWin)
-	return BadWindow;
-
-    pScreen = pWin->drawable.pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    rep.type = X_Reply;
-    rep.pad = 0;
-    rep.sequenceNumber = client->sequence;
-    rep.numMonitors = 0;
-    rep.numModes = 0;
-    rep.sizeNames = 0;
-    if (!pScrPriv)
-    {
-	extraLen = 0;
-	extra = NULL;
-    }
-    else
-    {
-	int i, m, b;
-	for (pMonitor = pScrPriv->pMonitors; pMonitor; pMonitor = pMonitor->next)
-	{
-	    rep.numMonitors++;
-	    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
-	    {
-		rep.numModes++;
-		rep.sizeNames += (1 + pMode->mode.nameLength);
-	    }
-	}
-	extraLen = (rep.numMonitors * sizeof (xRRMonitorInfo) +
-		    rep.numModes * sizeof (xRRMonitorMode) +
-		    rep.sizeNames + 3) & ~3;
-	extra = (CARD8 *) xalloc (extraLen);
-	if (!extra)
-	    return BadAlloc;
-	monitor = (xRRMonitorInfo *) extra;
-	mode = (xRRMonitorMode *) (monitor + rep.numMonitors);
-	names = (CARD8 *) (mode + rep.numModes);
-	i = 0;
-	m = 0;
-	b = 0;
-	for (pMonitor = pScrPriv->pMonitors; pMonitor; pMonitor = pMonitor->next)
-	{
-	    monitor[i].timestamp = pScrPriv->lastSetTime;
-	    monitor[i].configTimestamp = pScrPriv->lastConfigTime;
-	    monitor[i].x = pMonitor->x;
-	    monitor[i].y = pMonitor->y;
-	    monitor[i].rotation = pMonitor->rotation;
-	    monitor[i].mode = pMonitor->pMode->id;
-	    monitor[i].defaultMode = 0;	/* XXX */
-	    monitor[i].rotations = pMonitor->rotations;
-	    monitor[i].firstMode = m;
-	    monitor[i].numModes = 0;
-	    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
-	    {
-		monitor[i].numModes++;
-		mode[m] = pMode->mode;
-		names[b] = pMode->mode.nameLength;
-		b++;
-		memcpy (names + b, (char *) (pMode + 1), 
-			pMode->mode.nameLength);
-		b += pMode->mode.nameLength;
-		m++;
-	    }
-	    i++;
-	}
-	if ((char *) (names + ((b + 3) & ~3)) != (char *) extra + extraLen)
-	    FatalError ("RRGetMonitorInfo length mismatch\n");
-    }
-    rep.length = extraLen >> 2;
-    
-    WriteToClient(client, sizeof(xRRGetMonitorInfoReply), (char *)&rep);
-    if (extraLen)
-    {
-	WriteToClient (client, extraLen, (char *) extra);
-	xfree (extra);
-    }
-    
-    if (extra)
-	xfree (extra);
-    return (client->noClientException);
-}
-
-static int ProcRRAddMonitorMode (ClientPtr client)
-{
-    return BadImplementation;
-}
-
-static int ProcRRDeleteMonitorMode (ClientPtr client)
-{
-    return BadImplementation;
-}
-
-static int ProcRRSetMonitorConfig (ClientPtr client)
-{
-    REQUEST(xRRSetMonitorConfigReq);
-    xRRSetMonitorConfigReply	rep;
-    WindowPtr			pWin;
-    ScreenPtr			pScreen;
-    rrScrPrivPtr		pScrPriv;
-    RRMonitorPtr		pMonitor;
-    RRModePtr			pMode;
-    TimeStamp		    configTime;
-    TimeStamp		    time;
-    Rotation		    rotation;
-    
-    REQUEST_SIZE_MATCH(xRRSetScreenConfigReq);
-    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
-					   SecurityReadAccess);
-
-    if (!pWin)
-	return BadWindow;
-
-    pScreen = pWin->drawable.pScreen;
-    pScrPriv = rrGetScrPriv(pScreen);
-    
-    time = ClientTimeToServerTime(stuff->timestamp);
-    configTime = ClientTimeToServerTime(stuff->configTimestamp);
-    
-    if (!pScrPriv)
-    {
-	time = currentTime;
-	rep.status = RRSetConfigFailed;
-	goto sendReply;
-    }
-    if (!RRGetInfo (pScreen))
-	return BadAlloc;
-    
-    /*
-     * if the client's config timestamp is not the same as the last config
-     * timestamp, then the config information isn't up-to-date and
-     * can't even be validated
-     */
-    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
-    {
-	rep.status = RRSetConfigInvalidConfigTime;
-	goto sendReply;
-    }
-    
-    for (pMonitor = pScrPriv->pMonitors; pMonitor; pMonitor = pMonitor->next)
-    {
-	if (pMonitor->id == stuff->monitorIndex)
-	    break;
-    }
-    if (!pMonitor)
-    {
-	client->errorValue = stuff->monitorIndex;
-	return BadValue;
-    }
-    
-    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
-    {
-	if (pMode->id == stuff->modeIndex)
-	    break;
-    }
-    if (!pMode)
-    {
-	client->errorValue = stuff->modeIndex;
-	return BadValue;
-    }
-    
-    /*
-     * Validate requested rotation
-     */
-    rotation = (Rotation) stuff->rotation;
-
-    /* test the rotation bits only! */
-    switch (rotation & 0xf) {
-    case RR_Rotate_0:
-    case RR_Rotate_90:
-    case RR_Rotate_180:
-    case RR_Rotate_270:
-	break;
-    default:
-	/*
-	 * Invalid rotation
-	 */
-	client->errorValue = stuff->rotation;
-	return BadValue;
-    }
-
-    if ((~pMonitor->rotations) & rotation)
-    {
-	/*
-	 * requested rotation or reflection not supported by screen
-	 */
-	client->errorValue = stuff->rotation;
-	return BadMatch;
-    }
-
-    if (stuff->x + pMode->mode.width > pScreen->width)
-    {
-	client->errorValue = stufff
-	stuff->y + pMode->mode.height > pScreen
-    /*
-     * Make sure the requested set-time is not older than
-     * the last set-time
-     */
-    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
-    {
-	rep.status = RRSetConfigInvalidTime;
-	goto sendReply;
-    }
-
-    rep.status = RRMonitorSetMode (pScreen, pMonitor, 
-				   pMode, stuff->x, stuff->y, rotation, time);
-    
-    return client->noClientException;
-}
-#endif
-
-int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
-    ProcRRQueryVersion,	/* 0 */
-/* we skip 1 to make old clients fail pretty immediately */
-    NULL,			/* 1 ProcRandrOldGetScreenInfo */
-/* V1.0 apps share the same set screen config request id */
-    ProcRRSetScreenConfig,	/* 2 */
-    NULL,			/* 3 ProcRandrOldScreenChangeSelectInput */
-/* 3 used to be ScreenChangeSelectInput; deprecated */
-    ProcRRSelectInput,		/* 4 */
-    ProcRRGetScreenInfo,    	/* 5 */
-/* V1.2 additions */
-#if 0
-    ProcRRGetScreenSizeRange,	/* 6 */
-    ProcRRSetScreenSize,	/* 7 */
-    ProcRRGetMonitorInfo,	/* 8 */
-    ProcRRAddMonitorMode,	/* 9 */
-    ProcRRDeleteMonitorMode,	/* 10 */
-    ProcRRSetMonitorConfig,	/* 11 */
-#endif
-};
-
-
-static int
 ProcRRDispatch (ClientPtr client)
 {
     REQUEST(xReq);
@@ -1641,81 +685,12 @@ ProcRRDispatch (ClientPtr client)
 }
 
 static int
-SProcRRQueryVersion (ClientPtr client)
-{
-    register int n;
-    REQUEST(xRRQueryVersionReq);
-
-    swaps(&stuff->length, n);
-    swapl(&stuff->majorVersion, n);
-    swapl(&stuff->minorVersion, n);
-    return ProcRRQueryVersion(client);
-}
-
-static int
-SProcRRGetScreenInfo (ClientPtr client)
-{
-    register int n;
-    REQUEST(xRRGetScreenInfoReq);
-
-    swaps(&stuff->length, n);
-    swapl(&stuff->window, n);
-    return ProcRRGetScreenInfo(client);
-}
-
-static int
-SProcRRSetScreenConfig (ClientPtr client)
-{
-    register int n;
-    REQUEST(xRRSetScreenConfigReq);
-
-    if (RRClientKnowsRates (client))
-    {
-	REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
-	swaps (&stuff->rate, n);
-    }
-    else
-    {
-	REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
-    }
-    
-    swaps(&stuff->length, n);
-    swapl(&stuff->drawable, n);
-    swapl(&stuff->timestamp, n);
-    swaps(&stuff->sizeID, n);
-    swaps(&stuff->rotation, n);
-    return ProcRRSetScreenConfig(client);
-}
-
-static int
-SProcRRSelectInput (ClientPtr client)
-{
-    register int n;
-    REQUEST(xRRSelectInputReq);
-
-    swaps(&stuff->length, n);
-    swapl(&stuff->window, n);
-    return ProcRRSelectInput(client);
-}
-
-
-static int
 SProcRRDispatch (ClientPtr client)
 {
     REQUEST(xReq);
-    switch (stuff->data)
-    {
-    case X_RRQueryVersion:
-	return SProcRRQueryVersion(client);
-    case X_RRSetScreenConfig:
-        return SProcRRSetScreenConfig(client);
-    case X_RRSelectInput:
-        return SProcRRSelectInput(client);
-    case X_RRGetScreenInfo:
-        return SProcRRGetScreenInfo(client);
-    default:
+    if (stuff->data >= RRNumberRequests || !ProcRandrVector[stuff->data])
 	return BadRequest;
-    }
+    return (*SProcRandrVector[stuff->data]) (client);
 }
 
 #if RANDR_12_INTERFACE
@@ -1741,7 +716,6 @@ RRScreenSetSizeRange (ScreenPtr	pScreen,
 #endif
 
 #ifdef RANDR_10_INTERFACE
-
 static Bool
 RRScreenSizeMatches (RRScreenSizePtr  a,
 		   RRScreenSizePtr  b)
diff --git a/randr/randrstr.h b/randr/randrstr.h
index f323660..3346157 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -59,8 +59,11 @@ typedef XID	RRMode;
 typedef XID	RROutput;
 typedef XID	RRCrtc;
 
-extern int	RREventBase;
+extern int	RREventBase, RRErrorBase;
 
+extern int (*ProcRandrVector[RRNumberRequests])(ClientPtr);
+extern int (*SProcRandrVector[RRNumberRequests])(ClientPtr);
+    
 /*
  * Modeline for a monitor. Name follows directly after this struct
  */
@@ -101,7 +104,7 @@ struct _rrOutput {
     int		    numCrtcs;
     RRCrtcPtr	    *crtcs;
     int		    numClones;
-    RROutputPtr	    *outputs;
+    RROutputPtr	    *clones;
     int		    numModes;
     RRModePtr	    *modes;
     Bool	    changed;
@@ -210,6 +213,42 @@ extern int rrPrivIndex;
 #define rrScrPriv(pScr)	rrScrPrivPtr    pScrPriv = rrGetScrPriv(pScr)
 #define SetRRScreen(s,p) ((s)->devPrivates[rrPrivIndex].ptr = (pointer) (p))
 
+/*
+ * each window has a list of clients requesting
+ * RRNotify events.  Each client has a resource
+ * for each window it selects RRNotify input for,
+ * this resource is used to delete the RRNotifyRec
+ * entry from the per-window queue.
+ */
+
+typedef struct _RREvent *RREventPtr;
+
+typedef struct _RREvent {
+    RREventPtr  next;
+    ClientPtr	client;
+    WindowPtr	window;
+    XID		clientResource;
+    int		mask;
+} RREventRec;
+
+typedef struct _RRTimes {
+    TimeStamp	setTime;
+    TimeStamp	configTime;
+} RRTimesRec, *RRTimesPtr;
+
+typedef struct _RRClient {
+    int		major_version;
+    int		minor_version;
+/*  RRTimesRec	times[0]; */
+} RRClientRec, *RRClientPtr;
+
+extern RESTYPE	RRClientType, RREventType; /* resource types for event masks */
+extern int	RRClientPrivateIndex;
+extern RESTYPE	RRCrtcType, RRModeType, RROutputType;
+
+#define GetRRClient(pClient)    ((RRClientPtr) (pClient)->devPrivates[RRClientPrivateIndex].ptr)
+#define rrClientPriv(pClient)	RRClientPtr pRRClient = GetRRClient(pClient)
+
 /* Initialize the extension */
 void
 RRExtensionInit (void);
@@ -278,8 +317,17 @@ miRRCrtcSet (ScreenPtr	pScreen,
 void
 RRTellChanged (ScreenPtr pScreen);
 
+/*
+ * Poll the driver for changed information
+ */
+Bool
+RRGetInfo (ScreenPtr pScreen);
+
 Bool RRScreenInit(ScreenPtr pScreen);
 
+RROutputPtr
+RRFirstOutput (ScreenPtr pScreen);
+
 Rotation
 RRGetRotation (ScreenPtr pScreen);
 
@@ -338,13 +386,6 @@ RRCrtcPtr
 RRCrtcCreate (ScreenPtr	pScreen,
 	      void	*devPrivate);
 
-
-/*
- * Use this value for any num parameter to indicate that
- * the related data are unchanged
- */
-#define RR_NUM_UNCHANGED    -1
-
 /*
  * Notify the extension that the Crtc has been reconfigured,
  * the driver calls this whenever it has updated the mode
@@ -358,6 +399,9 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
 	      int	    numOutput,
 	      RROutputPtr   *outputs);
 
+void
+RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc);
+    
 /*
  * Request that the Crtc be reconfigured
  */
@@ -382,6 +426,10 @@ RRCrtcDestroy (RRCrtcPtr crtc);
 Bool
 RRCrtcInit (void);
 
+/* rrdispatch.c */
+Bool
+RRClientKnowsRates (ClientPtr	pClient);
+
 /* rrmode.c */
 /*
  * Find, and if necessary, create a mode
@@ -439,6 +487,9 @@ RROutputSetConnection (RROutputPtr  outp
 		       CARD8	    connection);
 
 void
+RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output);
+
+void
 RROutputDestroy (RROutputPtr	output);
 
 /*
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
index cc5b24d..d343c3a 100644
--- a/randr/rrcrtc.c
+++ b/randr/rrcrtc.c
@@ -22,7 +22,7 @@
 
 #include "randrstr.h"
 
-static RESTYPE	CrtcType;
+RESTYPE	RRCrtcType;
 
 /*
  * Create a CRTC
@@ -144,6 +144,12 @@ RRCrtcNotify (RRCrtcPtr	    crtc,
     return TRUE;
 }
 
+void
+RRDeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
+{
+    
+}
+
 /*
  * Request that the Crtc be reconfigured
  */
@@ -216,6 +222,7 @@ RRCrtcDestroyResource (pointer value, XI
 	    memmove (pScrPriv->crtcs, pScrPriv->crtcs + 1,
 		     (pScrPriv->numCrtcs - (i - 1)) * sizeof (RRCrtcPtr));
 	    --pScrPriv->numCrtcs;
+	    break;
 	}
     }
     free (value);
@@ -228,11 +235,11 @@ RRCrtcDestroyResource (pointer value, XI
 Bool
 RRCrtcInit (void)
 {
-    CrtcType = CreateNewResourceType (RRCrtcDestroyResource);
-    if (!CrtcType)
+    RRCrtcType = CreateNewResourceType (RRCrtcDestroyResource);
+    if (!RRCrtcType)
 	return FALSE;
 #ifdef XResExtension
-	RegisterResourceName (CrtcType, "CRTC");
+	RegisterResourceName (RRCrtcType, "CRTC");
 #endif
     return TRUE;
 }
diff --git a/randr/rrdispatch.c b/randr/rrdispatch.c
new file mode 100644
index 0000000..acf6298
--- /dev/null
+++ b/randr/rrdispatch.c
@@ -0,0 +1,1034 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+Bool
+RRClientKnowsRates (ClientPtr	pClient)
+{
+    rrClientPriv(pClient);
+
+    return (pRRClient->major_version > 1 ||
+	    (pRRClient->major_version == 1 && pRRClient->minor_version >= 1));
+}
+
+typedef struct _RR10Data {
+    RRScreenSizePtr sizes;
+    int		    nsize;
+    int		    nrefresh;
+    int		    size;
+    CARD16	    refresh;
+} RR10DataRec, *RR10DataPtr;
+
+/*
+ * Convert 1.2 monitor data into 1.0 screen data
+ */
+static RR10DataPtr
+RR10GetData (ScreenPtr pScreen, RROutputPtr output)
+{
+    RR10DataPtr	    data;
+    RRScreenSizePtr size;
+    int		    nmode = output->numModes;
+    int		    i, j, k;
+    RRScreenRatePtr refresh;
+    CARD16	    vRefresh;
+    RRModePtr	    mode;
+
+    /* Make sure there is plenty of space for any combination */
+    data = malloc (sizeof (RR10DataRec) + 
+		   sizeof (RRScreenSize) * nmode + 
+		   sizeof (RRScreenRate) * nmode);
+    if (!data)
+	return NULL;
+    size = (RRScreenSizePtr) (data + 1);
+    refresh = (RRScreenRatePtr) (size + nmode);
+    data->sizes = size;
+    data->nsize = 0;
+    data->nrefresh = 0;
+    data->size = 0;
+    data->refresh = 0;
+    for (i = 0; i < output->numModes; i++)
+    {
+	mode = output->modes[i];
+	for (j = 0; j < data->nsize; j++)
+	    if (mode->mode.width == size[j].width &&
+		mode->mode.height == size[j].height)
+		break;
+	if (j == data->nsize)
+	{
+	    size[j].id = j;
+	    size[j].width = mode->mode.width;
+	    size[j].height = mode->mode.height;
+	    size[j].mmWidth = mode->mode.mmWidth;
+	    size[j].mmHeight = mode->mode.mmHeight;
+	    size[j].nRates = 0;
+	    size[j].pRates = &refresh[data->nrefresh];
+	    data->nsize++;
+	}
+	vRefresh = RRVerticalRefresh (&mode->mode);
+	for (k = 0; k < size[j].nRates; k++)
+	    if (vRefresh == size[j].pRates[k].rate)
+		break;
+	if (k == size[j].nRates)
+	{
+	    size[j].pRates[k].rate = vRefresh;
+	    size[j].pRates[k].mode = mode;
+	    size[j].nRates++;
+	    data->nrefresh++;
+	}
+	if (mode == output->crtc->mode)
+	{
+	    data->size = j;
+	    data->refresh = vRefresh;
+	}
+    }
+    return data;
+}
+
+static int
+ProcRRQueryVersion (ClientPtr client)
+{
+    xRRQueryVersionReply rep;
+    register int n;
+    REQUEST(xRRQueryVersionReq);
+    rrClientPriv(client);
+
+    REQUEST_SIZE_MATCH(xRRQueryVersionReq);
+    pRRClient->major_version = stuff->majorVersion;
+    pRRClient->minor_version = stuff->minorVersion;
+    rep.type = X_Reply;
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    /*
+     * Report the current version; the current
+     * spec says they're all compatible after 1.0
+     */
+    rep.majorVersion = RANDR_MAJOR;
+    rep.minorVersion = RANDR_MINOR;
+    if (client->swapped) {
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swapl(&rep.majorVersion, n);
+	swapl(&rep.minorVersion, n);
+    }
+    WriteToClient(client, sizeof(xRRQueryVersionReply), (char *)&rep);
+    return (client->noClientException);
+}
+
+static int
+ProcRRGetScreenInfo (ClientPtr client)
+{
+    REQUEST(xRRGetScreenInfoReq);
+    xRRGetScreenInfoReply   rep;
+    WindowPtr	    	    pWin;
+    int			    n;
+    ScreenPtr		    pScreen;
+    rrScrPrivPtr	    pScrPriv;
+    CARD8		    *extra;
+    unsigned long	    extraLen;
+    RROutputPtr		    output;
+
+    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    rep.pad = 0;
+    
+    if (pScrPriv)
+	RRGetInfo (pScreen);
+
+    output = RRFirstOutput (pScreen);
+    
+    if (!pScrPriv || !output)
+    {
+	rep.type = X_Reply;
+	rep.setOfRotations = RR_Rotate_0;;
+	rep.sequenceNumber = client->sequence;
+	rep.length = 0;
+	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
+	rep.timestamp = currentTime.milliseconds;
+	rep.configTimestamp = currentTime.milliseconds;
+	rep.nSizes = 0;
+	rep.sizeID = 0;
+	rep.rotation = RR_Rotate_0;
+	rep.rate = 0;
+	rep.nrateEnts = 0;
+	extra = 0;
+	extraLen = 0;
+    }
+    else
+    {
+	int			i, j;
+	xScreenSizes		*size;
+	CARD16			*rates;
+	CARD8			*data8;
+	Bool			has_rate = RRClientKnowsRates (client);
+	RR10DataPtr		pData;
+	RRScreenSizePtr		pSize;
+    
+	pData = RR10GetData (pScreen, output);
+	if (!pData)
+	    return BadAlloc;
+	
+	rep.type = X_Reply;
+	rep.setOfRotations = output->crtc->rotations;
+	rep.sequenceNumber = client->sequence;
+	rep.length = 0;
+	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
+	rep.timestamp = pScrPriv->lastSetTime.milliseconds;
+	rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+	rep.rotation = output->crtc->rotation;
+	rep.nSizes = pData->nsize;
+        rep.nrateEnts = pData->nrefresh + pData->nsize;
+	rep.sizeID = pData->size;
+	rep.rate = pData->refresh;
+
+	extraLen = (rep.nSizes * sizeof (xScreenSizes) +
+		    rep.nrateEnts * sizeof (CARD16));
+
+	extra = (CARD8 *) xalloc (extraLen);
+	if (!extra)
+	{
+	    xfree (pData);
+	    return BadAlloc;
+	}
+	/*
+	 * First comes the size information
+	 */
+	size = (xScreenSizes *) extra;
+	rates = (CARD16 *) (size + rep.nSizes);
+	for (i = 0; i < pData->nsize; i++)
+	{
+	    pSize = &pData->sizes[i];
+	    size->widthInPixels = pSize->width;
+	    size->heightInPixels = pSize->height;
+	    size->widthInMillimeters = pSize->mmWidth;
+	    size->heightInMillimeters = pSize->mmHeight;
+	    if (client->swapped)
+	    {
+	        swaps (&size->widthInPixels, n);
+	        swaps (&size->heightInPixels, n);
+	        swaps (&size->widthInMillimeters, n);
+	        swaps (&size->heightInMillimeters, n);
+	    }
+	    size++;
+	    if (has_rate)
+	    {
+		*rates = pSize->nRates;
+		if (client->swapped)
+		{
+		    swaps (rates, n);
+		}
+		rates++;
+		for (j = 0; j < pSize->nRates; j++)
+		{
+		    *rates = pSize->pRates[j].rate;
+		    if (client->swapped)
+		    {
+			swaps (rates, n);
+		    }
+		    rates++;
+		}
+	    }
+	}
+        xfree (pData);
+	
+	data8 = (CARD8 *) rates;
+
+	if (data8 - (CARD8 *) extra != extraLen)
+	    FatalError ("RRGetScreenInfo bad extra len %ld != %ld\n",
+			(unsigned long)(data8 - (CARD8 *) extra), extraLen);
+	rep.length =  (extraLen + 3) >> 2;
+    }
+    if (client->swapped) {
+	swaps(&rep.sequenceNumber, n);
+	swapl(&rep.length, n);
+	swapl(&rep.timestamp, n);
+	swaps(&rep.rotation, n);
+	swaps(&rep.nSizes, n);
+	swaps(&rep.sizeID, n);
+	swaps(&rep.rate, n);
+	swaps(&rep.nrateEnts, n);
+    }
+    WriteToClient(client, sizeof(xRRGetScreenInfoReply), (char *)&rep);
+    if (extraLen)
+    {
+	WriteToClient (client, extraLen, (char *) extra);
+	xfree (extra);
+    }
+    return (client->noClientException);
+}
+
+static int
+ProcRRSetScreenConfig (ClientPtr client)
+{
+    REQUEST(xRRSetScreenConfigReq);
+    xRRSetScreenConfigReply rep;
+    DrawablePtr		    pDraw;
+    int			    n;
+    ScreenPtr		    pScreen;
+    rrScrPrivPtr	    pScrPriv;
+    TimeStamp		    configTime;
+    TimeStamp		    time;
+    int			    i;
+    Rotation		    rotation;
+    int			    rate;
+    Bool		    has_rate;
+    RROutputPtr		    output;
+    RRModePtr		    mode;
+    RR10DataPtr		    pData = NULL;
+    RRScreenSizePtr    	    pSize;
+    
+    UpdateCurrentTime ();
+
+    if (RRClientKnowsRates (client))
+    {
+	REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
+	has_rate = TRUE;
+    }
+    else
+    {
+	REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
+	has_rate = FALSE;
+    }
+    
+    SECURITY_VERIFY_DRAWABLE(pDraw, stuff->drawable, client,
+			     SecurityWriteAccess);
+
+    pScreen = pDraw->pScreen;
+
+    pScrPriv = rrGetScrPriv(pScreen);
+    
+    time = ClientTimeToServerTime(stuff->timestamp);
+    configTime = ClientTimeToServerTime(stuff->configTimestamp);
+    
+    if (!pScrPriv)
+    {
+	time = currentTime;
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    if (!RRGetInfo (pScreen))
+	return BadAlloc;
+    
+    output = RRFirstOutput (pScreen);
+    if (!output)
+    {
+	time = currentTime;
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    
+    /*
+     * if the client's config timestamp is not the same as the last config
+     * timestamp, then the config information isn't up-to-date and
+     * can't even be validated
+     */
+    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
+    {
+	rep.status = RRSetConfigInvalidConfigTime;
+	goto sendReply;
+    }
+    
+    pData = RR10GetData (pScreen, output);
+    if (!pData)
+	return BadAlloc;
+    
+    if (stuff->sizeID >= pData->nsize)
+    {
+	/*
+	 * Invalid size ID
+	 */
+	client->errorValue = stuff->sizeID;
+	xfree (pData);
+	return BadValue;
+    }
+    pSize = &pData->sizes[stuff->sizeID];
+    
+    /*
+     * Validate requested rotation
+     */
+    rotation = (Rotation) stuff->rotation;
+
+    /* test the rotation bits only! */
+    switch (rotation & 0xf) {
+    case RR_Rotate_0:
+    case RR_Rotate_90:
+    case RR_Rotate_180:
+    case RR_Rotate_270:
+	break;
+    default:
+	/*
+	 * Invalid rotation
+	 */
+	client->errorValue = stuff->rotation;
+	xfree (pData);
+	return BadValue;
+    }
+
+    if ((~output->crtc->rotations) & rotation)
+    {
+	/*
+	 * requested rotation or reflection not supported by screen
+	 */
+	client->errorValue = stuff->rotation;
+	xfree (pData);
+	return BadMatch;
+    }
+
+    /*
+     * Validate requested refresh
+     */
+    if (has_rate)
+	rate = (int) stuff->rate;
+    else
+	rate = 0;
+
+    if (rate)
+    {
+	for (i = 0; i < pSize->nRates; i++)
+	{
+	    if (pSize->pRates[i].rate == rate)
+		break;
+	}
+	if (i == pSize->nRates)
+	{
+	    /*
+	     * Invalid rate
+	     */
+	    client->errorValue = rate;
+	    xfree (pData);
+	    return BadValue;
+	}
+	mode = pSize->pRates[i].mode;
+    }
+    else
+	mode = pSize->pRates[0].mode;
+    
+    /*
+     * Make sure the requested set-time is not older than
+     * the last set-time
+     */
+    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
+    {
+	rep.status = RRSetConfigInvalidTime;
+	goto sendReply;
+    }
+
+    rep.status = RRCrtcSet (output->crtc, mode, 0, 0, stuff->rotation,
+			    1, &output);
+    
+sendReply:
+    
+    if (pData)
+	xfree (pData);
+
+    rep.type = X_Reply;
+    /* rep.status has already been filled in */
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+
+    rep.newTimestamp = pScrPriv->lastSetTime.milliseconds;
+    rep.newConfigTimestamp = pScrPriv->lastConfigTime.milliseconds;
+    rep.root = WindowTable[pDraw->pScreen->myNum]->drawable.id;
+
+    if (client->swapped) 
+    {
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swapl(&rep.newTimestamp, n);
+	swapl(&rep.newConfigTimestamp, n);
+	swapl(&rep.root, n);
+    }
+    WriteToClient(client, sizeof(xRRSetScreenConfigReply), (char *)&rep);
+
+    return (client->noClientException);
+}
+
+static int
+ProcRRSelectInput (ClientPtr client)
+{
+    REQUEST(xRRSelectInputReq);
+    rrClientPriv(client);
+    RRTimesPtr	pTimes;
+    WindowPtr	pWin;
+    RREventPtr	pRREvent, *pHead;
+    XID		clientResource;
+
+    REQUEST_SIZE_MATCH(xRRSelectInputReq);
+    pWin = SecurityLookupWindow (stuff->window, client, SecurityWriteAccess);
+    if (!pWin)
+	return BadWindow;
+    pHead = (RREventPtr *)SecurityLookupIDByType(client,
+						 pWin->drawable.id, RREventType,
+						 SecurityWriteAccess);
+
+    if (stuff->enable & (RRScreenChangeNotifyMask|
+			 RRCrtcChangeNotifyMask|
+			 RROutputChangeNotifyMask)) 
+    {
+	ScreenPtr	pScreen = pWin->drawable.pScreen;
+	rrScrPriv	(pScreen);
+
+	pRREvent = NULL;
+	if (pHead) 
+	{
+	    /* check for existing entry. */
+	    for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next)
+		if (pRREvent->client == client)
+		    break;
+	}
+
+	if (!pRREvent)
+	{
+	    /* build the entry */
+	    pRREvent = (RREventPtr) xalloc (sizeof (RREventRec));
+	    if (!pRREvent)
+		return BadAlloc;
+	    pRREvent->next = 0;
+	    pRREvent->client = client;
+	    pRREvent->window = pWin;
+	    pRREvent->mask = stuff->enable;
+	    /*
+	     * add a resource that will be deleted when
+	     * the client goes away
+	     */
+	    clientResource = FakeClientID (client->index);
+	    pRREvent->clientResource = clientResource;
+	    if (!AddResource (clientResource, RRClientType, (pointer)pRREvent))
+		return BadAlloc;
+	    /*
+	     * create a resource to contain a pointer to the list
+	     * of clients selecting input.  This must be indirect as
+	     * the list may be arbitrarily rearranged which cannot be
+	     * done through the resource database.
+	     */
+	    if (!pHead)
+	    {
+		pHead = (RREventPtr *) xalloc (sizeof (RREventPtr));
+		if (!pHead ||
+		    !AddResource (pWin->drawable.id, RREventType, (pointer)pHead))
+		{
+		    FreeResource (clientResource, RT_NONE);
+		    return BadAlloc;
+		}
+		*pHead = 0;
+	    }
+	    pRREvent->next = *pHead;
+	    *pHead = pRREvent;
+	}
+	/*
+	 * Now see if the client needs an event
+	 */
+	if (pScrPriv && (pRREvent->mask & RRScreenChangeNotifyMask))
+	{
+	    pTimes = &((RRTimesPtr) (pRRClient + 1))[pScreen->myNum];
+	    if (CompareTimeStamps (pTimes->setTime, 
+				   pScrPriv->lastSetTime) != 0 ||
+		CompareTimeStamps (pTimes->configTime, 
+				   pScrPriv->lastConfigTime) != 0)
+	    {
+		RRDeliverScreenEvent (client, pWin, pScreen);
+	    }
+	}
+    }
+    else if (stuff->enable == 0) 
+    {
+	/* delete the interest */
+	if (pHead) {
+	    RREventPtr pNewRREvent = 0;
+	    for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next) {
+		if (pRREvent->client == client)
+		    break;
+		pNewRREvent = pRREvent;
+	    }
+	    if (pRREvent) {
+		FreeResource (pRREvent->clientResource, RRClientType);
+		if (pNewRREvent)
+		    pNewRREvent->next = pRREvent->next;
+		else
+		    *pHead = pRREvent->next;
+		xfree (pRREvent);
+	    }
+	}
+    }
+    else 
+    {
+	client->errorValue = stuff->enable;
+	return BadValue;
+    }
+    return Success;
+}
+
+/*
+ * Retrieve valid screen size range
+ */
+static int 
+ProcRRGetScreenSizeRange (ClientPtr client)
+{
+    REQUEST(xRRGetScreenSizeRangeReq);
+    xRRGetScreenSizeRangeReply	rep;
+    WindowPtr			pWin;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    
+    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    
+    rep.type = X_Reply;
+    rep.pad = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.length = 0;
+    
+    if (pScrPriv) 
+    {
+	RRGetInfo (pScreen);
+	rep.minWidth  = pScrPriv->minWidth;
+	rep.minHeight = pScrPriv->minHeight;
+	rep.maxWidth  = pScrPriv->maxWidth;
+	rep.maxHeight = pScrPriv->maxHeight;
+    }
+    else
+    {
+	rep.maxWidth  = rep.minWidth  = pScreen->width;
+	rep.maxHeight = rep.minHeight = pScreen->height;
+    }
+    if (client->swapped) 
+    {
+	int n;
+	
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swaps(&rep.minWidth, n);
+	swaps(&rep.minHeight, n);
+	swaps(&rep.maxWidth, n);
+	swaps(&rep.maxHeight, n);
+    }
+    WriteToClient(client, sizeof(xRRGetScreenSizeRangeReply), (char *)&rep);
+    return (client->noClientException);
+}
+
+static int ProcRRSetScreenSize (ClientPtr client)
+{
+    REQUEST(xRRSetScreenSizeReq);
+    WindowPtr		pWin;
+    ScreenPtr		pScreen;
+    rrScrPrivPtr	pScrPriv;
+    RRCrtcPtr		crtc;
+    int			i;
+    
+    REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    if (stuff->width < pScrPriv->minWidth || pScrPriv->maxWidth < stuff->width)
+    {
+	client->errorValue = stuff->width;
+	return BadValue;
+    }
+    if (stuff->height < pScrPriv->minHeight || 
+	pScrPriv->maxHeight < stuff->height)
+    {
+	client->errorValue = stuff->height;
+	return BadValue;
+    }
+    for (i = 0; i < pScrPriv->numCrtcs; i++) {
+	crtc = pScrPriv->crtcs[i];
+	if (crtc->mode &&
+	    (crtc->x + crtc->mode->mode.width > stuff->width ||
+	     crtc->y + crtc->mode->mode.height > stuff->height))
+	    return BadMatch;
+    }
+    if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
+    {
+	client->errorValue = 0;
+	return BadValue;
+    }
+    if (!RRScreenSizeSet (pScreen, 
+			  stuff->width, stuff->height,
+			  stuff->widthInMillimeters,
+			  stuff->heightInMillimeters))
+    {
+	return BadMatch;
+    }
+    return Success;
+}
+
+static int
+ProcRRGetScreenResources (ClientPtr client)
+{
+    REQUEST(xRRGetScreenResourcesReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRGetOutputInfo (ClientPtr client)
+{
+    REQUEST(xRRGetOutputInfoReq);;
+    
+    REQUEST_SIZE_MATCH(xRRGetOutputInfoReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRListOutputProperties (ClientPtr client)
+{
+    REQUEST(xRRListOutputPropertiesReq);
+    
+    REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRChangeOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRChangeOutputPropertyReq);
+    
+    REQUEST_SIZE_MATCH(xRRChangeOutputPropertyReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRDeleteOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRDeleteOutputPropertyReq);
+    
+    REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRGetOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRGetOutputPropertyReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRCreateMode (ClientPtr client)
+{
+    REQUEST(xRRCreateModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRCreateModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRDestroyMode (ClientPtr client)
+{
+    REQUEST(xRRDestroyModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRDestroyModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRAddOutputMode (ClientPtr client)
+{
+    REQUEST(xRRAddOutputModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRDeleteOutputMode (ClientPtr client)
+{
+    REQUEST(xRRDeleteOutputModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRGetCrtcInfo (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcInfoReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRSetCrtcConfig (ClientPtr client)
+{
+    REQUEST(xRRSetCrtcConfigReq);
+    xRRSetCrtcConfigReply   rep;
+    ScreenPtr		    pScreen;
+    rrScrPrivPtr	    pScrPriv;
+    RRCrtcPtr		    crtc;
+    RRModePtr		    mode;
+    int			    numOutputs;
+    RROutputPtr		    *outputs = NULL;
+    RROutput		    *outputIds;
+    TimeStamp		    configTime;
+    TimeStamp		    time;
+    Rotation		    rotation;
+    int			    i, j;
+    
+    REQUEST_AT_LEAST_SIZE(xRRSetCrtcConfigReq);
+    numOutputs = stuff->length - (SIZEOF (xRRSetCrtcConfigReq) >> 2);
+    
+    crtc = LookupIDByType (stuff->crtc, RRCrtcType);
+    if (!crtc)
+    {
+	client->errorValue = stuff->crtc;
+	return RRErrorBase + BadCrtc;
+    }
+    if (stuff->mode == None)
+    {
+	mode = NULL;
+	if (numOutputs > 0)
+	    return BadMatch;
+    }
+    else
+    {
+	mode = LookupIDByType (stuff->mode, RRModeType);
+	if (!mode)
+	{
+	    client->errorValue = stuff->mode;
+	    return RRErrorBase + BadMode;
+	}
+	if (numOutputs == 0)
+	    return BadMatch;
+    }
+    outputs = xalloc (numOutputs * sizeof (RROutputPtr));
+    if (!outputs)
+	return BadAlloc;
+    
+    outputIds = (RROutput *) (stuff + 1);
+    for (i = 0; i < numOutputs; i++)
+    {
+	outputs[i] = LookupIDByType (outputIds[i], RROutputType);
+	if (!outputs[i])
+	{
+	    client->errorValue = outputIds[i];
+	    return RRErrorBase + BadOutput;
+	}
+	/* validate crtc for this output */
+	for (j = 0; j < outputs[i]->numCrtcs; j++)
+	    if (outputs[i]->crtcs[j] == crtc)
+		break;
+	if (j == outputs[j]->numCrtcs)
+	    return BadMatch;
+	/* validate mode for this output */
+	for (j = 0; j < outputs[i]->numModes; j++)
+	    if (outputs[i]->modes[j] == mode)
+		break;
+	if (j == outputs[j]->numModes)
+	    return BadMatch;
+    }
+
+    pScreen = crtc->pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    
+    time = ClientTimeToServerTime(stuff->timestamp);
+    configTime = ClientTimeToServerTime(stuff->configTimestamp);
+    
+    if (!pScrPriv)
+    {
+	time = currentTime;
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    if (!RRGetInfo (pScreen))
+	return BadAlloc;
+    
+    /*
+     * if the client's config timestamp is not the same as the last config
+     * timestamp, then the config information isn't up-to-date and
+     * can't even be validated
+     */
+    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
+    {
+	rep.status = RRSetConfigInvalidConfigTime;
+	goto sendReply;
+    }
+    
+    /*
+     * Validate requested rotation
+     */
+    rotation = (Rotation) stuff->rotation;
+
+    /* test the rotation bits only! */
+    switch (rotation & 0xf) {
+    case RR_Rotate_0:
+    case RR_Rotate_90:
+    case RR_Rotate_180:
+    case RR_Rotate_270:
+	break;
+    default:
+	/*
+	 * Invalid rotation
+	 */
+	client->errorValue = stuff->rotation;
+	return BadValue;
+    }
+
+    if ((~crtc->rotations) & rotation)
+    {
+	/*
+	 * requested rotation or reflection not supported by screen
+	 */
+	client->errorValue = stuff->rotation;
+	return BadMatch;
+    }
+
+    if (stuff->x + mode->mode.width > pScreen->width)
+    {
+	client->errorValue = stuff->x;
+	return BadValue;
+    }
+    
+    if (stuff->y + mode->mode.height > pScreen->height)
+    {
+	client->errorValue = stuff->y;
+	return BadValue;
+    }
+    
+    /*
+     * Make sure the requested set-time is not older than
+     * the last set-time
+     */
+    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
+    {
+	rep.status = RRSetConfigInvalidTime;
+	goto sendReply;
+    }
+
+    rep.status = RRCrtcSet (crtc, mode, stuff->x, stuff->y,
+			    rotation, numOutputs, outputs);
+    
+sendReply:
+    if (outputs)
+	xfree (outputs);
+    
+    rep.type = X_Reply;
+    /* rep.status has already been filled in */
+    rep.length = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.newTimestamp = pScrPriv->lastConfigTime.milliseconds;
+
+    if (client->swapped) 
+    {
+	int n;
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swapl(&rep.newTimestamp, n);
+    }
+    WriteToClient(client, sizeof(xRRSetCrtcConfigReply), (char *)&rep);
+    
+    return client->noClientException;
+}
+
+static int
+ProcRRGetCrtcGammaSize (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcGammaSizeReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRGetCrtcGamma (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcGammaReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+ProcRRSetCrtcGamma (ClientPtr client)
+{
+    REQUEST(xRRSetCrtcGammaReq);
+    
+    REQUEST_SIZE_MATCH(xRRSetCrtcGammaReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
+    ProcRRQueryVersion,	/* 0 */
+/* we skip 1 to make old clients fail pretty immediately */
+    NULL,			/* 1 ProcRandrOldGetScreenInfo */
+/* V1.0 apps share the same set screen config request id */
+    ProcRRSetScreenConfig,	/* 2 */
+    NULL,			/* 3 ProcRandrOldScreenChangeSelectInput */
+/* 3 used to be ScreenChangeSelectInput; deprecated */
+    ProcRRSelectInput,		/* 4 */
+    ProcRRGetScreenInfo,    	/* 5 */
+/* V1.2 additions */
+    ProcRRGetScreenSizeRange,	/* 6 */
+    ProcRRSetScreenSize,	/* 7 */
+    ProcRRGetScreenResources,	/* 8 */
+    ProcRRGetOutputInfo,	/* 9 */
+    ProcRRListOutputProperties,	/* 10 */
+    ProcRRChangeOutputProperty,	/* 11 */
+    ProcRRDeleteOutputProperty,	/* 12 */
+    ProcRRGetOutputProperty,	/* 13 */
+    ProcRRCreateMode,		/* 14 */
+    ProcRRDestroyMode,		/* 15 */
+    ProcRRAddOutputMode,	/* 16 */
+    ProcRRDeleteOutputMode,	/* 17 */
+    ProcRRGetCrtcInfo,		/* 18 */
+    ProcRRSetCrtcConfig,	/* 19 */
+    ProcRRGetCrtcGammaSize,	/* 20 */
+    ProcRRGetCrtcGamma,		/* 21 */
+    ProcRRSetCrtcGamma,		/* 22 */
+};
+
diff --git a/randr/rrmode.c b/randr/rrmode.c
index 1eb53c3..3a9d556 100644
--- a/randr/rrmode.c
+++ b/randr/rrmode.c
@@ -22,7 +22,7 @@
 
 #include "randrstr.h"
 
-static RESTYPE	ModeType;
+RESTYPE	RRModeType;
 
 RRModePtr
 RRModeGet (ScreenPtr	pScreen,
@@ -50,7 +50,7 @@ RRModeGet (ScreenPtr	pScreen,
     memcpy (mode->name, name, modeInfo->nameLength);
     mode->name[modeInfo->nameLength] = '\0';
     mode->id = FakeClientID(0);
-    if (!AddResource (mode->id, ModeType, (pointer) mode))
+    if (!AddResource (mode->id, RRModeType, (pointer) mode))
 	return NULL;
     ++mode->refcnt;
     pScrPriv->changed = TRUE;
@@ -75,11 +75,11 @@ RRModeDestroyResource (pointer value, XI
 Bool
 RRModeInit (void)
 {
-    ModeType = CreateNewResourceType (RRModeDestroyResource);
-    if (!ModeType)
+    RRModeType = CreateNewResourceType (RRModeDestroyResource);
+    if (!RRModeType)
 	return FALSE;
 #ifdef XResExtension
-    RegisterResourceName (ModeType, "MODE");
+    RegisterResourceName (RRModeType, "MODE");
 #endif
     return TRUE;
 }
diff --git a/randr/rroutput.c b/randr/rroutput.c
index c7e7995..6b67f19 100644
--- a/randr/rroutput.c
+++ b/randr/rroutput.c
@@ -22,7 +22,124 @@
 
 #include "randrstr.h"
 
-static RESTYPE	OutputType;
+RESTYPE	RROutputType;
+
+/*
+ * Create an output
+ */
+
+RROutputPtr
+RROutputCreate (ScreenPtr   pScreen,
+		char	    *name,
+		int	    nameLength,
+		void	    *devPrivate)
+{
+    rrScrPriv (pScreen);
+    RROutputPtr	output;
+    RROutputPtr	*outputs;
+
+    output = xalloc (sizeof (RROutputRec) + nameLength + 1);
+    if (!output)
+	return NULL;
+    if (pScrPriv->numOutputs)
+	outputs = xrealloc (pScrPriv->outputs, 
+			    (pScrPriv->numOutputs + 1) * sizeof (RROutputPtr));
+    else
+	outputs = xalloc (sizeof (RROutputPtr));
+    if (!outputs)
+    {
+	xfree (output);
+	return NULL;
+    }
+    output->id = FakeClientID (0);
+    output->pScreen = pScreen;
+    output->name = (char *) (output + 1);
+    output->nameLength = nameLength;
+    memcpy (output->name, name, nameLength);
+    output->connection = RR_UnknownConnection;
+    output->subpixelOrder = SubPixelUnknown;
+    output->crtc = NULL;
+    output->numCrtcs = 0;
+    output->crtcs = NULL;
+    output->numClones = 0;
+    output->clones = NULL;
+    output->numModes = 0;
+    output->modes = NULL;
+    output->changed = TRUE;
+    output->devPrivate = devPrivate;
+    pScrPriv->outputs[pScrPriv->numOutputs++] = output;
+    return output;
+}
+
+/*
+ * Notify extension that output parameters have been changed
+ */
+Bool
+RROutputSetClones (RROutputPtr  output,
+		   RROutputPtr  *clones,
+		   int		numClones)
+{
+    RROutputPtr	*newClones;
+
+    newClones = xalloc (numClones * sizeof (RROutputPtr));
+    if (!newClones)
+	return FALSE;
+    if (output->clones)
+	xfree (output->clones);
+    memcpy (newClones, clones, numClones * sizeof (RROutputPtr));
+    output->clones = newClones;
+    output->numClones = numClones;
+    return TRUE;
+}
+
+Bool
+RROutputSetModes (RROutputPtr	output,
+		  RRModePtr	*modes,
+		  int		numModes)
+{
+    RRModePtr	*newModes;
+
+    newModes = xalloc (numModes * sizeof (RRModePtr));
+    if (!newModes)
+	return FALSE;
+    if (output->modes)
+	xfree (output->modes);
+    memcpy (newModes, modes, numModes * sizeof (RRModePtr));
+    output->modes = newModes;
+    output->numModes = numModes;
+    return TRUE;
+}
+
+Bool
+RROutputSetCrtcs (RROutputPtr	output,
+		  RRCrtcPtr	*crtcs,
+		  int		numCrtcs)
+{
+    RRCrtcPtr	*newCrtcs;
+
+    newCrtcs = xalloc (numCrtcs * sizeof (RRCrtcPtr));
+    if (!newCrtcs)
+	return FALSE;
+    if (output->crtcs)
+	xfree (output->crtcs);
+    memcpy (newCrtcs, crtcs, numCrtcs * sizeof (RRCrtcPtr));
+    output->crtcs = newCrtcs;
+    output->numCrtcs = numCrtcs;
+    return TRUE;
+}
+
+Bool
+RROutputSetConnection (RROutputPtr  output,
+		       CARD8	    connection)
+{
+    output->connection = connection;
+    return TRUE;
+}
+
+void
+RRDeliverOutputEvent(ClientPtr client, WindowPtr pWin, RROutputPtr output)
+{
+}
 
 /*
  * Destroy a Output at shutdown
@@ -36,7 +153,28 @@ RROutputDestroy (RROutputPtr crtc)
 static int
 RROutputDestroyResource (pointer value, XID pid)
 {
-    free (value);
+    RROutputPtr	output = (RROutputPtr) value;
+    ScreenPtr	pScreen = output->pScreen;
+    rrScrPriv(pScreen);
+    int		i;
+
+    for (i = 0; i < pScrPriv->numOutputs; i++)
+    {
+	if (pScrPriv->outputs[i] == output)
+	{
+	    memmove (pScrPriv->outputs, pScrPriv->outputs + 1,
+		     (pScrPriv->numOutputs - (i - 1)) * sizeof (RROutputPtr));
+	    --pScrPriv->numOutputs;
+	    break;
+	}
+    }
+    if (output->modes)
+	xfree (output->modes);
+    if (output->crtcs)
+	xfree (output->crtcs);
+    if (output->clones)
+	xfree (output->clones);
+    xfree (output);
     return 1;
 }
 
@@ -46,11 +184,11 @@ RROutputDestroyResource (pointer value, 
 Bool
 RROutputInit (void)
 {
-    OutputType = CreateNewResourceType (RROutputDestroyResource);
-    if (!OutputType)
+    RROutputType = CreateNewResourceType (RROutputDestroyResource);
+    if (!RROutputType)
 	return FALSE;
 #ifdef XResExtension
-	RegisterResourceName (OutputType, "OUTPUT");
+	RegisterResourceName (RROutputType, "OUTPUT");
 #endif
     return TRUE;
 }
diff --git a/randr/rrsdispatch.c b/randr/rrsdispatch.c
new file mode 100644
index 0000000..bf81f8b
--- /dev/null
+++ b/randr/rrsdispatch.c
@@ -0,0 +1,282 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+static int
+SProcRRQueryVersion (ClientPtr client)
+{
+    register int n;
+    REQUEST(xRRQueryVersionReq);
+
+    swaps(&stuff->length, n);
+    swapl(&stuff->majorVersion, n);
+    swapl(&stuff->minorVersion, n);
+    return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetScreenInfo (ClientPtr client)
+{
+    register int n;
+    REQUEST(xRRGetScreenInfoReq);
+
+    swaps(&stuff->length, n);
+    swapl(&stuff->window, n);
+    return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSetScreenConfig (ClientPtr client)
+{
+    register int n;
+    REQUEST(xRRSetScreenConfigReq);
+
+    if (RRClientKnowsRates (client))
+    {
+	REQUEST_SIZE_MATCH (xRRSetScreenConfigReq);
+	swaps (&stuff->rate, n);
+    }
+    else
+    {
+	REQUEST_SIZE_MATCH (xRR1_0SetScreenConfigReq);
+    }
+    
+    swaps(&stuff->length, n);
+    swapl(&stuff->drawable, n);
+    swapl(&stuff->timestamp, n);
+    swaps(&stuff->sizeID, n);
+    swaps(&stuff->rotation, n);
+    return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRSelectInput (ClientPtr client)
+{
+    register int n;
+    REQUEST(xRRSelectInputReq);
+
+    swaps(&stuff->length, n);
+    swapl(&stuff->window, n);
+    return (*ProcRandrVector[stuff->randrReqType]) (client);
+}
+
+static int
+SProcRRGetScreenSizeRange (ClientPtr client)
+{
+    REQUEST(xRRGetScreenSizeRangeReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetScreenSizeRangeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRSetScreenSize (ClientPtr client)
+{
+    REQUEST(xRRSetScreenSizeReq);
+    
+    REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRGetScreenResources (ClientPtr client)
+{
+    REQUEST(xRRGetScreenResourcesReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetScreenResourcesReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRGetOutputInfo (ClientPtr client)
+{
+    REQUEST(xRRGetOutputInfoReq);;
+    
+    REQUEST_SIZE_MATCH(xRRGetOutputInfoReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRListOutputProperties (ClientPtr client)
+{
+    REQUEST(xRRListOutputPropertiesReq);
+    
+    REQUEST_SIZE_MATCH(xRRListOutputPropertiesReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRChangeOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRChangeOutputPropertyReq);
+    
+    REQUEST_SIZE_MATCH(xRRChangeOutputPropertyReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRDeleteOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRDeleteOutputPropertyReq);
+    
+    REQUEST_SIZE_MATCH(xRRDeleteOutputPropertyReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRGetOutputProperty (ClientPtr client)
+{
+    REQUEST(xRRGetOutputPropertyReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetOutputPropertyReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRCreateMode (ClientPtr client)
+{
+    REQUEST(xRRCreateModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRCreateModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRDestroyMode (ClientPtr client)
+{
+    REQUEST(xRRDestroyModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRDestroyModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRAddOutputMode (ClientPtr client)
+{
+    REQUEST(xRRAddOutputModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRAddOutputModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRDeleteOutputMode (ClientPtr client)
+{
+    REQUEST(xRRDeleteOutputModeReq);
+    
+    REQUEST_SIZE_MATCH(xRRDeleteOutputModeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRGetCrtcInfo (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcInfoReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetCrtcInfoReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRSetCrtcConfig (ClientPtr client)
+{
+    REQUEST(xRRSetCrtcConfigReq);
+    
+    REQUEST_SIZE_MATCH(xRRSetCrtcConfigReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRGetCrtcGammaSize (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcGammaSizeReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetCrtcGammaSizeReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRGetCrtcGamma (ClientPtr client)
+{
+    REQUEST(xRRGetCrtcGammaReq);
+    
+    REQUEST_SIZE_MATCH(xRRGetCrtcGammaReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+static int
+SProcRRSetCrtcGamma (ClientPtr client)
+{
+    REQUEST(xRRSetCrtcGammaReq);
+    
+    REQUEST_SIZE_MATCH(xRRSetCrtcGammaReq);
+    (void) stuff;
+    return BadImplementation; 
+}
+
+int (*SProcRandrVector[RRNumberRequests])(ClientPtr) = {
+    SProcRRQueryVersion,	/* 0 */
+/* we skip 1 to make old clients fail pretty immediately */
+    NULL,			/* 1 SProcRandrOldGetScreenInfo */
+/* V1.0 apps share the same set screen config request id */
+    SProcRRSetScreenConfig,	/* 2 */
+    NULL,			/* 3 SProcRandrOldScreenChangeSelectInput */
+/* 3 used to be ScreenChangeSelectInput; deprecated */
+    SProcRRSelectInput,		/* 4 */
+    SProcRRGetScreenInfo,    	/* 5 */
+/* V1.2 additions */
+    SProcRRGetScreenSizeRange,	/* 6 */
+    SProcRRSetScreenSize,	/* 7 */
+    SProcRRGetScreenResources,	/* 8 */
+    SProcRRGetOutputInfo,	/* 9 */
+    SProcRRListOutputProperties,/* 10 */
+    SProcRRChangeOutputProperty,/* 11 */
+    SProcRRDeleteOutputProperty,/* 12 */
+    SProcRRGetOutputProperty,	/* 13 */
+    SProcRRCreateMode,		/* 14 */
+    SProcRRDestroyMode,		/* 15 */
+    SProcRRAddOutputMode,	/* 16 */
+    SProcRRDeleteOutputMode,	/* 17 */
+    SProcRRGetCrtcInfo,		/* 18 */
+    SProcRRSetCrtcConfig,	/* 19 */
+    SProcRRGetCrtcGammaSize,	/* 20 */
+    SProcRRGetCrtcGamma,	/* 21 */
+    SProcRRSetCrtcGamma,	/* 22 */
+};
+
diff-tree 3e745745fecef1cb59e53bde52ded311b51e1dac (from d17fb9672e238a089e463ac74cc4cd3325b67e1f)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sat Sep 16 23:21:37 2006 -0700

    Split RandR implementation into separate files.
    
    RandR is getting too big to live in one file; split into one file per object
    type (crtc, mode, screen), leaving the rest of the code in randr.c.
    
    Code is slowly approaching the point where it will drop-in as a replacement
    for the old 1.0 implementation.

diff --git a/randr/Makefile.am b/randr/Makefile.am
index bd30aed..868786e 100644
--- a/randr/Makefile.am
+++ b/randr/Makefile.am
@@ -9,4 +9,8 @@ endif
 librandr_la_SOURCES =	\
 	mirandr.c	\
 	randr.c		\
-	randrstr.h
+	randrstr.h	\
+	rrcrtc.c	\
+	rrmode.c	\
+	rroutput.c	\
+	rrscreen.c
diff --git a/randr/mirandr.c b/randr/mirandr.c
index 5aea38d..a57a157 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -70,16 +70,19 @@ Bool
 miRandRInit (ScreenPtr pScreen)
 {
     rrScrPrivPtr    pScrPriv;
+#if RANDR_12_INTERFACE
     RRModePtr	mode;
     RRCrtcPtr	crtc;
     RROutputPtr	output;
     xRRModeInfo modeInfo;
     char	name[64];
+#endif
     
     if (!RRScreenInit (pScreen))
 	return FALSE;
     pScrPriv = rrGetScrPriv(pScreen);
     pScrPriv->rrGetInfo = miRRGetInfo;
+#if RANDR_12_INTERFACE
     pScrPriv->rrCrtcSet = miRRCrtcSet;
     
     RRScreenSetSizeRange (pScreen,
@@ -111,7 +114,7 @@ miRandRInit (ScreenPtr pScreen)
 		      &crtc, 1, /* crtcs */
 		      RR_Connected))
 	return FALSE;
-    if (!RRCrtcSet (crtc, mode, 0, 0, RR_Rotate_0, 1, &output))
-	return FALSE;
+    RRCrtcNotify (crtc, mode, 0, 0, RR_Rotate_0, 1, &output);
+#endif
     return TRUE;
 }
diff --git a/randr/randr.c b/randr/randr.c
index e34b82c..2305b60 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -31,25 +31,7 @@
 #include <dix-config.h>
 #endif
 
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "misc.h"
-#include "os.h"
-#include "dixstruct.h"
-#include "resource.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include "pixmapstr.h"
-#include "extnsionst.h"
-#include "servermd.h"
-#include <X11/extensions/randr.h>
-#include <X11/extensions/randrproto.h>
 #include "randrstr.h"
-#ifdef RENDER
-#include <X11/extensions/render.h> 	/* we share subpixel order information */
-#include "picturestr.h"
-#endif
-#include <X11/Xfuncproto.h>
 
 /* From render.h */
 #ifndef SubPixelUnknown
@@ -60,8 +42,6 @@
 int	RRGeneration;
 int	RRNScreens;
 
-static RESTYPE	    ModeType, CrtcType, OutputType;
-
 static int ProcRRQueryVersion (ClientPtr pClient);
 static int ProcRRDispatch (ClientPtr pClient);
 static int SProcRRDispatch (ClientPtr pClient);
@@ -80,7 +60,7 @@ static int SProcRRQueryVersion (ClientPt
 static CARD8	RRReqCode;
 static int	RRErrBase;
 #endif
-static int	RREventBase;
+int	RREventBase;
 static RESTYPE ClientType, EventType; /* resource types for event masks */
 static int	RRClientPrivateIndex;
 
@@ -233,50 +213,21 @@ SRRNotifyEvent (xEvent *from,
     }
 }
 
-static int
-RRModeDestroyResource (pointer value, XID pid)
-{
-    RRModeDestroy ((RRModePtr) value);
-    return 1;
-}
-
-static int
-RRCrtcDestroyResource (pointer value, XID pid)
-{
-    RRCrtcDestroy ((RRCrtcPtr) value);
-    return 1;
-}
-
-static int
-RROutputDestroyResource (pointer value, XID pid)
-{
-    RROutputDestroy ((RROutputPtr) value);
-    return 1;
-}
-
 Bool RRScreenInit(ScreenPtr pScreen)
 {
     rrScrPrivPtr   pScrPriv;
 
     if (RRGeneration != serverGeneration)
     {
-	ModeType = CreateNewResourceType (RRModeDestroyResource);
-	if (!ModeType)
+	if (!RRModeInit ())
 	    return FALSE;
-	CrtcType = CreateNewResourceType (RRCrtcDestroyResource);
-	if (!ModeType)
+	if (!RRCrtcInit ())
 	    return FALSE;
-	OutputType = CreateNewResourceType (RROutputDestroyResource);
-	if (!ModeType)
+	if (!RROutputInit ())
 	    return FALSE;
 	if ((rrPrivIndex = AllocateScreenPrivateIndex()) < 0)
 	    return FALSE;
 	RRGeneration = serverGeneration;
-#ifdef XResExtension
-	RegisterResourceName (ModeType, "MODE");
-	RegisterResourceName (CrtcType, "CRTC");
-	RegisterResourceName (OutputType, "OUTPUT");
-#endif
     }
 
     pScrPriv = (rrScrPrivPtr) xalloc (sizeof (rrScrPrivRec));
@@ -288,14 +239,23 @@ Bool RRScreenInit(ScreenPtr pScreen)
     /*
      * Calling function best set these function vectors
      */
-    pScrPriv->rrCrtcSet = 0;
     pScrPriv->rrGetInfo = 0;
     pScrPriv->maxWidth = pScrPriv->minWidth = pScreen->width;
     pScrPriv->maxHeight = pScrPriv->minHeight = pScreen->height;
-#ifdef RANDR_SCREEN_INTERFACE    
+    
+#if RANDR_12_INTERFACE
+    pScrPriv->rrCrtcSet = 0;
+#endif
+#if RANDR_10_INTERFACE    
     pScrPriv->rrSetConfig = 0;
+    pScrPriv->rotations = RR_Rotate_0;
     pScrPriv->reqWidth = pScreen->width;
     pScrPriv->reqHeight = pScreen->height;
+    pScrPriv->nSizes = 0;
+    pScrPriv->pSizes = NULL;
+    pScrPriv->rotation = RR_Rotate_0;
+    pScrPriv->rate = 0;
+    pScrPriv->size = 0;
 #endif
     
     /*
@@ -400,61 +360,6 @@ RRExtensionInit (void)
 
     return;
 }
-		
-static void
-DeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen)
-{
-    rrScrPriv (pScreen);
-    xRRScreenChangeNotifyEvent	se;
-    RRCrtcPtr	crtc = pScrPriv->numCrtcs ? pScrPriv->crtcs[0] : NULL;
-    RROutputPtr	output = pScrPriv->numOutputs ? pScrPriv->outputs[0] : NULL;
-    RRModePtr	mode = crtc ? crtc->mode : NULL;
-    WindowPtr	pRoot = WindowTable[pScreen->myNum];
-    int		i;
-    
-    se.type = RRScreenChangeNotify + RREventBase;
-    se.rotation = (CARD8) (crtc ? crtc->rotation : RR_Rotate_0);
-    se.timestamp = pScrPriv->lastSetTime.milliseconds;
-    se.sequenceNumber = client->sequence;
-    se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
-    se.root =  pRoot->drawable.id;
-    se.window = pWin->drawable.id;
-#ifdef RENDER
-    se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
-#else
-    se.subpixelOrder = SubPixelUnknown;
-#endif
-
-    se.sequenceNumber = client->sequence;
-    if (mode) 
-    {
-	se.sizeID = -1;
-	for (i = 0; i < output->numModes; i++)
-	    if (mode == output->modes[i])
-	    {
-		se.sizeID = i;
-		break;
-	    }
-	se.widthInPixels = mode->mode.width;
-	se.heightInPixels = mode->mode.height;
-	se.widthInMillimeters = mode->mode.mmWidth;
-	se.heightInMillimeters = mode->mode.mmHeight;
-    }
-    else
-    {
-	/*
-	 * This "shouldn't happen", but a broken DDX can
-	 * forget to set the current configuration on GetInfo
-	 */
-	se.sizeID = 0xffff;
-	se.widthInPixels = 0;
-	se.heightInPixels = 0;
-	se.widthInMillimeters = 0;
-	se.heightInMillimeters = 0;
-    }    
-    WriteEventsToClient (client, 1, (xEvent *) &se);
-}
-
 static void
 DeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
 {
@@ -485,7 +390,7 @@ TellChanged (WindowPtr pWin, pointer val
 	    continue;
 
 	if (pRREvent->mask & RRScreenChangeNotifyMask)
-	    DeliverScreenEvent (client, pWin, pScreen);
+	    RRDeliverScreenEvent (client, pWin, pScreen);
 	
 	if (pRREvent->mask & RRCrtcChangeNotifyMask)
 	{
@@ -529,47 +434,6 @@ RRTellChanged (ScreenPtr pScreen)
     }
 }
 
-RRModePtr
-RRModeGet (ScreenPtr	pScreen,
-	   xRRModeInfo	*modeInfo,
-	   char		*name)
-{
-    rrScrPriv (pScreen);
-    int	i;
-    RRModePtr	mode;
-
-    for (i = 0; i < pScrPriv->numModes; i++)
-    {
-	mode = pScrPriv->modes[i];
-	if (!memcmp (modeInfo, &mode->mode, sizeof (xRRModeInfo)) &&
-	    !memcmp (name, mode->name, modeInfo->nameLength))
-	{
-	    ++mode->refcnt;
-	    return mode;
-	}
-    }
-    mode = xalloc (sizeof (RRModeRec) + modeInfo->nameLength + 1);
-    mode->refcnt = 1;
-    mode->mode = *modeInfo;
-    mode->name = (char *) (mode + 1);
-    memcpy (mode->name, name, modeInfo->nameLength);
-    mode->name[modeInfo->nameLength] = '\0';
-    mode->id = FakeClientID(0);
-    if (!AddResource (mode->id, ModeType, (pointer) mode))
-	return NULL;
-    ++mode->refcnt;
-    pScrPriv->changed = TRUE;
-    return mode;
-}
-
-void
-RRModeDestroy (RRModePtr mode)
-{
-    if (--mode->refcnt > 0)
-	return;
-    xfree (mode);
-}
-
 /*
  * Return the first output which is connected to an active CRTC
  * Used in emulating 1.0 behaviour
@@ -594,11 +458,13 @@ RRFirstOutput (ScreenPtr pScreen)
     return NULL;
 }
 
-#ifdef RANDR_SCREEN_INTERFACE
+#ifdef RANDR_10_INTERFACE
 
-static Bool
+static RRModePtr
 RROldModeAdd (RROutputPtr output, RRScreenSizePtr size, int refresh)
 {
+    ScreenPtr	pScreen = output->pScreen;
+    rrScrPriv(pScreen);
     xRRModeInfo	modeInfo;
     char	name[100];
     RRModePtr	mode;
@@ -617,12 +483,15 @@ RROldModeAdd (RROutputPtr output, RRScre
     modeInfo.dotClock = ((CARD32) size->width * (CARD32) size->width *
 			 (CARD32) refresh);
     modeInfo.nameLength = strlen (name);
-    mode = RRModeGet (output->pScreen, &modeInfo, name);
+    mode = RRModeGet (pScreen, &modeInfo, name);
     if (!mode)
-	return FALSE;
+	return NULL;
     for (i = 0; i < output->numModes; i++)
 	if (output->modes[i] == mode)
-	    return TRUE;
+	{
+	    RRModeDestroy (mode);
+	    return mode;
+	}
     
     if (output->numModes)
 	modes = xrealloc (output->modes, 
@@ -630,11 +499,16 @@ RROldModeAdd (RROutputPtr output, RRScre
     else
 	modes = xalloc (sizeof (RRModePtr));
     if (!modes)
-	return FALSE;
+    {
+	RRModeDestroy (mode);
+	FreeResource (mode->id, 0);
+	return NULL;
+    }
     modes[output->numModes++] = mode;
     output->modes = modes;
     output->changed = TRUE;
-    return TRUE;
+    pScrPriv->changed = TRUE;
+    return mode;
 }
 
 static void
@@ -643,6 +517,7 @@ RRScanOldConfig (ScreenPtr pScreen, Rota
     rrScrPriv(pScreen);
     RROutputPtr	output = RRFirstOutput (pScreen);
     RRCrtcPtr	crtc;
+    RRModePtr	mode, newMode = NULL;
     int		i;
     CARD16	minWidth = MAXSHORT, minHeight = MAXSHORT;
     CARD16	maxWidth = 0, maxHeight = 0;
@@ -666,11 +541,29 @@ RRScanOldConfig (ScreenPtr pScreen, Rota
 	int		r;
 
 	if (size->nRates)
+	{
 	    for (r = 0; r < size->nRates; r++)
-		RROldModeAdd (output, size, size->pRates[r].rate);
+	    {
+		mode = RROldModeAdd (output, size, size->pRates[r].rate);
+		if (i == pScrPriv->size && 
+		    size->pRates[r].rate == pScrPriv->rate)
+		{
+		    newMode = mode;
+		}
+	    }
+	    xfree (size->pRates);
+	}
 	else
-	    RROldModeAdd (output, size, 0);
+	{
+	    mode = RROldModeAdd (output, size, 0);
+	    if (i == pScrPriv->size)
+		newMode = mode;
+	}
     }
+    if (pScrPriv->nSizes)
+	xfree (pScrPriv->pSizes);
+    pScrPriv->pSizes = NULL;
+    pScrPriv->nSizes = 0;
 	    
     /* find size bounds */
     for (i = 0; i < output->numModes; i++) 
@@ -697,9 +590,17 @@ RRScanOldConfig (ScreenPtr pScreen, Rota
     if (maxHeight != pScrPriv->maxHeight) {
 	pScrPriv->maxHeight = maxHeight; pScrPriv->changed = TRUE;
     }
+
+    /* notice current mode */
+    if (newMode)
+	RRCrtcSet (output->crtc, newMode, 0, 0, pScrPriv->rotation,
+		   1, &output);
 }
 #endif
 
+/*
+ * Poll the driver for changed information
+ */
 static Bool
 RRGetInfo (ScreenPtr pScreen)
 {
@@ -718,7 +619,7 @@ RRGetInfo (ScreenPtr pScreen)
     if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
 	return FALSE;
 
-#if RANDR_SCREEN_INTERFACE
+#if RANDR_10_INTERFACE
     if (pScrPriv->nSizes)
 	RRScanOldConfig (pScreen, rotations);
 #endif
@@ -726,27 +627,6 @@ RRGetInfo (ScreenPtr pScreen)
     return TRUE;
 }
 
-static void
-RRSendConfigNotify (ScreenPtr pScreen)
-{
-    WindowPtr	pWin = WindowTable[pScreen->myNum];
-    xEvent	event;
-
-    event.u.u.type = ConfigureNotify;
-    event.u.configureNotify.window = pWin->drawable.id;
-    event.u.configureNotify.aboveSibling = None;
-    event.u.configureNotify.x = 0;
-    event.u.configureNotify.y = 0;
-
-    /* XXX xinerama stuff ? */
-    
-    event.u.configureNotify.width = pWin->drawable.width;
-    event.u.configureNotify.height = pWin->drawable.height;
-    event.u.configureNotify.borderWidth = wBorderWidth (pWin);
-    event.u.configureNotify.override = pWin->overrideRedirect;
-    DeliverEvents(pWin, &event, 1, NullWindow);
-}
-
 static int
 ProcRRQueryVersion (ClientPtr client)
 {
@@ -777,50 +657,6 @@ ProcRRQueryVersion (ClientPtr client)
     return (client->noClientException);
 }
 
-
-extern char	*ConnectionInfo;
-
-static int padlength[4] = {0, 3, 2, 1};
-
-static void
-RREditConnectionInfo (ScreenPtr pScreen)
-{
-    xConnSetup	    *connSetup;
-    char	    *vendor;
-    xPixmapFormat   *formats;
-    xWindowRoot	    *root;
-    xDepth	    *depth;
-    xVisualType	    *visual;
-    int		    screen = 0;
-    int		    d;
-
-    connSetup = (xConnSetup *) ConnectionInfo;
-    vendor = (char *) connSetup + sizeof (xConnSetup);
-    formats = (xPixmapFormat *) ((char *) vendor +
-				 connSetup->nbytesVendor +
-				 padlength[connSetup->nbytesVendor & 3]);
-    root = (xWindowRoot *) ((char *) formats +
-			    sizeof (xPixmapFormat) * screenInfo.numPixmapFormats);
-    while (screen != pScreen->myNum)
-    {
-	depth = (xDepth *) ((char *) root + 
-			    sizeof (xWindowRoot));
-	for (d = 0; d < root->nDepths; d++)
-	{
-	    visual = (xVisualType *) ((char *) depth +
-				      sizeof (xDepth));
-	    depth = (xDepth *) ((char *) visual +
-				depth->nVisuals * sizeof (xVisualType));
-	}
-	root = (xWindowRoot *) ((char *) depth);
-	screen++;
-    }
-    root->pixWidth = pScreen->width;
-    root->pixHeight = pScreen->height;
-    root->mmWidth = pScreen->mmWidth;
-    root->mmHeight = pScreen->mmHeight;
-}
-
 typedef struct _RR10Data {
     RRScreenSizePtr sizes;
     int		    nsize;
@@ -829,7 +665,7 @@ typedef struct _RR10Data {
     CARD16	    refresh;
 } RR10DataRec, *RR10DataPtr;
 
-static CARD16
+CARD16
 RRVerticalRefresh (xRRModeInfo *mode)
 {
     CARD32  refresh;
@@ -1056,94 +892,6 @@ ProcRRGetScreenInfo (ClientPtr client)
 }
 
 #if 0
-static int
-RRMonitorSetMode (ScreenPtr pScreen, RRMonitorPtr pMonitor, 
-		  RRModePtr pMode, int x, int y, Rotation rotation,
-		  TimeStamp time)
-{
-    rrScrPriv(pScreen);
-    short   oldWidth, oldHeight;
-    
-    oldWidth = pScreen->width;
-    oldHeight = pScreen->height;
-    
-    /*
-     * call out to ddx routine to effect the change
-     */
-    if (pScrPriv->rrSetScreenSize && pScrPriv->rrSetMode)
-    {
-	xScreenSizes	oldSize;
-	if (!(*pScrPriv->rrSetMode) (pScreen, 0, NULL, 0, 0, RR_Rotate_0))
-	    return RRSetConfigFailed;
-	oldSize.widthInPixels = pScreen->width;
-	oldSize.heightInPixels = pScreen->width;
-	oldSize.widthInMillimeters = pScreen->mmWidth;
-	oldSize.heightInMillimeters = pScreen->mmHeight;
-	if (!(*pScrPriv->rrSetScreenSize) (pScreen,
-					   pMode->mode.width,
-					   pMode->mode.height,
-					   pMode->mode.widthInMillimeters,
-					   pMode->mode.heightInMillimeters))
-	{
-	    (void) (*pScrPriv->rrSetMode) (pScreen, 0, pMonitor->pMode,
-					   pMonitor->x, pMonitor->y,
-					   pMonitor->rotation);
-	    return RRSetConfigFailed;
-	}
-	if (!(*pScrPriv->rrSetMode) (pScreen, 0, pMode, 0, 0, rotation))
-	{
-	    (void) (*pScrPriv->rrSetScreenSize) (pScreen,
-						 oldSize.widthInPixels,
-						 oldSize.heightInPixels,
-						 oldSize.widthInMillimeters,
-						 oldSize.heightInMillimeters);
-	    (void) (*pScrPriv->rrSetMode) (pScreen, 0, pMonitor->pMode,
-					   pMonitor->x, pMonitor->y,
-					   pMonitor->rotation);
-	    return RRSetConfigFailed;
-	}
-    }
-#ifdef RANDR_SCREEN_INTERFACE
-    else if (pScrPriv->rrSetConfig)
-    {
-	int rate = RRVerticalRefresh (&pMode->mode);
-	RRScreenSizeRec	size;
-
-	size.width = pMode->mode.width;
-	size.height = pMode->mode.height;
-	size.mmWidth = pMode->mode.widthInMillimeters;
-	size.mmHeight = pMode->mode.heightInMillimeters;
-	if (!(*pScrPriv->rrSetConfig) (pScreen, rotation, rate, &size))
-	    return RRSetConfigFailed;
-    }
-#endif
-    else
-	return RRSetConfigFailed;
-    
-    /*
-     * set current extension configuration pointers
-     */
-    RRSetCurrentMode (pMonitor, pMode, 0, 0, rotation);
-    
-    /*
-     * Deliver ScreenChangeNotify events whenever
-     * the configuration is updated
-     */
-    WalkTree (pScreen, TellChanged, (pointer) pScreen);
-    
-    /*
-     * Deliver ConfigureNotify events when root changes
-     * pixel size
-     */
-    if (oldWidth != pScreen->width || oldHeight != pScreen->height)
-	RRSendConfigNotify (pScreen);
-    RREditConnectionInfo (pScreen);
-    
-    /*
-     * Fix pointer bounds and location
-     */
-    ScreenRestructured (pScreen);
-    pScrPriv->lastSetTime = time;
     return RRSetConfigSuccess;
 }
 #endif
@@ -1411,36 +1159,6 @@ RRSetScreenConfig (ScreenPtr		pScreen,
 }
 #endif
 
-static Bool
-RRSetScreenSize (ScreenPtr pScreen,
-		 CARD16 width, CARD16 height,
-		 CARD16 widthInMillimeters, CARD16 heightInMillimeters)
-{
-    rrScrPriv(pScreen);
-    
-    if (pScrPriv->rrScreenSetSize) 
-    {
-	return (*pScrPriv->rrScreenSetSize) (pScreen, width, height,
-					     widthInMillimeters,
-					     heightInMillimeters);
-    }
-#ifdef RANDR_SCREEN_INTERFACE
-    else
-    {
-	/* Pend the size change until we get the set mode request.
-	 * Yes, this is 'illegal', but the best we can do until
-	 * drivers are updated
-	 */
-	pScrPriv->reqWidth = width;
-	pScrPriv->reqHeight = height;
-	pScreen->mmWidth = widthInMillimeters;
-	pScreen->mmHeight = heightInMillimeters;
-	return TRUE;
-    }
-#endif
-    return FALSE;
-}
-
 static int
 ProcRRSelectInput (ClientPtr client)
 {
@@ -1524,7 +1242,7 @@ ProcRRSelectInput (ClientPtr client)
 		CompareTimeStamps (pTimes->configTime, 
 				   pScrPriv->lastConfigTime) != 0)
 	    {
-		DeliverScreenEvent (client, pWin, pScreen);
+		RRDeliverScreenEvent (client, pWin, pScreen);
 	    }
 	}
     }
@@ -1651,7 +1369,7 @@ static int ProcRRSetScreenSize (ClientPt
 	client->errorValue = 0;
 	return BadValue;
     }
-    if (!RRSetScreenSize (pScreen, 
+    if (!RRScreenSizeSet (pScreen, 
 			  stuff->width, stuff->height,
 			  stuff->widthInMillimeters,
 			  stuff->heightInMillimeters))
@@ -2000,6 +1718,7 @@ SProcRRDispatch (ClientPtr client)
     }
 }
 
+#if RANDR_12_INTERFACE
 /*
  * Register the range of sizes for the screen
  */
@@ -2019,8 +1738,9 @@ RRScreenSetSizeRange (ScreenPtr	pScreen,
     pScrPriv->maxWidth  = maxWidth;
     pScrPriv->maxHeight = maxHeight;
 }
+#endif
 
-#ifdef RANDR_SCREEN_INTERFACE
+#ifdef RANDR_10_INTERFACE
 
 static Bool
 RRScreenSizeMatches (RRScreenSizePtr  a,
@@ -2052,6 +1772,7 @@ RRRegisterSize (ScreenPtr	    pScreen,
     if (!pScrPriv)
 	return 0;
     
+    tmp.id = 0;
     tmp.width = width;
     tmp.height= height;
     tmp.mmWidth = mmWidth;
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 1694523..f323660 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -32,15 +32,35 @@
 #ifndef _RANDRSTR_H_
 #define _RANDRSTR_H_
 
+#include <X11/X.h>
+#include <X11/Xproto.h>
+#include "misc.h"
+#include "os.h"
+#include "dixstruct.h"
+#include "resource.h"
+#include "scrnintstr.h"
+#include "windowstr.h"
+#include "pixmapstr.h"
+#include "extnsionst.h"
+#include "servermd.h"
+#include <X11/extensions/randr.h>
 #include <X11/extensions/randrproto.h>
+#ifdef RENDER
+#include <X11/extensions/render.h> 	/* we share subpixel order information */
+#include "picturestr.h"
+#endif
+#include <X11/Xfuncproto.h>
 
 /* required for ABI compatibility for now */
-#define RANDR_SCREEN_INTERFACE 1
+#define RANDR_10_INTERFACE 1
+/* #define RANDR_12_INTERFACE 1 */
 
 typedef XID	RRMode;
 typedef XID	RROutput;
 typedef XID	RRCrtc;
 
+extern int	RREventBase;
+
 /*
  * Modeline for a monitor. Name follows directly after this struct
  */
@@ -64,9 +84,9 @@ struct _rrCrtc {
     int		    x, y;
     Rotation	    rotation;
     Rotation	    rotations;
-    int		    numPossibleOutputs;
-    RROutputPtr	    *possibleOutputs;
     Bool	    changed;
+    int		    numOutputs;
+    RROutputPtr	    *outputs;
     void	    *devPrivate;
 };
 
@@ -88,11 +108,12 @@ struct _rrOutput {
     void	    *devPrivate;
 };
 
-typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr	pScreen,
+#if RANDR_12_INTERFACE
+typedef Bool (*RRScreentSizeSetProcPtr) (ScreenPtr	pScreen,
 					CARD16		width,
 					CARD16		height,
-					CARD32		widthInMM,
-					CARD32		heightInMM);
+					CARD32		mmWidth,
+					CARD32		mmHeight);
 					
 typedef Bool (*RRCrtcSetProcPtr) (ScreenPtr		pScreen,
 				  RRCrtcPtr		crtc,
@@ -100,8 +121,9 @@ typedef Bool (*RRCrtcSetProcPtr) (Screen
 				  int			x,
 				  int			y,
 				  Rotation		rotation,
-				  int			numOutput,
+				  int			numOutputs,
 				  RROutputPtr		*outputs);
+#endif
 
 typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations);
 typedef Bool (*RRCloseScreenProcPtr) ( int i, ScreenPtr pscreen);
@@ -121,7 +143,7 @@ typedef struct _rrScreenSize {
     RRScreenRatePtr pRates;
 } RRScreenSize, *RRScreenSizePtr;
 
-#ifdef RANDR_SCREEN_INTERFACE
+#ifdef RANDR_10_INTERFACE
 
 typedef Bool (*RRSetConfigProcPtr) (ScreenPtr		pScreen,
 				    Rotation		rotation,
@@ -136,12 +158,14 @@ typedef struct _rrScrPriv {
      * 'public' part of the structure; DDXen fill this in
      * as they initialize
      */
-#ifdef RANDR_SCREEN_INTERFACE
+#if RANDR_10_INTERFACE
     RRSetConfigProcPtr	    rrSetConfig;
 #endif
     RRGetInfoProcPtr	    rrGetInfo;
-    RRScreenSetSizeProcPtr  rrScreenSetSize;
+#if RANDR_12_INTERFACE
+    RRScreenSetSizeProcPtr  rrScreenSizeSet;
     RRCrtcSetProcPtr	    rrCrtcSet;
+#endif
     
     /*
      * Private part of the structure; not considered part of the ABI
@@ -152,6 +176,7 @@ typedef struct _rrScrPriv {
     Bool		    changed;
     CARD16		    minWidth, minHeight;
     CARD16		    maxWidth, maxHeight;
+    CARD16		    width, height;	/* last known screen size */
 
     /* modes, outputs and crtcs */
     int			    numModes;
@@ -163,7 +188,7 @@ typedef struct _rrScrPriv {
     int			    numCrtcs;
     RRCrtcPtr		    *crtcs;
 
-#ifdef RANDR_SCREEN_INTERFACE
+#ifdef RANDR_10_INTERFACE
     /*
      * Configuration information
      */
@@ -173,7 +198,6 @@ typedef struct _rrScrPriv {
     int			    nSizes;
     RRScreenSizePtr	    pSizes;
     
-    RRScreenSizePtr	    pSize;
     Rotation		    rotation;
     int			    rate;
     int			    size;
@@ -190,6 +214,7 @@ extern int rrPrivIndex;
 void
 RRExtensionInit (void);
 
+#ifdef RANDR_12_INTERFACE
 /*
  * Set the range of sizes for the screen
  */
@@ -199,89 +224,34 @@ RRScreenSetSizeRange (ScreenPtr	pScreen,
 		      CARD16	minHeight,
 		      CARD16	maxWidth,
 		      CARD16	maxHeight);
+#endif
 
+/* rrscreen.c */
 /*
- * Create a CRTC
- */
-RRCrtcPtr
-RRCrtcCreate (ScreenPtr	pScreen,
-	      void	*devPrivate);
-
-
-/*
- * Use this value for any num parameter to indicate that
- * the related data are unchanged
- */
-#define RR_NUM_UNCHANGED    -1
-
-/*
- * Notify the extension that the Crtc has been reconfigured
- */
-Bool
-RRCrtcSet (RRCrtcPtr	crtc,
-	   RRModePtr	mode,
-	   int		x,
-	   int		y,
-	   Rotation	rotation,
-	   int		numOutput,
-	   RROutputPtr	*outputs);
-
-/*
- * Destroy a Crtc at shutdown
- */
-void
-RRCrtcDestroy (RRCrtcPtr crtc);
-
-/*
- * Find, and if necessary, create a mode
- */
-
-RRModePtr
-RRModeGet (ScreenPtr	pScreen,
-	   xRRModeInfo	*modeInfo,
-	   char		*name);
-
-/*
- * Destroy a mode.
+ * Notify the extension that the screen size has been changed.
+ * The driver is responsible for calling this whenever it has changed
+ * the size of the screen
  */
-
 void
-RRModeDestroy (RRModePtr mode);
+RRScreenSizeNotify (ScreenPtr	pScreen);
 
 /*
- * Create an output
+ * Request that the screen be resized
  */
-
-RROutputPtr
-RROutputCreate (ScreenPtr   pScreen,
-		char	    *name,
-		int	    nameLength,
-		void	    *devPrivate);
+Bool
+RRScreenSizeSet (ScreenPtr  pScreen,
+		 CARD16	    width,
+		 CARD16	    height,
+		 CARD32	    mmWidth,
+		 CARD32	    mmHeight);
 
 /*
- * Notify extension that output parameters have been changed
+ * Deliver a ScreenNotify event
  */
-Bool
-RROutputSet (RROutputPtr    output,
-	     RROutputPtr    *clones,
-	     int	    numClones,
-	     RRModePtr	    *modes,
-	     int	    numModes,
-	     RRCrtcPtr	    *crtcs,
-	     int	    numCrtcs,
-	     CARD8	    connection);
-
 void
-RROutputDestroy (RROutputPtr	output);
-
-void
-RRTellChanged (ScreenPtr pScreen);
-
-Bool RRScreenInit(ScreenPtr pScreen);
-
-Rotation
-RRGetRotation (ScreenPtr pScreen);
-
+RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen);
+    
+/* mirandr.c */
 Bool
 miRandRInit (ScreenPtr pScreen);
 
@@ -301,7 +271,22 @@ miRRCrtcSet (ScreenPtr	pScreen,
 	     int	numOutput,
 	     RROutputPtr    *outputs);
 
-#ifdef RANDR_SCREEN_INTERFACE					
+/* randr.c */
+/*
+ * Send all pending events
+ */
+void
+RRTellChanged (ScreenPtr pScreen);
+
+Bool RRScreenInit(ScreenPtr pScreen);
+
+Rotation
+RRGetRotation (ScreenPtr pScreen);
+
+CARD16
+RRVerticalRefresh (xRRModeInfo *mode);
+
+#ifdef RANDR_10_INTERFACE					
 /*
  * This is the old interface, deprecated but left
  * around for compatibility
@@ -344,4 +329,122 @@ RRSetScreenConfig (ScreenPtr		pScreen,
 		   RRScreenSizePtr	pSize);
 
 #endif					
+
+/* rrcrtc.c */
+/*
+ * Create a CRTC
+ */
+RRCrtcPtr
+RRCrtcCreate (ScreenPtr	pScreen,
+	      void	*devPrivate);
+
+
+/*
+ * Use this value for any num parameter to indicate that
+ * the related data are unchanged
+ */
+#define RR_NUM_UNCHANGED    -1
+
+/*
+ * Notify the extension that the Crtc has been reconfigured,
+ * the driver calls this whenever it has updated the mode
+ */
+Bool
+RRCrtcNotify (RRCrtcPtr	    crtc,
+	      RRModePtr	    mode,
+	      int	    x,
+	      int	    y,
+	      Rotation	    rotation,
+	      int	    numOutput,
+	      RROutputPtr   *outputs);
+
+/*
+ * Request that the Crtc be reconfigured
+ */
+Bool
+RRCrtcSet (RRCrtcPtr    crtc,
+	   RRModePtr	mode,
+	   int		x,
+	   int		y,
+	   Rotation	rotation,
+	   int		numOutput,
+	   RROutputPtr  *outputs);
+
+/*
+ * Destroy a Crtc at shutdown
+ */
+void
+RRCrtcDestroy (RRCrtcPtr crtc);
+
+/*
+ * Initialize crtc type
+ */
+Bool
+RRCrtcInit (void);
+
+/* rrmode.c */
+/*
+ * Find, and if necessary, create a mode
+ */
+
+RRModePtr
+RRModeGet (ScreenPtr	pScreen,
+	   xRRModeInfo	*modeInfo,
+	   char		*name);
+
+/*
+ * Destroy a mode.
+ */
+
+void
+RRModeDestroy (RRModePtr mode);
+
+/*
+ * Initialize mode type
+ */
+Bool
+RRModeInit (void);
+    
+/* rroutput.c */
+/*
+ * Create an output
+ */
+
+RROutputPtr
+RROutputCreate (ScreenPtr   pScreen,
+		char	    *name,
+		int	    nameLength,
+		void	    *devPrivate);
+
+/*
+ * Notify extension that output parameters have been changed
+ */
+Bool
+RROutputSetClones (RROutputPtr  output,
+		   RROutputPtr  *clones,
+		   int		numClones);
+
+Bool
+RROutputSetModes (RROutputPtr	output,
+		  RRModePtr	*modes,
+		  int		numModes);
+
+Bool
+RROutputSetCrtcs (RROutputPtr	output,
+		  RRCrtcPtr	*crtcs,
+		  int		numCrtcs);
+
+Bool
+RROutputSetConnection (RROutputPtr  output,
+		       CARD8	    connection);
+
+void
+RROutputDestroy (RROutputPtr	output);
+
+/*
+ * Initialize output type
+ */
+Bool
+RROutputInit (void);
+    
 #endif /* _RANDRSTR_H_ */
diff --git a/randr/rrcrtc.c b/randr/rrcrtc.c
new file mode 100644
index 0000000..cc5b24d
--- /dev/null
+++ b/randr/rrcrtc.c
@@ -0,0 +1,238 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+static RESTYPE	CrtcType;
+
+/*
+ * Create a CRTC
+ */
+RRCrtcPtr
+RRCrtcCreate (ScreenPtr	pScreen,
+	      void	*devPrivate)
+{
+    rrScrPriv (pScreen);
+    RRCrtcPtr	crtc;
+    RRCrtcPtr	*crtcs;
+    
+    crtc = xalloc (sizeof (RRCrtcRec));
+    if (!crtc)
+	return NULL;
+    if (pScrPriv->numCrtcs)
+	crtcs = xrealloc (pScrPriv->crtcs, 
+			  (pScrPriv->numCrtcs + 1) * sizeof (RRCrtcPtr));
+    else
+	crtcs = xalloc (sizeof (RRCrtcPtr));
+    if (!crtcs)
+    {
+	xfree (crtc);
+	return NULL;
+    }
+    crtc->id = FakeClientID (0);
+    crtc->pScreen = pScreen;
+    crtc->mode = NULL;
+    crtc->x = 0;
+    crtc->y = 0;
+    crtc->rotation = RR_Rotate_0;
+    crtc->rotations = RR_Rotate_0;
+    crtc->outputs = NULL;
+    crtc->numOutputs = 0;
+    crtc->changed = TRUE;
+    crtc->devPrivate = devPrivate;
+    pScrPriv->crtcs[pScrPriv->numCrtcs++] = crtc;
+    return crtc;
+}
+
+/*
+ * Notify the extension that the Crtc has been reconfigured,
+ * the driver calls this whenever it has updated the mode
+ */
+Bool
+RRCrtcNotify (RRCrtcPtr	    crtc,
+	      RRModePtr	    mode,
+	      int	    x,
+	      int	    y,
+	      Rotation	    rotation,
+	      int	    numOutputs,
+	      RROutputPtr   *outputs)
+{
+    ScreenPtr	pScreen = crtc->pScreen;
+    rrScrPriv(pScreen);
+    int	    i, j;
+    int	    prevNumOutputs = crtc->numOutputs;
+    
+    if (numOutputs != prevNumOutputs)
+    {
+	RROutputPtr *outputs;
+	
+	if (crtc->numOutputs)
+	    outputs = xrealloc (crtc->outputs,
+				numOutputs * sizeof (RROutputPtr));
+	else
+	    outputs = xalloc (numOutputs * sizeof (RROutputPtr));
+	if (!outputs)
+	    return FALSE;
+	crtc->outputs = outputs;
+    }
+    for (i = 0; i < numOutputs; i++)
+    {
+	for (j = 0; j < crtc->numOutputs; j++)
+	    if (outputs[i] == crtc->outputs[j])
+		break;
+	if (j != crtc->numOutputs)
+	{
+	    outputs[i]->changed = TRUE;
+	    crtc->changed = TRUE;
+	}
+    }
+    for (j = 0; j < crtc->numOutputs; j++)
+    {
+	for (i = 0; i < numOutputs; i++)
+	    if (outputs[i] == crtc->outputs[j])
+		break;
+	if (i != numOutputs)
+	{
+	    crtc->outputs[j]->changed = TRUE;
+	    crtc->changed = TRUE;
+	}
+    }
+    if (mode != crtc->mode)
+    {
+	if (crtc->mode)
+	    RRModeDestroy (crtc->mode);
+	crtc->mode = mode;
+	mode->refcnt++;
+	crtc->changed = TRUE;
+    }
+    if (x != crtc->x)
+    {
+	crtc->x = x;
+	crtc->changed = TRUE;
+    }
+    if (y != crtc->y)
+    {
+	crtc->y = y;
+	crtc->changed = TRUE;
+    }
+    if (rotation != crtc->rotation)
+    {
+	crtc->rotation = rotation;
+	crtc->changed = TRUE;
+    }
+    if (crtc->changed)
+	pScrPriv->changed = TRUE;
+    return TRUE;
+}
+
+/*
+ * Request that the Crtc be reconfigured
+ */
+Bool
+RRCrtcSet (RRCrtcPtr    crtc,
+	   RRModePtr	mode,
+	   int		x,
+	   int		y,
+	   Rotation	rotation,
+	   int		numOutputs,
+	   RROutputPtr  *outputs)
+{
+    ScreenPtr	pScreen = crtc->pScreen;
+    rrScrPriv(pScreen);
+
+#if RANDR_12_INTERFACE
+    if (pScrPriv->rrCrtcSet)
+    {
+	return (*pScrPriv->rrCrtcSet) (pScreen, crtc, mode, x, y, 
+				       rotation, numOutputs, outputs);
+    }
+#endif
+#if RANDR_10_INTERFACE
+    if (pScrPriv->rrSetConfig)
+    {
+	RRScreenSize	    size;
+	RRScreenRate	    rate;
+	Bool		    ret;
+
+	size.width = mode->mode.width;
+	size.height = mode->mode.height;
+	size.mmWidth = mode->mode.mmWidth;
+	size.mmHeight = mode->mode.mmHeight;
+	size.nRates = 1;
+	rate.rate = RRVerticalRefresh (&mode->mode);
+	size.pRates = &rate;
+	ret = (*pScrPriv->rrSetConfig) (pScreen, rotation, rate.rate, &size);
+	/*
+	 * Old 1.0 interface tied screen size to mode size
+	 */
+	if (ret)
+	    RRScreenSizeNotify (pScreen);
+	return ret;
+    }
+#endif
+    return FALSE;
+}
+
+/*
+ * Destroy a Crtc at shutdown
+ */
+void
+RRCrtcDestroy (RRCrtcPtr crtc)
+{
+    FreeResource (crtc->id, 0);
+}
+
+static int
+RRCrtcDestroyResource (pointer value, XID pid)
+{
+    RRCrtcPtr	crtc = (RRCrtcPtr) value;
+    ScreenPtr	pScreen = crtc->pScreen;
+    rrScrPriv(pScreen);
+    int		i;
+
+    for (i = 0; i < pScrPriv->numCrtcs; i++)
+    {
+	if (pScrPriv->crtcs[i] == crtc)
+	{
+	    memmove (pScrPriv->crtcs, pScrPriv->crtcs + 1,
+		     (pScrPriv->numCrtcs - (i - 1)) * sizeof (RRCrtcPtr));
+	    --pScrPriv->numCrtcs;
+	}
+    }
+    free (value);
+    return 1;
+}
+
+/*
+ * Initialize crtc type
+ */
+Bool
+RRCrtcInit (void)
+{
+    CrtcType = CreateNewResourceType (RRCrtcDestroyResource);
+    if (!CrtcType)
+	return FALSE;
+#ifdef XResExtension
+	RegisterResourceName (CrtcType, "CRTC");
+#endif
+    return TRUE;
+}
diff --git a/randr/rrmode.c b/randr/rrmode.c
new file mode 100644
index 0000000..1eb53c3
--- /dev/null
+++ b/randr/rrmode.c
@@ -0,0 +1,85 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+static RESTYPE	ModeType;
+
+RRModePtr
+RRModeGet (ScreenPtr	pScreen,
+	   xRRModeInfo	*modeInfo,
+	   char		*name)
+{
+    rrScrPriv (pScreen);
+    int	i;
+    RRModePtr	mode;
+
+    for (i = 0; i < pScrPriv->numModes; i++)
+    {
+	mode = pScrPriv->modes[i];
+	if (!memcmp (modeInfo, &mode->mode, sizeof (xRRModeInfo)) &&
+	    !memcmp (name, mode->name, modeInfo->nameLength))
+	{
+	    ++mode->refcnt;
+	    return mode;
+	}
+    }
+    mode = xalloc (sizeof (RRModeRec) + modeInfo->nameLength + 1);
+    mode->refcnt = 1;
+    mode->mode = *modeInfo;
+    mode->name = (char *) (mode + 1);
+    memcpy (mode->name, name, modeInfo->nameLength);
+    mode->name[modeInfo->nameLength] = '\0';
+    mode->id = FakeClientID(0);
+    if (!AddResource (mode->id, ModeType, (pointer) mode))
+	return NULL;
+    ++mode->refcnt;
+    pScrPriv->changed = TRUE;
+    return mode;
+}
+
+void
+RRModeDestroy (RRModePtr mode)
+{
+    if (--mode->refcnt > 0)
+	return;
+    xfree (mode);
+}
+
+static int
+RRModeDestroyResource (pointer value, XID pid)
+{
+    RRModeDestroy ((RRModePtr) value);
+    return 1;
+}
+
+Bool
+RRModeInit (void)
+{
+    ModeType = CreateNewResourceType (RRModeDestroyResource);
+    if (!ModeType)
+	return FALSE;
+#ifdef XResExtension
+    RegisterResourceName (ModeType, "MODE");
+#endif
+    return TRUE;
+}
diff --git a/randr/rroutput.c b/randr/rroutput.c
new file mode 100644
index 0000000..c7e7995
--- /dev/null
+++ b/randr/rroutput.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+static RESTYPE	OutputType;
+
+/*
+ * Destroy a Output at shutdown
+ */
+void
+RROutputDestroy (RROutputPtr crtc)
+{
+    FreeResource (crtc->id, 0);
+}
+
+static int
+RROutputDestroyResource (pointer value, XID pid)
+{
+    free (value);
+    return 1;
+}
+
+/*
+ * Initialize crtc type
+ */
+Bool
+RROutputInit (void)
+{
+    OutputType = CreateNewResourceType (RROutputDestroyResource);
+    if (!OutputType)
+	return FALSE;
+#ifdef XResExtension
+	RegisterResourceName (OutputType, "OUTPUT");
+#endif
+    return TRUE;
+}
diff --git a/randr/rrscreen.c b/randr/rrscreen.c
new file mode 100644
index 0000000..47ba12d
--- /dev/null
+++ b/randr/rrscreen.c
@@ -0,0 +1,205 @@
+/*
+ * Copyright © 2006 Keith Packard
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include "randrstr.h"
+
+extern char	*ConnectionInfo;
+
+static int padlength[4] = {0, 3, 2, 1};
+
+/*
+ * Edit connection information block so that new clients
+ * see the current screen size on connect
+ */
+static void
+RREditConnectionInfo (ScreenPtr pScreen)
+{
+    xConnSetup	    *connSetup;
+    char	    *vendor;
+    xPixmapFormat   *formats;
+    xWindowRoot	    *root;
+    xDepth	    *depth;
+    xVisualType	    *visual;
+    int		    screen = 0;
+    int		    d;
+
+    connSetup = (xConnSetup *) ConnectionInfo;
+    vendor = (char *) connSetup + sizeof (xConnSetup);
+    formats = (xPixmapFormat *) ((char *) vendor +
+				 connSetup->nbytesVendor +
+				 padlength[connSetup->nbytesVendor & 3]);
+    root = (xWindowRoot *) ((char *) formats +
+			    sizeof (xPixmapFormat) * screenInfo.numPixmapFormats);
+    while (screen != pScreen->myNum)
+    {
+	depth = (xDepth *) ((char *) root + 
+			    sizeof (xWindowRoot));
+	for (d = 0; d < root->nDepths; d++)
+	{
+	    visual = (xVisualType *) ((char *) depth +
+				      sizeof (xDepth));
+	    depth = (xDepth *) ((char *) visual +
+				depth->nVisuals * sizeof (xVisualType));
+	}
+	root = (xWindowRoot *) ((char *) depth);
+	screen++;
+    }
+    root->pixWidth = pScreen->width;
+    root->pixHeight = pScreen->height;
+    root->mmWidth = pScreen->mmWidth;
+    root->mmHeight = pScreen->mmHeight;
+}
+
+static void
+RRSendConfigNotify (ScreenPtr pScreen)
+{
+    WindowPtr	pWin = WindowTable[pScreen->myNum];
+    xEvent	event;
+
+    event.u.u.type = ConfigureNotify;
+    event.u.configureNotify.window = pWin->drawable.id;
+    event.u.configureNotify.aboveSibling = None;
+    event.u.configureNotify.x = 0;
+    event.u.configureNotify.y = 0;
+
+    /* XXX xinerama stuff ? */
+    
+    event.u.configureNotify.width = pWin->drawable.width;
+    event.u.configureNotify.height = pWin->drawable.height;
+    event.u.configureNotify.borderWidth = wBorderWidth (pWin);
+    event.u.configureNotify.override = pWin->overrideRedirect;
+    DeliverEvents(pWin, &event, 1, NullWindow);
+}
+
+void
+RRDeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen)
+{
+    rrScrPriv (pScreen);
+    xRRScreenChangeNotifyEvent	se;
+    RRCrtcPtr	crtc = pScrPriv->numCrtcs ? pScrPriv->crtcs[0] : NULL;
+    RROutputPtr	output = pScrPriv->numOutputs ? pScrPriv->outputs[0] : NULL;
+    RRModePtr	mode = crtc ? crtc->mode : NULL;
+    WindowPtr	pRoot = WindowTable[pScreen->myNum];
+    int		i;
+    
+    se.type = RRScreenChangeNotify + RREventBase;
+    se.rotation = (CARD8) (crtc ? crtc->rotation : RR_Rotate_0);
+    se.timestamp = pScrPriv->lastSetTime.milliseconds;
+    se.sequenceNumber = client->sequence;
+    se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+    se.root =  pRoot->drawable.id;
+    se.window = pWin->drawable.id;
+#ifdef RENDER
+    se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
+#else
+    se.subpixelOrder = SubPixelUnknown;
+#endif
+
+    se.sequenceNumber = client->sequence;
+    if (mode) 
+    {
+	se.sizeID = -1;
+	for (i = 0; i < output->numModes; i++)
+	    if (mode == output->modes[i])
+	    {
+		se.sizeID = i;
+		break;
+	    }
+	se.widthInPixels = mode->mode.width;
+	se.heightInPixels = mode->mode.height;
+	se.widthInMillimeters = mode->mode.mmWidth;
+	se.heightInMillimeters = mode->mode.mmHeight;
+    }
+    else
+    {
+	/*
+	 * This "shouldn't happen", but a broken DDX can
+	 * forget to set the current configuration on GetInfo
+	 */
+	se.sizeID = 0xffff;
+	se.widthInPixels = 0;
+	se.heightInPixels = 0;
+	se.widthInMillimeters = 0;
+	se.heightInMillimeters = 0;
+    }    
+    WriteEventsToClient (client, 1, (xEvent *) &se);
+}
+
+/*
+ * Notify the extension that the screen size has been changed.
+ * The driver is responsible for calling this whenever it has changed
+ * the size of the screen
+ */
+void
+RRScreenSizeNotify (ScreenPtr	pScreen)
+{
+    rrScrPriv(pScreen);
+    /*
+     * Deliver ConfigureNotify events when root changes
+     * pixel size
+     */
+    if (pScrPriv->width == pScreen->width &&
+	pScrPriv->height == pScreen->height)
+	return;
+    
+    pScrPriv->width = pScreen->width;
+    pScrPriv->height = pScreen->height;
+    pScrPriv->changed = TRUE;
+
+    RRSendConfigNotify (pScreen);
+    RREditConnectionInfo (pScreen);
+    
+    /*
+     * Fix pointer bounds and location
+     */
+    ScreenRestructured (pScreen);
+}
+
+/*
+ * Request that the screen be resized
+ */
+Bool
+RRScreenSizeSet (ScreenPtr  pScreen,
+		 CARD16	    width,
+		 CARD16	    height,
+		 CARD32	    mmWidth,
+		 CARD32	    mmHeight)
+{
+    rrScrPriv(pScreen);
+
+#if RANDR_12_INTERFACE
+    if (pScrPriv->rrScreenSizeSet)
+    {
+	return (*pScrPriv->rrScreenSizeSet) (pScreen,
+					     width, height,
+					     mmWidth, mmHeight);
+    }
+#endif
+#if RANDR_10_INTERFACE
+    if (pScrPriv->rrSetConfig)
+    {
+	return TRUE;	/* can't set size separately */
+    }
+#endif
+    return FALSE;
+}
+
diff-tree d17fb9672e238a089e463ac74cc4cd3325b67e1f (from 8dec74321d916f204f8182f1b93a65defbe50e78)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sat Sep 16 21:44:42 2006 -0700

    Start moving to new randr 1.2 definition

diff --git a/randr/mirandr.c b/randr/mirandr.c
index e152133..5aea38d 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -34,51 +34,9 @@
 #include "randrstr.h"
 #include <stdio.h>
 
-/*
- * This function assumes that only a single depth can be
- * displayed at a time, but that all visuals of that depth
- * can be displayed simultaneously.  It further assumes that
- * only a single size is available.  Hardware providing
- * additional capabilties should use different code.
- * XXX what to do here....
- */
-
 Bool
 miRRGetInfo (ScreenPtr pScreen, Rotation *rotations)
 {
-    int	i;
-    Bool setConfig = FALSE;
-    RRMonitorPtr pMonitor;
-    
-    pMonitor = RRRegisterMonitor (pScreen, NULL, RR_Rotate_0);
-    for (i = 0; i < pScreen->numDepths; i++)
-    {
-	if (pScreen->allowedDepths[i].numVids)
-	{
-	    xRRMonitorMode		rrMode;
-	    RRModePtr			pMode;
-	    char			name[64];
-
-	    sprintf (name, "%dx%d", pScreen->width, pScreen->height);
-	    memset (&rrMode, '\0', sizeof (rrMode));
-	    rrMode.width = pScreen->width;
-	    rrMode.height = pScreen->height;
-	    rrMode.widthInMillimeters = pScreen->mmWidth;
-	    rrMode.heightInMillimeters = pScreen->mmHeight;
-	    rrMode.nameLength = strlen (name);
-	    pMonitor = RRRegisterMonitor (pScreen, NULL, RR_Rotate_0);
-	    pMode = RRRegisterMode (pMonitor,
-				    &rrMode,
-				    name);
-	    if (!pMode)
-		return FALSE;
-	    if (!setConfig)
-	    {
-		RRSetCurrentMode (pMonitor, pMode, 0, 0, RR_Rotate_0);
-		setConfig = TRUE;
-	    }
-	}
-    }
     return TRUE;
 }
 
@@ -87,26 +45,73 @@ miRRGetInfo (ScreenPtr pScreen, Rotation
  * different here
  */
 Bool
-miRRSetMode (ScreenPtr	pScreen,
-	     int	monitor,
-	     RRModePtr	pMode,
+miRRCrtcSet (ScreenPtr	pScreen,
+	     RRCrtcPtr	crtc,
+	     RRModePtr	mode,
 	     int	x,
 	     int	y,
-	     Rotation	rotation)
+	     Rotation	rotation,
+	     int	numOutput,
+	     RROutputPtr    *outputs)
 {
     return TRUE;
 }
 
+/*
+ * This function assumes that only a single depth can be
+ * displayed at a time, but that all visuals of that depth
+ * can be displayed simultaneously.  It further assumes that
+ * only a single size is available.  Hardware providing
+ * additional capabilties should use different code.
+ * XXX what to do here....
+ */
 
 Bool
 miRandRInit (ScreenPtr pScreen)
 {
-    rrScrPrivPtr    rp;
+    rrScrPrivPtr    pScrPriv;
+    RRModePtr	mode;
+    RRCrtcPtr	crtc;
+    RROutputPtr	output;
+    xRRModeInfo modeInfo;
+    char	name[64];
     
     if (!RRScreenInit (pScreen))
 	return FALSE;
-    rp = rrGetScrPriv(pScreen);
-    rp->rrGetInfo = miRRGetInfo;
-    rp->rrSetMode = miRRSetMode;
+    pScrPriv = rrGetScrPriv(pScreen);
+    pScrPriv->rrGetInfo = miRRGetInfo;
+    pScrPriv->rrCrtcSet = miRRCrtcSet;
+    
+    RRScreenSetSizeRange (pScreen,
+			  pScreen->width, pScreen->height,
+			  pScreen->width, pScreen->height);
+
+    sprintf (name, "%dx%d", pScreen->width, pScreen->height);
+    memset (&modeInfo, '\0', sizeof (modeInfo));
+    modeInfo.width = pScreen->width;
+    modeInfo.height = pScreen->height;
+    modeInfo.mmWidth = pScreen->mmWidth;
+    modeInfo.mmHeight = pScreen->mmHeight;
+    modeInfo.nameLength = strlen (name);
+    
+    mode = RRModeGet (pScreen, &modeInfo, name);
+    if (!mode)
+	return FALSE;
+    
+    crtc = RRCrtcCreate (pScreen, NULL);
+    if (!crtc)
+	return FALSE;
+    
+    output = RROutputCreate (pScreen, "screen", 6, NULL);
+    if (!output)
+	return FALSE;
+    if (!RROutputSet (output, 
+		      NULL, 0,  /* clones */
+		      &mode, 1, /* modes */
+		      &crtc, 1, /* crtcs */
+		      RR_Connected))
+	return FALSE;
+    if (!RRCrtcSet (crtc, mode, 0, 0, RR_Rotate_0, 1, &output))
+	return FALSE;
     return TRUE;
 }
diff --git a/randr/randr.c b/randr/randr.c
index 58d8f17..e34b82c 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -60,6 +60,8 @@
 int	RRGeneration;
 int	RRNScreens;
 
+static RESTYPE	    ModeType, CrtcType, OutputType;
+
 static int ProcRRQueryVersion (ClientPtr pClient);
 static int ProcRRDispatch (ClientPtr pClient);
 static int SProcRRDispatch (ClientPtr pClient);
@@ -160,21 +162,16 @@ static Bool
 RRCloseScreen (int i, ScreenPtr pScreen)
 {
     rrScrPriv(pScreen);
-    RRMonitorPtr    pMonitor;
+    int		    j;
 
     unwrap (pScrPriv, pScreen, CloseScreen);
-    while ((pMonitor = pScrPriv->pMonitors))
-    {
-	RRModePtr   pMode;
-	
-	pScrPriv->pMonitors = pMonitor->next;
-	while ((pMode = pMonitor->pModes))
-	{
-	    pMonitor->pModes = pMode->next;
-	    xfree (pMode);
-	}
-	xfree (pMonitor);
-    }
+    for (j = pScrPriv->numCrtcs - 1; j >= 0; j--)
+	RRCrtcDestroy (pScrPriv->crtcs[j]);
+    for (j = pScrPriv->numOutputs - 1; j >= 0; j--)
+	RROutputDestroy (pScrPriv->outputs[j]);
+    for (j = pScrPriv->numModes - 1; j >= 0; j--)
+	RRModeDestroy (pScrPriv->modes[j]);
+    
     xfree (pScrPriv);
     RRNScreens -= 1;	/* ok, one fewer screen with RandR running */
     return (*pScreen->CloseScreen) (i, pScreen);    
@@ -199,6 +196,7 @@ SRRScreenChangeNotifyEvent(xRRScreenChan
     cpswaps(from->subpixelOrder, to->subpixelOrder);
 }
 
+#if 0
 static void
 SRRMonitorChangeNotifyEvent(xRRMonitorChangeNotifyEvent *from,
 			    xRRMonitorChangeNotifyEvent *to)
@@ -217,30 +215,68 @@ SRRMonitorChangeNotifyEvent(xRRMonitorCh
     cpswaps(from->x, to->x);
     cpswaps(from->y, to->y);
 }
+#endif
 
 static void
 SRRNotifyEvent (xEvent *from,
 		xEvent *to)
 {
     switch (from->u.u.detail) {
+#if 0
     case RRNotify_MonitorChange:
 	SRRMonitorChangeNotifyEvent ((xRRMonitorChangeNotifyEvent *) from,
 				     (xRRMonitorChangeNotifyEvent *) to);
 	break;
+#endif
     default:
 	break;
     }
 }
 
+static int
+RRModeDestroyResource (pointer value, XID pid)
+{
+    RRModeDestroy ((RRModePtr) value);
+    return 1;
+}
+
+static int
+RRCrtcDestroyResource (pointer value, XID pid)
+{
+    RRCrtcDestroy ((RRCrtcPtr) value);
+    return 1;
+}
+
+static int
+RROutputDestroyResource (pointer value, XID pid)
+{
+    RROutputDestroy ((RROutputPtr) value);
+    return 1;
+}
+
 Bool RRScreenInit(ScreenPtr pScreen)
 {
     rrScrPrivPtr   pScrPriv;
 
     if (RRGeneration != serverGeneration)
     {
+	ModeType = CreateNewResourceType (RRModeDestroyResource);
+	if (!ModeType)
+	    return FALSE;
+	CrtcType = CreateNewResourceType (RRCrtcDestroyResource);
+	if (!ModeType)
+	    return FALSE;
+	OutputType = CreateNewResourceType (RROutputDestroyResource);
+	if (!ModeType)
+	    return FALSE;
 	if ((rrPrivIndex = AllocateScreenPrivateIndex()) < 0)
 	    return FALSE;
 	RRGeneration = serverGeneration;
+#ifdef XResExtension
+	RegisterResourceName (ModeType, "MODE");
+	RegisterResourceName (CrtcType, "CRTC");
+	RegisterResourceName (OutputType, "OUTPUT");
+#endif
     }
 
     pScrPriv = (rrScrPrivPtr) xalloc (sizeof (rrScrPrivRec));
@@ -252,10 +288,14 @@ Bool RRScreenInit(ScreenPtr pScreen)
     /*
      * Calling function best set these function vectors
      */
-    pScrPriv->rrSetMode = 0;
+    pScrPriv->rrCrtcSet = 0;
     pScrPriv->rrGetInfo = 0;
+    pScrPriv->maxWidth = pScrPriv->minWidth = pScreen->width;
+    pScrPriv->maxHeight = pScrPriv->minHeight = pScreen->height;
 #ifdef RANDR_SCREEN_INTERFACE    
     pScrPriv->rrSetConfig = 0;
+    pScrPriv->reqWidth = pScreen->width;
+    pScrPriv->reqHeight = pScreen->height;
 #endif
     
     /*
@@ -268,7 +308,12 @@ Bool RRScreenInit(ScreenPtr pScreen)
     
     wrap (pScrPriv, pScreen, CloseScreen, RRCloseScreen);
 
-    pScrPriv->pMonitors = NULL;
+    pScrPriv->numModes = 0;
+    pScrPriv->modes = NULL;
+    pScrPriv->numOutputs = 0;
+    pScrPriv->outputs = NULL;
+    pScrPriv->numCrtcs = 0;
+    pScrPriv->crtcs = NULL;
     
     RRNScreens += 1;	/* keep count of screens that implement randr */
     return TRUE;
@@ -356,18 +401,77 @@ RRExtensionInit (void)
     return;
 }
 		
+static void
+DeliverScreenEvent (ClientPtr client, WindowPtr pWin, ScreenPtr pScreen)
+{
+    rrScrPriv (pScreen);
+    xRRScreenChangeNotifyEvent	se;
+    RRCrtcPtr	crtc = pScrPriv->numCrtcs ? pScrPriv->crtcs[0] : NULL;
+    RROutputPtr	output = pScrPriv->numOutputs ? pScrPriv->outputs[0] : NULL;
+    RRModePtr	mode = crtc ? crtc->mode : NULL;
+    WindowPtr	pRoot = WindowTable[pScreen->myNum];
+    int		i;
+    
+    se.type = RRScreenChangeNotify + RREventBase;
+    se.rotation = (CARD8) (crtc ? crtc->rotation : RR_Rotate_0);
+    se.timestamp = pScrPriv->lastSetTime.milliseconds;
+    se.sequenceNumber = client->sequence;
+    se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+    se.root =  pRoot->drawable.id;
+    se.window = pWin->drawable.id;
+#ifdef RENDER
+    se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
+#else
+    se.subpixelOrder = SubPixelUnknown;
+#endif
+
+    se.sequenceNumber = client->sequence;
+    if (mode) 
+    {
+	se.sizeID = -1;
+	for (i = 0; i < output->numModes; i++)
+	    if (mode == output->modes[i])
+	    {
+		se.sizeID = i;
+		break;
+	    }
+	se.widthInPixels = mode->mode.width;
+	se.heightInPixels = mode->mode.height;
+	se.widthInMillimeters = mode->mode.mmWidth;
+	se.heightInMillimeters = mode->mode.mmHeight;
+    }
+    else
+    {
+	/*
+	 * This "shouldn't happen", but a broken DDX can
+	 * forget to set the current configuration on GetInfo
+	 */
+	se.sizeID = 0xffff;
+	se.widthInPixels = 0;
+	se.heightInPixels = 0;
+	se.widthInMillimeters = 0;
+	se.heightInMillimeters = 0;
+    }    
+    WriteEventsToClient (client, 1, (xEvent *) &se);
+}
+
+static void
+DeliverCrtcEvent (ClientPtr client, WindowPtr pWin, RRCrtcPtr crtc)
+{
+}
+
+static void
+DeliverOutputEvent (ClientPtr client, WindowPtr pWin, RROutputPtr output)
+{
+}
+
 static int
 TellChanged (WindowPtr pWin, pointer value)
 {
     RREventPtr			*pHead, pRREvent;
     ClientPtr			client;
-    xRRScreenChangeNotifyEvent	se;
-    xRRMonitorChangeNotifyEvent	me;
     ScreenPtr			pScreen = pWin->drawable.pScreen;
     rrScrPriv(pScreen);
-    RRModePtr			pMode;
-    RRMonitorPtr		pMonitor;
-    WindowPtr			pRoot = WindowTable[pScreen->myNum];
     int				i;
 
     pHead = (RREventPtr *) LookupIDByType (pWin->drawable.id, EventType);
@@ -380,192 +484,245 @@ TellChanged (WindowPtr pWin, pointer val
 	if (client == serverClient || client->clientGone)
 	    continue;
 
-	if (pRREvent->mask & RRMonitorChangeNotifyMask)
+	if (pRREvent->mask & RRScreenChangeNotifyMask)
+	    DeliverScreenEvent (client, pWin, pScreen);
+	
+	if (pRREvent->mask & RRCrtcChangeNotifyMask)
 	{
-	    me.type = RRNotify + RREventBase;
-	    me.subCode = RRNotify_MonitorChange;
-	    me.timestamp = pScrPriv->lastSetTime.milliseconds;
-	    me.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
-	    me.root =  pRoot->drawable.id;
-	    me.window = pWin->drawable.id;
-#ifdef RENDER
-	    me.subpixelOrder = PictureGetSubpixelOrder (pScreen);
-#else
-	    me.subpixelOrder = SubPixelUnknown;
-#endif
-	    for (pMonitor = pScrPriv->pMonitors, i = 0; 
-		 pMonitor; 
-		 pMonitor = pMonitor->next, i++)
+	    for (i = 0; i < pScrPriv->numCrtcs; i++)
 	    {
-		me.monitor = i;
-		if (pMonitor->pMode) {
-		    me.modeID = pMonitor->pMode->id;
-		    me.rotation = pMonitor->rotation;
-		    me.x = pMonitor->x;
-		    me.y = pMonitor->y;
-		} else {
-		    me.modeID = 0xffff;
-		    me.rotation = RR_Rotate_0;
-		    me.x = 0;
-		    me.y = 0;
-		}
-		WriteEventsToClient (client, 1, (xEvent *) &me);
+		RRCrtcPtr   crtc = pScrPriv->crtcs[i];
+		if (crtc->changed)
+		    DeliverCrtcEvent (client, pWin, crtc);
 	    }
 	}
-	if ((pRREvent->mask & RRScreenChangeNotifyMask) &&
-	    (pMonitor = pScrPriv->pMonitors))
+	
+	if (pRREvent->mask & RROutputChangeNotifyMask)
 	{
-	    se.type = RRScreenChangeNotify + RREventBase;
-	    se.rotation = (CARD8) pMonitor->rotation;
-	    se.timestamp = pScrPriv->lastSetTime.milliseconds;
-	    se.sequenceNumber = client->sequence;
-	    se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
-	    se.root =  pRoot->drawable.id;
-	    se.window = pWin->drawable.id;
-#ifdef RENDER
-	    se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
-#else
-	    se.subpixelOrder = SubPixelUnknown;
-#endif
-
-	    pMonitor = &pScrPriv->pMonitors[0];
-	    se.sequenceNumber = client->sequence;
-	    if (pMonitor->pMode) 
+	    for (i = 0; i < pScrPriv->numOutputs; i++)
 	    {
-		pMode = pMonitor->pMode;
-		se.sizeID = pMode->id;
-		se.widthInPixels = pMode->mode.width;
-		se.heightInPixels = pMode->mode.height;
-		se.widthInMillimeters = pMode->mode.widthInMillimeters;
-		se.heightInMillimeters = pMode->mode.heightInMillimeters;
+		RROutputPtr   output = pScrPriv->outputs[i];
+		if (output->changed)
+		    DeliverOutputEvent (client, pWin, output);
 	    }
-	    else
-	    {
-		/*
-		 * This "shouldn't happen", but a broken DDX can
-		 * forget to set the current configuration on GetInfo
-		 */
-		se.sizeID = 0xffff;
-		se.widthInPixels = 0;
-		se.heightInPixels = 0;
-		se.widthInMillimeters = 0;
-		se.heightInMillimeters = 0;
-	    }    
-	    WriteEventsToClient (client, 1, (xEvent *) &se);
 	}
     }
     return WT_WALKCHILDREN;
 }
 
-static void
-RRFreeMode (RRModePtr pMode)
+void
+RRTellChanged (ScreenPtr pScreen)
 {
-    xfree (pMode);
+    rrScrPriv (pScreen);
+    int i;
+    
+    if (pScrPriv->changed)
+    {
+	UpdateCurrentTime ();
+	pScrPriv->lastConfigTime = currentTime;
+	WalkTree (pScreen, TellChanged, (pointer) pScreen);
+	pScrPriv->changed = FALSE;
+	for (i = 0; i < pScrPriv->numOutputs; i++)
+	    pScrPriv->outputs[i]->changed = FALSE;
+	for (i = 0; i < pScrPriv->numCrtcs; i++)
+	    pScrPriv->crtcs[i]->changed = FALSE;
+    }
 }
 
-static void
-RRFreeModes (RRModePtr pHead)
+RRModePtr
+RRModeGet (ScreenPtr	pScreen,
+	   xRRModeInfo	*modeInfo,
+	   char		*name)
 {
-    RRModePtr	pMode;
-    while ((pMode = pHead)) 
+    rrScrPriv (pScreen);
+    int	i;
+    RRModePtr	mode;
+
+    for (i = 0; i < pScrPriv->numModes; i++)
     {
-	pHead = pMode->next;
-	RRFreeMode (pMode);
-    }
+	mode = pScrPriv->modes[i];
+	if (!memcmp (modeInfo, &mode->mode, sizeof (xRRModeInfo)) &&
+	    !memcmp (name, mode->name, modeInfo->nameLength))
+	{
+	    ++mode->refcnt;
+	    return mode;
+	}
+    }
+    mode = xalloc (sizeof (RRModeRec) + modeInfo->nameLength + 1);
+    mode->refcnt = 1;
+    mode->mode = *modeInfo;
+    mode->name = (char *) (mode + 1);
+    memcpy (mode->name, name, modeInfo->nameLength);
+    mode->name[modeInfo->nameLength] = '\0';
+    mode->id = FakeClientID(0);
+    if (!AddResource (mode->id, ModeType, (pointer) mode))
+	return NULL;
+    ++mode->refcnt;
+    pScrPriv->changed = TRUE;
+    return mode;
 }
 
-static void
-RRFreeMonitor (RRMonitorPtr pMonitor)
+void
+RRModeDestroy (RRModePtr mode)
 {
-    RRFreeModes (pMonitor->pModes);
-    xfree (pMonitor);
+    if (--mode->refcnt > 0)
+	return;
+    xfree (mode);
 }
 
-
-static Bool
-RRGetInfo (ScreenPtr pScreen)
+/*
+ * Return the first output which is connected to an active CRTC
+ * Used in emulating 1.0 behaviour
+ */
+static RROutputPtr
+RRFirstOutput (ScreenPtr pScreen)
 {
-    rrScrPriv (pScreen);
-    Bool	    changed;
-    Rotation	    rotations;
-    RRMonitorPtr    pMonitor, *pPrevMon;
-    RRModePtr	    pMode, *pPrevMode;
-    int		    monitorid;
-
-    for (pMonitor = pScrPriv->pMonitors; pMonitor; pMonitor = pMonitor->next)
+    rrScrPriv(pScreen);
+    RROutputPtr		    output;
+    int	i, j;
+    
+    for (i = 0; i < pScrPriv->numCrtcs; i++)
     {
-	pMonitor->oldReferenced = TRUE;
-	pMonitor->referenced = FALSE;
-	pMonitor->pMode = NULL;
-	for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
+	RRCrtcPtr   crtc = pScrPriv->crtcs[i];
+	for (j = 0; j < pScrPriv->numOutputs; j++)
 	{
-	    pMode->oldReferenced = TRUE;
-	    pMode->referenced = FALSE;
+	    output = pScrPriv->outputs[j];
+	    if (output->crtc == crtc)
+		return output;
 	}
     }
-    rotations = 0;
-    if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
+    return NULL;
+}
+
+#ifdef RANDR_SCREEN_INTERFACE
+
+static Bool
+RROldModeAdd (RROutputPtr output, RRScreenSizePtr size, int refresh)
+{
+    xRRModeInfo	modeInfo;
+    char	name[100];
+    RRModePtr	mode;
+    int		i;
+    RRModePtr   *modes;
+    
+    memset (&modeInfo, '\0', sizeof (modeInfo));
+    sprintf (name, "%dx%d", size->width, size->height);
+    
+    modeInfo.width = size->width;
+    modeInfo.height = size->height;
+    modeInfo.mmWidth = size->mmWidth;
+    modeInfo.mmHeight = size->mmHeight;
+    modeInfo.hTotal = size->width;
+    modeInfo.vTotal = size->height;
+    modeInfo.dotClock = ((CARD32) size->width * (CARD32) size->width *
+			 (CARD32) refresh);
+    modeInfo.nameLength = strlen (name);
+    mode = RRModeGet (output->pScreen, &modeInfo, name);
+    if (!mode)
 	return FALSE;
+    for (i = 0; i < output->numModes; i++)
+	if (output->modes[i] == mode)
+	    return TRUE;
+    
+    if (output->numModes)
+	modes = xrealloc (output->modes, 
+			  (output->numModes + 1) * sizeof (RRModePtr));
+    else
+	modes = xalloc (sizeof (RRModePtr));
+    if (!modes)
+	return FALSE;
+    modes[output->numModes++] = mode;
+    output->modes = modes;
+    output->changed = TRUE;
+    return TRUE;
+}
 
-    changed = FALSE;
+static void
+RRScanOldConfig (ScreenPtr pScreen, Rotation rotations)
+{
+    rrScrPriv(pScreen);
+    RROutputPtr	output = RRFirstOutput (pScreen);
+    RRCrtcPtr	crtc;
+    int		i;
+    CARD16	minWidth = MAXSHORT, minHeight = MAXSHORT;
+    CARD16	maxWidth = 0, maxHeight = 0;
     
-    /* Old GetInfo clients return rotations here */
-    if (rotations && pScrPriv->pMonitors) {
-	/*
-	 * Check whether anything changed and simultaneously generate
-	 * the protocol id values for the objects
-	 */
-	if (rotations != pScrPriv->pMonitors->rotations)
-	{
-	    pScrPriv->pMonitors->rotations = rotations;
-	    changed = TRUE;
-	}
+    if (!output)
+	return;
+    crtc = output->crtc;
+
+    /* check rotations */
+    if (rotations != crtc->rotations)
+    {
+        crtc->rotations = rotations;
+	crtc->changed = TRUE;
+	pScrPriv->changed = TRUE;
     }
 	
-    /*
-     * Walk monitor and mode lists looking for updates
-     */
-    monitorid = 0;
-    for (pPrevMon = &pScrPriv->pMonitors; (pMonitor = *pPrevMon);)
+    /* regenerate mode list */
+    for (i = 0; i < pScrPriv->nSizes; i++)
     {
-	int modeid = 0;
-	
-	if (pMonitor->referenced)
-	{
-	    pMonitor->id = monitorid++;
-	    if (!pMonitor->oldReferenced)
-		changed = TRUE;
-	    for (pPrevMode = &pMonitor->pModes; (pMode = *pPrevMode);)
-	    {
-		if (pMode->referenced)
-		{
-		    pMode->id = modeid++;
-		    if (!pMode->oldReferenced)
-			changed = TRUE;
-		    pPrevMode = &pMode->next;
-		}
-		else
-		{
-		    *pPrevMode = pMode->next;
-		    changed = TRUE;
-		    RRFreeMode (pMode);
-		}
-	    }
-	    pPrevMon = &pMonitor->next;
-	}
+	RRScreenSizePtr	size = &pScrPriv->pSizes[i];
+	int		r;
+
+	if (size->nRates)
+	    for (r = 0; r < size->nRates; r++)
+		RROldModeAdd (output, size, size->pRates[r].rate);
 	else
-	{
-	    *pPrevMon = pMonitor->next;
-	    changed = TRUE;
-	    RRFreeMonitor (pMonitor);
-	}
+	    RROldModeAdd (output, size, 0);
     }
-    if (changed)
-    {
-	UpdateCurrentTime ();
-	pScrPriv->lastConfigTime = currentTime;
-	WalkTree (pScreen, TellChanged, (pointer) pScreen);
+	    
+    /* find size bounds */
+    for (i = 0; i < output->numModes; i++) 
+    {
+	RRModePtr   mode = output->modes[i];
+        CARD16	    width = mode->mode.width;
+        CARD16	    height = mode->mode.height;
+	
+	if (width < minWidth) minWidth = width;
+	if (width > maxWidth) maxWidth = width;
+	if (height < minHeight) minHeight = height;
+	if (height > maxHeight) maxHeight = height;
+    }
+
+    if (minWidth != pScrPriv->minWidth) {
+	pScrPriv->minWidth = minWidth; pScrPriv->changed = TRUE;
     }
+    if (maxWidth != pScrPriv->maxWidth) {
+	pScrPriv->maxWidth = maxWidth; pScrPriv->changed = TRUE;
+    }
+    if (minHeight != pScrPriv->minHeight) {
+	pScrPriv->minHeight = minHeight; pScrPriv->changed = TRUE;
+    }
+    if (maxHeight != pScrPriv->maxHeight) {
+	pScrPriv->maxHeight = maxHeight; pScrPriv->changed = TRUE;
+    }
+}
+#endif
+
+static Bool
+RRGetInfo (ScreenPtr pScreen)
+{
+    rrScrPriv (pScreen);
+    Rotation	    rotations;
+    int		    i;
+
+    for (i = 0; i < pScrPriv->numOutputs; i++)
+	pScrPriv->outputs[i]->changed = FALSE;
+    for (i = 0; i < pScrPriv->numCrtcs; i++)
+	pScrPriv->crtcs[i]->changed = FALSE;
+    
+    rotations = 0;
+    pScrPriv->changed = FALSE;
+    
+    if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
+	return FALSE;
+
+#if RANDR_SCREEN_INTERFACE
+    if (pScrPriv->nSizes)
+	RRScanOldConfig (pScreen, rotations);
+#endif
+    RRTellChanged (pScreen);
     return TRUE;
 }
 
@@ -664,17 +821,6 @@ RREditConnectionInfo (ScreenPtr pScreen)
     root->mmHeight = pScreen->mmHeight;
 }
 
-static int
-RRNumModes (RRMonitorPtr pMonitor)
-{
-    int	n = 0;
-    RRModePtr	pMode;
-
-    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
-	n++;
-    return n;
-}
-
 typedef struct _RR10Data {
     RRScreenSizePtr sizes;
     int		    nsize;
@@ -684,7 +830,7 @@ typedef struct _RR10Data {
 } RR10DataRec, *RR10DataPtr;
 
 static CARD16
-RRVerticalRefresh (xRRMonitorMode *mode)
+RRVerticalRefresh (xRRModeInfo *mode)
 {
     CARD32  refresh;
     if (!mode->hTotal || !mode->vTotal)
@@ -699,61 +845,61 @@ RRVerticalRefresh (xRRMonitorMode *mode)
  * Convert 1.2 monitor data into 1.0 screen data
  */
 static RR10DataPtr
-RR10GetData (ScreenPtr pScreen, RRMonitorPtr pMonitor)
+RR10GetData (ScreenPtr pScreen, RROutputPtr output)
 {
     RR10DataPtr	    data;
     RRScreenSizePtr size;
-    int		    nmode = RRNumModes (pMonitor);
-    int		    i;
-    int		    j;
-    RRRefreshPtr    refresh;
+    int		    nmode = output->numModes;
+    int		    i, j, k;
+    RRScreenRatePtr refresh;
     CARD16	    vRefresh;
-    RRModePtr	    pMode;
+    RRModePtr	    mode;
 
     /* Make sure there is plenty of space for any combination */
     data = malloc (sizeof (RR10DataRec) + 
-		   sizeof (RRScreenSizeRec) * nmode + 
-		   sizeof (RRRefreshRec) * nmode);
+		   sizeof (RRScreenSize) * nmode + 
+		   sizeof (RRScreenRate) * nmode);
     if (!data)
 	return NULL;
     size = (RRScreenSizePtr) (data + 1);
-    refresh = (RRRefreshPtr) (size + nmode);
+    refresh = (RRScreenRatePtr) (size + nmode);
     data->sizes = size;
     data->nsize = 0;
     data->nrefresh = 0;
     data->size = 0;
     data->refresh = 0;
-    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
+    for (i = 0; i < output->numModes; i++)
     {
-	for (i = 0; i < data->nsize; i++)
-	    if (pMode->mode.width == size[i].width &&
-		pMode->mode.height == size[i].height)
+	mode = output->modes[i];
+	for (j = 0; j < data->nsize; j++)
+	    if (mode->mode.width == size[j].width &&
+		mode->mode.height == size[j].height)
 		break;
-	if (i == data->nsize)
+	if (j == data->nsize)
 	{
-	    size[i].id = i;
-	    size[i].width = pMode->mode.width;
-	    size[i].height = pMode->mode.height;
-	    size[i].mmWidth = pMode->mode.widthInMillimeters;
-	    size[i].mmHeight = pMode->mode.heightInMillimeters;
-	    size[i].nrefresh = 0;
-	    size[i].refresh = &refresh[data->nrefresh];
+	    size[j].id = j;
+	    size[j].width = mode->mode.width;
+	    size[j].height = mode->mode.height;
+	    size[j].mmWidth = mode->mode.mmWidth;
+	    size[j].mmHeight = mode->mode.mmHeight;
+	    size[j].nRates = 0;
+	    size[j].pRates = &refresh[data->nrefresh];
 	    data->nsize++;
 	}
-	vRefresh = RRVerticalRefresh (&pMode->mode);
-	for (j = 0; j < size[i].nrefresh; j++)
-	    if (vRefresh == size[i].refresh[j].refresh)
+	vRefresh = RRVerticalRefresh (&mode->mode);
+	for (k = 0; k < size[j].nRates; k++)
+	    if (vRefresh == size[j].pRates[k].rate)
 		break;
-	if (j == size[i].nrefresh)
+	if (k == size[j].nRates)
 	{
-	    size[i].refresh[j].refresh = vRefresh;
-	    size[i].refresh[j].pMode = pMode;
-	    size[i].nrefresh++;
+	    size[j].pRates[k].rate = vRefresh;
+	    size[j].pRates[k].mode = mode;
+	    size[j].nRates++;
 	    data->nrefresh++;
 	}
-	if (pMode == pMonitor->pMode)
+	if (mode == output->crtc->mode)
 	{
-	    data->size = i;
+	    data->size = j;
 	    data->refresh = vRefresh;
 	}
     }
@@ -771,6 +917,7 @@ ProcRRGetScreenInfo (ClientPtr client)
     rrScrPrivPtr	    pScrPriv;
     CARD8		    *extra;
     unsigned long	    extraLen;
+    RROutputPtr		    output;
 
     REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
     pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
@@ -786,7 +933,9 @@ ProcRRGetScreenInfo (ClientPtr client)
     if (pScrPriv)
 	RRGetInfo (pScreen);
 
-    if (!pScrPriv && !pScrPriv->pMonitors)
+    output = RRFirstOutput (pScreen);
+    
+    if (!pScrPriv || !output)
     {
 	rep.type = X_Reply;
 	rep.setOfRotations = RR_Rotate_0;;
@@ -805,7 +954,6 @@ ProcRRGetScreenInfo (ClientPtr client)
     }
     else
     {
-	RRMonitorPtr		pMonitor = pScrPriv->pMonitors;
 	int			i, j;
 	xScreenSizes		*size;
 	CARD16			*rates;
@@ -814,18 +962,18 @@ ProcRRGetScreenInfo (ClientPtr client)
 	RR10DataPtr		pData;
 	RRScreenSizePtr		pSize;
     
-	pData = RR10GetData (pScreen, pMonitor);
+	pData = RR10GetData (pScreen, output);
 	if (!pData)
 	    return BadAlloc;
 	
 	rep.type = X_Reply;
-	rep.setOfRotations = pMonitor->rotations;
+	rep.setOfRotations = output->crtc->rotations;
 	rep.sequenceNumber = client->sequence;
 	rep.length = 0;
 	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
 	rep.timestamp = pScrPriv->lastSetTime.milliseconds;
 	rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
-	rep.rotation = pMonitor->rotation;
+	rep.rotation = output->crtc->rotation;
 	rep.nSizes = pData->nsize;
         rep.nrateEnts = pData->nrefresh + pData->nsize;
 	rep.sizeID = pData->size;
@@ -862,15 +1010,15 @@ ProcRRGetScreenInfo (ClientPtr client)
 	    size++;
 	    if (has_rate)
 	    {
-		*rates = pSize->nrefresh;
+		*rates = pSize->nRates;
 		if (client->swapped)
 		{
 		    swaps (rates, n);
 		}
 		rates++;
-		for (j = 0; j < pSize->nrefresh; j++)
+		for (j = 0; j < pSize->nRates; j++)
 		{
-		    *rates = pSize->refresh[j].refresh;
+		    *rates = pSize->pRates[j].rate;
 		    if (client->swapped)
 		    {
 			swaps (rates, n);
@@ -907,6 +1055,7 @@ ProcRRGetScreenInfo (ClientPtr client)
     return (client->noClientException);
 }
 
+#if 0
 static int
 RRMonitorSetMode (ScreenPtr pScreen, RRMonitorPtr pMonitor, 
 		  RRModePtr pMode, int x, int y, Rotation rotation,
@@ -997,6 +1146,7 @@ RRMonitorSetMode (ScreenPtr pScreen, RRM
     pScrPriv->lastSetTime = time;
     return RRSetConfigSuccess;
 }
+#endif
 
 static int
 ProcRRSetScreenConfig (ClientPtr client)
@@ -1013,8 +1163,8 @@ ProcRRSetScreenConfig (ClientPtr client)
     Rotation		    rotation;
     int			    rate;
     Bool		    has_rate;
-    RRMonitorPtr	    pMonitor;
-    RRModePtr		    pMode;
+    RROutputPtr		    output;
+    RRModePtr		    mode;
     RR10DataPtr		    pData = NULL;
     RRScreenSizePtr    	    pSize;
     
@@ -1050,8 +1200,8 @@ ProcRRSetScreenConfig (ClientPtr client)
     if (!RRGetInfo (pScreen))
 	return BadAlloc;
     
-    pMonitor = pScrPriv->pMonitors;
-    if (!pMonitor)
+    output = RRFirstOutput (pScreen);
+    if (!output)
     {
 	time = currentTime;
 	rep.status = RRSetConfigFailed;
@@ -1069,7 +1219,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	goto sendReply;
     }
     
-    pData = RR10GetData (pScreen, pMonitor);
+    pData = RR10GetData (pScreen, output);
     if (!pData)
 	return BadAlloc;
     
@@ -1105,7 +1255,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	return BadValue;
     }
 
-    if ((~pMonitor->rotations) & rotation)
+    if ((~output->crtc->rotations) & rotation)
     {
 	/*
 	 * requested rotation or reflection not supported by screen
@@ -1125,12 +1275,12 @@ ProcRRSetScreenConfig (ClientPtr client)
 
     if (rate)
     {
-	for (i = 0; i < pSize->nrefresh; i++)
+	for (i = 0; i < pSize->nRates; i++)
 	{
-	    if (pSize->refresh[i].refresh == rate)
+	    if (pSize->pRates[i].rate == rate)
 		break;
 	}
-	if (i == pSize->nrefresh)
+	if (i == pSize->nRates)
 	{
 	    /*
 	     * Invalid rate
@@ -1139,10 +1289,10 @@ ProcRRSetScreenConfig (ClientPtr client)
 	    xfree (pData);
 	    return BadValue;
 	}
-	pMode = pSize->refresh[i].pMode;
+	mode = pSize->pRates[i].mode;
     }
     else
-	pMode = pSize->refresh[0].pMode;
+	mode = pSize->pRates[0].mode;
     
     /*
      * Make sure the requested set-time is not older than
@@ -1154,7 +1304,8 @@ ProcRRSetScreenConfig (ClientPtr client)
 	goto sendReply;
     }
 
-    rep.status = RRMonitorSetMode (pScreen, pMonitor, pMode, 0, 0, rotation, time);
+    rep.status = RRCrtcSet (output->crtc, mode, 0, 0, stuff->rotation,
+			    1, &output);
     
 sendReply:
     
@@ -1183,6 +1334,7 @@ sendReply:
     return (client->noClientException);
 }
 
+#if 0
 int
 RRSetScreenConfig (ScreenPtr		pScreen,
 		   Rotation		rotation,
@@ -1252,10 +1404,42 @@ RRSetScreenConfig (ScreenPtr		pScreen,
     
     status = RRMonitorSetMode (pScreen, pMonitor, pMode, 0, 0, 
 			       rotation, currentTime);
+    
     if (status != RRSetConfigSuccess)
 	return BadImplementation;
     return Success;
 }
+#endif
+
+static Bool
+RRSetScreenSize (ScreenPtr pScreen,
+		 CARD16 width, CARD16 height,
+		 CARD16 widthInMillimeters, CARD16 heightInMillimeters)
+{
+    rrScrPriv(pScreen);
+    
+    if (pScrPriv->rrScreenSetSize) 
+    {
+	return (*pScrPriv->rrScreenSetSize) (pScreen, width, height,
+					     widthInMillimeters,
+					     heightInMillimeters);
+    }
+#ifdef RANDR_SCREEN_INTERFACE
+    else
+    {
+	/* Pend the size change until we get the set mode request.
+	 * Yes, this is 'illegal', but the best we can do until
+	 * drivers are updated
+	 */
+	pScrPriv->reqWidth = width;
+	pScrPriv->reqHeight = height;
+	pScreen->mmWidth = widthInMillimeters;
+	pScreen->mmHeight = heightInMillimeters;
+	return TRUE;
+    }
+#endif
+    return FALSE;
+}
 
 static int
 ProcRRSelectInput (ClientPtr client)
@@ -1264,7 +1448,7 @@ ProcRRSelectInput (ClientPtr client)
     rrClientPriv(client);
     RRTimesPtr	pTimes;
     WindowPtr	pWin;
-    RREventPtr	pRREvent, pNewRREvent, *pHead;
+    RREventPtr	pRREvent, *pHead;
     XID		clientResource;
 
     REQUEST_SIZE_MATCH(xRRSelectInputReq);
@@ -1275,58 +1459,64 @@ ProcRRSelectInput (ClientPtr client)
 						 pWin->drawable.id, EventType,
 						 SecurityWriteAccess);
 
-    if (stuff->enable & (RRScreenChangeNotifyMask)) 
+    if (stuff->enable & (RRScreenChangeNotifyMask|
+			 RRCrtcChangeNotifyMask|
+			 RROutputChangeNotifyMask)) 
     {
 	ScreenPtr	pScreen = pWin->drawable.pScreen;
 	rrScrPriv	(pScreen);
 
+	pRREvent = NULL;
 	if (pHead) 
 	{
 	    /* check for existing entry. */
 	    for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next)
 		if (pRREvent->client == client)
-		    return Success;
+		    break;
 	}
 
-	/* build the entry */
-	pNewRREvent = (RREventPtr) xalloc (sizeof (RREventRec));
-	if (!pNewRREvent)
-	    return BadAlloc;
-	pNewRREvent->next = 0;
-	pNewRREvent->client = client;
-	pNewRREvent->window = pWin;
-	pNewRREvent->mask = stuff->enable;
-	/*
-	 * add a resource that will be deleted when
-	 * the client goes away
-	 */
-	clientResource = FakeClientID (client->index);
-	pNewRREvent->clientResource = clientResource;
-	if (!AddResource (clientResource, ClientType, (pointer)pNewRREvent))
-	    return BadAlloc;
-	/*
-	 * create a resource to contain a pointer to the list
-	 * of clients selecting input.  This must be indirect as
-	 * the list may be arbitrarily rearranged which cannot be
-	 * done through the resource database.
-	 */
-	if (!pHead)
+	if (!pRREvent)
 	{
-	    pHead = (RREventPtr *) xalloc (sizeof (RREventPtr));
-	    if (!pHead ||
-		!AddResource (pWin->drawable.id, EventType, (pointer)pHead))
-	    {
-		FreeResource (clientResource, RT_NONE);
+	    /* build the entry */
+	    pRREvent = (RREventPtr) xalloc (sizeof (RREventRec));
+	    if (!pRREvent)
+		return BadAlloc;
+	    pRREvent->next = 0;
+	    pRREvent->client = client;
+	    pRREvent->window = pWin;
+	    pRREvent->mask = stuff->enable;
+	    /*
+	     * add a resource that will be deleted when
+	     * the client goes away
+	     */
+	    clientResource = FakeClientID (client->index);
+	    pRREvent->clientResource = clientResource;
+	    if (!AddResource (clientResource, ClientType, (pointer)pRREvent))
 		return BadAlloc;
+	    /*
+	     * create a resource to contain a pointer to the list
+	     * of clients selecting input.  This must be indirect as
+	     * the list may be arbitrarily rearranged which cannot be
+	     * done through the resource database.
+	     */
+	    if (!pHead)
+	    {
+		pHead = (RREventPtr *) xalloc (sizeof (RREventPtr));
+		if (!pHead ||
+		    !AddResource (pWin->drawable.id, EventType, (pointer)pHead))
+		{
+		    FreeResource (clientResource, RT_NONE);
+		    return BadAlloc;
+		}
+		*pHead = 0;
 	    }
-	    *pHead = 0;
+	    pRREvent->next = *pHead;
+	    *pHead = pRREvent;
 	}
-	pNewRREvent->next = *pHead;
-	*pHead = pNewRREvent;
 	/*
 	 * Now see if the client needs an event
 	 */
-	if (pScrPriv)
+	if (pScrPriv && (pRREvent->mask & RRScreenChangeNotifyMask))
 	{
 	    pTimes = &((RRTimesPtr) (pRRClient + 1))[pScreen->myNum];
 	    if (CompareTimeStamps (pTimes->setTime, 
@@ -1334,15 +1524,15 @@ ProcRRSelectInput (ClientPtr client)
 		CompareTimeStamps (pTimes->configTime, 
 				   pScrPriv->lastConfigTime) != 0)
 	    {
-		TellChanged (pWin, (pointer) pScreen);
+		DeliverScreenEvent (client, pWin, pScreen);
 	    }
 	}
     }
-    else if (stuff->enable == xFalse) 
+    else if (stuff->enable == 0) 
     {
 	/* delete the interest */
 	if (pHead) {
-	    pNewRREvent = 0;
+	    RREventPtr pNewRREvent = 0;
 	    for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next) {
 		if (pRREvent->client == client)
 		    break;
@@ -1366,36 +1556,340 @@ ProcRRSelectInput (ClientPtr client)
     return Success;
 }
 
-
-static int ProcRRGetScreenSizeRange (ClientPtr pClient)
+/*
+ * Retrieve valid screen size range
+ */
+static int ProcRRGetScreenSizeRange (ClientPtr client)
 {
-    return BadImplementation;
+    REQUEST(xRRGetScreenSizeRangeReq);
+    xRRGetScreenSizeRangeReply	rep;
+    WindowPtr			pWin;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    
+    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    
+    rep.type = X_Reply;
+    rep.pad = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.length = 0;
+    
+    if (pScrPriv) 
+    {
+	RRGetInfo (pScreen);
+	rep.minWidth  = pScrPriv->minWidth;
+	rep.minHeight = pScrPriv->minHeight;
+	rep.maxWidth  = pScrPriv->maxWidth;
+	rep.maxHeight = pScrPriv->maxHeight;
+    }
+    else
+    {
+	rep.maxWidth  = rep.minWidth  = pScreen->width;
+	rep.maxHeight = rep.minHeight = pScreen->height;
+    }
+    if (client->swapped) 
+    {
+	int n;
+	
+    	swaps(&rep.sequenceNumber, n);
+    	swapl(&rep.length, n);
+	swaps(&rep.minWidth, n);
+	swaps(&rep.minHeight, n);
+	swaps(&rep.maxWidth, n);
+	swaps(&rep.maxHeight, n);
+    }
+    WriteToClient(client, sizeof(xRRGetScreenSizeRangeReply), (char *)&rep);
+    return (client->noClientException);
 }
 
-static int ProcRRSetScreenSize (ClientPtr pClient)
+static int ProcRRSetScreenSize (ClientPtr client)
 {
-    return BadImplementation;
+    REQUEST(xRRSetScreenSizeReq);
+    WindowPtr		pWin;
+    ScreenPtr		pScreen;
+    rrScrPrivPtr	pScrPriv;
+    RRCrtcPtr		crtc;
+    int			i;
+    
+    REQUEST_SIZE_MATCH(xRRSetScreenSizeReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    if (stuff->width < pScrPriv->minWidth || pScrPriv->maxWidth < stuff->width)
+    {
+	client->errorValue = stuff->width;
+	return BadValue;
+    }
+    if (stuff->height < pScrPriv->minHeight || 
+	pScrPriv->maxHeight < stuff->height)
+    {
+	client->errorValue = stuff->height;
+	return BadValue;
+    }
+    for (i = 0; i < pScrPriv->numCrtcs; i++) {
+	crtc = pScrPriv->crtcs[i];
+	if (crtc->mode &&
+	    (crtc->x + crtc->mode->mode.width > stuff->width ||
+	     crtc->y + crtc->mode->mode.height > stuff->height))
+	    return BadMatch;
+    }
+    if (stuff->widthInMillimeters == 0 || stuff->heightInMillimeters == 0)
+    {
+	client->errorValue = 0;
+	return BadValue;
+    }
+    if (!RRSetScreenSize (pScreen, 
+			  stuff->width, stuff->height,
+			  stuff->widthInMillimeters,
+			  stuff->heightInMillimeters))
+    {
+	return BadMatch;
+    }
+    return Success;
 }
 
-static int ProcRRGetMonitorInfo (ClientPtr pClient)
+#if 0
+static int ProcRRGetMonitorInfo (ClientPtr client)
 {
-    return BadImplementation;
+    REQUEST(xRRGetMonitorInfoReq);
+    xRRGetMonitorInfoReply	rep;
+    WindowPtr			pWin;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    RRMonitorPtr		pMonitor;
+    RRModePtr			pMode;
+    int				extraLen;
+    CARD8			*extra;
+    xRRMonitorInfo		*monitor;
+    xRRMonitorMode		*mode;
+    CARD8			*names;
+    
+    REQUEST_SIZE_MATCH(xRRGetScreenInfoReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    rep.type = X_Reply;
+    rep.pad = 0;
+    rep.sequenceNumber = client->sequence;
+    rep.numMonitors = 0;
+    rep.numModes = 0;
+    rep.sizeNames = 0;
+    if (!pScrPriv)
+    {
+	extraLen = 0;
+	extra = NULL;
+    }
+    else
+    {
+	int i, m, b;
+	for (pMonitor = pScrPriv->pMonitors; pMonitor; pMonitor = pMonitor->next)
+	{
+	    rep.numMonitors++;
+	    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
+	    {
+		rep.numModes++;
+		rep.sizeNames += (1 + pMode->mode.nameLength);
+	    }
+	}
+	extraLen = (rep.numMonitors * sizeof (xRRMonitorInfo) +
+		    rep.numModes * sizeof (xRRMonitorMode) +
+		    rep.sizeNames + 3) & ~3;
+	extra = (CARD8 *) xalloc (extraLen);
+	if (!extra)
+	    return BadAlloc;
+	monitor = (xRRMonitorInfo *) extra;
+	mode = (xRRMonitorMode *) (monitor + rep.numMonitors);
+	names = (CARD8 *) (mode + rep.numModes);
+	i = 0;
+	m = 0;
+	b = 0;
+	for (pMonitor = pScrPriv->pMonitors; pMonitor; pMonitor = pMonitor->next)
+	{
+	    monitor[i].timestamp = pScrPriv->lastSetTime;
+	    monitor[i].configTimestamp = pScrPriv->lastConfigTime;
+	    monitor[i].x = pMonitor->x;
+	    monitor[i].y = pMonitor->y;
+	    monitor[i].rotation = pMonitor->rotation;
+	    monitor[i].mode = pMonitor->pMode->id;
+	    monitor[i].defaultMode = 0;	/* XXX */
+	    monitor[i].rotations = pMonitor->rotations;
+	    monitor[i].firstMode = m;
+	    monitor[i].numModes = 0;
+	    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
+	    {
+		monitor[i].numModes++;
+		mode[m] = pMode->mode;
+		names[b] = pMode->mode.nameLength;
+		b++;
+		memcpy (names + b, (char *) (pMode + 1), 
+			pMode->mode.nameLength);
+		b += pMode->mode.nameLength;
+		m++;
+	    }
+	    i++;
+	}
+	if ((char *) (names + ((b + 3) & ~3)) != (char *) extra + extraLen)
+	    FatalError ("RRGetMonitorInfo length mismatch\n");
+    }
+    rep.length = extraLen >> 2;
+    
+    WriteToClient(client, sizeof(xRRGetMonitorInfoReply), (char *)&rep);
+    if (extraLen)
+    {
+	WriteToClient (client, extraLen, (char *) extra);
+	xfree (extra);
+    }
+    
+    if (extra)
+	xfree (extra);
+    return (client->noClientException);
 }
 
-static int ProcRRAddMonitorMode (ClientPtr pClient)
+static int ProcRRAddMonitorMode (ClientPtr client)
 {
     return BadImplementation;
 }
 
-static int ProcRRDeleteMonitorMode (ClientPtr pClient)
+static int ProcRRDeleteMonitorMode (ClientPtr client)
 {
     return BadImplementation;
 }
 
-static int ProcRRSetMonitorConfig (ClientPtr pClient)
+static int ProcRRSetMonitorConfig (ClientPtr client)
 {
-    return BadImplementation;
+    REQUEST(xRRSetMonitorConfigReq);
+    xRRSetMonitorConfigReply	rep;
+    WindowPtr			pWin;
+    ScreenPtr			pScreen;
+    rrScrPrivPtr		pScrPriv;
+    RRMonitorPtr		pMonitor;
+    RRModePtr			pMode;
+    TimeStamp		    configTime;
+    TimeStamp		    time;
+    Rotation		    rotation;
+    
+    REQUEST_SIZE_MATCH(xRRSetScreenConfigReq);
+    pWin = (WindowPtr)SecurityLookupWindow(stuff->window, client,
+					   SecurityReadAccess);
+
+    if (!pWin)
+	return BadWindow;
+
+    pScreen = pWin->drawable.pScreen;
+    pScrPriv = rrGetScrPriv(pScreen);
+    
+    time = ClientTimeToServerTime(stuff->timestamp);
+    configTime = ClientTimeToServerTime(stuff->configTimestamp);
+    
+    if (!pScrPriv)
+    {
+	time = currentTime;
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    if (!RRGetInfo (pScreen))
+	return BadAlloc;
+    
+    /*
+     * if the client's config timestamp is not the same as the last config
+     * timestamp, then the config information isn't up-to-date and
+     * can't even be validated
+     */
+    if (CompareTimeStamps (configTime, pScrPriv->lastConfigTime) != 0)
+    {
+	rep.status = RRSetConfigInvalidConfigTime;
+	goto sendReply;
+    }
+    
+    for (pMonitor = pScrPriv->pMonitors; pMonitor; pMonitor = pMonitor->next)
+    {
+	if (pMonitor->id == stuff->monitorIndex)
+	    break;
+    }
+    if (!pMonitor)
+    {
+	client->errorValue = stuff->monitorIndex;
+	return BadValue;
+    }
+    
+    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
+    {
+	if (pMode->id == stuff->modeIndex)
+	    break;
+    }
+    if (!pMode)
+    {
+	client->errorValue = stuff->modeIndex;
+	return BadValue;
+    }
+    
+    /*
+     * Validate requested rotation
+     */
+    rotation = (Rotation) stuff->rotation;
+
+    /* test the rotation bits only! */
+    switch (rotation & 0xf) {
+    case RR_Rotate_0:
+    case RR_Rotate_90:
+    case RR_Rotate_180:
+    case RR_Rotate_270:
+	break;
+    default:
+	/*
+	 * Invalid rotation
+	 */
+	client->errorValue = stuff->rotation;
+	return BadValue;
+    }
+
+    if ((~pMonitor->rotations) & rotation)
+    {
+	/*
+	 * requested rotation or reflection not supported by screen
+	 */
+	client->errorValue = stuff->rotation;
+	return BadMatch;
+    }
+
+    if (stuff->x + pMode->mode.width > pScreen->width)
+    {
+	client->errorValue = stufff
+	stuff->y + pMode->mode.height > pScreen
+    /*
+     * Make sure the requested set-time is not older than
+     * the last set-time
+     */
+    if (CompareTimeStamps (time, pScrPriv->lastSetTime) < 0)
+    {
+	rep.status = RRSetConfigInvalidTime;
+	goto sendReply;
+    }
+
+    rep.status = RRMonitorSetMode (pScreen, pMonitor, 
+				   pMode, stuff->x, stuff->y, rotation, time);
+    
+    return client->noClientException;
 }
+#endif
 
 int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
     ProcRRQueryVersion,	/* 0 */
@@ -1408,12 +1902,14 @@ int (*ProcRandrVector[RRNumberRequests])
     ProcRRSelectInput,		/* 4 */
     ProcRRGetScreenInfo,    	/* 5 */
 /* V1.2 additions */
+#if 0
     ProcRRGetScreenSizeRange,	/* 6 */
     ProcRRSetScreenSize,	/* 7 */
     ProcRRGetMonitorInfo,	/* 8 */
     ProcRRAddMonitorMode,	/* 9 */
     ProcRRDeleteMonitorMode,	/* 10 */
     ProcRRSetMonitorConfig,	/* 11 */
+#endif
 };
 
 
@@ -1505,113 +2001,42 @@ SProcRRDispatch (ClientPtr client)
 }
 
 /*
- * Register a monitor for a screen. identifier is a unique identifier
- * for the monitors of a particular screen.
+ * Register the range of sizes for the screen
  */
-RRMonitorPtr
-RRRegisterMonitor (ScreenPtr		pScreen,
-		   void			*identifier,
-		   Rotation		rotations)
+void
+RRScreenSetSizeRange (ScreenPtr	pScreen,
+		      CARD16	minWidth,
+		      CARD16	minHeight,
+		      CARD16	maxWidth,
+		      CARD16	maxHeight)
 {
     rrScrPriv (pScreen);
-    RRMonitorPtr    pMonitor, *pPrev, *pInsert;
 
-    pInsert = NULL;
-    for (pPrev = &pScrPriv->pMonitors; (pMonitor = *pPrev); 
-	 pPrev = &(pMonitor)->next)
-    {
-	if (pMonitor->identifier == identifier) 
-	{
-	    pMonitor->referenced = TRUE;
-	    return pMonitor;
-	}
-	if (!pMonitor->referenced)
-	    pInsert = pPrev;
-    }
-    if (!pInsert)
-	pInsert = pPrev;
-    
-    /*
-     * New monitor, add before the first unreferenced monitor
-     */
-    pMonitor = xalloc (sizeof (RRMonitor));
-    if (!pMonitor)
-	return NULL;
-    pMonitor->pScreen = pScreen;
-    pMonitor->pModes = NULL;
-    pMonitor->identifier = identifier;
-    pMonitor->referenced = TRUE;
-    pMonitor->oldReferenced = FALSE;
-    pMonitor->rotations = RR_Rotate_0;
-    
-    pMonitor->pMode = NULL;
-    pMonitor->x = 0;
-    pMonitor->y = 0;
-    pMonitor->rotation = RR_Rotate_0;
-    pMonitor->next = *pInsert;
-    *pInsert = pMonitor;
-    return pMonitor;
+    if (!pScrPriv)
+	return;
+    pScrPriv->minWidth  = minWidth;
+    pScrPriv->minHeight = minHeight;
+    pScrPriv->maxWidth  = maxWidth;
+    pScrPriv->maxHeight = maxHeight;
 }
 
-/*
- * Register a mode for a monitor
- */
+#ifdef RANDR_SCREEN_INTERFACE
 
-RRModePtr
-RRRegisterMode (RRMonitorPtr	pMonitor,
-		xRRMonitorMode	*pModeline,
-		char		*name)
+static Bool
+RRScreenSizeMatches (RRScreenSizePtr  a,
+		   RRScreenSizePtr  b)
 {
-    RRModePtr	pMode, *pPrev, *pInsert = NULL;
-
-    /*
-     * Find existing mode with same modeline and name
-     */
-    for (pPrev = &pMonitor->pModes; (pMode = *pPrev); pPrev = &(pMode->next))
-    {
-	if (!memcmp (&pMode->mode, pModeline, sizeof (xRRMonitorMode)) &&
-	    pMode->mode.nameLength == pModeline->nameLength &&
-	    !memcmp (RRModeName(pMode), name, pModeline->nameLength))
-	{
-	    pMode->referenced = TRUE;
-	    return pMode;
-	}
-	if (!pMode->referenced)
-	    pInsert = pPrev;
-    }
-
-    if (!pInsert)
-	pInsert = pPrev;
-    
-    /*
-     * Create a new mode, inserting before the first unreferenced mode
-     */
-    pMode = xalloc (sizeof (RRMode) + pModeline->nameLength + 1);
-    pMode->referenced = TRUE;
-    pMode->oldReferenced = FALSE;
-    pMode->mode = *pModeline;
-    memcpy (RRModeName (pMode), name, pModeline->nameLength);
-    RRModeName(pMode)[pModeline->nameLength] = '\0';
-    pMode->next = *pInsert;
-    *pInsert = pMode;
-    return pMode;
-}
-
-void
-RRSetCurrentMode (RRMonitorPtr	pMonitor,
-		  RRModePtr	pMode,
-		  int		x,
-		  int		y,
-		  Rotation	rotation)
-{
-    pMonitor->pMode = pMode;
-    pMonitor->x = x;
-    pMonitor->y = y;
-    pMonitor->rotation = rotation;
+    if (a->width != b->width)
+	return FALSE;
+    if (a->height != b->height)
+	return FALSE;
+    if (a->mmWidth != b->mmWidth)
+	return FALSE;
+    if (a->mmHeight != b->mmHeight)
+	return FALSE;
+    return TRUE;
 }
 
-#ifdef RANDR_SCREEN_INTERFACE
-
 RRScreenSizePtr
 RRRegisterSize (ScreenPtr	    pScreen,
 		short		    width, 
@@ -1620,50 +2045,29 @@ RRRegisterSize (ScreenPtr	    pScreen,
 		short		    mmHeight)
 {
     rrScrPriv (pScreen);
-    xRRMonitorMode  tmp;
-    RRMonitorPtr    pMonitor;
-    RRModePtr	    pMode, *pPrev;
-    char	    name[100];
+    int		    i;
+    RRScreenSize    tmp;
+    RRScreenSizePtr pNew;
 
     if (!pScrPriv)
-	return NULL;
-    pMonitor = pScrPriv->pMonitors;
-    if (!pMonitor)
-    {
-	pMonitor = RRRegisterMonitor (pScreen, NULL, RR_Rotate_0);
-	if (!pMonitor)
-	    return NULL;
-    }
-    pMonitor->referenced = TRUE;
-    
-    for (pPrev = &pMonitor->pModes; (pMode = *pPrev); pPrev = &(pMode->next))
-	if (pMode->mode.width == width &&
-	    pMode->mode.height == height &&
-	    pMode->mode.widthInMillimeters == mmWidth &&
-	    pMode->mode.heightInMillimeters == mmHeight)
-	{
-	    pMode->referenced =TRUE;
-	    return (void *) pMode;
-	}
-    memset (&tmp, '\0', sizeof (xRRMonitorMode));
-    memset (name, '\0', sizeof (name));
-    sprintf (name, "%dx%d", width, height);
+	return 0;
+    
     tmp.width = width;
     tmp.height= height;
-    tmp.widthInMillimeters = mmWidth;
-    tmp.heightInMillimeters = mmHeight;
-    tmp.nameLength = strlen (name) + 10;    /* leave space for refresh */
-    pMode = RRRegisterMode (pMonitor, &tmp, name);
-    return (void *) pMode;
-}
-
-static Bool
-RRModesMatchSize (RRModePtr a, RRModePtr b)
-{
-    return (a->mode.width == a->mode.width &&
-	    a->mode.height == b->mode.height &&
-	    a->mode.widthInMillimeters == b->mode.widthInMillimeters &&
-	    a->mode.heightInMillimeters == b->mode.heightInMillimeters);
+    tmp.mmWidth = mmWidth;
+    tmp.mmHeight = mmHeight;
+    tmp.pRates = 0;
+    tmp.nRates = 0;
+    for (i = 0; i < pScrPriv->nSizes; i++)
+	if (RRScreenSizeMatches (&tmp, &pScrPriv->pSizes[i]))
+	    return &pScrPriv->pSizes[i];
+    pNew = xrealloc (pScrPriv->pSizes,
+		     (pScrPriv->nSizes + 1) * sizeof (RRScreenSize));
+    if (!pNew)
+	return 0;
+    pNew[pScrPriv->nSizes++] = tmp;
+    pScrPriv->pSizes = pNew;
+    return &pNew[pScrPriv->nSizes-1];
 }
 
 Bool RRRegisterRate (ScreenPtr		pScreen,
@@ -1671,77 +2075,35 @@ Bool RRRegisterRate (ScreenPtr		pScreen,
 		     int		rate)
 {
     rrScrPriv(pScreen);
-    RRMonitorPtr    pMonitor;
-    RRModePtr	    pSizeMode = (RRModePtr) pSize;
-    RRModePtr	    pMode, *pPrev;
-    CARD16	    width = pSizeMode->mode.width;
-    CARD16	    height = pSizeMode->mode.height;
-    char	    name[100];
-    xRRMonitorMode  modeLine;
+    int		    i;
+    RRScreenRatePtr pNew, pRate;
 
     if (!pScrPriv)
 	return FALSE;
     
-    pMonitor = pScrPriv->pMonitors;
-    if (!pMonitor)
-	return FALSE;
-
-    for (pPrev = &pMonitor->pModes; (pMode = *pPrev); pPrev = &pMode->next)
-    {
-	if (RRModesMatchSize (pMode, pSizeMode))
-	{
-	    if (pMode->mode.dotClock == 0)
-	    {
-		/*
-		 * First refresh for this size; reprogram this mode
-		 * with the right refresh.
-		 */
-		pMode->mode.hSyncStart = width;
-		pMode->mode.hSyncEnd = width;
-		pMode->mode.hTotal = width;
-		pMode->mode.hSkew = 0;
-		pMode->mode.vSyncStart = height;
-		pMode->mode.vSyncEnd = height;
-		pMode->mode.vTotal = height;
-		pMode->mode.dotClock = width * height * rate;
-		sprintf ((char *) (pMode + 1), "%dx%d@%d", width, height, rate);
-		pMode->mode.modeFlags = 0;
-		pMode->mode.nameLength = strlen ((char *) (pMode + 1));
-		pMode->referenced = TRUE;
-		return TRUE;
-	    }
-	    else if (rate == RRVerticalRefresh (&pMode->mode))
-	    {
-		pMode->referenced = TRUE;
-		return TRUE;
-	    }
-	}
-    }
-    
-    sprintf (name, "%dx%d@%d", pSizeMode->mode.width, pSizeMode->mode.height,
-	     rate);
-    modeLine = pSizeMode->mode;
-    modeLine.dotClock = rate * modeLine.vTotal * modeLine.hTotal;
-    modeLine.nameLength = strlen (name);
-    pMode = RRRegisterMode (pMonitor, &modeLine, name);
-    if (!pMode)
+    for (i = 0; i < pSize->nRates; i++)
+	if (pSize->pRates[i].rate == rate)
+	    return TRUE;
+
+    pNew = xrealloc (pSize->pRates,
+		     (pSize->nRates + 1) * sizeof (RRScreenRate));
+    if (!pNew)
 	return FALSE;
+    pRate = &pNew[pSize->nRates++];
+    pRate->rate = rate;
+    pSize->pRates = pNew;
     return TRUE;
 }
 
 Rotation
 RRGetRotation(ScreenPtr pScreen)
 {
-    rrScrPriv (pScreen);
-    RRMonitorPtr    pMonitor;
+    RROutputPtr	output = RRFirstOutput (pScreen);
 
-    if (!pScrPriv)
+    if (!output)
 	return RR_Rotate_0;
 
-    pMonitor = pScrPriv->pMonitors;
-    if (!pMonitor)
-	return RR_Rotate_0;
-    return pMonitor->rotation;
+    return output->crtc->rotation;
 }
 
 void
@@ -1751,25 +2113,11 @@ RRSetCurrentConfig (ScreenPtr		pScreen,
 		    RRScreenSizePtr	pSize)
 {
     rrScrPriv (pScreen);
-    RRMonitorPtr    pMonitor;
-    RRModePtr	    pMode;
-    RRModePtr	    pSizeMode = (RRModePtr) pSize;
 
     if (!pScrPriv)
 	return;
-    pMonitor = pScrPriv->pMonitors;
-    if (!pMonitor)
-	return;
-
-    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
-    {
-	if (RRModesMatchSize (pMode, pSizeMode) && 
-	    RRVerticalRefresh (&pMode->mode) == rate)
-	    break;
-    }
-    if (!pMode)
-	return;
-    
-    RRSetCurrentMode (pMonitor, pMode, 0, 0, rotation);
+    pScrPriv->size = pSize - pScrPriv->pSizes;
+    pScrPriv->rotation = rotation;
+    pScrPriv->rate = rate;
 }
 #endif
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 3610274..1694523 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -34,71 +34,94 @@
 
 #include <X11/extensions/randrproto.h>
 
+/* required for ABI compatibility for now */
 #define RANDR_SCREEN_INTERFACE 1
 
+typedef XID	RRMode;
+typedef XID	RROutput;
+typedef XID	RRCrtc;
+
 /*
  * Modeline for a monitor. Name follows directly after this struct
  */
 
 #define RRModeName(pMode) ((char *) (pMode + 1))
+typedef struct _rrMode	    RRModeRec, *RRModePtr;
+typedef struct _rrCrtc	    RRCrtcRec, *RRCrtcPtr;
+typedef struct _rrOutput    RROutputRec, *RROutputPtr;
+
+struct _rrMode {
+    RRMode	    id;
+    int		    refcnt;
+    xRRModeInfo	    mode;
+    char	    *name;
+};
 
-typedef struct _rrMode {
-    struct _rrMode  *next;
-    Bool	    referenced;
-    Bool	    oldReferenced;
-    int		    id;
-    xRRMonitorMode  mode;
-} RRMode, *RRModePtr;
-
-typedef struct _rrMonitor {
-    struct _rrMonitor	*next;
+struct _rrCrtc {
+    RRCrtc	    id;
     ScreenPtr	    pScreen;
-    RRModePtr	    pModes;
-    void	    *identifier;    /* made unique by DDX */
-    int		    id;		    /* index in list of monitors */
-    Bool	    referenced;
-    Bool	    oldReferenced;
-    Rotation	    rotations;
-    
-    /*
-     * Current state
-     */
-    RRModePtr	    pMode;
+    RRModePtr	    mode;
     int		    x, y;
     Rotation	    rotation;
-} RRMonitor, *RRMonitorPtr;
+    Rotation	    rotations;
+    int		    numPossibleOutputs;
+    RROutputPtr	    *possibleOutputs;
+    Bool	    changed;
+    void	    *devPrivate;
+};
+
+struct _rrOutput {
+    RROutput	    id;
+    ScreenPtr	    pScreen;
+    char	    *name;
+    int		    nameLength;
+    CARD8	    connection;
+    CARD8	    subpixelOrder;
+    RRCrtcPtr	    crtc;
+    int		    numCrtcs;
+    RRCrtcPtr	    *crtcs;
+    int		    numClones;
+    RROutputPtr	    *outputs;
+    int		    numModes;
+    RRModePtr	    *modes;
+    Bool	    changed;
+    void	    *devPrivate;
+};
 
-typedef Bool (*RRSetScreenSizeProcPtr) (ScreenPtr	pScreen,
+typedef Bool (*RRScreenSetSizeProcPtr) (ScreenPtr	pScreen,
 					CARD16		width,
 					CARD16		height,
 					CARD32		widthInMM,
 					CARD32		heightInMM);
 					
-typedef Bool (*RRSetModeProcPtr) (ScreenPtr		pScreen,
-				  int			monitor,
-				  RRModePtr		pMode,
+typedef Bool (*RRCrtcSetProcPtr) (ScreenPtr		pScreen,
+				  RRCrtcPtr		crtc,
+				  RRModePtr		mode,
 				  int			x,
 				  int			y,
-				  Rotation		rotation);
+				  Rotation		rotation,
+				  int			numOutput,
+				  RROutputPtr		*outputs);
 
 typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations);
 typedef Bool (*RRCloseScreenProcPtr) ( int i, ScreenPtr pscreen);
 
-
-#ifdef RANDR_SCREEN_INTERFACE
-
+/* These are for 1.0 compatibility */
+ 
 typedef struct _rrRefresh {
-    CARD16	    refresh;
-    RRModePtr	    pMode;
-} RRRefreshRec, *RRRefreshPtr;
+    CARD16	    rate;
+    RRModePtr	    mode;
+} RRScreenRate, *RRScreenRatePtr;
 
 typedef struct _rrScreenSize {
     int		    id;
     short	    width, height;
     short	    mmWidth, mmHeight;
-    int		    nrefresh;
-    RRRefreshPtr    refresh;
-} RRScreenSizeRec, *RRScreenSizePtr;
+    int		    nRates;
+    RRScreenRatePtr pRates;
+} RRScreenSize, *RRScreenSizePtr;
+
+#ifdef RANDR_SCREEN_INTERFACE
 
 typedef Bool (*RRSetConfigProcPtr) (ScreenPtr		pScreen,
 				    Rotation		rotation,
@@ -117,8 +140,8 @@ typedef struct _rrScrPriv {
     RRSetConfigProcPtr	    rrSetConfig;
 #endif
     RRGetInfoProcPtr	    rrGetInfo;
-    RRSetScreenSizeProcPtr  rrSetScreenSize;
-    RRSetModeProcPtr	    rrSetMode;
+    RRScreenSetSizeProcPtr  rrScreenSetSize;
+    RRCrtcSetProcPtr	    rrCrtcSet;
     
     /*
      * Private part of the structure; not considered part of the ABI
@@ -126,20 +149,34 @@ typedef struct _rrScrPriv {
     TimeStamp		    lastSetTime;	/* last changed by client */
     TimeStamp		    lastConfigTime;	/* possible configs changed */
     RRCloseScreenProcPtr    CloseScreen;
+    Bool		    changed;
+    CARD16		    minWidth, minHeight;
+    CARD16		    maxWidth, maxHeight;
+
+    /* modes, outputs and crtcs */
+    int			    numModes;
+    RRModePtr		    *modes;
 
-    /*
-     * monitor data
-     */
-    RRMonitorPtr	    pMonitors;
+    int			    numOutputs;
+    RROutputPtr		    *outputs;
+
+    int			    numCrtcs;
+    RRCrtcPtr		    *crtcs;
 
 #ifdef RANDR_SCREEN_INTERFACE
     /*
      * Configuration information
      */
     Rotation		    rotations;
+    CARD16		    reqWidth, reqHeight;
     
-
+    int			    nSizes;
+    RRScreenSizePtr	    pSizes;
+    
+    RRScreenSizePtr	    pSize;
     Rotation		    rotation;
+    int			    rate;
+    int			    size;
 #endif
 } rrScrPrivRec, *rrScrPrivPtr;
 
@@ -154,33 +191,91 @@ void
 RRExtensionInit (void);
 
 /*
- * Then, register a monitor with the screen
+ * Set the range of sizes for the screen
+ */
+void
+RRScreenSetSizeRange (ScreenPtr	pScreen,
+		      CARD16	minWidth,
+		      CARD16	minHeight,
+		      CARD16	maxWidth,
+		      CARD16	maxHeight);
+
+/*
+ * Create a CRTC
+ */
+RRCrtcPtr
+RRCrtcCreate (ScreenPtr	pScreen,
+	      void	*devPrivate);
+
+
+/*
+ * Use this value for any num parameter to indicate that
+ * the related data are unchanged
  */
+#define RR_NUM_UNCHANGED    -1
 
-RRMonitorPtr
-RRRegisterMonitor (ScreenPtr		pScreen,
-		   void			*identifier,
-		   Rotation		rotations);
+/*
+ * Notify the extension that the Crtc has been reconfigured
+ */
+Bool
+RRCrtcSet (RRCrtcPtr	crtc,
+	   RRModePtr	mode,
+	   int		x,
+	   int		y,
+	   Rotation	rotation,
+	   int		numOutput,
+	   RROutputPtr	*outputs);
+
+/*
+ * Destroy a Crtc at shutdown
+ */
+void
+RRCrtcDestroy (RRCrtcPtr crtc);
 
 /*
- * Next, register the list of modes with the monitor
+ * Find, and if necessary, create a mode
  */
 
 RRModePtr
-RRRegisterMode (RRMonitorPtr	pMonitor,
-		xRRMonitorMode	*pMode,
-		char		*name);
+RRModeGet (ScreenPtr	pScreen,
+	   xRRModeInfo	*modeInfo,
+	   char		*name);
 
 /*
- * Finally, set the current configuration of each monitor
+ * Destroy a mode.
  */
 
 void
-RRSetCurrentMode (RRMonitorPtr	pMonitor,
-		  RRModePtr	pMode,
-		  int		x,
-		  int		y,
-		  Rotation	rotation);
+RRModeDestroy (RRModePtr mode);
+
+/*
+ * Create an output
+ */
+
+RROutputPtr
+RROutputCreate (ScreenPtr   pScreen,
+		char	    *name,
+		int	    nameLength,
+		void	    *devPrivate);
+
+/*
+ * Notify extension that output parameters have been changed
+ */
+Bool
+RROutputSet (RROutputPtr    output,
+	     RROutputPtr    *clones,
+	     int	    numClones,
+	     RRModePtr	    *modes,
+	     int	    numModes,
+	     RRCrtcPtr	    *crtcs,
+	     int	    numCrtcs,
+	     CARD8	    connection);
+
+void
+RROutputDestroy (RROutputPtr	output);
+
+void
+RRTellChanged (ScreenPtr pScreen);
 
 Bool RRScreenInit(ScreenPtr pScreen);
 
@@ -197,12 +292,14 @@ Bool
 miRRGetScreenInfo (ScreenPtr pScreen);
 
 Bool
-miRRSetMode (ScreenPtr	pScreen,
-	     int	monitor,
-	     RRModePtr	pMode,
+miRRCrtcSet (ScreenPtr	pScreen,
+	     RRCrtcPtr	crtc,
+	     RRModePtr	mode,
 	     int	x,
 	     int	y,
-	     Rotation	rotation);
+	     Rotation	rotation,
+	     int	numOutput,
+	     RROutputPtr    *outputs);
 
 #ifdef RANDR_SCREEN_INTERFACE					
 /*
@@ -225,9 +322,6 @@ Bool RRRegisterRate (ScreenPtr		pScreen,
 		     RRScreenSizePtr	pSize,
 		     int		rate);
 
-Bool RRRegisterRotation (ScreenPtr	pScreen,
-			 Rotation	rotation);
-
 /*
  * Finally, set the current configuration of the screen
  */
@@ -238,17 +332,16 @@ RRSetCurrentConfig (ScreenPtr		pScreen,
 		    int			rate,
 		    RRScreenSizePtr	pSize);
 
+Bool RRScreenInit (ScreenPtr pScreen);
+
+Rotation
+RRGetRotation (ScreenPtr pScreen);
+
 int
 RRSetScreenConfig (ScreenPtr		pScreen,
 		   Rotation		rotation,
 		   int			rate,
 		   RRScreenSizePtr	pSize);
 
-Bool
-miRRSetConfig (ScreenPtr	pScreen,
-	       Rotation		rotation,
-	       int		rate,
-	       RRScreenSizePtr	size);
-
 #endif					
 #endif /* _RANDRSTR_H_ */
diff-tree 8dec74321d916f204f8182f1b93a65defbe50e78 (from cab3a0145f2483fe43b5db5f5dd2076db9757fe5)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Mon Jul 17 14:43:07 2006 -0400

    Successful legacy RandR API/Protocol emulation for query.
    
    These changes clean up minor errors to make it possible to list the
    available modes for a monitor using legacy APIs in both the X server DDX and
    RandR protocol. Setting modes is untested, so it probably doesn't work.

diff --git a/randr/randr.c b/randr/randr.c
index 4a5cd4e..58d8f17 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -542,6 +542,7 @@ RRGetInfo (ScreenPtr pScreen)
 		    pMode->id = modeid++;
 		    if (!pMode->oldReferenced)
 			changed = TRUE;
+		    pPrevMode = &pMode->next;
 		}
 		else
 		{
@@ -550,6 +551,7 @@ RRGetInfo (ScreenPtr pScreen)
 		    RRFreeMode (pMode);
 		}
 	    }
+	    pPrevMon = &pMonitor->next;
 	}
 	else
 	{
@@ -716,6 +718,7 @@ RR10GetData (ScreenPtr pScreen, RRMonito
 	return NULL;
     size = (RRScreenSizePtr) (data + 1);
     refresh = (RRRefreshPtr) (size + nmode);
+    data->sizes = size;
     data->nsize = 0;
     data->nrefresh = 0;
     data->size = 0;
@@ -728,6 +731,7 @@ RR10GetData (ScreenPtr pScreen, RRMonito
 		break;
 	if (i == data->nsize)
 	{
+	    size[i].id = i;
 	    size[i].width = pMode->mode.width;
 	    size[i].height = pMode->mode.height;
 	    size[i].mmWidth = pMode->mode.widthInMillimeters;
@@ -823,7 +827,7 @@ ProcRRGetScreenInfo (ClientPtr client)
 	rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
 	rep.rotation = pMonitor->rotation;
 	rep.nSizes = pData->nsize;
-        rep.nrateEnts = pData->nrefresh;
+        rep.nrateEnts = pData->nrefresh + pData->nsize;
 	rep.sizeID = pData->size;
 	rep.rate = pData->refresh;
 
@@ -904,6 +908,97 @@ ProcRRGetScreenInfo (ClientPtr client)
 }
 
 static int
+RRMonitorSetMode (ScreenPtr pScreen, RRMonitorPtr pMonitor, 
+		  RRModePtr pMode, int x, int y, Rotation rotation,
+		  TimeStamp time)
+{
+    rrScrPriv(pScreen);
+    short   oldWidth, oldHeight;
+    
+    oldWidth = pScreen->width;
+    oldHeight = pScreen->height;
+    
+    /*
+     * call out to ddx routine to effect the change
+     */
+    if (pScrPriv->rrSetScreenSize && pScrPriv->rrSetMode)
+    {
+	xScreenSizes	oldSize;
+	if (!(*pScrPriv->rrSetMode) (pScreen, 0, NULL, 0, 0, RR_Rotate_0))
+	    return RRSetConfigFailed;
+	oldSize.widthInPixels = pScreen->width;
+	oldSize.heightInPixels = pScreen->width;
+	oldSize.widthInMillimeters = pScreen->mmWidth;
+	oldSize.heightInMillimeters = pScreen->mmHeight;
+	if (!(*pScrPriv->rrSetScreenSize) (pScreen,
+					   pMode->mode.width,
+					   pMode->mode.height,
+					   pMode->mode.widthInMillimeters,
+					   pMode->mode.heightInMillimeters))
+	{
+	    (void) (*pScrPriv->rrSetMode) (pScreen, 0, pMonitor->pMode,
+					   pMonitor->x, pMonitor->y,
+					   pMonitor->rotation);
+	    return RRSetConfigFailed;
+	}
+	if (!(*pScrPriv->rrSetMode) (pScreen, 0, pMode, 0, 0, rotation))
+	{
+	    (void) (*pScrPriv->rrSetScreenSize) (pScreen,
+						 oldSize.widthInPixels,
+						 oldSize.heightInPixels,
+						 oldSize.widthInMillimeters,
+						 oldSize.heightInMillimeters);
+	    (void) (*pScrPriv->rrSetMode) (pScreen, 0, pMonitor->pMode,
+					   pMonitor->x, pMonitor->y,
+					   pMonitor->rotation);
+	    return RRSetConfigFailed;
+	}
+    }
+#ifdef RANDR_SCREEN_INTERFACE
+    else if (pScrPriv->rrSetConfig)
+    {
+	int rate = RRVerticalRefresh (&pMode->mode);
+	RRScreenSizeRec	size;
+
+	size.width = pMode->mode.width;
+	size.height = pMode->mode.height;
+	size.mmWidth = pMode->mode.widthInMillimeters;
+	size.mmHeight = pMode->mode.heightInMillimeters;
+	if (!(*pScrPriv->rrSetConfig) (pScreen, rotation, rate, &size))
+	    return RRSetConfigFailed;
+    }
+#endif
+    else
+	return RRSetConfigFailed;
+    
+    /*
+     * set current extension configuration pointers
+     */
+    RRSetCurrentMode (pMonitor, pMode, 0, 0, rotation);
+    
+    /*
+     * Deliver ScreenChangeNotify events whenever
+     * the configuration is updated
+     */
+    WalkTree (pScreen, TellChanged, (pointer) pScreen);
+    
+    /*
+     * Deliver ConfigureNotify events when root changes
+     * pixel size
+     */
+    if (oldWidth != pScreen->width || oldHeight != pScreen->height)
+	RRSendConfigNotify (pScreen);
+    RREditConnectionInfo (pScreen);
+    
+    /*
+     * Fix pointer bounds and location
+     */
+    ScreenRestructured (pScreen);
+    pScrPriv->lastSetTime = time;
+    return RRSetConfigSuccess;
+}
+
+static int
 ProcRRSetScreenConfig (ClientPtr client)
 {
     REQUEST(xRRSetScreenConfigReq);
@@ -917,7 +1012,6 @@ ProcRRSetScreenConfig (ClientPtr client)
     int			    i;
     Rotation		    rotation;
     int			    rate;
-    short		    oldWidth, oldHeight;
     Bool		    has_rate;
     RRMonitorPtr	    pMonitor;
     RRModePtr		    pMode;
@@ -947,9 +1041,6 @@ ProcRRSetScreenConfig (ClientPtr client)
     time = ClientTimeToServerTime(stuff->timestamp);
     configTime = ClientTimeToServerTime(stuff->configTimestamp);
     
-    oldWidth = pScreen->width;
-    oldHeight = pScreen->height;
-    
     if (!pScrPriv)
     {
 	time = currentTime;
@@ -1063,90 +1154,7 @@ ProcRRSetScreenConfig (ClientPtr client)
 	goto sendReply;
     }
 
-    /*
-     * call out to ddx routine to effect the change
-     */
-    if (pScrPriv->rrSetScreenSize && pScrPriv->rrSetMode)
-    {
-	xScreenSizes	oldSize;
-	if (!(*pScrPriv->rrSetMode) (pScreen, 0, NULL, 0, 0, RR_Rotate_0))
-	    goto fail;
-	oldSize.widthInPixels = pScreen->width;
-	oldSize.heightInPixels = pScreen->width;
-	oldSize.widthInMillimeters = pScreen->mmWidth;
-	oldSize.heightInMillimeters = pScreen->mmHeight;
-	if (!(*pScrPriv->rrSetScreenSize) (pScreen,
-					   pMode->mode.width,
-					   pMode->mode.height,
-					   pMode->mode.widthInMillimeters,
-					   pMode->mode.heightInMillimeters))
-	{
-	    (void) (*pScrPriv->rrSetMode) (pScreen, 0, pMonitor->pMode,
-					   pMonitor->x, pMonitor->y,
-					   pMonitor->rotation);
-	    goto fail;
-	}
-	if (!(*pScrPriv->rrSetMode) (pScreen, 0, pMode, 0, 0, rotation))
-	{
-	    (void) (*pScrPriv->rrSetScreenSize) (pScreen,
-						 oldSize.widthInPixels,
-						 oldSize.heightInPixels,
-						 oldSize.widthInMillimeters,
-						 oldSize.heightInMillimeters);
-	    (void) (*pScrPriv->rrSetMode) (pScreen, 0, pMonitor->pMode,
-					   pMonitor->x, pMonitor->y,
-					   pMonitor->rotation);
-	    goto fail;
-	}
-    }
-#ifdef RANDR_SCREEN_INTERFACE
-    else if (pScrPriv->rrSetConfig)
-    {
-	if (!(*pScrPriv->rrSetConfig) (pScreen, rotation, rate, pSize))
-	{
-	    goto fail;
-	}
-    }
-#endif
-    else
-    {
-fail:	;
-	/*
-	 * unknown DDX failure, report to client
-	 */
-	rep.status = RRSetConfigFailed;
-	goto sendReply;
-    }
-    
-    /*
-     * set current extension configuration pointers
-     */
-    RRSetCurrentMode (pMonitor, pMode, 0, 0, rotation);
-    
-    /*
-     * Deliver ScreenChangeNotify events whenever
-     * the configuration is updated
-     */
-    WalkTree (pScreen, TellChanged, (pointer) pScreen);
-    
-    /*
-     * Deliver ConfigureNotify events when root changes
-     * pixel size
-     */
-    if (oldWidth != pScreen->width || oldHeight != pScreen->height)
-	RRSendConfigNotify (pScreen);
-    RREditConnectionInfo (pScreen);
-    
-    /*
-     * Fix pointer bounds and location
-     */
-    ScreenRestructured (pScreen);
-    pScrPriv->lastSetTime = time;
-    
-    /*
-     * Report Success
-     */
-    rep.status = RRSetConfigSuccess;
+    rep.status = RRMonitorSetMode (pScreen, pMonitor, pMode, 0, 0, rotation, time);
     
 sendReply:
     
@@ -1182,11 +1190,20 @@ RRSetScreenConfig (ScreenPtr		pScreen,
 		   RRScreenSizePtr	pSize)
 {
     rrScrPrivPtr	    pScrPriv;
-    int			    i;
+    RRMonitorPtr	    pMonitor;
     short		    oldWidth, oldHeight;
+    RRModePtr		    pMode;
+    int			    status;
 
     pScrPriv = rrGetScrPriv(pScreen);
     
+    if (!pScrPriv)
+	return BadImplementation;
+    
+    pMonitor = pScrPriv->pMonitors;
+    if (!pMonitor)
+	return BadImplementation;
+
     oldWidth = pScreen->width;
     oldHeight = pScreen->height;
     
@@ -1219,61 +1236,24 @@ RRSetScreenConfig (ScreenPtr		pScreen,
 	return BadMatch;
     }
 
-    /*
-     * Validate requested refresh
-     */
-    if (rate)
+    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
     {
-	for (i = 0; i < pSize->nRates; i++)
-	{
-	    RRScreenRatePtr pRate = &pSize->pRates[i];
-	    if (pRate->referenced && pRate->rate == rate)
-		break;
-	}
-	if (i == pSize->nRates)
+	if (pMode->mode.width == pSize->width &&
+	    pMode->mode.height == pSize->height &&
+	    pMode->mode.widthInMillimeters == pSize->mmWidth &&
+	    pMode->mode.heightInMillimeters == pSize->mmHeight &&
+	    (RRVerticalRefresh (&pMode->mode) == rate || rate == 0))
 	{
-	    /*
-	     * Invalid rate
-	     */
-	    return BadValue;
+	    break;
 	}
     }
-
-    /*
-     * call out to ddx routine to effect the change
-     */
-    if (!(*pScrPriv->rrSetConfig) (pScreen, rotation, rate,
-				   pSize))
-    {
-	/*
-	 * unknown DDX failure, report to client
-	 */
-        return BadImplementation;
-    }
-    
-    /*
-     * set current extension configuration pointers
-     */
-    RRSetCurrentMode (pMonitor, pMode, 0, 0, rotation);
-    
-    /*
-     * Deliver ScreenChangeNotify events whenever
-     * the configuration is updated
-     */
-    WalkTree (pScreen, TellChanged, (pointer) pScreen);
-    
-    /*
-     * Deliver ConfigureNotify events when root changes
-     * pixel size
-     */
-    if (oldWidth != pScreen->width || oldHeight != pScreen->height)
-	RRSendConfigNotify (pScreen);
-    RREditConnectionInfo (pScreen);
+    if (!pMode)
+	return BadValue;
     
-    /*
-     * Fix pointer bounds and location
-     */
-    ScreenRestructured (pScreen);
+    status = RRMonitorSetMode (pScreen, pMonitor, pMode, 0, 0, 
+			       rotation, currentTime);
+    if (status != RRSetConfigSuccess)
+	return BadImplementation;
     return Success;
 }
 
@@ -1387,23 +1367,63 @@ ProcRRSelectInput (ClientPtr client)
 }
 
 
+static int ProcRRGetScreenSizeRange (ClientPtr pClient)
+{
+    return BadImplementation;
+}
+
+static int ProcRRSetScreenSize (ClientPtr pClient)
+{
+    return BadImplementation;
+}
+
+static int ProcRRGetMonitorInfo (ClientPtr pClient)
+{
+    return BadImplementation;
+}
+
+static int ProcRRAddMonitorMode (ClientPtr pClient)
+{
+    return BadImplementation;
+}
+
+static int ProcRRDeleteMonitorMode (ClientPtr pClient)
+{
+    return BadImplementation;
+}
+
+static int ProcRRSetMonitorConfig (ClientPtr pClient)
+{
+    return BadImplementation;
+}
+
+int (*ProcRandrVector[RRNumberRequests])(ClientPtr) = {
+    ProcRRQueryVersion,	/* 0 */
+/* we skip 1 to make old clients fail pretty immediately */
+    NULL,			/* 1 ProcRandrOldGetScreenInfo */
+/* V1.0 apps share the same set screen config request id */
+    ProcRRSetScreenConfig,	/* 2 */
+    NULL,			/* 3 ProcRandrOldScreenChangeSelectInput */
+/* 3 used to be ScreenChangeSelectInput; deprecated */
+    ProcRRSelectInput,		/* 4 */
+    ProcRRGetScreenInfo,    	/* 5 */
+/* V1.2 additions */
+    ProcRRGetScreenSizeRange,	/* 6 */
+    ProcRRSetScreenSize,	/* 7 */
+    ProcRRGetMonitorInfo,	/* 8 */
+    ProcRRAddMonitorMode,	/* 9 */
+    ProcRRDeleteMonitorMode,	/* 10 */
+    ProcRRSetMonitorConfig,	/* 11 */
+};
+
+
 static int
 ProcRRDispatch (ClientPtr client)
 {
     REQUEST(xReq);
-    switch (stuff->data)
-    {
-    case X_RRQueryVersion:
-	return ProcRRQueryVersion(client);
-    case X_RRSetScreenConfig:
-        return ProcRRSetScreenConfig(client);
-    case X_RRSelectInput:
-        return ProcRRSelectInput(client);
-    case X_RRGetScreenInfo:
-        return ProcRRGetScreenInfo(client);
-    default:
+    if (stuff->data >= RRNumberRequests || !ProcRandrVector[stuff->data])
 	return BadRequest;
-    }
+    return (*ProcRandrVector[stuff->data]) (client);
 }
 
 static int
@@ -1609,7 +1629,12 @@ RRRegisterSize (ScreenPtr	    pScreen,
 	return NULL;
     pMonitor = pScrPriv->pMonitors;
     if (!pMonitor)
-	return NULL;
+    {
+	pMonitor = RRRegisterMonitor (pScreen, NULL, RR_Rotate_0);
+	if (!pMonitor)
+	    return NULL;
+    }
+    pMonitor->referenced = TRUE;
     
     for (pPrev = &pMonitor->pModes; (pMode = *pPrev); pPrev = &(pMode->next))
 	if (pMode->mode.width == width &&
diff-tree cab3a0145f2483fe43b5db5f5dd2076db9757fe5 (from d95c758630f4aacec339a7ec80d2c4a9d7de1e4a)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Mon Jul 17 01:21:11 2006 -0400

    RandR: New data structure, old API. At least it compiles now

diff --git a/randr/mirandr.c b/randr/mirandr.c
index 7bef02d..e152133 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -65,11 +65,11 @@ miRRGetInfo (ScreenPtr pScreen, Rotation
 	    rrMode.height = pScreen->height;
 	    rrMode.widthInMillimeters = pScreen->mmWidth;
 	    rrMode.heightInMillimeters = pScreen->mmHeight;
-	    pMonitor = RRRegisterMonitor (pScreen, RR_Rotate_0);
+	    rrMode.nameLength = strlen (name);
+	    pMonitor = RRRegisterMonitor (pScreen, NULL, RR_Rotate_0);
 	    pMode = RRRegisterMode (pMonitor,
 				    &rrMode,
-				    name,
-				    strlen (name));
+				    name);
 	    if (!pMode)
 		return FALSE;
 	    if (!setConfig)
@@ -90,6 +90,8 @@ Bool
 miRRSetMode (ScreenPtr	pScreen,
 	     int	monitor,
 	     RRModePtr	pMode,
+	     int	x,
+	     int	y,
 	     Rotation	rotation)
 {
     return TRUE;
diff --git a/randr/randr.c b/randr/randr.c
index 1a9624a..4a5cd4e 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -163,12 +163,12 @@ RRCloseScreen (int i, ScreenPtr pScreen)
     RRMonitorPtr    pMonitor;
 
     unwrap (pScrPriv, pScreen, CloseScreen);
-    while (pMonitor = pScrPriv->pMonitors) 
+    while ((pMonitor = pScrPriv->pMonitors))
     {
 	RRModePtr   pMode;
 	
 	pScrPriv->pMonitors = pMonitor->next;
-	while (pMode = pMonitor->pModes) 
+	while ((pMode = pMonitor->pModes))
 	{
 	    pMonitor->pModes = pMode->next;
 	    xfree (pMode);
@@ -218,6 +218,20 @@ SRRMonitorChangeNotifyEvent(xRRMonitorCh
     cpswaps(from->y, to->y);
 }
 
+static void
+SRRNotifyEvent (xEvent *from,
+		xEvent *to)
+{
+    switch (from->u.u.detail) {
+    case RRNotify_MonitorChange:
+	SRRMonitorChangeNotifyEvent ((xRRMonitorChangeNotifyEvent *) from,
+				     (xRRMonitorChangeNotifyEvent *) to);
+	break;
+    default:
+	break;
+    }
+}
+
 Bool RRScreenInit(ScreenPtr pScreen)
 {
     rrScrPrivPtr   pScrPriv;
@@ -336,6 +350,8 @@ RRExtensionInit (void)
     RREventBase = extEntry->eventBase;
     EventSwapVector[RREventBase + RRScreenChangeNotify] = (EventSwapPtr) 
       SRRScreenChangeNotifyEvent;
+    EventSwapVector[RREventBase + RRNotify] = (EventSwapPtr)
+	SRRNotifyEvent;
 
     return;
 }
@@ -349,8 +365,8 @@ TellChanged (WindowPtr pWin, pointer val
     xRRMonitorChangeNotifyEvent	me;
     ScreenPtr			pScreen = pWin->drawable.pScreen;
     rrScrPriv(pScreen);
-    RRMonitorPtr		pMonitor = pScrPriv->pMonitors;
     RRModePtr			pMode;
+    RRMonitorPtr		pMonitor;
     WindowPtr			pRoot = WindowTable[pScreen->myNum];
     int				i;
 
@@ -364,7 +380,7 @@ TellChanged (WindowPtr pWin, pointer val
 	if (client == serverClient || client->clientGone)
 	    continue;
 
-	if (pRREvent->mask & RRMonitorChangeNotifyMask)) 
+	if (pRREvent->mask & RRMonitorChangeNotifyMask)
 	{
 	    me.type = RRNotify + RREventBase;
 	    me.subCode = RRNotify_MonitorChange;
@@ -377,12 +393,13 @@ TellChanged (WindowPtr pWin, pointer val
 #else
 	    me.subpixelOrder = SubPixelUnknown;
 #endif
-	    for (i = 0; i < pScrPriv->nMonitors; i++) 
+	    for (pMonitor = pScrPriv->pMonitors, i = 0; 
+		 pMonitor; 
+		 pMonitor = pMonitor->next, i++)
 	    {
-		pMonitor = &pScrPriv->pMonitors[i];
 		me.monitor = i;
-		if (pMonitor->mode >= 0) {
-		    me.modeID = pMonitor->pMode[pMonitor->mode].id;
+		if (pMonitor->pMode) {
+		    me.modeID = pMonitor->pMode->id;
 		    me.rotation = pMonitor->rotation;
 		    me.x = pMonitor->x;
 		    me.y = pMonitor->y;
@@ -396,10 +413,10 @@ TellChanged (WindowPtr pWin, pointer val
 	    }
 	}
 	if ((pRREvent->mask & RRScreenChangeNotifyMask) &&
-	    pScrPriv->nMonitors > 0)
+	    (pMonitor = pScrPriv->pMonitors))
 	{
 	    se.type = RRScreenChangeNotify + RREventBase;
-	    se.rotation = (CARD8) pScrPriv->rotation;
+	    se.rotation = (CARD8) pMonitor->rotation;
 	    se.timestamp = pScrPriv->lastSetTime.milliseconds;
 	    se.sequenceNumber = client->sequence;
 	    se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
@@ -413,14 +430,14 @@ TellChanged (WindowPtr pWin, pointer val
 
 	    pMonitor = &pScrPriv->pMonitors[0];
 	    se.sequenceNumber = client->sequence;
-	    if (pMonitor->mode >= 0) 
+	    if (pMonitor->pMode) 
 	    {
-		pMode = &pMonitor->pModes[pMonitor->mode];
+		pMode = pMonitor->pMode;
 		se.sizeID = pMode->id;
-		se.widthInPixels = pMode->width;
-		se.heightInPixels = pMode->height;
-		se.widthInMillimeters = pMode->mmWidth;
-		se.heightInMillimeters = pMode->mmHeight;
+		se.widthInPixels = pMode->mode.width;
+		se.heightInPixels = pMode->mode.height;
+		se.widthInMillimeters = pMode->mode.widthInMillimeters;
+		se.heightInMillimeters = pMode->mode.heightInMillimeters;
 	    }
 	    else
 	    {
@@ -440,70 +457,107 @@ TellChanged (WindowPtr pWin, pointer val
     return WT_WALKCHILDREN;
 }
 
+static void
+RRFreeMode (RRModePtr pMode)
+{
+    xfree (pMode);
+}
+
+static void
+RRFreeModes (RRModePtr pHead)
+{
+    RRModePtr	pMode;
+    while ((pMode = pHead)) 
+    {
+	pHead = pMode->next;
+	RRFreeMode (pMode);
+    }
+}
+
+static void
+RRFreeMonitor (RRMonitorPtr pMonitor)
+{
+    RRFreeModes (pMonitor->pModes);
+    xfree (pMonitor);
+}
+
+
 static Bool
 RRGetInfo (ScreenPtr pScreen)
 {
     rrScrPriv (pScreen);
-    int		    m, s, n;
     Bool	    changed;
     Rotation	    rotations;
-    RRMonitorPtr    pMonitor;
-    RRModePtr	    pMode;
+    RRMonitorPtr    pMonitor, *pPrevMon;
+    RRModePtr	    pMode, *pPrevMode;
+    int		    monitorid;
 
-    for (m = 0; m < pScrPriv->nMonitors; m++)
+    for (pMonitor = pScrPriv->pMonitors; pMonitor; pMonitor = pMonitor->next)
     {
-	pMonitor = &pScrPriv->pMonitors[m];
-	pMonitor->oldReferenced = pMonitor->referenced;
+	pMonitor->oldReferenced = TRUE;
 	pMonitor->referenced = FALSE;
-	for (s = 0; s < pMonitor->nModes; s++)
+	pMonitor->pMode = NULL;
+	for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
 	{
-	    pMode = &pSize->pModes[s];
-	    pMode->oldReferenced = pMode->referenced;
+	    pMode->oldReferenced = TRUE;
 	    pMode->referenced = FALSE;
 	}
     }
-    changed = FALSE;
-
     rotations = 0;
     if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
 	return FALSE;
+
+    changed = FALSE;
     
     /* Old GetInfo clients return rotations here */
-    if (rotations && pScrPriv->nMonitors) {
+    if (rotations && pScrPriv->pMonitors) {
 	/*
 	 * Check whether anything changed and simultaneously generate
 	 * the protocol id values for the objects
 	 */
-	if (rotations != pScrPriv->pMonitors[i].rotations)
+	if (rotations != pScrPriv->pMonitors->rotations)
 	{
-	    pScrPriv->pMonitors[i].rotations = rotations;
+	    pScrPriv->pMonitors->rotations = rotations;
 	    changed = TRUE;
 	}
     }
 	
-    n = 0;
-    for (m = 0; m < pScrPriv->nMonitors; m++)
+    /*
+     * Walk monitor and mode lists looking for updates
+     */
+    monitorid = 0;
+    for (pPrevMon = &pScrPriv->pMonitors; (pMonitor = *pPrevMon);)
     {
 	int modeid = 0;
 	
-	pMonitor = &pScrPriv->pMonitors[m];
-	if (pMonitor->oldReferenced != pMonitor->referenced)
-	    changed = TRUE;
 	if (pMonitor->referenced)
 	{
-	    for (s = 0; s < pMonitor->nModes; s++)
+	    pMonitor->id = monitorid++;
+	    if (!pMonitor->oldReferenced)
+		changed = TRUE;
+	    for (pPrevMode = &pMonitor->pModes; (pMode = *pPrevMode);)
 	    {
-		pMode = &pMonitor->pModes[s];
-		if (pMode->oldReferenced != pMode->referenced)
-		    changed = TRUE;
 		if (pMode->referenced)
+		{
 		    pMode->id = modeid++;
+		    if (!pMode->oldReferenced)
+			changed = TRUE;
+		}
+		else
+		{
+		    *pPrevMode = pMode->next;
+		    changed = TRUE;
+		    RRFreeMode (pMode);
+		}
 	    }
-	    n++;
 	}
-	pMonitor->nModesInUse = modeid;
+	else
+	{
+	    *pPrevMon = pMonitor->next;
+	    changed = TRUE;
+	    RRFreeMonitor (pMonitor);
+	}
     }
-    pScrPriv->nMonitorsInUse = n;
     if (changed)
     {
 	UpdateCurrentTime ();
@@ -548,6 +602,10 @@ ProcRRQueryVersion (ClientPtr client)
     rep.type = X_Reply;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
+    /*
+     * Report the current version; the current
+     * spec says they're all compatible after 1.0
+     */
     rep.majorVersion = RANDR_MAJOR;
     rep.minorVersion = RANDR_MINOR;
     if (client->swapped) {
@@ -605,6 +663,100 @@ RREditConnectionInfo (ScreenPtr pScreen)
 }
 
 static int
+RRNumModes (RRMonitorPtr pMonitor)
+{
+    int	n = 0;
+    RRModePtr	pMode;
+
+    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
+	n++;
+    return n;
+}
+
+typedef struct _RR10Data {
+    RRScreenSizePtr sizes;
+    int		    nsize;
+    int		    nrefresh;
+    int		    size;
+    CARD16	    refresh;
+} RR10DataRec, *RR10DataPtr;
+
+static CARD16
+RRVerticalRefresh (xRRMonitorMode *mode)
+{
+    CARD32  refresh;
+    if (!mode->hTotal || !mode->vTotal)
+	return 0;
+    refresh = mode->dotClock / (mode->hTotal * mode->vTotal);
+    if (refresh > 0xffff)
+	refresh = 0xffff;
+    return (CARD16) refresh;
+}
+
+/*
+ * Convert 1.2 monitor data into 1.0 screen data
+ */
+static RR10DataPtr
+RR10GetData (ScreenPtr pScreen, RRMonitorPtr pMonitor)
+{
+    RR10DataPtr	    data;
+    RRScreenSizePtr size;
+    int		    nmode = RRNumModes (pMonitor);
+    int		    i;
+    int		    j;
+    RRRefreshPtr    refresh;
+    CARD16	    vRefresh;
+    RRModePtr	    pMode;
+
+    /* Make sure there is plenty of space for any combination */
+    data = malloc (sizeof (RR10DataRec) + 
+		   sizeof (RRScreenSizeRec) * nmode + 
+		   sizeof (RRRefreshRec) * nmode);
+    if (!data)
+	return NULL;
+    size = (RRScreenSizePtr) (data + 1);
+    refresh = (RRRefreshPtr) (size + nmode);
+    data->nsize = 0;
+    data->nrefresh = 0;
+    data->size = 0;
+    data->refresh = 0;
+    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
+    {
+	for (i = 0; i < data->nsize; i++)
+	    if (pMode->mode.width == size[i].width &&
+		pMode->mode.height == size[i].height)
+		break;
+	if (i == data->nsize)
+	{
+	    size[i].width = pMode->mode.width;
+	    size[i].height = pMode->mode.height;
+	    size[i].mmWidth = pMode->mode.widthInMillimeters;
+	    size[i].mmHeight = pMode->mode.heightInMillimeters;
+	    size[i].nrefresh = 0;
+	    size[i].refresh = &refresh[data->nrefresh];
+	    data->nsize++;
+	}
+	vRefresh = RRVerticalRefresh (&pMode->mode);
+	for (j = 0; j < size[i].nrefresh; j++)
+	    if (vRefresh == size[i].refresh[j].refresh)
+		break;
+	if (j == size[i].nrefresh)
+	{
+	    size[i].refresh[j].refresh = vRefresh;
+	    size[i].refresh[j].pMode = pMode;
+	    size[i].nrefresh++;
+	    data->nrefresh++;
+	}
+	if (pMode == pMonitor->pMode)
+	{
+	    data->size = i;
+	    data->refresh = vRefresh;
+	}
+    }
+    return data;
+}
+
+static int
 ProcRRGetScreenInfo (ClientPtr client)
 {
     REQUEST(xRRGetScreenInfoReq);
@@ -626,7 +778,11 @@ ProcRRGetScreenInfo (ClientPtr client)
     pScreen = pWin->drawable.pScreen;
     pScrPriv = rrGetScrPriv(pScreen);
     rep.pad = 0;
-    if (!pScrPriv)
+    
+    if (pScrPriv)
+	RRGetInfo (pScreen);
+
+    if (!pScrPriv && !pScrPriv->pMonitors)
     {
 	rep.type = X_Reply;
 	rep.setOfRotations = RR_Rotate_0;;
@@ -645,94 +801,82 @@ ProcRRGetScreenInfo (ClientPtr client)
     }
     else
     {
+	RRMonitorPtr		pMonitor = pScrPriv->pMonitors;
 	int			i, j;
 	xScreenSizes		*size;
 	CARD16			*rates;
 	CARD8			*data8;
 	Bool			has_rate = RRClientKnowsRates (client);
+	RR10DataPtr		pData;
+	RRScreenSizePtr		pSize;
     
-	RRGetInfo (pScreen);
-
+	pData = RR10GetData (pScreen, pMonitor);
+	if (!pData)
+	    return BadAlloc;
+	
 	rep.type = X_Reply;
-	rep.setOfRotations = pScrPriv->rotations;
+	rep.setOfRotations = pMonitor->rotations;
 	rep.sequenceNumber = client->sequence;
 	rep.length = 0;
 	rep.root = WindowTable[pWin->drawable.pScreen->myNum]->drawable.id;
 	rep.timestamp = pScrPriv->lastSetTime.milliseconds;
 	rep.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
-	rep.rotation = pScrPriv->rotation;
-	rep.nSizes = pScrPriv->nSizesInUse;
-	rep.rate = pScrPriv->rate;
-        rep.nrateEnts = 0;
-	if (has_rate)
-	{
-	    for (i = 0; i < pScrPriv->nSizes; i++)
-	    {
-		RRScreenSizePtr pSize = &pScrPriv->pSizes[i];
-		if (pSize->referenced)
-		{
-		    rep.nrateEnts += (1 + pSize->nRatesInUse);
-		}
-	    }
-	}
-
-	if (pScrPriv->size >= 0)
-	    rep.sizeID = pScrPriv->pSizes[pScrPriv->size].id;
-	else
-	    return BadImplementation;
+	rep.rotation = pMonitor->rotation;
+	rep.nSizes = pData->nsize;
+        rep.nrateEnts = pData->nrefresh;
+	rep.sizeID = pData->size;
+	rep.rate = pData->refresh;
 
 	extraLen = (rep.nSizes * sizeof (xScreenSizes) +
 		    rep.nrateEnts * sizeof (CARD16));
 
 	extra = (CARD8 *) xalloc (extraLen);
 	if (!extra)
+	{
+	    xfree (pData);
 	    return BadAlloc;
+	}
 	/*
 	 * First comes the size information
 	 */
 	size = (xScreenSizes *) extra;
 	rates = (CARD16 *) (size + rep.nSizes);
-	for (i = 0; i < pScrPriv->nSizes; i++)
+	for (i = 0; i < pData->nsize; i++)
 	{
-	    RRScreenSizePtr pSize = &pScrPriv->pSizes[i];
-	    if (pSize->referenced)
+	    pSize = &pData->sizes[i];
+	    size->widthInPixels = pSize->width;
+	    size->heightInPixels = pSize->height;
+	    size->widthInMillimeters = pSize->mmWidth;
+	    size->heightInMillimeters = pSize->mmHeight;
+	    if (client->swapped)
+	    {
+	        swaps (&size->widthInPixels, n);
+	        swaps (&size->heightInPixels, n);
+	        swaps (&size->widthInMillimeters, n);
+	        swaps (&size->heightInMillimeters, n);
+	    }
+	    size++;
+	    if (has_rate)
 	    {
-		size->widthInPixels = pSize->width;
-		size->heightInPixels = pSize->height;
-		size->widthInMillimeters = pSize->mmWidth;
-		size->heightInMillimeters = pSize->mmHeight;
+		*rates = pSize->nrefresh;
 		if (client->swapped)
 		{
-		    swaps (&size->widthInPixels, n);
-		    swaps (&size->heightInPixels, n);
-		    swaps (&size->widthInMillimeters, n);
-		    swaps (&size->heightInMillimeters, n);
+		    swaps (rates, n);
 		}
-		size++;
-		if (has_rate)
+		rates++;
+		for (j = 0; j < pSize->nrefresh; j++)
 		{
-		    *rates = pSize->nRatesInUse;
+		    *rates = pSize->refresh[j].refresh;
 		    if (client->swapped)
 		    {
 			swaps (rates, n);
 		    }
 		    rates++;
-		    for (j = 0; j < pSize->nRates; j++)
-		    {
-			RRScreenRatePtr	pRate = &pSize->pRates[j];
-			if (pRate->referenced)
-			{
-			    *rates = pRate->rate;
-			    if (client->swapped)
-			    {
-				swaps (rates, n);
-			    }
-			    rates++;
-			}
-		    }
 		}
 	    }
 	}
+        xfree (pData);
+	
 	data8 = (CARD8 *) rates;
 
 	if (data8 - (CARD8 *) extra != extraLen)
@@ -770,13 +914,16 @@ ProcRRSetScreenConfig (ClientPtr client)
     rrScrPrivPtr	    pScrPriv;
     TimeStamp		    configTime;
     TimeStamp		    time;
-    RRScreenSizePtr	    pSize;
     int			    i;
     Rotation		    rotation;
     int			    rate;
     short		    oldWidth, oldHeight;
     Bool		    has_rate;
-
+    RRMonitorPtr	    pMonitor;
+    RRModePtr		    pMode;
+    RR10DataPtr		    pData = NULL;
+    RRScreenSizePtr    	    pSize;
+    
     UpdateCurrentTime ();
 
     if (RRClientKnowsRates (client))
@@ -812,6 +959,14 @@ ProcRRSetScreenConfig (ClientPtr client)
     if (!RRGetInfo (pScreen))
 	return BadAlloc;
     
+    pMonitor = pScrPriv->pMonitors;
+    if (!pMonitor)
+    {
+	time = currentTime;
+	rep.status = RRSetConfigFailed;
+	goto sendReply;
+    }
+    
     /*
      * if the client's config timestamp is not the same as the last config
      * timestamp, then the config information isn't up-to-date and
@@ -823,26 +978,20 @@ ProcRRSetScreenConfig (ClientPtr client)
 	goto sendReply;
     }
     
-    /*
-     * Search for the requested size
-     */
-    pSize = 0;
-    for (i = 0; i < pScrPriv->nSizes; i++)
-    {
-	pSize = &pScrPriv->pSizes[i];
-	if (pSize->referenced && pSize->id == stuff->sizeID)
-	{
-	    break;
-	}
-    }
-    if (i == pScrPriv->nSizes)
+    pData = RR10GetData (pScreen, pMonitor);
+    if (!pData)
+	return BadAlloc;
+    
+    if (stuff->sizeID >= pData->nsize)
     {
 	/*
 	 * Invalid size ID
 	 */
 	client->errorValue = stuff->sizeID;
+	xfree (pData);
 	return BadValue;
     }
+    pSize = &pData->sizes[stuff->sizeID];
     
     /*
      * Validate requested rotation
@@ -861,15 +1010,17 @@ ProcRRSetScreenConfig (ClientPtr client)
 	 * Invalid rotation
 	 */
 	client->errorValue = stuff->rotation;
+	xfree (pData);
 	return BadValue;
     }
 
-    if ((~pScrPriv->rotations) & rotation)
+    if ((~pMonitor->rotations) & rotation)
     {
 	/*
 	 * requested rotation or reflection not supported by screen
 	 */
 	client->errorValue = stuff->rotation;
+	xfree (pData);
 	return BadMatch;
     }
 
@@ -883,21 +1034,24 @@ ProcRRSetScreenConfig (ClientPtr client)
 
     if (rate)
     {
-	for (i = 0; i < pSize->nRates; i++)
+	for (i = 0; i < pSize->nrefresh; i++)
 	{
-	    RRScreenRatePtr pRate = &pSize->pRates[i];
-	    if (pRate->referenced && pRate->rate == rate)
+	    if (pSize->refresh[i].refresh == rate)
 		break;
 	}
-	if (i == pSize->nRates)
+	if (i == pSize->nrefresh)
 	{
 	    /*
 	     * Invalid rate
 	     */
 	    client->errorValue = rate;
+	    xfree (pData);
 	    return BadValue;
 	}
+	pMode = pSize->refresh[i].pMode;
     }
+    else
+	pMode = pSize->refresh[0].pMode;
     
     /*
      * Make sure the requested set-time is not older than
@@ -912,9 +1066,51 @@ ProcRRSetScreenConfig (ClientPtr client)
     /*
      * call out to ddx routine to effect the change
      */
-    if (!(*pScrPriv->rrSetConfig) (pScreen, rotation, rate,
-				   pSize))
+    if (pScrPriv->rrSetScreenSize && pScrPriv->rrSetMode)
+    {
+	xScreenSizes	oldSize;
+	if (!(*pScrPriv->rrSetMode) (pScreen, 0, NULL, 0, 0, RR_Rotate_0))
+	    goto fail;
+	oldSize.widthInPixels = pScreen->width;
+	oldSize.heightInPixels = pScreen->width;
+	oldSize.widthInMillimeters = pScreen->mmWidth;
+	oldSize.heightInMillimeters = pScreen->mmHeight;
+	if (!(*pScrPriv->rrSetScreenSize) (pScreen,
+					   pMode->mode.width,
+					   pMode->mode.height,
+					   pMode->mode.widthInMillimeters,
+					   pMode->mode.heightInMillimeters))
+	{
+	    (void) (*pScrPriv->rrSetMode) (pScreen, 0, pMonitor->pMode,
+					   pMonitor->x, pMonitor->y,
+					   pMonitor->rotation);
+	    goto fail;
+	}
+	if (!(*pScrPriv->rrSetMode) (pScreen, 0, pMode, 0, 0, rotation))
+	{
+	    (void) (*pScrPriv->rrSetScreenSize) (pScreen,
+						 oldSize.widthInPixels,
+						 oldSize.heightInPixels,
+						 oldSize.widthInMillimeters,
+						 oldSize.heightInMillimeters);
+	    (void) (*pScrPriv->rrSetMode) (pScreen, 0, pMonitor->pMode,
+					   pMonitor->x, pMonitor->y,
+					   pMonitor->rotation);
+	    goto fail;
+	}
+    }
+#ifdef RANDR_SCREEN_INTERFACE
+    else if (pScrPriv->rrSetConfig)
     {
+	if (!(*pScrPriv->rrSetConfig) (pScreen, rotation, rate, pSize))
+	{
+	    goto fail;
+	}
+    }
+#endif
+    else
+    {
+fail:	;
 	/*
 	 * unknown DDX failure, report to client
 	 */
@@ -925,7 +1121,7 @@ ProcRRSetScreenConfig (ClientPtr client)
     /*
      * set current extension configuration pointers
      */
-    RRSetCurrentConfig (pScreen, rotation, rate, pSize);
+    RRSetCurrentMode (pMonitor, pMode, 0, 0, rotation);
     
     /*
      * Deliver ScreenChangeNotify events whenever
@@ -954,6 +1150,9 @@ ProcRRSetScreenConfig (ClientPtr client)
     
 sendReply:
     
+    if (pData)
+	xfree (pData);
+
     rep.type = X_Reply;
     /* rep.status has already been filled in */
     rep.length = 0;
@@ -1055,7 +1254,7 @@ RRSetScreenConfig (ScreenPtr		pScreen,
     /*
      * set current extension configuration pointers
      */
-    RRSetCurrentConfig (pScreen, rotation, rate, pSize);
+    RRSetCurrentMode (pMonitor, pMode, 0, 0, rotation);
     
     /*
      * Deliver ScreenChangeNotify events whenever
@@ -1075,7 +1274,6 @@ RRSetScreenConfig (ScreenPtr		pScreen,
      * Fix pointer bounds and location
      */
     ScreenRestructured (pScreen);
-    
     return Success;
 }
 
@@ -1286,22 +1484,114 @@ SProcRRDispatch (ClientPtr client)
     }
 }
 
+/*
+ * Register a monitor for a screen. identifier is a unique identifier
+ * for the monitors of a particular screen.
+ */
+RRMonitorPtr
+RRRegisterMonitor (ScreenPtr		pScreen,
+		   void			*identifier,
+		   Rotation		rotations)
+{
+    rrScrPriv (pScreen);
+    RRMonitorPtr    pMonitor, *pPrev, *pInsert;
 
-static Bool
-RRScreenSizeMatches (RRScreenSizePtr  a,
-		   RRScreenSizePtr  b)
+    pInsert = NULL;
+    for (pPrev = &pScrPriv->pMonitors; (pMonitor = *pPrev); 
+	 pPrev = &(pMonitor)->next)
+    {
+	if (pMonitor->identifier == identifier) 
+	{
+	    pMonitor->referenced = TRUE;
+	    return pMonitor;
+	}
+	if (!pMonitor->referenced)
+	    pInsert = pPrev;
+    }
+    if (!pInsert)
+	pInsert = pPrev;
+    
+    /*
+     * New monitor, add before the first unreferenced monitor
+     */
+    pMonitor = xalloc (sizeof (RRMonitor));
+    if (!pMonitor)
+	return NULL;
+    pMonitor->pScreen = pScreen;
+    pMonitor->pModes = NULL;
+    pMonitor->identifier = identifier;
+    pMonitor->referenced = TRUE;
+    pMonitor->oldReferenced = FALSE;
+    pMonitor->rotations = RR_Rotate_0;
+    
+    pMonitor->pMode = NULL;
+    pMonitor->x = 0;
+    pMonitor->y = 0;
+    pMonitor->rotation = RR_Rotate_0;
+    pMonitor->next = *pInsert;
+    *pInsert = pMonitor;
+    return pMonitor;
+}
+
+/*
+ * Register a mode for a monitor
+ */
+
+RRModePtr
+RRRegisterMode (RRMonitorPtr	pMonitor,
+		xRRMonitorMode	*pModeline,
+		char		*name)
 {
-    if (a->width != b->width)
-	return FALSE;
-    if (a->height != b->height)
-	return FALSE;
-    if (a->mmWidth != b->mmWidth)
-	return FALSE;
-    if (a->mmHeight != b->mmHeight)
-	return FALSE;
-    return TRUE;
+    RRModePtr	pMode, *pPrev, *pInsert = NULL;
+
+    /*
+     * Find existing mode with same modeline and name
+     */
+    for (pPrev = &pMonitor->pModes; (pMode = *pPrev); pPrev = &(pMode->next))
+    {
+	if (!memcmp (&pMode->mode, pModeline, sizeof (xRRMonitorMode)) &&
+	    pMode->mode.nameLength == pModeline->nameLength &&
+	    !memcmp (RRModeName(pMode), name, pModeline->nameLength))
+	{
+	    pMode->referenced = TRUE;
+	    return pMode;
+	}
+	if (!pMode->referenced)
+	    pInsert = pPrev;
+    }
+
+    if (!pInsert)
+	pInsert = pPrev;
+    
+    /*
+     * Create a new mode, inserting before the first unreferenced mode
+     */
+    pMode = xalloc (sizeof (RRMode) + pModeline->nameLength + 1);
+    pMode->referenced = TRUE;
+    pMode->oldReferenced = FALSE;
+    pMode->mode = *pModeline;
+    memcpy (RRModeName (pMode), name, pModeline->nameLength);
+    RRModeName(pMode)[pModeline->nameLength] = '\0';
+    pMode->next = *pInsert;
+    *pInsert = pMode;
+    return pMode;
+}
+
+void
+RRSetCurrentMode (RRMonitorPtr	pMonitor,
+		  RRModePtr	pMode,
+		  int		x,
+		  int		y,
+		  Rotation	rotation)
+{
+    pMonitor->pMode = pMode;
+    pMonitor->x = x;
+    pMonitor->y = y;
+    pMonitor->rotation = rotation;
 }
 
+#ifdef RANDR_SCREEN_INTERFACE
+
 RRScreenSizePtr
 RRRegisterSize (ScreenPtr	    pScreen,
 		short		    width, 
@@ -1310,36 +1600,45 @@ RRRegisterSize (ScreenPtr	    pScreen,
 		short		    mmHeight)
 {
     rrScrPriv (pScreen);
-    int		    i;
-    RRScreenSize    tmp;
-    RRScreenSizePtr pNew;
+    xRRMonitorMode  tmp;
+    RRMonitorPtr    pMonitor;
+    RRModePtr	    pMode, *pPrev;
+    char	    name[100];
 
     if (!pScrPriv)
-	return 0;
-    
-    tmp.id = -1;
+	return NULL;
+    pMonitor = pScrPriv->pMonitors;
+    if (!pMonitor)
+	return NULL;
+    
+    for (pPrev = &pMonitor->pModes; (pMode = *pPrev); pPrev = &(pMode->next))
+	if (pMode->mode.width == width &&
+	    pMode->mode.height == height &&
+	    pMode->mode.widthInMillimeters == mmWidth &&
+	    pMode->mode.heightInMillimeters == mmHeight)
+	{
+	    pMode->referenced =TRUE;
+	    return (void *) pMode;
+	}
+    memset (&tmp, '\0', sizeof (xRRMonitorMode));
+    memset (name, '\0', sizeof (name));
+    sprintf (name, "%dx%d", width, height);
     tmp.width = width;
     tmp.height= height;
-    tmp.mmWidth = mmWidth;
-    tmp.mmHeight = mmHeight;
-    tmp.pRates = 0;
-    tmp.nRates = 0;
-    tmp.nRatesInUse = 0;
-    tmp.referenced = TRUE;
-    tmp.oldReferenced = FALSE;
-    for (i = 0; i < pScrPriv->nSizes; i++)
-	if (RRScreenSizeMatches (&tmp, &pScrPriv->pSizes[i]))
-	{
-	    pScrPriv->pSizes[i].referenced = TRUE;
-	    return &pScrPriv->pSizes[i];
-	}
-    pNew = xrealloc (pScrPriv->pSizes,
-		     (pScrPriv->nSizes + 1) * sizeof (RRScreenSize));
-    if (!pNew)
-	return 0;
-    pNew[pScrPriv->nSizes++] = tmp;
-    pScrPriv->pSizes = pNew;
-    return &pNew[pScrPriv->nSizes-1];
+    tmp.widthInMillimeters = mmWidth;
+    tmp.heightInMillimeters = mmHeight;
+    tmp.nameLength = strlen (name) + 10;    /* leave space for refresh */
+    pMode = RRRegisterMode (pMonitor, &tmp, name);
+    return (void *) pMode;
+}
+
+static Bool
+RRModesMatchSize (RRModePtr a, RRModePtr b)
+{
+    return (a->mode.width == a->mode.width &&
+	    a->mode.height == b->mode.height &&
+	    a->mode.widthInMillimeters == b->mode.widthInMillimeters &&
+	    a->mode.heightInMillimeters == b->mode.heightInMillimeters);
 }
 
 Bool RRRegisterRate (ScreenPtr		pScreen,
@@ -1347,31 +1646,61 @@ Bool RRRegisterRate (ScreenPtr		pScreen,
 		     int		rate)
 {
     rrScrPriv(pScreen);
-    int		    i;
-    RRScreenRatePtr pNew, pRate;
+    RRMonitorPtr    pMonitor;
+    RRModePtr	    pSizeMode = (RRModePtr) pSize;
+    RRModePtr	    pMode, *pPrev;
+    CARD16	    width = pSizeMode->mode.width;
+    CARD16	    height = pSizeMode->mode.height;
+    char	    name[100];
+    xRRMonitorMode  modeLine;
 
     if (!pScrPriv)
 	return FALSE;
     
-    for (i = 0; i < pSize->nRates; i++)
+    pMonitor = pScrPriv->pMonitors;
+    if (!pMonitor)
+	return FALSE;
+
+    for (pPrev = &pMonitor->pModes; (pMode = *pPrev); pPrev = &pMode->next)
     {
-	pRate = &pSize->pRates[i];
-	if (pRate->rate == rate)
+	if (RRModesMatchSize (pMode, pSizeMode))
 	{
-	    pRate->referenced = TRUE;
-	    return TRUE;
+	    if (pMode->mode.dotClock == 0)
+	    {
+		/*
+		 * First refresh for this size; reprogram this mode
+		 * with the right refresh.
+		 */
+		pMode->mode.hSyncStart = width;
+		pMode->mode.hSyncEnd = width;
+		pMode->mode.hTotal = width;
+		pMode->mode.hSkew = 0;
+		pMode->mode.vSyncStart = height;
+		pMode->mode.vSyncEnd = height;
+		pMode->mode.vTotal = height;
+		pMode->mode.dotClock = width * height * rate;
+		sprintf ((char *) (pMode + 1), "%dx%d@%d", width, height, rate);
+		pMode->mode.modeFlags = 0;
+		pMode->mode.nameLength = strlen ((char *) (pMode + 1));
+		pMode->referenced = TRUE;
+		return TRUE;
+	    }
+	    else if (rate == RRVerticalRefresh (&pMode->mode))
+	    {
+		pMode->referenced = TRUE;
+		return TRUE;
+	    }
 	}
     }
-
-    pNew = xrealloc (pSize->pRates,
-		     (pSize->nRates + 1) * sizeof (RRScreenRate));
-    if (!pNew)
+    
+    sprintf (name, "%dx%d@%d", pSizeMode->mode.width, pSizeMode->mode.height,
+	     rate);
+    modeLine = pSizeMode->mode;
+    modeLine.dotClock = rate * modeLine.vTotal * modeLine.hTotal;
+    modeLine.nameLength = strlen (name);
+    pMode = RRRegisterMode (pMonitor, &modeLine, name);
+    if (!pMode)
 	return FALSE;
-    pRate = &pNew[pSize->nRates++];
-    pRate->rate = rate;
-    pRate->referenced = TRUE;
-    pRate->oldReferenced = FALSE;
-    pSize->pRates = pNew;
     return TRUE;
 }
 
@@ -1379,11 +1708,15 @@ Rotation
 RRGetRotation(ScreenPtr pScreen)
 {
     rrScrPriv (pScreen);
+    RRMonitorPtr    pMonitor;
 
     if (!pScrPriv)
 	return RR_Rotate_0;
 
-    return pScrPriv->rotation;
+    pMonitor = pScrPriv->pMonitors;
+    if (!pMonitor)
+	return RR_Rotate_0;
+    return pMonitor->rotation;
 }
 
 void
@@ -1393,11 +1726,25 @@ RRSetCurrentConfig (ScreenPtr		pScreen,
 		    RRScreenSizePtr	pSize)
 {
     rrScrPriv (pScreen);
+    RRMonitorPtr    pMonitor;
+    RRModePtr	    pMode;
+    RRModePtr	    pSizeMode = (RRModePtr) pSize;
 
     if (!pScrPriv)
 	return;
+    pMonitor = pScrPriv->pMonitors;
+    if (!pMonitor)
+	return;
 
-    pScrPriv->rotation = rotation;
-    pScrPriv->size = pSize - pScrPriv->pSizes;
-    pScrPriv->rate = rate;
+    for (pMode = pMonitor->pModes; pMode; pMode = pMode->next)
+    {
+	if (RRModesMatchSize (pMode, pSizeMode) && 
+	    RRVerticalRefresh (&pMode->mode) == rate)
+	    break;
+    }
+    if (!pMode)
+	return;
+    
+    RRSetCurrentMode (pMonitor, pMode, 0, 0, rotation);
 }
+#endif
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 07c6c37..3610274 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -34,11 +34,19 @@
 
 #include <X11/extensions/randrproto.h>
 
+#define RANDR_SCREEN_INTERFACE 1
+
+/*
+ * Modeline for a monitor. Name follows directly after this struct
+ */
+
+#define RRModeName(pMode) ((char *) (pMode + 1))
+
 typedef struct _rrMode {
     struct _rrMode  *next;
-    int		    id;
     Bool	    referenced;
     Bool	    oldReferenced;
+    int		    id;
     xRRMonitorMode  mode;
 } RRMode, *RRModePtr;
 
@@ -47,12 +55,15 @@ typedef struct _rrMonitor {
     ScreenPtr	    pScreen;
     RRModePtr	    pModes;
     void	    *identifier;    /* made unique by DDX */
+    int		    id;		    /* index in list of monitors */
     Bool	    referenced;
+    Bool	    oldReferenced;
+    Rotation	    rotations;
     
     /*
      * Current state
      */
-    int		    mode;
+    RRModePtr	    pMode;
     int		    x, y;
     Rotation	    rotation;
 } RRMonitor, *RRMonitorPtr;
@@ -76,7 +87,18 @@ typedef Bool (*RRCloseScreenProcPtr) ( i
 
 #ifdef RANDR_SCREEN_INTERFACE
 
-typedef void *RRScreenSizePtr;
+typedef struct _rrRefresh {
+    CARD16	    refresh;
+    RRModePtr	    pMode;
+} RRRefreshRec, *RRRefreshPtr;
+
+typedef struct _rrScreenSize {
+    int		    id;
+    short	    width, height;
+    short	    mmWidth, mmHeight;
+    int		    nrefresh;
+    RRRefreshPtr    refresh;
+} RRScreenSizeRec, *RRScreenSizePtr;
 
 typedef Bool (*RRSetConfigProcPtr) (ScreenPtr		pScreen,
 				    Rotation		rotation,
@@ -87,12 +109,23 @@ typedef Bool (*RRSetConfigProcPtr) (Scre
 	
 
 typedef struct _rrScrPriv {
-    RRSetModeProcPtr	    rrSetMode;
+    /*
+     * 'public' part of the structure; DDXen fill this in
+     * as they initialize
+     */
+#ifdef RANDR_SCREEN_INTERFACE
+    RRSetConfigProcPtr	    rrSetConfig;
+#endif
     RRGetInfoProcPtr	    rrGetInfo;
-    RRCloseScreenProcPtr    CloseScreen;
+    RRSetScreenSizeProcPtr  rrSetScreenSize;
+    RRSetModeProcPtr	    rrSetMode;
     
+    /*
+     * Private part of the structure; not considered part of the ABI
+     */
     TimeStamp		    lastSetTime;	/* last changed by client */
     TimeStamp		    lastConfigTime;	/* possible configs changed */
+    RRCloseScreenProcPtr    CloseScreen;
 
     /*
      * monitor data
@@ -105,7 +138,6 @@ typedef struct _rrScrPriv {
      */
     Rotation		    rotations;
     
-    RRSetConfigProcPtr	    rrSetConfig;
 
     Rotation		    rotation;
 #endif
@@ -137,8 +169,7 @@ RRRegisterMonitor (ScreenPtr		pScreen,
 RRModePtr
 RRRegisterMode (RRMonitorPtr	pMonitor,
 		xRRMonitorMode	*pMode,
-		char		*name,
-		int		nameLength);
+		char		*name);
 
 /*
  * Finally, set the current configuration of each monitor
@@ -147,6 +178,8 @@ RRRegisterMode (RRMonitorPtr	pMonitor,
 void
 RRSetCurrentMode (RRMonitorPtr	pMonitor,
 		  RRModePtr	pMode,
+		  int		x,
+		  int		y,
 		  Rotation	rotation);
 
 Bool RRScreenInit(ScreenPtr pScreen);
@@ -167,6 +200,8 @@ Bool
 miRRSetMode (ScreenPtr	pScreen,
 	     int	monitor,
 	     RRModePtr	pMode,
+	     int	x,
+	     int	y,
 	     Rotation	rotation);
 
 #ifdef RANDR_SCREEN_INTERFACE					
diff-tree d95c758630f4aacec339a7ec80d2c4a9d7de1e4a (from f057de4f73fa593fa3fc5f05f65b89e76273b158)
Author: Keith Packard <keithp at neko.keithp.com>
Date:   Sat Jul 1 19:46:38 2006 -0700

    Preliminary RandR 1.2 work

diff --git a/randr/mirandr.c b/randr/mirandr.c
index 0954028..7bef02d 100644
--- a/randr/mirandr.c
+++ b/randr/mirandr.c
@@ -1,36 +1,36 @@
 /*
- *
- * Copyright © 2000, Compaq Computer Corporation, 
- * Copyright © 2002, Hewlett Packard, Inc.
+ * Copyright © 2000 Compaq Computer Corporation
+ * Copyright © 2002 Hewlett-Packard Company
+ * Copyright © 2006 Intel Corporation
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Compaq or HP not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission.  HP makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
  *
- * HP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL HP
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
  *
- * Author:  Jim Gettys, HP Labs, Hewlett-Packard, Inc.
+ * Author:  Jim Gettys, Hewlett-Packard Company, Inc.
+ *	    Keith Packard, Intel Corporation
  */
 
-
 #ifdef HAVE_DIX_CONFIG_H
 #include <dix-config.h>
 #endif
 
 #include "scrnintstr.h"
 #include "mi.h"
-#include <X11/extensions/randr.h>
 #include "randrstr.h"
 #include <stdio.h>
 
@@ -48,26 +48,35 @@ miRRGetInfo (ScreenPtr pScreen, Rotation
 {
     int	i;
     Bool setConfig = FALSE;
+    RRMonitorPtr pMonitor;
     
-    *rotations = RR_Rotate_0;
+    pMonitor = RRRegisterMonitor (pScreen, NULL, RR_Rotate_0);
     for (i = 0; i < pScreen->numDepths; i++)
     {
 	if (pScreen->allowedDepths[i].numVids)
 	{
-		RRScreenSizePtr		pSize;
-
-		pSize = RRRegisterSize (pScreen,
-					pScreen->width,
-					pScreen->height,
-					pScreen->mmWidth,
-					pScreen->mmHeight);
-		if (!pSize)
-		    return FALSE;
-		if (!setConfig)
-		{
-		    RRSetCurrentConfig (pScreen, RR_Rotate_0, 0, pSize);
-		    setConfig = TRUE;
-		}
+	    xRRMonitorMode		rrMode;
+	    RRModePtr			pMode;
+	    char			name[64];
+
+	    sprintf (name, "%dx%d", pScreen->width, pScreen->height);
+	    memset (&rrMode, '\0', sizeof (rrMode));
+	    rrMode.width = pScreen->width;
+	    rrMode.height = pScreen->height;
+	    rrMode.widthInMillimeters = pScreen->mmWidth;
+	    rrMode.heightInMillimeters = pScreen->mmHeight;
+	    pMonitor = RRRegisterMonitor (pScreen, RR_Rotate_0);
+	    pMode = RRRegisterMode (pMonitor,
+				    &rrMode,
+				    name,
+				    strlen (name));
+	    if (!pMode)
+		return FALSE;
+	    if (!setConfig)
+	    {
+		RRSetCurrentMode (pMonitor, pMode, 0, 0, RR_Rotate_0);
+		setConfig = TRUE;
+	    }
 	}
     }
     return TRUE;
@@ -78,10 +87,10 @@ miRRGetInfo (ScreenPtr pScreen, Rotation
  * different here
  */
 Bool
-miRRSetConfig (ScreenPtr	pScreen,
-	       Rotation		rotation,
-	       int		rate,
-	       RRScreenSizePtr	pSize)
+miRRSetMode (ScreenPtr	pScreen,
+	     int	monitor,
+	     RRModePtr	pMode,
+	     Rotation	rotation)
 {
     return TRUE;
 }
@@ -96,6 +105,6 @@ miRandRInit (ScreenPtr pScreen)
 	return FALSE;
     rp = rrGetScrPriv(pScreen);
     rp->rrGetInfo = miRRGetInfo;
-    rp->rrSetConfig = miRRSetConfig;
+    rp->rrSetMode = miRRSetMode;
     return TRUE;
 }
diff --git a/randr/randr.c b/randr/randr.c
index 946aad3..1a9624a 100644
--- a/randr/randr.c
+++ b/randr/randr.c
@@ -1,29 +1,30 @@
 /*
- *
- * Copyright © 2000, Compaq Computer Corporation, 
- * Copyright © 2002, Hewlett Packard, Inc.
+ * Copyright © 2000 Compaq Computer Corporation
+ * Copyright © 2002 Hewlett-Packard Company
+ * Copyright © 2006 Intel Corporation
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Compaq or HP not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission.  HP makes no representations about the
- * suitability of this software for any purpose.  It is provided "as is"
- * without express or implied warranty.
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
  *
- * HP DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL HP
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
+ * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
  *
- * Author:  Jim Gettys, HP Labs, Hewlett-Packard, Inc.
+ * Author:  Jim Gettys, Hewlett-Packard Company, Inc.
+ *	    Keith Packard, Intel Corporation
  */
 
-
 #define NEED_REPLIES
 #define NEED_EVENTS
 #ifdef HAVE_DIX_CONFIG_H
@@ -159,10 +160,21 @@ static Bool
 RRCloseScreen (int i, ScreenPtr pScreen)
 {
     rrScrPriv(pScreen);
+    RRMonitorPtr    pMonitor;
 
     unwrap (pScrPriv, pScreen, CloseScreen);
-    if (pScrPriv->pSizes)
-	xfree (pScrPriv->pSizes);
+    while (pMonitor = pScrPriv->pMonitors) 
+    {
+	RRModePtr   pMode;
+	
+	pScrPriv->pMonitors = pMonitor->next;
+	while (pMode = pMonitor->pModes) 
+	{
+	    pMonitor->pModes = pMode->next;
+	    xfree (pMode);
+	}
+	xfree (pMonitor);
+    }
     xfree (pScrPriv);
     RRNScreens -= 1;	/* ok, one fewer screen with RandR running */
     return (*pScreen->CloseScreen) (i, pScreen);    
@@ -187,6 +199,25 @@ SRRScreenChangeNotifyEvent(xRRScreenChan
     cpswaps(from->subpixelOrder, to->subpixelOrder);
 }
 
+static void
+SRRMonitorChangeNotifyEvent(xRRMonitorChangeNotifyEvent *from,
+			    xRRMonitorChangeNotifyEvent *to)
+{
+    to->type = from->type;
+    to->subCode = from->subCode;
+    cpswaps(from->sequenceNumber, to->sequenceNumber);
+    cpswapl(from->timestamp, to->timestamp);
+    cpswapl(from->configTimestamp, to->configTimestamp);
+    cpswapl(from->root, to->root);
+    cpswapl(from->window, to->window);
+    cpswaps(from->monitor, to->monitor);
+    cpswaps(from->modeID, to->modeID);
+    cpswaps(from->rotation, to->rotation);
+    cpswaps(from->subpixelOrder, to->subpixelOrder);
+    cpswaps(from->x, to->x);
+    cpswaps(from->y, to->y);
+}
+
 Bool RRScreenInit(ScreenPtr pScreen)
 {
     rrScrPrivPtr   pScrPriv;
@@ -207,8 +238,12 @@ Bool RRScreenInit(ScreenPtr pScreen)
     /*
      * Calling function best set these function vectors
      */
-    pScrPriv->rrSetConfig = 0;
+    pScrPriv->rrSetMode = 0;
     pScrPriv->rrGetInfo = 0;
+#ifdef RANDR_SCREEN_INTERFACE    
+    pScrPriv->rrSetConfig = 0;
+#endif
+    
     /*
      * This value doesn't really matter -- any client must call
      * GetScreenInfo before reading it which will automatically update
@@ -219,14 +254,7 @@ Bool RRScreenInit(ScreenPtr pScreen)
     
     wrap (pScrPriv, pScreen, CloseScreen, RRCloseScreen);
 
-    pScrPriv->rotations = RR_Rotate_0;
-    
-    pScrPriv->nSizes = 0;
-    pScrPriv->nSizesInUse = 0;
-    pScrPriv->pSizes = 0;
-    
-    pScrPriv->rotation = RR_Rotate_0;
-    pScrPriv->size = -1;
+    pScrPriv->pMonitors = NULL;
     
     RRNScreens += 1;	/* keep count of screens that implement randr */
     return TRUE;
@@ -318,55 +346,96 @@ TellChanged (WindowPtr pWin, pointer val
     RREventPtr			*pHead, pRREvent;
     ClientPtr			client;
     xRRScreenChangeNotifyEvent	se;
+    xRRMonitorChangeNotifyEvent	me;
     ScreenPtr			pScreen = pWin->drawable.pScreen;
     rrScrPriv(pScreen);
-    RRScreenSizePtr		pSize;
+    RRMonitorPtr		pMonitor = pScrPriv->pMonitors;
+    RRModePtr			pMode;
     WindowPtr			pRoot = WindowTable[pScreen->myNum];
+    int				i;
 
     pHead = (RREventPtr *) LookupIDByType (pWin->drawable.id, EventType);
     if (!pHead)
 	return WT_WALKCHILDREN;
 
-    se.type = RRScreenChangeNotify + RREventBase;
-    se.rotation = (CARD8) pScrPriv->rotation;
-    se.timestamp = pScrPriv->lastSetTime.milliseconds;
-    se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
-    se.root =  pRoot->drawable.id;
-    se.window = pWin->drawable.id;
-#ifdef RENDER
-    se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
-#else
-    se.subpixelOrder = SubPixelUnknown;
-#endif
-    if (pScrPriv->size >= 0)
-    {
-	pSize = &pScrPriv->pSizes[pScrPriv->size];
-	se.sizeID = pSize->id;
-	se.widthInPixels = pSize->width;
-	se.heightInPixels = pSize->height;
-	se.widthInMillimeters = pSize->mmWidth;
-	se.heightInMillimeters = pSize->mmHeight;
-    }
-    else
-    {
-	/*
-	 * This "shouldn't happen", but a broken DDX can
-	 * forget to set the current configuration on GetInfo
-	 */
-	se.sizeID = 0xffff;
-	se.widthInPixels = 0;
-	se.heightInPixels = 0;
-	se.widthInMillimeters = 0;
-	se.heightInMillimeters = 0;
-    }    
     for (pRREvent = *pHead; pRREvent; pRREvent = pRREvent->next) 
     {
 	client = pRREvent->client;
 	if (client == serverClient || client->clientGone)
 	    continue;
-	se.sequenceNumber = client->sequence;
-	if(pRREvent->mask & RRScreenChangeNotifyMask)
-	  WriteEventsToClient (client, 1, (xEvent *) &se);
+
+	if (pRREvent->mask & RRMonitorChangeNotifyMask)) 
+	{
+	    me.type = RRNotify + RREventBase;
+	    me.subCode = RRNotify_MonitorChange;
+	    me.timestamp = pScrPriv->lastSetTime.milliseconds;
+	    me.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+	    me.root =  pRoot->drawable.id;
+	    me.window = pWin->drawable.id;
+#ifdef RENDER
+	    me.subpixelOrder = PictureGetSubpixelOrder (pScreen);
+#else
+	    me.subpixelOrder = SubPixelUnknown;
+#endif
+	    for (i = 0; i < pScrPriv->nMonitors; i++) 
+	    {
+		pMonitor = &pScrPriv->pMonitors[i];
+		me.monitor = i;
+		if (pMonitor->mode >= 0) {
+		    me.modeID = pMonitor->pMode[pMonitor->mode].id;
+		    me.rotation = pMonitor->rotation;
+		    me.x = pMonitor->x;
+		    me.y = pMonitor->y;
+		} else {
+		    me.modeID = 0xffff;
+		    me.rotation = RR_Rotate_0;
+		    me.x = 0;
+		    me.y = 0;
+		}
+		WriteEventsToClient (client, 1, (xEvent *) &me);
+	    }
+	}
+	if ((pRREvent->mask & RRScreenChangeNotifyMask) &&
+	    pScrPriv->nMonitors > 0)
+	{
+	    se.type = RRScreenChangeNotify + RREventBase;
+	    se.rotation = (CARD8) pScrPriv->rotation;
+	    se.timestamp = pScrPriv->lastSetTime.milliseconds;
+	    se.sequenceNumber = client->sequence;
+	    se.configTimestamp = pScrPriv->lastConfigTime.milliseconds;
+	    se.root =  pRoot->drawable.id;
+	    se.window = pWin->drawable.id;
+#ifdef RENDER
+	    se.subpixelOrder = PictureGetSubpixelOrder (pScreen);
+#else
+	    se.subpixelOrder = SubPixelUnknown;
+#endif
+
+	    pMonitor = &pScrPriv->pMonitors[0];
+	    se.sequenceNumber = client->sequence;
+	    if (pMonitor->mode >= 0) 
+	    {
+		pMode = &pMonitor->pModes[pMonitor->mode];
+		se.sizeID = pMode->id;
+		se.widthInPixels = pMode->width;
+		se.heightInPixels = pMode->height;
+		se.widthInMillimeters = pMode->mmWidth;
+		se.heightInMillimeters = pMode->mmHeight;
+	    }
+	    else
+	    {
+		/*
+		 * This "shouldn't happen", but a broken DDX can
+		 * forget to set the current configuration on GetInfo
+		 */
+		se.sizeID = 0xffff;
+		se.widthInPixels = 0;
+		se.heightInPixels = 0;
+		se.widthInMillimeters = 0;
+		se.heightInMillimeters = 0;
+	    }    
+	    WriteEventsToClient (client, 1, (xEvent *) &se);
+	}
     }
     return WT_WALKCHILDREN;
 }
@@ -375,59 +444,66 @@ static Bool
 RRGetInfo (ScreenPtr pScreen)
 {
     rrScrPriv (pScreen);
-    int		    i, j, k, l;
+    int		    m, s, n;
     Bool	    changed;
     Rotation	    rotations;
-    RRScreenSizePtr pSize;
-    RRScreenRatePtr pRate;
+    RRMonitorPtr    pMonitor;
+    RRModePtr	    pMode;
 
-    for (i = 0; i < pScrPriv->nSizes; i++)
+    for (m = 0; m < pScrPriv->nMonitors; m++)
     {
-	pSize = &pScrPriv->pSizes[i];
-	pSize->oldReferenced = pSize->referenced;
-	pSize->referenced = FALSE;
-	for (k = 0; k < pSize->nRates; k++)
-	{
-	    pRate = &pSize->pRates[k];
-	    pRate->oldReferenced = pRate->referenced;
-	    pRate->referenced = FALSE;
+	pMonitor = &pScrPriv->pMonitors[m];
+	pMonitor->oldReferenced = pMonitor->referenced;
+	pMonitor->referenced = FALSE;
+	for (s = 0; s < pMonitor->nModes; s++)
+	{
+	    pMode = &pSize->pModes[s];
+	    pMode->oldReferenced = pMode->referenced;
+	    pMode->referenced = FALSE;
 	}
     }
-    if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
-	return FALSE;
-
     changed = FALSE;
 
-    /*
-     * Check whether anything changed and simultaneously generate
-     * the protocol id values for the objects
-     */
-    if (rotations != pScrPriv->rotations)
-    {
-	pScrPriv->rotations = rotations;
-	changed = TRUE;
+    rotations = 0;
+    if (!(*pScrPriv->rrGetInfo) (pScreen, &rotations))
+	return FALSE;
+    
+    /* Old GetInfo clients return rotations here */
+    if (rotations && pScrPriv->nMonitors) {
+	/*
+	 * Check whether anything changed and simultaneously generate
+	 * the protocol id values for the objects
+	 */
+	if (rotations != pScrPriv->pMonitors[i].rotations)
+	{
+	    pScrPriv->pMonitors[i].rotations = rotations;
+	    changed = TRUE;
+	}
     }
-
-    j = 0;
-    for (i = 0; i < pScrPriv->nSizes; i++)
-    {
-	pSize = &pScrPriv->pSizes[i];
-	if (pSize->oldReferenced != pSize->referenced)
+	
+    n = 0;
+    for (m = 0; m < pScrPriv->nMonitors; m++)
+    {
+	int modeid = 0;
+	
+	pMonitor = &pScrPriv->pMonitors[m];
+	if (pMonitor->oldReferenced != pMonitor->referenced)
 	    changed = TRUE;
-	if (pSize->referenced)
-	    pSize->id = j++;
-	l = 0;
-	for (k = 0; k < pSize->nRates; k++)
-	{
-	    pRate = &pSize->pRates[k];
-	    if (pRate->oldReferenced != pRate->referenced)
-		changed = TRUE;
-	    if (pRate->referenced)
-		l++;
+	if (pMonitor->referenced)
+	{
+	    for (s = 0; s < pMonitor->nModes; s++)
+	    {
+		pMode = &pMonitor->pModes[s];
+		if (pMode->oldReferenced != pMode->referenced)
+		    changed = TRUE;
+		if (pMode->referenced)
+		    pMode->id = modeid++;
+	    }
+	    n++;
 	}
-	pSize->nRatesInUse = l;
+	pMonitor->nModesInUse = modeid;
     }
-    pScrPriv->nSizesInUse = j;
+    pScrPriv->nMonitorsInUse = n;
     if (changed)
     {
 	UpdateCurrentTime ();
@@ -1241,6 +1317,7 @@ RRRegisterSize (ScreenPtr	    pScreen,
     if (!pScrPriv)
 	return 0;
     
+    tmp.id = -1;
     tmp.width = width;
     tmp.height= height;
     tmp.mmWidth = mmWidth;
diff --git a/randr/randrstr.h b/randr/randrstr.h
index 27ab61a..07c6c37 100644
--- a/randr/randrstr.h
+++ b/randr/randrstr.h
@@ -1,24 +1,28 @@
 /*
- *
  * Copyright © 2000 Compaq Computer Corporation
+ * Copyright © 2002 Hewlett-Packard Company
+ * Copyright © 2006 Intel Corporation
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Compaq not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Compaq makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * the above copyright notice appear in all copies and that both that copyright
+ * notice and this permission notice appear in supporting documentation, and
+ * that the name of the copyright holders not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  The copyright holders make no representations
+ * about the suitability of this software for any purpose.  It is provided "as
+ * is" without express or implied warranty.
  *
- * COMPAQ DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL COMPAQ BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ *
+ * Author:  Jim Gettys, Hewlett-Packard Company, Inc.
+ *	    Keith Packard, Intel Corporation
  */
 
 #ifdef HAVE_DIX_CONFIG_H
@@ -28,56 +32,83 @@
 #ifndef _RANDRSTR_H_
 #define _RANDRSTR_H_
 
-#include <X11/extensions/randr.h>
+#include <X11/extensions/randrproto.h>
 
-typedef struct _rrScreenRate {
-    int		    rate;
+typedef struct _rrMode {
+    struct _rrMode  *next;
+    int		    id;
     Bool	    referenced;
     Bool	    oldReferenced;
-} RRScreenRate, *RRScreenRatePtr;
+    xRRMonitorMode  mode;
+} RRMode, *RRModePtr;
 
-typedef struct _rrScreenSize {
-    int		    id;
-    short	    width, height;
-    short	    mmWidth, mmHeight;
-    RRScreenRatePtr pRates;
-    int		    nRates;
-    int		    nRatesInUse;
+typedef struct _rrMonitor {
+    struct _rrMonitor	*next;
+    ScreenPtr	    pScreen;
+    RRModePtr	    pModes;
+    void	    *identifier;    /* made unique by DDX */
     Bool	    referenced;
-    Bool	    oldReferenced;
-} RRScreenSize, *RRScreenSizePtr;
+    
+    /*
+     * Current state
+     */
+    int		    mode;
+    int		    x, y;
+    Rotation	    rotation;
+} RRMonitor, *RRMonitorPtr;
+
+typedef Bool (*RRSetScreenSizeProcPtr) (ScreenPtr	pScreen,
+					CARD16		width,
+					CARD16		height,
+					CARD32		widthInMM,
+					CARD32		heightInMM);
+					
+typedef Bool (*RRSetModeProcPtr) (ScreenPtr		pScreen,
+				  int			monitor,
+				  RRModePtr		pMode,
+				  int			x,
+				  int			y,
+				  Rotation		rotation);
+
+typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations);
+typedef Bool (*RRCloseScreenProcPtr) ( int i, ScreenPtr pscreen);
+
+
+#ifdef RANDR_SCREEN_INTERFACE
+
+typedef void *RRScreenSizePtr;
 
 typedef Bool (*RRSetConfigProcPtr) (ScreenPtr		pScreen,
 				    Rotation		rotation,
 				    int			rate,
 				    RRScreenSizePtr	pSize);
 
-typedef Bool (*RRGetInfoProcPtr) (ScreenPtr pScreen, Rotation *rotations);
-typedef Bool (*RRCloseScreenProcPtr) ( int i, ScreenPtr pscreen);
+#endif
 	
+
 typedef struct _rrScrPriv {
-    RRSetConfigProcPtr	    rrSetConfig;
+    RRSetModeProcPtr	    rrSetMode;
     RRGetInfoProcPtr	    rrGetInfo;
+    RRCloseScreenProcPtr    CloseScreen;
     
     TimeStamp		    lastSetTime;	/* last changed by client */
     TimeStamp		    lastConfigTime;	/* possible configs changed */
-    RRCloseScreenProcPtr    CloseScreen;
 
     /*
+     * monitor data
+     */
+    RRMonitorPtr	    pMonitors;
+
+#ifdef RANDR_SCREEN_INTERFACE
+    /*
      * Configuration information
      */
     Rotation		    rotations;
     
-    int			    nSizes;
-    int			    nSizesInUse;
-    RRScreenSizePtr	    pSizes;
+    RRSetConfigProcPtr	    rrSetConfig;
 
-    /*
-     * Current state
-     */
     Rotation		    rotation;
-    int			    size;
-    int			    rate;
+#endif
 } rrScrPrivRec, *rrScrPrivPtr;
 
 extern int rrPrivIndex;
@@ -91,6 +122,60 @@ void
 RRExtensionInit (void);
 
 /*
+ * Then, register a monitor with the screen
+ */
+
+RRMonitorPtr
+RRRegisterMonitor (ScreenPtr		pScreen,
+		   void			*identifier,
+		   Rotation		rotations);
+
+/*
+ * Next, register the list of modes with the monitor
+ */
+
+RRModePtr
+RRRegisterMode (RRMonitorPtr	pMonitor,
+		xRRMonitorMode	*pMode,
+		char		*name,
+		int		nameLength);
+
+/*
+ * Finally, set the current configuration of each monitor
+ */
+
+void
+RRSetCurrentMode (RRMonitorPtr	pMonitor,
+		  RRModePtr	pMode,
+		  Rotation	rotation);
+
+Bool RRScreenInit(ScreenPtr pScreen);
+
+Rotation
+RRGetRotation (ScreenPtr pScreen);
+
+Bool
+miRandRInit (ScreenPtr pScreen);
+
+Bool
+miRRGetInfo (ScreenPtr pScreen, Rotation *rotations);
+
+Bool
+miRRGetScreenInfo (ScreenPtr pScreen);
+
+Bool
+miRRSetMode (ScreenPtr	pScreen,
+	     int	monitor,
+	     RRModePtr	pMode,
+	     Rotation	rotation);
+
+#ifdef RANDR_SCREEN_INTERFACE					
+/*
+ * This is the old interface, deprecated but left
+ * around for compatibility
+ */
+
+/*
  * Then, register the specific size with the screen
  */
 
@@ -105,6 +190,9 @@ Bool RRRegisterRate (ScreenPtr		pScreen,
 		     RRScreenSizePtr	pSize,
 		     int		rate);
 
+Bool RRRegisterRotation (ScreenPtr	pScreen,
+			 Rotation	rotation);
+
 /*
  * Finally, set the current configuration of the screen
  */
@@ -115,11 +203,6 @@ RRSetCurrentConfig (ScreenPtr		pScreen,
 		    int			rate,
 		    RRScreenSizePtr	pSize);
 
-Bool RRScreenInit(ScreenPtr pScreen);
-
-Rotation
-RRGetRotation (ScreenPtr pScreen);
-
 int
 RRSetScreenConfig (ScreenPtr		pScreen,
 		   Rotation		rotation,
@@ -127,18 +210,10 @@ RRSetScreenConfig (ScreenPtr		pScreen,
 		   RRScreenSizePtr	pSize);
 
 Bool
-miRandRInit (ScreenPtr pScreen);
-
-Bool
-miRRGetInfo (ScreenPtr pScreen, Rotation *rotations);
-
-Bool
 miRRSetConfig (ScreenPtr	pScreen,
 	       Rotation		rotation,
 	       int		rate,
 	       RRScreenSizePtr	size);
 
-Bool
-miRRGetScreenInfo (ScreenPtr pScreen);
-
+#endif					
 #endif /* _RANDRSTR_H_ */
diff-tree 46af6d1e953f1eefb6edbba3d29fb9700e42c2bb (from 63acf18b7e4ce3a9f7deab3a9088a1c41cab0191)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 19:28:44 2006 -0400

    Always believe the monitor when it reports a reduced-blanking mode.
    
    CVT reduced blanking modes are typically only seen on digital connections to
    LCDs, but there are some monitors that report them as supported over the
    VGA connector too, which is perfectly legitimate, electrically speaking.

diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index ac3fb8c..456331d 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -832,7 +832,7 @@ xf86CheckModeForMonitor(DisplayModePtr m
             ((mode->HSyncEnd - mode->HDisplay) == 80) &&
             ((mode->HSyncEnd - mode->HSyncStart) == 32) &&
             ((mode->VSyncStart - mode->VDisplay) == 3)) {
-            if (!monitor->reducedblanking)
+            if (!monitor->reducedblanking && !(mode->type & M_T_DRIVER))
                 return MODE_NO_REDUCED;
         }
     }
diff-tree 63acf18b7e4ce3a9f7deab3a9088a1c41cab0191 (from a8f9936f55c5364bb02e8c3187507eb1f70e2ef2)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 19:26:37 2006 -0400

    In xf86MatchPciInstances, fail gracefully when there's no PCI device at all.
    
    This allows the autoconfig logic to fall through sanely on non-PCI machines,
    which importantly includes Xen virtual machines.

diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 851a345..c226bf2 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -1635,6 +1635,8 @@ xf86MatchPciInstances(const char *driver
 
     *foundEntities = NULL;
 
+    if (!xf86PciVideoInfo)
+	return 0;
 
     /* Each PCI device will contribute at least one entry.  Each device
      * section can contribute at most one entry.  The sum of the two is
diff-tree a8f9936f55c5364bb02e8c3187507eb1f70e2ef2 (from 81ef1b6d6063c20db4963abf7b7848e235aa4ebb)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 19:24:41 2006 -0400

    Prefer driver-provided modes when matching name strings to modelines.
    
    Well, kinda.  Strictly we prefer M_T_BUILTIN strongest since those are modes
    where the driver has said it absolutely can't do anything else (VBE).  Then
    we look for user-defined modes, ie, modelines from the config file.  Then
    we consider modes reported by the monitor via EDID.  Finally if nothing has
    matched yet we consider the default mode pool.
    
    Within each of the above-mentioned classes, modes with the M_T_PREFERRED bit
    take priority over other modes in the same class.
    
    This logic ensures that the timings sent to the monitor exactly match the
    timings it reported as supported, which occasionally don't match the numbers
    you might get for that mode from CVT or GTF.

diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index a3ef420..ac3fb8c 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -445,6 +445,17 @@ xf86LookupMode(ScrnInfoPtr scrp, Display
     ModeStatus status = MODE_NOMODE;
     Bool allowDiv2 = (strategy & LOOKUP_CLKDIV2) != 0;
     Bool haveBuiltin;
+    int n;
+    const int types[] = {
+	M_T_BUILTIN | M_T_PREFERRED,
+	M_T_BUILTIN,
+	M_T_USERDEF | M_T_PREFERRED,
+	M_T_USERDEF,
+	M_T_DRIVER | M_T_PREFERRED,
+	M_T_DRIVER,
+	0
+    };
+    const int ntypes = sizeof(types) / sizeof(int);
 
     strategy &= ~(LOOKUP_CLKDIV2 | LOOKUP_OPTIONAL_TOLERANCES);
 
@@ -464,143 +475,141 @@ xf86LookupMode(ScrnInfoPtr scrp, Display
 	cp->ClockMulFactor = max(1, cp->ClockMulFactor);
     }
 
-    haveBuiltin = FALSE;
     /* Scan the mode pool for matching names */
-    for (p = scrp->modePool; p != NULL; p = p->next) {
-	if (strcmp(p->name, modep->name) == 0) {
-	    /*
-	     * Requested mode is a built-in mode. Don't let the user
-	     * override it.
-	     * Since built-in modes always come before user specified
-	     * modes it will always be found first.  
-	     */
-	    if (p->type & M_T_BUILTIN) {
-		haveBuiltin = TRUE;
-	    }
+    for (n = 0; n < ntypes; n++) {
+	int type = types[n];
+	for (p = scrp->modePool; p != NULL; p = p->next) {
 
-	    if (haveBuiltin && !(p->type & M_T_BUILTIN))
+	    /* scan through the modes in the sort order above */
+	    if ((p->type & type) != type)
 		continue;
 
-	    /* Skip over previously rejected modes */
-	    if (p->status != MODE_OK) {
-		if (!found)
-		    status = p->status;
-		continue;
-	    }
-		
-	    /* Skip over previously considered modes */
-	    if (p->prev)
-		continue;
+	    if (strcmp(p->name, modep->name) == 0) {
 
-	    if (p->type & M_T_BUILTIN) {
-		return xf86HandleBuiltinMode(scrp, p,modep, clockRanges,
-					     allowDiv2);
-	    }
+		/* Skip over previously rejected modes */
+		if (p->status != MODE_OK) {
+		    if (!found)
+			status = p->status;
+		    continue;
+		}
 
-	    /* Check clock is in range */
-	    cp = xf86FindClockRangeForMode(clockRanges, p);
-	    if (cp == NULL) {
-		/*
-		 * XXX Could do more here to provide a more detailed
-		 * reason for not finding a mode.
-		 */
-		p->status = MODE_CLOCK_RANGE;
-		if (!found)
-		    status = MODE_CLOCK_RANGE;
-		continue;
-	    }
+		/* Skip over previously considered modes */
+		if (p->prev)
+		    continue;
 
-	    /*
-	     * If programmable clock and strategy is not LOOKUP_BEST_REFRESH,
-	     * the required mode has been found, otherwise record the refresh
-	     * and continue looking.
-	     */
-	    if (scrp->progClock) {
-		found = TRUE;
-		if (strategy != LOOKUP_BEST_REFRESH) {
-		    bestMode = p;
-		    DivFactor = cp->ClockDivFactor;
-		    MulFactor = cp->ClockMulFactor;
-		    ModePrivFlags = cp->PrivFlags;
-		    break;
+		if (p->type & M_T_BUILTIN) {
+		    return xf86HandleBuiltinMode(scrp, p,modep, clockRanges,
+			    allowDiv2);
 		}
-		refresh = ModeVRefresh(p);
-		if (p->Flags & V_INTERLACE)
-		    refresh /= INTERLACE_REFRESH_WEIGHT;
-		if (refresh > bestRefresh) {
-		    bestMode = p;
-		    DivFactor = cp->ClockDivFactor;
-		    MulFactor = cp->ClockMulFactor;
-		    ModePrivFlags = cp->PrivFlags;
-		    bestRefresh = refresh;
+
+		/* Check clock is in range */
+		cp = xf86FindClockRangeForMode(clockRanges, p);
+		if (cp == NULL) {
+		    /*
+		     * XXX Could do more here to provide a more detailed
+		     * reason for not finding a mode.
+		     */
+		    p->status = MODE_CLOCK_RANGE;
+		    if (!found)
+			status = MODE_CLOCK_RANGE;
+		    continue;
 		}
-		continue;
-	    }
 
-	    /*
-	     * Clock is in range, so if it is not a programmable clock, find
-	     * a matching clock.
-	     */
+		/*
+		 * If programmable clock and strategy is not
+		 * LOOKUP_BEST_REFRESH, the required mode has been found,
+		 * otherwise record the refresh and continue looking.
+		 */
+		if (scrp->progClock) {
+		    found = TRUE;
+		    if (strategy != LOOKUP_BEST_REFRESH) {
+			bestMode = p;
+			DivFactor = cp->ClockDivFactor;
+			MulFactor = cp->ClockMulFactor;
+			ModePrivFlags = cp->PrivFlags;
+			break;
+		    }
+		    refresh = ModeVRefresh(p);
+		    if (p->Flags & V_INTERLACE)
+			refresh /= INTERLACE_REFRESH_WEIGHT;
+		    if (refresh > bestRefresh) {
+			bestMode = p;
+			DivFactor = cp->ClockDivFactor;
+			MulFactor = cp->ClockMulFactor;
+			ModePrivFlags = cp->PrivFlags;
+			bestRefresh = refresh;
+		    }
+		    continue;
+		}
 
-	    i = xf86GetNearestClock(scrp, p->Clock, allowDiv2,
-		cp->ClockDivFactor, cp->ClockMulFactor, &k);
-	    /*
-	     * If the clock is too far from the requested clock, this
-	     * mode is no good.
-	     */
-	    if (k & V_CLKDIV2)
-		gap = abs((p->Clock * 2) -
-		    ((scrp->clock[i] * cp->ClockDivFactor) / cp->ClockMulFactor));
-	    else
-		gap = abs(p->Clock -
-		    ((scrp->clock[i] * cp->ClockDivFactor) / cp->ClockMulFactor));
-	    if (gap > minimumGap) {
-		p->status = MODE_NOCLOCK;
-		if (!found)
-		    status = MODE_NOCLOCK;
-		continue;
-	    }
-	    found = TRUE;
+		/*
+		 * Clock is in range, so if it is not a programmable clock, find
+		 * a matching clock.
+		 */
 
-	    if (strategy == LOOKUP_BEST_REFRESH) {
-		refresh = ModeVRefresh(p);
-		if (p->Flags & V_INTERLACE)
-		    refresh /= INTERLACE_REFRESH_WEIGHT;
-		if (refresh > bestRefresh) {
-		    bestMode = p;
-		    DivFactor = cp->ClockDivFactor;
-		    MulFactor = cp->ClockMulFactor;
-		    ModePrivFlags = cp->PrivFlags;
-		    extraFlags = k;
-		    clockIndex = i;
-		    bestRefresh = refresh;
+		i = xf86GetNearestClock(scrp, p->Clock, allowDiv2,
+			cp->ClockDivFactor, cp->ClockMulFactor, &k);
+		/*
+		 * If the clock is too far from the requested clock, this
+		 * mode is no good.
+		 */
+		if (k & V_CLKDIV2)
+		    gap = abs((p->Clock * 2) -
+			    ((scrp->clock[i] * cp->ClockDivFactor) /
+				cp->ClockMulFactor));
+		else
+		    gap = abs(p->Clock -
+			    ((scrp->clock[i] * cp->ClockDivFactor) /
+				cp->ClockMulFactor));
+		if (gap > minimumGap) {
+		    p->status = MODE_NOCLOCK;
+		    if (!found)
+			status = MODE_NOCLOCK;
+		    continue;
 		}
-		continue;
-	    }
-	    if (strategy == LOOKUP_CLOSEST_CLOCK) {
-		if (gap < minimumGap) {
-		    bestMode = p;
-		    DivFactor = cp->ClockDivFactor;
-		    MulFactor = cp->ClockMulFactor;
-		    ModePrivFlags = cp->PrivFlags;
-		    extraFlags = k;
-		    clockIndex = i;
-		    minimumGap = gap;
+		found = TRUE;
+
+		if (strategy == LOOKUP_BEST_REFRESH) {
+		    refresh = ModeVRefresh(p);
+		    if (p->Flags & V_INTERLACE)
+			refresh /= INTERLACE_REFRESH_WEIGHT;
+		    if (refresh > bestRefresh) {
+			bestMode = p;
+			DivFactor = cp->ClockDivFactor;
+			MulFactor = cp->ClockMulFactor;
+			ModePrivFlags = cp->PrivFlags;
+			extraFlags = k;
+			clockIndex = i;
+			bestRefresh = refresh;
+		    }
+		    continue;
 		}
-		continue;
+		if (strategy == LOOKUP_CLOSEST_CLOCK) {
+		    if (gap < minimumGap) {
+			bestMode = p;
+			DivFactor = cp->ClockDivFactor;
+			MulFactor = cp->ClockMulFactor;
+			ModePrivFlags = cp->PrivFlags;
+			extraFlags = k;
+			clockIndex = i;
+			minimumGap = gap;
+		    }
+		    continue;
+		}
+		/*
+		 * If strategy is neither LOOKUP_BEST_REFRESH or
+		 * LOOKUP_CLOSEST_CLOCK the required mode has been found.
+		 */
+		bestMode = p;
+		DivFactor = cp->ClockDivFactor;
+		MulFactor = cp->ClockMulFactor;
+		ModePrivFlags = cp->PrivFlags;
+		extraFlags = k;
+		clockIndex = i;
+		break;
 	    }
-	    /*
-	     * If strategy is neither LOOKUP_BEST_REFRESH or
-	     * LOOKUP_CLOSEST_CLOCK the required mode has been found.
-	     */
-	    bestMode = p;
-	    DivFactor = cp->ClockDivFactor;
-	    MulFactor = cp->ClockMulFactor;
-	    ModePrivFlags = cp->PrivFlags;
-	    extraFlags = k;
-	    clockIndex = i;
-	    break;
 	}
+	if (found) break;
     }
     if (!found || bestMode == NULL)
 	return status;
@@ -611,7 +620,8 @@ xf86LookupMode(ScrnInfoPtr scrp, Display
 	modep->ClockIndex	= -1;
 	modep->SynthClock	= (modep->Clock * MulFactor) / DivFactor;
     } else {
-	modep->Clock		= (scrp->clock[clockIndex] * DivFactor) / MulFactor;
+	modep->Clock		= (scrp->clock[clockIndex] * DivFactor) /
+				    MulFactor;
 	modep->ClockIndex	= clockIndex;
 	modep->SynthClock	= scrp->clock[clockIndex];
 	if (extraFlags & V_CLKDIV2) {
diff-tree 81ef1b6d6063c20db4963abf7b7848e235aa4ebb (from 43d9edd31e31b33b9da4a50d8ab05004881c8d5a)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 19:18:58 2006 -0400

    Mark EDID modes as driver modes.  Infer virtual size from driver modes.
    
    This allows the server to guess an appropriate initial virtual size and
    resolution.  The heuristic is to select the largest driver-reported mode
    that matches the monitor's physical aspect ratio.  We revalidate this
    estimate after mode validation, since we may have filtered away all
    modes that would fill that size.
    
    Also, the EDID preferred timing is now marked as M_T_PREFERRED as well.

diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index c66a3fb..a3ef420 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -45,6 +45,7 @@
 #include "globals.h"
 #include "xf86.h"
 #include "xf86Priv.h"
+#include "edid.h"
 
 static void
 printModeRejectMessage(int index, DisplayModePtr p, int status)
@@ -55,6 +56,8 @@ printModeRejectMessage(int index, Displa
 	type = "built-in ";
     else if (p->type & M_T_DEFAULT)
 	type = "default ";
+    else if (p->type & M_T_DRIVER)
+	type = "driver ";
     else
 	type = "";
 
@@ -1177,6 +1180,58 @@ xf86CheckModeForDriver(ScrnInfoPtr scrp,
     return MODE_OK;
 }
 
+static int 
+inferVirtualSize(ScrnInfoPtr scrp, DisplayModePtr modes, int *vx, int *vy)
+{
+    float aspect = 0.0;
+    MonPtr mon = scrp->monitor;
+    int x = 0, y = 0;
+    DisplayModePtr mode;
+
+    if (!mon) return 0;
+
+    /*
+     * technically this triggers if _either_ is zero, which is not what EDID
+     * says, but if only one is zero this is best effort.  also we don't
+     * know that all projectors are 4:3, but we certainly suspect it.
+     */
+    if (!mon->widthmm || !mon->heightmm)
+	aspect = 4.0/3.0;
+    else
+	aspect = (float)mon->widthmm / (float)mon->heightmm;
+
+    /* find the largest M_T_DRIVER mode with that aspect ratio */
+    for (mode = modes; mode; mode = mode->next) {
+	float mode_aspect, metaspect;
+	if (!(mode->type & (M_T_DRIVER|M_T_USERDEF)))
+	    continue;
+	mode_aspect = (float)mode->HDisplay / (float)mode->VDisplay;
+	metaspect = aspect / mode_aspect;
+	/* 5% slop or so, since we only get size in centimeters */
+	if (fabs(1.0 - metaspect) < 0.05) {
+	    if ((mode->HDisplay > x) && (mode->VDisplay > y)) {
+		x = mode->HDisplay;
+		y = mode->VDisplay;
+	    }
+	}
+    }
+
+    if (!x || !y) {
+	xf86DrvMsg(scrp->scrnIndex, X_WARNING,
+		   "Unable to estimate virtual size\n");
+	return 0;
+    }
+
+    *vx = x;
+    *vy = y;
+
+    xf86DrvMsg(scrp->scrnIndex, X_INFO,
+	       "Estimated virtual size for aspect ratio %.4f is %dx%d\n",
+	       aspect, *vx, *vy);
+
+    return 1;
+}
+
 /*
  * xf86ValidateModes
  *
@@ -1248,6 +1303,7 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
     int numTimings = 0;
     range hsync[MAX_HSYNC];
     range vrefresh[MAX_VREFRESH];
+    Bool inferred_virtual = FALSE;
 
 #ifdef DEBUG
     ErrorF("xf86ValidateModes(%p, %p, %p, %p,\n\t\t  %p, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x)\n",
@@ -1440,6 +1496,13 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
 	virtX = virtualX;
 	virtY = virtualY;
 	scrp->virtualFrom = X_CONFIG;
+    } else if (!modeNames || !*modeNames) {
+	/* No virtual size given in the config, try to infer */
+	/* XXX this doesn't take m{in,ax}Pitch into account; oh well */
+	inferred_virtual = inferVirtualSize(scrp, availModes, &virtX, &virtY);
+	if (inferred_virtual)
+	    linePitch = miScanLineWidth(virtX, virtY, minPitch, apertureSize,
+					BankFormat, pitchInc);
     }
 
     /* Print clock ranges and scaled clocks */
@@ -1456,7 +1519,7 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
 	for (p = availModes; p != NULL; p = p->next) {
 	    status = xf86InitialCheckModeForDriver(scrp, p, clockRanges,
 						   strategy, maxPitch,
-						   virtualX, virtualY);
+						   virtX, virtY);
 
 	    if (status == MODE_OK) {
 		status = xf86CheckModeForMonitor(p, scrp->monitor);
@@ -1733,6 +1796,30 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
 
 #undef _VIRTUALX
 
+    /*
+     * If we estimated the virtual size above, we may have filtered away all
+     * the modes that maximally match that size; scan again to find out and
+     * fix up if so.
+     */
+    if (inferred_virtual) {
+	int vx = 0, vy = 0;
+	for (p = scrp->modes; p; p = p->next) {
+	    if (p->HDisplay > vx && p->VDisplay > vy) {
+		vx = p->HDisplay;
+		vy = p->VDisplay;
+	    }
+	}
+	if (vx < virtX || vy < virtY) {
+	    xf86DrvMsg(scrp->scrnIndex, X_WARNING,
+		       "Shrinking virtual size estimate from %dx%d to %dx%d\n",
+		       virtX, virtY, vx, vy);
+	    virtX = vx;
+	    virtY = vy;
+	    linePitch = miScanLineWidth(vx, vy, linePitch, apertureSize,
+					BankFormat, pitchInc);
+	}
+    }
+
     /* Update the ScrnInfoRec parameters */
     
     scrp->virtualX = virtX;
@@ -1955,6 +2042,8 @@ xf86PrintModes(ScrnInfoPtr scrp)
 	    prefix = "Built-in mode";
 	else if (p->type & M_T_DEFAULT)
 	    prefix = "Default mode";
+	else if (p->type & M_T_DRIVER)
+	    prefix = "Driver mode";
 	else
 	    prefix = "Mode";
 	if (p->type & M_T_USERDEF)
diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index 59873fa..a1650bc 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -127,9 +127,8 @@ PrintModeline(int scrnIndex,DisplayModeP
 /*
  * TODO:
  *  - for those with access to the VESA DMT standard; review please.
- *  - swap M_T_DEFAULT for M_T_EDID_...
  */
-#define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DEFAULT
+#define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DRIVER
 #define MODESUFFIX   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0
 
 DisplayModeRec DDCEstablishedModes[17] = {
@@ -182,6 +181,7 @@ DDCModesFromStandardTiming(int scrnIndex
         if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
             Mode =  xf86CVTMode(timing[i].hsize, timing[i].vsize,
                                 timing[i].refresh, FALSE, FALSE);
+	    Mode->type = M_T_DRIVER;
             Modes = xf86ModesAdd(Modes, Mode);
         }
 
@@ -192,7 +192,8 @@ DDCModesFromStandardTiming(int scrnIndex
  *
  */
 static DisplayModePtr
-DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing)
+DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing,
+			  int preferred)
 {
     DisplayModePtr Mode;
 
@@ -205,9 +206,8 @@ DDCModeFromDetailedTiming(int scrnIndex,
     
     /* We only do seperate sync currently */
     if (timing->sync != 0x03) {
-         xf86DrvMsg(scrnIndex, X_INFO, "%s: Ignoring: We only handle seperate"
-                    " sync.\n", __func__);
-         return NULL;
+         xf86DrvMsg(scrnIndex, X_INFO, "%s: %dx%d Warning: We only handle seperate"
+                    " sync.\n", __func__, timing->h_active, timing->v_active);
     }
     
     Mode = xnfalloc(sizeof(DisplayModeRec));
@@ -217,7 +217,9 @@ DDCModeFromDetailedTiming(int scrnIndex,
     xf86snprintf(Mode->name, 20, "%dx%d", timing->h_active,
                  timing->v_active);
     
-    Mode->type = M_T_DEFAULT; /* get ourselves a nice type of our own */
+    Mode->type = M_T_DRIVER;
+    if (preferred)
+	Mode->type |= M_T_PREFERRED;
     
     Mode->Clock = timing->clock / 1000.0;
     
@@ -302,12 +304,15 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
     DisplayModePtr Modes = NULL, Mode;
     int i, clock;
     Bool have_hsync = FALSE, have_vrefresh = FALSE;
+    int preferred;
     
     if (!Monitor || !DDC)
         return;
 
     Monitor->DDC = DDC;
 
+    preferred = PREFERRED_TIMING_MODE(DDC->features.msc);
+
     Monitor->widthmm = 10 * DDC->features.hsize;
     Monitor->heightmm = 10 * DDC->features.vsize;
     
@@ -367,7 +372,9 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
             break;
         case DT:
             Mode = DDCModeFromDetailedTiming(scrnIndex, 
-                                             &DDC->det_mon[i].section.d_timings);
+                                             &DDC->det_mon[i].section.d_timings,
+					     preferred);
+	    preferred = 0;
             Modes = xf86ModesAdd(Modes, Mode);
             break;
         case DS_STD_TIMINGS:
diff-tree 43d9edd31e31b33b9da4a50d8ab05004881c8d5a (from 739224d05eb4f356c9cab9dcb8a44a8d78287765)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 19:09:02 2006 -0400

    Attempt to add the 'mouse' driver in more situations.
    
    Always add a mouse driver instance configured to send core events, unless
    a core pointer already exists using either the mouse or void drivers.  This
    handles the laptop case where the config file only specifies, say,
    synaptics, which causes the touchpad to work but not the pointing stick.
    We don't double-instantiate the mouse driver to avoid the mouse moving twice
    as fast, and we skip this logic when the user asked for a void core pointer
    since that probably means they want to run with no pointer at all.

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index fe55c8c..dbe158e 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1450,12 +1450,13 @@ checkCoreInputDevices(serverLayoutPtr se
     IDevPtr corePointer = NULL, coreKeyboard = NULL;
     Bool foundPointer = FALSE, foundKeyboard = FALSE;
     const char *pointerMsg = NULL, *keyboardMsg = NULL;
-    IDevPtr indp;
+    IDevPtr indp, i;
     IDevRec Pointer, Keyboard;
     XF86ConfInputPtr confInput;
     XF86ConfInputRec defPtr, defKbd;
     int count = 0;
     MessageType from = X_DEFAULT;
+    int found = 0;
 
     /*
      * First check if a core pointer or core keyboard have been specified
@@ -1607,6 +1608,35 @@ checkCoreInputDevices(serverLayoutPtr se
 	return FALSE;
     }
 
+    /*
+     * always synthesize a 'mouse' section configured to send core
+     * events, unless a 'void' section is found, in which case the user
+     * probably wants to run footless.
+     */
+    for (i = servlayoutp->inputs; i->driver; i++) {
+	if (!strcmp(i->driver, "void") || !strcmp(i->driver, "mouse")) {
+	    found = 1; break;
+	}
+    }
+    if (!found) {
+	xf86Msg(X_INFO, "No default mouse found, adding one\n");
+	bzero(&defPtr, sizeof(defPtr));
+	defPtr.inp_identifier = "<default pointer>";
+	defPtr.inp_driver = "mouse";
+	confInput = &defPtr;
+	foundPointer = configInput(&Pointer, confInput, from);
+        if (foundPointer) {
+	    count++;
+	    indp = xnfrealloc(servlayoutp->inputs,
+			      (count + 1) * sizeof(IDevRec));
+	    indp[count - 1] = Pointer;
+	    indp[count - 1].extraOptions =
+				xf86addNewOption(NULL, "AlwaysCore", NULL);
+	    indp[count].identifier = NULL;
+	    servlayoutp->inputs = indp;
+	}
+    }
+
     confInput = NULL;
 
     /* 1. Check for the -keyboard command line option. */
diff-tree 739224d05eb4f356c9cab9dcb8a44a8d78287765 (from beac2bf1e48e6b77dbf7d95f086abc5abcd90cf0)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 19:03:32 2006 -0400

    Load the default module set when no Module section is given in the config.
    
    Also, synchronize that list with the list for the pseudoconfig file used
    when starting with no config file.  These really need to be better unified.

diff --git a/hw/xfree86/common/xf86AutoConfig.c b/hw/xfree86/common/xf86AutoConfig.c
index 4dcc997..4f6a98a 100644
--- a/hw/xfree86/common/xf86AutoConfig.c
+++ b/hw/xfree86/common/xf86AutoConfig.c
@@ -48,6 +48,9 @@
 	"\tLoad\t\"dbe\"\n" \
 	"\tLoad\t\"glx\"\n" \
 	"\tLoad\t\"freetype\"\n" \
+	"\tLoad\t\"type1\"\n" \
+	"\tLoad\t\"record\"\n" \
+	"\tLoad\t\"dri\"\n" \
 	"EndSection\n\n"
 
 #define BUILTIN_DEVICE_NAME \
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index f89db67..fe55c8c 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -63,7 +63,7 @@
 #include "xf86Config.h"
 #include "xf86Priv.h"
 #include "xf86_OSlib.h"
-
+#include "configProcs.h"
 #include "globals.h"
 #include "extension.h"
 
@@ -280,9 +280,21 @@ xf86ModulelistFromConfig(pointer **optli
 	        count++;
 	    modp = (XF86LoadPtr) modp->list.next;
 	}
+    } else {
+	xf86configptr->conf_modules = xnfcalloc(1, sizeof(XF86ConfModuleRec));
+    }
+
+    if (count == 0) {
+	XF86ConfModulePtr ptr = xf86configptr->conf_modules;
+	ptr = xf86addNewLoadDirective(ptr, "extmod", XF86_LOAD_MODULE, NULL);
+	ptr = xf86addNewLoadDirective(ptr, "dbe", XF86_LOAD_MODULE, NULL);
+	ptr = xf86addNewLoadDirective(ptr, "glx", XF86_LOAD_MODULE, NULL);
+	ptr = xf86addNewLoadDirective(ptr, "freetype", XF86_LOAD_MODULE, NULL);
+	ptr = xf86addNewLoadDirective(ptr, "type1", XF86_LOAD_MODULE, NULL);
+	ptr = xf86addNewLoadDirective(ptr, "record", XF86_LOAD_MODULE, NULL);
+	ptr = xf86addNewLoadDirective(ptr, "dri", XF86_LOAD_MODULE, NULL);
+	count = 7;
     }
-    if (count == 0)
-	return NULL;
 
     /*
      * allocate the memory and walk the list again to fill in the pointers
diff-tree beac2bf1e48e6b77dbf7d95f086abc5abcd90cf0 (from 71a15a7d5721073eccb3a275f353b3aa584c0d68)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 19:01:13 2006 -0400

    Expand the default sync ranges to be large enough for 800x600 at 60.

diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index c3b016f..c66a3fb 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -1294,8 +1294,8 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
 		    scrp->monitor->hsync[i].hi = hsync[i].hi;
 		}
 	    } else {
-		scrp->monitor->hsync[0].lo = 28;
-		scrp->monitor->hsync[0].hi = 33;
+		scrp->monitor->hsync[0].lo = 31.5;
+		scrp->monitor->hsync[0].hi = 37.9;
 		scrp->monitor->nHsync = 1;
 	    }
 	    type = "default ";
@@ -1323,8 +1323,8 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
 		    scrp->monitor->vrefresh[i].hi = vrefresh[i].hi;
 		}
 	    } else {
-		scrp->monitor->vrefresh[0].lo = 43;
-		scrp->monitor->vrefresh[0].hi = 72;
+		scrp->monitor->vrefresh[0].lo = 50;
+		scrp->monitor->vrefresh[0].hi = 70;
 		scrp->monitor->nVrefresh = 1;
 	    }
 	    type = "default ";
diff-tree 71a15a7d5721073eccb3a275f353b3aa584c0d68 (from 7939c8dfb7c7bed4febcdc12922fb2e17619ea36)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 19:00:10 2006 -0400

    Publish the raw EDID block as a property on the root window.
    
    This was removed in the patch for bug #5386, but is still useful.

diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index c76afbc..59873fa 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -27,6 +27,10 @@
 
 #include "xf86.h"
 #include "xf86DDC.h"
+#include <X11/Xatom.h>
+#include "property.h"
+#include "propertyst.h"
+#include "xf86DDC.h"
 
 /*
  * xf86Mode.c should have a some more DisplayModePtr list handling.
@@ -407,9 +411,88 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
     }
 }
 
-/*
- * Empty shell that keeps most drivers happy.
- */
+#define EDID1_ATOM_NAME         "XFree86_DDC_EDID1_RAWDATA"
+#define EDID2_ATOM_NAME         "XFree86_DDC_EDID2_RAWDATA"
+#define VDIF_ATOM_NAME          "XFree86_DDC_VDIF_RAWDATA"
+
+static void
+addRootWindowProperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
+{
+    Atom EDID1Atom=-1, EDID2Atom=-1;
+    CARD8 *EDID1rawdata = NULL;
+    CARD8 *EDID2rawdata = NULL;
+    int i, scrnIndex = pScrn->scrnIndex;
+    Bool makeEDID1prop = FALSE;
+    Bool makeEDID2prop = FALSE;
+
+    if (DDC->ver.version == 1) {
+	makeEDID1prop = TRUE;
+    } else if (DDC->ver.version == 2) {
+	int checksum1;
+	int checksum2;
+	makeEDID2prop = TRUE;
+
+	/* Some monitors (eg Panasonic PanaSync4)
+	 * report version==2 because they used EDID v2 spec document,
+	 * although they use EDID v1 data structure :-(
+	 *
+	 * Try using checksum to determine when we have such a monitor.
+	 */
+	checksum2 = 0;
+	for (i = 0; i < 256; i++)
+	    checksum2 += DDC->rawData[i];
+	if (checksum2 % 256) {
+	    xf86DrvMsg(scrnIndex, X_INFO, "Monitor EDID v2 checksum failed\n");
+	    xf86DrvMsg(scrnIndex, X_INFO,
+		    "XFree86_DDC_EDID2_RAWDATA property may be bad\n");
+	    checksum1 = 0;
+	    for (i = 0; i < 128; i++)
+		checksum1 += DDC->rawData[i];
+	    if (!(checksum1 % 256)) {
+		xf86DrvMsg(scrnIndex, X_INFO,
+			"Monitor EDID v1 checksum passed,\n");
+		xf86DrvMsg(scrnIndex, X_INFO,
+			"XFree86_DDC_EDID1_RAWDATA property created\n");
+		makeEDID1prop = TRUE;
+	    }
+	}
+    } else {
+	xf86DrvMsg(scrnIndex, X_PROBED, "unexpected EDID version %d.%d\n",
+		DDC->ver.version, DDC->ver.revision);
+	return;
+    }
+
+    if (makeEDID1prop) {
+	if ((EDID1rawdata = xalloc(128*sizeof(CARD8)))==NULL)
+	    return;
+
+	EDID1Atom = MakeAtom(EDID1_ATOM_NAME, sizeof(EDID1_ATOM_NAME), TRUE);
+	memcpy(EDID1rawdata, DDC->rawData, 128);
+	xf86RegisterRootWindowProperty(scrnIndex, EDID1Atom, XA_INTEGER, 8,
+		128, (unsigned char *)EDID1rawdata);
+    } 
+
+    if (makeEDID2prop) {
+	if ((EDID2rawdata = xalloc(256*sizeof(CARD8)))==NULL)
+	    return;
+
+	memcpy(EDID2rawdata, DDC->rawData, 256);
+	EDID2Atom = MakeAtom(EDID2_ATOM_NAME, sizeof(EDID2_ATOM_NAME), TRUE);
+	xf86RegisterRootWindowProperty(scrnIndex, EDID2Atom, XA_INTEGER, 8,
+		256, (unsigned char *)EDID2rawdata);
+    }
+
+#if 0
+    if (DDC->vdif) {
+#define VDIF_DUMMY_STRING "setting dummy VDIF property - please insert correct values\n"
+
+	VDIFAtom = MakeAtom(VDIF_ATOM_NAME, sizeof(VDIF_ATOM_NAME), TRUE);
+	xf86RegisterRootWindowProperty(scrnIndex, VDIFAtom, XA_STRING, 8,
+		strlen(VDIF_DUMMY_STRING), VDIF_DUMMY_STRING);
+    }
+#endif
+}
+
 Bool
 xf86SetDDCproperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
 {
@@ -418,5 +501,7 @@ xf86SetDDCproperties(ScrnInfoPtr pScrn, 
 
     xf86DDCMonitorSet(pScrn->scrnIndex, pScrn->monitor, DDC);
 
+    addRootWindowProperties(pScrn, DDC);
+
     return TRUE;
 }
diff-tree 7939c8dfb7c7bed4febcdc12922fb2e17619ea36 (from 72af975f9c8de0ff6796f1ce4b76dcf841d21e99)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 18:57:57 2006 -0400

    Bump the default pixel depth to 24, and default bpp to 32.

diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index c7d3fae..851a345 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -430,11 +430,11 @@ xf86AddPixFormat(ScrnInfoPtr pScrn, int 
 #define DO_PIX24FOR32(f) ((f & Support32bppFb) && (f & SupportConvert24to32))
 
 #ifndef GLOBAL_DEFAULT_DEPTH
-#define GLOBAL_DEFAULT_DEPTH 16
+#define GLOBAL_DEFAULT_DEPTH 24
 #endif
 
 #ifndef GLOBAL_DEFAULT_FBBPP
-#define GLOBAL_DEFAULT_FBBPP 16
+#define GLOBAL_DEFAULT_FBBPP 32
 #endif
 
 _X_EXPORT Bool
diff-tree 72af975f9c8de0ff6796f1ce4b76dcf841d21e99 (from d05e0a97bb704a4986cf638487205da759c4ce17)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 18:56:34 2006 -0400

    Fix up EDID blocks where the max pixclock exceeds the preferred mode clock.
    
    Base EDID only lets you specify the maximum dotclock in tens of MHz, which
    is too fuzzy for some monitors.  1600x1200 at 60 is just over 160MHz, but if
    the monitor really can't handle any mode at 170MHz, then 160 is more
    correct.  Fix up the EDID block before the driver can see it in this case,
    so we don't spuriously reject modes.

diff --git a/hw/xfree86/ddc/interpret_edid.c b/hw/xfree86/ddc/interpret_edid.c
index a160554..c58bb2f 100644
--- a/hw/xfree86/ddc/interpret_edid.c
+++ b/hw/xfree86/ddc/interpret_edid.c
@@ -31,6 +31,41 @@ static void get_whitepoint_section(Uchar
 static void get_detailed_timing_section(Uchar*, struct 	detailed_timings *);
 static Bool validate_version(int scrnIndex, struct edid_version *);
 
+static void
+handle_edid_quirks(xf86MonPtr m)
+{
+    int i, j;
+    struct detailed_timings *preferred_timing;
+    struct monitor_ranges *ranges;
+
+    /*
+     * max_clock is only encoded in EDID in tens of MHz, so occasionally we
+     * find a monitor claiming a max of 160 with a mode requiring 162, or
+     * similar.  Strictly we should refuse to round up too far, but let's
+     * see how well this works.
+     */
+    for (i = 0; i < 4; i++) {
+	if (m->det_mon[i].type == DS_RANGES) {
+	    ranges = &m->det_mon[i].section.ranges;
+	    for (j = 0; j < 4; j++) {
+		if (m->det_mon[j].type == DT) {
+		    preferred_timing = &m->det_mon[j].section.d_timings;
+		    if (!ranges->max_clock) continue; /* zero is legal */
+		    if (ranges->max_clock * 1000000 < preferred_timing->clock) {
+			xf86Msg(X_WARNING,
+			    "EDID preferred timing clock %.2fMHz exceeds "
+			    "claimed max %dMHz, fixing\n",
+			    preferred_timing->clock / 1.0e6,
+			    ranges->max_clock);
+			ranges->max_clock =
+			    (preferred_timing->clock+999999)/1000000;
+			return;
+		    }
+		}
+	    }
+	}
+    }
+}
 
 xf86MonPtr
 xf86InterpretEDID(int scrnIndex, Uchar *block)
@@ -53,7 +88,9 @@ xf86InterpretEDID(int scrnIndex, Uchar *
 			   &m->ver);
     get_dt_md_section(SECTION(DET_TIMING_SECTION,block),&m->ver, m->det_mon);
     m->no_sections = (int)*(char *)SECTION(NO_EDID,block);
-    
+
+    handle_edid_quirks(m);
+
     return (m);
 
  error:
diff-tree d05e0a97bb704a4986cf638487205da759c4ce17 (from 334f7db9f653113d5d46236911d7de2ec4173f28)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 18:49:12 2006 -0400

    Enable DPMS by default.

diff --git a/dix/globals.c b/dix/globals.c
index fc77ca7..f86c602 100644
--- a/dix/globals.c
+++ b/dix/globals.c
@@ -105,7 +105,7 @@ int  ScreenSaverAllowExposures;
 #  define DEFAULT_OFF_TIME DEFAULT_SCREEN_SAVER_TIME * 4
 # endif
 # ifndef DEFAULT_DPMS_ENABLED
-#  define DEFAULT_DPMS_ENABLED FALSE
+#  define DEFAULT_DPMS_ENABLED TRUE
 # endif
 CARD32 defaultDPMSStandbyTime = DEFAULT_STANDBY_TIME;
 CARD32 defaultDPMSSuspendTime = DEFAULT_SUSPEND_TIME;
diff-tree 334f7db9f653113d5d46236911d7de2ec4173f28 (from ced46e17777b635df9371c4cfaec3f8968b4dbcf)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 18:46:10 2006 -0400

    Allow hsync and vsync ranges to be overridden independently again.

diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index 7f078ec..c76afbc 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -297,6 +297,7 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
 {
     DisplayModePtr Modes = NULL, Mode;
     int i, clock;
+    Bool have_hsync = FALSE, have_vrefresh = FALSE;
     
     if (!Monitor || !DDC)
         return;
@@ -319,25 +320,41 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
     Mode = DDCModesFromStandardTiming(scrnIndex, DDC->timings2);
     Modes = xf86ModesAdd(Modes, Mode);
 
+    /* Skip EDID ranges if they were specified in the config file */
+    have_hsync = (Monitor->nHsync != 0);
+    have_vrefresh = (Monitor->nVrefresh != 0);
+
     /* Go through the detailed monitor sections */
     for (i = 0; i < DET_TIMINGS; i++)
         switch (DDC->det_mon[i].type) {
         case DS_RANGES:
-            if (Monitor->nHsync && Monitor->nVrefresh) {
-                xf86DrvMsg(scrnIndex, X_INFO, "Ignoring EDID Ranges. Using"
-                           " configured ranges.\n");
-                break;
-            }
-
-            xf86DrvMsg(scrnIndex, X_INFO, "Using EDID ranges info for Monitor"
-                       " timing.\n");
-            Monitor->nHsync = 1;
-            Monitor->hsync[0].lo = DDC->det_mon[i].section.ranges.min_h;
-            Monitor->hsync[0].hi = DDC->det_mon[i].section.ranges.max_h;
-            
-            Monitor->nVrefresh = 1;
-            Monitor->vrefresh[0].lo = DDC->det_mon[i].section.ranges.min_v;
-            Monitor->vrefresh[0].hi = DDC->det_mon[i].section.ranges.max_v;
+	    if (!have_hsync) {
+		if (!Monitor->nHsync)
+		    xf86DrvMsg(scrnIndex, X_INFO,
+			    "Using EDID range info for horizontal sync\n");
+		Monitor->hsync[Monitor->nHsync].lo =
+		    DDC->det_mon[i].section.ranges.min_h;
+		Monitor->hsync[Monitor->nHsync].hi =
+		    DDC->det_mon[i].section.ranges.max_h;
+		Monitor->nHsync++;
+	    } else {
+		xf86DrvMsg(scrnIndex, X_INFO,
+			"Using hsync ranges from config file\n");
+	    }
+
+	    if (!have_vrefresh) {
+		if (!Monitor->nVrefresh)
+		    xf86DrvMsg(scrnIndex, X_INFO,
+			    "Using EDID range info for vertical refresh\n");
+		Monitor->vrefresh[Monitor->nVrefresh].lo =
+		    DDC->det_mon[i].section.ranges.min_v;
+		Monitor->vrefresh[Monitor->nVrefresh].hi =
+		    DDC->det_mon[i].section.ranges.max_v;
+		Monitor->nVrefresh++;
+	    } else {
+		xf86DrvMsg(scrnIndex, X_INFO,
+			"Using vrefresh ranges from config file\n");
+	    }
 
 	    clock = DDC->det_mon[i].section.ranges.max_clock * 1000;
 	    if (clock > Monitor->maxPixClock)
diff-tree ced46e17777b635df9371c4cfaec3f8968b4dbcf (from d89fee68d0e49211871cd9eb3893ed55c1d478a6)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 18:41:59 2006 -0400

    Record all standard timings from EDID as modes, instead of just the first five.

diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index ba8aaf8..7f078ec 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -174,7 +174,7 @@ DDCModesFromStandardTiming(int scrnIndex
     DisplayModePtr Modes = NULL, Mode = NULL;
     int i;
     
-    for (i = 0; i < 5; i++)
+    for (i = 0; i < STD_TIMINGS; i++)
         if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
             Mode =  xf86CVTMode(timing[i].hsize, timing[i].vsize,
                                 timing[i].refresh, FALSE, FALSE);
diff-tree d89fee68d0e49211871cd9eb3893ed55c1d478a6 (from fa8ef7166839a7435e0017683f3e3c7f7904b285)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 18:41:15 2006 -0400

    Record the maximum dot clock of the monitor, and filter by it.

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 87b8a0b..f89db67 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -2201,6 +2201,7 @@ configMonitor(MonPtr monitorp, XF86ConfM
     monitorp->widthmm = conf_monitor->mon_width;
     monitorp->heightmm = conf_monitor->mon_height;
     monitorp->reducedblanking = FALSE;
+    monitorp->maxPixClock = 0;
     monitorp->options = conf_monitor->mon_option_lst;
 
     /*
diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index ff04583..c3b016f 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -824,6 +824,9 @@ xf86CheckModeForMonitor(DisplayModePtr m
         }
     }
 
+    if ((monitor->maxPixClock) && (mode->Clock > monitor->maxPixClock))
+	return MODE_CLOCK_HIGH;
+
     return MODE_OK;
 }
 
diff --git a/hw/xfree86/common/xf86str.h b/hw/xfree86/common/xf86str.h
index ae9d9ae..6e62e52 100644
--- a/hw/xfree86/common/xf86str.h
+++ b/hw/xfree86/common/xf86str.h
@@ -213,6 +213,7 @@ typedef struct {
     pointer		options;
     pointer		DDC;
     Bool                reducedblanking; /* Allow CVT reduced blanking modes? */
+    int			maxPixClock;	 /* in kHz, like mode->Clock */
 } MonRec, *MonPtr;
 
 /* the list of clock ranges */
diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index a4f4f4e..ba8aaf8 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -296,7 +296,7 @@ void
 xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
 {
     DisplayModePtr Modes = NULL, Mode;
-    int i;
+    int i, clock;
     
     if (!Monitor || !DDC)
         return;
@@ -339,6 +339,10 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
             Monitor->vrefresh[0].lo = DDC->det_mon[i].section.ranges.min_v;
             Monitor->vrefresh[0].hi = DDC->det_mon[i].section.ranges.max_v;
 
+	    clock = DDC->det_mon[i].section.ranges.max_clock * 1000;
+	    if (clock > Monitor->maxPixClock)
+		Monitor->maxPixClock = clock;
+
             break;
         case DT:
             Mode = DDCModeFromDetailedTiming(scrnIndex, 
diff-tree fa8ef7166839a7435e0017683f3e3c7f7904b285 (from 511c60bc7399b07c267d686a969880e5ec92408a)
Author: Adam Jackson <ajax at benzedrine.nwnk.net>
Date:   Thu Sep 14 18:33:00 2006 -0400

    Don't translate monitor gamma to X gamma.
    
    The X gamma is used to set the output ramp of the card.  Setting a 2.2 output
    gamma going into a 2.2 monitor gives an effective gamma of 4.84, which is
    very much not what you want.

diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index ed7fb16..a4f4f4e 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -303,12 +303,6 @@ xf86DDCMonitorSet(int scrnIndex, MonPtr 
 
     Monitor->DDC = DDC;
 
-    if (DDC->features.gamma > 0.0) {
-        Monitor->gamma.red = DDC->features.gamma;
-        Monitor->gamma.green = DDC->features.gamma;
-        Monitor->gamma.blue = DDC->features.gamma;
-    }
-
     Monitor->widthmm = 10 * DDC->features.hsize;
     Monitor->heightmm = 10 * DDC->features.vsize;
     
diff-tree 511c60bc7399b07c267d686a969880e5ec92408a (from 05231e336db8f959c15dda518641976f061df1a6)
Author: Luc Verhaegen <libv at skynet.be>
Date:   Thu Sep 14 18:30:36 2006 -0400

    Bug #5386: Synthesize modelines from EDID data.

diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
index cd57e99..ff04583 100644
--- a/hw/xfree86/common/xf86Mode.c
+++ b/hw/xfree86/common/xf86Mode.c
@@ -45,7 +45,6 @@
 #include "globals.h"
 #include "xf86.h"
 #include "xf86Priv.h"
-#include "xf86DDC.h"
 
 static void
 printModeRejectMessage(int index, DisplayModePtr p, int status)
@@ -766,31 +765,6 @@ xf86CheckModeForMonitor(DisplayModePtr m
 	   mode, mode->name, monitor, monitor->id);
 #endif
 
-    if (monitor->DDC) {
-	xf86MonPtr DDC = (xf86MonPtr)(monitor->DDC);
-	struct detailed_monitor_section* detMon;
-	struct monitor_ranges *mon_range;
-	int i;
-
-	mon_range = NULL;
-	for (i = 0; i < 4; i++) {
-	    detMon = &DDC->det_mon[i];
-	    if(detMon->type == DS_RANGES) {
-		mon_range = &detMon->section.ranges;
-	    }
-	}
-	if (mon_range) {
-	    /* mode->Clock in kHz, DDC in MHz */
-	    if (mon_range->max_clock < 2550 &&
-		 mode->Clock / 1000.0 > mon_range->max_clock) {
-		xf86Msg(X_WARNING,
-		   "(%s,%s) mode clock %gMHz exceeds DDC maximum %dMHz\n",
-		   mode->name, monitor->id,
-		   mode->Clock/1000.0, mon_range->max_clock);
-	    }
-	}
-    }
-
     /* Some basic mode validity checks */
     if (0 >= mode->HDisplay || mode->HDisplay > mode->HSyncStart ||
 	mode->HSyncStart >= mode->HSyncEnd || mode->HSyncEnd >= mode->HTotal)
@@ -1267,7 +1241,6 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
     PixmapFormatRec *BankFormat;
     ClockRangePtr cp;
     ClockRangesPtr storeClockRanges;
-    struct monitor_ranges *mon_range = NULL;
     double targetRefresh = 0.0;
     int numTimings = 0;
     range hsync[MAX_HSYNC];
@@ -1302,166 +1275,6 @@ xf86ValidateModes(ScrnInfoPtr scrp, Disp
     }
 
     /*
-     * Probe monitor so that we can enforce/warn about its limits.
-     * If one or more DS_RANGES descriptions are present, use the parameters
-     * that they provide.  Otherwise, deduce limits based on the modes that
-     * are shown as supported via standard and detailed timings.
-     *
-     * XXX The full potential of the DDC/EDID data still isn't being tapped.
-     */
-    if (scrp->monitor->DDC) {
-	MonPtr monitor = scrp->monitor;
-	xf86MonPtr DDC = (xf86MonPtr)(scrp->monitor->DDC);
-	int i, j;
-	float hmin = 1e6, hmax = 0.0, vmin = 1e6, vmax = 0.0;
-	float h;
-	struct std_timings *t;
-	struct detailed_timings *dt;
-
-	numTimings = 0;
-	for (i = 0; i < DET_TIMINGS; i++) {
-	    switch (DDC->det_mon[i].type) {
-	    case DS_RANGES:
-		mon_range = &DDC->det_mon[i].section.ranges;
-		hsync[numTimings].lo = mon_range->min_h;
-		hsync[numTimings].hi = mon_range->max_h;
-		vrefresh[numTimings].lo = mon_range->min_v;
-		vrefresh[numTimings].hi = mon_range->max_v;
-		numTimings++;
-		break;
-
-	    case DS_STD_TIMINGS:
-		t = DDC->det_mon[i].section.std_t;
-		for (j = 0; j < 5; j++) {
-		    if (t[j].hsize > 256) { /* sanity check */
-			if (t[j].refresh < vmin)
-			    vmin = t[i].refresh;
-			if (t[j].refresh > vmax)
-			    vmax = t[i].refresh;
-			/*
-			 * For typical modes this is a reasonable estimate
-			 * of the horizontal sync rate.
-			 */
-			h = t[j].refresh * 1.07 * t[j].vsize / 1000.0;
-			if (h < hmin)
-			    hmin = h;
-			if (h > hmax)
-			    hmax = h;
-		    }
-		}
-		break;
-
-	    case DT:
-		dt = &DDC->det_mon[i].section.d_timings;
-		if (dt->clock > 15000000) { /* sanity check */
-		    float v;
-		    h = (float)dt->clock / (dt->h_active + dt->h_blanking);
-		    v = h / (dt->v_active + dt->v_blanking);
-		    h /= 1000.0;
-		    if (dt->interlaced) 
-			v /= 2.0;
-
-		    if (v < vmin)
-			vmin = v;
-		    if (v > vmax)
-			vmax = v;
-		    if (h < hmin)
-			hmin = h;
-		    if (h > hmax)
-			hmax = h;
-		}
-		break;
-	    }
-
-	    if (numTimings > MAX_HSYNC)
-		break;
-	}
-
-	if (numTimings == 0) {
-	    t = DDC->timings2;
-	    for (i = 0; i < STD_TIMINGS; i++) {
-		if (t[i].hsize > 256) { /* sanity check */
-		    if (t[i].refresh < vmin)
-			vmin = t[i].refresh;
-		    if (t[i].refresh > vmax)
-			vmax = t[i].refresh;
-		    /*
-		     * For typical modes this is a reasonable estimate
-		     * of the horizontal sync rate.
-		     */
-		    h = t[i].refresh * 1.07 * t[i].vsize / 1000.0;
-		    if (h < hmin)
-			hmin = h;
-		    if (h > hmax)
-			hmax = h;
-		}
-	    }
-
-	    if (hmax > 0.0) {
-		hsync[numTimings].lo = hmin;
-		hsync[numTimings].hi = hmax;
-		vrefresh[numTimings].lo = vmin;
-		vrefresh[numTimings].hi = vmax;
-		numTimings++;
-	    }
-	}
-
-	if (numTimings > 0) {
-
-#ifdef DEBUG
-	    for (i = 0; i < numTimings; i++) {
-		ErrorF("DDC - Hsync %.1f-%.1f kHz - Vrefresh %.1f-%.1f Hz\n",
-		       hsync[i].lo, hsync[i].hi,
-		       vrefresh[i].lo, vrefresh[i].hi);
-	    }
-#endif
-
-#define DDC_SYNC_TOLERANCE SYNC_TOLERANCE
-	    if (monitor->nHsync > 0) {
-		for (i = 0; i < monitor->nHsync; i++) {
-		    Bool good = FALSE;
-		    for (j = 0; j < numTimings; j++) {
-			if ((1.0 - DDC_SYNC_TOLERANCE) * hsync[j].lo <=
-				monitor->hsync[i].lo &&
-			    (1.0 + DDC_SYNC_TOLERANCE) * hsync[j].hi >=
-				monitor->hsync[i].hi) {
-			    good = TRUE;
-			    break;
-			}
-		    }
-		    if (!good) {
-			xf86DrvMsg(scrp->scrnIndex, X_WARNING,
-			  "config file hsync range %g-%gkHz not within DDC "
-			  "hsync ranges.\n",
-			  monitor->hsync[i].lo, monitor->hsync[i].hi);
-		    }
-		}
-	    }
-
-	    if (monitor->nVrefresh > 0) {
-		for (i = 0; i < monitor->nVrefresh; i++) {
-		    Bool good = FALSE;
-		    for (j = 0; j < numTimings; j++) {
-			if ((1.0 - DDC_SYNC_TOLERANCE) * vrefresh[j].lo <=
-				monitor->vrefresh[0].lo &&
-			    (1.0 + DDC_SYNC_TOLERANCE) * vrefresh[j].hi >=
-				monitor->vrefresh[0].hi) {
-			    good = TRUE;
-			    break;
-			}
-		    }
-		    if (!good) {
-			xf86DrvMsg(scrp->scrnIndex, X_WARNING,
-			  "config file vrefresh range %g-%gHz not within DDC "
-			  "vrefresh ranges.\n",
-			  monitor->vrefresh[i].lo, monitor->vrefresh[i].hi);
-		    }
-		}
-	    }
-        }
-    }
-
-    /*
      * If requested by the driver, allow missing hsync and/or vrefresh ranges
      * in the monitor section.
      */
diff --git a/hw/xfree86/ddc/ddcProperty.c b/hw/xfree86/ddc/ddcProperty.c
index 22deca6..ed7fb16 100644
--- a/hw/xfree86/ddc/ddcProperty.c
+++ b/hw/xfree86/ddc/ddcProperty.c
@@ -1,159 +1,407 @@
-/* ddcProperty.c: Make the DDC monitor information available to clients
- * as properties on the root window
- * 
- * Copyright 1999 by Andrew C Aitchison <A.C.Aitchison at dpmms.cam.ac.uk>
+/*
+ * Copyright 2006 Luc Verhaegen.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
  */
 
 #ifdef HAVE_XORG_CONFIG_H
 #include <xorg-config.h>
 #endif
 
-#include <string.h>
-#include "misc.h"
 #include "xf86.h"
-/* #include "xf86_OSproc.h" */
-#include <X11/Xatom.h>
-#include "property.h"
-#include "propertyst.h"
 #include "xf86DDC.h"
 
-#define EDID1_ATOM_NAME         "XFree86_DDC_EDID1_RAWDATA"
-#define EDID2_ATOM_NAME         "XFree86_DDC_EDID2_RAWDATA"
-#define VDIF_ATOM_NAME          "XFree86_DDC_VDIF_RAWDATA"
+/*
+ * xf86Mode.c should have a some more DisplayModePtr list handling.
+ */
+static DisplayModePtr
+xf86ModesAdd(DisplayModePtr Modes, DisplayModePtr Additions)
+{
+    if (!Modes) {
+        if (Additions)
+            return Additions;
+        else
+            return NULL;
+    }
 
-Bool
-xf86SetDDCproperties(ScrnInfoPtr pScrnInfo, xf86MonPtr DDC)
+    if (Additions) {
+        DisplayModePtr Mode = Modes;
+
+        while (Mode->next)
+            Mode = Mode->next;
+        
+        Mode->next = Additions;
+        Additions->prev = Mode;
+    }
+
+    return Modes;
+}
+
+static DisplayModePtr
+xf86ModeCopy(DisplayModePtr Mode)
 {
-    Atom EDID1Atom=-1, EDID2Atom=-1, VDIFAtom=-1;
-    CARD8 *EDID1rawdata = NULL;
-    CARD8 *EDID2rawdata = NULL;
-    int  i, ret;
-    Bool  makeEDID1prop = FALSE;
-    Bool  makeEDID2prop = FALSE;
+    DisplayModePtr New;
+
+    if (!Mode)
+        return NULL;
+
+    New = xnfalloc(sizeof(DisplayModeRec));
+
+    memcpy(New, Mode, sizeof(DisplayModeRec));
+    
+    New->name = xnfalloc(strlen(Mode->name) + 1);
+    memcpy(New->name, Mode->name, strlen(Mode->name) + 1);
 
-#ifdef DEBUG
-    ErrorF("xf86SetDDCproperties(%p, %p)\n", pScrnInfo, DDC);
+    /* We ignore privates as DDC code doesn't use it currently */
+    return New;
+}
+
+/*
+ * Temporary.
+ */
+static void
+add(char **p, char *new)
+{
+    *p = xnfrealloc(*p, strlen(*p) + strlen(new) + 2);
+    strcat(*p, " ");
+    strcat(*p, new);
+}
+
+static void
+PrintModeline(int scrnIndex,DisplayModePtr mode)
+{
+    char tmp[256];
+    char *flags = xnfcalloc(1, 1);
+
+    if (mode->HSkew) { 
+	snprintf(tmp, 256, "hskew %i", mode->HSkew); 
+	add(&flags, tmp);
+    }
+    if (mode->VScan) { 
+	snprintf(tmp, 256, "vscan %i", mode->VScan); 
+	add(&flags, tmp);
+    }
+    if (mode->Flags & V_INTERLACE) add(&flags, "interlace");
+    if (mode->Flags & V_CSYNC) add(&flags, "composite");
+    if (mode->Flags & V_DBLSCAN) add(&flags, "doublescan");
+    if (mode->Flags & V_BCAST) add(&flags, "bcast");
+    if (mode->Flags & V_PHSYNC) add(&flags, "+hsync");
+    if (mode->Flags & V_NHSYNC) add(&flags, "-hsync");
+    if (mode->Flags & V_PVSYNC) add(&flags, "+vsync");
+    if (mode->Flags & V_NVSYNC) add(&flags, "-vsync");
+    if (mode->Flags & V_PCSYNC) add(&flags, "+csync");
+    if (mode->Flags & V_NCSYNC) add(&flags, "-csync");
+#if 0
+    if (mode->Flags & V_CLKDIV2) add(&flags, "vclk/2");
 #endif
+    xf86DrvMsgVerb(scrnIndex, X_INFO, 3,
+		   "Modeline \"%s\"  %6.2f  %i %i %i %i  %i %i %i %i%s\n",
+		   mode->name, mode->Clock/1000., mode->HDisplay,
+		   mode->HSyncStart, mode->HSyncEnd, mode->HTotal,
+		   mode->VDisplay, mode->VSyncStart, mode->VSyncEnd,
+		   mode->VTotal, flags);
+    xfree(flags);
+}
 
-    if (pScrnInfo==NULL || pScrnInfo->monitor==NULL || DDC==NULL) {
-      return FALSE;
+/*
+ * TODO:
+ *  - for those with access to the VESA DMT standard; review please.
+ *  - swap M_T_DEFAULT for M_T_EDID_...
+ */
+#define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DEFAULT
+#define MODESUFFIX   0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0
+
+DisplayModeRec DDCEstablishedModes[17] = {
+    { MODEPREFIX("800x600"),    40000,  800,  840,  968, 1056, 0,  600,  601,  605,  628, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 60Hz */
+    { MODEPREFIX("800x600"),    36000,  800,  824,  896, 1024, 0,  600,  601,  603,  625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 56Hz */
+    { MODEPREFIX("640x480"),    31500,  640,  656,  720,  840, 0,  480,  481,  484,  500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 75Hz */
+    { MODEPREFIX("640x480"),    31500,  640,  664,  704,  832, 0,  480,  489,  491,  520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 72Hz */
+    { MODEPREFIX("640x480"),    30240,  640,  704,  768,  864, 0,  480,  483,  486,  525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 67Hz */
+    { MODEPREFIX("640x480"),    25200,  640,  656,  752,  800, 0,  480,  490,  492,  525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480 at 60Hz */
+    { MODEPREFIX("720x400"),    35500,  720,  738,  846,  900, 0,  400,  421,  423,  449, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 720x400 at 88Hz */
+    { MODEPREFIX("720x400"),    28320,  720,  738,  846,  900, 0,  400,  412,  414,  449, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 720x400 at 70Hz */
+    { MODEPREFIX("1280x1024"), 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024 at 75Hz */
+    { MODEPREFIX("1024x768"),   78800, 1024, 1040, 1136, 1312, 0,  768,  769,  772,  800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768 at 75Hz */
+    { MODEPREFIX("1024x768"),   75000, 1024, 1048, 1184, 1328, 0,  768,  771,  777,  806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768 at 70Hz */
+    { MODEPREFIX("1024x768"),   65000, 1024, 1048, 1184, 1344, 0,  768,  771,  777,  806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768 at 60Hz */
+    { MODEPREFIX("1024x768"),   44900, 1024, 1032, 1208, 1264, 0,  768,  768,  776,  817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768 at 43Hz */
+    { MODEPREFIX("832x624"),    57284,  832,  864,  928, 1152, 0,  624,  625,  628,  667, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 832x624 at 75Hz */
+    { MODEPREFIX("800x600"),    49500,  800,  816,  896, 1056, 0,  600,  601,  604,  625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 75Hz */
+    { MODEPREFIX("800x600"),    50000,  800,  856,  976, 1040, 0,  600,  637,  643,  666, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600 at 72Hz */
+    { MODEPREFIX("1152x864"),  108000, 1152, 1216, 1344, 1600, 0,  864,  865,  868,  900, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1152x864 at 75Hz */
+};
+
+static DisplayModePtr
+DDCModesFromEstablished(int scrnIndex, struct established_timings *timing)
+{
+    DisplayModePtr Modes = NULL, Mode = NULL;
+    CARD32 bits = (timing->t1) | (timing->t2 << 8) |
+        ((timing->t_manu & 0x80) << 9);
+    int i;
+
+    for (i = 0; i < 17; i++)
+        if (bits & (0x01 << i)) {
+            Mode = xf86ModeCopy(&(DDCEstablishedModes[i]));
+            Modes = xf86ModesAdd(Modes, Mode);
+        }
+
+    return Modes;
+}
+
+/*
+ *
+ */
+static DisplayModePtr
+DDCModesFromStandardTiming(int scrnIndex, struct std_timings *timing)
+{
+    DisplayModePtr Modes = NULL, Mode = NULL;
+    int i;
+    
+    for (i = 0; i < 5; i++)
+        if (timing[i].hsize && timing[i].vsize && timing[i].refresh) {
+            Mode =  xf86CVTMode(timing[i].hsize, timing[i].vsize,
+                                timing[i].refresh, FALSE, FALSE);
+            Modes = xf86ModesAdd(Modes, Mode);
+        }
+
+    return Modes;
+}
+
+/*
+ *
+ */
+static DisplayModePtr
+DDCModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing)
+{
+    DisplayModePtr Mode;
+
+    /* We don't do stereo */
+    if (timing->stereo) {
+        xf86DrvMsg(scrnIndex, X_INFO, "%s: Ignoring: We don't handle stereo.\n",
+                   __func__);
+        return NULL;
+    }
+    
+    /* We only do seperate sync currently */
+    if (timing->sync != 0x03) {
+         xf86DrvMsg(scrnIndex, X_INFO, "%s: Ignoring: We only handle seperate"
+                    " sync.\n", __func__);
+         return NULL;
     }
+    
+    Mode = xnfalloc(sizeof(DisplayModeRec));
+    memset(Mode, 0, sizeof(DisplayModeRec));
+    
+    Mode->name = xnfalloc(10); /* "1234x1234" */
+    xf86snprintf(Mode->name, 20, "%dx%d", timing->h_active,
+                 timing->v_active);
+    
+    Mode->type = M_T_DEFAULT; /* get ourselves a nice type of our own */
+    
+    Mode->Clock = timing->clock / 1000.0;
+    
+    Mode->HDisplay = timing->h_active;
+    Mode->HSyncStart = timing->h_active + timing->h_sync_off;
+    Mode->HSyncEnd = Mode->HSyncStart + timing->h_sync_width;
+    Mode->HTotal = timing->h_active + timing->h_blanking;
+    
+    Mode->VDisplay = timing->v_active;
+    Mode->VSyncStart = timing->v_active + timing->v_sync_off;
+    Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width;
+    Mode->VTotal = timing->v_active + timing->v_blanking;
+    
+    /* We ignore h/v_size and h/v_border for now. */
+    
+    if (timing->interlaced)
+        Mode->Flags |= V_INTERLACE;
+    
+    if (timing->misc & 0x02)
+        Mode->Flags |= V_PHSYNC;
+    else
+        Mode->Flags |= V_NHSYNC;
+    
+    if (timing->misc & 0x01)
+        Mode->Flags |= V_PVSYNC;
+    else
+        Mode->Flags |= V_NVSYNC;
+ 
+    return Mode;
+}
 
-#ifdef DEBUG
-    ErrorF("pScrnInfo->scrnIndex %d\n", pScrnInfo->scrnIndex);
+/*
+ *
+ */
+static void
+DDCGuessRangesFromModes(int scrnIndex, MonPtr Monitor, DisplayModePtr Modes)
+{
+    DisplayModePtr Mode = Modes;
 
-    ErrorF("pScrnInfo->monitor was %p\n", pScrnInfo->monitor);
-#endif
+    if (!Monitor || !Modes)
+        return;
 
-    pScrnInfo->monitor->DDC = DDC;
+    /* set up the ranges for scanning through the modes */
+    Monitor->nHsync = 1;
+    Monitor->hsync[0].lo = 1024.0;
+    Monitor->hsync[0].hi = 0.0;
 
-    if (DDC->ver.version == 1) {
-      makeEDID1prop = TRUE;
-    } else if (DDC->ver.version == 2) {
-      int checksum1;
-      int checksum2;
-      makeEDID2prop = TRUE;
-
-      /* Some monitors (eg Panasonic PanaSync4)
-       * report version==2 because they used EDID v2 spec document,
-       * although they use EDID v1 data structure :-(
-       *
-       * Try using checksum to determine when we have such a monitor.
-       */
-      checksum2 = 0;
-      for (i=0; i<256; i++) { checksum2 += DDC->rawData[i]; }
-      if ( (checksum2 % 256) != 0 ) {
-	xf86DrvMsg(pScrnInfo->scrnIndex,X_INFO, "Monitor EDID v2 checksum failed\n");
-	xf86DrvMsg(pScrnInfo->scrnIndex,X_INFO, "XFree86_DDC_EDID2_RAWDATA property may be bad\n");
-	checksum1 = 0;
-	for (i=0; i<128; i++) { checksum1 += DDC->rawData[i]; }
-	if ( (checksum1 % 256) == 0 ) {
-	  xf86DrvMsg(pScrnInfo->scrnIndex,X_INFO, "Monitor EDID v1 checksum passed,\n");
-	  xf86DrvMsg(pScrnInfo->scrnIndex,X_INFO, "XFree86_DDC_EDID1_RAWDATA property created\n");
-	  makeEDID1prop = TRUE;
-	}
-      }
-    } else {
-     xf86DrvMsg(pScrnInfo->scrnIndex, X_PROBED,
-		"unexpected EDID version %d revision %d\n",
-		DDC->ver.version, DDC->ver.revision );      
-    }
-
-    if (makeEDID1prop) {
-      if ( (EDID1rawdata = xalloc(128*sizeof(CARD8)))==NULL ) {
-	return FALSE;
-      }
-
-      EDID1Atom = MakeAtom(EDID1_ATOM_NAME, sizeof(EDID1_ATOM_NAME), TRUE);
-
-
-      for (i=0; i<128; i++) {
-	EDID1rawdata[i] = DDC->rawData[i];
-      }
-
-#ifdef DEBUG
-      ErrorF("xf86RegisterRootWindowProperty %p(%d,%d,%d,%d,%d,%p)\n",
-	     xf86RegisterRootWindowProperty,
-	     pScrnInfo->scrnIndex,
-	     EDID1Atom, XA_INTEGER, 8,
-	     128, (unsigned char *)EDID1rawdata  );
-#endif
+    Monitor->nVrefresh = 1;
+    Monitor->vrefresh[0].lo = 1024.0;
+    Monitor->vrefresh[0].hi = 0.0;
 
-      ret = xf86RegisterRootWindowProperty(pScrnInfo->scrnIndex,
-					   EDID1Atom, XA_INTEGER, 8, 
-					   128, (unsigned char *)EDID1rawdata
-					   );
-      if (ret != Success)
-      ErrorF("xf86RegisterRootWindowProperty returns %d\n", ret );
-    } 
-
-    if (makeEDID2prop) {
-      if ( (EDID2rawdata = xalloc(256*sizeof(CARD8)))==NULL ) {
-	return FALSE;
-      }
-      for (i=0; i<256; i++) {
-	EDID2rawdata[i] = DDC->rawData[i];
-      }
-
-      EDID2Atom = MakeAtom(EDID2_ATOM_NAME, sizeof(EDID2_ATOM_NAME), TRUE);
-
-#ifdef DEBUG
-      ErrorF("xf86RegisterRootWindowProperty %p(%d,%d,%d,%d,%d,%p)\n",
-	     xf86RegisterRootWindowProperty,
-	     pScrnInfo->scrnIndex,
-	     EDID2Atom, XA_INTEGER, 8,
-	     256, (unsigned char *)EDID2rawdata  );
-#endif
-      ret = xf86RegisterRootWindowProperty(pScrnInfo->scrnIndex,
-					   EDID2Atom, XA_INTEGER, 8, 
-					   256, (unsigned char *)EDID2rawdata
-					   );
-      if (ret != Success)
-      ErrorF("xf86RegisterRootWindowProperty returns %d\n", ret );
-    }
-
-    if (DDC->vdif) {
-#define VDIF_DUMMY_STRING "setting dummy VDIF property - please insert correct values\n"
-#ifdef DEBUG
-      ErrorF("xf86RegisterRootWindowProperty %p(%d,%d,%d,%d,%d,%p)\n",
-	     xf86RegisterRootWindowProperty,
-	     pScrnInfo->scrnIndex,
-	     VDIFAtom, XA_STRING, 8,
-	     strlen(VDIF_DUMMY_STRING), VDIF_DUMMY_STRING 
-	     );
-#endif
+    while (Mode) {
+        if (!Mode->HSync)
+            Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal);
 
+        if (!Mode->VRefresh)
+            Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) / 
+                ((float) (Mode->HTotal * Mode->VTotal));
 
-      VDIFAtom = MakeAtom(VDIF_ATOM_NAME, sizeof(VDIF_ATOM_NAME), TRUE);
+        if (Mode->HSync < Monitor->hsync[0].lo)
+            Monitor->hsync[0].lo = Mode->HSync;
 
-      ret = xf86RegisterRootWindowProperty(pScrnInfo->scrnIndex,
-					   VDIFAtom, XA_STRING, 8, 
-					   strlen(VDIF_DUMMY_STRING),
-					   VDIF_DUMMY_STRING 
-					   );
-      if (ret != Success)
-      ErrorF("xf86RegisterRootWindowProperty returns %d\n", ret );
+        if (Mode->HSync > Monitor->hsync[0].hi)
+            Monitor->hsync[0].hi = Mode->HSync;
+
+        if (Mode->VRefresh < Monitor->vrefresh[0].lo)
+            Monitor->vrefresh[0].lo = Mode->VRefresh;
+
+        if (Mode->VRefresh > Monitor->vrefresh[0].hi)
+            Monitor->vrefresh[0].hi = Mode->VRefresh;
+        
+        Mode = Mode->next;
+    }
+}
+
+/*
+ * Fill out MonPtr with xf86MonPtr information.
+ */
+void
+xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC)
+{
+    DisplayModePtr Modes = NULL, Mode;
+    int i;
+    
+    if (!Monitor || !DDC)
+        return;
+
+    Monitor->DDC = DDC;
+
+    if (DDC->features.gamma > 0.0) {
+        Monitor->gamma.red = DDC->features.gamma;
+        Monitor->gamma.green = DDC->features.gamma;
+        Monitor->gamma.blue = DDC->features.gamma;
     }
 
+    Monitor->widthmm = 10 * DDC->features.hsize;
+    Monitor->heightmm = 10 * DDC->features.vsize;
+    
+    /* If this is a digital display, then we can use reduced blanking */
+    if (DDC->features.input_type) 
+        Monitor->reducedblanking = TRUE;
+    /* Allow the user to also enable this through config */
+
+    /* Add established timings */
+    Mode = DDCModesFromEstablished(scrnIndex, &DDC->timings1);
+    Modes = xf86ModesAdd(Modes, Mode);
+
+    /* Add standard timings */
+    Mode = DDCModesFromStandardTiming(scrnIndex, DDC->timings2);
+    Modes = xf86ModesAdd(Modes, Mode);
+
+    /* Go through the detailed monitor sections */
+    for (i = 0; i < DET_TIMINGS; i++)
+        switch (DDC->det_mon[i].type) {
+        case DS_RANGES:
+            if (Monitor->nHsync && Monitor->nVrefresh) {
+                xf86DrvMsg(scrnIndex, X_INFO, "Ignoring EDID Ranges. Using"
+                           " configured ranges.\n");
+                break;
+            }
+
+            xf86DrvMsg(scrnIndex, X_INFO, "Using EDID ranges info for Monitor"
+                       " timing.\n");
+            Monitor->nHsync = 1;
+            Monitor->hsync[0].lo = DDC->det_mon[i].section.ranges.min_h;
+            Monitor->hsync[0].hi = DDC->det_mon[i].section.ranges.max_h;
+            
+            Monitor->nVrefresh = 1;
+            Monitor->vrefresh[0].lo = DDC->det_mon[i].section.ranges.min_v;
+            Monitor->vrefresh[0].hi = DDC->det_mon[i].section.ranges.max_v;
+
+            break;
+        case DT:
+            Mode = DDCModeFromDetailedTiming(scrnIndex, 
+                                             &DDC->det_mon[i].section.d_timings);
+            Modes = xf86ModesAdd(Modes, Mode);
+            break;
+        case DS_STD_TIMINGS:
+            Mode = DDCModesFromStandardTiming(scrnIndex,
+                                             DDC->det_mon[i].section.std_t);
+            Modes = xf86ModesAdd(Modes, Mode);
+            break;
+        default:
+            break;
+        }
+
+    if (Modes) {
+        /* Print Modes */
+        xf86DrvMsg(scrnIndex, X_INFO, "Printing DDC gathered Modelines:\n");
+
+        Mode = Modes;
+        while (Mode) {
+            PrintModeline(scrnIndex, Mode);
+            Mode = Mode->next;
+        }
+
+        /* Do we still need ranges to be filled in? */
+        if (!Monitor->nHsync || !Monitor->nVrefresh)
+            DDCGuessRangesFromModes(scrnIndex, Monitor, Modes);
+
+        /* look for last Mode */
+        Mode = Modes;
+
+        while (Mode->next)
+            Mode = Mode->next;
+        
+        /* add to MonPtr */
+        if (Monitor->Modes) {
+            Monitor->Last->next = Modes;
+            Modes->prev = Monitor->Last;
+            Monitor->Last = Mode;
+        } else {
+            Monitor->Modes = Modes;
+            Monitor->Last = Mode;
+        }
+    }
+}
+
+/*
+ * Empty shell that keeps most drivers happy.
+ */
+Bool
+xf86SetDDCproperties(ScrnInfoPtr pScrn, xf86MonPtr DDC)
+{
+    if (!pScrn || !pScrn->monitor || !DDC)
+        return FALSE;
+
+    xf86DDCMonitorSet(pScrn->scrnIndex, pScrn->monitor, DDC);
+
     return TRUE;
 }
diff --git a/hw/xfree86/ddc/xf86DDC.h b/hw/xfree86/ddc/xf86DDC.h
index fb10836..5def97a 100644
--- a/hw/xfree86/ddc/xf86DDC.h
+++ b/hw/xfree86/ddc/xf86DDC.h
@@ -47,6 +47,9 @@ extern xf86vdifPtr xf86InterpretVdif(
     CARD8 *c
 );
 
+extern void 
+xf86DDCMonitorSet(int scrnIndex, MonPtr Monitor, xf86MonPtr DDC);
+
 extern Bool xf86SetDDCproperties(
     ScrnInfoPtr pScreen,
     xf86MonPtr DDC
diff-tree 58933757862c458e2da39bd464e50d9c0e41b313 (from 0a3740a0000191e3039fe183ae51b938d0548340)
Author: Zephaniah E. Hull <warp at agamemnon.b5>
Date:   Sun Sep 10 15:50:51 2006 -0400

    Warning fix, and a syntax fix in a #if 0 section of code.

diff --git a/dix/events.c b/dix/events.c
index c2c0395..34ee9fb 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -135,6 +135,7 @@ of the copyright holder.
 #include <X11/extensions/XKBproto.h>
 #include <X11/extensions/XKBsrv.h>
 extern Bool XkbFilterEvents(ClientPtr, int, xEvent *);
+extern Bool XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies);
 #endif
 
 #ifdef XCSECURITY
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 0fde727..cbf46d8 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -242,7 +242,7 @@ XkbMapChangesPtr	mc;
 	    xkb->min_key_code= first;
 	    /* 1/12/95 (ef) -- XXX! should zero out the new maps */
 	    changes->map.changed|= XkbKeycodesMask;
-generate a NewKeyboard notify here?
+/* generate a NewKeyboard notify here? */
 	}
     }
 #endif
diff-tree 0a3740a0000191e3039fe183ae51b938d0548340 (from 8d709f0280b458515b32c2b87938749428e5c149)
Author: Zephaniah E. Hull <warp at agamemnon.b5>
Date:   Sun Sep 10 15:49:25 2006 -0400

    Typo correction, 'i' is not a '1', so no longer crash on some Xi requests.

diff --git a/Xi/selectev.c b/Xi/selectev.c
index 1f6713a..7d3ef9d 100644
--- a/Xi/selectev.c
+++ b/Xi/selectev.c
@@ -178,7 +178,7 @@ ProcXSelectExtensionEvent(register Clien
 	return Success;
     }
 
-    if (HandleDevicePresenceMask(client, pWin, (XEventClass *) & stuff[i],
+    if (HandleDevicePresenceMask(client, pWin, (XEventClass *) & stuff[1],
                                 &stuff->count) != Success) {
        SendErrorToClient(client, IReqCode, X_SelectExtensionEvent, 0,
                          BadAlloc);
diff-tree 8d709f0280b458515b32c2b87938749428e5c149 (from 60db190ecfce52cbfa888c0af3210634f9186bed)
Author: Zephaniah E. Hull <warp at agamemnon.b5>
Date:   Sun Sep 10 15:48:35 2006 -0400

    Remove a merge artifact so that we can compile.

diff --git a/configure.ac b/configure.ac
index 8aa6a34..047857a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1504,7 +1504,6 @@ if test "$KDRIVE" = yes; then
     fi
     
     # tslib...
-<<<<<<< HEAD/configure.ac
     AC_CHECK_LIB(ts, ts_open, [HAVE_TSLIB="yes"])
     if test "x$TSLIB" = xauto && test "x$HAVE_TSLIB" = xyes; then
         TSLIB=yes
diff-tree 60db190ecfce52cbfa888c0af3210634f9186bed (from parents)
Merge: 5e9d33fe87f9d24e55c468d4b2bb761c9efdb26a 65256109bb8f5a26704ed960e1dd113981df5787
Author: Zephaniah E. Hull <warp at agamemnon.b5>
Date:   Sun Sep 10 03:49:17 2006 -0400

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver

diff-tree 5e9d33fe87f9d24e55c468d4b2bb761c9efdb26a (from parents)
Merge: 629798c73ad76a77fa6a55bc6403fd9b95ade2bb 64479fffa22581cc7d753065c33eda5520b7db9a
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Sep 7 15:43:31 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff --cc configure.ac
index 50353ed,798c8f0..8aa6a34
@@@ -417,9 -411,11 +417,11 @@@
  AC_ARG_ENABLE(glx-tls,        AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: disabled)]), [GLX_USE_TLS=$enableval], [GLX_USE_TLS=no])
  AC_ARG_ENABLE(dri,            AS_HELP_STRING([--enable-dri], [Build DRI extension (default: auto)]), [DRI=$enableval])
  AC_ARG_ENABLE(xinerama,	      AS_HELP_STRING([--disable-xinerama], [Build Xinerama extension (default: enabled)]), [XINERAMA=$enableval], [XINERAMA=yes])
 -AC_ARG_ENABLE(xf86vidmode,    AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: enabled)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=yes])
 -AC_ARG_ENABLE(xf86misc,       AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: enabled)]), [XF86MISC=$enableval], [XF86MISC=yes])
 +AC_ARG_ENABLE(xf86vidmode,    AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: auto)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=auto])
 +AC_ARG_ENABLE(xf86misc,       AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: auto)]), [XF86MISC=$enableval], [XF86MISC=auto])
  AC_ARG_ENABLE(xcsecurity,     AS_HELP_STRING([--disable-xcsecurity], [Build Security extension (default: enabled)]), [XCSECURITY=$enableval], [XCSECURITY=yes])
+ AC_ARG_ENABLE(xcalibrate,     AS_HELP_STRING([--enable-xcalibrate], [Build XCalibrate extension (default: disabled)]), [XCALIBRATE=$enableval], [XCALIBRATE=no])
+ AC_ARG_ENABLE(tslib,          AS_HELP_STRING([--enable-tslib], [Build kdrive tslib touchscreen support (default: disabled)]), [TSLIB=$enableval], [TSLIB=no])
  AC_ARG_ENABLE(xevie,          AS_HELP_STRING([--disable-xevie], [Build XEvIE extension (default: enabled)]), [XEVIE=$enableval], [XEVIE=yes])
  AC_ARG_ENABLE(appgroup,       AS_HELP_STRING([--disable-appgroup], [Build XC-APPGROUP extension (default: enabled)]), [APPGROUP=$enableval], [APPGROUP=yes])
  AC_ARG_ENABLE(cup,            AS_HELP_STRING([--disable-cup], [Build TOG-CUP extension (default: enabled)]), [CUP=$enableval], [CUP=yes])
@@@ -705,11 -698,14 +707,19 @@@
  	REQUIRED_MODULES="$REQUIRED_MODULES printproto"
  fi
  
 +if test "x$BUILTIN_FONTS" = xyes; then
 +       AC_DEFINE(BUILTIN_FONTS, 1, [Use only built-in fonts])
 +       AC_DEFINE(NOFONTSERVERACCESS, 1, [Avoid using a font server])
 +fi
 +
+ if test "x$XCALIBRATE" = xyes && test "$KDRIVE" = yes; then
+    AC_DEFINE(XCALIBRATE, 1, [Build XCalibrate extension])
+    REQUIRED_MODULES="$REQUIRED_MODULES xcalibrateproto"
+ else
+    XCALIBRATE=no
+ fi
+ AM_CONDITIONAL(XCALIBRATE, [test "x$XCALIBRATE" = xyes])
+ 
  AC_DEFINE(RENDER, 1, [Support RENDER extension])
  RENDER_LIB='$(top_builddir)/render/librender.la'
  RENDER_INC='-I$(top_srcdir)/render'
@@@ -1495,39 -1449,13 +1504,47 @@@
      fi
      
      # tslib...
++<<<<<<< HEAD/configure.ac
 +    AC_CHECK_LIB(ts, ts_open, [HAVE_TSLIB="yes"])
 +    if test "x$TSLIB" = xauto && test "x$HAVE_TSLIB" = xyes; then
 +        TSLIB=yes
 +    fi
 +
 +    if test "x$TSLIB" = xyes; then
 +        if ! test "x$HAVE_TSLIB" = xyes; then
 +            AC_MSG_ERROR([tslib must be installed to build the tslib input driver.])
 +        fi
 +        TSLIB_LIBS="-lts"
 +        AC_DEFINE(TSLIB, 1, [Have tslib support])
 +    fi
 +
 +    if test x"$ac_cv_header_SDL_SDL_h" = xyes && test "x$XSDL" = xauto; then
 +       XSDL=yes
 +    fi
 +
 +    if test x"$XSDL" = xyes; then
 +       # PKG_CHECK_MODULES(XSDL_EXTRA, Xfont xau $XDMCP_MODULES)
 +       AC_DEFINE(XSDLSERVER,1,[Build Xsdl server])
 +       XSDL_LIBS="`sdl-config --libs` $XSERVER_LIBS"
 +       XSDL_INCS="`sdl-config --cflags` $XSERVER_CFLAGS"
 +    fi
 +
 +    PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"])
 +    if test "x$XEPHYR" = xauto; then
 +        XEPHYR=$xephyr
 +    fi
 +
 +    # Xephyr needs nanosleep() which is in librt on Solaris
 +    AC_CHECK_FUNC([nanosleep], [],
 +        AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
 +    XEPHYR_LIBS="$XEPHYR_LIBS $XSERVER_LIBS"
+     if test "x$TSLIB" = xyes; then
+         PKG_CHECK_MODULES([TSLIB], [tslib-0.0], [HAVE_TSLIB="yes"], [HAVE_TSLIB="no"])
+         if test "x$HAVE_TSLIB" = xno; then
+             AC_MSG_ERROR([tslib must be installed to build the tslib driver. See http://tslib.berlios.de/])
+         fi
+         AC_DEFINE(TSLIB, 1, [Have tslib support])
+     fi
  
      # damage shadow extension glx (NOTYET) fb mi
      KDRIVE_INC='-I$(top_srcdir)/hw/kdrive/src'
@@@ -1548,32 -1476,42 +1565,39 @@@
  
      # check if we can build Xephyr
      PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"])
 -    
 +    XEPHYR_LIBS="$XEPHYR_LIBS $XSERVER_LIBS"
 +
 +    # Xephyr needs nanosleep() which is in librt on Solaris
 +    AC_CHECK_FUNC([nanosleep], [],
 +        AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
 +
+     # check for SDL SDK
+     AC_CHECK_HEADERS([SDL/SDL.h])
+     if test "x$XSDL" = xauto; then
+         XSDL="$ac_cv_header_SDL_SDL_h"
+     fi
 -fi
 -AC_SUBST(KDRIVE_INCS)
 -AC_SUBST(KDRIVE_PURE_INCS)
 -AC_SUBST(KDRIVE_CFLAGS)
 -AC_SUBST(KDRIVE_PURE_LIBS)
 -AC_SUBST(KDRIVE_LIBS)
++
 +    AC_SUBST([XEPHYR_LIBS])
 +    AC_SUBST([XEPHYR_INCS])
 +    AC_SUBST([XSDL_LIBS])
 +    AC_SUBST([XSDL_INCS])
 +fi
 +AC_SUBST([KDRIVE_INCS])
 +AC_SUBST([KDRIVE_PURE_INCS])
 +AC_SUBST([KDRIVE_CFLAGS])
 +AC_SUBST([KDRIVE_PURE_LIBS])
 +AC_SUBST([KDRIVE_LIBS])
- AM_CONDITIONAL(TSLIB, [test "x$TSLIB" = xyes])
+ AM_CONDITIONAL(TSLIB, [test "x$HAVE_TSLIB" = xyes])
  AM_CONDITIONAL(H3600_TS, false)
 +AM_CONDITIONAL(KDRIVEVESA, [test "x$KDRIVEVESA" = xyes])
 +AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes])
 +AM_CONDITIONAL(XSDLSERVER, [test x"$XSDL" = xyes])
 +AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$XEPHYR" = xyes])
 +AM_CONDITIONAL(BUILD_KDRIVEFBDEVLIB, [test "x$KDRIVE" = xyes && test "x$KDRIVEFBDEVLIB" = xyes])
 +AM_CONDITIONAL(XFAKESERVER, [test "x$KDRIVE" = xyes && test "x$XFAKE" = xyes])
- 
+ AM_CONDITIONAL(KDRIVEVESA, [test x"$ac_cv_header_sys_vm86_h" = xyes])
+ AM_CONDITIONAL(KDRIVEFBDEV, [test x"$ac_cv_header_linux_fb_h" = xyes])
  
 -# Xephyr needs nanosleep() which is in librt on Solaris
 -AC_CHECK_FUNC([nanosleep], [],
 -	AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
 -
 -AM_CONDITIONAL(XEPHYR, [test x"$xephyr" = xyes])
 -XEPHYR_LIBS="$XEPHYR_LIBS $XSERVER_LIBS"
 -AC_SUBST([XEPHYR_LIBS])
 -AC_SUBST([XEPHYR_INCS])
 -
 -if test x"$XSDL" = xyes; then
 -    AC_DEFINE(XSDLSERVER,,[Build Xsdl server])
 -    XSDL_LIBS="`sdl-config --libs` $XSERVER_LIBS"
 -    XSDL_INCS="`sdl-config --cflags` $XSERVER_CFLAGS"
 -fi
 -AM_CONDITIONAL(XSDLSERVER, [test x"$XSDL" = xyes])
 -AC_SUBST([XSDL_LIBS])
 -AC_SUBST([XSDL_INCS])
 -
 -
  dnl these only go in xkb-config.h (which is shared by the Xorg and Xnest servers)
  AC_DEFINE(__XKBDEFRULES__, "xorg", [Default XKB rules])
  AC_DEFINE_DIR(XKB_BASE_DIRECTORY, XKBPATH, [Path to XKB data])
diff --cc hw/kdrive/ati/Makefile.am
index 94d525e,3732d7d..76635fb
@@@ -65,5 -61,12 +61,4 @@@
  Xati_LDADD = \
  	$(ATI_LIBS)			\
  	@KDRIVE_LIBS@			\
- 	@XSERVER_LIBS@			\
- 	$(TSLIB_FLAG)
 -	@XSERVER_LIBS@			
 -
 -
 -Xati_DEPENDENCIES =                     \
 -        libati.a                        \
 -        $(FBDEV_LIBS)                   \
 -        $(VESA_LIBS)                    \
 -        $(DRI_LIBS)                     
 -
++	@XSERVER_LIBS@
diff --cc hw/kdrive/ephyr/Makefile.am
index b8f12c5,8f51bbe..c201fe9
@@@ -33,5 -28,5 +28,4 @@@
  	libxephyr-hostx.a			        \
  	../../../exa/libexa.la				\
  	@KDRIVE_LIBS@					\
-         $(TSLIB_LIBS)                                   \
 -	@KDRIVE_LIBS@					\
          @XEPHYR_LIBS@
diff --cc hw/kdrive/fake/Makefile.am
index a9c9aff,3a53e3d..d7ebfc2
@@@ -6,10 -6,10 +6,6 @@@
  
  bin_PROGRAMS = Xfake
  
--if TSLIB
--TSLIB_FLAG = -lts
--endif
--
  libfake_a_SOURCES =	\
  	fake.c		\
  	kbd.c		\
@@@ -23,6 -23,6 +19,4 @@@
  Xfake_LDADD = 						\
  	libfake.a					\
  	@KDRIVE_LIBS@					\
--	@KDRIVE_LIBS@					\
--	$(TSLIB_FLAG)                                   \
          @XSERVER_LIBS@
diff --cc hw/kdrive/fbdev/Makefile.am
index deed3c9,3a8c65b..cb71801
@@@ -4,10 -4,8 +4,6 @@@
  
  noinst_LIBRARIES = libfbdev.a
  
- if TSLIB
- TSLIB_FLAG = -lts
- endif
- 
 -bin_PROGRAMS = Xfbdev
 -
  libfbdev_a_SOURCES =	\
  	fbdev.c		\
  	fbdev.h
@@@ -21,6 -16,7 +17,5 @@@
  Xfbdev_LDADD = 						\
  	libfbdev.a					\
  	@KDRIVE_LIBS@					\
- 	@XSERVER_LIBS@					\
- 	$(TSLIB_FLAG)
 -	@XSERVER_LIBS@					
 -
 -Xfbdev_DEPENDENCIES =					\
 -	libfbdev.a
++	@XSERVER_LIBS@
 +endif
diff --cc hw/kdrive/mach64/Makefile.am
index 3040a89,e924aef..67712e2
@@@ -30,5 -30,8 +30,4 @@@
  Xmach64_LDADD = 					\
  	$(MACH64_LIBS)					\
  	@KDRIVE_LIBS@					\
--	@XSERVER_LIBS@					\
--	$(TSLIB_FLAG)
 -
 -
 -Xmach64_DEPENDENCIES = $(MACH64_LIBS)
++	@XSERVER_LIBS@
diff --cc hw/kdrive/mga/Makefile.am
index 7853cba,d8ebae9..ee07989
@@@ -7,10 -7,10 +7,6 @@@
  
  noinst_LIBRARIES = libmga.a
  
--if TSLIB
--TSLIB_FLAG = -lts
--endif
--
  libmga_a_SOURCES = 		\
  	mgadraw.c		\
  	g400_composite.c	\
@@@ -29,5 -29,9 +25,4 @@@
  Xmga_LDADD = \
  	$(MGA_LIBS)					\
  	@KDRIVE_LIBS@                                  \
--	@XSERVER_LIBS@					\
--	$(TSLIB_FLAG)
 -
 -Xmga_DEPENDENCIES = 					\
 -	libmga.a 					\
 -	$(top_builddir)/hw/kdrive/vesa/libvesa.a	
++	@XSERVER_LIBS@
diff --cc hw/kdrive/nvidia/Makefile.am
index 848b4cc,d7b26cf..67eff69
@@@ -7,10 -7,10 +7,6 @@@
  
  noinst_LIBRARIES = libnvidia.a
  
--if TSLIB
--TSLIB_FLAG = -lts
--endif
--
  #	nvidiavideo.c
  
  libnvidia_a_SOURCES = 	\
diff --cc hw/kdrive/sdl/Makefile.am
index cc3873c,cc3873c..f5abb86
@@@ -5,14 -5,14 +5,9 @@@
  
  bin_PROGRAMS = Xsdl
  
--if TSLIB
--TSLIB_FLAG = -lts
--endif
--
  Xsdl_SOURCES = sdl.c
  
  Xsdl_LDADD = @KDRIVE_PURE_LIBS@				\
  	@KDRIVE_LIBS@                                  \
  	@XSERVER_LIBS@					\
--	$(TSLIB_FLAG)					\
  	@XSDL_LIBS@
diff --cc hw/kdrive/sis300/Makefile.am
index e7200a2,6a6e0bf..9802074
@@@ -17,10 -17,10 +17,6 @@@
  
  bin_PROGRAMS = Xsis
  
--if TSLIB
--TSLIB_FLAG = -lts
--endif
--
  noinst_LIBRARIES = libsis.a
  
  libsis_a_SOURCES = 	\
diff --cc hw/kdrive/vesa/Makefile.am
index 8f36ddf,70ba55f..54a6f47
@@@ -27,6 -22,5 +22,4 @@@
  Xvesa_LDADD = \
  	libvesa.a 				\
  	@KDRIVE_LIBS@				\
--	@KDRIVE_LIBS@                          \
- 	$(TSLIB_FLAG)				\
  	@XSERVER_LIBS@
diff --cc hw/kdrive/via/Makefile.am
index 6e2045a,7dcfd7c..0ea8881
@@@ -5,10 -5,10 +5,6 @@@
  
  bin_PROGRAMS = Xvia
  
--if TSLIB
--TSLIB_FLAG = -lts
--endif
--
  noinst_LIBRARIES = libvia.a
  
  libvia_a_SOURCES = 	\
@@@ -28,5 -28,7 +24,4 @@@
  Xvia_LDADD =						\
  	$(VIA_LIBS)					\
  	@KDRIVE_LIBS@					\
--	@XSERVER_LIBS@					\
--	$(TSLIB_FLAG)					
 -
 -Xvia_DEPENDENCIES = $(VIA_LIBS)
++	@XSERVER_LIBS@
diff-tree 629798c73ad76a77fa6a55bc6403fd9b95ade2bb (from 4524a2bf6f22c871ed109b027a065f0262137dc5)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Sep 7 15:17:04 2006 +0300

    XkbCopyKeymap/SrvXkbCopyKeymap: free geom harder, add cheery comments
    Unconditionally free geometry when copying the keymap (so we have none on
    core, oh well), add a couple of heartening comments.

diff --git a/xkb/XKBAlloc.c b/xkb/XKBAlloc.c
index 8356e47..c474733 100644
--- a/xkb/XKBAlloc.c
+++ b/xkb/XKBAlloc.c
@@ -324,8 +324,11 @@ XkbFreeKeyboard(XkbDescPtr xkb,unsigned 
 	XkbFreeIndicatorMaps(xkb);
     if (which&XkbNamesMask)
 	XkbFreeNames(xkb,XkbAllNamesMask,True);
-    if ((which&XkbGeometryMask) && (xkb->geom!=NULL))
+    if ((which&XkbGeometryMask) && (xkb->geom!=NULL)) {
 	XkbFreeGeometry(xkb->geom,XkbGeomAllMask,True);
+        /* PERHAPS BONGHITS etc */
+        xkb->geom = NULL;
+    }
     if (which&XkbControlsMask)
 	XkbFreeControls(xkb,XkbAllControlsMask,True);
     if (freeAll)
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 813801d..0fde727 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -1476,6 +1476,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
     }
 
     /* geometry */
+    /* not implemented yet because oh god the pain. */
+#if 0
     if (src->geom) {
         /* properties */
         /* colors */
@@ -1485,9 +1487,13 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
         /* key aliases */
         /* font?!? */
     }
-    else {
+    else
+#endif
+    {
         if (dst->geom) {
+            /* I LOVE THE DIFFERENT CALL SIGNATURE.  REALLY, I DO. */
             XkbFreeGeometry(dst->geom, XkbGeomAllMask, True);
+            dst->geom = NULL;
         }
     }
 
@@ -1520,7 +1526,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
         }
         else {
             /* send NewKeyboardNotify if the keycode range changed, else
-             * just MapNotify. */
+             * just MapNotify.  we also need to send NKN if the geometry
+             * changed (obviously ...). */
             if ((src->min_key_code != dst->min_key_code ||
                  src->max_key_code != dst->max_key_code) && sendNotifies) {
                 nkn.oldMinKeyCode = dst->min_key_code;
diff-tree 4524a2bf6f22c871ed109b027a065f0262137dc5 (from 260c3f32b69c98f8fc5360f860f69d32c19f04a7)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 29 23:49:26 2006 +0300

    configure.ac: move tslib from KDRIVE_PURE_LIBS to KDRIVE_LIBS
    Yeah.  That was dumb.

diff --git a/configure.ac b/configure.ac
index a28ba08..50353ed 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1540,11 +1540,11 @@ if test "$KDRIVE" = yes; then
     # dix os fb mi extension glx (NOTYET) damage shadow xpstubs
     #KDRIVE_PURE_LIBS="$DIX_LIB $OS_LIB $FB_LIB $XEXT_LIB $MIEXT_DAMAGE_LIB \
     #    $MIEXT_SHADOW_LIB $XPSTUBS_LIB"
-    KDRIVE_PURE_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $TSLIB_LIBS $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $OS_LIB"
+    KDRIVE_PURE_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $OS_LIB"
     KDRIVE_LIB='$(top_builddir)/hw/kdrive/src/libkdrive.a'
     KDRIVE_OS_LIB='$(top_builddir)/hw/kdrive/linux/liblinux.a'
     KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.a'
-    KDRIVE_LIBS="$XSERVERLIBS_LIBS $DIX_LIB $CONFIG_LIB $KDRIVE_LIB $KDRIVE_OS_LIB $KDRIVE_PURE_LIBS $KDRIVE_STUB_LIB"
+    KDRIVE_LIBS="$XSERVERLIBS_LIBS $DIX_LIB $CONFIG_LIB $KDRIVE_LIB $TSLIB_LIBS $KDRIVE_OS_LIB $KDRIVE_PURE_LIBS $KDRIVE_STUB_LIB"
 
     # check if we can build Xephyr
     PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"])
diff-tree 260c3f32b69c98f8fc5360f860f69d32c19f04a7 (from 89d272bb183e85715d8e6047929fb2d912033d82)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 29 23:18:12 2006 +0300

    configure.ac: fix XSDL test

diff --git a/configure.ac b/configure.ac
index 360f61c..a28ba08 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1508,7 +1508,7 @@ if test "$KDRIVE" = yes; then
         AC_DEFINE(TSLIB, 1, [Have tslib support])
     fi
 
-    if test x"$ac_cv_header_SDL_SDL_h" = xyes && "x$XSDL" = xauto; then
+    if test x"$ac_cv_header_SDL_SDL_h" = xyes && test "x$XSDL" = xauto; then
        XSDL=yes
     fi
 
diff-tree 89d272bb183e85715d8e6047929fb2d912033d82 (from bd6f539ff9409aa7d9056fabe120b457b0a15997)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Tue Aug 29 15:05:31 2006 +0300

    [PATCH] kdrive/linux keyboard: remove more debugging spew

diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c
index eb4a8f1..24653ad 100644
--- a/hw/kdrive/linux/keyboard.c
+++ b/hw/kdrive/linux/keyboard.c
@@ -579,7 +579,9 @@ LinuxKeyboardRead (int fd, void *closure
                 if (!prefix && ((b[0] & 0x7f) == KEY_Prefix0))
                 {
                         prefix = KEY_Prefix0;
+#ifdef DEBUG
                         ErrorF("Prefix0");
+#endif
                         /* swallow this up */
                         b++;
                         continue;
@@ -598,7 +600,9 @@ LinuxKeyboardRead (int fd, void *closure
                         /* from xf86Events.c */
                         case KEY_Prefix0:
                         {
+#ifdef DEBUG
                             ErrorF("Prefix0 scancode: 0x%02x\n", scancode);
+#endif
                             switch (scancode) {
                                 case KEY_KP_7:
                                     scancode = KEY_Home;      break;  /* curs home */
diff-tree bd6f539ff9409aa7d9056fabe120b457b0a15997 (from 5436fce09003e20744a388fa4ae49007c9cf8ede)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Tue Aug 29 13:21:58 2006 +0300

    [PATCH] kdrive/linux keyboard: silence excessive debugging noise

diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c
index 9400e6b..eb4a8f1 100644
--- a/hw/kdrive/linux/keyboard.c
+++ b/hw/kdrive/linux/keyboard.c
@@ -659,8 +659,10 @@ LinuxKeyboardRead (int fd, void *closure
                                     prefix = 0;
                                     continue;
                                 default:
+#ifdef DEBUG
                                     ErrorF("Unreported Prefix0 scancode: 0x%02x\n",
                                            scancode);
+#endif
                                      /*
                                       * "Internet" keyboards are generating lots of new
                                       * codes.  Let them pass.  There is little consistency
@@ -675,7 +677,9 @@ LinuxKeyboardRead (int fd, void *closure
                         case KEY_Prefix1:
                         {
                             /* we do no handle these */
+#ifdef DEBUG
                             ErrorF("Prefix1 scancode: 0x%02x\n", scancode);
+#endif
                             b++;
                             prefix = 0;
                             continue;
@@ -683,7 +687,10 @@ LinuxKeyboardRead (int fd, void *closure
 
                         default: /* should not happen*/
                         case 0: /* do nothing */
+#ifdef DEBUG
                             ErrorF("Plain scancode: 0x%02x\n", scancode);
+#endif
+                            ;
                 }
 
                 prefix = 0;
diff-tree 5436fce09003e20744a388fa4ae49007c9cf8ede (from 0eb7299f445455a7bcacf2410e83227b23259675)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Tue Aug 29 13:21:40 2006 +0300

    [PATCH] GetKeyboardValutorEvents: be even more careful
    
    Don't accept devices without a keyboard feedback class.

diff --git a/dix/events.c b/dix/events.c
index 581fa08..c2c0395 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4663,7 +4663,7 @@ int GetKeyboardValuatorEvents(xEvent *ev
     if (type != KeyPress && type != KeyRelease)
         return 0;
 
-    if (!pDev->key || !pDev->focus ||
+    if (!pDev->key || !pDev->focus || !pDev->kbdfeed ||
         (pDev->coreEvents && !inputInfo.keyboard->key))
         return 0;
 
diff-tree 0eb7299f445455a7bcacf2410e83227b23259675 (from 7fa3383e3c8eea7d1eb0e556393f2431cf8e6ed2)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Tue Aug 29 13:19:12 2006 +0300

    [PATCH] XkbCopyKeymap: still more range fixes
    
    Make sure we don't stomp preserve if it doesn't already exist, and fix a
    couple of range-related thinkos in level name copying.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 5f1176b..813801d 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -1059,6 +1059,9 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                 if (dst->map->types) {
                     tmp = xrealloc(dst->map->types,
                                    src->map->size_types * sizeof(XkbKeyTypeRec));
+                    if (!tmp)
+                        return FALSE;
+                    dst->map->types = tmp;
                     bzero(dst->map->types +
                             (dst->map->size_types * sizeof(XkbKeyTypeRec)),
                           (src->map->size_types - dst->map->size_types) *
@@ -1066,10 +1069,10 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                 }
                 else {
                     tmp = xcalloc(src->map->size_types, sizeof(XkbKeyTypeRec));
+                    if (!tmp)
+                        return FALSE;
+                    dst->map->types = tmp;
                 }
-                if (!tmp)
-                    return FALSE;
-                dst->map->types = tmp;
             }
             else if (src->map->size_types < dst->map->size_types) {
                 if (dst->map->types) {
@@ -1085,7 +1088,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
 
             stype = src->map->types;
             dtype = dst->map->types;
-            for (i = 0; i < dst->map->num_types; i++, dtype++, stype++) {
+            for (i = 0; i < src->map->num_types; i++, dtype++, stype++) {
                 if (stype->num_levels != dtype->num_levels) {
                     if (dtype->level_names)
                         tmp = xrealloc(dtype->level_names,
@@ -1105,41 +1108,69 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                 dtype->name = stype->name;
                 memcpy(&dtype->mods, &stype->mods, sizeof(XkbModsRec));
 
-                if (stype->map_count != dtype->map_count) {
-                    if (dtype->map)
-                        tmp = xrealloc(dtype->map,
-                                       stype->map_count *
-                                         sizeof(XkbKTMapEntryRec));
-                    else
+                if (stype->map) {
+                    if (dtype->map) {
+                        if (stype->map_count != dtype->map_count) {
+                            tmp = xrealloc(dtype->map,
+                                           stype->map_count *
+                                             sizeof(XkbKTMapEntryRec));
+                            if (!tmp)
+                                return FALSE;
+                            dtype->map = tmp;
+                        }
+                    }
+                    else {
                         tmp = xalloc(stype->map_count *
-                                     sizeof(XkbKTMapEntryRec));
-                    if (!tmp)
-                        return FALSE;
-                    dtype->map = tmp;
+                                       sizeof(XkbKTMapEntryRec));
+                        if (!tmp)
+                            return FALSE;
+                        dtype->map = tmp;
+                    }
 
-                    if (dtype->preserve)
-                        tmp = xrealloc(dtype->preserve,
-                                       stype->map_count * sizeof(XkbModsRec));
-                    else
+                    dtype->map_count = stype->map_count;
+                    memcpy(dtype->map, stype->map, stype->map_count *
+                                               sizeof(XkbKTMapEntryRec));
+                }
+
+                if (stype->preserve) {
+                    if (dtype->preserve) {
+                        if (stype->map_count != dtype->map_count) {
+                            tmp = xrealloc(dtype->preserve,
+                                           stype->map_count *
+                                             sizeof(XkbModsRec));
+                            if (!tmp)
+                                return FALSE;
+                            dtype->preserve = tmp;
+                        }
+                    }
+                    else {
                         tmp = xalloc(stype->map_count * sizeof(XkbModsRec));
-                    if (!tmp)
-                        return FALSE;
-                    dtype->preserve = tmp;
+                        if (!tmp)
+                            return FALSE;
+                        dtype->preserve = tmp;
+                    }
+
+                    memcpy(dtype->preserve, stype->preserve,
+                           stype->map_count * sizeof(XkbModsRec));
+                }
+                else {
+                    if (dtype->preserve) {
+                        xfree(dtype->preserve);
+                        dtype->preserve = NULL;
+                    }
                 }
-                dtype->map_count = stype->map_count;
-                memcpy(dtype->map, stype->map, stype->map_count *
-                                               sizeof(XkbKTMapEntryRec));
-                memcpy(dtype->preserve, stype->preserve, stype->map_count *
-                                                         sizeof(XkbModsRec));
             }
         }
         else {
             if (dst->map->types) {
                 for (i = 0, dtype = dst->map->types; i < dst->map->num_types;
                      i++, dtype++) {
-                    xfree(dtype->level_names);
-                    xfree(dtype->map);
-                    xfree(dtype->preserve);
+                    if (dtype->level_names)
+                        xfree(dtype->level_names);
+                    if (dtype->map)
+                        xfree(dtype->map);
+                    if (dtype->preserve)
+                        xfree(dtype->preserve);
                 }
                 xfree(dst->map->types);
                 dst->map->types = NULL;
@@ -1490,8 +1521,8 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
         else {
             /* send NewKeyboardNotify if the keycode range changed, else
              * just MapNotify. */
-            if (src->min_key_code != dst->min_key_code ||
-                src->max_key_code != dst->max_key_code && sendNotifies) {
+            if ((src->min_key_code != dst->min_key_code ||
+                 src->max_key_code != dst->max_key_code) && sendNotifies) {
                 nkn.oldMinKeyCode = dst->min_key_code;
                 nkn.oldMaxKeyCode = dst->max_key_code;
                 nkn.deviceID = nkn.oldDeviceID = pDev->id;
diff-tree 7fa3383e3c8eea7d1eb0e556393f2431cf8e6ed2 (from parents)
Merge: 8d77d44fda3aacbae62864a3620e09095b79e92d ebbdc1342a243b301723390696f742dc91f59764
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 29 15:16:01 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree 8d77d44fda3aacbae62864a3620e09095b79e92d (from parents)
Merge: d6f36bd28009881ef7f7a20cdadb3808d808ed97 2fde560bbb9c1148f26fd969dc30c4e736672b7c
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Aug 27 23:08:49 2006 +0300

    Merge branch 'origin' into input-hotplug

diff-tree d6f36bd28009881ef7f7a20cdadb3808d808ed97 (from 7c4167f0d6b33c9c602b04fcfd246fd3aeddd709)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Aug 25 12:43:17 2006 +0300

    xfree86/parser: use 'kbd' driver when 'keyboard' specified
    Now that we've completely ditched the old driver, we should probably make a
    best-effort attempt to keep configs working.

diff --git a/hw/xfree86/parser/Input.c b/hw/xfree86/parser/Input.c
index 3e2186a..3d98019 100644
--- a/hw/xfree86/parser/Input.c
+++ b/hw/xfree86/parser/Input.c
@@ -102,7 +102,10 @@ xf86parseInputSection (void)
 		case DRIVER:
 			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
 				Error (QUOTE_MSG, "Driver");
-			ptr->inp_driver = val.str;
+                        if (strcmp(val.str, "keyboard") == 0)
+                            ptr->inp_driver = "kbd";
+                        else
+			    ptr->inp_driver = val.str;
 			break;
 		case OPTION:
 			ptr->inp_option_lst = xf86parseOption(ptr->inp_option_lst);
diff-tree 7c4167f0d6b33c9c602b04fcfd246fd3aeddd709 (from parents)
Merge: 393f8347edcccfc24d8902a86ea9def7ada2537b cd2da4e41eae233b50f8830d9a8f5d1d916a5a1b
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Aug 25 11:15:33 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree 393f8347edcccfc24d8902a86ea9def7ada2537b (from 3a36b0a24aa9e9e238faa7f00100f59800f5142b)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Aug 25 10:46:32 2006 +0300

    xorgconf.cpp: kbd, not keyboard

diff --git a/hw/xfree86/xorgconf.cpp b/hw/xfree86/xorgconf.cpp
index 9de7e2b..df6704f 100644
--- a/hw/xfree86/xorgconf.cpp
+++ b/hw/xfree86/xorgconf.cpp
@@ -179,7 +179,7 @@ XCOMM **********************************
 Section "InputDevice"
 
     Identifier	"Keyboard1"
-    Driver	"keyboard"
+    Driver	"kbd"
 
 XCOMM Set the keyboard auto repeat parameters.  Not all platforms implement
 XCOMM this.
diff-tree 3a36b0a24aa9e9e238faa7f00100f59800f5142b (from parents)
Merge: db1ab1bdb2f79eca593fe247056309a16ebd29c6 b879356ce96929d02bcb75b9aa24b17ac7e28125
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 24 23:35:28 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree db1ab1bdb2f79eca593fe247056309a16ebd29c6 (from 5fb8d947bb88d715b9b236342885c445cb5a9387)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 24 23:33:59 2006 +0300

    XkbCopyKeymap: fix various range issues
    Fix a bunch of range issues caused by incorrect assumptions (e.g. that the
    design was at least halfway sensible), and copy types by hand, instead of
    just blindly memcpy()ing the lot, since it itself cleverly contains a ton
    of allocated pointers.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 74799e8..5f1176b 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -28,6 +28,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include <dix-config.h>
 #endif
 
+#include "os.h"
 #include <stdio.h>
 #include <ctype.h>
 #include <math.h>
@@ -1009,16 +1010,17 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
         if (src->map->syms) {
             if (src->map->size_syms != dst->map->size_syms) {
                 if (dst->map->syms)
-                    tmp = xrealloc(dst->map->syms, src->map->size_syms);
+                    tmp = xrealloc(dst->map->syms,
+                                   src->map->size_syms * sizeof(KeySym));
                 else
-                    tmp = xalloc(src->map->size_syms);
+                    tmp = xalloc(src->map->size_syms * sizeof(KeySym));
                 if (!tmp)
                     return FALSE;
                 dst->map->syms = tmp;
+
             }
-            memcpy(dst->map->syms, src->map->syms, src->map->size_syms);
-            memcpy(dst->map->key_sym_map, src->map->key_sym_map,
-                   src->map->size_syms);
+            memcpy(dst->map->syms, src->map->syms,
+                   src->map->size_syms * sizeof(KeySym));
         }
         else {
             if (dst->map->syms) {
@@ -1029,37 +1031,116 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
         dst->map->num_syms = src->map->num_syms;
         dst->map->size_syms = src->map->size_syms;
 
-        if (src->map->types) {
-            if (src->map->size_types != dst->map->size_types) {
-                XkbKeyTypePtr stype = src->map->types;
-
-                if (dst->map->types)
-                    tmp = xrealloc(dst->map->types, src->map->size_types);
+        if (src->map->key_sym_map) {
+            if (src->max_key_code != dst->max_key_code) {
+                if (dst->map->key_sym_map)
+                    tmp = xrealloc(dst->map->key_sym_map,
+                                   (src->max_key_code + 1) *
+                                     sizeof(XkbSymMapRec));
                 else
-                    tmp = xalloc(src->map->size_types);
+                    tmp = xalloc((src->max_key_code + 1) *
+                                 sizeof(XkbSymMapRec));
+                if (!tmp)
+                    return FALSE;
+                dst->map->key_sym_map = tmp;
+            }
+            memcpy(dst->map->key_sym_map, src->map->key_sym_map,
+                   (src->max_key_code + 1) * sizeof(XkbSymMapRec));
+        }
+        else {
+            if (dst->map->key_sym_map) {
+                xfree(dst->map->key_sym_map);
+                dst->map->key_sym_map = NULL;
+            }
+        }
+
+        if (src->map->types) {
+            if (src->map->size_types > dst->map->size_types) {
+                if (dst->map->types) {
+                    tmp = xrealloc(dst->map->types,
+                                   src->map->size_types * sizeof(XkbKeyTypeRec));
+                    bzero(dst->map->types +
+                            (dst->map->size_types * sizeof(XkbKeyTypeRec)),
+                          (src->map->size_types - dst->map->size_types) *
+                            sizeof(XkbKeyTypeRec));
+                }
+                else {
+                    tmp = xcalloc(src->map->size_types, sizeof(XkbKeyTypeRec));
+                }
                 if (!tmp)
                     return FALSE;
                 dst->map->types = tmp;
             }
-            memcpy(dst->map->types, src->map->types, src->map->size_types);
+            else if (src->map->size_types < dst->map->size_types) {
+                if (dst->map->types) {
+                    for (i = src->map->num_types, dtype = (dst->map->types + i);
+                         i < dst->map->size_types; i++, dtype++) {
+                        if (dtype->level_names)
+                            xfree(dtype->level_names);
+                        dtype->level_names = NULL;
+                        dtype->num_levels = 0;
+                    }
+                }
+            }
 
             stype = src->map->types;
             dtype = dst->map->types;
             for (i = 0; i < dst->map->num_types; i++, dtype++, stype++) {
-                dtype->level_names = xalloc(dtype->num_levels * sizeof(Atom));
-                if (!dtype->level_names)
-                    continue; /* don't return FALSE here, try to whack all the
-                                 pointers we can, so we don't double-free when
-                                 going down. */
+                if (stype->num_levels != dtype->num_levels) {
+                    if (dtype->level_names)
+                        tmp = xrealloc(dtype->level_names,
+                                       stype->num_levels * sizeof(Atom));
+                    else
+                        tmp = xalloc(stype->num_levels * sizeof(Atom));
+                    if (!tmp)
+                        continue; /* don't return FALSE here, try to whack
+                                     all the pointers we can, so we don't
+                                     double-free when going down. */
+                    dtype->level_names = tmp;
+                    dtype->num_levels = stype->num_levels;
+                }
                 memcpy(dtype->level_names, stype->level_names,
-                       dtype->num_levels * sizeof(Atom));
+                       stype->num_levels * sizeof(Atom));
+
+                dtype->name = stype->name;
+                memcpy(&dtype->mods, &stype->mods, sizeof(XkbModsRec));
+
+                if (stype->map_count != dtype->map_count) {
+                    if (dtype->map)
+                        tmp = xrealloc(dtype->map,
+                                       stype->map_count *
+                                         sizeof(XkbKTMapEntryRec));
+                    else
+                        tmp = xalloc(stype->map_count *
+                                     sizeof(XkbKTMapEntryRec));
+                    if (!tmp)
+                        return FALSE;
+                    dtype->map = tmp;
+
+                    if (dtype->preserve)
+                        tmp = xrealloc(dtype->preserve,
+                                       stype->map_count * sizeof(XkbModsRec));
+                    else
+                        tmp = xalloc(stype->map_count * sizeof(XkbModsRec));
+                    if (!tmp)
+                        return FALSE;
+                    dtype->preserve = tmp;
+                }
+                dtype->map_count = stype->map_count;
+                memcpy(dtype->map, stype->map, stype->map_count *
+                                               sizeof(XkbKTMapEntryRec));
+                memcpy(dtype->preserve, stype->preserve, stype->map_count *
+                                                         sizeof(XkbModsRec));
             }
         }
         else {
             if (dst->map->types) {
                 for (i = 0, dtype = dst->map->types; i < dst->map->num_types;
-                     i++, dtype++)
+                     i++, dtype++) {
                     xfree(dtype->level_names);
+                    xfree(dtype->map);
+                    xfree(dtype->preserve);
+                }
                 xfree(dst->map->types);
                 dst->map->types = NULL;
             }
@@ -1123,15 +1204,16 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
         if (src->server->acts) {
             if (src->server->size_acts != dst->server->size_acts) {
                 if (dst->server->acts)
-                    tmp = xrealloc(dst->server->acts, src->server->size_acts);
+                    tmp = xrealloc(dst->server->acts,
+                                   src->server->size_acts * sizeof(XkbAction));
                 else
-                    tmp = xalloc(src->server->size_acts);
+                    tmp = xalloc(src->server->size_acts * sizeof(XkbAction));
                 if (!tmp)
                     return FALSE;
                 dst->server->acts = tmp;
             }
             memcpy(dst->server->acts, src->server->acts,
-                   src->server->size_acts);
+                   src->server->size_acts * sizeof(XkbAction));
         }
         else {
             if (dst->server->acts) {
@@ -1140,19 +1222,23 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
             }
         }
        dst->server->size_acts = src->server->size_acts;
+       dst->server->num_acts = src->server->num_acts;
 
         if (src->server->key_acts) {
             if (src->max_key_code != dst->max_key_code) {
                 if (dst->server->key_acts)
-                    tmp = xrealloc(dst->server->key_acts, src->max_key_code + 1);
+                    tmp = xrealloc(dst->server->key_acts,
+                                   (src->max_key_code + 1) *
+                                     sizeof(unsigned short));
                 else
-                    tmp = xalloc(src->max_key_code + 1);
+                    tmp = xalloc((src->max_key_code + 1) *
+                                 sizeof(unsigned short));
                 if (!tmp)
                     return FALSE;
                 dst->server->key_acts = tmp;
             }
             memcpy(dst->server->key_acts, src->server->key_acts,
-                   src->max_key_code + 1);
+                   (src->max_key_code + 1) * sizeof(unsigned short));
         }
         else {
             if (dst->server->key_acts) {
@@ -1188,15 +1274,17 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
             if (src->max_key_code != dst->max_key_code) {
                 if (dst->server->vmodmap)
                     tmp = xrealloc(dst->server->vmodmap,
-                                   src->max_key_code + 1);
+                                   (src->max_key_code + 1) *
+                                   sizeof(unsigned short));
                 else
-                    tmp = xalloc(src->max_key_code + 1);
+                    tmp = xalloc((src->max_key_code + 1) *
+                                 sizeof(unsigned short));
                 if (!tmp)
                     return FALSE;
                 dst->server->vmodmap = tmp;
             }
             memcpy(dst->server->vmodmap, src->server->vmodmap,
-                   src->max_key_code + 1);
+                   (src->max_key_code + 1) * sizeof(unsigned short));
         }
         else {
             if (dst->server->vmodmap) {
@@ -1324,20 +1412,20 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
     /* compat */
     if (src->compat) {
         if (src->compat->sym_interpret) {
-            if (src->compat->num_si != dst->compat->num_si) {
+            if (src->compat->size_si != dst->compat->size_si) {
                 if (dst->compat->sym_interpret)
                     tmp = xrealloc(dst->compat->sym_interpret,
-                                   src->compat->num_si *
+                                   src->compat->size_si *
                                      sizeof(XkbSymInterpretRec));
                 else
-                    tmp = xalloc(src->compat->num_si *
+                    tmp = xalloc(src->compat->size_si *
                                  sizeof(XkbSymInterpretRec));
                 if (!tmp)
                     return FALSE;
                 dst->compat->sym_interpret = tmp;
             }
             memcpy(dst->compat->sym_interpret, src->compat->sym_interpret,
-                   src->compat->num_si * sizeof(XkbSymInterpretRec));
+                   src->compat->size_si * sizeof(XkbSymInterpretRec));
         }
         else {
             if (dst->compat->sym_interpret) {
@@ -1346,6 +1434,7 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
             }
         }
         dst->compat->num_si = src->compat->num_si;
+        dst->compat->size_si = src->compat->size_si;
 
         memcpy(dst->compat->groups, src->compat->groups,
                XkbNumKbdGroups * sizeof(XkbModsRec));
diff-tree 5fb8d947bb88d715b9b236342885c445cb5a9387 (from 4e37c07ba6e5d299d4f8922dc6cf054c814f7baf)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 24 23:16:43 2006 +0300

    configure.ac: more thinkos
    Fix auto tests for vidmode and xf86dga.  I win at life.

diff --git a/configure.ac b/configure.ac
index 1c30a22..360f61c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1066,7 +1066,7 @@ if test "x$XORG" = xyes -o "x$XGL" = xye
 	XORG_LIBS="$COMPOSITE_LIB $MI_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XPSTUBS_LIB $OS_LIB"
 
 	if test "x$DGA" = xauto; then
-		PKG_CHECK_MODULES(DGA, dgaproto, [DGA=yes], [DGA=no])
+		PKG_CHECK_MODULES(DGA, xf86dgaproto, [DGA=yes], [DGA=no])
 	fi
 	if test "x$DGA" = xyes; then
 		XORG_MODULES="$XORG_MODULES xf86dgaproto"
@@ -1083,7 +1083,7 @@ if test "x$XORG" = xyes -o "x$XGL" = xye
 	fi
 
 	if test "x$XF86VIDMODE" = xauto; then
-		PKG_CHECK_MODULES(XF86VIDMODE, xf86vidmode, [XF86VIDMODE=yes], [XF86VIDMODE=no])
+		PKG_CHECK_MODULES(XF86VIDMODE, xf86vidmodeproto, [XF86VIDMODE=yes], [XF86VIDMODE=no])
 	fi
 	if test "x$XF86VIDMODE" = xyes; then
 		XORG_MODULES="$XORG_MODULES xf86vidmodeproto"
diff-tree 4e37c07ba6e5d299d4f8922dc6cf054c814f7baf (from 866ca1f929c95689bac9f0a0b3478f7b4d77214b)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 24 23:16:17 2006 +0300

    config: clean up debugging messages, make failure to acquire name fatal
    Bomb with FatalError when we can't acquire the bus and name.
    Clean up a bunch of debugging ErrorFs to be hidden behind #ifdef DEBUG.

diff --git a/config/config.c b/config/config.c
index d4cf233..d980f76 100644
--- a/config/config.c
+++ b/config/config.c
@@ -60,6 +60,7 @@ configMessage(DBusConnection *connection
     int deviceid = -1;
     DeviceIntPtr pDev = NULL;
 
+#ifdef DEBUG
     ErrorF("[dbus] new message!\n");
     ErrorF("       source: %s\n", dbus_message_get_sender(message));
     ErrorF("       destination: %s\n", dbus_message_get_destination(message));
@@ -70,6 +71,7 @@ configMessage(DBusConnection *connection
     ErrorF("       method call? %s\n", (dbus_message_get_type(message) ==
                                          DBUS_MESSAGE_TYPE_METHOD_CALL) ?
                                         "yes" : "no");
+#endif
 
     dbus_error_init(&error);
 
@@ -81,7 +83,9 @@ configMessage(DBusConnection *connection
             return DBUS_HANDLER_RESULT_NEED_MEMORY; /* ?? */
         }
         if (strcmp(dbus_message_get_member(message), "add") == 0) {
+#ifdef DEBUG
             ErrorF("       we want to add a device!\n");
+#endif
             /* signature should be [ss][ss]... */
             while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_ARRAY) {
                 option = (InputOption *)xcalloc(sizeof(InputOption), 1);
@@ -160,7 +164,9 @@ configMessage(DBusConnection *connection
             return DBUS_HANDLER_RESULT_HANDLED;
         }
         else if (strcmp(dbus_message_get_member(message), "remove") == 0) {
+#ifdef DEBUG
             ErrorF("        we want to remove a device!\n");
+#endif
             if (!dbus_message_get_args(message, &error, DBUS_TYPE_INT32,
                                        &deviceid, DBUS_TYPE_INVALID)) {
                 ErrorF("couldn't get args: %s %s\n", error.name, error.message);
@@ -172,7 +178,6 @@ configMessage(DBusConnection *connection
                 dbus_error_free(&error);
                 return DBUS_HANDLER_RESULT_HANDLED;
             }
-            ErrorF("pDev is %p\n", pDev);
             /* Call PIE here so we don't try to dereference a device that's
              * already been removed.  Technically there's still a small race
              * here, so we should ensure that SIGIO is blocked. */
@@ -200,56 +205,56 @@ configInitialise()
     dbus_error_init(&error);
     bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
     if (!bus || dbus_error_is_set(&error)) {
-        ErrorF("[dbus] some kind of error occurred: %s (%s)\n", error.name,
-                error.message);
         dbus_error_free(&error);
+        FatalError("[dbus] some kind of error occurred: %s (%s)\n", error.name,
+                   error.message);
         return;
     }
 
     if (!dbus_connection_get_unix_fd(bus, &configfd)) {
-        ErrorF("[dbus] couldn't get fd for bus\n");
         dbus_connection_close(bus);
         configfd = -1;
+        FatalError("[dbus] couldn't get fd for bus\n");
         return;
     }
 
     snprintf(busname, sizeof(busname), "org.x.config.display%d", atoi(display));
     if (!dbus_bus_request_name(bus, busname, 0, &error) ||
         dbus_error_is_set(&error)) {
-        ErrorF("[dbus] couldn't take over org.x.config: %s (%s)\n",
-               error.name, error.message);
         dbus_error_free(&error);
         dbus_connection_close(bus);
         configfd = -1;
+        FatalError("[dbus] couldn't take over org.x.config: %s (%s)\n",
+                   error.name, error.message);
         return;
     }
 
     /* blocks until we get a reply. */
     dbus_bus_add_match(bus, MATCH_RULE, &error);
     if (dbus_error_is_set(&error)) {
-        ErrorF("[dbus] couldn't match X.Org rule: %s (%s)\n", error.name,
-               error.message);
         dbus_error_free(&error);
         dbus_bus_release_name(bus, busname, &error);
         dbus_connection_close(bus);
         configfd = -1;
+        FatalError("[dbus] couldn't match X.Org rule: %s (%s)\n", error.name,
+                   error.message);
         return;
     }
 
     vtable.message_function = configMessage;
     snprintf(busobject, sizeof(busobject), "/org/x/config/%d", atoi(display));
     if (!dbus_connection_register_object_path(bus, busobject, &vtable, NULL)) {
-        ErrorF("[dbus] couldn't register object path\n");
         configfd = -1;
         dbus_bus_release_name(bus, busname, &error);
         dbus_bus_remove_match(bus, MATCH_RULE, &error);
         dbus_connection_close(bus);
-        configfd = -1;
+        FatalError("[dbus] couldn't register object path\n");
         return;
     }
+#ifdef DEBUG
     ErrorF("[dbus] registered object path %s\n", busobject);
-
     ErrorF("[dbus] registered and listening\n");
+#endif
 
     dbus_error_free(&error);
 
@@ -265,7 +270,6 @@ configFini()
 
     if (configConnection) {
         dbus_error_init(&error);
-        ErrorF("configFini being called\n");
         dbus_bus_remove_match(configConnection, MATCH_RULE, &error);
         dbus_bus_release_name(configConnection, busname, &error);
         dbus_connection_close(configConnection);
diff-tree 866ca1f929c95689bac9f0a0b3478f7b4d77214b (from 2b06c69c8feaf3bdc065635ee711efa45b3033b3)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 24 15:46:44 2006 +0300

    configure.ac: fix XF86VidMode test

diff --git a/configure.ac b/configure.ac
index 19ef8d1..1c30a22 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1082,8 +1082,8 @@ if test "x$XORG" = xyes -o "x$XGL" = xye
 		AC_DEFINE(XF86MISC, 1, [Support XFree86 miscellaneous extensions])
 	fi
 
-	if test "x$XF86VIDMOE" = xauto; then
-		PKG_CHECK_MODULES(XF86VIDMODE, xf86vidmode, [DGA=yes], [DGA=no])
+	if test "x$XF86VIDMODE" = xauto; then
+		PKG_CHECK_MODULES(XF86VIDMODE, xf86vidmode, [XF86VIDMODE=yes], [XF86VIDMODE=no])
 	fi
 	if test "x$XF86VIDMODE" = xyes; then
 		XORG_MODULES="$XORG_MODULES xf86vidmodeproto"
diff-tree 2b06c69c8feaf3bdc065635ee711efa45b3033b3 (from 4adf9af313c9f63b6ad734e174efe1d36ddb5813)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 24 14:51:26 2006 +0300

    GKVE: pass correct arguments to XkbCopyKeymap
    Fix horrendous thinko.  Indicators now work perfectly.

diff --git a/dix/events.c b/dix/events.c
index 6372a20..581fa08 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4651,7 +4651,8 @@ int GetKeyboardValuatorEvents(xEvent *ev
                               int key_code, int num_valuators,
                               int *valuators) {
     int numEvents = 0, ms = 0, first_valuator = 0;
-    KeySym sym = pDev->key->curKeySyms.map[key_code * pDev->key->curKeySyms.mapWidth];
+    KeySym sym = pDev->key->curKeySyms.map[key_code *
+                                           pDev->key->curKeySyms.mapWidth];
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
     KeyClassPtr ckeyc;
@@ -4778,7 +4779,8 @@ int GetKeyboardValuatorEvents(xEvent *ev
 #ifdef XKB
             if (!noXkbExtension && pDev->key->xkbInfo &&
                 pDev->key->xkbInfo->desc) {
-                if (!XkbCopyKeymap(pDev->key->xkbInfo, ckeyc->xkbInfo, True))
+                if (!XkbCopyKeymap(pDev->key->xkbInfo->desc,
+                                   ckeyc->xkbInfo->desc, True))
                     FatalError("Couldn't pivot keymap from device to core!\n");
             }
 #endif
diff-tree 4adf9af313c9f63b6ad734e174efe1d36ddb5813 (from parents)
Merge: 33af05d58f1f4f021036e9ce4b60fd76dbaebe73 67bd672c880869ef625ae0c0163c3ec1eba46abf
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 24 10:59:33 2006 +0300

    Merge branch 'master' into input-hotplug

diff-tree 33af05d58f1f4f021036e9ce4b60fd76dbaebe73 (from 6323a11d0db4d3cf0317af83f0362730142f5325)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Aug 23 19:05:50 2006 +0300

    XkbCopyKeymap: use correct range for MapNotify
    We haven't copied {min,max}_key_code by the time the notifies run, so use
    src instead of dst to determine number of keys, et al.

diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index da790f9..74799e8 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -1418,20 +1418,20 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
                 mn.minKeyCode = src->min_key_code;
                 mn.maxKeyCode = src->max_key_code;
                 mn.firstType = 0;
-                mn.nTypes = dst->map->num_types;
-                mn.firstKeySym = dst->min_key_code;
-                mn.nKeySyms = XkbNumKeys(dst);
-                mn.firstKeyAct = dst->min_key_code;
-                mn.nKeyActs = XkbNumKeys(dst);
+                mn.nTypes = src->map->num_types;
+                mn.firstKeySym = src->min_key_code;
+                mn.nKeySyms = XkbNumKeys(src);
+                mn.firstKeyAct = src->min_key_code;
+                mn.nKeyActs = XkbNumKeys(src);
                 /* Cargo-culted from ProcXkbGetMap. */
-                mn.firstKeyBehavior = dst->min_key_code;
-                mn.nKeyBehaviors = XkbNumKeys(dst);
-                mn.firstKeyExplicit = dst->min_key_code;
-                mn.nKeyExplicit = XkbNumKeys(dst);
-                mn.firstModMapKey = dst->min_key_code;
-                mn.nModMapKeys = XkbNumKeys(dst);
-                mn.firstVModMapKey = dst->min_key_code;
-                mn.nVModMapKeys = XkbNumKeys(dst);
+                mn.firstKeyBehavior = src->min_key_code;
+                mn.nKeyBehaviors = XkbNumKeys(src);
+                mn.firstKeyExplicit = src->min_key_code;
+                mn.nKeyExplicit = XkbNumKeys(src);
+                mn.firstModMapKey = src->min_key_code;
+                mn.nModMapKeys = XkbNumKeys(src);
+                mn.firstVModMapKey = src->min_key_code;
+                mn.nVModMapKeys = XkbNumKeys(src);
                 mn.virtualMods = ~0; /* ??? */
                 mn.changed = XkbAllMapComponentsMask;                
                 XkbSendMapNotify(pDev, &mn);
diff-tree 6323a11d0db4d3cf0317af83f0362730142f5325 (from 728fbadd16a748b45c80bc2c65c46f82cf803578)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Aug 23 18:53:04 2006 +0300

    XkbCopyKeymap: optionally send NewKeyboardNotify/MapNotify events
    Optionally send a NewKeyboardNotify or MapNotify event when copying the
    keymap; modify GetKeyboardValuatorEvents to make use of this.

diff --git a/dix/events.c b/dix/events.c
index 808694d..6372a20 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4655,9 +4655,6 @@ int GetKeyboardValuatorEvents(xEvent *ev
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
     KeyClassPtr ckeyc;
-#ifdef XKB
-    xkbMapNotify mn;
-#endif
 
     if (!events)
         return 0;
@@ -4781,28 +4778,7 @@ int GetKeyboardValuatorEvents(xEvent *ev
 #ifdef XKB
             if (!noXkbExtension && pDev->key->xkbInfo &&
                 pDev->key->xkbInfo->desc) {
-                mn.deviceID = inputInfo.keyboard->id;
-                mn.minKeyCode = pDev->key->xkbInfo->desc->min_key_code;
-                mn.maxKeyCode = pDev->key->xkbInfo->desc->max_key_code;
-                mn.firstType = 0;
-                mn.nTypes = pDev->key->xkbInfo->desc->map->num_types;
-                mn.firstKeySym = pDev->key->xkbInfo->desc->min_key_code;
-                mn.nKeySyms = XkbNumKeys(pDev->key->xkbInfo->desc);
-                mn.firstKeyAct = pDev->key->xkbInfo->desc->min_key_code;
-                mn.nKeyActs = XkbNumKeys(pDev->key->xkbInfo->desc);
-                /* Cargo-culted from ProcXkbGetMap. */
-                mn.firstKeyBehavior = pDev->key->xkbInfo->desc->min_key_code;
-                mn.nKeyBehaviors = XkbNumKeys(pDev->key->xkbInfo->desc);
-                mn.firstKeyExplicit = pDev->key->xkbInfo->desc->min_key_code;
-                mn.nKeyExplicit = XkbNumKeys(pDev->key->xkbInfo->desc);
-                mn.firstModMapKey = pDev->key->xkbInfo->desc->min_key_code;
-                mn.nModMapKeys = XkbNumKeys(pDev->key->xkbInfo->desc);
-                mn.firstVModMapKey = pDev->key->xkbInfo->desc->min_key_code;
-                mn.nVModMapKeys = XkbNumKeys(pDev->key->xkbInfo->desc);
-                mn.virtualMods = ~0; /* ??? */
-                mn.changed = XkbAllMapComponentsMask;
-                
-                if (!XkbCopyKeymap(pDev->key->xkbInfo, ckeyc->xkbInfo))
+                if (!XkbCopyKeymap(pDev->key->xkbInfo, ckeyc->xkbInfo, True))
                     FatalError("Couldn't pivot keymap from device to core!\n");
             }
 #endif
diff --git a/xkb/xkb.h b/xkb/xkb.h
index a85df8e..2be4258 100644
--- a/xkb/xkb.h
+++ b/xkb/xkb.h
@@ -75,4 +75,5 @@ extern Bool XkbDDXCompileKeymapByNames(
 
 extern Bool XkbCopyKeymap(
     XkbDescPtr              src,
-    XkbDescPtr              dst);
+    XkbDescPtr              dst,
+    Bool                    sendNotifies);
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 4fa5369..da790f9 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -985,13 +985,16 @@ XkbConvertCase(register KeySym sym, KeyS
  * to remain valid, but part of the map may be from src and part from dst.
  */
 Bool
-XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst)
+XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
 {
     int i = 0, j = 0;
     void *tmp = NULL;
     XkbKeyTypePtr stype = NULL, dtype = NULL;
+    DeviceIntPtr pDev = NULL, tmpDev = NULL;
+    xkbMapNotify mn;
+    xkbNewKeyboardNotify nkn;
 
-    if (!src || !dst)
+    if (!src || !dst || src == dst)
         return FALSE;
 
     /* client map */
@@ -1368,6 +1371,74 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr
         }
     }
 
+    if (inputInfo.keyboard->key->xkbInfo &&
+        inputInfo.keyboard->key->xkbInfo->desc == dst) {
+        pDev = inputInfo.keyboard;
+    }
+    else {
+        for (tmpDev = inputInfo.devices; tmpDev && !pDev;
+             tmpDev = tmpDev->next) {
+            if (tmpDev->key && tmpDev->key->xkbInfo &&
+                tmpDev->key->xkbInfo->desc == dst) {
+                pDev = tmpDev;
+                break;
+            }
+        }
+        for (tmpDev = inputInfo.off_devices; tmpDev && !pDev;
+             tmpDev = tmpDev->next) {
+            if (tmpDev->key && tmpDev->key->xkbInfo &&
+                tmpDev->key->xkbInfo->desc == dst) {
+                pDev = tmpDev;
+                break;
+            }
+        }
+    }
+
+    if (sendNotifies) {
+        if (!pDev) {
+            ErrorF("XkbCopyKeymap: asked for notifies, but can't find device!\n");
+        }
+        else {
+            /* send NewKeyboardNotify if the keycode range changed, else
+             * just MapNotify. */
+            if (src->min_key_code != dst->min_key_code ||
+                src->max_key_code != dst->max_key_code && sendNotifies) {
+                nkn.oldMinKeyCode = dst->min_key_code;
+                nkn.oldMaxKeyCode = dst->max_key_code;
+                nkn.deviceID = nkn.oldDeviceID = pDev->id;
+                nkn.minKeyCode = src->min_key_code;
+                nkn.maxKeyCode = src->max_key_code;
+                nkn.requestMajor = XkbReqCode;
+                nkn.requestMinor = X_kbSetMap; /* XXX bare-faced lie */
+                nkn.changed = XkbAllNewKeyboardEventsMask;
+                XkbSendNewKeyboardNotify(pDev, &nkn);
+            }
+            else if (sendNotifies) {
+                mn.deviceID = pDev->id;
+                mn.minKeyCode = src->min_key_code;
+                mn.maxKeyCode = src->max_key_code;
+                mn.firstType = 0;
+                mn.nTypes = dst->map->num_types;
+                mn.firstKeySym = dst->min_key_code;
+                mn.nKeySyms = XkbNumKeys(dst);
+                mn.firstKeyAct = dst->min_key_code;
+                mn.nKeyActs = XkbNumKeys(dst);
+                /* Cargo-culted from ProcXkbGetMap. */
+                mn.firstKeyBehavior = dst->min_key_code;
+                mn.nKeyBehaviors = XkbNumKeys(dst);
+                mn.firstKeyExplicit = dst->min_key_code;
+                mn.nKeyExplicit = XkbNumKeys(dst);
+                mn.firstModMapKey = dst->min_key_code;
+                mn.nModMapKeys = XkbNumKeys(dst);
+                mn.firstVModMapKey = dst->min_key_code;
+                mn.nVModMapKeys = XkbNumKeys(dst);
+                mn.virtualMods = ~0; /* ??? */
+                mn.changed = XkbAllMapComponentsMask;                
+                XkbSendMapNotify(pDev, &mn);
+            }
+        }
+    }
+
     dst->min_key_code = src->min_key_code;
     dst->max_key_code = src->max_key_code;
 
diff-tree 728fbadd16a748b45c80bc2c65c46f82cf803578 (from 8f8487ff997670a4af0293fed77ff920cfc39fb1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Aug 23 14:33:59 2006 +0300

    gitignore: ignore vi swap files

diff --git a/.gitignore b/.gitignore
index 4118cd0..62b5fd6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -267,3 +267,4 @@ mfb/mfbteblack.c
 mfb/mfbtewhite.c
 mfb/mfbtileC.c
 mfb/mfbtileG.c
+.*.swp
diff-tree 8f8487ff997670a4af0293fed77ff920cfc39fb1 (from a56b98bb047003a05e26ca9365c212a2da7ac200)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Aug 23 14:33:41 2006 +0300

    xkb/gkve: copy XKB map, not pointer-assign
    Write a new function to copy an XKB map (does everything but geometry at
    the moment), and use that instead of nasty pointer assignments.

diff --git a/dix/devices.c b/dix/devices.c
index 773b301..60c2d29 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -260,16 +260,6 @@ CoreKeyboardProc(DeviceIntPtr pDev, int 
         break;
 
     case DEVICE_CLOSE:
-        /* This, uh, probably requires some explanation.
-         * Press a key on another keyboard.
-         * Watch its xkbInfo get pivoted into core's.
-         * Kill the server.
-         * Watch the first device's xkbInfo get freed.
-         * Try to free ours, which points to same.
-         *
-         * ... yeah.
-         */
-        pDev->key->xkbInfo = NULL;
         pDev->devPrivates[CoreDevicePrivatesIndex].ptr = NULL;
         break;
 
diff --git a/dix/events.c b/dix/events.c
index 47c52d1..808694d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4802,14 +4802,8 @@ int GetKeyboardValuatorEvents(xEvent *ev
                 mn.virtualMods = ~0; /* ??? */
                 mn.changed = XkbAllMapComponentsMask;
                 
-                /* If this is still the map we set at DEVICE_INIT, free it so
-                 * it doesn't just get lost.  (Shameful hack, sorry.) */
-                if (!inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr &&
-                    ckeyc->xkbInfo)
-                    XkbFreeInfo(ckeyc->xkbInfo);
-                /* FIXME we really need a map copy here. */
-                ckeyc->xkbInfo = pDev->key->xkbInfo;
-                XkbSendMapNotify(inputInfo.keyboard, &mn);
+                if (!XkbCopyKeymap(pDev->key->xkbInfo, ckeyc->xkbInfo))
+                    FatalError("Couldn't pivot keymap from device to core!\n");
             }
 #endif
             SendMappingNotify(MappingKeyboard, ckeyc->curKeySyms.minKeyCode,
diff --git a/xkb/xkb.h b/xkb/xkb.h
index 156608e..a85df8e 100644
--- a/xkb/xkb.h
+++ b/xkb/xkb.h
@@ -72,3 +72,7 @@ extern Bool XkbDDXCompileKeymapByNames(
     unsigned                need,
     char *                  nameRtrn,
     int                     nameRtrnLen);
+
+extern Bool XkbCopyKeymap(
+    XkbDescPtr              src,
+    XkbDescPtr              dst);
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index ee0abbe..4fa5369 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -969,3 +969,407 @@ XkbConvertCase(register KeySym sym, KeyS
         break;
     }
 }
+
+
+/**
+ * Copy an XKB map from src to dst, reallocating when necessary: if some
+ * map components are present in one, but not in the other, the destination
+ * components will be allocated or freed as necessary.
+ *
+ * Basic map consistency is assumed on both sides, so maps with random
+ * uninitialised data (e.g. names->radio_grous == NULL, names->num_rg == 19)
+ * _will_ cause failures.  You've been warned.
+ *
+ * Returns TRUE on success, or FALSE on failure.  If this function fails,
+ * dst may be in an inconsistent state: all its pointers are guaranteed
+ * to remain valid, but part of the map may be from src and part from dst.
+ */
+Bool
+XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst)
+{
+    int i = 0, j = 0;
+    void *tmp = NULL;
+    XkbKeyTypePtr stype = NULL, dtype = NULL;
+
+    if (!src || !dst)
+        return FALSE;
+
+    /* client map */
+    if (src->map) {
+        if (!dst->map) {
+            tmp = xcalloc(1, sizeof(XkbClientMapRec));
+            if (!tmp)
+                return FALSE;
+            dst->map = tmp;
+        }
+
+        if (src->map->syms) {
+            if (src->map->size_syms != dst->map->size_syms) {
+                if (dst->map->syms)
+                    tmp = xrealloc(dst->map->syms, src->map->size_syms);
+                else
+                    tmp = xalloc(src->map->size_syms);
+                if (!tmp)
+                    return FALSE;
+                dst->map->syms = tmp;
+            }
+            memcpy(dst->map->syms, src->map->syms, src->map->size_syms);
+            memcpy(dst->map->key_sym_map, src->map->key_sym_map,
+                   src->map->size_syms);
+        }
+        else {
+            if (dst->map->syms) {
+                xfree(dst->map->syms);
+                dst->map->syms = NULL;
+            }
+        }
+        dst->map->num_syms = src->map->num_syms;
+        dst->map->size_syms = src->map->size_syms;
+
+        if (src->map->types) {
+            if (src->map->size_types != dst->map->size_types) {
+                XkbKeyTypePtr stype = src->map->types;
+
+                if (dst->map->types)
+                    tmp = xrealloc(dst->map->types, src->map->size_types);
+                else
+                    tmp = xalloc(src->map->size_types);
+                if (!tmp)
+                    return FALSE;
+                dst->map->types = tmp;
+            }
+            memcpy(dst->map->types, src->map->types, src->map->size_types);
+
+            stype = src->map->types;
+            dtype = dst->map->types;
+            for (i = 0; i < dst->map->num_types; i++, dtype++, stype++) {
+                dtype->level_names = xalloc(dtype->num_levels * sizeof(Atom));
+                if (!dtype->level_names)
+                    continue; /* don't return FALSE here, try to whack all the
+                                 pointers we can, so we don't double-free when
+                                 going down. */
+                memcpy(dtype->level_names, stype->level_names,
+                       dtype->num_levels * sizeof(Atom));
+            }
+        }
+        else {
+            if (dst->map->types) {
+                for (i = 0, dtype = dst->map->types; i < dst->map->num_types;
+                     i++, dtype++)
+                    xfree(dtype->level_names);
+                xfree(dst->map->types);
+                dst->map->types = NULL;
+            }
+        }
+        dst->map->size_types = src->map->size_types;
+        dst->map->num_types = src->map->num_types;
+
+        if (src->map->modmap) {
+            if (src->max_key_code != dst->max_key_code) {
+                if (dst->map->modmap)
+                    tmp = xrealloc(dst->map->modmap, src->max_key_code + 1);
+                else
+                    tmp = xalloc(src->max_key_code + 1);
+                if (!tmp)
+                    return FALSE;
+                dst->map->syms = tmp;
+            }
+            memcpy(dst->map->modmap, src->map->modmap, src->max_key_code + 1);
+        }
+        else {
+            if (dst->map->modmap) {
+                xfree(dst->map->modmap);
+                dst->map->modmap = NULL;
+            }
+        }
+    }
+    else {
+        if (dst->map)
+            XkbFreeClientMap(dst, XkbAllClientInfoMask, True);
+    }
+
+    /* server map */
+    if (src->server) {
+        if (!dst->server) {
+            tmp = xcalloc(1, sizeof(XkbServerMapRec));
+            if (!tmp)
+                return FALSE;
+            dst->server = tmp;
+        }
+
+        if (src->server->explicit) {
+            if (src->max_key_code != dst->max_key_code) {
+                if (dst->server->explicit)
+                    tmp = xrealloc(dst->server->explicit, src->max_key_code + 1);
+                else
+                    tmp = xalloc(src->max_key_code + 1);
+                if (!tmp)
+                    return FALSE;
+                dst->server->explicit = tmp;
+            }
+            memcpy(dst->server->explicit, src->server->explicit,
+                   src->max_key_code + 1);
+        }
+        else {
+            if (dst->server->explicit) {
+                xfree(dst->server->explicit);
+                dst->server->explicit = NULL;
+            }
+        }
+
+        if (src->server->acts) {
+            if (src->server->size_acts != dst->server->size_acts) {
+                if (dst->server->acts)
+                    tmp = xrealloc(dst->server->acts, src->server->size_acts);
+                else
+                    tmp = xalloc(src->server->size_acts);
+                if (!tmp)
+                    return FALSE;
+                dst->server->acts = tmp;
+            }
+            memcpy(dst->server->acts, src->server->acts,
+                   src->server->size_acts);
+        }
+        else {
+            if (dst->server->acts) {
+                xfree(dst->server->acts);
+                dst->server->acts = NULL;
+            }
+        }
+       dst->server->size_acts = src->server->size_acts;
+
+        if (src->server->key_acts) {
+            if (src->max_key_code != dst->max_key_code) {
+                if (dst->server->key_acts)
+                    tmp = xrealloc(dst->server->key_acts, src->max_key_code + 1);
+                else
+                    tmp = xalloc(src->max_key_code + 1);
+                if (!tmp)
+                    return FALSE;
+                dst->server->key_acts = tmp;
+            }
+            memcpy(dst->server->key_acts, src->server->key_acts,
+                   src->max_key_code + 1);
+        }
+        else {
+            if (dst->server->key_acts) {
+                xfree(dst->server->key_acts);
+                dst->server->key_acts = NULL;
+            }
+        }
+
+        if (src->server->behaviors) {
+            if (src->max_key_code != dst->max_key_code) {
+                if (dst->server->behaviors)
+                    tmp = xrealloc(dst->server->behaviors,
+                                   (src->max_key_code + 1) *
+                                   sizeof(XkbBehavior));
+                else
+                    tmp = xalloc((src->max_key_code + 1) *
+                                 sizeof(XkbBehavior));
+                if (!tmp)
+                    return FALSE;
+                dst->server->behaviors = tmp;
+            }
+            memcpy(dst->server->behaviors, src->server->behaviors,
+                   (src->max_key_code + 1) * sizeof(XkbBehavior));
+        }
+        else {
+            if (dst->server->behaviors) {
+                xfree(dst->server->behaviors);
+                dst->server->behaviors = NULL;
+            }
+        }
+
+        if (src->server->vmodmap) {
+            if (src->max_key_code != dst->max_key_code) {
+                if (dst->server->vmodmap)
+                    tmp = xrealloc(dst->server->vmodmap,
+                                   src->max_key_code + 1);
+                else
+                    tmp = xalloc(src->max_key_code + 1);
+                if (!tmp)
+                    return FALSE;
+                dst->server->vmodmap = tmp;
+            }
+            memcpy(dst->server->vmodmap, src->server->vmodmap,
+                   src->max_key_code + 1);
+        }
+        else {
+            if (dst->server->vmodmap) {
+                xfree(dst->server->vmodmap);
+                dst->server->vmodmap = NULL;
+            }
+        }
+    }
+    else {
+        if (dst->server)
+            XkbFreeServerMap(dst, XkbAllServerInfoMask, True);
+    }
+
+    /* indicators */
+    if (src->indicators) {
+        if (!dst->indicators) {
+            dst->indicators = xalloc(sizeof(XkbIndicatorRec));
+            if (!dst->indicators)
+                return FALSE;
+        }
+        memcpy(dst->indicators, src->indicators, sizeof(XkbIndicatorRec));
+    }
+    else {
+        if (dst->indicators) {
+            xfree(dst->indicators);
+            dst->indicators = NULL;
+        }
+    }
+
+    /* controls */
+    if (src->ctrls) {
+        if (!dst->ctrls) {
+            dst->ctrls = xalloc(sizeof(XkbControlsRec));
+            if (!dst->ctrls)
+                return FALSE;
+        }
+        memcpy(dst->ctrls, src->ctrls, sizeof(XkbControlsRec));
+    }
+    else {
+        if (dst->ctrls) {
+            xfree(dst->ctrls);
+            dst->ctrls = NULL;
+        }
+    }
+
+    /* names */
+    if (src->names) {
+        if (!dst->names) {
+            dst->names = xcalloc(1, sizeof(XkbNamesRec));
+            if (!dst->names)
+                return FALSE;
+        }
+
+        if (src->names->keys) {
+            if (src->max_key_code != dst->max_key_code) {
+                if (dst->names->keys)
+                    tmp = xrealloc(dst->names->keys, (src->max_key_code + 1) *
+                                   sizeof(XkbKeyNameRec));
+                else
+                    tmp = xalloc((src->max_key_code + 1) *
+                                 sizeof(XkbKeyNameRec));
+                if (!tmp)
+                    return FALSE;
+                dst->names->keys = tmp;
+            }
+            memcpy(dst->names->keys, src->names->keys,
+                   (src->max_key_code + 1) * sizeof(XkbKeyNameRec));
+        }
+        else {
+            if (dst->names->keys) {
+                xfree(dst->names->keys);
+                dst->names->keys = NULL;
+            }
+        }
+
+        if (src->names->num_key_aliases) {
+            if (src->names->num_key_aliases != dst->names->num_key_aliases) {
+                if (dst->names->key_aliases)
+                    tmp = xrealloc(dst->names->key_aliases,
+                                   src->names->num_key_aliases *
+                                     sizeof(XkbKeyAliasRec));
+                else
+                    tmp = xalloc(src->names->num_key_aliases *
+                                 sizeof(XkbKeyAliasRec));
+                if (!tmp)
+                    return FALSE;
+                dst->names->key_aliases = tmp;
+            }
+            memcpy(dst->names->key_aliases, src->names->key_aliases,
+                   src->names->num_key_aliases * sizeof(XkbKeyAliasRec));
+        }
+        else {
+            if (dst->names->key_aliases) {
+                xfree(dst->names->key_aliases);
+                dst->names->key_aliases = NULL;
+            }
+        }
+        dst->names->num_key_aliases = src->names->num_key_aliases;
+
+        if (src->names->num_rg) {
+            if (src->names->num_rg != dst->names->num_rg) {
+                if (dst->names->radio_groups)
+                    tmp = xrealloc(dst->names->radio_groups,
+                                   src->names->num_rg * sizeof(Atom));
+                else
+                    tmp = xalloc(src->names->num_rg * sizeof(Atom));
+                if (!tmp)
+                    return FALSE;
+                dst->names->radio_groups = tmp;
+            }
+            memcpy(dst->names->radio_groups, src->names->radio_groups,
+                   src->names->num_rg * sizeof(Atom));
+        }
+        else {
+            if (dst->names->radio_groups)
+                xfree(dst->names->radio_groups);
+        }
+        dst->names->num_rg = src->names->num_rg;
+    }
+    else {
+        if (dst->names)
+            XkbFreeNames(dst, XkbAllNamesMask, True);
+    }
+
+    /* compat */
+    if (src->compat) {
+        if (src->compat->sym_interpret) {
+            if (src->compat->num_si != dst->compat->num_si) {
+                if (dst->compat->sym_interpret)
+                    tmp = xrealloc(dst->compat->sym_interpret,
+                                   src->compat->num_si *
+                                     sizeof(XkbSymInterpretRec));
+                else
+                    tmp = xalloc(src->compat->num_si *
+                                 sizeof(XkbSymInterpretRec));
+                if (!tmp)
+                    return FALSE;
+                dst->compat->sym_interpret = tmp;
+            }
+            memcpy(dst->compat->sym_interpret, src->compat->sym_interpret,
+                   src->compat->num_si * sizeof(XkbSymInterpretRec));
+        }
+        else {
+            if (dst->compat->sym_interpret) {
+                xfree(dst->compat->sym_interpret);
+                dst->compat->sym_interpret = NULL;
+            }
+        }
+        dst->compat->num_si = src->compat->num_si;
+
+        memcpy(dst->compat->groups, src->compat->groups,
+               XkbNumKbdGroups * sizeof(XkbModsRec));
+    }
+    else {
+        if (dst->compat)
+            XkbFreeCompatMap(dst, XkbAllCompatMask, True);
+    }
+
+    /* geometry */
+    if (src->geom) {
+        /* properties */
+        /* colors */
+        /* shapes */
+        /* sections */
+        /* doodads */
+        /* key aliases */
+        /* font?!? */
+    }
+    else {
+        if (dst->geom) {
+            XkbFreeGeometry(dst->geom, XkbGeomAllMask, True);
+        }
+    }
+
+    dst->min_key_code = src->min_key_code;
+    dst->max_key_code = src->max_key_code;
+
+    return TRUE;
+}
diff-tree a56b98bb047003a05e26ca9365c212a2da7ac200 (from 0704bb298cc826cd117815898c6bc015a693c2c9)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Fri Aug 18 18:03:41 2006 +0300

    dix: enable null root cursor
    
    Enable a blank root cursor, selectable with --enable-null-root-cursor at
    configure time.

diff --git a/configure.ac b/configure.ac
index e68021d..19ef8d1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -396,6 +396,9 @@ AC_ARG_ENABLE(install-libxf86config,
 AC_ARG_ENABLE(builtin-fonts,  AS_HELP_STRING([--enable-builtin-fonts], [Use only built-in fonts (default: use external)]),
                                 [BUILTIN_FONTS=$enableval],
                                 [BUILTIN_FONTS=no])
+AC_ARG_ENABLE(null-root-cursor, AS_HELP_STRING([--enable-null-root-cursor], [Use an empty root cursor (default: use core cursor)]),
+                                 [NULL_ROOT_CURSOR=$enableval],
+                                 [NULL_ROOT_CURSOR=no])
 
 dnl Extensions.
 AC_ARG_ENABLE(composite,      AS_HELP_STRING([--disable-composite], [Build Composite extension (default: enabled)]), [COMPOSITE=$enableval], [COMPOSITE=yes])
@@ -745,6 +748,10 @@ XKB_STUB_LIB='$(top_builddir)/xkb/libxkb
 AC_CHECK_FUNC(strcasecmp, [], AC_DEFINE([NEED_STRCASECMP], 1,
                                         [Do not have `strcasecmp'.]))
 
+if test "x$NULL_ROOT_CURSOR" = xyes; then
+        AC_DEFINE(NULL_ROOT_CURSOR, 1, [Use an empty root cursor])
+fi
+
 PKG_CHECK_MODULES([XDMCP], [xdmcp], [have_libxdmcp="yes"], [have_libxdmcp="no"])
 if test "x$have_libxdmcp" = xyes; then
 	AC_CHECK_LIB(Xdmcp, XdmcpWrap, [have_xdmcpwrap="yes"], [have_xdmcpwrap="no"], [$XDMCP_LIBS])
diff --git a/dix/main.c b/dix/main.c
index 7449c5a..f2e494e 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -249,6 +249,7 @@ main(int argc, char *argv[], char *envp[
     int		i, j, k, error;
     char	*xauthfile;
     HWEventQueueType	alwaysCheckForInput[2];
+    CursorMetricRec cm;
 
     display = "0";
 
@@ -415,9 +416,20 @@ main(int argc, char *argv[], char *envp[
 	}
 	if (!SetDefaultFont(defaultTextFont))
 	    FatalError("could not open default font '%s'", defaultTextFont);
+#ifdef NULL_ROOT_CURSOR
+        cm.width = 0;
+        cm.height = 0;
+        cm.xhot = 0;
+        cm.yhot = 0;
+
+        if (!(rootCursor = AllocCursor(NULL, NULL, &cm, 0, 0, 0, 0, 0, 0)))
+            FatalError("could not create empty root cursor");
+        AddResource(FakeClientID(0), RT_CURSOR, (pointer)rootCursor);
+#else
 	if (!(rootCursor = CreateRootCursor(defaultCursorFont, 0)))
 	    FatalError("could not open default cursor font '%s'",
 		       defaultCursorFont);
+#endif
 #ifdef DPMSExtension
  	/* check all screens, looking for DPMS Capabilities */
  	DPMSCapableFlag = DPMSSupported();
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 2cf9eaf..2e05e04 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -445,4 +445,7 @@
 /* Avoid using font servers */
 #undef NOFONTSERVERACCESS
 
+/* Use an empty root cursor */
+#undef NULL_ROOT_CURSOR
+
 #endif /* _DIX_CONFIG_H_ */
diff-tree 0704bb298cc826cd117815898c6bc015a693c2c9 (from parents)
Merge: c14036977fef7b8787c0b68f5262fa0b6a2834f5 a1ac0440bba690368aa4226468ce571be1a09d95
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Aug 18 17:30:14 2006 +0300

    Merge branch 'master' into input-hotplug

diff-tree c14036977fef7b8787c0b68f5262fa0b6a2834f5 (from 1c2cb30cd88ba4453f9da339025f8ff39f7f5412)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Aug 18 17:24:34 2006 +0300

    input.h: add InitCoreDevices prototype

diff --git a/include/input.h b/include/input.h
index 6572db5..6573a1f 100644
--- a/include/input.h
+++ b/include/input.h
@@ -167,6 +167,8 @@ typedef struct _InputOption {
     struct _InputOption *next;
 } InputOption;
 
+extern void InitCoreDevices(void);
+
 extern DeviceIntPtr AddInputDevice(
     DeviceProc /*deviceProc*/,
     Bool /*autoStart*/);
diff-tree 1c2cb30cd88ba4453f9da339025f8ff39f7f5412 (from parents)
Merge: 633b6a69f560c0a77dcff78fdef5fcf0041e2e04 70ddd0f39d5118db72a1a4e473cbfb502f1ed9ec
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Aug 18 17:05:50 2006 +0300

    Merge branch 'origin' into input-hotplug

diff-tree 633b6a69f560c0a77dcff78fdef5fcf0041e2e04 (from parents)
Merge: 95dbfcf8828c041c218145afc87d21a6c9c7bc02 7da51447eaab34292e14077fb5a48e6b2e587781
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 17 21:25:14 2006 +0300

    Merge branch 'master' into input-hotplug

diff-tree 95dbfcf8828c041c218145afc87d21a6c9c7bc02 (from c6c39afde3e5f43b623ca6b52162b83c98a28d45)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 17 21:18:18 2006 +0300

    events.c: make XEvIE a little less verbose
    Change a lot of:
     #ifdef XEVIE
     xeviehot.x =
     #endif
     sprite.hot.x = ...
     #ifdef XEVIE
     xeviehot.y =
     #endif
     sprite.hot.y = ...
    to one single
     #ifdef XEVIE
     xeviehot.x = sprite.hot.x;
     xeviehot.y = sprite.hot.y;
     #endif
    at the end of the functions.

diff --git a/dix/events.c b/dix/events.c
index 781e467..f7eacf6 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -462,13 +462,7 @@ XineramaCheckVirtualMotion(
     if (qe)
     {
 	sprite.hot.pScreen = qe->pScreen;  /* should always be Screen 0 */
-#ifdef XEVIE
-	xeviehot.x =
-#endif
 	sprite.hot.x = qe->event->u.keyButtonPointer.rootX;
-#ifdef XEVIE
-	xeviehot.y =
-#endif
 	sprite.hot.y = qe->event->u.keyButtonPointer.rootY;
 	pWin = inputInfo.pointer->grab ? inputInfo.pointer->grab->confineTo :
 					 NullWindow;
@@ -505,24 +499,12 @@ XineramaCheckVirtualMotion(
 	lims = *REGION_EXTENTS(sprite.screen, &sprite.Reg2);
 
         if (sprite.hot.x < lims.x1)
-#ifdef XEVIE
-	    xeviehot.x =
-#endif
             sprite.hot.x = lims.x1;
         else if (sprite.hot.x >= lims.x2)
-#ifdef XEVIE
-	    xeviehot.x =
-#endif
             sprite.hot.x = lims.x2 - 1;
         if (sprite.hot.y < lims.y1)
-#ifdef XEVIE
-	    xeviehot.y =
-#endif
             sprite.hot.y = lims.y1;
         else if (sprite.hot.y >= lims.y2)
-#ifdef XEVIE
-	    xeviehot.y =
-#endif
             sprite.hot.y = lims.y2 - 1;
 
 	if (REGION_NUM_RECTS(&sprite.Reg2) > 1) 
@@ -535,6 +517,10 @@ XineramaCheckVirtualMotion(
 	    qe->event->u.keyButtonPointer.rootY = sprite.hot.y;
 	}
     }
+#ifdef XEVIE
+    xeviehot.x = sprite.hot.x;
+    xeviehot.y = sprite.hot.y;
+#endif
 }
 
 
@@ -552,33 +538,15 @@ XineramaCheckMotion(xEvent *xE)
 			  panoramiXdataPtr[0].x;
 	XE_KBPTR.rootY += panoramiXdataPtr[sprite.screen->myNum].y -
 			  panoramiXdataPtr[0].y;
-#ifdef XEVIE
-	xeviehot.x =
-#endif
 	sprite.hot.x = XE_KBPTR.rootX;
-#ifdef XEVIE
-	xeviehot.y =
-#endif
 	sprite.hot.y = XE_KBPTR.rootY;
 	if (sprite.hot.x < sprite.physLimits.x1)
-#ifdef XEVIE
-	    xeviehot.x =
-#endif
 	    sprite.hot.x = sprite.physLimits.x1;
 	else if (sprite.hot.x >= sprite.physLimits.x2)
-#ifdef XEVIE
-	    xeviehot.x =
-#endif
 	    sprite.hot.x = sprite.physLimits.x2 - 1;
 	if (sprite.hot.y < sprite.physLimits.y1)
-#ifdef XEVIE
-	    xeviehot.y =
-#endif
 	    sprite.hot.y = sprite.physLimits.y1;
 	else if (sprite.hot.y >= sprite.physLimits.y2)
-#ifdef XEVIE
-	    xeviehot.y =
-#endif
 	    sprite.hot.y = sprite.physLimits.y2 - 1;
 
 	if (sprite.hotShape) 
@@ -596,6 +564,8 @@ XineramaCheckMotion(xEvent *xE)
     }
 
 #ifdef XEVIE
+    xeviehot.x = sprite.hot.x;
+    xeviehot.y = sprite.hot.y;
     xeviewin =
 #endif
     sprite.win = XYToWindow(sprite.hot.x, sprite.hot.y);
@@ -821,13 +791,7 @@ CheckVirtualMotion(
     if (qe)
     {
 	sprite.hot.pScreen = qe->pScreen;
-#ifdef XEVIE
-	xeviehot.x =
-#endif
 	sprite.hot.x = qe->event->u.keyButtonPointer.rootX;
-#ifdef XEVIE
-	xeviehot.y =
-#endif
 	sprite.hot.y = qe->event->u.keyButtonPointer.rootY;
 	pWin = inputInfo.pointer->grab ? inputInfo.pointer->grab->confineTo :
 					 NullWindow;
@@ -839,31 +803,16 @@ CheckVirtualMotion(
 	if (sprite.hot.pScreen != pWin->drawable.pScreen)
 	{
 	    sprite.hot.pScreen = pWin->drawable.pScreen;
-#ifdef XEVIE
-	    xeviehot.x = xeviehot.y = 0;
-#endif
 	    sprite.hot.x = sprite.hot.y = 0;
 	}
 	lims = *REGION_EXTENTS(pWin->drawable.pScreen, &pWin->borderSize);
 	if (sprite.hot.x < lims.x1)
-#ifdef XEVIE
-	    xeviehot.x =
-#endif
 	    sprite.hot.x = lims.x1;
 	else if (sprite.hot.x >= lims.x2)
-#ifdef XEVIE
-	    xeviehot.x =
-#endif
 	    sprite.hot.x = lims.x2 - 1;
 	if (sprite.hot.y < lims.y1)
-#ifdef XEVIE
-	    xeviehot.y =
-#endif
 	    sprite.hot.y = lims.y1;
 	else if (sprite.hot.y >= lims.y2)
-#ifdef XEVIE
-	    xeviehot.y =
-#endif
 	    sprite.hot.y = lims.y2 - 1;
 #ifdef SHAPE
 	if (wBoundingShape(pWin))
@@ -876,6 +825,10 @@ CheckVirtualMotion(
 	    qe->event->u.keyButtonPointer.rootY = sprite.hot.y;
 	}
     }
+#ifdef XEVIE
+    xeviehot.x = sprite.hot.x;
+    xeviehot.y = sprite.hot.y;
+#endif
     ROOT = WindowTable[sprite.hot.pScreen->myNum];
 }
 
@@ -2057,34 +2010,20 @@ CheckMotion(xEvent *xE)
 	    sprite.hot.pScreen = sprite.hotPhys.pScreen;
 	    ROOT = WindowTable[sprite.hot.pScreen->myNum];
 	}
-#ifdef XEVIE
-	xeviehot.x =
-#endif
 	sprite.hot.x = XE_KBPTR.rootX;
-#ifdef XEVIE
-	xeviehot.y =
-#endif
 	sprite.hot.y = XE_KBPTR.rootY;
 	if (sprite.hot.x < sprite.physLimits.x1)
-#ifdef XEVIE
-	    xeviehot.x =
-#endif
 	    sprite.hot.x = sprite.physLimits.x1;
 	else if (sprite.hot.x >= sprite.physLimits.x2)
-#ifdef XEVIE
-	    xeviehot.x =
-#endif
 	    sprite.hot.x = sprite.physLimits.x2 - 1;
 	if (sprite.hot.y < sprite.physLimits.y1)
-#ifdef XEVIE
-	    xeviehot.y =
-#endif
 	    sprite.hot.y = sprite.physLimits.y1;
 	else if (sprite.hot.y >= sprite.physLimits.y2)
+	    sprite.hot.y = sprite.physLimits.y2 - 1;
 #ifdef XEVIE
-	    xeviehot.y =
+        xeviehot.x = sprite.hot.x;
+        xeviehot.y = sprite.hot.y;
 #endif
-	    sprite.hot.y = sprite.physLimits.y2 - 1;
 #ifdef SHAPE
 	if (sprite.hotShape)
 	    ConfineToShape(sprite.hotShape, &sprite.hot.x, &sprite.hot.y);
diff-tree c6c39afde3e5f43b623ca6b52162b83c98a28d45 (from f9624e0109cf12b6af43fb4235aaa0b54340a4bb)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 17 21:13:09 2006 +0300

    dix/events.c: add YAFIXME
    Add another FIXME to the cacaphony of XXX and FIXMEs in this file.

diff --git a/dix/events.c b/dix/events.c
index 571a576..781e467 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4868,6 +4868,7 @@ int GetKeyboardValuatorEvents(xEvent *ev
                 if (!inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr &&
                     ckeyc->xkbInfo)
                     XkbFreeInfo(ckeyc->xkbInfo);
+                /* FIXME we really need a map copy here. */
                 ckeyc->xkbInfo = pDev->key->xkbInfo;
                 XkbSendMapNotify(inputInfo.keyboard, &mn);
             }
diff-tree f9624e0109cf12b6af43fb4235aaa0b54340a4bb (from cd3f744b1f983f71476db99c050045d981c5f5b2)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 17 16:09:51 2006 +0300

    kdrive/input: verify SIGIO with --enable-debug

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 68afd28..a41fddb 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -131,8 +131,7 @@ KdUnblockSigio (void)
     sigprocmask (SIG_UNBLOCK, &set, 0);
 }
 
-#undef VERIFY_SIGIO
-#ifdef VERIFY_SIGIO
+#ifdef DEBUG
 
 void
 KdAssertSigioBlocked (char *where)
diff-tree cd3f744b1f983f71476db99c050045d981c5f5b2 (from 5d073697adb3864133fa3221b82ab8d2f4a59758)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 15 15:54:13 2006 +0300

    fix missing brace, trim unused variables

diff --git a/dix/events.c b/dix/events.c
index 6eb1257..571a576 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4711,11 +4711,10 @@ GetKeyboardEvents(xEvent *events, Device
 int GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type,
                               int key_code, int num_valuators,
                               int *valuators) {
-    int numEvents = 0, numRepeatEvents = 0, ms = 0, first_valuator = 0, i = 0;
+    int numEvents = 0, ms = 0, first_valuator = 0;
     KeySym sym = pDev->key->curKeySyms.map[key_code * pDev->key->curKeySyms.mapWidth];
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
-    xEvent *repeatEvents = NULL;
     KeyClassPtr ckeyc;
 #ifdef XKB
     xkbMapNotify mn;
@@ -4779,6 +4778,7 @@ int GetKeyboardValuatorEvents(xEvent *ev
                                                    num_valuators, valuators);
             events += numEvents;
         }
+    }
     
 
     ms = GetTimeInMillis();
@@ -4960,7 +4960,6 @@ GetPointerEvents(xEvent *events, DeviceI
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
     AxisInfoPtr axes = NULL;
-    xEvent *ev = NULL;
     Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
     DeviceIntPtr cp = inputInfo.pointer;
 
diff-tree 5d073697adb3864133fa3221b82ab8d2f4a59758 (from 47c1c948e69cfba950ad37a3133fa2db0bd0ff2c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 15 15:37:10 2006 +0300

    kdrive/input: minor warning cleanups
    And also a compiler error fix when VERIFY_SIGIO is defined.

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 278bbf7..68afd28 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -143,7 +143,7 @@ KdAssertSigioBlocked (char *where)
     sigprocmask (SIG_BLOCK, &set, &old);
     if (!sigismember (&old, SIGIO)) {
 	ErrorF ("SIGIO not blocked at %s\n", where);
-        KdBacktrace();
+        KdBacktrace(0);
     }
 }
 
@@ -387,7 +387,6 @@ static int
 KdPointerProc(DeviceIntPtr pDevice, int onoff)
 {
     DevicePtr       pDev = (DevicePtr)pDevice;
-    int             i;
     KdPointerInfo   *pi;
 #ifdef XINPUT
     Atom            xiclass;
@@ -716,9 +715,6 @@ KdKeyboardProc(DeviceIntPtr pDevice, int
     Bool        ret;
     DevicePtr   pDev = (DevicePtr)pDevice;
     KdKeyboardInfo *ki;
-#ifdef XKB
-    XkbComponentNamesRec names;
-#endif
 #ifdef XINPUT
     Atom xiclass;
 #endif
@@ -1254,7 +1250,6 @@ KdInitInput (void)
     KdPointerInfo *pi;
     KdKeyboardInfo *ki;
     struct KdConfigDevice *dev;
-    int i = 0;
 
     kdInputEnabled = TRUE;
 
diff-tree 47c1c948e69cfba950ad37a3133fa2db0bd0ff2c (from 34228d8b280ef105a0c60b8de5dacf70a5ce24b5)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 15 15:25:16 2006 +0300

    kdrive/input: only run special key behaviours on non-XKB
    Only attempt to manually deal with special key behaviours (e.g. terminating
    the server) when not using XKB, and leave locking behaviour up to GKVE.

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index fc4592a..278bbf7 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -1927,23 +1927,14 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   
 	else
 	    type = KeyPress;
 	
-        /* HRNGH */
-	switch (KEYCOL1(ki, key_code)) 
-	{
-	case XK_Num_Lock:
-	case XK_Scroll_Lock:
-	case XK_Shift_Lock:
-	case XK_Caps_Lock:
-	    if (type == KeyRelease)
-		return;
-	    if (IsKeyDown (ki, key_code))
-		type = KeyRelease;
-	    else
-		type = KeyPress;
+#ifdef XKB
+        if (noXkbExtension)
+#endif
+        {
+            KdCheckSpecialKeys(ki, type, key_code);
+            KdHandleKeyboardEvent(ki, type, key_code);
 	}
 	
-        KdCheckSpecialKeys(ki, type, key_code);
-        KdHandleKeyboardEvent(ki, type, key_code);
         nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, type, key_code);
 #ifdef DEBUG
         ErrorF("KdEnqueueKeyboardEvent: got %d events from GKE\n", nEvents);
diff-tree 34228d8b280ef105a0c60b8de5dacf70a5ce24b5 (from d003bada3352ec7d734498c4c732904876a9d1e2)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 15 15:23:53 2006 +0300

    GPE: fix absolute button events / GKVE: (non-XKB) don't repeat lock keys
    Fix absolute button events in GPE, where we would previously send valuator
    events without bumping numEvents accordingly, causing the core event to
    go missing.
    In the non-XKB path in GKVE, implement proper lock behaviour (one press to
    enable, one press to disable, discard releases).
    Fix debug_events prototype.

diff --git a/dix/events.c b/dix/events.c
index f1e2fd8..6eb1257 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -113,6 +113,7 @@ of the copyright holder.
 #endif
 
 #include <X11/X.h>
+#include <X11/keysym.h>
 #include "misc.h"
 #include "resource.h"
 #define NEED_EVENTS
@@ -210,7 +211,7 @@ Mask DontPropagateMasks[DNPMCOUNT];
 static int DontPropagateRefCnts[DNPMCOUNT];
 
 #ifdef DEBUG
-static debug_events = 0;
+static int debug_events = 0;
 #endif
 _X_EXPORT InputInfo inputInfo;
 
@@ -4711,6 +4712,7 @@ int GetKeyboardValuatorEvents(xEvent *ev
                               int key_code, int num_valuators,
                               int *valuators) {
     int numEvents = 0, numRepeatEvents = 0, ms = 0, first_valuator = 0, i = 0;
+    KeySym sym = pDev->key->curKeySyms.map[key_code * pDev->key->curKeySyms.mapWidth];
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
     xEvent *repeatEvents = NULL;
@@ -4740,11 +4742,28 @@ int GetKeyboardValuatorEvents(xEvent *ev
         numEvents += (num_valuators / 6) + 1;
     }
 
+#ifdef XKB
+    if (noXkbExtension)
+#endif
+    {
+        switch (sym) {
+            case XK_Num_Lock:
+            case XK_Caps_Lock:
+            case XK_Scroll_Lock:
+            case XK_Shift_Lock:
+                if (type == KeyRelease)
+                    return 0;
+                else if (type == KeyPress &&
+                         (pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
+                        type = KeyRelease;
+        }
+    }
+
     /* Handle core repeating, via press/release/press/release.
      * FIXME: In theory, if you're repeating with two keyboards,
      *        you could get unbalanced events here. */
     if (type == KeyPress &&
-        ((pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)) {
+        (((pDev->key->down[key_code >> 3] & (key_code & 7))) & 1)) {
         if (!pDev->kbdfeed->ctrl.autoRepeat ||
             pDev->key->modifierMap[key_code] ||
             !(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3]
@@ -4760,7 +4779,7 @@ int GetKeyboardValuatorEvents(xEvent *ev
                                                    num_valuators, valuators);
             events += numEvents;
         }
-    }
+    
 
     ms = GetTimeInMillis();
 
@@ -4942,6 +4961,7 @@ GetPointerEvents(xEvent *events, DeviceI
     deviceValuator *xv = NULL;
     AxisInfoPtr axes = NULL;
     xEvent *ev = NULL;
+    Bool sendValuators = (type == MotionNotify || flags & POINTER_ABSOLUTE);
     DeviceIntPtr cp = inputInfo.pointer;
 
     if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
@@ -4961,14 +4981,13 @@ GetPointerEvents(xEvent *events, DeviceI
     else
         numEvents = 1;
 
-    if (type == MotionNotify) {
-        if (num_valuators > 2) {
-            if (((num_valuators / 6) + 1) > MAX_VALUATOR_EVENTS)
-                num_valuators = MAX_VALUATOR_EVENTS;
-            numEvents += (num_valuators / 6) + 1;
-        }
-        else if (num_valuators < 2)
-            return 0;
+    if (num_valuators > 2 && sendValuators) {
+        if (((num_valuators / 6) + 1) > MAX_VALUATOR_EVENTS)
+            num_valuators = MAX_VALUATOR_EVENTS;
+        numEvents += (num_valuators / 6) + 1;
+    }
+    else if (type == MotionNotify && num_valuators < 2) {
+        return 0;
     }
 
     ms = GetTimeInMillis();
@@ -5067,8 +5086,7 @@ GetPointerEvents(xEvent *events, DeviceI
         kbp->detail = pDev->button->map[buttons];
     }
 
-    if (num_valuators > 2 && (type == MotionNotify ||
-                              flags & POINTER_ABSOLUTE)) {
+    if (num_valuators > 2 && sendValuators) {
         kbp->deviceid |= MORE_EVENTS;
         while (first_valuator < num_valuators) {
             xv = (deviceValuator *) ++events;
@@ -5106,6 +5124,9 @@ GetPointerEvents(xEvent *events, DeviceI
     if (pDev->coreEvents) {
         events++;
         events->u.u.type = type;
+#ifdef DEBUG
+        ErrorF("GPE: core type is %d\n", type);
+#endif
         events->u.keyButtonPointer.time = ms;
         events->u.keyButtonPointer.rootX = kbp->root_x;
         events->u.keyButtonPointer.rootY = kbp->root_y;
diff-tree d003bada3352ec7d734498c4c732904876a9d1e2 (from parents)
Merge: d6433be3cca807dd78fbb1f45d9ba0212283083d a815b9b990e068f02d9cbba2b17f2cc3a30a9310
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Aug 12 22:48:55 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree d6433be3cca807dd78fbb1f45d9ba0212283083d (from parents)
Merge: 2bf9e3dc1ec5fd7bf84a4a96899e5663a721d4a4 984babe86bf82002b4d6589b2750c7b5a5489bd5
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Aug 12 21:50:52 2006 +0300

    Merge branch 'master' into input-hotplug

diff --cc hw/xfree86/os-support/Makefile.am
index a886de8,e64703a..131c495
@@@ -3,10 -3,10 +3,10 @@@
  endif
  
  SUBDIRS = bus @XORG_OS_SUBDIR@ misc $(DRI_SUBDIRS)
- DIST_SUBDIRS = bsd bus drm misc linux lynxos solaris sysv sco usl
+ DIST_SUBDIRS = bsd bus drm misc linux lynxos solaris sysv sco usl hurd
  
  sdk_HEADERS = xf86_OSproc.h xf86_OSlib.h xf86_ansic.h xf86_libc.h \
 -              assyntax.h xf86OSKbd.h xf86OSmouse.h
 +              assyntax.h xf86OSmouse.h
  
  EXTRA_DIST = int10Defines.h xf86OSpriv.h README.OS-lib xf86drm.h
  
diff-tree 2bf9e3dc1ec5fd7bf84a4a96899e5663a721d4a4 (from 59dcc62906d8ee597cd43aa307f414cb47995cea)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Aug 12 21:50:39 2006 +0300

    make DIX more tolerant of devices without a CtrlProc (Debian #269860)
    Return BadDevice on client requests for devices without a CtrlProc, instead
    of tanking horribly.

diff --git a/dix/devices.c b/dix/devices.c
index 63b206a..9b72fa4 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1454,6 +1454,10 @@ ProcChangeKeyboardControl (ClientPtr cli
     REQUEST(xChangeKeyboardControlReq);
 
     REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
+
+    if (!keybd->kbdfeed->CtrlProc)
+        return BadDevice;
+    
     vmask = stuff->mask;
     if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
 	return BadLength;
@@ -1660,6 +1664,10 @@ ProcBell(ClientPtr client)
     int newpercent;
     REQUEST(xBellReq);
     REQUEST_SIZE_MATCH(xBellReq);
+
+    if (!keybd->kbdfeed->BellProc)
+        return BadDevice;
+    
     if (stuff->percent < -100 || stuff->percent > 100)
     {
 	client->errorValue = stuff->percent;
@@ -1677,7 +1685,7 @@ ProcBell(ClientPtr client)
 	else
 #endif
     (*keybd->kbdfeed->BellProc)(newpercent, keybd,
-				(pointer) &keybd->kbdfeed->ctrl, 0);
+                                (pointer) &keybd->kbdfeed->ctrl, 0);
     return Success;
 } 
 
@@ -1689,6 +1697,10 @@ ProcChangePointerControl(ClientPtr clien
     REQUEST(xChangePointerControlReq);
 
     REQUEST_SIZE_MATCH(xChangePointerControlReq);
+    
+    if (!mouse->ptrfeed->CtrlProc)
+        return BadDevice;
+    
     ctrl = mouse->ptrfeed->ctrl;
     if ((stuff->doAccel != xTrue) && (stuff->doAccel != xFalse))
     {
diff-tree 59dcc62906d8ee597cd43aa307f414cb47995cea (from 26c3cd1c9e3f52548389817a6d89a377e20c4269)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Aug 12 20:39:08 2006 +0300

    xfree86: remove Xqueue support completely

diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c
index 3729679..ca81969 100644
--- a/hw/xfree86/common/xf86Configure.c
+++ b/hw/xfree86/common/xf86Configure.c
@@ -76,7 +76,7 @@ Bool foundMouse = FALSE;
 #elif defined(__SCO__)
 static char *DFLT_MOUSE_PROTO = "OSMouse";
 #elif defined(__UNIXWARE__)
-static char *DFLT_MOUSE_PROTO = "Xqueue";
+static char *DFLT_MOUSE_PROTO = "OSMouse";
 static char *DFLT_MOUSE_DEV = "/dev/mouse";
 #elif defined(QNX4)
 static char *DFLT_MOUSE_PROTO = "OSMouse";
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 21389f2..45a50d8 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -142,9 +142,6 @@ Bool VTSwitchEnabled = TRUE;		/* Allows 
 
 extern fd_set EnabledDevices;
 
-#if defined(XQUEUE)
-extern void xf86XqueRequest(void);
-#endif
 #ifdef XF86PM
 extern void (*xf86OSPMClose)(void);
 #endif
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 64841ad..d7fc437 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -2576,7 +2576,7 @@ xf86SetSilkenMouse (ScreenPtr pScreen)
     /*
      * XXX quick hack to report correctly for OSs that can't do SilkenMouse
      * yet.  Should handle this differently so that alternate async methods
-     * like Xqueue work correctly with this too.
+     * work correctly with this too.
      */
     pScrn->silkenMouse = useSM && xf86SIGIOSupported();
     if (serverGeneration == 1)
diff --git a/hw/xfree86/common/xf86MiscExt.c b/hw/xfree86/common/xf86MiscExt.c
index b6f3874..375226a 100644
--- a/hw/xfree86/common/xf86MiscExt.c
+++ b/hw/xfree86/common/xf86MiscExt.c
@@ -433,15 +433,13 @@ MiscExtApply(pointer structure, MiscExtS
 	if (!xf86MouseProtocolIDToName)
 	    return MISC_RET_NOMODULE;
 	if (mse->type < MTYPE_MICROSOFT
-		|| ( mse->type > MTYPE_EXPPS2
-		    && (mse->type!=MTYPE_OSMOUSE && mse->type!=MTYPE_XQUEUE)))
+		|| (mse->type > MTYPE_EXPPS2
+		    && (mse->type != MTYPE_OSMOUSE)))
 	    return MISC_RET_BADMSEPROTO;
 #ifdef OSMOUSE_ONLY
 	if (mse->type != MTYPE_OSMOUSE)
 	    return MISC_RET_BADMSEPROTO;
 #else
-	if (mse->type == MTYPE_XQUEUE)
-	    return MISC_RET_BADMSEPROTO;
 	if (mse->type == MTYPE_OSMOUSE)
 	    return MISC_RET_BADMSEPROTO;
 #endif /* OSMOUSE_ONLY */
@@ -462,7 +460,6 @@ MiscExtApply(pointer structure, MiscExtS
 	    mse->flags &= ~MF_REOPEN;
 	}
 	if (mse->type != MTYPE_OSMOUSE
-		&& mse->type != MTYPE_XQUEUE
 		&& mse->type != MTYPE_PS_2
 		&& mse->type != MTYPE_BUSMOUSE
 		&& mse->type != MTYPE_IMPS2
@@ -483,7 +480,6 @@ MiscExtApply(pointer structure, MiscExtS
 	    return MISC_RET_BADFLAGS;
 
 	if (mse->type != MTYPE_OSMOUSE
-		&& mse->type != MTYPE_XQUEUE
 		&& mse->type != MTYPE_BUSMOUSE)
 	{
 	    if (mse->samplerate < 0)
diff --git a/hw/xfree86/os-support/bsd/Makefile.am b/hw/xfree86/os-support/bsd/Makefile.am
index edef4d4..0a0bcab 100644
--- a/hw/xfree86/os-support/bsd/Makefile.am
+++ b/hw/xfree86/os-support/bsd/Makefile.am
@@ -62,7 +62,6 @@ libbsd_la_SOURCES = \
 	$(srcdir)/../shared/vidmem.c \
 	bsd_VTsw.c \
 	bsd_init.c \
-	bsd_io.c \
 	bsd_mouse.c \
 	$(ARCH_SOURCES) \
 	$(AGP_SOURCES) \
diff --git a/hw/xfree86/os-support/bsd/bsd_io.c b/hw/xfree86/os-support/bsd/bsd_io.c
deleted file mode 100644
index b433d7b..0000000
--- a/hw/xfree86/os-support/bsd/bsd_io.c
+++ /dev/null
@@ -1,293 +0,0 @@
-/*
- * Copyright 1992 by Rich Murphey <Rich at Rice.edu>
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Rich Murphey and David Dawes 
- * not be used in advertising or publicity pertaining to distribution of 
- * the software without specific, written prior permission.  Rich Murphey and
- * David Dawes make no representations about the suitability of this 
- * software for any purpose.  It is provided "as is" without express or 
- * implied warranty.
- *
- * RICH MURPHEY AND DAVID DAWES DISCLAIM ALL WARRANTIES WITH REGARD TO 
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 
- * FITNESS, IN NO EVENT SHALL RICH MURPHEY OR DAVID DAWES BE LIABLE FOR 
- * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER 
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF 
- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium: bsd_io.c /main/11 1996/10/19 18:06:07 kaleb $ */
-
-#define NEED_EVENTS
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <termios.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-#ifdef WSCONS_SUPPORT
-#define KBD_FD(i) ((i).kbdFd != -1 ? (i).kbdFd : (i).consoleFd)
-#endif
-
-_X_EXPORT void
-xf86SoundKbdBell(int loudness, int pitch, int duration)
-{
-#ifdef WSCONS_SUPPORT
-	struct wskbd_bell_data wsb;
-#endif
-
-    	if (loudness && pitch)
-	{
-#ifdef PCCONS_SUPPORT
-		int data[2];
-#endif
-
-	    	switch (xf86Info.consType) {
-
-#ifdef PCCONS_SUPPORT
-	    	case PCCONS:
-		    	data[0] = pitch;
-		    	data[1] = (duration * loudness) / 50;
-		    	ioctl(xf86Info.consoleFd, CONSOLE_X_BELL, data);
-			break;
-#endif
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	    	case SYSCONS:
-		case PCVT:
-			ioctl(xf86Info.consoleFd, KDMKTONE,
-			      ((1193190 / pitch) & 0xffff) |
-			      (((unsigned long)duration*loudness/50)<<16));
-			break;
-#endif
-#if defined (WSCONS_SUPPORT)
-		case WSCONS:
-			wsb.which = WSKBD_BELL_DOALL;
-			wsb.pitch = pitch;
-			wsb.period = duration;
-			wsb.volume = loudness;
-			ioctl(KBD_FD(xf86Info), WSKBDIO_COMPLEXBELL, 
-				      &wsb);
-			break;
-#endif
-	    	}
-	}
-}
-
-void
-xf86SetKbdLeds(int leds)
-{
-	switch (xf86Info.consType) {
-
-	case PCCONS:
-		break;
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	case SYSCONS:
-	case PCVT:
-		ioctl(xf86Info.consoleFd, KDSETLED, leds);
-		break;
-#endif
-#if defined(WSCONS_SUPPORT)
-	case WSCONS:
-		ioctl(KBD_FD(xf86Info), WSKBDIO_SETLEDS, &leds);
-		break;
-#endif
-	}
-}
-
-int
-xf86GetKbdLeds()
-{
-	int leds = 0;
-
-	switch (xf86Info.consType) {
-
-	case PCCONS:
-		break;
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	case SYSCONS:
-	case PCVT:
-		ioctl(xf86Info.consoleFd, KDGETLED, &leds);
-		break;
-#endif
-#if defined(WSCONS_SUPPORT)
-	  case WSCONS:
-		  ioctl(KBD_FD(xf86Info), WSKBDIO_GETLEDS, &leds);
-		  break;
-#endif
-	}
-	return(leds);
-}
-
-void
-xf86SetKbdRepeat(char rad)
-{
-	switch (xf86Info.consType) {
-
-	case PCCONS:
-		break;
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	case SYSCONS:
-	case PCVT:
-		ioctl(xf86Info.consoleFd, KDSETRAD, rad);
-		break;
-#endif
-	}
-}
-
-#if defined(SYSCONS_SUPPORT) || defined(PCCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)
-static struct termios kbdtty;
-#endif
-
-void
-xf86KbdInit()
-{
-	switch (xf86Info.consType) {
-
-#if defined(PCCONS_SUPPORT) || defined(SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	case PCCONS:
-	case SYSCONS:
-	case PCVT:
-		tcgetattr(xf86Info.consoleFd, &kbdtty);
-		break;
-#endif
-#if defined WSCONS_SUPPORT
-	case WSCONS:
-		if (xf86Info.kbdFd != -1) 
-			xf86FlushInput(xf86Info.kbdFd);
-		else
-			tcgetattr(xf86Info.consoleFd, &kbdtty);
-		break;
-#endif
-	}
-}
-
-int
-xf86KbdOn()
-{
-	struct termios nTty;
-#ifdef WSCONS_SUPPORT
-	int option;
-#endif
-
-
-	switch (xf86Info.consType) {
-
-#if defined(SYSCONS_SUPPORT) || defined(PCCONS_SUPPORT) || defined(PCVT_SUPPORT)
-	case SYSCONS:
-	case PCCONS:
-	case PCVT:
-		nTty = kbdtty;
-		nTty.c_iflag = IGNPAR | IGNBRK;
-		nTty.c_oflag = 0;
-		nTty.c_cflag = CREAD | CS8;
-		nTty.c_lflag = 0;
-		nTty.c_cc[VTIME] = 0;
-		nTty.c_cc[VMIN] = 1;
-		cfsetispeed(&nTty, 9600);
-		cfsetospeed(&nTty, 9600);
-		tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
-
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-		ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW);
-#endif
-		break;
-#endif
-#ifdef WSCONS_SUPPORT
-	case WSCONS:
-		if (xf86Info.kbdFd == -1) {
-			nTty = kbdtty;
-			nTty.c_iflag = IGNPAR | IGNBRK;
-			nTty.c_oflag = 0;
-			nTty.c_cflag = CREAD | CS8;
-			nTty.c_lflag = 0;
-			nTty.c_cc[VTIME] = 0;
-			nTty.c_cc[VMIN] = 1;
-			cfsetispeed(&nTty, 9600);
-			cfsetospeed(&nTty, 9600);
-			tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
-			option = WSKBD_RAW;
-			if (ioctl(xf86Info.consoleFd, WSKBDIO_SETMODE,
-					&option) == -1)
-				FatalError("can't switch keyboard to raw mode. "
-					"Enable support for it in the kernel\n"
-					"or use for example:\n\n"
-					"Option \"Protocol\" \"wskbd\"\n"
-					"Option \"Device\" \"/dev/wskbd0\"\n"
-					"\nin your XF86Config(5) file\n");
-		} else {
-			return xf86Info.kbdFd;
-		}
-#endif
-	}
-	return(xf86Info.consoleFd);
-}
-
-int
-xf86KbdOff()
-{
-#ifdef WSCONS_SUPPORT
-	int option;
-#endif
-
-	switch (xf86Info.consType) {
-
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	case SYSCONS:
-	case PCVT:
-		ioctl(xf86Info.consoleFd, KDSKBMODE, K_XLATE);
-		/* FALL THROUGH */
-#endif
-#if defined(SYSCONS_SUPPORT) || defined(PCCONS_SUPPORT) || defined(PCVT_SUPPORT)
-	case PCCONS:
-		tcsetattr(xf86Info.consoleFd, TCSANOW, &kbdtty);
-		break;
-#endif
-#ifdef WSCONS_SUPPORT
-	case WSCONS:
-		if (xf86Info.kbdFd != -1) {
-			return xf86Info.kbdFd;
-		} else {
-			option = WSKBD_TRANSLATED;
-			ioctl(xf86Info.consoleFd, WSKBDIO_SETMODE, &option);
-			tcsetattr(xf86Info.consoleFd, TCSANOW, &kbdtty);
-		}
-		break;
-#endif
-	}	
-	return(xf86Info.consoleFd);
-}
-
-#ifdef WSCONS_SUPPORT
-
-#define NUMEVENTS 64
-
-void
-xf86WSKbdEvents(void)
-{
-    static struct wscons_event events[NUMEVENTS];
-    int n, i;
-
-    n = read(xf86Info.kbdFd, events, sizeof events);
-    if (n <= 0)
-	return;
-    n /= sizeof(struct wscons_event);
-    for (i = 0; i < n; i++)
-	xf86PostWSKbdEvent(&events[i]);
-}
-
-#endif /* WSCONS_SUPPORT */
-
-
diff --git a/hw/xfree86/os-support/linux/lnx_kbd.h b/hw/xfree86/os-support/linux/lnx_kbd.h
deleted file mode 100644
index b2ae179..0000000
--- a/hw/xfree86/os-support/linux/lnx_kbd.h
+++ /dev/null
@@ -1,4 +0,0 @@
-
-extern void KbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms,
-				CARD8 *pModMap);
-
diff --git a/hw/xfree86/os-support/sco/Makefile.am b/hw/xfree86/os-support/sco/Makefile.am
index 820d183..9cb5011 100644
--- a/hw/xfree86/os-support/sco/Makefile.am
+++ b/hw/xfree86/os-support/sco/Makefile.am
@@ -1,8 +1,6 @@
 EXTRA_DIST = \
 	VTsw_sco.c \
-	sco_KbdMap.c \
 	sco_init.c \
-	sco_io.c \
 	sco_iop.c \
 	sco_mouse.c \
 	sco_video.c
diff --git a/hw/xfree86/os-support/sco/sco_io.c b/hw/xfree86/os-support/sco/sco_io.c
deleted file mode 100644
index eafc14c..0000000
--- a/hw/xfree86/os-support/sco/sco_io.c
+++ /dev/null
@@ -1,268 +0,0 @@
-/*
- * Copyright 2001 by J. Kean Johnston <jkj at sco.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name J. Kean Johnston not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  J. Kean Johnston makes no
- * representations about the suitability of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- *
- * J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL J. KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/* $XConsortium$ */
-
-/* Re-written May 2001 to represent the current state of reality */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "compiler.h"
-
-#define _NEED_SYSI86
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86OSpriv.h"
-#include "xf86_OSlib.h"
-
-#include <sys/param.h>
-#include <sys/emap.h>
-#include <sys/nmap.h>
-
-_X_EXPORT void
-xf86SoundKbdBell(int loudness, int pitch, int duration)
-{
-  if (loudness && pitch) {
-    ioctl(xf86Info.consoleFd, KIOCSOUND, 1193180 / pitch);
-    usleep(duration * loudness * 20);
-    ioctl(xf86Info.consoleFd, KIOCSOUND, 0);
-  }
-}
-
-void
-xf86SetKbdLeds(int leds)
-{
-  /*
-   * sleep the first time through under SCO.  There appears to be a
-   * timing problem in the driver which causes the keyboard to be lost.
-   * This usleep stops it from occurring. NOTE: this was in the old code.
-   * I am not convinced it is true any longer, but it doesn't hurt to
-   * leave this in here.
-   */
-  static int once = 1;
-
-  if (once) {
-    usleep(100);
-    once = 0;
-  }
-
-  ioctl(xf86Info.consoleFd, KDSETLED, leds );
-}
-
-int
-xf86GetKbdLeds(void)
-{
-  int leds;
-
-  ioctl (xf86Info.consoleFd, KDGETLED, &leds);
-  return leds;
-}
-
-/*
- * Much of the code in this function is duplicated from the Linux code
- * by Orest Zborowski <obz at Kodak.com> and David Dawes <dawes at xfree86.org>.
- * Please see the file ../linux/lnx_io.c for full copyright information.
- *
- * NOTE: Only OpenServer Release 5.0.6 with Release Supplement 5.0.6A
- * and later have the required ioctl. 5.0.6A or higher is HIGHLY
- * recommended. The console driver is quite a different beast on that OS.
- */
-void
-xf86SetKbdRepeat(char rad)
-{
-#if defined(KBIO_SETRATE)
-  int i;
-  int value = 0x7f;     /* Maximum delay with slowest rate */
-  int delay = 250;      /* Default delay */
-  int rate = 300;       /* Default repeat rate */
-
-  static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
-                               133, 120, 109, 100, 92, 86, 80, 75, 67,
-                               60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
-                               25, 23, 21, 20 };
-#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
-
-  static int valid_delays[] = { 250, 500, 750, 1000 };
-#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
-
-  if (xf86Info.kbdRate >= 0) 
-    rate = xf86Info.kbdRate * 10;
-  if (xf86Info.kbdDelay >= 0)
-    delay = xf86Info.kbdDelay;
-
-  for (i = 0; i < RATE_COUNT; i++)
-    if (rate >= valid_rates[i]) {
-      value &= 0x60;
-      value |= i;
-      break;
-    }
-
-  for (i = 0; i < DELAY_COUNT; i++)
-    if (delay <= valid_delays[i]) {
-      value &= 0x1f;
-      value |= i << 5;
-      break;
-    }
-
-  ioctl (xf86Info.consoleFd, KBIO_SETRATE, value);
-#endif /* defined(KBIO_SETRATE) */
-}
-
-static Bool use_tcs = TRUE, use_kd = TRUE;
-static Bool no_nmap = TRUE, no_emap = TRUE;
-static int orig_getsc, orig_kbm;
-static struct termios orig_termios;
-static keymap_t keymap, noledmap;
-static uchar_t *sc_mapbuf;
-static uchar_t *sc_mapbuf2;
-
-void
-xf86KbdInit(void)
-{
-  orig_getsc = 0;
-  if (ioctl (xf86Info.consoleFd, TCGETSC, &orig_getsc) < 0)
-    use_tcs = FALSE;
-  if (ioctl (xf86Info.consoleFd, KDGKBMODE, &orig_kbm) < 0)
-    use_kd = FALSE;
-
-  if (!use_tcs && !use_kd)
-    FatalError ("xf86KbdInit: Could not determine keyboard mode\n");
-
-  /*
-   * One day this should be fixed to translate normal ASCII characters
-   * back into scancodes or into events that XFree86 wants, but not
-   * now. For the time being, we only support scancode mode screens.
-  */
-  if (use_tcs && !(orig_getsc & KB_ISSCANCODE))
-    FatalError ("xf86KbdInit: Keyboard can not send scancodes\n");
-
-  /*
-   * We need to get the original keyboard map and NUL out the lock
-   * modifiers. This prevents the scancode API from messing with
-   * the keyboard LED's. We restore the original map when we exit.
-   */
-  if (ioctl (xf86Info.consoleFd, GIO_KEYMAP, &keymap) < 0) {
-    FatalError ("xf86KbdInit: Failed to get keyboard map (%s)\n",
-        strerror(errno));
-  }
-  if (ioctl (xf86Info.consoleFd, GIO_KEYMAP, &noledmap) < 0) {
-    FatalError ("xf86KbdInit: Failed to get keyboard map (%s)\n",
-        strerror(errno));
-  } else {
-    int i, j;
-
-    for (i = 0; i < noledmap.n_keys; i++) {
-      for (j = 0; j < NUM_STATES; j++) {
-        if (IS_SPECIAL(noledmap, i, j) &&
-            ((noledmap.key[i].map[j] == K_CLK) ||
-             (noledmap.key[i].map[j] == K_NLK) ||
-             (noledmap.key[i].map[j] == K_SLK))) {
-          noledmap.key[i].map[j] = K_NOP;
-        }
-      }
-    }
-  }
-
-  if (ioctl (xf86Info.consoleFd, XCGETA, &orig_termios) < 0) {
-    FatalError ("xf86KbdInit: Failed to get terminal modes (%s)\n",
-        strerror(errno));
-  }
-
-  sc_mapbuf = xalloc (10*BSIZE);
-  sc_mapbuf2 = xalloc(10*BSIZE);
-
-  /* Get the emap */
-  if (ioctl (xf86Info.consoleFd, LDGMAP, sc_mapbuf) < 0) {
-    if (errno != ENAVAIL) {
-      FatalError ("xf86KbdInit: Failed to retrieve e-map (%s)\n",
-          strerror (errno));
-    }
-    no_emap = FALSE;
-  }
-
-  /* Get the nmap */
-  if (ioctl (xf86Info.consoleFd, NMGMAP, sc_mapbuf2) < 0) {
-    if (errno != ENAVAIL) {
-      FatalError ("xf86KbdInit: Failed to retrieve n-map (%s)\n",
-          strerror (errno));
-    }
-    no_nmap = FALSE;
-  }
-}
-
-int
-xf86KbdOn(void)
-{
-  struct termios newtio;
-
-  ioctl (xf86Info.consoleFd, LDNMAP); /* Turn e-mapping off */
-  ioctl (xf86Info.consoleFd, NMNMAP); /* Turn n-mapping off */
-
-  newtio = orig_termios;        /* structure copy */
-  newtio.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-  newtio.c_oflag = 0;
-  newtio.c_cflag = CREAD | CS8 | B9600;
-  newtio.c_lflag = 0;
-  newtio.c_cc[VTIME]=0;
-  newtio.c_cc[VMIN]=1;
-  cfsetispeed(&newtio, 9600);
-  cfsetospeed(&newtio, 9600);
-  ioctl(xf86Info.consoleFd, XCSETA, &newtio);
-
-  /* Now tell the keyboard driver to send us raw scancodes */
-  if (use_tcs) {
-    int nm = orig_getsc;
-    nm &= ~KB_XSCANCODE;
-    ioctl (xf86Info.consoleFd, TCSETSC, &nm);
-  }
-
-  if (use_kd)
-    ioctl (xf86Info.consoleFd, KDSKBMODE, K_RAW);
-
-  ioctl (xf86Info.consoleFd, PIO_KEYMAP, &noledmap);
-
-  return(xf86Info.consoleFd);
-}
-
-int
-xf86KbdOff(void)
-{
-  /* Revert back to original translate scancode mode */
-  if (use_tcs)
-    ioctl (xf86Info.consoleFd, TCSETSC, &orig_getsc);
-  if (use_kd)
-    ioctl (xf86Info.consoleFd, KDSKBMODE, orig_kbm);
-
-  ioctl (xf86Info.consoleFd, PIO_KEYMAP, &keymap);
-
-  if (no_emap)
-    ioctl (xf86Info.consoleFd, LDSMAP, sc_mapbuf);
-  if (no_nmap)
-    ioctl (xf86Info.consoleFd, NMSMAP, sc_mapbuf2);
-
-  ioctl(xf86Info.consoleFd, XCSETA, &orig_termios);
-
-  return(xf86Info.consoleFd);
-}
diff --git a/hw/xfree86/os-support/solaris/Makefile.am b/hw/xfree86/os-support/solaris/Makefile.am
index 504e1a1..9c86079 100644
--- a/hw/xfree86/os-support/solaris/Makefile.am
+++ b/hw/xfree86/os-support/solaris/Makefile.am
@@ -1,8 +1,6 @@
 if SOLARIS_USL_CONSOLE
-IO_SRC   = $(srcdir)/../sysv/sysv_io.c
 VTSW_SRC = $(srcdir)/../shared/VTsw_usl.c
 else
-IO_SRC   = sun_io.c
 VTSW_SRC = $(srcdir)/../shared/VTsw_noop.c
 endif
 
@@ -20,7 +18,7 @@ solaris-$(SOLARIS_INOUT_ARCH).il: solari
 	$(CPP) -P -DINLINE_ASM solaris-${SOLARIS_INOUT_ARCH}.S > $@
 
 noinst_LTLIBRARIES = libsolaris.la
-libsolaris_la_SOURCES = sun_bios.c sun_init.c $(IO_SRC) \
+libsolaris_la_SOURCES = sun_bios.c sun_init.c \
 	sun_mouse.c sun_vid.c $(AGP_SRC) \
 	$(srcdir)/../shared/libc_wrapper.c \
 	$(srcdir)/../shared/kmod_noop.c $(srcdir)/../shared/pm_noop.c \
diff --git a/hw/xfree86/os-support/solaris/sun_io.c b/hw/xfree86/os-support/solaris/sun_io.c
deleted file mode 100644
index 3d8292e..0000000
--- a/hw/xfree86/os-support/solaris/sun_io.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* $XdotOrg: $ */
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Thomas Roell and David Dawes
- * not be used in advertising or publicity pertaining to distribution of
- * the software without specific, written prior permission.  Thomas Roell and
- * David Dawes makes no representations about the suitability of this
- * software for any purpose.  It is provided "as is" without express or
- * implied warranty.
- *
- * THOMAS ROELL AND DAVID DAWES DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
- * IN NO EVENT SHALL THOMAS ROELL OR DAVID DAWES BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, and/or sell copies of the Software, and to permit persons
- * to whom the Software is furnished to do so, provided that the above
- * copyright notice(s) and this permission notice appear in all copies of
- * the Software and that both the above copyright notice(s) and this
- * permission notice appear in supporting documentation.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
- * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
- * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
- * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
- * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- * 
- * Except as contained in this notice, the name of a copyright holder
- * shall not be used in advertising or otherwise to promote the sale, use
- * or other dealings in this Software without prior written authorization
- * of the copyright holder.
- */
-
-/* Solaris support routines for builtin "keyboard" driver */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "sun_kbd.h"
-
-static sunKbdPrivRec sunKeyboardPriv;
-
-_X_HIDDEN void
-xf86KbdInit(void)
-{
-    const char *kbdName = "keyboard";
-    pointer *kbdOptions = NULL;
-    IDevPtr pDev;
-
-    /* There should be a better way to find the keyboard device name, but
-       this seems to work for now. */
-    for (pDev = xf86ConfigLayout.inputs; pDev && pDev->identifier; pDev++) {
-	if (!xf86NameCmp(pDev->driver, "keyboard")) {
-	    kbdName = pDev->identifier;
-	    kbdOptions = pDev->commonOptions;
-	    break;
-	}
-    }
-
-    if (xf86Info.kbdFd < 0) {
-	xf86Info.kbdFd = sunKbdOpen(kbdName, kbdOptions);
-	if (xf86Info.kbdFd < 0) {
-	    FatalError("Unable to open keyboard: /dev/kbd\n");
-	}
-    }
-
-    memset(&sunKeyboardPriv, 0, sizeof(sunKbdPrivRec));    
-    if (sunKbdInit(&sunKeyboardPriv, xf86Info.kbdFd,
-		   kbdName, kbdOptions)	!= Success) {
-    	FatalError("Unable to initialize keyboard driver\n");
-    }
-}
-
-_X_HIDDEN int
-xf86KbdOn(void)
-{
-    if (sunKbdOn(&sunKeyboardPriv) != Success) {
-	FatalError("Enabling keyboard");
-    }
-
-    return xf86Info.kbdFd;
-}
-
-_X_HIDDEN int
-xf86KbdOff(void)
-{
-    if (sunKbdOff(&sunKeyboardPriv) != Success) {
-	FatalError("Disabling keyboard");
-    }
-
-    return xf86Info.kbdFd;
-}
-
-_X_EXPORT void
-xf86SoundKbdBell(int loudness, int pitch, int duration)
-{
-    sunKbdSoundBell(&sunKeyboardPriv, loudness, pitch, duration);
-}
-
-_X_HIDDEN void
-xf86SetKbdLeds(int leds)
-{
-    sunKbdSetLeds(&sunKeyboardPriv, leds);
-}
-
-_X_HIDDEN int
-xf86GetKbdLeds(void)
-{
-    return sunKbdGetLeds(&sunKeyboardPriv);
-}
-
-_X_HIDDEN void
-xf86SetKbdRepeat(char rad)
-{
-    sunKbdSetRepeat(&sunKeyboardPriv, rad);
-}
-
-/*
- * Lets try reading more than one keyboard event at a time in the hopes that
- * this will be slightly more efficient.  Or we could just try the MicroSoft
- * method, and forget about efficiency. :-)
- */
-_X_HIDDEN void
-xf86KbdEvents(void)
-{
-    Firm_event event[64];
-    int        nBytes, i;
-
-    /* I certainly hope its not possible to read partial events */
-
-    if ((nBytes = read(xf86Info.kbdFd, (char *)event, sizeof(event))) > 0)
-    {
-	for (i = 0; i < (nBytes / sizeof(Firm_event)); i++)
-	    sunPostKbdEvent(sunKeyboardPriv.ktype, &event[i]);
-    }
-}
diff --git a/hw/xfree86/os-support/sysv/Makefile.am b/hw/xfree86/os-support/sysv/Makefile.am
index b67cf99..85aa764 100644
--- a/hw/xfree86/os-support/sysv/Makefile.am
+++ b/hw/xfree86/os-support/sysv/Makefile.am
@@ -1 +1 @@
-EXTRA_DIST = sysv_init.c sysv_io.c sysv_mouse.c sysv_video.c xqueue.c xqueue.h
+EXTRA_DIST = sysv_init.c sysv_io.c sysv_mouse.c sysv_video.c
diff --git a/hw/xfree86/os-support/sysv/sysv_mouse.c b/hw/xfree86/os-support/sysv/sysv_mouse.c
index 581ed58..e620105 100644
--- a/hw/xfree86/os-support/sysv/sysv_mouse.c
+++ b/hw/xfree86/os-support/sysv/sysv_mouse.c
@@ -11,7 +11,6 @@
 #include "xf86.h"
 #include "xf86Xinput.h"
 #include "xf86OSmouse.h"
-#include "xqueue.h"
 
 static int
 SupportedInterfaces(void)
@@ -22,7 +21,6 @@ SupportedInterfaces(void)
 
 #ifndef ISC
 static const char *internalNames[] = {
-	"Xqueue",
 	NULL
 };
 
@@ -56,7 +54,6 @@ xf86OSMouseInit(int flags)
 #ifndef ISC
     p->BuiltinNames = BuiltinNames;
     p->CheckProtocol = CheckProtocol;
-    p->PreInit = XqueueMousePreInit;
 #endif
     return p;
 }
diff --git a/hw/xfree86/os-support/sysv/xqueue.c b/hw/xfree86/os-support/sysv/xqueue.c
deleted file mode 100644
index f003211..0000000
--- a/hw/xfree86/os-support/sysv/xqueue.c
+++ /dev/null
@@ -1,536 +0,0 @@
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
- * Copyright 1993-1999 by The XFree86 Project, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the copyright holders not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  The copyright holders make no
- * representations about the suitability of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium: xqueue.c /main/8 1996/10/19 18:08:11 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "xf86Xinput.h"
-#include "xf86OSmouse.h"
-#include "xqueue.h"
-
-#ifdef XQUEUE
-
-static xqEventQueue      *XqueQaddr;
-static int xqueFd = -1;
-#ifndef XQUEUE_ASYNC
-static int xquePipe[2];
-#endif
-
-#ifdef XKB
-#include "inputstr.h"
-#include <X11/extensions/XKB.h>
-#include <X11/extensions/XKBstr.h>
-#include <X11/extensions/XKBsrv.h>
-extern Bool noXkbExtension;
-#endif
-
-#include "xf86Xinput.h"
-#include "mipointer.h"
-
-typedef struct {
-	int		xquePending;
-	int		xqueSema;
-} XqInfoRec, *XqInfoPtr;
-
-InputInfoPtr XqMouse = NULL;
-InputInfoPtr XqKeyboard = NULL;
-
-#ifndef XQUEUE_ASYNC
-/*
- * xf86XqueSignal --
- *	Trap the signal from xqueue and let it be known that events are
- *	ready for collection
- */
-
-static void
-xf86XqueSignal(int signum)
-{
-  ((XqInfoPtr)(((MouseDevPtr)(XqMouse->private))->mousePriv))->xquePending = 1;
-  /*
-   * This is a hack, but it is the only reliable way I can find of letting
-   * the main select() loop know that there is more input waiting.  Receiving
-   * a signal will interrupt select(), but there is no way I can find of
-   * dealing with events that come in between the end of processing the
-   * last set and when select() gets called.
-   *
-   * Suggestions for better ways of dealing with this without going back to
-   * asynchronous event processing are welcome.
-   */
-#ifdef DEBUG
-  ErrorF("xf86XqueSignal\n");
-#endif
-  write(xquePipe[1], "X", 1);
-  signal(SIGUSR2, xf86XqueSignal);
-}
-#endif
-  
-
-/*
- * xf86XqueKbdProc --
- *	Handle the initialization, etc. of a keyboard.
- */
-
-int
-xf86XqueKbdProc(DeviceIntPtr pKeyboard, int what)
-{
-  KeySymsRec  keySyms;
-  CARD8       modMap[MAP_LENGTH];
-
-  switch (what) {
-      
-  case DEVICE_INIT:
-    
-    xf86KbdGetMapping(&keySyms, modMap);
-    
-    /*
-     * Get also the initial led settings
-     */
-    ioctl(xf86Info.consoleFd, KDGETLED, &xf86Info.leds);
-
-    /*
-     * Perform final initialization of the system private keyboard
-     * structure and fill in various slots in the device record
-     * itself which couldn't be filled in before.
-     */
-    pKeyboard->public.on = FALSE;
-
-#ifdef XKB
-    if (noXkbExtension) {
-#endif
-    InitKeyboardDeviceStruct((DevicePtr)xf86Info.pKeyboard,
-			     &keySyms,
-			     modMap,
-			     xf86KbdBell,
-			     (KbdCtrlProcPtr)xf86KbdCtrl);
-#ifdef XKB
-    } else {
-	XkbComponentNamesRec names;
-	if (xf86Info.xkbkeymap) {
-	    names.keymap = xf86Info.xkbkeymap;
-	    names.keycodes = NULL;
-	    names.types = NULL;
-	    names.compat = NULL;
-	    names.symbols = NULL;
-	    names.geometry = NULL;
-	} else {
-	    names.keymap = NULL;
-	    names.keycodes = xf86Info.xkbkeycodes;
-	    names.types = xf86Info.xkbtypes;
-	    names.compat = xf86Info.xkbcompat;
-	    names.symbols = xf86Info.xkbsymbols;
-	    names.geometry = xf86Info.xkbgeometry;
-	}
-	if ((xf86Info.xkbkeymap || xf86Info.xkbcomponents_specified)
-	   && (xf86Info.xkbmodel == NULL || xf86Info.xkblayout == NULL)) {
-		xf86Info.xkbrules = NULL;
-	}
-	XkbSetRulesDflts(xf86Info.xkbrules, xf86Info.xkbmodel,
-			 xf86Info.xkblayout, xf86Info.xkbvariant,
-			 xf86Info.xkboptions);
-	XkbInitKeyboardDeviceStruct(pKeyboard, 
-				    &names,
-				    &keySyms, 
-				    modMap, 
-				    xf86KbdBell,
-				    (KbdCtrlProcPtr)xf86KbdCtrl);
-    }
-#endif
-
-    xf86InitKBD(TRUE);
-    break;
-    
-  case DEVICE_ON:
-    pKeyboard->public.on = TRUE;
-    xf86InitKBD(FALSE);
-    break;
-    
-  case DEVICE_CLOSE:
-  case DEVICE_OFF:
-    pKeyboard->public.on = FALSE;
-    break;
-  }
-  
-  return (Success);
-}
-
-
-/*
- * xf86XqueEvents --
- *      Get some events from our queue. Nothing to do here ...
- */
-
-void
-xf86XqueEvents()
-{
-}
-
-
-#ifdef XQUEUE_ASYNC
-static void XqDoInput(int signum);
-#endif
-
-void
-XqReadInput(InputInfoPtr pInfo)
-{
-    MouseDevPtr pMse;
-    XqInfoPtr pXq;
-    xqEvent *XqueEvents;
-    int XqueHead;
-    char buf[100];
-    signed char dx, dy;
-
-    if (xqueFd < 0)
-	return;
-
-    pMse = pInfo->private;
-    pXq = pMse->mousePriv;
-
-    XqueEvents = XqueQaddr->xq_events;
-    XqueHead = XqueQaddr->xq_head;
-
-    while (XqueHead != XqueQaddr->xq_tail) {
-	switch (XqueEvents[XqueHead].xq_type) {
-	case XQ_BUTTON:
-	    pMse->PostEvent(pInfo, ~(XqueEvents[XqueHead].xq_code) & 0x07,
-			    0, 0, 0, 0);
-#ifdef DEBUG
-	    ErrorF("xqueue: buttons: %d\n", ~(XqueEvents[XqueHead].xq_code) & 0x07);
-#endif
-	    break;
-
-	case XQ_MOTION:
-	    dx = (signed char)XqueEvents[XqueHead].xq_x;
-	    dy = (signed char)XqueEvents[XqueHead].xq_y;
-	    pMse->PostEvent(pInfo, ~(XqueEvents[XqueHead].xq_code) & 0x07,
-			    (int)dx, (int)dy, 0, 0);
-#ifdef DEBUG
-	    ErrorF("xqueue: Motion: (%d, %d) (buttons: %d)\n", dx, dy, ~(XqueEvents[XqueHead].xq_code) & 0x07);
-#endif
-	    break;
-
-	case XQ_KEY:
-	    /* XXX Need to deal with the keyboard part nicely. */
-#ifdef DEBUG
-	    ErrorF("xqueue: key: %d\n", XqueEvents[XqueHead].xq_code);
-#endif
-	    xf86PostKbdEvent(XqueEvents[XqueHead].xq_code);
-	    break;
-	default:
-	    xf86Msg(X_WARNING, "Unknown Xque Event: 0x%02x\n",
-		    XqueEvents[XqueHead].xq_type);
-	}
-      
-	if ((++XqueHead) == XqueQaddr->xq_size) XqueHead = 0;
-	xf86Info.inputPending = TRUE;
-    }
-
-    /* reenable the signal-processing */
-#ifdef XQUEUE_ASYNC
-    signal(SIGUSR2, XqDoInput);
-#endif
-
-#ifndef XQUEUE_ASYNC
-    {
-	int rval;
-
-	while ((rval = read(xquePipe[0], buf, sizeof(buf))) > 0)
-#ifdef DEBUG
-	    ErrorF("Read %d bytes from xquePipe[0]\n", rval);
-#else
-	    ;
-#endif
-    }
-#endif
-
-#ifdef DEBUG
-    ErrorF("Leaving XqReadInput()\n");
-#endif
-    pXq->xquePending = 0;
-    XqueQaddr->xq_head = XqueQaddr->xq_tail;
-    XqueQaddr->xq_sigenable = 1; /* UNLOCK */
-}
-
-#ifdef XQUEUE_ASYNC
-static void
-XqDoInput(int signum)
-{
-    if (XqMouse)
-	XqReadInput(XqMouse);
-}
-#endif
-
-static void
-XqBlock(pointer blockData, OSTimePtr pTimeout, pointer pReadmask)
-{
-    InputInfoPtr pInfo;
-    MouseDevPtr pMse;
-    XqInfoPtr pXq;
-    /*
-     * On MP SVR4 boxes, a race condition exists because the XQUEUE does
-     * not have anyway to lock it for exclusive access. This results in one
-     * processor putting something on the queue at the same time the other
-     * processor is taking it something off. The count of items in the queue
-     * can get off by 1. This just goes and checks to see if an extra event
-     * was put in the queue a during this period. The signal for this event
-     * was ignored while processing the previous event.
-     */
-
-    pInfo = blockData;
-    pMse = pInfo->private;
-    pXq = pMse-> mousePriv;
-    if (!pXq->xquePending) {
-#ifdef DEBUG
-	ErrorF("XqBlock: calling XqReadInput()\n");
-#endif
-	XqReadInput((InputInfoPtr)blockData);
-    } else {
-#ifdef DEBUG
-	ErrorF("XqBlock: not calling XqReadInput()\n");
-#endif
-	;
-    }
-    /*
-     * Make sure that any events that come in here are passed on without.
-     * waiting for the next wakeup.
-     */
-    if (xf86Info.inputPending) {
-#ifdef DEBUG
-	ErrorF("XqBlock: calling ProcessInputEvents()\n");
-#endif
-	ProcessInputEvents();
-    } else {
-#ifdef DEBUG
-	ErrorF("XqBlock: not calling ProcessInputEvents()\n");
-#endif
-	;
-    }
-}
-
-/*
- * XqEnable --
- *      Enable the handling of the Xque
- */
-
-static int
-XqEnable(InputInfoPtr pInfo)
-{
-    MouseDevPtr pMse;
-    XqInfoPtr pXq;
-    static struct kd_quemode xqueMode;
-    static Bool was_here = FALSE;
-
-    pMse = pInfo->private;
-    pXq = pMse->mousePriv;
-
-    if (xqueFd < 0) {
-	if ((xqueFd = open("/dev/mouse", O_RDONLY | O_NDELAY)) < 0) {
-	    if (xf86GetAllowMouseOpenFail()) {
-		xf86Msg(X_WARNING,
-		    "%s: Cannot open /dev/mouse (%s) - Continuing...\n",
-		    pInfo->name, strerror(errno));
-		return Success;
-	    } else {
-		xf86Msg(X_ERROR, "%s: Cannot open /dev/mouse (%s)\n",
-			pInfo->name, strerror(errno));
-		return !Success;
-	    }
-	}
-    }
-#ifndef XQUEUE_ASYNC
-    if (!was_here) {
-	pipe(xquePipe);
-	fcntl(xquePipe[0], F_SETFL, fcntl(xquePipe[0], F_GETFL, 0) | O_NDELAY);
-	fcntl(xquePipe[1], F_SETFL, fcntl(xquePipe[1], F_GETFL, 0) | O_NDELAY);
-	was_here = TRUE;
-    }
-#endif
-
-    if (pXq->xqueSema++ == 0) {
-#ifdef XQUEUE_ASYNC
-	(void) signal(SIGUSR2, XqDoInput);
-#else
-	(void) signal(SIGUSR2, xf86XqueSignal);
-#endif
-	xqueMode.qsize = 64;    /* max events */
-	xqueMode.signo = SIGUSR2;
-	ioctl(xf86Info.consoleFd, KDQUEMODE, NULL);
-
-	if (ioctl(xf86Info.consoleFd, KDQUEMODE, &xqueMode) < 0) {
-	    xf86Msg(X_ERROR, "%s: Cannot set KDQUEMODE", pInfo->name);
-	    return !Success;
-	}
-	XqueQaddr = (xqEventQueue *)xqueMode.qaddr;
-	XqueQaddr->xq_sigenable = 1; /* UNLOCK */
-    }
-
-    return Success;
-}
-
-
-
-/*
- * xf86XqueDisable --
- *      disable the handling of the Xque
- */
-
-static int
-XqDisable(InputInfoPtr pInfo)
-{
-    MouseDevPtr pMse;
-    XqInfoPtr pXq;
-
-    pMse = pInfo->private;
-    pXq = pMse->mousePriv;
-
-    if (pXq->xqueSema-- == 1)
-    {
-	XqueQaddr->xq_sigenable = 0; /* LOCK */
-      
-	if (ioctl(xf86Info.consoleFd, KDQUEMODE, NULL) < 0) {
-	    xf86Msg(X_ERROR, "%s: Cannot unset KDQUEMODE", pInfo->name);
-	    return !Success;
-	}
-    }
-
-    if (xqueFd >= 0) {
-	close(xqueFd);
-	xqueFd = -1;
-    }
-
-    return Success;
-}
-
-/*
- * XqMouseProc --
- *      Handle the initialization, etc. of a mouse
- */
-
-static int
-XqMouseProc(DeviceIntPtr pPointer, int what)
-{
-    InputInfoPtr pInfo;
-    MouseDevPtr pMse;
-    unchar        map[4];
-    int ret;
- 
-    pInfo = pPointer->public.devicePrivate;
-    pMse = pInfo->private;
-    pMse->device = pPointer;
-
-    switch (what) {
-    case DEVICE_INIT: 
-	pPointer->public.on = FALSE;
-
-	map[1] = 1;
-	map[2] = 2;
-	map[3] = 3;
-
-	InitPointerDeviceStruct((DevicePtr)pPointer, 
-				map, 
-				3, 
-				miPointerGetMotionEvents, 
-				pMse->Ctrl,
-				miPointerGetMotionBufferSize());
-	/* X valuator */
-	xf86InitValuatorAxisStruct(pPointer, 0, 0, -1, 1, 0, 1);
-	xf86InitValuatorDefaults(pPointer, 0);
-	/* Y valuator */
-	xf86InitValuatorAxisStruct(pPointer, 1, 0, -1, 1, 0, 1);
-	xf86InitValuatorDefaults(pPointer, 1);
-	xf86MotionHistoryAllocate(pInfo);
-	RegisterBlockAndWakeupHandlers(XqBlock, (WakeupHandlerProcPtr)NoopDDA,
-					pInfo);
-	break;
-      
-    case DEVICE_ON:
-	pMse->lastButtons = 0;
-	pMse->lastMappedButtons = 0;
-	pMse->emulateState = 0;
-	pPointer->public.on = TRUE;
-	ret = XqEnable(pInfo);
-#ifndef XQUEUE_ASYNC
-	if (xquePipe[0] != -1) {
-	    pInfo->fd = xquePipe[0];
-	    AddEnabledDevice(xquePipe[0]);
-	}
-#endif
-	return ret;
-      
-    case DEVICE_CLOSE:
-    case DEVICE_OFF:
-	pPointer->public.on = FALSE;
-	ret = XqDisable(pInfo);
-#ifndef XQUEUE_ASYNC
-	if (xquePipe[0] != -1) {
-	    RemoveEnabledDevice(xquePipe[0]);
-	    pInfo->fd = -1;
-	}
-#endif
-	return ret;
-    }
-    return Success;
-}
-
-Bool
-XqueueMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags)
-{
-    MouseDevPtr pMse;
-    XqInfoPtr pXq;
-
-    pMse = pInfo->private;
-    pMse->protocol = protocol;
-    xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
-    pXq = pMse->mousePriv = xnfcalloc(sizeof(XqInfoRec), 1);
-
-    /* Collect the options, and process the common options. */
-    xf86CollectInputOptions(pInfo, NULL, NULL);
-    xf86ProcessCommonOptions(pInfo, pInfo->options);
-
-    /* Process common mouse options (like Emulate3Buttons, etc). */
-    pMse->CommonOptions(pInfo);
-
-    /* Setup the local procs. */
-    pInfo->device_control = XqMouseProc;
-#ifdef XQUEUE_ASYNC
-    pInfo->read_input = NULL;
-#else
-    pInfo->read_input = XqReadInput;
-#endif
-    pInfo->fd = -1;
-
-    XqMouse = pInfo;
-
-    pInfo->flags |= XI86_CONFIGURED;
-    return TRUE;
-}
-
-#endif /* XQUEUE */
diff --git a/hw/xfree86/os-support/sysv/xqueue.h b/hw/xfree86/os-support/sysv/xqueue.h
deleted file mode 100644
index d693d2b..0000000
--- a/hw/xfree86/os-support/sysv/xqueue.h
+++ /dev/null
@@ -1,12 +0,0 @@
-/* $XFree86$ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#ifndef _XF86_XQUEUE_H_
-#define _XF86_XQUEUE_H_
-
-Bool XqueueMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags);
-
-#endif
diff --git a/hw/xfree86/os-support/usl/Makefile.am b/hw/xfree86/os-support/usl/Makefile.am
index 58f9760..db08f5d 100644
--- a/hw/xfree86/os-support/usl/Makefile.am
+++ b/hw/xfree86/os-support/usl/Makefile.am
@@ -1,9 +1,6 @@
 EXTRA_DIST = \
 	usl_init.c \
-	usl_io.c \
 	usl_iop.c \
 	usl_mouse.c \
 	usl_video.c \
-	usl_vtsw.c \
-	usl_xqueue.c \
-	usl_xqueue.h
+	usl_vtsw.c
diff --git a/hw/xfree86/os-support/usl/usl_io.c b/hw/xfree86/os-support/usl/usl_io.c
deleted file mode 100644
index 4cb23d4..0000000
--- a/hw/xfree86/os-support/usl/usl_io.c
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright 2001-2005 by Kean Johnston <jkj at sco.com>
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Thomas Roell, David Dawes 
- * and Kean Johnston not be used in advertising or publicity pertaining to
- * distribution of the software without specific, written prior permission.
- * Thomas Roell, David Dawes and Kean Johnston make no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL, DAVID DAWES AND KEAN JOHNSTON DISCLAIM ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THOMAS ROELLm DAVID WEXELBLAT
- * OR KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
- * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
- * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
- * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
- * THIS SOFTWARE.
- *
- */
-/* $XConsortium$ */
-
-#include "X.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-_X_EXPORT void
-xf86SoundKbdBell(int loudness, int pitch, int duration)
-{
-  if (loudness && pitch) {
-    ioctl(xf86Info.consoleFd, KIOCSOUND, 1193180 / pitch);
-    usleep(xf86Info.bell_duration * loudness * 20);
-    ioctl(xf86Info.consoleFd, KIOCSOUND, 0);
-  }
-}
-
-void
-xf86SetKbdLeds(int leds)
-{
-  ioctl(xf86Info.consoleFd, KDSETLED, leds);
-}
-
-int
-xf86GetKbdLeds(void)
-{
-  int leds;
-
-  ioctl(xf86Info.consoleFd, KDGETLED, &leds);
-  return(leds);
-}
-
-/*
- * Much of the code in this function is duplicated from the Linux code
- * by Orest Zborowski <obz at Kodak.com> and David Dawes <dawes at xfree86.org>.
- * Please see the file ../linux/lnx_io.c for full copyright information.
- */
-void
-xf86SetKbdRepeat(char rad)
-{
-  int i;
-  int value = 0x7f;     /* Maximum delay with slowest rate */
-  int delay = 250;      /* Default delay */
-  int rate = 300;       /* Default repeat rate */
-
-  static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
-                               133, 120, 109, 100, 92, 86, 80, 75, 67,
-                               60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
-                               25, 23, 21, 20 };
-#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
-
-  static int valid_delays[] = { 250, 500, 750, 1000 };
-#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
-
-  if (xf86Info.kbdRate >= 0) 
-    rate = xf86Info.kbdRate * 10;
-  if (xf86Info.kbdDelay >= 0)
-    delay = xf86Info.kbdDelay;
-
-  for (i = 0; i < RATE_COUNT; i++)
-    if (rate >= valid_rates[i]) {
-      value &= 0x60;
-      value |= i;
-      break;
-    }
-
-  for (i = 0; i < DELAY_COUNT; i++)
-    if (delay <= valid_delays[i]) {
-      value &= 0x1f;
-      value |= i << 5;
-      break;
-    }
-
-  ioctl (xf86Info.consoleFd, KDSETTYPEMATICS, value);
-}
-
-static int orig_kbm;
-static struct termio orig_termio;
-static keymap_t keymap, noledmap;
-
-void
-xf86KbdInit(void)
-{
-  ioctl (xf86Info.consoleFd, KDGKBMODE, &orig_kbm);
-  ioctl (xf86Info.consoleFd, TCGETA, &orig_termio);
-  /*
-   * We need to get the original keyboard map and NUL out the lock
-   * modifiers. This prevents the scancode API from messing with
-   * the keyboard LED's. We restore the original map when we exit.
-   */
-  if (ioctl (xf86Info.consoleFd, GIO_KEYMAP, &keymap) < 0) {
-    FatalError ("xf86KbdInit: Failed to get keyboard map (%s)\n",
-        strerror(errno));
-  }
-  if (ioctl (xf86Info.consoleFd, GIO_KEYMAP, &noledmap) < 0) {
-    FatalError ("xf86KbdInit: Failed to get keyboard map (%s)\n",
-        strerror(errno));
-  } else {
-    int i, j;
-
-    for (i = 0; i < noledmap.n_keys; i++) {
-      for (j = 0; j < NUM_STATES; j++) {
-        if (IS_SPECKEY(&noledmap, i, j) &&
-            ((noledmap.key[i].map[j] == K_CLK) ||
-             (noledmap.key[i].map[j] == K_NLK) ||
-             (noledmap.key[i].map[j] == K_SLK))) {
-          noledmap.key[i].map[j] = K_NOP;
-        }
-      }
-    }
-  }
-}
-
-int
-xf86KbdOn(void)
-{
-  struct termio newtio;
-
-  newtio = orig_termio;        /* structure copy */
-  newtio.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-  newtio.c_oflag = 0;
-  newtio.c_cflag = CREAD | CS8 | B9600;
-  newtio.c_lflag = 0;
-  newtio.c_cc[VTIME]=0;
-  newtio.c_cc[VMIN]=1;
-  ioctl(xf86Info.consoleFd, TCSETA, &newtio);
-
-  ioctl (xf86Info.consoleFd, KDSKBMODE, K_RAW);
-  ioctl (xf86Info.consoleFd, PIO_KEYMAP, &noledmap);
-
-  return(xf86Info.consoleFd);
-}
-
-int
-xf86KbdOff(void)
-{
-  ioctl (xf86Info.consoleFd, KDSKBMODE, orig_kbm);
-  ioctl (xf86Info.consoleFd, PIO_KEYMAP, &keymap);
-  ioctl(xf86Info.consoleFd, TCSETA, &orig_termio);
-
-  return(xf86Info.consoleFd);
-}
diff --git a/hw/xfree86/os-support/usl/usl_mouse.c b/hw/xfree86/os-support/usl/usl_mouse.c
index 15a0ac5..aa4600f 100644
--- a/hw/xfree86/os-support/usl/usl_mouse.c
+++ b/hw/xfree86/os-support/usl/usl_mouse.c
@@ -33,7 +33,6 @@
 #include "xf86Priv.h"
 #include "xf86_OSlib.h"
 #include "mipointer.h"
-#include "usl_xqueue.h"
 
 static int
 SupportedInterfaces(void)
@@ -42,7 +41,6 @@ SupportedInterfaces(void)
 }
 
 static const char *internalNames[] = {
-  "Xqueue",
   NULL
 };
 
@@ -55,7 +53,7 @@ BuiltinNames(void)
 static const char *
 DefaultProtocol (void)
 {
-  return "Xqueue";
+  return "OSMouse";
 }
 
 static Bool
@@ -121,7 +119,6 @@ OsMouseProc(DeviceIntPtr pPointer, int w
 static Bool
 OsMousePreInit(InputInfoPtr pInfo, const char *protocol, int flags)
 {
-  /* This is called when the protocol is "Xqueue" */
   MouseDevPtr pMse;
 
   pMse = pInfo->private;
@@ -155,7 +152,7 @@ OsMousePreInit(InputInfoPtr pInfo, const
 
   /* Setup the local procs. */
   pInfo->device_control = OsMouseProc;
-  pInfo->read_input     = NULL;	/* Handled by the XQUEUE signal handler */
+  pInfo->read_input     = NULL;
 
   pInfo->flags |= XI86_CONFIGURED;
   return TRUE;
diff --git a/hw/xfree86/os-support/usl/usl_xqueue.c b/hw/xfree86/os-support/usl/usl_xqueue.c
deleted file mode 100644
index 1615353..0000000
--- a/hw/xfree86/os-support/usl/usl_xqueue.c
+++ /dev/null
@@ -1,359 +0,0 @@
-/* $XdotOrg$ */
-/*
- * Copyright 2005 by Kean Johnston <jkj at sco.com>
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
- * Copyright 1993-1999 by The XFree86 Project, Inc.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of the copyright holders not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  The copyright holders make no
- * representations about the suitability of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- *
- * THE COPYRIGHT HOLDERS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium$ */
-
-#include "X.h"
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "xf86Xinput.h"
-#include "xf86OSmouse.h"
-#include "usl_xqueue.h"
-
-#ifdef XKB
-#include "inputstr.h"
-#include <X11/extensions/XKB.h>
-#include <X11/extensions/XKBstr.h>
-#include <X11/extensions/XKBsrv.h>
-extern Bool noXkbExtension;
-#endif
-
-#include "xf86Xinput.h"
-#include "mipointer.h"
-
-#if !defined(XQ_WHEEL)
-# define XQ_WHEEL	4
-#endif
-
-/*
- * Implementation notes
- *
- * This code is based on a mixture of the original XFree86 sysv/xqueue.c
- * and information gathered from the SCO X server code (no actual code
- * was used, just the principles).
- *
- * The XFree86 XQUEUE code went to some considerable lengths to implement
- * what it calls "asynchronous XQUEUE". This involved creating a pipe,
- * and writing to that pipe each time an XQUEUE signal is received. The
- * one end of that pipe was then added to the list of selectable file
- * descriptors with AddEnabledDevice(). I completely fail to see the need
- * for this, and this code does not implement that mechanism. The server
- * will be interrupted anyway by the XQUEUE driver, so whether we pull the
- * events off the queue at the time we receive the signal or whether we
- * write to a pipe and then have the main select() loop stop and call us,
- * it makes no difference I can fathom.
- *
- * The code also differs from the original XFree86 code in that it maintains
- * local variables for the number of devices initialized. The original code
- * stored that information in the private data pointer of the mouse structure,
- * but this same code is used for both the keyboard and the mouse, so that
- * was changed.
- *
- * Part of the difficulty in dealing with XQUEUE is that it is a single
- * interface to two devices. The recent changes in XFree86/Xorg try to
- * treat the mouse and keyboard as discrete devices, and the code is
- * structured in such a way that they should be able to be independently
- * opened and closed. But we can't do that with XQUEUE, so we have to
- * centralize XQUEUE access here in this module.
- */
-
-static xqEventQueue *xqQaddr = NULL;
-static int xqSigEnable = 1;
-static int xqEnableCount = 0;
-static struct kd_quemode xqMode;
-
-/*
- * These two pointers are set when the keyboard/mouse handler procs
- * are called to turn them on or off. This is so that we can call the
- * correct PostEvent for the device.
- */
-static InputInfoPtr xqMouse = NULL;
-static InputInfoPtr xqKeyboard = NULL;
-
-static void XqSignalHandler (int signo);
-
-/*
- * Private functions
- */
-static void
-XqReset (void)
-{
-  if (xqEnableCount > 0) {
-    xqQaddr->xq_head = xqQaddr->xq_tail;
-    xqQaddr->xq_sigenable = xqSigEnable;
-  }
-}
-
-#ifdef NOTNEEDED
-static void
-XqLock (void)
-{
-  xqSigEnable = 0;
-  if (xqEnableCount > 0) {
-    xqQaddr->xq_sigenable = xqSigEnable;
-  }
-}
-
-static void
-XqUnlock (void)
-{
-  xqSigEnable = 1;
-  if (xqEnableCount > 0) {
-    xqQaddr->xq_sigenable = xqSigEnable;
-  }
-}
-#endif /* NOTNEEDED */
-
-/*
- * Since this code is shared between two devices, we need to keep track
- * of how many times we've been enabled or disabled. For example, if the
- * keyboard has been turned off, but the mouse hasn't, then we do not
- * want the whole queue off. Only when both devices are turned off do we
- * actually disable Xqueue mode. When either device is turned on, we
- * enable it.
- */
-static int
-XqEnable (InputInfoPtr pInfo)
-{
-  struct sigaction xqsig;
-  static int msefd = -1;
-
-  if (msefd == -1) {
-    msefd = open ("/dev/mouse", O_RDONLY | O_NONBLOCK);
-#if 0
-    msefd = open ("/dev/mouse", O_RDONLY | O_NONBLOCK | O_NOCTTY);
-    if (msefd < 0) {
-      /*
-       * Try giving it a controlling tty 
-       */
-      msefd = open (ttyname(xf86Info.consoleFd), O_RDWR | O_NONBLOCK);
-      if (msefd >= 0)
-	close (msefd);
-      msefd = open ("/dev/mouse", O_RDONLY | O_NONBLOCK | O_NOCTTY);
-      if (msefd < 0)
-	sleep(2);
-    }
-#endif
-  }
-
-  if (msefd < 0) {
-    if (xf86GetAllowMouseOpenFail()) {
-      ErrorF("%s: cannot open /dev/mouse (%s)\n",
-	ttyname(xf86Info.consoleFd), strerror(errno));
-    } else {
-      sleep(5);
-      FatalError ("%s: cannot open /dev/mouse (%s)\n",
-	ttyname(xf86Info.consoleFd), strerror(errno));
-    }
-  }
- 
-  if (xqEnableCount++ == 0) {
-    xqMode.qaddr = 0;
-    ioctl (xf86Info.consoleFd, KDQUEMODE, NULL);
-
-    /*
-     * Note: We need to make sure the signal is armed before we enable
-     * XQUEUE mode, so that if we get events immediately after the ioctl
-     * we dont have an unhandled signal coming to the Xserver.
-     * Also note that we use sigaction, so that we do not have to re-arm
-     * the signal every time it is delivered, which just slows things
-     * down (setting a signal is a fairly expensive operation).
-     */
-
-    xqsig.sa_handler = XqSignalHandler;
-    sigfillset (&xqsig.sa_mask);
-    xqsig.sa_flags = 0;
-    sigaction (SIGUSR2, &xqsig, NULL);
-
-    /*
-     * This is a fairly large queue size. Since we are reacting to events
-     * asynchronously, its best for performance if we deal with as many
-     * events as possible, and high resolution mice generate a lot of
-     * events.
-     */
-    xqMode.qsize = 64;
-    xqMode.signo = SIGUSR2;
-    xqMode.qaddr = 0;
-    if (ioctl (xf86Info.consoleFd, KDQUEMODE, &xqMode) < 0) {
-      xf86Msg (X_ERROR, "%s: could not set XQUEUE mode (%s)", pInfo->name,
-	strerror(errno));
-      xqEnableCount--;
-
-      xqsig.sa_handler = SIG_DFL;
-      sigfillset (&xqsig.sa_mask);
-      xqsig.sa_flags = 0;
-      sigaction (SIGUSR2, &xqsig, NULL);
-
-      return !Success;
-    }
-
-    /*
-     * We're in business. The workstation is now in XQUEUE mode.
-     */
-    xqQaddr = (xqEventQueue *)xqMode.qaddr;
-    xqQaddr->xq_sigenable = 0; /* LOCK */
-    nap(500);
-    XqReset();
-  }
-  return Success;
-}
-
-static int
-XqDisable (InputInfoPtr pInfo)
-{
-  struct sigaction xqsig;
-
-  if (xqEnableCount-- == 1) {
-    xqQaddr->xq_sigenable = 0; /* LOCK */
-
-    if (ioctl (xf86Info.consoleFd, KDQUEMODE, NULL) < 0) {
-      xf86Msg (X_ERROR, "%s: could not unset XQUEUE mode (%s)", pInfo->name,
-	strerror(errno));
-      xqEnableCount++;
-      return !Success;
-    }
-
-    xqsig.sa_handler = SIG_DFL;
-    sigfillset (&xqsig.sa_mask);
-    xqsig.sa_flags = 0;
-    sigaction (SIGUSR2, &xqsig, NULL);
-  }
-
-  return Success;
-}
-
-/*
- * XQUEUE signal handler. This is what goes through the list of events
- * we've already received and dispatches them to either the keyboard or
- * mouse event poster.
- */
-static void
-XqSignalHandler (int signo)
-{
-  xqEvent	*xqEvents = xqQaddr->xq_events;
-  int		xqHead = xqQaddr->xq_head;
-  xEvent	xE;
-  MouseDevPtr	pMse = NULL;
-  KbdDevPtr	pKbd = NULL;
-  signed char	dx, dy;
-
-  if (xqMouse)
-    pMse = (MouseDevPtr)xqMouse->private;
-  if (xqKeyboard)
-    pKbd = (KbdDevPtr)xqKeyboard->private;
-
-  while (xqHead != xqQaddr->xq_tail) {
-
-    switch (xqEvents[xqHead].xq_type) {
-      case XQ_MOTION:
-	dx = (signed char)xqEvents[xqHead].xq_x;
-	dy = (signed char)xqEvents[xqHead].xq_y;
-	if (pMse)
-	  pMse->PostEvent(xqMouse, ~(xqEvents[xqHead].xq_code) & 0x07,
-			  (int)dx, (int)dy, 0, 0);
-	break;
-
-      case XQ_BUTTON:
-	if (pMse)
-	  pMse->PostEvent(xqMouse, ~(xqEvents[xqHead].xq_code) & 0x07,
-			  0, 0, 0, 0);
-	break;
-
-      case XQ_WHEEL:
-	if (pMse) {
-	  int wbut = pMse->lastButtons, dz;
-	  if (xqEvents[xqHead].xq_code == 1)
-	    dz = 1;
-	  else
-	    dz = -1;
-	  pMse->PostEvent(xqMouse, wbut, 0, 0, dz, 0);
-	}
-	break;
-
-      case XQ_KEY:
-	if (pKbd)
-	  pKbd->PostEvent(xqKeyboard, xqEvents[xqHead].xq_code & 0x7f,
-	    xqEvents[xqHead].xq_code & 0x80 ? FALSE : TRUE);
-	break;
-
-      default:
-	xf86Msg(X_WARNING, "XQUEUE: unknown event type %d\n",
-	  xqEvents[xqHead].xq_type);
-	break;
-    }
-
-    xqHead++;
-    if (xqHead == xqQaddr->xq_size)
-      xqHead = 0;
-    xf86Info.inputPending = TRUE;
-  }
-
-  XqReset();
-}
-
-/*
- * Public functions
- */
-int
-XqMseOnOff (InputInfoPtr pInfo, int on)
-{
-  if (on) {
-    if (xqMouse) {
-      if (xqMouse != pInfo)
-	xf86Msg(X_WARNING, "XqMseOnOff: mouse pointer structure changed!\n");
-      xqMouse = pInfo;
-    } else {
-      xqMouse = pInfo;
-      return XqEnable(pInfo);
-    }
-  } else {
-    xqMouse = NULL;
-    return XqDisable(pInfo);
-  }
-  return Success;
-}
-
-int
-XqKbdOnOff (InputInfoPtr pInfo, int on)
-{
-  if (on) {
-    if (xqKeyboard) {
-      if (xqKeyboard != pInfo)
-	xf86Msg(X_WARNING, "XqKbdOnOff: keyboard pointer structure changed!\n");
-      xqKeyboard = pInfo;
-    } else {
-      xqKeyboard = pInfo;
-      return XqEnable(pInfo);
-    }
-  } else {
-    xqKeyboard = NULL;
-    return XqDisable(pInfo);
-  }
-  return Success;
-}
-
diff --git a/hw/xfree86/os-support/usl/usl_xqueue.h b/hw/xfree86/os-support/usl/usl_xqueue.h
deleted file mode 100644
index bad86a9..0000000
--- a/hw/xfree86/os-support/usl/usl_xqueue.h
+++ /dev/null
@@ -1,9 +0,0 @@
-/* $XdotOrg$ */
-
-#ifndef _XF86_USL_XQUEUE_H_
-#define _XF86_USL_XQUEUE_H_
-
-extern int XqMseOnOff (InputInfoPtr pInfo, int on);
-extern int XqKbdOnOff (InputInfoPtr pInfo, int on);
-
-#endif
diff --git a/hw/xfree86/os-support/xf86_OSlib.h b/hw/xfree86/os-support/xf86_OSlib.h
index e048547..97f8723 100644
--- a/hw/xfree86/os-support/xf86_OSlib.h
+++ b/hw/xfree86/os-support/xf86_OSlib.h
@@ -235,15 +235,6 @@ typedef signed long xf86ssize_t;
 #  define i386 /* not defined in ANSI C mode */
 # endif /* ATT && !i386 */
 
-# if (defined(ATT) || defined(SVR4)) && !defined(sun)
-#  ifndef __UNIXWARE__
-#   ifndef XQUEUE
-#    define XQUEUE
-#   endif
-#  endif
-#  include <sys/xque.h>
-# endif /* ATT || SVR4 */
-
 # ifdef SYSV
 #  if !defined(ISC) || defined(ISC202) || defined(ISC22)
 #   define NEED_STRERROR
diff --git a/hw/xfree86/os-support/xf86_OSproc.h b/hw/xfree86/os-support/xf86_OSproc.h
index 89a3301..c987d75 100644
--- a/hw/xfree86/os-support/xf86_OSproc.h
+++ b/hw/xfree86/os-support/xf86_OSproc.h
@@ -135,10 +135,6 @@ extern void xf86WrapperInit(void);
 #include <X11/Xfuncproto.h>
 #include "opaque.h"
 
-#if defined(XQUEUE)
-#include "input.h"	/* for DeviceIntPtr */
-#endif
-
 _XFUNCPROTOBEGIN
 
 /* public functions */
@@ -224,21 +220,7 @@ extern Bool xf86VTSwitchTo(void);
 extern void xf86VTRequest(int sig);
 extern int xf86ProcessArgument(int, char **, int);
 extern void xf86UseMsg(void);
-extern void xf86SetKbdLeds(int);
-extern int xf86GetKbdLeds(void);
-extern void xf86SetKbdRepeat(char);
-extern void xf86KbdInit(void);
-extern int xf86KbdOn(void);
-extern int xf86KbdOff(void);
-extern void xf86KbdEvents(void);
-#ifdef XQUEUE
-extern int  xf86XqueKbdProc(DeviceIntPtr, int);
-extern void xf86XqueEvents(void);
-#endif
 extern void xf86ReloadInputDevs(int sig);
-#ifdef WSCONS_SUPPORT
-extern void xf86WSKbdEvents(void);
-#endif
 extern PMClose xf86OSPMOpen(void);
 
 #ifdef NEED_OS_RAC_PROTOS
diff --git a/hw/xfree86/utils/xorgcfg/mouse-cfg.c b/hw/xfree86/utils/xorgcfg/mouse-cfg.c
index 6c29c1f..5bae6d3 100644
--- a/hw/xfree86/utils/xorgcfg/mouse-cfg.c
+++ b/hw/xfree86/utils/xorgcfg/mouse-cfg.c
@@ -60,9 +60,6 @@ static struct MouseProtocol {
 #ifdef __SCO__
     {"OsMouse",			MTYPE_AUTOMOUSE},
 #endif
-#if defined(__UNIXWARE__)
-    {"Xqueue",			MTYPE_XQUEUE},
-#endif
 #ifdef WSCONS_SUPPORT
     {"wsmouse",			MTYPE_AUTOMOUSE},
 #endif
diff --git a/hw/xfree86/utils/xorgcfg/text-mode.c b/hw/xfree86/utils/xorgcfg/text-mode.c
index 5bb5648..74647fd 100644
--- a/hw/xfree86/utils/xorgcfg/text-mode.c
+++ b/hw/xfree86/utils/xorgcfg/text-mode.c
@@ -361,9 +361,6 @@ static char *protocols[] = {
 #ifdef __SCO__
     "OsMouse",
 #endif
-#ifdef __UNIXWARE__
-    "Xqueue",
-#endif
 #ifdef WSCONS_SUPPORT
     "wsmouse",
 #endif
diff --git a/hw/xfree86/utils/xorgconfig/xorgconfig.c b/hw/xfree86/utils/xorgconfig/xorgconfig.c
index e00830a..f717483 100644
--- a/hw/xfree86/utils/xorgconfig/xorgconfig.c
+++ b/hw/xfree86/utils/xorgconfig/xorgconfig.c
@@ -2068,12 +2068,6 @@ static char *XF86Config_fontpathchunk_te
 "    Identifier	\"Keyboard1\"\n"
 "    Driver	\"kbd\"\n"
 "\n"
-"# For most OSs the protocol can be omitted (it defaults to \"Standard\").\n"
-"# When using XQUEUE (only for SVR3 and SVR4, but not Solaris),\n"
-"# uncomment the following line.\n"
-"\n"
-"#    Option     \"Protocol\"      \"Xqueue\"\n"
-"\n"
 "    Option \"AutoRepeat\" \"500 30\"\n"
 "\n"
 "# Specify which keyboard LEDs can be user-controlled (eg, with xset(1))\n"
@@ -2125,7 +2119,7 @@ static char *pointersection_text1 = 
 "\n"
 "# Identifier and driver\n"
 "\n"
-#if defined(__UNIXWARE__) || defined(XQUEUE)
+#if defined(__UNIXWARE__)
 "#    Identifier	\"Mouse1\"\n"
 "#    Driver	\"mouse\"\n"
 #else
@@ -2136,15 +2130,6 @@ static char *pointersection_text1 = 
 
 static char *pointersection_text2 =
 "\n"
-"# When using XQUEUE, comment out the above two lines, and uncomment\n"
-"# the following line.\n"
-"\n"
-#if defined(__UNIXWARE__) || defined(XQUEUE)
-"    Option \"Protocol\"	\"Xqueue\"\n"
-#else
-"#    Option \"Protocol\"	\"Xqueue\"\n"
-#endif
-"\n"
 "# Mouse-speed setting for PS/2 mouse.\n"
 "\n"
 "#    Option \"Resolution\"	\"256\"\n"
diff --git a/hw/xfree86/xorgconf.cpp b/hw/xfree86/xorgconf.cpp
index c94c1e5..9de7e2b 100644
--- a/hw/xfree86/xorgconf.cpp
+++ b/hw/xfree86/xorgconf.cpp
@@ -181,12 +181,6 @@ Section "InputDevice"
     Identifier	"Keyboard1"
     Driver	"keyboard"
 
-XCOMM For most OSs the protocol can be omitted (it defaults to "Standard").
-XCOMM When using XQUEUE (only for SVR3 and SVR4, but not Solaris), comment
-XCOMM out the above line, and uncomment the following line.
-
-XCOMM    Option	"Protocol"	"Xqueue"
-
 XCOMM Set the keyboard auto repeat parameters.  Not all platforms implement
 XCOMM this.
 
@@ -270,12 +264,6 @@ XCOMM be available.
 
 XCOMM    Option "Protocol"	"PS/2"
 
-XCOMM When using XQUEUE (only for SVR3 and SVR4, but not Solaris), use
-XCOMM the following instead of any of the lines above.  The Device line
-XCOMM is not required in this case.
-
-XCOMM    Option	"Protocol"	"Xqueue"
-
 XCOMM Baudrate and SampleRate are only for some older Logitech mice.  In
 XCOMM almost every case these lines should be omitted.
 
diff-tree 26c3cd1c9e3f52548389817a6d89a377e20c4269 (from parents)
Merge: 008aa7eb6ed090384e6c44f861410e317c78a1cd c4951e0a6b6cf3eeee710cc5cda1d9bc929ee3d7
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Aug 12 18:58:18 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree 008aa7eb6ed090384e6c44f861410e317c78a1cd (from 9525c2709ea3245c6518d4c3b5a0a4afff37181d)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Aug 12 18:56:05 2006 +0300

    completely remove OS keyboard layer
    Completely axe the keyboard layer from os-support.

diff --git a/hw/xfree86/common/xf86MiscExt.c b/hw/xfree86/common/xf86MiscExt.c
index 20ad182..b6f3874 100644
--- a/hw/xfree86/common/xf86MiscExt.c
+++ b/hw/xfree86/common/xf86MiscExt.c
@@ -61,7 +61,6 @@
 #endif
 
 #include "xf86OSmouse.h"
-#include "xf86OSKbd.h"
 
 #ifdef DEBUG
 # define DEBUG_P(x) ErrorF(x"\n");
@@ -259,59 +258,21 @@ MiscExtGetKbdSettings(pointer *kbd)
 {
     kbdParamsPtr kbdptr;
     InputInfoPtr pInfo;
-    KbdDevPtr pKbd;
 
     DEBUG_P("MiscExtGetKbdSettings");
 
-    kbdptr = MiscExtCreateStruct(MISC_KEYBOARD);
-    if (!kbdptr)
-	return FALSE;
-
-    pInfo = inputInfo.keyboard->public.devicePrivate;
-    pKbd = (KbdDevPtr) pInfo->private;
-
-    kbdptr->type  = pKbd->kbdType;
-    kbdptr->rate  = pKbd->rate;
-    kbdptr->delay = pKbd->delay;
-    *kbd = kbdptr;
-
-    return TRUE;
+    return FALSE;
 }
 
 _X_EXPORT int
 MiscExtGetKbdValue(pointer keyboard, MiscExtKbdValType valtype)
 {
-    kbdParamsPtr kbd = keyboard;
-
-    DEBUG_P("MiscExtGetKbdValue");
-    switch (valtype) {
-	case MISC_KBD_TYPE:		return kbd->type;
-	case MISC_KBD_RATE:		return kbd->rate;
-	case MISC_KBD_DELAY:		return kbd->delay;
-	case MISC_KBD_SERVNUMLOCK:	return 0;
-    }
     return 0;
 }
 
 _X_EXPORT Bool
 MiscExtSetKbdValue(pointer keyboard, MiscExtKbdValType valtype, int value)
 {
-    kbdParamsPtr kbd = keyboard;
-
-    DEBUG_P("MiscExtSetKbdValue");
-    switch (valtype) {
-	case MISC_KBD_TYPE:
-		kbd->type = value;
-		return TRUE;
-	case MISC_KBD_RATE:
-		kbd->rate = value;
-		return TRUE;
-	case MISC_KBD_DELAY:
-		kbd->delay = value;
-		return TRUE;
-	case MISC_KBD_SERVNUMLOCK:
-		return TRUE;
-    }
     return FALSE;
 }
 
@@ -595,39 +556,7 @@ MiscExtApply(pointer structure, MiscExtS
 	   xf86ReplaceBoolOption(pInfo->options, "ClearRTS",
 				 pMse->mouseFlags | MF_CLEAR_RTS);
     }
-    if (mse_or_kbd == MISC_KEYBOARD) {
-	kbdParamsPtr kbd = structure;
-        InputInfoPtr pInfo;
-        KbdDevPtr pKbd;
-
-        pInfo = inputInfo.keyboard->public.devicePrivate;
-        pKbd = (KbdDevPtr) pInfo->private;
-
-	if (kbd->rate < 0)
-	    return MISC_RET_BADVAL;
-	if (kbd->delay < 0)
-	    return MISC_RET_BADVAL;
-	if (kbd->type < KTYPE_UNKNOWN || kbd->type > KTYPE_XQUEUE)
-	    return MISC_RET_BADKBDTYPE;
-
-	if (pKbd->rate!=kbd->rate || pKbd->delay!=kbd->delay) {
-	    char rad;
-
-	    pKbd->rate = kbd->rate;
-	    pKbd->delay = kbd->delay;
-	    if      (pKbd->delay <= 375) rad = 0x00;
-	    else if (pKbd->delay <= 625) rad = 0x20;
-	    else if (pKbd->delay <= 875) rad = 0x40;
-	    else                         rad = 0x60;
-
-	    if      (pKbd->rate <=  2)   rad |= 0x1F;
-	    else if (pKbd->rate >= 30)   rad |= 0x00;
-	    else                         rad |= ((58/pKbd->rate)-2);
-
-	    pKbd->SetKbdRepeat(pInfo, rad);
-	}
-    }
-    return MISC_RET_SUCCESS;
+    return MISC_RET_BADVAL;
 }
 
 _X_EXPORT Bool
diff --git a/hw/xfree86/common/xf86Versions.c b/hw/xfree86/common/xf86Versions.c
index e984e80..97a3559 100644
--- a/hw/xfree86/common/xf86Versions.c
+++ b/hw/xfree86/common/xf86Versions.c
@@ -31,7 +31,6 @@
 
 #include "xf86.h"
 #include "xf86OSmouse.h"
-#include "xf86OSKbd.h"
 
 static CARD32 registeredVersions[NUM_BUILTIN_IFS];
 
@@ -51,8 +50,6 @@ xf86GetBuiltinInterfaceVersion(BuiltinIn
     switch (iface) {
     case BUILTIN_IF_OSMOUSE:
 	return OS_MOUSE_VERSION_CURRENT;
-    case BUILTIN_IF_OSKBD:
-	return OS_KBD_VERSION_CURRENT;
     default:
 	xf86Msg(X_ERROR, "xf86GetBuiltinInterfaceVersion: internal error: "
 		"interface %d not handled\n", iface);
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
index 041b203..586d5dc 100644
--- a/hw/xfree86/loader/xf86sym.c
+++ b/hw/xfree86/loader/xf86sym.c
@@ -70,7 +70,6 @@
 # include "xf86Xinput.h"
 #endif
 #include "xf86OSmouse.h"
-#include "xf86OSKbd.h"
 #include "xf86xv.h"
 #include "xf86xvmc.h"
 #include "xf86cmap.h"
@@ -280,7 +279,6 @@ _X_HIDDEN void *xfree86LookupTab[] = {
     SYMFUNC(xf86SerialModemClearBits)
     SYMFUNC(xf86LoadKernelModule)
     SYMFUNC(xf86OSMouseInit)
-    SYMFUNC(xf86OSKbdPreInit)
     SYMFUNC(xf86AgpGARTSupported)
     SYMFUNC(xf86GetAGPInfo)
     SYMFUNC(xf86AcquireGART)
diff --git a/hw/xfree86/os-support/Makefile.am b/hw/xfree86/os-support/Makefile.am
index 7897674..a886de8 100644
--- a/hw/xfree86/os-support/Makefile.am
+++ b/hw/xfree86/os-support/Makefile.am
@@ -6,7 +6,7 @@ SUBDIRS = bus @XORG_OS_SUBDIR@ misc $(DR
 DIST_SUBDIRS = bsd bus drm misc linux lynxos solaris sysv sco usl
 
 sdk_HEADERS = xf86_OSproc.h xf86_OSlib.h xf86_ansic.h xf86_libc.h \
-              assyntax.h xf86OSKbd.h xf86OSmouse.h
+              assyntax.h xf86OSmouse.h
 
 EXTRA_DIST = int10Defines.h xf86OSpriv.h README.OS-lib xf86drm.h
 
diff --git a/hw/xfree86/os-support/bsd/Makefile.am b/hw/xfree86/os-support/bsd/Makefile.am
index 20885e8..edef4d4 100644
--- a/hw/xfree86/os-support/bsd/Makefile.am
+++ b/hw/xfree86/os-support/bsd/Makefile.am
@@ -55,18 +55,14 @@ AM_CFLAGS = -DUSESTDRES $(XORG_CFLAGS)
 INCLUDES = $(XORG_INCS)
 
 libbsd_la_SOURCES = \
-	$(srcdir)/../shared/at_scancode.c \
 	$(srcdir)/../shared/libc_wrapper.c \
 	$(srcdir)/../shared/posix_tty.c \
 	$(srcdir)/../shared/sigio.c \
-	$(srcdir)/../shared/std_kbdEv.c \
 	$(srcdir)/../shared/stdPci.c \
 	$(srcdir)/../shared/vidmem.c \
 	bsd_VTsw.c \
 	bsd_init.c \
 	bsd_io.c \
-	bsd_kbd.c \
-	bsd_KbdMap.c \
 	bsd_mouse.c \
 	$(ARCH_SOURCES) \
 	$(AGP_SOURCES) \
@@ -80,7 +76,6 @@ libbsd_la_SOURCES = \
 EXTRA_DIST = \
 	bsd_apm.c \
 	bsd_jstk.c \
-	bsd_kbd.h \
 	bsd_kqueue_apm.c \
 	bsdResource.c \
 	memrange.h \
diff --git a/hw/xfree86/os-support/bsd/bsd_KbdMap.c b/hw/xfree86/os-support/bsd/bsd_KbdMap.c
deleted file mode 100644
index d225c1f..0000000
--- a/hw/xfree86/os-support/bsd/bsd_KbdMap.c
+++ /dev/null
@@ -1,1087 +0,0 @@
-/* $XFree86$ */
-
-/*
- * Slightly modified xf86KbdBSD.c which is
- *
- * Derived from xf86Kbd.c by S_ren Schmidt (sos at login.dkuug.dk)
- * which is Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- * and from xf86KbdCODrv.c by Holger Veit
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h" 
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-#include "xf86Keymap.h"
-#include "bsd_kbd.h"
-
-#if (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT)) && defined(GIO_KEYMAP)
-#define KD_GET_ENTRY(i,n) \
-  eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + keymap.key[i].map[n]]
-
-static unsigned char remap[NUM_KEYCODES] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-/* This table assumes the ibm code page 437 coding for characters 
- * > 0x80. They are returned in this form by PCVT */
-static KeySym eascii_to_x[512] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
-	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
-	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
-	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
-	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
-	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
-	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
-	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
-	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
-	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
-	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
-	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
-	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
-	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
-	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
-	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
-	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
-	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
-	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
-
-	/* 
-	 * special marked entries (256 + x)
-	 */
-
-	/* This has been checked against what syscons actually does */
-	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
-	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
-	XK_ISO_Left_Tab,XK_Control_L,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
-	XK_F2,		XK_F3,		XK_F4,		XK_F5,
-	XK_F6,		XK_F7,		XK_F8,		XK_F9,
-	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Control_R,	XK_Alt_R,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol
-};
-
-#ifdef __OpenBSD__
-/* don't mark AltR and  CtrlR for remapping, since they 
- * cannot be remapped by pccons */
-static unsigned char pccons_remap[128] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-/* This table assumes an iso8859_1 encoding for the characters 
- * > 80, as returned by pccons */
-static KeySym latin1_to_x[256] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_nobreakspace,XK_exclamdown,	XK_cent,	XK_sterling,
-	XK_currency,	XK_yen,		XK_brokenbar,	XK_section,
-	XK_diaeresis,	XK_copyright,	XK_ordfeminine,	XK_guillemotleft,
-	XK_notsign,	XK_hyphen,	XK_registered,	XK_macron,
-	XK_degree,	XK_plusminus,	XK_twosuperior,	XK_threesuperior,
-	XK_acute,	XK_mu,		XK_paragraph,	XK_periodcentered,
-	XK_cedilla,	XK_onesuperior,	XK_masculine,	XK_guillemotright,
-	XK_onequarter,	XK_onehalf,	XK_threequarters,XK_questiondown,
-	XK_Agrave,	XK_Aacute,	XK_Acircumflex,	XK_Atilde,
-	XK_Adiaeresis,	XK_Aring,	XK_AE,		XK_Ccedilla,
-	XK_Egrave,	XK_Eacute,	XK_Ecircumflex,	XK_Ediaeresis,
-	XK_Igrave,	XK_Iacute,	XK_Icircumflex,	XK_Idiaeresis,
-	XK_ETH,		XK_Ntilde,	XK_Ograve,	XK_Oacute,
-	XK_Ocircumflex,	XK_Otilde,	XK_Odiaeresis,	XK_multiply,
-	XK_Ooblique,	XK_Ugrave,	XK_Uacute,	XK_Ucircumflex,
-	XK_Udiaeresis,	XK_Yacute,	XK_THORN,	XK_ssharp,
-	XK_agrave,	XK_aacute,	XK_acircumflex,	XK_atilde,
-	XK_adiaeresis,	XK_aring,	XK_ae,	        XK_ccedilla,
-	XK_egrave,	XK_eacute,	XK_ecircumflex,	XK_ediaeresis,
-	XK_igrave,	XK_iacute,	XK_icircumflex, XK_idiaeresis,
-	XK_eth,		XK_ntilde,	XK_ograve, 	XK_oacute,
-	XK_ocircumflex,	XK_otilde,	XK_odiaeresis,	XK_division,
-	XK_oslash,	XK_ugrave,	XK_uacute,	XK_ucircumflex,
-	XK_udiaeresis,	XK_yacute,	XK_thorn, 	XK_ydiaeresis
-      };
-#endif
-
-#ifdef SYSCONS_SUPPORT
-static
-unsigned char sysconsCODEMap[] = {
-	KEY_KP_Enter,	KEY_RCtrl,	KEY_KP_Divide,	KEY_Print,
-	KEY_AltLang,	KEY_KP_7,	KEY_KP_8,	KEY_KP_9,
-	KEY_KP_4,	KEY_KP_6,	KEY_KP_1,	KEY_KP_2,
-	KEY_KP_3,	KEY_KP_0,	KEY_KP_Decimal,	KEY_Pause,
-	KEY_LMeta,	KEY_RMeta,	KEY_Menu,	KEY_Break
-};
-static
-TransMapRec sysconsCODE = {
-    0x59,
-    0x6d,
-    sysconsCODEMap
-};
-#endif
-#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
-
-#ifdef WSCONS_SUPPORT
-
-static CARD8 wsUsbMap[] = {
-	/* 0 */ KEY_NOTUSED,
-	/* 1 */ KEY_NOTUSED,
-	/* 2 */ KEY_NOTUSED,
-	/* 3 */ KEY_NOTUSED,
-	/* 4 */ KEY_A,		
-	/* 5 */ KEY_B,
-	/* 6 */ KEY_C,
-	/* 7 */ KEY_D,
-	/* 8 */ KEY_E,
-	/* 9 */ KEY_F,
-	/* 10 */ KEY_G,
-	/* 11 */ KEY_H,
-	/* 12 */ KEY_I,
-	/* 13 */ KEY_J,
-	/* 14 */ KEY_K,
-	/* 15 */ KEY_L,
-	/* 16 */ KEY_M,
-	/* 17 */ KEY_N,
-	/* 18 */ KEY_O,
-	/* 19 */ KEY_P,
-	/* 20 */ KEY_Q,
-	/* 21 */ KEY_R,
-	/* 22 */ KEY_S,
-	/* 23 */ KEY_T,
-	/* 24 */ KEY_U,
-	/* 25 */ KEY_V,
-	/* 26 */ KEY_W,
-	/* 27 */ KEY_X,
-	/* 28 */ KEY_Y,
-	/* 29 */ KEY_Z,
-	/* 30 */ KEY_1,		/* 1 !*/
-	/* 31 */ KEY_2,		/* 2 @ */
-	/* 32 */ KEY_3,		/* 3 # */
-	/* 33 */ KEY_4,		/* 4 $ */
-	/* 34 */ KEY_5,		/* 5 % */
-	/* 35 */ KEY_6,		/* 6 ^ */
-	/* 36 */ KEY_7,		/* 7 & */
-	/* 37 */ KEY_8,		/* 8 * */
-	/* 38 */ KEY_9,		/* 9 ( */
-	/* 39 */ KEY_0,		/* 0 ) */
-	/* 40 */ KEY_Enter,	/* Return  */
-	/* 41 */ KEY_Escape,	/* Escape */
-	/* 42 */ KEY_BackSpace,	/* Backspace Delete */
-	/* 43 */ KEY_Tab,	/* Tab */
-	/* 44 */ KEY_Space,	/* Space */
-	/* 45 */ KEY_Minus,	/* - _ */
-	/* 46 */ KEY_Equal,	/* = + */
-	/* 47 */ KEY_LBrace,	/* [ { */
-	/* 48 */ KEY_RBrace,	/* ] } */
-	/* 49 */ KEY_BSlash,	/* \ | */
-	/* 50 */ KEY_BSlash2,	/* \ _ # ~ on some keyboards */
-	/* 51 */ KEY_SemiColon,	/* ; : */
-	/* 52 */ KEY_Quote,	/* ' " */
-	/* 53 */ KEY_Tilde,	/* ` ~ */
-	/* 54 */ KEY_Comma,	/* , <  */
-	/* 55 */ KEY_Period,	/* . > */
-	/* 56 */ KEY_Slash,	/* / ? */
-	/* 57 */ KEY_CapsLock,	/* Caps Lock */
-	/* 58 */ KEY_F1,		/* F1 */
-	/* 59 */ KEY_F2,		/* F2 */
-	/* 60 */ KEY_F3,		/* F3 */
-	/* 61 */ KEY_F4,		/* F4 */
-	/* 62 */ KEY_F5,		/* F5 */
-	/* 63 */ KEY_F6,		/* F6 */
-	/* 64 */ KEY_F7,		/* F7 */
-	/* 65 */ KEY_F8,		/* F8 */
-	/* 66 */ KEY_F9,		/* F9 */
-	/* 67 */ KEY_F10,	/* F10 */
-	/* 68 */ KEY_F11,	/* F11 */
-	/* 69 */ KEY_F12,	/* F12 */
-	/* 70 */ KEY_Print,	/* PrintScrn SysReq */
-	/* 71 */ KEY_ScrollLock,	/* Scroll Lock */
-	/* 72 */ KEY_Pause,	/* Pause Break */
-	/* 73 */ KEY_Insert,	/* Insert XXX  Help on some Mac Keyboards */
-	/* 74 */ KEY_Home,	/* Home */
-	/* 75 */ KEY_PgUp,	/* Page Up */
-	/* 76 */ KEY_Delete,	/* Delete */
-	/* 77 */ KEY_End,	/* End */
-	/* 78 */ KEY_PgDown,	/* Page Down */
-	/* 79 */ KEY_Right,	/* Right Arrow */
-	/* 80 */ KEY_Left,	/* Left Arrow */
-	/* 81 */ KEY_Down,	/* Down Arrow */
-	/* 82 */ KEY_Up,		/* Up Arrow */
-	/* 83 */ KEY_NumLock,	/* Num Lock */
-	/* 84 */ KEY_KP_Divide,	/* Keypad / */
-	/* 85 */ KEY_KP_Multiply, /* Keypad * */
-	/* 86 */ KEY_KP_Minus,	/* Keypad - */
-	/* 87 */ KEY_KP_Plus,	/* Keypad + */
-	/* 88 */ KEY_KP_Enter,	/* Keypad Enter */
-	/* 89 */ KEY_KP_1,	/* Keypad 1 End */
-	/* 90 */ KEY_KP_2,	/* Keypad 2 Down */
-	/* 91 */ KEY_KP_3,	/* Keypad 3 Pg Down */
-	/* 92 */ KEY_KP_4,	/* Keypad 4 Left  */
-	/* 93 */ KEY_KP_5,	/* Keypad 5 */
-	/* 94 */ KEY_KP_6,	/* Keypad 6 */
-	/* 95 */ KEY_KP_7,	/* Keypad 7 Home */
-	/* 96 */ KEY_KP_8,	/* Keypad 8 Up */
-	/* 97 */ KEY_KP_9,	/* KEypad 9 Pg Up */
-	/* 98 */ KEY_KP_0,	/* Keypad 0 Ins */
-	/* 99 */ KEY_KP_Decimal,	/* Keypad . Del */
-	/* 100 */ KEY_Less,	/* < > on some keyboards */
-	/* 101 */ KEY_Menu,	/* Menu */
-	/* 102 */ KEY_NOTUSED,
-	/* 103 */ KEY_KP_Equal, /* Keypad = on Mac keyboards */
-	/* 104 */ KEY_NOTUSED,
-	/* 105 */ KEY_NOTUSED,
-	/* 106 */ KEY_NOTUSED,
-	/* 107 */ KEY_NOTUSED,
-	/* 108 */ KEY_NOTUSED,
-	/* 109 */ KEY_NOTUSED,
-	/* 110 */ KEY_NOTUSED,
-	/* 111 */ KEY_NOTUSED,
-	/* 112 */ KEY_NOTUSED,
-	/* 113 */ KEY_NOTUSED,
-	/* 114 */ KEY_NOTUSED,
-	/* 115 */ KEY_NOTUSED,
-	/* 116 */ KEY_NOTUSED,
-	/* 117 */ KEY_NOTUSED,
-	/* 118 */ KEY_NOTUSED,
-	/* 119 */ KEY_NOTUSED,
-	/* 120 */ KEY_NOTUSED,
-	/* 121 */ KEY_NOTUSED,
-	/* 122 */ KEY_NOTUSED,
-	/* 123 */ KEY_NOTUSED,
-	/* 124 */ KEY_NOTUSED,
-	/* 125 */ KEY_NOTUSED,
-	/* 126 */ KEY_NOTUSED,
-	/* 127 */ KEY_NOTUSED,
-	/* 128 */ KEY_NOTUSED,
-	/* 129 */ KEY_NOTUSED,
-	/* 130 */ KEY_NOTUSED,
-	/* 131 */ KEY_NOTUSED,
-	/* 132 */ KEY_NOTUSED,
-	/* 133 */ KEY_NOTUSED,
-	/* 134 */ KEY_NOTUSED,
-	/* 135 */ KEY_NOTUSED,
-	/* 136 */ KEY_NOTUSED,
-	/* 137 */ KEY_NOTUSED,
-	/* 138 */ KEY_NOTUSED,
-	/* 139 */ KEY_NOTUSED,
-	/* 140 */ KEY_NOTUSED,
-	/* 141 */ KEY_NOTUSED,
-	/* 142 */ KEY_NOTUSED,
-	/* 143 */ KEY_NOTUSED,
-	/* 144 */ KEY_NOTUSED,
-	/* 145 */ KEY_NOTUSED,
-	/* 146 */ KEY_NOTUSED,
-	/* 147 */ KEY_NOTUSED,
-	/* 148 */ KEY_NOTUSED,
-	/* 149 */ KEY_NOTUSED,
-	/* 150 */ KEY_NOTUSED,
-	/* 151 */ KEY_NOTUSED,
-	/* 152 */ KEY_NOTUSED,
-	/* 153 */ KEY_NOTUSED,
-	/* 154 */ KEY_NOTUSED,
-	/* 155 */ KEY_NOTUSED,
-	/* 156 */ KEY_NOTUSED,
-	/* 157 */ KEY_NOTUSED,
-	/* 158 */ KEY_NOTUSED,
-	/* 159 */ KEY_NOTUSED,
-	/* 160 */ KEY_NOTUSED,
-	/* 161 */ KEY_NOTUSED,
-	/* 162 */ KEY_NOTUSED,
-	/* 163 */ KEY_NOTUSED,
-	/* 164 */ KEY_NOTUSED,
-	/* 165 */ KEY_NOTUSED,
-	/* 166 */ KEY_NOTUSED,
-	/* 167 */ KEY_NOTUSED,
-	/* 168 */ KEY_NOTUSED,
-	/* 169 */ KEY_NOTUSED,
-	/* 170 */ KEY_NOTUSED,
-	/* 171 */ KEY_NOTUSED,
-	/* 172 */ KEY_NOTUSED,
-	/* 173 */ KEY_NOTUSED,
-	/* 174 */ KEY_NOTUSED,
-	/* 175 */ KEY_NOTUSED,
-	/* 176 */ KEY_NOTUSED,
-	/* 177 */ KEY_NOTUSED,
-	/* 178 */ KEY_NOTUSED,
-	/* 179 */ KEY_NOTUSED,
-	/* 180 */ KEY_NOTUSED,
-	/* 181 */ KEY_NOTUSED,
-	/* 182 */ KEY_NOTUSED,
-	/* 183 */ KEY_NOTUSED,
-	/* 184 */ KEY_NOTUSED,
-	/* 185 */ KEY_NOTUSED,
-	/* 186 */ KEY_NOTUSED,
-	/* 187 */ KEY_NOTUSED,
-	/* 188 */ KEY_NOTUSED,
-	/* 189 */ KEY_NOTUSED,
-	/* 190 */ KEY_NOTUSED,
-	/* 191 */ KEY_NOTUSED,
-	/* 192 */ KEY_NOTUSED,
-	/* 193 */ KEY_NOTUSED,
-	/* 194 */ KEY_NOTUSED,
-	/* 195 */ KEY_NOTUSED,
-	/* 196 */ KEY_NOTUSED,
-	/* 197 */ KEY_NOTUSED,
-	/* 198 */ KEY_NOTUSED,
-	/* 199 */ KEY_NOTUSED,
-	/* 200 */ KEY_NOTUSED,
-	/* 201 */ KEY_NOTUSED,
-	/* 202 */ KEY_NOTUSED,
-	/* 203 */ KEY_NOTUSED,
-	/* 204 */ KEY_NOTUSED,
-	/* 205 */ KEY_NOTUSED,
-	/* 206 */ KEY_NOTUSED,
-	/* 207 */ KEY_NOTUSED,
-	/* 208 */ KEY_NOTUSED,
-	/* 209 */ KEY_NOTUSED,
-	/* 210 */ KEY_NOTUSED,
-	/* 211 */ KEY_NOTUSED,
-	/* 212 */ KEY_NOTUSED,
-	/* 213 */ KEY_NOTUSED,
-	/* 214 */ KEY_NOTUSED,
-	/* 215 */ KEY_NOTUSED,
-	/* 216 */ KEY_NOTUSED,
-	/* 217 */ KEY_NOTUSED,
-	/* 218 */ KEY_NOTUSED,
-	/* 219 */ KEY_NOTUSED,
-	/* 220 */ KEY_NOTUSED,
-	/* 221 */ KEY_NOTUSED,
-	/* 222 */ KEY_NOTUSED,
-	/* 223 */ KEY_NOTUSED,
-	/* 224 */ KEY_LCtrl,	/* Left Control */
-	/* 225 */ KEY_ShiftL,	/* Left Shift */
-	/* 226 */ KEY_Alt,	/* Left Alt */
-	/* 227 */ KEY_LMeta,	/* Left Meta */
-	/* 228 */ KEY_RCtrl,	/* Right Control */
-	/* 229 */ KEY_ShiftR,	/* Right Shift */
-	/* 230 */ KEY_AltLang,	/* Right Alt, AKA AltGr */
-	/* 231 */ KEY_LMeta,	/* Right Meta XXX */
-};
-#define WS_USB_MAP_SIZE (sizeof(wsUsbMap)/sizeof(unsigned char))
-
-static
-TransMapRec wsUsb = {
-    0,
-    WS_USB_MAP_SIZE,
-    wsUsbMap
-};
-
-/* Map for adb keyboards  */
-static CARD8 wsAdbMap[] = {
-	/* 0 */ KEY_A,
-	/* 1 */ KEY_S,
-	/* 2 */ KEY_D,
-	/* 3 */ KEY_F,
-	/* 4 */ KEY_H,
-	/* 5 */ KEY_G,
-	/* 6 */ KEY_Z,
-	/* 7 */ KEY_X,
-	/* 8 */ KEY_C,
-	/* 9 */ KEY_V,
-	/* 10 */ KEY_UNKNOWN,	/* @ # on french keyboards */
-	/* 11 */ KEY_B,
-	/* 12 */ KEY_Q,
-	/* 13 */ KEY_W,
-	/* 14 */ KEY_E,
-	/* 15 */ KEY_R,
-	/* 16 */ KEY_Y,
-	/* 17 */ KEY_T,
-	/* 18 */ KEY_1,
-	/* 19 */ KEY_2,
-	/* 20 */ KEY_3,
-	/* 21 */ KEY_4,
-	/* 22 */ KEY_6,
-	/* 23 */ KEY_5,
-	/* 24 */ KEY_Equal,
-	/* 25 */ KEY_9,
-	/* 26 */ KEY_7,
-	/* 27 */ KEY_Minus,
-	/* 28 */ KEY_8,
-	/* 29 */ KEY_0,
-	/* 30 */ KEY_RBrace,
-	/* 31 */ KEY_O,
-	/* 32 */ KEY_U,
-	/* 33 */ KEY_LBrace,
-	/* 34 */ KEY_I,
-	/* 35 */ KEY_P,
-	/* 36 */ KEY_Enter,
-	/* 37 */ KEY_L,
-	/* 38 */ KEY_J,
-	/* 39 */ KEY_Quote,
-	/* 40 */ KEY_K,
-	/* 41 */ KEY_SemiColon,
-	/* 42 */ KEY_BSlash,
-	/* 43 */ KEY_Comma,
-	/* 44 */ KEY_Slash,
-	/* 45 */ KEY_N,
-	/* 46 */ KEY_M,
-	/* 47 */ KEY_Period,
-	/* 48 */ KEY_Tab,
-	/* 49 */ KEY_Space,
-	/* 50 */ KEY_Tilde,
-	/* 51 */ KEY_Delete,
-	/* 52 */ KEY_AltLang,
-	/* 53 */ KEY_Escape,
-	/* 54 */ KEY_LCtrl,
-	/* 55 */ KEY_Alt,
-	/* 56 */ KEY_ShiftL,
-	/* 57 */ KEY_CapsLock,
-	/* 58 */ KEY_LMeta,
-	/* 59 */ KEY_Left,
-	/* 60 */ KEY_Right,
-	/* 61 */ KEY_Down,
-	/* 62 */ KEY_Up,
-	/* 63 */ KEY_UNKNOWN,	/* Fn */
-	/* 64 */ KEY_NOTUSED,
-	/* 65 */ KEY_KP_Decimal,
-	/* 66 */ KEY_NOTUSED,
-	/* 67 */ KEY_KP_Multiply,
-	/* 68 */ KEY_NOTUSED,
-	/* 69 */ KEY_KP_Plus,
-	/* 70 */ KEY_NOTUSED,
-	/* 71 */ KEY_UNKNOWN,	/* Clear */
-	/* 72 */ KEY_NOTUSED, 
-	/* 73 */ KEY_NOTUSED,
-	/* 74 */ KEY_NOTUSED,
-	/* 75 */ KEY_KP_Divide,
-	/* 76 */ KEY_KP_Enter,
-	/* 77 */ KEY_NOTUSED,
-	/* 78 */ KEY_KP_Minus,
-	/* 79 */ KEY_NOTUSED,
-	/* 80 */ KEY_NOTUSED,
-	/* 81 */ KEY_KP_Equal,	/* Keypad = */
-	/* 82 */ KEY_KP_0,
-	/* 83 */ KEY_KP_1,
-	/* 84 */ KEY_KP_2,
-	/* 85 */ KEY_KP_3,
-	/* 86 */ KEY_KP_4,
-	/* 87 */ KEY_KP_5,
-	/* 88 */ KEY_KP_6,
-	/* 89 */ KEY_KP_7,
-	/* 90 */ KEY_NOTUSED,
-	/* 91 */ KEY_KP_8,
-	/* 92 */ KEY_KP_9,
-	/* 93 */ KEY_NOTUSED,
-	/* 94 */ KEY_NOTUSED,
-	/* 95 */ KEY_UNKNOWN,	/* Keypad ,  */
-	/* 96 */ KEY_F5,
-	/* 97 */ KEY_F6,
-	/* 98 */ KEY_F7,
-	/* 99 */ KEY_F3,
-	/* 100 */ KEY_F8,
-	/* 101 */ KEY_F9,
-	/* 102 */ KEY_NOTUSED,
-	/* 103 */ KEY_F11,
-	/* 104 */ KEY_NOTUSED,
-	/* 105 */ KEY_NOTUSED,
-	/* 106 */ KEY_KP_Enter,
-	/* 107 */ KEY_NOTUSED,
-	/* 108 */ KEY_NOTUSED,
-	/* 109 */ KEY_F10,
-	/* 110 */ KEY_NOTUSED,
-	/* 111 */ KEY_F12,
-	/* 112 */ KEY_NOTUSED,
-	/* 113 */ KEY_NOTUSED,
-	/* 114 */ KEY_NOTUSED,
-	/* 115 */ KEY_Home,
-	/* 116 */ KEY_PgUp,
-	/* 117 */ KEY_NOTUSED,
-	/* 118 */ KEY_F4,
-	/* 119 */ KEY_End,
-	/* 120 */ KEY_F2,
-	/* 121 */ KEY_PgDown,
-	/* 122 */ KEY_F1
-};
-#define WS_ADB_MAP_SIZE (sizeof(wsAdbMap)/sizeof(unsigned char))
-
-static
-TransMapRec wsAdb = {
-    0,
-    WS_ADB_MAP_SIZE,
-    wsAdbMap
-};
-
-static CARD8 wsSunMap[] = {
-	/* 0x00 */ KEY_Help,
-	/* 0x01 */ KEY_L1,		/* stop */
-	/* 0x02 */ KEY_AudioLower,	/* BrightnessDown / S-VolumeDown */
-	/* 0x03 */ KEY_L2,		/* again */
-	/* 0x04 */ KEY_AudioRaise,	/* BridgtnessUp / S-VolumeUp */
-	/* 0x05 */ KEY_F1,
-	/* 0x06 */ KEY_F2,
-	/* 0x07 */ KEY_F10,
-	/* 0x08 */ KEY_F3,
-	/* 0x09 */ KEY_F11,
-	/* 0x0a */ KEY_F4,
-	/* 0x0b */ KEY_F12,
-	/* 0x0c */ KEY_F5,
-	/* 0x0d */ KEY_AltLang,
-	/* 0x0e */ KEY_F6,
-	/* 0x0f */ KEY_NOTUSED,
-	/* 0x10 */ KEY_F7,
-	/* 0x11 */ KEY_F8,
-	/* 0x12 */ KEY_F9,
-	/* 0x13 */ KEY_Alt,
-	/* 0x14 */ KEY_Up,
-	/* 0x15 */ KEY_Pause,
-	/* 0x16 */ KEY_Print,
-	/* 0x17 */ KEY_ScrollLock,
-	/* 0x18 */ KEY_Left,
-	/* 0x19 */ KEY_L3,		/* props */
-	/* 0x1a */ KEY_L4,		/* undo */
-	/* 0x1b */ KEY_Down,
-	/* 0x1c */ KEY_Right,
-	/* 0x1d */ KEY_Escape,
-	/* 0x1e */ KEY_1,
-	/* 0x1f */ KEY_2,
-	/* 0x20 */ KEY_3,
-	/* 0x21 */ KEY_4,
-	/* 0x22 */ KEY_5,
-	/* 0x23 */ KEY_6,
-	/* 0x24 */ KEY_7,
-	/* 0x25 */ KEY_8,
-	/* 0x26 */ KEY_9,
-	/* 0x27 */ KEY_0,
-	/* 0x28 */ KEY_Minus,
-	/* 0x29 */ KEY_Equal,
-	/* 0x2a */ KEY_Tilde,
-	/* 0x2b */ KEY_BackSpace,
-	/* 0x2c */ KEY_Insert,
-	/* 0x2d */ KEY_Mute,		/* Audio Mute */
-	/* 0x2e */ KEY_KP_Divide,
-	/* 0x2f */ KEY_KP_Multiply,
-	/* 0x30 */ KEY_NOTUSED,
-	/* 0x31 */ KEY_L5,		/* front */
-	/* 0x32 */ KEY_KP_Decimal,
-	/* 0x33 */ KEY_L6,		/* copy */
-	/* 0x34 */ KEY_Home,
-	/* 0x35 */ KEY_Tab,
-	/* 0x36 */ KEY_Q,
-	/* 0x37 */ KEY_W,
-	/* 0x38 */ KEY_E,
-	/* 0x39 */ KEY_R,
-	/* 0x3a */ KEY_T,
-	/* 0x3b */ KEY_Y,
-	/* 0x3c */ KEY_U,
-	/* 0x3d */ KEY_I,
-	/* 0x3e */ KEY_O,
-	/* 0x3f */ KEY_P,
-	/* 0x40 */ KEY_LBrace,
-	/* 0x41 */ KEY_RBrace,
-	/* 0x42 */ KEY_Delete,
-	/* 0x43 */ KEY_Menu,		/* compose */
-	/* 0x44 */ KEY_KP_7,
-	/* 0x45 */ KEY_KP_8,
-	/* 0x46 */ KEY_KP_9,
-	/* 0x47 */ KEY_KP_Minus,
-	/* 0x48 */ KEY_L7,		/* open */
-	/* 0x49 */ KEY_L8,		/* paste */
-	/* 0x4a */ KEY_End,
-	/* 0x4b */ KEY_NOTUSED,
-	/* 0x4c */ KEY_LCtrl,
-	/* 0x4d */ KEY_A,
-	/* 0x4e */ KEY_S,
-	/* 0x4f */ KEY_D,
-	/* 0x50 */ KEY_F,
-	/* 0x51 */ KEY_G,
-	/* 0x52 */ KEY_H,
-	/* 0x53 */ KEY_J,
-	/* 0x54 */ KEY_K,
-	/* 0x55 */ KEY_L,
-	/* 0x56 */ KEY_SemiColon,
-	/* 0x57 */ KEY_Quote,
-	/* 0x58 */ KEY_BSlash,
-	/* 0x59 */ KEY_Enter,
-	/* 0x5a */ KEY_KP_Enter,
-	/* 0x5b */ KEY_KP_4,
-	/* 0x5c */ KEY_KP_5,
-	/* 0x5d */ KEY_KP_6,
-	/* 0x5e */ KEY_KP_0,
-	/* 0x5f */ KEY_L9,		/* find */
-	/* 0x60 */ KEY_PgUp,
-	/* 0x61 */ KEY_L10,		/* cut */
-	/* 0x62 */ KEY_NumLock,
-	/* 0x63 */ KEY_ShiftL,
-	/* 0x64 */ KEY_Z,
-	/* 0x65 */ KEY_X,
-	/* 0x66 */ KEY_C,
-	/* 0x67 */ KEY_V,
-	/* 0x68 */ KEY_B,
-	/* 0x69 */ KEY_N,
-	/* 0x6a */ KEY_M,
-	/* 0x6b */ KEY_Comma,
-	/* 0x6c */ KEY_Period,
-	/* 0x6d */ KEY_Slash,
-	/* 0x6e */ KEY_ShiftR,
-	/* 0x6f */ KEY_NOTUSED,		/* linefeed */
-	/* 0x70 */ KEY_KP_1,
-	/* 0x71 */ KEY_KP_2,
-	/* 0x72 */ KEY_KP_3,
-	/* 0x73 */ KEY_NOTUSED,
-	/* 0x74 */ KEY_NOTUSED,
-	/* 0x75 */ KEY_NOTUSED,
-	/* 0x76 */ KEY_NOTUSED,		/* help */
-	/* 0x77 */ KEY_CapsLock,
-	/* 0x78 */ KEY_LMeta,
-	/* 0x79 */ KEY_Space,
-	/* 0x7a */ KEY_RMeta,
-	/* 0x7b */ KEY_PgDown,
-	/* 0x7c */ KEY_Less,		/* < > on some keyboards */
-	/* 0x7d */ KEY_KP_Plus,
-	/* 0x7e */ KEY_NOTUSED,
-	/* 0x7f */ KEY_NOTUSED
-};
-#define WS_SUN_MAP_SIZE (sizeof(wsSunMap)/sizeof(unsigned char))
-
-static
-TransMapRec wsSun = {
-    0,
-    WS_SUN_MAP_SIZE,
-    wsSunMap
-};
-
-#endif /* WSCONS_SUPPORT */
-
-/*ARGSUSED*/
-
-/*
- * KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-void
-KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  KeySym        *k;
-  int           i;
-
-#ifndef __bsdi__
-  switch (pKbd->consType) {
-
-#ifdef PCCONS_SUPPORT
-  case PCCONS:
-#if defined(__OpenBSD__)
-    /*
-     * on OpenBSD, the pccons keymap is programmable, too
-     */
-    {
-      pccons_keymap_t keymap[KB_NUM_KEYS];
-      if (ioctl(pInfo->fd, CONSOLE_GET_KEYMAP, &keymap) != -1) {
-	for (i = 0; i < KB_NUM_KEYS; i++) 
-	  if (pccons_remap[i]) {
-	    k = map + (pccons_remap[i] << 2);
-	    switch (keymap[i].type) {
-	    case KB_ASCII:
-	      /* For ASCII keys, there is only one char in the keymap */
-	      k[0] = latin1_to_x[(unsigned char)keymap[i].unshift[0]];
-	      k[1] = latin1_to_x[(unsigned char)keymap[i].shift[0]];
-	      k[2] = latin1_to_x[(unsigned char)keymap[i].altgr[0]];
-	      k[3] = latin1_to_x[(unsigned char)keymap[i].shift_altgr[0]];
-	      break;
-	    case KB_SCROLL:
-	      k[0] = XK_Scroll_Lock;
-	      goto special;
-	    case KB_NUM:
-	      k[0] = XK_Num_Lock;
-	      goto special;
-	    case KB_CAPS:
-	      k[0] = XK_Caps_Lock;
-	      goto special;
-	    case KB_SHIFT:
-	      switch (keymap[i].unshift[0]) {
-	      case 1:
-		/* left shift */
-		k[0] = XK_Shift_L;
-		break;
-	      case 2:
-		/* right shift */
-		k[0] = XK_Shift_R;
-		break;
-	      default:
-		k[0] = NoSymbol;
-	      }
-	      goto special;
-	    case KB_CTL:
-	      k[0] = XK_Control_L;
-	      goto special;
-	    case KB_ALT:
-	      k[0] = XK_Alt_L;
-	      goto special;
-	    case KB_FUNC:
-	      switch (keymap[i].unshift[2]) {
-	      case 'M':
-		k[0] = XK_F1;
-		break;
-	      case 'N':
-		k[0] = XK_F2;
-		break;
-	      case 'O':
-		k[0] = XK_F3;
-		break;
-	      case 'P':
-		k[0] = XK_F4;
-		break;
-	      case 'Q':
-		k[0] = XK_F5;
-		break;
-	      case 'R':
-		k[0] = XK_F6;
-		break;
-	      case 'S':
-		k[0] = XK_F7;
-		break;
-	      case 'T':
-		k[0] = XK_F8;
-		break;
-	      case 'U':
-		k[0] = XK_F9;
-		break;
-	      case 'V':
-		k[0] = XK_F10;
-		break;
-	      case 'W':
-		k[0] = XK_F11;
-		break;
-	      case 'X':
-		k[0] = XK_F12;
-		break;
-	      default:
-		k[0] = NoSymbol;
-		break;
-	      }
-	      goto special;
-	    default:
-	      k[0] = NoSymbol;
-	    special:
-	      k[1] = k[2] = k[3] = NoSymbol;
-	    }
-	  }
-      } else {
-	ErrorF("Can't read pccons keymap\n");
-      }
-    }
-#endif /* __OpenBSD__ */
-  break;
-#endif
-
-/*
- * XXX wscons has no GIO_KEYMAP
- */
-#if (defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)) && defined(GIO_KEYMAP)
-  case SYSCONS:
-  case PCVT:
-    {
-      keymap_t keymap;
-    
-      if (ioctl(pInfo->fd, GIO_KEYMAP, &keymap) != -1) {
-	for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++)
-	  if (remap[i]) {
-	    k = map + (remap[i] << 2);
-	    k[0] = KD_GET_ENTRY(i,0);           /* non-shifed */
-	    k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
-	    k[2] = KD_GET_ENTRY(i,4);	      /* alt */
-	    k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
-	    if (k[3] == k[2]) k[3] = NoSymbol;
-	    if (k[2] == k[1]) k[2] = NoSymbol;
-	    if (k[1] == k[0]) k[1] = NoSymbol;
-	    if (k[0] == k[2] && k[1] == k[3])
-	      k[2] = k[3] = NoSymbol;
-	  }
-      }
-    }
-    break;
-#endif /* SYSCONS || PCVT */
-    
-  } 
-#endif /* !bsdi */
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  pKbd->kbdType = 0;
-
-  pKeySyms->map        = map;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE; 
-
-  switch(pKbd->consType) {
-#ifdef SYSCONS_SUPPORT
-      case SYSCONS:
-           if (pKbd->CustomKeycodes)
-              pKbd->scancodeMap = &sysconsCODE;
-           else
-              pKbd->RemapScanCode = ATScancode;
-           break;
-#endif
-#if defined(PCCONS_SUPPORT) || defined (PCVT_SUPPORT)
-      case PCCONS:
-      case PCVT:
-           pKbd->RemapScanCode = ATScancode;
-	   break;
-#endif
-#ifdef WSCONS_SUPPORT
-      case WSCONS:
-	if (!pKbd->isConsole) {
-           switch (pKbd->wsKbdType) {
-	       case WSKBD_TYPE_PC_XT:
-	       case WSKBD_TYPE_PC_AT:
-                    pKbd->RemapScanCode = ATScancode;
-                    break;
-	       case WSKBD_TYPE_USB:
-                    pKbd->scancodeMap = &wsUsb;
-                    break;
-#ifdef WSKBD_TYPE_ADB	
-	       case WSKBD_TYPE_ADB:
-                    pKbd->scancodeMap = &wsAdb; 
-                    break;
-#endif
-#ifdef WSKBD_TYPE_SUN
-#ifdef WSKBD_TYPE_SUN5
-	       case WSKBD_TYPE_SUN5:
-#endif
-	       case WSKBD_TYPE_SUN:
-                    pKbd->scancodeMap = &wsSun;
-                    break;
-#endif
-	       default:
-		    ErrorF("Unknown wskbd type %d\n", pKbd->wsKbdType);
-           }
-	} else {
-           pKbd->RemapScanCode = ATScancode;
-	}
-      break;
-#endif
-  }
-  return;
-}
diff --git a/hw/xfree86/os-support/bsd/bsd_kbd.c b/hw/xfree86/os-support/bsd/bsd_kbd.c
deleted file mode 100644
index 65d577e..0000000
--- a/hw/xfree86/os-support/bsd/bsd_kbd.c
+++ /dev/null
@@ -1,572 +0,0 @@
-
-/*
- * Copyright (c) 2002 by The XFree86 Project, Inc.
- * Author: Ivan Pascal.
- *
- * Based on the code from bsd_io.c which is
- * Copyright 1992 by Rich Murphey <Rich at Rice.edu>
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- */
-
-#define NEED_EVENTS
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <termios.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-#include "bsd_kbd.h"
-
-extern Bool VTSwitchEnabled;
-#ifdef USE_VT_SYSREQ
-extern Bool VTSysreqToggle;
-#endif
-
-static KbdProtocolRec protocols[] = {
-   {"standard", PROT_STD },
-#ifdef WSCONS_SUPPORT
-   {"wskbd", PROT_WSCONS },
-#endif
-   { NULL, PROT_UNKNOWN_KBD }
-};
-
-typedef struct {
-   struct termios kbdtty;
-} BsdKbdPrivRec, *BsdKbdPrivPtr;
-
-static
-int KbdInit(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    BsdKbdPrivPtr priv = (BsdKbdPrivPtr) pKbd->private;
-
-    if (pKbd->isConsole) {
-        switch (pKbd->consType) {
-#if defined(PCCONS_SUPPORT) || defined(SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)  || defined (WSCONS_SUPPORT)
-	    case PCCONS:
-	    case SYSCONS:
-	    case PCVT:
-#if defined WSCONS_SUPPORT
-            case WSCONS:
-#endif
- 	         tcgetattr(pInfo->fd, &(priv->kbdtty));
-#endif
-	         break;
-        }
-    }
-
-    return Success;
-}
-
-static void
-SetKbdLeds(InputInfoPtr pInfo, int leds)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    int real_leds = 0;
-
-#ifdef LED_CAP
-    if (leds & XLED1)  real_leds |= LED_CAP;
-#endif
-#ifdef LED_NUM
-    if (leds & XLED2)  real_leds |= LED_NUM;
-#endif
-#ifdef LED_SCR
-    if (leds & XLED3)  real_leds |= LED_SCR;
-    if (leds & XLED4)  real_leds |= LED_SCR;
-#endif
-
-    switch (pKbd->consType) {
-
-	case PCCONS:
-		break;
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	case SYSCONS:
-	case PCVT:
-	     ioctl(pInfo->fd, KDSETLED, real_leds);
-	     break;
-#endif
-#if defined(WSCONS_SUPPORT)
-        case WSCONS:
-             ioctl(pInfo->fd, WSKBDIO_SETLEDS, &real_leds);
-             break;
-#endif
-    }
-}
-
-static int
-GetKbdLeds(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    int leds = 0, real_leds = 0;
-
-    switch (pKbd->consType) {
-	case PCCONS:
-	     break;
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	case SYSCONS:
-	case PCVT:
-	     ioctl(pInfo->fd, KDGETLED, &real_leds);
-	     break;
-#endif
-#if defined(WSCONS_SUPPORT)
-        case WSCONS:
-             ioctl(pInfo->fd, WSKBDIO_GETLEDS, &real_leds);
-             break;
-#endif
-    }
-
-#ifdef LED_CAP
-    if (real_leds & LED_CAP) leds |= XLED1;
-#endif
-#ifdef LED_NUM
-    if (real_leds & LED_NUM) leds |= XLED2;
-#endif
-#ifdef LED_SCR
-    if (real_leds & LED_SCR) leds |= XLED3;
-#endif
-
-    return(leds);
-}
-
-static void
-SetKbdRepeat(InputInfoPtr pInfo, char rad)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    switch (pKbd->consType) {
-
-	case PCCONS:
-		break;
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	case SYSCONS:
-	case PCVT:
-		ioctl(pInfo->fd, KDSETRAD, rad);
-		break;
-#endif
-    }
-}
-
-static int
-KbdOn(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-#if defined(SYSCONS_SUPPORT) || defined(PCCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)
-    BsdKbdPrivPtr priv = (BsdKbdPrivPtr) pKbd->private;
-    struct termios nTty;
-#endif
-#ifdef WSCONS_SUPPORT
-    int option;
-#endif
-
-    if (pKbd->isConsole) {
-        switch (pKbd->consType) {
-
-#if defined(SYSCONS_SUPPORT) || defined(PCCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)
-	    case SYSCONS:
-	    case PCCONS:
-	    case PCVT:
-#ifdef WSCONS_SUPPORT
-            case WSCONS:
-#endif
-		 nTty = priv->kbdtty;
-		 nTty.c_iflag = IGNPAR | IGNBRK;
-		 nTty.c_oflag = 0;
-		 nTty.c_cflag = CREAD | CS8;
-		 nTty.c_lflag = 0;
-		 nTty.c_cc[VTIME] = 0;
-		 nTty.c_cc[VMIN] = 1;
-		 cfsetispeed(&nTty, 9600);
-		 cfsetospeed(&nTty, 9600);
-		 if (tcsetattr(pInfo->fd, TCSANOW, &nTty) < 0) {
-			 xf86Msg(X_ERROR, "KbdOn: tcsetattr: %s\n",
-			     strerror(errno));
-		 }
-                 break; 
-#endif 
-        }
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT) || defined (WSCONS_SUPPORT)
-        switch (pKbd->consType) {
-	    case SYSCONS:
-	    case PCVT:
-#ifdef K_CODE
-                 if (pKbd->CustomKeycodes)
-		     ioctl(pInfo->fd, KDSKBMODE, K_CODE);
-	         else
-	             ioctl(pInfo->fd, KDSKBMODE, K_RAW);
-#else
-		 ioctl(pInfo->fd, KDSKBMODE, K_RAW);
-#endif
-	         break;
-#endif
-#ifdef WSCONS_SUPPORT
-            case WSCONS:
-                 option = WSKBD_RAW;
-                 if (ioctl(pInfo->fd, WSKBDIO_SETMODE, &option) == -1) {
-			 FatalError("can't switch keyboard to raw mode. "
-				    "Enable support for it in the kernel\n"
-				    "or use for example:\n\n"
-				    "Option \"Protocol\" \"wskbd\"\n"
-				    "Option \"Device\" \"/dev/wskbd0\"\n"
-				    "\nin your xorg.conf(5) file\n");
-		 }
-		 break;
-#endif
-        }
-    }
-    return Success;
-}
-
-static int
-KbdOff(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    BsdKbdPrivPtr priv = (BsdKbdPrivPtr) pKbd->private;
-#ifdef WSCONS_SUPPORT
-    int option;
-#endif
-
-    if (pKbd->isConsole) {
-        switch (pKbd->consType) {
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	    case SYSCONS:
-	    case PCVT:
-	         ioctl(pInfo->fd, KDSKBMODE, K_XLATE);
-	         /* FALL THROUGH */
-#endif
-#if defined(SYSCONS_SUPPORT) || defined(PCCONS_SUPPORT) || defined(PCVT_SUPPORT)
-	    case PCCONS:
-	         tcsetattr(pInfo->fd, TCSANOW, &(priv->kbdtty));
-	         break;
-#endif
-#ifdef WSCONS_SUPPORT
-            case WSCONS:
-                 option = WSKBD_TRANSLATED;
-                 ioctl(xf86Info.consoleFd, WSKBDIO_SETMODE, &option);
-                 tcsetattr(pInfo->fd, TCSANOW, &(priv->kbdtty));
-	         break;
-#endif
-        }
-    }
-    return Success;
-}
-
-static void
-SoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-#ifdef WSCONS_SUPPORT
-    struct wskbd_bell_data wsb;
-#endif
-
-    if (loudness && pitch) {
-    	switch (pKbd->consType) {
-#ifdef PCCONS_SUPPORT
-	    case PCCONS:
-	         { int data[2];
-		   data[0] = pitch;
-		   data[1] = (duration * loudness) / 50;
-		   ioctl(pInfo->fd, CONSOLE_X_BELL, data);
-		   break;
-		 }
-#endif
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-	    case SYSCONS:
-	    case PCVT:
-		 ioctl(pInfo->fd, KDMKTONE,
-		 ((1193190 / pitch) & 0xffff) |
-		 (((unsigned long)duration*loudness/50)<<16));
-		 break;
-#endif
-#if defined (WSCONS_SUPPORT)
-            case WSCONS:
-                 wsb.which = WSKBD_BELL_DOALL;
-                 wsb.pitch = pitch;
-                 wsb.period = duration;
-                 wsb.volume = loudness;
-                 ioctl(pInfo->fd, WSKBDIO_COMPLEXBELL, &wsb);
-                 break;
-#endif
-	}
-    }
-}
-
-#define ModifierSet(k) ((modifiers & (k)) == (k))
-
-static
-Bool SpecialKey(InputInfoPtr pInfo, int key, Bool down, int modifiers)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-
-  if(!pKbd->vtSwitchSupported)
-      return FALSE;
-
-  if ((ModifierSet(ControlMask | AltMask)) ||
-      (ModifierSet(ControlMask | AltLangMask))) {
-      if (VTSwitchEnabled && !xf86Info.vtSysreq && !xf86Info.dontVTSwitch) {
-         switch (key) {
-             case KEY_F1:
-             case KEY_F2:
-             case KEY_F3:
-             case KEY_F4:
-             case KEY_F5:
-             case KEY_F6:
-             case KEY_F7:
-             case KEY_F8:
-             case KEY_F9:
-             case KEY_F10:
-#ifdef VT_ACTIVATE
-                  if (down) {
-                    ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F1 + 1);
-                    return TRUE;
-                  }
-#endif
-             case KEY_F11:
-             case KEY_F12:
-#ifdef VT_ACTIVATE
-                  if (down) {
-                    ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F11 + 11);
-                    return TRUE;
-                  }
-#endif
-         }
-      }
-    }
-#ifdef USE_VT_SYSREQ
-    if (VTSwitchEnabled && xf86Info.vtSysreq && !xf86Info.dontVTSwitch) {
-        switch (key) {
-            case KEY_F1:
-            case KEY_F2:
-            case KEY_F3:
-            case KEY_F4:
-            case KEY_F5:
-            case KEY_F6:
-            case KEY_F7:
-            case KEY_F8:
-            case KEY_F9:
-            case KEY_F10:
-                 if (VTSysreqToggle && down) {
-                     ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F1 + 1);
-                     VTSysreqToggle = FALSE;
-                     return TRUE;
-                 }
-                 break;
-            case KEY_F11:
-            case KEY_F12:
-                 if (VTSysreqToggle && down) {
-                     ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F11 + 11);
-                     VTSysreqToggle = FALSE;
-                     return TRUE;
-                 }
-                 break;
-            /* Ignore these keys -- ie don't let them cancel an alt-sysreq */
-            case KEY_Alt:
-            case KEY_AltLang:
-                 break;
-            case KEY_SysReqest:
-                 if ((ModifierSet(AltMask) || ModifierSet(AltLangMask)) && down)
-                     VTSysreqToggle = TRUE;
-                 break;
-            default:
-                 /*
-                  * We only land here when Alt-SysReq is followed by a
-                  * non-switching key.
-                  */
-                 if (VTSysreqToggle)
-                     VTSysreqToggle = FALSE;
-        }
-    }
-#endif /* USE_VT_SYSREQ */
-
-    return FALSE;
-}
-
-static void
-stdReadInput(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    unsigned char rBuf[64];
-    int nBytes, i;
-    if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(rBuf))) > 0) {
-       for (i = 0; i < nBytes; i++)
-	   pKbd->PostEvent(pInfo, rBuf[i] & 0x7f,
-                           rBuf[i] & 0x80 ? FALSE : TRUE);
-       }
-}
-
-#ifdef WSCONS_SUPPORT
-
-static void
-WSReadInput(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    struct wscons_event events[64];
-    int type;
-    int blocked, n, i;
-
-    if ((n = read( pInfo->fd, events, sizeof(events))) > 0) {
-        n /=  sizeof(struct wscons_event);
-        for (i = 0; i < n; i++) {
-	    type = events[i].type;
-	    if (type == WSCONS_EVENT_KEY_UP || type == WSCONS_EVENT_KEY_DOWN) {
-		/* It seems better to block SIGIO there */
-		blocked = xf86BlockSIGIO();
-		pKbd->PostEvent(pInfo, (unsigned int)(events[i].value),
-				type == WSCONS_EVENT_KEY_DOWN ? TRUE : FALSE);
-		xf86UnblockSIGIO(blocked);
-	    }
-	} /* for */
-    }
-}
-
-static void
-printWsType(char *type, char *devname)
-{
-    xf86Msg(X_PROBED, "%s: Keyboard type: %s\n", type, devname); 
-}
-#endif
-
-static Bool
-OpenKeyboard(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    int i;
-    KbdProtocolId prot = PROT_UNKNOWN_KBD;
-    char *s;
-
-    s = xf86SetStrOption(pInfo->options, "Protocol", NULL);
-    for (i = 0; protocols[i].name; i++) {
-        if (xf86NameCmp(s, protocols[i].name) == 0) {
-           prot = protocols[i].id;
-           break;
-        }
-    }
-
-    switch (prot) {
-    	case PROT_STD:
-           pInfo->read_input = stdReadInput;
-           break;
-#ifdef WSCONS_SUPPORT
-        case PROT_WSCONS:
-           pInfo->read_input = WSReadInput;
-           break;
-#endif
-        default:
-           xf86Msg(X_ERROR,"\"%s\" is not a valid keyboard protocol name\n", s);
-           xfree(s);
-           return FALSE;
-    }
-    xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, s);
-    xfree(s);
-
-    s = xf86SetStrOption(pInfo->options, "Device", NULL);
-    if (s == NULL) {
-       if (prot == PROT_WSCONS) {
-           xf86Msg(X_ERROR,"A \"device\" option is required with"
-                                  " the \"wskbd\" keyboard protocol\n");
-           return FALSE;
-       } else {
-           pInfo->fd = xf86Info.consoleFd;
-           pKbd->isConsole = TRUE;
-           pKbd->consType = xf86Info.consType;
-       }
-    } else {
-	pInfo->fd = open(s, O_RDONLY | O_NONBLOCK | O_EXCL);
-       if (pInfo->fd == -1) {
-           xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", pInfo->name, s);
-           xfree(s);
-           return FALSE;
-       }
-       pKbd->isConsole = FALSE;
-       pKbd->consType = xf86Info.consType;
-       xfree(s);
-    }
-
-#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
-    if (pKbd->isConsole &&
-        ((pKbd->consType == SYSCONS) || (pKbd->consType == PCVT)))
-        pKbd->vtSwitchSupported = TRUE;
-#endif
-
-#ifdef WSCONS_SUPPORT
-    if( prot == PROT_WSCONS) {
-       pKbd->consType = WSCONS;
-       /* Find out keyboard type */
-       if (ioctl(pInfo->fd, WSKBDIO_GTYPE, &(pKbd->wsKbdType)) == -1) {
-           xf86Msg(X_ERROR, "%s: cannot get keyboard type", pInfo->name);
-           close(pInfo->fd);
-           return FALSE;
-       }
-       switch (pKbd->wsKbdType) {
-           case WSKBD_TYPE_PC_XT:
-               printWsType("XT", pInfo->name);
-               break;
-           case WSKBD_TYPE_PC_AT:
-               printWsType("AT", pInfo->name);
-               break;
-           case WSKBD_TYPE_USB:
-               printWsType("USB", pInfo->name);
-               break;
-#ifdef WSKBD_TYPE_ADB
-           case WSKBD_TYPE_ADB:
-               printWsType("ADB", pInfo->name);
-               break;
-#endif
-#ifdef WSKBD_TYPE_SUN
-           case WSKBD_TYPE_SUN:
-               printWsType("Sun", pInfo->name);
-               break;
-#endif
-#ifdef WSKBD_TYPE_SUN5
-     case WSKBD_TYPE_SUN5:
-	     xf86Msg(X_PROBED, "Keyboard type: Sun5\n");
-	     break;
-#endif
-           default:
-               xf86Msg(X_ERROR, "%s: Unsupported wskbd type \"%d\"",
-                                pInfo->name, pKbd->wsKbdType);
-               close(pInfo->fd);
-               return FALSE;
-       }
-    }
-#endif
-    return TRUE;
-}
-
-_X_EXPORT Bool
-xf86OSKbdPreInit(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = pInfo->private;
-
-    pKbd->KbdInit	= KbdInit;
-    pKbd->KbdOn		= KbdOn;
-    pKbd->KbdOff	= KbdOff;
-    pKbd->Bell		= SoundBell;
-    pKbd->SetLeds	= SetKbdLeds;
-    pKbd->GetLeds	= GetKbdLeds;
-    pKbd->SetKbdRepeat	= SetKbdRepeat;
-    pKbd->KbdGetMapping	= KbdGetMapping;
-    pKbd->SpecialKey	= SpecialKey;
-
-    pKbd->RemapScanCode = NULL;
-    pKbd->GetSpecialKey = NULL;
-
-    pKbd->OpenKeyboard = OpenKeyboard;
-    pKbd->vtSwitchSupported = FALSE;
-    pKbd->CustomKeycodes = FALSE;
-    
-    pKbd->private = xcalloc(sizeof(BsdKbdPrivRec), 1);
-    if (pKbd->private == NULL) {
-       xf86Msg(X_ERROR,"can't allocate keyboard OS private data\n");
-       return FALSE;
-    }
-    return TRUE;
-}
diff --git a/hw/xfree86/os-support/bsd/bsd_kbd.h b/hw/xfree86/os-support/bsd/bsd_kbd.h
deleted file mode 100644
index b2ae179..0000000
--- a/hw/xfree86/os-support/bsd/bsd_kbd.h
+++ /dev/null
@@ -1,4 +0,0 @@
-
-extern void KbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms,
-				CARD8 *pModMap);
-
diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am
index d77e3a3..fc4243b 100644
--- a/hw/xfree86/os-support/linux/Makefile.am
+++ b/hw/xfree86/os-support/linux/Makefile.am
@@ -19,17 +19,15 @@ APM_SOURCES = lnx_apm.c
 XORG_CFLAGS += -DHAVE_APM
 endif
 
-liblinux_la_SOURCES = lnx_init.c lnx_video.c lnx_kbd.c lnx_mouse.c \
-                     lnx_pci.c lnx_agp.c lnx_kmod.c lnx_KbdMap.c \
+liblinux_la_SOURCES = lnx_init.c lnx_video.c lnx_mouse.c \
+                     lnx_pci.c lnx_agp.c lnx_kmod.c \
                      $(srcdir)/../shared/bios_mmap.c \
 		     $(srcdir)/../shared/VTsw_usl.c \
-                     $(srcdir)/../shared/std_kbdEv.c \
 		     $(srcdir)/../shared/posix_tty.c \
                      $(srcdir)/../shared/vidmem.c \
 		     $(srcdir)/../shared/sigio.c \
                      $(srcdir)/../shared/stdResource.c \
 		     $(srcdir)/../shared/libc_wrapper.c \
-                     $(srcdir)/../shared/at_scancode.c \
                      $(ACPI_SOURCES) \
                      $(APM_SOURCES) \
                      $(PLATFORM_PCI_SUPPORT)
diff --git a/hw/xfree86/os-support/linux/lnx_KbdMap.c b/hw/xfree86/os-support/linux/lnx_KbdMap.c
deleted file mode 100644
index a2a2e22..0000000
--- a/hw/xfree86/os-support/linux/lnx_KbdMap.c
+++ /dev/null
@@ -1,606 +0,0 @@
-/* $XFree86$ */
-
-/*
- * Slightly modified xf86KbdLnx.c which is
- *
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-
-#include "xf86Keymap.h"
-
-#include "lnx_kbd.h"
-
-/*ARGSUSED*/
-
-/*
- * KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-static void readKernelMapping(InputInfoPtr pInfo,
-                              KeySymsPtr pKeySyms, CARD8 *pModMap);
-void
-KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  KeySym        *k;
-  char          type;
-  int           i;
-
-  readKernelMapping(pInfo, pKeySyms, pModMap);
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  pKbd->kbdType = ioctl(pInfo->fd, KDGKBTYPE, &type) != -1 ? type : KB_101;
-
-  pKeySyms->map        = map;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE; 
-}
-
-#include <linux/keyboard.h>
-
-static KeySym linux_to_x[256] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_BackSpace,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_nobreakspace,XK_exclamdown,	XK_cent,	XK_sterling,
-	XK_currency,	XK_yen,		XK_brokenbar,	XK_section,
-	XK_diaeresis,	XK_copyright,	XK_ordfeminine,	XK_guillemotleft,
-	XK_notsign,	XK_hyphen,	XK_registered,	XK_macron,
-	XK_degree,	XK_plusminus,	XK_twosuperior,	XK_threesuperior,
-	XK_acute,	XK_mu,		XK_paragraph,	XK_periodcentered,
-	XK_cedilla,	XK_onesuperior,	XK_masculine,	XK_guillemotright,
-	XK_onequarter,	XK_onehalf,	XK_threequarters,XK_questiondown,
-	XK_Agrave,	XK_Aacute,	XK_Acircumflex,	XK_Atilde,
-	XK_Adiaeresis,	XK_Aring,	XK_AE,		XK_Ccedilla,
-	XK_Egrave,	XK_Eacute,	XK_Ecircumflex,	XK_Ediaeresis,
-	XK_Igrave,	XK_Iacute,	XK_Icircumflex,	XK_Idiaeresis,
-	XK_ETH,		XK_Ntilde,	XK_Ograve,	XK_Oacute,
-	XK_Ocircumflex,	XK_Otilde,	XK_Odiaeresis,	XK_multiply,
-	XK_Ooblique,	XK_Ugrave,	XK_Uacute,	XK_Ucircumflex,
-	XK_Udiaeresis,	XK_Yacute,	XK_THORN,	XK_ssharp,
-	XK_agrave,	XK_aacute,	XK_acircumflex,	XK_atilde,
-	XK_adiaeresis,	XK_aring,	XK_ae,		XK_ccedilla,
-	XK_egrave,	XK_eacute,	XK_ecircumflex,	XK_ediaeresis,
-	XK_igrave,	XK_iacute,	XK_icircumflex,	XK_idiaeresis,
-	XK_eth,		XK_ntilde,	XK_ograve,	XK_oacute,
-	XK_ocircumflex,	XK_otilde,	XK_odiaeresis,	XK_division,
-	XK_oslash,	XK_ugrave,	XK_uacute,	XK_ucircumflex,
-	XK_udiaeresis,	XK_yacute,	XK_thorn,	XK_ydiaeresis
-};
-
-/*
- * Maps the AT keycodes to Linux keycodes
- */
-static unsigned char at2lnx[] =
-{
-	0x01,	/* KEY_Escape */	0x02,	/* KEY_1 */
-	0x03,	/* KEY_2 */		0x04,	/* KEY_3 */
-	0x05,	/* KEY_4 */		0x06,	/* KEY_5 */
-	0x07,	/* KEY_6 */		0x08,	/* KEY_7 */
-	0x09,	/* KEY_8 */		0x0a,	/* KEY_9 */
-	0x0b,	/* KEY_0 */		0x0c,	/* KEY_Minus */
-	0x0d,	/* KEY_Equal */		0x0e,	/* KEY_BackSpace */
-	0x0f,	/* KEY_Tab */		0x10,	/* KEY_Q */
-	0x11,	/* KEY_W */		0x12,	/* KEY_E */
-	0x13,	/* KEY_R */		0x14,	/* KEY_T */
-	0x15,	/* KEY_Y */		0x16,	/* KEY_U */
-	0x17,	/* KEY_I */		0x18,	/* KEY_O */
-	0x19,	/* KEY_P */		0x1a,	/* KEY_LBrace */
-	0x1b,	/* KEY_RBrace */	0x1c,	/* KEY_Enter */
-	0x1d,	/* KEY_LCtrl */		0x1e,	/* KEY_A */
-	0x1f,	/* KEY_S */		0x20,	/* KEY_D */
-	0x21,	/* KEY_F */		0x22,	/* KEY_G */
-	0x23,	/* KEY_H */		0x24,	/* KEY_J */
-	0x25,	/* KEY_K */		0x26,	/* KEY_L */
-	0x27,	/* KEY_SemiColon */	0x28,	/* KEY_Quote */
-	0x29,	/* KEY_Tilde */		0x2a,	/* KEY_ShiftL */
-	0x2b,	/* KEY_BSlash */	0x2c,	/* KEY_Z */
-	0x2d,	/* KEY_X */		0x2e,	/* KEY_C */
-	0x2f,	/* KEY_V */		0x30,	/* KEY_B */
-	0x31,	/* KEY_N */		0x32,	/* KEY_M */
-	0x33,	/* KEY_Comma */		0x34,	/* KEY_Period */
-	0x35,	/* KEY_Slash */		0x36,	/* KEY_ShiftR */
-	0x37,	/* KEY_KP_Multiply */	0x38,	/* KEY_Alt */
-	0x39,	/* KEY_Space */		0x3a,	/* KEY_CapsLock */
-	0x3b,	/* KEY_F1 */		0x3c,	/* KEY_F2 */
-	0x3d,	/* KEY_F3 */		0x3e,	/* KEY_F4 */
-	0x3f,	/* KEY_F5 */		0x40,	/* KEY_F6 */
-	0x41,	/* KEY_F7 */		0x42,	/* KEY_F8 */
-	0x43,	/* KEY_F9 */		0x44,	/* KEY_F10 */
-	0x45,	/* KEY_NumLock */	0x46,	/* KEY_ScrollLock */
-	0x47,	/* KEY_KP_7 */		0x48,	/* KEY_KP_8 */
-	0x49,	/* KEY_KP_9 */		0x4a,	/* KEY_KP_Minus */
-	0x4b,	/* KEY_KP_4 */		0x4c,	/* KEY_KP_5 */
-	0x4d,	/* KEY_KP_6 */		0x4e,	/* KEY_KP_Plus */
-	0x4f,	/* KEY_KP_1 */		0x50,	/* KEY_KP_2 */
-	0x51,	/* KEY_KP_3 */		0x52,	/* KEY_KP_0 */
-	0x53,	/* KEY_KP_Decimal */	0x54,	/* KEY_SysReqest */
-	0x00,	/* 0x55 */		0x56,	/* KEY_Less */
-	0x57,	/* KEY_F11 */		0x58,	/* KEY_F12 */
-	0x66,	/* KEY_Home */		0x67,	/* KEY_Up */
-	0x68,	/* KEY_PgUp */		0x69,	/* KEY_Left */
-	0x5d,	/* KEY_Begin */		0x6a,	/* KEY_Right */
-	0x6b,	/* KEY_End */		0x6c,	/* KEY_Down */
-	0x6d,	/* KEY_PgDown */	0x6e,	/* KEY_Insert */
-	0x6f,	/* KEY_Delete */	0x60,	/* KEY_KP_Enter */
-	0x61,	/* KEY_RCtrl */		0x77,	/* KEY_Pause */
-	0x63,	/* KEY_Print */		0x62,	/* KEY_KP_Divide */
-	0x64,	/* KEY_AltLang */	0x65,	/* KEY_Break */
-	0x00,	/* KEY_LMeta */		0x00,	/* KEY_RMeta */
-	0x7A,	/* KEY_Menu/FOCUS_PF11*/0x00,	/* 0x6e */
-	0x7B,	/* FOCUS_PF12 */	0x00,	/* 0x70 */
-	0x00,	/* 0x71 */		0x00,	/* 0x72 */
-	0x59,	/* FOCUS_PF2 */		0x78,	/* FOCUS_PF9 */
-	0x00,	/* 0x75 */		0x00,	/* 0x76 */
-	0x5A,	/* FOCUS_PF3 */		0x5B,	/* FOCUS_PF4 */
-	0x5C,	/* FOCUS_PF5 */		0x5D,	/* FOCUS_PF6 */
-	0x5E,	/* FOCUS_PF7 */		0x5F,	/* FOCUS_PF8 */
-	0x7C,	/* JAP_86 */		0x79,	/* FOCUS_PF10 */
-	0x00,	/* 0x7f */
-};
-#define NUM_AT2LNX (sizeof(at2lnx) / sizeof(at2lnx[0]))
-
-#define NUM_CUSTOMKEYS	NR_KEYS
-
-static void
-readKernelMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  KeySym        *k;
-  int           i;
-  int           maxkey;
-  static unsigned char tbl[GLYPHS_PER_KEY] =
-  {
-	0,	/* unshifted */
-	1,	/* shifted */
-	0,	/* modeswitch unshifted */
-	0	/* modeswitch shifted */
-  };
-
-  /*
-   * Read the mapping from the kernel.
-   * Since we're still using the XFree86 scancode->AT keycode mapping
-   * routines, we need to convert the AT keycodes to Linux keycodes,
-   * then translate the Linux keysyms into X keysyms.
-   *
-   * First, figure out which tables to use for the modeswitch columns
-   * above, from the XF86Config fields.
-   */
-  tbl[2] = 8;	/* alt */
-  tbl[3] = tbl[2] | 1;
-
-  if (pKbd->CustomKeycodes) {
-    k = map;
-    maxkey = NUM_CUSTOMKEYS;
-  }
-  else {
-    k = map+GLYPHS_PER_KEY;
-    maxkey = NUM_AT2LNX;
-  }
-
-  for (i = 0; i < maxkey; ++i)
-  {
-    struct kbentry kbe;
-    int j;
-
-    if (pKbd->CustomKeycodes)
-      kbe.kb_index = i;
-    else
-      kbe.kb_index = at2lnx[i];
-
-    for (j = 0; j < GLYPHS_PER_KEY; ++j, ++k)
-    {
-      unsigned short kval;
-
-      *k = NoSymbol;
-
-      kbe.kb_table = tbl[j];
-      if (
-	  (!pKbd->CustomKeycodes && kbe.kb_index == 0) ||
-	  ioctl(pInfo->fd, KDGKBENT, &kbe))
-	continue;
-
-      kval = KVAL(kbe.kb_value);
-      switch (KTYP(kbe.kb_value))
-      {
-      case KT_LATIN:
-      case KT_LETTER:
-	*k = linux_to_x[kval];
-	break;
-
-      case KT_FN:
-	if (kval <= 19)
-	  *k = XK_F1 + kval;
-	else switch (kbe.kb_value)
-	{
-	case K_FIND:
-	  *k = XK_Home; /* or XK_Find */
-	  break;
-	case K_INSERT:
-	  *k = XK_Insert;
-	  break;
-	case K_REMOVE:
-	  *k = XK_Delete;
-	  break;
-	case K_SELECT:
-	  *k = XK_End; /* or XK_Select */
-	  break;
-	case K_PGUP:
-	  *k = XK_Prior;
-	  break;
-	case K_PGDN:
-	  *k = XK_Next;
-	  break;
-	case K_HELP:
-	  *k = XK_Help;
-	  break;
-	case K_DO:
-	  *k = XK_Execute;
-	  break;
-	case K_PAUSE:
-	  *k = XK_Pause;
-	  break;
-	case K_MACRO:
-	  *k = XK_Menu;
-	  break;
-	default:
-	  break;
-	}
-	break;
-
-      case KT_SPEC:
-	switch (kbe.kb_value)
-	{
-	case K_ENTER:
-	  *k = XK_Return;
-	  break;
-	case K_BREAK:
-	  *k = XK_Break;
-	  break;
-	case K_CAPS:
-	  *k = XK_Caps_Lock;
-	  break;
-	case K_NUM:
-	  *k = XK_Num_Lock;
-	  break;
-	case K_HOLD:
-	  *k = XK_Scroll_Lock;
-	  break;
-	case K_COMPOSE:
-          *k = XK_Multi_key;
-	  break;
-	default:
-	  break;
-	}
-	break;
-
-      case KT_PAD:
-	switch (kbe.kb_value)
-	{
-	case K_PPLUS:
-	  *k = XK_KP_Add;
-	  break;
-	case K_PMINUS:
-	  *k = XK_KP_Subtract;
-	  break;
-	case K_PSTAR:
-	  *k = XK_KP_Multiply;
-	  break;
-	case K_PSLASH:
-	  *k = XK_KP_Divide;
-	  break;
-	case K_PENTER:
-	  *k = XK_KP_Enter;
-	  break;
-	case K_PCOMMA:
-	  *k = XK_KP_Separator;
-	  break;
-	case K_PDOT:
-	  *k = XK_KP_Decimal;
-	  break;
-	case K_PPLUSMINUS:
-	  *k = XK_KP_Subtract;
-	  break;
-	default:
-	  if (kval <= 9)
-	    *k = XK_KP_0 + kval;
-	  break;
-	}
-	break;
-
-      /*
-       * KT_DEAD keys are for accelerated diacritical creation.
-       */
-      case KT_DEAD:
-	switch (kbe.kb_value)
-	  {
-	  case K_DGRAVE:
-	    *k = XK_dead_grave;
-	    break;
-	  case K_DACUTE:
-	    *k = XK_dead_acute;
-	    break;
-	  case K_DCIRCM:
-	    *k = XK_dead_circumflex;
-	    break;
-	  case K_DTILDE:
-	    *k = XK_dead_tilde;
-	    break;
-	  case K_DDIERE:
-	    *k = XK_dead_diaeresis;
-	    break;
-	  }
-	break;
-
-      case KT_CUR:
-	switch (kbe.kb_value)
-	{
-	case K_DOWN:
-	  *k = XK_Down;
-	  break;
-	case K_LEFT:
-	  *k = XK_Left;
-	  break;
-	case K_RIGHT:
-	  *k = XK_Right;
-	  break;
-	case K_UP:
-	  *k = XK_Up;
-	  break;
-	}
-	break;
-
-      case KT_SHIFT:
-	switch (kbe.kb_value)
-	{
-	case K_ALTGR:
-	  *k = XK_Alt_R;
-	  break;
-	case K_ALT:
-	  *k = (kbe.kb_index == 0x64 ?
-		XK_Alt_R : XK_Alt_L);
-	  break;
-	case K_CTRL:
-	  *k = (kbe.kb_index == 0x61 ?
-		XK_Control_R : XK_Control_L);
-	  break;
-        case K_CTRLL:
-	  *k = XK_Control_L;
-	  break;
-        case K_CTRLR:
-	  *k = XK_Control_R;
-	  break;
-	case K_SHIFT:
-	  *k = (kbe.kb_index == 0x36 ?
-		XK_Shift_R : XK_Shift_L);
-	  break;
-        case K_SHIFTL:
-	  *k = XK_Shift_L;
-	  break;
-        case K_SHIFTR:
-	  *k = XK_Shift_R;
-	  break;
-	default:
-	  break;
-	}
-	break;
-
-      /*
-       * KT_ASCII keys accumulate a 3 digit decimal number that gets
-       * emitted when the shift state changes. We can't emulate that.
-       */
-      case KT_ASCII:
-	break;
-
-      case KT_LOCK:
-	if (kbe.kb_value == K_SHIFTLOCK)
-	  *k = XK_Shift_Lock;
-	break;
-
-      default:
-	break;
-      }
-    }
-
-    if (k[-1] == k[-2]) k[-1] = NoSymbol;
-    if (k[-2] == k[-3]) k[-2] = NoSymbol;
-    if (k[-3] == k[-4]) k[-3] = NoSymbol;
-    if (k[-4] == k[-2] && k[-3] == k[-1]) k[-2] = k[-1] = NoSymbol;
-    if (k[-1] == k[-4] && k[-2] == k[-3] && k[-2] == NoSymbol) k[-1] =NoSymbol;
-  }
-
-  if (!pKbd->CustomKeycodes)
-    return;
-
-  /*
-   * Find the Mapping for the special server functions
-   */
-  pKbd->specialMap = (TransMapPtr) xcalloc(NUM_CUSTOMKEYS, 1);
-  if (pKbd->specialMap != NULL) {
-      pKbd->specialMap->end = NUM_CUSTOMKEYS;
-      pKbd->specialMap->map = (unsigned char*) xcalloc(NUM_CUSTOMKEYS, 1);
-      if (pKbd->specialMap == NULL) {
-      	  xfree(pKbd->specialMap);
-      	  pKbd->specialMap = NULL;
-      }
-  }
-  if (pKbd->specialMap == NULL) {
-      xf86Msg(X_ERROR, "%s can't allocate \"special map\"\n", pInfo->name);
-      return;
-  }
-
-  for (i = 0; i < NUM_CUSTOMKEYS; ++i) {
-    struct kbentry kbe;
-    int special = 0;
-
-    kbe.kb_index = i;
-    kbe.kb_table = 0; /* Plain map */
-    if (!ioctl(pInfo->fd, KDGKBENT, &kbe))
-      switch (kbe.kb_value) {
-	case K(KT_LATIN,0x7f):	/* This catches DEL too... But who cares? */
-	  special = KEY_BackSpace;
-	  break;
-	case K_PMINUS:
-	  special = KEY_KP_Minus;
-	  break;
-	case K_PPLUS:
-	  special = KEY_KP_Plus;
-	  break;
-	case K_F1:
-	  special = KEY_F1;
-	  break;
-	case K_F2:
-	  special = KEY_F2;
-	  break;
-	case K_F3:
-	  special = KEY_F3;
-	  break;
-	case K_F4:
-	  special = KEY_F4;
-	  break;
-	case K_F5:
-	  special = KEY_F5;
-	  break;
-	case K_F6:
-	  special = KEY_F6;
-	  break;
-	case K_F7:
-	  special = KEY_F7;
-	  break;
-	case K_F8:
-	  special = KEY_F8;
-	  break;
-	case K_F9:
-	  special = KEY_F9;
-	  break;
-	case K_F10:
-	  special = KEY_F10;
-	  break;
-	case K_F11:
-	  special = KEY_F11;
-	  break;
-	case K_F12:
-	  special = KEY_F12;
-	  break;
-	case K_ALT:
-	  special = KEY_Alt;
-	  break;
-	case K_ALTGR:
-	  special = KEY_AltLang;
-	  break;
-	case K_CONS:
-	  special = KEY_SysReqest;
-	  break;
-      }
-    pKbd->specialMap->map[i] = special;
-  }
-}
diff --git a/hw/xfree86/os-support/linux/lnx_kbd.c b/hw/xfree86/os-support/linux/lnx_kbd.c
deleted file mode 100644
index a4890d2..0000000
--- a/hw/xfree86/os-support/linux/lnx_kbd.c
+++ /dev/null
@@ -1,530 +0,0 @@
-
-/*
- * Copyright (c) 2002 by The XFree86 Project, Inc.
- * Author: Ivan Pascal.
- *
- * Based on the code from lnx_io.c which is
- * Copyright 1992 by Orest Zborowski <obz at Kodak.com>
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- */
-
-#define NEED_EVENTS
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-#if defined(DO_OS_FONTRESTORE)
-#include "lnx.h"
-#endif
-#include "lnx_kbd.h"
-
-#define KBC_TIMEOUT 250        /* Timeout in ms for sending to keyboard controller */
-
-static KbdProtocolRec protocols[] = {
-   {"standard", PROT_STD },
-   { NULL, PROT_UNKNOWN_KBD }
-};
-
-extern Bool VTSwitchEnabled;
-#ifdef USE_VT_SYSREQ
-extern Bool VTSysreqToggle;
-#endif
-
-static void
-SoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
-{
-	if (loudness && pitch)
-	{
-		ioctl(pInfo->fd, KDMKTONE,
-		      ((1193190 / pitch) & 0xffff) |
-		      (((unsigned long)duration *
-			loudness / 50) << 16));
-	}
-}
-
-static void
-SetKbdLeds(InputInfoPtr pInfo, int leds)
-{
-    int real_leds = 0;
-
-#if defined (__sparc__)
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    if (pKbd->sunKbd) {
-  	if (leds & 0x08) real_leds |= XLED1;
-  	if (leds & 0x04) real_leds |= XLED3;
-  	if (leds & 0x02) real_leds |= XLED4;
-  	if (leds & 0x01) real_leds |= XLED2;
-        leds = real_leds;
-        real_leds = 0;
-    }
-#endif /* defined (__sparc__) */
-#ifdef LED_CAP
-    if (leds & XLED1)  real_leds |= LED_CAP;
-    if (leds & XLED2)  real_leds |= LED_NUM;
-    if (leds & XLED3)  real_leds |= LED_SCR;
-#ifdef LED_COMP
-    if (leds & XLED4)  real_leds |= LED_COMP;
-#else
-    if (leds & XLED4)  real_leds |= LED_SCR;
-#endif
-#endif
-    ioctl(pInfo->fd, KDSETLED, real_leds);
-}
-
-static int
-GetKbdLeds(InputInfoPtr pInfo)
-{
-    int real_leds, leds = 0;
-
-    ioctl(pInfo->fd, KDGETLED, &real_leds);
-
-    if (real_leds & LED_CAP) leds |= XLED1;
-    if (real_leds & LED_NUM) leds |= XLED2;
-    if (real_leds & LED_SCR) leds |= XLED3;
-
-    return(leds);
-}
-
-static int
-KDKBDREP_ioctl_ok(int rate, int delay) {
-#if defined(KDKBDREP) && !defined(__sparc__)
-     /* This ioctl is defined in <linux/kd.h> but is not
-	implemented anywhere - must be in some m68k patches. */
-   struct kbd_repeat kbdrep_s;
-
-   /* don't change, just test */
-   kbdrep_s.LNX_KBD_PERIOD_NAME = -1;
-   kbdrep_s.delay = -1;
-   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
-       return 0;
-   }
-
-   /* do the change */
-   if (rate == 0)				/* switch repeat off */
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 0;
-   else
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 10000 / rate; /* convert cps to msec */
-   if (kbdrep_s.LNX_KBD_PERIOD_NAME < 1)
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 1;
-   kbdrep_s.delay = delay;
-   if (kbdrep_s.delay < 1)
-     kbdrep_s.delay = 1;
-   
-   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
-       return 0;
-   }
-
-   return 1;			/* success! */
-#else /* no KDKBDREP */
-   return 0;
-#endif /* KDKBDREP */
-}
-
-static int
-KIOCSRATE_ioctl_ok(int rate, int delay) {
-#ifdef KIOCSRATE
-   struct kbd_rate kbdrate_s;
-   int fd;
-
-   fd = open("/dev/kbd", O_RDONLY);
-   if (fd == -1) 
-     return 0;   
-
-   kbdrate_s.rate = (rate + 5) / 10;  /* must be integer, so round up */
-   kbdrate_s.delay = delay * HZ / 1000;  /* convert ms to Hz */
-   if (kbdrate_s.rate > 50)
-     kbdrate_s.rate = 50;
-
-   if (ioctl( fd, KIOCSRATE, &kbdrate_s )) {
-       return 0;
-   }
-
-   close( fd );
-
-   return 1;
-#else /* no KIOCSRATE */
-   return 0;
-#endif /* KIOCSRATE */
-}
-
-#undef rate
-
-static void
-SetKbdRepeat(InputInfoPtr pInfo, char rad)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  int i;
-  int timeout;
-  int         value = 0x7f;    /* Maximum delay with slowest rate */
-
-#ifdef __sparc__
-  int         rate  = 500;     /* Default rate */
-  int         delay = 200;     /* Default delay */
-#else
-  int         rate  = 300;     /* Default rate */
-  int         delay = 250;     /* Default delay */
-#endif
-
-  static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
-			       133, 120, 109, 100, 92, 86, 80, 75, 67,
-			       60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
-			       25, 23, 21, 20 };
-#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
-
-  static int valid_delays[] = { 250, 500, 750, 1000 };
-#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
-
-  if (pKbd->rate >= 0) 
-    rate = pKbd->rate * 10;
-  if (pKbd->delay >= 0)
-    delay = pKbd->delay;
-
-  if(KDKBDREP_ioctl_ok(rate, delay)) 	/* m68k? */
-    return;
-
-  if(KIOCSRATE_ioctl_ok(rate, delay))	/* sparc? */
-    return;
-
-  if (xf86IsPc98())
-    return;
-
-#if defined(__alpha__) || defined (__i386__) || defined(__ia64__)
-
-  if (!xorgHWAccess) {
-      if (xf86EnableIO())
-	  xorgHWAccess = TRUE;
-      else 
-	  return;
-  }
-      
-  /* The ioport way */
-
-  for (i = 0; i < RATE_COUNT; i++)
-    if (rate >= valid_rates[i]) {
-      value &= 0x60;
-      value |= i;
-      break;
-    }
-
-  for (i = 0; i < DELAY_COUNT; i++)
-    if (delay <= valid_delays[i]) {
-      value &= 0x1f;
-      value |= i << 5;
-      break;
-    }
-
-  timeout = KBC_TIMEOUT;
-  while (((inb(0x64) & 2) == 2) && --timeout)
-       usleep(1000); /* wait */
-
-  if (timeout == 0)
-      return;
-
-  outb(0x60, 0xf3);             /* set typematic rate */
-  while (((inb(0x64) & 2) == 2) && --timeout)
-       usleep(1000); /* wait */
-
-  usleep(10000);
-  outb(0x60, value);
-
-#endif /* __alpha__ || __i386__ || __ia64__ */
-}
-
-typedef struct {
-   int kbdtrans;
-   struct termios kbdtty;
-} LnxKbdPrivRec, *LnxKbdPrivPtr;
-
-static int
-KbdInit(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    LnxKbdPrivPtr priv = (LnxKbdPrivPtr) pKbd->private;
-
-    if (pKbd->isConsole) {
-        ioctl (pInfo->fd, KDGKBMODE, &(priv->kbdtrans));
-        tcgetattr (pInfo->fd, &(priv->kbdtty));
-    }
-    if (!pKbd->CustomKeycodes) {
-        pKbd->RemapScanCode = ATScancode;
-    }
-
-    return Success;
-}
-
-static int
-KbdOn(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    LnxKbdPrivPtr priv = (LnxKbdPrivPtr) pKbd->private;
-    struct termios nTty;
-
-    if (pKbd->isConsole) {
-	if (pKbd->CustomKeycodes)
-	    ioctl(pInfo->fd, KDSKBMODE, K_MEDIUMRAW);
-	else
-	    ioctl(pInfo->fd, KDSKBMODE, K_RAW);
-
-	nTty = priv->kbdtty;
-	nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-	nTty.c_oflag = 0;
-	nTty.c_cflag = CREAD | CS8;
-	nTty.c_lflag = 0;
-	nTty.c_cc[VTIME]=0;
-	nTty.c_cc[VMIN]=1;
-	cfsetispeed(&nTty, 9600);
-	cfsetospeed(&nTty, 9600);
-	tcsetattr(pInfo->fd, TCSANOW, &nTty);
-    }
-    return Success;
-}
-
-static int
-KbdOff(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    LnxKbdPrivPtr priv = (LnxKbdPrivPtr) pKbd->private;
-
-    if (pKbd->isConsole) {
-	ioctl(pInfo->fd, KDSKBMODE, priv->kbdtrans);
-	tcsetattr(pInfo->fd, TCSANOW, &(priv->kbdtty));
-    }
-    return Success;
-}
-
-static int
-GetSpecialKey(InputInfoPtr pInfo, int scanCode)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  int specialkey = scanCode;
-
-#if defined (__sparc__)
-  if (pKbd->sunKbd) {
-      switch (scanCode) {
-          case 0x2b: specialkey = KEY_BackSpace; break;
-          case 0x47: specialkey = KEY_KP_Minus; break;
-          case 0x7d: specialkey = KEY_KP_Plus; break;
-          /* XXX needs cases for KEY_KP_Divide and KEY_KP_Multiply */
-          case 0x05: specialkey = KEY_F1; break;
-          case 0x06: specialkey = KEY_F2; break;
-          case 0x08: specialkey = KEY_F3; break;
-          case 0x0a: specialkey = KEY_F4; break;
-          case 0x0c: specialkey = KEY_F5; break;
-          case 0x0e: specialkey = KEY_F6; break;
-          case 0x10: specialkey = KEY_F7; break;
-          case 0x11: specialkey = KEY_F8; break;
-          case 0x12: specialkey = KEY_F9; break;
-          case 0x07: specialkey = KEY_F10; break;
-          case 0x09: specialkey = KEY_F11; break;
-          case 0x0b: specialkey = KEY_F12; break;
-          default: specialkey = 0; break;
-      }
-      return specialkey;
-  }
-#endif
-
-  if (pKbd->CustomKeycodes) {
-      specialkey = pKbd->specialMap->map[scanCode];
-  }
-  return specialkey;
-}
-
-#define ModifierSet(k) ((modifiers & (k)) == (k))
-
-static
-Bool SpecialKey(InputInfoPtr pInfo, int key, Bool down, int modifiers)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-
-  if(!pKbd->vtSwitchSupported)
-      return FALSE;
-
-  if ((ModifierSet(ControlMask | AltMask)) ||
-      (ModifierSet(ControlMask | AltLangMask))) {
-      if (VTSwitchEnabled && !xf86Info.vtSysreq && !xf86Info.dontVTSwitch) {
-          switch (key) {
-             case KEY_F1:
-             case KEY_F2:
-             case KEY_F3:
-             case KEY_F4:
-             case KEY_F5:
-             case KEY_F6:
-             case KEY_F7:
-             case KEY_F8:
-             case KEY_F9:
-             case KEY_F10:
-                  if (down) {
-                    ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F1 + 1);
-                    return TRUE;
-                  }
-             case KEY_F11:
-             case KEY_F12:
-                  if (down) {
-                    ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F11 + 11);
-                    return TRUE;
-                  }
-         }
-      }
-  }
-#ifdef USE_VT_SYSREQ
-    if (VTSwitchEnabled && xf86Info.vtSysreq && !xf86Info.dontVTSwitch) {
-        switch (key) {
-            case KEY_F1:
-            case KEY_F2:
-            case KEY_F3:
-            case KEY_F4:
-            case KEY_F5:
-            case KEY_F6:
-            case KEY_F7:
-            case KEY_F8:
-            case KEY_F9:
-            case KEY_F10:
-                 if (VTSysreqToggle && down) {
-                     ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F1 + 1);
-                     VTSysreqToggle = FALSE;
-                     return TRUE;
-                 }
-                 break;
-            case KEY_F11:
-            case KEY_F12:
-                 if (VTSysreqToggle && down) {
-                     ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F11 + 11);
-                     VTSysreqToggle = FALSE;
-                     return TRUE;
-                 }
-                 break;
-            /* Ignore these keys -- ie don't let them cancel an alt-sysreq */
-            case KEY_Alt:
-            case KEY_AltLang:
-                 break;
-            case KEY_SysReqest:
-                 if ((ModifierSet(AltMask) || ModifierSet(AltLangMask)) && down)
-                     VTSysreqToggle = TRUE;
-                 break;
-             default:
-                 /*
-                  * We only land here when Alt-SysReq is followed by a
-                  * non-switching key.
-                  */
-                 if (VTSysreqToggle)
-                     VTSysreqToggle = FALSE;
-        }
-    }
-#endif /* USE_VT_SYSREQ */
-    return FALSE;
-} 
-
-static void
-stdReadInput(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    unsigned char rBuf[64];
-    int nBytes, i;
-    if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(rBuf))) > 0) {
-       for (i = 0; i < nBytes; i++)
-           pKbd->PostEvent(pInfo, rBuf[i] & 0x7f,
-                           rBuf[i] & 0x80 ? FALSE : TRUE);
-       }
-}
-
-static Bool
-OpenKeyboard(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    int i;
-    KbdProtocolId prot = PROT_UNKNOWN_KBD;
-    char *s;
-
-    s = xf86SetStrOption(pInfo->options, "Protocol", NULL);
-    for (i = 0; protocols[i].name; i++) {
-        if (xf86NameCmp(s, protocols[i].name) == 0) {
-           prot = protocols[i].id;
-           break;
-        }
-    }
-
-    switch (prot) {
-        case PROT_STD:
-           pInfo->read_input = stdReadInput;
-           break;
-        default:
-           xf86Msg(X_ERROR,"\"%s\" is not a valid keyboard protocol name\n", s);
-           xfree(s);
-           return FALSE;
-    }
-
-    xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, s);
-    xfree(s);
-
-    s = xf86SetStrOption(pInfo->options, "Device", NULL);
-    if (s == NULL) {
-       pInfo->fd = xf86Info.consoleFd;
-       pKbd->isConsole = TRUE;
-    } else {
-       pInfo->fd = open(s, O_RDONLY | O_NONBLOCK | O_EXCL);
-       if (pInfo->fd == -1) {
-           xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", pInfo->name, s);
-           xfree(s);
-           return FALSE;
-       }
-       pKbd->isConsole = FALSE;
-       xfree(s);
-    }
-
-    if (pKbd->isConsole)
-         pKbd->vtSwitchSupported = TRUE;
-
-    return TRUE;
-}
-
-_X_EXPORT Bool
-xf86OSKbdPreInit(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = pInfo->private;
-
-    pKbd->KbdInit       = KbdInit;
-    pKbd->KbdOn         = KbdOn;
-    pKbd->KbdOff        = KbdOff;
-    pKbd->Bell          = SoundBell;
-    pKbd->SetLeds       = SetKbdLeds;
-    pKbd->GetLeds       = GetKbdLeds;
-    pKbd->SetKbdRepeat  = SetKbdRepeat;
-    pKbd->KbdGetMapping = KbdGetMapping;
-    pKbd->SpecialKey    = SpecialKey;
-
-    pKbd->RemapScanCode = NULL;
-    pKbd->GetSpecialKey = GetSpecialKey;
-
-    pKbd->OpenKeyboard = OpenKeyboard;
-    pKbd->vtSwitchSupported = FALSE;
-
-    pKbd->private = xcalloc(sizeof(LnxKbdPrivRec), 1);
-    if (pKbd->private == NULL) {
-       xf86Msg(X_ERROR,"can't allocate keyboard OS private data\n");
-       return FALSE;
-    }
-
-#if defined(__powerpc__)
-  {
-    FILE *f;
-    f = fopen("/proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes","r");
-    if (f) {
-        if (fgetc(f) == '0')
-            pKbd->CustomKeycodes = TRUE;
-        fclose(f);
-    }
-  }
-#endif
-    return TRUE;
-}
diff --git a/hw/xfree86/os-support/lynxos/lynx_io.c b/hw/xfree86/os-support/lynxos/lynx_io.c
deleted file mode 100644
index 8181046..0000000
--- a/hw/xfree86/os-support/lynxos/lynx_io.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright 1993 by Thomas Mueller
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Mueller not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Mueller makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS MUELLER DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS MUELLER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-#if defined(KDMKTONE) || defined(KIOCSOUND)
-/* Lynx 2.2.1 has sophisticated atc stuff.... */
-_X_EXPORT void
-xf86SoundKbdBell(int loudness, int pitch, int duration)
-{
-	if (loudness && pitch)
-	{
-#ifdef KDMKTONE
-		/*
-		 * If we have KDMKTONE use it to avoid putting the server
-		 * to sleep
-		 */
-		ioctl(xf86Info.consoleFd, KDMKTONE,
-		      (pitch & 0xffff) |
-		      (((unsigned long)duration *
-			loudness / 50) << 16));
-#else
-		ioctl(xf86Info.consoleFd, KIOCSOUND, pitch);
-		usleep(xf86Info.bell_duration * loudness * 20);
-		ioctl(xf86Info.consoleFd, KIOCSOUND, 0);
-#endif
-	}
-}
-
-#else
-
-/* this is pulled from /sys/drivers/vt100/atbeep.c */
-
-#define	SPEAKER_CONTROL	0x61
-#define	TIMER_CONTROL	0x43
-#define	TIMER_DATA	0x42
-#define	TIMER_LOAD_CMD	0xb6
-
-#define	TIMER_CONSTANT	1193280
-#define	FREQ_LO(f)	((TIMER_CONSTANT / (f)) % 256)
-#define	FREQ_HI(f)	((TIMER_CONSTANT / (f)) / 256)
-
-void
-xf86SoundKbdBell(int loudness, int pitch, int duration)
-{
-	int	flo = FREQ_LO(pitch);
-	int	fhi = FREQ_HI(pitch);
-
-	outb(TIMER_CONTROL, TIMER_LOAD_CMD);
-	outb(TIMER_DATA, flo);
-	outb(TIMER_DATA, fhi);
-
-	/* speaker on */
-	outb(SPEAKER_CONTROL, inb(SPEAKER_CONTROL) | 3);
-	usleep(xf86Info.bell_duration * loudness * 20);
-	/* speaker off */
-	outb(SPEAKER_CONTROL, inb(SPEAKER_CONTROL) & ~3);
-}
-#endif
-
-void
-xf86SetKbdLeds(int leds)
-{
-#ifdef KBD_SET_LEDS
-	ioctl(xf86Info.consoleFd, KBD_SET_LEDS, &leds);
-#endif
-}
-
-int
-xf86GetKbdLeds()
-{
-#ifdef KBD_SET_LEDS
-	int leds;
-
-	if (ioctl(xf86Info.consoleFd, KBD_SET_LEDS, &leds) < 0)
-		return 0;
-
-	return leds;
-#endif
-	return 0;
-}
-
-void
-xf86SetKbdRepeat(char rad)
-{
-}
-
-static struct termio kbdtty;
-
-void
-xf86KbdInit()
-{
-	ioctl(xf86Info.consoleFd, TCGETA, &kbdtty);
-}
-
-int
-xf86KbdOn()
-{
-	struct termio nTty;
-
-	/* set CAPS_LOCK to behave as CAPS_LOCK not as CTRL */
-	write(xf86Info.consoleFd, "\033<", 2);
-
-	/* enable scan mode */
-	ioctl(xf86Info.consoleFd, TIO_ENSCANMODE, NULL);
-
-	nTty = kbdtty;
-	nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-	nTty.c_oflag = 0;
-	nTty.c_cflag = CREAD | CS8;
-	nTty.c_lflag = 0;
-	nTty.c_cc[VTIME]=0;
-	nTty.c_cc[VMIN]=1;
-	ioctl(xf86Info.consoleFd, TCSETA, &nTty);
-
-	return(xf86Info.consoleFd);
-}
-
-int
-xf86KbdOff()
-{
-	/* disable scan mode */
-	ioctl(xf86Info.consoleFd, TIO_DISSCANMODE, NULL);
-	ioctl(xf86Info.consoleFd, TCSETA, &kbdtty);
-	return(xf86Info.consoleFd);
-}
-
-#include "xf86OSKbd.h"
-
-_X_EXPORT Bool
-xf86OSKbdPreInit(InputInfoPtr pInfo)
-{
-    return FALSE;
-}
diff --git a/hw/xfree86/os-support/sco/Makefile.am b/hw/xfree86/os-support/sco/Makefile.am
index 1271c9d..820d183 100644
--- a/hw/xfree86/os-support/sco/Makefile.am
+++ b/hw/xfree86/os-support/sco/Makefile.am
@@ -4,7 +4,5 @@ EXTRA_DIST = \
 	sco_init.c \
 	sco_io.c \
 	sco_iop.c \
-	sco_kbd.c \
-	sco_kbd.h \
 	sco_mouse.c \
 	sco_video.c
diff --git a/hw/xfree86/os-support/sco/sco_KbdMap.c b/hw/xfree86/os-support/sco/sco_KbdMap.c
deleted file mode 100644
index 6a0e9de..0000000
--- a/hw/xfree86/os-support/sco/sco_KbdMap.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* $XFree86$ */
-/*
- * Copyright 2005 by J. Kean Johnston <jkj at sco.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name J. Kean Johnston not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  J. Kean Johnston makes no
- * representations about the suitability of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- *
- * J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL J. KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * Based on xf86KbdMap.c, which is
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- * Copyright (c) 1992-2003 by The XFree86 Project, Inc.
- */
-
-#include "X.h"
-#include "Xmd.h"
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-#include "xf86Keymap.h"
-
-#include "sco_kbd.h"
-
-#define KD_GET_ENTRY(i,n) \
-  eascii_to_x[((priv->keymap.key[i].spcl << (n+1)) & 0x100) + priv->keymap.key[i].map[n]]
-
-/*
- * NOTE: Not all possible remappable symbols are remapped. There are two main
- *       reasons:
- *                 a) The mapping between scancode and SYSV/386 - symboltable
- *                    is inconsistent between different versions and has some
- *                    BIG mistakes.
- *                 b) In X-Windows there is a difference between numpad-keys
- *                    and normal keys. SYSV/386 uses for both kinds of keys
- *                    the same symbol.
- *
- *       Thus only the alpha keypad and the function keys are translated.
- *       Also CapsLock, NumLock, ScrollLock, Shift, Control & Alt.
- */
-
-static unsigned char remap[128] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-static KeySym eascii_to_x[512] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
-	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
-	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
-	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
-	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
-	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
-	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
-	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
-	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
-	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
-	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
-	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
-	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
-	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
-	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
-	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
-	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
-	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
-	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
-
-	/* 
-	 * special marked entries (256 + x)
-	 */
-
-	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
-	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
-	NoSymbol,	XK_Control_L,	XK_Alt_L,	XK_Alt_R,
-	XK_Control_L,	XK_Control_R,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
-	XK_F2,		XK_F3,		XK_F4,		XK_F5,
-	XK_F6,		XK_F7,		XK_F8,		XK_F9,
-	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-      };
-
-/*
- * KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-void
-KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  ScoKbdPrivPtr priv = (ScoKbdPrivPtr) pKbd->private;
-  KeySym *k;
-  int i;
-  KeySym *pMap = map;
-
-  for (i = 0; i < priv->keymap.n_keys && i < NUM_KEYCODES; i++) {
-    if (remap[i]) {
-      k = pMap + (remap[i] << 2);
-	
-      k[0] = KD_GET_ENTRY(i,0);       /* non-shifed */
-      k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
-      k[2] = KD_GET_ENTRY(i,4);	      /* alt */
-      k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
-
-      if (k[3] == k[2]) k[3] = NoSymbol;
-      if (k[2] == k[1]) k[2] = NoSymbol;
-      if (k[1] == k[0]) k[1] = NoSymbol;
-      if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
-    }
-  }
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = pMap, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += GLYPHS_PER_KEY) {
-    
-    switch(*k) {
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-    }
-  }
-
-  pKeySyms->map        = pMap;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE;
-}
diff --git a/hw/xfree86/os-support/sco/sco_kbd.c b/hw/xfree86/os-support/sco/sco_kbd.c
deleted file mode 100644
index 8b1d5b7..0000000
--- a/hw/xfree86/os-support/sco/sco_kbd.c
+++ /dev/null
@@ -1,530 +0,0 @@
-/* $XFree86$ */
-/*
- * Copyright 2005 by J. Kean Johnston <jkj at sco.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name J. Kean Johnston not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  J. Kean Johnston makes no
- * representations about the suitability of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- *
- * J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL J. KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/* $XConsortium$ */
-
-/*
- * Based on sco_io.c which is
- * (C) Copyright 2003 J. Kean Johnston <jkj at sco.com>
- *
- * Based on lnx_kbd.c which is 
- * Copyright (c) 2002 by The XFree86 Project, Inc.
- *
- * Based on the code from lnx_io.c which is
- * Copyright 1992 by Orest Zborowski <obz at Kodak.com>
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- */
-
-#define NEED_EVENTS
-#include "X.h"
-
-#include "compiler.h"
-
-#define _NEED_SYSI86
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86OSpriv.h"
-#include "xf86_OSlib.h"
-
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-#include "sco_kbd.h"
-
-#include <sys/param.h>
-#include <sys/emap.h>
-#include <sys/nmap.h>
-
-static KbdProtocolRec protocols[] = {
-  { "standard", PROT_STD },
-  { NULL, PROT_UNKNOWN_KBD }
-};
-
-extern Bool VTSwitchEnabled;
-#ifdef USE_VT_SYSREQ
-extern Bool VTSysreqToggle;
-#endif
-
-static void
-SoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
-{
-  if (loudness && pitch) {
-    ioctl(pInfo->fd, KIOCSOUND, 1193180 / pitch);
-    usleep(duration * loudness * 20);
-    ioctl(pInfo->fd, KIOCSOUND, 0);
-  }
-}
-
-static void
-SetKbdLeds(InputInfoPtr pInfo, int leds)
-{
-  int real_leds = 0;
-  static int once = 1;
-
-  /*
-   * sleep the first time through under SCO.  There appears to be a
-   * timing problem in the driver which causes the keyboard to be lost.
-   * This usleep stops it from occurring. NOTE: this was in the old code.
-   * I am not convinced it is true any longer, but it doesn't hurt to
-   * leave this in here.
-   */
-  if (once) {
-    usleep(100);
-    once = 0;
-  }
-
-#ifdef LED_CAP
-  if (leds & XLED1)
-    real_leds |= LED_CAP;
-  if (leds & XLED2)
-    real_leds |= LED_NUM;
-  if (leds & XLED3)
-    real_leds |= LED_SCR;
-#ifdef LED_COMP
-  if (leds & XLED4)
-    real_leds |= LED_COMP;
-#else
-  if (leds & XLED4)
-    real_leds |= LED_SCR;
-#endif
-#endif
-  ioctl(pInfo->fd, KDSETLED, real_leds);
-}
-
-static int
-GetKbdLeds(InputInfoPtr pInfo)
-{
-    int real_leds, leds = 0;
-
-    ioctl(pInfo->fd, KDGETLED, &real_leds);
-
-    if (real_leds & LED_CAP) leds |= XLED1;
-    if (real_leds & LED_NUM) leds |= XLED2;
-    if (real_leds & LED_SCR) leds |= XLED3;
-
-    return(leds);
-}
-
-/*
- * NOTE: Only OpenServer Release 5.0.6 with Release Supplement 5.0.6A
- * and later have the required ioctl. 5.0.6A or higher is HIGHLY
- * recommended. The console driver is quite a different beast on that OS.
- */
-#undef rate
-
-static void
-SetKbdRepeat(InputInfoPtr pInfo, char rad)
-{
-#if defined(KBIO_SETRATE)
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  int i;
-  int value = 0x7f;     /* Maximum delay with slowest rate */
-  int delay = 250;      /* Default delay */
-  int rate = 300;       /* Default repeat rate */
-
-  static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
-                               133, 120, 109, 100, 92, 86, 80, 75, 67,
-                               60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
-                               25, 23, 21, 20 };
-#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
-
-  static int valid_delays[] = { 250, 500, 750, 1000 };
-#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
-
-  if (pKbd->rate >= 0) 
-    rate = pKbd->rate * 10;
-  if (pKbd->delay >= 0)
-    delay = pKbd->delay;
-
-  for (i = 0; i < RATE_COUNT; i++)
-    if (rate >= valid_rates[i]) {
-      value &= 0x60;
-      value |= i;
-      break;
-    }
-
-  for (i = 0; i < DELAY_COUNT; i++)
-    if (delay <= valid_delays[i]) {
-      value &= 0x1f;
-      value |= i << 5;
-      break;
-    }
-
-  ioctl (pInfo->fd, KBIO_SETRATE, value);
-#endif /* defined(KBIO_SETRATE) */
-}
-
-static int
-KbdInit(InputInfoPtr pInfo, int what)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  ScoKbdPrivPtr priv = (ScoKbdPrivPtr) pKbd->private;
-
-  if (pKbd->isConsole) {
-    priv->use_tcs = 1;
-    priv->use_kd = 1;
-    priv->no_nmap = 1;
-    priv->no_emap = 1;
-    priv->orig_getsc = 0;
-
-    if (ioctl (pInfo->fd, TCGETSC, &priv->orig_getsc) < 0)
-      priv->use_tcs = 0;
-    if (ioctl (pInfo->fd, KDGKBMODE, &priv->orig_kbm) < 0)
-      priv->use_kd = 0;
-
-    if (!priv->use_tcs && !priv->use_kd) {
-      xf86Msg (X_ERROR, "KbdInit: Could not determine keyboard mode\n");
-      return !Success;
-    }
-
-    /*
-     * One day this should be fixed to translate normal ASCII characters
-     * back into scancodes or into events that XFree86 wants, but not
-     * now. For the time being, we only support scancode mode screens.
-     */
-    if (priv->use_tcs && !(priv->orig_getsc & KB_ISSCANCODE)) {
-      xf86Msg (X_ERROR, "KbdInit: Keyboard can not send scancodes\n");
-      return !Success;
-    }
-
-    /*
-     * We need to get the original keyboard map and NUL out the lock
-     * modifiers. This prevents the scancode API from messing with
-     * the keyboard LED's. We restore the original map when we exit.
-     */
-    if (ioctl (pInfo->fd, GIO_KEYMAP, &priv->keymap) < 0) {
-      xf86Msg (X_ERROR, "KbdInit: Failed to get keyboard map (%s)\n",
-        strerror(errno));
-      return !Success;
-    }
-    if (ioctl (pInfo->fd, GIO_KEYMAP, &priv->noledmap) < 0) {
-      xf86Msg (X_ERROR, "KbdInit: Failed to get keyboard map (%s)\n",
-        strerror(errno));
-      return !Success;
-    } else {
-      int i, j;
-
-      for (i = 0; i < priv->noledmap.n_keys; i++) {
-        for (j = 0; j < NUM_STATES; j++) {
-          if (IS_SPECIAL(priv->noledmap, i, j) &&
-            ((priv->noledmap.key[i].map[j] == K_CLK) ||
-             (priv->noledmap.key[i].map[j] == K_NLK) ||
-             (priv->noledmap.key[i].map[j] == K_SLK))) {
-            priv->noledmap.key[i].map[j] = K_NOP;
-          }
-        }
-      }
-    }
-
-    if (ioctl (pInfo->fd, XCGETA, &priv->kbdtty) < 0) {
-      xf86Msg (X_ERROR, "KbdInit: Failed to get terminal modes (%s)\n",
-        strerror(errno));
-      return !Success;
-    }
-
-    priv->sc_mapbuf = xalloc (10*BSIZE);
-    priv->sc_mapbuf2 = xalloc(10*BSIZE);
-
-    /* Get the emap */
-    if (ioctl (pInfo->fd, LDGMAP, priv->sc_mapbuf) < 0) {
-      if (errno != ENAVAIL) {
-        xf86Msg (X_ERROR, "KbdInit: Failed to retrieve e-map (%s)\n",
-          strerror (errno));
-        return !Success;
-      }
-      priv->no_emap = 0;
-    }
-
-    /* Get the nmap */
-    if (ioctl (pInfo->fd, NMGMAP, priv->sc_mapbuf2) < 0) {
-      if (errno != ENAVAIL) {
-        xf86Msg (X_ERROR, "KbdInit: Failed to retrieve n-map (%s)\n",
-          strerror (errno));
-        return !Success;
-      }
-      priv->no_nmap = 0;
-    }
-  } /* End of if we are on a console */
-
-  return Success;
-}
-
-static int
-KbdOn(InputInfoPtr pInfo, int what)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  ScoKbdPrivPtr priv = (ScoKbdPrivPtr) pKbd->private;
-  struct termios newtio;
-
-  if (pKbd->isConsole) {
-    ioctl (pInfo->fd, LDNMAP); /* Turn e-mapping off */
-    ioctl (pInfo->fd, NMNMAP); /* Turn n-mapping off */
-
-    newtio = priv->kbdtty;     /* structure copy */
-    newtio.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-    newtio.c_oflag = 0;
-    newtio.c_cflag = CREAD | CS8 | B9600;
-    newtio.c_lflag = 0;
-    newtio.c_cc[VTIME]=0;
-    newtio.c_cc[VMIN]=1;
-    cfsetispeed(&newtio, 9600);
-    cfsetospeed(&newtio, 9600);
-    ioctl(pInfo->fd, XCSETA, &newtio);
-
-    /* Now tell the keyboard driver to send us raw scancodes */
-    if (priv->use_tcs) {
-      int nm = priv->orig_getsc;
-      nm &= ~KB_XSCANCODE;
-      ioctl (pInfo->fd, TCSETSC, &nm);
-    }
-
-    if (priv->use_kd)
-      ioctl (pInfo->fd, KDSKBMODE, K_RAW);
-
-    ioctl (pInfo->fd, PIO_KEYMAP, &priv->noledmap);
-  }
-
-  return Success;
-}
-
-static int
-KbdOff(InputInfoPtr pInfo, int what)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  ScoKbdPrivPtr priv = (ScoKbdPrivPtr) pKbd->private;
-
-  if (pKbd->isConsole) {
-    /* Revert back to original translate scancode mode */
-    if (priv->use_tcs)
-      ioctl (pInfo->fd, TCSETSC, &priv->orig_getsc);
-    if (priv->use_kd)
-      ioctl (pInfo->fd, KDSKBMODE, priv->orig_kbm);
-
-    ioctl (pInfo->fd, PIO_KEYMAP, &priv->keymap);
-
-    if (priv->no_emap)
-      ioctl (pInfo->fd, LDSMAP, priv->sc_mapbuf);
-    if (priv->no_nmap)
-      ioctl (pInfo->fd, NMSMAP, priv->sc_mapbuf2);
-
-    ioctl(pInfo->fd, XCSETA, &priv->kbdtty);
-  }
-
-  return Success;
-}
-
-static int
-GetSpecialKey(InputInfoPtr pInfo, int scanCode)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  int specialkey = scanCode;
-
-  if (pKbd->CustomKeycodes) {
-      specialkey = pKbd->specialMap->map[scanCode];
-  }
-  return specialkey;
-}
-
-#define ModifierSet(k) ((modifiers & (k)) == (k))
-
-static Bool
-SpecialKey(InputInfoPtr pInfo, int key, Bool down, int modifiers)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-
-  if(!pKbd->vtSwitchSupported)
-    return FALSE;
-
-  if ((!ModifierSet(ShiftMask)) && ((ModifierSet(ControlMask | AltMask)) ||
-      (ModifierSet(ControlMask | AltLangMask)))) {
-    if (VTSwitchEnabled && !xf86Info.vtSysreq) {
-      switch (key) {
-        case KEY_F1:
-        case KEY_F2:
-        case KEY_F3:
-        case KEY_F4:
-        case KEY_F5:
-        case KEY_F6:
-        case KEY_F7:
-        case KEY_F8:
-        case KEY_F9:
-        case KEY_F10:
-          if (down) {
-	    int sts = key - KEY_F1;
-	    if (sts != xf86Info.vtno) {
-	      ioctl(pInfo->fd, VT_ACTIVATE, sts);
-	    }
-            return TRUE;
-          }
-        case KEY_F11:
-        case KEY_F12:
-          if (down) {
-	    int sts = key - KEY_F11 + 10;
-	    if (sts != xf86Info.vtno) {
-	      ioctl(pInfo->fd, VT_ACTIVATE, sts);
-	    }
-            return TRUE;
-          }
-      }
-    }
-  }
-#ifdef USE_VT_SYSREQ
-  if (VTSwitchEnabled && xf86Info.vtSysreq) {
-    switch (key) {
-      case KEY_F1:
-      case KEY_F2:
-      case KEY_F3:
-      case KEY_F4:
-      case KEY_F5:
-      case KEY_F6:
-      case KEY_F7:
-      case KEY_F8:
-      case KEY_F9:
-      case KEY_F10:
-        if (VTSysreqToggle && down) {
-          ioctl(pInfo->fd, VT_ACTIVATE, key - KEY_F1);
-          VTSysreqToggle = FALSE;
-          return TRUE;
-        }
-        break;
-      case KEY_F11:
-      case KEY_F12:
-        if (VTSysreqToggle && down) {
-          ioctl(pInfo->fd, VT_ACTIVATE, key - KEY_F11 + 10);
-          VTSysreqToggle = FALSE;
-          return TRUE;
-        }
-        break;
-        /* Ignore these keys -- ie don't let them cancel an alt-sysreq */
-      case KEY_Alt:
-      case KEY_AltLang:
-        break;
-      case KEY_SysReqest:
-        if (!(ModifierSet(ShiftMask) || ModifierSet(ControlMask))) {
-          if ((ModifierSet(AltMask) || ModifierSet(AltLangMask)) && down)
-            VTSysreqToggle = TRUE;
-        }
-        break;
-      default:
-        /*
-         * We only land here when Alt-SysReq is followed by a
-         * non-switching key.
-         */
-        if (VTSysreqToggle)
-          VTSysreqToggle = FALSE;
-    }
-  }
-#endif /* USE_VT_SYSREQ */
-  return FALSE;
-} 
-
-static void
-stdReadInput(InputInfoPtr pInfo)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  unsigned char rBuf[64];
-  int nBytes, i;
-
-  if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(rBuf))) > 0) {
-    for (i = 0; i < nBytes; i++) {
-      pKbd->PostEvent(pInfo, rBuf[i] & 0x7f, rBuf[i] & 0x80 ? FALSE : TRUE);
-    }
-  }
-}
-
-static Bool
-OpenKeyboard(InputInfoPtr pInfo)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  int i;
-  KbdProtocolId prot = PROT_UNKNOWN_KBD;
-  char *s;
-
-  s = xf86SetStrOption(pInfo->options, "Protocol", NULL);
-  for (i = 0; protocols[i].name; i++) {
-    if (xf86NameCmp(s, protocols[i].name) == 0) {
-      prot = protocols[i].id;
-      break;
-    }
-  }
-
-  switch (prot) {
-    case PROT_STD:
-      pInfo->read_input = stdReadInput;
-      break;
-    default:
-      xf86Msg(X_ERROR,"\"%s\" is not a valid keyboard protocol name\n", s);
-      xfree(s);
-      return FALSE;
-  }
-
-  xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, s);
-  xfree(s);
-
-  s = xf86SetStrOption(pInfo->options, "Device", NULL);
-  if (s == NULL) {
-    pInfo->fd = xf86Info.consoleFd;
-    pKbd->isConsole = TRUE;
-  } else {
-    pInfo->fd = open(s, O_RDONLY | O_NONBLOCK | O_EXCL);
-    if (pInfo->fd == -1) {
-      xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", pInfo->name, s);
-      xfree(s);
-      return FALSE;
-    }
-    pKbd->isConsole = FALSE;
-    xfree(s);
-  }
-
-  if (pKbd->isConsole)
-    pKbd->vtSwitchSupported = TRUE;
-
-  return TRUE;
-}
-
-_X_EXPORT Bool
-xf86OSKbdPreInit(InputInfoPtr pInfo)
-{
-  KbdDevPtr pKbd = pInfo->private;
-
-  pKbd->KbdInit           = KbdInit;
-  pKbd->KbdOn             = KbdOn;
-  pKbd->KbdOff            = KbdOff;
-  pKbd->Bell              = SoundBell;
-  pKbd->SetLeds           = SetKbdLeds;
-  pKbd->GetLeds           = GetKbdLeds;
-  pKbd->SetKbdRepeat      = SetKbdRepeat;
-  pKbd->KbdGetMapping     = KbdGetMapping;
-  pKbd->SpecialKey        = SpecialKey;
-  pKbd->GetSpecialKey     = GetSpecialKey;
-  pKbd->OpenKeyboard      = OpenKeyboard;
-  pKbd->RemapScanCode     = ATScancode;
-  pKbd->vtSwitchSupported = FALSE;
-
-  pKbd->private = xcalloc(sizeof(ScoKbdPrivRec), 1);
-  if (pKbd->private == NULL) {
-    xf86Msg(X_ERROR,"can't allocate keyboard OS private data\n");
-    return FALSE;
-  }
-
-  return TRUE;
-}
diff --git a/hw/xfree86/os-support/sco/sco_kbd.h b/hw/xfree86/os-support/sco/sco_kbd.h
deleted file mode 100644
index a79cd7b..0000000
--- a/hw/xfree86/os-support/sco/sco_kbd.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* $XFree86$ */
-#ifndef SCO_KBD_HDR
-#define SCO_KBD_HDR
-
-typedef struct {
-  int use_tcs;
-  int use_kd;
-  int no_nmap;
-  int no_emap;
-  int orig_getsc;
-  int orig_kbm;
-  struct termios kbdtty;
-  keymap_t keymap, noledmap;
-  uchar_t *sc_mapbuf;
-  uchar_t *sc_mapbuf2;
-} ScoKbdPrivRec, *ScoKbdPrivPtr;
-
-extern void KbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms,
-  CARD8 *pModMap);
-#endif /* SCO_KBD_HDR */
diff --git a/hw/xfree86/os-support/shared/at_scancode.c b/hw/xfree86/os-support/shared/at_scancode.c
deleted file mode 100644
index 10d3da2..0000000
--- a/hw/xfree86/os-support/shared/at_scancode.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 2002-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86.h"
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-
-Bool
-ATScancode(InputInfoPtr pInfo, int *scanCode)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-
-    switch (pKbd->scanPrefix) {
-       case 0:
-          switch (*scanCode) {
-             case KEY_Prefix0:
-             case KEY_Prefix1:
-                  pKbd->scanPrefix = *scanCode;  /* special prefixes */
-                  return TRUE;
-          }
-          if (!xf86IsPc98()) {
-            switch (*scanCode) {
-             case 0x59: *scanCode = KEY_0x59; break;
-             case 0x5a: *scanCode = KEY_0x5A; break;
-             case 0x5b: *scanCode = KEY_0x5B; break;
-             case 0x5c: *scanCode = KEY_KP_Equal; break; /* Keypad Equal */
-             case 0x5d: *scanCode = KEY_0x5D; break;
-             case 0x5e: *scanCode = KEY_0x5E; break;
-             case 0x5f: *scanCode = KEY_0x5F; break;
-             case 0x62: *scanCode = KEY_0x62; break;
-             case 0x63: *scanCode = KEY_0x63; break;
-             case 0x64: *scanCode = KEY_0x64; break;
-             case 0x65: *scanCode = KEY_0x65; break;
-             case 0x66: *scanCode = KEY_0x66; break;
-             case 0x67: *scanCode = KEY_0x67; break;
-             case 0x68: *scanCode = KEY_0x68; break;
-             case 0x69: *scanCode = KEY_0x69; break;
-             case 0x6a: *scanCode = KEY_0x6A; break;
-             case 0x6b: *scanCode = KEY_0x6B; break;
-             case 0x6c: *scanCode = KEY_0x6C; break;
-             case 0x6d: *scanCode = KEY_0x6D; break;
-             case 0x6e: *scanCode = KEY_0x6E; break;
-             case 0x6f: *scanCode = KEY_0x6F; break;
-             case 0x70: *scanCode = KEY_0x70; break;
-             case 0x71: *scanCode = KEY_0x71; break;
-             case 0x72: *scanCode = KEY_0x72; break;
-             case 0x73: *scanCode = KEY_0x73; break;
-             case 0x74: *scanCode = KEY_0x74; break;
-             case 0x75: *scanCode = KEY_0x75; break;
-             case 0x76: *scanCode = KEY_0x76; break;
-            }
-          }
-          break;
-       case KEY_Prefix0:
-          pKbd->scanPrefix = 0;
-          switch (*scanCode) {
-            case KEY_KP_7:        *scanCode = KEY_Home;      break;  /* curs home */
-            case KEY_KP_8:        *scanCode = KEY_Up;        break;  /* curs up */
-            case KEY_KP_9:        *scanCode = KEY_PgUp;      break;  /* curs pgup */
-            case KEY_KP_4:        *scanCode = KEY_Left;      break;  /* curs left */
-            case KEY_KP_5:        *scanCode = KEY_Begin;     break;  /* curs begin */
-            case KEY_KP_6:        *scanCode = KEY_Right;     break;  /* curs right */
-            case KEY_KP_1:        *scanCode = KEY_End;       break;  /* curs end */
-            case KEY_KP_2:        *scanCode = KEY_Down;      break;  /* curs down */
-            case KEY_KP_3:        *scanCode = KEY_PgDown;    break;  /* curs pgdown */
-            case KEY_KP_0:        *scanCode = KEY_Insert;    break;  /* curs insert */
-            case KEY_KP_Decimal:  *scanCode = KEY_Delete;    break;  /* curs delete */
-            case KEY_Enter:       *scanCode = KEY_KP_Enter;  break;  /* keypad enter */
-            case KEY_LCtrl:       *scanCode = KEY_RCtrl;     break;  /* right ctrl */
-            case KEY_KP_Multiply: *scanCode = KEY_Print;     break;  /* print */
-            case KEY_Slash:       *scanCode = KEY_KP_Divide; break;  /* keyp divide */
-            case KEY_Alt:         *scanCode = KEY_AltLang;   break;  /* right alt */
-            case KEY_ScrollLock:  *scanCode = KEY_Break;     break;  /* curs break */
-            case 0x5b:            *scanCode = KEY_LMeta;     break;
-            case 0x5c:            *scanCode = KEY_RMeta;     break;
-            case 0x5d:            *scanCode = KEY_Menu;      break;
-            case KEY_F3:          *scanCode = KEY_F13;       break;
-            case KEY_F4:          *scanCode = KEY_F14;       break;
-            case KEY_F5:          *scanCode = KEY_F15;       break;
-            case KEY_F6:          *scanCode = KEY_F16;       break;
-            case KEY_F7:          *scanCode = KEY_F17;       break;
-            case KEY_KP_Plus:     *scanCode = KEY_KP_DEC;    break;
-            case 0x2A:
-            case 0x36:
-	         return TRUE;
-            default:
-                 xf86MsgVerb(X_INFO, 4, "Unreported Prefix0 scancode: 0x%02x\n",
-		             *scanCode);
-                 *scanCode += 0x78;
-          }
-       break;
-       case KEY_Prefix1: 
-            pKbd->scanPrefix = (*scanCode == KEY_LCtrl) ? KEY_LCtrl : 0;
-            return TRUE;
-       case KEY_LCtrl:
-            pKbd->scanPrefix = 0;
-            if (*scanCode != KEY_NumLock)
-                return TRUE;
-            *scanCode = KEY_Pause;       /* pause */
-    }
-    return FALSE;
-}
diff --git a/hw/xfree86/os-support/shared/kbd.c b/hw/xfree86/os-support/shared/kbd.c
deleted file mode 100644
index dd6d77d..0000000
--- a/hw/xfree86/os-support/shared/kbd.c
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (c) 2001-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86OSKbd.h"
-
-_X_EXPORT Bool
-xf86OSKbdPreInit(InputInfoPtr pInfo)
-{
-    return FALSE;
-}
diff --git a/hw/xfree86/os-support/shared/std_kbdEv.c b/hw/xfree86/os-support/shared/std_kbdEv.c
deleted file mode 100644
index f56a5fd..0000000
--- a/hw/xfree86/os-support/shared/std_kbdEv.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Thomas Roell and David Dawes 
- * not be used in advertising or publicity pertaining to distribution of 
- * the software without specific, written prior permission.  Thomas Roell and
- * David Dawes makes no representations about the suitability of this 
- * software for any purpose.  It is provided "as is" without express or 
- * implied warranty.
- *
- * THOMAS ROELL AND DAVID DAWES DISCLAIMS ALL WARRANTIES WITH REGARD TO 
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 
- * FITNESS, IN NO EVENT SHALL THOMAS ROELL OR DAVID DAWES BE LIABLE FOR 
- * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER 
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF 
- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium: std_kbdEv.c /main/4 1996/03/11 10:47:33 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-void
-xf86KbdEvents()
-{
-	unsigned char rBuf[64];
-	int nBytes, i;
-
-	if ((nBytes = read( xf86Info.consoleFd, (char *)rBuf, sizeof(rBuf)))
-	    > 0)
-	{
-		for (i = 0; i < nBytes; i++)
-			xf86PostKbdEvent(rBuf[i]);
-	}
-}
-
diff --git a/hw/xfree86/os-support/shared/sysv_kbd.c b/hw/xfree86/os-support/shared/sysv_kbd.c
deleted file mode 100644
index d7d7519..0000000
--- a/hw/xfree86/os-support/shared/sysv_kbd.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
- * Copyright 1993 by David Dawes <dawes at XFree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Thomas Roell and David Dawes 
- * not be used in advertising or publicity pertaining to distribution of 
- * the software without specific, written prior permission.  Thomas Roell and
- * David Dawes makes no representations about the suitability of this 
- * software for any purpose.  It is provided "as is" without express or 
- * implied warranty.
- *
- * THOMAS ROELL AND DAVID DAWES DISCLAIMS ALL WARRANTIES WITH REGARD TO 
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 
- * FITNESS, IN NO EVENT SHALL THOMAS ROELL OR DAVID DAWES BE LIABLE FOR 
- * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER 
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF 
- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium: sysv_kbd.c /main/3 1996/02/21 17:53:59 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-int
-xf86GetKbdLeds()
-{
-	int leds;
-
-	ioctl(xf86Info.consoleFd, KDGETLED, &leds);
-	return(leds);
-}
-
-void
-xf86SetKbdRepeat(char rad)
-{
-#ifdef KDSETRAD
-	ioctl(xf86Info.consoleFd, KDSETRAD, rad);
-#endif
-}
-
-static int kbdtrans;
-static struct termio kbdtty;
-static char *kbdemap = NULL;
-
-void
-xf86KbdInit()
-{
-#ifdef KDGKBMODE
-	ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans);
-#endif
-	ioctl (xf86Info.consoleFd, TCGETA, &kbdtty);
-#if defined(E_TABSZ)
-	kbdemap = xalloc(E_TABSZ);
-	if (ioctl(xf86Info.consoleFd, LDGMAP, kbdemap) < 0)
-	{
-		xfree(kbdemap);
-		kbdemap = NULL;
-	}
-#endif
-}
-
-int
-xf86KbdOn()
-{
-	struct termio nTty;
-
-	ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW);
-	ioctl(xf86Info.consoleFd, LDNMAP, 0); /* disable mapping completely */
-	nTty = kbdtty;
-	nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-	nTty.c_oflag = 0;
-	nTty.c_cflag = CREAD | CS8 | B9600;
-	nTty.c_lflag = 0;
-	nTty.c_cc[VTIME]=0;
-	nTty.c_cc[VMIN]=1;
-	ioctl(xf86Info.consoleFd, TCSETA, &nTty);
-	return(xf86Info.consoleFd);
-}
-
-int
-xf86KbdOff()
-{
-	if (kbdemap)
-	{
-		ioctl(xf86Info.consoleFd, LDSMAP, kbdemap);
-	}
-	ioctl(xf86Info.consoleFd, KDSKBMODE, kbdtrans);
-	ioctl(xf86Info.consoleFd, TCSETA, &kbdtty);
-	return(xf86Info.consoleFd);
-}
diff --git a/hw/xfree86/os-support/solaris/Makefile.am b/hw/xfree86/os-support/solaris/Makefile.am
index 6b29b30..504e1a1 100644
--- a/hw/xfree86/os-support/solaris/Makefile.am
+++ b/hw/xfree86/os-support/solaris/Makefile.am
@@ -1,10 +1,8 @@
 if SOLARIS_USL_CONSOLE
 IO_SRC   = $(srcdir)/../sysv/sysv_io.c
-KBD_SRCS = $(srcdir)/../shared/sysv_kbd.c $(srcdir)/../shared/std_kbdEv.c
 VTSW_SRC = $(srcdir)/../shared/VTsw_usl.c
 else
-IO_SRC   = sun_io.c sun_kbd.h
-KBD_SRCS = sun_kbd.c sun_kbdEv.c sun_kbd.h
+IO_SRC   = sun_io.c
 VTSW_SRC = $(srcdir)/../shared/VTsw_noop.c
 endif
 
@@ -22,7 +20,7 @@ solaris-$(SOLARIS_INOUT_ARCH).il: solari
 	$(CPP) -P -DINLINE_ASM solaris-${SOLARIS_INOUT_ARCH}.S > $@
 
 noinst_LTLIBRARIES = libsolaris.la
-libsolaris_la_SOURCES = sun_bios.c sun_init.c $(IO_SRC) $(KBD_SRCS) \
+libsolaris_la_SOURCES = sun_bios.c sun_init.c $(IO_SRC) \
 	sun_mouse.c sun_vid.c $(AGP_SRC) \
 	$(srcdir)/../shared/libc_wrapper.c \
 	$(srcdir)/../shared/kmod_noop.c $(srcdir)/../shared/pm_noop.c \
diff --git a/hw/xfree86/os-support/solaris/sun_kbd.c b/hw/xfree86/os-support/solaris/sun_kbd.c
deleted file mode 100644
index 2cb1d13..0000000
--- a/hw/xfree86/os-support/solaris/sun_kbd.c
+++ /dev/null
@@ -1,660 +0,0 @@
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
- * Copyright 1993 by David Dawes <dawes at XFree86.org>
- * Copyright 1999 by David Holland <davidh at iquest.net)
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the names of Thomas Roell, David Dawes, and David Holland not be used
- * in advertising or publicity pertaining to distribution of the software
- * without specific, written prior permission.  Thomas Roell, David Dawes, and
- * David Holland make no representations about the suitability of this software
- * for any purpose.  It is provided "as is" without express or implied
- * warranty.
- *
- * THOMAS ROELL, DAVID DAWES, AND DAVID HOLLAND DISCLAIM ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS.  IN NO EVENT SHALL THOMAS ROELL, DAVID DAWES, OR DAVID HOLLAND
- * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* Copyright 2004-2005 Sun Microsystems, Inc.  All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, and/or sell copies of the Software, and to permit persons
- * to whom the Software is furnished to do so, provided that the above
- * copyright notice(s) and this permission notice appear in all copies of
- * the Software and that both the above copyright notice(s) and this
- * permission notice appear in supporting documentation.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
- * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
- * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
- * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
- * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- * 
- * Except as contained in this notice, the name of a copyright holder
- * shall not be used in advertising or otherwise to promote the sale, use
- * or other dealings in this Software without prior written authorization
- * of the copyright holder.
- */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "xf86OSKbd.h"
-#include "sun_kbd.h"
-
-/* Define to provide support for using /dev/audio to ring the bell instead of
-   the keyboard beeper */
-#define AUDIO_BELL
-
-#ifdef AUDIO_BELL
-#include <sys/audio.h>
-#include <sys/uio.h>
-#include <limits.h>
-#include <math.h>
-#include <poll.h>
-#endif
-
-/***************************************************************************
- * Common implementation of routines shared by "keyboard" driver in sun_io.c
- * and "kbd" driver (later on in this file)
- */
-
-#include <sys/stropts.h>
-#include <sys/vuid_event.h>
-#include <sys/kbd.h>
-
-_X_HIDDEN int
-sunKbdOpen(const char *devName, pointer options)
-{
-    int kbdFD;
-    const char *kbdPath = NULL;
-    const char *defaultKbd = "/dev/kbd";
-
-    if (options != NULL) {
-	kbdPath = xf86SetStrOption(options, "Device", NULL);
-    }
-    if (kbdPath == NULL) {
-        kbdPath = defaultKbd;
-    }
-
-    kbdFD = open(kbdPath, O_RDONLY | O_NONBLOCK);
-    
-    if (kbdFD == -1) {
-        xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", devName, kbdPath);
-    } else {
-	xf86MsgVerb(X_INFO, 3, "%s: Opened device \"%s\"\n", devName, kbdPath);
-    }
-    
-    if ((kbdPath != NULL) && (kbdPath != defaultKbd)) {
-	xfree(kbdPath);
-    }
-    return kbdFD;
-}
-
-
-/*
- * Save initial keyboard state.  This is called at the start of each server
- * generation.
- */
-
-_X_HIDDEN int
-sunKbdInit(sunKbdPrivPtr priv, int kbdFD, const char *devName, pointer options)
-{
-    int	ktype, klayout, i;
-    const char *ktype_name;
-
-    priv->kbdFD 	= kbdFD;
-    priv->devName 	= devName;
-    priv->otranslation 	= -1;
-    priv->odirect 	= -1;
-
-    if (options != NULL) {
-	priv->strmod = xf86SetStrOption(options, "StreamsModule", NULL);
-	priv->audioDevName = xf86SetStrOption(options, "BellDevice", NULL);
-
-	if (priv->audioDevName && (priv->audioDevName[0] == '\0')) {
-	    xfree(priv->audioDevName);
-	    priv->audioDevName = NULL;
-	}	
-    } else {
-	priv->strmod 		= NULL;
-	priv->audioDevName	= NULL;
-    }
-
-    if (priv->strmod) {
-	SYSCALL(i = ioctl(priv->kbdFD, I_PUSH, priv->strmod));
-	if (i < 0) {
-	    xf86Msg(X_ERROR,
-		    "%s: cannot push module '%s' onto keyboard device: %s\n",
-		    priv->devName, priv->strmod, strerror(errno));
-	}
-    }
-    
-    SYSCALL(i = ioctl(kbdFD, KIOCTYPE, &ktype));
-    if (i < 0) {
-	xf86Msg(X_ERROR, "%s: Unable to determine keyboard type: %s\n", 
-		devName, strerror(errno));
-	return BadImplementation;
-    }
-    
-    SYSCALL(i = ioctl(kbdFD, KIOCLAYOUT, &klayout));
-    if (i < 0) {	
-	xf86Msg(X_ERROR, "%s: Unable to determine keyboard layout: %s\n", 
-		devName, strerror(errno));
-	return BadImplementation;
-    }
-    
-    switch (ktype) {
-    case KB_SUN3:
-	ktype_name = "Sun Type 3"; break;
-    case KB_SUN4:
-	ktype_name = "Sun Type 4/5/6"; break;
-    case KB_USB:
-	ktype_name = "USB"; break;
-    case KB_PC:
-	ktype_name = "PC"; break;
-    default:
-	ktype_name = "Unknown"; break;
-    }
-
-    xf86Msg(X_PROBED, "%s: Keyboard type: %s (%d)\n",
-	    devName, ktype_name, ktype);
-    xf86Msg(X_PROBED, "%s: Keyboard layout: %d\n", devName, klayout);
-
-    priv->ktype 	= ktype;
-    priv->keyMap	= sunGetKbdMapping(ktype);
-    priv->audioState	= AB_INITIALIZING;
-    priv->oleds 	= sunKbdGetLeds(priv);
-
-    return Success;
-}
-
-_X_HIDDEN int
-sunKbdOn(sunKbdPrivPtr priv)
-{
-    int	ktrans, kdirect, i;
-
-    SYSCALL(i = ioctl(priv->kbdFD, KIOCGDIRECT, &kdirect));
-    if (i < 0) {
-	xf86Msg(X_ERROR, 
-		"%s: Unable to determine keyboard direct setting: %s\n", 
-		priv->devName, strerror(errno));
-	return BadImplementation;
-    }
-
-    priv->odirect = kdirect;
-    kdirect = 1;
-
-    SYSCALL(i = ioctl(priv->kbdFD, KIOCSDIRECT, &kdirect));
-    if (i < 0) {
-	xf86Msg(X_ERROR, "%s: Failed turning keyboard direct mode on: %s\n",
-			priv->devName, strerror(errno));
-	return BadImplementation;
-    }
-
-    /* Setup translation */
-
-    SYSCALL(i = ioctl(priv->kbdFD, KIOCGTRANS, &ktrans));
-    if (i < 0) {
-	xf86Msg(X_ERROR, 
-		"%s: Unable to determine keyboard translation mode: %s\n", 
-		priv->devName, strerror(errno));
-	return BadImplementation;
-    }
-
-    priv->otranslation = ktrans;
-    ktrans = TR_UNTRANS_EVENT;
-
-    SYSCALL(i = ioctl(priv->kbdFD, KIOCTRANS, &ktrans));
-    if (i < 0) {	
-	xf86Msg(X_ERROR, "%s: Failed setting keyboard translation mode: %s\n",
-			priv->devName, strerror(errno));
-	return BadImplementation;
-    }
-
-    return Success;
-}
-
-_X_HIDDEN int
-sunKbdOff(sunKbdPrivPtr priv)
-{
-    int i;
-
-    /* restore original state */
-    
-    sunKbdSetLeds(priv, priv->oleds);
-    
-    if (priv->otranslation != -1) {
-        SYSCALL(i = ioctl(priv->kbdFD, KIOCTRANS, &priv->otranslation));
-	if (i < 0) {
-	    xf86Msg(X_ERROR,
-		    "%s: Unable to restore keyboard translation mode: %s\n",
-		    priv->devName, strerror(errno));
-	    return BadImplementation;
-	}
-	priv->otranslation = -1;
-    }
-
-    if (priv->odirect != -1) {
-        SYSCALL(i = ioctl(priv->kbdFD, KIOCSDIRECT, &priv->odirect));
-	if (i < 0) {
-	    xf86Msg(X_ERROR,
-		    "%s: Unable to restore keyboard direct setting: %s\n",
-		    priv->devName, strerror(errno));
-	    return BadImplementation;
-	}
-	priv->odirect = -1;
-    }
-
-    if (priv->strmod) {
-	SYSCALL(i = ioctl(priv->kbdFD, I_POP, priv->strmod));
-	if (i < 0) {
-            xf86Msg(X_WARNING,
-		    "%s: cannot pop module '%s' off keyboard device: %s\n",
-		    priv->devName, priv->strmod, strerror(errno));
-	}
-    }
-
-    return Success;
-}
-
-#ifdef AUDIO_BELL
-
-/* Helper function to ring bell via audio device instead of keyboard beeper */
-
-#define BELL_RATE       48000   /* Samples per second */
-#define BELL_HZ         50      /* Fraction of a second i.e. 1/x */
-#define BELL_MS         (1000/BELL_HZ)  /* MS */
-#define BELL_SAMPLES    (BELL_RATE / BELL_HZ)
-#define BELL_MIN        3       /* Min # of repeats */
-
-static int
-sunKbdAudioBell(sunKbdPrivPtr priv, int loudness, int pitch, int duration)
-{
-    static short    samples[BELL_SAMPLES];
-    static short    silence[BELL_SAMPLES]; /* "The Sound of Silence" */
-    static int      lastFreq;
-    int             cnt;
-    int             i;
-    int		    written;
-    int             repeats;
-    int             freq;
-    audio_info_t    audioInfo;
-    struct iovec    iov[IOV_MAX];
-    int		    iovcnt;
-    double	    ampl, cyclen, phase;
-    int		    audioFD;
-
-    if ((loudness <= 0) || (pitch <= 0) || (duration <= 0)) {
-	return 0;
-    }
-
-    if ((priv == NULL) || (priv->audioDevName == NULL)) {
-	return -1;
-    }
-
-    if (priv->audioState == AB_INITIALIZING) {
-	priv->audioState = AB_NORMAL;
-	lastFreq = 0;
-	bzero(silence, sizeof(silence));
-    }
-    
-    audioFD = open(priv->audioDevName, O_WRONLY | O_NONBLOCK);
-    if (audioFD == -1) {
-	xf86Msg(X_ERROR, "%s: cannot open audio device \"%s\": %s\n",
-		priv->devName, priv->audioDevName, strerror(errno));
-	return -1;
-    } 
-
-    freq = pitch;
-    freq = min(freq, (BELL_RATE / 2) - 1);
-    freq = max(freq, 2 * BELL_HZ);
-
-    /*
-     * Ensure full waves per buffer
-     */
-    freq -= freq % BELL_HZ;
-
-    if (freq != lastFreq) {
-	lastFreq = freq;
-	ampl =  16384.0;
-
-	cyclen = (double) freq / (double) BELL_RATE;
-	phase = 0.0;
-
-	for (i = 0; i < BELL_SAMPLES; i++) {
-	    samples[i] = (short) (ampl * sin(2.0 * M_PI * phase));
-	    phase += cyclen;
-	    if (phase >= 1.0)
-		phase -= 1.0;
-	}
-    }
-    
-    repeats = (duration + (BELL_MS / 2)) / BELL_MS;
-    repeats = max(repeats, BELL_MIN);
-
-    loudness = max(0, loudness);
-    loudness = min(loudness, 100);
-
-#ifdef DEBUG
-    ErrorF("BELL : freq %d volume %d duration %d repeats %d\n",
-	   freq, loudness, duration, repeats);
-#endif
-
-    AUDIO_INITINFO(&audioInfo);
-    audioInfo.play.encoding = AUDIO_ENCODING_LINEAR;
-    audioInfo.play.sample_rate = BELL_RATE;
-    audioInfo.play.channels = 2;
-    audioInfo.play.precision = 16;
-    audioInfo.play.gain = min(AUDIO_MAX_GAIN, AUDIO_MAX_GAIN * loudness / 100);
-
-    if (ioctl(audioFD, AUDIO_SETINFO, &audioInfo) < 0){
-	xf86Msg(X_ERROR,
-		"%s: AUDIO_SETINFO failed on audio device \"%s\": %s\n",
-		priv->devName, priv->audioDevName, strerror(errno));
-	close(audioFD);
-	return -1;
-    }
-    
-    iovcnt = 0;
-    
-    for (cnt = 0; cnt <= repeats; cnt++) {
-	iov[iovcnt].iov_base = (char *) samples;
-	iov[iovcnt++].iov_len = sizeof(samples);
-	if (cnt == repeats) {
-	    /* Insert a bit of silence so that multiple beeps are distinct and
-	     * not compressed into a single tone.
-	     */
-	    iov[iovcnt].iov_base = (char *) silence;
-	    iov[iovcnt++].iov_len = sizeof(silence);
-	}	    
-	if ((iovcnt >= IOV_MAX) || (cnt == repeats)) {
-	    written = writev(audioFD, iov, iovcnt);
-
-	    if ((written < ((int)(sizeof(samples) * iovcnt)))) {
-		/* audio buffer was full! */
-
-		int naptime;
-
-		if (written == -1) {
-		    if (errno != EAGAIN) {
-			xf86Msg(X_ERROR,
-			       "%s: writev failed on audio device \"%s\": %s\n",
-				priv->devName, priv->audioDevName,
-				strerror(errno));
-			close(audioFD);
-			return -1;
-		    }
-		    i = iovcnt;
-		} else {
-		    i = ((sizeof(samples) * iovcnt) - written)
-			/ sizeof(samples);
-		}
-		cnt -= i;
-		
-		/* sleep a little to allow audio buffer to drain */
-		naptime = BELL_MS * i;
-		poll(NULL, 0, naptime);
-
-		i = ((sizeof(samples) * iovcnt) - written) % sizeof(samples);
-		iovcnt = 0;
-		if ((written != -1) && (i > 0)) {
-		    iov[iovcnt].iov_base = ((char *) samples) + i;
-		    iov[iovcnt++].iov_len = sizeof(samples) - i;
-		}
-	    } else {
-		iovcnt = 0;
-	    }
-	}
-    }
-    
-    close(audioFD);
-    return 0;
-}
-
-#endif /* AUDIO_BELL */
-
-_X_HIDDEN void
-sunKbdSoundBell(sunKbdPrivPtr priv, int loudness, int pitch, int duration)
-{
-    int	kbdCmd, i;
-
-    if (loudness && pitch)
-    {
-#ifdef AUDIO_BELL
-	if (priv->audioDevName != NULL) {
-	    if (sunKbdAudioBell(priv, loudness, pitch, duration) == 0) {
-		return;
-	    }
-	}
-#endif
-	
- 	kbdCmd = KBD_CMD_BELL;
-		
-	SYSCALL(i = ioctl (priv->kbdFD, KIOCCMD, &kbdCmd));
-	if (i < 0) {
-	    xf86Msg(X_ERROR, "%s: Failed to activate bell: %s\n",
-                priv->devName, strerror(errno));
-	}
-	
-	usleep(duration * loudness * 20);
-	
-	kbdCmd = KBD_CMD_NOBELL;
-	SYSCALL(i = ioctl (priv->kbdFD, KIOCCMD, &kbdCmd));
-	if (i < 0) {
-	     xf86Msg(X_ERROR, "%s: Failed to deactivate bell: %s\n",
-                priv->devName, strerror(errno));
-	}
-    }
-}
-
-_X_HIDDEN void
-sunKbdSetLeds(sunKbdPrivPtr priv, int leds)
-{
-    int i;
-	
-    SYSCALL(i = ioctl(priv->kbdFD, KIOCSLED, &leds));
-    if (i < 0) {
-	xf86Msg(X_ERROR, "%s: Failed to set keyboard LED's: %s\n",
-                priv->devName, strerror(errno));
-    }
-}
-
-_X_HIDDEN int
-sunKbdGetLeds(sunKbdPrivPtr priv)
-{
-    int i, leds = 0;
-
-    SYSCALL(i = ioctl(priv->kbdFD, KIOCGLED, &leds));
-    if (i < 0) {
-        xf86Msg(X_ERROR, "%s: Failed to get keyboard LED's: %s\n",
-                priv->devName, strerror(errno));
-    }
-    return leds;
-}
-
-/* ARGSUSED0 */
-_X_HIDDEN void
-sunKbdSetRepeat(sunKbdPrivPtr priv, char rad)
-{
-    /* Nothing to do */
-}
-
-/***************************************************************************
- * Routines called from "kbd" driver via proc vectors filled in by
- * xf86OSKbdPreInit().
- */
-
-
-static int
-KbdInit(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
-
-    return sunKbdInit(priv, pInfo->fd, pInfo->name, pInfo->options);
-}
-
-
-static int
-KbdOn(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
-
-    return sunKbdOn(priv);
-}
-
-static int
-KbdOff(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
-
-    return sunKbdOff(priv);
-}
-
-
-static void
-SoundKbdBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
-
-    sunKbdSoundBell(priv, loudness, pitch, duration);
-}
-
-static void
-SetKbdLeds(InputInfoPtr pInfo, int leds)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
-    int real_leds = sunKbdGetLeds(priv);
-
-    real_leds &= ~(LED_CAPS_LOCK | LED_NUM_LOCK | LED_SCROLL_LOCK | LED_COMPOSE);
-
-    if (leds & XLED1)  real_leds |= LED_CAPS_LOCK;
-    if (leds & XLED2)  real_leds |= LED_NUM_LOCK;
-    if (leds & XLED3)  real_leds |= LED_SCROLL_LOCK;
-    if (leds & XLED4)  real_leds |= LED_COMPOSE;
-    
-    sunKbdSetLeds(priv, real_leds);
-}
-
-static int
-GetKbdLeds(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
-    int leds = 0;
-    int real_leds = sunKbdGetLeds(priv);
-
-    if (real_leds & LED_CAPS_LOCK)	leds |= XLED1;
-    if (real_leds & LED_NUM_LOCK)	leds |= XLED2;
-    if (real_leds & LED_SCROLL_LOCK)	leds |= XLED3;
-    if (real_leds & LED_COMPOSE)	leds |= XLED4;
-	
-    return leds;
-}
-
-static void
-SetKbdRepeat(InputInfoPtr pInfo, char rad)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
-    
-    sunKbdSetRepeat(priv, rad);
-}
-
-static void
-KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-    /* Should probably do something better here */
-    xf86KbdGetMapping(pKeySyms, pModMap);
-}
-
-static void
-ReadInput(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
-    Firm_event event[64];
-    int        nBytes, i;
-
-    /* I certainly hope its not possible to read partial events */
-
-    if ((nBytes = read(pInfo->fd, (char *)event, sizeof(event))) > 0)
-    {
-        for (i = 0; i < (nBytes / sizeof(Firm_event)); i++) {
-	    pKbd->PostEvent(pInfo, priv->keyMap[event[i].id],
-			    event[i].value == VKEY_DOWN ? TRUE : FALSE);
-	}
-    }
-}
-
-static Bool
-OpenKeyboard(InputInfoPtr pInfo)
-{
-    pInfo->fd = sunKbdOpen(pInfo->name, pInfo->options);
-
-    if (pInfo->fd >= 0) {
-	pInfo->read_input = ReadInput;
-	return TRUE;
-    } else {
-	return FALSE;
-    }
-}
-
-_X_EXPORT Bool
-xf86OSKbdPreInit(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = pInfo->private;
-
-    pKbd->KbdInit       = KbdInit;
-    pKbd->KbdOn         = KbdOn;
-    pKbd->KbdOff        = KbdOff;
-    pKbd->Bell          = SoundKbdBell;
-    pKbd->SetLeds       = SetKbdLeds;
-    pKbd->GetLeds       = GetKbdLeds;
-    pKbd->SetKbdRepeat  = SetKbdRepeat;
-    pKbd->KbdGetMapping = KbdGetMapping;
-
-    pKbd->RemapScanCode = NULL;
-    pKbd->GetSpecialKey = NULL;
-    pKbd->SpecialKey    = NULL;
-
-    pKbd->OpenKeyboard = OpenKeyboard;
-
-    pKbd->vtSwitchSupported = FALSE;
-    pKbd->CustomKeycodes = FALSE;
-
-    pKbd->private = xcalloc(sizeof(sunKbdPrivRec), 1);
-    if (pKbd->private == NULL) {
-       xf86Msg(X_ERROR,"can't allocate keyboard OS private data\n");
-       return FALSE;
-    } else {
-	sunKbdPrivPtr priv = (sunKbdPrivPtr) pKbd->private;
-	priv->otranslation = -1;
-	priv->odirect = -1;
-    }
-
-    return TRUE;
-}
diff --git a/hw/xfree86/os-support/solaris/sun_kbd.h b/hw/xfree86/os-support/solaris/sun_kbd.h
deleted file mode 100644
index ed2824b..0000000
--- a/hw/xfree86/os-support/solaris/sun_kbd.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/* Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, and/or sell copies of the Software, and to permit persons
- * to whom the Software is furnished to do so, provided that the above
- * copyright notice(s) and this permission notice appear in all copies of
- * the Software and that both the above copyright notice(s) and this
- * permission notice appear in supporting documentation.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
- * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
- * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
- * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
- * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- * 
- * Except as contained in this notice, the name of a copyright holder
- * shall not be used in advertising or otherwise to promote the sale, use
- * or other dealings in this Software without prior written authorization
- * of the copyright holder.
- */
-
-#ifndef _XORG_SUN_KBD_H_
-#define _XORG_SUN_KBD_H_
-
-/*
- * Keyboard common implementation routines shared by "keyboard" driver
- * in sun_io.c and "kbd" driver in sun_kbd.c
- */
-
-typedef struct {
-    int			kbdFD;
-    const char *	devName;
-    int 		ktype;		/* Keyboard type from KIOCTYPE */
-    Bool		kbdActive;	/* Have we set kbd modes for X? */
-    int 		otranslation;	/* Original translation mode */
-    int 		odirect;	/* Original "direct" mode setting */
-    unsigned char	oleds;		/* Original LED state */
-    const char *	strmod;		/* Streams module pushed on kbd device */
-    const char *	audioDevName;	/* Audio device path to use for bell
-					   or NULL to use keyboard beeper */
-    enum {AB_INITIALIZING, AB_NORMAL} audioState;
-    const unsigned char *keyMap;
-} sunKbdPrivRec, *sunKbdPrivPtr;
-
-/* sun_kbd.c */
-extern int  sunKbdOpen	(const char *devName, pointer options);
-extern int  sunKbdInit	(sunKbdPrivPtr priv, int kbdFD,
-			 const char *devName, pointer options);
-extern int  sunKbdOn	(sunKbdPrivPtr priv);
-extern int  sunKbdOff	(sunKbdPrivPtr priv);
-    
-extern void sunKbdSoundBell 	(sunKbdPrivPtr priv,
-				 int loudness, int pitch, int duration);
-
-extern void sunKbdSetLeds 	(sunKbdPrivPtr priv, int leds);
-extern int  sunKbdGetLeds 	(sunKbdPrivPtr priv);
-extern void sunKbdSetRepeat 	(sunKbdPrivPtr priv, char rad);
-
-/* sun_kbdEv.c */
-#include <sys/vuid_event.h>
-extern void sunPostKbdEvent	(int ktype, Firm_event *event);
-
-extern const unsigned char *sunGetKbdMapping(int ktype);
-
-#endif
diff --git a/hw/xfree86/os-support/solaris/sun_kbdEv.c b/hw/xfree86/os-support/solaris/sun_kbdEv.c
deleted file mode 100644
index df8b6fa..0000000
--- a/hw/xfree86/os-support/solaris/sun_kbdEv.c
+++ /dev/null
@@ -1,854 +0,0 @@
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that copyright
- * notice and this permission notice appear in supporting documentation, and
- * that the names of Thomas Roell and David Dawes not be used in advertising or
- * publicity pertaining to distribution of the software without specific,
- * written prior permission.  Thomas Roell and David Dawes make no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * THOMAS ROELL AND DAVID DAWES DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
- * IN NO EVENT SHALL THOMAS ROELL OR DAVID DAWES BE LIABLE FOR ANY SPECIAL,
- * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* [JCH-96/01/21] Extended std reverse map to four buttons. */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "sun_kbd.h"
-
-#ifdef XINPUT
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-#include "xf86Xinput.h"
-#else
-#include "inputstr.h"
-#endif
-
-#include <sys/kbd.h>
-#include "atKeynames.h"
-
-#ifdef XKB
-extern Bool noXkbExtension;
-#endif
-
-#define XE_POINTER  1
-#define XE_KEYBOARD 2
-
-#ifdef XINPUT
-#define ENQUEUE(ev, code, direction, dev_type) \
-  (ev)->u.u.detail = (code); \
-  (ev)->u.u.type   = (direction); \
-  xf86eqEnqueue((ev))
-#else
-#define ENQUEUE(ev, code, direction, dev_type) \
-  (ev)->u.u.detail = (code); \
-  (ev)->u.u.type   = (direction); \
-  mieqEnqueue((ev))
-#endif
-
-static void startautorepeat(long keycode);
-static CARD32 processautorepeat(OsTimerPtr timer, CARD32 now, pointer arg);
-
-static OsTimerPtr sunTimer = NULL;
-
-/* Map the Solaris keycodes to the "XFree86" keycodes. */
-/*
- * This doesn't seem right.  It probably needs to be dependent on a keyboard
- * type.
- */
-
-/* Additional Sun Japanese Keyboard Keys not defined in common/atKeynames.h */
-#define KEY_Kanji	0x82
-#define KEY_Execute	0x83
-
-static unsigned char map[256] = {
-#if defined(i386) || defined(__i386) || defined(__i386__) || defined(__x86)
-	KEY_NOTUSED,		/*   0 */
-	KEY_Tilde,		/*   1 */
-	KEY_1,			/*   2 */
-	KEY_2,			/*   3 */
-	KEY_3,			/*   4 */
-	KEY_4,			/*   5 */
-	KEY_5,			/*   6 */
-	KEY_6,			/*   7 */
-	KEY_7,			/*   8 */
-	KEY_8,			/*   9 */
-	KEY_9,			/*  10 */
-	KEY_0,			/*  11 */
-	KEY_Minus,		/*  12 */
-	KEY_Equal,		/*  13 */
-	0x7D, /*KEY_P_YEN*/	/*  14 */
-	KEY_BackSpace,		/*  15 */
-	KEY_Tab,		/*  16 */
-	KEY_Q,			/*  17 */
-	KEY_W,			/*  18 */
-	KEY_E,			/*  19 */
-	KEY_R,			/*  20 */
-	KEY_T,			/*  21 */
-	KEY_Y,			/*  22 */
-	KEY_U,			/*  23 */
-	KEY_I,			/*  24 */
-	KEY_O,			/*  25 */
-	KEY_P,			/*  26 */
-	KEY_LBrace,		/*  27 */
-	KEY_RBrace,		/*  28 */
-	KEY_BSlash,		/*  29 */
-	KEY_CapsLock,		/*  30 */
-	KEY_A,			/*  31 */
-	KEY_S,			/*  32 */
-	KEY_D,			/*  33 */
-	KEY_F,			/*  34 */
-	KEY_G,			/*  35 */
-	KEY_H,			/*  36 */
-	KEY_J,			/*  37 */
-	KEY_K,			/*  38 */
-	KEY_L,			/*  39 */
-	KEY_SemiColon,		/*  40 */
-	KEY_Quote,		/*  41 */
-	KEY_UNKNOWN,		/*  42 */
-	KEY_Enter,		/*  43 */
-	KEY_ShiftL,		/*  44 */
-	KEY_Less,		/*  45 */
-	KEY_Z,			/*  46 */
-	KEY_X,			/*  47 */
-	KEY_C,			/*  48 */
-	KEY_V,			/*  49 */
-	KEY_B,			/*  50 */
-	KEY_N,			/*  51 */
-	KEY_M,			/*  52 */
-	KEY_Comma,		/*  53 */
-	KEY_Period,		/*  54 */
-	KEY_Slash,		/*  55 */
-	KEY_BSlash2,		/*  56 */
-	KEY_ShiftR,		/*  57 */
-	KEY_LCtrl,		/*  58 */
-	KEY_LMeta,		/*  59 */
-	KEY_Alt,		/*  60 */
-	KEY_Space,		/*  61 */
-	KEY_AltLang,		/*  62 */
-	KEY_RMeta,		/*  63 */
-	KEY_RCtrl,		/*  64 */
-	KEY_Menu,		/*  65 */
-	KEY_UNKNOWN,		/*  66 */
-	KEY_UNKNOWN,		/*  67 */
-	KEY_UNKNOWN,		/*  68 */
-	KEY_UNKNOWN,		/*  69 */
-	KEY_UNKNOWN,		/*  70 */
-	KEY_UNKNOWN,		/*  71 */
-	KEY_UNKNOWN,		/*  72 */
-	KEY_UNKNOWN,		/*  73 */
-	KEY_UNKNOWN,		/*  74 */
-	KEY_Insert,		/*  75 */
-	KEY_Delete,		/*  76 */
-	KEY_UNKNOWN,		/*  77 */
-	KEY_UNKNOWN,		/*  78 */
-	KEY_Left,		/*  79 */
-	KEY_Home,		/*  80 */
-	KEY_End,		/*  81 */
-	KEY_UNKNOWN,		/*  82 */
-	KEY_Up,			/*  83 */
-	KEY_Down,		/*  84 */
-	KEY_PgUp,		/*  85 */
-	KEY_PgDown,		/*  86 */
-	KEY_UNKNOWN,		/*  87 */
-	KEY_UNKNOWN,		/*  88 */
-	KEY_Right,		/*  89 */
-	KEY_NumLock,		/*  90 */
-	KEY_KP_7,		/*  91 */
-	KEY_KP_4,		/*  92 */
-	KEY_KP_1,		/*  93 */
-	KEY_UNKNOWN,		/*  94 */
-	KEY_KP_Divide,		/*  95 */
-	KEY_KP_8,		/*  96 */
-	KEY_KP_5,		/*  97 */
-	KEY_KP_2,		/*  98 */
-	KEY_KP_0,		/*  99 */
-	KEY_KP_Multiply,	/* 100 */
-	KEY_KP_9,		/* 101 */
-	KEY_KP_6,		/* 102 */
-	KEY_KP_3,		/* 103 */
-	KEY_KP_Decimal,		/* 104 */
-	KEY_KP_Minus,		/* 105 */
-	KEY_KP_Plus,		/* 106 */
-	KEY_UNKNOWN,		/* 107 */
-	KEY_KP_Enter,		/* 108 */
-	KEY_UNKNOWN,		/* 109 */
-	KEY_Escape,		/* 110 */
-	KEY_UNKNOWN,		/* 111 */
-	KEY_F1,			/* 112 */
-	KEY_F2,			/* 113 */
-	KEY_F3,			/* 114 */
-	KEY_F4,			/* 115 */
-	KEY_F5,			/* 116 */
-	KEY_F6,			/* 117 */
-	KEY_F7,			/* 118 */
-	KEY_F8,			/* 119 */
-	KEY_F9,			/* 120 */
-	KEY_F10,		/* 121 */
-	KEY_F11,		/* 122 */
-	KEY_F12,		/* 123 */
-	KEY_Print,		/* 124 */
-	KEY_ScrollLock,		/* 125 */
-	KEY_Pause,		/* 126 */
-	KEY_UNKNOWN,		/* 127 */
-	KEY_UNKNOWN,		/* 128 */
-	KEY_UNKNOWN,		/* 129 */
-	KEY_UNKNOWN,		/* 130 */
-	KEY_NFER,		/* 131 */
-	KEY_XFER,		/* 132 */
-	KEY_HKTG,		/* 133 */
-	KEY_UNKNOWN,		/* 134 */
-#elif defined(sparc) || defined(__sparc__)
-	KEY_UNKNOWN,		/* 0x00 */
-	KEY_UNKNOWN,		/* 0x01 */
-	KEY_UNKNOWN,		/* 0x02 */
-	KEY_UNKNOWN,		/* 0x03 */
-	KEY_UNKNOWN,		/* 0x04 */
-	KEY_F1,			/* 0x05 */
-	KEY_F2,			/* 0x06 */
-	KEY_F10,		/* 0x07 */
-	KEY_F3,			/* 0x08 */
-	KEY_F11,		/* 0x09 */
-	KEY_F4,			/* 0x0A */
-	KEY_F12,		/* 0x0B */
-	KEY_F5,			/* 0x0C */
-	KEY_UNKNOWN,		/* 0x0D */
-	KEY_F6,			/* 0x0E */
-	KEY_UNKNOWN,		/* 0x0F */
-	KEY_F7,			/* 0x10 */
-	KEY_F8,			/* 0x11 */
-	KEY_F9,			/* 0x12 */
-	KEY_Alt,		/* 0x13 */
-	KEY_Up,			/* 0x14 */
-	KEY_Pause,		/* 0x15 */
-	KEY_SysReqest,		/* 0x16 */
-	KEY_ScrollLock,		/* 0x17 */
-	KEY_Left,		/* 0x18 */
-	KEY_UNKNOWN,		/* 0x19 */
-	KEY_UNKNOWN,		/* 0x1A */
-	KEY_Down,		/* 0x1B */
-	KEY_Right,		/* 0x1C */
-	KEY_Escape,		/* 0x1D */
-	KEY_1,			/* 0x1E */
-	KEY_2,			/* 0x1F */
-	KEY_3,			/* 0x20 */
-	KEY_4,			/* 0x21 */
-	KEY_5,			/* 0x22 */
-	KEY_6,			/* 0x23 */
-	KEY_7,			/* 0x24 */
-	KEY_8,			/* 0x25 */
-	KEY_9,			/* 0x26 */
-	KEY_0,			/* 0x27 */
-	KEY_Minus,		/* 0x28 */
-	KEY_Equal,		/* 0x29 */
-	KEY_Tilde,		/* 0x2A */
-	KEY_BackSpace,		/* 0x2B */
-	KEY_Insert,		/* 0x2C */
-	KEY_UNKNOWN,		/* 0x2D */
-	KEY_KP_Divide,		/* 0x2E */
-	KEY_KP_Multiply,	/* 0x2F */
-	KEY_UNKNOWN,		/* 0x30 */
-	KEY_UNKNOWN,		/* 0x31 */
-	KEY_KP_Decimal,		/* 0x32 */
-	KEY_UNKNOWN,		/* 0x33 */
-	KEY_Home,		/* 0x34 */
-	KEY_Tab,		/* 0x35 */
-	KEY_Q,			/* 0x36 */
-	KEY_W,			/* 0x37 */
-	KEY_E,			/* 0x38 */
-	KEY_R,			/* 0x39 */
-	KEY_T,			/* 0x3A */
-	KEY_Y,			/* 0x3B */
-	KEY_U,			/* 0x3C */
-	KEY_I,			/* 0x3D */
-	KEY_O,			/* 0x3E */
-	KEY_P,			/* 0x3F */
-	KEY_LBrace,		/* 0x40 */
-	KEY_RBrace,		/* 0x41 */
-	KEY_Delete,		/* 0x42 */
-	KEY_UNKNOWN,		/* 0x43 */
-	KEY_KP_7,		/* 0x44 */
-	KEY_KP_8,		/* 0x45 */
-	KEY_KP_9,		/* 0x46 */
-	KEY_KP_Minus,		/* 0x47 */
-	KEY_UNKNOWN,		/* 0x48 */
-	KEY_UNKNOWN,		/* 0x49 */
-	KEY_End,		/* 0x4A */
-	KEY_UNKNOWN,		/* 0x4B */
-	KEY_LCtrl,		/* 0x4C */
-	KEY_A,			/* 0x4D */
-	KEY_S,			/* 0x4E */
-	KEY_D,			/* 0x4F */
-	KEY_F,			/* 0x50 */
-	KEY_G,			/* 0x51 */
-	KEY_H,			/* 0x52 */
-	KEY_J,			/* 0x53 */
-	KEY_K,			/* 0x54 */
-	KEY_L,			/* 0x55 */
-	KEY_SemiColon,		/* 0x56 */
-	KEY_Quote,		/* 0x57 */
-	KEY_BSlash,		/* 0x58 */
-	KEY_Enter,		/* 0x59 */
-	KEY_KP_Enter,		/* 0x5A */
-	KEY_KP_4,		/* 0x5B */
-	KEY_KP_5,		/* 0x5C */
-	KEY_KP_6,		/* 0x5D */
-	KEY_KP_0,		/* 0x5E */
-	KEY_UNKNOWN,		/* 0x5F */
-	KEY_PgUp,		/* 0x60 */
-	KEY_UNKNOWN,		/* 0x61 */
-	KEY_NumLock,		/* 0x62 */
-	KEY_ShiftL,		/* 0x63 */
-	KEY_Z,			/* 0x64 */
-	KEY_X,			/* 0x65 */
-	KEY_C,			/* 0x66 */
-	KEY_V,			/* 0x67 */
-	KEY_B,			/* 0x68 */
-	KEY_N,			/* 0x69 */
-	KEY_M,			/* 0x6A */
-	KEY_Comma,		/* 0x6B */
-	KEY_Period,		/* 0x6C */
-	KEY_Slash,		/* 0x6D */
-	KEY_ShiftR,		/* 0x6E */
-	KEY_UNKNOWN,		/* 0x6F */
-	KEY_KP_1,		/* 0x70 */
-	KEY_KP_2,		/* 0x71 */
-	KEY_KP_3,		/* 0x72 */
-	KEY_UNKNOWN,		/* 0x73 */
-	KEY_UNKNOWN,		/* 0x74 */
-	KEY_UNKNOWN,		/* 0x75 */
-	KEY_UNKNOWN,		/* 0x76 */
-	KEY_CapsLock,		/* 0x77 */
-	KEY_LMeta,		/* 0x78 */
-	KEY_Space,		/* 0x79 */
-	KEY_RMeta,		/* 0x7A */
-	KEY_PgDown,		/* 0x7B */
-	KEY_UNKNOWN,		/* 0x7C */
-	KEY_KP_Plus,		/* 0x7D */
-	KEY_UNKNOWN,		/* 0x7E */
-	KEY_UNKNOWN,		/* 0x7F */
-#endif
-	/* The rest default to KEY_UNKNOWN */
-};
-
-#if defined(KB_USB)
-static unsigned char usbmap[256] = {
-/*
- * partially taken from ../bsd/bsd_KbdMap.c
- *
- * added keycodes for Sun special keys (left function keys, audio control)
- */
-	/* 0 */ KEY_NOTUSED,
-	/* 1 */ KEY_NOTUSED,
-	/* 2 */ KEY_NOTUSED,
-	/* 3 */ KEY_NOTUSED,
-	/* 4 */ KEY_A,		
-	/* 5 */ KEY_B,
-	/* 6 */ KEY_C,
-	/* 7 */ KEY_D,
-	/* 8 */ KEY_E,
-	/* 9 */ KEY_F,
-	/* 10 */ KEY_G,
-	/* 11 */ KEY_H,
-	/* 12 */ KEY_I,
-	/* 13 */ KEY_J,
-	/* 14 */ KEY_K,
-	/* 15 */ KEY_L,
-	/* 16 */ KEY_M,
-	/* 17 */ KEY_N,
-	/* 18 */ KEY_O,
-	/* 19 */ KEY_P,
-	/* 20 */ KEY_Q,
-	/* 21 */ KEY_R,
-	/* 22 */ KEY_S,
-	/* 23 */ KEY_T,
-	/* 24 */ KEY_U,
-	/* 25 */ KEY_V,
-	/* 26 */ KEY_W,
-	/* 27 */ KEY_X,
-	/* 28 */ KEY_Y,
-	/* 29 */ KEY_Z,
-	/* 30 */ KEY_1,		/* 1 !*/
-	/* 31 */ KEY_2,		/* 2 @ */
-	/* 32 */ KEY_3,		/* 3 # */
-	/* 33 */ KEY_4,		/* 4 $ */
-	/* 34 */ KEY_5,		/* 5 % */
-	/* 35 */ KEY_6,		/* 6 ^ */
-	/* 36 */ KEY_7,		/* 7 & */
-	/* 37 */ KEY_8,		/* 8 * */
-	/* 38 */ KEY_9,		/* 9 ( */
-	/* 39 */ KEY_0,		/* 0 ) */
-	/* 40 */ KEY_Enter,	/* Return  */
-	/* 41 */ KEY_Escape,	/* Escape */
-	/* 42 */ KEY_BackSpace,	/* Backspace Delete */
-	/* 43 */ KEY_Tab,	/* Tab */
-	/* 44 */ KEY_Space,	/* Space */
-	/* 45 */ KEY_Minus,	/* - _ */
-	/* 46 */ KEY_Equal,	/* = + */
-	/* 47 */ KEY_LBrace,	/* [ { */
-	/* 48 */ KEY_RBrace,	/* ] } */
-	/* 49 */ KEY_BSlash,	/* \ | */
-	/* 50 */ KEY_BSlash,	/* \ _ # ~ on some keyboards */
-	/* 51 */ KEY_SemiColon,	/* ; : */
-	/* 52 */ KEY_Quote,	/* ' " */
-	/* 53 */ KEY_Tilde,	/* ` ~ */
-	/* 54 */ KEY_Comma,	/* , <  */
-	/* 55 */ KEY_Period,	/* . > */
-	/* 56 */ KEY_Slash,	/* / ? */
-	/* 57 */ KEY_CapsLock,	/* Caps Lock */
-	/* 58 */ KEY_F1,		/* F1 */
-	/* 59 */ KEY_F2,		/* F2 */
-	/* 60 */ KEY_F3,		/* F3 */
-	/* 61 */ KEY_F4,		/* F4 */
-	/* 62 */ KEY_F5,		/* F5 */
-	/* 63 */ KEY_F6,		/* F6 */
-	/* 64 */ KEY_F7,		/* F7 */
-	/* 65 */ KEY_F8,		/* F8 */
-	/* 66 */ KEY_F9,		/* F9 */
-	/* 67 */ KEY_F10,	/* F10 */
-	/* 68 */ KEY_F11,	/* F11 */
-	/* 69 */ KEY_F12,	/* F12 */
-	/* 70 */ KEY_Print,	/* PrintScrn SysReq */
-	/* 71 */ KEY_ScrollLock,	/* Scroll Lock */
-	/* 72 */ KEY_Pause,	/* Pause Break */
-	/* 73 */ KEY_Insert,	/* Insert XXX  Help on some Mac Keyboards */
-	/* 74 */ KEY_Home,	/* Home */
-	/* 75 */ KEY_PgUp,	/* Page Up */
-	/* 76 */ KEY_Delete,	/* Delete */
-	/* 77 */ KEY_End,	/* End */
-	/* 78 */ KEY_PgDown,	/* Page Down */
-	/* 79 */ KEY_Right,	/* Right Arrow */
-	/* 80 */ KEY_Left,	/* Left Arrow */
-	/* 81 */ KEY_Down,	/* Down Arrow */
-	/* 82 */ KEY_Up,		/* Up Arrow */
-	/* 83 */ KEY_NumLock,	/* Num Lock */
-	/* 84 */ KEY_KP_Divide,	/* Keypad / */
-	/* 85 */ KEY_KP_Multiply, /* Keypad * */
-	/* 86 */ KEY_KP_Minus,	/* Keypad - */
-	/* 87 */ KEY_KP_Plus,	/* Keypad + */
-	/* 88 */ KEY_KP_Enter,	/* Keypad Enter */
-	/* 89 */ KEY_KP_1,	/* Keypad 1 End */
-	/* 90 */ KEY_KP_2,	/* Keypad 2 Down */
-	/* 91 */ KEY_KP_3,	/* Keypad 3 Pg Down */
-	/* 92 */ KEY_KP_4,	/* Keypad 4 Left  */
-	/* 93 */ KEY_KP_5,	/* Keypad 5 */
-	/* 94 */ KEY_KP_6,	/* Keypad 6 */
-	/* 95 */ KEY_KP_7,	/* Keypad 7 Home */
-	/* 96 */ KEY_KP_8,	/* Keypad 8 Up */
-	/* 97 */ KEY_KP_9,	/* KEypad 9 Pg Up */
-	/* 98 */ KEY_KP_0,	/* Keypad 0 Ins */
-	/* 99 */ KEY_KP_Decimal,	/* Keypad . Del */
-	/* 100 */ KEY_Less,	/* < > on some keyboards */
-	/* 101 */ KEY_Menu,	/* Menu */
-	/* 102 */ KEY_Power,	/* Sun: Power */
-	/* 103 */ KEY_KP_Equal, /* Keypad = on Mac keyboards */
-	/* 104 */ KEY_NOTUSED,
-	/* 105 */ KEY_NOTUSED,
-	/* 106 */ KEY_NOTUSED,
-	/* 107 */ KEY_NOTUSED,
-	/* 108 */ KEY_NOTUSED,
-	/* 109 */ KEY_NOTUSED,
-	/* 110 */ KEY_NOTUSED,
-	/* 111 */ KEY_NOTUSED,
-	/* 112 */ KEY_NOTUSED,
-	/* 113 */ KEY_NOTUSED,
-	/* 114 */ KEY_NOTUSED,
-	/* 115 */ KEY_NOTUSED,
-	/* 116 */ KEY_L7,	/* Sun: Open */
-	/* 117 */ KEY_Help,	/* Sun: Help */
-	/* 118 */ KEY_L3,	/* Sun: Props */
-	/* 119 */ KEY_L5,	/* Sun: Front */
-	/* 120 */ KEY_L1,	/* Sun: Stop */
-	/* 121 */ KEY_L2,	/* Sun: Again */
-	/* 122 */ KEY_L4,	/* Sun: Undo */
-	/* 123 */ KEY_L10,	/* Sun: Cut */
-	/* 124 */ KEY_L6,	/* Sun: Copy */
-	/* 125 */ KEY_L8,	/* Sun: Paste */
-	/* 126 */ KEY_L9,	/* Sun: Find */
-	/* 127 */ KEY_Mute,	/* Sun: AudioMute */
-	/* 128 */ KEY_AudioRaise,	/* Sun: AudioRaise */
-	/* 129 */ KEY_AudioLower,	/* Sun: AudioLower */
-	/* 130 */ KEY_NOTUSED,
-	/* 131 */ KEY_NOTUSED,
-	/* 132 */ KEY_NOTUSED,
-	/* 133 */ KEY_NOTUSED,
-	/* 134 */ KEY_NOTUSED,
-	/* 135 */ KEY_BSlash2,	/* Sun Japanese Kbd: Backslash / Underscore */
-	/* 136 */ KEY_XFER,	/* Sun Japanese Kbd: Henkan Mode */
-	/* 137 */ KEY_Yen,	/* Sun Japanese Kbd: Yen / Brokenbar */
-	/* 138 */ KEY_Kanji,	/* Sun Japanese Kbd: Kanji */
-	/* 139 */ KEY_Execute,	/* Sun Japanese Kbd: Execute */
-	/* 140 */ KEY_NOTUSED,
-	/* 141 */ KEY_NOTUSED,
-	/* 142 */ KEY_NOTUSED,
-	/* 143 */ KEY_NOTUSED,
-	/* 144 */ KEY_NOTUSED,
-	/* 145 */ KEY_NOTUSED,
-	/* 146 */ KEY_NOTUSED,
-	/* 147 */ KEY_NOTUSED,
-	/* 148 */ KEY_NOTUSED,
-	/* 149 */ KEY_NOTUSED,
-	/* 150 */ KEY_NOTUSED,
-	/* 151 */ KEY_NOTUSED,
-	/* 152 */ KEY_NOTUSED,
-	/* 153 */ KEY_NOTUSED,
-	/* 154 */ KEY_NOTUSED,
-	/* 155 */ KEY_NOTUSED,
-	/* 156 */ KEY_NOTUSED,
-	/* 157 */ KEY_NOTUSED,
-	/* 158 */ KEY_NOTUSED,
-	/* 159 */ KEY_NOTUSED,
-	/* 160 */ KEY_NOTUSED,
-	/* 161 */ KEY_NOTUSED,
-	/* 162 */ KEY_NOTUSED,
-	/* 163 */ KEY_NOTUSED,
-	/* 164 */ KEY_NOTUSED,
-	/* 165 */ KEY_NOTUSED,
-	/* 166 */ KEY_NOTUSED,
-	/* 167 */ KEY_NOTUSED,
-	/* 168 */ KEY_NOTUSED,
-	/* 169 */ KEY_NOTUSED,
-	/* 170 */ KEY_NOTUSED,
-	/* 171 */ KEY_NOTUSED,
-	/* 172 */ KEY_NOTUSED,
-	/* 173 */ KEY_NOTUSED,
-	/* 174 */ KEY_NOTUSED,
-	/* 175 */ KEY_NOTUSED,
-	/* 176 */ KEY_NOTUSED,
-	/* 177 */ KEY_NOTUSED,
-	/* 178 */ KEY_NOTUSED,
-	/* 179 */ KEY_NOTUSED,
-	/* 180 */ KEY_NOTUSED,
-	/* 181 */ KEY_NOTUSED,
-	/* 182 */ KEY_NOTUSED,
-	/* 183 */ KEY_NOTUSED,
-	/* 184 */ KEY_NOTUSED,
-	/* 185 */ KEY_NOTUSED,
-	/* 186 */ KEY_NOTUSED,
-	/* 187 */ KEY_NOTUSED,
-	/* 188 */ KEY_NOTUSED,
-	/* 189 */ KEY_NOTUSED,
-	/* 190 */ KEY_NOTUSED,
-	/* 191 */ KEY_NOTUSED,
-	/* 192 */ KEY_NOTUSED,
-	/* 193 */ KEY_NOTUSED,
-	/* 194 */ KEY_NOTUSED,
-	/* 195 */ KEY_NOTUSED,
-	/* 196 */ KEY_NOTUSED,
-	/* 197 */ KEY_NOTUSED,
-	/* 198 */ KEY_NOTUSED,
-	/* 199 */ KEY_NOTUSED,
-	/* 200 */ KEY_NOTUSED,
-	/* 201 */ KEY_NOTUSED,
-	/* 202 */ KEY_NOTUSED,
-	/* 203 */ KEY_NOTUSED,
-	/* 204 */ KEY_NOTUSED,
-	/* 205 */ KEY_NOTUSED,
-	/* 206 */ KEY_NOTUSED,
-	/* 207 */ KEY_NOTUSED,
-	/* 208 */ KEY_NOTUSED,
-	/* 209 */ KEY_NOTUSED,
-	/* 210 */ KEY_NOTUSED,
-	/* 211 */ KEY_NOTUSED,
-	/* 212 */ KEY_NOTUSED,
-	/* 213 */ KEY_NOTUSED,
-	/* 214 */ KEY_NOTUSED,
-	/* 215 */ KEY_NOTUSED,
-	/* 216 */ KEY_NOTUSED,
-	/* 217 */ KEY_NOTUSED,
-	/* 218 */ KEY_NOTUSED,
-	/* 219 */ KEY_NOTUSED,
-	/* 220 */ KEY_NOTUSED,
-	/* 221 */ KEY_NOTUSED,
-	/* 222 */ KEY_NOTUSED,
-	/* 223 */ KEY_NOTUSED,
-	/* 224 */ KEY_LCtrl,	/* Left Control */
-	/* 225 */ KEY_ShiftL,	/* Left Shift */
-	/* 226 */ KEY_Alt,	/* Left Alt */
-	/* 227 */ KEY_LMeta,	/* Left Meta */
-	/* 228 */ KEY_RCtrl,	/* Right Control */
-	/* 229 */ KEY_ShiftR,	/* Right Shift */
-	/* 230 */ KEY_AltLang,	/* Right Alt, AKA AltGr */
-	/* 231 */ KEY_RMeta,	/* Right Meta */
-};
-
-#endif /* KB_USB */
-
-_X_HIDDEN const unsigned char *
-sunGetKbdMapping(int ktype) {
-#if defined(KB_USB)
-    if (ktype == KB_USB)
-        return usbmap;
-    else
-#endif
-        return map;
-}
-
-
-/*
- * sunPostKbdEvent --
- *	Translate the raw hardware Firm_event into an XEvent, and tell DIX
- *	about it. KeyCode preprocessing and so on is done ...
- *
- * Most of the Solaris stuff has whacked Panix/PC98 support in the
- * interests of simplicity - DWH 8/30/99
- */
-
-_X_HIDDEN void
-sunPostKbdEvent(int sun_ktype, Firm_event *event)
-{
-    Bool        down;
-    KeyClassRec *keyc = ((DeviceIntPtr)xf86Info.pKeyboard)->key;
-    Bool        updateLeds = FALSE;
-    xEvent      kevent;
-    KeySym      *keysym;
-    int         keycode;
-    static int  lockkeys = 0;
-
-    /* Give down a value */
-    if (event->value == VKEY_DOWN)
-	down = TRUE;
-    else
-	down = FALSE;
-
-
-#if defined(KB_USB)
-    if(sun_ktype == KB_USB)
-	keycode = usbmap[event->id];
-    else
-#endif
-	keycode = map[event->id];
-
-    /*
-     * and now get some special keysequences
-     */
-    
-#ifdef XKB
-    if (((xf86Info.ddxSpecialKeys == SKWhenNeeded) &&
-	 (!xf86Info.ActionKeyBindingsSet)) ||
-	noXkbExtension || (xf86Info.ddxSpecialKeys == SKAlways))
-#endif
-    {
-	if (!(ModifierDown(ShiftMask)) &&
-	    ((ModifierDown(ControlMask | AltMask)) ||
-	     (ModifierDown(ControlMask | AltLangMask))))
-	{
-	    switch (keycode) {
-	    /*
-	     * The idea here is to pass the scancode down to a list of 
-	     * registered routines.  There should be some standard conventions
-	     * for processing certain keys.
-	     */
-	    case KEY_BackSpace:
-		xf86ProcessActionEvent(ACTION_TERMINATE, NULL);
-		break;
-		
-	    /*
-	     * Check grabs
-	     */
-	    case KEY_KP_Divide:
-		xf86ProcessActionEvent(ACTION_DISABLEGRAB, NULL);
-		break;
-	    case KEY_KP_Multiply:
-		xf86ProcessActionEvent(ACTION_CLOSECLIENT, NULL);
-		break;
-		
-	    /*
-	     * Video mode switches
-	     */
-	    case KEY_KP_Minus:   /* Keypad - */
-		if (down) xf86ProcessActionEvent(ACTION_PREV_MODE, NULL);
-		if (!xf86Info.dontZoom) return;
-		break;
-		
-	    case KEY_KP_Plus:   /* Keypad + */
-		if (down) xf86ProcessActionEvent(ACTION_NEXT_MODE, NULL);
-		if (!xf86Info.dontZoom) return;
-		break;
-	    }
-	}
-    }
-
-    /*
-     * Now map the scancodes to real X-keycodes ...
-     */
-    if (keycode == KEY_NOTUSED) {
-	xf86MsgVerb(X_INFO, 0,
-	    "raw code %d mapped to KEY_NOTUSED -- please report\n", event->id);
-	return;
-    }
-    if (keycode == KEY_UNKNOWN) {
-	xf86MsgVerb(X_INFO, 0,
-	    "raw code %d mapped to KEY_UNKNOWN -- please report\n", event->id);
-	return;
-    }
-    keycode += MIN_KEYCODE;
-    keysym = keyc->curKeySyms.map +
-	     (keyc->curKeySyms.mapWidth *
-	      (keycode - keyc->curKeySyms.minKeyCode));
-
-#ifdef XKB
-    if (noXkbExtension)
-#endif
-    {
-	/*
-	 * Toggle lock keys.
-	 */
-#define CAPSFLAG 0x01
-#define NUMFLAG 0x02
-#define SCROLLFLAG 0x04
-#define MODEFLAG 0x08
-
-	if (down) {
-	    /*
-	     * Handle the KeyPresses of the lock keys.
-	     */
-
-	    switch (keysym[0]) {
-
-	    case XK_Caps_Lock:
-		if (lockkeys & CAPSFLAG) {
-		    lockkeys &= ~CAPSFLAG;
-		    return;
-		}
-		lockkeys |= CAPSFLAG;
-		updateLeds = TRUE;
-		xf86Info.capsLock = down;
-		break;
-
-	    case XK_Num_Lock:
-		if (lockkeys & NUMFLAG) {
-		    lockkeys &= ~NUMFLAG;
-		    return;
-		}
-		lockkeys |= NUMFLAG;
-		updateLeds = TRUE;
-		xf86Info.numLock = down;
-		break;
-
-	    case XK_Scroll_Lock:
-		if (lockkeys & SCROLLFLAG) {
-		    lockkeys &= ~SCROLLFLAG;
-		    return;
-		}
-		lockkeys |= SCROLLFLAG;
-		updateLeds = TRUE;
-		xf86Info.scrollLock = down;
-		break;
-	    }
-	} else {
-	    /*
-	     * Handle the releases of the lock keys.
-	     */
-
-	    switch (keysym[0]) {
-
-	    case XK_Caps_Lock:
-		if (lockkeys & CAPSFLAG)
-		    return;
-		updateLeds = TRUE;
-		xf86Info.capsLock = down;
-		break;
-
-	    case XK_Num_Lock:
-		if (lockkeys & NUMFLAG)
-		    return;
-		updateLeds = TRUE;
-		xf86Info.numLock = down;
-		break;
-
-	    case XK_Scroll_Lock:
-		if (lockkeys & SCROLLFLAG)
-		    return;
-		updateLeds = TRUE;
-		xf86Info.scrollLock = down;
-		break;
-	    }
-	}
-
-  	if (updateLeds)
-	    xf86KbdLeds();
-
-	/*
-	 * If this keycode is not a modifier key, and its down initiate the
-	 * autorepeate sequence.  (Only necessary if not using XKB).
-	 *
-	 * If its not down, then reset the timer.
-	 */
-	if (!keyc->modifierMap[keycode]) {
-	    if (down) {
-		startautorepeat(keycode);
-	    } else {
-		TimerFree(sunTimer);
-		sunTimer = NULL;
-	    }
-  	}
-    }
-
-    xf86Info.lastEventTime =
-	kevent.u.keyButtonPointer.time =
-	    GetTimeInMillis();
-
-    /*
-     * And now send these prefixes ...
-     * NOTE: There cannot be multiple Mode_Switch keys !!!!
-     */
-
-    ENQUEUE(&kevent, keycode, (down ? KeyPress : KeyRelease), XE_KEYBOARD);
-}
-
-
-
-/*
- * Autorepeat stuff
- */
-
-void
-startautorepeat(long keycode)
-{
-    sunTimer = TimerSet(sunTimer, 		/* Timer */
-			0, 			/* Flags */
-			xf86Info.kbdDelay,	/* millis */
-			processautorepeat,	/* callback */
-			(pointer) keycode);	/* arg for timer */
-}
-
-CARD32
-processautorepeat(OsTimerPtr timer, CARD32 now, pointer arg)
-{
-    xEvent kevent;
-    int    keycode;
-
-    keycode = (long)arg;
-
-    xf86Info.lastEventTime =
-	kevent.u.keyButtonPointer.time =
-	    GetTimeInMillis();
-
-    /*
-     * Repeat a key by faking a KeyRelease, and a KeyPress event in rapid
-     * succession
-     */
-
-    ENQUEUE(&kevent, keycode,  KeyRelease, XE_KEYBOARD);
-    ENQUEUE(&kevent, keycode,  KeyPress, XE_KEYBOARD);
-
-    /* And return the appropriate value so we get rescheduled */
-    return xf86Info.kbdRate;
-}
diff --git a/hw/xfree86/os-support/sysv/sysv_io.c b/hw/xfree86/os-support/sysv/sysv_io.c
deleted file mode 100644
index d6c8ca0..0000000
--- a/hw/xfree86/os-support/sysv/sysv_io.c
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Thomas Roell and David Dawes 
- * not be used in advertising or publicity pertaining to distribution of 
- * the software without specific, written prior permission.  Thomas Roell and
- * David Dawes makes no representations about the suitability of this 
- * software for any purpose.  It is provided "as is" without express or 
- * implied warranty.
- *
- * THOMAS ROELL AND DAVID DAWES DISCLAIMS ALL WARRANTIES WITH REGARD TO 
- * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 
- * FITNESS, IN NO EVENT SHALL THOMAS ROELL OR DAVID DAWES BE LIABLE FOR 
- * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER 
- * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF 
- * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium: sysv_io.c /main/8 1996/10/19 18:08:06 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-_X_EXPORT void
-xf86SoundKbdBell(int loudness, int pitch, int duration)
-{
-	if (loudness && pitch)
-	{
-#ifdef KDMKTONE
-		/*
-		 * If we have KDMKTONE use it to avoid putting the server
-		 * to sleep
-		 */
-		ioctl(xf86Info.consoleFd, KDMKTONE,
-		      ((1193190 / pitch) & 0xffff) |
-		      (((unsigned long)duration *
-			loudness / 50) << 16));
-#else
-		ioctl(xf86Info.consoleFd, KIOCSOUND, 1193180 / pitch);
-		usleep(xf86Info.bell_duration * loudness * 20);
-		ioctl(xf86Info.consoleFd, KIOCSOUND, 0);
-#endif
-	}
-}
-
-void
-xf86SetKbdLeds(int leds)
-{
-#ifdef KBIO_SETMODE
-	ioctl(xf86Info.consoleFd, KBIO_SETMODE, KBM_AT);
-	ioctl(xf86Info.consoleFd, KDSETLED, leds);
-	ioctl(xf86Info.consoleFd, KBIO_SETMODE, KBM_XT);
-#endif
-}
-
-#include "xf86OSKbd.h"
-
-_X_EXPORT Bool
-xf86OSKbdPreInit(InputInfoPtr pInfo)
-{
-    return FALSE;
-}
diff --git a/hw/xfree86/os-support/usl/Makefile.am b/hw/xfree86/os-support/usl/Makefile.am
index 5143b24..58f9760 100644
--- a/hw/xfree86/os-support/usl/Makefile.am
+++ b/hw/xfree86/os-support/usl/Makefile.am
@@ -2,9 +2,6 @@ EXTRA_DIST = \
 	usl_init.c \
 	usl_io.c \
 	usl_iop.c \
-	usl_kbd.c \
-	usl_kbd.h \
-	usl_KbdMap.c \
 	usl_mouse.c \
 	usl_video.c \
 	usl_vtsw.c \
diff --git a/hw/xfree86/os-support/usl/usl_KbdMap.c b/hw/xfree86/os-support/usl/usl_KbdMap.c
deleted file mode 100644
index 76032e6..0000000
--- a/hw/xfree86/os-support/usl/usl_KbdMap.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* $XdotOrg$ */
-/*
- * Copyright 2005 by J. Kean Johnston <jkj at sco.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name J. Kean Johnston not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  J. Kean Johnston makes no
- * representations about the suitability of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- *
- * J. KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL J. KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * Based on xf86KbdMap.c, which is
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- * Copyright (c) 1992-2003 by The XFree86 Project, Inc.
- */
-
-#include "X.h"
-#include "Xmd.h"
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-#include "xf86Keymap.h"
-
-#include "usl_kbd.h"
-
-#define KD_GET_ENTRY(i,n) \
-  eascii_to_x[((priv->keymap.key[i].spcl << (n+1)) & 0x100) + priv->keymap.key[i].map[n]]
-
-/*
- * NOTE: Not all possible remappable symbols are remapped. There are two main
- *       reasons:
- *                 a) The mapping between scancode and SYSV/386 - symboltable
- *                    is inconsistent between different versions and has some
- *                    BIG mistakes.
- *                 b) In X-Windows there is a difference between numpad-keys
- *                    and normal keys. SYSV/386 uses for both kinds of keys
- *                    the same symbol.
- *
- *       Thus only the alpha keypad and the function keys are translated.
- *       Also CapsLock, NumLock, ScrollLock, Shift, Control & Alt.
- */
-
-static unsigned char remap[128] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-static KeySym eascii_to_x[512] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
-	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
-	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
-	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
-	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
-	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
-	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
-	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
-	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
-	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
-	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
-	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
-	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
-	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
-	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
-	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
-	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
-	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
-	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
-
-	/* 
-	 * special marked entries (256 + x)
-	 */
-
-	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
-	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
-	NoSymbol,	XK_Control_L,	XK_Alt_L,	XK_Alt_R,
-	XK_Control_L,	XK_Control_R,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
-	XK_F2,		XK_F3,		XK_F4,		XK_F5,
-	XK_F6,		XK_F7,		XK_F8,		XK_F9,
-	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-      };
-
-/*
- * KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-void
-KbdGetMapping (InputInfoPtr pInfo, KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
-  KeySym *k;
-  int i;
-  KeySym *pMap = map;
-
-  for (i = 0; i < priv->keymap.n_keys && i < NUM_KEYCODES; i++) {
-    if (remap[i]) {
-      k = pMap + (remap[i] << 2);
-	
-      k[0] = KD_GET_ENTRY(i,0);             /* non-shifed */
-      k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
-      k[2] = KD_GET_ENTRY(i,4);	      /* alt */
-      k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
-
-      if (k[3] == k[2]) k[3] = NoSymbol;
-      if (k[2] == k[1]) k[2] = NoSymbol;
-      if (k[1] == k[0]) k[1] = NoSymbol;
-      if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
-    }
-  }
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = pMap, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4) {
-    
-    switch(*k) {
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-    }
-  }
-
-  pKeySyms->map        = pMap;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE;
-}
diff --git a/hw/xfree86/os-support/usl/usl_kbd.c b/hw/xfree86/os-support/usl/usl_kbd.c
deleted file mode 100644
index d6e6af2..0000000
--- a/hw/xfree86/os-support/usl/usl_kbd.c
+++ /dev/null
@@ -1,455 +0,0 @@
-/*
- * Copyright 2005 by Kean Johnston <jkj at sco.com>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name Kean Johnston not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Kean Johnston makes no
- * representations about the suitability of this software for any purpose.
- * It is provided "as is" without express or implied warranty.
- *
- * KEAN JOHNSTON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEAN JOHNSTON BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
- * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/* $XConsortium$ */
-
-/*
- * Based on sco_io.c which is
- * (C) Copyright 2003 Kean Johnston <jkj at sco.com>
- *
- * Based on lnx_kbd.c which is 
- * Copyright (c) 2002 by The XFree86 Project, Inc.
- *
- * Based on the code from lnx_io.c which is
- * Copyright 1992 by Orest Zborowski <obz at Kodak.com>
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- */
-
-#define NEED_EVENTS
-#include "X.h"
-
-#include "compiler.h"
-
-#define _NEED_SYSI86
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86OSpriv.h"
-#include "xf86_OSlib.h"
-
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-#include "usl_kbd.h"
-#include "usl_xqueue.h"
-
-#include <sys/param.h>
-
-static KbdProtocolRec protocols[] = {
-  { "standard", PROT_STD },
-  { "Xqueue", PROT_XQUEUE },
-  { NULL, PROT_UNKNOWN_KBD }
-};
-
-extern Bool VTSwitchEnabled;
-#ifdef USE_VT_SYSREQ
-extern Bool VTSysreqToggle;
-#endif
-
-static void
-SoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
-{
-  if (loudness && pitch) {
-    ioctl(pInfo->fd, KIOCSOUND, 1193180 / pitch);
-    usleep(duration * loudness * 20);
-    ioctl(pInfo->fd, KIOCSOUND, 0);
-  }
-}
-
-static void
-SetKbdLeds(InputInfoPtr pInfo, int leds)
-{
-  int real_leds = 0;
-
-  if (leds & XLED1)
-    real_leds |= LED_CAP;
-  if (leds & XLED2)
-    real_leds |= LED_NUM;
-  if (leds & XLED3)
-    real_leds |= LED_SCR;
-  ioctl(pInfo->fd, KDSETLED, real_leds);
-}
-
-static int
-GetKbdLeds(InputInfoPtr pInfo)
-{
-    int real_leds, leds = 0;
-
-    ioctl(pInfo->fd, KDGETLED, &real_leds);
-
-    if (real_leds & LED_CAP) leds |= XLED1;
-    if (real_leds & LED_NUM) leds |= XLED2;
-    if (real_leds & LED_SCR) leds |= XLED3;
-
-    return(leds);
-}
-
-static void
-SetKbdRepeat(InputInfoPtr pInfo, char rad)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  int i;
-  int value = 0x7f;     /* Maximum delay with slowest rate */
-  int delay = 250;      /* Default delay */
-  int rate = 300;       /* Default repeat rate */
-
-  static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
-                               133, 120, 109, 100, 92, 86, 80, 75, 67,
-                               60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
-                               25, 23, 21, 20 };
-#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
-
-  static int valid_delays[] = { 250, 500, 750, 1000 };
-#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
-
-  if (pKbd->rate >= 0) 
-    rate = pKbd->rate * 10;
-  if (pKbd->delay >= 0)
-    delay = pKbd->delay;
-
-  for (i = 0; i < RATE_COUNT; i++)
-    if (rate >= valid_rates[i]) {
-      value &= 0x60;
-      value |= i;
-      break;
-    }
-
-  for (i = 0; i < DELAY_COUNT; i++)
-    if (delay <= valid_delays[i]) {
-      value &= 0x1f;
-      value |= i << 5;
-      break;
-    }
-
-  ioctl (pInfo->fd, KDSETTYPEMATICS, value);
-}
-
-static int
-KbdInit(InputInfoPtr pInfo, int what)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
-
-  if (pKbd->isConsole) {
-    if (ioctl (pInfo->fd, KDGKBMODE, &priv->orig_kbm) < 0) {
-      xf86Msg (X_ERROR, "KbdInit: Could not determine keyboard mode\n");
-      return !Success;
-    }
-
-    /*
-     * We need to get the original keyboard map and NUL out the lock
-     * modifiers. This prevents the kernel from messing with
-     * the keyboard LED's. We restore the original map when we exit.
-     * Note that we also have to eliminate screen switch sequences
-     * else the VT manager will switch for us, which we don't want.
-     * For example, lets say you had changed the VT manager to switch
-     * on Alt-Fx instead of Ctrl-Alt-Fx. This means that while inside
-     * X, you cant use, for example, Alt-F4, which is a pain in the
-     * fundamental when you're using CDE-like thingies.
-     */
-    if (ioctl (pInfo->fd, GIO_KEYMAP, &priv->keymap) < 0) {
-      xf86Msg (X_ERROR, "KbdInit: Failed to get keyboard map (%s)\n",
-        strerror(errno));
-      return !Success;
-    }
-    if (ioctl (pInfo->fd, GIO_KEYMAP, &priv->noledmap) < 0) {
-      xf86Msg (X_ERROR, "KbdInit: Failed to get keyboard map (%s)\n",
-        strerror(errno));
-      return !Success;
-    } else {
-      int i, j;
-
-      for (i = 0; i < priv->noledmap.n_keys; i++) {
-        for (j = 0; j < NUM_STATES; j++) {
-          if (IS_SPECKEY(&priv->noledmap, i, j) &&
-            ((priv->noledmap.key[i].map[j] == K_CLK) ||
-             (priv->noledmap.key[i].map[j] == K_NLK) ||
-             (priv->noledmap.key[i].map[j] == K_SLK) ||
-             (priv->noledmap.key[i].map[j] == K_FRCNEXT) ||
-             (priv->noledmap.key[i].map[j] == K_FRCPREV) ||
-             ((priv->noledmap.key[i].map[j] >=  K_VTF) &&
-	      (priv->noledmap.key[i].map[j] <= K_VTL)) )) {
-            priv->noledmap.key[i].map[j] = K_NOP;
-          }
-        }
-      }
-    }
-
-    if (ioctl (pInfo->fd, TCGETA, &priv->kbdtty) < 0) {
-      xf86Msg (X_ERROR, "KbdInit: Failed to get terminal modes (%s)\n",
-        strerror(errno));
-      return !Success;
-    }
-  } /* End of if we are on a console */
-
-  return Success;
-}
-
-static int
-KbdOn(InputInfoPtr pInfo, int what)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
-  struct termio newtio;
-
-  if (pKbd->isConsole) {
-    /*
-     * Use the calculated keyboard map that does not have active
-     * LED lock handling (we track LEDs ourselves).
-     */
-    ioctl (pInfo->fd, PIO_KEYMAP, &priv->noledmap);
-
-#ifdef NOTYET
-    newtio = priv->kbdtty;     /* structure copy */
-    newtio.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-    newtio.c_oflag = 0;
-    newtio.c_cflag = CREAD | CS8 | B9600;
-    newtio.c_lflag = 0;
-    newtio.c_cc[VTIME]=0;
-    newtio.c_cc[VMIN]=1;
-    ioctl(pInfo->fd, TCSETA, &newtio);
-
-    if (priv->xq == 0)
-      ioctl (pInfo->fd, KDSKBMODE, K_RAW);
-    else
-#endif
-      XqKbdOnOff (pInfo, 1);
-  }
-
-  return Success;
-}
-
-static int
-KbdOff(InputInfoPtr pInfo, int what)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
-
-  if (pKbd->isConsole) {
-    /* Revert back to original translate scancode mode */
-#ifdef NOTYET
-    if (priv->xq == 0)
-      ioctl (pInfo->fd, KDSKBMODE, priv->orig_kbm);
-    else
-#endif
-      XqKbdOnOff (pInfo, 0);
-
-    ioctl (pInfo->fd, PIO_KEYMAP, &priv->keymap);
-    ioctl(pInfo->fd, TCSETA, &priv->kbdtty);
-  }
-
-  return Success;
-}
-
-#define ModifierSet(k) ((modifiers & (k)) == (k))
-
-static Bool
-SpecialKey(InputInfoPtr pInfo, int key, Bool down, int modifiers)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-
-  if(!pKbd->vtSwitchSupported)
-    return FALSE;
-
-  if ((!ModifierSet(ShiftMask)) && ((ModifierSet(ControlMask | AltMask)) ||
-      (ModifierSet(ControlMask | AltLangMask)))) {
-    if (VTSwitchEnabled && !xf86Info.vtSysreq) {
-      switch (key) {
-        case KEY_F1:
-        case KEY_F2:
-        case KEY_F3:
-        case KEY_F4:
-        case KEY_F5:
-        case KEY_F6:
-        case KEY_F7:
-        case KEY_F8:
-        case KEY_F9:
-        case KEY_F10:
-          if (down) {
-	    int sts = key - KEY_F1;
-	    if (sts != xf86Info.vtno) {
-	      ioctl(pInfo->fd, VT_SWITCH, sts);
-	    }
-            return TRUE;
-          }
-        case KEY_F11:
-        case KEY_F12:
-          if (down) {
-	    int sts = key - KEY_F11 + 10;
-	    if (sts != xf86Info.vtno) {
-	      ioctl(pInfo->fd, VT_SWITCH, sts);
-	    }
-            return TRUE;
-          }
-      }
-    }
-  }
-#ifdef USE_VT_SYSREQ
-  if (VTSwitchEnabled && xf86Info.vtSysreq) {
-    switch (key) {
-      case KEY_F1:
-      case KEY_F2:
-      case KEY_F3:
-      case KEY_F4:
-      case KEY_F5:
-      case KEY_F6:
-      case KEY_F7:
-      case KEY_F8:
-      case KEY_F9:
-      case KEY_F10:
-        if (VTSysreqToggle && down) {
-          ioctl(pInfo->fd, VT_ACTIVATE, key - KEY_F1);
-          VTSysreqToggle = FALSE;
-          return TRUE;
-        }
-        break;
-      case KEY_F11:
-      case KEY_F12:
-        if (VTSysreqToggle && down) {
-          ioctl(pInfo->fd, VT_ACTIVATE, key - KEY_F11 + 10);
-          VTSysreqToggle = FALSE;
-          return TRUE;
-        }
-        break;
-        /* Ignore these keys -- ie don't let them cancel an alt-sysreq */
-      case KEY_Alt:
-      case KEY_AltLang:
-        break;
-      case KEY_SysReqest:
-        if (!(ModifierSet(ShiftMask) || ModifierSet(ControlMask))) {
-          if ((ModifierSet(AltMask) || ModifierSet(AltLangMask)) && down)
-            VTSysreqToggle = TRUE;
-        }
-        break;
-      default:
-        /*
-         * We only land here when Alt-SysReq is followed by a
-         * non-switching key.
-         */
-        if (VTSysreqToggle)
-          VTSysreqToggle = FALSE;
-    }
-  }
-#endif /* USE_VT_SYSREQ */
-  return FALSE;
-} 
-
-#ifdef NOTYET
-static void
-stdReadInput(InputInfoPtr pInfo)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  unsigned char rBuf[64];
-  int nBytes, i;
-
-  if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(rBuf))) > 0) {
-    for (i = 0; i < nBytes; i++) {
-      pKbd->PostEvent(pInfo, rBuf[i] & 0x7f, rBuf[i] & 0x80 ? FALSE : TRUE);
-    }
-  }
-}
-#endif
-
-static Bool
-OpenKeyboard(InputInfoPtr pInfo)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  USLKbdPrivPtr priv = (USLKbdPrivPtr) pKbd->private;
-  int i;
-  KbdProtocolId prot = PROT_UNKNOWN_KBD;
-  char *s;
-
-  s = xf86SetStrOption(pInfo->options, "Protocol", NULL);
-  for (i = 0; protocols[i].name; i++) {
-    if (xf86NameCmp(s, protocols[i].name) == 0) {
-      prot = protocols[i].id;
-      break;
-    }
-  }
-
-  switch (prot) {
-    case PROT_STD:
-#ifdef NOTYET
-      pInfo->read_input = stdReadInput;
-      priv->xq = 0;
-      break;
-#endif
-    case PROT_XQUEUE:
-      pInfo->read_input = NULL;	/* Handled by the XQUEUE signal handler */
-      priv->xq = 1;
-      break;
-    default:
-      xf86Msg(X_ERROR,"\"%s\" is not a valid keyboard protocol name\n", s);
-      xfree(s);
-      return FALSE;
-  }
-
-  xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, s);
-  xfree(s);
-
-  s = xf86SetStrOption(pInfo->options, "Device", NULL);
-  if (s == NULL) {
-    pInfo->fd = xf86Info.consoleFd;
-    pKbd->isConsole = TRUE;
-  } else {
-    pInfo->fd = open(s, O_RDONLY | O_NONBLOCK | O_EXCL);
-    if (pInfo->fd == -1) {
-      xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", pInfo->name, s);
-      xfree(s);
-      return FALSE;
-    }
-    pKbd->isConsole = FALSE;
-    xfree(s);
-  }
-
-  if (pKbd->isConsole)
-    pKbd->vtSwitchSupported = TRUE;
-
-  return TRUE;
-}
-
-_X_EXPORT Bool
-xf86OSKbdPreInit(InputInfoPtr pInfo)
-{
-  KbdDevPtr pKbd = pInfo->private;
-
-  pKbd->KbdInit       = KbdInit;
-  pKbd->KbdOn         = KbdOn;
-  pKbd->KbdOff        = KbdOff;
-  pKbd->Bell          = SoundBell;
-  pKbd->SetLeds       = SetKbdLeds;
-  pKbd->GetLeds       = GetKbdLeds;
-  pKbd->SetKbdRepeat  = SetKbdRepeat;
-  pKbd->KbdGetMapping = KbdGetMapping;
-  pKbd->SpecialKey    = SpecialKey;
-  pKbd->OpenKeyboard  = OpenKeyboard;
-
-  pKbd->GetSpecialKey = NULL;
-  pKbd->RemapScanCode = ATScancode;
-  pKbd->vtSwitchSupported = FALSE;
-
-  pKbd->private = xcalloc(sizeof(USLKbdPrivRec), 1);
-  if (pKbd->private == NULL) {
-    xf86Msg(X_ERROR,"can't allocate keyboard OS private data\n");
-    return FALSE;
-  }
-
-  return TRUE;
-}
diff --git a/hw/xfree86/os-support/usl/usl_kbd.h b/hw/xfree86/os-support/usl/usl_kbd.h
deleted file mode 100644
index 990c13c..0000000
--- a/hw/xfree86/os-support/usl/usl_kbd.h
+++ /dev/null
@@ -1,14 +0,0 @@
-/* $XdotOrg$ */
-#ifndef SCO_KBD_HDR
-#define SCO_KBD_HDR
-
-typedef struct {
-  int orig_kbm;
-  struct termio kbdtty;
-  keymap_t keymap, noledmap;
-  int xq;
-} USLKbdPrivRec, *USLKbdPrivPtr;
-
-extern void KbdGetMapping(InputInfoPtr pInfo, KeySymsPtr pKeySyms,
-  CARD8 *pModMap);
-#endif /* SCO_KBD_HDR */
diff --git a/hw/xfree86/os-support/usl/usl_xqueue.c b/hw/xfree86/os-support/usl/usl_xqueue.c
index c00d374..1615353 100644
--- a/hw/xfree86/os-support/usl/usl_xqueue.c
+++ b/hw/xfree86/os-support/usl/usl_xqueue.c
@@ -33,7 +33,6 @@
 #include "xf86_OSlib.h"
 #include "xf86Xinput.h"
 #include "xf86OSmouse.h"
-#include "xf86OSKbd.h"
 #include "usl_xqueue.h"
 
 #ifdef XKB
diff --git a/hw/xfree86/os-support/xf86OSKbd.h b/hw/xfree86/os-support/xf86OSKbd.h
deleted file mode 100644
index 4ab722c..0000000
--- a/hw/xfree86/os-support/xf86OSKbd.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2002-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- *
- * Author: Ivan Pascal.
- */
-
-#include "xf86Xinput.h"
-
-Bool ATScancode(InputInfoPtr pInfo, int *scanCode);
-
-/* Public interface to OS-specific keyboard support. */
-
-typedef	int	(*KbdInitProc)(InputInfoPtr pInfo, int what);
-typedef	int	(*KbdOnProc)(InputInfoPtr pInfo, int what);
-typedef	int	(*KbdOffProc)(InputInfoPtr pInfo, int what);
-typedef	void	(*BellProc)(InputInfoPtr pInfo,
-                            int loudness, int pitch, int duration);
-typedef	void	(*SetLedsProc)(InputInfoPtr pInfo, int leds);
-typedef	int	(*GetLedsProc)(InputInfoPtr pInfo);
-typedef	void	(*SetKbdRepeatProc)(InputInfoPtr pInfo, char rad);
-typedef	void	(*KbdGetMappingProc)(InputInfoPtr pInfo,
-                                     KeySymsPtr pKeySyms, CARD8* pModMap);
-typedef	int	(*GetSpecialKeyProc)(InputInfoPtr pInfo, int scanCode);
-typedef	Bool	(*SpecialKeyProc)(InputInfoPtr pInfo,
-                                     int key, Bool down, int modifiers);
-typedef	int	(*RemapScanCodeProc)(InputInfoPtr pInfo, int *scanCode);
-typedef	Bool	(*OpenKeyboardProc)(InputInfoPtr pInfo);
-typedef	void	(*PostEventProc)(InputInfoPtr pInfo,
-                                 unsigned int key, Bool down);
-typedef struct {
-    int                 begin;
-    int                 end;
-    unsigned char       *map;
-} TransMapRec, *TransMapPtr;
-
-typedef struct {
-    KbdInitProc		KbdInit;
-    KbdOnProc		KbdOn;
-    KbdOffProc		KbdOff;
-    BellProc		Bell;
-    SetLedsProc		SetLeds;
-    GetLedsProc		GetLeds;
-    SetKbdRepeatProc	SetKbdRepeat;
-    KbdGetMappingProc	KbdGetMapping;
-    RemapScanCodeProc	RemapScanCode;
-    GetSpecialKeyProc	GetSpecialKey;
-    SpecialKeyProc	SpecialKey;
-
-    OpenKeyboardProc	OpenKeyboard;
-    PostEventProc	PostEvent;
-
-    int			rate;
-    int			delay;
-    int			bell_pitch;
-    int			bell_duration;
-    Bool		autoRepeat;
-    unsigned long	leds;
-    unsigned long	xledsMask;
-    unsigned long	keyLeds;
-    int			scanPrefix;
-    Bool		vtSwitchSupported;
-    Bool		CustomKeycodes;
-    Bool		noXkb;
-    Bool		isConsole;
-    TransMapPtr         scancodeMap;
-    TransMapPtr         specialMap;
-
-    /* os specific */
-    pointer		private;
-    int			kbdType;
-    int			consType;
-    int			wsKbdType;
-    Bool		sunKbd;
-    Bool		Panix106;
-
-} KbdDevRec, *KbdDevPtr;
-
-typedef enum {
-    PROT_STD,
-    PROT_XQUEUE,
-    PROT_WSCONS,
-    PROT_USB,
-    PROT_UNKNOWN_KBD
-} KbdProtocolId;
-
-typedef struct {
-    const char		*name;
-    KbdProtocolId	id;
-} KbdProtocolRec;
-
-Bool xf86OSKbdPreInit(InputInfoPtr pInfo);
-
-/* Adjust this when the kbd interface changes. */
-
-/*
- * History:
- *
- *  1.0.0 - Initial version.
- */
-
-#define OS_KBD_VERSION_MAJOR 1
-#define OS_KBD_VERSION_MINOR 0
-#define OS_KBD_VERSION_PATCH 0
-
-#define OS_KBD_VERSION_CURRENT						\
-	BUILTIN_INTERFACE_VERSION_NUMERIC(OS_KBD_VERSION_MAJOR,		\
-					  OS_KBD_VERSION_MINOR,		\
-					  OS_KBD_VERSION_PATCH)
-
diff-tree 9525c2709ea3245c6518d4c3b5a0a4afff37181d (from 6d8d4abaaacf08140b673472d985117d448a62e7)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 10 20:29:57 2006 +0300

    configure.ac: fix xephyr conditionals
    Fix Xephyr build conditions, allowing it to actually be disabled.

diff --git a/configure.ac b/configure.ac
index 62a3848..c5c96f6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1509,8 +1509,9 @@ if test "$KDRIVE" = yes; then
 
     PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"])
     if test "x$XEPHYR" = xauto; then
-       XEPHYR=xephyr
+        XEPHYR=$xephyr
     fi
+
     # Xephyr needs nanosleep() which is in librt on Solaris
     AC_CHECK_FUNC([nanosleep], [],
         AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
@@ -1556,7 +1557,7 @@ AM_CONDITIONAL(H3600_TS, false)
 AM_CONDITIONAL(KDRIVEVESA, [test "x$KDRIVEVESA" = xyes])
 AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes])
 AM_CONDITIONAL(XSDLSERVER, [test x"$XSDL" = xyes])
-AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$xephyr" = xyes])
+AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$XEPHYR" = xyes])
 AM_CONDITIONAL(BUILD_KDRIVEFBDEVLIB, [test "x$KDRIVE" = xyes && test "x$KDRIVEFBDEVLIB" = xyes])
 AM_CONDITIONAL(XFAKESERVER, [test "x$KDRIVE" = xyes && test "x$XFAKE" = xyes])
 
diff-tree 6d8d4abaaacf08140b673472d985117d448a62e7 (from cec284f2b3e948deb9e56a1a8519fddf693ab952)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 10 20:28:06 2006 +0300

    configure.ac: allow conditional building of XF86{DGA,Misc,VidMode}
    Allow conditional building of the above three extensions, defaulting to
    auto.

diff --git a/configure.ac b/configure.ac
index dffa472..62a3848 100644
--- a/configure.ac
+++ b/configure.ac
@@ -404,7 +404,7 @@ AC_ARG_ENABLE(xtrap,          AS_HELP_ST
 AC_ARG_ENABLE(record,         AS_HELP_STRING([--disable-record], [Build Record extension (default: enabled)]), [RECORD=$enableval], [RECORD=yes])
 AC_ARG_ENABLE(xv,             AS_HELP_STRING([--disable-xv], [Build Xv extension (default: enabled)]), [XV=$enableval], [XV=yes])
 AC_ARG_ENABLE(xvmc,           AS_HELP_STRING([--disable-xvmc], [Build XvMC extension (default: enabled)]), [XVMC=$enableval], [XVMC=yes])
-AC_ARG_ENABLE(dga,            AS_HELP_STRING([--disable-dga], [Build DGA extension (default: enabled)]), [DGA=$enableval], [DGA=yes])
+AC_ARG_ENABLE(dga,            AS_HELP_STRING([--disable-dga], [Build DGA extension (default: auto)]), [DGA=$enableval], [DGA=auto])
 AC_ARG_ENABLE(screensaver,    AS_HELP_STRING([--disable-screensaver], [Build ScreenSaver extension (default: enabled)]), [SCREENSAVER=$enableval], [SCREENSAVER=yes])
 AC_ARG_ENABLE(xdmcp,          AS_HELP_STRING([--disable-xdmcp], [Build XDMCP extension (default: auto)]), [XDMCP=$enableval], [XDMCP=auto])
 AC_ARG_ENABLE(xdm-auth-1,     AS_HELP_STRING([--disable-xdm-auth-1], [Build XDM-Auth-1 extension (default: auto)]), [XDMAUTH=$enableval], [XDMAUTH=auto])
@@ -413,8 +413,8 @@ AC_ARG_ENABLE(aiglx,          AS_HELP_ST
 AC_ARG_ENABLE(glx-tls,        AS_HELP_STRING([--enable-glx-tls], [Build GLX with TLS support (default: disabled)]), [GLX_USE_TLS=$enableval], [GLX_USE_TLS=no])
 AC_ARG_ENABLE(dri,            AS_HELP_STRING([--enable-dri], [Build DRI extension (default: auto)]), [DRI=$enableval])
 AC_ARG_ENABLE(xinerama,	      AS_HELP_STRING([--disable-xinerama], [Build Xinerama extension (default: enabled)]), [XINERAMA=$enableval], [XINERAMA=yes])
-AC_ARG_ENABLE(xf86vidmode,    AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: enabled)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=yes])
-AC_ARG_ENABLE(xf86misc,       AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: enabled)]), [XF86MISC=$enableval], [XF86MISC=yes])
+AC_ARG_ENABLE(xf86vidmode,    AS_HELP_STRING([--disable-xf86vidmode], [Build XF86VidMode extension (default: auto)]), [XF86VIDMODE=$enableval], [XF86VIDMODE=auto])
+AC_ARG_ENABLE(xf86misc,       AS_HELP_STRING([--disable-xf86misc], [Build XF86Misc extension (default: auto)]), [XF86MISC=$enableval], [XF86MISC=auto])
 AC_ARG_ENABLE(xcsecurity,     AS_HELP_STRING([--disable-xcsecurity], [Build Security extension (default: enabled)]), [XCSECURITY=$enableval], [XCSECURITY=yes])
 AC_ARG_ENABLE(xevie,          AS_HELP_STRING([--disable-xevie], [Build XEvIE extension (default: enabled)]), [XEVIE=$enableval], [XEVIE=yes])
 AC_ARG_ENABLE(appgroup,       AS_HELP_STRING([--disable-appgroup], [Build XC-APPGROUP extension (default: enabled)]), [APPGROUP=$enableval], [APPGROUP=yes])
@@ -544,10 +544,6 @@ if test "x$XVMC" = xyes; then
 	AC_DEFINE(XvMCExtension, 1, [Build XvMC extension])
 fi
 
-AM_CONDITIONAL(DGA, [test "x$DGA" = xyes])
-if test "x$DGA" = xyes; then
-	AC_DEFINE(DGA, 1, [Support DGA extension])
-fi
 
 AM_CONDITIONAL(COMPOSITE, [test "x$COMPOSITE" = xyes])
 if test "x$COMPOSITE" = xyes; then
@@ -696,14 +692,6 @@ if test "x$DPMSExtension" = xyes; then
 	AC_DEFINE(DPMSExtension, 1, [Support DPMS extension])
 fi
 
-if test "x$XF86VIDMODE" = xyes; then
-	AC_DEFINE(XF86VIDMODE, 1, [Support XFree86 Video Mode extension])
-fi
-
-if test "x$XF86MISC" = xyes; then
-	AC_DEFINE(XF86MISC, 1, [Support XFree86 miscellaneous extensions])
-fi
-
 if test "x$XPRINT" = xauto; then
 	PKG_CHECK_MODULES([XPRINTPROTO], [printproto], [XPRINT=yes], [XPRINT=no])
 fi
@@ -1069,13 +1057,36 @@ if test "x$XORG" = xyes -o "x$XGL" = xye
 	XORG_CFLAGS="$XORGSERVER_CFLAGS -DHAVE_XORG_CONFIG_H"
 	XORG_LIBS="$COMPOSITE_LIB $MI_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XPSTUBS_LIB $OS_LIB"
 
-        AC_DEFINE(XF86VIDMODE, 1, [Support XFree86 Video Mode extension])
-        AC_DEFINE(XF86MISC, 1, [Support XFree86 miscellaneous extensions])
+	if test "x$DGA" = xauto; then
+		PKG_CHECK_MODULES(DGA, dgaproto, [DGA=yes], [DGA=no])
+	fi
+	if test "x$DGA" = xyes; then
+		XORG_MODULES="$XORG_MODULES xf86dgaproto"
+		AC_DEFINE(DGA, 1, [Support DGA extension])
+		AC_DEFINE(XFreeXDGA, 1, [Build XDGA support])
+	fi
+
+	if test "x$XF86MISC" = xauto; then
+		PKG_CHECK_MODULES(XF86MISC, xf86miscproto, [XF86MISC=yes], [XF86MISC=no])
+	fi
+	if test "x$XF86MISC" = xyes; then
+		XORG_MODULES="$XORG_MODULES xf86miscproto"
+		AC_DEFINE(XF86MISC, 1, [Support XFree86 miscellaneous extensions])
+	fi
 
-        XORG_MODULES="xf86miscproto xf86vidmodeproto xf86dgaproto"
-        PKG_CHECK_MODULES(XORG_MODULES, [$XORG_MODULES])
-        XORG_CFLAGS="$XORG_CFLAGS $XORG_MODULES_CFLAGS"
-        XORG_LIBS="$XORG_LIBS $XORG_MODULES_LIBS"
+	if test "x$XF86VIDMOE" = xauto; then
+		PKG_CHECK_MODULES(XF86VIDMODE, xf86vidmode, [DGA=yes], [DGA=no])
+	fi
+	if test "x$XF86VIDMODE" = xyes; then
+		XORG_MODULES="$XORG_MODULES xf86vidmodeproto"
+		AC_DEFINE(XF86VIDMODE, 1, [Support XFree86 Video Mode extension])
+	fi
+
+	if test -n "$XORG_MODULES"; then
+	        PKG_CHECK_MODULES(XORG_MODULES, [$XORG_MODULES])
+	        XORG_CFLAGS="$XORG_CFLAGS $XORG_MODULES_CFLAGS"
+	        XORG_LIBS="$XORG_LIBS $XORG_MODULES_LIBS"
+	fi
 
 dnl Check to see if dlopen is in default libraries (like Solaris, which
 dnl has it in libc), or if libdl is needed to get it.
@@ -1312,6 +1323,7 @@ AM_CONDITIONAL([SOLARIS_ASM_INLINE], [te
 AM_CONDITIONAL(MFB, [test "x$XORG" = xyes])
 AM_CONDITIONAL(CFB, [test "x$XORG" = xyes])
 AM_CONDITIONAL(AFB, [test "x$XORG" = xyes])
+AM_CONDITIONAL(DGA, [test "x$DGA" = xyes])
 
 dnl Xprint DDX
 
@@ -1572,7 +1584,6 @@ AC_DEFINE_DIR(XKM_OUTPUT_DIR, XKBOUTPUT,
 AC_SUBST(XKB_COMPILED_DIR)
 
 dnl and the rest of these are generic, so they're in config.h
-AC_DEFINE(XFreeXDGA, 1, [Build XDGA support])
 AC_DEFINE(XResExtension, 1, [Build XRes extension])
 
 dnl CYGWIN does not define fd_set if _POSIX_SOURCE is defined
diff-tree cec284f2b3e948deb9e56a1a8519fddf693ab952 (from 45bce556e8665412b9f6e89f88ed5bedb41de1ba)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 10 18:03:58 2006 +0300

    kdrive: properly ifdef composite enabling

diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index 05102ab..1cc2932 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -1396,9 +1396,11 @@ KdInitOutput (ScreenInfo    *pScreenInfo
     KdCardInfo	    *card;
     KdScreenInfo    *screen;
 
+#ifdef COMPOSITE
     /* kind of a hack: we want Composite enabled, but it's disabled per
      * default. */
     noCompositeExtension = FALSE;
+#endif
     
     if (!kdCardInfo)
     {
diff-tree 45bce556e8665412b9f6e89f88ed5bedb41de1ba (from 172d45b9b75f95c997d1e9358040eead496e2a06)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 10 18:02:47 2006 +0300

    GetMaximumEventsNum: be more conservative
    Be slightly more conservative in our maximum event count if we're using
    XKB (and thus don't need to count the extra repeat events).

diff --git a/dix/events.c b/dix/events.c
index 171e277..f1e2fd8 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4672,7 +4672,14 @@ int
 GetMaximumEventsNum() {
     /* Two base events -- core and device, plus valuator events.  Multiply
      * by two if we're doing key repeats. */
-    return 2 * (2 + MAX_VALUATOR_EVENTS);
+    int ret = 2 + MAX_VALUATOR_EVENTS;
+
+#ifdef XKB
+    if (noXkbExtension)
+#endif
+        ret *= 2;
+
+    return ret;
 }
 
 /**
diff-tree 172d45b9b75f95c997d1e9358040eead496e2a06 (from parents)
Merge: 3832a3d7db0f3b5d7167e3b3b5ea6d6b3d96351a db82e12fac5eaa16a39fc1bd0bc31ad95089dc95
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 10 14:14:54 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree 3832a3d7db0f3b5d7167e3b3b5ea6d6b3d96351a (from 9f188416bb6b4837d4c3f8773053d5eee0ff0ee1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 10 14:13:51 2006 +0300

    GKVE: don't repeat modifiers when using XKB
    Make sure we don't ever repeat modifiers (previously was repeating when
    using XKB); only do explicit KP/KR repeats in the non-XKB case.  XKB will
    take care of repeating when we're using it.

diff --git a/dix/events.c b/dix/events.c
index 5706aac..171e277 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4737,20 +4737,22 @@ int GetKeyboardValuatorEvents(xEvent *ev
      * FIXME: In theory, if you're repeating with two keyboards,
      *        you could get unbalanced events here. */
     if (type == KeyPress &&
-        ((pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
-#ifdef XKB
-       && noXkbExtension
-#endif
-       ) {
+        ((pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)) {
         if (!pDev->kbdfeed->ctrl.autoRepeat ||
             pDev->key->modifierMap[key_code] ||
             !(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3]
                 & (1 << (key_code & 7))))
             return 0;
-        numEvents += GetKeyboardValuatorEvents(events, pDev,
-                                               KeyRelease, key_code,
-                                               num_valuators, valuators);
-        events += numEvents;
+
+#ifdef XKB
+        if (noXkbExtension)
+#endif
+        {
+            numEvents += GetKeyboardValuatorEvents(events, pDev,
+                                                   KeyRelease, key_code,
+                                                   num_valuators, valuators);
+            events += numEvents;
+        }
     }
 
     ms = GetTimeInMillis();
diff-tree 9f188416bb6b4837d4c3f8773053d5eee0ff0ee1 (from 539d1f33475484d35fb5a377efc76dba2d868e3f)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 10 14:00:34 2006 +0300

    core devices: clear devicePrivates on close

diff --git a/dix/devices.c b/dix/devices.c
index 69f1e7b..63b206a 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -270,6 +270,7 @@ CoreKeyboardProc(DeviceIntPtr pDev, int 
          * ... yeah.
          */
         pDev->key->xkbInfo = NULL;
+        pDev->devPrivates[CoreDevicePrivatesIndex].ptr = NULL;
         break;
 
     default:
@@ -298,6 +299,10 @@ CorePointerProc(DeviceIntPtr pDev, int w
         pDev->valuator->lasty = pDev->valuator->axisVal[1];
         break;
 
+    case DEVICE_CLOSE:
+        pDev->devPrivates[CoreDevicePrivatesIndex].ptr = NULL;
+        break;
+
     default:
         break;
     }
diff-tree 539d1f33475484d35fb5a377efc76dba2d868e3f (from 5506b4ad200745236f997c121e8200179c47b749)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Aug 10 14:00:14 2006 +0300

    GKVE/GPE: have DDX allocate events
    Don't allocate events on every GKE/GKVE/GPE call, just have the DDX manage
    it instead.  Introduce GetMaximumEventsNum(), which is the maximum number
    of events these functions will ever produce.

diff --git a/dix/events.c b/dix/events.c
index f0b9e16..5706aac 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4658,22 +4658,39 @@ WriteEventsToClient(ClientPtr pClient, i
     }
 }
 
+/* Maximum number of valuators, divided by six, rounded up. */
+#define MAX_VALUATOR_EVENTS 6
+
+/**
+ * Returns the maximum number of events GetKeyboardEvents,
+ * GetKeyboardValuatorEvents, and GetPointerEvents will ever return.
+ *
+ * Should be used in DIX as:
+ * xEvent *events = xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+ */
+int
+GetMaximumEventsNum() {
+    /* Two base events -- core and device, plus valuator events.  Multiply
+     * by two if we're doing key repeats. */
+    return 2 * (2 + MAX_VALUATOR_EVENTS);
+}
+
 /**
  * Convenience wrapper around GetKeyboardValuatorEvents, that takes no
  * valuators.
  */
 int
-GetKeyboardEvents(xEvent **xE, DeviceIntPtr pDev, int type, int key_code) {
-    return GetKeyboardValuatorEvents(xE, pDev, type, key_code, 0, NULL);
+GetKeyboardEvents(xEvent *events, DeviceIntPtr pDev, int type, int key_code) {
+    return GetKeyboardValuatorEvents(events, pDev, type, key_code, 0, NULL);
 }
 
 /**
  * Returns a set of keyboard events for KeyPress/KeyRelease, optionally
  * also with valuator events.  Handles Xi and XKB.
  *
- * xE will be set to an array of events, which must be freed by the user;
- * the return value is the number of events in xE, which is not
- * NULL-terminated.
+ * events is not NULL-terminated; the return value is the number of events.
+ * The DDX is responsible for allocating the event structure in the first
+ * place via GetMaximumEventsNum(), and for freeing it.
  *
  * If pDev is set to send core events, then the keymap on the core
  * keyboard will be pivoted to that of the new keyboard and the appropriate
@@ -4683,18 +4700,21 @@ GetKeyboardEvents(xEvent **xE, DeviceInt
  * key press will trigger a matching KeyRelease, as well as the
  * KeyPresses.
  */
-int GetKeyboardValuatorEvents(xEvent **xE, DeviceIntPtr pDev, int type,
+int GetKeyboardValuatorEvents(xEvent *events, DeviceIntPtr pDev, int type,
                               int key_code, int num_valuators,
                               int *valuators) {
     int numEvents = 0, numRepeatEvents = 0, ms = 0, first_valuator = 0, i = 0;
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
-    xEvent *ev = NULL, *repeatEvents = NULL;
+    xEvent *repeatEvents = NULL;
     KeyClassPtr ckeyc;
 #ifdef XKB
     xkbMapNotify mn;
 #endif
 
+    if (!events)
+        return 0;
+    
     if (type != KeyPress && type != KeyRelease)
         return 0;
 
@@ -4707,8 +4727,11 @@ int GetKeyboardValuatorEvents(xEvent **x
     else
         numEvents = 1;
 
-    if (num_valuators)
-        numEvents += (num_valuators % 6) + 1;
+    if (num_valuators) {
+        if ((num_valuators / 6) + 1 > MAX_VALUATOR_EVENTS)
+            num_valuators = MAX_VALUATOR_EVENTS;
+        numEvents += (num_valuators / 6) + 1;
+    }
 
     /* Handle core repeating, via press/release/press/release.
      * FIXME: In theory, if you're repeating with two keyboards,
@@ -4724,26 +4747,15 @@ int GetKeyboardValuatorEvents(xEvent **x
             !(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3]
                 & (1 << (key_code & 7))))
             return 0;
-        numEvents += GetKeyboardValuatorEvents(&repeatEvents, pDev,
+        numEvents += GetKeyboardValuatorEvents(events, pDev,
                                                KeyRelease, key_code,
                                                num_valuators, valuators);
+        events += numEvents;
     }
 
-    ev = (xEvent *)xcalloc(sizeof(xEvent), numEvents);
-    if (!ev)
-        return 0;
-
-    if (repeatEvents) {
-        for (i = 0; i < numRepeatEvents; i++) {
-            ev = repeatEvents++;
-            ev++;
-        }
-    }
-
-    *xE = ev;
     ms = GetTimeInMillis();
 
-    kbp = (deviceKeyButtonPointer *) ev;
+    kbp = (deviceKeyButtonPointer *) events;
     kbp->time = ms;
     kbp->deviceid = pDev->id;
     if (type == KeyPress)
@@ -4754,7 +4766,7 @@ int GetKeyboardValuatorEvents(xEvent **x
     if (num_valuators) {
         kbp->deviceid |= MORE_EVENTS;
         while (first_valuator < num_valuators) {
-            xv = (deviceValuator *) ++ev;
+            xv = (deviceValuator *) ++events;
             xv->type = DeviceValuator;
             xv->first_valuator = first_valuator;
             xv->num_valuators = num_valuators;
@@ -4781,10 +4793,10 @@ int GetKeyboardValuatorEvents(xEvent **x
     }
 
     if (pDev->coreEvents) {
-        ev++;
-        ev->u.keyButtonPointer.time = ms;
-        ev->u.u.type = type;
-        ev->u.u.detail = key_code;
+        events++;
+        events->u.keyButtonPointer.time = ms;
+        events->u.u.type = type;
+        events->u.u.detail = key_code;
 
         if (inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr !=
             pDev) {
@@ -4796,8 +4808,6 @@ int GetKeyboardValuatorEvents(xEvent **x
             memcpy(ckeyc->modifierKeyMap, pDev->key->modifierKeyMap,
                     (8 * pDev->key->maxKeysPerModifier));
             ckeyc->maxKeysPerModifier = pDev->key->maxKeysPerModifier;
-            ckeyc->curKeySyms.map = NULL;
-            ckeyc->curKeySyms.mapWidth = 0;
             ckeyc->curKeySyms.minKeyCode = pDev->key->curKeySyms.minKeyCode;
             ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode;
             SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms);
@@ -4911,13 +4921,14 @@ acceleratePointer(DeviceIntPtr pDev, int
  * Generate a series of xEvents (returned in xE) representing pointer
  * motion, or button presses.  Xi and XKB-aware.
  *
- * xE is not NULL-terminated; the return value is the number of events.
- * The user is responsible for freeing these events.
+ * events is not NULL-terminated; the return value is the number of events.
+ * The DDX is responsible for allocating the event structure in the first
+ * place via GetMaximumEventsNum(), and for freeing it.
  */
 int
-GetPointerEvents(xEvent **xE, DeviceIntPtr pDev, int type, int buttons,
+GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
                  int flags, int num_valuators, int *valuators) {
-    int numEvents, ms, first_valuator = 0;
+    int numEvents = 0, ms = 0, first_valuator = 0;
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
     AxisInfoPtr axes = NULL;
@@ -4942,20 +4953,18 @@ GetPointerEvents(xEvent **xE, DeviceIntP
         numEvents = 1;
 
     if (type == MotionNotify) {
-        if (num_valuators > 2)
+        if (num_valuators > 2) {
+            if (((num_valuators / 6) + 1) > MAX_VALUATOR_EVENTS)
+                num_valuators = MAX_VALUATOR_EVENTS;
             numEvents += (num_valuators / 6) + 1;
+        }
         else if (num_valuators < 2)
             return 0;
     }
 
-    ev = (xEvent *)xcalloc(sizeof(xEvent), numEvents);
-    if (!ev)
-        return 0;
-
-    *xE = ev;
     ms = GetTimeInMillis();
 
-    kbp = (deviceKeyButtonPointer *) ev;
+    kbp = (deviceKeyButtonPointer *) events;
     kbp->time = ms;
     kbp->deviceid = pDev->id;
 
@@ -5053,7 +5062,7 @@ GetPointerEvents(xEvent **xE, DeviceIntP
                               flags & POINTER_ABSOLUTE)) {
         kbp->deviceid |= MORE_EVENTS;
         while (first_valuator < num_valuators) {
-            xv = (deviceValuator *) ++ev;
+            xv = (deviceValuator *) ++events;
             xv->type = DeviceValuator;
             xv->first_valuator = first_valuator;
             xv->num_valuators = num_valuators;
@@ -5086,11 +5095,11 @@ GetPointerEvents(xEvent **xE, DeviceIntP
     }
 
     if (pDev->coreEvents) {
-        ev++;
-        ev->u.u.type = type;
-        ev->u.keyButtonPointer.time = ms;
-        ev->u.keyButtonPointer.rootX = kbp->root_x;
-        ev->u.keyButtonPointer.rootY = kbp->root_y;
+        events++;
+        events->u.u.type = type;
+        events->u.keyButtonPointer.time = ms;
+        events->u.keyButtonPointer.rootX = kbp->root_x;
+        events->u.keyButtonPointer.rootY = kbp->root_y;
         cp->valuator->lastx = kbp->root_x;
         cp->valuator->lasty = kbp->root_y;
 #ifdef DEBUG
@@ -5101,10 +5110,10 @@ GetPointerEvents(xEvent **xE, DeviceIntP
             ErrorF("GPE: core detail is %d\n", buttons);
 #endif
             /* Core buttons remapping shouldn't be transitive. */
-            ev->u.u.detail = pDev->button->map[buttons];
+            events->u.u.detail = pDev->button->map[buttons];
         }
         else {
-            ev->u.u.detail = 0;
+            events->u.u.detail = 0;
         }
 
         if (inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr !=
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 1718fda..fc4592a 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -69,6 +69,8 @@ static struct KdConfigDevice *kdConfigPo
 static KdKeyboardDriver *kdKeyboardDrivers = NULL;
 static KdPointerDriver  *kdPointerDrivers  = NULL;
 
+static xEvent           *kdEvents = NULL;
+
 static Bool		kdInputEnabled;
 static Bool		kdOffScreen;
 static unsigned long	kdOffScreenTime;
@@ -1271,6 +1273,11 @@ KdInitInput (void)
             ErrorF("Failed to add keyboard!\n");
     }
 
+    if (!kdEvents)
+        kdEvents = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+    if (!kdEvents)
+        FatalError("Couldn't allocate event buffer\n");
+
     mieqInit();
 }
 
@@ -1849,7 +1856,6 @@ KdHandleKeyboardEvent (KdKeyboardInfo *k
 void
 KdReleaseAllKeys (void)
 {
-    xEvent *xE;
     int	key, nEvents, i;
     KdKeyboardInfo *ki;
 
@@ -1860,9 +1866,9 @@ KdReleaseAllKeys (void)
              key++) {
             if (IsKeyDown(ki, key)) {
                 KdHandleKeyboardEvent(ki, KeyRelease, key);
-                nEvents = GetKeyboardEvents(&xE, ki->dixdev, KeyRelease, key);
+                nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, KeyRelease, key);
                 for (i = 0; i < nEvents; i++)
-                    KdQueueEvent (xE++);
+                    KdQueueEvent (kdEvents + i);
             }
         }
     }
@@ -1897,7 +1903,6 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   
     KeyClassPtr	keyc = NULL;
     KeybdCtrl *ctrl = NULL;
     int type, nEvents, i;
-    xEvent *xE = NULL;
 
 #ifdef DEBUG
     ErrorF("enqueuing kb event (scancode %d, %s)\n", scan_code, is_up ? "up" : "down");
@@ -1939,12 +1944,12 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   
 	
         KdCheckSpecialKeys(ki, type, key_code);
         KdHandleKeyboardEvent(ki, type, key_code);
-        nEvents = GetKeyboardEvents(&xE, ki->dixdev, type, key_code);
+        nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, type, key_code);
 #ifdef DEBUG
         ErrorF("KdEnqueueKeyboardEvent: got %d events from GKE\n", nEvents);
 #endif
         for (i = 0; i < nEvents; i++)
-            KdQueueEvent(xE++);
+            KdQueueEvent(kdEvents + i);
     }
     else {
         ErrorF("driver %s wanted to post scancode %d outside of [%d, %d]!\n",
@@ -2047,8 +2052,7 @@ void
 _KdEnqueuePointerEvent (KdPointerInfo *pi, int type, int x, int y, int z,
                         int b, int absrel, Bool force)
 {
-    xEvent *xE = NULL;
-    int n = 0, i = 0;
+    int nEvents = 0, i = 0;
     int valuators[3] = { x, y, z };
 
 #ifdef DEBUG
@@ -2060,9 +2064,10 @@ _KdEnqueuePointerEvent (KdPointerInfo *p
     if (!force && KdHandlePointerEvent(pi, type, x, y, z, b, absrel))
         return;
 
-    n = GetPointerEvents(&xE, pi->dixdev, type, b, absrel, 3, valuators);
-    for (i = 0; i < n; i++)
-        KdQueueEvent(xE++);
+    nEvents = GetPointerEvents(kdEvents, pi->dixdev, type, b, absrel, 3,
+                               valuators);
+    for (i = 0; i < nEvents; i++)
+        KdQueueEvent(kdEvents + i);
 }
 
 void
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 91db82e..070645d 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -108,6 +108,8 @@ static int      debug_level = 0;
 #define DBG(lvl, f)
 #endif
 
+static xEvent *xf86Events = NULL;
+
 static Bool
 xf86SendDragEvents(DeviceIntPtr	device)
 {
@@ -639,7 +641,6 @@ xf86PostMotionEvent(DeviceIntPtr	device,
     int i = 0, nevents = 0;
     Bool drag = xf86SendDragEvents(device);
     LocalDevicePtr local = (LocalDevicePtr) device->public.devicePrivate;
-    xEvent *events = NULL;
     int *valuators = NULL;
     int flags = 0;
 
@@ -662,15 +663,16 @@ xf86PostMotionEvent(DeviceIntPtr	device,
 #endif
     }
 
-    nevents = GetPointerEvents(&events, device, MotionNotify, 0,
+    if (!xf86Events)
+        xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+    if (!xf86Events)
+        FatalError("Couldn't allocate event store\n");
+
+    nevents = GetPointerEvents(xf86Events, device, MotionNotify, 0,
                                flags, num_valuators, valuators);
 
-    for (i = 0; i < nevents; i++) {
-        if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
-            xf86Info.lastEventTime = events->u.keyButtonPointer.time;
-        mieqEnqueue(events + i);
-    }
-    xfree(events);
+    for (i = 0; i < nevents; i++)
+        mieqEnqueue(xf86Events + i);
     
 #if 0
     if (HAS_MOTION_HISTORY(local)) {
@@ -791,7 +793,6 @@ xf86PostButtonEvent(DeviceIntPtr	device,
     va_list var;
     int *valuators = NULL;
     int i = 0, nevents = 0;
-    xEvent *events = NULL;
     
 #ifdef DEBUG
     ErrorF("xf86PostButtonEvent BEGIN 0x%x(%s) button=%d down=%s is_absolute=%s\n",
@@ -810,18 +811,19 @@ xf86PostButtonEvent(DeviceIntPtr	device,
         valuators[i] = va_arg(var, int);
     }
 
-    nevents = GetPointerEvents(&events, device,
+    if (!xf86Events)
+        xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+    if (!xf86Events)
+        FatalError("Couldn't allocate event store\n");
+
+    nevents = GetPointerEvents(xf86Events, device,
                                is_down ? ButtonPress : ButtonRelease, button,
                                is_absolute ? POINTER_ABSOLUTE :
                                              POINTER_RELATIVE,
                                num_valuators, valuators);
 
-    for (i = 0; i < nevents; i++) {
-        if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
-            xf86Info.lastEventTime = events->u.keyButtonPointer.time;
-        mieqEnqueue(events + i);
-    }
-    xfree(events);
+    for (i = 0; i < nevents; i++)
+        mieqEnqueue(xf86Events + i);
 }
 
 _X_EXPORT void
@@ -835,38 +837,39 @@ xf86PostKeyEvent(DeviceIntPtr	device,
 {
     va_list var;
     int i = 0, nevents = 0, *valuators = NULL;
-    xEvent *events = NULL;
 
     /* instil confidence in the user */
     ErrorF("this function has never been tested properly.  if things go quite "
            "badly south after this message, then xf86PostKeyEvent is "
            "broken.\n");
 
+    if (!xf86Events)
+        xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+    if (!xf86Events)
+        FatalError("Couldn't allocate event store\n");
+
     /* the spec says that dkp/dkr events should only get valuators in
      * absolute mode.  the spec knows all.  BOW BEFORE etc. */
     if (is_absolute) {
-        nevents = GetKeyboardValuatorEvents(&events, device,
-                                            is_down ? KeyPress : KeyRelease,
-                                            key_code, num_valuators,
-                                            valuators);
         valuators = xcalloc(sizeof(int), num_valuators);
         va_start(var, num_valuators);
         for (i = 0; i < num_valuators; i++)
             valuators[i] = va_arg(var, int);
         va_end(var);
+
+        nevents = GetKeyboardValuatorEvents(xf86Events, device,
+                                            is_down ? KeyPress : KeyRelease,
+                                            key_code, num_valuators,
+                                            valuators);
     }
     else {
-        nevents = GetKeyboardEvents(&events, device,
+        nevents = GetKeyboardEvents(xf86Events, device,
                                     is_down ? KeyPress : KeyRelease,
                                     key_code);
     }
 
-    for (i = 0; i < nevents; i++) {
-        if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
-            xf86Info.lastEventTime = events->u.keyButtonPointer.time;
-        mieqEnqueue(events + i);
-    }
-    xfree(events);
+    for (i = 0; i < nevents; i++)
+        mieqEnqueue(xf86Events + i);
 }
 
 _X_EXPORT void
@@ -874,7 +877,6 @@ xf86PostKeyboardEvent(DeviceIntPtr      
                       unsigned int      key_code,
                       int               is_down)
 {
-    xEvent *events = NULL;
     int nevents = 0, i = 0;
 
 #ifdef DEBUG
@@ -882,15 +884,16 @@ xf86PostKeyboardEvent(DeviceIntPtr      
            is_down ? "down" : "up", device->id);
 #endif
 
-    nevents = GetKeyboardEvents(&events, device,
+    if (!xf86Events)
+        xf86Events = (xEvent *)xcalloc(sizeof(xEvent), GetMaximumEventsNum());
+    if (!xf86Events)
+        FatalError("Couldn't allocate event store\n");
+
+    nevents = GetKeyboardEvents(xf86Events, device,
                                 is_down ? KeyPress : KeyRelease, key_code);
 
-    for (i = 0; i < nevents; i++) {
-        if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
-            xf86Info.lastEventTime = events->u.keyButtonPointer.time;
-        mieqEnqueue(events + i);
-    }
-    xfree(events);
+    for (i = 0; i < nevents; i++)
+        mieqEnqueue(xf86Events + i);
 }
 
 /* 
diff --git a/include/input.h b/include/input.h
index d1791e7..6572db5 100644
--- a/include/input.h
+++ b/include/input.h
@@ -377,8 +377,10 @@ extern void InitInput(
     int  /*argc*/,
     char ** /*argv*/);
 
+extern int GetMaximumEventsNum(void);
+
 extern int GetPointerEvents(
-    xEvent **xE,
+    xEvent *events,
     DeviceIntPtr pDev,
     int type,
     int buttons,
@@ -387,13 +389,13 @@ extern int GetPointerEvents(
     int *valuators);
 
 extern int GetKeyboardEvents(
-    xEvent **xE,
+    xEvent *events,
     DeviceIntPtr pDev,
     int type,
     int key_code);
 
 extern int GetKeyboardValuatorEvents(
-    xEvent **xE,
+    xEvent *events,
     DeviceIntPtr pDev,
     int type,
     int key_code,
diff-tree 5506b4ad200745236f997c121e8200179c47b749 (from parents)
Merge: 4be9abb8504b3761b5f3a01851e4eb3da86c76e2 462bb61b0fe968fae1b99cf98ec6f7de09105dcd
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Aug 9 07:21:01 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree 4be9abb8504b3761b5f3a01851e4eb3da86c76e2 (from fe351a711ef55c3ae1e784d4551147c080eda109)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Aug 9 07:20:16 2006 +0300

    kdrive: remove ddx_DEPENDENCIES
    Remove foo_DEPENDENCIES as they weren't guaranteed to just be libs,
    and loader arguments (-lfoo, -Lfoo) might've crept in.

diff --git a/hw/kdrive/ati/Makefile.am b/hw/kdrive/ati/Makefile.am
index b234181..94d525e 100644
--- a/hw/kdrive/ati/Makefile.am
+++ b/hw/kdrive/ati/Makefile.am
@@ -67,6 +67,3 @@ Xati_LDADD = \
 	@KDRIVE_LIBS@			\
 	@XSERVER_LIBS@			\
 	$(TSLIB_FLAG)
-
-
-Xati_DEPENDENCIES = $(ATI_LIBS)
diff --git a/hw/kdrive/chips/Makefile.am b/hw/kdrive/chips/Makefile.am
index e308077..146c1df 100644
--- a/hw/kdrive/chips/Makefile.am
+++ b/hw/kdrive/chips/Makefile.am
@@ -29,5 +29,3 @@ Xchips_LDADD = \
 	@KDRIVE_LIBS@                          \
 	@XSERVER_LIBS@				\
 	$(TSLIB_FLAG)
-
-Xchips_DEPENDENCIES = $(CHIPS_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/ephyr/Makefile.am b/hw/kdrive/ephyr/Makefile.am
index 6982d80..b8f12c5 100644
--- a/hw/kdrive/ephyr/Makefile.am
+++ b/hw/kdrive/ephyr/Makefile.am
@@ -35,9 +35,3 @@ Xephyr_LDADD = 						\
 	@KDRIVE_LIBS@					\
         $(TSLIB_LIBS)                                   \
         @XEPHYR_LIBS@
-
-Xephyr_DEPENDENCIES =					\
-	libxephyr.a					\
-	libxephyr-hostx.a                               \
-	@KDRIVE_LIBS@					\
-	../../../exa/libexa.la					
diff --git a/hw/kdrive/epson/Makefile.am b/hw/kdrive/epson/Makefile.am
index 0538f4c..1a24d43 100644
--- a/hw/kdrive/epson/Makefile.am
+++ b/hw/kdrive/epson/Makefile.am
@@ -29,5 +29,3 @@ Xepson_LDADD = \
 	@KDRIVE_LIBS@                          \
 	@XSERVER_LIBS@				\
 	$(TSLIB_FLAG)
-
-Xepson_DEPENDENCIES = $(EPSON_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/fake/Makefile.am b/hw/kdrive/fake/Makefile.am
index f3a6a34..a9c9aff 100644
--- a/hw/kdrive/fake/Makefile.am
+++ b/hw/kdrive/fake/Makefile.am
@@ -26,8 +26,3 @@ Xfake_LDADD = 						\
 	@KDRIVE_LIBS@					\
 	$(TSLIB_FLAG)                                   \
         @XSERVER_LIBS@
-
-Xfake_DEPENDENCIES =					\
-	libfake.a					\
-	@KDRIVE_LIBS@					
-
diff --git a/hw/kdrive/fbdev/Makefile.am b/hw/kdrive/fbdev/Makefile.am
index 39e9ba4..deed3c9 100644
--- a/hw/kdrive/fbdev/Makefile.am
+++ b/hw/kdrive/fbdev/Makefile.am
@@ -23,8 +23,4 @@ Xfbdev_LDADD = 						\
 	@KDRIVE_LIBS@					\
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)
-
-Xfbdev_DEPENDENCIES =					\
-	libfbdev.a					\
-	@KDRIVE_LIBS@					
 endif
diff --git a/hw/kdrive/i810/Makefile.am b/hw/kdrive/i810/Makefile.am
index d676a69..5f7b2ac 100644
--- a/hw/kdrive/i810/Makefile.am
+++ b/hw/kdrive/i810/Makefile.am
@@ -31,5 +31,3 @@ Xi810_LDADD = \
 	@KDRIVE_LIBS@                                  \
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)
-
-Xi810_DEPENDENCIES = $(I810_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/linux/Makefile.am b/hw/kdrive/linux/Makefile.am
index 29959df..e13d083 100644
--- a/hw/kdrive/linux/Makefile.am
+++ b/hw/kdrive/linux/Makefile.am
@@ -32,16 +32,3 @@ liblinux_a_SOURCES = 	\
 	$(KDRIVE_HW_SOURCES) \
 	$(TSLIB_C)	\
 	$(TS_C)
-
-liblinux_a_DEPENDENCIES = \
-	agp.c		\
-	bus.c		\
-	keyboard.c	\
-	linux.c		\
-	mouse.c		\
-	evdev.c		\
-	ms.c		\
-	ps2.c		\
-	$(TSLIB_C)	\
-	$(TS_C)
-
diff --git a/hw/kdrive/mach64/Makefile.am b/hw/kdrive/mach64/Makefile.am
index 299565f..3040a89 100644
--- a/hw/kdrive/mach64/Makefile.am
+++ b/hw/kdrive/mach64/Makefile.am
@@ -32,6 +32,3 @@ Xmach64_LDADD = 					\
 	@KDRIVE_LIBS@					\
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)
-
-
-Xmach64_DEPENDENCIES = $(MACH64_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/mga/Makefile.am b/hw/kdrive/mga/Makefile.am
index 64d260e..7853cba 100644
--- a/hw/kdrive/mga/Makefile.am
+++ b/hw/kdrive/mga/Makefile.am
@@ -31,5 +31,3 @@ Xmga_LDADD = \
 	@KDRIVE_LIBS@                                  \
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)
-
-Xmga_DEPENDENCIES = $(MGA_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/neomagic/Makefile.am b/hw/kdrive/neomagic/Makefile.am
index b37bfc3..8b8db6a 100644
--- a/hw/kdrive/neomagic/Makefile.am
+++ b/hw/kdrive/neomagic/Makefile.am
@@ -43,5 +43,3 @@ Xneomagic_LDADD = \
 	@KDRIVE_LIBS@               \
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)
-
-Xneomagic_DEPENDENCIES = $(NEOMAGIC_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/nvidia/Makefile.am b/hw/kdrive/nvidia/Makefile.am
index 48551a3..848b4cc 100644
--- a/hw/kdrive/nvidia/Makefile.am
+++ b/hw/kdrive/nvidia/Makefile.am
@@ -32,5 +32,3 @@ Xnvidia_LDADD = \
 	@KDRIVE_LIBS@				\
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)
-
-Xnvidia_DEPENDENCIES = $(NVIDIA_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/pm2/Makefile.am b/hw/kdrive/pm2/Makefile.am
index 1a71207..7ca2936 100644
--- a/hw/kdrive/pm2/Makefile.am
+++ b/hw/kdrive/pm2/Makefile.am
@@ -30,5 +30,3 @@ Xpm2_LDADD = \
 	@KDRIVE_LIBS@                          \
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)
-
-Xpm2_DEPENDENCIES = $(PM2_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/r128/Makefile.am b/hw/kdrive/r128/Makefile.am
index b33e138..5d783ee 100644
--- a/hw/kdrive/r128/Makefile.am
+++ b/hw/kdrive/r128/Makefile.am
@@ -29,5 +29,3 @@ Xr128_LDADD = \
 	@KDRIVE_LIBS@                          \
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)
-
-Xr128_DEPENDENCIES = $(R128_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/sdl/Makefile.am b/hw/kdrive/sdl/Makefile.am
index ba6ed4d..cc3873c 100644
--- a/hw/kdrive/sdl/Makefile.am
+++ b/hw/kdrive/sdl/Makefile.am
@@ -16,5 +16,3 @@ Xsdl_LDADD = @KDRIVE_PURE_LIBS@				\
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)					\
 	@XSDL_LIBS@
-
-Xsdl_DEPENDENCIES = @KDRIVE_LIBS@
diff --git a/hw/kdrive/sis300/Makefile.am b/hw/kdrive/sis300/Makefile.am
index efd1e9a..e7200a2 100644
--- a/hw/kdrive/sis300/Makefile.am
+++ b/hw/kdrive/sis300/Makefile.am
@@ -42,5 +42,3 @@ Xsis_LDADD = \
 	$(SIS_LIBS)				\
 	@KDRIVE_LIBS@                          \
 	$(TSLIB_FLAG)
-
-Xsis_DEPENDENCIES = $(SIS_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/smi/Makefile.am b/hw/kdrive/smi/Makefile.am
index a214e76..8ce3eba 100644
--- a/hw/kdrive/smi/Makefile.am
+++ b/hw/kdrive/smi/Makefile.am
@@ -34,5 +34,3 @@ Xsmi_LDADD = \
 	@KDRIVE_LIBS@                          \
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)
-
-Xsmi_DEPENDENCIES = $(SMI_LIBS) @KDRIVE_LIBS@
diff --git a/hw/kdrive/vesa/Makefile.am b/hw/kdrive/vesa/Makefile.am
index 01bc0a3..8f36ddf 100644
--- a/hw/kdrive/vesa/Makefile.am
+++ b/hw/kdrive/vesa/Makefile.am
@@ -30,7 +30,3 @@ Xvesa_LDADD = \
 	@KDRIVE_LIBS@                          \
 	$(TSLIB_FLAG)				\
 	@XSERVER_LIBS@
-
-Xvesa_DEPENDENCIES = \
-	libvesa.a    \
-	@KDRIVE_LIBS@
diff --git a/hw/kdrive/via/Makefile.am b/hw/kdrive/via/Makefile.am
index 4d52df9..6e2045a 100644
--- a/hw/kdrive/via/Makefile.am
+++ b/hw/kdrive/via/Makefile.am
@@ -30,5 +30,3 @@ Xvia_LDADD =						\
 	@KDRIVE_LIBS@					\
 	@XSERVER_LIBS@					\
 	$(TSLIB_FLAG)					
-
-Xvia_DEPENDENCIES = $(VIA_LIBS) @KDRIVE_LIBS@
diff-tree fe351a711ef55c3ae1e784d4551147c080eda109 (from 31089816317f27c668b12a15c74fdd226a8df9f7)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 8 14:54:10 2006 +0300

    GKVE: send XkbMapNotify, not XkbNewKeyboardNotify
    Sending MapNotify is more correct in this case than NKN, so do that.

diff --git a/dix/events.c b/dix/events.c
index f6524a3..f0b9e16 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4675,6 +4675,10 @@ GetKeyboardEvents(xEvent **xE, DeviceInt
  * the return value is the number of events in xE, which is not
  * NULL-terminated.
  *
+ * If pDev is set to send core events, then the keymap on the core
+ * keyboard will be pivoted to that of the new keyboard and the appropriate
+ * MapNotify events (both core and XKB) will be sent.
+ *
  * Note that this function recurses!  If called for non-XKB, a repeating
  * key press will trigger a matching KeyRelease, as well as the
  * KeyPresses.
@@ -4688,7 +4692,7 @@ int GetKeyboardValuatorEvents(xEvent **x
     xEvent *ev = NULL, *repeatEvents = NULL;
     KeyClassPtr ckeyc;
 #ifdef XKB
-    xkbNewKeyboardNotify nkn;
+    xkbMapNotify mn;
 #endif
 
     if (type != KeyPress && type != KeyRelease)
@@ -4798,27 +4802,36 @@ int GetKeyboardValuatorEvents(xEvent **x
             ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode;
             SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms);
 #ifdef XKB
-            if (!noXkbExtension) {
-                nkn.oldMinKeyCode = ckeyc->xkbInfo->desc->min_key_code;
-                nkn.oldMaxKeyCode = ckeyc->xkbInfo->desc->max_key_code;
-                nkn.deviceID = nkn.oldDeviceID = inputInfo.keyboard->id;
-                nkn.minKeyCode = pDev->key->xkbInfo->desc->min_key_code;
-                nkn.maxKeyCode = pDev->key->xkbInfo->desc->max_key_code;
-                nkn.requestMajor = XkbReqCode;
-                nkn.requestMinor = X_kbSetMap; /* XXX bare-faced lie */
-                nkn.changed = XkbAllNewKeyboardEventsMask;
-                /* Free the map we set up at DEVICE_INIT time, since it's
-                 * going to just quietly disappear.  Shameful hack. */
-                if (!inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr
-                    && ckeyc->xkbInfo)
+            if (!noXkbExtension && pDev->key->xkbInfo &&
+                pDev->key->xkbInfo->desc) {
+                mn.deviceID = inputInfo.keyboard->id;
+                mn.minKeyCode = pDev->key->xkbInfo->desc->min_key_code;
+                mn.maxKeyCode = pDev->key->xkbInfo->desc->max_key_code;
+                mn.firstType = 0;
+                mn.nTypes = pDev->key->xkbInfo->desc->map->num_types;
+                mn.firstKeySym = pDev->key->xkbInfo->desc->min_key_code;
+                mn.nKeySyms = XkbNumKeys(pDev->key->xkbInfo->desc);
+                mn.firstKeyAct = pDev->key->xkbInfo->desc->min_key_code;
+                mn.nKeyActs = XkbNumKeys(pDev->key->xkbInfo->desc);
+                /* Cargo-culted from ProcXkbGetMap. */
+                mn.firstKeyBehavior = pDev->key->xkbInfo->desc->min_key_code;
+                mn.nKeyBehaviors = XkbNumKeys(pDev->key->xkbInfo->desc);
+                mn.firstKeyExplicit = pDev->key->xkbInfo->desc->min_key_code;
+                mn.nKeyExplicit = XkbNumKeys(pDev->key->xkbInfo->desc);
+                mn.firstModMapKey = pDev->key->xkbInfo->desc->min_key_code;
+                mn.nModMapKeys = XkbNumKeys(pDev->key->xkbInfo->desc);
+                mn.firstVModMapKey = pDev->key->xkbInfo->desc->min_key_code;
+                mn.nVModMapKeys = XkbNumKeys(pDev->key->xkbInfo->desc);
+                mn.virtualMods = ~0; /* ??? */
+                mn.changed = XkbAllMapComponentsMask;
+                
+                /* If this is still the map we set at DEVICE_INIT, free it so
+                 * it doesn't just get lost.  (Shameful hack, sorry.) */
+                if (!inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr &&
+                    ckeyc->xkbInfo)
                     XkbFreeInfo(ckeyc->xkbInfo);
                 ckeyc->xkbInfo = pDev->key->xkbInfo;
-                /* FIXME OH MY GOD SO AWFUL let's hope nobody notices */
-                if (nkn.oldMinKeyCode == nkn.minKeyCode)
-                    nkn.oldMinKeyCode--;
-                if (nkn.oldMaxKeyCode == nkn.maxKeyCode)
-                    nkn.oldMaxKeyCode++;
-                XkbSendNewKeyboardNotify(inputInfo.keyboard, &nkn);
+                XkbSendMapNotify(inputInfo.keyboard, &mn);
             }
 #endif
             SendMappingNotify(MappingKeyboard, ckeyc->curKeySyms.minKeyCode,
diff-tree 31089816317f27c668b12a15c74fdd226a8df9f7 (from parents)
Merge: ab3ebfefdb7d21aba72a5030f6f93bf4fafed709 12dbd8a02f797ad57a1be683a02a1fcb1ca35438
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 8 12:01:12 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree ab3ebfefdb7d21aba72a5030f6f93bf4fafed709 (from 7721ee308fbbb6fc9c969f15fe04b3346c04f843)
Author: Tiago Vignatti <tv02 at c3sl.ufpr.br>
Date:   Tue Aug 8 12:00:34 2006 +0300

    xorgcfg: fix compilation error
    Add missing parentheses to IS_KBDDRIV macros.

diff --git a/hw/xfree86/utils/xorgcfg/interface.c b/hw/xfree86/utils/xorgcfg/interface.c
index 3670597..9b22dc7 100644
--- a/hw/xfree86/utils/xorgcfg/interface.c
+++ b/hw/xfree86/utils/xorgcfg/interface.c
@@ -66,7 +66,7 @@
 #define DefaultXFree86Dir	"/usr"
 #endif
 
-#define IS_KBDDRIV(S) ((strcasecmp((S),"kbd") == 0)
+#define IS_KBDDRIV(S) ((strcasecmp((S),"kbd") == 0))
 
 /*
  * Prototypes
diff --git a/hw/xfree86/utils/xorgcfg/keyboard-cfg.c b/hw/xfree86/utils/xorgcfg/keyboard-cfg.c
index 95102b5..545a670 100644
--- a/hw/xfree86/utils/xorgcfg/keyboard-cfg.c
+++ b/hw/xfree86/utils/xorgcfg/keyboard-cfg.c
@@ -37,7 +37,7 @@
 #include <X11/Xaw/SimpleMenu.h>
 #include <X11/Xaw/SmeBSB.h>
 
-#define IS_KBDDRIV(X) ((strcasecmp((X),"kbd") == 0)
+#define IS_KBDDRIV(X) ((strcasecmp((X),"kbd") == 0))
 
 /*
  * Types
diff --git a/hw/xfree86/utils/xorgcfg/text-mode.c b/hw/xfree86/utils/xorgcfg/text-mode.c
index 91616ad..5bb5648 100644
--- a/hw/xfree86/utils/xorgcfg/text-mode.c
+++ b/hw/xfree86/utils/xorgcfg/text-mode.c
@@ -46,7 +46,7 @@
 #include "xf86config.h"
 #include "loader.h"
 
-#define IS_KBDDRIV(X) ((strcmp((X),"kbd") == 0)
+#define IS_KBDDRIV(X) ((strcmp((X),"kbd") == 0))
 
 #ifndef PROJECT_ROOT
 #define PROJECT_ROOT "/usr"
diff-tree 7721ee308fbbb6fc9c969f15fe04b3346c04f843 (from 458c63a84110f64c7fce397a531a3a779c2239a2)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 23:03:02 2006 +0300

    config client: fix minor race with event queue
    Fix a small race whereby you could remove a device while events from it
    were still in the queue, by calling ProcessInputEvents immediately before
    RemoveDevice, to (hopefully) flush the event queue.

diff --git a/config/config.c b/config/config.c
index b85b120..d4cf233 100644
--- a/config/config.c
+++ b/config/config.c
@@ -173,6 +173,10 @@ configMessage(DBusConnection *connection
                 return DBUS_HANDLER_RESULT_HANDLED;
             }
             ErrorF("pDev is %p\n", pDev);
+            /* Call PIE here so we don't try to dereference a device that's
+             * already been removed.  Technically there's still a small race
+             * here, so we should ensure that SIGIO is blocked. */
+            ProcessInputEvents();
             RemoveDevice(pDev);
             dbus_error_free(&error);
             return DBUS_HANDLER_RESULT_HANDLED;
diff-tree 458c63a84110f64c7fce397a531a3a779c2239a2 (from a31d11a7a8485cdc799f76c4d407d3b7f7c9b350)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 23:02:17 2006 +0300

    enable adding devices after removal of a middle device
    Allow new devices to be added after a device that _wasn't_ the last on the
    list was removed, by ensuring inputInfo.numDevices always increases, and
    never decreases.

diff --git a/Xi/listdev.c b/Xi/listdev.c
index 91e8f22..02d55ad 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -96,7 +96,7 @@ int
 ProcXListInputDevices(register ClientPtr client)
 {
     xListInputDevicesReply rep;
-    int numdevs;
+    int numdevs = 0;
     int namesize = 1;	/* need 1 extra byte for strcpy */
     int size = 0;
     int total_length;
@@ -115,12 +115,15 @@ ProcXListInputDevices(register ClientPtr
     rep.sequenceNumber = client->sequence;
 
     AddOtherInputDevices();
-    numdevs = inputInfo.numDevices;
 
-    for (d = inputInfo.devices; d; d = d->next)
+    for (d = inputInfo.devices; d; d = d->next) {
 	SizeDeviceInfo(d, &namesize, &size);
-    for (d = inputInfo.off_devices; d; d = d->next)
+        numdevs++;
+    }
+    for (d = inputInfo.off_devices; d; d = d->next) {
 	SizeDeviceInfo(d, &namesize, &size);
+        numdevs++;
+    }
 
     total_length = numdevs * sizeof(xDeviceInfo) + size + namesize;
     devbuf = (char *)xalloc(total_length);
diff --git a/dix/devices.c b/dix/devices.c
index 1d423e2..69f1e7b 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -536,7 +536,7 @@ RemoveDevice(DeviceIntPtr dev)
     ErrorF("want to remove device %p, kb is %p, pointer is %p\n", dev, inputInfo.keyboard, inputInfo.pointer);
 #endif
 
-    if (!dev)
+    if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
         return BadImplementation;
 
     prev = NULL;
@@ -550,13 +550,6 @@ RemoveDevice(DeviceIntPtr dev)
 	    else
 		prev->next = next;
 
-	    inputInfo.numDevices--;
-
-	    if (inputInfo.keyboard == tmp)
-	        inputInfo.keyboard = NULL;
-	    else if (inputInfo.pointer == tmp)
-	        inputInfo.pointer = NULL;
-
 	    ret = Success;
 	}
     }
@@ -572,13 +565,6 @@ RemoveDevice(DeviceIntPtr dev)
 	    else
 		prev->next = next;
 
-	    inputInfo.numDevices--;
-
-	    if (inputInfo.keyboard == tmp)
-	        inputInfo.keyboard = NULL;
-	    else if (inputInfo.pointer == tmp)
-	        inputInfo.pointer = NULL;
-
             ret = Success;
 	}
     }
diff-tree a31d11a7a8485cdc799f76c4d407d3b7f7c9b350 (from bedc4ecf23c7150e3156e0d24602ed3bc3977225)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 23:01:23 2006 +0300

    GKVE: get rid of bogus double-release check
    Get rid of a bogus double-release check which broke non-XKB servers.

diff --git a/dix/events.c b/dix/events.c
index 002b47d..e5ae3e6 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4727,14 +4727,6 @@ int GetKeyboardValuatorEvents(xEvent **x
                                                KeyRelease, key_code,
                                                num_valuators, valuators);
     }
-    else if (type == KeyRelease &&
-             !((pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
-#ifdef XKB
-             && noXkbExtension
-#endif
-             ) {
-        return;
-    }
 
     ev = (xEvent *)xcalloc(sizeof(xEvent), numEvents);
     if (!ev)
diff-tree bedc4ecf23c7150e3156e0d24602ed3bc3977225 (from baf93b3abe1e88d82ee6a3d6939f50f96ded271a)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 23:00:45 2006 +0300

    xephyr: aid input debugging
    Add the 'ephyr' mouse and keyboard drivers to the driver list so we can
    re-add devices.
    Set the names properly in Ephyr{Keyboard,Mouse}Init, not in InitInput.

diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index d3c9bf9..7db8675 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -865,6 +865,7 @@ MouseInit (KdPointerInfo *pi)
     ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
     pi->nAxes = 3;
     pi->nButtons = 32;
+    pi->name = KdSaveString("Xephyr virtual mouse");
     ephyrMouse = pi;
     return Success;
 }
@@ -917,6 +918,7 @@ EphyrKeyboardInit (KdKeyboardInfo *ki)
   ki->maxScanCode = ki->keySyms.maxKeyCode;
   ki->keySyms.mapWidth = ephyrKeySyms.mapWidth;
   ki->keySyms.map = ephyrKeySyms.map;
+  ki->name = KdSaveString("Xephyr virtual keyboard");
   ephyrKbd = ki;
   return Success;
 }
diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
index 021abd6..a77b87e 100644
--- a/hw/kdrive/ephyr/ephyrinit.c
+++ b/hw/kdrive/ephyr/ephyrinit.c
@@ -58,14 +58,14 @@ InitInput (int argc, char **argv)
   if (!ki)
     FatalError("Couldn't create Xephyr keyboard\n");
   ki->driver = &EphyrKeyboardDriver;
-  ki->name = KdSaveString("Xephyr virtual keyboard");
+  KdAddKeyboardDriver(&EphyrKeyboardDriver);
   KdAddKeyboard(ki);
 
   pi = KdNewPointer();
   if (!pi)
     FatalError("Couldn't create Xephyr pointer\n");
   pi->driver = &EphyrMouseDriver;
-  pi->name = KdSaveString("Xephyr virtual mouse");
+  KdAddPointerDriver(&EphyrMouseDriver);
   KdAddPointer(pi);
 
   KdInitInput();
diff-tree baf93b3abe1e88d82ee6a3d6939f50f96ded271a (from ccb53340b66a778abf10182fd88a7d699207fb84)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 21:12:45 2006 +0300

    kdrive: move map initialisation to KdNewPointer
    Do a linear n -> n initialisation on the map up until KD_MAX_BUTTON in
    KdNewPointer, moving it out of both KdParsePointer, and KdPointerProc.
    Also remove dead pointer acceleration code.

diff --git a/hw/kdrive/src/kinfo.c b/hw/kdrive/src/kinfo.c
index 1d81ed3..1e03ac8 100644
--- a/hw/kdrive/src/kinfo.c
+++ b/hw/kdrive/src/kinfo.c
@@ -117,6 +117,7 @@ KdPointerInfo *
 KdNewPointer (void)
 {
     KdPointerInfo *pi;
+    int i;
 
     pi = (KdPointerInfo *)xcalloc(1, sizeof(KdPointerInfo));
     if (!pi)
@@ -130,6 +131,9 @@ KdNewPointer (void)
     pi->next = NULL;
     pi->options = NULL;
     pi->nAxes = 3;
+    pi->nButtons = KD_MAX_BUTTON;
+    for (i = 1; i < KD_MAX_BUTTON; i++)
+        pi->map[i] = i;
 
     return pi;
 }
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index e8a00dc..1718fda 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -433,9 +433,6 @@ KdPointerProc(DeviceIntPtr pDevice, int 
             return BadImplementation;
         }
 
-	for (i = 1; i <= pi->nButtons; i++)
-	    pi->map[i] = i; 
-
         if ((*pi->driver->Init) (pi) != Success) {
             return !Success;
         }
@@ -1156,9 +1153,6 @@ KdParsePointer (char *arg)
     pi->nButtons = 3;
     pi->inputClass = KD_MOUSE;
 
-    for (i = 0; i < KD_MAX_BUTTON; i++)
-        pi->map[i] = i + 1;
-
     if (!arg)
     {
         ErrorF("mouse: no arg\n");
@@ -1967,39 +1961,6 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   
  * passed off to MI for enqueueing.
  */
 
-static void
-KdMouseAccelerate (KdPointerInfo *pi, int *dx, int *dy)
-{
-    DeviceIntPtr device = pi->dixdev;
-    PtrCtrl *pCtrl = &device->ptrfeed->ctrl;
-    double  speed = sqrt (*dx * *dx + *dy * *dy);
-    double  accel;
-#ifdef QUADRATIC_ACCELERATION
-    double  m;
-
-    /*
-     * Ok, so we want it moving num/den times faster at threshold*2
-     *
-     * accel = m *threshold + b
-     * 1 = m * 0 + b	-> b = 1
-     *
-     * num/den = m * (threshold * 2) + 1
-     *
-     * num / den - 1 = m * threshold * 2
-     * (num / den - 1) / threshold * 2 = m
-     */
-    m = (((double) pCtrl->num / (double) pCtrl->den - 1.0) / 
-	 ((double) pCtrl->threshold * 2.0));
-    accel = m * speed + 1;
-#else
-    accel = 1.0;
-    if (speed > pCtrl->threshold)
-	accel = (double) pCtrl->num / pCtrl->den;
-#endif
-    *dx = accel * *dx;
-    *dy = accel * *dy;
-}
-
 /* FIXME do something a little more clever to deal with multiple axes here */
 void
 KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
@@ -2028,9 +1989,6 @@ KdEnqueuePointerEvent(KdPointerInfo *pi,
 	    x = rx;
 	    y = ry;
 	}
-        /* screw this, use the DIX's acceleration (stolen from XFree86)
-         * instead.
-         * KdMouseAccelerate (pi, &x, &y); */
     }
     else {
 	if (pi->transformCoordinates) {
diff-tree ccb53340b66a778abf10182fd88a7d699207fb84 (from d1c18af27e0aed73104743afb4bf4b8d3d1186cf)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 21:12:00 2006 +0300

    ephyr: cleanup
    Remove extraneous KdAddPointerDriver call.

diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index 86a072d..d3c9bf9 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -866,7 +866,6 @@ MouseInit (KdPointerInfo *pi)
     pi->nAxes = 3;
     pi->nButtons = 32;
     ephyrMouse = pi;
-    KdAddPointerDriver(&EphyrMouseDriver);
     return Success;
 }
 
diff-tree d1c18af27e0aed73104743afb4bf4b8d3d1186cf (from 9b7ecbd1dd8d092221897e29c85f3306c7367716)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 21:11:38 2006 +0300

    GPE: use button map for DBP/DBR, not just BP/BR
    Make sure we use the button map for extended events, not just core.

diff --git a/dix/events.c b/dix/events.c
index f87e850..002b47d 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5044,7 +5044,7 @@ GetPointerEvents(xEvent **xE, DeviceIntP
 #ifdef DEBUG
         ErrorF("GPE: detail is %d\n", buttons);
 #endif
-        kbp->detail = buttons;
+        kbp->detail = pDev->button->map[buttons];
     }
 
     if (num_valuators > 2 && (type == MotionNotify ||
diff-tree 9b7ecbd1dd8d092221897e29c85f3306c7367716 (from eb6e8d4042252b13328dbb122e0e6186796a80ac)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 21:09:32 2006 +0300

    kdrive: prevent overrun in map
    We actually need n + 1 elements for the mouse button map, not n.

diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index c9405b1..7e8712c 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -258,7 +258,7 @@ struct _KdPointerInfo {
     InputOption           *options;
     int                   inputClass;
 
-    CARD8                 map[KD_MAX_BUTTON];
+    CARD8                 map[KD_MAX_BUTTON + 1];
     int                   nButtons;
     int                   nAxes;
 
diff-tree eb6e8d4042252b13328dbb122e0e6186796a80ac (from afcad4ad99bbfc8bdcd0f4fdd70e072108410d30)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 21:05:37 2006 +0300

    kdrive: increase maximum number of buttons
    Increase KD_MAX_BUTTONS to 32.

diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index 843f921..c9405b1 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -234,7 +234,7 @@ typedef enum _kdPointerState {
     num_input_states
 } KdPointerState;
 
-#define KD_MAX_BUTTON  16
+#define KD_MAX_BUTTON  32
 
 #define KD_KEYBOARD 1
 #define KD_MOUSE 2
diff-tree afcad4ad99bbfc8bdcd0f4fdd70e072108410d30 (from 98fdf874eeadd5b37413922d8afba8415d0c56bb)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 18:11:05 2006 +0300

    xfree86 ddx: always free GKE/GPE events
    free() events we get passed back from GKE and GPE so we don't just, er,
    leak them all.  *cough*.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index bcae3f0..91db82e 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -639,7 +639,7 @@ xf86PostMotionEvent(DeviceIntPtr	device,
     int i = 0, nevents = 0;
     Bool drag = xf86SendDragEvents(device);
     LocalDevicePtr local = (LocalDevicePtr) device->public.devicePrivate;
-    xEvent *xE = NULL;
+    xEvent *events = NULL;
     int *valuators = NULL;
     int flags = 0;
 
@@ -662,14 +662,15 @@ xf86PostMotionEvent(DeviceIntPtr	device,
 #endif
     }
 
-    nevents = GetPointerEvents(&xE, device, MotionNotify, 0,
+    nevents = GetPointerEvents(&events, device, MotionNotify, 0,
                                flags, num_valuators, valuators);
 
     for (i = 0; i < nevents; i++) {
-        if (xE->u.keyButtonPointer.time > xf86Info.lastEventTime)
-            xf86Info.lastEventTime = xE->u.keyButtonPointer.time;
-        mieqEnqueue(xE++);
+        if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
+            xf86Info.lastEventTime = events->u.keyButtonPointer.time;
+        mieqEnqueue(events + i);
     }
+    xfree(events);
     
 #if 0
     if (HAS_MOTION_HISTORY(local)) {
@@ -818,8 +819,9 @@ xf86PostButtonEvent(DeviceIntPtr	device,
     for (i = 0; i < nevents; i++) {
         if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
             xf86Info.lastEventTime = events->u.keyButtonPointer.time;
-        mieqEnqueue(events++);
+        mieqEnqueue(events + i);
     }
+    xfree(events);
 }
 
 _X_EXPORT void
@@ -862,8 +864,9 @@ xf86PostKeyEvent(DeviceIntPtr	device,
     for (i = 0; i < nevents; i++) {
         if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
             xf86Info.lastEventTime = events->u.keyButtonPointer.time;
-        mieqEnqueue(events++);
+        mieqEnqueue(events + i);
     }
+    xfree(events);
 }
 
 _X_EXPORT void
@@ -885,8 +888,9 @@ xf86PostKeyboardEvent(DeviceIntPtr      
     for (i = 0; i < nevents; i++) {
         if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
             xf86Info.lastEventTime = events->u.keyButtonPointer.time;
-        mieqEnqueue(events++);
+        mieqEnqueue(events + i);
     }
+    xfree(events);
 }
 
 /* 
diff-tree 98fdf874eeadd5b37413922d8afba8415d0c56bb (from 5c7001fef8ffc6e3d8585a37d3f79a9495be8ed0)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 16:51:39 2006 +0300

    move all autorepeat logic to DIX
    Move core autorepeat logic for keyboards down to the DIX, remove it from
    KDrive.

diff --git a/dix/events.c b/dix/events.c
index 5d6b28b..f87e850 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4661,18 +4661,34 @@ WriteEventsToClient(ClientPtr pClient, i
     }
 }
 
+/**
+ * Convenience wrapper around GetKeyboardValuatorEvents, that takes no
+ * valuators.
+ */
 int
 GetKeyboardEvents(xEvent **xE, DeviceIntPtr pDev, int type, int key_code) {
     return GetKeyboardValuatorEvents(xE, pDev, type, key_code, 0, NULL);
 }
 
+/**
+ * Returns a set of keyboard events for KeyPress/KeyRelease, optionally
+ * also with valuator events.  Handles Xi and XKB.
+ *
+ * xE will be set to an array of events, which must be freed by the user;
+ * the return value is the number of events in xE, which is not
+ * NULL-terminated.
+ *
+ * Note that this function recurses!  If called for non-XKB, a repeating
+ * key press will trigger a matching KeyRelease, as well as the
+ * KeyPresses.
+ */
 int GetKeyboardValuatorEvents(xEvent **xE, DeviceIntPtr pDev, int type,
                               int key_code, int num_valuators,
                               int *valuators) {
-    int numEvents = 0, ms = 0, first_valuator = 0;
+    int numEvents = 0, numRepeatEvents = 0, ms = 0, first_valuator = 0, i = 0;
     deviceKeyButtonPointer *kbp = NULL;
     deviceValuator *xv = NULL;
-    xEvent *ev = NULL;
+    xEvent *ev = NULL, *repeatEvents = NULL;
     KeyClassPtr ckeyc;
 #ifdef XKB
     xkbNewKeyboardNotify nkn;
@@ -4693,10 +4709,44 @@ int GetKeyboardValuatorEvents(xEvent **x
     if (num_valuators)
         numEvents += (num_valuators % 6) + 1;
 
+    /* Handle core repeating, via press/release/press/release.
+     * FIXME: In theory, if you're repeating with two keyboards,
+     *        you could get unbalanced events here. */
+    if (type == KeyPress &&
+        ((pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
+#ifdef XKB
+       && noXkbExtension
+#endif
+       ) {
+        if (!pDev->kbdfeed->ctrl.autoRepeat ||
+            pDev->key->modifierMap[key_code] ||
+            !(pDev->kbdfeed->ctrl.autoRepeats[key_code >> 3]
+                & (1 << (key_code & 7))))
+            return 0;
+        numEvents += GetKeyboardValuatorEvents(&repeatEvents, pDev,
+                                               KeyRelease, key_code,
+                                               num_valuators, valuators);
+    }
+    else if (type == KeyRelease &&
+             !((pDev->key->down[key_code >> 3] & (key_code & 7)) & 1)
+#ifdef XKB
+             && noXkbExtension
+#endif
+             ) {
+        return;
+    }
+
     ev = (xEvent *)xcalloc(sizeof(xEvent), numEvents);
     if (!ev)
         return 0;
 
+    if (repeatEvents) {
+        for (i = 0; i < numRepeatEvents; i++) {
+            ev = repeatEvents++;
+            ev++;
+        }
+    }
+
     *xE = ev;
     ms = GetTimeInMillis();
 
@@ -4791,7 +4841,7 @@ int GetKeyboardValuatorEvents(xEvent **x
     }
 
 #ifdef DEBUG
-    ErrorF("GKE: putting out %d events with detail %d\n", numEvents, key_code);
+    ErrorF("GKVE: putting out %d events with detail %d\n", numEvents, key_code);
 #endif
 
     return numEvents;
@@ -4855,6 +4905,13 @@ acceleratePointer(DeviceIntPtr pDev, int
     }
 }
 
+/**
+ * Generate a series of xEvents (returned in xE) representing pointer
+ * motion, or button presses.  Xi and XKB-aware.
+ *
+ * xE is not NULL-terminated; the return value is the number of events.
+ * The user is responsible for freeing these events.
+ */
 int
 GetPointerEvents(xEvent **xE, DeviceIntPtr pDev, int type, int buttons,
                  int flags, int num_valuators, int *valuators) {
@@ -4990,9 +5047,6 @@ GetPointerEvents(xEvent **xE, DeviceIntP
         kbp->detail = buttons;
     }
 
-    /* XXX: the spec says that Device{Key,Button}{Press,Release} events
-     * for relative devices shouldn't contain valuators since only the
-     * state field will have meaning, but I don't see why. */
     if (num_valuators > 2 && (type == MotionNotify ||
                               flags & POINTER_ABSOLUTE)) {
         kbp->deviceid |= MORE_EVENTS;
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 6d33c31..e8a00dc 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -1943,34 +1943,6 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   
 		type = KeyPress;
 	}
 	
-	/*
-	 * Check pressed keys which are already down
-	 */
-	if (IsKeyDown (ki, key_code) && type == KeyPress) {
-	    /*
-	     * Check auto repeat
-	     */
-	    if (!ctrl->autoRepeat || keyc->modifierMap[key_code] ||
-		!(ctrl->autoRepeats[key_code >> 3] & (1 << (key_code & 7))))
-		return;
-
-	    /*
-	     * X delivers press/release even for autorepeat
-	     */
-            nEvents = GetKeyboardEvents(&xE, ki->dixdev, KeyRelease, key_code);
-            for (i = 0; i < nEvents; i++)
-                KdQueueEvent(xE++);
-            nEvents = GetKeyboardEvents(&xE, ki->dixdev, KeyPress, key_code);
-            for (i = 0; i < nEvents; i++)
-                KdQueueEvent(xE++);
-	}
-	/*
-	 * Check released keys which are already up
-	 */
-	else if (!IsKeyDown (ki, key_code) && type == KeyRelease) {
-	    return;
-        }
-
         KdCheckSpecialKeys(ki, type, key_code);
         KdHandleKeyboardEvent(ki, type, key_code);
         nEvents = GetKeyboardEvents(&xE, ki->dixdev, type, key_code);
diff-tree 5c7001fef8ffc6e3d8585a37d3f79a9495be8ed0 (from c85e64cba1d2d88f676ca7cf23b52a6f8219e90e)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 16:51:09 2006 +0300

    memcpy() events in
    memcpy events into our event structure instead of doing pointer assignment.

diff --git a/mi/mieq.c b/mi/mieq.c
index 0d9dcb8..3d44ee7 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -51,7 +51,7 @@ in this Software without prior written a
 #define QUEUE_SIZE  256
 
 typedef struct _Event {
-    xEvent          event[2];
+    xEvent          event[7];
     int             nevents;
     ScreenPtr	    pScreen;
     DeviceIntPtr    pDev;
@@ -101,6 +101,7 @@ mieqEnqueue (xEvent *e)
 
 #ifdef DEBUG
     ErrorF("mieqEnqueue: slamming an event on to the queue from %d\n", kbp->deviceid & DEVICE_BITS);
+    ErrorF("    type %d, detail %d\n", e->u.u.type, e->u.u.detail);
 #endif
 
     if (e->u.u.type == MotionNotify) {
@@ -122,9 +123,8 @@ mieqEnqueue (xEvent *e)
         /* We silently steal valuator events: just tack them on to the last
          * motion event they need to be attached to.  Sigh. */
         if (e->u.u.type == DeviceValuator) {
-            if (laste->nevents >= 6) {
+            if (laste->nevents > 6) {
                 ErrorF("mieqEnqueue: more than six valuator events; dropping.\n");
-                free(e);
                 return;
             }
             if (oldtail == miEventQueue.head || 
@@ -134,10 +134,9 @@ mieqEnqueue (xEvent *e)
                 ((lastkbp->deviceid & DEVICE_BITS) !=
                  (v->deviceid & DEVICE_BITS))) {
                 ErrorF("mieqEnequeue: out-of-order valuator event; dropping.\n");
-                free(e);
                 return;
             }
-            laste->event[laste->nevents++] = *e;
+            memcpy(&(laste->event[laste->nevents++]), e, sizeof(xEvent));
             return;
         }
         else if (e->u.u.type == DeviceMotionNotify) {
@@ -161,13 +160,12 @@ mieqEnqueue (xEvent *e)
     	/* Toss events which come in late */
     	if (newtail == miEventQueue.head) {
             ErrorF("tossed event which came in late\n");
-            free(e);
 	    return;
         }
 	miEventQueue.tail = newtail;
     }
 
-    miEventQueue.events[oldtail].event[0] = *e;
+    memcpy(&(miEventQueue.events[oldtail].event[0]), e, sizeof(xEvent));
     miEventQueue.events[oldtail].nevents = 1;
 
     /*
@@ -238,7 +236,5 @@ void mieqProcessInputEvents ()
 	    	++miEventQueue.head;
             (*e->pDev->public.processInputProc)(e->event, e->pDev, e->nevents);
 	}
-
-        free(e->event);
     }
 }
diff-tree c85e64cba1d2d88f676ca7cf23b52a6f8219e90e (from parents)
Merge: a406f6bfeaa46e3236f7ab46813fe6c30b936a35 f54b71b772a1f587394ae3968782b611e52f0e2d
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Mon Aug 7 15:54:55 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree a406f6bfeaa46e3236f7ab46813fe6c30b936a35 (from 997ba45b192f21810099ed888792a45f1677a9ce)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Aug 4 12:40:19 2006 +0300

    mieq: don't leak events
    free all events posted through mieqEnqueue.

diff --git a/mi/mieq.c b/mi/mieq.c
index 8dbf166..0d9dcb8 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -124,6 +124,7 @@ mieqEnqueue (xEvent *e)
         if (e->u.u.type == DeviceValuator) {
             if (laste->nevents >= 6) {
                 ErrorF("mieqEnqueue: more than six valuator events; dropping.\n");
+                free(e);
                 return;
             }
             if (oldtail == miEventQueue.head || 
@@ -133,6 +134,7 @@ mieqEnqueue (xEvent *e)
                 ((lastkbp->deviceid & DEVICE_BITS) !=
                  (v->deviceid & DEVICE_BITS))) {
                 ErrorF("mieqEnequeue: out-of-order valuator event; dropping.\n");
+                free(e);
                 return;
             }
             laste->event[laste->nevents++] = *e;
@@ -159,6 +161,7 @@ mieqEnqueue (xEvent *e)
     	/* Toss events which come in late */
     	if (newtail == miEventQueue.head) {
             ErrorF("tossed event which came in late\n");
+            free(e);
 	    return;
         }
 	miEventQueue.tail = newtail;
@@ -235,5 +238,7 @@ void mieqProcessInputEvents ()
 	    	++miEventQueue.head;
             (*e->pDev->public.processInputProc)(e->event, e->pDev, e->nevents);
 	}
+
+        free(e->event);
     }
 }
diff-tree 997ba45b192f21810099ed888792a45f1677a9ce (from 87fe85f38b6f781bf0e2eb555526e3d77779f9fa)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Aug 4 11:18:16 2006 +0300

    fix incorrect button test
    Test for n (1..nButtons) being under nButtons, not button (1..(1<<nButtons)).

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index f072ef1..6d33c31 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -2087,7 +2087,7 @@ KdEnqueuePointerEvent(KdPointerInfo *pi,
 
     buttons = flags;
 
-    for (button = KD_BUTTON_1, n = 1; button <= pi->nButtons;
+    for (button = KD_BUTTON_1, n = 1; n <= pi->nButtons;
          button <<= 1, n++) {
         if (((pi->buttonState & button) ^ (buttons & button)) &&
            !(buttons & button)) {
@@ -2098,7 +2098,7 @@ KdEnqueuePointerEvent(KdPointerInfo *pi,
                                    dixflags, FALSE);
 	}
     }
-    for (button = KD_BUTTON_1, n = 1; button <= pi->nButtons;
+    for (button = KD_BUTTON_1, n = 1; n <= pi->nButtons;
          button <<= 1, n++) {
 	if (((pi->buttonState & button) ^ (buttons & button)) &&
 	    (buttons & button)) {
diff-tree 87fe85f38b6f781bf0e2eb555526e3d77779f9fa (from parents)
Merge: 3518e2d0debc97e2bacdefe604b280e7fdfdd216 654619d76c779606f2315782fc01d1410399fa3b
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Jul 30 10:51:34 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff --cc hw/xfree86/common/Makefile.am
index 090112c,d983ee9..57493f3
@@@ -30,9 -32,9 +30,9 @@@
  
  AM_LDFLAGS = -r
  libcommon_la_SOURCES = xf86Configure.c xf86Bus.c xf86Config.c \
-                       xf86Cursor.c xf86DGA.c xf86DPMS.c \
+                       xf86Cursor.c xf86cvt.c xf86DGA.c xf86DPMS.c \
                        xf86DoProbe.c xf86DoScanPci.c xf86Events.c \
 -                      xf86Globals.c xf86Io.c xf86AutoConfig.c \
 +                      xf86Globals.c xf86AutoConfig.c \
                        xf86MiscExt.c xf86Option.c \
                        xf86VidMode.c xf86fbman.c xf86cmap.c \
                        xf86Helper.c xf86PM.c \
diff-tree 3518e2d0debc97e2bacdefe604b280e7fdfdd216 (from parents)
Merge: eb7733a48a92405660d5d2ab60913b62c30daaed 3821f6aeaa714582ee0a631de96c6e7cfd96303e
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Jul 26 11:29:21 2006 +0300

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree eb7733a48a92405660d5d2ab60913b62c30daaed (from 4ea475924c557ad0819b796f5369e5e669465709)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Jul 26 11:28:45 2006 +0300

    kdrive: drop excessive NewInputDeviceRequest debugging

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index d46694f..f072ef1 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -2420,8 +2420,6 @@ NewInputDeviceRequest(InputOption *optio
     KdPointerInfo *pi = NULL;
     KdKeyboardInfo *ki = NULL;
 
-    ErrorF("handling NIDR\n");
-
     for (option = options; option; option = option->next) {
         if (strcmp(option->key, "type") == 0) {
             if (strcmp(option->value, "pointer") == 0) {
@@ -2481,6 +2479,4 @@ NewInputDeviceRequest(InputOption *optio
             return BadImplementation;
         }
     }
-
-    ErrorF("done handling NIDR\n");
 }
diff-tree 4ea475924c557ad0819b796f5369e5e669465709 (from ca3f4fc1b0c21a0620ab1eb35c199cd55d795095)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Jul 25 20:00:48 2006 +0300

    re-add OpenedHand copyright
    Ae-add OpenedHand copyright, accidentally dropped in KDrive new world
    order patch.  Sorry guys.

diff --git a/hw/kdrive/linux/tslib.c b/hw/kdrive/linux/tslib.c
index aa57e87..bf2a3db 100644
--- a/hw/kdrive/linux/tslib.c
+++ b/hw/kdrive/linux/tslib.c
@@ -7,6 +7,7 @@
  * Copyright © 1999 Keith Packard
  * Copyright © 2000 Compaq Computer Corporation
  * Copyright © 2002 MontaVista Software Inc.
+ * Copyright © 2005 OpenedHand Ltd.
  * Copyright © 2006 Nokia Corporation
  * 
  * Permission to use, copy, modify, distribute, and sell this software and its
diff-tree ca3f4fc1b0c21a0620ab1eb35c199cd55d795095 (from e73e5e2a4d8f22889d840a7719479f9af686cb9c)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Jul 23 19:02:12 2006 -0400

    add fallback ChangeDeviceControl, allow XOpenDevice on closed device
    Add a fallback ChangeDeviceControl, which allows the attributes we know about
    so far.
    Allow XOpenDevice on closed devices.

diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 3082e39..bcae3f0 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -288,18 +288,21 @@ OpenInputDevice(DeviceIntPtr	dev,
                 ClientPtr	client,
                 int		*status)
 {
-    if (!dev->inited) {
-        *status = BadDevice;
-    } else {
-        if (!dev->public.on) {
-            if (EnableDevice(dev)) {
-                /* to prevent ProcXOpenDevice to call EnableDevice again */
-                dev->startup = FALSE;
-            } else {
-                *status = BadDevice;
-            }
+    if (!dev->inited)
+        ActivateDevice(dev);
+
+    if (!dev->public.on) {
+        if (EnableDevice(dev)) {
+            dev->startup = FALSE;
+        }
+        else {
+            ErrorF("couldn't enable device %s\n", dev->name);
+            *status = BadDevice;
+            return;
         }
     }
+
+    *status = Success;
 }
 
 
@@ -530,7 +533,14 @@ ChangeDeviceControl (ClientPtr client, D
   LocalDevicePtr        local = (LocalDevicePtr)dev->public.devicePrivate;
 
   if (!local->control_proc) {
-      return (BadMatch);
+      switch (control->control) {
+      case DEVICE_CORE:
+      case DEVICE_RESOLUTION:
+      case DEVICE_TOUCHSCREEN:
+        return Success;
+      default:
+        return BadMatch;
+      }
   }
   else {
       return (*local->control_proc)(local, control);
diff-tree e73e5e2a4d8f22889d840a7719479f9af686cb9c (from parents)
Merge: a73cef1f005ca66db18e952e676ee5a21b829700 8977b07434d75ca396d236dc1324f0c862b633c7
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Jul 22 13:56:30 2006 -0400

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree a73cef1f005ca66db18e952e676ee5a21b829700 (from parents)
Merge: 672ca156bfb11440e6e234650bfba9d38e1edb52 70869fc6777f87cd05794446caa739e3d9a91ffe
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Jul 22 12:07:22 2006 -0400

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree 672ca156bfb11440e6e234650bfba9d38e1edb52 (from parents)
Merge: d14d91f094c3897c889f6aafb66d738820dae0aa 6cf844ab69926b6d23619a12c97734af3881ba67
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 21 19:58:42 2006 -0400

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree d14d91f094c3897c889f6aafb66d738820dae0aa (from 87a6346bf7f086b5f98b2b2ecd52f27efe864e56)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 21 19:57:28 2006 -0400

    loader: walk directory paths with readdir(), don't stat() everything
    Walk the directories with readdir, and don't stat everything we can
    find.  Thanks to davej for the public humiliation reminding me to go back
    and re-fix this one.

diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c
index fd84a92..53dcffe 100644
--- a/hw/xfree86/loader/loadmod.c
+++ b/hw/xfree86/loader/loadmod.c
@@ -389,23 +389,65 @@ FreeSubdirs(const char **subdirs)
 }
 
 static char *
-FindModule(const char *module, const char *dir, const char **subdirlist,
+FindModuleInSubdir(const char *dirpath, const char *module)
+{
+    struct dirent *direntry = NULL;
+    DIR *dir = NULL;
+    char *ret = NULL, tmpBuf[PATH_MAX];
+    struct stat stat_buf;
+
+    dir = opendir(dirpath);
+    if (!dir)
+        return NULL;
+
+    while ((direntry = readdir(dir))) {
+        if (direntry->d_name[0] == '.')
+            continue;
+        if ((stat(direntry->d_name, &stat_buf) == 0) && S_ISDIR(stat_buf.st_mode)) {
+            snprintf(tmpBuf, PATH_MAX, "%s/%s", dirpath, direntry->d_name);
+            if ((ret = FindModuleInSubdir(tmpBuf, module)))
+                break;
+            continue;
+        }
+ 
+        snprintf(tmpBuf, PATH_MAX, "lib%s.so", module);
+        if (strcmp(direntry->d_name, tmpBuf) == 0) {
+            ret = malloc(strlen(tmpBuf) + strlen(dirpath) + 2);
+            sprintf(ret, "%s/%s", dirpath, tmpBuf);
+            break;
+        }
+
+        snprintf(tmpBuf, PATH_MAX, "%s_drv.so", module);
+        if (strcmp(direntry->d_name, tmpBuf) == 0) {
+            ret = malloc(strlen(tmpBuf) + strlen(dirpath) + 2);
+            sprintf(ret, "%s/%s", dirpath, tmpBuf);
+            break;
+        }
+
+        snprintf(tmpBuf, PATH_MAX, "%s.so", module);
+        if (strcmp(direntry->d_name, tmpBuf) == 0) {
+            ret = malloc(strlen(tmpBuf) + strlen(dirpath) + 2);
+            sprintf(ret, "%s/%s", dirpath, tmpBuf);
+            break;
+        }
+    }
+    
+    closedir(dir);
+    return ret;
+}
+
+static char *
+FindModule(const char *module, const char *dirname, const char **subdirlist,
 	   PatternPtr patterns)
 {
-    char buf[PATH_MAX + 1], tmpBuf[PATH_MAX + 1];
+    char buf[PATH_MAX + 1];
     char *dirpath = NULL;
     char *name = NULL;
-    struct stat stat_buf;
     int dirlen;
     const char **subdirs = NULL;
     const char **s;
 
-#ifndef __EMX__
-    dirpath = (char *)dir;
-#else
-    dirpath = xalloc(strlen(dir) + 10);
-    strcpy(dirpath, (char *)__XOS2RedirRoot(dir));
-#endif
+    dirpath = (char *)dirname;
     if (strlen(dirpath) > PATH_MAX)
 	return NULL;
     
@@ -418,38 +460,15 @@ FindModule(const char *module, const cha
 	    continue;
 	strcpy(buf, dirpath);
 	strcat(buf, *s);
-        if ((stat(buf, &stat_buf) == 0) && S_ISDIR(stat_buf.st_mode)) {
-            if (buf[dirlen - 1] != '/') {
-                buf[dirlen++] = '/';
-            }
-	    
-            snprintf(tmpBuf, PATH_MAX, "%slib%s.so", buf, module);
-            if (stat(tmpBuf, &stat_buf) == 0) {
-                name = tmpBuf;
-                break;
-            }
-
-            snprintf(tmpBuf, PATH_MAX, "%s%s_drv.so", buf, module);
-            if (stat(tmpBuf, &stat_buf) == 0) {
-                name = tmpBuf;
-                break;
-            }
-
-            snprintf(tmpBuf, PATH_MAX, "%s%s.so", buf, module);
-            if (stat(tmpBuf, &stat_buf) == 0) {
-                name = tmpBuf;
-                break;
-            }
-        }
+        if ((name = FindModuleInSubdir(buf, module)))
+            break;
     }
+
     FreeSubdirs(subdirs);
-    if (dirpath != dir)
+    if (dirpath != dirname)
 	xfree(dirpath);
 
-    if (name) {
-	return xstrdup(name);
-    }
-    return NULL;
+    return name;
 }
 
 _X_EXPORT char **
diff-tree 87a6346bf7f086b5f98b2b2ecd52f27efe864e56 (from parents)
Merge: b73fb2ae35a82e0bdd48f01132e971fb84946ff1 0486d3966d2888ef86d36c19f31bdbc2a3e8c652
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 21 19:36:25 2006 -0400

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff --cc configure.ac
index 456b8b5,f8aa32a..a20237c
@@@ -515,21 -509,9 +515,21 @@@
  XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
  
  dnl Core modules for most extensions, et al.
- REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4]"
 -REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto [kbproto >= 1.0.3]"
++REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4] [kbproto >= 1.0.3]"
  REQUIRED_LIBS="xfont xau fontenc"
  
 +if test "x$DBUS" = xauto; then
 +       PKG_CHECK_MODULES(DBUS, dbus-1, [DBUS=yes], [DBUS=no])
 +fi
 +if test "x$DBUS" = xyes; then
 +       PKG_CHECK_MODULES(DBUS, dbus-1)
 +       AC_DEFINE(HAVE_DBUS, 1, [Have D-BUS support])
 +       REQUIRED_MODULES="$REQUIRED_MODULES dbus-1"
 +       REQUIRED_LIBS="$REQUIRED_LIBS dbus-1"
 +fi
 +CONFIG_LIB='$(top_builddir)/config/libconfig.a'
 +AM_CONDITIONAL(DBUS, [test "x$DBUS" = xyes])
 +
  AM_CONDITIONAL(XV, [test "x$XV" = xyes])
  if test "x$XV" = xyes; then
  	AC_DEFINE(XV, 1, [Support Xv extension])
diff-tree b73fb2ae35a82e0bdd48f01132e971fb84946ff1 (from parents)
Merge: e7ac27ad81efbea6128b3cec443ca98e228d14ad aff404f293ed86a44a093a51a9f11e79e6c3f4f6
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 21 19:30:26 2006 -0400

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree e7ac27ad81efbea6128b3cec443ca98e228d14ad (from 81913a12910e39d7ea6af8657c1c66cc6791cd65)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 21 19:29:28 2006 -0400

    revert accidental deletion of lnx_io.c; re-delete lnx_kbd.c
    Thinko'd which file to remove after merging from master.

diff --git a/hw/xfree86/os-support/linux/lnx_io.c b/hw/xfree86/os-support/linux/lnx_io.c
deleted file mode 100644
index 836aaa1..0000000
--- a/hw/xfree86/os-support/linux/lnx_io.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * Copyright 1992 by Orest Zborowski <obz at Kodak.com>
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Orest Zborowski and David Dawes 
- * not be used in advertising or publicity pertaining to distribution of 
- * the software without specific, written prior permission.  Orest Zborowski
- * and David Dawes make no representations about the suitability of this 
- * software for any purpose.  It is provided "as is" without express or 
- * implied warranty.
- *
- * OREST ZBOROWSKI AND DAVID DAWES DISCLAIMS ALL WARRANTIES WITH REGARD 
- * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 
- * FITNESS, IN NO EVENT SHALL OREST ZBOROWSKI OR DAVID DAWES BE LIABLE 
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium: lnx_io.c /main/8 1996/10/19 18:06:28 kaleb $ */
-
-#define NEED_EVENTS
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-#define KBC_TIMEOUT 250        /* Timeout in ms for sending to keyboard controller */
-
-_X_EXPORT void
-xf86SoundKbdBell(int loudness, int pitch, int duration)
-{
-	if (loudness && pitch)
-	{
-		ioctl(xf86Info.consoleFd, KDMKTONE,
-		      ((1193190 / pitch) & 0xffff) |
-		      (((unsigned long)duration *
-			loudness / 50) << 16));
-	}
-}
-
-void
-xf86SetKbdLeds(int leds)
-{
- 	ioctl(xf86Info.consoleFd, KDSETLED, leds);
-}
-
-int
-xf86GetKbdLeds()
-{
-	int leds = 0;
-
- 	ioctl(xf86Info.consoleFd, KDGETLED, &leds);
-	return(leds);
-}
-
-static int
-KDKBDREP_ioctl_ok(int rate, int delay) {
-#if defined(KDKBDREP) && !defined(__sparc__)
-     /* This ioctl is defined in <linux/kd.h> but is not
-	implemented anywhere - must be in some m68k patches. */
-   struct kbd_repeat kbdrep_s;
-
-   /* don't change, just test */
-   kbdrep_s.LNX_KBD_PERIOD_NAME = -1;
-   kbdrep_s.delay = -1;
-   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
-       return 0;
-   }
-   /* do the change */
-   if (rate == 0)				/* switch repeat off */
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 0;
-   else
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 10000 / rate; /* convert cps to msec */
-   if (kbdrep_s.LNX_KBD_PERIOD_NAME < 1)
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 1;
-   kbdrep_s.delay = delay;
-   if (kbdrep_s.delay < 1)
-     kbdrep_s.delay = 1;
-   
-   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
-     return 0;
-   }
-
-   return 1;			/* success! */
-#else /* no KDKBDREP */
-   return 0;
-#endif /* KDKBDREP */
-}
-
-static int
-KIOCSRATE_ioctl_ok(int rate, int delay) {
-#ifdef KIOCSRATE
-   struct kbd_rate kbdrate_s;
-   int fd;
-
-   fd = open("/dev/kbd", O_RDONLY);
-   if (fd == -1) 
-     return 0;   
-
-   kbdrate_s.rate = (rate + 5) / 10;  /* must be integer, so round up */
-   kbdrate_s.delay = delay * HZ / 1000;  /* convert ms to Hz */
-   if (kbdrate_s.rate > 50)
-     kbdrate_s.rate = 50;
-
-   if (ioctl( fd, KIOCSRATE, &kbdrate_s )) {
-       return 0;
-   }
-
-   close( fd );
-
-   return 1;
-#else /* no KIOCSRATE */
-   return 0;
-#endif /* KIOCSRATE */
-}
-
-void xf86SetKbdRepeat(char rad)
-{
-#ifdef __sparc__
-  int         rate  = 500;     /* Default rate */
-  int         delay = 200;     /* Default delay */
-#else
-  int         rate  = 300;     /* Default rate */
-  int         delay = 250;     /* Default delay */
-#endif
-
-#if defined(__alpha__) || defined (__i386__) || defined(__ia64__)
-  int i;
-  int timeout;
-  int         value = 0x7f;    /* Maximum delay with slowest rate */
-
-  static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
-			       133, 120, 109, 100, 92, 86, 80, 75, 67,
-			       60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
-			       25, 23, 21, 20 };
-#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
-
-  static int valid_delays[] = { 250, 500, 750, 1000 };
-#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
-#endif
-
-  if (xf86Info.kbdRate >= 0) 
-    rate = xf86Info.kbdRate * 10;
-  if (xf86Info.kbdDelay >= 0)
-    delay = xf86Info.kbdDelay;
-
-  if(KDKBDREP_ioctl_ok(rate, delay)) 	/* m68k? */
-    return;
-
-  if(KIOCSRATE_ioctl_ok(rate, delay))	/* sparc? */
-    return;
-
-  if (xf86IsPc98())
-    return;
-
-#if defined(__alpha__) || defined (__i386__) || defined(__ia64__)
-
-  /* The ioport way */
-
-  for (i = 0; i < RATE_COUNT; i++)
-    if (rate >= valid_rates[i]) {
-      value &= 0x60;
-      value |= i;
-      break;
-    }
-
-  for (i = 0; i < DELAY_COUNT; i++)
-    if (delay <= valid_delays[i]) {
-      value &= 0x1f;
-      value |= i << 5;
-      break;
-    }
-
-  timeout = KBC_TIMEOUT;
-  while (((inb(0x64) & 2) == 2) && --timeout)
-       usleep(1000); /* wait */
-
-  if (timeout == 0)
-      return;
-
-  outb(0x60, 0xf3);             /* set typematic rate */
-  while (((inb(0x64) & 2) == 2) && --timeout)
-       usleep(1000); /* wait */
-
-  usleep(10000);
-  outb(0x60, value);
-
-#endif /* __alpha__ || __i386__ || __ia64__ */
-}
-
-static int kbdtrans;
-static struct termios kbdtty;
-
-void
-xf86KbdInit()
-{
-	ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans);
-	tcgetattr (xf86Info.consoleFd, &kbdtty);
-}
-
-int
-xf86KbdOn()
-{
-	struct termios nTty;
-
-#ifdef __powerpc__
-	if (xf86Info.kbdCustomKeycodes)
-		ioctl(xf86Info.consoleFd, KDSKBMODE, K_MEDIUMRAW);
-	else
-#endif
-	ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW);
-
-	nTty = kbdtty;
-	nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-	nTty.c_oflag = 0;
-	nTty.c_cflag = CREAD | CS8;
-	nTty.c_lflag = 0;
-	nTty.c_cc[VTIME]=0;
-	nTty.c_cc[VMIN]=1;
-	cfsetispeed(&nTty, 9600);
-	cfsetospeed(&nTty, 9600);
-	tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
-	return(xf86Info.consoleFd);
-}
-
-int
-xf86KbdOff()
-{
-	ioctl(xf86Info.consoleFd, KDSKBMODE, kbdtrans);
-	tcsetattr(xf86Info.consoleFd, TCSANOW, &kbdtty);
-	return(xf86Info.consoleFd);
-}
-
diff --git a/hw/xfree86/os-support/linux/lnx_kbd.c b/hw/xfree86/os-support/linux/lnx_kbd.c
new file mode 100644
index 0000000..a4890d2
--- /dev/null
+++ b/hw/xfree86/os-support/linux/lnx_kbd.c
@@ -0,0 +1,530 @@
+
+/*
+ * Copyright (c) 2002 by The XFree86 Project, Inc.
+ * Author: Ivan Pascal.
+ *
+ * Based on the code from lnx_io.c which is
+ * Copyright 1992 by Orest Zborowski <obz at Kodak.com>
+ * Copyright 1993 by David Dawes <dawes at xfree86.org>
+ */
+
+#define NEED_EVENTS
+#ifdef HAVE_XORG_CONFIG_H
+#include <xorg-config.h>
+#endif
+
+#include <X11/X.h>
+
+#include "compiler.h"
+
+#include "xf86.h"
+#include "xf86Priv.h"
+#include "xf86_OSlib.h"
+
+#include "xf86Xinput.h"
+#include "xf86OSKbd.h"
+#include "atKeynames.h"
+#if defined(DO_OS_FONTRESTORE)
+#include "lnx.h"
+#endif
+#include "lnx_kbd.h"
+
+#define KBC_TIMEOUT 250        /* Timeout in ms for sending to keyboard controller */
+
+static KbdProtocolRec protocols[] = {
+   {"standard", PROT_STD },
+   { NULL, PROT_UNKNOWN_KBD }
+};
+
+extern Bool VTSwitchEnabled;
+#ifdef USE_VT_SYSREQ
+extern Bool VTSysreqToggle;
+#endif
+
+static void
+SoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
+{
+	if (loudness && pitch)
+	{
+		ioctl(pInfo->fd, KDMKTONE,
+		      ((1193190 / pitch) & 0xffff) |
+		      (((unsigned long)duration *
+			loudness / 50) << 16));
+	}
+}
+
+static void
+SetKbdLeds(InputInfoPtr pInfo, int leds)
+{
+    int real_leds = 0;
+
+#if defined (__sparc__)
+    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+    if (pKbd->sunKbd) {
+  	if (leds & 0x08) real_leds |= XLED1;
+  	if (leds & 0x04) real_leds |= XLED3;
+  	if (leds & 0x02) real_leds |= XLED4;
+  	if (leds & 0x01) real_leds |= XLED2;
+        leds = real_leds;
+        real_leds = 0;
+    }
+#endif /* defined (__sparc__) */
+#ifdef LED_CAP
+    if (leds & XLED1)  real_leds |= LED_CAP;
+    if (leds & XLED2)  real_leds |= LED_NUM;
+    if (leds & XLED3)  real_leds |= LED_SCR;
+#ifdef LED_COMP
+    if (leds & XLED4)  real_leds |= LED_COMP;
+#else
+    if (leds & XLED4)  real_leds |= LED_SCR;
+#endif
+#endif
+    ioctl(pInfo->fd, KDSETLED, real_leds);
+}
+
+static int
+GetKbdLeds(InputInfoPtr pInfo)
+{
+    int real_leds, leds = 0;
+
+    ioctl(pInfo->fd, KDGETLED, &real_leds);
+
+    if (real_leds & LED_CAP) leds |= XLED1;
+    if (real_leds & LED_NUM) leds |= XLED2;
+    if (real_leds & LED_SCR) leds |= XLED3;
+
+    return(leds);
+}
+
+static int
+KDKBDREP_ioctl_ok(int rate, int delay) {
+#if defined(KDKBDREP) && !defined(__sparc__)
+     /* This ioctl is defined in <linux/kd.h> but is not
+	implemented anywhere - must be in some m68k patches. */
+   struct kbd_repeat kbdrep_s;
+
+   /* don't change, just test */
+   kbdrep_s.LNX_KBD_PERIOD_NAME = -1;
+   kbdrep_s.delay = -1;
+   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
+       return 0;
+   }
+
+   /* do the change */
+   if (rate == 0)				/* switch repeat off */
+     kbdrep_s.LNX_KBD_PERIOD_NAME = 0;
+   else
+     kbdrep_s.LNX_KBD_PERIOD_NAME = 10000 / rate; /* convert cps to msec */
+   if (kbdrep_s.LNX_KBD_PERIOD_NAME < 1)
+     kbdrep_s.LNX_KBD_PERIOD_NAME = 1;
+   kbdrep_s.delay = delay;
+   if (kbdrep_s.delay < 1)
+     kbdrep_s.delay = 1;
+   
+   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
+       return 0;
+   }
+
+   return 1;			/* success! */
+#else /* no KDKBDREP */
+   return 0;
+#endif /* KDKBDREP */
+}
+
+static int
+KIOCSRATE_ioctl_ok(int rate, int delay) {
+#ifdef KIOCSRATE
+   struct kbd_rate kbdrate_s;
+   int fd;
+
+   fd = open("/dev/kbd", O_RDONLY);
+   if (fd == -1) 
+     return 0;   
+
+   kbdrate_s.rate = (rate + 5) / 10;  /* must be integer, so round up */
+   kbdrate_s.delay = delay * HZ / 1000;  /* convert ms to Hz */
+   if (kbdrate_s.rate > 50)
+     kbdrate_s.rate = 50;
+
+   if (ioctl( fd, KIOCSRATE, &kbdrate_s )) {
+       return 0;
+   }
+
+   close( fd );
+
+   return 1;
+#else /* no KIOCSRATE */
+   return 0;
+#endif /* KIOCSRATE */
+}
+
+#undef rate
+
+static void
+SetKbdRepeat(InputInfoPtr pInfo, char rad)
+{
+  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+  int i;
+  int timeout;
+  int         value = 0x7f;    /* Maximum delay with slowest rate */
+
+#ifdef __sparc__
+  int         rate  = 500;     /* Default rate */
+  int         delay = 200;     /* Default delay */
+#else
+  int         rate  = 300;     /* Default rate */
+  int         delay = 250;     /* Default delay */
+#endif
+
+  static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
+			       133, 120, 109, 100, 92, 86, 80, 75, 67,
+			       60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
+			       25, 23, 21, 20 };
+#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
+
+  static int valid_delays[] = { 250, 500, 750, 1000 };
+#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
+
+  if (pKbd->rate >= 0) 
+    rate = pKbd->rate * 10;
+  if (pKbd->delay >= 0)
+    delay = pKbd->delay;
+
+  if(KDKBDREP_ioctl_ok(rate, delay)) 	/* m68k? */
+    return;
+
+  if(KIOCSRATE_ioctl_ok(rate, delay))	/* sparc? */
+    return;
+
+  if (xf86IsPc98())
+    return;
+
+#if defined(__alpha__) || defined (__i386__) || defined(__ia64__)
+
+  if (!xorgHWAccess) {
+      if (xf86EnableIO())
+	  xorgHWAccess = TRUE;
+      else 
+	  return;
+  }
+      
+  /* The ioport way */
+
+  for (i = 0; i < RATE_COUNT; i++)
+    if (rate >= valid_rates[i]) {
+      value &= 0x60;
+      value |= i;
+      break;
+    }
+
+  for (i = 0; i < DELAY_COUNT; i++)
+    if (delay <= valid_delays[i]) {
+      value &= 0x1f;
+      value |= i << 5;
+      break;
+    }
+
+  timeout = KBC_TIMEOUT;
+  while (((inb(0x64) & 2) == 2) && --timeout)
+       usleep(1000); /* wait */
+
+  if (timeout == 0)
+      return;
+
+  outb(0x60, 0xf3);             /* set typematic rate */
+  while (((inb(0x64) & 2) == 2) && --timeout)
+       usleep(1000); /* wait */
+
+  usleep(10000);
+  outb(0x60, value);
+
+#endif /* __alpha__ || __i386__ || __ia64__ */
+}
+
+typedef struct {
+   int kbdtrans;
+   struct termios kbdtty;
+} LnxKbdPrivRec, *LnxKbdPrivPtr;
+
+static int
+KbdInit(InputInfoPtr pInfo, int what)
+{
+    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+    LnxKbdPrivPtr priv = (LnxKbdPrivPtr) pKbd->private;
+
+    if (pKbd->isConsole) {
+        ioctl (pInfo->fd, KDGKBMODE, &(priv->kbdtrans));
+        tcgetattr (pInfo->fd, &(priv->kbdtty));
+    }
+    if (!pKbd->CustomKeycodes) {
+        pKbd->RemapScanCode = ATScancode;
+    }
+
+    return Success;
+}
+
+static int
+KbdOn(InputInfoPtr pInfo, int what)
+{
+    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+    LnxKbdPrivPtr priv = (LnxKbdPrivPtr) pKbd->private;
+    struct termios nTty;
+
+    if (pKbd->isConsole) {
+	if (pKbd->CustomKeycodes)
+	    ioctl(pInfo->fd, KDSKBMODE, K_MEDIUMRAW);
+	else
+	    ioctl(pInfo->fd, KDSKBMODE, K_RAW);
+
+	nTty = priv->kbdtty;
+	nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
+	nTty.c_oflag = 0;
+	nTty.c_cflag = CREAD | CS8;
+	nTty.c_lflag = 0;
+	nTty.c_cc[VTIME]=0;
+	nTty.c_cc[VMIN]=1;
+	cfsetispeed(&nTty, 9600);
+	cfsetospeed(&nTty, 9600);
+	tcsetattr(pInfo->fd, TCSANOW, &nTty);
+    }
+    return Success;
+}
+
+static int
+KbdOff(InputInfoPtr pInfo, int what)
+{
+    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+    LnxKbdPrivPtr priv = (LnxKbdPrivPtr) pKbd->private;
+
+    if (pKbd->isConsole) {
+	ioctl(pInfo->fd, KDSKBMODE, priv->kbdtrans);
+	tcsetattr(pInfo->fd, TCSANOW, &(priv->kbdtty));
+    }
+    return Success;
+}
+
+static int
+GetSpecialKey(InputInfoPtr pInfo, int scanCode)
+{
+  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+  int specialkey = scanCode;
+
+#if defined (__sparc__)
+  if (pKbd->sunKbd) {
+      switch (scanCode) {
+          case 0x2b: specialkey = KEY_BackSpace; break;
+          case 0x47: specialkey = KEY_KP_Minus; break;
+          case 0x7d: specialkey = KEY_KP_Plus; break;
+          /* XXX needs cases for KEY_KP_Divide and KEY_KP_Multiply */
+          case 0x05: specialkey = KEY_F1; break;
+          case 0x06: specialkey = KEY_F2; break;
+          case 0x08: specialkey = KEY_F3; break;
+          case 0x0a: specialkey = KEY_F4; break;
+          case 0x0c: specialkey = KEY_F5; break;
+          case 0x0e: specialkey = KEY_F6; break;
+          case 0x10: specialkey = KEY_F7; break;
+          case 0x11: specialkey = KEY_F8; break;
+          case 0x12: specialkey = KEY_F9; break;
+          case 0x07: specialkey = KEY_F10; break;
+          case 0x09: specialkey = KEY_F11; break;
+          case 0x0b: specialkey = KEY_F12; break;
+          default: specialkey = 0; break;
+      }
+      return specialkey;
+  }
+#endif
+
+  if (pKbd->CustomKeycodes) {
+      specialkey = pKbd->specialMap->map[scanCode];
+  }
+  return specialkey;
+}
+
+#define ModifierSet(k) ((modifiers & (k)) == (k))
+
+static
+Bool SpecialKey(InputInfoPtr pInfo, int key, Bool down, int modifiers)
+{
+  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+
+  if(!pKbd->vtSwitchSupported)
+      return FALSE;
+
+  if ((ModifierSet(ControlMask | AltMask)) ||
+      (ModifierSet(ControlMask | AltLangMask))) {
+      if (VTSwitchEnabled && !xf86Info.vtSysreq && !xf86Info.dontVTSwitch) {
+          switch (key) {
+             case KEY_F1:
+             case KEY_F2:
+             case KEY_F3:
+             case KEY_F4:
+             case KEY_F5:
+             case KEY_F6:
+             case KEY_F7:
+             case KEY_F8:
+             case KEY_F9:
+             case KEY_F10:
+                  if (down) {
+                    ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F1 + 1);
+                    return TRUE;
+                  }
+             case KEY_F11:
+             case KEY_F12:
+                  if (down) {
+                    ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F11 + 11);
+                    return TRUE;
+                  }
+         }
+      }
+  }
+#ifdef USE_VT_SYSREQ
+    if (VTSwitchEnabled && xf86Info.vtSysreq && !xf86Info.dontVTSwitch) {
+        switch (key) {
+            case KEY_F1:
+            case KEY_F2:
+            case KEY_F3:
+            case KEY_F4:
+            case KEY_F5:
+            case KEY_F6:
+            case KEY_F7:
+            case KEY_F8:
+            case KEY_F9:
+            case KEY_F10:
+                 if (VTSysreqToggle && down) {
+                     ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F1 + 1);
+                     VTSysreqToggle = FALSE;
+                     return TRUE;
+                 }
+                 break;
+            case KEY_F11:
+            case KEY_F12:
+                 if (VTSysreqToggle && down) {
+                     ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F11 + 11);
+                     VTSysreqToggle = FALSE;
+                     return TRUE;
+                 }
+                 break;
+            /* Ignore these keys -- ie don't let them cancel an alt-sysreq */
+            case KEY_Alt:
+            case KEY_AltLang:
+                 break;
+            case KEY_SysReqest:
+                 if ((ModifierSet(AltMask) || ModifierSet(AltLangMask)) && down)
+                     VTSysreqToggle = TRUE;
+                 break;
+             default:
+                 /*
+                  * We only land here when Alt-SysReq is followed by a
+                  * non-switching key.
+                  */
+                 if (VTSysreqToggle)
+                     VTSysreqToggle = FALSE;
+        }
+    }
+#endif /* USE_VT_SYSREQ */
+    return FALSE;
+} 
+
+static void
+stdReadInput(InputInfoPtr pInfo)
+{
+    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+    unsigned char rBuf[64];
+    int nBytes, i;
+    if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(rBuf))) > 0) {
+       for (i = 0; i < nBytes; i++)
+           pKbd->PostEvent(pInfo, rBuf[i] & 0x7f,
+                           rBuf[i] & 0x80 ? FALSE : TRUE);
+       }
+}
+
+static Bool
+OpenKeyboard(InputInfoPtr pInfo)
+{
+    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
+    int i;
+    KbdProtocolId prot = PROT_UNKNOWN_KBD;
+    char *s;
+
+    s = xf86SetStrOption(pInfo->options, "Protocol", NULL);
+    for (i = 0; protocols[i].name; i++) {
+        if (xf86NameCmp(s, protocols[i].name) == 0) {
+           prot = protocols[i].id;
+           break;
+        }
+    }
+
+    switch (prot) {
+        case PROT_STD:
+           pInfo->read_input = stdReadInput;
+           break;
+        default:
+           xf86Msg(X_ERROR,"\"%s\" is not a valid keyboard protocol name\n", s);
+           xfree(s);
+           return FALSE;
+    }
+
+    xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, s);
+    xfree(s);
+
+    s = xf86SetStrOption(pInfo->options, "Device", NULL);
+    if (s == NULL) {
+       pInfo->fd = xf86Info.consoleFd;
+       pKbd->isConsole = TRUE;
+    } else {
+       pInfo->fd = open(s, O_RDONLY | O_NONBLOCK | O_EXCL);
+       if (pInfo->fd == -1) {
+           xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", pInfo->name, s);
+           xfree(s);
+           return FALSE;
+       }
+       pKbd->isConsole = FALSE;
+       xfree(s);
+    }
+
+    if (pKbd->isConsole)
+         pKbd->vtSwitchSupported = TRUE;
+
+    return TRUE;
+}
+
+_X_EXPORT Bool
+xf86OSKbdPreInit(InputInfoPtr pInfo)
+{
+    KbdDevPtr pKbd = pInfo->private;
+
+    pKbd->KbdInit       = KbdInit;
+    pKbd->KbdOn         = KbdOn;
+    pKbd->KbdOff        = KbdOff;
+    pKbd->Bell          = SoundBell;
+    pKbd->SetLeds       = SetKbdLeds;
+    pKbd->GetLeds       = GetKbdLeds;
+    pKbd->SetKbdRepeat  = SetKbdRepeat;
+    pKbd->KbdGetMapping = KbdGetMapping;
+    pKbd->SpecialKey    = SpecialKey;
+
+    pKbd->RemapScanCode = NULL;
+    pKbd->GetSpecialKey = GetSpecialKey;
+
+    pKbd->OpenKeyboard = OpenKeyboard;
+    pKbd->vtSwitchSupported = FALSE;
+
+    pKbd->private = xcalloc(sizeof(LnxKbdPrivRec), 1);
+    if (pKbd->private == NULL) {
+       xf86Msg(X_ERROR,"can't allocate keyboard OS private data\n");
+       return FALSE;
+    }
+
+#if defined(__powerpc__)
+  {
+    FILE *f;
+    f = fopen("/proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes","r");
+    if (f) {
+        if (fgetc(f) == '0')
+            pKbd->CustomKeycodes = TRUE;
+        fclose(f);
+    }
+  }
+#endif
+    return TRUE;
+}
diff-tree 81913a12910e39d7ea6af8657c1c66cc6791cd65 (from 7465010d59ec435bd00b738f0cef766b352dc7eb)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 21 19:10:26 2006 -0400

    remove undead files from master
    Remove dead files which worked their way back in when merging from master.
    Ugh.

diff --git a/hw/xfree86/common/xf86Io.c b/hw/xfree86/common/xf86Io.c
deleted file mode 100644
index 86ac745..0000000
--- a/hw/xfree86/common/xf86Io.c
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Copyright (c) 1992-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/* $XConsortium: xf86Io.c /main/27 1996/10/19 17:58:55 kaleb $ */
-
-#define NEED_EVENTS
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#define XF86_OS_PRIVS
-#include "xf86_OSlib.h"
-#include "mipointer.h"
-
-#ifdef XINPUT
-#include "xf86Xinput.h"
-#include <X11/extensions/XIproto.h>
-#include "exevents.h"
-#endif
-
-#ifdef XKB
-#include <X11/extensions/XKB.h>
-#include <X11/extensions/XKBstr.h>
-#include <X11/extensions/XKBsrv.h>
-#endif
-
-unsigned int xf86InitialCaps = 0;
-unsigned int xf86InitialNum = 0;
-unsigned int xf86InitialScroll = 0;
-
-#include "atKeynames.h"
-
-/*
- * xf86KbdBell --
- *	Ring the terminal/keyboard bell for an amount of time proportional to
- *      "loudness".
- */
-
-void
-xf86KbdBell(percent, pKeyboard, ctrl, unused)
-     int           percent;          /* Percentage of full volume */
-     DeviceIntPtr  pKeyboard;        /* Keyboard to ring */
-     pointer	   ctrl;	
-     int	   unused;	
-{
-  xf86SoundKbdBell(percent, xf86Info.bell_pitch, xf86Info.bell_duration);
-}
-
-void
-xf86UpdateKbdLeds()
-{
-  int leds = 0;
-  if (xf86Info.capsLock) leds |= XLED1;
-  if (xf86Info.numLock)  leds |= XLED2;
-  if (xf86Info.scrollLock || xf86Info.modeSwitchLock) leds |= XLED3;
-  if (xf86Info.composeLock) leds |= XLED4;
-  xf86Info.leds = (xf86Info.leds & xf86Info.xleds) | (leds & ~xf86Info.xleds);
-  xf86KbdLeds();
-}
-
-void
-xf86KbdLeds ()
-{
-  int leds, real_leds = 0;
-
-#if defined (__sparc__) && defined(__linux__)
-  static int kbdSun = -1;
-  if (kbdSun == -1) {
-  if ((xf86Info.xkbmodel && !strcmp(xf86Info.xkbmodel, "sun")) ||
-      (xf86Info.xkbrules && !strcmp(xf86Info.xkbrules, "sun")))
-      kbdSun = 1;
-  else
-      kbdSun = 0;
-  }
-  if (kbdSun) {
-     if (xf86Info.leds & 0x08) real_leds |= XLED1;
-     if (xf86Info.leds & 0x04) real_leds |= XLED3;
-     if (xf86Info.leds & 0x02) real_leds |= XLED4;
-     if (xf86Info.leds & 0x01) real_leds |= XLED2;
-     leds = real_leds;
-     real_leds = 0;
-  } else {
-     leds = xf86Info.leds;
-  }
-#else
-  leds = xf86Info.leds;
-#endif /* defined (__sparc__) */
-
-#ifdef LED_CAP
-  if (leds & XLED1)  real_leds |= LED_CAP;
-  if (leds & XLED2)  real_leds |= LED_NUM;
-  if (leds & XLED3)  real_leds |= LED_SCR;
-#ifdef LED_COMP
-  if (leds & XLED4)  real_leds |= LED_COMP;
-#else
-  if (leds & XLED4)  real_leds |= LED_SCR;
-#endif
-#endif
-#ifdef sun
-  /* Pass through any additional LEDs, such as Kana LED on Sun Japanese kbd */
-  real_leds |= (leds & 0xFFFFFFF0);
-#endif
-  xf86SetKbdLeds(real_leds);
-  (void)leds;
-}
-
-/*
- * xf86KbdCtrl --
- *      Alter some of the keyboard control parameters. All special protocol
- *      values are handled by dix (ProgChangeKeyboardControl)
- */
-
-void
-xf86KbdCtrl (pKeyboard, ctrl)
-     DevicePtr     pKeyboard;        /* Keyboard to alter */
-     KeybdCtrl     *ctrl;
-{
-  int leds;
-  xf86Info.bell_pitch    = ctrl->bell_pitch;
-  xf86Info.bell_duration = ctrl->bell_duration;
-  xf86Info.autoRepeat    = ctrl->autoRepeat;
-
-  xf86Info.composeLock   = (ctrl->leds & XCOMP) ? TRUE : FALSE;
-
-  leds = (ctrl->leds & ~(XCAPS | XNUM | XSCR));
-#ifdef XKB
-  if (noXkbExtension) {
-#endif
-      xf86Info.leds = (leds & xf86Info.xleds)|(xf86Info.leds & ~xf86Info.xleds);
-#ifdef XKB
-  } else {
-      xf86Info.leds = leds;
-  }
-#endif
-
-  xf86KbdLeds();
-}
-
-/*
- * xf86InitKBD --
- *      Reinitialize the keyboard. Only set Lockkeys according to ours leds.
- *      Depress all other keys.
- */
-
-void
-xf86InitKBD(init)
-Bool init;
-{
-  char            leds = 0, rad;
-  unsigned int    i;
-  xEvent          kevent;
-  DeviceIntPtr    pKeyboard = xf86Info.pKeyboard;
-  KeyClassRec     *keyc = xf86Info.pKeyboard->key;
-  KeySym          *map = keyc->curKeySyms.map;
-
-  kevent.u.keyButtonPointer.time = GetTimeInMillis();
-  kevent.u.keyButtonPointer.rootX = 0;
-  kevent.u.keyButtonPointer.rootY = 0;
-
-  /*
-   * Hmm... here is the biggest hack of every time !
-   * It may be possible that a switch-vt procedure has finished BEFORE
-   * you released all keys neccessary to do this. That peculiar behavior
-   * can fool the X-server pretty much, cause it assumes that some keys
-   * were not released. TWM may stuck alsmost completly....
-   * OK, what we are doing here is after returning from the vt-switch
-   * exeplicitely unrelease all keyboard keys before the input-devices
-   * are reenabled.
-   */
-  for (i = keyc->curKeySyms.minKeyCode, map = keyc->curKeySyms.map;
-       i < keyc->curKeySyms.maxKeyCode;
-       i++, map += keyc->curKeySyms.mapWidth)
-    if (KeyPressed(i))
-      {
-        switch (*map) {
-	/* Don't release the lock keys */
-        case XK_Caps_Lock:
-        case XK_Shift_Lock:
-        case XK_Num_Lock:
-        case XK_Scroll_Lock:
-        case XK_Kana_Lock:
-	  break;
-        default:
-	  kevent.u.u.detail = i;
-	  kevent.u.u.type = KeyRelease;
-	  (* pKeyboard->public.processInputProc)(&kevent, pKeyboard, 1);
-        }
-      }
-  
-  xf86Info.scanPrefix      = 0;
-
-  if (init)
-    {
-      /*
-       * we must deal here with the fact, that on some cases the numlock or
-       * capslock key are enabled BEFORE the server is started up. So look
-       * here at the state on the according LEDS to determine whether a
-       * lock-key is already set.
-       */
-
-      xf86Info.capsLock        = FALSE;
-      xf86Info.numLock         = FALSE;
-      xf86Info.scrollLock      = FALSE;
-      xf86Info.modeSwitchLock  = FALSE;
-      xf86Info.composeLock     = FALSE;
-    
-#ifdef LED_CAP
-#ifdef INHERIT_LOCK_STATE
-      leds = xf86Info.leds;
-
-      for (i = keyc->curKeySyms.minKeyCode, map = keyc->curKeySyms.map;
-           i < keyc->curKeySyms.maxKeyCode;
-           i++, map += keyc->curKeySyms.mapWidth)
-
-        switch(*map) {
-
-        case XK_Caps_Lock:
-        case XK_Shift_Lock:
-          if (leds & LED_CAP) 
-	    {
-	      xf86InitialCaps = i;
-	      xf86Info.capsLock = TRUE;
-	    }
-          break;
-
-        case XK_Num_Lock:
-          if (leds & LED_NUM)
-	    {
-	      xf86InitialNum = i;
-	      xf86Info.numLock = TRUE;
-	    }
-          break;
-
-        case XK_Scroll_Lock:
-        case XK_Kana_Lock:
-          if (leds & LED_SCR)
-	    {
-	      xf86InitialScroll = i;
-	      xf86Info.scrollLock = TRUE;
-	    }
-          break;
-        }
-#endif /* INHERIT_LOCK_STATE */
-      xf86SetKbdLeds(leds);
-#endif /* LED_CAP */
-      (void)leds;
-
-      if      (xf86Info.kbdDelay <= 375) rad = 0x00;
-      else if (xf86Info.kbdDelay <= 625) rad = 0x20;
-      else if (xf86Info.kbdDelay <= 875) rad = 0x40;
-      else                               rad = 0x60;
-    
-      if      (xf86Info.kbdRate <=  2)   rad |= 0x1F;
-      else if (xf86Info.kbdRate >= 30)   rad |= 0x00;
-      else                               rad |= ((58 / xf86Info.kbdRate) - 2);
-    
-      xf86SetKbdRepeat(rad);
-    }
-}
-
-/*
- * xf86KbdProc --
- *	Handle the initialization, etc. of a keyboard.
- */
-
-int
-xf86KbdProc (pKeyboard, what)
-     DeviceIntPtr pKeyboard;	/* Keyboard to manipulate */
-     int       what;	    	/* What to do to it */
-{
-  KeySymsRec           keySyms;
-  CARD8                modMap[MAP_LENGTH];
-  int                  kbdFd;
-
-  switch (what) {
-
-  case DEVICE_INIT:
-    /*
-     * First open and find the current state of the keyboard.
-     */
-
-    xf86KbdInit();
-
-    xf86KbdGetMapping(&keySyms, modMap);
-    
-
-#ifndef XKB
-    defaultKeyboardControl.leds = xf86GetKbdLeds();
-#else
-    defaultKeyboardControl.leds = 0;
-#endif
-
-    /*
-     * Perform final initialization of the system private keyboard
-     * structure and fill in various slots in the device record
-     * itself which couldn't be filled in before.
-     */
-
-    pKeyboard->public.on = FALSE;
-
-#ifdef XKB
-    if (noXkbExtension) {
-#endif
-    InitKeyboardDeviceStruct((DevicePtr)xf86Info.pKeyboard,
-			     &keySyms,
-			     modMap,
-			     xf86KbdBell,
-			     (KbdCtrlProcPtr)xf86KbdCtrl);
-#ifdef XKB
-    } else {
- 	XkbComponentNamesRec	names;
-	XkbDescPtr		desc;
-	Bool			foundTerminate = FALSE;
-	int			keyc;
-	if (xf86Info.xkbkeymap) {
-	    names.keymap = xf86Info.xkbkeymap;
-	    names.keycodes = NULL;
-	    names.types = NULL;
-	    names.compat = NULL;
-	    names.symbols = NULL;
-	    names.geometry = NULL;
-	} else {
-	    names.keymap = NULL;
-	    names.keycodes = xf86Info.xkbkeycodes;
-	    names.types = xf86Info.xkbtypes;
-	    names.compat = xf86Info.xkbcompat;
-	    names.symbols = xf86Info.xkbsymbols;
-	    names.geometry = xf86Info.xkbgeometry;
-	}
-	if ((xf86Info.xkbkeymap || xf86Info.xkbcomponents_specified)
-	   && (xf86Info.xkbmodel == NULL || xf86Info.xkblayout == NULL)) {
-		xf86Info.xkbrules = NULL;
-	}
-	XkbSetRulesDflts(xf86Info.xkbrules, xf86Info.xkbmodel,
-			 xf86Info.xkblayout, xf86Info.xkbvariant,
-			 xf86Info.xkboptions);
-	
-	XkbInitKeyboardDeviceStruct(pKeyboard, 
-				    &names,
-				    &keySyms, 
-				    modMap, 
-				    xf86KbdBell,
-				    (KbdCtrlProcPtr)xf86KbdCtrl);
-
-	/* Search keymap for Terminate action */
-	desc  = pKeyboard->key->xkbInfo->desc;
-	for (keyc = desc->min_key_code; keyc <= desc->max_key_code; keyc++) {
-	    int i;
-	    for (i = 1; i <= XkbKeyNumActions(desc, keyc); i++) {
-		if (XkbKeyAction(desc, keyc, i)
-		  && XkbKeyAction(desc, keyc, i)->type == XkbSA_Terminate) {
-		    foundTerminate = TRUE;
-		    goto searchdone;
-		}
-	    }
-  	}
-searchdone:
-	xf86Info.ActionKeyBindingsSet = foundTerminate;
-	if (!foundTerminate)
-	    xf86Msg(X_INFO, "Server_Terminate keybinding not found\n");
-    }
-#endif
-    
-    xf86InitKBD(TRUE);
-    break;
-    
-  case DEVICE_ON:
-    /*
-     * Set the keyboard into "direct" mode and turn on
-     * event translation.
-     */
-
-    kbdFd = xf86KbdOn();
-    /*
-     * Discard any pending input after a VT switch to prevent the server
-     * passing on parts of the VT switch sequence.
-     */
-    sleep(1);
-#if defined(WSCONS_SUPPORT)
-    if (xf86Info.consType != WSCONS) {
-#endif
-	if (kbdFd != -1) {
-		char buf[16];
-		read(kbdFd, buf, 16);
-    	}
-#if defined(WSCONS_SUPPORT)
-    }
-#endif
-
-#if !defined(__UNIXOS2__) /* Under EMX, keyboard cannot be select()'ed */
-    if (kbdFd != -1)
-      AddEnabledDevice(kbdFd);
-#endif  /* __UNIXOS2__ */
-
-    pKeyboard->public.on = TRUE;
-    xf86InitKBD(FALSE);
-    break;
-    
-  case DEVICE_CLOSE:
-  case DEVICE_OFF:
-    /*
-     * Restore original keyboard directness and translation.
-     */
-
-    kbdFd = xf86KbdOff();
-
-    if (kbdFd != -1)
-      RemoveEnabledDevice(kbdFd);
-
-    pKeyboard->public.on = FALSE;
-    break;
-
-  }
-  return (Success);
-}
diff --git a/hw/xfree86/common/xf86Kbd.c b/hw/xfree86/common/xf86Kbd.c
deleted file mode 100644
index a86581c..0000000
--- a/hw/xfree86/common/xf86Kbd.c
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Copyright (c) 1992-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/* $XConsortium: xf86Kbd.c /main/10 1996/02/21 17:38:32 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#ifdef __UNIXOS2__
-#define I_NEED_OS2_H
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "atKeynames.h"
-#include "xf86Config.h"
-
-#include "xf86Keymap.h"
-
-#if defined(KDGKBTYPE) && \
-	!defined(Lynx) && \
-	!defined(__UNIXOS2__) && !defined(__mips__) && \
-	!defined(__arm32__) && !defined(__GNU__) && !defined(__QNX__)
-#define HAS_GETKBTYPE
-#endif
-#if defined(GIO_KEYMAP) && \
-	!defined(Lynx) && \
-	!defined(__UNIXOS2__) && !defined(__mips__) && \
-	!defined(__arm32__) && !defined(__GNU__) && !defined(DGUX) && \
-	!defined(__QNX__)
-#define HAS_GETKEYMAP
-
-#define KD_GET_ENTRY(i,n) \
-  eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + keymap.key[i].map[n]]
-
-/*
- * NOTE: Not all possible remappable symbols are remapped. There are two main
- *       reasons:
- *                 a) The mapping between scancode and SYSV/386 - symboltable
- *                    is inconsistent between different versions and has some
- *                    BIG mistakes.
- *                 b) In X-Windows there is a difference between numpad-keys
- *                    and normal keys. SYSV/386 uses for both kinds of keys
- *                    the same symbol.
- *
- *       Thus only the alpha keypad and the function keys are translated.
- *       Also CapsLock, NumLock, ScrollLock, Shift, Control & Alt.
- */
-
-static unsigned char remap[128] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-static KeySym eascii_to_x[512] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
-	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
-	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
-	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
-	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
-	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
-	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
-	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
-	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
-	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
-	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
-	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
-	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
-	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
-	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
-	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
-	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
-	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
-	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
-
-	/* 
-	 * special marked entries (256 + x)
-	 */
-
-	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
-	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
-	NoSymbol,	XK_Control_L,	XK_Alt_L,	XK_Alt_R,
-	XK_Control_L,	XK_Control_R,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
-	XK_F2,		XK_F3,		XK_F4,		XK_F5,
-	XK_F6,		XK_F7,		XK_F8,		XK_F9,
-	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-      };
-
-#endif /* HAS_GETKEYMAP */
-
-/*
- * LegalModifier --
- *      determine whether a key is a legal modifier key, i.e send a
- *      press/release sequence.
- */
-
-/*ARGSUSED*/
-Bool
-LegalModifier(key, pDev)
-     unsigned int  key;
-     DevicePtr	pDev;
-{
-  return (TRUE);
-}
-
-
-      
-/*
- * xf86KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-void
-xf86KbdGetMapping (pKeySyms, pModMap)
-     KeySymsPtr pKeySyms;
-     CARD8      *pModMap;
-{
-  KeySym        *k;
-#ifdef HAS_GETKEYMAP
-  keymap_t      keymap;
-#endif
-  int           i;
-  KeySym        *pMap;
-
-#ifdef HAS_GETKBTYPE
-  char          type;
-  
-  xf86Info.kbdType =
-    ioctl(xf86Info.consoleFd, KDGKBTYPE, &type) != -1 ? type : KB_101;
-  if (xf86Info.kbdType == KB_84)
-    pMap = map84;
-  else
-    pMap = map;
-#else
-/* OS/2 sets the keyboard type during xf86OpenKbd */
-#ifndef __UNIXOS2__
-  xf86Info.kbdType = 0;
-#endif
-  pMap = map;
-#endif
-
-#ifdef HAS_GETKEYMAP
-  /*
-   * use the keymap, which can be gotten from our oringinal vt??.
-   * ( ttymap(1) !!!! )
-   */
-  if (ioctl(xf86Info.consoleFd, GIO_KEYMAP, &keymap) != -1) {
-    for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++)
-      
-      if (remap[i]) {
-	
-	k = pMap + (remap[i] << 2);
-	
-	k[0] = KD_GET_ENTRY(i,0);             /* non-shifed */
-	k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
-	k[2] = KD_GET_ENTRY(i,4);	      /* alt */
-	k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
-
-	if (k[3] == k[2]) k[3] = NoSymbol;
-	if (k[2] == k[1]) k[2] = NoSymbol;
-	if (k[1] == k[0]) k[1] = NoSymbol;
-	if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
-      }
-  }
-#endif
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = pMap, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  pKeySyms->map        = pMap;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE;
-}
diff --git a/hw/xfree86/common/xf86KbdBSD.c b/hw/xfree86/common/xf86KbdBSD.c
deleted file mode 100644
index 97a737d..0000000
--- a/hw/xfree86/common/xf86KbdBSD.c
+++ /dev/null
@@ -1,1265 +0,0 @@
-/*
- * Derived from xf86Kbd.c by S_ren Schmidt (sos at login.dkuug.dk)
- * which is Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- * and from xf86KbdCODrv.c by Holger Veit
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * Copyright (c) 1994-2002 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/* $XConsortium: xf86KbdBSD.c /main/6 1996/10/23 13:12:27 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "atKeynames.h"
-#include "xf86Keymap.h"
-
-#if (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT)) && defined(GIO_KEYMAP)
-#define KD_GET_ENTRY(i,n) \
-  eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + keymap.key[i].map[n]]
-
-static unsigned char remap[NUM_KEYCODES] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-/* This table assumes the ibm code page 437 coding for characters 
- * > 0x80. They are returned in this form by PCVT */
-static KeySym eascii_to_x[512] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
-	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
-	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
-	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
-	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
-	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
-	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
-	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
-	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
-	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
-	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
-	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
-	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
-	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
-	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
-	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
-	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
-	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
-	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
-
-	/* 
-	 * special marked entries (256 + x)
-	 */
-
-#if 1
-	/* This has been checked against what syscons actually does */
-	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
-	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
-	XK_ISO_Left_Tab,XK_Control_L,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
-	XK_F2,		XK_F3,		XK_F4,		XK_F5,
-	XK_F6,		XK_F7,		XK_F8,		XK_F9,
-	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Control_R,	XK_Alt_R,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol
-#else
-	/* The old table, supposedly for pcvt. */
-	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
-	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
-	NoSymbol,	XK_Control_L,	XK_Alt_L,	XK_Alt_R,
-	XK_Control_L,	XK_Control_R,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
-	XK_F2,		XK_F3,		XK_F4,		XK_F5,
-	XK_F6,		XK_F7,		XK_F8,		XK_F9,
-	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol
-#endif
-      };
-
-#ifdef __OpenBSD__
-/* don't mark AltR and  CtrlR for remapping, since they 
- * cannot be remapped by pccons */
-static unsigned char pccons_remap[128] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-/* This table assumes an iso8859_1 encoding for the characters 
- * > 80, as returned by pccons */
-static KeySym latin1_to_x[256] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_nobreakspace,XK_exclamdown,	XK_cent,	XK_sterling,
-	XK_currency,	XK_yen,		XK_brokenbar,	XK_section,
-	XK_diaeresis,	XK_copyright,	XK_ordfeminine,	XK_guillemotleft,
-	XK_notsign,	XK_hyphen,	XK_registered,	XK_macron,
-	XK_degree,	XK_plusminus,	XK_twosuperior,	XK_threesuperior,
-	XK_acute,	XK_mu,		XK_paragraph,	XK_periodcentered,
-	XK_cedilla,	XK_onesuperior,	XK_masculine,	XK_guillemotright,
-	XK_onequarter,	XK_onehalf,	XK_threequarters,XK_questiondown,
-	XK_Agrave,	XK_Aacute,	XK_Acircumflex,	XK_Atilde,
-	XK_Adiaeresis,	XK_Aring,	XK_AE,		XK_Ccedilla,
-	XK_Egrave,	XK_Eacute,	XK_Ecircumflex,	XK_Ediaeresis,
-	XK_Igrave,	XK_Iacute,	XK_Icircumflex,	XK_Idiaeresis,
-	XK_ETH,		XK_Ntilde,	XK_Ograve,	XK_Oacute,
-	XK_Ocircumflex,	XK_Otilde,	XK_Odiaeresis,	XK_multiply,
-	XK_Ooblique,	XK_Ugrave,	XK_Uacute,	XK_Ucircumflex,
-	XK_Udiaeresis,	XK_Yacute,	XK_THORN,	XK_ssharp,
-	XK_agrave,	XK_aacute,	XK_acircumflex,	XK_atilde,
-	XK_adiaeresis,	XK_aring,	XK_ae,	        XK_ccedilla,
-	XK_egrave,	XK_eacute,	XK_ecircumflex,	XK_ediaeresis,
-	XK_igrave,	XK_iacute,	XK_icircumflex, XK_idiaeresis,
-	XK_eth,		XK_ntilde,	XK_ograve, 	XK_oacute,
-	XK_ocircumflex,	XK_otilde,	XK_odiaeresis,	XK_division,
-	XK_oslash,	XK_ugrave,	XK_uacute,	XK_ucircumflex,
-	XK_udiaeresis,	XK_yacute,	XK_thorn, 	XK_ydiaeresis
-      };
-#endif
-#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
-/*
- * LegalModifier --
- *      determine whether a key is a legal modifier key, i.e send a
- *      press/release sequence.
- */
-
-/*ARGSUSED*/
-Bool
-LegalModifier(key, pDev)
-     unsigned int  key;
-     DevicePtr pDev;
-{
-  return (TRUE);
-}
-
-/*
- * xf86KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-void
-xf86KbdGetMapping (pKeySyms, pModMap)
-     KeySymsPtr pKeySyms;
-     CARD8      *pModMap;
-{
-  KeySym        *k;
-  int           i;
-
-#ifndef __bsdi__
-  switch (xf86Info.consType) {
-
-#ifdef PCCONS_SUPPORT
-  case PCCONS:
-#if defined(__OpenBSD__)
-    /*
-     * on OpenBSD, the pccons keymap is programmable, too
-     */
-    {
-      pccons_keymap_t keymap[KB_NUM_KEYS];
-      if (ioctl(xf86Info.consoleFd, CONSOLE_GET_KEYMAP, &keymap) != -1) {
-	for (i = 0; i < KB_NUM_KEYS; i++) 
-	  if (pccons_remap[i]) {
-	    k = map + (pccons_remap[i] << 2);
-	    switch (keymap[i].type) {
-	    case KB_ASCII:
-	      /* For ASCII keys, there is only one char in the keymap */
-	      k[0] = latin1_to_x[(unsigned char)keymap[i].unshift[0]];
-	      k[1] = latin1_to_x[(unsigned char)keymap[i].shift[0]];
-	      k[2] = latin1_to_x[(unsigned char)keymap[i].altgr[0]];
-	      k[3] = latin1_to_x[(unsigned char)keymap[i].shift_altgr[0]];
-	      break;
-	    case KB_SCROLL:
-	      k[0] = XK_Scroll_Lock;
-	      goto special;
-	    case KB_NUM:
-	      k[0] = XK_Num_Lock;
-	      goto special;
-	    case KB_CAPS:
-	      k[0] = XK_Caps_Lock;
-	      goto special;
-	    case KB_SHIFT:
-	      switch (keymap[i].unshift[0]) {
-	      case 1:
-		/* left shift */
-		k[0] = XK_Shift_L;
-		break;
-	      case 2:
-		/* right shift */
-		k[0] = XK_Shift_R;
-		break;
-	      default:
-		k[0] = NoSymbol;
-	      }
-	      goto special;
-	    case KB_CTL:
-	      k[0] = XK_Control_L;
-	      goto special;
-	    case KB_ALT:
-	      k[0] = XK_Alt_L;
-	      goto special;
-	    case KB_FUNC:
-	      switch (keymap[i].unshift[2]) {
-	      case 'M':
-		k[0] = XK_F1;
-		break;
-	      case 'N':
-		k[0] = XK_F2;
-		break;
-	      case 'O':
-		k[0] = XK_F3;
-		break;
-	      case 'P':
-		k[0] = XK_F4;
-		break;
-	      case 'Q':
-		k[0] = XK_F5;
-		break;
-	      case 'R':
-		k[0] = XK_F6;
-		break;
-	      case 'S':
-		k[0] = XK_F7;
-		break;
-	      case 'T':
-		k[0] = XK_F8;
-		break;
-	      case 'U':
-		k[0] = XK_F9;
-		break;
-	      case 'V':
-		k[0] = XK_F10;
-		break;
-	      case 'W':
-		k[0] = XK_F11;
-		break;
-	      case 'X':
-		k[0] = XK_F12;
-		break;
-	      default:
-		k[0] = NoSymbol;
-		break;
-	      }
-	      goto special;
-	    default:
-	      k[0] = NoSymbol;
-	    special:
-	      k[1] = k[2] = k[3] = NoSymbol;
-	    }
-	  }
-      } else {
-	ErrorF("Can't read pccons keymap\n");
-      }
-    }
-#endif /* __OpenBSD__ */
-  break;
-#endif
-
-/*
- * XXX wscons has no GIO_KEYMAP
- */
-#if (defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)) && defined(GIO_KEYMAP)
-  case SYSCONS:
-  case PCVT:
-    {
-      keymap_t keymap;
-    
-      if (ioctl(xf86Info.consoleFd, GIO_KEYMAP, &keymap) != -1) {
-	for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++)
-	  if (remap[i]) {
-	    k = map + (remap[i] << 2);
-	    k[0] = KD_GET_ENTRY(i,0);           /* non-shifed */
-	    k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
-	    k[2] = KD_GET_ENTRY(i,4);	      /* alt */
-	    k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
-	    if (k[3] == k[2]) k[3] = NoSymbol;
-	    if (k[2] == k[1]) k[2] = NoSymbol;
-	    if (k[1] == k[0]) k[1] = NoSymbol;
-	    if (k[0] == k[2] && k[1] == k[3])
-	      k[2] = k[3] = NoSymbol;
-	  }
-      }
-    }
-    break;
-#endif /* SYSCONS || PCVT */
-    
-  } 
-#endif /* !bsdi */
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  xf86Info.kbdType = 0;
-
-  pKeySyms->map        = map;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE; 
-
-}
-
-#ifdef WSCONS_SUPPORT
-#include "atKeynames.h"
-
-static CARD8 wsUsbMap[] = {
-	/* 0 */ KEY_NOTUSED,
-	/* 1 */ KEY_NOTUSED,
-	/* 2 */ KEY_NOTUSED,
-	/* 3 */ KEY_NOTUSED,
-	/* 4 */ KEY_A,		
-	/* 5 */ KEY_B,
-	/* 6 */ KEY_C,
-	/* 7 */ KEY_D,
-	/* 8 */ KEY_E,
-	/* 9 */ KEY_F,
-	/* 10 */ KEY_G,
-	/* 11 */ KEY_H,
-	/* 12 */ KEY_I,
-	/* 13 */ KEY_J,
-	/* 14 */ KEY_K,
-	/* 15 */ KEY_L,
-	/* 16 */ KEY_M,
-	/* 17 */ KEY_N,
-	/* 18 */ KEY_O,
-	/* 19 */ KEY_P,
-	/* 20 */ KEY_Q,
-	/* 21 */ KEY_R,
-	/* 22 */ KEY_S,
-	/* 23 */ KEY_T,
-	/* 24 */ KEY_U,
-	/* 25 */ KEY_V,
-	/* 26 */ KEY_W,
-	/* 27 */ KEY_X,
-	/* 28 */ KEY_Y,
-	/* 29 */ KEY_Z,
-	/* 30 */ KEY_1,		/* 1 !*/
-	/* 31 */ KEY_2,		/* 2 @ */
-	/* 32 */ KEY_3,		/* 3 # */
-	/* 33 */ KEY_4,		/* 4 $ */
-	/* 34 */ KEY_5,		/* 5 % */
-	/* 35 */ KEY_6,		/* 6 ^ */
-	/* 36 */ KEY_7,		/* 7 & */
-	/* 37 */ KEY_8,		/* 8 * */
-	/* 38 */ KEY_9,		/* 9 ( */
-	/* 39 */ KEY_0,		/* 0 ) */
-	/* 40 */ KEY_Enter,	/* Return  */
-	/* 41 */ KEY_Escape,	/* Escape */
-	/* 42 */ KEY_BackSpace,	/* Backspace Delete */
-	/* 43 */ KEY_Tab,	/* Tab */
-	/* 44 */ KEY_Space,	/* Space */
-	/* 45 */ KEY_Minus,	/* - _ */
-	/* 46 */ KEY_Equal,	/* = + */
-	/* 47 */ KEY_LBrace,	/* [ { */
-	/* 48 */ KEY_RBrace,	/* ] } */
-	/* 49 */ KEY_BSlash,	/* \ | */
-	/* 50 */ KEY_BSlash2,	/* \ _ # ~ on some keyboards */
-	/* 51 */ KEY_SemiColon,	/* ; : */
-	/* 52 */ KEY_Quote,	/* ' " */
-	/* 53 */ KEY_Tilde,	/* ` ~ */
-	/* 54 */ KEY_Comma,	/* , <  */
-	/* 55 */ KEY_Period,	/* . > */
-	/* 56 */ KEY_Slash,	/* / ? */
-	/* 57 */ KEY_CapsLock,	/* Caps Lock */
-	/* 58 */ KEY_F1,		/* F1 */
-	/* 59 */ KEY_F2,		/* F2 */
-	/* 60 */ KEY_F3,		/* F3 */
-	/* 61 */ KEY_F4,		/* F4 */
-	/* 62 */ KEY_F5,		/* F5 */
-	/* 63 */ KEY_F6,		/* F6 */
-	/* 64 */ KEY_F7,		/* F7 */
-	/* 65 */ KEY_F8,		/* F8 */
-	/* 66 */ KEY_F9,		/* F9 */
-	/* 67 */ KEY_F10,	/* F10 */
-	/* 68 */ KEY_F11,	/* F11 */
-	/* 69 */ KEY_F12,	/* F12 */
-	/* 70 */ KEY_Print,	/* PrintScrn SysReq */
-	/* 71 */ KEY_ScrollLock,	/* Scroll Lock */
-	/* 72 */ KEY_Pause,	/* Pause Break */
-	/* 73 */ KEY_Insert,	/* Insert XXX  Help on some Mac Keyboards */
-	/* 74 */ KEY_Home,	/* Home */
-	/* 75 */ KEY_PgUp,	/* Page Up */
-	/* 76 */ KEY_Delete,	/* Delete */
-	/* 77 */ KEY_End,	/* End */
-	/* 78 */ KEY_PgDown,	/* Page Down */
-	/* 79 */ KEY_Right,	/* Right Arrow */
-	/* 80 */ KEY_Left,	/* Left Arrow */
-	/* 81 */ KEY_Down,	/* Down Arrow */
-	/* 82 */ KEY_Up,		/* Up Arrow */
-	/* 83 */ KEY_NumLock,	/* Num Lock */
-	/* 84 */ KEY_KP_Divide,	/* Keypad / */
-	/* 85 */ KEY_KP_Multiply, /* Keypad * */
-	/* 86 */ KEY_KP_Minus,	/* Keypad - */
-	/* 87 */ KEY_KP_Plus,	/* Keypad + */
-	/* 88 */ KEY_KP_Enter,	/* Keypad Enter */
-	/* 89 */ KEY_KP_1,	/* Keypad 1 End */
-	/* 90 */ KEY_KP_2,	/* Keypad 2 Down */
-	/* 91 */ KEY_KP_3,	/* Keypad 3 Pg Down */
-	/* 92 */ KEY_KP_4,	/* Keypad 4 Left  */
-	/* 93 */ KEY_KP_5,	/* Keypad 5 */
-	/* 94 */ KEY_KP_6,	/* Keypad 6 */
-	/* 95 */ KEY_KP_7,	/* Keypad 7 Home */
-	/* 96 */ KEY_KP_8,	/* Keypad 8 Up */
-	/* 97 */ KEY_KP_9,	/* KEypad 9 Pg Up */
-	/* 98 */ KEY_KP_0,	/* Keypad 0 Ins */
-	/* 99 */ KEY_KP_Decimal,	/* Keypad . Del */
-	/* 100 */ KEY_Less,	/* < > on some keyboards */
-	/* 101 */ KEY_Menu,	/* Menu */
-	/* 102 */ KEY_NOTUSED,
-	/* 103 */ KEY_KP_Equal, /* Keypad = on Mac keyboards */
-	/* 104 */ KEY_NOTUSED,
-	/* 105 */ KEY_NOTUSED,
-	/* 106 */ KEY_NOTUSED,
-	/* 107 */ KEY_NOTUSED,
-	/* 108 */ KEY_NOTUSED,
-	/* 109 */ KEY_NOTUSED,
-	/* 110 */ KEY_NOTUSED,
-	/* 111 */ KEY_NOTUSED,
-	/* 112 */ KEY_NOTUSED,
-	/* 113 */ KEY_NOTUSED,
-	/* 114 */ KEY_NOTUSED,
-	/* 115 */ KEY_NOTUSED,
-	/* 116 */ KEY_NOTUSED,
-	/* 117 */ KEY_NOTUSED,
-	/* 118 */ KEY_NOTUSED,
-	/* 119 */ KEY_NOTUSED,
-	/* 120 */ KEY_NOTUSED,
-	/* 121 */ KEY_NOTUSED,
-	/* 122 */ KEY_NOTUSED,
-	/* 123 */ KEY_NOTUSED,
-	/* 124 */ KEY_NOTUSED,
-	/* 125 */ KEY_NOTUSED,
-	/* 126 */ KEY_NOTUSED,
-	/* 127 */ KEY_NOTUSED,
-	/* 128 */ KEY_NOTUSED,
-	/* 129 */ KEY_NOTUSED,
-	/* 130 */ KEY_NOTUSED,
-	/* 131 */ KEY_NOTUSED,
-	/* 132 */ KEY_NOTUSED,
-	/* 133 */ KEY_NOTUSED,
-	/* 134 */ KEY_NOTUSED,
-	/* 135 */ KEY_NOTUSED,
-	/* 136 */ KEY_NOTUSED,
-	/* 137 */ KEY_NOTUSED,
-	/* 138 */ KEY_NOTUSED,
-	/* 139 */ KEY_NOTUSED,
-	/* 140 */ KEY_NOTUSED,
-	/* 141 */ KEY_NOTUSED,
-	/* 142 */ KEY_NOTUSED,
-	/* 143 */ KEY_NOTUSED,
-	/* 144 */ KEY_NOTUSED,
-	/* 145 */ KEY_NOTUSED,
-	/* 146 */ KEY_NOTUSED,
-	/* 147 */ KEY_NOTUSED,
-	/* 148 */ KEY_NOTUSED,
-	/* 149 */ KEY_NOTUSED,
-	/* 150 */ KEY_NOTUSED,
-	/* 151 */ KEY_NOTUSED,
-	/* 152 */ KEY_NOTUSED,
-	/* 153 */ KEY_NOTUSED,
-	/* 154 */ KEY_NOTUSED,
-	/* 155 */ KEY_NOTUSED,
-	/* 156 */ KEY_NOTUSED,
-	/* 157 */ KEY_NOTUSED,
-	/* 158 */ KEY_NOTUSED,
-	/* 159 */ KEY_NOTUSED,
-	/* 160 */ KEY_NOTUSED,
-	/* 161 */ KEY_NOTUSED,
-	/* 162 */ KEY_NOTUSED,
-	/* 163 */ KEY_NOTUSED,
-	/* 164 */ KEY_NOTUSED,
-	/* 165 */ KEY_NOTUSED,
-	/* 166 */ KEY_NOTUSED,
-	/* 167 */ KEY_NOTUSED,
-	/* 168 */ KEY_NOTUSED,
-	/* 169 */ KEY_NOTUSED,
-	/* 170 */ KEY_NOTUSED,
-	/* 171 */ KEY_NOTUSED,
-	/* 172 */ KEY_NOTUSED,
-	/* 173 */ KEY_NOTUSED,
-	/* 174 */ KEY_NOTUSED,
-	/* 175 */ KEY_NOTUSED,
-	/* 176 */ KEY_NOTUSED,
-	/* 177 */ KEY_NOTUSED,
-	/* 178 */ KEY_NOTUSED,
-	/* 179 */ KEY_NOTUSED,
-	/* 180 */ KEY_NOTUSED,
-	/* 181 */ KEY_NOTUSED,
-	/* 182 */ KEY_NOTUSED,
-	/* 183 */ KEY_NOTUSED,
-	/* 184 */ KEY_NOTUSED,
-	/* 185 */ KEY_NOTUSED,
-	/* 186 */ KEY_NOTUSED,
-	/* 187 */ KEY_NOTUSED,
-	/* 188 */ KEY_NOTUSED,
-	/* 189 */ KEY_NOTUSED,
-	/* 190 */ KEY_NOTUSED,
-	/* 191 */ KEY_NOTUSED,
-	/* 192 */ KEY_NOTUSED,
-	/* 193 */ KEY_NOTUSED,
-	/* 194 */ KEY_NOTUSED,
-	/* 195 */ KEY_NOTUSED,
-	/* 196 */ KEY_NOTUSED,
-	/* 197 */ KEY_NOTUSED,
-	/* 198 */ KEY_NOTUSED,
-	/* 199 */ KEY_NOTUSED,
-	/* 200 */ KEY_NOTUSED,
-	/* 201 */ KEY_NOTUSED,
-	/* 202 */ KEY_NOTUSED,
-	/* 203 */ KEY_NOTUSED,
-	/* 204 */ KEY_NOTUSED,
-	/* 205 */ KEY_NOTUSED,
-	/* 206 */ KEY_NOTUSED,
-	/* 207 */ KEY_NOTUSED,
-	/* 208 */ KEY_NOTUSED,
-	/* 209 */ KEY_NOTUSED,
-	/* 210 */ KEY_NOTUSED,
-	/* 211 */ KEY_NOTUSED,
-	/* 212 */ KEY_NOTUSED,
-	/* 213 */ KEY_NOTUSED,
-	/* 214 */ KEY_NOTUSED,
-	/* 215 */ KEY_NOTUSED,
-	/* 216 */ KEY_NOTUSED,
-	/* 217 */ KEY_NOTUSED,
-	/* 218 */ KEY_NOTUSED,
-	/* 219 */ KEY_NOTUSED,
-	/* 220 */ KEY_NOTUSED,
-	/* 221 */ KEY_NOTUSED,
-	/* 222 */ KEY_NOTUSED,
-	/* 223 */ KEY_NOTUSED,
-	/* 224 */ KEY_LCtrl,	/* Left Control */
-	/* 225 */ KEY_ShiftL,	/* Left Shift */
-	/* 226 */ KEY_Alt,	/* Left Alt */
-	/* 227 */ KEY_LMeta,	/* Left Meta */
-	/* 228 */ KEY_RCtrl,	/* Right Control */
-	/* 229 */ KEY_ShiftR,	/* Right Shift */
-	/* 230 */ KEY_AltLang,	/* Right Alt, AKA AltGr */
-	/* 231 */ KEY_LMeta,	/* Right Meta XXX */
-};
-
-#define WS_USB_MAP_SIZE (sizeof(wsUsbMap)/sizeof(unsigned char))
-
-/* Map for adb keyboards  */
-static CARD8 wsAdbMap[] = {
-	/* 0 */ KEY_A,
-	/* 1 */ KEY_S,
-	/* 2 */ KEY_D,
-	/* 3 */ KEY_F,
-	/* 4 */ KEY_H,
-	/* 5 */ KEY_G,
-	/* 6 */ KEY_Z,
-	/* 7 */ KEY_X,
-	/* 8 */ KEY_C,
-	/* 9 */ KEY_V,
-	/* 10 */ KEY_UNKNOWN,	/* @ # on french keyboards */
-	/* 11 */ KEY_B,
-	/* 12 */ KEY_Q,
-	/* 13 */ KEY_W,
-	/* 14 */ KEY_E,
-	/* 15 */ KEY_R,
-	/* 16 */ KEY_Y,
-	/* 17 */ KEY_T,
-	/* 18 */ KEY_1,
-	/* 19 */ KEY_2,
-	/* 20 */ KEY_3,
-	/* 21 */ KEY_4,
-	/* 22 */ KEY_6,
-	/* 23 */ KEY_5,
-	/* 24 */ KEY_Equal,
-	/* 25 */ KEY_9,
-	/* 26 */ KEY_7,
-	/* 27 */ KEY_Minus,
-	/* 28 */ KEY_8,
-	/* 29 */ KEY_0,
-	/* 30 */ KEY_RBrace,
-	/* 31 */ KEY_O,
-	/* 32 */ KEY_U,
-	/* 33 */ KEY_LBrace,
-	/* 34 */ KEY_I,
-	/* 35 */ KEY_P,
-	/* 36 */ KEY_Enter,
-	/* 37 */ KEY_L,
-	/* 38 */ KEY_J,
-	/* 39 */ KEY_Quote,
-	/* 40 */ KEY_K,
-	/* 41 */ KEY_SemiColon,
-	/* 42 */ KEY_BSlash,
-	/* 43 */ KEY_Comma,
-	/* 44 */ KEY_Slash,
-	/* 45 */ KEY_N,
-	/* 46 */ KEY_M,
-	/* 47 */ KEY_Period,
-	/* 48 */ KEY_Tab,
-	/* 49 */ KEY_Space,
-	/* 50 */ KEY_Tilde,
-	/* 51 */ KEY_Delete,
-	/* 52 */ KEY_AltLang,
-	/* 53 */ KEY_Escape,
-	/* 54 */ KEY_LCtrl,
-	/* 55 */ KEY_Alt,
-	/* 56 */ KEY_ShiftL,
-	/* 57 */ KEY_CapsLock,
-	/* 58 */ KEY_LMeta,
-	/* 59 */ KEY_Left,
-	/* 60 */ KEY_Right,
-	/* 61 */ KEY_Down,
-	/* 62 */ KEY_Up,
-	/* 63 */ KEY_UNKNOWN,	/* Fn */
-	/* 64 */ KEY_NOTUSED,
-	/* 65 */ KEY_KP_Decimal,
-	/* 66 */ KEY_NOTUSED,
-	/* 67 */ KEY_KP_Multiply,
-	/* 68 */ KEY_NOTUSED,
-	/* 69 */ KEY_KP_Plus,
-	/* 70 */ KEY_NOTUSED,
-	/* 71 */ KEY_UNKNOWN,	/* Clear */
-	/* 72 */ KEY_NOTUSED, 
-	/* 73 */ KEY_NOTUSED,
-	/* 74 */ KEY_NOTUSED,
-	/* 75 */ KEY_KP_Divide,
-	/* 76 */ KEY_KP_Enter,
-	/* 77 */ KEY_NOTUSED,
-	/* 78 */ KEY_KP_Minus,
-	/* 79 */ KEY_NOTUSED,
-	/* 80 */ KEY_NOTUSED,
-	/* 81 */ KEY_KP_Equal,	/* Keypad = */
-	/* 82 */ KEY_KP_0,
-	/* 83 */ KEY_KP_1,
-	/* 84 */ KEY_KP_2,
-	/* 85 */ KEY_KP_3,
-	/* 86 */ KEY_KP_4,
-	/* 87 */ KEY_KP_5,
-	/* 88 */ KEY_KP_6,
-	/* 89 */ KEY_KP_7,
-	/* 90 */ KEY_NOTUSED,
-	/* 91 */ KEY_KP_8,
-	/* 92 */ KEY_KP_9,
-	/* 93 */ KEY_NOTUSED,
-	/* 94 */ KEY_NOTUSED,
-	/* 95 */ KEY_UNKNOWN,	/* Keypad ,  */
-	/* 96 */ KEY_F5,
-	/* 97 */ KEY_F6,
-	/* 98 */ KEY_F7,
-	/* 99 */ KEY_F3,
-	/* 100 */ KEY_F8,
-	/* 101 */ KEY_F9,
-	/* 102 */ KEY_NOTUSED,
-	/* 103 */ KEY_F11,
-	/* 104 */ KEY_NOTUSED,
-	/* 105 */ KEY_NOTUSED,
-	/* 106 */ KEY_KP_Enter,
-	/* 107 */ KEY_NOTUSED,
-	/* 108 */ KEY_NOTUSED,
-	/* 109 */ KEY_F10,
-	/* 110 */ KEY_NOTUSED,
-	/* 111 */ KEY_F12,
-	/* 112 */ KEY_NOTUSED,
-	/* 113 */ KEY_NOTUSED,
-	/* 114 */ KEY_NOTUSED,
-	/* 115 */ KEY_Home,
-	/* 116 */ KEY_PgUp,
-	/* 117 */ KEY_NOTUSED,
-	/* 118 */ KEY_F4,
-	/* 119 */ KEY_End,
-	/* 120 */ KEY_F2,
-	/* 121 */ KEY_PgDown,
-	/* 122 */ KEY_F1,
-	/* 123 */ KEY_NOTUSED,
-	/* 124 */ KEY_NOTUSED,
-	/* 125 */ KEY_NOTUSED,
-	/* 126 */ KEY_NOTUSED,
-	/* 127 */ KEY_NOTUSED,
-	/* 128 */ KEY_NOTUSED,
-	/* 129 */ KEY_NOTUSED,
-	/* 130 */ KEY_NOTUSED,
-	/* 131 */ KEY_NOTUSED,
-	/* 132 */ KEY_NOTUSED,
-	/* 133 */ KEY_NOTUSED,
-	/* 134 */ KEY_NOTUSED,
-	/* 135 */ KEY_NOTUSED,
-	/* 136 */ KEY_NOTUSED,
-	/* 137 */ KEY_NOTUSED,
-	/* 138 */ KEY_NOTUSED,
-	/* 139 */ KEY_NOTUSED,
-	/* 140 */ KEY_NOTUSED,
-	/* 141 */ KEY_NOTUSED,
-	/* 142 */ KEY_NOTUSED,
-	/* 143 */ KEY_NOTUSED,
-	/* 144 */ KEY_NOTUSED,
-	/* 145 */ KEY_NOTUSED,
-	/* 146 */ KEY_NOTUSED,
-	/* 147 */ KEY_NOTUSED,
-	/* 148 */ KEY_NOTUSED,
-	/* 149 */ KEY_NOTUSED,
-	/* 150 */ KEY_NOTUSED,
-	/* 151 */ KEY_NOTUSED,
-	/* 152 */ KEY_NOTUSED,
-	/* 153 */ KEY_NOTUSED,
-	/* 154 */ KEY_NOTUSED,
-	/* 155 */ KEY_NOTUSED,
-	/* 156 */ KEY_NOTUSED,
-	/* 157 */ KEY_NOTUSED,
-	/* 158 */ KEY_NOTUSED,
-	/* 159 */ KEY_NOTUSED,
-	/* 160 */ KEY_NOTUSED,
-	/* 161 */ KEY_NOTUSED,
-	/* 162 */ KEY_NOTUSED,
-	/* 163 */ KEY_NOTUSED,
-	/* 164 */ KEY_NOTUSED,
-	/* 165 */ KEY_NOTUSED,
-	/* 166 */ KEY_NOTUSED,
-	/* 167 */ KEY_NOTUSED,
-	/* 168 */ KEY_NOTUSED,
-	/* 169 */ KEY_NOTUSED,
-	/* 170 */ KEY_NOTUSED,
-	/* 171 */ KEY_NOTUSED,
-	/* 172 */ KEY_NOTUSED,
-	/* 173 */ KEY_NOTUSED,
-	/* 174 */ KEY_NOTUSED,
-	/* 175 */ KEY_NOTUSED,
-	/* 176 */ KEY_NOTUSED,
-	/* 177 */ KEY_NOTUSED,
-	/* 178 */ KEY_NOTUSED,
-	/* 179 */ KEY_NOTUSED,
-	/* 180 */ KEY_NOTUSED,
-	/* 181 */ KEY_NOTUSED,
-	/* 182 */ KEY_NOTUSED,
-	/* 183 */ KEY_NOTUSED,
-	/* 184 */ KEY_NOTUSED,
-	/* 185 */ KEY_NOTUSED,
-	/* 186 */ KEY_NOTUSED,
-	/* 187 */ KEY_NOTUSED,
-	/* 188 */ KEY_NOTUSED,
-	/* 189 */ KEY_NOTUSED,
-	/* 190 */ KEY_NOTUSED,
-	/* 191 */ KEY_NOTUSED,
-	/* 192 */ KEY_NOTUSED,
-	/* 193 */ KEY_NOTUSED,
-	/* 194 */ KEY_NOTUSED,
-	/* 195 */ KEY_NOTUSED,
-	/* 196 */ KEY_NOTUSED,
-	/* 197 */ KEY_NOTUSED,
-	/* 198 */ KEY_NOTUSED,
-	/* 199 */ KEY_NOTUSED,
-	/* 200 */ KEY_NOTUSED,
-	/* 201 */ KEY_NOTUSED,
-	/* 202 */ KEY_NOTUSED,
-	/* 203 */ KEY_NOTUSED,
-	/* 204 */ KEY_NOTUSED,
-	/* 205 */ KEY_NOTUSED,
-	/* 206 */ KEY_NOTUSED,
-	/* 207 */ KEY_NOTUSED,
-	/* 208 */ KEY_NOTUSED,
-	/* 209 */ KEY_NOTUSED,
-	/* 210 */ KEY_NOTUSED,
-	/* 211 */ KEY_NOTUSED,
-	/* 212 */ KEY_NOTUSED,
-	/* 213 */ KEY_NOTUSED,
-	/* 214 */ KEY_NOTUSED,
-	/* 215 */ KEY_NOTUSED,
-	/* 216 */ KEY_NOTUSED,
-	/* 217 */ KEY_NOTUSED,
-	/* 218 */ KEY_NOTUSED,
-	/* 219 */ KEY_NOTUSED,
-	/* 220 */ KEY_NOTUSED,
-	/* 221 */ KEY_NOTUSED,
-	/* 222 */ KEY_NOTUSED,
-	/* 223 */ KEY_NOTUSED,
-};
-
-#define WS_ADB_MAP_SIZE (sizeof(wsAdbMap)/sizeof(unsigned char))
-
-static CARD8 wsSunMap[] = {
-	/* 0x00 */ KEY_NOTUSED,
-	/* 0x01 */ KEY_NOTUSED,		/* stop */
-	/* 0x02 */ KEY_NOTUSED,		/* BrightnessDown / S-VolumeDown */
-	/* 0x03 */ KEY_NOTUSED,		/* again */
-	/* 0x04 */ KEY_NOTUSED,		/* BridgtnessUp / S-VolumeUp */
-	/* 0x05 */ KEY_F1,
-	/* 0x06 */ KEY_F2,
-	/* 0x07 */ KEY_F10,
-	/* 0x08 */ KEY_F3,
-	/* 0x09 */ KEY_F11,
-	/* 0x0a */ KEY_F4,
-	/* 0x0b */ KEY_F12,
-	/* 0x0c */ KEY_F5,
-	/* 0x0d */ KEY_AltLang,
-	/* 0x0e */ KEY_F6,
-	/* 0x0f */ KEY_NOTUSED,
-	/* 0x10 */ KEY_F7,
-	/* 0x11 */ KEY_F8,
-	/* 0x12 */ KEY_F9,
-	/* 0x13 */ KEY_Alt,
-	/* 0x14 */ KEY_Up,
-	/* 0x15 */ KEY_Pause,
-	/* 0x16 */ KEY_Print,
-	/* 0x17 */ KEY_NOTUSED,		/* props */
-	/* 0x18 */ KEY_Left,
-	/* 0x19 */ KEY_ScrollLock,
-	/* 0x1a */ KEY_NOTUSED,		/* undo */
-	/* 0x1b */ KEY_Down,
-	/* 0x1c */ KEY_Right,
-	/* 0x1d */ KEY_Escape,
-	/* 0x1e */ KEY_1,
-	/* 0x1f */ KEY_2,
-	/* 0x20 */ KEY_3,
-	/* 0x21 */ KEY_4,
-	/* 0x22 */ KEY_5,
-	/* 0x23 */ KEY_6,
-	/* 0x24 */ KEY_7,
-	/* 0x25 */ KEY_8,
-	/* 0x26 */ KEY_9,
-	/* 0x27 */ KEY_0,
-	/* 0x28 */ KEY_Minus,
-	/* 0x29 */ KEY_Equal,
-	/* 0x2a */ KEY_Tilde,
-	/* 0x2b */ KEY_BackSpace,
-	/* 0x2c */ KEY_Insert,
-	/* 0x2d */ KEY_KP_Equal,
-	/* 0x2e */ KEY_KP_Divide,
-	/* 0x2f */ KEY_KP_Multiply,
-	/* 0x30 */ KEY_NOTUSED,
-	/* 0x31 */ KEY_NOTUSED,		/* front */
-	/* 0x32 */ KEY_KP_Decimal,
-	/* 0x33 */ KEY_NOTUSED,		/* copy */
-	/* 0x34 */ KEY_Home,
-	/* 0x35 */ KEY_Tab,
-	/* 0x36 */ KEY_Q,
-	/* 0x37 */ KEY_W,
-	/* 0x38 */ KEY_E,
-	/* 0x39 */ KEY_R,
-	/* 0x3a */ KEY_T,
-	/* 0x3b */ KEY_Y,
-	/* 0x3c */ KEY_U,
-	/* 0x3d */ KEY_I,
-	/* 0x3e */ KEY_O,
-	/* 0x3f */ KEY_P,
-	/* 0x40 */ KEY_LBrace,
-	/* 0x41 */ KEY_RBrace,
-	/* 0x42 */ KEY_Delete,
-	/* 0x43 */ KEY_NOTUSED,		/* compose */
-	/* 0x44 */ KEY_KP_7,
-	/* 0x45 */ KEY_KP_8,
-	/* 0x46 */ KEY_KP_9,
-	/* 0x47 */ KEY_KP_Minus,
-	/* 0x48 */ KEY_NOTUSED,		/* open */
-	/* 0x49 */ KEY_NOTUSED,		/* paste */
-	/* 0x4a */ KEY_End,
-	/* 0x4b */ KEY_NOTUSED,
-	/* 0x4c */ KEY_LCtrl,
-	/* 0x4d */ KEY_A,
-	/* 0x4e */ KEY_S,
-	/* 0x4f */ KEY_D,
-	/* 0x50 */ KEY_F,
-	/* 0x51 */ KEY_G,
-	/* 0x52 */ KEY_H,
-	/* 0x53 */ KEY_J,
-	/* 0x54 */ KEY_K,
-	/* 0x55 */ KEY_L,
-	/* 0x56 */ KEY_SemiColon,
-	/* 0x57 */ KEY_Quote,
-	/* 0x58 */ KEY_BSlash,
-	/* 0x59 */ KEY_Enter,
-	/* 0x5a */ KEY_KP_Enter,
-	/* 0x5b */ KEY_KP_4,
-	/* 0x5c */ KEY_KP_5,
-	/* 0x5d */ KEY_KP_6,
-	/* 0x5e */ KEY_KP_0,
-	/* 0x5f */ KEY_NOTUSED,		/* find */
-	/* 0x60 */ KEY_PgUp,
-	/* 0x61 */ KEY_NOTUSED,		/* cut */
-	/* 0x62 */ KEY_NumLock,
-	/* 0x63 */ KEY_ShiftL,
-	/* 0x64 */ KEY_Z,
-	/* 0x65 */ KEY_X,
-	/* 0x66 */ KEY_C,
-	/* 0x67 */ KEY_V,
-	/* 0x68 */ KEY_B,
-	/* 0x69 */ KEY_N,
-	/* 0x6a */ KEY_M,
-	/* 0x6b */ KEY_Comma,
-	/* 0x6c */ KEY_Period,
-	/* 0x6d */ KEY_Slash,
-	/* 0x6e */ KEY_ShiftR,
-	/* 0x6f */ KEY_NOTUSED,		/* linefeed */
-	/* 0x70 */ KEY_KP_1,
-	/* 0x71 */ KEY_KP_2,
-	/* 0x72 */ KEY_KP_3,
-	/* 0x73 */ KEY_NOTUSED,
-	/* 0x74 */ KEY_NOTUSED,
-	/* 0x75 */ KEY_NOTUSED,
-	/* 0x76 */ KEY_NOTUSED,		/* help */
-	/* 0x77 */ KEY_CapsLock,
-	/* 0x78 */ KEY_LMeta,
-	/* 0x79 */ KEY_Space,
-	/* 0x7a */ KEY_RMeta,
-	/* 0x7b */ KEY_PgDown,
-	/* 0x7c */ KEY_NOTUSED,
-	/* 0x7d */ KEY_KP_Plus,
-	/* 0x7e */ KEY_NOTUSED,
-	/* 0x7f */ KEY_NOTUSED
-};
-
-#define WS_SUN_MAP_SIZE (sizeof(wsSunMap)/sizeof(unsigned char))
-
-/*
- * Translate raw wskbd keyboard event values to XFree86 standard keycodes
- * (based on the AT keyboard scan codes using the tables above
- */
-int 
-WSKbdToKeycode(int keycode)
-{
-	switch (xf86Info.wsKbdType) {
-	case WSKBD_TYPE_PC_XT:
-	case WSKBD_TYPE_PC_AT:
-		/* No translation needed */
-		return keycode;
-	case WSKBD_TYPE_USB:
-		if (keycode < 0 || keycode >= WS_USB_MAP_SIZE) 
-			return KEY_UNKNOWN;
-		else 
-			return wsUsbMap[keycode];
-#ifdef WSKBD_TYPE_ADB
-	case WSKBD_TYPE_ADB:
-		if (keycode < 0 || keycode >= WS_ADB_MAP_SIZE) 
-			return KEY_UNKNOWN;
-		else 
-			return wsAdbMap[keycode];
-#endif
-#ifdef WSKBD_TYPE_SUN
-	case WSKBD_TYPE_SUN:
-#ifdef WSKBD_TYPE_SUN5
-	case WSKBD_TYPE_SUN5:
-#endif
-		if (keycode < 0 || keycode >= WS_SUN_MAP_SIZE)
-			return KEY_UNKNOWN;
-		else
-			return wsSunMap[keycode];
-#endif
-	default:
-		ErrorF("Unknown wskbd type %d\n", xf86Info.wsKbdType);
-		return KEY_UNKNOWN;
-	}
-}
-
-#endif /* WSCONS_SUPPORT */
diff --git a/hw/xfree86/common/xf86KbdLnx.c b/hw/xfree86/common/xf86KbdLnx.c
deleted file mode 100644
index 74cb42d..0000000
--- a/hw/xfree86/common/xf86KbdLnx.c
+++ /dev/null
@@ -1,650 +0,0 @@
-/*
- * Linux version of keymapping setup. The kernel (since 0.99.14) has support
- * for fully remapping the keyboard, but there are some differences between
- * the Linux map and the SVR4 map (esp. in the extended keycodes). We also
- * remove the restriction on what keycodes can be remapped.
- * Orest Zborowski.
- */
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Copyright (c) 1994-2001 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/* $XConsortium: xf86KbdLnx.c /main/7 1996/10/19 17:59:00 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "atKeynames.h"
-
-#include "xf86Keymap.h"
-
-/*
- * LegalModifier --
- *      determine whether a key is a legal modifier key, i.e send a
- *      press/release sequence.
- */
-
-/*ARGSUSED*/
-Bool
-LegalModifier(unsigned int key, DevicePtr pDev)
-{
-  return (TRUE);
-}
-
-/*
- * xf86KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-static void readKernelMapping(KeySymsPtr pKeySyms, CARD8 *pModMap);
-
-void
-xf86KbdGetMapping (KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-  KeySym        *k;
-  char          type;
-  int           i;
-
-  readKernelMapping(pKeySyms, pModMap);
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  xf86Info.kbdType =
-    ioctl(xf86Info.consoleFd, KDGKBTYPE, &type) != -1 ? type : KB_101;
-
-  pKeySyms->map        = map;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE; 
-}
-
-#include <linux/keyboard.h>
-
-static KeySym linux_to_x[256] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_BackSpace,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_nobreakspace,XK_exclamdown,	XK_cent,	XK_sterling,
-	XK_currency,	XK_yen,		XK_brokenbar,	XK_section,
-	XK_diaeresis,	XK_copyright,	XK_ordfeminine,	XK_guillemotleft,
-	XK_notsign,	XK_hyphen,	XK_registered,	XK_macron,
-	XK_degree,	XK_plusminus,	XK_twosuperior,	XK_threesuperior,
-	XK_acute,	XK_mu,		XK_paragraph,	XK_periodcentered,
-	XK_cedilla,	XK_onesuperior,	XK_masculine,	XK_guillemotright,
-	XK_onequarter,	XK_onehalf,	XK_threequarters,XK_questiondown,
-	XK_Agrave,	XK_Aacute,	XK_Acircumflex,	XK_Atilde,
-	XK_Adiaeresis,	XK_Aring,	XK_AE,		XK_Ccedilla,
-	XK_Egrave,	XK_Eacute,	XK_Ecircumflex,	XK_Ediaeresis,
-	XK_Igrave,	XK_Iacute,	XK_Icircumflex,	XK_Idiaeresis,
-	XK_ETH,		XK_Ntilde,	XK_Ograve,	XK_Oacute,
-	XK_Ocircumflex,	XK_Otilde,	XK_Odiaeresis,	XK_multiply,
-	XK_Ooblique,	XK_Ugrave,	XK_Uacute,	XK_Ucircumflex,
-	XK_Udiaeresis,	XK_Yacute,	XK_THORN,	XK_ssharp,
-	XK_agrave,	XK_aacute,	XK_acircumflex,	XK_atilde,
-	XK_adiaeresis,	XK_aring,	XK_ae,		XK_ccedilla,
-	XK_egrave,	XK_eacute,	XK_ecircumflex,	XK_ediaeresis,
-	XK_igrave,	XK_iacute,	XK_icircumflex,	XK_idiaeresis,
-	XK_eth,		XK_ntilde,	XK_ograve,	XK_oacute,
-	XK_ocircumflex,	XK_otilde,	XK_odiaeresis,	XK_division,
-	XK_oslash,	XK_ugrave,	XK_uacute,	XK_ucircumflex,
-	XK_udiaeresis,	XK_yacute,	XK_thorn,	XK_ydiaeresis
-};
-
-/*
- * Maps the AT keycodes to Linux keycodes
- */
-static unsigned char at2lnx[NUM_KEYCODES] =
-{
-	0x01,	/* KEY_Escape */	0x02,	/* KEY_1 */
-	0x03,	/* KEY_2 */		0x04,	/* KEY_3 */
-	0x05,	/* KEY_4 */		0x06,	/* KEY_5 */
-	0x07,	/* KEY_6 */		0x08,	/* KEY_7 */
-	0x09,	/* KEY_8 */		0x0a,	/* KEY_9 */
-	0x0b,	/* KEY_0 */		0x0c,	/* KEY_Minus */
-	0x0d,	/* KEY_Equal */		0x0e,	/* KEY_BackSpace */
-	0x0f,	/* KEY_Tab */		0x10,	/* KEY_Q */
-	0x11,	/* KEY_W */		0x12,	/* KEY_E */
-	0x13,	/* KEY_R */		0x14,	/* KEY_T */
-	0x15,	/* KEY_Y */		0x16,	/* KEY_U */
-	0x17,	/* KEY_I */		0x18,	/* KEY_O */
-	0x19,	/* KEY_P */		0x1a,	/* KEY_LBrace */
-	0x1b,	/* KEY_RBrace */	0x1c,	/* KEY_Enter */
-	0x1d,	/* KEY_LCtrl */		0x1e,	/* KEY_A */
-	0x1f,	/* KEY_S */		0x20,	/* KEY_D */
-	0x21,	/* KEY_F */		0x22,	/* KEY_G */
-	0x23,	/* KEY_H */		0x24,	/* KEY_J */
-	0x25,	/* KEY_K */		0x26,	/* KEY_L */
-	0x27,	/* KEY_SemiColon */	0x28,	/* KEY_Quote */
-	0x29,	/* KEY_Tilde */		0x2a,	/* KEY_ShiftL */
-	0x2b,	/* KEY_BSlash */	0x2c,	/* KEY_Z */
-	0x2d,	/* KEY_X */		0x2e,	/* KEY_C */
-	0x2f,	/* KEY_V */		0x30,	/* KEY_B */
-	0x31,	/* KEY_N */		0x32,	/* KEY_M */
-	0x33,	/* KEY_Comma */		0x34,	/* KEY_Period */
-	0x35,	/* KEY_Slash */		0x36,	/* KEY_ShiftR */
-	0x37,	/* KEY_KP_Multiply */	0x38,	/* KEY_Alt */
-	0x39,	/* KEY_Space */		0x3a,	/* KEY_CapsLock */
-	0x3b,	/* KEY_F1 */		0x3c,	/* KEY_F2 */
-	0x3d,	/* KEY_F3 */		0x3e,	/* KEY_F4 */
-	0x3f,	/* KEY_F5 */		0x40,	/* KEY_F6 */
-	0x41,	/* KEY_F7 */		0x42,	/* KEY_F8 */
-	0x43,	/* KEY_F9 */		0x44,	/* KEY_F10 */
-	0x45,	/* KEY_NumLock */	0x46,	/* KEY_ScrollLock */
-	0x47,	/* KEY_KP_7 */		0x48,	/* KEY_KP_8 */
-	0x49,	/* KEY_KP_9 */		0x4a,	/* KEY_KP_Minus */
-	0x4b,	/* KEY_KP_4 */		0x4c,	/* KEY_KP_5 */
-	0x4d,	/* KEY_KP_6 */		0x4e,	/* KEY_KP_Plus */
-	0x4f,	/* KEY_KP_1 */		0x50,	/* KEY_KP_2 */
-	0x51,	/* KEY_KP_3 */		0x52,	/* KEY_KP_0 */
-	0x53,	/* KEY_KP_Decimal */	0x54,	/* KEY_SysReqest */
-	0x00,	/* 0x55 */		0x56,	/* KEY_Less */
-	0x57,	/* KEY_F11 */		0x58,	/* KEY_F12 */
-	0x66,	/* KEY_Home */		0x67,	/* KEY_Up */
-	0x68,	/* KEY_PgUp */		0x69,	/* KEY_Left */
-	0x5d,	/* KEY_Begin */		0x6a,	/* KEY_Right */
-	0x6b,	/* KEY_End */		0x6c,	/* KEY_Down */
-	0x6d,	/* KEY_PgDown */	0x6e,	/* KEY_Insert */
-	0x6f,	/* KEY_Delete */	0x60,	/* KEY_KP_Enter */
-	0x61,	/* KEY_RCtrl */		0x77,	/* KEY_Pause */
-	0x63,	/* KEY_Print */		0x62,	/* KEY_KP_Divide */
-	0x64,	/* KEY_AltLang */	0x65,	/* KEY_Break */
-	0x00,	/* KEY_LMeta */		0x00,	/* KEY_RMeta */
-	0x7A,	/* KEY_Menu/FOCUS_PF11*/0x00,	/* 0x6e */
-	0x7B,	/* FOCUS_PF12 */	0x00,	/* 0x70 */
-	0x00,	/* 0x71 */		0x00,	/* 0x72 */
-	0x59,	/* FOCUS_PF2 */		0x78,	/* FOCUS_PF9 */
-	0x00,	/* 0x75 */		0x00,	/* 0x76 */
-	0x5A,	/* FOCUS_PF3 */		0x5B,	/* FOCUS_PF4 */
-	0x5C,	/* FOCUS_PF5 */		0x5D,	/* FOCUS_PF6 */
-	0x5E,	/* FOCUS_PF7 */		0x5F,	/* FOCUS_PF8 */
-	0x7C,	/* JAP_86 */		0x79,	/* FOCUS_PF10 */
-	0x00,	/* 0x7f */
-};
-#define NUM_AT2LNX (sizeof(at2lnx) / sizeof(at2lnx[0]))
-
-#define NUM_CUSTOMKEYS	NR_KEYS
-
-u_char SpecialServerMap[NUM_CUSTOMKEYS];
-
-static void
-readKernelMapping(KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-  KeySym        *k;
-  int           i;
-  int           maxkey;
-  static unsigned char tbl[GLYPHS_PER_KEY] =
-  {
-	0,	/* unshifted */
-	1,	/* shifted */
-	0,	/* modeswitch unshifted */
-	0	/* modeswitch shifted */
-  };
-
-  /*
-   * Read the mapping from the kernel.
-   * Since we're still using the XFree86 scancode->AT keycode mapping
-   * routines, we need to convert the AT keycodes to Linux keycodes,
-   * then translate the Linux keysyms into X keysyms.
-   *
-   * First, figure out which tables to use for the modeswitch columns
-   * above, from the XF86Config fields.
-   */
-  tbl[2] = 8;	/* alt */
-  tbl[3] = tbl[2] | 1;
-
-  if (xf86Info.kbdCustomKeycodes) {
-    k = map;
-    maxkey = NUM_CUSTOMKEYS;
-  }
-  else {
-    k = map+GLYPHS_PER_KEY;
-    maxkey = NUM_AT2LNX;
-  }
-
-  for (i = 0; i < maxkey; ++i)
-  {
-    struct kbentry kbe;
-    int j;
-
-    if (xf86Info.kbdCustomKeycodes)
-      kbe.kb_index = i;
-    else
-      kbe.kb_index = at2lnx[i];
-
-    for (j = 0; j < GLYPHS_PER_KEY; ++j, ++k)
-    {
-      unsigned short kval;
-
-      *k = NoSymbol;
-
-      kbe.kb_table = tbl[j];
-      if (
-	  (!xf86Info.kbdCustomKeycodes && kbe.kb_index == 0) ||
-	  ioctl(xf86Info.consoleFd, KDGKBENT, &kbe))
-	continue;
-
-      kval = KVAL(kbe.kb_value);
-      switch (KTYP(kbe.kb_value))
-      {
-      case KT_LATIN:
-      case KT_LETTER:
-	*k = linux_to_x[kval];
-	break;
-
-      case KT_FN:
-	if (kval <= 19)
-	  *k = XK_F1 + kval;
-	else switch (kbe.kb_value)
-	{
-	case K_FIND:
-	  *k = XK_Home; /* or XK_Find */
-	  break;
-	case K_INSERT:
-	  *k = XK_Insert;
-	  break;
-	case K_REMOVE:
-	  *k = XK_Delete;
-	  break;
-	case K_SELECT:
-	  *k = XK_End; /* or XK_Select */
-	  break;
-	case K_PGUP:
-	  *k = XK_Prior;
-	  break;
-	case K_PGDN:
-	  *k = XK_Next;
-	  break;
-	case K_HELP:
-	  *k = XK_Help;
-	  break;
-	case K_DO:
-	  *k = XK_Execute;
-	  break;
-	case K_PAUSE:
-	  *k = XK_Pause;
-	  break;
-	case K_MACRO:
-	  *k = XK_Menu;
-	  break;
-	default:
-	  break;
-	}
-	break;
-
-      case KT_SPEC:
-	switch (kbe.kb_value)
-	{
-	case K_ENTER:
-	  *k = XK_Return;
-	  break;
-	case K_BREAK:
-	  *k = XK_Break;
-	  break;
-	case K_CAPS:
-	  *k = XK_Caps_Lock;
-	  break;
-	case K_NUM:
-	  *k = XK_Num_Lock;
-	  break;
-	case K_HOLD:
-	  *k = XK_Scroll_Lock;
-	  break;
-	case K_COMPOSE:
-          *k = XK_Multi_key;
-	  break;
-	default:
-	  break;
-	}
-	break;
-
-      case KT_PAD:
-	switch (kbe.kb_value)
-	{
-	case K_PPLUS:
-	  *k = XK_KP_Add;
-	  break;
-	case K_PMINUS:
-	  *k = XK_KP_Subtract;
-	  break;
-	case K_PSTAR:
-	  *k = XK_KP_Multiply;
-	  break;
-	case K_PSLASH:
-	  *k = XK_KP_Divide;
-	  break;
-	case K_PENTER:
-	  *k = XK_KP_Enter;
-	  break;
-	case K_PCOMMA:
-	  *k = XK_KP_Separator;
-	  break;
-	case K_PDOT:
-	  *k = XK_KP_Decimal;
-	  break;
-	case K_PPLUSMINUS:
-	  *k = XK_KP_Subtract;
-	  break;
-	default:
-	  if (kval <= 9)
-	    *k = XK_KP_0 + kval;
-	  break;
-	}
-	break;
-
-      /*
-       * KT_DEAD keys are for accelerated diacritical creation.
-       */
-      case KT_DEAD:
-	switch (kbe.kb_value)
-	  {
-	  case K_DGRAVE:
-	    *k = XK_dead_grave;
-	    break;
-	  case K_DACUTE:
-	    *k = XK_dead_acute;
-	    break;
-	  case K_DCIRCM:
-	    *k = XK_dead_circumflex;
-	    break;
-	  case K_DTILDE:
-	    *k = XK_dead_tilde;
-	    break;
-	  case K_DDIERE:
-	    *k = XK_dead_diaeresis;
-	    break;
-	  }
-	break;
-
-      case KT_CUR:
-	switch (kbe.kb_value)
-	{
-	case K_DOWN:
-	  *k = XK_Down;
-	  break;
-	case K_LEFT:
-	  *k = XK_Left;
-	  break;
-	case K_RIGHT:
-	  *k = XK_Right;
-	  break;
-	case K_UP:
-	  *k = XK_Up;
-	  break;
-	}
-	break;
-
-      case KT_SHIFT:
-	switch (kbe.kb_value)
-	{
-	case K_ALTGR:
-	  *k = XK_Alt_R;
-	  break;
-	case K_ALT:
-	  *k = (kbe.kb_index == 0x64 ?
-		XK_Alt_R : XK_Alt_L);
-	  break;
-	case K_CTRL:
-	  *k = (kbe.kb_index == 0x61 ?
-		XK_Control_R : XK_Control_L);
-	  break;
-        case K_CTRLL:
-	  *k = XK_Control_L;
-	  break;
-        case K_CTRLR:
-	  *k = XK_Control_R;
-	  break;
-	case K_SHIFT:
-	  *k = (kbe.kb_index == 0x36 ?
-		XK_Shift_R : XK_Shift_L);
-	  break;
-        case K_SHIFTL:
-	  *k = XK_Shift_L;
-	  break;
-        case K_SHIFTR:
-	  *k = XK_Shift_R;
-	  break;
-	default:
-	  break;
-	}
-	break;
-
-      /*
-       * KT_ASCII keys accumulate a 3 digit decimal number that gets
-       * emitted when the shift state changes. We can't emulate that.
-       */
-      case KT_ASCII:
-	break;
-
-      case KT_LOCK:
-	if (kbe.kb_value == K_SHIFTLOCK)
-	  *k = XK_Shift_Lock;
-	break;
-
-      default:
-	break;
-      }
-    }
-
-    if (k[-1] == k[-2]) k[-1] = NoSymbol;
-    if (k[-2] == k[-3]) k[-2] = NoSymbol;
-    if (k[-3] == k[-4]) k[-3] = NoSymbol;
-    if (k[-4] == k[-2] && k[-3] == k[-1]) k[-2] = k[-1] = NoSymbol;
-    if (k[-1] == k[-4] && k[-2] == k[-3] && k[-2] == NoSymbol) k[-1] =NoSymbol;
-  }
-
-  if (!xf86Info.kbdCustomKeycodes)
-    return;
-
-  /*
-   * Find the Mapping for the special server functions
-   */
-  for (i = 0; i < NUM_CUSTOMKEYS; ++i) {
-    struct kbentry kbe;
-    int special = 0;
-
-    kbe.kb_index = i;
-    kbe.kb_table = 0; /* Plain map */
-    if (!ioctl(xf86Info.consoleFd, KDGKBENT, &kbe))
-      switch (kbe.kb_value) {
-	case K(KT_LATIN,0x7f):	/* This catches DEL too... But who cares? */
-	  special = KEY_BackSpace;
-	  break;
-	case K_PMINUS:
-	  special = KEY_KP_Minus;
-	  break;
-	case K_PPLUS:
-	  special = KEY_KP_Plus;
-	  break;
-	case K_F1:
-	  special = KEY_F1;
-	  break;
-	case K_F2:
-	  special = KEY_F2;
-	  break;
-	case K_F3:
-	  special = KEY_F3;
-	  break;
-	case K_F4:
-	  special = KEY_F4;
-	  break;
-	case K_F5:
-	  special = KEY_F5;
-	  break;
-	case K_F6:
-	  special = KEY_F6;
-	  break;
-	case K_F7:
-	  special = KEY_F7;
-	  break;
-	case K_F8:
-	  special = KEY_F8;
-	  break;
-	case K_F9:
-	  special = KEY_F9;
-	  break;
-	case K_F10:
-	  special = KEY_F10;
-	  break;
-	case K_F11:
-	  special = KEY_F11;
-	  break;
-	case K_F12:
-	  special = KEY_F12;
-	  break;
-	case K_ALT:
-	  special = KEY_Alt;
-	  break;
-	case K_ALTGR:
-	  special = KEY_AltLang;
-	  break;
-	case K_CONS:
-	  special = KEY_SysReqest;
-	  break;
-      }
-    SpecialServerMap[i] = special;
-  }
-}
diff --git a/hw/xfree86/common/xf86KbdMach.c b/hw/xfree86/common/xf86KbdMach.c
deleted file mode 100644
index 82e3c72..0000000
--- a/hw/xfree86/common/xf86KbdMach.c
+++ /dev/null
@@ -1,316 +0,0 @@
-/*
- *****************************************************************************
- * HISTORY
- * Log:	xf86KbdMach.c,v
- * Revision 2.1.2.1  92/06/25  10:32:08  moore
- * 	Incorporate the Elliot Dresselhaus's, Ernest Hua's and local changes
- * 	to run Thomas Roell's I386 color X11R5.  Original code only worked
- * 	with SCO Unix.  New code works with 2.5 and 3.0 Mach
- * 	[92/06/24            rvb]
- * 
- * 	EndLog
- * 
- *****************************************************************************
- */
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium: xf86KbdMach.c /main/9 1996/02/21 17:38:43 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "atKeynames.h"
-#include "xf86Config.h"
-
-#include "xf86Keymap.h"
-
-static KeySym ascii_to_x[256] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
-	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
-	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
-	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
-	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
-	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
-	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
-	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
-	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
-	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
-	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
-	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
-	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
-	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
-	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
-	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
-	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
-	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
-	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
-      };
-
-/*
- * LegalModifier --
- *      determine whether a key is a legal modifier key, i.e send a
- *      press/release sequence.
- */
-
-/*ARGSUSED*/
-Bool
-LegalModifier(key, pDev)
-     unsigned int  key;
-     DevicePtr  pDev;
-{
-  return (TRUE);
-}
-
-
-      
-/*
- * xf86KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-void
-xf86KbdGetMapping (pKeySyms, pModMap)
-     KeySymsPtr pKeySyms;
-     CARD8      *pModMap;
-{
-  KeySym        *k;
-  struct	kbentry kbe;
-  char          type;
-  int           i, j;
-  
-  for (i = 0; i < NUMKEYS; i++)
-    {
-      static int states[] = { NORM_STATE, SHIFT_STATE, ALT_STATE, SHIFT_ALT };
-      int j;
-
-      k = &map[i*4];
-      kbe.kb_index = i;
-	
-      for (j = 0; j < 4; j++)
-	{
-	  kbe.kb_state = states[j];
-
-	  if (ioctl (xf86Info.consoleFd, KDGKBENT, &kbe) != -1)
-	    continue;
-      
-	  if (kbe.kb_value [0] == K_SCAN)
-	    {
-	      int keycode = -1;
-	      switch (kbe.kb_value [1])
-		{
-		case K_CTLSC: keycode = XK_Control_L; break;
-		case K_LSHSC: keycode = XK_Shift_L; break;
-		case K_RSHSC: keycode = XK_Shift_R; break;
-		case K_ALTSC: keycode = XK_Alt_L; break;
-		case K_CLCKSC: keycode = XK_Caps_Lock; break;
-		case K_NLCKSC: keycode = XK_Num_Lock; break;
-		default: break;
-		}
-	      if (keycode > 0)
-		k[j] = keycode;
-	    }
-	  else if (kbe.kb_value[1] != NC)
-	    {
-	      /* How to handle multiple characters?
-	         Ignore them for now. */
-	    }
-	  else
-	    {
-	      k[j] = ascii_to_x[kbe.kb_value[0]];
-	    }
-	}
-    }
-
-  /*
-   * Apply the special key mapping specified in XF86Config 
-   */
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4) {
-    switch (k[0]) {
-      case XK_Alt_L:
-        j = K_INDEX_LEFTALT;
-        break;
-      case XK_Alt_R:
-        j = K_INDEX_RIGHTALT;
-        break;
-      case XK_Scroll_Lock:
-        j = K_INDEX_SCROLLLOCK;
-        break;
-      case XK_Control_R:
-        j = K_INDEX_RIGHTCTL;
-        break;
-      default:
-        j = -1;
-    }
-    if (j >= 0)
-      switch (xf86Info.specialKeyMap[j]) {
-        case KM_META:
-          if (k[0] == XK_Alt_R)
-            k[1] = XK_Meta_R;
-          else {
-            k[0] = XK_Alt_L;
-            k[1] = XK_Meta_L;
-          }
-          break;
-        case KM_COMPOSE:
-          k[0] = XK_Multi_key;
-          break;
-        case KM_MODESHIFT:
-          k[0] = XK_Mode_switch;
-          k[1] = NoSymbol;
-          break;
-        case KM_MODELOCK:
-          k[0] = XK_Mode_switch;
-          k[1] = XF86XK_ModeLock;
-          break;
-        case KM_SCROLLLOCK:
-          k[0] = XK_Scroll_Lock;
-          break;
-        case KM_CONTROL:
-          k[0] = XK_Control_R;
-          break;
-      }
-  }
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      if (!xf86Info.serverNumLock) pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  xf86Info.kbdType =
-    ioctl(xf86Info.kbdFd, KDGKBDTYPE, &type) != -1 ? type : KB_VANILLAKB;
-
-  pKeySyms->map        = map;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  if (xf86Info.serverNumLock)
-    pKeySyms->maxKeyCode = MAX_KEYCODE; 
-  else
-    pKeySyms->maxKeyCode = MAX_STD_KEYCODE;
-
-}
diff --git a/hw/xfree86/os-support/linux/lnx_kbd.c b/hw/xfree86/os-support/linux/lnx_kbd.c
deleted file mode 100644
index a4890d2..0000000
--- a/hw/xfree86/os-support/linux/lnx_kbd.c
+++ /dev/null
@@ -1,530 +0,0 @@
-
-/*
- * Copyright (c) 2002 by The XFree86 Project, Inc.
- * Author: Ivan Pascal.
- *
- * Based on the code from lnx_io.c which is
- * Copyright 1992 by Orest Zborowski <obz at Kodak.com>
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- */
-
-#define NEED_EVENTS
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-#include "xf86Xinput.h"
-#include "xf86OSKbd.h"
-#include "atKeynames.h"
-#if defined(DO_OS_FONTRESTORE)
-#include "lnx.h"
-#endif
-#include "lnx_kbd.h"
-
-#define KBC_TIMEOUT 250        /* Timeout in ms for sending to keyboard controller */
-
-static KbdProtocolRec protocols[] = {
-   {"standard", PROT_STD },
-   { NULL, PROT_UNKNOWN_KBD }
-};
-
-extern Bool VTSwitchEnabled;
-#ifdef USE_VT_SYSREQ
-extern Bool VTSysreqToggle;
-#endif
-
-static void
-SoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
-{
-	if (loudness && pitch)
-	{
-		ioctl(pInfo->fd, KDMKTONE,
-		      ((1193190 / pitch) & 0xffff) |
-		      (((unsigned long)duration *
-			loudness / 50) << 16));
-	}
-}
-
-static void
-SetKbdLeds(InputInfoPtr pInfo, int leds)
-{
-    int real_leds = 0;
-
-#if defined (__sparc__)
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    if (pKbd->sunKbd) {
-  	if (leds & 0x08) real_leds |= XLED1;
-  	if (leds & 0x04) real_leds |= XLED3;
-  	if (leds & 0x02) real_leds |= XLED4;
-  	if (leds & 0x01) real_leds |= XLED2;
-        leds = real_leds;
-        real_leds = 0;
-    }
-#endif /* defined (__sparc__) */
-#ifdef LED_CAP
-    if (leds & XLED1)  real_leds |= LED_CAP;
-    if (leds & XLED2)  real_leds |= LED_NUM;
-    if (leds & XLED3)  real_leds |= LED_SCR;
-#ifdef LED_COMP
-    if (leds & XLED4)  real_leds |= LED_COMP;
-#else
-    if (leds & XLED4)  real_leds |= LED_SCR;
-#endif
-#endif
-    ioctl(pInfo->fd, KDSETLED, real_leds);
-}
-
-static int
-GetKbdLeds(InputInfoPtr pInfo)
-{
-    int real_leds, leds = 0;
-
-    ioctl(pInfo->fd, KDGETLED, &real_leds);
-
-    if (real_leds & LED_CAP) leds |= XLED1;
-    if (real_leds & LED_NUM) leds |= XLED2;
-    if (real_leds & LED_SCR) leds |= XLED3;
-
-    return(leds);
-}
-
-static int
-KDKBDREP_ioctl_ok(int rate, int delay) {
-#if defined(KDKBDREP) && !defined(__sparc__)
-     /* This ioctl is defined in <linux/kd.h> but is not
-	implemented anywhere - must be in some m68k patches. */
-   struct kbd_repeat kbdrep_s;
-
-   /* don't change, just test */
-   kbdrep_s.LNX_KBD_PERIOD_NAME = -1;
-   kbdrep_s.delay = -1;
-   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
-       return 0;
-   }
-
-   /* do the change */
-   if (rate == 0)				/* switch repeat off */
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 0;
-   else
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 10000 / rate; /* convert cps to msec */
-   if (kbdrep_s.LNX_KBD_PERIOD_NAME < 1)
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 1;
-   kbdrep_s.delay = delay;
-   if (kbdrep_s.delay < 1)
-     kbdrep_s.delay = 1;
-   
-   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
-       return 0;
-   }
-
-   return 1;			/* success! */
-#else /* no KDKBDREP */
-   return 0;
-#endif /* KDKBDREP */
-}
-
-static int
-KIOCSRATE_ioctl_ok(int rate, int delay) {
-#ifdef KIOCSRATE
-   struct kbd_rate kbdrate_s;
-   int fd;
-
-   fd = open("/dev/kbd", O_RDONLY);
-   if (fd == -1) 
-     return 0;   
-
-   kbdrate_s.rate = (rate + 5) / 10;  /* must be integer, so round up */
-   kbdrate_s.delay = delay * HZ / 1000;  /* convert ms to Hz */
-   if (kbdrate_s.rate > 50)
-     kbdrate_s.rate = 50;
-
-   if (ioctl( fd, KIOCSRATE, &kbdrate_s )) {
-       return 0;
-   }
-
-   close( fd );
-
-   return 1;
-#else /* no KIOCSRATE */
-   return 0;
-#endif /* KIOCSRATE */
-}
-
-#undef rate
-
-static void
-SetKbdRepeat(InputInfoPtr pInfo, char rad)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  int i;
-  int timeout;
-  int         value = 0x7f;    /* Maximum delay with slowest rate */
-
-#ifdef __sparc__
-  int         rate  = 500;     /* Default rate */
-  int         delay = 200;     /* Default delay */
-#else
-  int         rate  = 300;     /* Default rate */
-  int         delay = 250;     /* Default delay */
-#endif
-
-  static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
-			       133, 120, 109, 100, 92, 86, 80, 75, 67,
-			       60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
-			       25, 23, 21, 20 };
-#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
-
-  static int valid_delays[] = { 250, 500, 750, 1000 };
-#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
-
-  if (pKbd->rate >= 0) 
-    rate = pKbd->rate * 10;
-  if (pKbd->delay >= 0)
-    delay = pKbd->delay;
-
-  if(KDKBDREP_ioctl_ok(rate, delay)) 	/* m68k? */
-    return;
-
-  if(KIOCSRATE_ioctl_ok(rate, delay))	/* sparc? */
-    return;
-
-  if (xf86IsPc98())
-    return;
-
-#if defined(__alpha__) || defined (__i386__) || defined(__ia64__)
-
-  if (!xorgHWAccess) {
-      if (xf86EnableIO())
-	  xorgHWAccess = TRUE;
-      else 
-	  return;
-  }
-      
-  /* The ioport way */
-
-  for (i = 0; i < RATE_COUNT; i++)
-    if (rate >= valid_rates[i]) {
-      value &= 0x60;
-      value |= i;
-      break;
-    }
-
-  for (i = 0; i < DELAY_COUNT; i++)
-    if (delay <= valid_delays[i]) {
-      value &= 0x1f;
-      value |= i << 5;
-      break;
-    }
-
-  timeout = KBC_TIMEOUT;
-  while (((inb(0x64) & 2) == 2) && --timeout)
-       usleep(1000); /* wait */
-
-  if (timeout == 0)
-      return;
-
-  outb(0x60, 0xf3);             /* set typematic rate */
-  while (((inb(0x64) & 2) == 2) && --timeout)
-       usleep(1000); /* wait */
-
-  usleep(10000);
-  outb(0x60, value);
-
-#endif /* __alpha__ || __i386__ || __ia64__ */
-}
-
-typedef struct {
-   int kbdtrans;
-   struct termios kbdtty;
-} LnxKbdPrivRec, *LnxKbdPrivPtr;
-
-static int
-KbdInit(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    LnxKbdPrivPtr priv = (LnxKbdPrivPtr) pKbd->private;
-
-    if (pKbd->isConsole) {
-        ioctl (pInfo->fd, KDGKBMODE, &(priv->kbdtrans));
-        tcgetattr (pInfo->fd, &(priv->kbdtty));
-    }
-    if (!pKbd->CustomKeycodes) {
-        pKbd->RemapScanCode = ATScancode;
-    }
-
-    return Success;
-}
-
-static int
-KbdOn(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    LnxKbdPrivPtr priv = (LnxKbdPrivPtr) pKbd->private;
-    struct termios nTty;
-
-    if (pKbd->isConsole) {
-	if (pKbd->CustomKeycodes)
-	    ioctl(pInfo->fd, KDSKBMODE, K_MEDIUMRAW);
-	else
-	    ioctl(pInfo->fd, KDSKBMODE, K_RAW);
-
-	nTty = priv->kbdtty;
-	nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-	nTty.c_oflag = 0;
-	nTty.c_cflag = CREAD | CS8;
-	nTty.c_lflag = 0;
-	nTty.c_cc[VTIME]=0;
-	nTty.c_cc[VMIN]=1;
-	cfsetispeed(&nTty, 9600);
-	cfsetospeed(&nTty, 9600);
-	tcsetattr(pInfo->fd, TCSANOW, &nTty);
-    }
-    return Success;
-}
-
-static int
-KbdOff(InputInfoPtr pInfo, int what)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    LnxKbdPrivPtr priv = (LnxKbdPrivPtr) pKbd->private;
-
-    if (pKbd->isConsole) {
-	ioctl(pInfo->fd, KDSKBMODE, priv->kbdtrans);
-	tcsetattr(pInfo->fd, TCSANOW, &(priv->kbdtty));
-    }
-    return Success;
-}
-
-static int
-GetSpecialKey(InputInfoPtr pInfo, int scanCode)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-  int specialkey = scanCode;
-
-#if defined (__sparc__)
-  if (pKbd->sunKbd) {
-      switch (scanCode) {
-          case 0x2b: specialkey = KEY_BackSpace; break;
-          case 0x47: specialkey = KEY_KP_Minus; break;
-          case 0x7d: specialkey = KEY_KP_Plus; break;
-          /* XXX needs cases for KEY_KP_Divide and KEY_KP_Multiply */
-          case 0x05: specialkey = KEY_F1; break;
-          case 0x06: specialkey = KEY_F2; break;
-          case 0x08: specialkey = KEY_F3; break;
-          case 0x0a: specialkey = KEY_F4; break;
-          case 0x0c: specialkey = KEY_F5; break;
-          case 0x0e: specialkey = KEY_F6; break;
-          case 0x10: specialkey = KEY_F7; break;
-          case 0x11: specialkey = KEY_F8; break;
-          case 0x12: specialkey = KEY_F9; break;
-          case 0x07: specialkey = KEY_F10; break;
-          case 0x09: specialkey = KEY_F11; break;
-          case 0x0b: specialkey = KEY_F12; break;
-          default: specialkey = 0; break;
-      }
-      return specialkey;
-  }
-#endif
-
-  if (pKbd->CustomKeycodes) {
-      specialkey = pKbd->specialMap->map[scanCode];
-  }
-  return specialkey;
-}
-
-#define ModifierSet(k) ((modifiers & (k)) == (k))
-
-static
-Bool SpecialKey(InputInfoPtr pInfo, int key, Bool down, int modifiers)
-{
-  KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-
-  if(!pKbd->vtSwitchSupported)
-      return FALSE;
-
-  if ((ModifierSet(ControlMask | AltMask)) ||
-      (ModifierSet(ControlMask | AltLangMask))) {
-      if (VTSwitchEnabled && !xf86Info.vtSysreq && !xf86Info.dontVTSwitch) {
-          switch (key) {
-             case KEY_F1:
-             case KEY_F2:
-             case KEY_F3:
-             case KEY_F4:
-             case KEY_F5:
-             case KEY_F6:
-             case KEY_F7:
-             case KEY_F8:
-             case KEY_F9:
-             case KEY_F10:
-                  if (down) {
-                    ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F1 + 1);
-                    return TRUE;
-                  }
-             case KEY_F11:
-             case KEY_F12:
-                  if (down) {
-                    ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F11 + 11);
-                    return TRUE;
-                  }
-         }
-      }
-  }
-#ifdef USE_VT_SYSREQ
-    if (VTSwitchEnabled && xf86Info.vtSysreq && !xf86Info.dontVTSwitch) {
-        switch (key) {
-            case KEY_F1:
-            case KEY_F2:
-            case KEY_F3:
-            case KEY_F4:
-            case KEY_F5:
-            case KEY_F6:
-            case KEY_F7:
-            case KEY_F8:
-            case KEY_F9:
-            case KEY_F10:
-                 if (VTSysreqToggle && down) {
-                     ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F1 + 1);
-                     VTSysreqToggle = FALSE;
-                     return TRUE;
-                 }
-                 break;
-            case KEY_F11:
-            case KEY_F12:
-                 if (VTSysreqToggle && down) {
-                     ioctl(xf86Info.consoleFd, VT_ACTIVATE, key - KEY_F11 + 11);
-                     VTSysreqToggle = FALSE;
-                     return TRUE;
-                 }
-                 break;
-            /* Ignore these keys -- ie don't let them cancel an alt-sysreq */
-            case KEY_Alt:
-            case KEY_AltLang:
-                 break;
-            case KEY_SysReqest:
-                 if ((ModifierSet(AltMask) || ModifierSet(AltLangMask)) && down)
-                     VTSysreqToggle = TRUE;
-                 break;
-             default:
-                 /*
-                  * We only land here when Alt-SysReq is followed by a
-                  * non-switching key.
-                  */
-                 if (VTSysreqToggle)
-                     VTSysreqToggle = FALSE;
-        }
-    }
-#endif /* USE_VT_SYSREQ */
-    return FALSE;
-} 
-
-static void
-stdReadInput(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    unsigned char rBuf[64];
-    int nBytes, i;
-    if ((nBytes = read( pInfo->fd, (char *)rBuf, sizeof(rBuf))) > 0) {
-       for (i = 0; i < nBytes; i++)
-           pKbd->PostEvent(pInfo, rBuf[i] & 0x7f,
-                           rBuf[i] & 0x80 ? FALSE : TRUE);
-       }
-}
-
-static Bool
-OpenKeyboard(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
-    int i;
-    KbdProtocolId prot = PROT_UNKNOWN_KBD;
-    char *s;
-
-    s = xf86SetStrOption(pInfo->options, "Protocol", NULL);
-    for (i = 0; protocols[i].name; i++) {
-        if (xf86NameCmp(s, protocols[i].name) == 0) {
-           prot = protocols[i].id;
-           break;
-        }
-    }
-
-    switch (prot) {
-        case PROT_STD:
-           pInfo->read_input = stdReadInput;
-           break;
-        default:
-           xf86Msg(X_ERROR,"\"%s\" is not a valid keyboard protocol name\n", s);
-           xfree(s);
-           return FALSE;
-    }
-
-    xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, s);
-    xfree(s);
-
-    s = xf86SetStrOption(pInfo->options, "Device", NULL);
-    if (s == NULL) {
-       pInfo->fd = xf86Info.consoleFd;
-       pKbd->isConsole = TRUE;
-    } else {
-       pInfo->fd = open(s, O_RDONLY | O_NONBLOCK | O_EXCL);
-       if (pInfo->fd == -1) {
-           xf86Msg(X_ERROR, "%s: cannot open \"%s\"\n", pInfo->name, s);
-           xfree(s);
-           return FALSE;
-       }
-       pKbd->isConsole = FALSE;
-       xfree(s);
-    }
-
-    if (pKbd->isConsole)
-         pKbd->vtSwitchSupported = TRUE;
-
-    return TRUE;
-}
-
-_X_EXPORT Bool
-xf86OSKbdPreInit(InputInfoPtr pInfo)
-{
-    KbdDevPtr pKbd = pInfo->private;
-
-    pKbd->KbdInit       = KbdInit;
-    pKbd->KbdOn         = KbdOn;
-    pKbd->KbdOff        = KbdOff;
-    pKbd->Bell          = SoundBell;
-    pKbd->SetLeds       = SetKbdLeds;
-    pKbd->GetLeds       = GetKbdLeds;
-    pKbd->SetKbdRepeat  = SetKbdRepeat;
-    pKbd->KbdGetMapping = KbdGetMapping;
-    pKbd->SpecialKey    = SpecialKey;
-
-    pKbd->RemapScanCode = NULL;
-    pKbd->GetSpecialKey = GetSpecialKey;
-
-    pKbd->OpenKeyboard = OpenKeyboard;
-    pKbd->vtSwitchSupported = FALSE;
-
-    pKbd->private = xcalloc(sizeof(LnxKbdPrivRec), 1);
-    if (pKbd->private == NULL) {
-       xf86Msg(X_ERROR,"can't allocate keyboard OS private data\n");
-       return FALSE;
-    }
-
-#if defined(__powerpc__)
-  {
-    FILE *f;
-    f = fopen("/proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes","r");
-    if (f) {
-        if (fgetc(f) == '0')
-            pKbd->CustomKeycodes = TRUE;
-        fclose(f);
-    }
-  }
-#endif
-    return TRUE;
-}
diff --git a/hw/xfree86/parser/Keyboard.c b/hw/xfree86/parser/Keyboard.c
deleted file mode 100644
index 9749a1a..0000000
--- a/hw/xfree86/parser/Keyboard.c
+++ /dev/null
@@ -1,308 +0,0 @@
-/* 
- * 
- * Copyright (c) 1997  Metro Link Incorporated
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- * 
- * Except as contained in this notice, the name of the Metro Link shall not be
- * used in advertising or otherwise to promote the sale, use or other dealings
- * in this Software without prior written authorization from Metro Link.
- * 
- */
-/*
- * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-
-/* View/edit this file with tab stops set to 4 */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86Parser.h"
-#include "xf86tokens.h"
-#include "Configint.h"
-#include "ctype.h"
-
-extern LexRec val;
-
-static xf86ConfigSymTabRec KeyboardTab[] =
-{
-	{ENDSECTION, "endsection"},
-	{KPROTOCOL, "protocol"},
-	{AUTOREPEAT, "autorepeat"},
-	{XLEDS, "xleds"},
-	{PANIX106, "panix106"},
-	{XKBKEYMAP, "xkbkeymap"},
-	{XKBCOMPAT, "xkbcompat"},
-	{XKBTYPES, "xkbtypes"},
-	{XKBKEYCODES, "xkbkeycodes"},
-	{XKBGEOMETRY, "xkbgeometry"},
-	{XKBSYMBOLS, "xkbsymbols"},
-	{XKBDISABLE, "xkbdisable"},
-	{XKBRULES, "xkbrules"},
-	{XKBMODEL, "xkbmodel"},
-	{XKBLAYOUT, "xkblayout"},
-	{XKBVARIANT, "xkbvariant"},
-	{XKBOPTIONS, "xkboptions"},
-	/* The next two have become ServerFlags options */
-	{VTINIT, "vtinit"},
-	{VTSYSREQ, "vtsysreq"},
-	/* Obsolete keywords */
-	{SERVERNUM, "servernumlock"},
-	{LEFTALT, "leftalt"},
-	{RIGHTALT, "rightalt"},
-	{RIGHTALT, "altgr"},
-	{SCROLLLOCK_TOK, "scrolllock"},
-	{RIGHTCTL, "rightctl"},
-	{-1, ""},
-};
-
-/* Obsolete */
-static xf86ConfigSymTabRec KeyMapTab[] =
-{
-	{CONF_KM_META, "meta"},
-	{CONF_KM_COMPOSE, "compose"},
-	{CONF_KM_MODESHIFT, "modeshift"},
-	{CONF_KM_MODELOCK, "modelock"},
-	{CONF_KM_SCROLLLOCK, "scrolllock"},
-	{CONF_KM_CONTROL, "control"},
-	{-1, ""},
-};
-
-#define CLEANUP xf86freeInputList
-
-XF86ConfInputPtr
-xf86parseKeyboardSection (void)
-{
-	char *s, *s1, *s2;
-	int l;
-	int token, ntoken;
-	parsePrologue (XF86ConfInputPtr, XF86ConfInputRec)
-
-	while ((token = xf86getToken (KeyboardTab)) != ENDSECTION)
-	{
-		switch (token)
-		{
-		case COMMENT:
-			ptr->inp_comment = xf86addComment(ptr->inp_comment, val.str);
-			break;
-		case KPROTOCOL:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "Protocol");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-							       xf86configStrdup("Protocol"),
-							       val.str);
-			break;
-		case AUTOREPEAT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != NUMBER)
-				Error (AUTOREPEAT_MSG, NULL);
-			s1 = xf86uLongToString(val.num);
-			if (xf86getSubToken (&(ptr->inp_comment)) != NUMBER) {
-				xf86conffree(s1);
-				Error (AUTOREPEAT_MSG, NULL);
-			}
-			s2 = xf86uLongToString(val.num);
-			l = strlen(s1) + 1 + strlen(s2) + 1;
-			s = xf86confmalloc(l);
-			sprintf(s, "%s %s", s1, s2);
-			xf86conffree(s1);
-			xf86conffree(s2);
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-							       xf86configStrdup("AutoRepeat"), s);
-			break;
-		case XLEDS:
-			if (xf86getSubToken (&(ptr->inp_comment)) != NUMBER)
-				Error (XLEDS_MSG, NULL);
-			s = xf86uLongToString(val.num);
-			l = strlen(s) + 1;
-			while ((token = xf86getSubToken (&(ptr->inp_comment))) == NUMBER)
-			{
-				s1 = xf86uLongToString(val.num);
-				l += (1 + strlen(s1));
-				s = xf86confrealloc(s, l);
-				strcat(s, " ");
-				strcat(s, s1);
-				xf86conffree(s1);
-			}
-			xf86unGetToken (token);
-			xf86conffree(s);
-			break;
-		case SERVERNUM:
-			xf86parseWarning(OBSOLETE_MSG, xf86tokenString());
-			break;
-		case LEFTALT:
-		case RIGHTALT:
-		case SCROLLLOCK_TOK:
-		case RIGHTCTL:
-			xf86parseWarning(OBSOLETE_MSG, xf86tokenString());
-				break;
-			ntoken = xf86getToken (KeyMapTab);
-			switch (ntoken)
-			{
-			case EOF_TOKEN:
-				xf86parseError (UNEXPECTED_EOF_MSG);
-				CLEANUP (ptr);
-				return (NULL);
-				break;
-
-			default:
-				Error (INVALID_KEYWORD_MSG, xf86tokenString ());
-				break;
-			}
-			break;
-		case VTINIT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "VTInit");
-			xf86parseWarning(MOVED_TO_FLAGS_MSG, "VTInit");
-			break;
-		case VTSYSREQ:
-			xf86parseWarning(MOVED_TO_FLAGS_MSG, "VTSysReq");
-			break;
-		case XKBDISABLE:
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbDisable"),
-												NULL);
-			break;
-		case XKBKEYMAP:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBKeymap");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbKeymap"),
-												val.str);
-			break;
-		case XKBCOMPAT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBCompat");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbCompat"),
-												val.str);
-			break;
-		case XKBTYPES:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBTypes");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbTypes"),
-												val.str);
-			break;
-		case XKBKEYCODES:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBKeycodes");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbKeycodes"),
-												val.str);
-			break;
-		case XKBGEOMETRY:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBGeometry");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbGeometry"),
-												val.str);
-			break;
-		case XKBSYMBOLS:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBSymbols");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbSymbols"),
-												val.str);
-			break;
-		case XKBRULES:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBRules");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbRules"),
-												val.str);
-			break;
-		case XKBMODEL:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBModel");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbModel"),
-												val.str);
-			break;
-		case XKBLAYOUT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBLayout");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbLayout"),
-												val.str);
-			break;
-		case XKBVARIANT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBVariant");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbVariant"),
-												val.str);
-			break;
-		case XKBOPTIONS:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBOptions");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbOptions"),
-												val.str);
-			break;
-		case PANIX106:
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("Panix106"), NULL);
-			break;
-		case EOF_TOKEN:
-			Error (UNEXPECTED_EOF_MSG, NULL);
-			break;
-		default:
-			Error (INVALID_KEYWORD_MSG, xf86tokenString ());
-			break;
-		}
-	}
-
-	ptr->inp_identifier = xf86configStrdup(CONF_IMPLICIT_KEYBOARD);
-	ptr->inp_driver = xf86configStrdup("keyboard");
-	ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-										xf86configStrdup("CoreKeyboard"), NULL);
-
-#ifdef DEBUG
-	printf ("Keyboard section parsed\n");
-#endif
-
-	return ptr;
-}
-
diff-tree 7465010d59ec435bd00b738f0cef766b352dc7eb (from parents)
Merge: 1d31ed778284082e1060bff63317c94581d9eb9b 0aaac95b0d12089b256c97f6ff955c8c229ae095
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 21 19:05:41 2006 -0400

    Merge branch 'master' of git+ssh://git.freedesktop.org/git/xorg/xserver into input-hotplug

diff-tree 1d31ed778284082e1060bff63317c94581d9eb9b (from 3eeb62e8f587732e6b433c2b9c6879eb26a3f1b4)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 21 19:02:52 2006 -0400

    xephyr: load keysyms at init, not enable
    Load keysyms at init time, not enable, so we don't get the wrong map width.

diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index 6a337bc..86a072d 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -907,9 +907,17 @@ EphyrKeyboardInit (KdKeyboardInfo *ki)
 {
   ki->driverPrivate = (EphyrKbdPrivate *)
                        xcalloc(sizeof(EphyrKbdPrivate), 1);
-  /* FIXME blah blah overrunning memory blah blah */
-  ki->minScanCode = ki->keySyms.minKeyCode = 0;
-  ki->maxScanCode = ki->keySyms.maxKeyCode = 255;
+  hostx_load_keymap();
+  if (!ephyrKeySyms.map) {
+      ErrorF("Couldn't load keymap from host\n");
+      return BadAlloc;
+  }
+  ki->keySyms.minKeyCode = ephyrKeySyms.minKeyCode;
+  ki->keySyms.maxKeyCode = ephyrKeySyms.maxKeyCode;
+  ki->minScanCode = ki->keySyms.minKeyCode;
+  ki->maxScanCode = ki->keySyms.maxKeyCode;
+  ki->keySyms.mapWidth = ephyrKeySyms.mapWidth;
+  ki->keySyms.map = ephyrKeySyms.map;
   ephyrKbd = ki;
   return Success;
 }
@@ -917,17 +925,6 @@ EphyrKeyboardInit (KdKeyboardInfo *ki)
 static Status
 EphyrKeyboardEnable (KdKeyboardInfo *ki)
 {
-    hostx_load_keymap();
-    if (!ephyrKeySyms.map) {
-        ErrorF("Couldn't load keymap from host\n");
-        return BadAlloc;
-    }
-    ki->keySyms.minKeyCode = ephyrKeySyms.minKeyCode;
-    ki->keySyms.maxKeyCode = ephyrKeySyms.maxKeyCode;
-    ki->minScanCode = ki->keySyms.minKeyCode;
-    ki->maxScanCode = ki->keySyms.maxKeyCode;
-    ki->keySyms.mapWidth = ephyrKeySyms.mapWidth;
-    ki->keySyms.map = ephyrKeySyms.map;
     ((EphyrKbdPrivate *)ki->driverPrivate)->enabled = TRUE;
 
     return Success;
diff-tree 3eeb62e8f587732e6b433c2b9c6879eb26a3f1b4 (from 60ea7b51fe2b8a19a08b63db48504971a7a50ee6)
Author: Kristian Høgsberg <krh at redhat.com>
Date:   Fri Jul 21 16:33:28 2006 -0400

    bug #890: completely remove deprecated keyboard driver
    Remove all remnants of the old built-in keyboard driver.

diff --git a/configure.ac b/configure.ac
index 815f1f4..456b8b5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1089,7 +1089,6 @@ dnl has it in libc), or if libdl is need
 		fi
 	  	XORG_OS="linux"
 		XORG_OS_SUBDIR="linux"
-		XORG_OS_KBD="Lnx"
 		xorg_bus_linuxpci="yes"
 		linux_acpi="no"
 		case $host_cpu in
@@ -1131,7 +1130,6 @@ int main () { 
 	  freebsd* | kfreebsd*-gnu)
 	  	XORG_OS="freebsd"
 		XORG_OS_SUBDIR="bsd"
-		XORG_OS_KBD="BSD"
 		case $host_cpu in
 		  i*86)
 			;;
@@ -1143,7 +1141,6 @@ int main () { 
 	  netbsd*)
 	  	XORG_OS="netbsd"
 		XORG_OS_SUBDIR="bsd"
-		XORG_OS_KBD="BSD"
 		case $host_cpu in
 		  i*86|amd64*|x86_64*|ia64*)
 			;;
@@ -1155,7 +1152,6 @@ int main () { 
 	  openbsd*)
 	  	XORG_OS="openbsd"
 		XORG_OS_SUBDIR="bsd"
-		XORG_OS_KBD="BSD"
 		case $host_cpu in
 		  i*86|amd64*|x86_64*|ia64*)
 			;;
@@ -1258,7 +1254,6 @@ int main () { 
 	AC_SUBST([XORG_INCS])
 	AC_SUBST([XORG_OS])
 	AC_SUBST([XORG_OS_SUBDIR])
-	AC_SUBST([XORG_OS_KBD])
 
 	dnl only used in hw/xfree86/scanpci, TTBOMK
 	AC_PATH_PROG(PERL, perl, no)
diff --git a/hw/xfree86/common/Makefile.am b/hw/xfree86/common/Makefile.am
index 84818ff..090112c 100644
--- a/hw/xfree86/common/Makefile.am
+++ b/hw/xfree86/common/Makefile.am
@@ -21,8 +21,6 @@ RANDRSOURCES = xf86RandR.c
 
 BUSSOURCES = xf86isaBus.c xf86pciBus.c xf86fbBus.c xf86noBus.c $(SBUS_SOURCES)
 
-KBDSOURCES = xf86Kbd at XORG_OS_KBD@.c
-
 MODEDEFSOURCES = $(srcdir)/vesamodes $(srcdir)/extramodes
 
 xf86DefModeSet.c: $(srcdir)/modeline2c.pl $(MODEDEFSOURCES)
@@ -34,14 +32,13 @@ AM_LDFLAGS = -r
 libcommon_la_SOURCES = xf86Configure.c xf86Bus.c xf86Config.c \
                       xf86Cursor.c xf86DGA.c xf86DPMS.c \
                       xf86DoProbe.c xf86DoScanPci.c xf86Events.c \
-                      xf86Globals.c xf86Io.c xf86AutoConfig.c \
+                      xf86Globals.c xf86AutoConfig.c \
                       xf86MiscExt.c xf86Option.c \
                       xf86VidMode.c xf86fbman.c xf86cmap.c \
                       xf86Helper.c xf86PM.c \
                       xf86Mode.c xf86Build.h xorgHelper.c xf86Versions.c \
                       $(XVSOURCES) $(BUSSOURCES) $(XKBSOURCES) \
-                      $(DEBUGSOURCES) $(XISOURCES) $(RANDRSOURCES) \
-                      $(KBDSOURCES)
+                      $(DEBUGSOURCES) $(XISOURCES) $(RANDRSOURCES)
 nodist_libcommon_la_SOURCES = xf86DefModeSet.c
 libinit_a_SOURCES = xf86Build.h xf86Init.c
 
@@ -59,11 +56,6 @@ sdk_HEADERS = compiler.h fourcc.h xf86.h
 DISTCLEANFILES = xf86Build.h
 CLEANFILES = $(BUILT_SOURCES)
 
-# this is a hack for now.  as above we don't have rules to build all of these
-# yet, but we want to make sure they all get into the distball.  this should
-# eventually go away.
-DISTKBDSOURCES = xf86Kbd.c xf86KbdBSD.c xf86KbdLnx.c xf86KbdMach.c
-
 EXTRA_DIST = \
 	atKeynames.h \
 	compiler.h \
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index 16591be..16df621 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -385,18 +385,6 @@ xf86DriverlistFromConfig()
     return modulearray;
 }
 
-
-Bool
-xf86BuiltinInputDriver(const char *name)
-{
-#ifdef USE_DEPRECATED_KEYBOARD_DRIVER
-    if (xf86NameCmp(name, "keyboard") == 0)
-	return TRUE;
-    else
-#endif
-	return FALSE;
-}
-
 char **
 xf86InputDriverlistFromConfig()
 {
@@ -421,8 +409,7 @@ xf86InputDriverlistFromConfig()
     if (xf86ConfigLayout.inputs) {
         idp = xf86ConfigLayout.inputs;
         while (idp->identifier) {
-	    if (!xf86BuiltinInputDriver(idp->driver))
-	        count++;
+	    count++;
 	    idp++;
         }
     }
@@ -437,10 +424,8 @@ xf86InputDriverlistFromConfig()
     count = 0;
     idp = xf86ConfigLayout.inputs;
     while (idp->identifier) {
-	if (!xf86BuiltinInputDriver(idp->driver)) {
-	    modulearray[count] = idp->driver;
-	    count++;
-	}
+        modulearray[count] = idp->driver;
+	count++;
 	idp++;
     }
     modulearray[count] = NULL;
@@ -1115,295 +1100,6 @@ configServerFlags(XF86ConfFlagsPtr flags
 }
 
 /*
- * XXX This function is temporary, and will be removed when the keyboard
- * driver is converted into a regular input driver.
- */
-static Bool
-configInputKbd(IDevPtr inputp)
-{
-  char *s;
-  MessageType from = X_DEFAULT;
-  Bool customKeycodesDefault = FALSE;
-  int verb = 0;
-#if defined(XQUEUE)
-  char *kbdproto = "Xqueue";
-#else
-  char *kbdproto = "standard";
-#endif
-
-  /* Initialize defaults */
-  xf86Info.xleds         = 0L;
-  xf86Info.kbdDelay      = 500;
-  xf86Info.kbdRate       = 30;
-  
-  xf86Info.vtinit        = NULL;
-  xf86Info.vtSysreq      = VT_SYSREQ_DEFAULT;
-#if defined(SVR4) && defined(i386)
-  xf86Info.panix106      = FALSE;
-#endif
-  xf86Info.kbdCustomKeycodes = FALSE;
-#ifdef WSCONS_SUPPORT
-  xf86Info.kbdFd 	   = -1;
-#endif
-#ifdef XKB
-  if (!xf86IsPc98()) {
-    xf86Info.xkbrules      = __XKBDEFRULES__;
-    xf86Info.xkbmodel      = "pc105";
-    xf86Info.xkblayout     = "us";
-    xf86Info.xkbvariant    = NULL;
-    xf86Info.xkboptions    = NULL;
-  } else {
-    xf86Info.xkbrules      = "xfree98";
-    xf86Info.xkbmodel      = "pc98";
-    xf86Info.xkblayout     = "nec/jp";
-    xf86Info.xkbvariant    = NULL;
-    xf86Info.xkboptions    = NULL;
-  }
-  xf86Info.xkbcomponents_specified = FALSE;
-  /* Should discourage the use of these. */
-  xf86Info.xkbkeymap     = NULL;
-  xf86Info.xkbtypes      = NULL;
-  xf86Info.xkbcompat     = NULL;
-  xf86Info.xkbkeycodes   = NULL;
-  xf86Info.xkbsymbols    = NULL;
-  xf86Info.xkbgeometry   = NULL;
-#endif
-
-  s = xf86SetStrOption(inputp->commonOptions, "Protocol", kbdproto);
-  if (xf86NameCmp(s, "standard") == 0) {
-     xfree(s);
-  } else if (xf86NameCmp(s, "xqueue") == 0) {
-#ifdef __UNIXWARE__
-    /*
-     * To retain compatibility with older config files, on UnixWare, we
-     * accept the xqueue protocol but use the normal keyboard procs.
-     */
-#else
-#ifdef XQUEUE
-    xf86Msg(X_CONFIG, "Xqueue selected for keyboard input\n");
-#endif
-#endif
-    xfree(s);
-#ifdef WSCONS_SUPPORT
-  } else if (xf86NameCmp(s, "wskbd") == 0) {
-     xfree(s);
-     s = xf86SetStrOption(inputp->commonOptions, "Device", NULL);
-     xf86Msg(X_CONFIG, "Keyboard: Protocol: wskbd\n");
-     if (s == NULL) {
-	 xf86ConfigError("A \"device\" option is required with"
-			 " the \"wskbd\" keyboard protocol");
-	 return FALSE;
-     }
-     xf86Info.kbdFd = open(s, O_RDWR | O_NONBLOCK | O_EXCL);
-     if (xf86Info.kbdFd == -1) {
-       xf86ConfigError("cannot open \"%s\"", s);
-       xfree(s);
-       return FALSE;
-     }
-     xfree(s);
-     /* Find out keyboard type */
-     if (ioctl(xf86Info.kbdFd, WSKBDIO_GTYPE, &xf86Info.wsKbdType) == -1) {
-	     xf86ConfigError("cannot get keyboard type");
-	     close(xf86Info.kbdFd);
-	     return FALSE;
-     }
-     switch (xf86Info.wsKbdType) {
-     case WSKBD_TYPE_PC_XT:
-	     xf86Msg(X_PROBED, "Keyboard type: XT\n");
-	     break;
-     case WSKBD_TYPE_PC_AT:
-	     xf86Msg(X_PROBED, "Keyboard type: AT\n");
-	     break;
-     case WSKBD_TYPE_USB:
-	     xf86Msg(X_PROBED, "Keyboard type: USB\n");
-	     break;
-#ifdef WSKBD_TYPE_ADB
-     case WSKBD_TYPE_ADB:
-	     xf86Msg(X_PROBED, "Keyboard type: ADB\n");
-	     break;
-#endif
-#ifdef WSKBD_TYPE_SUN
-     case WSKBD_TYPE_SUN:
-	     xf86Msg(X_PROBED, "Keyboard type: Sun\n");
-	     break;
-#endif
-#ifdef WSKBD_TYPE_SUN5
-     case WSKBD_TYPE_SUN5:
-	     xf86Msg(X_PROBED, "Keyboard type: Sun5\n");
-	     break;
-#endif
-     default:
-	     xf86ConfigError("Unsupported wskbd type \"%d\"", 
-			     xf86Info.wsKbdType);
-	     close(xf86Info.kbdFd);
-	     return FALSE;
-     }
-#endif
-  } else {
-    xf86ConfigError("\"%s\" is not a valid keyboard protocol name", s);
-    xfree(s);
-    return FALSE;
-  }
-
-  s = xf86SetStrOption(inputp->commonOptions, "AutoRepeat", NULL);
-  if (s) {
-    if (sscanf(s, "%d %d", &xf86Info.kbdDelay, &xf86Info.kbdRate) != 2) {
-      xf86ConfigError("\"%s\" is not a valid AutoRepeat value", s);
-      xfree(s);
-      return FALSE;
-    }
-  xfree(s);
-  }
-
-  s = xf86SetStrOption(inputp->commonOptions, "XLeds", NULL);
-  if (s) {
-    char *l, *end;
-    unsigned int i;
-    l = strtok(s, " \t\n");
-    while (l) {
-      i = strtoul(l, &end, 0);
-      if (*end == '\0')
-	xf86Info.xleds |= 1L << (i - 1);
-      else {
-	xf86ConfigError("\"%s\" is not a valid XLeds value", l);
-	xfree(s);
-	return FALSE;
-      }
-      l = strtok(NULL, " \t\n");
-    }
-    xfree(s);
-  }
-
-#ifdef XKB
-  from = X_DEFAULT;
-  if (noXkbExtension)
-    from = X_CMDLINE;
-  else if (xf86FindOption(inputp->commonOptions, "XkbDisable")) {
-    xf86Msg(X_WARNING, "KEYBOARD: XKB should be disabled in the "
-	    "ServerFlags section instead\n"
-	    "\tof in the \"keyboard\" InputDevice section.\n");
-    noXkbExtension =
-	xf86SetBoolOption(inputp->commonOptions, "XkbDisable", FALSE);
-    from = X_CONFIG;
-  }
-  if (noXkbExtension)
-    xf86Msg(from, "XKB: disabled\n");
-
-#define NULL_IF_EMPTY(s) (s[0] ? s : (xfree(s), (char *)NULL))
-
-  if (!noXkbExtension) {
-    if ((s = xf86SetStrOption(inputp->commonOptions, "XkbKeymap", NULL))) {
-      xf86Info.xkbkeymap = NULL_IF_EMPTY(s);
-      xf86Msg(X_CONFIG, "XKB: keymap: \"%s\" "
-		"(overrides other XKB settings)\n", xf86Info.xkbkeymap);
-    } else {
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbCompat", NULL))) {
-	xf86Info.xkbcompat = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: compat: \"%s\"\n", s);
-      }
-
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbTypes", NULL))) {
-	xf86Info.xkbtypes = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: types: \"%s\"\n", s);
-      }
-
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbKeycodes", NULL))) {
-	xf86Info.xkbkeycodes = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: keycodes: \"%s\"\n", s);
-      }
-
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbGeometry", NULL))) {
-	xf86Info.xkbgeometry = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: geometry: \"%s\"\n", s);
-      }
-
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbSymbols", NULL))) {
-	xf86Info.xkbsymbols = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: symbols: \"%s\"\n", s);
-      }
-
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbRules", NULL))) {
-	xf86Info.xkbrules = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: rules: \"%s\"\n", s);
-      }
-
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbModel", NULL))) {
-	xf86Info.xkbmodel = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: model: \"%s\"\n", s);
-      }
-
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbLayout", NULL))) {
-	xf86Info.xkblayout = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: layout: \"%s\"\n", s);
-      }
-
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbVariant", NULL))) {
-	xf86Info.xkbvariant = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: variant: \"%s\"\n", s);
-      }
-
-      if ((s = xf86SetStrOption(inputp->commonOptions, "XkbOptions", NULL))) {
-	xf86Info.xkboptions = NULL_IF_EMPTY(s);
-	xf86Info.xkbcomponents_specified = TRUE;
-	xf86Msg(X_CONFIG, "XKB: options: \"%s\"\n", s);
-      }
-    }
-  }
-#undef NULL_IF_EMPTY
-#endif
-#if defined(SVR4) && defined(i386)
-  if ((xf86Info.panix106 =
-	xf86SetBoolOption(inputp->commonOptions, "Panix106", FALSE))) {
-    xf86Msg(X_CONFIG, "PANIX106: enabled\n");
-  }
-#endif
-
-  /*
-   * This was once a compile time option (ASSUME_CUSTOM_KEYCODES)
-   * defaulting to 1 on Linux/PPC. It is no longer necessary, but for
-   * backwards compatibility we provide 'Option "CustomKeycodes"'
-   * and try to autoprobe on Linux/PPC.
-   */
-  from = X_DEFAULT;
-  verb = 2;
-#if defined(__linux__) && defined(__powerpc__)
-  {
-    FILE *f;
-
-    f = fopen("/proc/sys/dev/mac_hid/keyboard_sends_linux_keycodes","r");
-    if (f) {
-      if (fgetc(f) == '0') {
-	customKeycodesDefault = TRUE;
-	from = X_PROBED;
-	verb = 1;
-      }
-      fclose(f);
-    }
-  }
-#endif
-  if (xf86FindOption(inputp->commonOptions, "CustomKeycodes")) {
-    from = X_CONFIG;
-    verb = 1;
-  }
-  xf86Info.kbdCustomKeycodes =
-	xf86SetBoolOption(inputp->commonOptions, "CustomKeycodes",
-			  customKeycodesDefault);
-  xf86MsgVerb(from, verb, "Keyboard: CustomKeycode %s\n",
-		xf86Info.kbdCustomKeycodes ? "enabled" : "disabled");
-
-  return TRUE;
-}
-
-/*
  * Locate the core input devices.  These can be specified/located in
  * the following ways, in order of priority:
  *
@@ -1639,10 +1335,6 @@ checkCoreInputDevices(serverLayoutPtr se
 	    confInput = xf86findInputByDriver("kbd",
 					      xf86configptr->conf_input_lst);
 	}
-	if (!confInput) {
-	    confInput = xf86findInputByDriver("keyboard",
-					      xf86configptr->conf_input_lst);
-	}
 	if (confInput) {
 	    foundKeyboard = TRUE;
 	    from = X_DEFAULT;
@@ -2549,10 +2241,6 @@ configInput(IDevPtr inputp, XF86ConfInpu
     inputp->commonOptions = conf_input->inp_option_lst;
     inputp->extraOptions = NULL;
 
-    /* XXX This is required until the keyboard driver is converted */
-    if (!xf86NameCmp(inputp->driver, "keyboard"))
-	return configInputKbd(inputp);
-
     return TRUE;
 }
 
diff --git a/hw/xfree86/common/xf86Configure.c b/hw/xfree86/common/xf86Configure.c
index a0d622a..d6efb9a 100644
--- a/hw/xfree86/common/xf86Configure.c
+++ b/hw/xfree86/common/xf86Configure.c
@@ -263,11 +263,7 @@ configureInputSection (void)
     parsePrologue (XF86ConfInputPtr, XF86ConfInputRec)
 
     ptr->inp_identifier = "Keyboard0";
-#ifdef USE_DEPRECATED_KEYBOARD_DRIVER
-    ptr->inp_driver = "keyboard";
-#else
     ptr->inp_driver = "kbd";
-#endif
     ptr->list.next = NULL;
 
     /* Crude mechanism to auto-detect mouse (os dependent) */
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index cc2ce9b..21389f2 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -166,6 +166,12 @@ typedef struct x_IHRec {
 static IHPtr InputHandlers = NULL;
 
 
+Bool
+LegalModifier(unsigned int key, DevicePtr pDev)
+{
+    return TRUE;
+}
+
 /*
  * TimeSinceLastInputEvent --
  *      Function used for screensaver purposes by the os module. Returns the
diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c
index ab73c6c..aad479d 100644
--- a/hw/xfree86/common/xf86Globals.c
+++ b/hw/xfree86/common/xf86Globals.c
@@ -95,32 +95,10 @@ InputInfoPtr xf86InputDevs = NULL;
 
 xf86InfoRec xf86Info = {
 	-1,		/* consoleFd */
-	-1,		/* kbdFd */
 	-1,		/* vtno */
-	-1,		/* kbdType */
-	-1,		/* kbdRate */
-	-1, 		/* kbdDelay */
-	-1,		/* bell_pitch */
-	-1,		/* bell_duration */
-	TRUE,		/* autoRepeat */
-	0,		/* leds */
-	0,		/* xleds */
 	NULL,		/* vtinit */
-	0,		/* scanPrefix */
-	FALSE,		/* capsLock */
-	FALSE,		/* numLock */
-	FALSE,		/* scrollLock */
-	FALSE,		/* modeSwitchLock */
-	FALSE,		/* composeLock */
 	FALSE,		/* vtSysreq */
 	SKWhenNeeded,	/* ddxSpecialKeys */
-	FALSE,		/* ActionKeyBindingsSet */
-#if defined(SVR4) && defined(i386)
-	FALSE,		/* panix106 */
-#endif
-#if defined(__OpenBSD__) || defined(__NetBSD__)
-	0,		/* wskbdType */
-#endif
 	NULL,		/* pMouse */
 #ifdef XINPUT
 	NULL,		/* mouseLocal */
@@ -139,20 +117,6 @@ xf86InfoRec xf86Info = {
 	-1,		/* screenFd */
 	-1,		/* consType */
 #endif
-#ifdef XKB
-	NULL,		/* xkbkeymap */
-	NULL,		/* xkbkeycodes */
-	NULL,		/* xkbtypes */
-	NULL,		/* xkbcompat */
-	NULL,		/* xkbsymbols */
-	NULL,		/* xkbgeometry */
-	FALSE,		/* xkbcomponents_specified */
-	NULL,		/* xkbrules */
-	NULL,		/* xkbmodel */
-	NULL,		/* xkblayout */
-	NULL,		/* xkbvariant */
-	NULL,		/* xkboptions */
-#endif
 	FALSE,		/* allowMouseOpenFail */
 	TRUE,		/* vidModeEnabled */
 	FALSE,		/* vidModeAllowNonLocal */
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index e2622e3..a975e37 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -137,16 +137,6 @@ static int numFormats = 6;
 #endif
 static Bool formatsDone = FALSE;
 
-InputDriverRec XF86KEYBOARD = {
-	1,
-	"keyboard",
-	NULL,
-	NULL,
-	NULL,
-	NULL,
-	0
-};
-
 static Bool
 xf86CreateRootWindow(WindowPtr pWin)
 {
@@ -405,10 +395,6 @@ InitOutput(ScreenInfo *pScreenInfo, int 
       xfree(modulelist);
     }
 
-#ifdef USE_DEPRECATED_KEYBOARD_DRIVER
-    /* Setup the builtin input drivers */
-    xf86AddInputDriver(&XF86KEYBOARD, NULL, 0);
-#endif
     /* Load all input driver modules specified in the config file. */
     if ((modulelist = xf86InputDriverlistFromConfig())) {
       xf86LoadModules(modulelist, NULL);
diff --git a/hw/xfree86/common/xf86Io.c b/hw/xfree86/common/xf86Io.c
deleted file mode 100644
index d10ad43..0000000
--- a/hw/xfree86/common/xf86Io.c
+++ /dev/null
@@ -1,162 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Io.c,v 3.56 2003/11/03 05:11:02 tsi Exp $ */
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Copyright (c) 1992-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/* $XConsortium: xf86Io.c /main/27 1996/10/19 17:58:55 kaleb $ */
-/* $XdotOrg: xserver/xorg/hw/xfree86/common/xf86Io.c,v 1.6 2006/03/25 19:52:03 ajax Exp $ */
-
-#define NEED_EVENTS
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#define XF86_OS_PRIVS
-#include "xf86_OSlib.h"
-#include "mipointer.h"
-
-#ifdef XINPUT
-#include "xf86Xinput.h"
-#include <X11/extensions/XIproto.h>
-#include "exevents.h"
-#endif
-
-#ifdef XKB
-#include <X11/extensions/XKB.h>
-#include <X11/extensions/XKBstr.h>
-#include <X11/extensions/XKBsrv.h>
-#endif
-
-unsigned int xf86InitialCaps = 0;
-unsigned int xf86InitialNum = 0;
-unsigned int xf86InitialScroll = 0;
-
-#include "atKeynames.h"
-
-/*
- * xf86KbdBell --
- *	Ring the terminal/keyboard bell for an amount of time proportional to
- *      "loudness".
- */
-
-void
-xf86KbdBell(percent, pKeyboard, ctrl, unused)
-     int           percent;          /* Percentage of full volume */
-     DeviceIntPtr  pKeyboard;        /* Keyboard to ring */
-     pointer	   ctrl;	
-     int	   unused;	
-{
-  xf86SoundKbdBell(percent, xf86Info.bell_pitch, xf86Info.bell_duration);
-}
-
-void
-xf86UpdateKbdLeds()
-{
-  int leds = 0;
-  if (xf86Info.capsLock) leds |= XLED1;
-  if (xf86Info.numLock)  leds |= XLED2;
-  if (xf86Info.scrollLock || xf86Info.modeSwitchLock) leds |= XLED3;
-  if (xf86Info.composeLock) leds |= XLED4;
-  xf86Info.leds = (xf86Info.leds & xf86Info.xleds) | (leds & ~xf86Info.xleds);
-  xf86KbdLeds();
-}
-
-void
-xf86KbdLeds ()
-{
-  int leds, real_leds = 0;
-
-#if defined (__sparc__) && defined(__linux__)
-  static int kbdSun = -1;
-  if (kbdSun == -1) {
-  if ((xf86Info.xkbmodel && !strcmp(xf86Info.xkbmodel, "sun")) ||
-      (xf86Info.xkbrules && !strcmp(xf86Info.xkbrules, "sun")))
-      kbdSun = 1;
-  else
-      kbdSun = 0;
-  }
-  if (kbdSun) {
-     if (xf86Info.leds & 0x08) real_leds |= XLED1;
-     if (xf86Info.leds & 0x04) real_leds |= XLED3;
-     if (xf86Info.leds & 0x02) real_leds |= XLED4;
-     if (xf86Info.leds & 0x01) real_leds |= XLED2;
-     leds = real_leds;
-     real_leds = 0;
-  } else {
-     leds = xf86Info.leds;
-  }
-#else
-  leds = xf86Info.leds;
-#endif /* defined (__sparc__) */
-
-#ifdef LED_CAP
-  if (leds & XLED1)  real_leds |= LED_CAP;
-  if (leds & XLED2)  real_leds |= LED_NUM;
-  if (leds & XLED3)  real_leds |= LED_SCR;
-#ifdef LED_COMP
-  if (leds & XLED4)  real_leds |= LED_COMP;
-#else
-  if (leds & XLED4)  real_leds |= LED_SCR;
-#endif
-#endif
-#ifdef sun
-  /* Pass through any additional LEDs, such as Kana LED on Sun Japanese kbd */
-  real_leds |= (leds & 0xFFFFFFF0);
-#endif
-  xf86SetKbdLeds(real_leds);
-  (void)leds;
-}
diff --git a/hw/xfree86/common/xf86Kbd.c b/hw/xfree86/common/xf86Kbd.c
deleted file mode 100644
index 85f9e34..0000000
--- a/hw/xfree86/common/xf86Kbd.c
+++ /dev/null
@@ -1,395 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86Kbd.c,v 3.26 2003/08/24 17:36:53 dawes Exp $ */
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Copyright (c) 1992-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/* $XConsortium: xf86Kbd.c /main/10 1996/02/21 17:38:32 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#ifdef __UNIXOS2__
-#define I_NEED_OS2_H
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "atKeynames.h"
-#include "xf86Config.h"
-
-#include "xf86Keymap.h"
-
-#if defined(KDGKBTYPE) && \
-	!defined(Lynx) && \
-	!defined(__UNIXOS2__) && !defined(__mips__) && \
-	!defined(__arm32__) && !defined(__GNU__) && !defined(__QNX__)
-#define HAS_GETKBTYPE
-#endif
-#if defined(GIO_KEYMAP) && \
-	!defined(Lynx) && \
-	!defined(__UNIXOS2__) && !defined(__mips__) && \
-	!defined(__arm32__) && !defined(__GNU__) && !defined(DGUX) && \
-	!defined(__QNX__)
-#define HAS_GETKEYMAP
-
-#define KD_GET_ENTRY(i,n) \
-  eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + keymap.key[i].map[n]]
-
-/*
- * NOTE: Not all possible remappable symbols are remapped. There are two main
- *       reasons:
- *                 a) The mapping between scancode and SYSV/386 - symboltable
- *                    is inconsistent between different versions and has some
- *                    BIG mistakes.
- *                 b) In X-Windows there is a difference between numpad-keys
- *                    and normal keys. SYSV/386 uses for both kinds of keys
- *                    the same symbol.
- *
- *       Thus only the alpha keypad and the function keys are translated.
- *       Also CapsLock, NumLock, ScrollLock, Shift, Control & Alt.
- */
-
-static unsigned char remap[128] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-static KeySym eascii_to_x[512] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
-	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
-	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
-	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
-	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
-	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
-	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
-	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
-	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
-	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
-	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
-	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
-	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
-	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
-	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
-	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
-	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
-	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
-	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
-
-	/* 
-	 * special marked entries (256 + x)
-	 */
-
-	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
-	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
-	NoSymbol,	XK_Control_L,	XK_Alt_L,	XK_Alt_R,
-	XK_Control_L,	XK_Control_R,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
-	XK_F2,		XK_F3,		XK_F4,		XK_F5,
-	XK_F6,		XK_F7,		XK_F8,		XK_F9,
-	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-      };
-
-#endif /* HAS_GETKEYMAP */
-
-/*
- * LegalModifier --
- *      determine whether a key is a legal modifier key, i.e send a
- *      press/release sequence.
- */
-
-/*ARGSUSED*/
-Bool
-LegalModifier(key, pDev)
-     unsigned int  key;
-     DevicePtr	pDev;
-{
-  return (TRUE);
-}
-
-
-      
-/*
- * xf86KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-void
-xf86KbdGetMapping (pKeySyms, pModMap)
-     KeySymsPtr pKeySyms;
-     CARD8      *pModMap;
-{
-  KeySym        *k;
-#ifdef HAS_GETKEYMAP
-  keymap_t      keymap;
-#endif
-  int           i;
-  KeySym        *pMap;
-
-#ifdef HAS_GETKBTYPE
-  char          type;
-  
-  xf86Info.kbdType =
-    ioctl(xf86Info.consoleFd, KDGKBTYPE, &type) != -1 ? type : KB_101;
-  if (xf86Info.kbdType == KB_84)
-    pMap = map84;
-  else
-    pMap = map;
-#else
-/* OS/2 sets the keyboard type during xf86OpenKbd */
-#ifndef __UNIXOS2__
-  xf86Info.kbdType = 0;
-#endif
-  pMap = map;
-#endif
-
-#ifdef HAS_GETKEYMAP
-  /*
-   * use the keymap, which can be gotten from our oringinal vt??.
-   * ( ttymap(1) !!!! )
-   */
-  if (ioctl(xf86Info.consoleFd, GIO_KEYMAP, &keymap) != -1) {
-    for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++)
-      
-      if (remap[i]) {
-	
-	k = pMap + (remap[i] << 2);
-	
-	k[0] = KD_GET_ENTRY(i,0);             /* non-shifed */
-	k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
-	k[2] = KD_GET_ENTRY(i,4);	      /* alt */
-	k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
-
-	if (k[3] == k[2]) k[3] = NoSymbol;
-	if (k[2] == k[1]) k[2] = NoSymbol;
-	if (k[1] == k[0]) k[1] = NoSymbol;
-	if (k[0] == k[2] && k[1] == k[3]) k[2] = k[3] = NoSymbol;
-      }
-  }
-#endif
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = pMap, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  pKeySyms->map        = pMap;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE;
-}
diff --git a/hw/xfree86/common/xf86KbdBSD.c b/hw/xfree86/common/xf86KbdBSD.c
deleted file mode 100644
index c1f6156..0000000
--- a/hw/xfree86/common/xf86KbdBSD.c
+++ /dev/null
@@ -1,1266 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86KbdBSD.c,v 3.22 2003/10/07 22:00:52 herrb Exp $ */
-/*
- * Derived from xf86Kbd.c by S_ren Schmidt (sos at login.dkuug.dk)
- * which is Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- * and from xf86KbdCODrv.c by Holger Veit
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-/*
- * Copyright (c) 1994-2002 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/* $XConsortium: xf86KbdBSD.c /main/6 1996/10/23 13:12:27 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "atKeynames.h"
-#include "xf86Keymap.h"
-
-#if (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT)) && defined(GIO_KEYMAP)
-#define KD_GET_ENTRY(i,n) \
-  eascii_to_x[((keymap.key[i].spcl << (n+1)) & 0x100) + keymap.key[i].map[n]]
-
-static unsigned char remap[NUM_KEYCODES] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0, 0x69, 0x65,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-/* This table assumes the ibm code page 437 coding for characters 
- * > 0x80. They are returned in this form by PCVT */
-static KeySym eascii_to_x[512] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
-	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
-	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
-	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
-	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
-	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
-	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
-	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
-	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
-	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
-	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
-	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
-	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
-	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
-	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
-	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
-	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
-	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
-	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
-
-	/* 
-	 * special marked entries (256 + x)
-	 */
-
-#if 1
-	/* This has been checked against what syscons actually does */
-	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
-	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
-	XK_ISO_Left_Tab,XK_Control_L,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
-	XK_F2,		XK_F3,		XK_F4,		XK_F5,
-	XK_F6,		XK_F7,		XK_F8,		XK_F9,
-	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Control_R,	XK_Alt_R,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol
-#else
-	/* The old table, supposedly for pcvt. */
-	NoSymbol,	NoSymbol,	XK_Shift_L,	XK_Shift_R,
-	XK_Caps_Lock,	XK_Num_Lock,	XK_Scroll_Lock,	XK_Alt_L,
-	NoSymbol,	XK_Control_L,	XK_Alt_L,	XK_Alt_R,
-	XK_Control_L,	XK_Control_R,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_F1,
-	XK_F2,		XK_F3,		XK_F4,		XK_F5,
-	XK_F6,		XK_F7,		XK_F8,		XK_F9,
-	XK_F10,		XK_F11,		XK_F12,		NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol
-#endif
-      };
-
-#ifdef __OpenBSD__
-/* don't mark AltR and  CtrlR for remapping, since they 
- * cannot be remapped by pccons */
-static unsigned char pccons_remap[128] = {
-     0, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,   /* 0x00 - 0x07 */
-  0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,   /* 0x08 - 0x0f */
-  0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,   /* 0x10 - 0x17 */
-  0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,   /* 0x18 - 0x1f */
-  0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,   /* 0x20 - 0x27 */
-  0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,   /* 0x28 - 0x2f */
-  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,    0,   /* 0x30 - 0x37 */
-  0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,   /* 0x38 - 0x3f */
-  0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,    0,   /* 0x40 - 0x47 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x48 - 0x4f */
-     0,    0,    0,    0,    0,    0, 0x56, 0x57,   /* 0x50 - 0x57 */
-  0x58,    0,    0,    0,    0,    0,    0,    0,   /* 0x58 - 0x5f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x60 - 0x67 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x68 - 0x6f */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x70 - 0x77 */
-     0,    0,    0,    0,    0,    0,    0,    0,   /* 0x78 - 0x7f */
-};
-
-/* This table assumes an iso8859_1 encoding for the characters 
- * > 80, as returned by pccons */
-static KeySym latin1_to_x[256] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_nobreakspace,XK_exclamdown,	XK_cent,	XK_sterling,
-	XK_currency,	XK_yen,		XK_brokenbar,	XK_section,
-	XK_diaeresis,	XK_copyright,	XK_ordfeminine,	XK_guillemotleft,
-	XK_notsign,	XK_hyphen,	XK_registered,	XK_macron,
-	XK_degree,	XK_plusminus,	XK_twosuperior,	XK_threesuperior,
-	XK_acute,	XK_mu,		XK_paragraph,	XK_periodcentered,
-	XK_cedilla,	XK_onesuperior,	XK_masculine,	XK_guillemotright,
-	XK_onequarter,	XK_onehalf,	XK_threequarters,XK_questiondown,
-	XK_Agrave,	XK_Aacute,	XK_Acircumflex,	XK_Atilde,
-	XK_Adiaeresis,	XK_Aring,	XK_AE,		XK_Ccedilla,
-	XK_Egrave,	XK_Eacute,	XK_Ecircumflex,	XK_Ediaeresis,
-	XK_Igrave,	XK_Iacute,	XK_Icircumflex,	XK_Idiaeresis,
-	XK_ETH,		XK_Ntilde,	XK_Ograve,	XK_Oacute,
-	XK_Ocircumflex,	XK_Otilde,	XK_Odiaeresis,	XK_multiply,
-	XK_Ooblique,	XK_Ugrave,	XK_Uacute,	XK_Ucircumflex,
-	XK_Udiaeresis,	XK_Yacute,	XK_THORN,	XK_ssharp,
-	XK_agrave,	XK_aacute,	XK_acircumflex,	XK_atilde,
-	XK_adiaeresis,	XK_aring,	XK_ae,	        XK_ccedilla,
-	XK_egrave,	XK_eacute,	XK_ecircumflex,	XK_ediaeresis,
-	XK_igrave,	XK_iacute,	XK_icircumflex, XK_idiaeresis,
-	XK_eth,		XK_ntilde,	XK_ograve, 	XK_oacute,
-	XK_ocircumflex,	XK_otilde,	XK_odiaeresis,	XK_division,
-	XK_oslash,	XK_ugrave,	XK_uacute,	XK_ucircumflex,
-	XK_udiaeresis,	XK_yacute,	XK_thorn, 	XK_ydiaeresis
-      };
-#endif
-#endif /* SYSCONS_SUPPORT || PCVT_SUPPORT */
-/*
- * LegalModifier --
- *      determine whether a key is a legal modifier key, i.e send a
- *      press/release sequence.
- */
-
-/*ARGSUSED*/
-Bool
-LegalModifier(key, pDev)
-     unsigned int  key;
-     DevicePtr pDev;
-{
-  return (TRUE);
-}
-
-/*
- * xf86KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-void
-xf86KbdGetMapping (pKeySyms, pModMap)
-     KeySymsPtr pKeySyms;
-     CARD8      *pModMap;
-{
-  KeySym        *k;
-  int           i;
-
-#ifndef __bsdi__
-  switch (xf86Info.consType) {
-
-#ifdef PCCONS_SUPPORT
-  case PCCONS:
-#if defined(__OpenBSD__)
-    /*
-     * on OpenBSD, the pccons keymap is programmable, too
-     */
-    {
-      pccons_keymap_t keymap[KB_NUM_KEYS];
-      if (ioctl(xf86Info.consoleFd, CONSOLE_GET_KEYMAP, &keymap) != -1) {
-	for (i = 0; i < KB_NUM_KEYS; i++) 
-	  if (pccons_remap[i]) {
-	    k = map + (pccons_remap[i] << 2);
-	    switch (keymap[i].type) {
-	    case KB_ASCII:
-	      /* For ASCII keys, there is only one char in the keymap */
-	      k[0] = latin1_to_x[(unsigned char)keymap[i].unshift[0]];
-	      k[1] = latin1_to_x[(unsigned char)keymap[i].shift[0]];
-	      k[2] = latin1_to_x[(unsigned char)keymap[i].altgr[0]];
-	      k[3] = latin1_to_x[(unsigned char)keymap[i].shift_altgr[0]];
-	      break;
-	    case KB_SCROLL:
-	      k[0] = XK_Scroll_Lock;
-	      goto special;
-	    case KB_NUM:
-	      k[0] = XK_Num_Lock;
-	      goto special;
-	    case KB_CAPS:
-	      k[0] = XK_Caps_Lock;
-	      goto special;
-	    case KB_SHIFT:
-	      switch (keymap[i].unshift[0]) {
-	      case 1:
-		/* left shift */
-		k[0] = XK_Shift_L;
-		break;
-	      case 2:
-		/* right shift */
-		k[0] = XK_Shift_R;
-		break;
-	      default:
-		k[0] = NoSymbol;
-	      }
-	      goto special;
-	    case KB_CTL:
-	      k[0] = XK_Control_L;
-	      goto special;
-	    case KB_ALT:
-	      k[0] = XK_Alt_L;
-	      goto special;
-	    case KB_FUNC:
-	      switch (keymap[i].unshift[2]) {
-	      case 'M':
-		k[0] = XK_F1;
-		break;
-	      case 'N':
-		k[0] = XK_F2;
-		break;
-	      case 'O':
-		k[0] = XK_F3;
-		break;
-	      case 'P':
-		k[0] = XK_F4;
-		break;
-	      case 'Q':
-		k[0] = XK_F5;
-		break;
-	      case 'R':
-		k[0] = XK_F6;
-		break;
-	      case 'S':
-		k[0] = XK_F7;
-		break;
-	      case 'T':
-		k[0] = XK_F8;
-		break;
-	      case 'U':
-		k[0] = XK_F9;
-		break;
-	      case 'V':
-		k[0] = XK_F10;
-		break;
-	      case 'W':
-		k[0] = XK_F11;
-		break;
-	      case 'X':
-		k[0] = XK_F12;
-		break;
-	      default:
-		k[0] = NoSymbol;
-		break;
-	      }
-	      goto special;
-	    default:
-	      k[0] = NoSymbol;
-	    special:
-	      k[1] = k[2] = k[3] = NoSymbol;
-	    }
-	  }
-      } else {
-	ErrorF("Can't read pccons keymap\n");
-      }
-    }
-#endif /* __OpenBSD__ */
-  break;
-#endif
-
-/*
- * XXX wscons has no GIO_KEYMAP
- */
-#if (defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)) && defined(GIO_KEYMAP)
-  case SYSCONS:
-  case PCVT:
-    {
-      keymap_t keymap;
-    
-      if (ioctl(xf86Info.consoleFd, GIO_KEYMAP, &keymap) != -1) {
-	for (i = 0; i < keymap.n_keys && i < NUM_KEYCODES; i++)
-	  if (remap[i]) {
-	    k = map + (remap[i] << 2);
-	    k[0] = KD_GET_ENTRY(i,0);           /* non-shifed */
-	    k[1] = KD_GET_ENTRY(i,1);	      /* shifted */
-	    k[2] = KD_GET_ENTRY(i,4);	      /* alt */
-	    k[3] = KD_GET_ENTRY(i,5);	      /* alt - shifted */
-	    if (k[3] == k[2]) k[3] = NoSymbol;
-	    if (k[2] == k[1]) k[2] = NoSymbol;
-	    if (k[1] == k[0]) k[1] = NoSymbol;
-	    if (k[0] == k[2] && k[1] == k[3])
-	      k[2] = k[3] = NoSymbol;
-	  }
-      }
-    }
-    break;
-#endif /* SYSCONS || PCVT */
-    
-  } 
-#endif /* !bsdi */
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  xf86Info.kbdType = 0;
-
-  pKeySyms->map        = map;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE; 
-
-}
-
-#ifdef WSCONS_SUPPORT
-#include "atKeynames.h"
-
-static CARD8 wsUsbMap[] = {
-	/* 0 */ KEY_NOTUSED,
-	/* 1 */ KEY_NOTUSED,
-	/* 2 */ KEY_NOTUSED,
-	/* 3 */ KEY_NOTUSED,
-	/* 4 */ KEY_A,		
-	/* 5 */ KEY_B,
-	/* 6 */ KEY_C,
-	/* 7 */ KEY_D,
-	/* 8 */ KEY_E,
-	/* 9 */ KEY_F,
-	/* 10 */ KEY_G,
-	/* 11 */ KEY_H,
-	/* 12 */ KEY_I,
-	/* 13 */ KEY_J,
-	/* 14 */ KEY_K,
-	/* 15 */ KEY_L,
-	/* 16 */ KEY_M,
-	/* 17 */ KEY_N,
-	/* 18 */ KEY_O,
-	/* 19 */ KEY_P,
-	/* 20 */ KEY_Q,
-	/* 21 */ KEY_R,
-	/* 22 */ KEY_S,
-	/* 23 */ KEY_T,
-	/* 24 */ KEY_U,
-	/* 25 */ KEY_V,
-	/* 26 */ KEY_W,
-	/* 27 */ KEY_X,
-	/* 28 */ KEY_Y,
-	/* 29 */ KEY_Z,
-	/* 30 */ KEY_1,		/* 1 !*/
-	/* 31 */ KEY_2,		/* 2 @ */
-	/* 32 */ KEY_3,		/* 3 # */
-	/* 33 */ KEY_4,		/* 4 $ */
-	/* 34 */ KEY_5,		/* 5 % */
-	/* 35 */ KEY_6,		/* 6 ^ */
-	/* 36 */ KEY_7,		/* 7 & */
-	/* 37 */ KEY_8,		/* 8 * */
-	/* 38 */ KEY_9,		/* 9 ( */
-	/* 39 */ KEY_0,		/* 0 ) */
-	/* 40 */ KEY_Enter,	/* Return  */
-	/* 41 */ KEY_Escape,	/* Escape */
-	/* 42 */ KEY_BackSpace,	/* Backspace Delete */
-	/* 43 */ KEY_Tab,	/* Tab */
-	/* 44 */ KEY_Space,	/* Space */
-	/* 45 */ KEY_Minus,	/* - _ */
-	/* 46 */ KEY_Equal,	/* = + */
-	/* 47 */ KEY_LBrace,	/* [ { */
-	/* 48 */ KEY_RBrace,	/* ] } */
-	/* 49 */ KEY_BSlash,	/* \ | */
-	/* 50 */ KEY_BSlash2,	/* \ _ # ~ on some keyboards */
-	/* 51 */ KEY_SemiColon,	/* ; : */
-	/* 52 */ KEY_Quote,	/* ' " */
-	/* 53 */ KEY_Tilde,	/* ` ~ */
-	/* 54 */ KEY_Comma,	/* , <  */
-	/* 55 */ KEY_Period,	/* . > */
-	/* 56 */ KEY_Slash,	/* / ? */
-	/* 57 */ KEY_CapsLock,	/* Caps Lock */
-	/* 58 */ KEY_F1,		/* F1 */
-	/* 59 */ KEY_F2,		/* F2 */
-	/* 60 */ KEY_F3,		/* F3 */
-	/* 61 */ KEY_F4,		/* F4 */
-	/* 62 */ KEY_F5,		/* F5 */
-	/* 63 */ KEY_F6,		/* F6 */
-	/* 64 */ KEY_F7,		/* F7 */
-	/* 65 */ KEY_F8,		/* F8 */
-	/* 66 */ KEY_F9,		/* F9 */
-	/* 67 */ KEY_F10,	/* F10 */
-	/* 68 */ KEY_F11,	/* F11 */
-	/* 69 */ KEY_F12,	/* F12 */
-	/* 70 */ KEY_Print,	/* PrintScrn SysReq */
-	/* 71 */ KEY_ScrollLock,	/* Scroll Lock */
-	/* 72 */ KEY_Pause,	/* Pause Break */
-	/* 73 */ KEY_Insert,	/* Insert XXX  Help on some Mac Keyboards */
-	/* 74 */ KEY_Home,	/* Home */
-	/* 75 */ KEY_PgUp,	/* Page Up */
-	/* 76 */ KEY_Delete,	/* Delete */
-	/* 77 */ KEY_End,	/* End */
-	/* 78 */ KEY_PgDown,	/* Page Down */
-	/* 79 */ KEY_Right,	/* Right Arrow */
-	/* 80 */ KEY_Left,	/* Left Arrow */
-	/* 81 */ KEY_Down,	/* Down Arrow */
-	/* 82 */ KEY_Up,		/* Up Arrow */
-	/* 83 */ KEY_NumLock,	/* Num Lock */
-	/* 84 */ KEY_KP_Divide,	/* Keypad / */
-	/* 85 */ KEY_KP_Multiply, /* Keypad * */
-	/* 86 */ KEY_KP_Minus,	/* Keypad - */
-	/* 87 */ KEY_KP_Plus,	/* Keypad + */
-	/* 88 */ KEY_KP_Enter,	/* Keypad Enter */
-	/* 89 */ KEY_KP_1,	/* Keypad 1 End */
-	/* 90 */ KEY_KP_2,	/* Keypad 2 Down */
-	/* 91 */ KEY_KP_3,	/* Keypad 3 Pg Down */
-	/* 92 */ KEY_KP_4,	/* Keypad 4 Left  */
-	/* 93 */ KEY_KP_5,	/* Keypad 5 */
-	/* 94 */ KEY_KP_6,	/* Keypad 6 */
-	/* 95 */ KEY_KP_7,	/* Keypad 7 Home */
-	/* 96 */ KEY_KP_8,	/* Keypad 8 Up */
-	/* 97 */ KEY_KP_9,	/* KEypad 9 Pg Up */
-	/* 98 */ KEY_KP_0,	/* Keypad 0 Ins */
-	/* 99 */ KEY_KP_Decimal,	/* Keypad . Del */
-	/* 100 */ KEY_Less,	/* < > on some keyboards */
-	/* 101 */ KEY_Menu,	/* Menu */
-	/* 102 */ KEY_NOTUSED,
-	/* 103 */ KEY_KP_Equal, /* Keypad = on Mac keyboards */
-	/* 104 */ KEY_NOTUSED,
-	/* 105 */ KEY_NOTUSED,
-	/* 106 */ KEY_NOTUSED,
-	/* 107 */ KEY_NOTUSED,
-	/* 108 */ KEY_NOTUSED,
-	/* 109 */ KEY_NOTUSED,
-	/* 110 */ KEY_NOTUSED,
-	/* 111 */ KEY_NOTUSED,
-	/* 112 */ KEY_NOTUSED,
-	/* 113 */ KEY_NOTUSED,
-	/* 114 */ KEY_NOTUSED,
-	/* 115 */ KEY_NOTUSED,
-	/* 116 */ KEY_NOTUSED,
-	/* 117 */ KEY_NOTUSED,
-	/* 118 */ KEY_NOTUSED,
-	/* 119 */ KEY_NOTUSED,
-	/* 120 */ KEY_NOTUSED,
-	/* 121 */ KEY_NOTUSED,
-	/* 122 */ KEY_NOTUSED,
-	/* 123 */ KEY_NOTUSED,
-	/* 124 */ KEY_NOTUSED,
-	/* 125 */ KEY_NOTUSED,
-	/* 126 */ KEY_NOTUSED,
-	/* 127 */ KEY_NOTUSED,
-	/* 128 */ KEY_NOTUSED,
-	/* 129 */ KEY_NOTUSED,
-	/* 130 */ KEY_NOTUSED,
-	/* 131 */ KEY_NOTUSED,
-	/* 132 */ KEY_NOTUSED,
-	/* 133 */ KEY_NOTUSED,
-	/* 134 */ KEY_NOTUSED,
-	/* 135 */ KEY_NOTUSED,
-	/* 136 */ KEY_NOTUSED,
-	/* 137 */ KEY_NOTUSED,
-	/* 138 */ KEY_NOTUSED,
-	/* 139 */ KEY_NOTUSED,
-	/* 140 */ KEY_NOTUSED,
-	/* 141 */ KEY_NOTUSED,
-	/* 142 */ KEY_NOTUSED,
-	/* 143 */ KEY_NOTUSED,
-	/* 144 */ KEY_NOTUSED,
-	/* 145 */ KEY_NOTUSED,
-	/* 146 */ KEY_NOTUSED,
-	/* 147 */ KEY_NOTUSED,
-	/* 148 */ KEY_NOTUSED,
-	/* 149 */ KEY_NOTUSED,
-	/* 150 */ KEY_NOTUSED,
-	/* 151 */ KEY_NOTUSED,
-	/* 152 */ KEY_NOTUSED,
-	/* 153 */ KEY_NOTUSED,
-	/* 154 */ KEY_NOTUSED,
-	/* 155 */ KEY_NOTUSED,
-	/* 156 */ KEY_NOTUSED,
-	/* 157 */ KEY_NOTUSED,
-	/* 158 */ KEY_NOTUSED,
-	/* 159 */ KEY_NOTUSED,
-	/* 160 */ KEY_NOTUSED,
-	/* 161 */ KEY_NOTUSED,
-	/* 162 */ KEY_NOTUSED,
-	/* 163 */ KEY_NOTUSED,
-	/* 164 */ KEY_NOTUSED,
-	/* 165 */ KEY_NOTUSED,
-	/* 166 */ KEY_NOTUSED,
-	/* 167 */ KEY_NOTUSED,
-	/* 168 */ KEY_NOTUSED,
-	/* 169 */ KEY_NOTUSED,
-	/* 170 */ KEY_NOTUSED,
-	/* 171 */ KEY_NOTUSED,
-	/* 172 */ KEY_NOTUSED,
-	/* 173 */ KEY_NOTUSED,
-	/* 174 */ KEY_NOTUSED,
-	/* 175 */ KEY_NOTUSED,
-	/* 176 */ KEY_NOTUSED,
-	/* 177 */ KEY_NOTUSED,
-	/* 178 */ KEY_NOTUSED,
-	/* 179 */ KEY_NOTUSED,
-	/* 180 */ KEY_NOTUSED,
-	/* 181 */ KEY_NOTUSED,
-	/* 182 */ KEY_NOTUSED,
-	/* 183 */ KEY_NOTUSED,
-	/* 184 */ KEY_NOTUSED,
-	/* 185 */ KEY_NOTUSED,
-	/* 186 */ KEY_NOTUSED,
-	/* 187 */ KEY_NOTUSED,
-	/* 188 */ KEY_NOTUSED,
-	/* 189 */ KEY_NOTUSED,
-	/* 190 */ KEY_NOTUSED,
-	/* 191 */ KEY_NOTUSED,
-	/* 192 */ KEY_NOTUSED,
-	/* 193 */ KEY_NOTUSED,
-	/* 194 */ KEY_NOTUSED,
-	/* 195 */ KEY_NOTUSED,
-	/* 196 */ KEY_NOTUSED,
-	/* 197 */ KEY_NOTUSED,
-	/* 198 */ KEY_NOTUSED,
-	/* 199 */ KEY_NOTUSED,
-	/* 200 */ KEY_NOTUSED,
-	/* 201 */ KEY_NOTUSED,
-	/* 202 */ KEY_NOTUSED,
-	/* 203 */ KEY_NOTUSED,
-	/* 204 */ KEY_NOTUSED,
-	/* 205 */ KEY_NOTUSED,
-	/* 206 */ KEY_NOTUSED,
-	/* 207 */ KEY_NOTUSED,
-	/* 208 */ KEY_NOTUSED,
-	/* 209 */ KEY_NOTUSED,
-	/* 210 */ KEY_NOTUSED,
-	/* 211 */ KEY_NOTUSED,
-	/* 212 */ KEY_NOTUSED,
-	/* 213 */ KEY_NOTUSED,
-	/* 214 */ KEY_NOTUSED,
-	/* 215 */ KEY_NOTUSED,
-	/* 216 */ KEY_NOTUSED,
-	/* 217 */ KEY_NOTUSED,
-	/* 218 */ KEY_NOTUSED,
-	/* 219 */ KEY_NOTUSED,
-	/* 220 */ KEY_NOTUSED,
-	/* 221 */ KEY_NOTUSED,
-	/* 222 */ KEY_NOTUSED,
-	/* 223 */ KEY_NOTUSED,
-	/* 224 */ KEY_LCtrl,	/* Left Control */
-	/* 225 */ KEY_ShiftL,	/* Left Shift */
-	/* 226 */ KEY_Alt,	/* Left Alt */
-	/* 227 */ KEY_LMeta,	/* Left Meta */
-	/* 228 */ KEY_RCtrl,	/* Right Control */
-	/* 229 */ KEY_ShiftR,	/* Right Shift */
-	/* 230 */ KEY_AltLang,	/* Right Alt, AKA AltGr */
-	/* 231 */ KEY_LMeta,	/* Right Meta XXX */
-};
-
-#define WS_USB_MAP_SIZE (sizeof(wsUsbMap)/sizeof(unsigned char))
-
-/* Map for adb keyboards  */
-static CARD8 wsAdbMap[] = {
-	/* 0 */ KEY_A,
-	/* 1 */ KEY_S,
-	/* 2 */ KEY_D,
-	/* 3 */ KEY_F,
-	/* 4 */ KEY_H,
-	/* 5 */ KEY_G,
-	/* 6 */ KEY_Z,
-	/* 7 */ KEY_X,
-	/* 8 */ KEY_C,
-	/* 9 */ KEY_V,
-	/* 10 */ KEY_UNKNOWN,	/* @ # on french keyboards */
-	/* 11 */ KEY_B,
-	/* 12 */ KEY_Q,
-	/* 13 */ KEY_W,
-	/* 14 */ KEY_E,
-	/* 15 */ KEY_R,
-	/* 16 */ KEY_Y,
-	/* 17 */ KEY_T,
-	/* 18 */ KEY_1,
-	/* 19 */ KEY_2,
-	/* 20 */ KEY_3,
-	/* 21 */ KEY_4,
-	/* 22 */ KEY_6,
-	/* 23 */ KEY_5,
-	/* 24 */ KEY_Equal,
-	/* 25 */ KEY_9,
-	/* 26 */ KEY_7,
-	/* 27 */ KEY_Minus,
-	/* 28 */ KEY_8,
-	/* 29 */ KEY_0,
-	/* 30 */ KEY_RBrace,
-	/* 31 */ KEY_O,
-	/* 32 */ KEY_U,
-	/* 33 */ KEY_LBrace,
-	/* 34 */ KEY_I,
-	/* 35 */ KEY_P,
-	/* 36 */ KEY_Enter,
-	/* 37 */ KEY_L,
-	/* 38 */ KEY_J,
-	/* 39 */ KEY_Quote,
-	/* 40 */ KEY_K,
-	/* 41 */ KEY_SemiColon,
-	/* 42 */ KEY_BSlash,
-	/* 43 */ KEY_Comma,
-	/* 44 */ KEY_Slash,
-	/* 45 */ KEY_N,
-	/* 46 */ KEY_M,
-	/* 47 */ KEY_Period,
-	/* 48 */ KEY_Tab,
-	/* 49 */ KEY_Space,
-	/* 50 */ KEY_Tilde,
-	/* 51 */ KEY_Delete,
-	/* 52 */ KEY_AltLang,
-	/* 53 */ KEY_Escape,
-	/* 54 */ KEY_LCtrl,
-	/* 55 */ KEY_Alt,
-	/* 56 */ KEY_ShiftL,
-	/* 57 */ KEY_CapsLock,
-	/* 58 */ KEY_LMeta,
-	/* 59 */ KEY_Left,
-	/* 60 */ KEY_Right,
-	/* 61 */ KEY_Down,
-	/* 62 */ KEY_Up,
-	/* 63 */ KEY_UNKNOWN,	/* Fn */
-	/* 64 */ KEY_NOTUSED,
-	/* 65 */ KEY_KP_Decimal,
-	/* 66 */ KEY_NOTUSED,
-	/* 67 */ KEY_KP_Multiply,
-	/* 68 */ KEY_NOTUSED,
-	/* 69 */ KEY_KP_Plus,
-	/* 70 */ KEY_NOTUSED,
-	/* 71 */ KEY_UNKNOWN,	/* Clear */
-	/* 72 */ KEY_NOTUSED, 
-	/* 73 */ KEY_NOTUSED,
-	/* 74 */ KEY_NOTUSED,
-	/* 75 */ KEY_KP_Divide,
-	/* 76 */ KEY_KP_Enter,
-	/* 77 */ KEY_NOTUSED,
-	/* 78 */ KEY_KP_Minus,
-	/* 79 */ KEY_NOTUSED,
-	/* 80 */ KEY_NOTUSED,
-	/* 81 */ KEY_KP_Equal,	/* Keypad = */
-	/* 82 */ KEY_KP_0,
-	/* 83 */ KEY_KP_1,
-	/* 84 */ KEY_KP_2,
-	/* 85 */ KEY_KP_3,
-	/* 86 */ KEY_KP_4,
-	/* 87 */ KEY_KP_5,
-	/* 88 */ KEY_KP_6,
-	/* 89 */ KEY_KP_7,
-	/* 90 */ KEY_NOTUSED,
-	/* 91 */ KEY_KP_8,
-	/* 92 */ KEY_KP_9,
-	/* 93 */ KEY_NOTUSED,
-	/* 94 */ KEY_NOTUSED,
-	/* 95 */ KEY_UNKNOWN,	/* Keypad ,  */
-	/* 96 */ KEY_F5,
-	/* 97 */ KEY_F6,
-	/* 98 */ KEY_F7,
-	/* 99 */ KEY_F3,
-	/* 100 */ KEY_F8,
-	/* 101 */ KEY_F9,
-	/* 102 */ KEY_NOTUSED,
-	/* 103 */ KEY_F11,
-	/* 104 */ KEY_NOTUSED,
-	/* 105 */ KEY_NOTUSED,
-	/* 106 */ KEY_KP_Enter,
-	/* 107 */ KEY_NOTUSED,
-	/* 108 */ KEY_NOTUSED,
-	/* 109 */ KEY_F10,
-	/* 110 */ KEY_NOTUSED,
-	/* 111 */ KEY_F12,
-	/* 112 */ KEY_NOTUSED,
-	/* 113 */ KEY_NOTUSED,
-	/* 114 */ KEY_NOTUSED,
-	/* 115 */ KEY_Home,
-	/* 116 */ KEY_PgUp,
-	/* 117 */ KEY_NOTUSED,
-	/* 118 */ KEY_F4,
-	/* 119 */ KEY_End,
-	/* 120 */ KEY_F2,
-	/* 121 */ KEY_PgDown,
-	/* 122 */ KEY_F1,
-	/* 123 */ KEY_NOTUSED,
-	/* 124 */ KEY_NOTUSED,
-	/* 125 */ KEY_NOTUSED,
-	/* 126 */ KEY_NOTUSED,
-	/* 127 */ KEY_NOTUSED,
-	/* 128 */ KEY_NOTUSED,
-	/* 129 */ KEY_NOTUSED,
-	/* 130 */ KEY_NOTUSED,
-	/* 131 */ KEY_NOTUSED,
-	/* 132 */ KEY_NOTUSED,
-	/* 133 */ KEY_NOTUSED,
-	/* 134 */ KEY_NOTUSED,
-	/* 135 */ KEY_NOTUSED,
-	/* 136 */ KEY_NOTUSED,
-	/* 137 */ KEY_NOTUSED,
-	/* 138 */ KEY_NOTUSED,
-	/* 139 */ KEY_NOTUSED,
-	/* 140 */ KEY_NOTUSED,
-	/* 141 */ KEY_NOTUSED,
-	/* 142 */ KEY_NOTUSED,
-	/* 143 */ KEY_NOTUSED,
-	/* 144 */ KEY_NOTUSED,
-	/* 145 */ KEY_NOTUSED,
-	/* 146 */ KEY_NOTUSED,
-	/* 147 */ KEY_NOTUSED,
-	/* 148 */ KEY_NOTUSED,
-	/* 149 */ KEY_NOTUSED,
-	/* 150 */ KEY_NOTUSED,
-	/* 151 */ KEY_NOTUSED,
-	/* 152 */ KEY_NOTUSED,
-	/* 153 */ KEY_NOTUSED,
-	/* 154 */ KEY_NOTUSED,
-	/* 155 */ KEY_NOTUSED,
-	/* 156 */ KEY_NOTUSED,
-	/* 157 */ KEY_NOTUSED,
-	/* 158 */ KEY_NOTUSED,
-	/* 159 */ KEY_NOTUSED,
-	/* 160 */ KEY_NOTUSED,
-	/* 161 */ KEY_NOTUSED,
-	/* 162 */ KEY_NOTUSED,
-	/* 163 */ KEY_NOTUSED,
-	/* 164 */ KEY_NOTUSED,
-	/* 165 */ KEY_NOTUSED,
-	/* 166 */ KEY_NOTUSED,
-	/* 167 */ KEY_NOTUSED,
-	/* 168 */ KEY_NOTUSED,
-	/* 169 */ KEY_NOTUSED,
-	/* 170 */ KEY_NOTUSED,
-	/* 171 */ KEY_NOTUSED,
-	/* 172 */ KEY_NOTUSED,
-	/* 173 */ KEY_NOTUSED,
-	/* 174 */ KEY_NOTUSED,
-	/* 175 */ KEY_NOTUSED,
-	/* 176 */ KEY_NOTUSED,
-	/* 177 */ KEY_NOTUSED,
-	/* 178 */ KEY_NOTUSED,
-	/* 179 */ KEY_NOTUSED,
-	/* 180 */ KEY_NOTUSED,
-	/* 181 */ KEY_NOTUSED,
-	/* 182 */ KEY_NOTUSED,
-	/* 183 */ KEY_NOTUSED,
-	/* 184 */ KEY_NOTUSED,
-	/* 185 */ KEY_NOTUSED,
-	/* 186 */ KEY_NOTUSED,
-	/* 187 */ KEY_NOTUSED,
-	/* 188 */ KEY_NOTUSED,
-	/* 189 */ KEY_NOTUSED,
-	/* 190 */ KEY_NOTUSED,
-	/* 191 */ KEY_NOTUSED,
-	/* 192 */ KEY_NOTUSED,
-	/* 193 */ KEY_NOTUSED,
-	/* 194 */ KEY_NOTUSED,
-	/* 195 */ KEY_NOTUSED,
-	/* 196 */ KEY_NOTUSED,
-	/* 197 */ KEY_NOTUSED,
-	/* 198 */ KEY_NOTUSED,
-	/* 199 */ KEY_NOTUSED,
-	/* 200 */ KEY_NOTUSED,
-	/* 201 */ KEY_NOTUSED,
-	/* 202 */ KEY_NOTUSED,
-	/* 203 */ KEY_NOTUSED,
-	/* 204 */ KEY_NOTUSED,
-	/* 205 */ KEY_NOTUSED,
-	/* 206 */ KEY_NOTUSED,
-	/* 207 */ KEY_NOTUSED,
-	/* 208 */ KEY_NOTUSED,
-	/* 209 */ KEY_NOTUSED,
-	/* 210 */ KEY_NOTUSED,
-	/* 211 */ KEY_NOTUSED,
-	/* 212 */ KEY_NOTUSED,
-	/* 213 */ KEY_NOTUSED,
-	/* 214 */ KEY_NOTUSED,
-	/* 215 */ KEY_NOTUSED,
-	/* 216 */ KEY_NOTUSED,
-	/* 217 */ KEY_NOTUSED,
-	/* 218 */ KEY_NOTUSED,
-	/* 219 */ KEY_NOTUSED,
-	/* 220 */ KEY_NOTUSED,
-	/* 221 */ KEY_NOTUSED,
-	/* 222 */ KEY_NOTUSED,
-	/* 223 */ KEY_NOTUSED,
-};
-
-#define WS_ADB_MAP_SIZE (sizeof(wsAdbMap)/sizeof(unsigned char))
-
-static CARD8 wsSunMap[] = {
-	/* 0x00 */ KEY_NOTUSED,
-	/* 0x01 */ KEY_NOTUSED,		/* stop */
-	/* 0x02 */ KEY_NOTUSED,		/* BrightnessDown / S-VolumeDown */
-	/* 0x03 */ KEY_NOTUSED,		/* again */
-	/* 0x04 */ KEY_NOTUSED,		/* BridgtnessUp / S-VolumeUp */
-	/* 0x05 */ KEY_F1,
-	/* 0x06 */ KEY_F2,
-	/* 0x07 */ KEY_F10,
-	/* 0x08 */ KEY_F3,
-	/* 0x09 */ KEY_F11,
-	/* 0x0a */ KEY_F4,
-	/* 0x0b */ KEY_F12,
-	/* 0x0c */ KEY_F5,
-	/* 0x0d */ KEY_AltLang,
-	/* 0x0e */ KEY_F6,
-	/* 0x0f */ KEY_NOTUSED,
-	/* 0x10 */ KEY_F7,
-	/* 0x11 */ KEY_F8,
-	/* 0x12 */ KEY_F9,
-	/* 0x13 */ KEY_Alt,
-	/* 0x14 */ KEY_Up,
-	/* 0x15 */ KEY_Pause,
-	/* 0x16 */ KEY_Print,
-	/* 0x17 */ KEY_NOTUSED,		/* props */
-	/* 0x18 */ KEY_Left,
-	/* 0x19 */ KEY_ScrollLock,
-	/* 0x1a */ KEY_NOTUSED,		/* undo */
-	/* 0x1b */ KEY_Down,
-	/* 0x1c */ KEY_Right,
-	/* 0x1d */ KEY_Escape,
-	/* 0x1e */ KEY_1,
-	/* 0x1f */ KEY_2,
-	/* 0x20 */ KEY_3,
-	/* 0x21 */ KEY_4,
-	/* 0x22 */ KEY_5,
-	/* 0x23 */ KEY_6,
-	/* 0x24 */ KEY_7,
-	/* 0x25 */ KEY_8,
-	/* 0x26 */ KEY_9,
-	/* 0x27 */ KEY_0,
-	/* 0x28 */ KEY_Minus,
-	/* 0x29 */ KEY_Equal,
-	/* 0x2a */ KEY_Tilde,
-	/* 0x2b */ KEY_BackSpace,
-	/* 0x2c */ KEY_Insert,
-	/* 0x2d */ KEY_KP_Equal,
-	/* 0x2e */ KEY_KP_Divide,
-	/* 0x2f */ KEY_KP_Multiply,
-	/* 0x30 */ KEY_NOTUSED,
-	/* 0x31 */ KEY_NOTUSED,		/* front */
-	/* 0x32 */ KEY_KP_Decimal,
-	/* 0x33 */ KEY_NOTUSED,		/* copy */
-	/* 0x34 */ KEY_Home,
-	/* 0x35 */ KEY_Tab,
-	/* 0x36 */ KEY_Q,
-	/* 0x37 */ KEY_W,
-	/* 0x38 */ KEY_E,
-	/* 0x39 */ KEY_R,
-	/* 0x3a */ KEY_T,
-	/* 0x3b */ KEY_Y,
-	/* 0x3c */ KEY_U,
-	/* 0x3d */ KEY_I,
-	/* 0x3e */ KEY_O,
-	/* 0x3f */ KEY_P,
-	/* 0x40 */ KEY_LBrace,
-	/* 0x41 */ KEY_RBrace,
-	/* 0x42 */ KEY_Delete,
-	/* 0x43 */ KEY_NOTUSED,		/* compose */
-	/* 0x44 */ KEY_KP_7,
-	/* 0x45 */ KEY_KP_8,
-	/* 0x46 */ KEY_KP_9,
-	/* 0x47 */ KEY_KP_Minus,
-	/* 0x48 */ KEY_NOTUSED,		/* open */
-	/* 0x49 */ KEY_NOTUSED,		/* paste */
-	/* 0x4a */ KEY_End,
-	/* 0x4b */ KEY_NOTUSED,
-	/* 0x4c */ KEY_LCtrl,
-	/* 0x4d */ KEY_A,
-	/* 0x4e */ KEY_S,
-	/* 0x4f */ KEY_D,
-	/* 0x50 */ KEY_F,
-	/* 0x51 */ KEY_G,
-	/* 0x52 */ KEY_H,
-	/* 0x53 */ KEY_J,
-	/* 0x54 */ KEY_K,
-	/* 0x55 */ KEY_L,
-	/* 0x56 */ KEY_SemiColon,
-	/* 0x57 */ KEY_Quote,
-	/* 0x58 */ KEY_BSlash,
-	/* 0x59 */ KEY_Enter,
-	/* 0x5a */ KEY_KP_Enter,
-	/* 0x5b */ KEY_KP_4,
-	/* 0x5c */ KEY_KP_5,
-	/* 0x5d */ KEY_KP_6,
-	/* 0x5e */ KEY_KP_0,
-	/* 0x5f */ KEY_NOTUSED,		/* find */
-	/* 0x60 */ KEY_PgUp,
-	/* 0x61 */ KEY_NOTUSED,		/* cut */
-	/* 0x62 */ KEY_NumLock,
-	/* 0x63 */ KEY_ShiftL,
-	/* 0x64 */ KEY_Z,
-	/* 0x65 */ KEY_X,
-	/* 0x66 */ KEY_C,
-	/* 0x67 */ KEY_V,
-	/* 0x68 */ KEY_B,
-	/* 0x69 */ KEY_N,
-	/* 0x6a */ KEY_M,
-	/* 0x6b */ KEY_Comma,
-	/* 0x6c */ KEY_Period,
-	/* 0x6d */ KEY_Slash,
-	/* 0x6e */ KEY_ShiftR,
-	/* 0x6f */ KEY_NOTUSED,		/* linefeed */
-	/* 0x70 */ KEY_KP_1,
-	/* 0x71 */ KEY_KP_2,
-	/* 0x72 */ KEY_KP_3,
-	/* 0x73 */ KEY_NOTUSED,
-	/* 0x74 */ KEY_NOTUSED,
-	/* 0x75 */ KEY_NOTUSED,
-	/* 0x76 */ KEY_NOTUSED,		/* help */
-	/* 0x77 */ KEY_CapsLock,
-	/* 0x78 */ KEY_LMeta,
-	/* 0x79 */ KEY_Space,
-	/* 0x7a */ KEY_RMeta,
-	/* 0x7b */ KEY_PgDown,
-	/* 0x7c */ KEY_NOTUSED,
-	/* 0x7d */ KEY_KP_Plus,
-	/* 0x7e */ KEY_NOTUSED,
-	/* 0x7f */ KEY_NOTUSED
-};
-
-#define WS_SUN_MAP_SIZE (sizeof(wsSunMap)/sizeof(unsigned char))
-
-/*
- * Translate raw wskbd keyboard event values to XFree86 standard keycodes
- * (based on the AT keyboard scan codes using the tables above
- */
-int 
-WSKbdToKeycode(int keycode)
-{
-	switch (xf86Info.wsKbdType) {
-	case WSKBD_TYPE_PC_XT:
-	case WSKBD_TYPE_PC_AT:
-		/* No translation needed */
-		return keycode;
-	case WSKBD_TYPE_USB:
-		if (keycode < 0 || keycode >= WS_USB_MAP_SIZE) 
-			return KEY_UNKNOWN;
-		else 
-			return wsUsbMap[keycode];
-#ifdef WSKBD_TYPE_ADB
-	case WSKBD_TYPE_ADB:
-		if (keycode < 0 || keycode >= WS_ADB_MAP_SIZE) 
-			return KEY_UNKNOWN;
-		else 
-			return wsAdbMap[keycode];
-#endif
-#ifdef WSKBD_TYPE_SUN
-	case WSKBD_TYPE_SUN:
-#ifdef WSKBD_TYPE_SUN5
-	case WSKBD_TYPE_SUN5:
-#endif
-		if (keycode < 0 || keycode >= WS_SUN_MAP_SIZE)
-			return KEY_UNKNOWN;
-		else
-			return wsSunMap[keycode];
-#endif
-	default:
-		ErrorF("Unknown wskbd type %d\n", xf86Info.wsKbdType);
-		return KEY_UNKNOWN;
-	}
-}
-
-#endif /* WSCONS_SUPPORT */
diff --git a/hw/xfree86/common/xf86KbdLnx.c b/hw/xfree86/common/xf86KbdLnx.c
deleted file mode 100644
index c5361f5..0000000
--- a/hw/xfree86/common/xf86KbdLnx.c
+++ /dev/null
@@ -1,651 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86KbdLnx.c,v 3.17 2003/08/24 17:36:53 dawes Exp $ */
-/*
- * Linux version of keymapping setup. The kernel (since 0.99.14) has support
- * for fully remapping the keyboard, but there are some differences between
- * the Linux map and the SVR4 map (esp. in the extended keycodes). We also
- * remove the restriction on what keycodes can be remapped.
- * Orest Zborowski.
- */
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/*
- * Copyright (c) 1994-2001 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-/* $XConsortium: xf86KbdLnx.c /main/7 1996/10/19 17:59:00 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "atKeynames.h"
-
-#include "xf86Keymap.h"
-
-/*
- * LegalModifier --
- *      determine whether a key is a legal modifier key, i.e send a
- *      press/release sequence.
- */
-
-/*ARGSUSED*/
-Bool
-LegalModifier(unsigned int key, DevicePtr pDev)
-{
-  return (TRUE);
-}
-
-/*
- * xf86KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-static void readKernelMapping(KeySymsPtr pKeySyms, CARD8 *pModMap);
-
-void
-xf86KbdGetMapping (KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-  KeySym        *k;
-  char          type;
-  int           i;
-
-  readKernelMapping(pKeySyms, pModMap);
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  xf86Info.kbdType =
-    ioctl(xf86Info.consoleFd, KDGKBTYPE, &type) != -1 ? type : KB_101;
-
-  pKeySyms->map        = map;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  pKeySyms->maxKeyCode = MAX_KEYCODE; 
-}
-
-#include <linux/keyboard.h>
-
-static KeySym linux_to_x[256] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_BackSpace,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_nobreakspace,XK_exclamdown,	XK_cent,	XK_sterling,
-	XK_currency,	XK_yen,		XK_brokenbar,	XK_section,
-	XK_diaeresis,	XK_copyright,	XK_ordfeminine,	XK_guillemotleft,
-	XK_notsign,	XK_hyphen,	XK_registered,	XK_macron,
-	XK_degree,	XK_plusminus,	XK_twosuperior,	XK_threesuperior,
-	XK_acute,	XK_mu,		XK_paragraph,	XK_periodcentered,
-	XK_cedilla,	XK_onesuperior,	XK_masculine,	XK_guillemotright,
-	XK_onequarter,	XK_onehalf,	XK_threequarters,XK_questiondown,
-	XK_Agrave,	XK_Aacute,	XK_Acircumflex,	XK_Atilde,
-	XK_Adiaeresis,	XK_Aring,	XK_AE,		XK_Ccedilla,
-	XK_Egrave,	XK_Eacute,	XK_Ecircumflex,	XK_Ediaeresis,
-	XK_Igrave,	XK_Iacute,	XK_Icircumflex,	XK_Idiaeresis,
-	XK_ETH,		XK_Ntilde,	XK_Ograve,	XK_Oacute,
-	XK_Ocircumflex,	XK_Otilde,	XK_Odiaeresis,	XK_multiply,
-	XK_Ooblique,	XK_Ugrave,	XK_Uacute,	XK_Ucircumflex,
-	XK_Udiaeresis,	XK_Yacute,	XK_THORN,	XK_ssharp,
-	XK_agrave,	XK_aacute,	XK_acircumflex,	XK_atilde,
-	XK_adiaeresis,	XK_aring,	XK_ae,		XK_ccedilla,
-	XK_egrave,	XK_eacute,	XK_ecircumflex,	XK_ediaeresis,
-	XK_igrave,	XK_iacute,	XK_icircumflex,	XK_idiaeresis,
-	XK_eth,		XK_ntilde,	XK_ograve,	XK_oacute,
-	XK_ocircumflex,	XK_otilde,	XK_odiaeresis,	XK_division,
-	XK_oslash,	XK_ugrave,	XK_uacute,	XK_ucircumflex,
-	XK_udiaeresis,	XK_yacute,	XK_thorn,	XK_ydiaeresis
-};
-
-/*
- * Maps the AT keycodes to Linux keycodes
- */
-static unsigned char at2lnx[NUM_KEYCODES] =
-{
-	0x01,	/* KEY_Escape */	0x02,	/* KEY_1 */
-	0x03,	/* KEY_2 */		0x04,	/* KEY_3 */
-	0x05,	/* KEY_4 */		0x06,	/* KEY_5 */
-	0x07,	/* KEY_6 */		0x08,	/* KEY_7 */
-	0x09,	/* KEY_8 */		0x0a,	/* KEY_9 */
-	0x0b,	/* KEY_0 */		0x0c,	/* KEY_Minus */
-	0x0d,	/* KEY_Equal */		0x0e,	/* KEY_BackSpace */
-	0x0f,	/* KEY_Tab */		0x10,	/* KEY_Q */
-	0x11,	/* KEY_W */		0x12,	/* KEY_E */
-	0x13,	/* KEY_R */		0x14,	/* KEY_T */
-	0x15,	/* KEY_Y */		0x16,	/* KEY_U */
-	0x17,	/* KEY_I */		0x18,	/* KEY_O */
-	0x19,	/* KEY_P */		0x1a,	/* KEY_LBrace */
-	0x1b,	/* KEY_RBrace */	0x1c,	/* KEY_Enter */
-	0x1d,	/* KEY_LCtrl */		0x1e,	/* KEY_A */
-	0x1f,	/* KEY_S */		0x20,	/* KEY_D */
-	0x21,	/* KEY_F */		0x22,	/* KEY_G */
-	0x23,	/* KEY_H */		0x24,	/* KEY_J */
-	0x25,	/* KEY_K */		0x26,	/* KEY_L */
-	0x27,	/* KEY_SemiColon */	0x28,	/* KEY_Quote */
-	0x29,	/* KEY_Tilde */		0x2a,	/* KEY_ShiftL */
-	0x2b,	/* KEY_BSlash */	0x2c,	/* KEY_Z */
-	0x2d,	/* KEY_X */		0x2e,	/* KEY_C */
-	0x2f,	/* KEY_V */		0x30,	/* KEY_B */
-	0x31,	/* KEY_N */		0x32,	/* KEY_M */
-	0x33,	/* KEY_Comma */		0x34,	/* KEY_Period */
-	0x35,	/* KEY_Slash */		0x36,	/* KEY_ShiftR */
-	0x37,	/* KEY_KP_Multiply */	0x38,	/* KEY_Alt */
-	0x39,	/* KEY_Space */		0x3a,	/* KEY_CapsLock */
-	0x3b,	/* KEY_F1 */		0x3c,	/* KEY_F2 */
-	0x3d,	/* KEY_F3 */		0x3e,	/* KEY_F4 */
-	0x3f,	/* KEY_F5 */		0x40,	/* KEY_F6 */
-	0x41,	/* KEY_F7 */		0x42,	/* KEY_F8 */
-	0x43,	/* KEY_F9 */		0x44,	/* KEY_F10 */
-	0x45,	/* KEY_NumLock */	0x46,	/* KEY_ScrollLock */
-	0x47,	/* KEY_KP_7 */		0x48,	/* KEY_KP_8 */
-	0x49,	/* KEY_KP_9 */		0x4a,	/* KEY_KP_Minus */
-	0x4b,	/* KEY_KP_4 */		0x4c,	/* KEY_KP_5 */
-	0x4d,	/* KEY_KP_6 */		0x4e,	/* KEY_KP_Plus */
-	0x4f,	/* KEY_KP_1 */		0x50,	/* KEY_KP_2 */
-	0x51,	/* KEY_KP_3 */		0x52,	/* KEY_KP_0 */
-	0x53,	/* KEY_KP_Decimal */	0x54,	/* KEY_SysReqest */
-	0x00,	/* 0x55 */		0x56,	/* KEY_Less */
-	0x57,	/* KEY_F11 */		0x58,	/* KEY_F12 */
-	0x66,	/* KEY_Home */		0x67,	/* KEY_Up */
-	0x68,	/* KEY_PgUp */		0x69,	/* KEY_Left */
-	0x5d,	/* KEY_Begin */		0x6a,	/* KEY_Right */
-	0x6b,	/* KEY_End */		0x6c,	/* KEY_Down */
-	0x6d,	/* KEY_PgDown */	0x6e,	/* KEY_Insert */
-	0x6f,	/* KEY_Delete */	0x60,	/* KEY_KP_Enter */
-	0x61,	/* KEY_RCtrl */		0x77,	/* KEY_Pause */
-	0x63,	/* KEY_Print */		0x62,	/* KEY_KP_Divide */
-	0x64,	/* KEY_AltLang */	0x65,	/* KEY_Break */
-	0x00,	/* KEY_LMeta */		0x00,	/* KEY_RMeta */
-	0x7A,	/* KEY_Menu/FOCUS_PF11*/0x00,	/* 0x6e */
-	0x7B,	/* FOCUS_PF12 */	0x00,	/* 0x70 */
-	0x00,	/* 0x71 */		0x00,	/* 0x72 */
-	0x59,	/* FOCUS_PF2 */		0x78,	/* FOCUS_PF9 */
-	0x00,	/* 0x75 */		0x00,	/* 0x76 */
-	0x5A,	/* FOCUS_PF3 */		0x5B,	/* FOCUS_PF4 */
-	0x5C,	/* FOCUS_PF5 */		0x5D,	/* FOCUS_PF6 */
-	0x5E,	/* FOCUS_PF7 */		0x5F,	/* FOCUS_PF8 */
-	0x7C,	/* JAP_86 */		0x79,	/* FOCUS_PF10 */
-	0x00,	/* 0x7f */
-};
-#define NUM_AT2LNX (sizeof(at2lnx) / sizeof(at2lnx[0]))
-
-#define NUM_CUSTOMKEYS	NR_KEYS
-
-u_char SpecialServerMap[NUM_CUSTOMKEYS];
-
-static void
-readKernelMapping(KeySymsPtr pKeySyms, CARD8 *pModMap)
-{
-  KeySym        *k;
-  int           i;
-  int           maxkey;
-  static unsigned char tbl[GLYPHS_PER_KEY] =
-  {
-	0,	/* unshifted */
-	1,	/* shifted */
-	0,	/* modeswitch unshifted */
-	0	/* modeswitch shifted */
-  };
-
-  /*
-   * Read the mapping from the kernel.
-   * Since we're still using the XFree86 scancode->AT keycode mapping
-   * routines, we need to convert the AT keycodes to Linux keycodes,
-   * then translate the Linux keysyms into X keysyms.
-   *
-   * First, figure out which tables to use for the modeswitch columns
-   * above, from the XF86Config fields.
-   */
-  tbl[2] = 8;	/* alt */
-  tbl[3] = tbl[2] | 1;
-
-  if (xf86Info.kbdCustomKeycodes) {
-    k = map;
-    maxkey = NUM_CUSTOMKEYS;
-  }
-  else {
-    k = map+GLYPHS_PER_KEY;
-    maxkey = NUM_AT2LNX;
-  }
-
-  for (i = 0; i < maxkey; ++i)
-  {
-    struct kbentry kbe;
-    int j;
-
-    if (xf86Info.kbdCustomKeycodes)
-      kbe.kb_index = i;
-    else
-      kbe.kb_index = at2lnx[i];
-
-    for (j = 0; j < GLYPHS_PER_KEY; ++j, ++k)
-    {
-      unsigned short kval;
-
-      *k = NoSymbol;
-
-      kbe.kb_table = tbl[j];
-      if (
-	  (!xf86Info.kbdCustomKeycodes && kbe.kb_index == 0) ||
-	  ioctl(xf86Info.consoleFd, KDGKBENT, &kbe))
-	continue;
-
-      kval = KVAL(kbe.kb_value);
-      switch (KTYP(kbe.kb_value))
-      {
-      case KT_LATIN:
-      case KT_LETTER:
-	*k = linux_to_x[kval];
-	break;
-
-      case KT_FN:
-	if (kval <= 19)
-	  *k = XK_F1 + kval;
-	else switch (kbe.kb_value)
-	{
-	case K_FIND:
-	  *k = XK_Home; /* or XK_Find */
-	  break;
-	case K_INSERT:
-	  *k = XK_Insert;
-	  break;
-	case K_REMOVE:
-	  *k = XK_Delete;
-	  break;
-	case K_SELECT:
-	  *k = XK_End; /* or XK_Select */
-	  break;
-	case K_PGUP:
-	  *k = XK_Prior;
-	  break;
-	case K_PGDN:
-	  *k = XK_Next;
-	  break;
-	case K_HELP:
-	  *k = XK_Help;
-	  break;
-	case K_DO:
-	  *k = XK_Execute;
-	  break;
-	case K_PAUSE:
-	  *k = XK_Pause;
-	  break;
-	case K_MACRO:
-	  *k = XK_Menu;
-	  break;
-	default:
-	  break;
-	}
-	break;
-
-      case KT_SPEC:
-	switch (kbe.kb_value)
-	{
-	case K_ENTER:
-	  *k = XK_Return;
-	  break;
-	case K_BREAK:
-	  *k = XK_Break;
-	  break;
-	case K_CAPS:
-	  *k = XK_Caps_Lock;
-	  break;
-	case K_NUM:
-	  *k = XK_Num_Lock;
-	  break;
-	case K_HOLD:
-	  *k = XK_Scroll_Lock;
-	  break;
-	case K_COMPOSE:
-          *k = XK_Multi_key;
-	  break;
-	default:
-	  break;
-	}
-	break;
-
-      case KT_PAD:
-	switch (kbe.kb_value)
-	{
-	case K_PPLUS:
-	  *k = XK_KP_Add;
-	  break;
-	case K_PMINUS:
-	  *k = XK_KP_Subtract;
-	  break;
-	case K_PSTAR:
-	  *k = XK_KP_Multiply;
-	  break;
-	case K_PSLASH:
-	  *k = XK_KP_Divide;
-	  break;
-	case K_PENTER:
-	  *k = XK_KP_Enter;
-	  break;
-	case K_PCOMMA:
-	  *k = XK_KP_Separator;
-	  break;
-	case K_PDOT:
-	  *k = XK_KP_Decimal;
-	  break;
-	case K_PPLUSMINUS:
-	  *k = XK_KP_Subtract;
-	  break;
-	default:
-	  if (kval <= 9)
-	    *k = XK_KP_0 + kval;
-	  break;
-	}
-	break;
-
-      /*
-       * KT_DEAD keys are for accelerated diacritical creation.
-       */
-      case KT_DEAD:
-	switch (kbe.kb_value)
-	  {
-	  case K_DGRAVE:
-	    *k = XK_dead_grave;
-	    break;
-	  case K_DACUTE:
-	    *k = XK_dead_acute;
-	    break;
-	  case K_DCIRCM:
-	    *k = XK_dead_circumflex;
-	    break;
-	  case K_DTILDE:
-	    *k = XK_dead_tilde;
-	    break;
-	  case K_DDIERE:
-	    *k = XK_dead_diaeresis;
-	    break;
-	  }
-	break;
-
-      case KT_CUR:
-	switch (kbe.kb_value)
-	{
-	case K_DOWN:
-	  *k = XK_Down;
-	  break;
-	case K_LEFT:
-	  *k = XK_Left;
-	  break;
-	case K_RIGHT:
-	  *k = XK_Right;
-	  break;
-	case K_UP:
-	  *k = XK_Up;
-	  break;
-	}
-	break;
-
-      case KT_SHIFT:
-	switch (kbe.kb_value)
-	{
-	case K_ALTGR:
-	  *k = XK_Alt_R;
-	  break;
-	case K_ALT:
-	  *k = (kbe.kb_index == 0x64 ?
-		XK_Alt_R : XK_Alt_L);
-	  break;
-	case K_CTRL:
-	  *k = (kbe.kb_index == 0x61 ?
-		XK_Control_R : XK_Control_L);
-	  break;
-        case K_CTRLL:
-	  *k = XK_Control_L;
-	  break;
-        case K_CTRLR:
-	  *k = XK_Control_R;
-	  break;
-	case K_SHIFT:
-	  *k = (kbe.kb_index == 0x36 ?
-		XK_Shift_R : XK_Shift_L);
-	  break;
-        case K_SHIFTL:
-	  *k = XK_Shift_L;
-	  break;
-        case K_SHIFTR:
-	  *k = XK_Shift_R;
-	  break;
-	default:
-	  break;
-	}
-	break;
-
-      /*
-       * KT_ASCII keys accumulate a 3 digit decimal number that gets
-       * emitted when the shift state changes. We can't emulate that.
-       */
-      case KT_ASCII:
-	break;
-
-      case KT_LOCK:
-	if (kbe.kb_value == K_SHIFTLOCK)
-	  *k = XK_Shift_Lock;
-	break;
-
-      default:
-	break;
-      }
-    }
-
-    if (k[-1] == k[-2]) k[-1] = NoSymbol;
-    if (k[-2] == k[-3]) k[-2] = NoSymbol;
-    if (k[-3] == k[-4]) k[-3] = NoSymbol;
-    if (k[-4] == k[-2] && k[-3] == k[-1]) k[-2] = k[-1] = NoSymbol;
-    if (k[-1] == k[-4] && k[-2] == k[-3] && k[-2] == NoSymbol) k[-1] =NoSymbol;
-  }
-
-  if (!xf86Info.kbdCustomKeycodes)
-    return;
-
-  /*
-   * Find the Mapping for the special server functions
-   */
-  for (i = 0; i < NUM_CUSTOMKEYS; ++i) {
-    struct kbentry kbe;
-    int special = 0;
-
-    kbe.kb_index = i;
-    kbe.kb_table = 0; /* Plain map */
-    if (!ioctl(xf86Info.consoleFd, KDGKBENT, &kbe))
-      switch (kbe.kb_value) {
-	case K(KT_LATIN,0x7f):	/* This catches DEL too... But who cares? */
-	  special = KEY_BackSpace;
-	  break;
-	case K_PMINUS:
-	  special = KEY_KP_Minus;
-	  break;
-	case K_PPLUS:
-	  special = KEY_KP_Plus;
-	  break;
-	case K_F1:
-	  special = KEY_F1;
-	  break;
-	case K_F2:
-	  special = KEY_F2;
-	  break;
-	case K_F3:
-	  special = KEY_F3;
-	  break;
-	case K_F4:
-	  special = KEY_F4;
-	  break;
-	case K_F5:
-	  special = KEY_F5;
-	  break;
-	case K_F6:
-	  special = KEY_F6;
-	  break;
-	case K_F7:
-	  special = KEY_F7;
-	  break;
-	case K_F8:
-	  special = KEY_F8;
-	  break;
-	case K_F9:
-	  special = KEY_F9;
-	  break;
-	case K_F10:
-	  special = KEY_F10;
-	  break;
-	case K_F11:
-	  special = KEY_F11;
-	  break;
-	case K_F12:
-	  special = KEY_F12;
-	  break;
-	case K_ALT:
-	  special = KEY_Alt;
-	  break;
-	case K_ALTGR:
-	  special = KEY_AltLang;
-	  break;
-	case K_CONS:
-	  special = KEY_SysReqest;
-	  break;
-      }
-    SpecialServerMap[i] = special;
-  }
-}
diff --git a/hw/xfree86/common/xf86KbdMach.c b/hw/xfree86/common/xf86KbdMach.c
deleted file mode 100644
index 89c23c2..0000000
--- a/hw/xfree86/common/xf86KbdMach.c
+++ /dev/null
@@ -1,317 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/common/xf86KbdMach.c,v 3.7.4.2 1998/06/04 17:35:20 dawes Exp $ */
-/*
- *****************************************************************************
- * HISTORY
- * Log:	xf86KbdMach.c,v
- * Revision 2.1.2.1  92/06/25  10:32:08  moore
- * 	Incorporate the Elliot Dresselhaus's, Ernest Hua's and local changes
- * 	to run Thomas Roell's I386 color X11R5.  Original code only worked
- * 	with SCO Unix.  New code works with 2.5 and 3.0 Mach
- * 	[92/06/24            rvb]
- * 
- * 	EndLog
- * 
- *****************************************************************************
- */
-/*
- * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Thomas Roell not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Thomas Roell makes no representations
- * about the suitability of this software for any purpose.  It is provided
- * "as is" without express or implied warranty.
- *
- * THOMAS ROELL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL THOMAS ROELL BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium: xf86KbdMach.c /main/9 1996/02/21 17:38:43 kaleb $ */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-#include <X11/Xmd.h>
-#include "input.h"
-#include "scrnintstr.h"
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-#include "atKeynames.h"
-#include "xf86Config.h"
-
-#include "xf86Keymap.h"
-
-static KeySym ascii_to_x[256] = {
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_BackSpace,	XK_Tab,		XK_Linefeed,	NoSymbol,
-	NoSymbol,	XK_Return,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	XK_Escape,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_space,	XK_exclam,	XK_quotedbl,	XK_numbersign,
-	XK_dollar,	XK_percent,	XK_ampersand,	XK_apostrophe,
-	XK_parenleft,	XK_parenright,	XK_asterisk,	XK_plus,
-	XK_comma,	XK_minus,	XK_period,	XK_slash,
-	XK_0,		XK_1,		XK_2,		XK_3,
-	XK_4,		XK_5,		XK_6,		XK_7,
-	XK_8,		XK_9,		XK_colon,	XK_semicolon,
-	XK_less,	XK_equal,	XK_greater,	XK_question,
-	XK_at,		XK_A,		XK_B,		XK_C,
-	XK_D,		XK_E,		XK_F,		XK_G,
-	XK_H,		XK_I,		XK_J,		XK_K,
-	XK_L,		XK_M,		XK_N,		XK_O,
-	XK_P,		XK_Q,		XK_R,		XK_S,
-	XK_T,		XK_U,		XK_V,		XK_W,
-	XK_X,		XK_Y,		XK_Z,		XK_bracketleft,
-	XK_backslash,	XK_bracketright,XK_asciicircum,	XK_underscore,
-	XK_grave,	XK_a,		XK_b,		XK_c,
-	XK_d,		XK_e,		XK_f,		XK_g,
-	XK_h,		XK_i,		XK_j,		XK_k,
-	XK_l,		XK_m,		XK_n,		XK_o,
-	XK_p,		XK_q,		XK_r,		XK_s,
-	XK_t,		XK_u,		XK_v,		XK_w,
-	XK_x,		XK_y,		XK_z,		XK_braceleft,
-	XK_bar,		XK_braceright,	XK_asciitilde,	XK_Delete,
-	XK_Ccedilla,	XK_udiaeresis,	XK_eacute,	XK_acircumflex,
-	XK_adiaeresis,	XK_agrave,	XK_aring,	XK_ccedilla,
-	XK_ecircumflex,	XK_ediaeresis,	XK_egrave,	XK_idiaeresis,
-	XK_icircumflex,	XK_igrave,	XK_Adiaeresis,	XK_Aring,
-	XK_Eacute,	XK_ae,		XK_AE,		XK_ocircumflex,
-	XK_odiaeresis,	XK_ograve,	XK_ucircumflex,	XK_ugrave,
-	XK_ydiaeresis,	XK_Odiaeresis,	XK_Udiaeresis,	XK_cent,
-	XK_sterling,	XK_yen,		XK_paragraph,	XK_section,
-	XK_aacute,	XK_iacute,	XK_oacute,	XK_uacute,
-	XK_ntilde,	XK_Ntilde,	XK_ordfeminine,	XK_masculine,
-	XK_questiondown,XK_hyphen,	XK_notsign,	XK_onehalf,
-	XK_onequarter,	XK_exclamdown,	XK_guillemotleft,XK_guillemotright,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
-	XK_Greek_alpha,	XK_ssharp,	XK_Greek_GAMMA,	XK_Greek_pi,
-	XK_Greek_SIGMA,	XK_Greek_sigma,	XK_mu,	        XK_Greek_tau,
-	XK_Greek_PHI,	XK_Greek_THETA,	XK_Greek_OMEGA,	XK_Greek_delta,
-	XK_infinity,	XK_Ooblique,	XK_Greek_epsilon, XK_intersection,
-	XK_identical,	XK_plusminus,	XK_greaterthanequal, XK_lessthanequal,
-	XK_topintegral,	XK_botintegral,	XK_division,	XK_similarequal,
-	XK_degree,	NoSymbol,	NoSymbol,	XK_radical,
-	XK_Greek_eta,	XK_twosuperior,	XK_periodcentered, NoSymbol,
-      };
-
-/*
- * LegalModifier --
- *      determine whether a key is a legal modifier key, i.e send a
- *      press/release sequence.
- */
-
-/*ARGSUSED*/
-Bool
-LegalModifier(key, pDev)
-     unsigned int  key;
-     DevicePtr  pDev;
-{
-  return (TRUE);
-}
-
-
-      
-/*
- * xf86KbdGetMapping --
- *	Get the national keyboard mapping. The keyboard type is set, a new map
- *      and the modifiermap is computed.
- */
-
-void
-xf86KbdGetMapping (pKeySyms, pModMap)
-     KeySymsPtr pKeySyms;
-     CARD8      *pModMap;
-{
-  KeySym        *k;
-  struct	kbentry kbe;
-  char          type;
-  int           i, j;
-  
-  for (i = 0; i < NUMKEYS; i++)
-    {
-      static int states[] = { NORM_STATE, SHIFT_STATE, ALT_STATE, SHIFT_ALT };
-      int j;
-
-      k = &map[i*4];
-      kbe.kb_index = i;
-	
-      for (j = 0; j < 4; j++)
-	{
-	  kbe.kb_state = states[j];
-
-	  if (ioctl (xf86Info.consoleFd, KDGKBENT, &kbe) != -1)
-	    continue;
-      
-	  if (kbe.kb_value [0] == K_SCAN)
-	    {
-	      int keycode = -1;
-	      switch (kbe.kb_value [1])
-		{
-		case K_CTLSC: keycode = XK_Control_L; break;
-		case K_LSHSC: keycode = XK_Shift_L; break;
-		case K_RSHSC: keycode = XK_Shift_R; break;
-		case K_ALTSC: keycode = XK_Alt_L; break;
-		case K_CLCKSC: keycode = XK_Caps_Lock; break;
-		case K_NLCKSC: keycode = XK_Num_Lock; break;
-		default: break;
-		}
-	      if (keycode > 0)
-		k[j] = keycode;
-	    }
-	  else if (kbe.kb_value[1] != NC)
-	    {
-	      /* How to handle multiple characters?
-	         Ignore them for now. */
-	    }
-	  else
-	    {
-	      k[j] = ascii_to_x[kbe.kb_value[0]];
-	    }
-	}
-    }
-
-  /*
-   * Apply the special key mapping specified in XF86Config 
-   */
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4) {
-    switch (k[0]) {
-      case XK_Alt_L:
-        j = K_INDEX_LEFTALT;
-        break;
-      case XK_Alt_R:
-        j = K_INDEX_RIGHTALT;
-        break;
-      case XK_Scroll_Lock:
-        j = K_INDEX_SCROLLLOCK;
-        break;
-      case XK_Control_R:
-        j = K_INDEX_RIGHTCTL;
-        break;
-      default:
-        j = -1;
-    }
-    if (j >= 0)
-      switch (xf86Info.specialKeyMap[j]) {
-        case KM_META:
-          if (k[0] == XK_Alt_R)
-            k[1] = XK_Meta_R;
-          else {
-            k[0] = XK_Alt_L;
-            k[1] = XK_Meta_L;
-          }
-          break;
-        case KM_COMPOSE:
-          k[0] = XK_Multi_key;
-          break;
-        case KM_MODESHIFT:
-          k[0] = XK_Mode_switch;
-          k[1] = NoSymbol;
-          break;
-        case KM_MODELOCK:
-          k[0] = XK_Mode_switch;
-          k[1] = XF86XK_ModeLock;
-          break;
-        case KM_SCROLLLOCK:
-          k[0] = XK_Scroll_Lock;
-          break;
-        case KM_CONTROL:
-          k[0] = XK_Control_R;
-          break;
-      }
-  }
-
-  /*
-   * compute the modifier map
-   */
-  for (i = 0; i < MAP_LENGTH; i++)
-    pModMap[i] = NoSymbol;  /* make sure it is restored */
-  
-  for (k = map, i = MIN_KEYCODE;
-       i < (NUM_KEYCODES + MIN_KEYCODE);
-       i++, k += 4)
-    
-    switch(*k) {
-      
-    case XK_Shift_L:
-    case XK_Shift_R:
-      pModMap[i] = ShiftMask;
-      break;
-      
-    case XK_Control_L:
-    case XK_Control_R:
-      pModMap[i] = ControlMask;
-      break;
-      
-    case XK_Caps_Lock:
-      pModMap[i] = LockMask;
-      break;
-      
-    case XK_Alt_L:
-    case XK_Alt_R:
-      pModMap[i] = AltMask;
-      break;
-      
-    case XK_Num_Lock:
-      if (!xf86Info.serverNumLock) pModMap[i] = NumLockMask;
-      break;
-
-    case XK_Scroll_Lock:
-      pModMap[i] = ScrollLockMask;
-      break;
-
-      /* kana support */
-    case XK_Kana_Lock:
-    case XK_Kana_Shift:
-      pModMap[i] = KanaMask;
-      break;
-
-      /* alternate toggle for multinational support */
-    case XK_Mode_switch:
-      pModMap[i] = AltLangMask;
-      break;
-
-    }
-  
-  xf86Info.kbdType =
-    ioctl(xf86Info.kbdFd, KDGKBDTYPE, &type) != -1 ? type : KB_VANILLAKB;
-
-  pKeySyms->map        = map;
-  pKeySyms->mapWidth   = GLYPHS_PER_KEY;
-  pKeySyms->minKeyCode = MIN_KEYCODE;
-  if (xf86Info.serverNumLock)
-    pKeySyms->maxKeyCode = MAX_KEYCODE; 
-  else
-    pKeySyms->maxKeyCode = MAX_STD_KEYCODE;
-
-}
diff --git a/hw/xfree86/common/xf86MiscExt.c b/hw/xfree86/common/xf86MiscExt.c
index 3e741ba..3a698b0 100644
--- a/hw/xfree86/common/xf86MiscExt.c
+++ b/hw/xfree86/common/xf86MiscExt.c
@@ -62,6 +62,7 @@
 #endif
 
 #include "xf86OSmouse.h"
+#include "xf86OSKbd.h"
 
 #ifdef DEBUG
 # define DEBUG_P(x) ErrorF(x"\n");
@@ -90,6 +91,7 @@ typedef struct {
 	int	rate;
 	int	delay;
 	int	serverNumLock;	/* obsolete */
+        pointer private;
 } kbdParamsRec, *kbdParamsPtr;
 
 /*
@@ -257,16 +259,23 @@ _X_EXPORT Bool
 MiscExtGetKbdSettings(pointer *kbd)
 {
     kbdParamsPtr kbdptr;
+    InputInfoPtr pInfo;
+    KbdDevPtr pKbd;
 
     DEBUG_P("MiscExtGetKbdSettings");
 
     kbdptr = MiscExtCreateStruct(MISC_KEYBOARD);
     if (!kbdptr)
 	return FALSE;
-    kbdptr->type  = xf86Info.kbdType;
-    kbdptr->rate  = xf86Info.kbdRate;
-    kbdptr->delay = xf86Info.kbdDelay;
+
+    pInfo = inputInfo.keyboard->public.devicePrivate;
+    pKbd = (KbdDevPtr) pInfo->private;
+
+    kbdptr->type  = pKbd->kbdType;
+    kbdptr->rate  = pKbd->rate;
+    kbdptr->delay = pKbd->delay;
     *kbd = kbdptr;
+
     return TRUE;
 }
 
@@ -589,6 +598,11 @@ MiscExtApply(pointer structure, MiscExtS
     }
     if (mse_or_kbd == MISC_KEYBOARD) {
 	kbdParamsPtr kbd = structure;
+        InputInfoPtr pInfo;
+        KbdDevPtr pKbd;
+
+        pInfo = inputInfo.keyboard->public.devicePrivate;
+        pKbd = (KbdDevPtr) pInfo->private;
 
 	if (kbd->rate < 0)
 	    return MISC_RET_BADVAL;
@@ -597,25 +611,22 @@ MiscExtApply(pointer structure, MiscExtS
 	if (kbd->type < KTYPE_UNKNOWN || kbd->type > KTYPE_XQUEUE)
 	    return MISC_RET_BADKBDTYPE;
 
-	if (xf86Info.kbdRate!=kbd->rate || xf86Info.kbdDelay!=kbd->delay) {
+	if (pKbd->rate!=kbd->rate || pKbd->delay!=kbd->delay) {
 	    char rad;
 
-	    xf86Info.kbdRate = kbd->rate;
-	    xf86Info.kbdDelay = kbd->delay;
-	    if      (xf86Info.kbdDelay <= 375) rad = 0x00;
-	    else if (xf86Info.kbdDelay <= 625) rad = 0x20;
-	    else if (xf86Info.kbdDelay <= 875) rad = 0x40;
-	    else                               rad = 0x60;
-
-	    if      (xf86Info.kbdRate <=  2)   rad |= 0x1F;
-	    else if (xf86Info.kbdRate >= 30)   rad |= 0x00;
-	    else                               rad |= ((58/xf86Info.kbdRate)-2);
+	    pKbd->rate = kbd->rate;
+	    pKbd->delay = kbd->delay;
+	    if      (pKbd->delay <= 375) rad = 0x00;
+	    else if (pKbd->delay <= 625) rad = 0x20;
+	    else if (pKbd->delay <= 875) rad = 0x40;
+	    else                         rad = 0x60;
+
+	    if      (pKbd->rate <=  2)   rad |= 0x1F;
+	    else if (pKbd->rate >= 30)   rad |= 0x00;
+	    else                         rad |= ((58/pKbd->rate)-2);
 
-	    xf86SetKbdRepeat(rad);
+	    pKbd->SetKbdRepeat(pInfo, rad);
 	}
-#if 0   /* Not done yet */
-	xf86Info.kbdType = kbd->kbdtype;
-#endif
     }
     return MISC_RET_SUCCESS;
 }
diff --git a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h
index b4e531c..7b435ac 100644
--- a/hw/xfree86/common/xf86Priv.h
+++ b/hw/xfree86/common/xf86Priv.h
@@ -194,17 +194,6 @@ Bool xf86LoadModules(char **list, pointe
 int xf86SetVerbosity(int verb);
 int xf86SetLogVerbosity(int verb);
 
-/* xf86Io.c */
-
-void xf86KbdBell(int percent, DeviceIntPtr pKeyboard, pointer ctrl,
-		 int unused);
-void xf86KbdLeds(void);
-void xf86UpdateKbdLeds(void);
-
-/* xf86Kbd.c */ 
-
-void xf86KbdGetMapping(KeySymsPtr pKeySyms, CARD8 *pModMap);
-
 /* xf86Lock.c */
 
 #ifdef USE_XF86_SERVERLOCK
diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
index c26e288..0ea6712 100644
--- a/hw/xfree86/common/xf86Privstr.h
+++ b/hw/xfree86/common/xf86Privstr.h
@@ -69,32 +69,10 @@ typedef enum {
 
 typedef struct {
     int			consoleFd;
-    int			kbdFd;
     int			vtno;
-    int			kbdType;		/* AT84 / AT101 */
-    int			kbdRate;
-    int			kbdDelay;
-    int			bell_pitch;
-    int			bell_duration;
-    Bool		autoRepeat;
-    unsigned long	leds;
-    unsigned long	xleds;
     char *		vtinit;
-    int			scanPrefix;		/* scancode-state */
-    Bool		capsLock;
-    Bool		numLock;
-    Bool		scrollLock;
-    Bool		modeSwitchLock;
-    Bool		composeLock;
     Bool		vtSysreq;
     SpecialKeysInDDX	ddxSpecialKeys;
-    Bool		ActionKeyBindingsSet;
-#if defined(SVR4) && defined(i386)
-    Bool		panix106;
-#endif  /* SVR4 && i386 */
-#if defined(__OpenBSD__) || defined(__NetBSD__)
-    int                 wsKbdType;
-#endif
 
     /* mouse part */
     DeviceIntPtr	pMouse;
@@ -121,25 +99,6 @@ typedef struct {
     int			consType;	/* Which console driver? */
 #endif
 
-#ifdef XKB
-    /* 
-     * would like to use an XkbComponentNamesRec here but can't without
-     * pulling in a bunch of header files. :-(
-     */
-    char *		xkbkeymap;
-    char *		xkbkeycodes;
-    char *		xkbtypes;
-    char *		xkbcompat;
-    char *		xkbsymbols;
-    char *		xkbgeometry;
-    Bool		xkbcomponents_specified;
-    char *		xkbrules;
-    char *		xkbmodel;
-    char *		xkblayout;
-    char *		xkbvariant;
-    char *		xkboptions;
-#endif
-
     /* Other things */
     Bool		allowMouseOpenFail;
     Bool		vidModeEnabled;		/* VidMode extension enabled */
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
index f9d11e8..5fa52c4 100644
--- a/hw/xfree86/loader/xf86sym.c
+++ b/hw/xfree86/loader/xf86sym.c
@@ -290,7 +290,6 @@ _X_HIDDEN void *xfree86LookupTab[] = {
     SYMFUNC(xf86BindGARTMemory)
     SYMFUNC(xf86UnbindGARTMemory)
     SYMFUNC(xf86EnableAGP)
-    SYMFUNC(xf86SoundKbdBell)
     SYMFUNC(xf86GARTCloseScreen)
 #ifdef XINPUT
     SYMFUNC(XisbNew)
diff --git a/hw/xfree86/os-support/linux/Makefile.am b/hw/xfree86/os-support/linux/Makefile.am
index 6fdc1bc..d77e3a3 100644
--- a/hw/xfree86/os-support/linux/Makefile.am
+++ b/hw/xfree86/os-support/linux/Makefile.am
@@ -19,7 +19,7 @@ APM_SOURCES = lnx_apm.c
 XORG_CFLAGS += -DHAVE_APM
 endif
 
-liblinux_la_SOURCES = lnx_init.c lnx_video.c lnx_io.c lnx_kbd.c lnx_mouse.c \
+liblinux_la_SOURCES = lnx_init.c lnx_video.c lnx_kbd.c lnx_mouse.c \
                      lnx_pci.c lnx_agp.c lnx_kmod.c lnx_KbdMap.c \
                      $(srcdir)/../shared/bios_mmap.c \
 		     $(srcdir)/../shared/VTsw_usl.c \
diff --git a/hw/xfree86/os-support/linux/lnx_io.c b/hw/xfree86/os-support/linux/lnx_io.c
deleted file mode 100644
index eb8cd53..0000000
--- a/hw/xfree86/os-support/linux/lnx_io.c
+++ /dev/null
@@ -1,247 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_io.c,v 3.25 2003/08/19 17:32:34 tsi Exp $ */
-/*
- * Copyright 1992 by Orest Zborowski <obz at Kodak.com>
- * Copyright 1993 by David Dawes <dawes at xfree86.org>
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the names of Orest Zborowski and David Dawes 
- * not be used in advertising or publicity pertaining to distribution of 
- * the software without specific, written prior permission.  Orest Zborowski
- * and David Dawes make no representations about the suitability of this 
- * software for any purpose.  It is provided "as is" without express or 
- * implied warranty.
- *
- * OREST ZBOROWSKI AND DAVID DAWES DISCLAIMS ALL WARRANTIES WITH REGARD 
- * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 
- * FITNESS, IN NO EVENT SHALL OREST ZBOROWSKI OR DAVID DAWES BE LIABLE 
- * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- *
- */
-/* $XConsortium: lnx_io.c /main/8 1996/10/19 18:06:28 kaleb $ */
-
-#define NEED_EVENTS
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include <X11/X.h>
-
-#include "compiler.h"
-
-#include "xf86.h"
-#include "xf86Priv.h"
-#include "xf86_OSlib.h"
-
-#define KBC_TIMEOUT 250        /* Timeout in ms for sending to keyboard controller */
-
-_X_EXPORT void
-xf86SoundKbdBell(int loudness, int pitch, int duration)
-{
-	if (loudness && pitch)
-	{
-		ioctl(xf86Info.consoleFd, KDMKTONE,
-		      ((1193190 / pitch) & 0xffff) |
-		      (((unsigned long)duration *
-			loudness / 50) << 16));
-	}
-}
-
-void
-xf86SetKbdLeds(int leds)
-{
- 	ioctl(xf86Info.consoleFd, KDSETLED, leds);
-}
-
-int
-xf86GetKbdLeds()
-{
-	int leds = 0;
-
- 	ioctl(xf86Info.consoleFd, KDGETLED, &leds);
-	return(leds);
-}
-
-static int
-KDKBDREP_ioctl_ok(int rate, int delay) {
-#if defined(KDKBDREP) && !defined(__sparc__)
-     /* This ioctl is defined in <linux/kd.h> but is not
-	implemented anywhere - must be in some m68k patches. */
-   struct kbd_repeat kbdrep_s;
-
-   /* don't change, just test */
-   kbdrep_s.LNX_KBD_PERIOD_NAME = -1;
-   kbdrep_s.delay = -1;
-   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
-       return 0;
-   }
-   /* do the change */
-   if (rate == 0)				/* switch repeat off */
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 0;
-   else
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 10000 / rate; /* convert cps to msec */
-   if (kbdrep_s.LNX_KBD_PERIOD_NAME < 1)
-     kbdrep_s.LNX_KBD_PERIOD_NAME = 1;
-   kbdrep_s.delay = delay;
-   if (kbdrep_s.delay < 1)
-     kbdrep_s.delay = 1;
-   
-   if (ioctl( xf86Info.consoleFd, KDKBDREP, &kbdrep_s )) {
-     return 0;
-   }
-
-   return 1;			/* success! */
-#else /* no KDKBDREP */
-   return 0;
-#endif /* KDKBDREP */
-}
-
-static int
-KIOCSRATE_ioctl_ok(int rate, int delay) {
-#ifdef KIOCSRATE
-   struct kbd_rate kbdrate_s;
-   int fd;
-
-   fd = open("/dev/kbd", O_RDONLY);
-   if (fd == -1) 
-     return 0;   
-
-   kbdrate_s.rate = (rate + 5) / 10;  /* must be integer, so round up */
-   kbdrate_s.delay = delay * HZ / 1000;  /* convert ms to Hz */
-   if (kbdrate_s.rate > 50)
-     kbdrate_s.rate = 50;
-
-   if (ioctl( fd, KIOCSRATE, &kbdrate_s )) {
-       return 0;
-   }
-
-   close( fd );
-
-   return 1;
-#else /* no KIOCSRATE */
-   return 0;
-#endif /* KIOCSRATE */
-}
-
-void xf86SetKbdRepeat(char rad)
-{
-#ifdef __sparc__
-  int         rate  = 500;     /* Default rate */
-  int         delay = 200;     /* Default delay */
-#else
-  int         rate  = 300;     /* Default rate */
-  int         delay = 250;     /* Default delay */
-#endif
-
-#if defined(__alpha__) || defined (__i386__) || defined(__ia64__)
-  int i;
-  int timeout;
-  int         value = 0x7f;    /* Maximum delay with slowest rate */
-
-  static int valid_rates[] = { 300, 267, 240, 218, 200, 185, 171, 160, 150,
-			       133, 120, 109, 100, 92, 86, 80, 75, 67,
-			       60, 55, 50, 46, 43, 40, 37, 33, 30, 27,
-			       25, 23, 21, 20 };
-#define RATE_COUNT (sizeof( valid_rates ) / sizeof( int ))
-
-  static int valid_delays[] = { 250, 500, 750, 1000 };
-#define DELAY_COUNT (sizeof( valid_delays ) / sizeof( int ))
-#endif
-
-  if (xf86Info.kbdRate >= 0) 
-    rate = xf86Info.kbdRate * 10;
-  if (xf86Info.kbdDelay >= 0)
-    delay = xf86Info.kbdDelay;
-
-  if(KDKBDREP_ioctl_ok(rate, delay)) 	/* m68k? */
-    return;
-
-  if(KIOCSRATE_ioctl_ok(rate, delay))	/* sparc? */
-    return;
-
-  if (xf86IsPc98())
-    return;
-
-#if defined(__alpha__) || defined (__i386__) || defined(__ia64__)
-
-  /* The ioport way */
-
-  for (i = 0; i < RATE_COUNT; i++)
-    if (rate >= valid_rates[i]) {
-      value &= 0x60;
-      value |= i;
-      break;
-    }
-
-  for (i = 0; i < DELAY_COUNT; i++)
-    if (delay <= valid_delays[i]) {
-      value &= 0x1f;
-      value |= i << 5;
-      break;
-    }
-
-  timeout = KBC_TIMEOUT;
-  while (((inb(0x64) & 2) == 2) && --timeout)
-       usleep(1000); /* wait */
-
-  if (timeout == 0)
-      return;
-
-  outb(0x60, 0xf3);             /* set typematic rate */
-  while (((inb(0x64) & 2) == 2) && --timeout)
-       usleep(1000); /* wait */
-
-  usleep(10000);
-  outb(0x60, value);
-
-#endif /* __alpha__ || __i386__ || __ia64__ */
-}
-
-static int kbdtrans;
-static struct termios kbdtty;
-
-void
-xf86KbdInit()
-{
-	ioctl (xf86Info.consoleFd, KDGKBMODE, &kbdtrans);
-	tcgetattr (xf86Info.consoleFd, &kbdtty);
-}
-
-int
-xf86KbdOn()
-{
-	struct termios nTty;
-
-#ifdef __powerpc__
-	if (xf86Info.kbdCustomKeycodes)
-		ioctl(xf86Info.consoleFd, KDSKBMODE, K_MEDIUMRAW);
-	else
-#endif
-	ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW);
-
-	nTty = kbdtty;
-	nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
-	nTty.c_oflag = 0;
-	nTty.c_cflag = CREAD | CS8;
-	nTty.c_lflag = 0;
-	nTty.c_cc[VTIME]=0;
-	nTty.c_cc[VMIN]=1;
-	cfsetispeed(&nTty, 9600);
-	cfsetospeed(&nTty, 9600);
-	tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
-	return(xf86Info.consoleFd);
-}
-
-int
-xf86KbdOff()
-{
-	ioctl(xf86Info.consoleFd, KDSKBMODE, kbdtrans);
-	tcsetattr(xf86Info.consoleFd, TCSANOW, &kbdtty);
-	return(xf86Info.consoleFd);
-}
-
diff --git a/hw/xfree86/parser/Keyboard.c b/hw/xfree86/parser/Keyboard.c
deleted file mode 100644
index 62031f6..0000000
--- a/hw/xfree86/parser/Keyboard.c
+++ /dev/null
@@ -1,309 +0,0 @@
-/* $XFree86: xc/programs/Xserver/hw/xfree86/parser/Keyboard.c,v 1.17 2003/08/24 17:37:07 dawes Exp $ */
-/* 
- * 
- * Copyright (c) 1997  Metro Link Incorporated
- * 
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"), 
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- * 
- * Except as contained in this notice, the name of the Metro Link shall not be
- * used in advertising or otherwise to promote the sale, use or other dealings
- * in this Software without prior written authorization from Metro Link.
- * 
- */
-/*
- * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of the copyright holder(s)
- * and author(s) shall not be used in advertising or otherwise to promote
- * the sale, use or other dealings in this Software without prior written
- * authorization from the copyright holder(s) and author(s).
- */
-
-
-/* View/edit this file with tab stops set to 4 */
-
-#ifdef HAVE_XORG_CONFIG_H
-#include <xorg-config.h>
-#endif
-
-#include "xf86Parser.h"
-#include "xf86tokens.h"
-#include "Configint.h"
-#include "ctype.h"
-
-extern LexRec val;
-
-static xf86ConfigSymTabRec KeyboardTab[] =
-{
-	{ENDSECTION, "endsection"},
-	{KPROTOCOL, "protocol"},
-	{AUTOREPEAT, "autorepeat"},
-	{XLEDS, "xleds"},
-	{PANIX106, "panix106"},
-	{XKBKEYMAP, "xkbkeymap"},
-	{XKBCOMPAT, "xkbcompat"},
-	{XKBTYPES, "xkbtypes"},
-	{XKBKEYCODES, "xkbkeycodes"},
-	{XKBGEOMETRY, "xkbgeometry"},
-	{XKBSYMBOLS, "xkbsymbols"},
-	{XKBDISABLE, "xkbdisable"},
-	{XKBRULES, "xkbrules"},
-	{XKBMODEL, "xkbmodel"},
-	{XKBLAYOUT, "xkblayout"},
-	{XKBVARIANT, "xkbvariant"},
-	{XKBOPTIONS, "xkboptions"},
-	/* The next two have become ServerFlags options */
-	{VTINIT, "vtinit"},
-	{VTSYSREQ, "vtsysreq"},
-	/* Obsolete keywords */
-	{SERVERNUM, "servernumlock"},
-	{LEFTALT, "leftalt"},
-	{RIGHTALT, "rightalt"},
-	{RIGHTALT, "altgr"},
-	{SCROLLLOCK_TOK, "scrolllock"},
-	{RIGHTCTL, "rightctl"},
-	{-1, ""},
-};
-
-/* Obsolete */
-static xf86ConfigSymTabRec KeyMapTab[] =
-{
-	{CONF_KM_META, "meta"},
-	{CONF_KM_COMPOSE, "compose"},
-	{CONF_KM_MODESHIFT, "modeshift"},
-	{CONF_KM_MODELOCK, "modelock"},
-	{CONF_KM_SCROLLLOCK, "scrolllock"},
-	{CONF_KM_CONTROL, "control"},
-	{-1, ""},
-};
-
-#define CLEANUP xf86freeInputList
-
-XF86ConfInputPtr
-xf86parseKeyboardSection (void)
-{
-	char *s, *s1, *s2;
-	int l;
-	int token, ntoken;
-	parsePrologue (XF86ConfInputPtr, XF86ConfInputRec)
-
-	while ((token = xf86getToken (KeyboardTab)) != ENDSECTION)
-	{
-		switch (token)
-		{
-		case COMMENT:
-			ptr->inp_comment = xf86addComment(ptr->inp_comment, val.str);
-			break;
-		case KPROTOCOL:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "Protocol");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-							       xf86configStrdup("Protocol"),
-							       val.str);
-			break;
-		case AUTOREPEAT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != NUMBER)
-				Error (AUTOREPEAT_MSG, NULL);
-			s1 = xf86uLongToString(val.num);
-			if (xf86getSubToken (&(ptr->inp_comment)) != NUMBER) {
-				xf86conffree(s1);
-				Error (AUTOREPEAT_MSG, NULL);
-			}
-			s2 = xf86uLongToString(val.num);
-			l = strlen(s1) + 1 + strlen(s2) + 1;
-			s = xf86confmalloc(l);
-			sprintf(s, "%s %s", s1, s2);
-			xf86conffree(s1);
-			xf86conffree(s2);
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-							       xf86configStrdup("AutoRepeat"), s);
-			break;
-		case XLEDS:
-			if (xf86getSubToken (&(ptr->inp_comment)) != NUMBER)
-				Error (XLEDS_MSG, NULL);
-			s = xf86uLongToString(val.num);
-			l = strlen(s) + 1;
-			while ((token = xf86getSubToken (&(ptr->inp_comment))) == NUMBER)
-			{
-				s1 = xf86uLongToString(val.num);
-				l += (1 + strlen(s1));
-				s = xf86confrealloc(s, l);
-				strcat(s, " ");
-				strcat(s, s1);
-				xf86conffree(s1);
-			}
-			xf86unGetToken (token);
-			xf86conffree(s);
-			break;
-		case SERVERNUM:
-			xf86parseWarning(OBSOLETE_MSG, xf86tokenString());
-			break;
-		case LEFTALT:
-		case RIGHTALT:
-		case SCROLLLOCK_TOK:
-		case RIGHTCTL:
-			xf86parseWarning(OBSOLETE_MSG, xf86tokenString());
-				break;
-			ntoken = xf86getToken (KeyMapTab);
-			switch (ntoken)
-			{
-			case EOF_TOKEN:
-				xf86parseError (UNEXPECTED_EOF_MSG);
-				CLEANUP (ptr);
-				return (NULL);
-				break;
-
-			default:
-				Error (INVALID_KEYWORD_MSG, xf86tokenString ());
-				break;
-			}
-			break;
-		case VTINIT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "VTInit");
-			xf86parseWarning(MOVED_TO_FLAGS_MSG, "VTInit");
-			break;
-		case VTSYSREQ:
-			xf86parseWarning(MOVED_TO_FLAGS_MSG, "VTSysReq");
-			break;
-		case XKBDISABLE:
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbDisable"),
-												NULL);
-			break;
-		case XKBKEYMAP:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBKeymap");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbKeymap"),
-												val.str);
-			break;
-		case XKBCOMPAT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBCompat");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbCompat"),
-												val.str);
-			break;
-		case XKBTYPES:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBTypes");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbTypes"),
-												val.str);
-			break;
-		case XKBKEYCODES:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBKeycodes");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbKeycodes"),
-												val.str);
-			break;
-		case XKBGEOMETRY:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBGeometry");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbGeometry"),
-												val.str);
-			break;
-		case XKBSYMBOLS:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBSymbols");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbSymbols"),
-												val.str);
-			break;
-		case XKBRULES:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBRules");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbRules"),
-												val.str);
-			break;
-		case XKBMODEL:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBModel");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbModel"),
-												val.str);
-			break;
-		case XKBLAYOUT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBLayout");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbLayout"),
-												val.str);
-			break;
-		case XKBVARIANT:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBVariant");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbVariant"),
-												val.str);
-			break;
-		case XKBOPTIONS:
-			if (xf86getSubToken (&(ptr->inp_comment)) != STRING)
-				Error (QUOTE_MSG, "XKBOptions");
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("XkbOptions"),
-												val.str);
-			break;
-		case PANIX106:
-			ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-												xf86configStrdup("Panix106"), NULL);
-			break;
-		case EOF_TOKEN:
-			Error (UNEXPECTED_EOF_MSG, NULL);
-			break;
-		default:
-			Error (INVALID_KEYWORD_MSG, xf86tokenString ());
-			break;
-		}
-	}
-
-	ptr->inp_identifier = xf86configStrdup(CONF_IMPLICIT_KEYBOARD);
-	ptr->inp_driver = xf86configStrdup("keyboard");
-	ptr->inp_option_lst = xf86addNewOption(ptr->inp_option_lst,
-										xf86configStrdup("CoreKeyboard"), NULL);
-
-#ifdef DEBUG
-	printf ("Keyboard section parsed\n");
-#endif
-
-	return ptr;
-}
-
diff --git a/hw/xfree86/parser/Makefile.am b/hw/xfree86/parser/Makefile.am
index acda83d..23db38e 100644
--- a/hw/xfree86/parser/Makefile.am
+++ b/hw/xfree86/parser/Makefile.am
@@ -9,7 +9,6 @@ libxf86config_a_SOURCES = \
 	Files.c \
 	Flags.c \
 	Input.c \
-	Keyboard.c \
 	Layout.c \
 	Module.c \
 	Video.c \
diff --git a/hw/xfree86/parser/configProcs.h b/hw/xfree86/parser/configProcs.h
index bb5f4e9..72b1607 100644
--- a/hw/xfree86/parser/configProcs.h
+++ b/hw/xfree86/parser/configProcs.h
@@ -46,8 +46,6 @@ XF86ConfInputPtr xf86parseInputSection(v
 void xf86printInputSection(FILE *f, XF86ConfInputPtr ptr);
 void xf86freeInputList(XF86ConfInputPtr ptr);
 int xf86validateInput (XF86ConfigPtr p);
-/* Keyboard.c */
-XF86ConfInputPtr xf86parseKeyboardSection(void);
 /* Layout.c */
 XF86ConfLayoutPtr xf86parseLayoutSection(void);
 void xf86printLayoutSection(FILE *cf, XF86ConfLayoutPtr ptr);
diff --git a/hw/xfree86/parser/read.c b/hw/xfree86/parser/read.c
index 59b0ea6..d93ad75 100644
--- a/hw/xfree86/parser/read.c
+++ b/hw/xfree86/parser/read.c
@@ -113,13 +113,6 @@ xf86readConfigFile (void)
 				val.str = NULL;
 				HANDLE_RETURN (conf_flags, xf86parseFlagsSection ());
 			}
-			else if (xf86nameCompare (val.str, "keyboard") == 0)
-			{
-				xf86conffree(val.str);
-				val.str = NULL;
-				HANDLE_LIST (conf_input_lst, xf86parseKeyboardSection,
-							 XF86ConfInputPtr);
-			}
 			else if (xf86nameCompare (val.str, "pointer") == 0)
 			{
 				xf86conffree(val.str);
diff --git a/hw/xfree86/utils/xorgcfg/interface.c b/hw/xfree86/utils/xorgcfg/interface.c
index b6ac82a..9c280e0 100644
--- a/hw/xfree86/utils/xorgcfg/interface.c
+++ b/hw/xfree86/utils/xorgcfg/interface.c
@@ -68,8 +68,7 @@
 #define DefaultXFree86Dir	"/usr"
 #endif
 
-#define IS_KBDDRIV(S) ((strcasecmp((S),"kbd") == 0) || \
-	(strcasecmp((S), "keyboard") == 0))
+#define IS_KBDDRIV(S) ((strcasecmp((S),"kbd") == 0)
 
 /*
  * Prototypes
diff --git a/hw/xfree86/utils/xorgcfg/keyboard-cfg.c b/hw/xfree86/utils/xorgcfg/keyboard-cfg.c
index 2e82323..dc45736 100644
--- a/hw/xfree86/utils/xorgcfg/keyboard-cfg.c
+++ b/hw/xfree86/utils/xorgcfg/keyboard-cfg.c
@@ -38,8 +38,7 @@
 #include <X11/Xaw/SimpleMenu.h>
 #include <X11/Xaw/SmeBSB.h>
 
-#define IS_KBDDRIV(X) ((strcasecmp((X),"kbd") == 0) || \
-	(strcasecmp((X), "keyboard") == 0))
+#define IS_KBDDRIV(X) ((strcasecmp((X),"kbd") == 0)
 
 /*
  * Types
@@ -255,11 +254,7 @@ KeyboardConfig(XtPointer config)
 	    keyboard = XtNew(XF86ConfInputRec);
 	    keyboard->list.next = NULL;
 	    keyboard->inp_identifier = XtNewString(ident_string);
-#if defined(USE_DEPRECATED_KEYBOARD_DRIVER)
-	    keyboard->inp_driver = XtNewString("keyboard");
-#else
 	    keyboard->inp_driver = XtNewString("kbd");
-#endif
 	    keyboard->inp_option_lst = xf86newOption(XtNewString(XkbRules),
 						     XtNewString(rules));
 	    xf86addNewOption(keyboard->inp_option_lst,
diff --git a/hw/xfree86/utils/xorgcfg/text-mode.c b/hw/xfree86/utils/xorgcfg/text-mode.c
index 8537252..0acc513 100644
--- a/hw/xfree86/utils/xorgcfg/text-mode.c
+++ b/hw/xfree86/utils/xorgcfg/text-mode.c
@@ -48,8 +48,7 @@
 #include "xf86config.h"
 #include "loader.h"
 
-#define IS_KBDDRIV(X) ((strcmp((X),"kbd") == 0) || \
-	(strcmp((X), "keyboard") == 0))
+#define IS_KBDDRIV(X) ((strcmp((X),"kbd") == 0)
 
 #ifndef PROJECT_ROOT
 #define PROJECT_ROOT "/usr"
@@ -746,11 +745,7 @@ KeyboardConfig(void)
 		input->inp_option_lst =
 		    xf86addNewOption(input->inp_option_lst,
 			XtNewString("XkbLayout"), XtNewString("us"));
-#if defined(USE_DEPRECATED_KEYBOARD_DRIVER)
-		input->inp_driver = XtNewString("keyboard");
-#else
 		input->inp_driver = XtNewString("kbd");
-#endif
 		XF86Config->conf_input_lst =
 		    xf86addInput(XF86Config, input);
 	    }
@@ -826,11 +821,7 @@ KeyboardConfig(void)
 		XtNewString("XkbLayout"), XtNewString(layout));
 
     if (input->inp_driver == NULL) {
-#if defined(USE_DEPRECATED_KEYBOARD_DRIVER)
-	input->inp_driver = XtNewString("keyboard");
-#else
 	input->inp_driver = XtNewString("kbd");
-#endif
 	XF86Config->conf_input_lst =
 	    xf86addInput(XF86Config->conf_input_lst, input);
     }
diff --git a/hw/xfree86/utils/xorgconfig/xorgconfig.c b/hw/xfree86/utils/xorgconfig/xorgconfig.c
index ab3c1d0..3bc05b8 100644
--- a/hw/xfree86/utils/xorgconfig/xorgconfig.c
+++ b/hw/xfree86/utils/xorgconfig/xorgconfig.c
@@ -2068,11 +2068,7 @@ static char *XF86Config_fontpathchunk_te
 "Section \"InputDevice\"\n"
 "\n"
 "    Identifier	\"Keyboard1\"\n"
-#ifdef USE_DEPRECATED_KEYBOARD_DRIVER
-"    Driver	\"Keyboard\"\n"
-#else
 "    Driver	\"kbd\"\n"
-#endif
 "\n"
 "# For most OSs the protocol can be omitted (it defaults to \"Standard\").\n"
 "# When using XQUEUE (only for SVR3 and SVR4, but not Solaris),\n"
diff-tree 60ea7b51fe2b8a19a08b63db48504971a7a50ee6 (from d32dc8bf19e1071fc30af2f0bc6a6699b351f39e)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 21 15:23:37 2006 -0400

    xorg ddx: move to new input API, remove old keyboard driver
    Remove most of the rest of the old keyboard driver.
    Move to the new Get{Keyboard,Pointer}Events API, which is mostly
    complete at this stage: just missing the proximity events.

diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index b932908..16591be 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -1136,7 +1136,6 @@ configInputKbd(IDevPtr inputp)
   xf86Info.kbdDelay      = 500;
   xf86Info.kbdRate       = 30;
   
-  xf86Info.kbdProc       = NULL;
   xf86Info.vtinit        = NULL;
   xf86Info.vtSysreq      = VT_SYSREQ_DEFAULT;
 #if defined(SVR4) && defined(i386)
@@ -1172,8 +1171,6 @@ configInputKbd(IDevPtr inputp)
 
   s = xf86SetStrOption(inputp->commonOptions, "Protocol", kbdproto);
   if (xf86NameCmp(s, "standard") == 0) {
-     xf86Info.kbdProc    = xf86KbdProc;
-     xf86Info.kbdEvents  = xf86KbdEvents;
      xfree(s);
   } else if (xf86NameCmp(s, "xqueue") == 0) {
 #ifdef __UNIXWARE__
@@ -1181,20 +1178,14 @@ configInputKbd(IDevPtr inputp)
      * To retain compatibility with older config files, on UnixWare, we
      * accept the xqueue protocol but use the normal keyboard procs.
      */
-     xf86Info.kbdProc    = xf86KbdProc;
-     xf86Info.kbdEvents  = xf86KbdEvents;
 #else
 #ifdef XQUEUE
-    xf86Info.kbdProc = xf86XqueKbdProc;
-    xf86Info.kbdEvents = xf86XqueEvents;
     xf86Msg(X_CONFIG, "Xqueue selected for keyboard input\n");
 #endif
 #endif
     xfree(s);
 #ifdef WSCONS_SUPPORT
   } else if (xf86NameCmp(s, "wskbd") == 0) {
-     xf86Info.kbdProc    = xf86KbdProc;
-     xf86Info.kbdEvents  = xf86WSKbdEvents;
      xfree(s);
      s = xf86SetStrOption(inputp->commonOptions, "Device", NULL);
      xf86Msg(X_CONFIG, "Keyboard: Protocol: wskbd\n");
diff --git a/hw/xfree86/common/xf86Cursor.c b/hw/xfree86/common/xf86Cursor.c
index 787c39d..61ce57d 100644
--- a/hw/xfree86/common/xf86Cursor.c
+++ b/hw/xfree86/common/xf86Cursor.c
@@ -78,14 +78,9 @@ static miPointerScreenFuncRec xf86Pointe
   xf86CursorOffScreen,
   xf86CrossScreen,
   xf86WarpCursor,
-#ifdef XINPUT
-  xf86eqEnqueue,
-  xf86eqSwitchScreen
-#else
   /* let miPointerInitialize take care of these */
   NULL,
   NULL
-#endif
 };
 
 static xf86ScreenLayoutRec xf86ScreenLayout[MAXSCREENS];
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 53186ea..807a94c 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -923,7 +923,7 @@ DGAStealKeyEvent(int index, xEvent *e)
     de.u.u.type = e->u.u.type + *XDGAEventBase;
     de.u.u.detail = e->u.u.detail;
     de.u.event.time = e->u.keyButtonPointer.time;
-    xf86eqEnqueue ((xEvent *) &de);
+    mieqEnqueue ((xEvent *) &de);
    return TRUE;
 }
 
@@ -960,7 +960,7 @@ DGAStealMouseEvent(int index, xEvent *e,
     de.u.event.dy = dy;
     de.u.event.pad1 = DGAMouseX;
     de.u.event.pad2 = DGAMouseY;
-    xf86eqEnqueue ((xEvent *) &de);
+    mieqEnqueue ((xEvent *) &de);
     return TRUE;
 }
 
diff --git a/hw/xfree86/common/xf86Debug.c b/hw/xfree86/common/xf86Debug.c
index 5579cde..e624e71 100644
--- a/hw/xfree86/common/xf86Debug.c
+++ b/hw/xfree86/common/xf86Debug.c
@@ -164,6 +164,7 @@ void xf86PokeMmio32(pointer Base, unsign
 }
 
 
+#if 0
 _X_EXPORT void
 xf86STimestamp(xf86TsPtr* timestamp)
 {
@@ -195,3 +196,4 @@ xf86SPTimestamp(xf86TsPtr* timestamp, ch
 	gettimeofday((struct timeval*)*timestamp,NULL);
     }
 }
+#endif
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 831c68a..cc2ce9b 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -104,11 +104,7 @@ extern Bool noXkbExtension;
 #define XE_POINTER  1
 #define XE_KEYBOARD 2
 
-#ifdef XINPUT
-#define __EqEnqueue(ev) xf86eqEnqueue(ev)
-#else
 #define __EqEnqueue(ev) mieqEnqueue(ev)
-#endif
 
 #define EqEnqueue(ev) { \
     int __sigstate = xf86BlockSIGIO (); \
@@ -253,11 +249,7 @@ ProcessInputEvents ()
 
   xf86Info.inputPending = FALSE;
 
-#ifdef XINPUT
-  xf86eqProcessInputEvents();
-#else
   mieqProcessInputEvents();
-#endif
   miPointerUpdate();
 
   miPointerPosition(&x, &y);
@@ -403,679 +395,6 @@ xf86ProcessActionEvent(ActionEvent actio
     }
 }
 
-/*
- * xf86PostKbdEvent --
- *	Translate the raw hardware KbdEvent into an XEvent, and tell DIX
- *	about it. Scancode preprocessing and so on is done ...
- *
- *  OS/2 specific xf86PostKbdEvent(key) has been moved to os-support/os2/os2_kbd.c
- *  as some things differ, and I did not want to scatter this routine with
- *  ifdefs further (hv).
- */
-
-#ifdef __linux__
-extern u_char SpecialServerMap[];
-#endif
-
-#if !defined(__UNIXOS2__)
-void
-xf86PostKbdEvent(unsigned key)
-{
-  int         scanCode = (key & 0x7f);
-  int         specialkey = 0;
-  Bool        down = (key & 0x80 ? FALSE : TRUE);
-  KeyClassRec *keyc = ((DeviceIntPtr)xf86Info.pKeyboard)->key;
-  Bool        updateLeds = FALSE;
-  Bool        UsePrefix = FALSE;
-  Bool        Direction = FALSE;
-  xEvent      kevent;
-  KeySym      *keysym;
-  int         keycode;
-  static int  lockkeys = 0;
-#if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)
-  static Bool first_time = TRUE;
-#endif
-#if defined(__sparc__) && defined(__linux__)
-  static int  kbdSun = -1;
-#endif
-  /* Disable any keyboard processing while in suspend */
-  if (xf86inSuspend)
-      return;
-
-#if defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)
-  if (first_time)
-  {
-    first_time = FALSE;
-    VTSwitchEnabled = (xf86Info.consType == SYSCONS)
-	    || (xf86Info.consType == PCVT);
-  }
-#endif
-
-#if defined (__sparc__) && defined(__linux__)
-  if (kbdSun == -1) {
-    if ((xf86Info.xkbmodel && !strcmp(xf86Info.xkbmodel, "sun"))
-	|| (xf86Info.xkbrules && !strcmp(xf86Info.xkbrules, "sun")))
-      kbdSun = 1;
-    else
-      kbdSun = 0;
-  }
-  if (kbdSun)
-    goto special;
-#endif /* __sparc__ && __linux__ */
-
-#ifdef __linux__
-  if (xf86Info.kbdCustomKeycodes) {
-    specialkey = SpecialServerMap[scanCode];
-    goto customkeycodes;
-  }
-#endif
-
-  /*
-   * First do some special scancode remapping ...
-   */
-  if (xf86Info.scanPrefix == 0) {
-
-    switch (scanCode) {
-    case KEY_Prefix0:
-    case KEY_Prefix1:
-#if defined(PCCONS_SUPPORT) || defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)
-      if (xf86Info.consType == PCCONS || xf86Info.consType == SYSCONS
-	  || xf86Info.consType == PCVT
-#ifdef WSCONS_SUPPORT
-	  || (xf86Info.consType == WSCONS && xf86Info.kbdEvents != xf86WSKbdEvents)
-#endif
-      ) {
-#endif
-        xf86Info.scanPrefix = scanCode;  /* special prefixes */
-        return;
-#if defined(PCCONS_SUPPORT) || defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)
-      }
-      break;
-#endif
-    }
-#if defined (i386) && defined (SVR4)
-    /* 
-     * PANIX returns DICOP standards based keycodes in using 106jp 
-     * keyboard. We need to remap some keys. 
-     */
-    if(xf86Info.panix106 == TRUE){
-      switch (scanCode) {
-      case 0x56:        scanCode = KEY_BSlash2;	break;  /* Backslash */
-      case 0x5A:        scanCode = KEY_NFER;	break;  /* No Kanji Transfer*/
-      case 0x5B:        scanCode = KEY_XFER;	break;  /* Kanji Tranfer */
-      case 0x5C:        scanCode = KEY_Yen;	break;  /* Yen curs pgup */
-      case 0x6B:        scanCode = KEY_Left;	break;  /* Cur Left */
-      case 0x6F:        scanCode = KEY_PgUp;	break;  /* Cur PageUp */
-      case 0x72:        scanCode = KEY_AltLang;	break;  /* AltLang(right) */
-      case 0x73:        scanCode = KEY_RCtrl;	break;  /* not needed */
-      }
-    } else
-#endif /* i386 && SVR4 */
-    {
-      switch (scanCode) {
-      case 0x59:        scanCode = KEY_0x59; break;
-      case 0x5a:        scanCode = KEY_0x5A; break;
-      case 0x5b:        scanCode = KEY_0x5B; break;
-      case 0x5c:        scanCode = KEY_KP_Equal; break; /* Keypad Equal */
-      case 0x5d:        scanCode = KEY_0x5D; break;
-      case 0x5e:        scanCode = KEY_0x5E; break;
-      case 0x5f:        scanCode = KEY_0x5F; break;
-      case 0x62:        scanCode = KEY_0x62; break;
-      case 0x63:        scanCode = KEY_0x63; break;
-      case 0x64:        scanCode = KEY_0x64; break;
-      case 0x65:        scanCode = KEY_0x65; break;
-      case 0x66:        scanCode = KEY_0x66; break;
-      case 0x67:        scanCode = KEY_0x67; break;
-      case 0x68:        scanCode = KEY_0x68; break;
-      case 0x69:        scanCode = KEY_0x69; break;
-      case 0x6a:        scanCode = KEY_0x6A; break;
-      case 0x6b:        scanCode = KEY_0x6B; break;
-      case 0x6c:        scanCode = KEY_0x6C; break;
-      case 0x6d:        scanCode = KEY_0x6D; break;
-      case 0x6e:        scanCode = KEY_0x6E; break;
-      case 0x6f:        scanCode = KEY_0x6F; break;
-      case 0x70:        scanCode = KEY_0x70; break;
-      case 0x71:        scanCode = KEY_0x71; break;
-      case 0x72:        scanCode = KEY_0x72; break;
-      case 0x73:        scanCode = KEY_0x73; break;
-      case 0x74:        scanCode = KEY_0x74; break;
-      case 0x75:        scanCode = KEY_0x75; break;
-      case 0x76:        scanCode = KEY_0x76; break;
-      }
-    }
-  }
-
-  else if (
-#ifdef CSRG_BASED
-           (xf86Info.consType == PCCONS || xf86Info.consType == SYSCONS
-	    || xf86Info.consType == PCVT
-#ifdef WSCONS_SUPPORT
-	      || (xf86Info.consType == WSCONS && xf86Info.kbdEvents !=
-	      xf86WSKbdEvents)
-#endif
-	      ) &&
-#endif
-           (xf86Info.scanPrefix == KEY_Prefix0)) {
-    xf86Info.scanPrefix = 0;
-	  
-    switch (scanCode) {
-    case KEY_KP_7:        scanCode = KEY_Home;      break;  /* curs home */
-    case KEY_KP_8:        scanCode = KEY_Up;        break;  /* curs up */
-    case KEY_KP_9:        scanCode = KEY_PgUp;      break;  /* curs pgup */
-    case KEY_KP_4:        scanCode = KEY_Left;      break;  /* curs left */
-    case KEY_KP_5:        scanCode = KEY_Begin;     break;  /* curs begin */
-    case KEY_KP_6:        scanCode = KEY_Right;     break;  /* curs right */
-    case KEY_KP_1:        scanCode = KEY_End;       break;  /* curs end */
-    case KEY_KP_2:        scanCode = KEY_Down;      break;  /* curs down */
-    case KEY_KP_3:        scanCode = KEY_PgDown;    break;  /* curs pgdown */
-    case KEY_KP_0:        scanCode = KEY_Insert;    break;  /* curs insert */
-    case KEY_KP_Decimal:  scanCode = KEY_Delete;    break;  /* curs delete */
-    case KEY_Enter:       scanCode = KEY_KP_Enter;  break;  /* keypad enter */
-    case KEY_LCtrl:       scanCode = KEY_RCtrl;     break;  /* right ctrl */
-    case KEY_KP_Multiply: scanCode = KEY_Print;     break;  /* print */
-    case KEY_Slash:       scanCode = KEY_KP_Divide; break;  /* keyp divide */
-    case KEY_Alt:         scanCode = KEY_AltLang;   break;  /* right alt */
-    case KEY_ScrollLock:  scanCode = KEY_Break;     break;  /* curs break */
-    case 0x5b:            scanCode = KEY_LMeta;     break;
-    case 0x5c:            scanCode = KEY_RMeta;     break;
-    case 0x5d:            scanCode = KEY_Menu;      break;
-    case KEY_F3:          scanCode = KEY_F13;       break;
-    case KEY_F4:          scanCode = KEY_F14;       break;
-    case KEY_F5:          scanCode = KEY_F15;       break;
-    case KEY_F6:          scanCode = KEY_F16;       break;
-    case KEY_F7:          scanCode = KEY_F17;       break;
-    case KEY_KP_Plus:     scanCode = KEY_KP_DEC;    break;
-      /*
-       * Ignore virtual shifts (E0 2A, E0 AA, E0 36, E0 B6)
-       */
-    case 0x2A:
-    case 0x36:
-	return;
-    default:
-      xf86MsgVerb(X_INFO, 4, "Unreported Prefix0 scancode: 0x%02x\n",
-		  scanCode);
-      /*
-       * "Internet" keyboards are generating lots of new codes.  Let them
-       * pass.  There is little consistency between them, so don't bother
-       * with symbolic names at this level.
-       */
-      scanCode += 0x78;
-    }
-  }
-  
-  else if (xf86Info.scanPrefix == KEY_Prefix1)
-    {
-      xf86Info.scanPrefix = (scanCode == KEY_LCtrl) ? KEY_LCtrl : 0;
-      return;
-    }
-  
-  else if (xf86Info.scanPrefix == KEY_LCtrl)
-    {
-      xf86Info.scanPrefix = 0;
-      if (scanCode != KEY_NumLock) return;
-      scanCode = KEY_Pause;       /* pause */
-    }
-
-#ifndef __sparc64__
-  /*
-   * PC keyboards generate separate key codes for
-   * Alt+Print and Control+Pause but in the X keyboard model
-   * they need to get the same key code as the base key on the same
-   * physical keyboard key.
-   */
-  if (scanCode == KEY_SysReqest)
-    scanCode = KEY_Print;
-  else if (scanCode == KEY_Break)
-    scanCode = KEY_Pause;
-#endif
-  
-  /*
-   * and now get some special keysequences
-   */
-
-  specialkey = scanCode;
-
-#ifdef __linux__
-customkeycodes:
-#endif
-#if defined(i386) || defined(__i386__)
-  if (xf86IsPc98()) {
-    switch (scanCode) {
-      case 0x0e: specialkey = 0x0e; break; /* KEY_BackSpace */
-      case 0x40: specialkey = 0x4a; break; /* KEY_KP_Minus  */
-      case 0x49: specialkey = 0x4e; break; /* KEY_KP_Plus   */
-
-      /* XXX needs cases for KEY_KP_Divide and KEY_KP_Multiply */
-
-      case 0x62: specialkey = 0x3b; break; /* KEY_F1        */
-      case 0x63: specialkey = 0x3c; break; /* KEY_F2        */
-      case 0x64: specialkey = 0x3d; break; /* KEY_F3        */
-      case 0x65: specialkey = 0x3e; break; /* KEY_F4        */
-      case 0x66: specialkey = 0x3f; break; /* KEY_F5        */
-      case 0x67: specialkey = 0x40; break; /* KEY_F6        */
-      case 0x68: specialkey = 0x41; break; /* KEY_F7        */
-      case 0x69: specialkey = 0x42; break; /* KEY_F8        */
-      case 0x6a: specialkey = 0x43; break; /* KEY_F9        */
-      case 0x6b: specialkey = 0x44; break; /* KEY_F10       */
-      /* case 0x73: specialkey = 0x38; break; KEY_Alt       */
-      /* case 0x74: specialkey = 0x1d; break; KEY_LCtrl     */
-      default:   specialkey = 0x00; break;
-    }
-  }
-#endif
-#if defined (__sparc__) && defined(__linux__)
-special:
-  if (kbdSun) {
-    switch (scanCode) {
-      case 0x2b: specialkey = KEY_BackSpace; break;
-      case 0x47: specialkey = KEY_KP_Minus; break;
-      case 0x7d: specialkey = KEY_KP_Plus; break;
-
-      /* XXX needs cases for KEY_KP_Divide and KEY_KP_Multiply */
-
-      case 0x05: specialkey = KEY_F1; break;
-      case 0x06: specialkey = KEY_F2; break;
-      case 0x08: specialkey = KEY_F3; break;
-      case 0x0a: specialkey = KEY_F4; break;
-      case 0x0c: specialkey = KEY_F5; break;
-      case 0x0e: specialkey = KEY_F6; break;
-      case 0x10: specialkey = KEY_F7; break;
-      case 0x11: specialkey = KEY_F8; break;
-      case 0x12: specialkey = KEY_F9; break;
-      case 0x07: specialkey = KEY_F10; break;
-      case 0x09: specialkey = KEY_F11; break;
-      case 0x0b: specialkey = KEY_F12; break;
-      default: specialkey = 0; break;
-    }
-    /*
-     * XXX XXX XXX:
-     *
-     * I really don't know what's wrong here, but passing the real
-     * scanCode offsets by one from XKB's point of view.
-     *
-     * (ecd at skynet.be, 980405)
-     */
-    scanCode--;
-  }
-#endif /* defined (__sparc__) && defined(__linux__) */
-
-#ifdef XKB
-  if ((xf86Info.ddxSpecialKeys == SKWhenNeeded &&
-       !xf86Info.ActionKeyBindingsSet) ||
-      noXkbExtension || xf86Info.ddxSpecialKeys == SKAlways) {
-#endif
-  if (!(ModifierDown(ShiftMask)) &&
-      ((ModifierDown(ControlMask | AltMask)) ||
-       (ModifierDown(ControlMask | AltLangMask))))
-    {
-      switch (specialkey) {
-	
-      case KEY_BackSpace:
-	xf86ProcessActionEvent(ACTION_TERMINATE, NULL);
-	break;
-
-      /*
-       * Check grabs
-       */
-      case KEY_KP_Divide:
-	xf86ProcessActionEvent(ACTION_DISABLEGRAB, NULL);
-	break;
-      case KEY_KP_Multiply:
-	xf86ProcessActionEvent(ACTION_CLOSECLIENT, NULL);
-	break;
-
-      /*
-       * Video mode switches
-       */
-      case KEY_KP_Minus:   /* Keypad - */
-	if (down) xf86ProcessActionEvent(ACTION_PREV_MODE, NULL);
-	if (!xf86Info.dontZoom) return;
-	break;
-	
-      case KEY_KP_Plus:   /* Keypad + */
-	if (down) xf86ProcessActionEvent(ACTION_NEXT_MODE, NULL);
-	if (!xf86Info.dontZoom) return;
-	break;
-
-	/* Under QNX4, we set the vtPending flag for VT switching and 
-	 * let the VT switch function do the rest...
-	 * This is a little different from the other OS'es.
-	 */
-#if defined(QNX4)
-      case KEY_1:
-      case KEY_2:
-      case KEY_3:
-      case KEY_4:
-      case KEY_5:
-      case KEY_6:
-      case KEY_7:
-      case KEY_8:
-      case KEY_9:
-	if (VTSwitchEnabled && !xf86Info.dontVTSwitch) {
-	  if (down) {
-	    int vtno = specialkey - KEY_1 + 1;
-	    xf86ProcessActionEvent(ACTION_SWITCHSCREEN, (void *) &vtno);
-	  }
-	  return;
-	}
-	break;
-#endif
-
-#if defined(linux) || (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT))) || defined(__SCO__) || defined(__UNIXWARE__)
-	/*
-	 * Under Linux, the raw keycodes are consumed before the kernel
-	 * does any processing on them, so we must emulate the vt switching
-	 * we want ourselves.
-	 */
-      case KEY_F1:
-      case KEY_F2:
-      case KEY_F3:
-      case KEY_F4:
-      case KEY_F5:
-      case KEY_F6:
-      case KEY_F7:
-      case KEY_F8:
-      case KEY_F9:
-      case KEY_F10:
-      case KEY_F11:
-      case KEY_F12:
-	if ((VTSwitchEnabled && !xf86Info.vtSysreq && !xf86Info.dontVTSwitch)
-#if (defined(CSRG_BASED) && (defined(SYSCONS_SUPPORT) || defined(PCVT_SUPPORT) || defined(WSCONS_SUPPORT)))
-	    && (xf86Info.consType == SYSCONS || xf86Info.consType == PCVT)
-#endif
-	   ) {
-	    int vtno = specialkey - KEY_F1 + 1;
-	    if (specialkey == KEY_F11 || specialkey == KEY_F12)
-		vtno = specialkey - KEY_F11 + 11;
-	    if (down)
-		xf86ProcessActionEvent(ACTION_SWITCHSCREEN, (void *) &vtno);
-	    return;
-	}
-	break;
-#endif /* linux || BSD with VTs */
-
-      /* just worth mentioning here: any 386bsd keyboard driver
-       * (pccons.c or co_kbd.c) catches CTRL-ALT-DEL and CTRL-ALT-ESC
-       * before any application (e.g. XF86) will see it
-       * OBS: syscons does not, nor does pcvt !
-       */
-      } 
-    }
-
-    /*
-     * Start of actual Solaris VT switching code.  
-     * This should pretty much emulate standard SVR4 switching keys.
-     * 
-     * DWH 12/2/93
-     */
-
-#ifdef USE_VT_SYSREQ
-    if (VTSwitchEnabled && xf86Info.vtSysreq && !xf86Info.dontVTSwitch)
-    {
-      switch (specialkey)
-      {
-      /*
-       * syscons on *BSD doesn't have a VT #0  -- don't think Linux does
-       * either
-       */
-#if defined (sun) && defined (i386) && defined (SVR4)
-      case KEY_H: 
-	if (VTSysreqToggle && down)
-        {
-	  xf86ProcessActionEvent(ACTION_SWITCHSCREEN, NULL);
-          VTSysreqToggle = 0;
-          return; 
-        }
-	break;
-
-      /*
-       * Yah, I know the N, and P keys seem backwards, however that's
-       * how they work under Solaris
-       * XXXX N means go to next active VT not necessarily vtno+1 (or vtno-1)
-       */
-
-      case KEY_N:
-	if (VTSysreqToggle && down)
-	{
-	  xf86ProcessActionEvent(ACTION_SWITCHSCREEN_NEXT, NULL);
-          VTSysreqToggle = FALSE;
-          return;
-        }
-	break;
-
-      case KEY_P:
-	if (VTSysreqToggle && down)
-	{
-	  xf86ProcessActionEvent(ACTION_SWITCHSCREEN_NEXT, NULL);
-          VTSysreqToggle = FALSE;
-          return;
-        }
-	break;
-#endif
-
-      case KEY_F1:
-      case KEY_F2:
-      case KEY_F3:
-      case KEY_F4:
-      case KEY_F5:
-      case KEY_F6:
-      case KEY_F7:
-      case KEY_F8:
-      case KEY_F9:
-      case KEY_F10:
-      case KEY_F11:
-      case KEY_F12:
-	if (VTSysreqToggle && down)
-	{ int vtno = specialkey - KEY_F1 + 1;
-	  if (specialkey == KEY_F11 || specialkey == KEY_F12)
-	    vtno = specialkey - KEY_F11 + 11;
-	  xf86ProcessActionEvent(ACTION_SWITCHSCREEN, (void *) &vtno);
-          VTSysreqToggle = FALSE;
-          return;
-        }
-	break;
-
-      /* Ignore these keys -- ie don't let them cancel an alt-sysreq */
-      case KEY_Alt:
-      case KEY_AltLang:
-	break;
-
-      case KEY_SysReqest:
-        if (down && (ModifierDown(AltMask) || ModifierDown(AltLangMask)))
-          VTSysreqToggle = TRUE;
-	break;
-
-      default:
-        if (VTSysreqToggle)
-	{
-	  /*
-	   * We only land here when Alt-SysReq is followed by a
-	   * non-switching key.
-	   */
-          VTSysreqToggle = FALSE;
-
-        }
-      }
-    }
-
-#endif /* USE_VT_SYSREQ */
-
-#ifdef __SCO__
-    /*
-     *	With the console in raw mode, SCO will not switch consoles,
-     *	you get around this by activating the next console along, if
-     *	this fails then go back to console 0, if there is only one
-     *	then it doesn't matter, switching to yourself is a nop as far
-     *	as the console driver is concerned.
-     *	We could do something similar to linux here but SCO ODT uses
-     *	Ctrl-PrintScrn, so why change?
-     */
-    if (specialkey == KEY_Print && ModifierDown(ControlMask)) {
-      if (down)
-	xf86ProcessActionEvent(ACTION_SWITCHSCREEN_NEXT, NULL);
-      return;
-    }
-#endif /* __SCO__ */
-#ifdef XKB
-    }
-#endif
-
-  /*
-   * Now map the scancodes to real X-keycodes ...
-   */
-  keycode = scanCode + MIN_KEYCODE;
-  keysym = (keyc->curKeySyms.map +
-	    keyc->curKeySyms.mapWidth * 
-	    (keycode - keyc->curKeySyms.minKeyCode));
-#ifdef XKB
-  if (noXkbExtension) {
-#endif
-  /*
-   * Filter autorepeated caps/num/scroll lock keycodes.
-   */
-#define CAPSFLAG 0x01
-#define NUMFLAG 0x02
-#define SCROLLFLAG 0x04
-#define MODEFLAG 0x08
-  if( down ) {
-    switch( keysym[0] ) {
-        case XK_Caps_Lock :
-          if (lockkeys & CAPSFLAG)
-              return;
-	  else
-	      lockkeys |= CAPSFLAG;
-          break;
-
-        case XK_Num_Lock :
-          if (lockkeys & NUMFLAG)
-              return;
-	  else
-	      lockkeys |= NUMFLAG;
-          break;
-
-        case XK_Scroll_Lock :
-          if (lockkeys & SCROLLFLAG)
-              return;
-	  else
-	      lockkeys |= SCROLLFLAG;
-          break;
-    }
-    if (keysym[1] == XF86XK_ModeLock)
-    {
-      if (lockkeys & MODEFLAG)
-          return;
-      else
-          lockkeys |= MODEFLAG;
-    }
-      
-  }
-  else {
-    switch( keysym[0] ) {
-        case XK_Caps_Lock :
-            lockkeys &= ~CAPSFLAG;
-            break;
-
-        case XK_Num_Lock :
-            lockkeys &= ~NUMFLAG;
-            break;
-
-        case XK_Scroll_Lock :
-            lockkeys &= ~SCROLLFLAG;
-            break;
-    }
-    if (keysym[1] == XF86XK_ModeLock)
-      lockkeys &= ~MODEFLAG;
-  }
-
-  /*
-   * LockKey special handling:
-   * ignore releases, toggle on & off on presses.
-   * Don't deal with the Caps_Lock keysym directly, but check the lock modifier
-   */
-  if (keyc->modifierMap[keycode] & LockMask ||
-      keysym[0] == XK_Scroll_Lock ||
-      keysym[1] == XF86XK_ModeLock ||
-      keysym[0] == XK_Num_Lock)
-    {
-      Bool flag;
-
-      if (!down) return;
-      if (KeyPressed(keycode)) {
-	down = !down;
-	flag = FALSE;
-      }
-      else
-	flag = TRUE;
-
-      if (keyc->modifierMap[keycode] & LockMask)   xf86Info.capsLock   = flag;
-      if (keysym[0] == XK_Num_Lock)    xf86Info.numLock    = flag;
-      if (keysym[0] == XK_Scroll_Lock) xf86Info.scrollLock = flag;
-      if (keysym[1] == XF86XK_ModeLock)   xf86Info.modeSwitchLock = flag;
-      updateLeds = TRUE;
-    }
-
-  if (!xf86Info.kbdCustomKeycodes) {
-    /*
-     * normal, non-keypad keys
-     */
-    if (scanCode < KEY_KP_7 || scanCode > KEY_KP_Decimal) {
-#if !defined(CSRG_BASED) && \
-    !defined(__GNU__) && \
-     defined(KB_84)
-      /*
-       * magic ALT_L key on AT84 keyboards for multilingual support
-       */
-      if (xf86Info.kbdType == KB_84 &&
-	  ModifierDown(AltMask) &&
-	  keysym[2] != NoSymbol)
-	{
-	  UsePrefix = TRUE;
-	  Direction = TRUE;
-	}
-#endif /* !CSRG_BASED && ... */
-    }
-  }
-  if (updateLeds) xf86UpdateKbdLeds();
-#ifdef XKB
-  }
-#endif
-
-  /*
-   * check for an autorepeat-event
-   */
-  if (down && KeyPressed(keycode)) {
-      KbdFeedbackClassRec *kbdfeed = ((DeviceIntPtr)xf86Info.pKeyboard)->kbdfeed;
-      if ((xf86Info.autoRepeat != AutoRepeatModeOn) ||
-          keyc->modifierMap[keycode] ||
-          (kbdfeed && !(kbdfeed->ctrl.autoRepeats[keycode>>3] & ( 1<<(keycode&7) ))))
-          return;
-  }
-
-
-  xf86Info.lastEventTime = kevent.u.keyButtonPointer.time = GetTimeInMillis();
-  /*
-   * And now send these prefixes ...
-   * NOTE: There cannot be multiple Mode_Switch keys !!!!
-   */
-  if (UsePrefix)
-    {
-      ENQUEUE(&kevent,
-	      keyc->modifierKeyMap[keyc->maxKeysPerModifier*7],
-	      (Direction ? KeyPress : KeyRelease),
-	      XE_KEYBOARD);
-      ENQUEUE(&kevent, keycode, (down ? KeyPress : KeyRelease), XE_KEYBOARD);
-      ENQUEUE(&kevent,
-	      keyc->modifierKeyMap[keyc->maxKeysPerModifier*7],
-	      (Direction ? KeyRelease : KeyPress),
-	      XE_KEYBOARD);
-    }
-  else 
-    {
-      ENQUEUE(&kevent, keycode, (down ? KeyPress : KeyRelease), XE_KEYBOARD);
-    }
-}
-#endif /* !__UNIXOS2__ */
-
 #define ModifierIsSet(k) ((modifiers & (k)) == (k))
 
 _X_EXPORT Bool
@@ -1137,8 +456,6 @@ xf86Wakeup(pointer blockData, int err, p
 
 	XFD_ANDSET(&devicesWithInput, LastSelectMask, &EnabledDevices);
 	if (XFD_ANYSET(&devicesWithInput)) {
-	    if (xf86Info.kbdEvents)
-	    	(xf86Info.kbdEvents)();
 	    pInfo = xf86InputDevs;
 	    while (pInfo) {
 		if (pInfo->read_input && pInfo->fd >= 0 &&
@@ -1161,8 +478,6 @@ xf86Wakeup(pointer blockData, int err, p
 
     InputInfoPtr pInfo;
 
-    (xf86Info.kbdEvents)();  /* Under OS/2 and QNX, always call */
-
     pInfo = xf86InputDevs;
     while (pInfo) {
 		if (pInfo->read_input && pInfo->fd >= 0) {
@@ -1470,6 +785,67 @@ xf86SigMemDebug(int signo)
 }
 #endif
 
+static void
+xf86ReleaseKeys(DeviceIntPtr pDev)
+{
+    KeyClassPtr keyc = NULL;
+    KeySym *map = NULL;
+    xEvent *events = NULL, ke;
+    int i = 0, j = 0, nevents = 0;
+
+    ErrorF("releasekeys: called on device %s (%d)\n", pDev->name, pDev->id);
+
+    if (!pDev || !pDev->key)
+        return;
+
+    keyc = pDev->key;
+    map = keyc->curKeySyms.map;
+
+    /*
+     * Hmm... here is the biggest hack of every time !
+     * It may be possible that a switch-vt procedure has finished BEFORE
+     * you released all keys neccessary to do this. That peculiar behavior
+     * can fool the X-server pretty much, cause it assumes that some keys
+     * were not released. TWM may stuck alsmost completly....
+     * OK, what we are doing here is after returning from the vt-switch
+     * exeplicitely unrelease all keyboard keys before the input-devices
+     * are reenabled.
+     */
+
+    for (i = keyc->curKeySyms.minKeyCode, map = keyc->curKeySyms.map;
+         i < keyc->curKeySyms.maxKeyCode;
+         i++, map += keyc->curKeySyms.mapWidth) {
+        ErrorF("key %d: pressed is %s\n", i, KeyPressed(i) ? "true" : "false");
+        if (KeyPressed(i)) {
+            switch (*map) {
+            /* Don't release the lock keys */
+            case XK_Caps_Lock:
+            case XK_Shift_Lock:
+            case XK_Num_Lock:
+            case XK_Scroll_Lock:
+            case XK_Kana_Lock:
+                break;
+            default:
+                if (pDev == inputInfo.keyboard) {
+                    ke.u.keyButtonPointer.time = GetTimeInMillis();
+                    ke.u.keyButtonPointer.rootX = 0;
+                    ke.u.keyButtonPointer.rootY = 0;
+                    ke.u.u.type = KeyRelease;
+                    ke.u.u.detail = i;
+                    (*pDev->public.processInputProc) (&ke, pDev, 1);
+                }
+                else {
+                    nevents = GetKeyboardEvents(&events, pDev, KeyRelease, i);
+                    ErrorF("device %s: got %d events for %d key\n", pDev->name, nevents, i);
+                    for (j = 0; j < nevents; j++)
+                        mieqEnqueue(events++);
+                }
+                break;
+            }
+        }
+    }
+}
+
 /*
  * xf86VTSwitch --
  *      Handle requests for switching the vt.
@@ -1515,7 +891,6 @@ xf86VTSwitch()
      * Keep the order: Disable Device > LeaveVT
      *                        EnterVT > EnableDevice 
      */
-    DisableDevice((DeviceIntPtr)xf86Info.pKeyboard);
     pInfo = xf86InputDevs;
     while (pInfo) {
       DisableDevice(pInfo->dev);
@@ -1556,12 +931,14 @@ xf86VTSwitch()
       SaveScreens(SCREEN_SAVER_FORCER, ScreenSaverReset);
 
 #if !defined(__UNIXOS2__)
-      EnableDevice((DeviceIntPtr)xf86Info.pKeyboard);
       pInfo = xf86InputDevs;
       while (pInfo) {
+        xf86ReleaseKeys(pInfo->dev);
 	EnableDevice(pInfo->dev);
 	pInfo = pInfo->next;
       }
+      /* XXX HACK */
+      xf86ReleaseKeys(inputInfo.keyboard);
 #endif /* !__UNIXOS2__ */
       for (ih = InputHandlers; ih; ih = ih->next)
         xf86EnableInputHandler(ih);
@@ -1618,12 +995,14 @@ xf86VTSwitch()
     SaveScreens(SCREEN_SAVER_FORCER,ScreenSaverReset);
 
 #if !defined(__UNIXOS2__)
-    EnableDevice((DeviceIntPtr)xf86Info.pKeyboard);
     pInfo = xf86InputDevs;
     while (pInfo) {
+      xf86ReleaseKeys(pInfo->dev);
       EnableDevice(pInfo->dev);
       pInfo = pInfo->next;
     }
+    /* XXX HACK */
+    xf86ReleaseKeys(inputInfo.keyboard);
 #endif /* !__UNIXOS2__ */
     
     for (ih = InputHandlers; ih; ih = ih->next)
@@ -1745,9 +1124,6 @@ xf86ReloadInputDevs(int sig)
   
   signal(sig, (void(*)(int))xf86ReloadInputDevs);
 
-  DisableDevice((DeviceIntPtr)xf86Info.pKeyboard);
-  EnableDevice((DeviceIntPtr)xf86Info.pKeyboard);
-
   pInfo = xf86InputDevs;
   while (pInfo) {
     DisableDevice(pInfo->dev);
diff --git a/hw/xfree86/common/xf86Globals.c b/hw/xfree86/common/xf86Globals.c
index 1e0ac79..ab73c6c 100644
--- a/hw/xfree86/common/xf86Globals.c
+++ b/hw/xfree86/common/xf86Globals.c
@@ -94,9 +94,6 @@ InputInfoPtr xf86InputDevs = NULL;
 /* Globals that video drivers may not access */
 
 xf86InfoRec xf86Info = {
-	NULL,		/* pKeyboard */
-	NULL,		/* kbdProc */
-	NULL,		/* kbdEvents */
 	-1,		/* consoleFd */
 	-1,		/* kbdFd */
 	-1,		/* vtno */
diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index 05ac570..6c2cefb 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -155,6 +155,19 @@ xf86LookupInputDriver(const char *name)
     return NULL;
 }
 
+InputInfoPtr
+xf86LookupInput(const char *name)
+{
+    InputInfoPtr p;
+
+    for (p = xf86InputDevs; p != NULL; p = p->next) {
+        if (strcmp(name, p->name) == 0)
+            return p;
+    }
+
+    return NULL;
+}
+
 _X_EXPORT void
 xf86AddModuleInfo(ModuleInfoPtr info, pointer module)
 {
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 6defa94..e2622e3 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -1006,18 +1006,6 @@ InitInput(argc, argv)
     if (serverGeneration == 1) {
 	/* Call the PreInit function for each input device instance. */
 	for (pDev = xf86ConfigLayout.inputs; pDev && pDev->identifier; pDev++) {
-#ifdef USE_DEPRECATED_KEYBOARD_DRIVER
-	    /* XXX The keyboard driver is a special case for now. */
-	    if (!xf86NameCmp(pDev->driver, "keyboard")) {
-		xf86MsgVerb(X_WARNING, 0, "*** WARNING the legacy keyboard driver \"keyboard\" is deprecated\n");
-		xf86MsgVerb(X_WARNING, 0, "*** and will be removed in the next release of the Xorg server.\n");
-		xf86MsgVerb(X_WARNING, 0, "*** Please consider using the the new \"kbd\" driver for \"%s\".\n",
-			pDev->identifier);
-
-		continue;
-	    }
-#endif
-
 	    if ((pDrv = xf86LookupInputDriver(pDev->driver)) == NULL) {
 		xf86Msg(X_ERROR, "No Input driver matching `%s'\n", pDev->driver);
 		/* XXX For now, just continue. */
@@ -1040,80 +1028,18 @@ InitInput(argc, argv)
 		xf86DeleteInput(pInfo, 0);
 		continue;
 	    }
-	    if (pInfo->flags & XI86_CORE_KEYBOARD) {
-		if (coreKeyboard) {
-		    xf86Msg(X_ERROR,
-		      "Attempt to register more than one core keyboard (%s)\n",
-		      pInfo->name);
-		    pInfo->flags &= ~XI86_CORE_KEYBOARD;
-		} else {
-		    if (!(pInfo->flags & XI86_KEYBOARD_CAPABLE)) {
-			/* XXX just a warning for now */
-			xf86Msg(X_WARNING,
-			    "%s: does not have core keyboard capabilities\n",
-			    pInfo->name);
-		    }
-		    coreKeyboard = pInfo;
-		}
-	    }
-	    if (pInfo->flags & XI86_CORE_POINTER) {
-		if (corePointer) {
-		    xf86Msg(X_ERROR,
-			"Attempt to register more than one core pointer (%s)\n",
-			pInfo->name);
-		    pInfo->flags &= ~XI86_CORE_POINTER;
-		} else {
-		    if (!(pInfo->flags & XI86_POINTER_CAPABLE)) {
-			/* XXX just a warning for now */
-			xf86Msg(X_WARNING,
-			    "%s: does not have core pointer capabilities\n",
-			    pInfo->name);
-		    }
-		    corePointer = pInfo;
-		}
-	    }
 	}
-	if (!corePointer) {
-	    xf86Msg(X_WARNING, "No core pointer registered\n");
-	    /* XXX register a dummy core pointer */
-	}
-#ifdef NEW_KBD
-	if (!coreKeyboard) {
-	    xf86Msg(X_WARNING, "No core keyboard registered\n");
-	    /* XXX register a dummy core keyboard */
-	}
-#endif
     }
 
     /* Initialise all input devices. */
     pInfo = xf86InputDevs;
     while (pInfo) {
+        xf86Msg(X_INFO, "evaluating device (%s)\n", pInfo->name);
 	xf86ActivateDevice(pInfo);
 	pInfo = pInfo->next;
     }
 
-    if (coreKeyboard) {
-      xf86Info.pKeyboard = coreKeyboard->dev;
-      xf86Info.kbdEvents = NULL; /* to prevent the internal keybord driver usage*/
-    }
-    else {
-#ifdef USE_DEPRECATED_KEYBOARD_DRIVER
-      /* Only set this if we're allowing the old driver. */
-	if (xf86Info.kbdProc != NULL) 
-	    xf86Info.pKeyboard = AddInputDevice(xf86Info.kbdProc, TRUE);
-#endif
-    }
-    if (corePointer)
-	xf86Info.pMouse = corePointer->dev;
-    if (xf86Info.pKeyboard)
-      RegisterKeyboardDevice(xf86Info.pKeyboard); 
-
-  miRegisterPointerDevice(screenInfo.screens[0], xf86Info.pMouse);
-#ifdef XINPUT
-  xf86eqInit ((DevicePtr)xf86Info.pKeyboard, (DevicePtr)xf86Info.pMouse);
-#else
-  mieqInit ((DevicePtr)xf86Info.pKeyboard, (DevicePtr)xf86Info.pMouse);
-#endif
+    mieqInit();
 }
 
 #ifndef SET_STDERR_NONBLOCKING
@@ -1233,12 +1159,6 @@ AbortDDX()
   int i;
 
   /*
-   * try to deinitialize all input devices
-   */
-  if (xf86Info.kbdProc && xf86Info.pKeyboard)
-    (xf86Info.kbdProc)(xf86Info.pKeyboard, DEVICE_CLOSE);
-
-  /*
    * try to restore the original video state
    */
 #ifdef HAS_USL_VTS
diff --git a/hw/xfree86/common/xf86Io.c b/hw/xfree86/common/xf86Io.c
index 318b245..d10ad43 100644
--- a/hw/xfree86/common/xf86Io.c
+++ b/hw/xfree86/common/xf86Io.c
@@ -160,313 +160,3 @@ xf86KbdLeds ()
   xf86SetKbdLeds(real_leds);
   (void)leds;
 }
-
-/*
- * xf86KbdCtrl --
- *      Alter some of the keyboard control parameters. All special protocol
- *      values are handled by dix (ProgChangeKeyboardControl)
- */
-
-void
-xf86KbdCtrl (pKeyboard, ctrl)
-     DevicePtr     pKeyboard;        /* Keyboard to alter */
-     KeybdCtrl     *ctrl;
-{
-  int leds;
-  xf86Info.bell_pitch    = ctrl->bell_pitch;
-  xf86Info.bell_duration = ctrl->bell_duration;
-  xf86Info.autoRepeat    = ctrl->autoRepeat;
-
-  xf86Info.composeLock   = (ctrl->leds & XCOMP) ? TRUE : FALSE;
-
-  leds = (ctrl->leds & ~(XCAPS | XNUM | XSCR));
-#ifdef XKB
-  if (noXkbExtension) {
-#endif
-      xf86Info.leds = (leds & xf86Info.xleds)|(xf86Info.leds & ~xf86Info.xleds);
-#ifdef XKB
-  } else {
-      xf86Info.leds = leds;
-  }
-#endif
-
-  xf86KbdLeds();
-}
-
-/*
- * xf86InitKBD --
- *      Reinitialize the keyboard. Only set Lockkeys according to ours leds.
- *      Depress all other keys.
- */
-
-void
-xf86InitKBD(init)
-Bool init;
-{
-  char            leds = 0, rad;
-  unsigned int    i;
-  xEvent          kevent;
-  DeviceIntPtr    pKeyboard = xf86Info.pKeyboard;
-  KeyClassRec     *keyc = xf86Info.pKeyboard->key;
-  KeySym          *map = keyc->curKeySyms.map;
-
-  kevent.u.keyButtonPointer.time = GetTimeInMillis();
-  kevent.u.keyButtonPointer.rootX = 0;
-  kevent.u.keyButtonPointer.rootY = 0;
-
-  /*
-   * Hmm... here is the biggest hack of every time !
-   * It may be possible that a switch-vt procedure has finished BEFORE
-   * you released all keys neccessary to do this. That peculiar behavior
-   * can fool the X-server pretty much, cause it assumes that some keys
-   * were not released. TWM may stuck alsmost completly....
-   * OK, what we are doing here is after returning from the vt-switch
-   * exeplicitely unrelease all keyboard keys before the input-devices
-   * are reenabled.
-   */
-  for (i = keyc->curKeySyms.minKeyCode, map = keyc->curKeySyms.map;
-       i < keyc->curKeySyms.maxKeyCode;
-       i++, map += keyc->curKeySyms.mapWidth)
-    if (KeyPressed(i))
-      {
-        switch (*map) {
-	/* Don't release the lock keys */
-        case XK_Caps_Lock:
-        case XK_Shift_Lock:
-        case XK_Num_Lock:
-        case XK_Scroll_Lock:
-        case XK_Kana_Lock:
-	  break;
-        default:
-	  kevent.u.u.detail = i;
-	  kevent.u.u.type = KeyRelease;
-	  (* pKeyboard->public.processInputProc)(&kevent, pKeyboard, 1);
-        }
-      }
-  
-  xf86Info.scanPrefix      = 0;
-
-  if (init)
-    {
-      /*
-       * we must deal here with the fact, that on some cases the numlock or
-       * capslock key are enabled BEFORE the server is started up. So look
-       * here at the state on the according LEDS to determine whether a
-       * lock-key is already set.
-       */
-
-      xf86Info.capsLock        = FALSE;
-      xf86Info.numLock         = FALSE;
-      xf86Info.scrollLock      = FALSE;
-      xf86Info.modeSwitchLock  = FALSE;
-      xf86Info.composeLock     = FALSE;
-    
-#ifdef LED_CAP
-#ifdef INHERIT_LOCK_STATE
-      leds = xf86Info.leds;
-
-      for (i = keyc->curKeySyms.minKeyCode, map = keyc->curKeySyms.map;
-           i < keyc->curKeySyms.maxKeyCode;
-           i++, map += keyc->curKeySyms.mapWidth)
-
-        switch(*map) {
-
-        case XK_Caps_Lock:
-        case XK_Shift_Lock:
-          if (leds & LED_CAP) 
-	    {
-	      xf86InitialCaps = i;
-	      xf86Info.capsLock = TRUE;
-	    }
-          break;
-
-        case XK_Num_Lock:
-          if (leds & LED_NUM)
-	    {
-	      xf86InitialNum = i;
-	      xf86Info.numLock = TRUE;
-	    }
-          break;
-
-        case XK_Scroll_Lock:
-        case XK_Kana_Lock:
-          if (leds & LED_SCR)
-	    {
-	      xf86InitialScroll = i;
-	      xf86Info.scrollLock = TRUE;
-	    }
-          break;
-        }
-#endif /* INHERIT_LOCK_STATE */
-      xf86SetKbdLeds(leds);
-#endif /* LED_CAP */
-      (void)leds;
-
-      if      (xf86Info.kbdDelay <= 375) rad = 0x00;
-      else if (xf86Info.kbdDelay <= 625) rad = 0x20;
-      else if (xf86Info.kbdDelay <= 875) rad = 0x40;
-      else                               rad = 0x60;
-    
-      if      (xf86Info.kbdRate <=  2)   rad |= 0x1F;
-      else if (xf86Info.kbdRate >= 30)   rad |= 0x00;
-      else                               rad |= ((58 / xf86Info.kbdRate) - 2);
-    
-      xf86SetKbdRepeat(rad);
-    }
-}
-
-/*
- * xf86KbdProc --
- *	Handle the initialization, etc. of a keyboard.
- */
-
-int
-xf86KbdProc (pKeyboard, what)
-     DeviceIntPtr pKeyboard;	/* Keyboard to manipulate */
-     int       what;	    	/* What to do to it */
-{
-  KeySymsRec           keySyms;
-  CARD8                modMap[MAP_LENGTH];
-  int                  kbdFd;
-
-  switch (what) {
-
-  case DEVICE_INIT:
-    /*
-     * First open and find the current state of the keyboard.
-     */
-
-    xf86KbdInit();
-
-    xf86KbdGetMapping(&keySyms, modMap);
-    
-
-#ifndef XKB
-    defaultKeyboardControl.leds = xf86GetKbdLeds();
-#else
-    defaultKeyboardControl.leds = 0;
-#endif
-
-    /*
-     * Perform final initialization of the system private keyboard
-     * structure and fill in various slots in the device record
-     * itself which couldn't be filled in before.
-     */
-
-    pKeyboard->public.on = FALSE;
-
-#ifdef XKB
-    if (noXkbExtension) {
-#endif
-    InitKeyboardDeviceStruct((DevicePtr)xf86Info.pKeyboard,
-			     &keySyms,
-			     modMap,
-			     xf86KbdBell,
-			     (KbdCtrlProcPtr)xf86KbdCtrl);
-#ifdef XKB
-    } else {
- 	XkbComponentNamesRec	names;
-	XkbDescPtr		desc;
-	Bool			foundTerminate = FALSE;
-	int			keyc;
-	if (xf86Info.xkbkeymap) {
-	    names.keymap = xf86Info.xkbkeymap;
-	    names.keycodes = NULL;
-	    names.types = NULL;
-	    names.compat = NULL;
-	    names.symbols = NULL;
-	    names.geometry = NULL;
-	} else {
-	    names.keymap = NULL;
-	    names.keycodes = xf86Info.xkbkeycodes;
-	    names.types = xf86Info.xkbtypes;
-	    names.compat = xf86Info.xkbcompat;
-	    names.symbols = xf86Info.xkbsymbols;
-	    names.geometry = xf86Info.xkbgeometry;
-	}
-	if ((xf86Info.xkbkeymap || xf86Info.xkbcomponents_specified)
-	   && (xf86Info.xkbmodel == NULL || xf86Info.xkblayout == NULL)) {
-		xf86Info.xkbrules = NULL;
-	}
-	XkbSetRulesDflts(xf86Info.xkbrules, xf86Info.xkbmodel,
-			 xf86Info.xkblayout, xf86Info.xkbvariant,
-			 xf86Info.xkboptions);
-	
-	XkbInitKeyboardDeviceStruct(pKeyboard, 
-				    &names,
-				    &keySyms, 
-				    modMap, 
-				    xf86KbdBell,
-				    (KbdCtrlProcPtr)xf86KbdCtrl);
-
-	/* Search keymap for Terminate action */
-	desc  = pKeyboard->key->xkbInfo->desc;
-	for (keyc = desc->min_key_code; keyc <= desc->max_key_code; keyc++) {
-	    int i;
-	    for (i = 1; i <= XkbKeyNumActions(desc, keyc); i++) {
-		if (XkbKeyAction(desc, keyc, i)
-		  && XkbKeyAction(desc, keyc, i)->type == XkbSA_Terminate) {
-		    foundTerminate = TRUE;
-		    goto searchdone;
-		}
-	    }
-  	}
-searchdone:
-	xf86Info.ActionKeyBindingsSet = foundTerminate;
-	if (!foundTerminate)
-	    xf86Msg(X_INFO, "Server_Terminate keybinding not found\n");
-    }
-#endif
-    
-    xf86InitKBD(TRUE);
-    break;
-    
-  case DEVICE_ON:
-    /*
-     * Set the keyboard into "direct" mode and turn on
-     * event translation.
-     */
-
-    kbdFd = xf86KbdOn();
-    /*
-     * Discard any pending input after a VT switch to prevent the server
-     * passing on parts of the VT switch sequence.
-     */
-    sleep(1);
-#if defined(WSCONS_SUPPORT)
-    if (xf86Info.consType != WSCONS) {
-#endif
-	if (kbdFd != -1) {
-		char buf[16];
-		read(kbdFd, buf, 16);
-    	}
-#if defined(WSCONS_SUPPORT)
-    }
-#endif
-
-#if !defined(__UNIXOS2__) /* Under EMX, keyboard cannot be select()'ed */
-    if (kbdFd != -1)
-      AddEnabledDevice(kbdFd);
-#endif  /* __UNIXOS2__ */
-
-    pKeyboard->public.on = TRUE;
-    xf86InitKBD(FALSE);
-    break;
-    
-  case DEVICE_CLOSE:
-  case DEVICE_OFF:
-    /*
-     * Restore original keyboard directness and translation.
-     */
-
-    kbdFd = xf86KbdOff();
-
-    if (kbdFd != -1)
-      RemoveEnabledDevice(kbdFd);
-
-    pKeyboard->public.on = FALSE;
-    break;
-
-  }
-  return (Success);
-}
diff --git a/hw/xfree86/common/xf86MiscExt.c b/hw/xfree86/common/xf86MiscExt.c
index bdb02ce..3e741ba 100644
--- a/hw/xfree86/common/xf86MiscExt.c
+++ b/hw/xfree86/common/xf86MiscExt.c
@@ -366,7 +366,7 @@ MiscExtCreateStruct(MiscExtStructType ms
 	InputInfoPtr pInfo = xf86InputDevs;
 	
 	while (pInfo) {
-	    if (xf86IsCorePointer(pInfo->dev))
+	    if (pInfo->dev == inputInfo.pointer)
 		break;
 	    pInfo = pInfo->next;
 	}
diff --git a/hw/xfree86/common/xf86Priv.h b/hw/xfree86/common/xf86Priv.h
index f97bbb3..b4e531c 100644
--- a/hw/xfree86/common/xf86Priv.h
+++ b/hw/xfree86/common/xf86Priv.h
@@ -200,9 +200,6 @@ void xf86KbdBell(int percent, DeviceIntP
 		 int unused);
 void xf86KbdLeds(void);
 void xf86UpdateKbdLeds(void);
-void xf86KbdCtrl(DevicePtr pKeyboard, KeybdCtrl *ctrl); 
-void xf86InitKBD(Bool init);  
-int xf86KbdProc(DeviceIntPtr pKeyboard, int what);
 
 /* xf86Kbd.c */ 
 
diff --git a/hw/xfree86/common/xf86Privstr.h b/hw/xfree86/common/xf86Privstr.h
index a35de20..c26e288 100644
--- a/hw/xfree86/common/xf86Privstr.h
+++ b/hw/xfree86/common/xf86Privstr.h
@@ -68,11 +68,6 @@ typedef enum {
  */
 
 typedef struct {
-
-    /* keyboard part */
-    DeviceIntPtr	pKeyboard;
-    DeviceProc		kbdProc;		/* procedure for initializing */
-    void		(* kbdEvents)(void);	/* proc for processing events */
     int			consoleFd;
     int			kbdFd;
     int			vtno;
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index 329dcba..7c27e1f 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -39,7 +39,6 @@
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  * OTHER DEALINGS IN THE SOFTWARE.
  *
  * Except as contained in this notice, the name of the copyright holder(s)
@@ -65,6 +64,7 @@
 #include "xf86Xinput.h"
 #ifdef XINPUT
 #include "XIstubs.h"
+#include "xf86Optrec.h"
 #endif
 #include "mipointer.h"
 #include "xf86InPriv.h"
@@ -75,10 +75,6 @@
 #include "dpmsproc.h"
 #endif
 
-#ifdef XFreeXDGA
-#include "dgaproc.h"
-#endif
-
 #include "exevents.h"	/* AddInputDevice */
 #include "exglobals.h"
 
@@ -114,82 +110,17 @@ static int      debug_level = 0;
 #define DBG(lvl, f)
 #endif
 
-/******************************************************************************
- * macros
- *****************************************************************************/
-#define ENQUEUE(e) xf86eqEnqueue((e))
-
-/***********************************************************************
- *
- * xf86AlwaysCoreControl --
- *	
- *	Control proc for the integer feedback that controls the always
- * core feature.
- *
- ***********************************************************************
- */
-static void
-xf86AlwaysCoreControl(DeviceIntPtr	device,
-		      IntegerCtrl	*control)
-{
-}
-
-/***********************************************************************
- *
- * Core devices functions --
- *	
- *	Test if device is the core device by checking the
- * value of always core feedback and the inputInfo struct.
- *
- ***********************************************************************
- */
-_X_EXPORT int
-xf86IsCorePointer(DeviceIntPtr	device)
-{
-    return(device == inputInfo.pointer);
-}
-
-static int
-xf86ShareCorePointer(DeviceIntPtr	device)
-{
-    LocalDevicePtr	local = (LocalDevicePtr) device->public.devicePrivate;
-    
-    return((local->always_core_feedback &&
-	    local->always_core_feedback->ctrl.integer_displayed));
-}
-
 static Bool
 xf86SendDragEvents(DeviceIntPtr	device)
 {
     LocalDevicePtr local = (LocalDevicePtr) device->public.devicePrivate;
     
     if (inputInfo.pointer->button->buttonsDown > 0)
-	return (local->flags & XI86_SEND_DRAG_EVENTS);
+        return (local->flags & XI86_SEND_DRAG_EVENTS);
     else
-	return (TRUE);
-}
-
-int
-xf86IsCoreKeyboard(DeviceIntPtr	device)
-{
-    LocalDevicePtr	local = (LocalDevicePtr) device->public.devicePrivate;
-    
-    return((local->flags & XI86_ALWAYS_CORE) ||
-	   (device == inputInfo.keyboard));
+        return (TRUE);
 }
 
-_X_EXPORT void
-xf86XInputSetSendCoreEvents(LocalDevicePtr local, Bool always)
-{
-    if (always) {
-	local->flags |= XI86_ALWAYS_CORE;
-    } else {
-	local->flags &= ~XI86_ALWAYS_CORE;
-    }
-}
-
-static int xf86CoreButtonState;
-
 /***********************************************************************
  *
  * xf86CheckButton --
@@ -201,23 +132,26 @@ static int xf86CoreButtonState;
  */
 Bool
 xf86CheckButton(int	button,
-		int	down)
+                int	down)
 {
     int	check;
     int bit = (1 << (button - 1));
 
+    /* XXX FIXME VERDAMMT */
+#if 0
     check = xf86CoreButtonState & bit;
     
     DBG(5, ErrorF("xf86CheckButton "
-		  "button=%d down=%d state=%d check=%d returns ",
-		   button, down, xf86CoreButtonState, check));
+                  "button=%d down=%d state=%d check=%d returns ",
+                   button, down, xf86CoreButtonState, check));
     if ((check && down) || (!check && !down)) {
-	DBG(5, ErrorF("FALSE\n"));
-	return FALSE;
+        DBG(5, ErrorF("FALSE\n"));
+        return FALSE;
     }
     xf86CoreButtonState ^= bit;
 
     DBG(5, ErrorF("TRUE\n"));
+#endif
     return TRUE;
 }
 
@@ -231,38 +165,35 @@ xf86CheckButton(int	button,
  */
 _X_EXPORT void
 xf86ProcessCommonOptions(LocalDevicePtr local,
-			 pointer	list)
+                         pointer	list)
 {
-    if (xf86SetBoolOption(list, "AlwaysCore", 0) ||
-	xf86SetBoolOption(list, "SendCoreEvents", 0)) {
-	local->flags |= XI86_ALWAYS_CORE;
-	xf86Msg(X_CONFIG, "%s: always reports core events\n", local->name);
-    }
-
-    if (xf86SetBoolOption(list, "CorePointer", 0)) {
-	local->flags |= XI86_CORE_POINTER;
-	xf86Msg(X_CONFIG, "%s: Core Pointer\n", local->name);
-    }
-
-    if (xf86SetBoolOption(list, "CoreKeyboard", 0)) {
-	local->flags |= XI86_CORE_KEYBOARD;
-	xf86Msg(X_CONFIG, "%s: Core Keyboard\n", local->name);
+    if (!xf86SetBoolOption(list, "AlwaysCore", 0) ||
+        xf86SetBoolOption(list, "SendCoreEvents", 0) ||
+        xf86SetBoolOption(list, "CorePointer", 0) ||
+        xf86SetBoolOption(list, "CoreKeyboard", 0)) {
+        local->flags |= XI86_ALWAYS_CORE;
+        xf86Msg(X_CONFIG, "%s: always reports core events\n", local->name);
     }
 
     if (xf86SetBoolOption(list, "SendDragEvents", 1)) {
-	local->flags |= XI86_SEND_DRAG_EVENTS;
+        local->flags |= XI86_SEND_DRAG_EVENTS;
     } else {
-	xf86Msg(X_CONFIG, "%s: doesn't report drag events\n", local->name);
+        xf86Msg(X_CONFIG, "%s: doesn't report drag events\n", local->name);
     }
     
     local->history_size = xf86SetIntOption(list, "HistorySize", 0);
 
     if (local->history_size > 0) {
-	xf86Msg(X_CONFIG, "%s: has a history of %d motions\n", local->name,
-		local->history_size);
+        xf86Msg(X_CONFIG, "%s: has a history of %d motions\n", local->name,
+                local->history_size);
     }
 }
 
+void
+xf86AlwaysCoreControl(DeviceIntPtr pDev, IntegerCtrl *control)
+{
+}
+
 /***********************************************************************
  *
  * xf86XinputFinalizeInit --
@@ -277,14 +208,11 @@ xf86XinputFinalizeInit(DeviceIntPtr	dev)
 {
     LocalDevicePtr        local = (LocalDevicePtr)dev->public.devicePrivate;
 
-    local->dxremaind = 0.0;
-    local->dyremaind = 0.0;
-    
     if (InitIntegerFeedbackClassDeviceStruct(dev, xf86AlwaysCoreControl) == FALSE) {
-	ErrorF("Unable to init integer feedback for always core feature\n");
+        ErrorF("Unable to init integer feedback for always core feature\n");
     } else {
-	local->always_core_feedback = dev->intfeed;
-	dev->intfeed->ctrl.integer_displayed = (local->flags & XI86_ALWAYS_CORE) ? 1 : 0;
+        local->always_core_feedback = dev->intfeed;
+        dev->intfeed->ctrl.integer_displayed = (local->flags & XI86_ALWAYS_CORE) ? 1 : 0;
     }
 }
 
@@ -302,42 +230,33 @@ xf86ActivateDevice(LocalDevicePtr local)
     DeviceIntPtr	dev;
 
     if (local->flags & XI86_CONFIGURED) {
-	int	open_on_init;
-	
-	open_on_init = local->flags &
-		(XI86_OPEN_ON_INIT |
-		 XI86_ALWAYS_CORE | XI86_CORE_POINTER | XI86_CORE_KEYBOARD);
-	
-	dev = AddInputDevice(local->device_control,
-			     open_on_init);
-	if (dev == NULL)
-	    FatalError("Too many input devices");
-	
-	local->atom = MakeAtom(local->type_name,
-			       strlen(local->type_name),
-			       TRUE);
-	AssignTypeAndName (dev, local->atom, local->name);
-	dev->public.devicePrivate = (pointer) local;
-	local->dev = dev;      
-	
-	xf86XinputFinalizeInit(dev);
-
-	/*
-	 * XXX Can a single device instance be both core keyboard and
-	 * core pointer?  If so, this should be changed.
-	 */
-	if (local->flags & XI86_CORE_POINTER)
-	    RegisterPointerDevice(dev);
-	else if (local->flags & XI86_CORE_KEYBOARD)
-	    RegisterKeyboardDevice(dev);
-#ifdef XINPUT
-	else
-	    RegisterOtherDevice(dev);
+        int	open_on_init;
+        
+        open_on_init = local->flags & (XI86_OPEN_ON_INIT | XI86_ALWAYS_CORE);
+        
+        dev = AddInputDevice(local->device_control,
+                             open_on_init);
+#ifdef DEBUG
+        ErrorF("activated device %d: %s\n", dev->id, local->name);
 #endif
-
-	if (serverGeneration == 1) 
-	    xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n",
-		    local->name, local->type_name);
+        if (dev == NULL)
+            FatalError("Too many input devices");
+        
+        local->atom = MakeAtom(local->type_name,
+                               strlen(local->type_name),
+                               TRUE);
+        AssignTypeAndName(dev, local->atom, local->name);
+        dev->public.devicePrivate = (pointer) local;
+        local->dev = dev;      
+        
+        xf86XinputFinalizeInit(dev);
+
+        dev->coreEvents = local->flags & XI86_ALWAYS_CORE;
+        RegisterOtherDevice(dev);
+
+        if (serverGeneration == 1) 
+            xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n",
+                    local->name, local->type_name);
     }
 }
 
@@ -368,20 +287,20 @@ xf86ActivateDevice(LocalDevicePtr local)
 
 void
 OpenInputDevice(DeviceIntPtr	dev,
-		ClientPtr	client,
-		int		*status)
+                ClientPtr	client,
+                int		*status)
 {
     if (!dev->inited) {
-	*status = BadDevice;
+        *status = BadDevice;
     } else {
-	if (!dev->public.on) {
-	    if (!EnableDevice(dev)) {
-		*status = BadDevice;
-	    } else {
-		/* to prevent ProcXOpenDevice to call EnableDevice again */
-		dev->startup = FALSE;
-	    }
-	}
+        if (!dev->public.on) {
+            if (EnableDevice(dev)) {
+                /* to prevent ProcXOpenDevice to call EnableDevice again */
+                dev->startup = FALSE;
+            } else {
+                *status = BadDevice;
+            }
+        }
     }
 }
 
@@ -515,7 +434,6 @@ ChangePointerDevice (
 void
 CloseInputDevice (DeviceIntPtr d, ClientPtr client)
 {
-  ErrorF("ProcXCloseDevice to close or not ?\n");
 }
 
 
@@ -593,7 +511,7 @@ SetDeviceMode (ClientPtr client, DeviceI
 
 int
 SetDeviceValuators (ClientPtr client, DeviceIntPtr dev, int *valuators,
-		    int first_valuator, int num_valuators)
+                    int first_valuator, int num_valuators)
 {
   return BadMatch;
 }
@@ -698,724 +616,246 @@ NewInputDeviceRequest (InputOption *opti
     return Success;
 }
 
-/*
- * adapted from mieq.c to support extended events
- *
- */
-#define QUEUE_SIZE  256
-
-typedef struct _Event {
-    xEvent	event;
-#ifdef XINPUT
-  deviceValuator val;
-#endif
-    ScreenPtr	pScreen;
-} EventRec, *EventPtr;
-
-typedef struct _EventQueue {
-    HWEventQueueType head, tail;
-    CARD32	lastEventTime;	    /* to avoid time running backwards */
-    Bool	lastMotion;
-    EventRec	events[QUEUE_SIZE]; /* static allocation for signals */
-    DevicePtr	pKbd, pPtr;	    /* device pointer, to get funcs */
-    ScreenPtr	pEnqueueScreen;	    /* screen events are being delivered to */
-    ScreenPtr	pDequeueScreen;	    /* screen events are being dispatched to */
-} EventQueueRec, *EventQueuePtr;
-
-static EventQueueRec xf86EventQueue;
-
-Bool
-xf86eqInit (DevicePtr pKbd, DevicePtr pPtr)
-{
-    xf86EventQueue.head = xf86EventQueue.tail = 0;
-    xf86EventQueue.lastEventTime = GetTimeInMillis ();
-    xf86EventQueue.pKbd = pKbd;
-    xf86EventQueue.pPtr = pPtr;
-    xf86EventQueue.lastMotion = FALSE;
-    xf86EventQueue.pEnqueueScreen = screenInfo.screens[0];
-    xf86EventQueue.pDequeueScreen = xf86EventQueue.pEnqueueScreen;
-    SetInputCheck (&xf86EventQueue.head, &xf86EventQueue.tail);
-    return TRUE;
-}
-
-/*
- * Must be reentrant with ProcessInputEvents.  Assumption: xf86eqEnqueue
- * will never be interrupted.  If this is called from both signal
- * handlers and regular code, make sure the signal is suspended when
- * called from regular code.
+/* 
+ * convenient functions to post events
  */
 
 _X_EXPORT void
-xf86eqEnqueue (xEvent *e)
-{
-    int		oldtail, newtail;
-    Bool	isMotion;
-#ifdef XINPUT
-    int		count;
-    
-    xf86AssertBlockedSIGIO ("xf86eqEnqueue");
-    switch (e->u.u.type) {
-    case KeyPress:
-    case KeyRelease:
-#ifdef XFreeXDGA
-	/* we do this here, because nobody seems to be calling
-	   xf86PostKeyEvent().  We can't steal MotionNotify events here
-	   because the motion-relative information has been lost already. */
-	if(DGAStealKeyEvent(xf86EventQueue.pEnqueueScreen->myNum, e))
-	    return;
-#endif
-	/* fall through */
-    case ButtonPress:
-    case ButtonRelease:
-    case MotionNotify:
-        count = 1;
-        break;
-    default:
-#ifdef XFreeXDGA
-	if (DGAIsDgaEvent (e))
-	{
-	    count = 1;
-	    break;
-	}
-#endif
-	if (!((deviceKeyButtonPointer *) e)->deviceid & MORE_EVENTS) {
-            count = 1;
-	}
-        else {
-	    count = 2;
-	}
-        break;
-    }
-#endif
-
-    oldtail = xf86EventQueue.tail;
-    isMotion = e->u.u.type == MotionNotify;
-    if (isMotion && xf86EventQueue.lastMotion && oldtail != xf86EventQueue.head) {
-	if (oldtail == 0)
-	    oldtail = QUEUE_SIZE;
-	oldtail = oldtail - 1;
-    }
-    else {
-    	newtail = oldtail + 1;
-    	if (newtail == QUEUE_SIZE)
-	    newtail = 0;
-    	/* Toss events which come in late */
-    	if (newtail == xf86EventQueue.head)
-	    return;
-	xf86EventQueue.tail = newtail;
-    }
-    
-    xf86EventQueue.lastMotion = isMotion;
-    xf86EventQueue.events[oldtail].event = *e;
-#ifdef XINPUT
-    if (count == 2) {
-	xf86EventQueue.events[oldtail].val = *((deviceValuator *) (((deviceKeyButtonPointer *) e)+1));
-    }
-#endif
-    /*
-     * Make sure that event times don't go backwards - this
-     * is "unnecessary", but very useful
-     */
-    if (e->u.keyButtonPointer.time < xf86EventQueue.lastEventTime &&
-	xf86EventQueue.lastEventTime - e->u.keyButtonPointer.time < 10000) {
-	
-	xf86EventQueue.events[oldtail].event.u.keyButtonPointer.time =
-	    xf86EventQueue.lastEventTime;
-    }
-    xf86EventQueue.events[oldtail].pScreen = xf86EventQueue.pEnqueueScreen;
-}
-
-/*
- * Call this from ProcessInputEvents()
- */
-void
-xf86eqProcessInputEvents ()
-{
-    EventRec	*e;
-    int		x, y;
-    struct {
-	xEvent	event;
-#ifdef XINPUT
-	deviceValuator	val;
-#endif
-    }		xe;
-#ifdef XINPUT
-    DeviceIntPtr                dev;
-    int                         id, count;
-    deviceKeyButtonPointer      *dev_xe;
-#endif
-
-    while (xf86EventQueue.head != xf86EventQueue.tail) {
-	if (screenIsSaved == SCREEN_SAVER_ON)
-	    SaveScreens (SCREEN_SAVER_OFF, ScreenSaverReset);
-#ifdef DPMSExtension
-	else if (DPMSPowerLevel != DPMSModeOn)
-	    SetScreenSaverTimer();
+xf86PostMotionEvent(DeviceIntPtr	device,
+                    int			is_absolute,
+                    int			first_valuator,
+                    int			num_valuators,
+                    ...)
+{
+    va_list var;
+    int i = 0, nevents = 0;
+    Bool drag = xf86SendDragEvents(device);
+    LocalDevicePtr local = (LocalDevicePtr) device->public.devicePrivate;
+    xEvent *xE = NULL;
+    int *valuators = NULL;
+    int flags = 0;
 
-        if (DPMSPowerLevel != DPMSModeOn)
-            DPMSSet(DPMSModeOn);
+#ifdef DEBUG
+    ErrorF("xf8PostMotionEvent enter: is_absolute %s\n",
+           is_absolute ? "yes" : "no");
 #endif
+    if (is_absolute)
+        flags = POINTER_ABSOLUTE;
+    else
+        flags = POINTER_RELATIVE | POINTER_ACCELERATE;
+    
+    valuators = xcalloc(sizeof(int), num_valuators);
 
-	e = &xf86EventQueue.events[xf86EventQueue.head];
-	/*
-	 * Assumption - screen switching can only occur on motion events
-	 */
-	if (e->pScreen != xf86EventQueue.pDequeueScreen) {
-	    xf86EventQueue.pDequeueScreen = e->pScreen;
-	    x = e->event.u.keyButtonPointer.rootX;
-	    y = e->event.u.keyButtonPointer.rootY;
-	    if (xf86EventQueue.head == QUEUE_SIZE - 1)
-	    	xf86EventQueue.head = 0;
-	    else
-	    	++xf86EventQueue.head;
-	    NewCurrentScreen (xf86EventQueue.pDequeueScreen, x, y);
-	}
-	else {
-	    xe.event = e->event;
-	    xe.val = e->val;
-	    if (xf86EventQueue.head == QUEUE_SIZE - 1)
-	    	xf86EventQueue.head = 0;
-	    else
-	    	++xf86EventQueue.head;
-	    switch (xe.event.u.u.type) {
-	    case KeyPress:
-	    case KeyRelease:
-	    	(*xf86EventQueue.pKbd->processInputProc)
-		    (&xe.event, (DeviceIntPtr)xf86EventQueue.pKbd, 1);
-	    	break;
-#ifdef XINPUT
-            case ButtonPress:
-            case ButtonRelease:
-            case MotionNotify:
-	    	(*(inputInfo.pointer->public.processInputProc))
-		    (&xe.event, (DeviceIntPtr)inputInfo.pointer, 1);
-		break;
-
-	    default:
-#ifdef XFreeXDGA
-		if (DGADeliverEvent (xf86EventQueue.pDequeueScreen, &xe.event))
-		    break;
-#endif
-		dev_xe = (deviceKeyButtonPointer *) &xe.event;
-		id = dev_xe->deviceid & DEVICE_BITS;
-		if (!(dev_xe->deviceid & MORE_EVENTS)) {
-		    count = 1;
-		}
-		else {
-		    count = 2;
-		}
-		dev = LookupDeviceIntRec(id);
-		if (dev == NULL) {
-		    ErrorF("LookupDeviceIntRec id=0x%x not found\n", id);
-/*                   FatalError("xf86eqProcessInputEvents : device not found.\n");
- */
-		    break;
-		}
-		if (!dev->public.processInputProc) {
-		    FatalError("xf86eqProcessInputEvents : device has no input proc.\n");
-		    break;
-		}
-		(*dev->public.processInputProc)(&xe.event, dev, count);
-#else
-	    default:
-	    	(*xf86EventQueue.pPtr->processInputProc)
-		    (&xe.event, (DeviceIntPtr)xf86EventQueue.pPtr, 1);
+    va_start(var, num_valuators);
+    for (i = 0; i < num_valuators; i++) {
+        valuators[i] = va_arg(var, int);
+#ifdef DEBUG
+        ErrorF("valuator %d: %d\n", i, valuators[i]);
 #endif
-	    	break;
-	    }
-	}
     }
-}
 
-void
-xf86eqSwitchScreen(ScreenPtr	pScreen,
-		   Bool		fromDIX)
-{
-    xf86EventQueue.pEnqueueScreen = pScreen;
-  
-    if (fromDIX)
-	xf86EventQueue.pDequeueScreen = pScreen;
-}
+    nevents = GetPointerEvents(&xE, device, MotionNotify, 0,
+                               flags, num_valuators, valuators);
 
-/* 
- * convenient functions to post events
- */
-
-_X_EXPORT void
-xf86PostMotionEvent(DeviceIntPtr	device,
-		    int			is_absolute,
-		    int			first_valuator,
-		    int			num_valuators,
-		    ...)
-{
-    va_list			var;
-    int				loop;
-    xEvent			xE[2];
-    deviceKeyButtonPointer	*xev  = (deviceKeyButtonPointer*) xE;
-    deviceValuator		*xv   = (deviceValuator*) xev+1;
-    LocalDevicePtr		local = (LocalDevicePtr) device->public.devicePrivate;
-    char			*buff = 0;
-    Time			current;
-    Bool			is_core = xf86IsCorePointer(device);
-    Bool			is_shared = xf86ShareCorePointer(device);
-    Bool			drag = xf86SendDragEvents(device);
-    ValuatorClassPtr		val = device->valuator;
-    int				valuator[6];
-    int				oldaxis[6];
-    int				*axisvals;
-    int				dx = 0, dy = 0;
-    float			mult;
-    int				x, y;
-    int				loop_start;
-    int				i;
-    int				num;
-    
-    DBG(5, ErrorF("xf86PostMotionEvent BEGIN 0x%x(%s) is_core=%s is_shared=%s is_absolute=%s\n",
-		  device, device->name,
-		  is_core ? "True" : "False",
-		  is_shared ? "True" : "False",
-		  is_absolute ? "True" : "False"));
-    
-    xf86Info.lastEventTime = xev->time = current = GetTimeInMillis();
+    for (i = 0; i < nevents; i++) {
+        if (xE->u.keyButtonPointer.time > xf86Info.lastEventTime)
+            xf86Info.lastEventTime = xE->u.keyButtonPointer.time;
+        mieqEnqueue(xE++);
+    }
     
-    if (!is_core) {
-      if (HAS_MOTION_HISTORY(local)) {
-	buff = ((char *)local->motion_history +
-		(sizeof(INT32) * local->dev->valuator->numAxes + sizeof(Time)) * local->last);
-      }
+#if 0
+    if (HAS_MOTION_HISTORY(local)) {
+      buff = ((char *)local->motion_history +
+              (sizeof(INT32) * local->dev->valuator->numAxes + sizeof(Time)) * local->last);
     }
 
-    if (num_valuators && (!val || (first_valuator + num_valuators > val->numAxes))) {
-	ErrorF("Bad valuators reported for device \"%s\"\n", device->name);
-	return;
+    if (HAS_MOTION_HISTORY(local)) {
+        local->last = (local->last + 1) % device->valuator->numMotionEvents;
+        if (local->last == local->first)
+            local->first = (local->first + 1) % device->valuator->numMotionEvents;
     }
-
-    axisvals = val->axisVal;
-    
-    va_start(var, num_valuators);
-
-    loop_start = first_valuator;
-    for(loop=0; loop<num_valuators; loop++) {
-	
-	valuator[loop%6] = va_arg(var,int);
-	
-	if (loop % 6 == 5 || loop == num_valuators - 1)	{
-	    num = loop % 6 + 1;
-	    /*
-	     * Adjust first two relative valuators
-	     */
-	    if (!is_absolute && num_valuators >= 2 && loop_start == 0) {
-		
-		dx = valuator[0];
-		dy = valuator[1];
-
-		/*
-		 * Accelerate
-		 */
-		if (device->ptrfeed && device->ptrfeed->ctrl.num) {
-		    /* modeled from xf86Events.c */
-		    if (device->ptrfeed->ctrl.threshold) {
-			if ((abs(dx) + abs(dy)) >= device->ptrfeed->ctrl.threshold) {
-			    local->dxremaind = ((float)dx * (float)(device->ptrfeed->ctrl.num)) /
-			        (float)(device->ptrfeed->ctrl.den) + local->dxremaind;
-			    valuator[0] = (int)local->dxremaind;
-			    local->dxremaind = local->dxremaind - (float)valuator[0];
-			    
-			    local->dyremaind = ((float)dy * (float)(device->ptrfeed->ctrl.num)) /
-			        (float)(device->ptrfeed->ctrl.den) + local->dyremaind;
-			    valuator[1] = (int)local->dyremaind;
-			    local->dyremaind = local->dyremaind - (float)valuator[1];
-			}
-		    }
-		    else if (dx || dy) {
-			mult = pow((float)(dx*dx+dy*dy),
-				   ((float)(device->ptrfeed->ctrl.num) /
-				    (float)(device->ptrfeed->ctrl.den) - 1.0) / 
-				   2.0) / 2.0;
-			if (dx) {
-			    local->dxremaind = mult * (float)dx + local->dxremaind;
-			    valuator[0] = (int)local->dxremaind;
-			    local->dxremaind = local->dxremaind - (float)valuator[0];
-			}
-			if (dy) {
-			    local->dyremaind = mult * (float)dy + local->dyremaind;
-			    valuator[1] = (int)local->dyremaind;
-			    local->dyremaind = local->dyremaind - (float)valuator[1];
-			}
-		    }
-		    DBG(6, ErrorF("xf86PostMotionEvent acceleration v0=%d v1=%d\n",
-				  valuator[0], valuator[1]));
-		}
-		
-		/*
-		 * Map current position back to device space in case
-		 * the cursor was warped
-		 */
-		if (is_core || is_shared)
-		{
-		    miPointerPosition (&x, &y);
-		    if (local->reverse_conversion_proc)
-			(*local->reverse_conversion_proc)(local, x, y, axisvals);
-		    else
-		    {
-			axisvals[0] = x;
-			axisvals[1] = y;
-		    }
-		}
-	    }
-		
-	    /*
-	     * Update axes
-	     */
-	    for (i = 0; i < num; i++)
-	    {
-		oldaxis[i] = axisvals[loop_start + i];
-	        if (is_absolute)
-		    axisvals[loop_start + i] = valuator[i];
-		else
-		    axisvals[loop_start + i] += valuator[i];
-	    }
-		
-	    /*
-	     * Deliver extension event
-	     */
-	    if (!is_core) {
-		xev->type = DeviceMotionNotify;
-		xev->detail = 0;
-		xev->deviceid = device->id | MORE_EVENTS;
-            
-		xv->type = DeviceValuator;
-		xv->deviceid = device->id;
-	    
-		xv->device_state = 0;
-		xv->num_valuators = num;
-		xv->first_valuator = loop_start;
-		memcpy (&xv->valuator0, &axisvals[loop_start],
-			sizeof(INT32)*xv->num_valuators);
-		
-		if (HAS_MOTION_HISTORY(local)) {
-		    *(Time*)buff = current;
-		    memcpy(buff+sizeof(Time)+sizeof(INT32)*xv->first_valuator,
-			   &axisvals[loop_start],
-			   sizeof(INT32)*xv->num_valuators);
-		}
-		ENQUEUE(xE);
-	    }
-	    
-	    /*
-	     * Deliver core event
-	     */
-	    if (is_core ||
-		(is_shared && num_valuators >= 2 && loop_start == 0)) {
-#ifdef XFreeXDGA
-		/*
-		 * Let DGA peek at the event and steal it
-		 */
-		xev->type = MotionNotify;
-		xev->detail = 0;
-		if (is_absolute)
-		{
-		    dx = axisvals[0] - oldaxis[0];
-		    dy = axisvals[1] - oldaxis[1];
-		}
-		if (DGAStealMouseEvent(xf86EventQueue.pEnqueueScreen->myNum,
-				       xE, dx, dy))
-		    continue;
 #endif
-		if (!(*local->conversion_proc)(local, loop_start, num,
-					       axisvals[0], axisvals[1],
-					       axisvals[2], axisvals[3],
-					       axisvals[4], axisvals[5],
-					       &x, &y))
-		    continue;
-
-		if (drag)
-		    miPointerAbsoluteCursor (x, y, current);
-		/*
-		 * Retrieve the position
-		 */
-		miPointerPosition (&x, &y);
-		if (local->reverse_conversion_proc)
-		    (*local->reverse_conversion_proc)(local, x, y, axisvals);
-		else
-		{
-		    axisvals[0] = x;
-		    axisvals[1] = y;
-		}
-	    }
-	    loop_start += 6;
-	}
-    }
-    va_end(var);
-    if (HAS_MOTION_HISTORY(local)) {
-	local->last = (local->last + 1) % device->valuator->numMotionEvents;
-	if (local->last == local->first)
-	    local->first = (local->first + 1) % device->valuator->numMotionEvents;
-    }
-    DBG(5, ErrorF("xf86PostMotionEvent END   0x%x(%s) is_core=%s is_shared=%s\n",
-		  device, device->name,
-		  is_core ? "True" : "False",
-		  is_shared ? "True" : "False"));
 }
 
 _X_EXPORT void
 xf86PostProximityEvent(DeviceIntPtr	device,
-		       int		is_in,
-		       int		first_valuator,
-		       int		num_valuators,
-		       ...)
+                       int		is_in,
+                       int		first_valuator,
+                       int		num_valuators,
+                       ...)
 {
     va_list			var;
     int				loop;
-    xEvent			xE[2];
-    deviceKeyButtonPointer	*xev = (deviceKeyButtonPointer*) xE;
-    deviceValuator		*xv = (deviceValuator*) xev+1;
-    ValuatorClassPtr		val = device->valuator;
-    Bool			is_core = xf86IsCorePointer(device);
-    Bool			is_absolute = val && ((val->mode & 1) == Relative);
+    Bool			is_core = device->coreEvents;
+
+#ifdef DEBUG
+    ErrorF("xf86PostProximityEvent enter\n");
+#endif
     
+#if 0
     DBG(5, ErrorF("xf86PostProximityEvent BEGIN 0x%x(%s) prox=%s is_core=%s is_absolute=%s\n",
-		  device, device->name, is_in ? "true" : "false",
-		  is_core ? "True" : "False",
-		  is_absolute ? "True" : "False"));
+                  device, device->name, is_in ? "true" : "false",
+                  is_core ? "True" : "False",
+                  is_absolute ? "True" : "False"));
     
     if (is_core) {
-	return;
+        return;
     }
   
     if (num_valuators && (!val || (first_valuator + num_valuators > val->numAxes))) {
-	ErrorF("Bad valuators reported for device \"%s\"\n", device->name);
-	return;
+        ErrorF("Bad valuators reported for device \"%s\"\n", device->name);
+        return;
     }
 
     xev->type = is_in ? ProximityIn : ProximityOut;
     xev->detail = 0;
     xev->deviceid = device->id | MORE_EVENTS;
-	
+        
     xv->type = DeviceValuator;
     xv->deviceid = device->id;
     xv->device_state = 0;
 
     if ((device->valuator->mode & 1) == Relative) {
-	num_valuators = 0;
+        num_valuators = 0;
     }
   
     if (num_valuators != 0) {
-	int	*axisvals = val->axisVal;
-	    
-	va_start(var, num_valuators);
-
-	for(loop=0; loop<num_valuators; loop++) {
-	    switch (loop % 6) {
-	    case 0:
-		xv->valuator0 = is_absolute ? va_arg(var, int) : axisvals[loop]; 
-		break;
-	    case 1:
-		xv->valuator1 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		break;
-	    case 2:
-		xv->valuator2 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		break;
-	    case 3:
-		xv->valuator3 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		break;
-	    case 4:
-		xv->valuator4 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		break;
-	    case 5:
-		xv->valuator5 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		break;
-	    }
-	    if ((loop % 6 == 5) || (loop == num_valuators - 1)) {
-		xf86Info.lastEventTime = xev->time = GetTimeInMillis();
-
-		xv->num_valuators = (loop % 6) + 1;
-		xv->first_valuator = first_valuator + (loop / 6) * 6;
-		ENQUEUE(xE);
-	    }
-	}
-	va_end(var);
+        int	*axisvals = val->axisVal;
+            
+        va_start(var, num_valuators);
+
+        for(loop=0; loop<num_valuators; loop++) {
+            switch (loop % 6) {
+            case 0:
+                xv->valuator0 = is_absolute ? va_arg(var, int) : axisvals[loop]; 
+                break;
+            case 1:
+                xv->valuator1 = is_absolute ? va_arg(var, int) : axisvals[loop];
+                break;
+            case 2:
+                xv->valuator2 = is_absolute ? va_arg(var, int) : axisvals[loop];
+                break;
+            case 3:
+                xv->valuator3 = is_absolute ? va_arg(var, int) : axisvals[loop];
+                break;
+            case 4:
+                xv->valuator4 = is_absolute ? va_arg(var, int) : axisvals[loop];
+                break;
+            case 5:
+                xv->valuator5 = is_absolute ? va_arg(var, int) : axisvals[loop];
+                break;
+            }
+            if ((loop % 6 == 5) || (loop == num_valuators - 1)) {
+                xf86Info.lastEventTime = xev->time = GetTimeInMillis();
+
+                xv->num_valuators = (loop % 6) + 1;
+                xv->first_valuator = first_valuator + (loop / 6) * 6;
+                mieqEnqueue(xE);
+            }
+        }
+        va_end(var);
     }
     else {
-	/* no valuator */
-	xf86Info.lastEventTime = xev->time = GetTimeInMillis();
+        /* no valuator */
+        xf86Info.lastEventTime = xev->time = GetTimeInMillis();
 
-	xv->num_valuators = 0;
-	xv->first_valuator = 0;
-	ENQUEUE(xE);
+        xv->num_valuators = 0;
+        xv->first_valuator = 0;
+        mieqEnqueue(xE);
     }
     DBG(5, ErrorF("xf86PostProximityEvent END   0x%x(%s) prox=%s is_core=%s is_absolute=%s\n",
-		  device, device->name, is_in ? "true" : "false",
-		  is_core ? "True" : "False",
-		  is_absolute ? "True" : "False"));
-    
+                  device, device->name, is_in ? "true" : "false",
+                  is_core ? "True" : "False",
+                  is_absolute ? "True" : "False"));
+#endif
 }
 
 _X_EXPORT void
 xf86PostButtonEvent(DeviceIntPtr	device,
-		    int			is_absolute,
-		    int			button,
-		    int			is_down,
-		    int			first_valuator,
-		    int			num_valuators,
-		    ...)
-{
-    va_list			var;
-    int				loop;
-    xEvent			xE[2];
-    deviceKeyButtonPointer	*xev	        = (deviceKeyButtonPointer*) xE;
-    deviceValuator		*xv	        = (deviceValuator*) xev+1;
-    ValuatorClassPtr		val		= device->valuator;
-    Bool			is_core		= xf86IsCorePointer(device);
-    Bool			is_shared       = xf86ShareCorePointer(device);
-    
-    DBG(5, ErrorF("xf86PostButtonEvent BEGIN 0x%x(%s) button=%d down=%s is_core=%s is_shared=%s is_absolute=%s\n",
-		  device, device->name, button,
-		  is_down ? "True" : "False",
-		  is_core ? "True" : "False",
-		  is_shared ? "True" : "False",
-		  is_absolute ? "True" : "False"));
-    
-    /* Check the core pointer button state not to send an inconsistent
-     * event. This can happen with the AlwaysCore feature.
-     */
-    if ((is_core || is_shared) && 
-	!xf86CheckButton(device->button->map[button], is_down)) 
-    {
-	return;
-    }
+                    int			is_absolute,
+                    int			button,
+                    int			is_down,
+                    int			first_valuator,
+                    int			num_valuators,
+                    ...)
+{
+    va_list var;
+    int *valuators = NULL;
+    int i = 0, nevents = 0;
+    xEvent *events = NULL;
     
-    if (num_valuators && (!val || (first_valuator + num_valuators > val->numAxes))) {
-	ErrorF("Bad valuators reported for device \"%s\"\n", device->name);
-	return;
-    }
+#ifdef DEBUG
+    ErrorF("xf86PostButtonEvent BEGIN 0x%x(%s) button=%d down=%s is_absolute=%s\n",
+                  device, device->name, button,
+                  is_down ? "True" : "False",
+                  is_absolute ? "True" : "False");
+#endif
 
-    if (!is_core) {
-	xev->type = is_down ? DeviceButtonPress : DeviceButtonRelease;
-	xev->detail = button;
-	xev->deviceid = device->id | MORE_EVENTS;
-	    
-	xv->type = DeviceValuator;
-	xv->deviceid = device->id;
-	xv->device_state = 0;
-
-	if (num_valuators != 0) {
-	    int			*axisvals = val->axisVal;
-	    
-	    va_start(var, num_valuators);
-      
-	    for(loop=0; loop<num_valuators; loop++) {
-		switch (loop % 6) {
-		case 0:
-		    xv->valuator0 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		    break;
-		case 1:
-		    xv->valuator1 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		    break;
-		case 2:
-		    xv->valuator2 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		    break;
-		case 3:
-		    xv->valuator3 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		    break;
-		case 4:
-		    xv->valuator4 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		    break;
-		case 5:
-		    xv->valuator5 = is_absolute ? va_arg(var, int) : axisvals[loop];
-		    break;
-		}
-		if ((loop % 6 == 5) || (loop == num_valuators - 1)) {
-		    xf86Info.lastEventTime = xev->time = GetTimeInMillis();
-		    xv->num_valuators = (loop % 6) + 1;
-		    xv->first_valuator = first_valuator + (loop / 6) * 6;
-		    ENQUEUE(xE);
-		    
-		}
-	    }
-	    va_end(var);
-	}
-	else {
-	    /* no valuator */
-	    xf86Info.lastEventTime = xev->time = GetTimeInMillis();
-	    xv->num_valuators = 0;
-	    xv->first_valuator = 0;
-	    ENQUEUE(xE);
-	}
-    }
-
-    /* removed rootX/rootY as DIX sets these fields */
-    if (is_core || is_shared) {
-	xE->u.u.type = is_down ? ButtonPress : ButtonRelease;
-	xE->u.u.detail =  device->button->map[button];
-	xf86Info.lastEventTime = xE->u.keyButtonPointer.time = GetTimeInMillis();
-	
-#ifdef XFreeXDGA
-	if (!DGAStealMouseEvent(xf86EventQueue.pEnqueueScreen->myNum, xE, 0, 0))
+    valuators = xcalloc(sizeof(int), num_valuators);
+
+    va_start(var, num_valuators);
+    for (i = 0; i < num_valuators; i++) {
+#ifdef DEBUG
+        ErrorF("valuator %d: %d\n", i, valuators[i]);
 #endif
-	    ENQUEUE(xE);
+        valuators[i] = va_arg(var, int);
+    }
+
+    nevents = GetPointerEvents(&events, device,
+                               is_down ? ButtonPress : ButtonRelease, button,
+                               is_absolute ? POINTER_ABSOLUTE :
+                                             POINTER_RELATIVE,
+                               num_valuators, valuators);
+
+    for (i = 0; i < nevents; i++) {
+        if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
+            xf86Info.lastEventTime = events->u.keyButtonPointer.time;
+        mieqEnqueue(events++);
     }
-    DBG(5, ErrorF("xf86PostButtonEvent END\n"));
 }
 
 _X_EXPORT void
 xf86PostKeyEvent(DeviceIntPtr	device,
-		 unsigned int	key_code,
-		 int		is_down,
-		 int		is_absolute,
-		 int		first_valuator,
-		 int		num_valuators,
-		 ...)
-{
-    va_list			var;
-    int				loop;
-    xEvent			xE[2];
-    deviceKeyButtonPointer	*xev = (deviceKeyButtonPointer*) xE;
-    deviceValuator		*xv = (deviceValuator*) xev+1;
-    
-    va_start(var, num_valuators);
+                 unsigned int	key_code,
+                 int		is_down,
+                 int		is_absolute,
+                 int		first_valuator,
+                 int		num_valuators,
+                 ...)
+{
+    va_list var;
+    int i = 0, nevents = 0, *valuators = NULL;
+    xEvent *events = NULL;
+
+    /* instil confidence in the user */
+    ErrorF("this function has never been tested properly.  if things go quite "
+           "badly south after this message, then xf86PostKeyEvent is "
+           "broken.\n");
+
+    /* the spec says that dkp/dkr events should only get valuators in
+     * absolute mode.  the spec knows all.  BOW BEFORE etc. */
+    if (is_absolute) {
+        nevents = GetKeyboardValuatorEvents(&events, device,
+                                            is_down ? KeyPress : KeyRelease,
+                                            key_code, num_valuators,
+                                            valuators);
+        valuators = xcalloc(sizeof(int), num_valuators);
+        va_start(var, num_valuators);
+        for (i = 0; i < num_valuators; i++)
+            valuators[i] = va_arg(var, int);
+        va_end(var);
+    }
+    else {
+        nevents = GetKeyboardEvents(&events, device,
+                                    is_down ? KeyPress : KeyRelease,
+                                    key_code);
+    }
 
-    for(loop=0; loop<num_valuators; loop++) {
-	switch (loop % 6) {
-	case 0:
-	    xv->valuator0 = va_arg(var, int);
-	    break;
-	case 1:
-	    xv->valuator1 = va_arg(var, int);
-	    break;
-	case 2:
-	    xv->valuator2 = va_arg(var, int);
-	    break;
-	case 3:
-	    xv->valuator3 = va_arg(var, int);
-	    break;
-	case 4:
-	    xv->valuator4 = va_arg(var, int);
-	    break;
-	case 5:
-	    xv->valuator5 = va_arg(var, int);
-	    break;
-	}
-	if (((loop % 6 == 5) || (loop == num_valuators - 1))) {
-	    xev->type = is_down ? DeviceKeyPress : DeviceKeyRelease;
-	    xev->detail = key_code;
-	    
-	    xf86Info.lastEventTime = xev->time = GetTimeInMillis();
-	    xev->deviceid = device->id | MORE_EVENTS;
-	    
-	    xv->type = DeviceValuator;
-	    xv->deviceid = device->id;
-	    xv->device_state = 0;
-	    /* if the device is in the relative mode we don't have to send valuators */
-	    xv->num_valuators = is_absolute ? (loop % 6) + 1 : 0;
-	    xv->first_valuator = first_valuator + (loop / 6) * 6;
-	    
-	    ENQUEUE(xE);
-	    /* if the device is in the relative mode only one event is needed */
-	    if (!is_absolute) break;
-	}
+    for (i = 0; i < nevents; i++) {
+        if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
+            xf86Info.lastEventTime = events->u.keyButtonPointer.time;
+        mieqEnqueue(events++);
     }
-    va_end(var);
 }
 
 _X_EXPORT void
@@ -1423,21 +863,22 @@ xf86PostKeyboardEvent(DeviceIntPtr      
                       unsigned int      key_code,
                       int               is_down)
 {
-    xEvent                      xE[2];
-    deviceKeyButtonPointer      *xev = (deviceKeyButtonPointer*) xE;
+    xEvent *events = NULL;
+    int nevents = 0, i = 0;
 
-    if (xf86IsCoreKeyboard(device)) {
-        xev->type = is_down ? KeyPress : KeyRelease;
-    } else {
-        xev->type = is_down ? DeviceKeyPress : DeviceKeyRelease;
-    }
-    xev->detail = key_code;
-    xf86Info.lastEventTime = xev->time = GetTimeInMillis();
-
-#ifdef XFreeXDGA
-    /* if(!DGAStealKeyEvent(xf86EventQueue.pEnqueueScreen->myNum, xE)) */
+#ifdef DEBUG
+    ErrorF("xf86PKE enter: keycode %d is %s, device %d\n", key_code,
+           is_down ? "down" : "up", device->id);
 #endif
-    ENQUEUE(xE);
+
+    nevents = GetKeyboardEvents(&events, device,
+                                is_down ? KeyPress : KeyRelease, key_code);
+
+    for (i = 0; i < nevents; i++) {
+        if (events->u.keyButtonPointer.time > xf86Info.lastEventTime)
+            xf86Info.lastEventTime = events->u.keyButtonPointer.time;
+        mieqEnqueue(events++);
+    }
 }
 
 /* 
@@ -1450,20 +891,20 @@ xf86MotionHistoryAllocate(LocalDevicePtr
     ValuatorClassPtr	valuator = local->dev->valuator;
     
     if (!HAS_MOTION_HISTORY(local))
-	return;
+        return;
     if (local->motion_history) xfree(local->motion_history);
     local->motion_history = xalloc((sizeof(INT32) * valuator->numAxes + sizeof(Time))
-				   * valuator->numMotionEvents);
+                                   * valuator->numMotionEvents);
     local->first = 0;
     local->last	 = 0;
 }
 
 _X_EXPORT int
 xf86GetMotionEvents(DeviceIntPtr	dev,
-		    xTimecoord		*buff,
-		    unsigned long	start,
-		    unsigned long	stop,
-		    ScreenPtr		pScreen)
+                    xTimecoord		*buff,
+                    unsigned long	start,
+                    unsigned long	stop,
+                    ScreenPtr		pScreen)
 {
     LocalDevicePtr	local	 = (LocalDevicePtr)dev->public.devicePrivate;
     ValuatorClassPtr	valuator = dev->valuator;
@@ -1473,20 +914,20 @@ xf86GetMotionEvents(DeviceIntPtr	dev,
     Time		current;
     
     if (!HAS_MOTION_HISTORY(local))
-	return 0;
+        return 0;
 
     size = (sizeof(INT32) * valuator->numAxes + sizeof(Time));
 
     while (loop != local->last) {
-	current = *(Time*)(((char *)local->motion_history)+loop*size);
-	if (current > stop)
-	    return num;
-	if (current >= start) {
-	    memcpy(((char *)buff)+size*num,
-		   ((char *)local->motion_history)+loop*size, size);
-	    num++;
-	}
-	loop = (loop + 1) % valuator->numMotionEvents;
+        current = *(Time*)(((char *)local->motion_history)+loop*size);
+        if (current > stop)
+            return num;
+        if (current >= start) {
+            memcpy(((char *)buff)+size*num,
+                   ((char *)local->motion_history)+loop*size, size);
+            num++;
+        }
+        loop = (loop + 1) % valuator->numMotionEvents;
     }
     return num;
 }
@@ -1512,10 +953,10 @@ xf86FirstLocalDevice()
 
 _X_EXPORT int
 xf86ScaleAxis(int	Cx,
-	      int	Sxhigh,
-	      int	Sxlow,
-	      int	Rxhigh,
-	      int	Rxlow )
+              int	Sxhigh,
+              int	Sxlow,
+              int	Rxhigh,
+              int	Rxlow )
 {
     int X;
     int dSx = Sxhigh - Sxlow;
@@ -1550,7 +991,7 @@ xf86XInputSetScreen(LocalDevicePtr	local
 		    int			x,
 		    int			y)
 {
-    if ((xf86IsCorePointer(local->dev) || xf86ShareCorePointer(local->dev)) &&
+    if (local->dev->coreEvents &&
 	(miPointerCurrentScreen() != screenInfo.screens[screen_number])) {
 	miPointerSetNewScreen (screen_number, x, y);
     }
@@ -1562,6 +1003,9 @@ xf86InitValuatorAxisStruct(DeviceIntPtr 
 			   int resolution, int min_res, int max_res)
 {
 #ifdef XINPUT
+    if (!dev || !dev->valuator)
+        return;
+
     if (maxval == -1) {
 	if (axnum == 0)
 	    maxval = screenInfo.screens[0]->width - 1;
@@ -1582,10 +1026,14 @@ _X_EXPORT void
 xf86InitValuatorDefaults(DeviceIntPtr dev, int axnum)
 {
 #ifdef XINPUT
-    if (axnum == 0)
+    if (axnum == 0) {
 	dev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
-    else if (axnum == 1)
+        dev->valuator->lastx = dev->valuator->axisVal[0];
+    }
+    else if (axnum == 1) {
 	dev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
+        dev->valuator->lasty = dev->valuator->axisVal[1];
+    }
 #endif
 }
 
diff --git a/hw/xfree86/common/xf86Xinput.h b/hw/xfree86/common/xf86Xinput.h
index 9fb3041..d4fa43f 100644
--- a/hw/xfree86/common/xf86Xinput.h
+++ b/hw/xfree86/common/xf86Xinput.h
@@ -147,8 +147,6 @@ typedef struct _LocalDeviceRec {
     unsigned int	    last;
     int			    old_x;
     int			    old_y;
-    float		    dxremaind;
-    float		    dyremaind;
     char *		    type_name;
     IntegerFeedbackPtr	    always_core_feedback;
     IDevPtr		    conf_idev;
@@ -167,16 +165,7 @@ typedef struct _DeviceAssocRec 
 extern InputInfoPtr xf86InputDevs;
 
 /* xf86Xinput.c */
-int xf86IsCorePointer(DeviceIntPtr dev);
-int xf86IsCoreKeyboard(DeviceIntPtr dev);
-void xf86XInputSetSendCoreEvents(LocalDevicePtr local, Bool always);
-#define xf86AlwaysCore(a,b) xf86XInputSetSendCoreEvents(a,b)
-
 void InitExtInput(void);
-Bool xf86eqInit(DevicePtr pKbd, DevicePtr pPtr);
-void xf86eqEnqueue(struct _xEvent *event);
-void xf86eqProcessInputEvents (void);
-void xf86eqSwitchScreen(ScreenPtr pScreen, Bool fromDIX);
 void xf86PostMotionEvent(DeviceIntPtr device, int is_absolute,
 			 int first_valuator, int num_valuators, ...);
 void xf86PostProximityEvent(DeviceIntPtr device, int is_in,
@@ -212,10 +201,16 @@ void xf86RemoveEnabledDevice(InputInfoPt
 void xf86AddInputDriver(InputDriverPtr driver, pointer module, int flags);
 void xf86DeleteInputDriver(int drvIndex);
 InputInfoPtr xf86AllocateInput(InputDriverPtr drv, int flags);
+InputDriverPtr xf86LookupInputDriver(const char *name);
+InputInfoPtr xf86LookupInput(const char *name);
 void xf86DeleteInput(InputInfoPtr pInp, int flags);
 
 /* xf86Option.c */
 void xf86CollectInputOptions(InputInfoPtr pInfo, const char **defaultOpts,
 			     pointer extraOpts);
 
+/* Legacy hatred */
+#define SendCoreEvents 59
+#define DontSendCoreEvents 60
+
 #endif /* _xf86Xinput_h */
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
index ad4f773..f9d11e8 100644
--- a/hw/xfree86/loader/xf86sym.c
+++ b/hw/xfree86/loader/xf86sym.c
@@ -293,7 +293,6 @@ _X_HIDDEN void *xfree86LookupTab[] = {
     SYMFUNC(xf86SoundKbdBell)
     SYMFUNC(xf86GARTCloseScreen)
 #ifdef XINPUT
-    /* XISB routines  (Merged from Metrolink tree) */
     SYMFUNC(XisbNew)
     SYMFUNC(XisbFree)
     SYMFUNC(XisbRead)
@@ -695,7 +694,6 @@ _X_HIDDEN void *xfree86LookupTab[] = {
     /* xf86Xinput.c */
 #ifdef XINPUT
     SYMFUNC(xf86ProcessCommonOptions)
-    SYMFUNC(xf86IsCorePointer)
     SYMFUNC(xf86PostMotionEvent)
     SYMFUNC(xf86PostProximityEvent)
     SYMFUNC(xf86PostButtonEvent)
@@ -704,13 +702,9 @@ _X_HIDDEN void *xfree86LookupTab[] = {
     SYMFUNC(xf86GetMotionEvents)
     SYMFUNC(xf86MotionHistoryAllocate)
     SYMFUNC(xf86FirstLocalDevice)
-    SYMFUNC(xf86eqEnqueue)
     SYMFUNC(xf86ActivateDevice)
-/* The following segment merged from Metrolink tree */
     SYMFUNC(xf86XInputSetScreen)
     SYMFUNC(xf86ScaleAxis)
-    SYMFUNC(xf86XInputSetSendCoreEvents)
-/* End merged segment */
 #endif
 #ifdef DPMSExtension
     SYMFUNC(DPMSGet)
diff-tree d32dc8bf19e1071fc30af2f0bc6a6699b351f39e (from 7711c56d2e2aeae4dcd6d9297bc144c1cb3cfab1)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Jul 20 18:40:47 2006 -0400

    be more careful in IVAS
    
    Don't walk off the end of a NULL pointer in InitValuatorAxisStruct.

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 2932ab2..9fdea6d 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -302,7 +302,12 @@ _X_EXPORT void
 InitValuatorAxisStruct(DeviceIntPtr dev, int axnum, int minval, int maxval,
 		       int resolution, int min_res, int max_res)
 {
-    register AxisInfoPtr ax = dev->valuator->axes + axnum;
+    register AxisInfoPtr ax;
+   
+    if (!dev || !dev->valuator)
+        return NULL;
+
+    ax = dev->valuator->axes + axnum;
 
     ax->min_value = minval;
     ax->max_value = maxval;
diff-tree 7711c56d2e2aeae4dcd6d9297bc144c1cb3cfab1 (from f18c3122a57df9770087e5fc70ac488552222233)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Thu Jul 20 18:38:57 2006 -0400

    xephyr: fix keymap, pointer; dix: fix multiple axes
    
    Initialise our axes properly in the DIX, and make sure we don't
    unnecessarily clip maxval when it's not set.
    Fix keymap copying in Xephyr (to some degree: it's still broken),
    and set nAxes and nButtons properly.

diff --git a/dix/devices.c b/dix/devices.c
index 52a0a0a..ee0c74b 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -815,6 +815,9 @@ InitValuatorClassDeviceStruct(DeviceIntP
     int i;
     register ValuatorClassPtr valc;
 
+    if (!dev)
+        return FALSE;
+
     valc = (ValuatorClassPtr)xalloc(sizeof(ValuatorClassRec) +
 				    numAxes * sizeof(AxisInfo) +
 				    numAxes * sizeof(unsigned int));
@@ -827,13 +830,15 @@ InitValuatorClassDeviceStruct(DeviceIntP
     valc->mode = mode;
     valc->axes = (AxisInfoPtr)(valc + 1);
     valc->axisVal = (int *)(valc->axes + numAxes);
-    for (i=0; i<numAxes; i++)
-	valc->axisVal[i]=0;
     valc->lastx = 0;
     valc->lasty = 0;
     valc->dxremaind = 0;
     valc->dyremaind = 0;
     dev->valuator = valc;
+    for (i=0; i<numAxes; i++) {
+        InitValuatorAxisStruct(dev, i, 0, -1, 0, 0, 0);
+	valc->axisVal[i]=0;
+    }
     return TRUE;
 }
 
diff --git a/dix/events.c b/dix/events.c
index fac492c..6c44485 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4953,12 +4953,12 @@ GetPointerEvents(xEvent **xE, DeviceIntP
     axes = pDev->valuator->axes;
     if (kbp->root_x < axes->min_value)
         kbp->root_x = axes->min_value;
-    if (kbp->root_x > axes->max_value)
+    if (axes->max_value > 0 && kbp->root_x > axes->max_value)
         kbp->root_x = axes->max_value;
     axes++;
     if (kbp->root_y < axes->min_value)
         kbp->root_y = axes->min_value;
-    if (kbp->root_y > axes->max_value)
+    if (axes->max_value > 0 && kbp->root_y > axes->max_value)
         kbp->root_y = axes->max_value;
 
     if (pDev->coreEvents) {
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index 92fd831..6a337bc 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -863,10 +863,10 @@ MouseInit (KdPointerInfo *pi)
     pi->driverPrivate = (EphyrPointerPrivate *)
                          xcalloc(sizeof(EphyrPointerPrivate), 1);
     ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
+    pi->nAxes = 3;
+    pi->nButtons = 32;
     ephyrMouse = pi;
-    /* FIXME DO NOT COMMIT */
     KdAddPointerDriver(&EphyrMouseDriver);
-    ErrorF("SUCCESS!\n");
     return Success;
 }
 
@@ -874,7 +874,6 @@ static Status
 MouseEnable (KdPointerInfo *pi)
 {
     ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = TRUE;
-    ErrorF("SUCCESS ENABLE!\n");
     return Success;
 }
 
diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
index b23532f..96d1211 100644
--- a/hw/kdrive/ephyr/hostx.c
+++ b/hw/kdrive/ephyr/hostx.c
@@ -675,13 +675,6 @@ hostx_load_keymap(void)
 			       max_keycode - min_keycode + 1,
 			       &host_width);
 
-
-  ephyrKeySyms.map = (KeySym *)calloc(sizeof(KeySym),
-                                      (max_keycode - min_keycode + 1) *
-                                      width);
-  if (!ephyrKeySyms.map)
-        return;
-  
   /* Try and copy the hosts keymap into our keymap to avoid loads
    * of messing around.
    *
@@ -690,15 +683,21 @@ hostx_load_keymap(void)
    */
   width = (host_width > 4) ? 4 : host_width;
 
+  ephyrKeySyms.map = (KeySym *)calloc(sizeof(KeySym),
+                                      (max_keycode - min_keycode + 1) *
+                                      width);
+  if (!ephyrKeySyms.map)
+        return;
+
   for (i=0; i<(max_keycode - min_keycode+1); i++)
     for (j=0; j<width; j++)
-      kdKeymap[ (i*width)+j ] = keymap[ (i*host_width) + j ];
+      ephyrKeySyms.map[(i*width)+j] = keymap[(i*host_width) + j];
 
   EPHYR_DBG("keymap width, host:%d kdrive:%d", host_width, width);
   
   ephyrKeySyms.minKeyCode  = min_keycode;
   ephyrKeySyms.maxKeyCode  = max_keycode;
-  ephyrKeySyms.mapWidth    = (width > 4) ? 4 : width;
+  ephyrKeySyms.mapWidth    = width;
 
   XFree(keymap);
 }
diff-tree f18c3122a57df9770087e5fc70ac488552222233 (from 463e0fe35bec3c91b19be9aacf34babb146a88c9)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Thu Jul 20 16:49:17 2006 -0400

    sanitise debug output
    
    Don't spit out huge chunks of pointless ephemera, especially without
    --enable-debug.

diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 13869c9..d46694f 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -408,7 +408,9 @@ KdPointerProc(DeviceIntPtr pDevice, int 
     switch (onoff)
     {
     case DEVICE_INIT:
+#ifdef DEBUG
         ErrorF("initialising pointer %s ...\n", pi->name);
+#endif
         if (!pi->driver) {
             if (!pi->driverPrivate) {
                 ErrorF("no driver specified for %s\n", pi->name);
@@ -468,7 +470,6 @@ KdPointerProc(DeviceIntPtr pDevice, int 
         }
 
         if ((*pi->driver->Enable) (pi) == Success) {
-            ErrorF("initialised fine, returning success\n");
             pDev->on = TRUE;
             return Success;
         }
@@ -495,13 +496,11 @@ KdPointerProc(DeviceIntPtr pDevice, int 
         return Success;
 
     case DEVICE_CLOSE:
-        ErrorF("D_C\n");
 	if (pDev->on) {
             if (!pi->driver->Disable) {
                 return BadImplementation;
             }
             (*pi->driver->Disable) (pi);
-            ErrorF("disabled\n");
             pDev->on = FALSE;
         }
 
@@ -509,10 +508,8 @@ KdPointerProc(DeviceIntPtr pDevice, int 
             return BadImplementation;
 
         (*pi->driver->Fini) (pi);
-        ErrorF("finished\n");
 
         KdRemovePointer(pi);
-        ErrorF("removed\n");
         
         return Success;
     }
diff --git a/mi/mieq.c b/mi/mieq.c
index b05210c..062914c 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -101,7 +101,10 @@ mieqEnqueue (xEvent *e)
     deviceKeyButtonPointer *lastkbp = (deviceKeyButtonPointer *)
                                       &laste->event[0];
 
+#ifdef DEBUG
     ErrorF("mieqEnqueue: slamming an event on to the queue from %d\n", kbp->deviceid & DEVICE_BITS);
+#endif
+
     if (e->u.u.type == MotionNotify) {
         miPointerAbsoluteCursor(e->u.keyButtonPointer.rootX,
                                 e->u.keyButtonPointer.rootY,
@@ -135,7 +138,6 @@ mieqEnqueue (xEvent *e)
                 return;
             }
             laste->event[laste->nevents++] = *e;
-            ErrorF("put a valuator event into the queue\n");
             return;
         }
         else if (e->u.u.type == DeviceMotionNotify) {
@@ -174,9 +176,11 @@ mieqEnqueue (xEvent *e)
     if (e->u.keyButtonPointer.time < miEventQueue.lastEventTime &&
 	miEventQueue.lastEventTime - e->u.keyButtonPointer.time < 10000)
     {
+#ifdef DEBUG
         ErrorF("mieq: rewinding event time from %d to %d\n",
                miEventQueue.lastEventTime,
                miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time);
+#endif
 	miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time =
 	    miEventQueue.lastEventTime;
     }
@@ -186,7 +190,6 @@ mieqEnqueue (xEvent *e)
     miEventQueue.events[oldtail].pDev = pDev;
 
     miEventQueue.lastMotion = isMotion;
-    ErrorF("bottom of mieqEnqueue\n");
 }
 
 void
@@ -206,8 +209,6 @@ void mieqProcessInputEvents ()
     EventRec	*e;
     int		x, y;
 
-    ErrorF("mieqPIE: head %p, tail %p\n", miEventQueue.head, miEventQueue.tail);
-
     while (miEventQueue.head != miEventQueue.tail)
     {
 	if (screenIsSaved == SCREEN_SAVER_ON)
@@ -234,7 +235,6 @@ void mieqProcessInputEvents ()
 	    	miEventQueue.head = 0;
 	    else
 	    	++miEventQueue.head;
-            ErrorF("calling pIP from mieqPIE\n");
             (*e->pDev->public.processInputProc)(e->event, e->pDev, e->nevents);
 	}
     }
diff-tree 463e0fe35bec3c91b19be9aacf34babb146a88c9 (from 1987af8c498a1bf394a8951ca6d5b0b7f7a35188)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Thu Jul 20 16:45:15 2006 -0400

    update KDrive to new input API
    
    Update KDrive to fit the new API (mieqInit and InitPointerDeviceStruct), and
    include InitTouchscreenDeviceStruct in the DIX.

diff --git a/dix/devices.c b/dix/devices.c
index a3ce178..52a0a0a 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -838,6 +838,27 @@ InitValuatorClassDeviceStruct(DeviceIntP
 }
 
 _X_EXPORT Bool
+InitTouchscreenClassDeviceStruct(DeviceIntPtr dev)
+{
+    register TouchscreenClassPtr tsc;
+
+    tsc = (TouchscreenClassPtr)xalloc(sizeof(TouchscreenClassRec));
+    if (!tsc)
+        return FALSE;
+
+    /* we don't do anything sensible with these, but should */
+    tsc->min_x = -1;
+    tsc->min_y = -1;
+    tsc->max_x = -1;
+    tsc->max_y = -1;
+
+    tsc->button_threshold = 0;
+    dev->touchscreen = tsc;
+
+    return TRUE;
+}
+
+_X_EXPORT Bool
 InitFocusClassDeviceStruct(DeviceIntPtr dev)
 {
     register FocusClassPtr focc;
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 94c3abd..13869c9 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -441,7 +441,7 @@ KdPointerProc(DeviceIntPtr pDevice, int 
 	InitPointerDeviceStruct(pDev, pi->map, pi->nButtons,
 	    miPointerGetMotionEvents,
 	    (PtrCtrlProcPtr)NoopDDA,
-	    miPointerGetMotionBufferSize());
+	    miPointerGetMotionBufferSize(), pi->nAxes);
 
 #ifdef XINPUT
         if (pi->inputClass == KD_TOUCHSCREEN) {
@@ -1280,7 +1280,7 @@ KdInitInput (void)
             ErrorF("Failed to add keyboard!\n");
     }
 
-    mieqInit(NULL, NULL);
+    mieqInit();
 }
 
 /*
diff-tree 1987af8c498a1bf394a8951ca6d5b0b7f7a35188 (from 737e6e4836a6af26fedc22cda8e7d366b52c8fa7)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Thu Jul 20 16:39:54 2006 -0400

    add virtual core devices to DIX
    
    Add virtual core devices, with proper keymaps etc, to the DIX.

diff --git a/dix/devices.c b/dix/devices.c
index 37720f3..a3ce178 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -80,6 +80,13 @@ SOFTWARE.
 #include "swaprep.h"
 #include "dixevents.h"
 
+#ifdef XINPUT
+#include <X11/extensions/XIproto.h>
+#include "exglobals.h"
+#endif
+
+int CoreDevicePrivatesIndex = 0, CoreDevicePrivatesGeneration = -1;
+
 DeviceIntPtr
 AddInputDevice(DeviceProc deviceProc, Bool autoStart)
 {
@@ -87,7 +94,7 @@ AddInputDevice(DeviceProc deviceProc, Bo
 
     if (inputInfo.numDevices >= MAX_DEVICES)
 	return (DeviceIntPtr)NULL;
-    dev = (DeviceIntPtr) xalloc(sizeof(DeviceIntRec));
+    dev = (DeviceIntPtr) xcalloc(sizeof(DeviceIntRec), 1);
     if (!dev)
 	return (DeviceIntPtr)NULL;
     dev->name = (char *)NULL;
@@ -113,19 +120,21 @@ AddInputDevice(DeviceProc deviceProc, Bo
     dev->button = (ButtonClassPtr)NULL;
     dev->focus = (FocusClassPtr)NULL;
     dev->proximity = (ProximityClassPtr)NULL;
+    dev->touchscreen = (TouchscreenClassPtr)NULL;
     dev->kbdfeed = (KbdFeedbackPtr)NULL;
     dev->ptrfeed = (PtrFeedbackPtr)NULL;
     dev->intfeed = (IntegerFeedbackPtr)NULL;
     dev->stringfeed = (StringFeedbackPtr)NULL;
     dev->bell = (BellFeedbackPtr)NULL;
     dev->leds = (LedFeedbackPtr)NULL;
-    dev->next = inputInfo.off_devices;
 #ifdef XKB
-    dev->xkb_interest= NULL;
+    dev->xkb_interest = NULL;
 #endif
     dev->nPrivates = 0;
     dev->devPrivates = NULL;
     dev->unwrapProc = NULL;
+    dev->coreEvents = TRUE;
+    dev->next = inputInfo.off_devices;
     inputInfo.off_devices = dev;
     return dev;
 }
@@ -134,14 +143,20 @@ Bool
 EnableDevice(register DeviceIntPtr dev)
 {
     register DeviceIntPtr *prev;
+    int ret;
 
     for (prev = &inputInfo.off_devices;
 	 *prev && (*prev != dev);
 	 prev = &(*prev)->next)
 	;
     if ((*prev != dev) || !dev->inited ||
-	((*dev->deviceProc)(dev, DEVICE_ON) != Success))
+	((ret = (*dev->deviceProc)(dev, DEVICE_ON)) != Success)) {
+        ErrorF("couldn't enable device %d\n", dev->id);
+#ifdef DEBUG
+        ErrorF("prev is %p, dev is %p, dev->inited is %d, ret is %d\n", prev, dev, dev->inited, ret);
+#endif
 	return FALSE;
+    }
     *prev = dev->next;
     dev->next = inputInfo.devices;
     inputInfo.devices = dev;
@@ -167,22 +182,220 @@ DisableDevice(register DeviceIntPtr dev)
 }
 
 int
+ActivateDevice(DeviceIntPtr dev)
+{
+    int ret = Success;
+#ifdef XINPUT
+    devicePresenceNotify ev;
+    DeviceIntRec dummyDev;
+#endif
+
+    if (!dev || !dev->deviceProc)
+        return BadImplementation;
+
+    ret = (*dev->deviceProc) (dev, DEVICE_INIT);
+    dev->inited = (ret == Success);
+    
+#ifdef XINPUT
+    ev.type = DevicePresenceNotify;
+    ev.time = currentTime.milliseconds;
+    dummyDev.id = 0;
+    SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
+                          &ev, 1);
+#endif
+
+    return ret;
+}
+
+static void
+CoreKeyboardBell(int volume, DeviceIntPtr pDev, pointer ctrl, int something)
+{
+    return;
+}
+
+static void
+CoreKeyboardCtl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
+{
+    return;
+}
+
+static int
+CoreKeyboardProc(DeviceIntPtr pDev, int what)
+{
+    CARD8 *modMap;
+    KeySymsRec keySyms;
+#ifdef XKB
+    XkbComponentNamesRec names;
+#endif
+
+    switch (what) {
+    case DEVICE_INIT:
+        keySyms.minKeyCode = 8;
+        keySyms.maxKeyCode = 255;
+        keySyms.mapWidth = 4;
+        keySyms.map = (KeySym *)xcalloc(sizeof(KeySym),
+                                        (keySyms.maxKeyCode -
+                                         keySyms.minKeyCode) *
+                                        keySyms.mapWidth);
+        if (!keySyms.map) {
+            ErrorF("Couldn't allocate core keymap\n");
+            return BadAlloc;
+        }
+
+        modMap = (CARD8 *)xalloc(MAP_LENGTH);
+        if (!modMap) {
+            ErrorF("Couldn't allocate core modifier map\n");
+            return BadAlloc;
+        }
+        bzero((char *)modMap, MAP_LENGTH);
+
+#ifdef XKB
+        if (!noXkbExtension) {
+            bzero(&names, sizeof(names));
+            XkbSetRulesDflts("base", "pc105", "us", NULL, NULL);
+            XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modMap,
+                                        CoreKeyboardBell, CoreKeyboardCtl);
+        }
+        else
+#endif
+        InitKeyboardDeviceStruct((DevicePtr)pDev, &keySyms, modMap,
+                                 CoreKeyboardBell, CoreKeyboardCtl);
+        break;
+
+    case DEVICE_CLOSE:
+        /* This, uh, probably requires some explanation.
+         * Press a key on another keyboard.
+         * Watch its xkbInfo get pivoted into core's.
+         * Kill the server.
+         * Watch the first device's xkbInfo get freed.
+         * Try to free ours, which points to same.
+         *
+         * ... yeah.
+         */
+        pDev->key->xkbInfo = NULL;
+        break;
+
+    default:
+        break;
+    }
+    return Success;
+}
+
+static int
+CorePointerProc(DeviceIntPtr pDev, int what)
+{
+    BYTE map[33];
+    int i = 0;
+
+    switch (what) {
+    case DEVICE_INIT:
+        for (i = 1; i <= 32; i++)
+            map[i] = i;
+        /* we don't keep history, for now. */
+        InitPointerDeviceStruct((DevicePtr)pDev, map, 32,
+                                NULL, (PtrCtrlProcPtr)NoopDDA,
+                                0, 2);
+        pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
+        pDev->valuator->lastx = pDev->valuator->axisVal[0];
+        pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
+        pDev->valuator->lasty = pDev->valuator->axisVal[1];
+        break;
+
+    default:
+        break;
+    }
+
+    return Success;
+}
+
+void
+InitCoreDevices()
+{
+    register DeviceIntPtr dev;
+
+    if (CoreDevicePrivatesGeneration != serverGeneration) {
+        CoreDevicePrivatesIndex = AllocateDevicePrivateIndex();
+        CoreDevicePrivatesGeneration = serverGeneration;
+    }
+
+    if (!inputInfo.keyboard) {
+        dev = AddInputDevice(CoreKeyboardProc, TRUE);
+        if (!dev)
+            FatalError("Failed to allocate core keyboard");
+        dev->name = strdup("Virtual core keyboard");
+#ifdef XKB
+        dev->public.processInputProc = CoreProcessKeyboardEvent;
+        dev->public.realInputProc = CoreProcessKeyboardEvent;
+        if (!noXkbExtension)
+           XkbSetExtension(dev, ProcessKeyboardEvent);
+#else
+        dev->public.processInputProc = ProcessKeyboardEvent;
+        dev->public.realInputProc = ProcessKeyboardEvent;
+#endif
+        dev->ActivateGrab = ActivateKeyboardGrab;
+        dev->DeactivateGrab = DeactivateKeyboardGrab;
+        dev->coreEvents = FALSE;
+        if (!AllocateDevicePrivate(dev, CoreDevicePrivatesIndex))
+            FatalError("Couldn't allocate keyboard devPrivates\n");
+        dev->devPrivates[CoreDevicePrivatesIndex].ptr = NULL;
+        (void)ActivateDevice(dev);
+        inputInfo.keyboard = dev;
+    }
+
+    if (!inputInfo.pointer) {
+        dev = AddInputDevice(CorePointerProc, TRUE);
+        if (!dev)
+            FatalError("Failed to allocate core pointer");
+        dev->name = strdup("Virtual core pointer");
+#ifdef XKB
+        dev->public.processInputProc = CoreProcessPointerEvent;
+        dev->public.realInputProc = CoreProcessPointerEvent;
+        if (!noXkbExtension)
+           XkbSetExtension(dev, ProcessPointerEvent);
+#else
+        dev->public.processInputProc = ProcessPointerEvent;
+        dev->public.realInputProc = ProcessPointerEvent;
+#endif
+        dev->ActivateGrab = ActivatePointerGrab;
+        dev->DeactivateGrab = DeactivatePointerGrab;
+        dev->coreEvents = FALSE;
+        if (!AllocateDevicePrivate(dev, CoreDevicePrivatesIndex))
+            FatalError("Couldn't allocate pointer devPrivates\n");
+        dev->devPrivates[CoreDevicePrivatesIndex].ptr = NULL;
+        (void)ActivateDevice(dev);
+        inputInfo.pointer = dev;
+    }
+}
+
+int
 InitAndStartDevices()
 {
     register DeviceIntPtr dev, next;
 
-    for (dev = inputInfo.off_devices; dev; dev = dev->next)
-	dev->inited = ((*dev->deviceProc)(dev, DEVICE_INIT) == Success);
+    for (dev = inputInfo.off_devices; dev; dev = dev->next) {
+#ifdef DEBUG
+        ErrorF("(dix) initialising device %d\n", dev->id);
+#endif
+	ActivateDevice(dev);
+#ifdef DEBUG
+        ErrorF("(dix) finished device %d, inited is %d\n", dev->id, dev->inited);
+#endif
+    }
     for (dev = inputInfo.off_devices; dev; dev = next)
     {
+#ifdef DEBUG
+        ErrorF("(dix) enabling device %d\n", dev->id);
+#endif
 	next = dev->next;
 	if (dev->inited && dev->startup)
 	    (void)EnableDevice(dev);
+#ifdef DEBUG
+        ErrorF("(dix) finished device %d\n", dev->id);
+#endif
     }
     for (dev = inputInfo.devices;
 	 dev && (dev != inputInfo.keyboard);
 	 dev = dev->next)
-	;
     if (!dev || (dev != inputInfo.keyboard)) {
 	ErrorF("No core keyboard\n");
 	return BadImplementation;
@@ -210,9 +423,10 @@ CloseDevice(register DeviceIntPtr dev)
 
     if (dev->inited)
 	(void)(*dev->deviceProc)(dev, DEVICE_CLOSE);
+
     xfree(dev->name);
-    if (dev->key)
-    {
+
+    if (dev->key) {
 #ifdef XKB
 	if (dev->key->xkbInfo)
 	    XkbFreeInfo(dev->key->xkbInfo);
@@ -221,20 +435,27 @@ CloseDevice(register DeviceIntPtr dev)
 	xfree(dev->key->modifierKeyMap);
 	xfree(dev->key);
     }
-    xfree(dev->valuator);
+
+    if (dev->valuator)
+        xfree(dev->valuator);
+
+    if (dev->button) {
 #ifdef XKB
-    if ((dev->button)&&(dev->button->xkb_acts))
-	xfree(dev->button->xkb_acts);
+        if (dev->button->xkb_acts)
+            xfree(dev->button->xkb_acts);
 #endif
-    xfree(dev->button);
-    if (dev->focus)
-    {
+        xfree(dev->button);
+    }
+
+    if (dev->focus) {
 	xfree(dev->focus->trace);
 	xfree(dev->focus);
     }
-    xfree(dev->proximity);
-    for (k=dev->kbdfeed; k; k=knext)
-    {
+
+    if (dev->proximity)
+        xfree(dev->proximity);
+
+    for (k = dev->kbdfeed; k; k = knext) {
 	knext = k->next;
 #ifdef XKB
 	if (k->xkb_sli)
@@ -242,30 +463,30 @@ CloseDevice(register DeviceIntPtr dev)
 #endif
 	xfree(k);
     }
-    for (p=dev->ptrfeed; p; p=pnext)
-    {
+
+    for (p = dev->ptrfeed; p; p = pnext) {
 	pnext = p->next;
 	xfree(p);
     }
-    for (i=dev->intfeed; i; i=inext)
-    {
+    
+    for (i = dev->intfeed; i; i = inext) {
 	inext = i->next;
 	xfree(i);
     }
-    for (s=dev->stringfeed; s; s=snext)
-    {
+
+    for (s = dev->stringfeed; s; s = snext) {
 	snext = s->next;
 	xfree(s->ctrl.symbols_supported);
 	xfree(s->ctrl.symbols_displayed);
 	xfree(s);
     }
-    for (b=dev->bell; b; b=bnext)
-    {
+
+    for (b = dev->bell; b; b = bnext) {
 	bnext = b->next;
 	xfree(b);
     }
-    for (l=dev->leds; l; l=lnext)
-    {
+
+    for (l = dev->leds; l; l = lnext) {
 	lnext = l->next;
 #ifdef XKB
 	if (l->xkb_sli)
@@ -273,11 +494,12 @@ CloseDevice(register DeviceIntPtr dev)
 #endif
 	xfree(l);
     }
+
 #ifdef XKB
-    while (dev->xkb_interest) {
+    while (dev->xkb_interest)
 	XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
-    }
 #endif
+
     xfree(dev->sync.event);
     xfree(dev);
 }
@@ -303,48 +525,78 @@ CloseDownDevices()
     inputInfo.pointer = NULL;
 }
 
-void
-RemoveDevice(register DeviceIntPtr dev)
+int
+RemoveDevice(DeviceIntPtr dev)
 {
-    register DeviceIntPtr prev,tmp,next;
+    DeviceIntPtr prev,tmp,next;
+    int ret = BadMatch;
+#ifdef XINPUT
+    devicePresenceNotify ev;
+    DeviceIntRec dummyDev;
+#endif
 
-    prev= NULL;
-    for (tmp= inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
+#ifdef DEBUG
+    ErrorF("want to remove device %p, kb is %p, pointer is %p\n", dev, inputInfo.keyboard, inputInfo.pointer);
+#endif
+
+    if (!dev)
+        return BadImplementation;
+
+    prev = NULL;
+    for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
 	next = tmp->next;
-	if (tmp==dev) {
+	if (tmp == dev) {
 	    CloseDevice(tmp);
+
 	    if (prev==NULL)
 		inputInfo.devices = next;
 	    else
 		prev->next = next;
+
 	    inputInfo.numDevices--;
+
 	    if (inputInfo.keyboard == tmp)
 	        inputInfo.keyboard = NULL;
 	    else if (inputInfo.pointer == tmp)
 	        inputInfo.pointer = NULL;
-	    return;
+
+	    ret = Success;
 	}
     }
 
-    prev= NULL;
-    for (tmp= inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) {
+    prev = NULL;
+    for (tmp = inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) {
 	next = tmp->next;
-	if (tmp==dev) {
+	if (tmp == dev) {
 	    CloseDevice(tmp);
-	    if (prev==NULL)
+
+	    if (prev == NULL)
 		inputInfo.off_devices = next;
 	    else
 		prev->next = next;
+
 	    inputInfo.numDevices--;
+
 	    if (inputInfo.keyboard == tmp)
 	        inputInfo.keyboard = NULL;
 	    else if (inputInfo.pointer == tmp)
 	        inputInfo.pointer = NULL;
-	    return;
+
+            ret = Success;
 	}
     }
-    ErrorF("Internal Error! Attempt to remove a non-existent device\n");
-    return;
+    
+#ifdef XINPUT
+    if (ret == Success) {
+        ev.type = DevicePresenceNotify;
+        ev.time = currentTime.milliseconds;
+        dummyDev.id = 0;
+        SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
+                              &ev, 1);
+    }
+#endif
+
+    return ret;
 }
 
 int
@@ -356,47 +608,13 @@ NumMotionEvents()
 void
 RegisterPointerDevice(DeviceIntPtr device)
 {
-    inputInfo.pointer = device;
-#ifdef XKB
-    device->public.processInputProc = CoreProcessPointerEvent;
-    device->public.realInputProc = CoreProcessPointerEvent;
-    if (!noXkbExtension)
-       XkbSetExtension(device,ProcessPointerEvent);
-#else
-    device->public.processInputProc = ProcessPointerEvent;
-    device->public.realInputProc = ProcessPointerEvent;
-#endif
-    device->ActivateGrab = ActivatePointerGrab;
-    device->DeactivateGrab = DeactivatePointerGrab;
-    if (!device->name)
-    {
-	char *p = "pointer";
-	device->name = (char *)xalloc(strlen(p) + 1);
-	strcpy(device->name, p);
-    }
+    RegisterOtherDevice(device);
 }
 
 void
 RegisterKeyboardDevice(DeviceIntPtr device)
 {
-    inputInfo.keyboard = device;
-#ifdef XKB
-    device->public.processInputProc = CoreProcessKeyboardEvent;
-    device->public.realInputProc = CoreProcessKeyboardEvent;
-    if (!noXkbExtension)
-       XkbSetExtension(device,ProcessKeyboardEvent);
-#else
-    device->public.processInputProc = ProcessKeyboardEvent;
-    device->public.realInputProc = ProcessKeyboardEvent;
-#endif
-    device->ActivateGrab = ActivateKeyboardGrab;
-    device->DeactivateGrab = DeactivateKeyboardGrab;
-    if (!device->name)
-    {
-	char *k = "keyboard";
-	device->name = (char *)xalloc(strlen(k) + 1);
-	strcpy(device->name, k);
-    }
+    RegisterOtherDevice(device);
 }
 
 _X_EXPORT DevicePtr
@@ -441,8 +659,8 @@ SetKeySymsMap(register KeySymsPtr dst, r
 {
     int i, j;
     int rowDif = src->minKeyCode - dst->minKeyCode;
-           /* if keysym map size changes, grow map first */
 
+    /* if keysym map size changes, grow map first */
     if (src->mapWidth < dst->mapWidth)
     {
         for (i = src->minKeyCode; i <= src->maxKeyCode; i++)
@@ -532,7 +750,7 @@ InitKeyClassDeviceStruct(DeviceIntPtr de
 {
     int i;
     register KeyClassPtr keyc;
-
+    
     keyc = (KeyClassPtr)xalloc(sizeof(KeyClassRec));
     if (!keyc)
 	return FALSE;
@@ -808,12 +1026,13 @@ InitIntegerFeedbackClassDeviceStruct (De
 _X_EXPORT Bool
 InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons, 
                         ValuatorMotionProcPtr motionProc, 
-                        PtrCtrlProcPtr controlProc, int numMotionEvents)
+                        PtrCtrlProcPtr controlProc, int numMotionEvents,
+                        int numAxes)
 {
     DeviceIntPtr dev = (DeviceIntPtr)device;
 
     return(InitButtonClassDeviceStruct(dev, numButtons, map) &&
-	   InitValuatorClassDeviceStruct(dev, 2, motionProc,
+	   InitValuatorClassDeviceStruct(dev, numAxes, motionProc,
 					 numMotionEvents, 0) &&
 	   InitPtrFeedbackClassDeviceStruct(dev, controlProc));
 }
diff --git a/dix/events.c b/dix/events.c
index 1b0aee5..fac492c 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -134,6 +134,7 @@ of the copyright holder.
 #include "globals.h"
 
 #ifdef XKB
+#include <X11/extensions/XKBproto.h>
 #include <X11/extensions/XKBsrv.h>
 extern Bool XkbFilterEvents(ClientPtr, int, xEvent *);
 #endif
@@ -159,14 +160,13 @@ xEvent *xeviexE;
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
 #include "exevents.h"
+#include "exglobals.h"
 #include "extnsionst.h"
 
 #include "dixevents.h"
 #include "dixgrabs.h"
 #include "dispatch.h"
 
-int CoreDevicePrivatesIndex = 0, CoreDevicePrivatesGeneration = -1;
-
 #define EXTENSION_EVENT_BASE  64
 
 #define NoSuchEvent 0x80000000	/* so doesn't match NoEventMask */
diff --git a/dix/main.c b/dix/main.c
index e186e89..5ac8f18 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -398,6 +398,7 @@ main(int argc, char *argv[], char *envp[
 	    if (!CreateRootWindow(pScreen))
 		FatalError("failed to create root window");
 	}
+        InitCoreDevices();
 	InitInput(argc, argv);
 	if (InitAndStartDevices() != Success)
 	    FatalError("failed to initialize core devices");
diff --git a/include/input.h b/include/input.h
index d550bbe..36d8038 100644
--- a/include/input.h
+++ b/include/input.h
@@ -176,6 +176,9 @@ extern DeviceIntPtr AddInputDevice(
 extern Bool EnableDevice(
     DeviceIntPtr /*device*/);
 
+extern Bool ActivateDevice(
+    DeviceIntPtr /*device*/);
+
 extern Bool DisableDevice(
     DeviceIntPtr /*device*/);
 
@@ -183,7 +186,7 @@ extern int InitAndStartDevices(void);
 
 extern void CloseDownDevices(void);
 
-extern void RemoveDevice(
+extern int RemoveDevice(
     DeviceIntPtr /*dev*/);
 
 extern int NumMotionEvents(void);
@@ -233,6 +236,9 @@ extern Bool InitValuatorClassDeviceStruc
     int /*numMotionEvents*/,
     int /*mode*/);
 
+extern Bool InitTouchscreenClassDeviceStruct(
+    DeviceIntPtr /*device*/);
+
 extern Bool InitFocusClassDeviceStruct(
     DeviceIntPtr /*device*/);
 
@@ -302,7 +308,8 @@ extern Bool InitPointerDeviceStruct(
     int /*numButtons*/,
     ValuatorMotionProcPtr /*motionProc*/,
     PtrCtrlProcPtr /*controlProc*/,
-    int /*numMotionEvents*/);
+    int /*numMotionEvents*/,
+    int /*numAxes*/);
 
 extern Bool InitKeyboardDeviceStruct(
     DevicePtr /*device*/,
diff --git a/include/inputstr.h b/include/inputstr.h
index 8b877bc..9e293f0 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -68,6 +68,8 @@ SOFTWARE.
 #define POINTER_ABSOLUTE (1 << 2)
 #define POINTER_ACCELERATE (1 << 3)
 
+extern int CoreDevicePrivatesIndex, CoreDevicePrivatesGeneration;
+
 /* Kludge: OtherClients and InputClients must be compatible, see code */
 
 typedef struct _OtherClients {
diff --git a/mi/mi.h b/mi/mi.h
index 2de5233..d350f1c 100644
--- a/mi/mi.h
+++ b/mi/mi.h
@@ -171,8 +171,7 @@ typedef struct _DeviceRec *DevicePtr;
 #endif
 
 extern Bool mieqInit(
-    DevicePtr /*pKbd*/,
-    DevicePtr /*pPtr*/
+    void
 );
 
 extern void mieqEnqueue(
diff --git a/mi/mieq.c b/mi/mieq.c
index 3766262..b05210c 100644
--- a/mi/mieq.c
+++ b/mi/mieq.c
@@ -43,35 +43,38 @@ in this Software without prior written a
 # include   "pixmapstr.h"
 # include   "inputstr.h"
 # include   "mi.h"
+# include   "mipointer.h"
 # include   "scrnintstr.h"
+# include   <X11/extensions/XI.h>
+# include   <X11/extensions/XIproto.h>
+# include   "extinit.h"
+# include   "exglobals.h"
 
 #define QUEUE_SIZE  256
 
 typedef struct _Event {
-    xEvent	event;
-    ScreenPtr	pScreen;
+    xEvent          event[2];
+    int             nevents;
+    ScreenPtr	    pScreen;
+    DeviceIntPtr    pDev;
 } EventRec, *EventPtr;
 
 typedef struct _EventQueue {
-    HWEventQueueType	head, tail;	    /* long for SetInputCheck */
-    CARD32	lastEventTime;	    /* to avoid time running backwards */
-    Bool	lastMotion;
-    EventRec	events[QUEUE_SIZE]; /* static allocation for signals */
-    DevicePtr	pKbd, pPtr;	    /* device pointer, to get funcs */
-    ScreenPtr	pEnqueueScreen;	    /* screen events are being delivered to */
-    ScreenPtr	pDequeueScreen;	    /* screen events are being dispatched to */
+    HWEventQueueType head, tail;         /* long for SetInputCheck */
+    CARD32           lastEventTime;      /* to avoid time running backwards */
+    int              lastMotion;         /* device ID if last event motion? */
+    EventRec         events[QUEUE_SIZE]; /* static allocation for signals */
+    ScreenPtr        pEnqueueScreen;     /* screen events are being delivered to */
+    ScreenPtr        pDequeueScreen;     /* screen events are being dispatched to */
 } EventQueueRec, *EventQueuePtr;
 
 static EventQueueRec miEventQueue;
 
 Bool
-mieqInit (pKbd, pPtr)
-    DevicePtr	pKbd, pPtr;
+mieqInit ()
 {
     miEventQueue.head = miEventQueue.tail = 0;
     miEventQueue.lastEventTime = GetTimeInMillis ();
-    miEventQueue.pKbd = pKbd;
-    miEventQueue.pPtr = pPtr;
     miEventQueue.lastMotion = FALSE;
     miEventQueue.pEnqueueScreen = screenInfo.screens[0];
     miEventQueue.pDequeueScreen = miEventQueue.pEnqueueScreen;
@@ -87,32 +90,83 @@ mieqInit (pKbd, pPtr)
  */
 
 void
-mieqEnqueue (e)
-    xEvent	*e;
+mieqEnqueue (xEvent *e)
 {
-    HWEventQueueType	oldtail, newtail;
-    Bool    isMotion;
+    HWEventQueueType       oldtail = miEventQueue.tail, newtail;
+    int                    isMotion = 0;
+    DeviceIntPtr           pDev = NULL;
+    deviceKeyButtonPointer *kbp = (deviceKeyButtonPointer *) e;
+    deviceValuator         *v = (deviceValuator *) e;
+    EventPtr               laste = &miEventQueue.events[oldtail - 1];
+    deviceKeyButtonPointer *lastkbp = (deviceKeyButtonPointer *)
+                                      &laste->event[0];
+
+    ErrorF("mieqEnqueue: slamming an event on to the queue from %d\n", kbp->deviceid & DEVICE_BITS);
+    if (e->u.u.type == MotionNotify) {
+        miPointerAbsoluteCursor(e->u.keyButtonPointer.rootX,
+                                e->u.keyButtonPointer.rootY,
+                                e->u.keyButtonPointer.time);
+        pDev = inputInfo.pointer;
+        isMotion = inputInfo.pointer->id & DEVICE_BITS;
+    }
+    else if (e->u.u.type == KeyPress || e->u.u.type == KeyRelease) {
+        pDev = inputInfo.keyboard;
+    }
+    else if (e->u.u.type == ButtonPress || e->u.u.type == ButtonRelease) {
+        pDev = inputInfo.pointer;
+    }
+    else {
+        pDev = LookupDeviceIntRec(kbp->deviceid & DEVICE_BITS);
 
-    oldtail = miEventQueue.tail;
-    isMotion = e->u.u.type == MotionNotify;
-    if (isMotion && miEventQueue.lastMotion && oldtail != miEventQueue.head)
-    {
+        /* We silently steal valuator events: just tack them on to the last
+         * motion event they need to be attached to.  Sigh. */
+        if (e->u.u.type == DeviceValuator) {
+            if (laste->nevents >= 6) {
+                ErrorF("mieqEnqueue: more than six valuator events; dropping.\n");
+                return;
+            }
+            if (oldtail == miEventQueue.head || 
+                !(lastkbp->type == DeviceMotionNotify ||
+                  lastkbp->type == DeviceButtonPress ||
+                  lastkbp->type == DeviceButtonRelease) ||
+                ((lastkbp->deviceid & DEVICE_BITS) !=
+                 (v->deviceid & DEVICE_BITS))) {
+                ErrorF("mieqEnequeue: out-of-order valuator event; dropping.\n");
+                return;
+            }
+            laste->event[laste->nevents++] = *e;
+            ErrorF("put a valuator event into the queue\n");
+            return;
+        }
+        else if (e->u.u.type == DeviceMotionNotify) {
+            isMotion = pDev->id & DEVICE_BITS;
+        }
+    }
+
+    if (!pDev)
+        FatalError("Couldn't find device for event!\n");
+
+    if (isMotion && isMotion == miEventQueue.lastMotion &&
+        oldtail != miEventQueue.head) {
 	if (oldtail == 0)
 	    oldtail = QUEUE_SIZE;
 	oldtail = oldtail - 1;
     }
-    else
-    {
+    else {
     	newtail = oldtail + 1;
     	if (newtail == QUEUE_SIZE)
 	    newtail = 0;
     	/* Toss events which come in late */
-    	if (newtail == miEventQueue.head)
+    	if (newtail == miEventQueue.head) {
+            ErrorF("tossed event which came in late\n");
 	    return;
+        }
 	miEventQueue.tail = newtail;
     }
-    miEventQueue.lastMotion = isMotion;
-    miEventQueue.events[oldtail].event = *e;
+
+    miEventQueue.events[oldtail].event[0] = *e;
+    miEventQueue.events[oldtail].nevents = 1;
+
     /*
      * Make sure that event times don't go backwards - this
      * is "unnecessary", but very useful
@@ -120,18 +174,23 @@ mieqEnqueue (e)
     if (e->u.keyButtonPointer.time < miEventQueue.lastEventTime &&
 	miEventQueue.lastEventTime - e->u.keyButtonPointer.time < 10000)
     {
-	miEventQueue.events[oldtail].event.u.keyButtonPointer.time =
+        ErrorF("mieq: rewinding event time from %d to %d\n",
+               miEventQueue.lastEventTime,
+               miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time);
+	miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time =
 	    miEventQueue.lastEventTime;
     }
     miEventQueue.lastEventTime =
-	miEventQueue.events[oldtail].event.u.keyButtonPointer.time;
+	miEventQueue.events[oldtail].event[0].u.keyButtonPointer.time;
     miEventQueue.events[oldtail].pScreen = miEventQueue.pEnqueueScreen;
+    miEventQueue.events[oldtail].pDev = pDev;
+
+    miEventQueue.lastMotion = isMotion;
+    ErrorF("bottom of mieqEnqueue\n");
 }
 
 void
-mieqSwitchScreen (pScreen, fromDIX)
-    ScreenPtr	pScreen;
-    Bool	fromDIX;
+mieqSwitchScreen (ScreenPtr pScreen, Bool fromDIX)
 {
     miEventQueue.pEnqueueScreen = pScreen;
     if (fromDIX)
@@ -146,7 +205,8 @@ void mieqProcessInputEvents ()
 {
     EventRec	*e;
     int		x, y;
-    xEvent	xe;
+
+    ErrorF("mieqPIE: head %p, tail %p\n", miEventQueue.head, miEventQueue.tail);
 
     while (miEventQueue.head != miEventQueue.tail)
     {
@@ -160,8 +220,8 @@ void mieqProcessInputEvents ()
 	if (e->pScreen != miEventQueue.pDequeueScreen)
 	{
 	    miEventQueue.pDequeueScreen = e->pScreen;
-	    x = e->event.u.keyButtonPointer.rootX;
-	    y = e->event.u.keyButtonPointer.rootY;
+	    x = e->event[0].u.keyButtonPointer.rootX;
+	    y = e->event[0].u.keyButtonPointer.rootY;
 	    if (miEventQueue.head == QUEUE_SIZE - 1)
 	    	miEventQueue.head = 0;
 	    else
@@ -170,23 +230,12 @@ void mieqProcessInputEvents ()
 	}
 	else
 	{
-	    xe = e->event;
 	    if (miEventQueue.head == QUEUE_SIZE - 1)
 	    	miEventQueue.head = 0;
 	    else
 	    	++miEventQueue.head;
-	    switch (xe.u.u.type) 
-	    {
-	    case KeyPress:
-	    case KeyRelease:
-	    	(*miEventQueue.pKbd->processInputProc)
-				(&xe, (DeviceIntPtr)miEventQueue.pKbd, 1);
-	    	break;
-	    default:
-	    	(*miEventQueue.pPtr->processInputProc)
-				(&xe, (DeviceIntPtr)miEventQueue.pPtr, 1);
-	    	break;
-	    }
+            ErrorF("calling pIP from mieqPIE\n");
+            (*e->pDev->public.processInputProc)(e->event, e->pDev, e->nevents);
 	}
     }
 }
diff --git a/mi/mipointer.c b/mi/mipointer.c
index 4602d47..f52116f 100644
--- a/mi/mipointer.c
+++ b/mi/mipointer.c
@@ -490,12 +490,6 @@ miPointerMove (pScreen, x, y, time)
     miPointer.y = y;
     miPointer.pScreen = pScreen;
 
-    xE.u.u.type = MotionNotify;
-    xE.u.keyButtonPointer.rootX = x;
-    xE.u.keyButtonPointer.rootY = y;
-    xE.u.keyButtonPointer.time = time;
-    (*pScreenPriv->screenFuncs->EnqueueEvent) (&xE);
-
     end = miPointer.history_end;
     start = miPointer.history_start;
     prev = end - 1;
@@ -521,11 +515,3 @@ miPointerMove (pScreen, x, y, time)
     history->event.time = time;
     history->pScreen = pScreen;
 }
-
-void
-miRegisterPointerDevice (pScreen, pDevice)
-    ScreenPtr	pScreen;
-    DeviceIntPtr pDevice;
-{
-    miPointer.pPointer = (DevicePtr)pDevice;
-}
diff --git a/mi/mipointrst.h b/mi/mipointrst.h
index 682f8ac..feeb5ec 100644
--- a/mi/mipointrst.h
+++ b/mi/mipointrst.h
@@ -50,7 +50,6 @@ typedef struct {
     Bool		    confined;	/* pointer can't change screens */
     int			    x, y;	/* hot spot location */
     int			    devx, devy;	/* sprite position */
-    DevicePtr		    pPointer;   /* pointer device structure */
     miHistoryRec	    history[MOTION_SIZE];
     int			    history_start, history_end;
 } miPointerRec, *miPointerPtr;
diff-tree 737e6e4836a6af26fedc22cda8e7d366b52c8fa7 (from 7f36cc533e7f6ae44e973c5f00f9bfec7c6b7b50)
Author: Kristian Høgsberg <krh at redhat.com>
Date:   Wed Jul 19 20:10:48 2006 -0400

    define SDevicePresenceNotifyEvent prototype

diff --git a/include/extinit.h b/include/extinit.h
index 37fa9a2..c471008 100644
--- a/include/extinit.h
+++ b/include/extinit.h
@@ -105,6 +105,12 @@ SDeviceMappingNotifyEvent (
 	);
 
 void
+SDevicePresenceNotifyEvent (
+       devicePresenceNotify * /* from */,
+       devicePresenceNotify * /* to */
+       );
+
+void
 FixExtensionEvents (
 	ExtensionEntry 	*      /* extEntry */
 	);
diff-tree 7f36cc533e7f6ae44e973c5f00f9bfec7c6b7b50 (from e896195eab726a2b307200958308eda8c93dd3cd)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Jul 19 20:09:13 2006 -0400

    distribute config.h

diff --git a/include/Makefile.am b/include/Makefile.am
index 9e340d7..9f07fa6 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -7,6 +7,7 @@ sdk_HEADERS =		\
 	closure.h	\
 	colormap.h	\
 	colormapst.h	\
+	config.h	\
 	cursor.h	\
 	cursorstr.h	\
 	dix.h		\
diff-tree e896195eab726a2b307200958308eda8c93dd3cd (from 99c57674c002c5e88c6db34488a27b05004c9197)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Wed Jul 19 20:05:33 2006 -0400

    remove extraneous font debugging code
    
    Some of it didn't compile, and some of it was just unnecessary.

diff --git a/dix/dixfonts.c b/dix/dixfonts.c
index ef23fa8..1f5b3b4 100644
--- a/dix/dixfonts.c
+++ b/dix/dixfonts.c
@@ -158,11 +158,6 @@ QueueFontWakeup(FontPathElementPtr fpe)
 
     for (i = 0; i < num_slept_fpes; i++) {
 	if (slept_fpes[i] == fpe) {
-
-#ifdef DEBUG
-	    fprintf(stderr, "re-queueing fpe wakeup\n");
-#endif
-
 	    return;
 	}
     }
@@ -2063,11 +2058,6 @@ init_fs_handlers(FontPathElementPtr fpe,
 	fs_handlers_installed = 0;
     }
     if (fs_handlers_installed == 0) {
-
-#ifdef DEBUG
-	fprintf(stderr, "adding FS b & w handlers\n");
-#endif
-
 	if (!RegisterBlockAndWakeupHandlers(block_handler,
 					    FontWakeup, (pointer) 0))
 	    return AllocError;
@@ -2083,55 +2073,9 @@ remove_fs_handlers(FontPathElementPtr fp
     if (all) {
 	/* remove the handlers if no one else is using them */
 	if (--fs_handlers_installed == 0) {
-
-#ifdef DEBUG
-	    fprintf(stderr, "removing FS b & w handlers\n");
-#endif
-
 	    RemoveBlockAndWakeupHandlers(block_handler, FontWakeup,
 					 (pointer) 0);
 	}
     }
     RemoveFontWakeup(fpe);
 }
-
-#ifdef DEBUG
-#define GLWIDTHBYTESPADDED(bits,nbytes) \
-	((nbytes) == 1 ? (((bits)+7)>>3)        /* pad to 1 byte */ \
-	:(nbytes) == 2 ? ((((bits)+15)>>3)&~1)  /* pad to 2 bytes */ \
-	:(nbytes) == 4 ? ((((bits)+31)>>3)&~3)  /* pad to 4 bytes */ \
-	:(nbytes) == 8 ? ((((bits)+63)>>3)&~7)  /* pad to 8 bytes */ \
-	: 0)
-
-#define GLYPH_SIZE(ch, nbytes)          \
-	GLWIDTHBYTESPADDED((ch)->metrics.rightSideBearing - \
-			(ch)->metrics.leftSideBearing, (nbytes))
-void
-dump_char_ascii(CharInfoPtr cip)
-{
-    int         r,
-                l;
-    int         bpr;
-    int         byte;
-    static unsigned maskTab[] = {
-	(1 << 7), (1 << 6), (1 << 5), (1 << 4),
-	(1 << 3), (1 << 2), (1 << 1), (1 << 0),
-    };
-
-    bpr = GLYPH_SIZE(cip, 4);
-    for (r = 0; r < (cip->metrics.ascent + cip->metrics.descent); r++) {
-	pointer     row = (pointer) cip->bits + r * bpr;
-
-	byte = 0;
-	for (l = 0; l <= (cip->metrics.rightSideBearing -
-			  cip->metrics.leftSideBearing); l++) {
-	    if (maskTab[l & 7] & row[l >> 3])
-		putchar('X');
-	    else
-		putchar('.');
-	}
-	putchar('\n');
-    }
-}
-
-#endif
diff-tree 99c57674c002c5e88c6db34488a27b05004c9197 (from ecfad74c48f633916305bcc25baaaad74aa52b78)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Wed Jul 19 19:59:11 2006 -0400

    avoid using font servers with built-in fonts

diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 14164fb..2cf9eaf 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -442,4 +442,7 @@
 /* Use only built-in fonts */
 #undef BUILTIN_FONTS
 
+/* Avoid using font servers */
+#undef NOFONTSERVERACCESS
+
 #endif /* _DIX_CONFIG_H_ */
diff-tree ecfad74c48f633916305bcc25baaaad74aa52b78 (from 0a2068d123520d35818c38a555ae3ba06d8ca7fb)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Wed Jul 19 19:55:13 2006 -0400

    add support for built-in fonts
    
    Use --enable-builtin-fonts to only use built-in fonts, and avoid loading
    fonts.

diff --git a/configure.ac b/configure.ac
index 7a97970..815f1f4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -392,6 +392,9 @@ AC_ARG_ENABLE(install-libxf86config,
 				[Install libxf86config (default: disabled)]),
 				[INSTALL_LIBXF86CONFIG=$enableval],
 				[INSTALL_LIBXF86CONFIG=no])
+AC_ARG_ENABLE(builtin-fonts,  AS_HELP_STRING([--enable-builtin-fonts], [Use only built-in fonts (default: use external)]),
+                                [BUILTIN_FONTS=$enableval],
+                                [BUILTIN_FONTS=no])
 
 dnl Extensions.
 AC_ARG_ENABLE(composite,      AS_HELP_STRING([--disable-composite], [Build Composite extension (default: enabled)]), [COMPOSITE=$enableval], [COMPOSITE=yes])
@@ -710,6 +713,11 @@ if test "x$XPRINT" = xyes; then
 	REQUIRED_MODULES="$REQUIRED_MODULES printproto"
 fi
 
+if test "x$BUILTIN_FONTS" = xyes; then
+       AC_DEFINE(BUILTIN_FONTS, 1, [Use only built-in fonts])
+       AC_DEFINE(NOFONTSERVERACCESS, 1, [Avoid using a font server])
+fi
+
 AC_DEFINE(RENDER, 1, [Support RENDER extension])
 RENDER_LIB='$(top_builddir)/render/librender.la'
 RENDER_INC='-I$(top_srcdir)/render'
diff --git a/dix/dixfonts.c b/dix/dixfonts.c
index cb0df3c..ef23fa8 100644
--- a/dix/dixfonts.c
+++ b/dix/dixfonts.c
@@ -1889,7 +1889,7 @@ InitFonts ()
 {
     patternCache = MakeFontPatternCache();
 
-#ifndef KDRIVESERVER
+#ifndef BUILTIN_FONTS
     if (screenInfo.numScreens > screenInfo.numVideoScreens) {
 	PrinterFontRegisterFpeFunctions();
 	FontFileCheckRegisterFpeFunctions();
@@ -1897,10 +1897,11 @@ InitFonts ()
     } else 
 #endif
     {
-#ifdef KDRIVESERVER
-	BuiltinRegisterFpeFunctions();
-#endif
+#ifdef BUILTIN_FONTS
+        BuiltinRegisterFpeFunctions();
+#else
 	FontFileRegisterFpeFunctions();
+#endif
 #ifndef NOFONTSERVERACCESS
 	fs_register_fpe_functions();
 #endif
diff --git a/dix/main.c b/dix/main.c
index 5f53989..e186e89 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -403,9 +403,14 @@ main(int argc, char *argv[], char *envp[
 	    FatalError("failed to initialize core devices");
 
 	InitFonts();
+#ifdef BUILTIN_FONTS
+        defaultFontPath = "built-ins";
+#else
 	if (loadableFonts) {
 	    SetFontPath(0, 0, (unsigned char *)defaultFontPath, &error);
-	} else {
+	} else 
+#endif
+        {
 	    if (SetDefaultFontPath(defaultFontPath) != Success)
 		ErrorF("failed to set default font path '%s'",
 			defaultFontPath);
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 72a329c..14164fb 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -439,4 +439,7 @@
 /* Support D-BUS */
 #undef HAVE_DBUS
 
+/* Use only built-in fonts */
+#undef BUILTIN_FONTS
+
 #endif /* _DIX_CONFIG_H_ */
diff-tree 0a2068d123520d35818c38a555ae3ba06d8ca7fb (from c7577f9b88aac84d59404f29d994ee7af583d33b)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Wed Jul 19 17:29:23 2006 -0400

    Xi: add XExtension{Keyboard,Pointer} types
    
    Report XExtensionKeyboard for non-core keyboards, and XExtensionPointer for
    non-core pointers/mice.

diff --git a/Xi/listdev.c b/Xi/listdev.c
index 13e5ca7..91e8f22 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -241,6 +241,10 @@ CopySwapDevice(register ClientPtr client
 	dev->use = IsXKeyboard;
     else if (d == inputInfo.pointer)
 	dev->use = IsXPointer;
+    else if (d->key && d->kbdfeed)
+        dev->use = IsXExtensionKeyboard;
+    else if (d->valuator && d->button)
+        dev->use = IsXExtensionPointer;
     else
 	dev->use = IsXExtensionDevice;
     if (client->swapped) {
diff-tree c7577f9b88aac84d59404f29d994ee7af583d33b (from 3a23e499017d5823157806029263edac53c663fd)
Author: Kristian Høgsberg <krh at redhat.com>
Date:   Wed Jul 19 17:27:58 2006 -0400

    Xi: add DevicePresenceNotify
    
    Add support for DevicePresenceNotify events.

diff --git a/Xi/exglobals.h b/Xi/exglobals.h
index c64b848..3afd1bb 100644
--- a/Xi/exglobals.h
+++ b/Xi/exglobals.h
@@ -51,6 +51,7 @@ extern Mask DeviceMappingNotifyMask;
 extern Mask DeviceOwnerGrabButtonMask;
 extern Mask DeviceButtonGrabMask;
 extern Mask DeviceButtonMotionMask;
+extern Mask DevicePresenceNotifyMask;
 extern Mask PropagateMask[];
 
 extern int DeviceValuator;
@@ -68,12 +69,8 @@ extern int DeviceKeyStateNotify;
 extern int DeviceButtonStateNotify;
 extern int DeviceMappingNotify;
 extern int ChangeDeviceNotify;
+extern int DevicePresenceNotify;
 
 extern int RT_INPUTCLIENT;
 
-#if 0
-/* FIXME: in dix */
-extern InputInfo inputInfo;
-#endif
-
 #endif /* EXGLOBALS_H */
diff --git a/Xi/extinit.c b/Xi/extinit.c
index f3aabe3..c1ba462 100644
--- a/Xi/extinit.c
+++ b/Xi/extinit.c
@@ -166,6 +166,7 @@ Mask DeviceMappingNotifyMask;
 Mask DeviceOwnerGrabButtonMask;
 Mask DeviceButtonGrabMask;
 Mask DeviceButtonMotionMask;
+Mask DevicePresenceNotifyMask;
 
 int DeviceValuator;
 int DeviceKeyPress;
@@ -182,6 +183,7 @@ int DeviceKeyStateNotify;
 int DeviceButtonStateNotify;
 int DeviceMappingNotify;
 int ChangeDeviceNotify;
+int DevicePresenceNotify;
 
 int RT_INPUTCLIENT;
 
@@ -202,8 +204,8 @@ Mask PropagateMask[MAX_DEVICES];
  */
 
 static XExtensionVersion thisversion = { XI_Present,
-    XI_Add_XChangeDeviceControl_Major,
-    XI_Add_XChangeDeviceControl_Minor
+    XI_Add_DevicePresenceNotify_Major,
+    XI_Add_DevicePresenceNotify_Minor
 };
 
 /**********************************************************************
@@ -648,6 +650,16 @@ SDeviceMappingNotifyEvent(deviceMappingN
     swapl(&to->time, n);
 }
 
+void
+SDevicePresenceNotifyEvent (devicePresenceNotify *from, devicePresenceNotify *to)
+{
+    register char n;
+
+    *to = *from;
+    swaps(&to->sequenceNumber,n);
+    swapl(&to->time, n);
+}
+
 /************************************************************************
  *
  * This function sets up extension event types and masks.
@@ -674,6 +686,7 @@ FixExtensionEvents(ExtensionEntry * extE
     ChangeDeviceNotify = DeviceMappingNotify + 1;
     DeviceKeyStateNotify = ChangeDeviceNotify + 1;
     DeviceButtonStateNotify = DeviceKeyStateNotify + 1;
+    DevicePresenceNotify = DeviceButtonStateNotify + 1;
 
     event_base[KeyClass] = DeviceKeyPress;
     event_base[ButtonClass] = DeviceButtonPress;
@@ -746,6 +759,9 @@ FixExtensionEvents(ExtensionEntry * extE
 
     DeviceOwnerGrabButtonMask = GetNextExtEventMask();
     SetEventInfo(DeviceOwnerGrabButtonMask, _deviceOwnerGrabButton);
+
+    DevicePresenceNotifyMask = GetNextExtEventMask();
+    SetEventInfo(DevicePresenceNotifyMask, _devicePresence);
     SetEventInfo(0, _noExtensionEvent);
 }
 
@@ -786,6 +802,7 @@ RestoreExtensionEvents(void)
     ChangeDeviceNotify = 12;
     DeviceKeyStateNotify = 13;
     DeviceButtonStateNotify = 13;
+    DevicePresenceNotify = 14;
 
     BadDevice = 0;
     BadEvent = 1;
@@ -823,6 +840,7 @@ IResetProc(ExtensionEntry * unused)
     EventSwapVector[DeviceButtonStateNotify] = NotImplemented;
     EventSwapVector[DeviceMappingNotify] = NotImplemented;
     EventSwapVector[ChangeDeviceNotify] = NotImplemented;
+    EventSwapVector[DevicePresenceNotify] = NotImplemented;
     RestoreExtensionEvents();
 }
 
@@ -857,9 +875,7 @@ MakeDeviceTypeAtoms(void)
 }
 
 /**************************************************************************
- *
  * Return a DeviceIntPtr corresponding to a specified device id.
- * This will not return the pointer or keyboard, or devices that are not on.
  *
  */
 
@@ -869,13 +885,16 @@ LookupDeviceIntRec(CARD8 id)
     DeviceIntPtr dev;
 
     for (dev = inputInfo.devices; dev; dev = dev->next) {
-	if (dev->id == id) {
-	    if (id == inputInfo.pointer->id || id == inputInfo.keyboard->id)
-		return (NULL);
-	    return (dev);
-	}
+	if (dev->id == id)
+	    return dev;
     }
-    return (NULL);
+
+    for (dev = inputInfo.off_devices; dev; dev = dev->next) {
+	if (dev->id == id)
+	    return dev;
+    }
+
+    return NULL;
 }
 
 /**************************************************************************
diff --git a/Xi/selectev.c b/Xi/selectev.c
index 3483804..1f6713a 100644
--- a/Xi/selectev.c
+++ b/Xi/selectev.c
@@ -74,6 +74,53 @@ SOFTWARE.
 extern Mask ExtExclusiveMasks[];
 extern Mask ExtValidMasks[];
 
+static int
+HandleDevicePresenceMask(ClientPtr client, WindowPtr win,
+                         XEventClass *cls, CARD16 *count)
+{
+    int i, j;
+    Mask mask;
+
+    /* We use the device ID 256 to select events that aren't bound to
+     * any device.  For now we only handle the device presence event,
+     * but this could be extended to other events that aren't bound to
+     * a device.
+     *
+     * In order not to break in CreateMaskFromList() we remove the
+     * entries with device ID 256 from the XEventClass array.
+     */
+
+    mask = 0;
+    for (i = 0, j = 0; i < *count; i++) {
+        if (cls[i] >> 8 != 256) {
+            cls[j] = cls[i];
+            j++;
+            continue;
+        }
+
+        switch (cls[i] & 0xff) {
+        case _devicePresence:
+            mask |= DevicePresenceNotifyMask;
+            break;
+        }
+    }
+
+    *count = j;
+
+    if (mask == 0)
+        return Success;
+
+    /* We always only use mksidx = 0 for events not bound to
+     * devices */
+
+    if (AddExtensionClient (win, client, mask, 0) != Success)
+        return BadAlloc;
+
+    RecalculateDeviceDeliverableEvents(win);
+
+    return Success;
+}
+
 /***********************************************************************
  *
  * Handle requests from clients with a different byte order.
@@ -131,6 +178,13 @@ ProcXSelectExtensionEvent(register Clien
 	return Success;
     }
 
+    if (HandleDevicePresenceMask(client, pWin, (XEventClass *) & stuff[i],
+                                &stuff->count) != Success) {
+       SendErrorToClient(client, IReqCode, X_SelectExtensionEvent, 0,
+                         BadAlloc);
+       return Success;
+    }
+
     if ((ret = CreateMaskFromList(client, (XEventClass *) & stuff[1],
 				  stuff->count, tmp, NULL,
 				  X_SelectExtensionEvent)) != Success)
diff-tree 3a23e499017d5823157806029263edac53c663fd (from 02d09105113fb9b560a770fe15f7bb041165831c)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Wed Jul 19 17:00:23 2006 -0400

    make XInput mandatory
    
    Always build Xi, since GetPointerEvents/GetKeyboardEvents relies on it.

diff --git a/Makefile.am b/Makefile.am
index 799815e..eebdd0a 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -26,10 +26,6 @@ if GLX
 GLX_DIR=GL
 endif
 
-if XINPUT
-XINPUT_DIR=Xi
-endif
-
 if DBE
 DBE_DIR=dbe
 endif
@@ -45,7 +41,7 @@ SUBDIRS = \
 	os \
 	randr \
 	render  \
-	$(XINPUT_DIR) \
+	Xi \
 	xkb \
 	$(DBE_DIR) \
 	$(MFB_DIR) \
diff --git a/configure.ac b/configure.ac
index 186f2f9..7a97970 100644
--- a/configure.ac
+++ b/configure.ac
@@ -422,7 +422,6 @@ AC_ARG_ENABLE(fontcache,      AS_HELP_ST
 AC_ARG_ENABLE(dbe,            AS_HELP_STRING([--disable-dbe], [Build DBE extension (default: enabled)]), [DBE=$enableval], [DBE=yes])
 AC_ARG_ENABLE(xf86bigfont,    AS_HELP_STRING([--disable-xf86bigfont], [Build XF86 Big Font extension (default: enabled)]), [XF86BIGFONT=$enableval], [XF86BIGFONT=yes])
 AC_ARG_ENABLE(dpms,           AS_HELP_STRING([--disable-dpms], [Build DPMS extension (default: enabled)]), [DPMSExtension=$enableval], [DPMSExtension=yes])
-AC_ARG_ENABLE(xinput,         AS_HELP_STRING([--disable-xinput], [Build XInput Extension (default: enabled)]), [XINPUT=$enableval], [XINPUT=yes])
 AC_ARG_ENABLE(dbus,           AS_HELP_STRING([--disable-dbus], [Build D-BUS support (default: auto)]), [DBUS=$enableval], [DBUS=auto])
 
 dnl DDXes.
@@ -733,12 +732,9 @@ if test "$COMPOSITE" = yes; then
 fi
 MIEXT_DAMAGE_INC='-I$(top_srcdir)/miext/damage'
 
-AM_CONDITIONAL(XINPUT, [test "x$XINPUT" = xyes])
-if test "x$XINPUT" = xyes; then
-   	AC_DEFINE(XINPUT, 1, [Support X Input extension])
-	XI_LIB='$(top_builddir)/Xi/libXi.la'
-	XI_INC='-I$(top_srcdir)/Xi'
-fi
+AC_DEFINE(XINPUT, 1, [Support X Input extension])
+XI_LIB='$(top_builddir)/Xi/libXi.la'
+XI_INC='-I$(top_srcdir)/Xi'
 
 AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
 
diff-tree 02d09105113fb9b560a770fe15f7bb041165831c (from a274e7296b1bdd6f6c921f28b087610cec9548e0)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Wed Jul 19 16:51:04 2006 -0400

    new KDrive input world order
    
    Convert KDrive to GPE/GKE interface.
    Add first-class drivers and enumerate every device separately through
    Xi, instead of lamely attempting to aggregate them.
    Add XKB support to the Linux keyboard driver.
    Add 'thumb button' support to the tslib driver.
    Rejig InitInput, so each DDX has to add a list of drivers it supports.
    Support NewInputDeviceRequest, et al.

diff --git a/configure.ac b/configure.ac
index 41536f7..186f2f9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -439,6 +439,9 @@ dnl kdrive and its subsystems
 AC_ARG_ENABLE(kdrive,         AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no])
 AC_ARG_ENABLE(xephyr,         AS_HELP_STRING([--enable-xephyr], [Build the kdrive Xephyr server (default: auto)]), [XEPHYR=$enableval], [XEPHYR=auto])
 AC_ARG_ENABLE(xsdl,           AS_HELP_STRING([--enable-xsdl], [Build the kdrive Xsdl server (default: auto)]), [XSDL=$enableval], [XSDL=auto])
+AC_ARG_ENABLE(xfake,          AS_HELP_STRING([--enable-xfake], [Build the kdrive 'fake' server (default: auto)]), [XFAKE=$enableval], [XFAKE=auto])
+AC_ARG_ENABLE(xfbdev,         AS_HELP_STRING([--enable-xfbdev], [Build the kdrive framebuffer device server (default: auto)]), [XFBDEV=$enableval], [XFBDEV=auto])
+AC_ARG_ENABLE(kdrive-vesa,    AS_HELP_STRING([--enable-kdrive-vesa], [Build the kdrive VESA-based servers (default: auto)]), [KDRIVEVESA=$enableval], [KDRIVEVESA=auto])
 dnl xprint
 AC_ARG_ENABLE(freetype,       AS_HELP_STRING([ --enable-freetype], [Build Xprint FreeType backend (default: yes)]), [XP_USE_FREETYPE=$enableval],[XP_USE_FREETYPE=no])
 AC_ARG_WITH(freetype-config,  AS_HELP_STRING([ --with-freetype-config=PROG], [Use FreeType configuration program PROG (default: auto)]), freetype_config=$withval, freetype_config=auto)
@@ -510,7 +513,7 @@ XEXT_LIB='$(top_builddir)/Xext/libXext.l
 XEXTXORG_LIB='$(top_builddir)/Xext/libXextbuiltin.la'
 
 dnl Core modules for most extensions, et al.
-REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto"
+REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto [inputproto >= 1.4]"
 REQUIRED_LIBS="xfont xau fontenc"
 
 if test "x$DBUS" = xauto; then
@@ -824,11 +827,35 @@ AC_DEFINE(DDXOSINIT, 1, [Use OsVendorIni
 AC_DEFINE(SERVER_LOCK, 1, [Use a lock to prevent multiple servers on a display])
 AC_DEFINE(SMART_SCHEDULE, 1, [Include time-based scheduler])
 AC_DEFINE(NO_LIBCWRAPPER, 1, [Define to 1 if modules should avoid the libcwrapper])
-AM_CONDITIONAL(DEBUG, test "x$DEBUGGING" = xyes)
 
-if ! test "x$DEBUGGING" = xyes; then
-  AC_DEFINE(NDEBUG, 1, [Disable some debugging code])
+if test "x$DEBUGGING" = xyes; then
+       AC_DEFINE(DEBUG, 1, [Enable debugging code])
+else
+       AC_DEFINE(NDEBUG, 1, [Disable some debugging code])
+fi
+AM_CONDITIONAL(DEBUG, [test "x$DEBUGGING" = xyes])
+
+# The Xorg binary needs to export symbols so that they can be used from modules
+# Some platforms require extra flags to do this.   gcc should set these flags
+# when -rdynamic is passed to it, other compilers/linkers may need to be added
+# here.
+if test "x$GCC" = "xyes"; then
+       GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
+       GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
+       GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
+       GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
+       if test "x$WERROR" = "xyes"; then
+               GCC_WARNINGS="${GCC_WARNINGS} -Werror"
+       fi
+       XSERVER_CFLAGS="$GCC_WARNINGS $XSERVER_CFLAGS"
+       LD_EXPORT_SYMBOLS_FLAG="-rdynamic"
 fi
+case $host_os in
+       openbsd*)
+       LD_EXPORT_SYMBOLS_FLAG="-Wl,--export-dynamic"
+       ;;
+esac
+AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
 
 AC_DEFINE(USE_RGB_TXT, 1, [Use rgb.txt directly])
 AC_DEFINE(MITMISC, 1, [Support MIT Misc extension])
@@ -1038,6 +1065,14 @@ if test "x$XORG" = xyes -o "x$XGL" = xye
 	XORG_CFLAGS="$XORGSERVER_CFLAGS -DHAVE_XORG_CONFIG_H"
 	XORG_LIBS="$COMPOSITE_LIB $MI_LIB $FIXES_LIB $XEXTXORG_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XPSTUBS_LIB $OS_LIB"
 
+        AC_DEFINE(XF86VIDMODE, 1, [Support XFree86 Video Mode extension])
+        AC_DEFINE(XF86MISC, 1, [Support XFree86 miscellaneous extensions])
+
+        XORG_MODULES="xf86miscproto xf86vidmodeproto xf86dgaproto"
+        PKG_CHECK_MODULES(XORG_MODULES, [$XORG_MODULES])
+        XORG_CFLAGS="$XORG_CFLAGS $XORG_MODULES_CFLAGS"
+        XORG_LIBS="$XORG_LIBS $XORG_MODULES_LIBS"
+
 dnl Check to see if dlopen is in default libraries (like Solaris, which
 dnl has it in libc), or if libdl is needed to get it.
 	AC_CHECK_FUNC([dlopen], [], 
@@ -1229,28 +1264,7 @@ int main () { 
 	fi
 	AC_SUBST(PERL)
 
-	# The Xorg binary needs to export symbols so that they can be used from modules
-	# Some platforms require extra flags to do this.   gcc should set these flags
-	# when -rdynamic is passed to it, other compilers/linkers may need to be added
-	# here.
-	if test "x$GCC" = "xyes"; then
-		GCC_WARNINGS1="-Wall -Wpointer-arith -Wstrict-prototypes"
-		GCC_WARNINGS2="-Wmissing-prototypes -Wmissing-declarations"
-		GCC_WARNINGS3="-Wnested-externs -fno-strict-aliasing"
-		GCC_WARNINGS="$GCC_WARNINGS1 $GCC_WARNINGS2 $GCC_WARNINGS3"
-		if test "x$WERROR" = "xyes"; then
-			GCC_WARNINGS="${GCC_WARNINGS} -Werror"
-		fi
-		XSERVER_CFLAGS="$GCC_WARNINGS $XSERVER_CFLAGS"
-		LD_EXPORT_SYMBOLS_FLAG="-rdynamic"
-	fi
-	case $host_os in
-		openbsd*)
-		LD_EXPORT_SYMBOLS_FLAG="-Wl,--export-dynamic"
-		;;
-	esac
 	AC_SUBST([XORG_CFLAGS])
-	AC_SUBST([LD_EXPORT_SYMBOLS_FLAG])
 
 	dnl these only go in xorg-config.h
 	XF86CONFIGFILE="xorg.conf"
@@ -1438,16 +1452,58 @@ if test "$KDRIVE" = yes; then
     AC_DEFINE(KDRIVEDDXACTIONS,,[Build kdrive ddx])
 
     AC_CHECK_HEADERS([sys/vm86.h sys/io.h])
-    if test "$ac_cv_header_sys_vm86_h" = yes; then
+    if test "$ac_cv_header_sys_vm86_h" = yes && test "x$KDRIVEVESA" = xauto; then
+        KDRIVEVESA=yes
+    fi
+
+    if test "x$KDRIVEVESA" = xyes; then
+        KDRIVEFBDEVLIB=yes
         AC_DEFINE(KDRIVEVESA, 1, [Build VESA-based kdrive servers])
     fi
 
     AC_CHECK_HEADERS([linux/fb.h])
-    if test "$ac_cv_header_linux_fb_h" = yes; then
+    if test "$ac_cv_header_linux_fb_h" = yes && test "x$XFBDEV" = xauto; then
+        XFBDEV=yes
+    fi
+
+    if test "x$XFBDEV" = xyes; then
+        KDRIVEFBDEVLIB=yes
         AC_DEFINE(KDRIVEFBDEV, 1, [Build fbdev-based kdrive server])
     fi
     
     # tslib...
+    AC_CHECK_LIB(ts, ts_open, [HAVE_TSLIB="yes"])
+    if test "x$TSLIB" = xauto && test "x$HAVE_TSLIB" = xyes; then
+        TSLIB=yes
+    fi
+
+    if test "x$TSLIB" = xyes; then
+        if ! test "x$HAVE_TSLIB" = xyes; then
+            AC_MSG_ERROR([tslib must be installed to build the tslib input driver.])
+        fi
+        TSLIB_LIBS="-lts"
+        AC_DEFINE(TSLIB, 1, [Have tslib support])
+    fi
+
+    if test x"$ac_cv_header_SDL_SDL_h" = xyes && "x$XSDL" = xauto; then
+       XSDL=yes
+    fi
+
+    if test x"$XSDL" = xyes; then
+       # PKG_CHECK_MODULES(XSDL_EXTRA, Xfont xau $XDMCP_MODULES)
+       AC_DEFINE(XSDLSERVER,1,[Build Xsdl server])
+       XSDL_LIBS="`sdl-config --libs` $XSERVER_LIBS"
+       XSDL_INCS="`sdl-config --cflags` $XSERVER_CFLAGS"
+    fi
+
+    PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"])
+    if test "x$XEPHYR" = xauto; then
+       XEPHYR=xephyr
+    fi
+    # Xephyr needs nanosleep() which is in librt on Solaris
+    AC_CHECK_FUNC([nanosleep], [],
+        AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
+    XEPHYR_LIBS="$XEPHYR_LIBS $XSERVER_LIBS"
 
     # damage shadow extension glx (NOTYET) fb mi
     KDRIVE_INC='-I$(top_srcdir)/hw/kdrive/src'
@@ -1460,48 +1516,38 @@ if test "$KDRIVE" = yes; then
     # dix os fb mi extension glx (NOTYET) damage shadow xpstubs
     #KDRIVE_PURE_LIBS="$DIX_LIB $OS_LIB $FB_LIB $XEXT_LIB $MIEXT_DAMAGE_LIB \
     #    $MIEXT_SHADOW_LIB $XPSTUBS_LIB"
-    KDRIVE_PURE_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $OS_LIB"
+    KDRIVE_PURE_LIBS="$FB_LIB $MI_LIB $FIXES_LIB $XEXT_LIB $TSLIB_LIBS $DBE_LIB $XTRAP_LIB $RECORD_LIB $GLX_LIBS $RENDER_LIB $RANDR_LIB $DAMAGE_LIB $MIEXT_DAMAGE_LIB $MIEXT_SHADOW_LIB $XI_LIB $XKB_LIB $XKB_STUB_LIB $COMPOSITE_LIB $XPSTUBS_LIB $OS_LIB"
     KDRIVE_LIB='$(top_builddir)/hw/kdrive/src/libkdrive.a'
     KDRIVE_OS_LIB='$(top_builddir)/hw/kdrive/linux/liblinux.a'
     KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.a'
-    KDRIVE_LIBS="$DIX_LIB $CONFIG_LIB $KDRIVE_LIB $KDRIVE_OS_LIB $KDRIVE_PURE_LIBS $KDRIVE_STUB_LIB"
+    KDRIVE_LIBS="$XSERVERLIBS_LIBS $DIX_LIB $CONFIG_LIB $KDRIVE_LIB $KDRIVE_OS_LIB $KDRIVE_PURE_LIBS $KDRIVE_STUB_LIB"
 
     # check if we can build Xephyr
     PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"])
-    
-    # check for SDL SDK
-    AC_CHECK_HEADERS([SDL/SDL.h])
-fi
-AC_SUBST(KDRIVE_INCS)
-AC_SUBST(KDRIVE_PURE_INCS)
-AC_SUBST(KDRIVE_CFLAGS)
-AC_SUBST(KDRIVE_PURE_LIBS)
-AC_SUBST(KDRIVE_LIBS)
-AM_CONDITIONAL(TSLIB, false)
+    XEPHYR_LIBS="$XEPHYR_LIBS $XSERVER_LIBS"
+
+    # Xephyr needs nanosleep() which is in librt on Solaris
+    AC_CHECK_FUNC([nanosleep], [],
+        AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
+
+    AC_SUBST([XEPHYR_LIBS])
+    AC_SUBST([XEPHYR_INCS])
+    AC_SUBST([XSDL_LIBS])
+    AC_SUBST([XSDL_INCS])
+fi
+AC_SUBST([KDRIVE_INCS])
+AC_SUBST([KDRIVE_PURE_INCS])
+AC_SUBST([KDRIVE_CFLAGS])
+AC_SUBST([KDRIVE_PURE_LIBS])
+AC_SUBST([KDRIVE_LIBS])
+AM_CONDITIONAL(TSLIB, [test "x$TSLIB" = xyes])
 AM_CONDITIONAL(H3600_TS, false)
-AM_CONDITIONAL(KDRIVEVESA, [test x"$ac_cv_header_sys_vm86_h" = xyes])
-AM_CONDITIONAL(KDRIVEFBDEV, [test x"$ac_cv_header_linux_fb_h" = xyes])
-#AM_CONDITIONAL(KDRIVEVESA, false)
-#AM_CONDITIONAL(KDRIVEFBDEV, false)
-
-# Xephyr needs nanosleep() which is in librt on Solaris
-AC_CHECK_FUNC([nanosleep], [],
-	AC_CHECK_LIB([rt], [nanosleep], XEPHYR_LIBS="$XEPHYR_LIBS -lrt"))
-
-AM_CONDITIONAL(XEPHYR, [test x"$xephyr" = xyes])
-XEPHYR_LIBS="$XEPHYR_LIBS $XSERVER_LIBS"
-AC_SUBST([XEPHYR_LIBS])
-AC_SUBST([XEPHYR_INCS])
-
-AM_CONDITIONAL(XSDLSERVER, [test x"$ac_cv_header_SDL_SDL_h" = xyes])
-if test x"$ac_cv_header_SDL_SDL_h" = xyes -o x"$XSDL" = xyes; then
-    # PKG_CHECK_MODULES(XSDL_EXTRA, Xfont xau $XDMCP_MODULES)
-    AC_DEFINE(XSDLSERVER,,[Build Xsdl server])
-    XSDL_LIBS="`sdl-config --libs` $XSERVER_LIBS"
-    XSDL_INCS="`sdl-config --cflags` $XSERVER_CFLAGS"
-fi
-AC_SUBST([XSDL_LIBS])
-AC_SUBST([XSDL_INCS])
+AM_CONDITIONAL(KDRIVEVESA, [test "x$KDRIVEVESA" = xyes])
+AM_CONDITIONAL(KDRIVEFBDEV, [test "x$XFBDEV" = xyes])
+AM_CONDITIONAL(XSDLSERVER, [test x"$XSDL" = xyes])
+AM_CONDITIONAL(XEPHYR, [test "x$KDRIVE" = xyes && test "x$xephyr" = xyes])
+AM_CONDITIONAL(BUILD_KDRIVEFBDEVLIB, [test "x$KDRIVE" = xyes && test "x$KDRIVEFBDEVLIB" = xyes])
+AM_CONDITIONAL(XFAKESERVER, [test "x$KDRIVE" = xyes && test "x$XFAKE" = xyes])
 
 
 dnl these only go in xkb-config.h (which is shared by the Xorg and Xnest servers)
@@ -1510,7 +1556,6 @@ AC_DEFINE_DIR(XKB_BASE_DIRECTORY, XKBPAT
 AC_DEFINE_DIR(XKB_BIN_DIRECTORY, bindir, [Path to XKB bin dir])
 
 # Make sure XKM_OUTPUT_DIR is an absolute path
-
 XKBOUTPUT_FIRSTCHAR=`echo $XKBOUTPUT | cut -b 1`
 
 if [[ x$XKBOUTPUT_FIRSTCHAR != x/ ]] ; then
@@ -1549,15 +1594,21 @@ esac
 AC_DEFINE_DIR(PROJECTROOT, prefix, [Overall prefix])
 
 dnl xorgconfig CLI configuration utility
-PKG_CHECK_MODULES([XORGCONFIG_DEP], [xkbfile x11])
-AC_SUBST(XORGCONFIG_DEP_CFLAGS)
-AC_SUBST(XORGCONFIG_DEP_LIBS)
+if test "x$XORG" = xyes; then
+    PKG_CHECK_MODULES([XORGCONFIG_DEP], [xkbfile x11])
+    AC_SUBST(XORGCONFIG_DEP_CFLAGS)
+    AC_SUBST(XORGCONFIG_DEP_LIBS)
+fi
 
 dnl xorgcfg GUI configuration utility
 AC_ARG_ENABLE(xorgcfg, AS_HELP_STRING([--enable-xorgcfg], 
-	[Build xorgcfg GUI configuration utility (default: yes)]),
-	[XORGCFG=$enableval],[XORGCFG=yes])
-if test x$XORGCFG = xyes ; then
+	[Build xorgcfg GUI configuration utility (default: auto)]),
+	[XORGCFG=$enableval],[XORGCFG=auto])
+if test "x$XORGCFG" = xauto && test "x$XORG" = xyes; then
+    XORGCFG=yes
+fi
+
+if test "x$XORGCFG" = xyes; then
 	PKG_CHECK_MODULES([XORGCFG_DEP], 
 	    [xkbui >= 1.0.2 xkbfile xxf86misc xxf86vm xaw7 xmu xt xpm xext x11])
 	AC_CHECK_LIB([curses],[waddstr],
diff --git a/hw/kdrive/Makefile.am b/hw/kdrive/Makefile.am
index c8832eb..fa1dba9 100644
--- a/hw/kdrive/Makefile.am
+++ b/hw/kdrive/Makefile.am
@@ -3,10 +3,14 @@ VESA_SUBDIRS = vesa ati chips epson i810
                smi via
 endif
 
-if KDRIVEFBDEV
+if BUILD_KDRIVEFBDEVLIB
 FBDEV_SUBDIRS = fbdev
 endif
 
+if XFAKESERVER
+XFAKE_SUBDIRS = fake
+endif
+
 if XSDLSERVER
 XSDL_SUBDIRS = sdl
 endif
@@ -22,7 +26,7 @@ SUBDIRS =			\
 	$(FBDEV_SUBDIRS)	\
 	$(VESA_SUBDIRS)		\
 	$(XEPHYR_SUBDIRS)       \
-	fake
+	$(XFAKE_SUBDIRS)
 
 DIST_SUBDIRS = vesa ati chips epson i810 mach64 mga neomagic nvidia pm2 r128 \
                smi via fbdev sdl ephyr src linux fake sis300
diff --git a/hw/kdrive/ati/ati_stub.c b/hw/kdrive/ati/ati_stub.c
index 01ebc31..d0bc4ca 100644
--- a/hw/kdrive/ati/ati_stub.c
+++ b/hw/kdrive/ati/ati_stub.c
@@ -53,7 +53,15 @@ InitOutput(ScreenInfo *pScreenInfo, int 
 void
 InitInput(int argc, char **argv)
 {
-	KdInitInput(&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+        KdKeyboardInfo *ki = NULL;
+        
+        KdAddPointerDriver(&LinuxMouseDriver);
+        ki = KdNewKeyboard();
+        if (ki) {
+            ki->driver = &LinuxKeyboardDriver;
+            KdAddKeyboard(ki);
+        }
+	KdInitInput();
 }
 
 void
diff --git a/hw/kdrive/ephyr/Makefile.am b/hw/kdrive/ephyr/Makefile.am
index f423bfe..6982d80 100644
--- a/hw/kdrive/ephyr/Makefile.am
+++ b/hw/kdrive/ephyr/Makefile.am
@@ -33,7 +33,6 @@ Xephyr_LDADD = 						\
 	libxephyr-hostx.a			        \
 	../../../exa/libexa.la				\
 	@KDRIVE_LIBS@					\
-	@KDRIVE_LIBS@					\
         $(TSLIB_LIBS)                                   \
         @XEPHYR_LIBS@
 
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index fbb16a4..92fd831 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -36,10 +36,16 @@
 #include "inputstr.h"
 
 extern int KdTsPhyScreen;
-extern DeviceIntPtr pKdKeyboard;
+KdKeyboardInfo *ephyrKbd;
+KdPointerInfo *ephyrMouse;
+EphyrKeySyms ephyrKeySyms;
 
 static int mouseState = 0;
 
+typedef struct _EphyrInputPrivate {
+    Bool    enabled;
+} EphyrKbdPrivate, EphyrPointerPrivate;
+
 Bool   EphyrWantGrayScale = 0;
 
 Bool
@@ -206,15 +212,14 @@ ephyrMapFramebuffer (KdScreenInfo *scree
 {
   EphyrScrPriv  *scrpriv = screen->driver;
   EphyrPriv	  *priv    = screen->card->driver;
-  KdMouseMatrix m;
+  KdPointerMatrix m;
   int buffer_height;
   
   EPHYR_DBG(" screen->width: %d, screen->height: %d",
 	    screen->width, screen->height);
   
-  KdComputeMouseMatrix (&m, scrpriv->randr, screen->width, screen->height);
-    
-  KdSetMouseMatrix (&m);
+  KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height);
+  KdSetPointerMatrix (&m);
   
   priv->bytes_per_line = ((screen->width * screen->fb[0].bitsPerPixel + 31) >> 5) << 2;
   
@@ -719,8 +724,9 @@ ephyrUpdateModifierState(unsigned int st
 		kptr = &keyc->down[key >> 3];
 		bit = 1 << (key & 7);
 		
-		if (*kptr & bit)
-		  KdEnqueueKeyboardEvent(key, TRUE); /* release */
+		if (*kptr & bit && ephyrKbd &&
+                    ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
+		  KdEnqueueKeyboardEvent(ephyrKbd, key, TRUE); /* release */
 		
 		if (--count == 0)
 		  break;
@@ -732,7 +738,9 @@ ephyrUpdateModifierState(unsigned int st
 	for (key = 0; key < MAP_LENGTH; key++)
 	  if (keyc->modifierMap[key] & mask) 
 	    {
-	      KdEnqueueKeyboardEvent(key, FALSE); /* press */
+              if (keyc->modifierMap[key] & mask && ephyrKbd &&
+                  ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
+	          KdEnqueueKeyboardEvent(ephyrKbd, key, FALSE); /* press */
 	      break;
 	    }
     }
@@ -748,31 +756,47 @@ ephyrPoll(void)
       switch (ev.type)
 	{
 	case EPHYR_EV_MOUSE_MOTION:
-	  KdEnqueueMouseEvent(kdMouseInfo, mouseState,  
-			      ev.data.mouse_motion.x, 
-			      ev.data.mouse_motion.y);
+          if (!ephyrMouse ||
+              !((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled)
+              continue;
+	  KdEnqueuePointerEvent(ephyrMouse, mouseState,  
+			        ev.data.mouse_motion.x, 
+			        ev.data.mouse_motion.y,
+                                0);
 	  break;
 	  
 	case EPHYR_EV_MOUSE_PRESS:
+          if (!ephyrMouse ||
+              !((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled)
+              continue;
 	  ephyrUpdateModifierState(ev.key_state);
 	  mouseState |= ev.data.mouse_down.button_num;
-	  KdEnqueueMouseEvent(kdMouseInfo, mouseState|KD_MOUSE_DELTA, 0, 0);
+	  KdEnqueuePointerEvent(ephyrMouse, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
 	  break;
 
 	case EPHYR_EV_MOUSE_RELEASE:
+          if (!ephyrMouse ||
+              !((EphyrPointerPrivate *)ephyrMouse->driverPrivate)->enabled)
+              continue;
 	  ephyrUpdateModifierState(ev.key_state);
 	  mouseState &= ~ev.data.mouse_up.button_num;
-	  KdEnqueueMouseEvent(kdMouseInfo, mouseState|KD_MOUSE_DELTA, 0, 0);
+	  KdEnqueuePointerEvent(ephyrMouse, mouseState|KD_MOUSE_DELTA, 0, 0, 0);
 	  break;
 
 	case EPHYR_EV_KEY_PRESS:
+          if (!ephyrKbd ||
+              !((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
+              continue;
 	  ephyrUpdateModifierState(ev.key_state);
-	  KdEnqueueKeyboardEvent (ev.data.key_down.scancode, FALSE);
+	  KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_down.scancode, FALSE);
 	  break;
 
 	case EPHYR_EV_KEY_RELEASE:
+          if (!ephyrKbd ||
+              !((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
+              continue;
 	  ephyrUpdateModifierState(ev.key_state);
-	  KdEnqueueKeyboardEvent (ev.data.key_up.scancode, TRUE);
+	  KdEnqueueKeyboardEvent (ephyrKbd, ev.data.key_up.scancode, TRUE);
 	  break;
 
 	default:
@@ -833,59 +857,115 @@ ephyrPutColors (ScreenPtr pScreen, int f
 
 /* Mouse calls */
 
-static Bool
-MouseInit (void)
+static Status
+MouseInit (KdPointerInfo *pi)
+{
+    pi->driverPrivate = (EphyrPointerPrivate *)
+                         xcalloc(sizeof(EphyrPointerPrivate), 1);
+    ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
+    ephyrMouse = pi;
+    /* FIXME DO NOT COMMIT */
+    KdAddPointerDriver(&EphyrMouseDriver);
+    ErrorF("SUCCESS!\n");
+    return Success;
+}
+
+static Status
+MouseEnable (KdPointerInfo *pi)
+{
+    ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = TRUE;
+    ErrorF("SUCCESS ENABLE!\n");
+    return Success;
+}
+
+static void
+MouseDisable (KdPointerInfo *pi)
 {
-    return TRUE;
+    ((EphyrPointerPrivate *)pi->driverPrivate)->enabled = FALSE;
+    return;
 }
 
 static void
-MouseFini (void)
+MouseFini (KdPointerInfo *pi)
 {
-  ;
+    ephyrMouse = NULL; 
+    return;
 }
 
-KdMouseFuncs EphyrMouseFuncs = {
+KdPointerDriver EphyrMouseDriver = {
+    "ephyr",
     MouseInit,
+    MouseEnable,
+    MouseDisable,
     MouseFini,
+    NULL,
 };
 
 /* Keyboard */
 
-static void
-EphyrKeyboardLoad (void)
+static Status
+EphyrKeyboardInit (KdKeyboardInfo *ki)
 {
-  EPHYR_DBG("mark");
+  ki->driverPrivate = (EphyrKbdPrivate *)
+                       xcalloc(sizeof(EphyrKbdPrivate), 1);
+  /* FIXME blah blah overrunning memory blah blah */
+  ki->minScanCode = ki->keySyms.minKeyCode = 0;
+  ki->maxScanCode = ki->keySyms.maxKeyCode = 255;
+  ephyrKbd = ki;
+  return Success;
+}
+
+static Status
+EphyrKeyboardEnable (KdKeyboardInfo *ki)
+{
+    hostx_load_keymap();
+    if (!ephyrKeySyms.map) {
+        ErrorF("Couldn't load keymap from host\n");
+        return BadAlloc;
+    }
+    ki->keySyms.minKeyCode = ephyrKeySyms.minKeyCode;
+    ki->keySyms.maxKeyCode = ephyrKeySyms.maxKeyCode;
+    ki->minScanCode = ki->keySyms.minKeyCode;
+    ki->maxScanCode = ki->keySyms.maxKeyCode;
+    ki->keySyms.mapWidth = ephyrKeySyms.mapWidth;
+    ki->keySyms.map = ephyrKeySyms.map;
+    ((EphyrKbdPrivate *)ki->driverPrivate)->enabled = TRUE;
 
-  hostx_load_keymap();
+    return Success;
 }
 
-static int
-EphyrKeyboardInit (void)
+static void
+EphyrKeyboardDisable (KdKeyboardInfo *ki)
 {
-  return 0;
+    ((EphyrKbdPrivate *)ki->driverPrivate)->enabled = FALSE;
 }
 
 static void
-EphyrKeyboardFini (void)
+EphyrKeyboardFini (KdKeyboardInfo *ki)
 {
+    /* not xfree: we call malloc from hostx.c. */
+    free(ki->keySyms.map);
+    ephyrKbd = NULL;
+    return;
 }
 
 static void
-EphyrKeyboardLeds (int leds)
+EphyrKeyboardLeds (KdKeyboardInfo *ki, int leds)
 {
 }
 
 static void
-EphyrKeyboardBell (int volume, int frequency, int duration)
+EphyrKeyboardBell (KdKeyboardInfo *ki, int volume, int frequency, int duration)
 {
 }
 
-KdKeyboardFuncs	EphyrKeyboardFuncs = {
-    EphyrKeyboardLoad,
+KdKeyboardDriver EphyrKeyboardDriver = {
+    "ephyr",
     EphyrKeyboardInit,
+    EphyrKeyboardEnable,
     EphyrKeyboardLeds,
     EphyrKeyboardBell,
+    EphyrKeyboardDisable,
     EphyrKeyboardFini,
-    0,
+    NULL,
 };
diff --git a/hw/kdrive/ephyr/ephyr.h b/hw/kdrive/ephyr/ephyr.h
index 707cb01..f49d920 100644
--- a/hw/kdrive/ephyr/ephyr.h
+++ b/hw/kdrive/ephyr/ephyr.h
@@ -31,7 +31,6 @@
 
 #include "os.h"  		/* for OsSignal() */
 #include "kdrive.h"
-#include "kkeymap.h"
 #include "hostx.h"
 #include "exa.h"
 
@@ -68,7 +67,9 @@ typedef struct _ephyrScrPriv {
     EphyrFakexaPriv *fakexa;
 } EphyrScrPriv;
 
-extern KdCardFuncs  ephyrFuncs;
+extern KdCardFuncs ephyrFuncs;
+extern KdKeyboardInfo *ephyrKbd;
+extern KdPointerInfo *ephyrMouse;
 
 Bool
 ephyrInitialize (KdCardInfo *card, EphyrPriv *priv);
@@ -167,9 +168,9 @@ ephyrShadowUpdate (ScreenPtr pScreen, sh
 void
 ephyrUpdateModifierState(unsigned int state);
 
-extern KdMouseFuncs EphyrMouseFuncs;
+extern KdPointerDriver EphyrMouseDriver;
 
-extern KdKeyboardFuncs	EphyrKeyboardFuncs;
+extern KdKeyboardDriver	EphyrKeyboardDriver;
 
 extern KdOsFuncs   EphyrOsFuncs;
 
diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
index 1aa608e..021abd6 100644
--- a/hw/kdrive/ephyr/ephyrinit.c
+++ b/hw/kdrive/ephyr/ephyrinit.c
@@ -51,7 +51,24 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-  KdInitInput (&EphyrMouseFuncs, &EphyrKeyboardFuncs);
+  KdKeyboardInfo *ki;
+  KdPointerInfo *pi;
+        
+  ki = KdNewKeyboard();
+  if (!ki)
+    FatalError("Couldn't create Xephyr keyboard\n");
+  ki->driver = &EphyrKeyboardDriver;
+  ki->name = KdSaveString("Xephyr virtual keyboard");
+  KdAddKeyboard(ki);
+
+  pi = KdNewPointer();
+  if (!pi)
+    FatalError("Couldn't create Xephyr pointer\n");
+  pi->driver = &EphyrMouseDriver;
+  pi->name = KdSaveString("Xephyr virtual mouse");
+  KdAddPointer(pi);
+
+  KdInitInput();
 }
 
 void
diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
index 32a46dc..b23532f 100644
--- a/hw/kdrive/ephyr/hostx.c
+++ b/hw/kdrive/ephyr/hostx.c
@@ -77,14 +77,8 @@ static EphyrHostXVars HostX = { "?", 0,0
 
 static int            HostXWantDamageDebug = 0;
 
-extern KeySym         EphyrKeymap[];
+extern EphyrKeySyms   ephyrKeySyms;
 
-extern KeySym	      kdKeymap[];
-extern int	      kdMinScanCode;
-extern int	      kdMaxScanCode;
-extern int	      kdMinKeyCode;
-extern int	      kdMaxKeyCode;
-extern int	      kdKeymapWidth;
 extern int            monitorResolution;
 
 static void
@@ -403,9 +397,9 @@ hostx_get_bpp(void)
 }
 
 void
-hostx_get_visual_masks (unsigned long *rmsk, 
-			unsigned long *gmsk, 
-			unsigned long *bmsk)
+hostx_get_visual_masks (CARD32 *rmsk, 
+			CARD32 *gmsk, 
+			CARD32 *bmsk)
 {
   if (host_depth_matches_server())
     {
@@ -681,6 +675,13 @@ hostx_load_keymap(void)
 			       max_keycode - min_keycode + 1,
 			       &host_width);
 
+
+  ephyrKeySyms.map = (KeySym *)calloc(sizeof(KeySym),
+                                      (max_keycode - min_keycode + 1) *
+                                      width);
+  if (!ephyrKeySyms.map)
+        return;
+  
   /* Try and copy the hosts keymap into our keymap to avoid loads
    * of messing around.
    *
@@ -695,13 +696,9 @@ hostx_load_keymap(void)
 
   EPHYR_DBG("keymap width, host:%d kdrive:%d", host_width, width);
   
-  /* all kdrive vars - see kkeymap.c */
-
-  kdMinScanCode = min_keycode;
-  kdMaxScanCode = max_keycode;
-  kdMinKeyCode  = min_keycode;
-  kdMaxKeyCode  = max_keycode;
-  kdKeymapWidth = width;
+  ephyrKeySyms.minKeyCode  = min_keycode;
+  ephyrKeySyms.maxKeyCode  = max_keycode;
+  ephyrKeySyms.mapWidth    = (width > 4) ? 4 : width;
 
   XFree(keymap);
 }
diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h
index d3f6da3..4e3c6af 100644
--- a/hw/kdrive/ephyr/hostx.h
+++ b/hw/kdrive/ephyr/hostx.h
@@ -26,6 +26,9 @@
 #ifndef _XLIBS_STUFF_H_
 #define _XLIBS_STUFF_H_
 
+#include <X11/X.h>
+#include <X11/Xmd.h>
+
 #define EPHYR_WANT_DEBUG 0
 
 #if (EPHYR_WANT_DEBUG)
@@ -48,6 +51,14 @@ typedef enum EphyrHostXEventType 
 } 
 EphyrHostXEventType;
 
+/* I can't believe it's not a KeySymsRec. */
+typedef struct {
+  int             minKeyCode;
+  int             maxKeyCode;
+  int             mapWidth;
+  KeySym         *map;
+} EphyrKeySyms;
+
 struct EphyrHostXEvent
 {
   EphyrHostXEventType type;
@@ -126,9 +137,9 @@ int
 hostx_get_bpp(void);
 
 void
-hostx_get_visual_masks (unsigned long *rmsk, 
-			unsigned long *gmsk, 
-			unsigned long *bmsk);
+hostx_get_visual_masks (CARD32 *rmsk, 
+			CARD32 *gmsk, 
+			CARD32 *bmsk);
 void
 hostx_set_cmap_entry(unsigned char idx, 
 		     unsigned char r, 
diff --git a/hw/kdrive/fake/fake.c b/hw/kdrive/fake/fake.c
index d56512b..ca515f9 100644
--- a/hw/kdrive/fake/fake.c
+++ b/hw/kdrive/fake/fake.c
@@ -158,7 +158,7 @@ Bool
 fakeMapFramebuffer (KdScreenInfo *screen)
 {
     FakeScrPriv	*scrpriv = screen->driver;
-    KdMouseMatrix	m;
+    KdPointerMatrix	m;
     FakePriv		*priv = screen->card->driver;
 
     if (scrpriv->randr != RR_Rotate_0)
@@ -166,9 +166,9 @@ fakeMapFramebuffer (KdScreenInfo *screen
     else
 	scrpriv->shadow = FALSE;
     
-    KdComputeMouseMatrix (&m, scrpriv->randr, screen->width, screen->height);
+    KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height);
     
-    KdSetMouseMatrix (&m);
+    KdSetPointerMatrix (&m);
     
     priv->bytes_per_line = ((screen->width * screen->fb[0].bitsPerPixel + 31) >> 5) << 2;
     if (priv->base)
diff --git a/hw/kdrive/fake/fake.h b/hw/kdrive/fake/fake.h
index 4d90d31..f7c8c34 100644
--- a/hw/kdrive/fake/fake.h
+++ b/hw/kdrive/fake/fake.h
@@ -130,9 +130,9 @@ fakeRandRInit (ScreenPtr pScreen);
 
 #endif
 
-extern KdMouseFuncs FakeMouseFuncs;
+extern KdPointerDriver FakePointerDriver;
 
-extern KdKeyboardFuncs	FakeKeyboardFuncs;
+extern KdKeyboardDriver	FakeKeyboardDriver;
 
 extern KdOsFuncs   FakeOsFuncs;
 
diff --git a/hw/kdrive/fake/fakeinit.c b/hw/kdrive/fake/fakeinit.c
index c5ee4bc..dd88bc5 100644
--- a/hw/kdrive/fake/fakeinit.c
+++ b/hw/kdrive/fake/fakeinit.c
@@ -44,7 +44,22 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&FakeMouseFuncs, &FakeKeyboardFuncs);
+    KdPointerInfo *pi;
+    KdKeyboardInfo *ki;
+
+    pi = KdNewPointer ();
+    if (!pi)
+        return;
+    pi->driver = &FakePointerDriver;
+    KdAddPointer(pi);
+
+    ki = KdNewKeyboard ();
+    if (!ki)
+        return;
+    ki->driver = &FakeKeyboardDriver;
+    KdAddKeyboard(ki);
+
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/fake/kbd.c b/hw/kdrive/fake/kbd.c
index 9cf4de0..db224c9 100644
--- a/hw/kdrive/fake/kbd.c
+++ b/hw/kdrive/fake/kbd.c
@@ -27,7 +27,6 @@
 #include <kdrive-config.h>
 #endif
 #include "fake.h"
-#include "kkeymap.h"
 #include <X11/keysym.h>
 
 #define FAKE_WIDTH  2
@@ -155,41 +154,58 @@ KeySym FakeKeymap[] = {
 /*    116   123 */	 NoSymbol,	NoSymbol,   /* tiny button */
 };
 
-static void
-FakeKeyboardLoad (void)
+static Status
+FakeKeyboardInit (KdKeyboardInfo *ki)
+{
+    ki->keySyms.minKeyCode = 1;
+    ki->keySyms.maxKeyCode = (sizeof (FakeKeymap) / sizeof (FakeKeymap[0])) / FAKE_WIDTH;
+    ki->keySyms.mapWidth = FAKE_WIDTH;
+    if (ki->keySyms.map)
+        xfree(ki->keySyms.map);
+    ki->keySyms.map = (KeySym *)xalloc(sizeof(FakeKeymap));
+    if (!ki->keySyms.map)
+        return BadAlloc;
+    memcpy (ki->keySyms.map, FakeKeymap, sizeof (FakeKeymap));
+
+    return Success;
+}
+
+static Status
+FakeKeyboardEnable (KdKeyboardInfo *ki)
 {
-    kdMinScanCode = 1;
-    kdKeymapWidth = FAKE_WIDTH;
-    kdMaxScanCode = (sizeof (FakeKeymap) / sizeof (FakeKeymap[0])) / FAKE_WIDTH;
-    memcpy (kdKeymap, FakeKeymap, sizeof (FakeKeymap));
+    return Success;
 }
 
-static int
-FakeKeyboardInit (void)
+static void
+FakeKeyboardDisable (KdKeyboardInfo *ki)
 {
-    return 0;
+    return;
 }
 
 static void
-FakeKeyboardFini (void)
+FakeKeyboardFini (KdKeyboardInfo *ki)
 {
+    xfree(ki->keySyms.map);
+    ki->keySyms.map = NULL;
 }
 
 static void
-FakeKeyboardLeds (int leds)
+FakeKeyboardLeds (KdKeyboardInfo *ki, int leds)
 {
 }
 
 static void
-FakeKeyboardBell (int volume, int frequency, int duration)
+FakeKeyboardBell (KdKeyboardInfo *ki, int volume, int frequency, int duration)
 {
 }
 
-KdKeyboardFuncs	FakeKeyboardFuncs = {
-    FakeKeyboardLoad,
+KdKeyboardDriver FakeKeyboardDriver = {
+    "fake",
     FakeKeyboardInit,
+    FakeKeyboardEnable,
     FakeKeyboardLeds,
     FakeKeyboardBell,
+    FakeKeyboardDisable,
     FakeKeyboardFini,
-    0,
+    NULL,
 };
diff --git a/hw/kdrive/fake/mouse.c b/hw/kdrive/fake/mouse.c
index 714a451..beb6ff5 100644
--- a/hw/kdrive/fake/mouse.c
+++ b/hw/kdrive/fake/mouse.c
@@ -35,19 +35,35 @@
 #include "scrnintstr.h"
 #include "kdrive.h"
 
-static Bool
-MouseInit (void)
+static Status
+MouseInit (KdPointerInfo *pi)
 {
-    return TRUE;
+    return Success;
+}
+
+static Status
+MouseEnable (KdPointerInfo *pi)
+{
+    return Success;
+}
+
+static void
+MouseDisable (KdPointerInfo *pi)
+{
+    return;
 }
 
 static void
-MouseFini (void)
+MouseFini (KdPointerInfo *pi)
 {
+    return;
 }
 
 
-KdMouseFuncs FakeMouseFuncs = {
+KdPointerDriver FakePointerDriver = {
+    "fake",
     MouseInit,
+    MouseEnable,
+    MouseDisable,
     MouseFini,
 };
diff --git a/hw/kdrive/fbdev/Makefile.am b/hw/kdrive/fbdev/Makefile.am
index fce6df9..39e9ba4 100644
--- a/hw/kdrive/fbdev/Makefile.am
+++ b/hw/kdrive/fbdev/Makefile.am
@@ -4,8 +4,6 @@ INCLUDES = 					\
 
 noinst_LIBRARIES = libfbdev.a
 
-bin_PROGRAMS = Xfbdev
-
 if TSLIB
 TSLIB_FLAG = -lts
 endif
@@ -14,6 +12,9 @@ libfbdev_a_SOURCES =	\
 	fbdev.c		\
 	fbdev.h
 
+if KDRIVEFBDEV
+bin_PROGRAMS = Xfbdev
+
 Xfbdev_SOURCES = \
 	fbinit.c
 
@@ -26,4 +27,4 @@ Xfbdev_LDADD = 						\
 Xfbdev_DEPENDENCIES =					\
 	libfbdev.a					\
 	@KDRIVE_LIBS@					
-
+endif
diff --git a/hw/kdrive/fbdev/fbdev.c b/hw/kdrive/fbdev/fbdev.c
index 86384f0..8ff32ef 100644
--- a/hw/kdrive/fbdev/fbdev.c
+++ b/hw/kdrive/fbdev/fbdev.c
@@ -323,7 +323,7 @@ Bool
 fbdevMapFramebuffer (KdScreenInfo *screen)
 {
     FbdevScrPriv	*scrpriv = screen->driver;
-    KdMouseMatrix	m;
+    KdPointerMatrix	m;
     FbdevPriv		*priv = screen->card->driver;
 
     if (scrpriv->randr != RR_Rotate_0)
@@ -331,9 +331,9 @@ fbdevMapFramebuffer (KdScreenInfo *scree
     else
 	scrpriv->shadow = FALSE;
     
-    KdComputeMouseMatrix (&m, scrpriv->randr, screen->width, screen->height);
+    KdComputePointerMatrix (&m, scrpriv->randr, screen->width, screen->height);
     
-    KdSetMouseMatrix (&m);
+    KdSetPointerMatrix (&m);
     
     screen->width = priv->var.xres;
     screen->height = priv->var.yres;
diff --git a/hw/kdrive/fbdev/fbinit.c b/hw/kdrive/fbdev/fbinit.c
index ba9d1c6..9d7c492 100644
--- a/hw/kdrive/fbdev/fbinit.c
+++ b/hw/kdrive/fbdev/fbinit.c
@@ -45,10 +45,18 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput (&LinuxMouseFuncs, &LinuxKeyboardFuncs);
-#ifdef TOUCHSCREEN
-    KdAddMouseDriver (&TsFuncs);
+    KdKeyboardInfo *ki;
+
+    KdAddKeyboardDriver (&LinuxKeyboardDriver);
+    KdAddPointerDriver (&LinuxMouseDriver);
+#ifdef TSLIB
+    KdAddPointerDriver (&TsDriver);
 #endif
+
+    ki = KdParseKeyboard ("keybd");
+    KdAddKeyboard(ki);
+
+    KdInitInput ();
 }
 
 void
diff --git a/hw/kdrive/itsy/kbd.c b/hw/kdrive/itsy/kbd.c
index 76062c5..beb4685 100644
--- a/hw/kdrive/itsy/kbd.c
+++ b/hw/kdrive/itsy/kbd.c
@@ -27,7 +27,6 @@
 #include <kdrive-config.h>
 #endif
 #include "itsy.h"
-#include "kkeymap.h"
 #include <X11/keysym.h>
 #include <linux/itsy_buttons.h>
 
@@ -167,28 +166,44 @@ ItsyKeyboardLoad (void)
 {
     KeySym  *k;
 
-    itsyButtonState = 0;
-    kdMinScanCode = 1;
-    kdKeymapWidth = ITSY_WIDTH;
-    kdMaxScanCode = (sizeof (ItsyKeymap) / sizeof (ItsyKeymap[0])) / ITSY_WIDTH;
-    memcpy (kdKeymap, ItsyKeymap, sizeof (ItsyKeymap));
 }
 
-int
-ItsyKeyboardInit (void)
+static Status
+ItsyKeyboardInit (KdKeyboardInfo *ki)
 {
-    int	butPort;
+    if (!ki)
+        return BadImplementation;
+
+    ki->driverPrivate = open ("/dev/buttons", 0);
+
+    itsyButtonState = 0;
+    ki->keySyms.minKeyCode = 1;
+    ki->keySyms.maxKeyCode = (sizeof (ItsyKeymap) / sizeof (ItsyKeymap[0])) / ITSY_WIDTH;
+    ki->minScanCode = ki->keySyms.minKeyCode;
+    ki->maxScanCode = ki->keySyms.maxKeyCode;
+    ki->keySyms.mapWidth = ITSY_WIDTH;
+
+    if (ki->keySyms.map)
+        xfree(ki->keySyms.map);
+    ki->keySyms.map = xalloc(sizeof(ItsyKeymap));
+    if (!ki->keySyms.map)
+        return BadAlloc;
+    memcpy (kdKeymap, ItsyKeymap, sizeof (ItsyKeymap));
 
-    butPort = open ("/dev/buttons", 0);
-    fprintf (stderr, "butPort %d\n", butPort);
-    return butPort;
+    return Success;
 }
 
-void
-ItsyKeyboardFini (int fd)
+static void
+ItsyKeyboardDisable (KdKeybdInfo *ki)
 {
     if (fd >= 0)
-	close (fd);
+	close ((int)ki->driverPrivate);
+}
+
+static void
+ItsyKeyboardFini (KdKeybdInfo *ki)
+{
+    return;
 }
 
 void
@@ -227,11 +242,13 @@ ItsyKeyboardBell (int volume, int freque
 }
 
 KdKeyboardFuncs	itsyKeyboardFuncs = {
-    ItsyKeyboardLoad,
+    "itsy",
     ItsyKeyboardInit,
+    ItsyKeyboardEnable,
     ItsyKeyboardRead,
     ItsyKeyboardLeds,
     ItsyKeyboardBell,
+    ItsyKeyboardDisable
     ItsyKeyboardFini,
-    0,
+    NULL,
 };
diff --git a/hw/kdrive/itsy/ts.c b/hw/kdrive/itsy/ts.c
index c773c0e..180d1fd 100644
--- a/hw/kdrive/itsy/ts.c
+++ b/hw/kdrive/itsy/ts.c
@@ -63,7 +63,7 @@ itsyTsReadBytes (int fd, char *buf, int 
 }
 
 void
-itsyTsRead (int tsPort)
+itsyTsRead (KdPointerInfo *pi, int tsPort)
 {
     ts_event	    event;
     long	    buf[3];
@@ -89,7 +89,7 @@ itsyTsRead (int tsPort)
 	    x = 0;
 	    y = 0;
 	}
-	KdEnqueueMouseEvent (flags, x, y);
+	KdEnqueuePointerEvent (pi, flags, x, y, 0);
     }
 }
 
@@ -204,7 +204,8 @@ itsyTsFini (int tsPort)
 	close (tsPort);
 }
 
-KdMouseFuncs itsyTsMouseFuncs = {
+KdPointerDriver itsyTsMouseDriver = {
+    "itsyts",
     itsyTsInit,
     itsyTsRead,
     itsyTsFini
diff --git a/hw/kdrive/linux/bus.c b/hw/kdrive/linux/bus.c
index be61f89..8cf5f90 100644
--- a/hw/kdrive/linux/bus.c
+++ b/hw/kdrive/linux/bus.c
@@ -55,7 +55,7 @@ BusRead (int adbPort, void *closure)
 	    flags |= KD_BUTTON_2;
 	if ((buf[0] & 1) == 0)
 	    flags |= KD_BUTTON_3;
-        KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy);
+        KdEnqueuePointerEvent (closure, flags, dx, dy, 0);
     }
 }
 
@@ -66,36 +66,71 @@ char	*BusNames[] = {
 
 #define NUM_BUS_NAMES	(sizeof (BusNames) / sizeof (BusNames[0]))
 
-int	BusInputType;
+static int
+BusInit (KdPointerInfo *pi)
+{
+    int	    i, fd = 0;
+
+    if (!pi->path || (strcmp(pi->path, "auto") == 0))
+    {
+        for (i = 0; i < NUM_BUS_NAMES; i++)
+        {
+            if ((fd = open (BusNames[i], 0)) > 0)
+            {
+                close(fd);
+                if (pi->path)
+                    xfree(pi->path);
+                pi->path = KdSaveString(BusNames[i]);
+                return Success;
+            }
+        }
+    }
+    else
+    {
+        if ((fd = open(pi->path, 0)) > 0)
+        {
+            close(fd);
+            return Success;
+        }
+    }
+
+    return !Success;
+}
 
 static int
-BusInit (void)
+BusEnable (KdPointerInfo *pi)
 {
-    int	    i;
-    int	    busPort;
-    int	    n = 0;
-
-    if (!BusInputType)
-	BusInputType = KdAllocInputType ();
-    
-    for (i = 0; i < NUM_BUS_NAMES; i++)
+    int fd = open(pi->path, 0);
+
+    if (fd > 0)
+    {
+        KdRegisterFd(fd, BusRead, pi);
+        pi->driverPrivate = (void *)fd;
+        return Success;
+    }
+    else
     {
-	busPort = open (BusNames[i], 0);
-	{
-	    KdRegisterFd (BusInputType, busPort, BusRead, 0);
-	    n++;
-	}
+        return !Success;
     }
-    return n;
 }
 
 static void
-BusFini (void)
+BusDisable (KdPointerInfo *pi)
+{
+    KdUnregisterFd(pi, (int)pi->driverPrivate, TRUE);
+}
+
+static void
+BusFini (KdPointerInfo *pi)
 {
-    KdUnregisterFds (BusInputType, TRUE);
+    return;
 }
 
-KdMouseFuncs BusMouseFuncs = {
+KdPointerDriver BusMouseDriver = {
+    "bus",
     BusInit,
-    BusFini
+    BusEnable,
+    BusDisable,
+    BusFini,
+    NULL
 };
diff --git a/hw/kdrive/linux/evdev.c b/hw/kdrive/linux/evdev.c
index d83b13a..6c08cfa 100644
--- a/hw/kdrive/linux/evdev.c
+++ b/hw/kdrive/linux/evdev.c
@@ -43,98 +43,100 @@
 #define ISBITSET(x,y) ((x)[LONG(y)] & BIT(y))
 #define OFF(x)   ((x)%BITS_PER_LONG)
 #define LONG(x)  ((x)/BITS_PER_LONG)
-#define BIT(x)	 (1 << OFF(x))
+#define BIT(x)         (1 << OFF(x))
 #define SETBIT(x,y) ((x)[LONG(y)] |= BIT(y))
 #define CLRBIT(x,y) ((x)[LONG(y)] &= ~BIT(y))
 #define ASSIGNBIT(x,y,z)    ((x)[LONG(y)] = ((x)[LONG(y)] & ~BIT(y)) | (z << OFF(y)))
 
 typedef struct _kevdevMouse {
     /* current device state */
-    int			    rel[REL_MAX + 1];
-    int			    abs[ABS_MAX + 1];
-    int			    prevabs[ABS_MAX + 1];
-    long		    key[NBITS(KEY_MAX + 1)];
+    int                            rel[REL_MAX + 1];
+    int                            abs[ABS_MAX + 1];
+    int                            prevabs[ABS_MAX + 1];
+    long                    key[NBITS(KEY_MAX + 1)];
     
     /* supported device info */
-    long		    relbits[NBITS(REL_MAX + 1)];
-    long		    absbits[NBITS(ABS_MAX + 1)];
-    long		    keybits[NBITS(KEY_MAX + 1)];
+    long                    relbits[NBITS(REL_MAX + 1)];
+    long                    absbits[NBITS(ABS_MAX + 1)];
+    long                    keybits[NBITS(KEY_MAX + 1)];
     struct input_absinfo    absinfo[ABS_MAX + 1];
-    int			    max_rel;
-    int			    max_abs;
+    int                            max_rel;
+    int                            max_abs;
+
+    int                     fd;
 } Kevdev;
 
 static void
-EvdevMotion (KdMouseInfo    *mi)
+EvdevMotion (KdPointerInfo    *pi)
 {
-    Kevdev		*ke = mi->driver;
-    int			i;
+    Kevdev                *ke = pi->driverPrivate;
+    int                        i;
 
     for (i = 0; i <= ke->max_rel; i++)
-	if (ke->rel[i])
-	{
-	    int a;
-	    ErrorF ("rel");
-	    for (a = 0; a <= ke->max_rel; a++)
-	    {
-		if (ISBITSET (ke->relbits, a))
-		    ErrorF (" %d=%d", a, ke->rel[a]);
-		ke->rel[a] = 0;
-	    }
-	    ErrorF ("\n");
-	    break;
-	}
+        if (ke->rel[i])
+        {
+            int a;
+            ErrorF ("rel");
+            for (a = 0; a <= ke->max_rel; a++)
+            {
+                if (ISBITSET (ke->relbits, a))
+                    ErrorF (" %d=%d", a, ke->rel[a]);
+                ke->rel[a] = 0;
+            }
+            ErrorF ("\n");
+            break;
+        }
     for (i = 0; i < ke->max_abs; i++)
-	if (ke->abs[i] != ke->prevabs[i])
-	{
-	    int a;
-	    ErrorF ("abs");
-	    for (a = 0; a <= ke->max_abs; a++)
-	    {
-		if (ISBITSET (ke->absbits, a))
-		    ErrorF (" %d=%d", a, ke->abs[a]);
-		ke->prevabs[a] = ke->abs[a];
-	    }
-	    ErrorF ("\n");
-	    break;
-	}
+        if (ke->abs[i] != ke->prevabs[i])
+        {
+            int a;
+            ErrorF ("abs");
+            for (a = 0; a <= ke->max_abs; a++)
+            {
+                if (ISBITSET (ke->absbits, a))
+                    ErrorF (" %d=%d", a, ke->abs[a]);
+                ke->prevabs[a] = ke->abs[a];
+            }
+            ErrorF ("\n");
+            break;
+        }
 }
 
 static void
 EvdevRead (int evdevPort, void *closure)
 {
-    KdMouseInfo		*mi = closure;
-    Kevdev		*ke = mi->driver;
-    int			i;
-    struct input_event	events[NUM_EVENTS];
-    int			n;
+    KdPointerInfo                *pi = closure;
+    Kevdev                       *ke = pi->driverPrivate;
+    int                        i;
+    struct input_event        events[NUM_EVENTS];
+    int                        n;
 
     n = read (evdevPort, &events, NUM_EVENTS * sizeof (struct input_event));
     if (n <= 0)
-	return;
+        return;
     n /= sizeof (struct input_event);
     for (i = 0; i < n; i++)
     {
-	switch (events[i].type) {
-	case EV_SYN:
-	    break;
-	case EV_KEY:
-	    EvdevMotion (mi);
-	    ASSIGNBIT(ke->key,events[i].code, events[i].value);
-	    if (events[i].code < 0x100)
-		ErrorF ("key %d %d\n", events[i].code, events[i].value);
-	    else
-		ErrorF ("key 0x%x %d\n", events[i].code, events[i].value);
-	    break;
-	case EV_REL:
-	    ke->rel[events[i].code] += events[i].value;
-	    break;
-	case EV_ABS:
-	    ke->abs[events[i].code] = events[i].value;
-	    break;
-	}
+        switch (events[i].type) {
+        case EV_SYN:
+            break;
+        case EV_KEY:
+            EvdevMotion (pi);
+            ASSIGNBIT(ke->key,events[i].code, events[i].value);
+            if (events[i].code < 0x100)
+                ErrorF ("key %d %d\n", events[i].code, events[i].value);
+            else
+                ErrorF ("key 0x%x %d\n", events[i].code, events[i].value);
+            break;
+        case EV_REL:
+            ke->rel[events[i].code] += events[i].value;
+            break;
+        case EV_ABS:
+            ke->abs[events[i].code] = events[i].value;
+            break;
+        }
     }
-    EvdevMotion (mi);
+    EvdevMotion (pi);
 }
 
 int EvdevInputType;
@@ -148,143 +150,153 @@ char *kdefaultEvdev[] =  {
 
 #define NUM_DEFAULT_EVDEV    (sizeof (kdefaultEvdev) / sizeof (kdefaultEvdev[0]))
 
-static Bool
-EvdevInit (void)
+static Status
+EvdevInit (KdPointerInfo *pi)
 {
-    int		i;
-    int		fd;
-    KdMouseInfo	*mi, *next;
-    int		n = 0;
-    char	*prot;
+    int                i;
+    int                fd;
+    int                n = 0;
+    char        *prot;
+
+    if (!pi->path) {
+        for (i = 0; i < NUM_DEFAULT_EVDEV; i++) {
+            fd = open (kdefaultEvdev[i], 2);
+                if (fd >= 0) {
+                    pi->path = KdSaveString (kdefaultEvdev[i]);
+                    break;
+                }
+            }
+    }
+    else {
+        fd = open (pi->path, 2);
+        if (fd < 0) {
+            ErrorF("Failed to open evdev device %s\n", pi->path);
+            return BadMatch;
+        }
+    }
 
-    if (!EvdevInputType)
-	EvdevInputType = KdAllocInputType ();
+    return Success;
+}
 
-    for (mi = kdMouseInfo; mi; mi = next)
+static Status
+EvdevEnable (KdPointerInfo *pi)
+{        
+    int fd;
+
+    if (!pi || !pi->path)
+        return BadImplementation;
+
+    fd = open(pi->path, 2);
+    if (fd < 0)
+        return BadMatch;
+
+    unsigned long   ev[NBITS(EV_MAX)];
+    Kevdev            *ke;
+        
+    if (ioctl (fd, EVIOCGBIT(0 /*EV*/, sizeof (ev)), ev) < 0)
+    {
+        perror ("EVIOCGBIT 0");
+        close (fd);
+        return BadMatch;
+    }
+    ke = xalloc (sizeof (Kevdev));
+    if (!ke)
     {
-	next = mi->next;
-	prot = mi->prot;
-	if (mi->inputType)
-	    continue;
-	if (!mi->name)
-	{
-	    for (i = 0; i < NUM_DEFAULT_EVDEV; i++)
-	    {
-		fd = open (kdefaultEvdev[i], 2);
-		if (fd >= 0)
-		{
-		    mi->name = KdSaveString (kdefaultEvdev[i]);
-		    break;
-		}
-	    }
-	}
-	else
-	    fd = open (mi->name, 2);
-	    
-	if (fd >= 0)
-	{
-	    unsigned long   ev[NBITS(EV_MAX)];
-	    Kevdev	    *ke;
-	    
-	    if (ioctl (fd, EVIOCGBIT(0 /*EV*/, sizeof (ev)), ev) < 0)
-	    {
-		perror ("EVIOCGBIT 0");
-		close (fd);
-		continue;
-	    }
-	    ke = xalloc (sizeof (Kevdev));
-	    if (!ke)
-	    {
-		close (fd);
-		continue;
-	    }
-	    memset (ke, '\0', sizeof (Kevdev));
-	    if (ISBITSET (ev, EV_KEY))
-	    {
-		if (ioctl (fd, EVIOCGBIT (EV_KEY, sizeof (ke->keybits)),
-			   ke->keybits) < 0)
-		{
-		    perror ("EVIOCGBIT EV_KEY");
-		    xfree (ke);
-		    close (fd);
-		    continue;
-		}
-	    }
-	    if (ISBITSET (ev, EV_REL))
-	    {
-		if (ioctl (fd, EVIOCGBIT (EV_REL, sizeof (ke->relbits)),
-			   ke->relbits) < 0)
-		{
-		    perror ("EVIOCGBIT EV_REL");
-		    xfree (ke);
-		    close (fd);
-		    continue;
-		}
-		for (ke->max_rel = REL_MAX; ke->max_rel >= 0; ke->max_rel--)
-		    if (ISBITSET(ke->relbits, ke->max_rel))
-			break;
-	    }
-	    if (ISBITSET (ev, EV_ABS))
-	    {
-		int i;
-
-		if (ioctl (fd, EVIOCGBIT (EV_ABS, sizeof (ke->absbits)),
-			   ke->absbits) < 0)
-		{
-		    perror ("EVIOCGBIT EV_ABS");
-		    xfree (ke);
-		    close (fd);
-		    continue;
-		}
-		for (ke->max_abs = ABS_MAX; ke->max_abs >= 0; ke->max_abs--)
-		    if (ISBITSET(ke->absbits, ke->max_abs))
-			break;
-		for (i = 0; i <= ke->max_abs; i++)
-		{
-		    if (ISBITSET (ke->absbits, i))
-			if (ioctl (fd, EVIOCGABS(i), &ke->absinfo[i]) < 0)
-			{
-			    perror ("EVIOCGABS");
-			    break;
-			}
-		    ke->prevabs[i] = ABS_UNSET;
-		}
-		if (i <= ke->max_abs)
-		{
-		    xfree (ke);
-		    close (fd);
-		    continue;
-		}
-	    }
-	    mi->driver = ke;
-	    mi->inputType = EvdevInputType;
-	    if (KdRegisterFd (EvdevInputType, fd, EvdevRead, (void *) mi))
-		n++;
-	}
+        close (fd);
+        return BadAlloc;
     }
-    return TRUE;
+    memset (ke, '\0', sizeof (Kevdev));
+    if (ISBITSET (ev, EV_KEY))
+    {
+        if (ioctl (fd, EVIOCGBIT (EV_KEY, sizeof (ke->keybits)),
+                   ke->keybits) < 0)
+        {
+            perror ("EVIOCGBIT EV_KEY");
+            xfree (ke);
+            close (fd);
+            return BadMatch;
+        }
+    }
+    if (ISBITSET (ev, EV_REL))
+    {
+        if (ioctl (fd, EVIOCGBIT (EV_REL, sizeof (ke->relbits)),
+                       ke->relbits) < 0)
+        {
+            perror ("EVIOCGBIT EV_REL");
+            xfree (ke);
+            close (fd);
+            return BadMatch;
+        }
+        for (ke->max_rel = REL_MAX; ke->max_rel >= 0; ke->max_rel--)
+            if (ISBITSET(ke->relbits, ke->max_rel))
+                break;
+    }
+    if (ISBITSET (ev, EV_ABS))
+    {
+        int i;
+
+        if (ioctl (fd, EVIOCGBIT (EV_ABS, sizeof (ke->absbits)),
+                   ke->absbits) < 0)
+            {
+            perror ("EVIOCGBIT EV_ABS");
+            xfree (ke);
+            close (fd);
+            return BadMatch;
+        }
+        for (ke->max_abs = ABS_MAX; ke->max_abs >= 0; ke->max_abs--)
+            if (ISBITSET(ke->absbits, ke->max_abs))
+                break;
+        for (i = 0; i <= ke->max_abs; i++)
+        {
+            if (ISBITSET (ke->absbits, i))
+                if (ioctl (fd, EVIOCGABS(i), &ke->absinfo[i]) < 0)
+                {
+                    perror ("EVIOCGABS");
+                    break;
+                }
+            ke->prevabs[i] = ABS_UNSET;
+        }
+        if (i <= ke->max_abs)
+        {
+            xfree (ke);
+            close (fd);
+            return BadValue;
+        }
+    }
+    if (!KdRegisterFd (fd, EvdevRead, pi)) {
+        xfree (ke);
+        close (fd);
+        return BadAlloc;
+    }
+    pi->driverPrivate = ke;
+    return Success;
 }
 
 static void
-EvdevFini (void)
+EvdevDisable (KdPointerInfo *pi)
 {
-    KdMouseInfo	*mi;
+    Kevdev              *ke;
 
-    KdUnregisterFds (EvdevInputType, TRUE);
-    for (mi = kdMouseInfo; mi; mi = mi->next)
-    {
-	if (mi->inputType == EvdevInputType)
-	{
-	    xfree (mi->driver);
-	    mi->driver = 0;
-	    mi->inputType = 0;
-	}
-    }
+    if (!pi || !pi->driverPrivate)
+        return;
+
+    KdUnregisterFd (pi, ke->fd, TRUE);
+    xfree (ke);
+    pi->driverPrivate = 0;
+}
+
+static void
+EvdevFini (KdPointerInfo *pi)
+{
 }
 
-KdMouseFuncs LinuxEvdevMouseFuncs = {
+KdPointerDriver LinuxEvdevMouseDriver = {
+    "evdev",
     EvdevInit,
+    EvdevEnable,
+    EvdevDisable,
     EvdevFini,
+    NULL,
 };
 
 #if 0
diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c
index cfafbb3..9400e6b 100644
--- a/hw/kdrive/linux/keyboard.c
+++ b/hw/kdrive/linux/keyboard.c
@@ -2,31 +2,40 @@
  * $RCSId: xc/programs/Xserver/hw/kdrive/linux/keyboard.c,v 1.10 2001/11/08 10:26:24 keithp Exp $
  *
  * Copyright © 1999 Keith Packard
+ * XKB integration © 2006 Nokia Corporation, author: Tomas Frydrych <tf at o-hand.com>
  *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * LinuxKeyboardRead() XKB code based on xf86KbdLnx.c:
+ * Copyright © 1990,91 by Thomas Roell, Dinkelscherben, Germany.
+ * Copyright © 1994-2001 by The XFree86 Project, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Except as contained in this notice, the name of the copyright holder(s)
+ * and author(s) shall not be used in advertising or otherwise to promote
+ * the sale, use or other dealings in this Software without prior written
+ * authorization from the copyright holder(s) and author(s).
  */
 
 #ifdef HAVE_CONFIG_H
 #include <kdrive-config.h>
 #endif
 #include "kdrive.h"
-#include "kkeymap.h"
 #include <linux/keyboard.h>
 #include <linux/kd.h>
 #define XK_PUBLISHING
@@ -34,7 +43,7 @@
 #include <termios.h>
 #include <sys/ioctl.h>
 
-extern int  LinuxConsoleFd;
+extern int LinuxConsoleFd;
 
 static const KeySym linux_to_x[256] = {
 	NoSymbol,	NoSymbol,	NoSymbol,	NoSymbol,
@@ -103,7 +112,108 @@ static const KeySym linux_to_x[256] = {
 	XK_udiaeresis,	XK_yacute,	XK_thorn,	XK_ydiaeresis
 };
 
-static unsigned char tbl[KD_MAX_WIDTH] = 
+#ifdef XKB
+/*
+ * Getting a keycode from scancode
+ *
+ * With XKB
+ * --------
+ *
+ * We have to enqueue keyboard events using standard X keycodes which correspond
+ * to AT scancode + 8; this means that we need to translate the Linux scancode
+ * provided by the kernel to an AT scancode -- this translation is not linear
+ * and requires that we use a LUT.
+ *
+ *
+ * Without XKB
+ * -----------
+ *
+ * We can use custom keycodes, which makes things simpler; we define our custom
+ * keycodes as Linux scancodes + KD_KEY_OFFSET
+*/
+
+/*
+   This LUT translates AT scancodes into Linux ones -- the keymap we create
+   for the core X keyboard protocol has to be AT-scancode based so that it
+   corresponds to the Xkb keymap.
+*/
+static unsigned char at2lnx[] =
+{
+	0x0,    /* no valid scancode */
+	0x01,	/* KEY_Escape */	0x02,	/* KEY_1 */
+	0x03,	/* KEY_2 */		0x04,	/* KEY_3 */
+	0x05,	/* KEY_4 */		0x06,	/* KEY_5 */
+	0x07,	/* KEY_6 */		0x08,	/* KEY_7 */
+	0x09,	/* KEY_8 */		0x0a,	/* KEY_9 */
+	0x0b,	/* KEY_0 */		0x0c,	/* KEY_Minus */
+	0x0d,	/* KEY_Equal */		0x0e,	/* KEY_BackSpace */
+	0x0f,	/* KEY_Tab */		0x10,	/* KEY_Q */
+	0x11,	/* KEY_W */		0x12,	/* KEY_E */
+	0x13,	/* KEY_R */		0x14,	/* KEY_T */
+	0x15,	/* KEY_Y */		0x16,	/* KEY_U */
+	0x17,	/* KEY_I */		0x18,	/* KEY_O */
+	0x19,	/* KEY_P */		0x1a,	/* KEY_LBrace */
+	0x1b,	/* KEY_RBrace */	0x1c,	/* KEY_Enter */
+	0x1d,	/* KEY_LCtrl */		0x1e,	/* KEY_A */
+	0x1f,	/* KEY_S */		0x20,	/* KEY_D */
+	0x21,	/* KEY_F */		0x22,	/* KEY_G */
+	0x23,	/* KEY_H */		0x24,	/* KEY_J */
+	0x25,	/* KEY_K */		0x26,	/* KEY_L */
+	0x27,	/* KEY_SemiColon */	0x28,	/* KEY_Quote */
+	0x29,	/* KEY_Tilde */		0x2a,	/* KEY_ShiftL */
+	0x2b,	/* KEY_BSlash */	0x2c,	/* KEY_Z */
+	0x2d,	/* KEY_X */		0x2e,	/* KEY_C */
+	0x2f,	/* KEY_V */		0x30,	/* KEY_B */
+	0x31,	/* KEY_N */		0x32,	/* KEY_M */
+	0x33,	/* KEY_Comma */		0x34,	/* KEY_Period */
+	0x35,	/* KEY_Slash */		0x36,	/* KEY_ShiftR */
+	0x37,	/* KEY_KP_Multiply */	0x38,	/* KEY_Alt */
+	0x39,	/* KEY_Space */		0x3a,	/* KEY_CapsLock */
+	0x3b,	/* KEY_F1 */		0x3c,	/* KEY_F2 */
+	0x3d,	/* KEY_F3 */		0x3e,	/* KEY_F4 */
+	0x3f,	/* KEY_F5 */		0x40,	/* KEY_F6 */
+	0x41,	/* KEY_F7 */		0x42,	/* KEY_F8 */
+	0x43,	/* KEY_F9 */		0x44,	/* KEY_F10 */
+	0x45,	/* KEY_NumLock */	0x46,	/* KEY_ScrollLock */
+	0x47,	/* KEY_KP_7 */		0x48,	/* KEY_KP_8 */
+	0x49,	/* KEY_KP_9 */		0x4a,	/* KEY_KP_Minus */
+	0x4b,	/* KEY_KP_4 */		0x4c,	/* KEY_KP_5 */
+	0x4d,	/* KEY_KP_6 */		0x4e,	/* KEY_KP_Plus */
+	0x4f,	/* KEY_KP_1 */		0x50,	/* KEY_KP_2 */
+	0x51,	/* KEY_KP_3 */		0x52,	/* KEY_KP_0 */
+	0x53,	/* KEY_KP_Decimal */	0x54,	/* KEY_SysReqest */
+	0x00,	/* 0x55 */		0x56,	/* KEY_Less */
+	0x57,	/* KEY_F11 */		0x58,	/* KEY_F12 */
+	0x66,	/* KEY_Home */		0x67,	/* KEY_Up */
+	0x68,	/* KEY_PgUp */		0x69,	/* KEY_Left */
+	0x5d,	/* KEY_Begin */		0x6a,	/* KEY_Right */
+	0x6b,	/* KEY_End */		0x6c,	/* KEY_Down */
+	0x6d,	/* KEY_PgDown */	0x6e,	/* KEY_Insert */
+	0x6f,	/* KEY_Delete */	0x60,	/* KEY_KP_Enter */
+	0x61,	/* KEY_RCtrl */		0x77,	/* KEY_Pause */
+	0x63,	/* KEY_Print */		0x62,	/* KEY_KP_Divide */
+	0x64,	/* KEY_AltLang */	0x65,	/* KEY_Break */
+	0x00,	/* KEY_LMeta */		0x00,	/* KEY_RMeta */
+	0x7A,	/* KEY_Menu/FOCUS_PF11*/0x00,	/* 0x6e */
+	0x7B,	/* FOCUS_PF12 */	0x00,	/* 0x70 */
+	0x00,	/* 0x71 */		0x00,	/* 0x72 */
+	0x59,	/* FOCUS_PF2 */		0x78,	/* FOCUS_PF9 */
+	0x00,	/* 0x75 */		0x00,	/* 0x76 */
+	0x5A,	/* FOCUS_PF3 */		0x5B,	/* FOCUS_PF4 */
+	0x5C,	/* FOCUS_PF5 */		0x5D,	/* FOCUS_PF6 */
+	0x5E,	/* FOCUS_PF7 */		0x5F,	/* FOCUS_PF8 */
+	0x7C,	/* JAP_86 */		0x79,	/* FOCUS_PF10 */
+	0x00,	/* 0x7f */
+};
+
+#define NUM_AT_KEYS (sizeof(at2lnx)/sizeof(at2lnx[0]))
+#define LNX_KEY_INDEX(n) n < NUM_AT_KEYS ? at2lnx[n] : 0
+
+#else /* not XKB */
+#define LNX_KEY_INDEX(n) n
+#endif
+
+static unsigned char tbl[KD_MAX_WIDTH] =
 {
     0,
     1 << KG_SHIFT,
@@ -112,24 +222,31 @@ static unsigned char tbl[KD_MAX_WIDTH] =
 };
 
 static void
-readKernelMapping(void)
+readKernelMapping(KdKeyboardInfo *ki)
 {
     KeySym	    *k;
     int		    i, j;
     struct kbentry  kbe;
     int		    minKeyCode, maxKeyCode;
     int		    row;
+    int             fd;
+
+    if (!ki)
+        return;
 
+    fd = LinuxConsoleFd;
+    
     minKeyCode = NR_KEYS;
     maxKeyCode = 0;
     row = 0;
+    ki->keySyms.mapWidth = KD_MAX_WIDTH;
     for (i = 0; i < NR_KEYS && row < KD_MAX_LENGTH; ++i)
     {
-	kbe.kb_index = i;
+        kbe.kb_index = LNX_KEY_INDEX(i);
 
-        k = kdKeymap + row * KD_MAX_WIDTH;
+        k = ki->keySyms.map + row * ki->keySyms.mapWidth;
 	
-	for (j = 0; j < KD_MAX_WIDTH; ++j)
+	for (j = 0; j < ki->keySyms.mapWidth; ++j)
 	{
 	    unsigned short kval;
 
@@ -137,7 +254,7 @@ readKernelMapping(void)
 
 	    kbe.kb_table = tbl[j];
 	    kbe.kb_value = 0;
-	    if (ioctl(LinuxConsoleFd, KDGKBENT, &kbe))
+	    if (ioctl(fd, KDGKBENT, &kbe))
 		continue;
 
 	    kval = KVAL(kbe.kb_value);
@@ -362,7 +479,7 @@ readKernelMapping(void)
 
 	if (minKeyCode == NR_KEYS)
 	    continue;
-	
+
 	if (k[3] == k[2]) k[3] = NoSymbol;
 	if (k[2] == k[1]) k[2] = NoSymbol;
 	if (k[1] == k[0]) k[1] = NoSymbol;
@@ -370,28 +487,212 @@ readKernelMapping(void)
 	if (k[3] == k[0] && k[2] == k[1] && k[2] == NoSymbol) k[3] =NoSymbol;
 	row++;
     }
-    kdMinScanCode = minKeyCode;
-    kdMaxScanCode = maxKeyCode;
+    ki->minScanCode = minKeyCode;
+    ki->maxScanCode = maxKeyCode;
 }
 
-static void
-LinuxKeyboardLoad (void)
-{
-    readKernelMapping ();
-}
+#ifdef XKB
+
+/*
+ * We need these to handle extended scancodes correctly (I could just use the
+ * numbers below, but this makes the code more readable
+ */
+
+/* The prefix codes */
+#define KEY_Prefix0      /* special               0x60  */   96
+#define KEY_Prefix1      /* special               0x61  */   97
+
+/* The raw scancodes */
+#define KEY_Enter        /* Enter                 0x1c  */   28
+#define KEY_LCtrl        /* Ctrl(left)            0x1d  */   29
+#define KEY_Slash        /* / (Slash)   ?         0x35  */   53
+#define KEY_KP_Multiply  /* *                     0x37  */   55
+#define KEY_Alt          /* Alt(left)             0x38  */   56
+#define KEY_F3           /* F3                    0x3d  */   61
+#define KEY_F4           /* F4                    0x3e  */   62
+#define KEY_F5           /* F5                    0x3f  */   63
+#define KEY_F6           /* F6                    0x40  */   64
+#define KEY_F7           /* F7                    0x41  */   65
+#define KEY_ScrollLock   /* ScrollLock            0x46  */   70
+#define KEY_KP_7         /* 7           Home      0x47  */   71
+#define KEY_KP_8         /* 8           Up        0x48  */   72
+#define KEY_KP_9         /* 9           PgUp      0x49  */   73
+#define KEY_KP_Minus     /* - (Minus)             0x4a  */   74
+#define KEY_KP_4         /* 4           Left      0x4b  */   75
+#define KEY_KP_5         /* 5                     0x4c  */   76
+#define KEY_KP_6         /* 6           Right     0x4d  */   77
+#define KEY_KP_Plus      /* + (Plus)              0x4e  */   78
+#define KEY_KP_1         /* 1           End       0x4f  */   79
+#define KEY_KP_2         /* 2           Down      0x50  */   80
+#define KEY_KP_3         /* 3           PgDown    0x51  */   81
+#define KEY_KP_0         /* 0           Insert    0x52  */   82
+#define KEY_KP_Decimal   /* . (Decimal) Delete    0x53  */   83
+#define KEY_Home         /* Home                  0x59  */   89
+#define KEY_Up           /* Up                    0x5a  */   90
+#define KEY_PgUp         /* PgUp                  0x5b  */   91
+#define KEY_Left         /* Left                  0x5c  */   92
+#define KEY_Begin        /* Begin                 0x5d  */   93
+#define KEY_Right        /* Right                 0x5e  */   94
+#define KEY_End          /* End                   0x5f  */   95
+#define KEY_Down         /* Down                  0x60  */   96
+#define KEY_PgDown       /* PgDown                0x61  */   97
+#define KEY_Insert       /* Insert                0x62  */   98
+#define KEY_Delete       /* Delete                0x63  */   99
+#define KEY_KP_Enter     /* Enter                 0x64  */  100
+#define KEY_RCtrl        /* Ctrl(right)           0x65  */  101
+#define KEY_Pause        /* Pause                 0x66  */  102
+#define KEY_Print        /* Print                 0x67  */  103
+#define KEY_KP_Divide    /* Divide                0x68  */  104
+#define KEY_AltLang      /* AtlLang(right)        0x69  */  105
+#define KEY_Break        /* Break                 0x6a  */  106
+#define KEY_LMeta        /* Left Meta             0x6b  */  107
+#define KEY_RMeta        /* Right Meta            0x6c  */  108
+#define KEY_Menu         /* Menu                  0x6d  */  109
+#define KEY_F13          /* F13                   0x6e  */  110
+#define KEY_F14          /* F14                   0x6f  */  111
+#define KEY_F15          /* F15                   0x70  */  112
+#define KEY_F16          /* F16                   0x71  */  113
+#define KEY_F17          /* F17                   0x72  */  114
+#define KEY_KP_DEC       /* KP_DEC                0x73  */  115
+
+#endif /* XKB */
+
 
 static void
 LinuxKeyboardRead (int fd, void *closure)
 {
     unsigned char   buf[256], *b;
     int		    n;
+    unsigned char   prefix = 0, scancode = 0;
 
-    while ((n = read (fd, buf, sizeof (buf))) > 0)
-    {
+    while ((n = read (fd, buf, sizeof (buf))) > 0) {
 	b = buf;
-	while (n--)
-	{
-	    KdEnqueueKeyboardEvent (b[0] & 0x7f, b[0] & 0x80);
+	while (n--) {
+#ifdef XKB
+            if (!noXkbExtension) {
+                /*
+                 * With xkb we use RAW mode for reading the console, which allows us
+                 * process extended scancodes.
+                 *
+                 * See if this is a prefix extending the following keycode
+                 */
+                if (!prefix && ((b[0] & 0x7f) == KEY_Prefix0))
+                {
+                        prefix = KEY_Prefix0;
+                        ErrorF("Prefix0");
+                        /* swallow this up */
+                        b++;
+                        continue;
+                }
+                else if (!prefix && ((b[0] & 0x7f) == KEY_Prefix1))
+                {
+                        prefix = KEY_Prefix1;
+                        ErrorF("Prefix1");
+                        /* swallow this up */
+                        b++;
+                        continue;
+                }
+                scancode  = b[0] & 0x7f;
+
+                switch (prefix) {
+                        /* from xf86Events.c */
+                        case KEY_Prefix0:
+                        {
+                            ErrorF("Prefix0 scancode: 0x%02x\n", scancode);
+                            switch (scancode) {
+                                case KEY_KP_7:
+                                    scancode = KEY_Home;      break;  /* curs home */
+                                case KEY_KP_8:
+                                    scancode = KEY_Up;        break;  /* curs up */
+                                case KEY_KP_9:
+                                    scancode = KEY_PgUp;      break;  /* curs pgup */
+                                case KEY_KP_4:
+                                    scancode = KEY_Left;      break;  /* curs left */
+                                case KEY_KP_5:
+                                    scancode = KEY_Begin;     break;  /* curs begin */
+                                case KEY_KP_6:
+                                    scancode = KEY_Right;     break;  /* curs right */
+                                case KEY_KP_1:
+                                    scancode = KEY_End;       break;  /* curs end */
+                                case KEY_KP_2:
+                                    scancode = KEY_Down;      break;  /* curs down */
+                                case KEY_KP_3:
+                                    scancode = KEY_PgDown;    break;  /* curs pgdown */
+                                case KEY_KP_0:
+                                    scancode = KEY_Insert;    break;  /* curs insert */
+                                case KEY_KP_Decimal:
+                                    scancode = KEY_Delete;    break;  /* curs delete */
+                                case KEY_Enter:
+                                    scancode = KEY_KP_Enter;  break;  /* keypad enter */
+                                case KEY_LCtrl:
+                                    scancode = KEY_RCtrl;     break;  /* right ctrl */
+                                case KEY_KP_Multiply:
+                                    scancode = KEY_Print;     break;  /* print */
+                                case KEY_Slash:
+                                    scancode = KEY_KP_Divide; break;  /* keyp divide */
+                                case KEY_Alt:
+                                    scancode = KEY_AltLang;   break;  /* right alt */
+                                case KEY_ScrollLock:
+                                    scancode = KEY_Break;     break;  /* curs break */
+                                case 0x5b:
+                                    scancode = KEY_LMeta;     break;
+                                case 0x5c:
+                                    scancode = KEY_RMeta;     break;
+                                case 0x5d:
+                                    scancode = KEY_Menu;      break;
+                                case KEY_F3:
+                                    scancode = KEY_F13;       break;
+                                case KEY_F4:
+                                    scancode = KEY_F14;       break;
+                                case KEY_F5:
+                                    scancode = KEY_F15;       break;
+                                case KEY_F6:
+                                    scancode = KEY_F16;       break;
+                                case KEY_F7:
+                                    scancode = KEY_F17;       break;
+                                case KEY_KP_Plus:
+                                    scancode = KEY_KP_DEC;    break;
+                                /* Ignore virtual shifts (E0 2A, E0 AA, E0 36, E0 B6) */
+                                case 0x2A:
+                                case 0x36:
+                                    b++;
+                                    prefix = 0;
+                                    continue;
+                                default:
+                                    ErrorF("Unreported Prefix0 scancode: 0x%02x\n",
+                                           scancode);
+                                     /*
+                                      * "Internet" keyboards are generating lots of new
+                                      * codes.  Let them pass.  There is little consistency
+                                      * between them, so don't bother with symbolic names at
+                                      * this level.
+                                      */
+                                    scancode += 0x78;
+                            }
+                            break;
+                        }
+
+                        case KEY_Prefix1:
+                        {
+                            /* we do no handle these */
+                            ErrorF("Prefix1 scancode: 0x%02x\n", scancode);
+                            b++;
+                            prefix = 0;
+                            continue;
+                        }
+
+                        default: /* should not happen*/
+                        case 0: /* do nothing */
+                            ErrorF("Plain scancode: 0x%02x\n", scancode);
+                }
+
+                prefix = 0;
+            }
+            /* without xkb we use mediumraw mode -- enqueue the scancode as is */
+            else
+#endif
+                scancode = b[0] & 0x7f;
+	    KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80);
 	    b++;
 	}
     }
@@ -399,19 +700,30 @@ LinuxKeyboardRead (int fd, void *closure
 
 static int		LinuxKbdTrans;
 static struct termios	LinuxTermios;
-static int		LinuxKbdType;
 
-static int
-LinuxKeyboardEnable (int fd, void *closure)
+static Status
+LinuxKeyboardEnable (KdKeyboardInfo *ki)
 {
     struct termios nTty;
     unsigned char   buf[256];
     int		    n;
+    int             fd;
+
+    if (!ki)
+        return !Success;
+
+    fd = LinuxConsoleFd;
+    ki->driverPrivate = (void *) fd;
 
     ioctl (fd, KDGKBMODE, &LinuxKbdTrans);
     tcgetattr (fd, &LinuxTermios);
-    
-    ioctl(fd, KDSKBMODE, K_MEDIUMRAW);
+#ifdef XKB
+    if (!noXkbExtension)
+        ioctl(fd, KDSKBMODE, K_RAW);
+    else
+#else
+        ioctl(fd, KDSKBMODE, K_MEDIUMRAW);
+#endif
     nTty = LinuxTermios;
     nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
     nTty.c_oflag = 0;
@@ -422,54 +734,74 @@ LinuxKeyboardEnable (int fd, void *closu
     cfsetispeed(&nTty, 9600);
     cfsetospeed(&nTty, 9600);
     tcsetattr(fd, TCSANOW, &nTty);
+    /* Our kernel cleverly ignores O_NONBLOCK.  Sigh. */
+#if 0
     /*
      * Flush any pending keystrokes
      */
     while ((n = read (fd, buf, sizeof (buf))) > 0)
 	;
-    return fd;
+#endif
+    KdRegisterFd (fd, LinuxKeyboardRead, ki);
+    return Success;
 }
 
 static void
-LinuxKeyboardDisable (int fd, void *closure)
+LinuxKeyboardDisable (KdKeyboardInfo *ki)
 {
-    ioctl(LinuxConsoleFd, KDSKBMODE, LinuxKbdTrans);
-    tcsetattr(LinuxConsoleFd, TCSANOW, &LinuxTermios);
+    int fd;
+    
+    if (!ki)
+        return;
+
+    fd = (int) ki->driverPrivate;
+
+    KdUnregisterFd(ki, fd, FALSE);
+    ioctl(fd, KDSKBMODE, LinuxKbdTrans);
+    tcsetattr(fd, TCSANOW, &LinuxTermios);
 }
 
-static int
-LinuxKeyboardInit (void)
+static Status
+LinuxKeyboardInit (KdKeyboardInfo *ki)
 {
-    if (!LinuxKbdType)
-	LinuxKbdType = KdAllocInputType ();
+    if (!ki)
+        return !Success;
+
+    if (ki->path)
+        xfree(ki->path);
+    ki->path = KdSaveString("console");
+    if (ki->name)
+        xfree(ki->name);
+    ki->name = KdSaveString("Linux console keyboard");
+
+    readKernelMapping (ki);
 
-    KdRegisterFd (LinuxKbdType, LinuxConsoleFd, LinuxKeyboardRead, 0);
-    LinuxKeyboardEnable (LinuxConsoleFd, 0);
-    KdRegisterFdEnableDisable (LinuxConsoleFd, 
-			       LinuxKeyboardEnable,
-			       LinuxKeyboardDisable);
-    return 1;
+    return Success;
 }
 
 static void
-LinuxKeyboardFini (void)
+LinuxKeyboardFini (KdKeyboardInfo *ki)
 {
-    LinuxKeyboardDisable (LinuxConsoleFd, 0);
-    KdUnregisterFds (LinuxKbdType, FALSE);
 }
 
 static void
-LinuxKeyboardLeds (int leds)
+LinuxKeyboardLeds (KdKeyboardInfo *ki, int leds)
 {
-    ioctl (LinuxConsoleFd, KDSETLED, leds & 7);
+    if (!ki)
+        return;
+
+    ioctl ((int)ki->driverPrivate, KDSETLED, leds & 7);
 }
 
 static void
-LinuxKeyboardBell (int volume, int pitch, int duration)
+LinuxKeyboardBell (KdKeyboardInfo *ki, int volume, int pitch, int duration)
 {
+    if (!ki)
+        return;
+
     if (volume && pitch)
     {
-	ioctl(LinuxConsoleFd, KDMKTONE,
+	ioctl((int)ki->driverPrivate, KDMKTONE,
 	      ((1193190 / pitch) & 0xffff) |
 	      (((unsigned long)duration *
 		volume / 50) << 16));
@@ -477,11 +809,13 @@ LinuxKeyboardBell (int volume, int pitch
     }
 }
 
-KdKeyboardFuncs	LinuxKeyboardFuncs = {
-    LinuxKeyboardLoad,
+KdKeyboardDriver LinuxKeyboardDriver = {
+    "keyboard",
     LinuxKeyboardInit,
+    LinuxKeyboardEnable,
     LinuxKeyboardLeds,
     LinuxKeyboardBell,
+    LinuxKeyboardDisable,
     LinuxKeyboardFini,
-    3,
+    NULL,
 };
diff --git a/hw/kdrive/linux/linux.c b/hw/kdrive/linux/linux.c
index be11ec5..e75f8d5 100644
--- a/hw/kdrive/linux/linux.c
+++ b/hw/kdrive/linux/linux.c
@@ -456,6 +456,7 @@ LinuxFini (void)
 	}
     }
     close(LinuxConsoleFd);                /* make the vt-manager happy */
+    LinuxConsoleFd = -1;
     fd = open ("/dev/tty0", O_RDWR|O_NDELAY, 0);
     if (fd >= 0)
     {
diff --git a/hw/kdrive/linux/mouse.c b/hw/kdrive/linux/mouse.c
index 5fe9978..77ec3b3 100644
--- a/hw/kdrive/linux/mouse.c
+++ b/hw/kdrive/linux/mouse.c
@@ -206,10 +206,10 @@ MouseWriteBytes (int fd, unsigned char *
 
 typedef struct _kmouseProt {
     char	    *name;
-    Bool	    (*Complete) (KdMouseInfo *mi, unsigned char *ev, int ne);
-    int		    (*Valid) (KdMouseInfo *mi, unsigned char *ev, int ne);
-    Bool	    (*Parse) (KdMouseInfo *mi, unsigned char *ev, int ne);
-    Bool	    (*Init) (KdMouseInfo *mi);
+    Bool	    (*Complete) (KdPointerInfo *pi, unsigned char *ev, int ne);
+    int		    (*Valid) (KdPointerInfo *pi, unsigned char *ev, int ne);
+    Bool	    (*Parse) (KdPointerInfo *pi, unsigned char *ev, int ne);
+    Bool	    (*Init) (KdPointerInfo *pi);
     unsigned char   headerMask, headerValid;
     unsigned char   dataMask, dataValid;
     Bool	    tty;
@@ -238,9 +238,9 @@ typedef struct _kmouse {
     unsigned long	state;	/* private per protocol, init to prot->state */
 } Kmouse;
     
-static int mouseValid (KdMouseInfo *mi, unsigned char *ev, int ne)
+static int mouseValid (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
-    Kmouse		*km = mi->driver;
+    Kmouse		*km = pi->driverPrivate;
     const KmouseProt	*prot = km->prot;
     int	    i;
 
@@ -255,24 +255,24 @@ static int mouseValid (KdMouseInfo *mi, 
     return 0;
 }
 
-static Bool threeComplete (KdMouseInfo *mi, unsigned char *ev, int ne)
+static Bool threeComplete (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
     return ne == 3;
 }
 
-static Bool fourComplete (KdMouseInfo *mi, unsigned char *ev, int ne)
+static Bool fourComplete (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
     return ne == 4;
 }
 
-static Bool fiveComplete (KdMouseInfo *mi, unsigned char *ev, int ne)
+static Bool fiveComplete (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
     return ne == 5;
 }
 
-static Bool MouseReasonable (KdMouseInfo *mi, unsigned long flags, int dx, int dy)
+static Bool MouseReasonable (KdPointerInfo *pi, unsigned long flags, int dx, int dy)
 {
-    Kmouse		*km = mi->driver;
+    Kmouse		*km = pi->driverPrivate;
 
     if (km->stage == MouseWorking) 
 	return TRUE;
@@ -296,9 +296,9 @@ static Bool MouseReasonable (KdMouseInfo
 /*
  * Standard PS/2 mouse protocol
  */
-static Bool ps2Parse (KdMouseInfo *mi, unsigned char *ev, int ne)
+static Bool ps2Parse (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
-    Kmouse	    *km = mi->driver;
+    Kmouse	    *km = pi->driverPrivate;
     int		    dx, dy, dz;
     unsigned long   flags;
     unsigned long   flagsrelease = 0;
@@ -333,21 +333,21 @@ static Bool ps2Parse (KdMouseInfo *mi, u
     if (ev[0] & 0x20)
 	dy -= 256;
     dy = -dy;
-    if (!MouseReasonable (mi, flags, dx, dy))
+    if (!MouseReasonable (pi, flags, dx, dy))
 	return FALSE;
     if (km->stage == MouseWorking)
     {
-	KdEnqueueMouseEvent (mi, flags, dx, dy);
+	KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
 	if (flagsrelease)
 	{
 	    flags &= ~flagsrelease;
-	    KdEnqueueMouseEvent (mi, flags, dx, dy);
+	    KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
 	}
     }
     return TRUE;
 }
 
-static Bool ps2Init (KdMouseInfo *mi);
+static Bool ps2Init (KdPointerInfo *pi);
 
 static const KmouseProt ps2Prot = {
     "ps/2",
@@ -450,9 +450,9 @@ static unsigned char	intelli_init[] = {
 #define NINIT_INTELLI	3
 
 static int
-ps2SkipInit (KdMouseInfo *mi, int ninit, Bool ret_next)
+ps2SkipInit (KdPointerInfo *pi, int ninit, Bool ret_next)
 {
-    Kmouse  *km = mi->driver;
+    Kmouse  *km = pi->driverPrivate;
     int	    c = -1;
     int	    skipping;
     Bool    waiting;
@@ -481,9 +481,9 @@ ps2SkipInit (KdMouseInfo *mi, int ninit,
 }
 
 static Bool
-ps2Init (KdMouseInfo *mi)
+ps2Init (KdPointerInfo *pi)
 {
-    Kmouse	    *km = mi->driver;
+    Kmouse	    *km = pi->driverPrivate;
     int		    skipping;
     Bool	    waiting;
     int		    id;
@@ -499,7 +499,7 @@ ps2Init (KdMouseInfo *mi)
 	return FALSE;
     skipping = 0;
     waiting = FALSE;
-    id = ps2SkipInit (mi, 0, TRUE);
+    id = ps2SkipInit (pi, 0, TRUE);
     switch (id) {
     case 3:
 	init = wheel_3button_init;
@@ -524,13 +524,13 @@ ps2Init (KdMouseInfo *mi)
      * initialization string.  Make sure any partial event is
      * skipped
      */
-    (void) ps2SkipInit (mi, ninit, FALSE);
+    (void) ps2SkipInit (pi, ninit, FALSE);
     return TRUE;
 }
 
-static Bool busParse (KdMouseInfo *mi, unsigned char *ev, int ne)
+static Bool busParse (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
-    Kmouse	    *km = mi->driver;
+    Kmouse	    *km = pi->driverPrivate;
     int		    dx, dy;
     unsigned long   flags;
     
@@ -543,10 +543,10 @@ static Bool busParse (KdMouseInfo *mi, u
 	flags |= KD_BUTTON_2;
     if ((ev[0] & 1) == 0)
 	flags |= KD_BUTTON_3;
-    if (!MouseReasonable (mi, flags, dx, dy))
+    if (!MouseReasonable (pi, flags, dx, dy))
 	return FALSE;
     if (km->stage == MouseWorking)
-	KdEnqueueMouseEvent (mi, flags, dx, dy);
+	KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
     return TRUE;
 }
 
@@ -561,9 +561,9 @@ static const KmouseProt busProt = {
  * Standard MS serial protocol, three bytes
  */
 
-static Bool msParse (KdMouseInfo *mi, unsigned char *ev, int ne)
+static Bool msParse (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
-    Kmouse	    *km = mi->driver;
+    Kmouse	    *km = pi->driverPrivate;
     int		    dx, dy;
     unsigned long   flags;
 
@@ -576,10 +576,10 @@ static Bool msParse (KdMouseInfo *mi, un
 
     dx = (signed char)(((ev[0] & 0x03) << 6) | (ev[1] & 0x3F));
     dy = (signed char)(((ev[0] & 0x0C) << 4) | (ev[2] & 0x3F));
-    if (!MouseReasonable (mi, flags, dx, dy))
+    if (!MouseReasonable (pi, flags, dx, dy))
 	return FALSE;
     if (km->stage == MouseWorking)
-	KdEnqueueMouseEvent (mi, flags, dx, dy);
+	KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
     return TRUE;
 }
 
@@ -600,9 +600,9 @@ static const KmouseProt msProt = {
  * first byte of a synchronized protocol stream and see if it's got
  * any bits turned on that can't occur in that fourth byte
  */
-static Bool logiComplete (KdMouseInfo *mi, unsigned char *ev, int ne)
+static Bool logiComplete (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
-    Kmouse		*km = mi->driver;
+    Kmouse		*km = pi->driverPrivate;
 
     if ((ev[0] & 0x40) == 0x40)
 	return ne == 3;
@@ -611,9 +611,9 @@ static Bool logiComplete (KdMouseInfo *m
     return FALSE;
 }
 
-static int logiValid (KdMouseInfo *mi, unsigned char *ev, int ne)
+static int logiValid (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
-    Kmouse		*km = mi->driver;
+    Kmouse		*km = pi->driverPrivate;
     const KmouseProt	*prot = km->prot;
     int	    i;
 
@@ -632,9 +632,9 @@ static int logiValid (KdMouseInfo *mi, u
     return 0;
 }
 
-static Bool logiParse (KdMouseInfo *mi, unsigned char *ev, int ne)
+static Bool logiParse (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
-    Kmouse	    *km = mi->driver;
+    Kmouse	    *km = pi->driverPrivate;
     int		    dx, dy;
     unsigned long   flags;
 
@@ -660,10 +660,10 @@ static Bool logiParse (KdMouseInfo *mi, 
 	flags |= km->state & (KD_BUTTON_1|KD_BUTTON_3);
     }
 
-    if (!MouseReasonable (mi, flags, dx, dy))
+    if (!MouseReasonable (pi, flags, dx, dy))
 	return FALSE;
     if (km->stage == MouseWorking)
-	KdEnqueueMouseEvent (mi, flags, dx, dy);
+	KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
     return TRUE;
 }
 
@@ -682,9 +682,9 @@ static const KmouseProt logiProt = {
 /*
  * Mouse systems protocol, 5 bytes
  */
-static Bool mscParse (KdMouseInfo *mi, unsigned char *ev, int ne)
+static Bool mscParse (KdPointerInfo *pi, unsigned char *ev, int ne)
 {
-    Kmouse	    *km = mi->driver;
+    Kmouse	    *km = pi->driverPrivate;
     int		    dx, dy;
     unsigned long   flags;
 
@@ -699,10 +699,10 @@ static Bool mscParse (KdMouseInfo *mi, u
     dx =    (signed char)(ev[1]) + (signed char)(ev[3]);
     dy = - ((signed char)(ev[2]) + (signed char)(ev[4]));
 
-    if (!MouseReasonable (mi, flags, dx, dy))
+    if (!MouseReasonable (pi, flags, dx, dy))
 	return FALSE;
     if (km->stage == MouseWorking)
-	KdEnqueueMouseEvent (mi, flags, dx, dy);
+	KdEnqueuePointerEvent (pi, flags, dx, dy, 0);
     return TRUE;
 }
 
@@ -810,8 +810,8 @@ MouseNextProtocol (Kmouse *km)
 static void
 MouseRead (int mousePort, void *closure)
 {
-    KdMouseInfo	    *mi = closure;
-    Kmouse	    *km = mi->driver;
+    KdPointerInfo   *pi = closure;
+    Kmouse	    *km = pi->driverPrivate;
     unsigned char   event[MAX_MOUSE];
     int		    ne;
     int		    c;
@@ -835,7 +835,7 @@ MouseRead (int mousePort, void *closure)
 	    break;
 	}
 	event[ne++] = c;
-	i = (*km->prot->Valid) (mi, event, ne);
+	i = (*km->prot->Valid) (pi, event, ne);
 	if (i != 0)
 	{
 #ifdef DEBUG
@@ -867,9 +867,9 @@ MouseRead (int mousePort, void *closure)
 	}
 	else
 	{
-	    if ((*km->prot->Complete) (mi, event, ne))
+	    if ((*km->prot->Complete) (pi, event, ne))
 	    {
-		if ((*km->prot->Parse) (mi, event, ne))
+		if ((*km->prot->Parse) (pi, event, ne))
 		{
 		    switch (km->stage)
 		    {
@@ -896,7 +896,7 @@ MouseRead (int mousePort, void *closure)
 			    km->invalid = 0;
 			    km->tested = 0;
 			    km->valid = 0;
-			    if (km->prot->Init && !(*km->prot->Init) (mi))
+			    if (km->prot->Init && !(*km->prot->Init) (pi))
 				km->stage = MouseBroken;
 			}
 			break;
@@ -923,9 +923,9 @@ MouseRead (int mousePort, void *closure)
 int MouseInputType;
 
 char *kdefaultMouse[] =  {
+    "/dev/input/mice",
     "/dev/mouse",
     "/dev/psaux",
-    "/dev/input/mice",
     "/dev/adbmouse",
     "/dev/ttyS0",
     "/dev/ttyS1",
@@ -933,81 +933,97 @@ char *kdefaultMouse[] =  {
 
 #define NUM_DEFAULT_MOUSE    (sizeof (kdefaultMouse) / sizeof (kdefaultMouse[0]))
 
-static Bool
-MouseInit (void)
+static Status
+MouseInit (KdPointerInfo *pi)
 {
     int		i;
     int		fd;
     Kmouse	*km;
-    KdMouseInfo	*mi, *next;
-    int		n = 0;
-    char	*prot;
-
-    if (!MouseInputType)
-	MouseInputType = KdAllocInputType ();
-
-    for (mi = kdMouseInfo; mi; mi = next)
-    {
-	next = mi->next;
-	prot = mi->prot;
-	if (mi->inputType)
-	    continue;
-	if (!mi->name)
-	{
-	    for (i = 0; i < NUM_DEFAULT_MOUSE; i++)
-	    {
-		fd = open (kdefaultMouse[i], 2);
-		if (fd >= 0)
-		{
-		    mi->name = KdSaveString (kdefaultMouse[i]);
-		    break;
-		}
-	    }
-	}
-	else
-	    fd = open (mi->name, 2);
+
+    if (!pi)
+        return BadImplementation;
+    
+    if (!pi->path || strcmp(pi->path, "auto") == 0) {
+        for (i = 0; i < NUM_DEFAULT_MOUSE; i++) {
+            fd = open (kdefaultMouse[i], 2);
+            if (fd >= 0) {
+                pi->path = KdSaveString (kdefaultMouse[i]);
+                break;
+            }
+        }
+    }
+    else {
+        fd = open (pi->path, 2);
+    }
 	    
-	if (fd >= 0)
-	{
-	    km = (Kmouse *) xalloc (sizeof (Kmouse));
-	    if (km)
-	    {
-		km->iob.fd = fd;
-		km->iob.avail = km->iob.used = 0;
-		km->prot = 0;
-		km->i_prot = 0;
-		km->tty = isatty (fd);
-		mi->driver = km;
-		mi->inputType = MouseInputType;
-		MouseFirstProtocol (km, mi->prot);
-		if (KdRegisterFd (MouseInputType, fd, MouseRead, (void *) mi))
-		    n++;
-	    }
-	    else
-		close (fd);
-	}
+    if (fd < 0)
+        return BadMatch;
+
+    close(fd);
+
+    km = (Kmouse *) xalloc (sizeof (Kmouse));
+    if (km) {
+        km->iob.avail = km->iob.used = 0;
+        MouseFirstProtocol(km, "exps/2");
+        km->i_prot = 0;
+        km->tty = isatty (fd);
+        km->iob.fd = -1;
+        pi->driverPrivate = km;
     }
-    return TRUE;
+    else {
+        close (fd);
+        return BadAlloc;
+    }
+
+    return Success;
 }
 
-static void
-MouseFini (void)
+static Status
+MouseEnable (KdPointerInfo *pi)
 {
-    KdMouseInfo	*mi;
+    Kmouse *km;
 
-    KdUnregisterFds (MouseInputType, TRUE);
-    for (mi = kdMouseInfo; mi; mi = mi->next)
+    if (!pi || !pi->driverPrivate || !pi->path)
+        return BadImplementation;
+
+    km = pi->driverPrivate;
+
+    km->iob.fd = open(pi->path, 2);
+    if (km->iob.fd < 0)
+        return BadMatch;
+
+    if (!KdRegisterFd (km->iob.fd, MouseRead, pi))
     {
-	if (mi->inputType == MouseInputType)
-	{
-	    xfree (mi->driver);
-	    mi->driver = 0;
-	    mi->inputType = 0;
-	}
+        close(km->iob.fd);
+        return BadAlloc;
     }
+
+    return Success;
+}
+
+static void
+MouseDisable (KdPointerInfo *pi)
+{
+    Kmouse *km;
+    if (!pi || !pi->driverPrivate)
+        return;
+    
+    km = pi->driverPrivate;
+    KdUnregisterFd (pi, km->iob.fd, TRUE);
+}
+
+static void
+MouseFini (KdPointerInfo *pi)
+{
+    xfree (pi->driverPrivate);
+    pi->driverPrivate = NULL;
 }
 
-KdMouseFuncs LinuxMouseFuncs = {
+KdPointerDriver LinuxMouseDriver = {
+    "mouse",
     MouseInit,
+    MouseEnable,
+    MouseDisable,
     MouseFini,
+    NULL,
 };
diff --git a/hw/kdrive/linux/ms.c b/hw/kdrive/linux/ms.c
index 7f046bd..e62cebc 100644
--- a/hw/kdrive/linux/ms.c
+++ b/hw/kdrive/linux/ms.c
@@ -90,41 +90,50 @@ MsRead (int port, void *closure)
 	    dy = (char)(((b[0] & 0x0C) << 4) | (b[2] & 0x3F));
             n -= 3;
             b += 3;
-	    KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy);
+	    KdEnqueuePointerEvent (closure, flags, dx, dy, 0);
 	}
     }
 }
 
-int MsInputType;
+static Status
+MsInit (KdPointerInfo *pi)
+{
+    if (!pi)
+        return BadImplementation;
+
+    if (!pi->path || strcmp(pi->path, "auto"))
+        pi->path = KdSaveString("/dev/mouse");
+    if (!pi->name)
+        pi->name = KdSaveString("Microsoft protocol mouse");
+    
+    return Success; 
+}
 
-static int
-MsInit (void)
+static Status
+MsEnable (KdPointerInfo *pi)
 {
     int port;
-    char *device = "/dev/mouse";
     struct termios t;
     int ret;
 
-    if (!MsInputType)
-	MsInputType = KdAllocInputType ();
-    port = open (device, O_RDWR | O_NONBLOCK);
+    port = open (pi->path, O_RDWR | O_NONBLOCK);
     if(port < 0) {
-        ErrorF("Couldn't open %s (%d)\n", device, (int)errno);
+        ErrorF("Couldn't open %s (%d)\n", pi->path, (int)errno);
         return 0;
     } else if (port == 0) {
         ErrorF("Opening %s returned 0!  Please complain to Keith.\n",
-               device);
+               pi->path);
 	goto bail;
     }
 
     if(!isatty(port)) {
-        ErrorF("%s is not a tty\n", device);
+        ErrorF("%s is not a tty\n", pi->path);
         goto bail;
     }
 
     ret = tcgetattr(port, &t);
     if(ret < 0) {
-        ErrorF("Couldn't tcgetattr(%s): %d\n", device, errno);
+        ErrorF("Couldn't tcgetattr(%s): %d\n", pi->path, errno);
         goto bail;
     }
     t.c_iflag &= ~ (IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR |
@@ -140,24 +149,36 @@ MsInit (void)
     t.c_cc[VTIME] = 0;
     ret = tcsetattr(port, TCSANOW, &t);
     if(ret < 0) {
-        ErrorF("Couldn't tcsetattr(%s): %d\n", device, errno);
+        ErrorF("Couldn't tcsetattr(%s): %d\n", pi->path, errno);
         goto bail;
     }
-    if (KdRegisterFd (MsInputType, port, MsRead, (void *) 0))
-	return 1;
+    if (KdRegisterFd (port, MsRead, pi))
+	return TRUE;
+    pi->driverPrivate = (void *)port;
+
+    return Success;
 
  bail:
     close(port);
-    return 0;
+    return BadMatch;
+}
+
+static void
+MsDisable (KdPointerInfo *pi)
+{
+    KdUnregisterFd (pi, (int)pi->driverPrivate, TRUE);
 }
 
 static void
-MsFini (void)
+MsFini (KdPointerInfo *pi)
 {
-    KdUnregisterFds (MsInputType, TRUE);
 }
 
-KdMouseFuncs MsMouseFuncs = {
+KdPointerDriver MsMouseDriver = {
+    "ms",
     MsInit,
-    MsFini
+    MsEnable,
+    MsDisable,
+    MsFini,
+    NULL,
 };
diff --git a/hw/kdrive/linux/ps2.c b/hw/kdrive/linux/ps2.c
index b59dbfa..5d523a2 100644
--- a/hw/kdrive/linux/ps2.c
+++ b/hw/kdrive/linux/ps2.c
@@ -112,42 +112,78 @@ Ps2Read (int ps2Port, void *closure)
 	    dy = -dy;
 	    n -= 3;
 	    b += 3;
-	    KdEnqueueMouseEvent (kdMouseInfo, flags, dx, dy);
+	    KdEnqueuePointerEvent (closure, flags, dx, dy, 0);
 	}
     }
 }
 
-int Ps2InputType;
-
-static int
-Ps2Init (void)
+static Status
+Ps2Init (KdPointerInfo *pi)
 {
-    int	    i;
-    int	    ps2Port;
-    int	    n;
-
-    if (!Ps2InputType)
-	Ps2InputType = KdAllocInputType ();
-    n = 0;
-    for (i = 0; i < NUM_PS2_NAMES; i++)
-    {
-	ps2Port = open (Ps2Names[i], 0);
-	if (ps2Port >= 0)
-	{
-	    if (KdRegisterFd (Ps2InputType, ps2Port, Ps2Read, (void *) i))
-		n++;
+    int	ps2Port, i;
+
+    if (!pi->path) {
+        for (i = 0; i < NUM_PS2_NAMES; i++) {
+            ps2Port = open (Ps2Names[i], 0);
+            if (ps2Port >= 0) {
+                pi->path = KdSaveString (Ps2Names[i]);
+                break;
+            }
 	}
     }
-    return n;
+    else {
+        ps2Port = open (pi->path, 0);
+    }
+
+    if (ps2Port < 0)
+        return BadMatch;
+
+    close(ps2Port);
+    if (!pi->name)
+        pi->name = KdSaveString ("PS/2 Mouse");
+
+    return Success;
+}
+
+static Status
+Ps2Enable (KdPointerInfo *pi)
+{
+    int fd;
+    
+    if (!pi)
+        return BadImplementation;
+
+    fd = open (pi->path, 0);
+    if (fd < 0)
+        return BadMatch;
+
+    if (!KdRegisterFd (fd, Ps2Read, pi)) {
+        close(fd);
+        return BadAlloc;
+    }
+
+    pi->driverPrivate = (void *)fd;
+
+    return Success;
+}
+
+
+static void
+Ps2Disable (KdPointerInfo *pi)
+{
+    KdUnregisterFd (pi, (int)pi->driverPrivate, TRUE);
 }
 
 static void
-Ps2Fini (void)
+Ps2Fini (KdPointerInfo *pi)
 {
-    KdUnregisterFds (Ps2InputType, TRUE);
 }
 
-KdMouseFuncs Ps2MouseFuncs = {
+KdPointerDriver Ps2MouseDriver = {
+    "ps2",
     Ps2Init,
-    Ps2Fini
+    Ps2Enable,
+    Ps2Disable,
+    Ps2Fini,
+    NULL,
 };
diff --git a/hw/kdrive/linux/ts.c b/hw/kdrive/linux/ts.c
index 70c7361..701fdc8 100644
--- a/hw/kdrive/linux/ts.c
+++ b/hw/kdrive/linux/ts.c
@@ -75,7 +75,7 @@ TsReadBytes (int fd, char *buf, int len,
 static void
 TsRead (int tsPort, void *closure)
 {
-    KdMouseInfo	    *mi = closure;
+    KdPointerInfo    *pi = closure;
     TS_EVENT	    event;
     int		    n;
     long	    x, y;
@@ -117,7 +117,7 @@ TsRead (int tsPort, void *closure)
 	    lastx = 0;
 	    lasty = 0;
 	}
-	KdEnqueueMouseEvent (mi, flags, x, y);
+	KdEnqueuePointerEvent (pi, flags, x, y, 0);
     }
 }
 
@@ -129,95 +129,83 @@ char	*TsNames[] = {
 
 #define NUM_TS_NAMES	(sizeof (TsNames) / sizeof (TsNames[0]))
 
-int TsInputType;
-
-static int
-TsEnable (int fd, void *closure)
-{
-    KdMouseInfo *mi = (KdMouseInfo *)closure;
-
-    return open (mi->name, 0);
-}
-
-static void
-TsDisable (int fd, void *closure)
-{
-    close (fd);
-}
-
-static int
-TsInit (void)
+static Status
+TsInit (KdPointerInfo *pi)
 {
     int		i;
     int		fd;
-    KdMouseInfo	*mi, *next;
     int		n = 0;
 
-    if (!TsInputType)
-	TsInputType = KdAllocInputType ();
-    
-    for (mi = kdMouseInfo; mi; mi = next)
-    {
-	next = mi->next;
-	if (mi->inputType)
-	    continue;
-	if (!mi->name)
-	{
-	    for (i = 0; i < NUM_TS_NAMES; i++)    
-	    {
-		fd = open (TsNames[i], 0);
-		if (fd >= 0) 
-		{
-		    mi->name = KdSaveString (TsNames[i]);
-		    break;
-		}
-	    }
+    if (!pi->path || strcmp(pi->path, "auto") == 0) {
+        for (i = 0; i < NUM_TS_NAMES; i++)    {
+            fd = open (TsNames[i], 0);
+            if (fd >= 0) {
+                pi->path = KdSaveString (TsNames[i]);
+                break;
+            }
 	}
-	else
-	    fd = open (mi->name, 0);
-	if (fd >= 0)
-	{
-	    struct h3600_ts_calibration cal;
-	    /*
-	     * Check to see if this is a touch screen
-	     */
-	    if (ioctl (fd, TS_GET_CAL, &cal) != -1)
-	    {
-		mi->driver = (void *) fd;
-		mi->inputType = TsInputType;
-		if (KdRegisterFd (TsInputType, fd, TsRead, (void *) mi))
-		{
-		    /* Set callbacks for vt switches etc */
-		    KdRegisterFdEnableDisable (fd, TsEnable, TsDisable);
+    }
+    else {
+        fd = open (pi->path, 0);
+    }
 
-		    n++;
-		}
-	    }
-	    else
-		close (fd);
-	}
+    if (fd < 0) {
+        ErrorF("TsInit: Couldn't open %s\n", pi->path);
+        return BadMatch;
     }
+    close(fd);
 
-    return 0;
+    pi->name = KdSaveString("H3600 Touchscreen");
+
+    return Success;
 }
 
-static void
-TsFini (void)
+static Status
+TsEnable (KdPointerInfo *pi)
 {
-    KdMouseInfo	*mi;
+    int fd;
 
-    KdUnregisterFds (TsInputType, TRUE);
-    for (mi = kdMouseInfo; mi; mi = mi->next)
-    {
-	if (mi->inputType == TsInputType)
-	{
-	    mi->driver = 0;
-	    mi->inputType = 0;
+    if (!pi || !pi->path)
+        return BadImplementation;
+
+    fd = open(pi->path, 0);
+
+    if (fd < 0) {
+        ErrorF("TsInit: Couldn't open %s\n", pi->path);
+        return BadMatch;
+    }
+
+    struct h3600_ts_calibration cal;
+    /*
+     * Check to see if this is a touch screen
+     */
+    if (ioctl (fd, TS_GET_CAL, &cal) != -1) {
+	mi->driverPrivate = (void *) fd;
+	if (!KdRegisterFd (fd, TsRead, (void *) mi)) {
+            close(fd);
+            return BadAlloc;
 	}
     }
+    else {
+        ErrorF("TsEnable: %s is not a touchscreen\n", pi->path);
+	close (fd);
+        return BadMatch;
+    }
+
+    return Success;
+}
+
+static void
+TsFini (KdPointerInfo *pi)
+{
+    KdUnregisterFds (pi, (int)pi->driverPrivate, TRUE);
+    mi->driverPrivate = NULL;
 }
 
-KdMouseFuncs TsFuncs = {
+KdPointerDriver TsDriver = {
     TsInit,
-    TsFini
+    TsEnable,
+    TsDisable,
+    TsFini,
+    NULL,
 };
diff --git a/hw/kdrive/linux/tslib.c b/hw/kdrive/linux/tslib.c
index c4caff9..aa57e87 100644
--- a/hw/kdrive/linux/tslib.c
+++ b/hw/kdrive/linux/tslib.c
@@ -1,73 +1,39 @@
 /*
- * $RCSId: xc/programs/Xserver/hw/kdrive/linux/tslib.c,v 1.1 2002/11/01 22:27:49 keithp Exp $
- * TSLIB based touchscreen driver for TinyX
+ * TSLIB based touchscreen driver for KDrive
+ * Porting to new input API and event queueing by Daniel Stone.
  * Derived from ts.c by Keith Packard
  * Derived from ps2.c by Jim Gettys
  *
  * Copyright © 1999 Keith Packard
  * Copyright © 2000 Compaq Computer Corporation
  * Copyright © 2002 MontaVista Software Inc.
- * Copyright © 2005 OpenedHand Ltd.
+ * Copyright © 2006 Nokia Corporation
  * 
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  * the above copyright notice appear in all copies and that both that
  * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard or Compaq not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard and Compaq makes no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
+ * documentation, and that the name of the authors and/or copyright holders
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  The authors and/or
+ * copyright holders make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
  *
- * KEITH PACKARD AND COMPAQ DISCLAIM ALL WARRANTIES WITH REGARD TO THIS 
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 
- * IN NO EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- * 
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Michael Taht or MontaVista not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Michael Taht and Montavista make no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * MICHAEL TAHT AND MONTAVISTA DISCLAIM ALL WARRANTIES WITH REGARD TO THIS 
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 
- * IN NO EVENT SHALL EITHER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- *
- * Permission to use, copy, modify, distribute, and sell this software and its
- * documentation for any purpose is hereby granted without fee, provided that
- * the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Matthew Allum or OpenedHand not be used in
- * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Matthew Allum and OpenedHand make no
- * representations about the suitability of this software for any purpose.  It
- * is provided "as is" without express or implied warranty.
- *
- * MATTHEW ALLUM AND OPENEDHAND DISCLAIM ALL WARRANTIES WITH REGARD TO THIS 
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 
- * IN NO EVENT SHALL EITHER BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
- * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
- * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
+ * THE AUTHORS AND/OR COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD
+ * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS, IN NO EVENT SHALL THE AUTHORS AND/OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
 
-#ifdef HAVE_CONFIG_H
+#ifdef HAVE_KDRIVE_CONFIG_H
 #include <kdrive-config.h>
 #endif
+
 #define NEED_EVENTS
 #include <X11/X.h>
 #include <X11/Xproto.h>
@@ -77,186 +43,171 @@
 #include "kdrive.h"
 #include <sys/ioctl.h>
 #include <tslib.h>
+#include <dirent.h>
+#include <linux/input.h>
 
-static struct tsdev *tsDev = NULL;
-
-static char *TsNames[] = {
-  NULL, 			/* set via TSLIB_TSDEVICE */
-  "/dev/ts",	
-  "/dev/touchscreen/0",
+struct TslibPrivate {
+    int fd;
+    int lastx, lasty;
+    struct tsdev *tsDev;
+    void (*raw_event_hook)(int x, int y, int pressure, void *closure);
+    void *raw_event_closure;
+    int phys_screen;
 };
 
-#define NUM_TS_NAMES (sizeof (TsNames) / sizeof (TsNames[0]))
-
-/* For XCalibrate extension */
-void (*tslib_raw_event_hook)(int x, int y, int pressure, void *closure);
-void *tslib_raw_event_closure;
-
-int TsInputType = 0;
-int KdTsPhyScreen = 0; 		/* XXX Togo .. */
 
 static void
-TsRead (int tsPort, void *closure)
+TsRead (int fd, void *closure)
 {
-    KdMouseInfo	    *mi = closure;
-    struct ts_sample event;
-    long	    x, y;
-    unsigned long   flags;
-
-    if (tslib_raw_event_hook)
-      {
-	/* XCalibrate Ext */
-	if (ts_read_raw(tsDev, &event, 1) == 1)
-	  {
-	    tslib_raw_event_hook (event.x, 
-				  event.y, 
-				  event.pressure, 
-				  tslib_raw_event_closure);
-	  }
-	return;
-      }
-
-    while (ts_read(tsDev, &event, 1) == 1)
-      {
-	flags = (event.pressure) ? KD_BUTTON_1 : 0;
-	x = event.x;
-	y = event.y;
-	
-	KdEnqueueMouseEvent (mi, flags, x, y);
-      }
-}
-
-static int
-TsLibOpen(char *dev)
-{
-  if(!(tsDev = ts_open(dev, 0)))
-    return -1;
+    KdPointerInfo       *pi = closure;
+    struct TslibPrivate *private = pi->driverPrivate;
+    struct ts_sample    event;
+    long                x = 0, y = 0;
+    unsigned long       flags;
+
+    if (private->raw_event_hook) {
+        while (ts_read_raw(private->tsDev, &event, 1) == 1)
+            private->raw_event_hook (event.x, event.y, event.pressure,
+                                     private->raw_event_closure);
+        return;
+    }
 
-  if (ts_config(tsDev))
-    return -1;
+    while (ts_read(private->tsDev, &event, 1) == 1) {
+#ifdef DEBUG
+        ErrorF("[tslib] originally from (%d, %d)\n", event.x, event.y);
+#endif
+        if (event.pressure) {
+            if (event.pressure > pi->dixdev->touchscreen->button_threshold) 
+                flags = KD_BUTTON_8;
+            else
+                flags = KD_BUTTON_1;
+
+            /* 
+             * Here we test for the touch screen driver actually being on the
+             * touch screen, if it is we send absolute coordinates. If not,
+             * then we send delta's so that we can track the entire vga screen.
+             */
+            if (KdCurScreen == private->phys_screen) {
+                x = event.x;
+                y = event.y;
+            } else {
+                flags |= KD_MOUSE_DELTA;
+                if ((private->lastx == 0) || (private->lasty == 0)) {
+                    x = event.x;
+                    y = event.y;
+                } else {
+                    x = event.x - private->lastx;
+                    y = event.y - private->lasty;
+	    	}
+            }
+            private->lastx = x;
+            private->lasty = y;
+        } else {
+            flags = 0;
+            x = private->lastx;
+            y = private->lasty;
+        }
 
-  return ts_fd(tsDev);
+#ifdef DEBUG
+        ErrorF("event at (%lu, %lu), pressure is %d, sending flags %lu\n", x, y, event.pressure, flags);
+#endif
+        KdEnqueuePointerEvent (pi, flags, x, y, event.pressure);
+    }
 }
 
-static int
-TslibEnable (int not_needed_fd, void *closure)
+static Status
+TslibEnable (KdPointerInfo *pi)
 {
-  KdMouseInfo	    *mi = closure;
-  int		     fd = 0;
+  struct TslibPrivate *private = pi->driverPrivate;
+
+    private->holdThumbEvents = 1;
+    private->raw_event_hook = NULL;
+    private->raw_event_closure = NULL;
+    private->tsDev = ts_open(pi->path, 0);
+    private->fd = ts_fd(private->tsDev);
+    if (!private->tsDev || ts_config(private->tsDev) || private->fd < 0) {
+        ErrorF("[tslib/TslibEnable] failed to open %s\n", pi->path);
+        if (private->fd > 0);
+            close(private->fd);
+        return BadAlloc;
+    }
+    if (pi->dixdev && pi->dixdev->touchscreen &&
+        pi->dixdev->touchscreen->button_threshold == 0)
+        pi->dixdev->touchscreen->button_threshold = 115;
 
-  if ((fd = TsLibOpen(mi->name)) == -1)
-    ErrorF ("Unable to re-enable TSLib ( on %s )", mi->name);
+#ifdef DEBUG
+    ErrorF("[tslib/TslibEnable] successfully enabled %s\n", pi->path);
+#endif
 
-  return fd;
+    KdRegisterFd(private->fd, TsRead, pi);
+  
+    return Success;
 }
 
+
 static void
-TslibDisable (int fd, void *closure)
+TslibDisable (KdPointerInfo *pi)
 {
-  if (tsDev)
-    ts_close(tsDev);
-  tsDev = NULL;
-}
+    struct TslibPrivate *private = pi->driverPrivate;
 
-static int
-TslibInit (void)
-{
-  int		i, j = 0;
-  KdMouseInfo	*mi, *next;
-  int		fd = 0;
-  int           req_type;
-
-  if (!TsInputType)
-    {
-      TsInputType = KdAllocInputType ();
-      KdParseMouse(0); /* allocate safe slot in kdMouseInfo */
-      req_type = 0;
+    if (private->fd) {
+        KdUnregisterFd(pi, private->fd);
+        close(private->fd);
     }
-  else req_type = TsInputType; 	/* is being re-inited */
-  
-  for (mi = kdMouseInfo; mi; mi = next)
-    {
-      next = mi->next;
-      
-      /* find a usuable slot */
-      if (mi->inputType != req_type) 
-	continue;
-      
-      /* Check for tslib env var device setting */
-      if ((TsNames[0] = getenv("TSLIB_TSDEVICE")) == NULL)
-	j++;
-      
-      if (!mi->name)
-	{
-	  for (i = j; i < NUM_TS_NAMES; i++)    
-	    {
-	      fd = TsLibOpen(TsNames[i]);
-	      
-	      if (fd >= 0) 
-		{
-		  mi->name = KdSaveString (TsNames[i]);
-		  break;
-		}
-	    }
-	} 
-      else 
-	fd = TsLibOpen(mi->name);
-      
-      if (fd >= 0 && tsDev != NULL) 
-	{
-	  mi->driver    = (void *) fd;
-	  mi->inputType = TsInputType;
-	  
-	  KdRegisterFd (TsInputType, fd, TsRead, (void *) mi);
-	  
-	  /* Set callbacks for vt switches etc */
-	  KdRegisterFdEnableDisable (fd, TslibEnable, TslibDisable);
-	  
-	  return TRUE;
-	} 
-    }
-  
-  ErrorF ("Failed to open TSLib device, tried ");
-  for (i = j; i < NUM_TS_NAMES; i++)    
-    ErrorF ("%s ", TsNames[i]);
-  ErrorF (".\n");
-  if (!TsNames[0]) 
-    ErrorF ("Try setting TSLIB_TSDEVICE to valid /dev entry?\n");
-  
-  if (fd > 0) 
-    close(fd);
-  
-  return FALSE;
+    if (private->tsDev)
+        ts_close(private->tsDev);
+    private->fd = 0;
+    private->tsDev = NULL;
+}
+
+
+static Status
+TslibInit (KdPointerInfo *pi)
+{
+    int		        fd = 0, i = 0;
+    char                devpath[PATH_MAX], devname[TS_NAME_SIZE];
+    DIR                 *inputdir = NULL;
+    struct dirent       *inputent = NULL;
+    struct tsdev        *tsDev = NULL;
+    struct TslibPrivate *private = NULL;
+
+    if (!pi || !pi->dixdev)
+        return !Success;
+    
+    pi->driverPrivate = (struct TslibPrivate *)
+                        xcalloc(sizeof(struct TslibPrivate), 1);
+    if (!pi->driverPrivate)
+        return !Success;
+
+    private = pi->driverPrivate;
+    /* hacktastic */
+    private->phys_screen = 0;
+    pi->nAxes = 3;
+    pi->name = KdSaveString("Touchscreen");
+    pi->inputClass = KD_TOUCHSCREEN;
+#ifdef DEBUG
+    ErrorF("[tslib/TslibInit] successfully inited for device %s\n", pi->path);
+#endif
+
+    return Success;
 }
 
+
 static void
-TslibFini (void)
+TslibFini (KdPointerInfo *pi)
 {
-    KdMouseInfo	*mi;
-
-    KdUnregisterFds (TsInputType, TRUE);
-    for (mi = kdMouseInfo; mi; mi = mi->next)
-    {
-	if (mi->inputType == TsInputType)
-	{
-	    if(mi->driver) 
-	      {
-		ts_close(tsDev);
-		tsDev = NULL;
-	      }
-	    mi->driver    = 0;
-
-	    /* If below is set to 0, then MouseInit() will trash it,
-	     * setting to 'mouse type' ( via server reset). Therefore 
-             * Leave it alone and work around in TslibInit()  ( see
-             * req_type ).
-	    */
-	    /* mi->inputType = 0; */
-	}
+    if (pi->driverPrivate) {
+        xfree(pi->driverPrivate);
+        pi->driverPrivate = NULL;
     }
 }
 
-KdMouseFuncs TsFuncs = {
+
+KdPointerDriver TsDriver = {
+    "tslib",
     TslibInit,
-    TslibFini
+    TslibEnable,
+    TslibDisable,
+    TslibFini,
+    NULL,
 };
diff --git a/hw/kdrive/src/Makefile.am b/hw/kdrive/src/Makefile.am
index 53d5095..20fae55 100644
--- a/hw/kdrive/src/Makefile.am
+++ b/hw/kdrive/src/Makefile.am
@@ -24,7 +24,7 @@ libkdrive_a_SOURCES =	\
 	kdrive.h	\
 	kinfo.c		\
 	kinput.c	\
-	kkeymap.h	\
+	kkeymap.c	\
 	kmap.c		\
 	kmode.c		\
 	knoop.c		\
@@ -37,5 +37,4 @@ libkdrive_a_SOURCES =	\
         $(top_srcdir)/mi/miinitext.c
 
 libkdrivestubs_a_SOURCES = \
-        $(top_srcdir)/Xi/stubs.c \
         $(top_srcdir)/fb/fbcmap.c
diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
index 52e56e9..05102ab 100644
--- a/hw/kdrive/src/kdrive.c
+++ b/hw/kdrive/src/kdrive.c
@@ -43,6 +43,12 @@
 #include "dpmsproc.h"
 #endif
 
+#ifdef HAVE_EXECINFO_H
+#include <execinfo.h>
+#endif
+
+#include <signal.h>
+
 typedef struct _kdDepths {
     CARD8   depth;
     CARD8   bpp;
@@ -60,6 +66,8 @@ KdDepths    kdDepths[] = {
 
 #define NUM_KD_DEPTHS (sizeof (kdDepths) / sizeof (kdDepths[0]))
 
+#define KD_DEFAULT_BUTTONS 5
+
 int                 kdScreenPrivateIndex;
 unsigned long       kdGeneration;
 
@@ -76,6 +84,8 @@ Bool		    kdSwitchPending;
 char		    *kdSwitchCmd;
 DDXPointRec	    kdOrigin;
 
+static Bool         kdCaughtSignal = FALSE;
+
 /*
  * Carry arguments from InitOutput through driver initialization
  * to KdScreenInit
@@ -368,6 +378,9 @@ AbortDDX(void)
 	(*kdOsFuncs->Fini) ();
 	KdDoSwitchCmd ("stop");
     }
+
+    if (kdCaughtSignal)
+        abort();
 }
 
 void
@@ -379,7 +392,7 @@ ddxGiveUp ()
 Bool	kdDumbDriver;
 Bool	kdSoftCursor;
 
-static char *
+char *
 KdParseFindNext (char *cur, char *delim, char *save, char *last)
 {
     while (*cur && !strchr (delim, *cur))
@@ -560,97 +573,6 @@ KdSaveString (char *str)
     return n;
 }
 
-/*
- * Parse mouse information.  Syntax:
- *
- *  <device>,<nbutton>,<protocol>{,<option>}...
- *
- * options: {nmo}   pointer mapping (e.g. {321})
- *	    2button emulate middle button
- *	    3button dont emulate middle button
- */
-
-void
-KdParseMouse (char *arg)
-{
-    char	save[1024];
-    char	delim;
-    KdMouseInfo	*mi;
-    int		i;
-    
-    mi = KdMouseInfoAdd ();
-    if (!mi)
-	return;
-    mi->name = 0;
-    mi->prot = 0;
-    mi->emulateMiddleButton = kdEmulateMiddleButton;
-    mi->transformCoordinates = !kdRawPointerCoordinates;
-    mi->nbutton = 3;
-    for (i = 0; i < KD_MAX_BUTTON; i++)
-	mi->map[i] = i + 1;
-    
-    if (!arg)
-	return;
-    if (strlen (arg) >= sizeof (save))
-	return;
-    arg = KdParseFindNext (arg, ",", save, &delim);
-    if (!save[0])
-	return;
-    mi->name = KdSaveString (save);
-    if (delim != ',')
-	return;
-    
-    arg = KdParseFindNext (arg, ",", save, &delim);
-    if (!save[0])
-	return;
-    
-    if ('1' <= save[0] && save[0] <= '0' + KD_MAX_BUTTON && save[1] == '\0')
-    {
-        mi->nbutton = save[0] - '0';
-	if (mi->nbutton > KD_MAX_BUTTON)
-	{
-	    UseMsg ();
-	    return;
-	}
-    }
-    
-    if (!delim != ',')
-	return;
-    
-    arg = KdParseFindNext (arg, ",", save, &delim);
-    
-    if (save[0])
-	mi->prot = KdSaveString (save);
-    
-    while (delim == ',')
-    {
-	arg = KdParseFindNext (arg, ",", save, &delim);
-	if (save[0] == '{')
-	{
-	    char	*s = save + 1;
-	    i = 0;
-	    while (*s && *s != '}')
-	    {
-		if ('1' <= *s && *s <= '0' + mi->nbutton)
-		    mi->map[i] = *s - '0';
-		else
-		    UseMsg ();
-		s++;
-	    }
-	}
-	else if (!strcmp (save, "2button"))
-	    mi->emulateMiddleButton = TRUE;
-	else if (!strcmp (save, "3button"))
-	    mi->emulateMiddleButton = FALSE;
-	else if (!strcmp (save, "rawcoord"))
-	    mi->transformCoordinates = FALSE;
-	else if (!strcmp (save, "transform"))
-	    mi->transformCoordinates = TRUE;
-	else
-	    UseMsg ();
-    }
-}
-
 void
 KdParseRgba (char *rgba)
 {
@@ -697,6 +619,8 @@ KdProcessArgument (int argc, char **argv
 {
     KdCardInfo	    *card;
     KdScreenInfo    *screen;
+    KdPointerInfo   *pi;
+    KdKeyboardInfo  *ki;
 
     if (!strcmp (argv[i], "-card"))
     {
@@ -736,6 +660,11 @@ KdProcessArgument (int argc, char **argv
 	kdDontZap = TRUE;
 	return 1;
     }
+    if (!strcmp (argv[i], "-nozap"))
+    {
+	kdDontZap = TRUE;
+	return 1;
+    }
     if (!strcmp (argv[i], "-3button"))
     {
 	kdEmulateMiddleButton = FALSE;
@@ -785,14 +714,6 @@ KdProcessArgument (int argc, char **argv
 	    UseMsg ();
 	return 2;
     }
-    if (!strcmp (argv[i], "-mouse"))
-    {
-	if ((i+1) < argc)
-	    KdParseMouse (argv[i+1]);
-	else
-	    UseMsg ();
-	return 2;
-    }
     if (!strcmp (argv[i], "-rgba"))
     {
 	if ((i+1) < argc)
@@ -814,6 +735,20 @@ KdProcessArgument (int argc, char **argv
     {
 	return 1;
     }
+    if (!strcmp (argv[i], "-mouse") ||
+        !strcmp (argv[i], "-pointer")) {
+        if (i + 1 >= argc)
+            UseMsg();
+        KdAddConfigPointer(argv[i + 1]);
+        return 2;
+    }
+    if (!strcmp (argv[i], "-keybd")) {
+        if (i + 1 >= argc)
+            UseMsg();
+        KdAddConfigKeyboard(argv[i + 1]);
+        return 2;
+    }
+
 #ifdef PSEUDO8
     return p8ProcessArgument (argc, argv, i);
 #else
@@ -1420,6 +1355,39 @@ KdDepthToFb (ScreenPtr	pScreen, int dept
 
 #endif
 
+#ifdef HAVE_BACKTRACE
+/* shamelessly ripped from xf86Events.c */
+void
+KdBacktrace (int signum)
+{
+    void *array[32]; /* more than 32 and you have bigger problems */
+    size_t size, i;
+    char **strings;
+
+    signal(signum, SIG_IGN);
+
+    size = backtrace (array, 32);
+    fprintf (stderr, "\nBacktrace (%d deep):\n", size);
+    strings = backtrace_symbols (array, size);
+    for (i = 0; i < size; i++)
+        fprintf (stderr, "%d: %s\n", i, strings[i]);
+    free (strings);
+    
+    kdCaughtSignal = TRUE;    
+    if (signum == SIGSEGV)
+        FatalError("Segmentation fault caught\n");
+    else if (signum > 0)
+        FatalError("Signal %d caught\n", signum);
+}
+#else
+void
+KdBacktrace (int signum)
+{
+    kdCaughtSignal = TRUE;
+    FatalError("Segmentation fault caught\n");
+}
+#endif
+
 void
 KdInitOutput (ScreenInfo    *pScreenInfo,
 	      int	    argc,
@@ -1427,6 +1395,10 @@ KdInitOutput (ScreenInfo    *pScreenInfo
 {
     KdCardInfo	    *card;
     KdScreenInfo    *screen;
+
+    /* kind of a hack: we want Composite enabled, but it's disabled per
+     * default. */
+    noCompositeExtension = FALSE;
     
     if (!kdCardInfo)
     {
@@ -1464,6 +1436,8 @@ KdInitOutput (ScreenInfo    *pScreenInfo
     for (card = kdCardInfo; card; card = card->next)
 	for (screen = card->screenList; screen; screen = screen->next)
 	    KdAddScreen (pScreenInfo, screen, argc, argv);
+
+    signal(SIGSEGV, KdBacktrace);
 }
 
 #ifdef DPMSExtension
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index c371263..843f921 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -47,6 +47,10 @@
 #include "shadow.h"
 #include "randrstr.h"
 
+#ifdef XKB
+#include <X11/extensions/XKBstr.h>
+#endif
+
 extern WindowPtr    *WindowTable;
 
 #define KD_DPMS_NORMAL	    0
@@ -63,6 +67,8 @@ extern WindowPtr    *WindowTable;
 #define KD_MAX_CARD_ADDRESS 8
 #endif
 
+#define Status int
+
 /*
  * Configuration information per video card
  */
@@ -215,7 +221,7 @@ typedef struct {
 #endif
 } KdPrivScreenRec, *KdPrivScreenPtr;
 
-typedef enum _kdMouseState {
+typedef enum _kdPointerState {
     start,
     button_1_pend,
     button_1_down,
@@ -226,51 +232,135 @@ typedef enum _kdMouseState {
     synth_2_down_3,
     synth_2_down_1,
     num_input_states
-} KdMouseState;
+} KdPointerState;
 
-#define KD_MAX_BUTTON  7
+#define KD_MAX_BUTTON  16
 
-typedef struct _KdMouseInfo {
-    struct _KdMouseInfo	*next;
-    void		*driver;
-    void		*closure;
-    char		*name;
-    char		*prot;
-    char		map[KD_MAX_BUTTON];
-    int			nbutton;
-    Bool		emulateMiddleButton;
-    unsigned long	emulationTimeout;
-    Bool		timeoutPending;
-    KdMouseState	mouseState;
-    Bool		eventHeld;
-    xEvent		heldEvent;
-    unsigned char	buttonState;
-    int			emulationDx, emulationDy;
-    int			inputType;
-    Bool		transformCoordinates;
-} KdMouseInfo;
+#define KD_KEYBOARD 1
+#define KD_MOUSE 2
+#define KD_TOUCHSCREEN 3
+
+typedef struct _KdPointerInfo KdPointerInfo;
+
+typedef struct _KdPointerDriver {
+    char                    *name;
+    Status                  (*Init)    (KdPointerInfo *);
+    Status                  (*Enable)  (KdPointerInfo *);
+    void                    (*Disable) (KdPointerInfo *);
+    void                    (*Fini)    (KdPointerInfo *);
+    struct _KdPointerDriver *next;
+} KdPointerDriver;
+
+struct _KdPointerInfo {
+    DeviceIntPtr          dixdev;
+    char                  *name;
+    char                  *path;
+    InputOption           *options;
+    int                   inputClass;
+
+    CARD8                 map[KD_MAX_BUTTON];
+    int                   nButtons;
+    int                   nAxes;
+
+    Bool                  emulateMiddleButton;
+    unsigned long         emulationTimeout;
+    int                   emulationDx, emulationDy;
+
+    Bool                  timeoutPending;
+    KdPointerState        mouseState;
+    Bool                  eventHeld;
+    struct {
+        int type;
+        int x;
+        int y;
+        int z;
+        int flags;
+        int absrel;
+    } heldEvent;         
+    unsigned char         buttonState;
+    Bool                  transformCoordinates;
+    int                   pressureThreshold;
 
-extern KdMouseInfo	*kdMouseInfo;
+    KdPointerDriver       *driver;
+    void                  *driverPrivate;
+
+    struct _KdPointerInfo *next;
+};
 
 extern int KdCurScreen;
 
-KdMouseInfo *KdMouseInfoAdd (void);
-void	    KdMouseInfoDispose (KdMouseInfo *mi);
-void	    KdParseMouse (char *);
+void KdAddPointerDriver (KdPointerDriver *driver);
+void KdRemovePointerDriver (KdPointerDriver *driver);
+KdPointerInfo *KdNewPointer (void);
+void KdFreePointer (KdPointerInfo *);
+int KdAddPointer (KdPointerInfo *ki);
+int KdAddConfigPointer (char *pointer);
+void KdRemovePointer (KdPointerInfo *ki);
 
-typedef struct _KdMouseFuncs {
-    Bool    	    (*Init) (void);
-    void	    (*Fini) (void);
-} KdMouseFuncs;
 
-typedef struct _KdKeyboardFuncs {
-    void	    (*Load) (void);
-    int		    (*Init) (void);
-    void	    (*Leds) (int);
-    void	    (*Bell) (int, int, int);
-    void	    (*Fini) (void);
-    int		    LockLed;
-} KdKeyboardFuncs;
+#define KD_KEY_COUNT 248
+#define KD_MIN_KEYCODE  8
+#define KD_MAX_KEYCODE  255
+#define KD_MAX_WIDTH    4
+#define KD_MAX_LENGTH   (KD_MAX_KEYCODE - KD_MIN_KEYCODE + 1)
+
+typedef struct {
+    KeySym modsym;
+    int    modbit;
+} KdKeySymModsRec;
+
+extern const KeySym       kdDefaultKeymap[KD_MAX_LENGTH * KD_MAX_WIDTH];
+extern const int          kdDefaultKeymapWidth;
+extern const CARD8        kdDefaultModMap[MAP_LENGTH];
+extern const KeySymsRec   kdDefaultKeySyms;
+
+typedef struct _KdKeyboardInfo KdKeyboardInfo;
+
+typedef struct _KdKeyboardDriver {
+    char                  *name;
+    Bool                  (*Init)    (KdKeyboardInfo *);
+    Bool                  (*Enable)  (KdKeyboardInfo *);
+    void                  (*Leds)    (KdKeyboardInfo *, int);
+    void                  (*Bell)    (KdKeyboardInfo *, int, int, int);
+    void                  (*Disable) (KdKeyboardInfo *);
+    void                  (*Fini)    (KdKeyboardInfo *);
+    struct _KdKeyboardDriver *next;
+} KdKeyboardDriver;
+
+struct _KdKeyboardInfo {
+    struct _KdKeyboardInfo *next;
+    DeviceIntPtr        dixdev;
+    void                *closure;
+    char                *name;
+    char                *path;
+    int                 inputClass;
+#ifdef XKB
+    XkbDescPtr          xkb;
+#endif
+    int                 LockLed;
+
+    CARD8               keyState[KD_KEY_COUNT/8];
+    int                 minScanCode;
+    int                 maxScanCode;
+    CARD8               modmap[MAP_LENGTH];
+    KeySymsRec          keySyms; 
+
+    int                 leds;
+    int                 bellPitch;
+    int                 bellDuration;
+    InputOption         *options;
+
+    KdKeyboardDriver    *driver;
+    void                *driverPrivate;
+};
+
+void KdAddKeyboardDriver (KdKeyboardDriver *driver);
+void KdRemoveKeyboardDriver (KdKeyboardDriver *driver);
+KdKeyboardInfo *KdNewKeyboard (void);
+void KdFreeKeyboard (KdKeyboardInfo *ki);
+int KdAddConfigKeyboard (char *pointer);
+int KdAddKeyboard (KdKeyboardInfo *ki);
+void KdRemoveKeyboard (KdKeyboardInfo *ki);
 
 typedef struct _KdOsFuncs {
     int		    (*Init) (void);
@@ -307,9 +397,9 @@ typedef struct _KdMonitorTiming {
 extern const KdMonitorTiming	kdMonitorTimings[];
 extern const int		kdNumMonitorTimings;
 
-typedef struct _KdMouseMatrix {
+typedef struct _KdPointerMatrix {
     int	    matrix[2][3];
-} KdMouseMatrix;
+} KdPointerMatrix;
 
 typedef struct _KaaTrapezoid {
     float tl, tr, ty;
@@ -628,8 +718,14 @@ KdParseScreen (KdScreenInfo *screen,
 char *
 KdSaveString (char *str);
 
-void
-KdParseMouse (char *arg);
+KdPointerInfo *
+KdParsePointer (char *arg);
+
+KdKeyboardInfo *
+KdParseKeyboard (char *arg);
+
+char *
+KdParseFindNext (char *cur, char *delim, char *save, char *last);
 
 void
 KdParseRgba (char *rgba);
@@ -677,6 +773,9 @@ KdInitOutput (ScreenInfo    *pScreenInfo
  
 void
 KdSetSubpixelOrder (ScreenPtr pScreen, Rotation randr);
+
+void
+KdBacktrace (int signum);
     
 /* kinfo.c */
 KdCardInfo *
@@ -699,53 +798,51 @@ KdScreenInfoDispose (KdScreenInfo *si);
 
 /* kinput.c */
 void
-KdInitInput(KdMouseFuncs *, KdKeyboardFuncs *);
+KdInitInput(void);
 
 void
-KdAddMouseDriver(KdMouseFuncs *);
+KdAddPointerDriver(KdPointerDriver *);
 
-int
-KdAllocInputType (void);
+void
+KdAddKeyboardDriver(KdKeyboardDriver *);
 
 Bool
-KdRegisterFd (int type, int fd, void (*read) (int fd, void *closure), void *closure);
+KdRegisterFd (int fd, void (*read) (int fd, void *closure), void *closure);
 
 void
-KdRegisterFdEnableDisable (int fd, 
-			   int (*enable) (int fd, void *closure),
-			   void (*disable) (int fd, void *closure));
+KdUnregisterFds (void *closure, Bool do_close);
 
 void
-KdUnregisterFds (int type, Bool do_close);
-
-void
-KdEnqueueKeyboardEvent(unsigned char	scan_code,
-		       unsigned char	is_up);
+KdEnqueueKeyboardEvent(KdKeyboardInfo *ki, unsigned char scan_code,
+                    unsigned char is_up);
 
 #define KD_BUTTON_1	0x01
 #define KD_BUTTON_2	0x02
 #define KD_BUTTON_3	0x04
 #define KD_BUTTON_4	0x08
 #define KD_BUTTON_5	0x10
+#define KD_BUTTON_8	0x80
 #define KD_MOUSE_DELTA	0x80000000
 
 void
-KdEnqueueMouseEvent(KdMouseInfo *mi, unsigned long flags, int x, int y);
+KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
+                      int rz);
 
 void
-KdEnqueueMotionEvent (KdMouseInfo *mi, int x, int y);
+_KdEnqueuePointerEvent(KdPointerInfo *pi, int type, int x, int y, int z,
+                       int b, int absrel, Bool force);
 
 void
 KdReleaseAllKeys (void);
     
 void
-KdSetLed (int led, Bool on);
+KdSetLed (KdKeyboardInfo *ki, int led, Bool on);
 
 void
-KdSetMouseMatrix (KdMouseMatrix *matrix);
+KdSetPointerMatrix (KdPointerMatrix *pointer);
 
 void
-KdComputeMouseMatrix (KdMouseMatrix *matrix, Rotation randr, int width, int height);
+KdComputePointerMatrix (KdPointerMatrix *pointer, Rotation randr, int width, int height);
     
 void
 KdBlockHandler (int		screen,
@@ -768,19 +865,17 @@ KdEnableInput (void);
 void
 ProcessInputEvents (void);
 
-extern KdMouseFuncs	LinuxMouseFuncs;
-extern KdMouseFuncs	LinuxEvdevFuncs;
-extern KdMouseFuncs	Ps2MouseFuncs;
-extern KdMouseFuncs	BusMouseFuncs;
-extern KdMouseFuncs	MsMouseFuncs;
-#ifdef TOUCHSCREEN
-extern KdMouseFuncs	TsFuncs;
-#endif
-extern KdKeyboardFuncs	LinuxKeyboardFuncs;
+extern KdPointerDriver	LinuxMouseDriver;
+extern KdPointerDriver	LinuxEvdevDriver;
+extern KdPointerDriver	Ps2MouseDriver;
+extern KdPointerDriver	BusMouseDriver;
+extern KdPointerDriver	MsMouseDriver;
+extern KdPointerDriver	TsDriver;
+extern KdKeyboardDriver	LinuxKeyboardDriver;
 extern KdOsFuncs	LinuxFuncs;
 
-extern KdMouseFuncs	VxWorksMouseFuncs;
-extern KdKeyboardFuncs	VxWorksKeyboardFuncs;
+extern KdPointerDriver	VxWorksMouseDriver;
+extern KdKeyboardDriver	VxWorksKeyboardDriver;
 extern KdOsFuncs	VxWorksFuncs;
 
 /* kmap.c */
diff --git a/hw/kdrive/src/kinfo.c b/hw/kdrive/src/kinfo.c
index 3ba7687..1d81ed3 100644
--- a/hw/kdrive/src/kinfo.c
+++ b/hw/kdrive/src/kinfo.c
@@ -101,7 +101,7 @@ KdScreenInfoDispose (KdScreenInfo *si)
     KdCardInfo	    *ci = si->card;
     KdScreenInfo    **prev;
 
-    for (prev = &ci->screenList; *prev; prev = &(*prev)->next)
+    for (prev = &ci->screenList; *prev; prev = &(*prev)->next) {
 	if (*prev == si)
 	{
 	    *prev = si->next;
@@ -110,38 +110,63 @@ KdScreenInfoDispose (KdScreenInfo *si)
 		KdCardInfoDispose (ci);
 	    break;
 	}
+    }
 }
 
-KdMouseInfo *kdMouseInfo;
-
-KdMouseInfo *
-KdMouseInfoAdd (void)
+KdPointerInfo *
+KdNewPointer (void)
 {
-    KdMouseInfo	*mi, **prev;
+    KdPointerInfo *pi;
+
+    pi = (KdPointerInfo *)xcalloc(1, sizeof(KdPointerInfo));
+    if (!pi)
+        return NULL;
+
+    pi->name = KdSaveString("Generic Pointer");
+    pi->path = NULL;
+    pi->inputClass = KD_MOUSE;
+    pi->driver = NULL;
+    pi->driverPrivate = NULL;
+    pi->next = NULL;
+    pi->options = NULL;
+    pi->nAxes = 3;
 
-    mi = (KdMouseInfo *) xalloc (sizeof (KdMouseInfo));
-    if (!mi)
-	return 0;
-    bzero (mi, sizeof (KdMouseInfo));
-    for (prev = &kdMouseInfo; *prev; prev = &(*prev)->next);
-    *prev = mi;
-    return mi;
+    return pi;
 }
 
 void
-KdMouseInfoDispose (KdMouseInfo *mi)
+KdFreePointer(KdPointerInfo *pi)
 {
-    KdMouseInfo	**prev;
+    InputOption *option, *prev = NULL;
 
-    for (prev = &kdMouseInfo; *prev; prev = &(*prev)->next)
-	if (*prev == mi)
-	{
-	    *prev = mi->next;
-	    if (mi->name)
-		xfree (mi->name);
-	    if (mi->prot)
-		xfree (mi->prot);
-	    xfree (mi);
-	    break;
-	}
+    if (pi->name)
+        xfree(pi->name);
+    if (pi->path)
+        xfree(pi->path);
+
+    for (option = pi->options; option; option = option->next) {
+        if (prev)
+            xfree(prev);
+        if (option->key)
+            xfree(option->key);
+        if (option->value)
+            xfree(option->value);
+        prev = option;
+    }
+
+    if (prev)
+        xfree(prev);
+    
+    xfree(pi);
+}
+ 
+void
+KdFreeKeyboard(KdKeyboardInfo *ki)
+{
+    if (ki->name)
+        xfree(ki->name);
+    if (ki->path)
+        xfree(ki->path);
+    ki->next = NULL;
+    xfree(ki);
 }
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index f671eb6..94c3abd 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -2,20 +2,21 @@
  * Id: kinput.c,v 1.1 1999/11/02 03:54:46 keithp Exp $
  *
  * Copyright © 1999 Keith Packard
+ * Copyright © 2006 Nokia Corporation
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
  * the above copyright notice appear in all copies and that both that
  * copyright notice and this permission notice appear in supporting
- * documentation, and that the name of Keith Packard not be used in
+ * documentation, and that the name of the authors not be used in
  * advertising or publicity pertaining to distribution of the software without
- * specific, written prior permission.  Keith Packard makes no
+ * specific, written prior permission.  The authors make no
  * representations about the suitability of this software for any purpose.  It
  * is provided "as is" without express or implied warranty.
  *
- * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * THE AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
- * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
@@ -34,7 +35,6 @@
 #if HAVE_X11_XF86KEYSYM_H
 #include <X11/XF86keysym.h>
 #endif
-#include "kkeymap.h"
 #include <signal.h>
 #include <stdio.h>
 #ifdef sun
@@ -45,58 +45,60 @@
 #include <X11/extensions/XKBsrv.h>
 #endif
 
-static DeviceIntPtr	pKdKeyboard, pKdPointer;
+#ifdef XINPUT
+#include <X11/extensions/XI.h>
+#include <X11/extensions/XIproto.h>
+#include "exevents.h"
+#include "extinit.h"
+#include "exglobals.h"
+#endif
+
+#define AtomFromName(x) MakeAtom(x, strlen(x), 1)
+
+struct KdConfigDevice {
+    char *line;
+    struct KdConfigDevice *next;
+};
+
+/* kdKeyboards and kdPointers hold all the real devices. */
+static KdKeyboardInfo *kdKeyboards         = NULL;
+static KdPointerInfo  *kdPointers          = NULL;
+static struct KdConfigDevice *kdConfigKeyboards   = NULL;
+static struct KdConfigDevice *kdConfigPointers    = NULL;
 
-#define MAX_MOUSE_DRIVERS   4
+static KdKeyboardDriver *kdKeyboardDrivers = NULL;
+static KdPointerDriver  *kdPointerDrivers  = NULL;
 
-static KdMouseFuncs	*kdMouseFuncs[MAX_MOUSE_DRIVERS];
-static int		kdNMouseFuncs;
-static KdKeyboardFuncs	*kdKeyboardFuncs;
-static int		kdBellPitch;
-static int		kdBellDuration;
-static int		kdLeds;
 static Bool		kdInputEnabled;
 static Bool		kdOffScreen;
 static unsigned long	kdOffScreenTime;
-static KdMouseMatrix	kdMouseMatrix = {
+static KdPointerMatrix	kdPointerMatrix = {
    { { 1, 0, 0 },
      { 0, 1, 0 } }
 };
 
-int		kdMouseButtonCount;
-int		kdMinScanCode;
-int		kdMaxScanCode;
-int		kdMinKeyCode;
-int		kdMaxKeyCode;
-int		kdKeymapWidth = KD_MAX_WIDTH;
-KeySym		kdKeymap[KD_MAX_LENGTH * KD_MAX_WIDTH];
-CARD8		kdModMap[MAP_LENGTH];
-KeySymsRec	kdKeySyms;
-
-
-void
-KdResetInputMachine (void);
+void KdResetInputMachine (void);
     
-#define KD_KEY_COUNT		248
-
-CARD8		kdKeyState[KD_KEY_COUNT/8];
-
-#define IsKeyDown(key) ((kdKeyState[(key) >> 3] >> ((key) & 7)) & 1)
+#define IsKeyDown(ki, key) ((ki->keyState[(key) >> 3] >> ((key) & 7)) & 1)
+#define KEYMAP(ki)        (ki->dixdev->key->curKeySyms)
+#define KEYMAPDDX(ki)     (ki->keySyms)
+#define KEYCOL1(ki, k)    (KEYMAP(ki).map[((k)-(KEYMAP(ki).minKeyCode))*KEYMAP(ki).mapWidth])
+#define KEYCOL1DDX(ki, k) (KEYMAPDDX(ki).map[((k)-(KEYMAPDDX(ki).minKeyCode))*KEYMAPDDX(ki).mapWidth])
 
 #define KD_MAX_INPUT_FDS    8
 
 typedef struct _kdInputFd {
-    int	    type;
-    int	    fd;
-    void    (*read) (int fd, void *closure);
-    int	    (*enable) (int fd, void *closure);
-    void    (*disable) (int fd, void *closure);
-    void    *closure;
+    int	        fd;
+    void        (*read) (int fd, void *closure);
+    int	        (*enable) (int fd, void *closure);
+    void        (*disable) (int fd, void *closure);
+    void        *closure;
 } KdInputFd;
 
-KdInputFd    	kdInputFds[KD_MAX_INPUT_FDS];
-int		kdNumInputFds;
-int		kdInputTypeSequence;
+static KdInputFd kdInputFds[KD_MAX_INPUT_FDS];
+static int	 kdNumInputFds;
+
+extern Bool      kdRawPointerCoordinates;
 
 static void
 KdSigio (int sig)
@@ -137,8 +139,10 @@ KdAssertSigioBlocked (char *where)
 
     sigemptyset (&set);
     sigprocmask (SIG_BLOCK, &set, &old);
-    if (!sigismember (&old, SIGIO))
+    if (!sigismember (&old, SIGIO)) {
 	ErrorF ("SIGIO not blocked at %s\n", where);
+        KdBacktrace();
+    }
 }
 
 #else
@@ -155,6 +159,17 @@ static int  kdnFds;
 #define NOBLOCK FNDELAY
 #endif
 
+void
+KdResetInputMachine (void)
+{
+    KdPointerInfo *pi;
+
+    for (pi = kdPointers; pi; pi = pi->next) {
+        pi->mouseState = start;
+        pi->eventHeld = FALSE;
+    }
+}
+
 static void
 KdNonBlockFd (int fd)
 {
@@ -205,98 +220,126 @@ KdRemoveFd (int fd)
     }
 }
 
-int
-KdAllocInputType (void)
-{
-    return ++kdInputTypeSequence;
-}
-
 Bool
-KdRegisterFd (int type, int fd, void (*read) (int fd, void *closure), void *closure)
+KdRegisterFd (int fd, void (*read) (int fd, void *closure), void *closure)
 {
     if (kdNumInputFds == KD_MAX_INPUT_FDS)
 	return FALSE;
-    kdInputFds[kdNumInputFds].type = type;
     kdInputFds[kdNumInputFds].fd = fd;
     kdInputFds[kdNumInputFds].read = read;
     kdInputFds[kdNumInputFds].enable = 0;
     kdInputFds[kdNumInputFds].disable = 0;
     kdInputFds[kdNumInputFds].closure = closure;
-    ++kdNumInputFds;
+    kdNumInputFds++;
     if (kdInputEnabled)
 	KdAddFd (fd);
     return TRUE;
 }
 
 void
-KdRegisterFdEnableDisable (int fd, 
-			   int (*enable) (int fd, void *closure),
-			   void (*disable) (int fd, void *closure))
-{
-    int	i;
-    
-    for (i = 0; i < kdNumInputFds; i++)
-	if (kdInputFds[i].fd == fd)
-	{
-	    kdInputFds[i].enable = enable;
-	    kdInputFds[i].disable = disable;
-	    break;
-	}
-}
-			   
-void
-KdUnregisterFds (int type, Bool do_close)
+KdUnregisterFd (void *closure, int fd, Bool do_close)
 {
     int	i, j;
 
-    for (i = 0; i < kdNumInputFds;)
-    {
-	if (kdInputFds[i].type == type)
-	{
+    for (i = 0; i < kdNumInputFds; i++) {
+	if (kdInputFds[i].closure == closure &&
+            kdInputFds[i].fd == fd) {
 	    if (kdInputEnabled)
 		KdRemoveFd (kdInputFds[i].fd);
 	    if (do_close)
 		close (kdInputFds[i].fd);
-	    --kdNumInputFds;
+	    kdNumInputFds--;
 	    for (j = i; j < kdNumInputFds; j++)
 		kdInputFds[j] = kdInputFds[j+1];
+            break;
 	}
-	else
-	    i++;
     }
 }
 
 void
 KdDisableInput (void)
 {
-    int	i;
-
-    KdBlockSigio ();
-
-    for (i = 0; i < kdNumInputFds; i++)
-    {
-	KdRemoveFd (kdInputFds[i].fd);
-	if (kdInputFds[i].disable)
-	    (*kdInputFds[i].disable) (kdInputFds[i].fd, kdInputFds[i].closure);
+    KdKeyboardInfo *ki;
+    KdPointerInfo *pi;
+    int found = 0, i = 0;
+
+    KdBlockSigio();
+
+    for (ki = kdKeyboards; ki; ki = ki->next) {
+        if (ki->driver && ki->driver->Disable)
+            (*ki->driver->Disable) (ki);
+    }
+
+    for (pi = kdPointers; pi; pi = pi->next) {
+        if (pi->driver && pi->driver->Disable)
+            (*pi->driver->Disable) (pi);
+    }
+
+    if (kdNumInputFds) {
+        ErrorF("[KdDisableInput] Buggy drivers: still %d input fds left!",
+               kdNumInputFds);
+        i = 0;
+        while (i < kdNumInputFds) {
+            found = 0;
+            for (ki = kdKeyboards; ki; ki = ki->next) {
+                if (ki == kdInputFds[i].closure) {
+                    ErrorF("    fd %d belongs to keybd driver %s\n",
+                           kdInputFds[i].fd,
+                           ki->driver && ki->driver->name ?
+                             ki->driver->name : "(unnamed!)");
+                    found = 1;
+                    break;
+                }
+            }
+
+            if (found) {
+                i++;
+                continue;
+            }
+
+            for (pi = kdPointers; pi; pi = pi->next) {
+                if (pi == kdInputFds[i].closure) {
+                    ErrorF("    fd %d belongs to pointer driver %s\n",
+                           kdInputFds[i].fd,
+                           pi->driver && pi->driver->name ?
+                             pi->driver->name : "(unnamed!)");
+                    break;
+                }
+            }
+
+            if (found) {
+                i++;
+                continue;
+            }
+
+            ErrorF("    fd %d not claimed by any active device!\n",
+                   kdInputFds[i].fd);
+            KdUnregisterFd(kdInputFds[i].closure, kdInputFds[i].fd, TRUE);
+        }
     }
+
     kdInputEnabled = FALSE;
 }
 
 void
 KdEnableInput (void)
 {
-    xEvent	xE;
-    int	i;
+    xEvent xE;
+    KdKeyboardInfo *ki;
+    KdPointerInfo *pi;
     
     kdInputEnabled = TRUE;
-    for (i = 0; i < kdNumInputFds; i++)
-    {
-	KdNonBlockFd (kdInputFds[i].fd);
-	if (kdInputFds[i].enable)
-	    kdInputFds[i].fd = (*kdInputFds[i].enable) (kdInputFds[i].fd, kdInputFds[i].closure);
-	KdAddFd (kdInputFds[i].fd);
+
+    for (ki = kdKeyboards; ki; ki = ki->next) {
+        if (ki->driver && ki->driver->Enable)
+            (*ki->driver->Enable) (ki);
     }
-    
+
+    for (pi = kdPointers; pi; pi = pi->next) {
+        if (pi->driver && pi->driver->Enable)
+            (*pi->driver->Enable) (pi);
+    }
+
     /* reset screen saver */
     xE.u.keyButtonPointer.time = GetTimeInMillis ();
     NoticeEventTime (&xE);
@@ -304,45 +347,178 @@ KdEnableInput (void)
     KdUnblockSigio ();
 }
 
-static int
-KdMouseProc(DeviceIntPtr pDevice, int onoff)
+KdKeyboardDriver *
+KdFindKeyboardDriver (char *name)
 {
-    BYTE	map[KD_MAX_BUTTON];
-    DevicePtr	pDev = (DevicePtr)pDevice;
-    int		i;
+    KdKeyboardDriver *ret;
+
+    /* ask a stupid question ... */
+    if (!name)
+        return NULL;
     
+    for (ret = kdKeyboardDrivers; ret; ret = ret->next) {
+        if (strcmp(ret->name, name) == 0)
+            return ret;
+    }
+
+    return NULL;
+}
+
+KdPointerDriver *
+KdFindPointerDriver (char *name)
+{
+    KdPointerDriver *ret;
+
+    /* ask a stupid question ... */
+    if (!name)
+        return NULL;
+
+    for (ret = kdPointerDrivers; ret; ret = ret->next) {
+        if (strcmp(ret->name, name) == 0)
+            return ret;
+    }
+
+    return NULL;
+}
+
+static int
+KdPointerProc(DeviceIntPtr pDevice, int onoff)
+{
+    DevicePtr       pDev = (DevicePtr)pDevice;
+    int             i;
+    KdPointerInfo   *pi;
+#ifdef XINPUT
+    Atom            xiclass;
+#endif
+
     if (!pDev)
 	return BadImplementation;
-    
+
+    for (pi = kdPointers; pi; pi = pi->next) {
+        if (pi->dixdev && pi->dixdev->id == pDevice->id)
+            break;
+    }
+
+    if (!pi || !pi->dixdev || pi->dixdev->id != pDevice->id) {
+        ErrorF("[KdPointerProc] Failed to find pointer for device %d!\n",
+               pDevice->id);
+        return BadImplementation;
+    }
+
     switch (onoff)
     {
     case DEVICE_INIT:
-	for (i = 1; i <= kdMouseButtonCount; i++)
-	    map[i] = i;
-	InitPointerDeviceStruct(pDev, map, kdMouseButtonCount,
+        ErrorF("initialising pointer %s ...\n", pi->name);
+        if (!pi->driver) {
+            if (!pi->driverPrivate) {
+                ErrorF("no driver specified for %s\n", pi->name);
+                return BadImplementation;
+            }
+
+            pi->driver = KdFindPointerDriver(pi->driverPrivate);
+            if (!pi->driver) {
+                ErrorF("Couldn't find pointer driver %s\n",
+                       pi->driverPrivate ? (char *) pi->driverPrivate :
+                       "(unnamed)");
+                return !Success;
+            }
+            xfree(pi->driverPrivate);
+            pi->driverPrivate = NULL;
+        }
+
+        if (!pi->driver->Init) {
+            ErrorF("no init function\n");
+            return BadImplementation;
+        }
+
+	for (i = 1; i <= pi->nButtons; i++)
+	    pi->map[i] = i; 
+
+        if ((*pi->driver->Init) (pi) != Success) {
+            return !Success;
+        }
+
+	InitPointerDeviceStruct(pDev, pi->map, pi->nButtons,
 	    miPointerGetMotionEvents,
 	    (PtrCtrlProcPtr)NoopDDA,
 	    miPointerGetMotionBufferSize());
-	break;
+
+#ifdef XINPUT
+        if (pi->inputClass == KD_TOUCHSCREEN) {
+            InitTouchscreenClassDeviceStruct(pDevice);
+            xiclass = AtomFromName(XI_TOUCHSCREEN);
+        }
+        else {
+            xiclass = AtomFromName(XI_MOUSE);
+        }
+
+        AssignTypeAndName(pi->dixdev, xiclass,
+                          pi->name ? pi->name : "Generic KDrive Pointer");
+#endif
+
+	return Success;
 	
     case DEVICE_ON:
-	pDev->on = TRUE;
-	pKdPointer = pDevice;
-	for (i = 0; i < kdNMouseFuncs; i++)
-	    (*kdMouseFuncs[i]->Init)();
-	break;
+        if (pDev->on == TRUE)
+            return Success;
+        
+        if (!pi->driver->Enable) {
+            ErrorF("no enable function\n");
+            return BadImplementation;
+        }
+
+        if ((*pi->driver->Enable) (pi) == Success) {
+            ErrorF("initialised fine, returning success\n");
+            pDev->on = TRUE;
+            return Success;
+        }
+        else {
+            return BadImplementation;
+        }
+
+	return Success;
+
     case DEVICE_OFF:
+        if (pDev->on == FALSE) {
+            return Success;
+        }
+
+        if (!pi->driver->Disable) {
+            return BadImplementation;
+        }
+        else {
+            (*pi->driver->Disable) (pi);
+            pDev->on = FALSE;
+            return Success;
+        }
+
+        return Success;
+
     case DEVICE_CLOSE:
-	if (pDev->on)
-	{
-	    pDev->on = FALSE;
-	    pKdPointer = 0;
-	    for (i = 0; i < kdNMouseFuncs; i++)
-		(*kdMouseFuncs[i]->Fini) ();
-	}
-	break;
+        ErrorF("D_C\n");
+	if (pDev->on) {
+            if (!pi->driver->Disable) {
+                return BadImplementation;
+            }
+            (*pi->driver->Disable) (pi);
+            ErrorF("disabled\n");
+            pDev->on = FALSE;
+        }
+
+        if (!pi->driver->Fini)
+            return BadImplementation;
+
+        (*pi->driver->Fini) (pi);
+        ErrorF("finished\n");
+
+        KdRemovePointer(pi);
+        ErrorF("removed\n");
+        
+        return Success;
     }
-    return Success;
+
+    /* NOTREACHED */
+    return BadImplementation;
 }
 
 Bool
@@ -354,34 +530,54 @@ LegalModifier(unsigned int key, DevicePt
 static void
 KdBell (int volume, DeviceIntPtr pDev, pointer ctrl, int something)
 {
-    if (kdInputEnabled)
-	(*kdKeyboardFuncs->Bell) (volume, kdBellPitch, kdBellDuration);
+    KdKeyboardInfo *ki = NULL;
+
+    for (ki = kdKeyboards; ki; ki = ki->next) {
+        if (ki->dixdev && (ki->dixdev->id == pDev->id))
+            break;
+    }
+
+    if (!ki || !ki->dixdev || ki->dixdev->id != pDev->id || !ki->driver)
+        return;
+        
+    if (kdInputEnabled) {
+        if (ki->driver->Bell)
+            (*ki->driver->Bell) (ki, volume, ki->bellPitch, ki->bellDuration);
+    }
 }
 
 
 static void
-KdSetLeds (void)
+KdSetLeds (KdKeyboardInfo *ki, int leds)
 {
-    if (kdInputEnabled)
-	(*kdKeyboardFuncs->Leds) (kdLeds);
+    if (!ki || !ki->driver)
+        return;
+
+    if (kdInputEnabled) {
+        if (ki->driver->Leds)
+            (*ki->driver->Leds) (ki, leds);
+    }
 }
 
 void
-KdSetLed (int led, Bool on)
+KdSetLed (KdKeyboardInfo *ki, int led, Bool on)
 {
-    NoteLedState (pKdKeyboard, led, on);
-    kdLeds = pKdKeyboard->kbdfeed->ctrl.leds;
-    KdSetLeds ();
+    if (!ki || !ki->dixdev || !ki->dixdev->kbdfeed)
+        return;
+
+    NoteLedState (ki->dixdev, led, on);
+    KdSetLeds (ki, ki->dixdev->kbdfeed->ctrl.leds);
 }
 
 void
-KdSetMouseMatrix (KdMouseMatrix *matrix)
+KdSetPointerMatrix (KdPointerMatrix *matrix)
 {
-    kdMouseMatrix = *matrix;
+    kdPointerMatrix = *matrix;
 }
 
 void
-KdComputeMouseMatrix (KdMouseMatrix *m, Rotation randr, int width, int height)
+KdComputePointerMatrix (KdPointerMatrix *m, Rotation randr, int width,
+                        int height)
 {
     int		    x_dir = 1, y_dir = 1;
     int		    i, j;
@@ -422,73 +618,25 @@ KdComputeMouseMatrix (KdMouseMatrix *m, 
 static void
 KdKbdCtrl (DeviceIntPtr pDevice, KeybdCtrl *ctrl)
 {
-    kdLeds = ctrl->leds;
-    kdBellPitch = ctrl->bell_pitch;
-    kdBellDuration = ctrl->bell_duration;
-    KdSetLeds ();
-}
-
-static int
-KdKeybdProc(DeviceIntPtr pDevice, int onoff)
-{
-    Bool        ret;
-    DevicePtr   pDev = (DevicePtr)pDevice;
-#ifdef XKB
-    XkbComponentNamesRec names;
-#endif
+    KdKeyboardInfo *ki;
 
-    if (!pDev)
-	return BadImplementation;
+    for (ki = kdKeyboards; ki; ki = ki->next) {
+        if (ki->dixdev && ki->dixdev->id == pDevice->id)
+            break;
+    }
 
-    switch (onoff)
-    {
-    case DEVICE_INIT:
-	if (pDev != LookupKeyboardDevice())
-	{
-	    return !Success;
-	}
-#ifndef XKB
-	ret = InitKeyboardDeviceStruct(pDev,
-				       &kdKeySyms,
-				       kdModMap,
-				       KdBell, KdKbdCtrl);
-#else
-	memset(&names, 0, sizeof(XkbComponentNamesRec));
+    if (!ki || !ki->dixdev || ki->dixdev->id != pDevice->id || !ki->driver)
+        return;
 
-	XkbSetRulesDflts ("base", "pc101", "us", NULL, NULL);
-	ret = XkbInitKeyboardDeviceStruct ((DeviceIntPtr) pDev,
-					   &names,
-					   &kdKeySyms,
-					   kdModMap,
-					   KdBell, KdKbdCtrl);
-#endif
-	if (!ret)
-	    return BadImplementation;
-	break;
-    case DEVICE_ON:
-	pDev->on = TRUE;
-	pKdKeyboard = pDevice;
-	if (kdKeyboardFuncs)
-	    (*kdKeyboardFuncs->Init) ();
-	break;
-    case DEVICE_OFF:
-    case DEVICE_CLOSE:
-	pKdKeyboard = 0;
-	if (pDev->on)
-	{
-	    pDev->on = FALSE;
-	    if (kdKeyboardFuncs)
-		(*kdKeyboardFuncs->Fini) ();
-	}
-	break;
-    }
-    return Success;
+    KdSetLeds(ki, ctrl->leds);
+    ki->bellPitch = ctrl->bell_pitch;
+    ki->bellDuration = ctrl->bell_duration; 
 }
 
 extern KeybdCtrl defaultKeyboardControl;
 
 static void
-KdInitAutoRepeats (void)
+KdInitAutoRepeats (KdKeyboardInfo *ki)
 {
     int		    key_code;
     unsigned char   mask;
@@ -499,7 +647,7 @@ KdInitAutoRepeats (void)
     memset (repeats, '\0', 32);
     for (key_code = KD_MIN_KEYCODE; key_code <= KD_MAX_KEYCODE; key_code++)
     {
-	if (!kdModMap[key_code])
+	if (!ki->modmap[key_code])
 	{
 	    i = key_code >> 3;
 	    mask = 1 << (key_code & 7);
@@ -525,7 +673,6 @@ const KdKeySymModsRec kdKeySymMods[] = {
   {  XK_Hyper_L,	Mod3Mask },
   {  XK_Hyper_R,	Mod3Mask },
   {  XK_Mode_switch, Mod4Mask },
-#ifdef TOUCHSCREEN
   /* PDA specific hacks */
 #ifdef XF86XK_Start
   {  XF86XK_Start, ControlMask },
@@ -538,13 +685,12 @@ const KdKeySymModsRec kdKeySymMods[] = {
 #ifdef XF86XK_Calendar
   {  XF86XK_Calendar, Mod3Mask }
 #endif
-#endif
 };
 
 #define NUM_SYM_MODS (sizeof(kdKeySymMods) / sizeof(kdKeySymMods[0]))
 
 static void
-KdInitModMap (void)
+KdInitModMap (KdKeyboardInfo *ki)
 {
     int	    key_code;
     int	    row;
@@ -552,79 +698,589 @@ KdInitModMap (void)
     KeySym  *syms;
     int	    i;
 
-    width = kdKeySyms.mapWidth;
-    for (key_code = kdMinKeyCode; key_code <= kdMaxKeyCode; key_code++)
+    width = ki->keySyms.mapWidth;
+    for (key_code = ki->keySyms.minKeyCode; key_code <= ki->keySyms.maxKeyCode; key_code++)
     {
-	kdModMap[key_code] = 0;
-	syms = kdKeymap + (key_code - kdMinKeyCode) * width;
+	ki->modmap[key_code] = 0;
+	syms = ki->keySyms.map + (key_code - ki->keySyms.minKeyCode) * width;
 	for (row = 0; row < width; row++, syms++)
 	{
 	    for (i = 0; i < NUM_SYM_MODS; i++) 
 	    {
 		if (*syms == kdKeySymMods[i].modsym) 
-		    kdModMap[key_code] |= kdKeySymMods[i].modbit;
+		    ki->modmap[key_code] |= kdKeySymMods[i].modbit;
 	    }
 	}
     }
 }
 
+static int
+KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
+{
+    Bool        ret;
+    DevicePtr   pDev = (DevicePtr)pDevice;
+    KdKeyboardInfo *ki;
+#ifdef XKB
+    XkbComponentNamesRec names;
+#endif
+#ifdef XINPUT
+    Atom xiclass;
+#endif
+
+    if (!pDev)
+	return BadImplementation;
+
+    for (ki = kdKeyboards; ki; ki = ki->next) {
+        if (ki->dixdev && ki->dixdev->id == pDevice->id)
+            break;
+    }
+
+    if (!ki || !ki->dixdev || ki->dixdev->id != pDevice->id) {
+        return BadImplementation;
+    }
+
+    switch (onoff)
+    {
+    case DEVICE_INIT:
+#ifdef DEBUG
+        ErrorF("initialising keyboard %s\n", ki->name);
+#endif
+        if (!ki->driver) {
+            if (!ki->driverPrivate) {
+                ErrorF("no driver specified!\n");
+                return BadImplementation;
+            }
+
+            ki->driver = KdFindKeyboardDriver(ki->driverPrivate);
+            if (!ki->driver) {
+                ErrorF("Couldn't find keyboard driver %s\n",
+                       ki->driverPrivate ? (char *) ki->driverPrivate :
+                       "(unnamed)");
+                return !Success;
+            }
+            xfree(ki->driverPrivate);
+            ki->driverPrivate = NULL;
+        }
+
+        if (!ki->driver->Init) {
+            ErrorF("Keyboard %s: no init function\n", ki->name);
+            return BadImplementation;
+        }
+
+        if ((*ki->driver->Init) (ki) != Success) {
+            return !Success;
+        }
+
+        KdInitModMap(ki);
+        KdInitAutoRepeats(ki);
+
+#ifndef XKB
+        if (!noXkbExtension) {
+            memset(&names, 0, sizeof(XkbComponentNamesRec));
+            if (XkbInitialMap) 
+                names.keymap = XkbInitialMap;
+
+            XkbSetRulesDflts ("base", "pc105", "us", NULL, NULL);
+            ret = XkbInitKeyboardDeviceStruct (pDevice,
+                                               &names,
+                                               &ki->keySyms,
+                                               ki->modmap,
+                                               KdBell, KdKbdCtrl);
+        }
+        else
+#endif
+	ret = InitKeyboardDeviceStruct(pDev,
+				       &ki->keySyms,
+				       ki->modmap,
+				       KdBell, KdKbdCtrl);
+	if (!ret) {
+            ErrorF("Couldn't initialise keyboard %s\n", ki->name);
+	    return BadImplementation;
+        }
+
+#ifdef XINPUT
+        xiclass = AtomFromName(XI_KEYBOARD);
+        AssignTypeAndName(pDevice, xiclass,
+                          ki->name ? ki->name : "Generic KDrive Keyboard");
+#endif
+
+        KdResetInputMachine();
+
+        return Success;
+
+    case DEVICE_ON:
+        if (pDev->on == TRUE)
+            return Success;
+
+        if (!ki->driver->Enable)
+            return BadImplementation;
+
+        if ((*ki->driver->Enable) (ki) != Success) {
+            return BadMatch;
+        }
+
+        pDev->on = TRUE;
+        return Success;
+
+    case DEVICE_OFF:
+        if (pDev->on == FALSE)
+            return Success;
+
+        if (!ki->driver->Disable)
+            return BadImplementation;
+
+        (*ki->driver->Disable) (ki);
+        pDev->on = FALSE;
+
+        return Success;
+        
+        break;
+
+    case DEVICE_CLOSE:
+	if (pDev->on) {
+            if (!ki->driver->Disable)
+                return BadImplementation;
+
+            (*ki->driver->Disable) (ki);
+            pDev->on = FALSE;
+	}
+
+        if (!ki->driver->Fini)
+            return BadImplementation;
+
+        (*ki->driver->Fini) (ki);
+
+        KdRemoveKeyboard(ki);
+
+        return Success;
+    }
+
+    /* NOTREACHED */
+    return BadImplementation;
+}
+
+void
+KdAddPointerDriver (KdPointerDriver *driver)
+{
+    KdPointerDriver **prev;
+
+    if (!driver)
+        return;
+
+    for (prev = &kdPointerDrivers; *prev; prev = &(*prev)->next) {
+        if (*prev == driver)
+            return;
+    }
+    *prev = driver;
+}
+
 void
-KdAddMouseDriver(KdMouseFuncs *pMouseFuncs)
+KdRemovePointerDriver (KdPointerDriver *driver)
 {
-    if (kdNMouseFuncs < MAX_MOUSE_DRIVERS)
-	kdMouseFuncs[kdNMouseFuncs++] = pMouseFuncs;
+    KdPointerDriver *tmp;
+
+    if (!driver)
+        return;
+
+    /* FIXME remove all pointers using this driver */
+    for (tmp = kdPointerDrivers; tmp; tmp = tmp->next) {
+        if (tmp->next == driver)
+            tmp->next = driver->next;
+    }
+    if (tmp == driver)
+        tmp = NULL;
 }
 
 void
-KdInitInput(KdMouseFuncs    *pMouseFuncs,
-	    KdKeyboardFuncs *pKeyboardFuncs)
+KdAddKeyboardDriver (KdKeyboardDriver *driver)
 {
-    DeviceIntPtr	pKeyboard, pPointer;
-    KdMouseInfo		*mi;
+    KdKeyboardDriver **prev;
+
+    if (!driver)
+        return;
+
+    for (prev = &kdKeyboardDrivers; *prev; prev = &(*prev)->next) {
+        if (*prev == driver)
+            return;
+    }
+    *prev = driver;
+}
+
+void
+KdRemoveKeyboardDriver (KdKeyboardDriver *driver)
+{
+    KdKeyboardDriver *tmp;
+
+    if (!driver)
+        return;
+
+    /* FIXME remove all keyboards using this driver */
+    for (tmp = kdKeyboardDrivers; tmp; tmp = tmp->next) {
+        if (tmp->next == driver)
+            tmp->next = driver->next;
+    }
+    if (tmp == driver)
+        tmp = NULL;
+}
+
+KdKeyboardInfo *
+KdNewKeyboard (void)
+{
+    KdKeyboardInfo *ki = xcalloc(sizeof(KdKeyboardInfo), 1);
+
+    if (!ki)
+        return NULL;
     
-    if (!kdMouseInfo)
-	KdParseMouse (0);
-    kdMouseButtonCount = 0;
-    for (mi = kdMouseInfo; mi; mi = mi->next)
-    {
-	if (mi->nbutton > kdMouseButtonCount)
-	    kdMouseButtonCount = mi->nbutton;
-    }
-
-    kdNMouseFuncs = 0;
-    KdAddMouseDriver (pMouseFuncs);
-    kdKeyboardFuncs = pKeyboardFuncs;
-    memset (kdKeyState, '\0', sizeof (kdKeyState));
-    if (kdKeyboardFuncs)
-	(*kdKeyboardFuncs->Load) ();
-    kdMinKeyCode = kdMinScanCode + KD_KEY_OFFSET;
-    kdMaxKeyCode = kdMaxScanCode + KD_KEY_OFFSET;
-    kdKeySyms.map = kdKeymap;
-    kdKeySyms.minKeyCode = kdMinKeyCode;
-    kdKeySyms.maxKeyCode = kdMaxKeyCode;
-    kdKeySyms.mapWidth = kdKeymapWidth;
-    kdLeds = 0;
-    kdBellPitch = 1000;
-    kdBellDuration = 200;
-    kdInputEnabled = TRUE;
-    KdInitModMap ();
-    KdInitAutoRepeats ();
-    KdResetInputMachine ();
-    pPointer  = AddInputDevice(KdMouseProc, TRUE);
-    pKeyboard = AddInputDevice(KdKeybdProc, TRUE);
-    RegisterPointerDevice(pPointer);
-    RegisterKeyboardDevice(pKeyboard);
-    miRegisterPointerDevice(screenInfo.screens[0], pPointer);
-    mieqInit(&pKeyboard->public, &pPointer->public);
+    ki->keySyms.map = (KeySym *)xcalloc(sizeof(KeySym),
+                                        KD_MAX_LENGTH *
+                                         kdDefaultKeySyms.mapWidth);
+    if (!ki->keySyms.map) {
+        xfree(ki);
+        return NULL;
+    }
+
+    memcpy(ki->keySyms.map, kdDefaultKeySyms.map,
+           sizeof(KeySym) * (KD_MAX_LENGTH * kdDefaultKeySyms.mapWidth));
+    ki->keySyms.minKeyCode = kdDefaultKeySyms.minKeyCode;
+    ki->keySyms.maxKeyCode = kdDefaultKeySyms.maxKeyCode;
+    ki->keySyms.mapWidth = kdDefaultKeySyms.mapWidth;
+    ki->minScanCode = 0;
+    ki->maxScanCode = 0;
+    ki->leds = 0;
+    ki->bellPitch = 1000;
+    ki->bellDuration = 200;
+    ki->next = NULL;
+    ki->options = NULL;
+
+    return ki;
+}
+
+int
+KdAddConfigKeyboard (char *keyboard)
+{
+    struct KdConfigDevice **prev, *new;
+
+    if (!keyboard)
+        return Success;
+
+    new = (struct KdConfigDevice *) xcalloc(sizeof(struct KdConfigDevice), 1);
+    if (!new)
+        return BadAlloc;
+
+    new->line = xstrdup(keyboard);
+    new->next = NULL;
+
+    for (prev = &kdConfigKeyboards; *prev; prev = &(*prev)->next);
+    *prev = new;
+
+    return Success;
+}
+
+int
+KdAddKeyboard (KdKeyboardInfo *ki)
+{
+    KdKeyboardInfo **prev;
+
+    if (!ki)
+        return !Success;
+    
+    ki->dixdev = AddInputDevice(KdKeyboardProc, TRUE);
+    if (!ki->dixdev) {
+        ErrorF("Couldn't register keyboard device %s\n",
+               ki->name ? ki->name : "(unnamed)");
+        return !Success;
+    }
+
 #ifdef XINPUT
-    {
-	static long zero1, zero2;
+    RegisterOtherDevice(ki->dixdev);
+#endif
+
+#ifdef DEBUG
+    ErrorF("added keyboard %s with dix id %d\n", ki->name, ki->dixdev->id);
+#endif
+
+    for (prev = &kdKeyboards; *prev; prev = &(*prev)->next);
+    *prev = ki;
+
+    return Success;
+}
+
+void
+KdRemoveKeyboard (KdKeyboardInfo *ki)
+{
+    KdKeyboardInfo **prev;
+
+    if (!ki)
+        return;
+
+    for (prev = &kdKeyboards; *prev; prev = &(*prev)->next) {
+        if (*prev == ki) {
+            *prev = ki->next;
+            break;
+        }
+    }
+
+    KdFreeKeyboard(ki);
+}
+
+int
+KdAddConfigPointer (char *pointer)
+{
+    struct KdConfigDevice **prev, *new;
+
+    if (!pointer)
+        return Success;
+
+    new = (struct KdConfigDevice *) xcalloc(sizeof(struct KdConfigDevice), 1);
+    if (!new)
+        return BadAlloc;
+
+    new->line = xstrdup(pointer);
+    new->next = NULL;
+
+    for (prev = &kdConfigPointers; *prev; prev = &(*prev)->next);
+    *prev = new;
+
+    return Success;
+}
+
+int
+KdAddPointer (KdPointerInfo *pi)
+{
+    KdPointerInfo **prev;
+
+    if (!pi)
+        return Success;
+
+    pi->mouseState = start;
+    pi->eventHeld = FALSE;
+
+    pi->dixdev = AddInputDevice(KdPointerProc, TRUE);
+    if (!pi->dixdev) {
+        ErrorF("Couldn't add pointer device %s\n",
+               pi->name ? pi->name : "(unnamed)");
+        return BadDevice;
+    }
+
+#ifdef XINPUT
+    RegisterOtherDevice(pi->dixdev);
+#endif
+
+    for (prev = &kdPointers; *prev; prev = &(*prev)->next);
+    *prev = pi;
+
+    return Success;
+}
 
-	//SetExtInputCheck (&zero1, &zero2);
-	ErrorF("Extended Input Devices not yet supported. Impelement it at line %d in %s\n",
-	       __LINE__, __FILE__);
+void
+KdRemovePointer (KdPointerInfo *pi)
+{
+    KdPointerInfo **prev;
+
+    if (!pi)
+        return;
+
+    for (prev = &kdPointers; *prev; prev = &(*prev)->next) {
+        if (*prev == pi) {
+            *prev = pi->next;
+            break;
+        }
     }
+
+    KdFreePointer(pi);
+}
+
+KdKeyboardInfo *
+KdParseKeyboard (char *arg)
+{
+    char            save[1024];
+    char            delim;
+    KdKeyboardInfo     *ki = NULL;
+
+    ki = KdNewKeyboard();
+    if (!ki)
+        return NULL;
+
+    ki->name = strdup("Unknown KDrive Keyboard");
+    ki->path = NULL;
+    ki->driver = NULL;
+    ki->driverPrivate = NULL;
+#ifdef XKB
+    ki->xkb = NULL;
 #endif
+    ki->next = NULL;
+
+    if (!arg)
+    {
+        ErrorF("keybd: no arg\n");
+        KdFreeKeyboard (ki);
+        return NULL;
+    }
+
+    if (strlen (arg) >= sizeof (save))
+    {
+        ErrorF("keybd: arg too long\n");
+        KdFreeKeyboard (ki);
+        return NULL;
+    }
+
+    arg = KdParseFindNext (arg, ",", save, &delim);
+    if (!save[0])
+    {
+        ErrorF("keybd: failed on save[0]\n");
+        KdFreeKeyboard (ki);
+        return NULL;
+    }
+
+    if (strcmp (save, "auto") == 0)
+        ki->driverPrivate = NULL;
+    else
+        ki->driverPrivate = xstrdup(save);
+
+    /* FIXME actually implement options */
+
+    return ki;
+}
+
+KdPointerInfo *
+KdParsePointer (char *arg)
+{
+    char            save[1024];
+    char            delim;
+    KdPointerInfo   *pi = NULL;
+    InputOption     *options = NULL, *newopt = NULL, **tmpo = NULL;
+    int             i = 0;
+
+    pi = KdNewPointer();
+    if (!pi)
+        return NULL;
+    pi->emulateMiddleButton = kdEmulateMiddleButton;
+    pi->transformCoordinates = !kdRawPointerCoordinates;
+    pi->nButtons = 3;
+    pi->inputClass = KD_MOUSE;
+
+    for (i = 0; i < KD_MAX_BUTTON; i++)
+        pi->map[i] = i + 1;
+
+    if (!arg)
+    {
+        ErrorF("mouse: no arg\n");
+        KdFreePointer (pi);
+        return NULL;
+    }
+
+    if (strlen (arg) >= sizeof (save))
+    {
+        ErrorF("mouse: arg too long\n");
+        KdFreePointer (pi);
+        return NULL;
+    }
+    arg = KdParseFindNext (arg, ",", save, &delim);
+    if (!save[0])
+    {
+        ErrorF("failed on save[0]\n");
+        KdFreePointer (pi);
+        return NULL;
+    }
+
+    if (strcmp(save, "auto") == 0)
+        pi->driverPrivate = NULL;
+    else
+        pi->driverPrivate = xstrdup(save);
+
+    if (delim != ',')
+    {
+        return pi;
+    }
+
+    arg = KdParseFindNext (arg, ",", save, &delim);
+
+    while (delim == ',')
+    {
+        arg = KdParseFindNext (arg, ",", save, &delim);
+        if (save[0] == '{')
+        {
+            char *s = save + 1;
+             i = 0;
+             while (*s && *s != '}')
+             {
+                if ('1' <= *s && *s <= '0' + pi->nButtons)
+                    pi->map[i] = *s - '0';
+                else
+                    UseMsg ();
+                s++;
+             }
+        }
+        else if (!strcmp (save, "emulatemiddle"))
+            pi->emulateMiddleButton = TRUE;
+        else if (!strcmp (save, "noemulatemiddle"))
+            pi->emulateMiddleButton = FALSE;
+        else if (!strcmp (save, "transformcoord"))
+            pi->transformCoordinates = TRUE;
+        else if (!strcmp (save, "rawcoord"))
+            pi->transformCoordinates = FALSE;
+        else
+        {
+            newopt = (InputOption *) xalloc(sizeof (InputOption));
+            if (!newopt)
+            {
+                KdFreePointer(pi);
+                return NULL;
+            }
+            bzero(newopt, sizeof (InputOption));
+
+            for (tmpo = &options; *tmpo; tmpo = &(*tmpo)->next)
+            *tmpo = newopt;
+
+            if (strchr(arg, '='))
+            {
+                i = (strchr(arg, '=') - arg);
+                newopt->key = (char *)xalloc(i+1);
+                strncpy(newopt->key, arg, i+1);
+                newopt->value = xstrdup(strchr(arg, '=') + 1);
+            }
+            else
+            {
+                newopt->key = xstrdup(save);
+                newopt->value = NULL;
+            }
+            newopt->next = NULL;
+        }
+    }
+
+    if (options)
+        pi->options = options;
+
+    return pi;
+}
+
+
+void
+KdInitInput (void)
+{
+    KdPointerInfo *pi;
+    KdKeyboardInfo *ki;
+    struct KdConfigDevice *dev;
+    int i = 0;
+
+    kdInputEnabled = TRUE;
+
+    for (dev = kdConfigPointers; dev; dev = dev->next) {
+        pi = KdParsePointer(dev->line);
+        if (!pi)
+            ErrorF("Failed to parse pointer\n");
+        if (KdAddPointer(pi) != Success)
+            ErrorF("Failed to add pointer!\n");
+    }
+    for (dev = kdConfigKeyboards; dev; dev = dev->next) {
+        ki = KdParseKeyboard(dev->line);
+        if (!ki)
+            ErrorF("Failed to parse keyboard\n");
+        if (KdAddKeyboard(ki) != Success)
+            ErrorF("Failed to add keyboard!\n");
+    }
+
+    mieqInit(NULL, NULL);
 }
 
 /*
@@ -786,7 +1442,7 @@ typedef enum _inputAction {
 
 typedef struct _inputTransition {
     KdInputAction  actions[MAX_ACTIONS];
-    KdMouseState   nextState;
+    KdPointerState nextState;
 } KdInputTransition;
 
 static const
@@ -931,32 +1587,22 @@ KdInputTransition  kdInputMachine[num_in
 #define EMULATION_WINDOW    10
 #define EMULATION_TIMEOUT   100
 
-#define EventX(e)   ((e)->u.keyButtonPointer.rootX)
-#define EventY(e)   ((e)->u.keyButtonPointer.rootY)
-
 static int
-KdInsideEmulationWindow (KdMouseInfo *mi, xEvent *ev)
+KdInsideEmulationWindow (KdPointerInfo *pi, int x, int y, int z)
 {
-    if (ev->u.keyButtonPointer.pad1)
-    {
-	mi->emulationDx += EventX(ev);
-	mi->emulationDy += EventY(ev);
-    }
-    else
-    {
-	mi->emulationDx = EventX(&mi->heldEvent) - EventX(ev);
-	mi->emulationDy = EventY(&mi->heldEvent) - EventY(ev);
-    }
-    return (abs (mi->emulationDx) < EMULATION_WINDOW &&
-	    abs (mi->emulationDy) < EMULATION_WINDOW);
+    pi->emulationDx = pi->heldEvent.x - x;
+    pi->emulationDy = pi->heldEvent.y - y;
+
+    return (abs (pi->emulationDx) < EMULATION_WINDOW &&
+	    abs (pi->emulationDy) < EMULATION_WINDOW);
 }
 				     
 static KdInputClass
-KdClassifyInput (KdMouseInfo *mi, xEvent *ev)
+KdClassifyInput (KdPointerInfo *pi, int type, int x, int y, int z, int b)
 {
-    switch (ev->u.u.type) {
+    switch (type) {
     case ButtonPress:
-	switch (ev->u.u.detail) {
+	switch (b) {
 	case 1: return down_1;
 	case 2: return down_2;
 	case 3: return down_3;
@@ -964,7 +1610,7 @@ KdClassifyInput (KdMouseInfo *mi, xEvent
 	}
 	break;
     case ButtonRelease:
-	switch (ev->u.u.detail) {
+	switch (b) {
 	case 1: return up_1;
 	case 2: return up_2;
 	case 3: return up_3;
@@ -972,7 +1618,7 @@ KdClassifyInput (KdMouseInfo *mi, xEvent
 	}
 	break;
     case MotionNotify:
-	if (mi->eventHeld && !KdInsideEmulationWindow(mi, ev))
+	if (pi->eventHeld && !KdInsideEmulationWindow(pi, x, y, z))
 	    return outside_box;
 	else
 	    return motion;
@@ -1021,116 +1667,98 @@ static void
 KdQueueEvent (xEvent *ev)
 {
     KdAssertSigioBlocked ("KdQueueEvent");
-    if (ev->u.u.type == MotionNotify)
-    {
-	if (ev->u.keyButtonPointer.pad1)
-	{
-	    ev->u.keyButtonPointer.pad1 = 0;
-	    miPointerDeltaCursor (ev->u.keyButtonPointer.rootX, 
-				  ev->u.keyButtonPointer.rootY, 
-				  ev->u.keyButtonPointer.time);
-	}
-	else
-	{
-	    miPointerAbsoluteCursor(ev->u.keyButtonPointer.rootX, 
-				    ev->u.keyButtonPointer.rootY, 
-				    ev->u.keyButtonPointer.time);
-	}
-    }
-    else
-    {
-	mieqEnqueue (ev);
-    }
+    mieqEnqueue (ev);
 }
 
-static void
-KdRunMouseMachine (KdMouseInfo *mi, KdInputClass c, xEvent *ev)
+/* We return true if we're stealing the event. */
+static Bool
+KdRunMouseMachine (KdPointerInfo *pi, KdInputClass c, int type, int x, int y,
+                   int z, int b, int absrel)
 {
     const KdInputTransition *t;
-    int			a;
+    int	a;
 
-    t = &kdInputMachine[mi->mouseState][c];
+    c = KdClassifyInput(pi, type, x, y, z, b);
+    t = &kdInputMachine[pi->mouseState][c];
     for (a = 0; a < MAX_ACTIONS; a++)
     {
 	switch (t->actions[a]) {
 	case noop:
 	    break;
 	case hold:
-	    mi->eventHeld = TRUE;
-	    mi->emulationDx = 0;
-	    mi->emulationDy = 0;
-	    mi->heldEvent = *ev;
+	    pi->eventHeld = TRUE;
+	    pi->emulationDx = 0;
+	    pi->emulationDy = 0;
+	    pi->heldEvent.type = type;
+            pi->heldEvent.x = x;
+            pi->heldEvent.y = y;
+            pi->heldEvent.z = z;
+            pi->heldEvent.flags = b;
+            pi->heldEvent.absrel = absrel;
+            return TRUE;
 	    break;
 	case setto:
-	    mi->emulationTimeout = GetTimeInMillis () + EMULATION_TIMEOUT;
-	    mi->timeoutPending = TRUE;
+	    pi->emulationTimeout = GetTimeInMillis () + EMULATION_TIMEOUT;
+	    pi->timeoutPending = TRUE;
 	    break;
 	case deliver:
-	    KdQueueEvent (ev);
+            _KdEnqueuePointerEvent (pi, pi->heldEvent.type, pi->heldEvent.x,
+                                    pi->heldEvent.y, pi->heldEvent.z,
+                                    pi->heldEvent.flags, pi->heldEvent.absrel,
+                                    TRUE);
 	    break;
 	case release:
-	    mi->eventHeld = FALSE;
-	    mi->timeoutPending = FALSE;
-	    KdQueueEvent (&mi->heldEvent);
+	    pi->eventHeld = FALSE;
+	    pi->timeoutPending = FALSE;
+            _KdEnqueuePointerEvent (pi, pi->heldEvent.type, pi->heldEvent.x,
+                                    pi->heldEvent.y, pi->heldEvent.z,
+                                    pi->heldEvent.flags, pi->heldEvent.absrel,
+                                    TRUE);
+            return TRUE;
 	    break;
 	case clearto:
-	    mi->timeoutPending = FALSE;
+	    pi->timeoutPending = FALSE;
 	    break;
 	case gen_down_2:
-	    ev->u.u.detail = 2;
-	    mi->eventHeld = FALSE;
-	    KdQueueEvent (ev);
+            _KdEnqueuePointerEvent (pi, ButtonPress, x, y, z, 2, absrel,
+                                    TRUE);
+	    pi->eventHeld = FALSE;
+            return TRUE;
 	    break;
 	case gen_up_2:
-	    ev->u.u.detail = 2;
-	    KdQueueEvent (ev);
+            _KdEnqueuePointerEvent (pi, ButtonRelease, x, y, z, 2, absrel,
+                                    TRUE);
+            return TRUE;
 	    break;
 	}
     }
-    mi->mouseState = t->nextState;
-}
-
-void
-KdResetInputMachine (void)
-{
-    KdMouseInfo	*mi;
-
-    for (mi = kdMouseInfo; mi; mi = mi->next)
-    {
-	mi->mouseState = start;
-	mi->eventHeld = FALSE;
-    }
+    pi->mouseState = t->nextState;
+    return FALSE;
 }
 
-static void
-KdHandleMouseEvent (KdMouseInfo *mi, xEvent *ev)
+static int
+KdHandlePointerEvent (KdPointerInfo *pi, int type, int x, int y, int z, int b,
+                      int absrel)
 {
-    if (mi->emulateMiddleButton)
-	KdRunMouseMachine (mi, KdClassifyInput (mi, ev), ev);
-    else
-	KdQueueEvent (ev);
+    if (pi->emulateMiddleButton)
+        return KdRunMouseMachine (pi, KdClassifyInput(pi, type, x, y, z, b),
+                                  type, x, y, z, b, absrel);
+    return FALSE;
 }
 
 static void
-KdReceiveTimeout (KdMouseInfo *mi)
+KdReceiveTimeout (KdPointerInfo *pi)
 {
-    KdRunMouseMachine (mi, timeout, 0);
+    KdRunMouseMachine (pi, timeout, 0, 0, 0, 0, 0, 0);
 }
 
-#define KILL_SEQUENCE ((1L << KK_CONTROL)|(1L << KK_ALT)|(1L << KK_F8)|(1L << KK_F10))
-#define SPECIAL_SEQUENCE ((1L << KK_CONTROL) | (1L << KK_ALT))
-#define SETKILLKEY(b) (KdSpecialKeys |= (1L << (b)))
-#define CLEARKILLKEY(b) (KdSpecialKeys &= ~(1L << (b)))
-#define KEYMAP	    (pKdKeyboard->key->curKeySyms)
-#define KEYCOL1(k) (KEYMAP.map[((k)-kdMinKeyCode)*KEYMAP.mapWidth])
+#define KILL_SEQUENCE     ((1L << KK_CONTROL)|(1L << KK_ALT)|(1L << KK_F8)|(1L << KK_F10))
+#define SPECIAL_SEQUENCE  ((1L << KK_CONTROL) | (1L << KK_ALT))
+#define SETKILLKEY(b)     (KdSpecialKeys |= (1L << (b)))
+#define CLEARKILLKEY(b)   (KdSpecialKeys &= ~(1L << (b)))
 
 CARD32	KdSpecialKeys = 0;
 
-#if 0
-/* already defined in opaque.h */
-extern char dispatchException;
-#endif
-
 /*
  * kdCheckTermination
  *
@@ -1145,44 +1773,28 @@ extern char dispatchException;
 extern int nClients;
 
 static void
-KdCheckSpecialKeys(xEvent *xE)
+KdCheckSpecialKeys(KdKeyboardInfo *ki, int type, int sym)
 {
-    KeySym	sym = KEYCOL1(xE->u.u.detail);
-    
-    if (!pKdKeyboard) return;
+    if (!ki)
+        return;
 
     /*
      * Ignore key releases
      */
-    
-    if (xE->u.u.type == KeyRelease) return;
 
-#ifdef XIPAQ
-    /* 
-     * Check for buttons 1, 2 and 3 on the iPAQ
-     */
-    if (sym == XK_Pointer_Button1 && kdMouseInfo) {
-	KdEnqueueMouseEvent(kdMouseInfo, KD_MOUSE_DELTA | KD_BUTTON_1, 0, 0);
-	return;
-    }
-    if (sym == XK_Pointer_Button2 && kdMouseInfo) {
-	KdEnqueueMouseEvent(kdMouseInfo, KD_MOUSE_DELTA | KD_BUTTON_2, 0, 0);
-	return;
-    }
-    if (sym == XK_Pointer_Button3 && kdMouseInfo) {
-	KdEnqueueMouseEvent(kdMouseInfo, KD_MOUSE_DELTA | KD_BUTTON_3, 0, 0);
-	return;
-    }
-#endif
+    if (type == KeyRelease)
+        return;
+
+    /* Some iPaq keyboard -> mouse button mapping used to be here, but I
+     * refuse to perpetuate this madness. -daniels */
 
     /*
      * Check for control/alt pressed
      */
-    if ((pKdKeyboard->key->state & (ControlMask|Mod1Mask)) !=
+    if ((ki->dixdev->key->state & (ControlMask|Mod1Mask)) !=
 	(ControlMask|Mod1Mask))
 	return;
-    
-    
+
     /*
      * Let OS function see keysym first
      */
@@ -1194,6 +1806,8 @@ KdCheckSpecialKeys(xEvent *xE)
     /*
      * Now check for backspace or delete; these signal the
      * X server to terminate
+     *
+     * I can't believe it's not XKB. -daniels
      */
     switch (sym) {
     case XK_BackSpace:
@@ -1219,150 +1833,164 @@ KdCheckSpecialKeys(xEvent *xE)
  */
 
 static void
-KdHandleKeyboardEvent (xEvent *ev)
+KdHandleKeyboardEvent (KdKeyboardInfo *ki, int type, int key)
 {
-    int		key = ev->u.u.detail;
-    int		byte;
-    CARD8	bit;
-    KdMouseInfo	*mi;
+    int           byte;
+    CARD8         bit;
+    KdPointerInfo *pi;
     
     byte = key >> 3;
     bit = 1 << (key & 7);
-    switch (ev->u.u.type) {
+
+    switch (type) {
     case KeyPress:
-	kdKeyState[byte] |= bit;
+	ki->keyState[byte] |= bit;
 	break;
     case KeyRelease:
-	kdKeyState[byte] &= ~bit;
+	ki->keyState[byte] &= ~bit;
 	break;
     }
-    for (mi = kdMouseInfo; mi; mi = mi->next)
-	KdRunMouseMachine (mi, keyboard, 0);
-    KdQueueEvent (ev);
+
+    for (pi = kdPointers; pi; pi = pi->next)
+	KdRunMouseMachine (pi, keyboard, 0, 0, 0, 0, 0, 0);
 }
 
 void
 KdReleaseAllKeys (void)
 {
-    xEvent  xE;
-    int	    key;
+    xEvent *xE;
+    int	key, nEvents, i;
+    KdKeyboardInfo *ki;
 
     KdBlockSigio ();
-    for (key = 0; key < KD_KEY_COUNT; key++)
-	if (IsKeyDown(key))
-	{
-	    xE.u.keyButtonPointer.time = GetTimeInMillis();
-	    xE.u.u.type = KeyRelease;
-	    xE.u.u.detail = key;
-	    KdHandleKeyboardEvent (&xE);
-	}
+
+    for (ki = kdKeyboards; ki; ki = ki->next) {
+        for (key = ki->keySyms.minKeyCode; key < ki->keySyms.maxKeyCode;
+             key++) {
+            if (IsKeyDown(ki, key)) {
+                KdHandleKeyboardEvent(ki, KeyRelease, key);
+                nEvents = GetKeyboardEvents(&xE, ki->dixdev, KeyRelease, key);
+                for (i = 0; i < nEvents; i++)
+                    KdQueueEvent (xE++);
+            }
+        }
+    }
+
     KdUnblockSigio ();
 }
 
 static void
 KdCheckLock (void)
 {
-    KeyClassPtr	    keyc = pKdKeyboard->key;
-    Bool	    isSet, shouldBeSet;
-
-    if (kdKeyboardFuncs->LockLed)
-    {
-	isSet = (kdLeds & (1 << (kdKeyboardFuncs->LockLed-1))) != 0;
-	shouldBeSet = (keyc->state & LockMask) != 0;
-	if (isSet != shouldBeSet)
-	{
-	    KdSetLed (kdKeyboardFuncs->LockLed, shouldBeSet);
-	}
+    KeyClassPtr	    keyc = NULL;
+    Bool	    isSet = FALSE, shouldBeSet = FALSE;
+    KdKeyboardInfo     *tmp = NULL;
+
+    for (tmp = kdKeyboards; tmp; tmp = tmp->next) {
+        if (tmp->LockLed && tmp->dixdev && tmp->dixdev->key) {
+            keyc = tmp->dixdev->key;
+            isSet = (tmp->leds & (1 << (tmp->LockLed-1))) != 0;
+            shouldBeSet = (keyc->state & LockMask) != 0;
+            if (isSet != shouldBeSet)
+                KdSetLed (tmp, tmp->LockLed, shouldBeSet);
+        }
     }
 }
 
 void
-KdEnqueueKeyboardEvent(unsigned char	scan_code,
-		       unsigned char	is_up)
-{
-    unsigned char   key_code;
-    xEvent	    xE;
-    KeyClassPtr	    keyc;
-
-    if (!pKdKeyboard)
+KdEnqueueKeyboardEvent(KdKeyboardInfo   *ki,
+                       unsigned char scan_code,
+		       unsigned char is_up)
+{
+    unsigned char key_code;
+    KeyClassPtr	keyc = NULL;
+    KeybdCtrl *ctrl = NULL;
+    int type, nEvents, i;
+    xEvent *xE = NULL;
+
+#ifdef DEBUG
+    ErrorF("enqueuing kb event (scancode %d, %s)\n", scan_code, is_up ? "up" : "down");
+    ErrorF("event is from %s\n", ki->name);
+#endif
+    
+    if (!ki || !ki->dixdev || !ki->dixdev->kbdfeed || !ki->dixdev->key)
 	return;
-    keyc = pKdKeyboard->key;
 
-    xE.u.keyButtonPointer.time = GetTimeInMillis();
+    keyc = ki->dixdev->key;
+    ctrl = &ki->dixdev->kbdfeed->ctrl;
 
-    if (kdMinScanCode <= scan_code && scan_code <= kdMaxScanCode)
+    if (scan_code >= ki->minScanCode && scan_code <= ki->maxScanCode)
     {
-	key_code = scan_code + KD_MIN_KEYCODE - kdMinScanCode;
+	key_code = scan_code + KD_MIN_KEYCODE - ki->minScanCode;
 	
 	/*
 	 * Set up this event -- the type may be modified below
 	 */
 	if (is_up)
-	    xE.u.u.type = KeyRelease;
+	    type = KeyRelease;
 	else
-	    xE.u.u.type = KeyPress;
-	xE.u.u.detail = key_code;
+	    type = KeyPress;
 	
-	switch (KEYCOL1(key_code)) 
+        /* HRNGH */
+	switch (KEYCOL1(ki, key_code)) 
 	{
 	case XK_Num_Lock:
 	case XK_Scroll_Lock:
 	case XK_Shift_Lock:
 	case XK_Caps_Lock:
-	    if (xE.u.u.type == KeyRelease)
+	    if (type == KeyRelease)
 		return;
-	    if (IsKeyDown (key_code))
-		xE.u.u.type = KeyRelease;
+	    if (IsKeyDown (ki, key_code))
+		type = KeyRelease;
 	    else
-		xE.u.u.type = KeyPress;
+		type = KeyPress;
 	}
 	
 	/*
 	 * Check pressed keys which are already down
 	 */
-	if (IsKeyDown (key_code) && xE.u.u.type == KeyPress)
-	{
-	    KeybdCtrl	*ctrl = &pKdKeyboard->kbdfeed->ctrl;
-	    
+	if (IsKeyDown (ki, key_code) && type == KeyPress) {
 	    /*
 	     * Check auto repeat
 	     */
 	    if (!ctrl->autoRepeat || keyc->modifierMap[key_code] ||
 		!(ctrl->autoRepeats[key_code >> 3] & (1 << (key_code & 7))))
-	    {
 		return;
-	    }
+
 	    /*
 	     * X delivers press/release even for autorepeat
 	     */
-	    xE.u.u.type = KeyRelease;
-	    KdHandleKeyboardEvent (&xE);
-	    xE.u.u.type = KeyPress;
+            nEvents = GetKeyboardEvents(&xE, ki->dixdev, KeyRelease, key_code);
+            for (i = 0; i < nEvents; i++)
+                KdQueueEvent(xE++);
+            nEvents = GetKeyboardEvents(&xE, ki->dixdev, KeyPress, key_code);
+            for (i = 0; i < nEvents; i++)
+                KdQueueEvent(xE++);
 	}
 	/*
 	 * Check released keys which are already up
 	 */
-	else if (!IsKeyDown (key_code) && xE.u.u.type == KeyRelease)
-	{
+	else if (!IsKeyDown (ki, key_code) && type == KeyRelease) {
 	    return;
-	}
-	KdCheckSpecialKeys (&xE);
-	KdHandleKeyboardEvent (&xE);
-    }
-}
+        }
 
-#define SetButton(mi, b, v, s) \
-{\
-    xE.u.u.detail = mi->map[b]; \
-    xE.u.u.type = v; \
-    KdHandleMouseEvent (mi, &xE); \
+        KdCheckSpecialKeys(ki, type, key_code);
+        KdHandleKeyboardEvent(ki, type, key_code);
+        nEvents = GetKeyboardEvents(&xE, ki->dixdev, type, key_code);
+#ifdef DEBUG
+        ErrorF("KdEnqueueKeyboardEvent: got %d events from GKE\n", nEvents);
+#endif
+        for (i = 0; i < nEvents; i++)
+            KdQueueEvent(xE++);
+    }
+    else {
+        ErrorF("driver %s wanted to post scancode %d outside of [%d, %d]!\n",
+               ki->name, scan_code, ki->minScanCode, ki->maxScanCode);
+    }
 }
 
-#define Press(mi, b)         SetButton(mi, b, ButtonPress, "Down")
-#define Release(mi, b)       SetButton(mi, b, ButtonRelease, "Up")
-
 /*
- * kdEnqueueMouseEvent
+ * kdEnqueuePointerEvent
  *
  * This function converts hardware mouse event information into X event
  * information.  A mouse movement event is passed off to MI to generate
@@ -1371,8 +1999,9 @@ KdEnqueueKeyboardEvent(unsigned char	sca
  */
 
 static void
-KdMouseAccelerate (DeviceIntPtr	device, int *dx, int *dy)
+KdMouseAccelerate (KdPointerInfo *pi, int *dx, int *dy)
 {
+    DeviceIntPtr device = pi->dixdev;
     PtrCtrl *pCtrl = &device->ptrfeed->ctrl;
     double  speed = sqrt (*dx * *dx + *dy * *dy);
     double  accel;
@@ -1402,92 +2031,111 @@ KdMouseAccelerate (DeviceIntPtr	device, 
     *dy = accel * *dy;
 }
 
+/* FIXME do something a little more clever to deal with multiple axes here */
 void
-KdEnqueueMouseEvent(KdMouseInfo *mi, unsigned long flags, int rx, int ry)
+KdEnqueuePointerEvent(KdPointerInfo *pi, unsigned long flags, int rx, int ry,
+                      int rz)
 {
-    CARD32	    ms;
-    xEvent	    xE;
-    unsigned char   buttons;
-    int		    x, y;
-    int		    (*matrix)[3] = kdMouseMatrix.matrix;
-    unsigned long   button;
-    int		    n;
+    CARD32        ms;
+    unsigned char buttons;
+    int           x, y, z;
+    int           (*matrix)[3] = kdPointerMatrix.matrix;
+    unsigned long button;
+    int           n;
+    int           dixflags;
 
-    if (!pKdPointer)
+    if (!pi)
 	return;
     
     ms = GetTimeInMillis();
-    
-    if (flags & KD_MOUSE_DELTA)
-    {
-	if (mi->transformCoordinates)
-	{
+
+    /* we don't need to transform z, so we don't. */
+    if (flags & KD_MOUSE_DELTA) {
+	if (pi->transformCoordinates) {
 	    x = matrix[0][0] * rx + matrix[0][1] * ry;
 	    y = matrix[1][0] * rx + matrix[1][1] * ry;
 	}
-	else
-	{
+	else {
 	    x = rx;
 	    y = ry;
 	}
-	KdMouseAccelerate (pKdPointer, &x, &y);
-	xE.u.keyButtonPointer.pad1 = 1;
+        /* screw this, use the DIX's acceleration (stolen from XFree86)
+         * instead.
+         * KdMouseAccelerate (pi, &x, &y); */
     }
-    else
-    {
-	if (mi->transformCoordinates)
-	{
-	    x = matrix[0][0] * rx + matrix[0][1] * ry + matrix[0][2];
-	    y = matrix[1][0] * rx + matrix[1][1] * ry + matrix[1][2];
+    else {
+	if (pi->transformCoordinates) {
+	    x = matrix[0][0] * rx + matrix[0][1] * ry;
+	    y = matrix[1][0] * rx + matrix[1][1] * ry;
 	}
-	else
-	{
+	else {
 	    x = rx;
 	    y = ry;
 	}
-	xE.u.keyButtonPointer.pad1 = 0;
     }
-    xE.u.keyButtonPointer.time = ms;
-    xE.u.keyButtonPointer.rootX = x;
-    xE.u.keyButtonPointer.rootY = y;
-
-    xE.u.u.type = MotionNotify;
-    xE.u.u.detail = 0;
-    KdHandleMouseEvent (mi, &xE);
+    z = rz;
+
+#ifdef DEBUG
+    ErrorF("sending motion notification for (%d, %d, %d)\n", x, y, z);
+    ErrorF("  comes from (%d, %d, %d)\n", rx, ry, rz);
+    ErrorF("  is %s\n", (flags & KD_MOUSE_DELTA) ? "relative" : "absolute");
+#endif
+
+    if (flags & KD_MOUSE_DELTA)
+        dixflags = POINTER_RELATIVE & POINTER_ACCELERATE;
+    else
+        dixflags = POINTER_ABSOLUTE;
+
+    _KdEnqueuePointerEvent(pi, MotionNotify, x, y, z, 0, dixflags, FALSE);
 
     buttons = flags;
 
-    for (button = KD_BUTTON_1, n = 0; button <= KD_BUTTON_5; button <<= 1, n++)
-    {
-	if ((mi->buttonState & button) ^ (buttons & button))
-	{
-	    if (buttons & button)
-	    {
-		Press(mi, n);
-	    }
-	    else
-	    {
-		Release(mi, n);
-	    }
+    for (button = KD_BUTTON_1, n = 1; button <= pi->nButtons;
+         button <<= 1, n++) {
+        if (((pi->buttonState & button) ^ (buttons & button)) &&
+           !(buttons & button)) {
+#ifdef DEBUG
+            ErrorF("  posting button release %d\n", n);
+#endif
+            _KdEnqueuePointerEvent(pi, ButtonRelease, x, y, z, n,
+                                   dixflags, FALSE);
 	}
     }
-    mi->buttonState = buttons;
+    for (button = KD_BUTTON_1, n = 1; button <= pi->nButtons;
+         button <<= 1, n++) {
+	if (((pi->buttonState & button) ^ (buttons & button)) &&
+	    (buttons & button)) {
+#ifdef DEBUG
+            ErrorF("  posting button press %d\n", n);
+#endif
+            _KdEnqueuePointerEvent(pi, ButtonPress, x, y, z, n,
+                                   dixflags, FALSE);
+        }
+    }
+
+    pi->buttonState = buttons;
 }
 
 void
-KdEnqueueMotionEvent (KdMouseInfo *mi, int x, int y)
+_KdEnqueuePointerEvent (KdPointerInfo *pi, int type, int x, int y, int z,
+                        int b, int absrel, Bool force)
 {
-    xEvent  xE;
-    CARD32  ms;
-    
-    ms = GetTimeInMillis();
-    
-    xE.u.u.type = MotionNotify;
-    xE.u.keyButtonPointer.time = ms;
-    xE.u.keyButtonPointer.rootX = x;
-    xE.u.keyButtonPointer.rootY = y;
+    xEvent *xE = NULL;
+    int n = 0, i = 0;
+    int valuators[3] = { x, y, z };
+
+#ifdef DEBUG
+    ErrorF("mouse enqueuing event from device %s (%d, %d, %d; %d)\n",
+           pi->name, x, y, z, b);
+#endif
 
-    KdHandleMouseEvent (mi, &xE);
+    /* TRUE from KdHandlePointerEvent, means 'we swallowed the event'. */
+    if (!force && KdHandlePointerEvent(pi, type, x, y, z, b, absrel))
+        return;
+
+    n = GetPointerEvents(&xE, pi->dixdev, type, b, absrel, 3, valuators);
+    for (i = 0; i < n; i++)
+        KdQueueEvent(xE++);
 }
 
 void
@@ -1496,16 +2144,16 @@ KdBlockHandler (int		screen,
 		pointer		timeout,
 		pointer		readmask)
 {
-    KdMouseInfo		    *mi;
+    KdPointerInfo		    *pi;
     int myTimeout=0;
 
-    for (mi = kdMouseInfo; mi; mi = mi->next)
+    for (pi = kdPointers; pi; pi = pi->next)
     {
-	if (mi->timeoutPending)
+	if (pi->timeoutPending)
 	{
 	    int	ms;
     
-	    ms = mi->emulationTimeout - GetTimeInMillis ();
+	    ms = pi->emulationTimeout - GetTimeInMillis ();
 	    if (ms < 1)
 		ms = 1;
 	    if(ms<myTimeout || myTimeout==0)
@@ -1531,7 +2179,7 @@ KdWakeupHandler (int		screen, 
     int		result = (int) lresult;
     fd_set	*pReadmask = (fd_set *) readmask;
     int		i;
-    KdMouseInfo	*mi;
+    KdPointerInfo	*pi;
     
     if (kdInputEnabled && result > 0)
     {
@@ -1543,15 +2191,15 @@ KdWakeupHandler (int		screen, 
 		KdUnblockSigio ();
 	    }
     }
-    for (mi = kdMouseInfo; mi; mi = mi->next)
+    for (pi = kdPointers; pi; pi = pi->next)
     {
-	if (mi->timeoutPending)
+	if (pi->timeoutPending)
 	{
-	    if ((long) (GetTimeInMillis () - mi->emulationTimeout) >= 0)
+	    if ((long) (GetTimeInMillis () - pi->emulationTimeout) >= 0)
 	    {
-		mi->timeoutPending = FALSE;
+		pi->timeoutPending = FALSE;
 		KdBlockSigio ();
-		KdReceiveTimeout (mi);
+		KdReceiveTimeout (pi);
 		KdUnblockSigio ();
 	    }
 	}
@@ -1686,3 +2334,156 @@ ProcessInputEvents ()
 	KdProcessSwitch ();
     KdCheckLock ();
 }
+
+/* We don't want to allow people to change the core devices, because the DIX
+ * does magical repeating goodness for us. */
+int
+ChangeKeyboardDevice(DeviceIntPtr pOldDev, DeviceIntPtr pDev)
+{
+    return BadDevice;
+}
+
+int
+ChangePointerDevice(DeviceIntPtr pOldDev, DeviceIntPtr pDev, int x, int y)
+{
+    return BadDevice;
+}
+
+/* FIXME use XSECURITY to work out whether the client should be allowed to
+ * open and close. */
+void
+OpenInputDevice(DeviceIntPtr pDev, ClientPtr client, int *status)
+{
+    if (!pDev)
+        *status = BadDevice;
+    else
+        *status = Success;
+}
+
+int
+CloseInputDevice(DeviceIntPtr pDev, ClientPtr client)
+{
+    if (!pDev)
+        return BadDevice;
+
+    return Success;
+}
+
+/* We initialise all input devices at startup. */
+int
+AddOtherInputDevices(void)
+{
+    return Success;
+}
+
+/* At the moment, absolute/relative is up to the client. */
+int
+SetDeviceMode(register ClientPtr client, DeviceIntPtr pDev, int mode)
+{
+    return BadMatch;
+}
+
+int
+SetDeviceValuators(register ClientPtr client, DeviceIntPtr pDev,
+                   int *valuators, int first_valuator, int num_valuators)
+{
+    return BadMatch;
+}
+
+int
+ChangeDeviceControl(register ClientPtr client, DeviceIntPtr pDev,
+                        xDeviceCtl *control)
+{
+    switch (control->control) {
+    case DEVICE_RESOLUTION:
+        /* FIXME do something more intelligent here */
+        return BadMatch;
+
+    case DEVICE_TOUCHSCREEN:
+        if (!pDev->touchscreen)
+            return BadDevice;
+        else
+            return Success;
+
+    case DEVICE_CORE:
+        return Success;
+
+    default:
+        return BadMatch;
+    }
+
+    /* NOTREACHED */
+    return BadImplementation;
+}
+
+int
+NewInputDeviceRequest(InputOption *options)
+{
+    InputOption *option = NULL;
+    KdPointerInfo *pi = NULL;
+    KdKeyboardInfo *ki = NULL;
+
+    ErrorF("handling NIDR\n");
+
+    for (option = options; option; option = option->next) {
+        if (strcmp(option->key, "type") == 0) {
+            if (strcmp(option->value, "pointer") == 0) {
+                pi = KdNewPointer();
+                if (!pi)
+                    return BadAlloc;
+                pi->options = options;
+            }
+            else if (strcmp(option->value, "keyboard") == 0) {
+                ki = KdNewKeyboard();
+                if (!ki)
+                    return BadAlloc;
+                ki->options = options;
+            }
+            else {
+                ErrorF("unrecognised device type!\n");
+                return BadValue;
+            }
+        }
+    }
+
+    for (option = options; option; option = option->next) {
+        ErrorF("option '%s': '%s'\n", option->key, option->value);
+        if (strcmp(option->key, "driver") == 0) {
+            if (pi) {
+                pi->driver = KdFindPointerDriver(option->value);
+                if (!pi->driver) {
+                    ErrorF("couldn't find driver!\n");
+                    KdFreePointer(pi);
+                    return BadValue;
+                }
+            }
+            else if (ki) {
+                ki->driver = KdFindKeyboardDriver(option->value);
+                if (!ki->driver) {
+                    ErrorF("couldn't find driver!\n");
+                    KdFreeKeyboard(ki);
+                    return BadValue;
+                }
+            }
+        }
+    }
+
+    if (pi) {
+        if (KdAddPointer(pi) != Success ||
+            ActivateDevice(pi->dixdev) != Success ||
+            EnableDevice(pi->dixdev) != TRUE) {
+            ErrorF("couldn't add or enable pointer\n");
+            return BadImplementation;
+        }
+    }
+    else if (ki) {
+        if (KdAddKeyboard(ki) != Success ||
+            ActivateDevice(ki->dixdev) != Success ||
+            EnableDevice(ki->dixdev) != TRUE) {
+            ErrorF("couldn't add or enable keyboard\n");
+            return BadImplementation;
+        }
+    }
+
+    ErrorF("done handling NIDR\n");
+}
diff --git a/hw/kdrive/src/kkeymap.c b/hw/kdrive/src/kkeymap.c
index 66383e7..ce4596f 100644
--- a/hw/kdrive/src/kkeymap.c
+++ b/hw/kdrive/src/kkeymap.c
@@ -28,14 +28,13 @@
 #endif
 #include "kdrive.h"
 #include <X11/keysym.h>
-#include "kkeymap.h"
 
 /*
  * Map scan codes (both regular and synthesized from extended keys)
  * to X keysyms
  */
 
-KeySym kdKeymap[(MAX_SCANCODE - MIN_SCANCODE + 1) * MAX_WIDTH] = {
+const KeySym kdDefaultKeymap[KD_MAX_LENGTH * KD_MAX_WIDTH] = {
 /* These are directly mapped from DOS scanset 0 */
 /*      1     8 */	 XK_Escape, NoSymbol,
 /*      2     9 */	 XK_1,	XK_exclam,
@@ -152,58 +151,13 @@ KeySym kdKeymap[(MAX_SCANCODE - MIN_SCAN
 /*    110   117 */	 NoSymbol,	NoSymbol,
 /*    111   118 */	 NoSymbol,	NoSymbol,
 /*    112   119 */	 NoSymbol,	NoSymbol,
-;
-
-/*
- * Map extended keys to additional scancodes
- */
-KdExtendMap kdExtendMap[] = {
-    0x1d,   89,	    /* Control_R */
-    0x1c,   90,	    /* KP_Enter */
-    0x35,   91,	    /* KP_Divide */
-    0x37,   92,	    /* Sys_Req */
-    0x38,   93,	    /* Alt_R */
-    0x45,   94,	    /* Num_Lock */
-    0x47,   95,	    /* Home */
-    0x48,   96,	    /* Up */
-    0x49,   97,	    /* Page_Up */
-    0x4b,   98,	    /* Left */
-    0x4d,   99,	    /* Right */
-    0x4f,   100,    /* End */
-    0x50,   101,    /* Down */
-    0x51,   102,    /* Page_Down */
-    0x52,   103,    /* Insert */
-    0x53,   104,    /* Delete */
-    0x5b,   105,    /* Super_L (Windows_L) */
-    0x5c,   106,    /* Super_R (Windows_R) */
-    0x5d,   107,    /* Menu */
-    0x46,   69,	    /* Break (with control pressed) */
 };
 
-#define NUM_EXTEND   (sizeof (kdExtendMap)/ sizeof (kdExtendMap[0]))
-
-int kdNumExtend = NUM_EXTEND;
-
-/*
- * Map keys on Japanese keyboard far from zero back to reasonable values
- */
-KdExtendMap kdJapanMap[] = {
-    0x70,   108,    /* next to Alt key */
-    0x73,   109,    /* dash/vbar */
-    0x79,   110,    /* right of space bar */
-    0x7b,   111,    /* left of space bar */
-    0x7d,   112,    /* Yen */
-};
-
-#define NUM_JAPAN   (sizeof (kdJapanMap)/sizeof (kdJapanMap[0]))
-
-int kdNumJapan = NUM_JAPAN;
-
 /*
  * List of locking key codes
  */
 
-CARD8  kdLockMap[] = {
+CARD8 kdLockMap[] = {
     65,
     101,
     77,
@@ -218,7 +172,7 @@ int kdNumLock = NUM_LOCK;
  * the KEYMAP_LOCKING_ALTGR flag is set in CEKeymapFlags
  */
 
-CARD8	kdOptionalLockMap[] = {
+CARD8 kdOptionalLockMap[] = {
     100,
 };
 
@@ -226,13 +180,13 @@ CARD8	kdOptionalLockMap[] = {
 
 int kdNumOptionalLock = NUM_OPTIONAL_LOCK;
 
-CARD8	kdModMap[MAP_LENGTH];
+const CARD8 kdDefaultModMap[MAP_LENGTH];
 
-unsigned long	kdKeymapFlags = 0;
+unsigned long kdDefaultKeymapFlags = 0;
 
-KeySymsRec  kdKeySyms = {
-    kdKeymap,
-    MIN_KEYCODE,
-    MAX_KEYCODE,
-    2
+const KeySymsRec kdDefaultKeySyms = {
+    kdDefaultKeymap,
+    KD_MIN_KEYCODE,
+    KD_MAX_KEYCODE,
+    KD_MAX_WIDTH
 };
diff --git a/hw/kdrive/src/kloadmap.c b/hw/kdrive/src/kloadmap.c
index bc003d4..b62b2de 100644
--- a/hw/kdrive/src/kloadmap.c
+++ b/hw/kdrive/src/kloadmap.c
@@ -27,7 +27,6 @@
 #include <kdrive-config.h>
 #endif
 #include "kdrive.h"
-#include "kkeymap.h"
 
 #ifdef WINDOWS
 #define KM_BUF	1024
diff --git a/hw/kdrive/vesa/vesa.c b/hw/kdrive/vesa/vesa.c
index 67d2d43..766cacd 100644
--- a/hw/kdrive/vesa/vesa.c
+++ b/hw/kdrive/vesa/vesa.c
@@ -871,7 +871,7 @@ vesaComputeFramebufferMapping (KdScreenI
     VesaScreenPrivPtr	pscr = screen->driver;
     int			depth, bpp, fbbpp;
     Pixel		allbits;
-    KdMouseMatrix	m;
+    KdPointerMatrix	m;
 
     if (vesa_linear_fb)
     {
@@ -970,10 +970,10 @@ vesaComputeFramebufferMapping (KdScreenI
 	pscr->mapping = VESA_WINDOWED;
 	pscr->shadow = TRUE;
     }
-    KdComputeMouseMatrix (&m, pscr->randr, 
-			  pscr->mode.XResolution, pscr->mode.YResolution);
+    KdComputePointerMatrix (&m, pscr->randr, 
+                            pscr->mode.XResolution, pscr->mode.YResolution);
     
-    KdSetMouseMatrix (&m);
+    KdSetPointerMatrix (&m);
     
     screen->width = pscr->mode.XResolution;
     screen->height = pscr->mode.YResolution;
diff --git a/hw/kdrive/vesa/vesainit.c b/hw/kdrive/vesa/vesainit.c
index 9337157..4f552d1 100644
--- a/hw/kdrive/vesa/vesainit.c
+++ b/hw/kdrive/vesa/vesainit.c
@@ -71,7 +71,16 @@ InitOutput (ScreenInfo *pScreenInfo, int
 void
 InitInput (int argc, char **argv)
 {
-    KdInitInput(&LinuxMouseFuncs, &LinuxKeyboardFuncs);
+    KdKeyboardInfo *ki = NULL;
+        
+    KdAddPointerDriver(&LinuxMouseDriver);
+    KdAddKeyboardDriver(&LinuxKeyboardDriver);
+    ki = KdNewKeyboard();
+    if (ki) {
+        ki->driver = &LinuxKeyboardDriver;
+        KdAddKeyboard(ki);
+    }
+    KdInitInput();
 }
 
 void
diff --git a/hw/kdrive/vxworks/vxkbd.c b/hw/kdrive/vxworks/vxkbd.c
index 1c23aa9..b421e92 100644
--- a/hw/kdrive/vxworks/vxkbd.c
+++ b/hw/kdrive/vxworks/vxkbd.c
@@ -171,7 +171,7 @@ static int  kbdFd = -1;
 #include <event.h>
 #include <kbd_ioctl.h>
 
-extern KeybdCtrl    defaultKeyboardControl;
+extern KeyboardCtrl    defaultKeyboardControl;
 
 static void
 VxWorksSetAutorepeat (unsigned char *repeats, Bool on)
@@ -235,7 +235,7 @@ void
 VxWorksKeyboardLeds (int leds)
 {
     DeviceIntPtr	pKeyboard = (DeviceIntPtr) LookupKeyboardDevice ();
-    KeybdCtrl		*ctrl = &pKeyboard->kbdfeed->ctrl;
+    KeyboardCtrl		*ctrl = &pKeyboard->kbdfeed->ctrl;
     led_ioctl_info	led_info;
     int			i;
 
diff-tree a274e7296b1bdd6f6c921f28b087610cec9548e0 (from b308dbf273f8c26361b0fee7aca64aec3245f60b)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Wed Jul 19 13:56:23 2006 -0400

    add GetPointerEvents/GetKeyboardEvents framework
    
    Add GetPointerEvents (with XFree86 pointer acceleration) and GetKeyboardEvents
    to the DIX.  Extend the ValuatorClass structure to account for same.

diff --git a/dix/devices.c b/dix/devices.c
index 40afac9..37720f3 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -611,6 +611,10 @@ InitValuatorClassDeviceStruct(DeviceIntP
     valc->axisVal = (int *)(valc->axes + numAxes);
     for (i=0; i<numAxes; i++)
 	valc->axisVal[i]=0;
+    valc->lastx = 0;
+    valc->lasty = 0;
+    valc->dxremaind = 0;
+    valc->dyremaind = 0;
     dev->valuator = valc;
     return TRUE;
 }
diff --git a/dix/events.c b/dix/events.c
index 479b4d8..1b0aee5 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -157,6 +157,7 @@ xEvent *xeviexE;
 #endif
 
 #include <X11/extensions/XIproto.h>
+#include "exglobals.h"
 #include "exevents.h"
 #include "extnsionst.h"
 
@@ -164,6 +165,8 @@ xEvent *xeviexE;
 #include "dixgrabs.h"
 #include "dispatch.h"
 
+int CoreDevicePrivatesIndex = 0, CoreDevicePrivatesGeneration = -1;
+
 #define EXTENSION_EVENT_BASE  64
 
 #define NoSuchEvent 0x80000000	/* so doesn't match NoEventMask */
@@ -4660,3 +4663,401 @@ WriteEventsToClient(ClientPtr pClient, i
 	(void)WriteToClient(pClient, count * sizeof(xEvent), (char *) events);
     }
 }
+
+int
+GetKeyboardEvents(xEvent **xE, DeviceIntPtr pDev, int type, int key_code) {
+    return GetKeyboardValuatorEvents(xE, pDev, type, key_code, 0, NULL);
+}
+
+int GetKeyboardValuatorEvents(xEvent **xE, DeviceIntPtr pDev, int type,
+                              int key_code, int num_valuators,
+                              int *valuators) {
+    int numEvents = 0, ms = 0, first_valuator = 0;
+    deviceKeyButtonPointer *kbp = NULL;
+    deviceValuator *xv = NULL;
+    xEvent *ev = NULL;
+    KeyClassPtr ckeyc;
+#ifdef XKB
+    xkbNewKeyboardNotify nkn;
+#endif
+
+    if (type != KeyPress && type != KeyRelease)
+        return 0;
+
+    if (!pDev->key || !pDev->focus ||
+        (pDev->coreEvents && !inputInfo.keyboard->key))
+        return 0;
+
+    if (pDev->coreEvents)
+        numEvents = 2;
+    else
+        numEvents = 1;
+
+    if (num_valuators)
+        numEvents += (num_valuators % 6) + 1;
+
+    ev = (xEvent *)xcalloc(sizeof(xEvent), numEvents);
+    if (!ev)
+        return 0;
+
+    *xE = ev;
+    ms = GetTimeInMillis();
+
+    kbp = (deviceKeyButtonPointer *) ev;
+    kbp->time = ms;
+    kbp->deviceid = pDev->id;
+    if (type == KeyPress)
+        kbp->type = DeviceKeyPress;
+    else if (type == KeyRelease)
+        kbp->type = DeviceKeyRelease;
+
+    if (num_valuators) {
+        kbp->deviceid |= MORE_EVENTS;
+        while (first_valuator < num_valuators) {
+            xv = (deviceValuator *) ++ev;
+            xv->type = DeviceValuator;
+            xv->first_valuator = first_valuator;
+            xv->num_valuators = num_valuators;
+            xv->deviceid = kbp->deviceid;
+            switch (num_valuators - first_valuator) {
+            case 6:
+                xv->valuator5 = valuators[first_valuator+5];
+            case 5:
+                xv->valuator4 = valuators[first_valuator+4];
+            case 4:
+                xv->valuator3 = valuators[first_valuator+3];
+            case 3:
+                xv->valuator2 = valuators[first_valuator+2];
+            case 2:
+                xv->valuator1 = valuators[first_valuator+1];
+            case 1:
+                xv->valuator0 = valuators[first_valuator];
+            }
+            first_valuator += 6;
+        }
+#ifdef DEBUG
+        ErrorF("GKVE: DV event with %d valuators\n", xv->num_valuators);
+#endif
+    }
+
+    if (pDev->coreEvents) {
+        ev++;
+        ev->u.keyButtonPointer.time = ms;
+        ev->u.u.type = type;
+        ev->u.u.detail = key_code;
+
+        if (inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr !=
+            pDev) {
+            ckeyc = inputInfo.keyboard->key;
+            memcpy(ckeyc->modifierMap, pDev->key->modifierMap, MAP_LENGTH);
+            if (ckeyc->modifierKeyMap)
+                xfree(ckeyc->modifierKeyMap);
+            ckeyc->modifierKeyMap = xalloc(8 * pDev->key->maxKeysPerModifier);
+            memcpy(ckeyc->modifierKeyMap, pDev->key->modifierKeyMap,
+                    (8 * pDev->key->maxKeysPerModifier));
+            ckeyc->maxKeysPerModifier = pDev->key->maxKeysPerModifier;
+            ckeyc->curKeySyms.map = NULL;
+            ckeyc->curKeySyms.mapWidth = 0;
+            ckeyc->curKeySyms.minKeyCode = pDev->key->curKeySyms.minKeyCode;
+            ckeyc->curKeySyms.maxKeyCode = pDev->key->curKeySyms.maxKeyCode;
+            SetKeySymsMap(&ckeyc->curKeySyms, &pDev->key->curKeySyms);
+#ifdef XKB
+            if (!noXkbExtension) {
+                nkn.oldMinKeyCode = ckeyc->xkbInfo->desc->min_key_code;
+                nkn.oldMaxKeyCode = ckeyc->xkbInfo->desc->max_key_code;
+                nkn.deviceID = nkn.oldDeviceID = inputInfo.keyboard->id;
+                nkn.minKeyCode = pDev->key->xkbInfo->desc->min_key_code;
+                nkn.maxKeyCode = pDev->key->xkbInfo->desc->max_key_code;
+                nkn.requestMajor = XkbReqCode;
+                nkn.requestMinor = X_kbSetMap; /* XXX bare-faced lie */
+                nkn.changed = XkbAllNewKeyboardEventsMask;
+                /* Free the map we set up at DEVICE_INIT time, since it's
+                 * going to just quietly disappear.  Shameful hack. */
+                if (!inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr
+                    && ckeyc->xkbInfo)
+                    XkbFreeInfo(ckeyc->xkbInfo);
+                ckeyc->xkbInfo = pDev->key->xkbInfo;
+                /* FIXME OH MY GOD SO AWFUL let's hope nobody notices */
+                if (nkn.oldMinKeyCode == nkn.minKeyCode)
+                    nkn.oldMinKeyCode--;
+                if (nkn.oldMaxKeyCode == nkn.maxKeyCode)
+                    nkn.oldMaxKeyCode++;
+                XkbSendNewKeyboardNotify(inputInfo.keyboard, &nkn);
+            }
+#endif
+            SendMappingNotify(MappingKeyboard, ckeyc->curKeySyms.minKeyCode,
+                              (ckeyc->curKeySyms.maxKeyCode -
+                               ckeyc->curKeySyms.minKeyCode),
+                              serverClient);
+            inputInfo.keyboard->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
+        }
+    }
+
+#ifdef DEBUG
+    ErrorF("GKE: putting out %d events with detail %d\n", numEvents, key_code);
+#endif
+
+    return numEvents;
+}
+
+/* Originally a part of xf86PostMotionEvent. */
+static void
+acceleratePointer(DeviceIntPtr pDev, int num_valuators, int *valuators)
+{
+    float mult = 0.0;
+    int dx = num_valuators >= 1 ? valuators[0] : 0;
+    int dy = num_valuators >= 2 ? valuators[1] : 0;
+
+    if (!num_valuators || !valuators)
+        return;
+
+    /*
+     * Accelerate
+     */
+    if (pDev->ptrfeed && pDev->ptrfeed->ctrl.num) {
+        /* modeled from xf86Events.c */
+        if (pDev->ptrfeed->ctrl.threshold) {
+            if ((abs(dx) + abs(dy)) >= pDev->ptrfeed->ctrl.threshold) {
+                pDev->valuator->dxremaind = ((float)dx *
+                                             (float)(pDev->ptrfeed->ctrl.num)) /
+                                             (float)(pDev->ptrfeed->ctrl.den) +
+                                            pDev->valuator->dxremaind;
+                valuators[0] = (int)pDev->valuator->dxremaind;
+                pDev->valuator->dxremaind = pDev->valuator->dxremaind -
+                                            (float)valuators[0];
+
+                pDev->valuator->dyremaind = ((float)dy *
+                                             (float)(pDev->ptrfeed->ctrl.num)) /
+                                             (float)(pDev->ptrfeed->ctrl.den) +
+                                            pDev->valuator->dyremaind;
+                valuators[1] = (int)pDev->valuator->dyremaind;
+                pDev->valuator->dyremaind = pDev->valuator->dyremaind -
+                                            (float)valuators[1];
+            }
+        }
+        else if (dx || dy) {
+            mult = pow((float)(dx * dx + dy * dy),
+                       ((float)(pDev->ptrfeed->ctrl.num) /
+                        (float)(pDev->ptrfeed->ctrl.den) - 1.0) /
+                       2.0) / 2.0;
+            if (dx) {
+                pDev->valuator->dxremaind = mult * (float)dx +
+                                            pDev->valuator->dxremaind;
+                valuators[0] = (int)pDev->valuator->dxremaind;
+                pDev->valuator->dxremaind = pDev->valuator->dxremaind -
+                                            (float)valuators[0];
+            }
+            if (dy) {
+                pDev->valuator->dyremaind = mult * (float)dy +
+                                            pDev->valuator->dyremaind;
+                valuators[1] = (int)pDev->valuator->dyremaind;
+                pDev->valuator->dyremaind = pDev->valuator->dyremaind -
+                                            (float)valuators[1];
+            }
+        }
+    }
+}
+
+int
+GetPointerEvents(xEvent **xE, DeviceIntPtr pDev, int type, int buttons,
+                 int flags, int num_valuators, int *valuators) {
+    int numEvents, ms, first_valuator = 0;
+    deviceKeyButtonPointer *kbp = NULL;
+    deviceValuator *xv = NULL;
+    AxisInfoPtr axes = NULL;
+    xEvent *ev = NULL;
+    DeviceIntPtr cp = inputInfo.pointer;
+
+    if (type != MotionNotify && type != ButtonPress && type != ButtonRelease)
+        return 0;
+
+    if (!pDev->button || (pDev->coreEvents && !(cp->button || !cp->valuator)))
+        return 0;
+
+#ifdef DEBUG
+    ErrorF("GPE: called with device %d, type %d\n", pDev->id, type);
+    ErrorF("GPE: relative %s, accelerate %s\n", flags & POINTER_RELATIVE ? "yes" : "no",
+           flags & POINTER_ACCELERATE ? "yes" : "no");
+#endif
+
+    if (pDev->coreEvents)
+        numEvents = 2;
+    else
+        numEvents = 1;
+
+    if (type == MotionNotify) {
+        if (num_valuators > 2)
+            numEvents += (num_valuators / 6) + 1;
+        else if (num_valuators < 2)
+            return 0;
+    }
+
+    ev = (xEvent *)xcalloc(sizeof(xEvent), numEvents);
+    if (!ev)
+        return 0;
+
+    *xE = ev;
+    ms = GetTimeInMillis();
+
+    kbp = (deviceKeyButtonPointer *) ev;
+    kbp->time = ms;
+    kbp->deviceid = pDev->id;
+
+    if (flags & POINTER_ABSOLUTE) {
+        if (num_valuators >= 1) {
+            kbp->root_x = valuators[0];
+        }
+        else {
+            if (pDev->coreEvents)
+                kbp->root_x = cp->valuator->lastx;
+            else
+                kbp->root_x = pDev->valuator->lastx;
+        }
+        if (num_valuators >= 2) {
+            kbp->root_y = valuators[1];
+        }
+        else {
+            if (pDev->coreEvents)
+                kbp->root_x = cp->valuator->lasty;
+            else
+                kbp->root_y = pDev->valuator->lasty;
+        }
+    }
+    else {
+        if (flags & POINTER_ACCELERATE)
+            acceleratePointer(pDev, num_valuators, valuators);
+
+        if (pDev->coreEvents) {
+            if (num_valuators >= 1)
+                kbp->root_x = cp->valuator->lastx + valuators[0];
+            else
+                kbp->root_x = cp->valuator->lastx;
+            if (num_valuators >= 2)
+                kbp->root_y = cp->valuator->lasty + valuators[1];
+            else
+                kbp->root_y = cp->valuator->lasty;
+        }
+        else {
+            if (num_valuators >= 1)
+                kbp->root_x = pDev->valuator->lastx + valuators[0];
+            else
+                kbp->root_x = pDev->valuator->lastx;
+            if (num_valuators >= 2)
+                kbp->root_y = pDev->valuator->lasty + valuators[1];
+            else
+                kbp->root_y = pDev->valuator->lasty;
+        }
+    }
+
+    /* FIXME: need mipointer-like semantics to move on to different screens. */
+    axes = pDev->valuator->axes;
+    if (kbp->root_x < axes->min_value)
+        kbp->root_x = axes->min_value;
+    if (kbp->root_x > axes->max_value)
+        kbp->root_x = axes->max_value;
+    axes++;
+    if (kbp->root_y < axes->min_value)
+        kbp->root_y = axes->min_value;
+    if (kbp->root_y > axes->max_value)
+        kbp->root_y = axes->max_value;
+
+    if (pDev->coreEvents) {
+#ifdef DEBUG
+        ErrorF("warping core lastx from %d to %d\n", cp->valuator->lastx, kbp->root_x);
+        ErrorF("x value given was %d\n", valuators[0]);
+#endif
+        cp->valuator->lastx = kbp->root_x;
+#ifdef DEBUG
+        ErrorF("warping core lasty from %d to %d\n", cp->valuator->lasty, kbp->root_y);
+        ErrorF("y value given was %d\n", valuators[1]);
+#endif
+        cp->valuator->lasty = kbp->root_y;
+    }
+    pDev->valuator->lastx = kbp->root_x;
+    pDev->valuator->lasty = kbp->root_y;
+
+    if (type == MotionNotify) {
+        kbp->type = DeviceMotionNotify;
+#ifdef DEBUG
+        ErrorF("GPE: motion at %d, %d\n", kbp->root_x, kbp->root_y);
+#endif
+    }
+    else {
+        if (type == ButtonPress)
+            kbp->type = DeviceButtonPress;
+        else if (type == ButtonRelease)
+            kbp->type = DeviceButtonRelease;
+#ifdef DEBUG
+        ErrorF("GPE: detail is %d\n", buttons);
+#endif
+        kbp->detail = buttons;
+    }
+
+    /* XXX: the spec says that Device{Key,Button}{Press,Release} events
+     * for relative devices shouldn't contain valuators since only the
+     * state field will have meaning, but I don't see why. */
+    if (num_valuators > 2 && (type == MotionNotify ||
+                              flags & POINTER_ABSOLUTE)) {
+        kbp->deviceid |= MORE_EVENTS;
+        while (first_valuator < num_valuators) {
+            xv = (deviceValuator *) ++ev;
+            xv->type = DeviceValuator;
+            xv->first_valuator = first_valuator;
+            xv->num_valuators = num_valuators;
+            xv->deviceid = kbp->deviceid;
+            switch (num_valuators - first_valuator) {
+            case 6:
+                xv->valuator5 = valuators[first_valuator+5];
+            case 5:
+                xv->valuator4 = valuators[first_valuator+4];
+            case 4:
+                xv->valuator3 = valuators[first_valuator+3];
+            case 3:
+                xv->valuator2 = valuators[first_valuator+2];
+            case 2:
+                if (first_valuator == 0)
+                    xv->valuator1 = kbp->root_y;
+                else
+                    xv->valuator1 = valuators[first_valuator+1];
+            case 1:
+                if (first_valuator == 0)
+                    xv->valuator0 = kbp->root_x;
+                else
+                    xv->valuator0 = valuators[first_valuator];
+            }
+            first_valuator += 6;
+        }
+#ifdef DEBUG
+        ErrorF("GPE: DV event with %d valuators\n", xv->num_valuators);
+#endif
+    }
+
+    if (pDev->coreEvents) {
+        ev++;
+        ev->u.u.type = type;
+        ev->u.keyButtonPointer.time = ms;
+        ev->u.keyButtonPointer.rootX = kbp->root_x;
+        ev->u.keyButtonPointer.rootY = kbp->root_y;
+        cp->valuator->lastx = kbp->root_x;
+        cp->valuator->lasty = kbp->root_y;
+#ifdef DEBUG
+        ErrorF("GPE: core co-ords at %d, %d\n", kbp->root_x, kbp->root_y);
+#endif
+        if (type == ButtonPress || type == ButtonRelease) {
+#ifdef DEBUG
+            ErrorF("GPE: core detail is %d\n", buttons);
+#endif
+            /* Core buttons remapping shouldn't be transitive. */
+            ev->u.u.detail = pDev->button->map[buttons];
+        }
+        else {
+            ev->u.u.detail = 0;
+        }
+
+        if (inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr !=
+            pDev)
+            inputInfo.pointer->devPrivates[CoreDevicePrivatesIndex].ptr = pDev;
+    }
+
+    return numEvents;
+}
diff --git a/include/input.h b/include/input.h
index 3e00be6..d550bbe 100644
--- a/include/input.h
+++ b/include/input.h
@@ -372,6 +372,32 @@ extern void InitInput(
     int  /*argc*/,
     char ** /*argv*/);
 
+extern int GetPointerEvents(
+    xEvent **xE,
+    DeviceIntPtr pDev,
+    int type,
+    int buttons,
+    int flags,
+    int num_axes,
+    int *valuators);
+
+extern int GetKeyboardEvents(
+    xEvent **xE,
+    DeviceIntPtr pDev,
+    int type,
+    int key_code);
+
+extern int GetKeyboardValuatorEvents(
+    xEvent **xE,
+    DeviceIntPtr pDev,
+    int type,
+    int key_code,
+    int num_axes,
+    int *valuators);
+
+extern DeviceIntPtr LookupDeviceIntRec(
+    CARD8 deviceid);
+
 /* Implemented by the DDX. */
 extern int NewInputDeviceRequest(
     InputOption *options);
diff --git a/include/inputstr.h b/include/inputstr.h
index 5c29497..8b877bc 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -64,6 +64,10 @@ SOFTWARE.
 
 #define EMASKSIZE	MAX_DEVICES
 
+#define POINTER_RELATIVE (1 << 1)
+#define POINTER_ABSOLUTE (1 << 2)
+#define POINTER_ACCELERATE (1 << 3)
+
 /* Kludge: OtherClients and InputClients must be compatible, see code */
 
 typedef struct _OtherClients {
@@ -150,6 +154,9 @@ typedef struct _ValuatorClassRec {
     unsigned short	numAxes;
     int			*axisVal;
     CARD8	 	mode;
+    int                 lastx, lasty; /* last event recorded, not posted to
+                                       * client; see dix/devices.c */
+    int                 dxremaind, dyremaind; /* for acceleration */
 } ValuatorClassRec, *ValuatorClassPtr;
 
 typedef struct _ButtonClassRec {
diff-tree b308dbf273f8c26361b0fee7aca64aec3245f60b (from c9a3d9baa81ceb940032ffe529d9eadf2d202ab2)
Author: Daniel Stone <daniel.stone at nokia.com>
Date:   Wed Jul 19 12:15:18 2006 -0400

    add DEVICE_TOUCHSCREEN and DEVICE_CORE Xi controls (DeviceIntRec ABI break)
    
    Add DEVICE_TOUCHSCREEN and DEVICE_CORE controls to the Xi code, and the
    TouchscreenClassRec and a coreEvents flag, to toggle propagation of core
    events.

diff --git a/Xi/chgdctl.c b/Xi/chgdctl.c
index d507513..ebe0865 100644
--- a/Xi/chgdctl.c
+++ b/Xi/chgdctl.c
@@ -104,6 +104,8 @@ ProcXChangeDeviceControl(ClientPtr clien
     xChangeDeviceControlReply rep;
     AxisInfoPtr a;
     CARD32 *resolution;
+    xDeviceTSCtl *ts;
+    xDeviceCoreCtl *c;
 
     REQUEST(xChangeDeviceControlReq);
     REQUEST_AT_LEAST_SIZE(xChangeDeviceControlReq);
@@ -168,6 +170,54 @@ ProcXChangeDeviceControl(ClientPtr clien
 	    return Success;
 	}
 	break;
+    case DEVICE_TOUCHSCREEN:
+        ts = (xDeviceTSCtl *)&stuff[1];
+
+        if (ts->button_threshold < 0 || ts->button_threshold > 255) {
+            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
+                              BadValue);
+            return Success;
+        }
+
+        status = ChangeDeviceControl(client, dev, (xDeviceCtl *) ts);
+
+        if (status == Success) {
+            dev->touchscreen->min_x = ts->min_x;
+            dev->touchscreen->max_x = ts->max_x;
+            dev->touchscreen->min_y = ts->min_y;
+            dev->touchscreen->max_y = ts->max_y;
+            dev->touchscreen->button_threshold = ts->button_threshold;
+        } else if (status == DeviceBusy) {
+            rep.status = DeviceBusy;
+            WriteReplyToClient(client, sizeof(xChangeDeviceControlReply),
+                               &rep);
+            return Success;
+        } else {
+            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
+                              BadMatch);
+            return Success;
+        }
+
+        break;
+    case DEVICE_CORE:
+        c = (xDeviceCoreCtl *)&stuff[1];
+
+        status = ChangeDeviceControl(client, dev, (xDeviceCtl *) c);
+
+        if (status == Success) {
+            dev->coreEvents = c->status;
+        } else if (status == DeviceBusy) {
+            rep.status = DeviceBusy;
+            WriteReplyToClient(client, sizeof(xChangeDeviceControlReply),
+                               &rep);
+            return Success;
+        } else {
+            SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0,
+                              BadMatch);
+            return Success;
+        }
+
+        break;
     default:
 	SendErrorToClient(client, IReqCode, X_ChangeDeviceControl, 0, BadValue);
 	return Success;
diff --git a/Xi/getdctl.c b/Xi/getdctl.c
index c2b69fd..66342b3 100644
--- a/Xi/getdctl.c
+++ b/Xi/getdctl.c
@@ -124,6 +124,18 @@ ProcXGetDeviceControl(ClientPtr client)
 	total_length = sizeof(xDeviceResolutionState) +
 	    (3 * sizeof(int) * dev->valuator->numAxes);
 	break;
+    case DEVICE_TOUCHSCREEN:
+        if (!dev->touchscreen) {
+            SendErrorToClient(client, IReqCode, X_GetDeviceControl, 0,
+                              BadMatch);
+            return Success;
+        }
+
+        total_length = sizeof(xDeviceTSCtl);
+        break;
+    case DEVICE_CORE:
+        total_length = sizeof(xDeviceCoreCtl);
+        break;
     default:
 	SendErrorToClient(client, IReqCode, X_GetDeviceControl, 0, BadValue);
 	return Success;
@@ -140,6 +152,11 @@ ProcXGetDeviceControl(ClientPtr client)
     case DEVICE_RESOLUTION:
 	CopySwapDeviceResolution(client, dev->valuator, buf, total_length);
 	break;
+    case DEVICE_TOUCHSCREEN:
+        CopySwapDeviceTouchscreen(client, dev->touchscreen, buf);
+        break;
+    case DEVICE_CORE:
+        CopySwapDeviceCore(client, dev, buf);
     default:
 	break;
     }
@@ -189,6 +206,48 @@ CopySwapDeviceResolution(ClientPtr clien
     }
 }
 
+void CopySwapDeviceTouchscreen (ClientPtr client, TouchscreenClassPtr dts,
+                                char *buf)
+{
+    register char n;
+    xDeviceTSState *ts = (xDeviceTSState *) buf;
+
+    ts->control = DEVICE_TOUCHSCREEN;
+    ts->length = sizeof(ts);
+    ts->min_x = dts->min_x;
+    ts->max_x = dts->max_x;
+    ts->min_y = dts->min_y;
+    ts->max_y = dts->max_y;
+    ts->button_threshold = dts->button_threshold;
+
+    if (client->swapped) {
+        swaps(&ts->control, n);
+        swaps(&ts->length, n);
+        swapl(&ts->min_x, n);
+        swapl(&ts->max_x, n);
+        swapl(&ts->min_y, n);
+        swapl(&ts->max_y, n);
+        swapl(&ts->button_threshold, n);
+    }
+}
+
+void CopySwapDeviceCore (ClientPtr client, DeviceIntPtr dev, char *buf)
+{
+    register char n;
+    xDeviceCoreState *c = (xDeviceCoreState *) buf;
+
+    c->control = DEVICE_CORE;
+    c->length = sizeof(c);
+    c->status = dev->coreEvents;
+
+    if (client->swapped) {
+        swaps(&c->control, n);
+        swaps(&c->length, n);
+        swaps(&c->status, n);
+    }
+}
+
+
 /***********************************************************************
  *
  * This procedure writes the reply for the xGetDeviceControl function,
diff --git a/Xi/getdctl.h b/Xi/getdctl.h
index c7cfb19..1417d1b 100644
--- a/Xi/getdctl.h
+++ b/Xi/getdctl.h
@@ -42,6 +42,16 @@ void CopySwapDeviceResolution(ClientPtr 
 			      int	/* length */
     );
 
+void CopySwapDeviceTouchscreen(ClientPtr /* client */ ,
+                               TouchscreenClassPtr /* ts */ ,
+                               char * /* buf */
+    );
+
+void CopySwapDeviceCore(ClientPtr /* client */ ,
+                        DeviceIntPtr /* dev */ ,
+                        char * /* buf */
+    );
+
 void SRepXGetDeviceControl(ClientPtr /* client */ ,
 			   int /* size */ ,
 			   xGetDeviceControlReply *	/* rep */
diff --git a/Xi/stubs.c b/Xi/stubs.c
index 6b9e682..90aeddb 100644
--- a/Xi/stubs.c
+++ b/Xi/stubs.c
@@ -287,6 +287,10 @@ ChangeDeviceControl(register ClientPtr c
     switch (control->control) {
     case DEVICE_RESOLUTION:
 	return (BadMatch);
+    case DEVICE_TOUCHSCREEN:
+        return (BadMatch);
+    case DEVICE_CORE:
+        return (BadMatch);
     default:
 	return (BadMatch);
     }
diff --git a/include/inputstr.h b/include/inputstr.h
index b54e8a1..5c29497 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -177,6 +177,14 @@ typedef struct _ProximityClassRec {
     char	pad;
 } ProximityClassRec, *ProximityClassPtr;
 
+typedef struct _TouchscreenClassRec {
+    int         min_x;
+    int         max_x;
+    int         min_y;
+    int         max_y;
+    int         button_threshold;
+} TouchscreenClassRec, *TouchscreenClassPtr;
+
 typedef struct _KbdFeedbackClassRec *KbdFeedbackPtr;
 typedef struct _PtrFeedbackClassRec *PtrFeedbackPtr;
 typedef struct _IntegerFeedbackClassRec *IntegerFeedbackPtr;
@@ -250,6 +258,7 @@ typedef struct _DeviceIntRec {
 					  used to initialize, turn on, or
 					  turn off the device */
     Bool	inited;			/* TRUE if INIT returns Success */
+    Bool        coreEvents;             /* TRUE if device also sends core */
     GrabPtr	grab;			/* the grabber - used by DIX */
     struct {
 	Bool		frozen;
@@ -276,6 +285,7 @@ typedef struct _DeviceIntRec {
     ButtonClassPtr	button;
     FocusClassPtr	focus;
     ProximityClassPtr	proximity;
+    TouchscreenClassPtr touchscreen;
     KbdFeedbackPtr	kbdfeed;
     PtrFeedbackPtr	ptrfeed;
     IntegerFeedbackPtr	intfeed;
diff-tree c9a3d9baa81ceb940032ffe529d9eadf2d202ab2 (from 02a95311568e24e1055ea52c7df8cb7aa3f38ad0)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Jul 19 11:41:16 2006 -0400

    xorg DDX: implement NewInputDeviceRequest
    
    Implement NewInputDeviceRequest for Xorg, mainly written by Kristian Høgsberg.
    Move MatchInput to xf86Helper.c, as xf86LookupInputDriver.

diff --git a/hw/xfree86/common/xf86Helper.c b/hw/xfree86/common/xf86Helper.c
index ebc460f..05ac570 100644
--- a/hw/xfree86/common/xf86Helper.c
+++ b/hw/xfree86/common/xf86Helper.c
@@ -142,6 +142,19 @@ xf86DeleteInputDriver(int drvIndex)
     xf86InputDriverList[drvIndex] = NULL;
 }
 
+InputDriverPtr
+xf86LookupInputDriver(const char *name)
+{
+    int i;
+
+    for (i = 0; i < xf86NumInputDrivers; i++) {
+       if (xf86InputDriverList[i] && xf86InputDriverList[i]->driverName &&
+           xf86NameCmp(name, xf86InputDriverList[i]->driverName) == 0)
+           return xf86InputDriverList[i];
+    }
+    return NULL;
+}
+
 _X_EXPORT void
 xf86AddModuleInfo(ModuleInfoPtr info, pointer module)
 {
diff --git a/hw/xfree86/common/xf86InPriv.h b/hw/xfree86/common/xf86InPriv.h
index a14e9e7..940e8ba 100644
--- a/hw/xfree86/common/xf86InPriv.h
+++ b/hw/xfree86/common/xf86InPriv.h
@@ -41,4 +41,7 @@ extern int xf86NumInputDrivers;
 /* xf86Xinput.c */
 void xf86ActivateDevice(InputInfoPtr pInfo);
 
+/* xf86Helper.c */
+InputDriverPtr xf86LookupInputDriver(const char *name);
+
 #endif /* _xf86InPriv_h */
diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c
index 9939184..6defa94 100644
--- a/hw/xfree86/common/xf86Init.c
+++ b/hw/xfree86/common/xf86Init.c
@@ -985,21 +985,6 @@ InitOutput(ScreenInfo *pScreenInfo, int 
 				 NULL);
 }
 
-
-static InputDriverPtr
-MatchInput(IDevPtr pDev)
-{
-    int i;
-
-    for (i = 0; i < xf86NumInputDrivers; i++) {
-	if (xf86InputDriverList[i] && xf86InputDriverList[i]->driverName &&
-	    xf86NameCmp(pDev->driver, xf86InputDriverList[i]->driverName) == 0)
-	    return xf86InputDriverList[i];
-    }
-    return NULL;
-}
-
-
 /*
  * InitInput --
  *      Initialize all supported input devices.
@@ -1033,7 +1018,7 @@ InitInput(argc, argv)
 	    }
 #endif
 
-	    if ((pDrv = MatchInput(pDev)) == NULL) {
+	    if ((pDrv = xf86LookupInputDriver(pDev->driver)) == NULL) {
 		xf86Msg(X_ERROR, "No Input driver matching `%s'\n", pDev->driver);
 		/* XXX For now, just continue. */
 		continue;
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index a931a5d..329dcba 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -622,6 +622,82 @@ ChangeDeviceControl (ClientPtr client, D
 }
 #endif
 
+int
+NewInputDeviceRequest (InputOption *options)
+{
+    IDevRec *idev = NULL;
+    InputDriverPtr drv = NULL;
+    InputInfoPtr pInfo = NULL;
+    InputOption *option = NULL;
+    DeviceIntPtr dev = NULL;
+    int i;
+
+    idev = xcalloc(sizeof(*idev), 1);
+    if (!idev)
+        return BadAlloc;
+
+    for (option = options; option; option = option->next) {
+        if (strcmp(option->key, "driver") == 0) {
+            if (!xf86LoadOneModule(option->value, NULL))
+                return BadName;
+            drv = xf86LookupInputDriver(option->value);
+            if (!drv) {
+                xf86Msg(X_ERROR, "No input driver matching `%s'\n",
+                        option->value);
+                return BadName;
+            }
+            idev->driver = xstrdup(option->value);
+            if (!idev->driver) {
+                xfree(idev);
+                return BadAlloc;
+            }
+        }
+        if (strcmp(option->key, "name") == 0 ||
+            strcmp(option->key, "identifier") == 0) {
+            idev->identifier = xstrdup(option->value);
+            if (!idev->identifier) {
+                xfree(idev);
+                return BadAlloc;
+            }
+        }
+    }
+
+    if (!drv->PreInit) {
+        xf86Msg(X_ERROR,
+                "Input driver `%s' has no PreInit function (ignoring)\n",
+                drv->driverName);
+        return BadImplementation;
+    }
+
+    idev->commonOptions = NULL;
+    for (option = options; option; option = option->next)
+        idev->commonOptions = xf86addNewOption(idev->commonOptions,
+                                               option->key, option->value);
+    idev->extraOptions = NULL;
+
+    pInfo = drv->PreInit(drv, idev, 0);
+
+    if (!pInfo) {
+        xf86Msg(X_ERROR, "PreInit returned NULL for \"%s\"\n", idev->identifier);
+        return BadMatch;
+    }
+    else if (!(pInfo->flags & XI86_CONFIGURED)) {
+        xf86Msg(X_ERROR, "PreInit failed for input device \"%s\"\n",
+                idev->identifier);
+        xf86DeleteInput(pInfo, 0);
+        return BadMatch;
+    }
+
+    xf86ActivateDevice(pInfo);
+
+    dev = pInfo->dev;
+    dev->inited = ((*dev->deviceProc)(dev, DEVICE_INIT) == Success);
+    if (dev->inited && dev->startup)
+        EnableDevice(dev);
+
+    return Success;
+}
+
 /*
  * adapted from mieq.c to support extended events
  *
diff-tree 02a95311568e24e1055ea52c7df8cb7aa3f38ad0 (from 93cd53860c3aca182a0a02543c41b5d71d65926b)
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Jul 19 10:05:12 2006 -0400

    add basic D-BUS configuration mechanism
    
    Also move LookupDeviceIntRec into the DIX, and add InputOption type, and
    NewInputDeviceRequest prototype (DIX requests DDX to add a device).  Does not
    link without an implemented NIDR.

diff --git a/Makefile.am b/Makefile.am
index c425cc6..799815e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -59,6 +59,7 @@ SUBDIRS = \
 	$(COMPOSITE_DIR) \
 	$(GLX_DIR) \
 	exa \
+	config \
 	hw
 
 aclocaldir = $(datadir)/aclocal
diff --git a/config/Makefile.am b/config/Makefile.am
new file mode 100644
index 0000000..1cc9109
--- /dev/null
+++ b/config/Makefile.am
@@ -0,0 +1,10 @@
+AM_CFLAGS = @DIX_CFLAGS@
+
+dbusconfigdir = $(sysconfdir)/dbus-1/system.d
+dbusconfig_DATA = xorg-server.conf
+
+lib_LIBRARIES = libconfig.a
+
+libconfig_a_SOURCES = config.c
+
+EXTRA_DIST = xorg-server.conf
diff --git a/config/config.c b/config/config.c
new file mode 100644
index 0000000..b85b120
--- /dev/null
+++ b/config/config.c
@@ -0,0 +1,289 @@
+/*
+ * Copyright © 2006 Daniel Stone
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holders and/or authors
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  The copyright holders
+ * and/or authors make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS AND/OR AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD
+ * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND/OR AUTHORS BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include <dix-config.h>
+#endif
+
+#ifdef HAVE_DBUS
+#define DBUS_API_SUBJECT_TO_CHANGE
+#include <dbus/dbus.h>
+#include <string.h>
+#include "opaque.h" /* for 'display': there has to be a better way */
+                    /* the above comment lies.  there is no better way. */
+#include "input.h"
+#include "config.h"
+
+#define MATCH_RULE "type='method_call',interface='org.x.config.input'"
+
+static DBusConnection *configConnection = NULL;
+static int configfd = -1;
+static char busobject[32] = { 0 };
+static char busname[64] = { 0 };
+
+void
+configDispatch()
+{
+    if (!configConnection)
+        return;
+
+    dbus_connection_read_write_dispatch(configConnection, 0);
+}
+
+static DBusHandlerResult
+configMessage(DBusConnection *connection, DBusMessage *message, void *closure)
+{
+    InputOption *option = NULL, *ret = NULL;
+    DBusMessageIter iter, subiter;
+    DBusError error;
+    char *tmp = NULL;
+    int deviceid = -1;
+    DeviceIntPtr pDev = NULL;
+
+    ErrorF("[dbus] new message!\n");
+    ErrorF("       source: %s\n", dbus_message_get_sender(message));
+    ErrorF("       destination: %s\n", dbus_message_get_destination(message));
+    ErrorF("       signature: %s\n", dbus_message_get_signature(message));
+    ErrorF("       path: %s\n", dbus_message_get_path(message));
+    ErrorF("       interface: %s\n", dbus_message_get_interface(message));
+    ErrorF("       member: %s\n", dbus_message_get_member(message));
+    ErrorF("       method call? %s\n", (dbus_message_get_type(message) ==
+                                         DBUS_MESSAGE_TYPE_METHOD_CALL) ?
+                                        "yes" : "no");
+
+    dbus_error_init(&error);
+
+    if (strcmp(dbus_message_get_interface(message),
+               "org.x.config.input") == 0) {
+        if (!dbus_message_iter_init(message, &iter)) {
+            ErrorF("failed to init iterator! this is probably bad.\n");
+            dbus_error_free(&error);
+            return DBUS_HANDLER_RESULT_NEED_MEMORY; /* ?? */
+        }
+        if (strcmp(dbus_message_get_member(message), "add") == 0) {
+            ErrorF("       we want to add a device!\n");
+            /* signature should be [ss][ss]... */
+            while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_ARRAY) {
+                option = (InputOption *)xcalloc(sizeof(InputOption), 1);
+                if (!option) {
+                    while (ret) {
+                        option = ret;
+                        ret = ret->next;
+                        xfree(option);
+                    }
+                    dbus_error_free(&error);
+                    return DBUS_HANDLER_RESULT_NEED_MEMORY;
+                }
+
+                dbus_message_iter_recurse(&iter, &subiter);
+
+                if (dbus_message_iter_get_arg_type(&subiter) !=
+                    DBUS_TYPE_STRING) {
+                    ErrorF("couldn't get the arg type\n");
+                    xfree(option);
+                    dbus_error_free(&error);
+                    return DBUS_HANDLER_RESULT_HANDLED;
+                }
+                dbus_message_iter_get_basic(&subiter, &tmp);
+                if (!tmp) {
+                    ErrorF("couldn't get the key!\n");
+                    xfree(option);
+                    break;
+                }
+                option->key = xstrdup(tmp);
+                if (!option->key) {
+                    ErrorF("couldn't duplicate the key!\n");
+                    xfree(option);
+                    break;
+                }
+
+                if (!dbus_message_iter_has_next(&subiter)) {
+                    ErrorF("broken message: no next\n");
+                    xfree(option->key);
+                    xfree(option);
+                    dbus_error_free(&error);
+                    return DBUS_HANDLER_RESULT_HANDLED;
+                }
+                dbus_message_iter_next(&subiter);
+
+                if (dbus_message_iter_get_arg_type(&subiter) !=
+                    DBUS_TYPE_STRING) {
+                    ErrorF("couldn't get the arg type\n");
+                    xfree(option);
+                    dbus_error_free(&error);
+                    return DBUS_HANDLER_RESULT_HANDLED;
+                }
+                dbus_message_iter_get_basic(&subiter, &tmp);
+                if (!tmp) {
+                    ErrorF("couldn't get the value!\n");
+                    xfree(option->key);
+                    xfree(option);
+                    break;
+                }
+                option->value = xstrdup(tmp);
+                if (!option->value) {
+                    ErrorF("couldn't duplicate the option!\n");
+                    xfree(option->value);
+                    xfree(option);
+                    break;
+                }
+
+                option->next = ret;
+                ret = option;
+                dbus_message_iter_next(&iter);
+            }
+
+            if (NewInputDeviceRequest(ret) != Success) {
+                ErrorF("[config] NIDR failed\n");
+            }
+            dbus_error_free(&error);
+            return DBUS_HANDLER_RESULT_HANDLED;
+        }
+        else if (strcmp(dbus_message_get_member(message), "remove") == 0) {
+            ErrorF("        we want to remove a device!\n");
+            if (!dbus_message_get_args(message, &error, DBUS_TYPE_INT32,
+                                       &deviceid, DBUS_TYPE_INVALID)) {
+                ErrorF("couldn't get args: %s %s\n", error.name, error.message);
+                dbus_error_free(&error);
+                return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+            }
+            if (deviceid < 0 || !(pDev = LookupDeviceIntRec(deviceid))) {
+                ErrorF("bogus device id %d\n", deviceid);
+                dbus_error_free(&error);
+                return DBUS_HANDLER_RESULT_HANDLED;
+            }
+            ErrorF("pDev is %p\n", pDev);
+            RemoveDevice(pDev);
+            dbus_error_free(&error);
+            return DBUS_HANDLER_RESULT_HANDLED;
+        }
+    }
+
+    dbus_error_free(&error);
+
+    return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+}
+
+void
+configInitialise()
+{
+    DBusConnection *bus = NULL;
+    DBusError error;
+    DBusObjectPathVTable vtable;
+
+    configConnection = NULL;
+
+    dbus_error_init(&error);
+    bus = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
+    if (!bus || dbus_error_is_set(&error)) {
+        ErrorF("[dbus] some kind of error occurred: %s (%s)\n", error.name,
+                error.message);
+        dbus_error_free(&error);
+        return;
+    }
+
+    if (!dbus_connection_get_unix_fd(bus, &configfd)) {
+        ErrorF("[dbus] couldn't get fd for bus\n");
+        dbus_connection_close(bus);
+        configfd = -1;
+        return;
+    }
+
+    snprintf(busname, sizeof(busname), "org.x.config.display%d", atoi(display));
+    if (!dbus_bus_request_name(bus, busname, 0, &error) ||
+        dbus_error_is_set(&error)) {
+        ErrorF("[dbus] couldn't take over org.x.config: %s (%s)\n",
+               error.name, error.message);
+        dbus_error_free(&error);
+        dbus_connection_close(bus);
+        configfd = -1;
+        return;
+    }
+
+    /* blocks until we get a reply. */
+    dbus_bus_add_match(bus, MATCH_RULE, &error);
+    if (dbus_error_is_set(&error)) {
+        ErrorF("[dbus] couldn't match X.Org rule: %s (%s)\n", error.name,
+               error.message);
+        dbus_error_free(&error);
+        dbus_bus_release_name(bus, busname, &error);
+        dbus_connection_close(bus);
+        configfd = -1;
+        return;
+    }
+
+    vtable.message_function = configMessage;
+    snprintf(busobject, sizeof(busobject), "/org/x/config/%d", atoi(display));
+    if (!dbus_connection_register_object_path(bus, busobject, &vtable, NULL)) {
+        ErrorF("[dbus] couldn't register object path\n");
+        configfd = -1;
+        dbus_bus_release_name(bus, busname, &error);
+        dbus_bus_remove_match(bus, MATCH_RULE, &error);
+        dbus_connection_close(bus);
+        configfd = -1;
+        return;
+    }
+    ErrorF("[dbus] registered object path %s\n", busobject);
+
+    ErrorF("[dbus] registered and listening\n");
+
+    dbus_error_free(&error);
+
+    configConnection = bus;
+
+    AddGeneralSocket(configfd);
+}
+
+void
+configFini()
+{
+    DBusError error;
+
+    if (configConnection) {
+        dbus_error_init(&error);
+        ErrorF("configFini being called\n");
+        dbus_bus_remove_match(configConnection, MATCH_RULE, &error);
+        dbus_bus_release_name(configConnection, busname, &error);
+        dbus_connection_close(configConnection);
+        RemoveGeneralSocket(configfd);
+        configConnection = NULL;
+        configfd = -1;
+        dbus_error_free(&error);
+    }
+}
+#else
+void
+configDispatch()
+{
+}
+
+void
+configInitialise()
+{
+}
+
+void
+configFini()
+{
+}
+#endif
diff --git a/config/xorg-server.conf b/config/xorg-server.conf
new file mode 100644
index 0000000..47a9a78
--- /dev/null
+++ b/config/xorg-server.conf
@@ -0,0 +1,13 @@
+<!DOCTYPE busconfig PUBLIC
+ "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+	<policy context="default">
+		<allow own="org.x.config.display0"/>
+		<allow send_destination="org.x.config.display0"/>
+		<allow send_interface="org.x.config.display0"/>
+		<allow own="org.x.config.display1"/>
+		<allow send_destination="org.x.config.display1"/>
+		<allow send_interface="org.x.config.display1"/>
+	</policy>
+</busconfig>
diff --git a/configure.ac b/configure.ac
index a2af599..41536f7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -423,6 +423,7 @@ AC_ARG_ENABLE(dbe,            AS_HELP_ST
 AC_ARG_ENABLE(xf86bigfont,    AS_HELP_STRING([--disable-xf86bigfont], [Build XF86 Big Font extension (default: enabled)]), [XF86BIGFONT=$enableval], [XF86BIGFONT=yes])
 AC_ARG_ENABLE(dpms,           AS_HELP_STRING([--disable-dpms], [Build DPMS extension (default: enabled)]), [DPMSExtension=$enableval], [DPMSExtension=yes])
 AC_ARG_ENABLE(xinput,         AS_HELP_STRING([--disable-xinput], [Build XInput Extension (default: enabled)]), [XINPUT=$enableval], [XINPUT=yes])
+AC_ARG_ENABLE(dbus,           AS_HELP_STRING([--disable-dbus], [Build D-BUS support (default: auto)]), [DBUS=$enableval], [DBUS=auto])
 
 dnl DDXes.
 AC_ARG_ENABLE(xorg,    	      AS_HELP_STRING([--enable-xorg], [Build Xorg server (default: auto)]), [XORG=$enableval], [XORG=auto])
@@ -512,6 +513,18 @@ dnl Core modules for most extensions, et
 REQUIRED_MODULES="randrproto renderproto [fixesproto >= 4.0] damageproto xcmiscproto xextproto xproto xtrans xf86miscproto xf86vidmodeproto xf86bigfontproto [scrnsaverproto >= 1.1] bigreqsproto resourceproto fontsproto inputproto xf86dgaproto"
 REQUIRED_LIBS="xfont xau fontenc"
 
+if test "x$DBUS" = xauto; then
+       PKG_CHECK_MODULES(DBUS, dbus-1, [DBUS=yes], [DBUS=no])
+fi
+if test "x$DBUS" = xyes; then
+       PKG_CHECK_MODULES(DBUS, dbus-1)
+       AC_DEFINE(HAVE_DBUS, 1, [Have D-BUS support])
+       REQUIRED_MODULES="$REQUIRED_MODULES dbus-1"
+       REQUIRED_LIBS="$REQUIRED_LIBS dbus-1"
+fi
+CONFIG_LIB='$(top_builddir)/config/libconfig.a'
+AM_CONDITIONAL(DBUS, [test "x$DBUS" = xyes])
+
 AM_CONDITIONAL(XV, [test "x$XV" = xyes])
 if test "x$XV" = xyes; then
 	AC_DEFINE(XV, 1, [Support Xv extension])
@@ -1007,7 +1020,7 @@ if test "x$XGLX" = xyes; then
 fi
 
 # XORG_CORE_LIBS is needed even if you're not building the Xorg DDX
-XORG_CORE_LIBS="$DIX_LIB"
+XORG_CORE_LIBS="$DIX_LIB $CONFIG_LIB"
 AC_SUBST([XORG_CORE_LIBS])
 
 xorg_bus_linuxpci=no
@@ -1295,7 +1308,7 @@ AC_MSG_RESULT([$XPRINT])
 if test "x$XPRINT" = xyes; then
 	PKG_CHECK_MODULES([XPRINT], [printproto x11 xfont $XDMCP_MODULES xau])
 	XPRINT_EXTENSIONS="$XEXT_LIB $DBE_LIB $XTRAP_LIB $RECORD_LIB $RENDER_LIB $COMPOSITE_LIB $RANDR_LIB $XI_LIB $FIXES_LIB $DAMAGE_LIB $XI_LIB $GLX_LIBS"
-	XPRINT_LIBS="$XPRINT_LIBS $DIX_LIB $XKB_LIB $XKB_STUB_LIB $XPRINT_EXTENSIONS $MI_LIB $MIEXT_DAMAGE_LIB $CWRAP_LIB $OS_LIB"
+	XPRINT_LIBS="$XPRINT_LIBS $DIX_LIB $CONFIG_LIB $XKB_LIB $XKB_STUB_LIB $XPRINT_EXTENSIONS $MI_LIB $MIEXT_DAMAGE_LIB $CWRAP_LIB $OS_LIB"
 	AC_SUBST([XPRINT_CFLAGS])
 	AC_SUBST([XPRINT_LIBS])
 
@@ -1451,7 +1464,7 @@ if test "$KDRIVE" = yes; then
     KDRIVE_LIB='$(top_builddir)/hw/kdrive/src/libkdrive.a'
     KDRIVE_OS_LIB='$(top_builddir)/hw/kdrive/linux/liblinux.a'
     KDRIVE_STUB_LIB='$(top_builddir)/hw/kdrive/src/libkdrivestubs.a'
-    KDRIVE_LIBS="$DIX_LIB $KDRIVE_LIB $KDRIVE_OS_LIB $KDRIVE_PURE_LIBS $KDRIVE_STUB_LIB"
+    KDRIVE_LIBS="$DIX_LIB $CONFIG_LIB $KDRIVE_LIB $KDRIVE_OS_LIB $KDRIVE_PURE_LIBS $KDRIVE_STUB_LIB"
 
     # check if we can build Xephyr
     PKG_CHECK_MODULES(XEPHYR, x11 xext xfont xau xdmcp, [xephyr="yes"], [xephyr="no"])
@@ -1630,6 +1643,7 @@ XTrap/Makefile
 mfb/Makefile
 cfb/Makefile
 cfb32/Makefile
+config/Makefile
 mi/Makefile
 miext/Makefile
 miext/damage/Makefile
diff --git a/dix/dispatch.c b/dix/dispatch.c
index 72d4995..066b608 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -103,6 +103,7 @@ int ProcInitialConnection();
 #include "dispatch.h"
 #include "swaprep.h"
 #include "swapreq.h"
+#include "config.h"
 #ifdef PANORAMIX
 #include "panoramiX.h"
 #include "panoramiXsrv.h"
@@ -385,6 +386,9 @@ Dispatch(void)
 
 	nready = WaitForSomething(clientReady);
 
+        /* this is an enormous hack and NEEDS TO GO AWAY. */
+        configDispatch();
+
 #ifdef SMART_SCHEDULE
 	if (nready && !SmartScheduleDisable)
 	{
diff --git a/dix/main.c b/dix/main.c
index 9d66a4f..5f53989 100644
--- a/dix/main.c
+++ b/dix/main.c
@@ -101,6 +101,7 @@ Equipment Corporation.
 #include <X11/fonts/font.h>
 #include "opaque.h"
 #include "servermd.h"
+#include "config.h"
 #include "site.h"
 #include "dixfont.h"
 #include "extnsionst.h"
@@ -311,6 +312,7 @@ main(int argc, char *argv[], char *envp[
 	DPMSPowerLevel = 0;
 #endif
 	InitBlockAndWakeupHandlers();
+        configInitialise();
 	/* Perform any operating system dependent initializations you'd like */
 	OsInit();		
 	if(serverGeneration == 1)
@@ -463,6 +465,7 @@ main(int argc, char *argv[], char *envp[
 	FreeAllResources();
 #endif
 
+        configFini();
 	CloseDownDevices();
 	for (i = screenInfo.numScreens - 1; i >= 0; i--)
 	{
diff --git a/include/config.h b/include/config.h
new file mode 100644
index 0000000..0c304b1
--- /dev/null
+++ b/include/config.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright © 2006 Daniel Stone
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of the copyright holders and/or authors
+ * not be used in advertising or publicity pertaining to distribution of the
+ * software without specific, written prior permission.  The copyright holders
+ * and/or authors make no representations about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS AND/OR AUTHORS DISCLAIM ALL WARRANTIES WITH REGARD
+ * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND/OR AUTHORS BE LIABLE
+ * FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+ * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef CONFIG_H
+#define CONFIG_H
+
+void configInitialise(void);
+void configFini(void);
+void configDispatch(void);
+
+#endif /* CONFIG_H */
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index 2b9f273..72a329c 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -436,4 +436,7 @@
 /* Define to 1 if modules should avoid the libcwrapper */
 #undef NO_LIBCWRAPPER
 
+/* Support D-BUS */
+#undef HAVE_DBUS
+
 #endif /* _DIX_CONFIG_H_ */
diff --git a/include/input.h b/include/input.h
index e32182d..3e00be6 100644
--- a/include/input.h
+++ b/include/input.h
@@ -163,6 +163,12 @@ extern void ResetDevicePrivateIndex(void
 extern KeybdCtrl	defaultKeyboardControl;
 extern PtrCtrl		defaultPointerControl;
 
+typedef struct _InputOption {
+    char                *key;
+    char                *value;
+    struct _InputOption *next;
+} InputOption;
+
 extern DeviceIntPtr AddInputDevice(
     DeviceProc /*deviceProc*/,
     Bool /*autoStart*/);
@@ -366,4 +372,11 @@ extern void InitInput(
     int  /*argc*/,
     char ** /*argv*/);
 
+/* Implemented by the DDX. */
+extern int NewInputDeviceRequest(
+    InputOption *options);
+
+extern DeviceIntPtr LookupDeviceIntRec(
+    CARD8 deviceid);
+
 #endif /* INPUT_H */
diff --git a/include/os.h b/include/os.h
index e16839c..d459e9e 100644
--- a/include/os.h
+++ b/include/os.h
@@ -149,6 +149,10 @@ extern void CheckConnections(void);
 
 extern void CloseDownConnection(ClientPtr /*client*/);
 
+extern void AddGeneralSocket(int /*fd*/);
+
+extern void RemoveGeneralSocket(int /*fd*/);
+
 extern void AddEnabledDevice(int /*fd*/);
 
 extern void RemoveEnabledDevice(int /*fd*/);
diff --git a/os/connection.c b/os/connection.c
index ce76566..7648a52 100644
--- a/os/connection.c
+++ b/os/connection.c
@@ -1014,16 +1014,22 @@ CloseDownConnection(ClientPtr client)
 }
 
 _X_EXPORT void
-AddEnabledDevice(int fd)
+AddGeneralSocket(int fd)
 {
-    FD_SET(fd, &EnabledDevices);
     FD_SET(fd, &AllSockets);
     if (GrabInProgress)
 	FD_SET(fd, &SavedAllSockets);
 }
 
 _X_EXPORT void
-RemoveEnabledDevice(int fd)
+AddEnabledDevice(int fd)
+{
+    FD_SET(fd, &EnabledDevices);
+    AddGeneralSocket(fd);
+}
+
+_X_EXPORT void
+RemoveGeneralSocket(int fd)
 {
     FD_CLR(fd, &EnabledDevices);
     FD_CLR(fd, &AllSockets);
@@ -1031,6 +1037,13 @@ RemoveEnabledDevice(int fd)
 	FD_CLR(fd, &SavedAllSockets);
 }
 
+_X_EXPORT void
+RemoveEnabledDevice(int fd)
+{
+    FD_CLR(fd, &EnabledDevices);
+    RemoveGeneralSocket(fd);
+}
+
 /*****************
  * OnlyListenToOneClient:
  *    Only accept requests from  one client.  Continue to handle new



More information about the xorg-commit mailing list