xserver: Branch 'master' - 32 commits

Daniel Stone daniels at kemper.freedesktop.org
Wed Jan 21 21:44:32 PST 2009


 Xext/xtest.c                   |    6 
 Xi/exevents.c                  |  314 ++------------------
 Xi/getkmap.c                   |   29 +
 Xi/getmmap.c                   |   28 -
 Xi/listdev.c                   |    6 
 Xi/querydp.c                   |    5 
 Xi/queryst.c                   |    5 
 Xi/setbmap.c                   |   21 -
 Xi/setmmap.c                   |   30 +
 Xi/ungrdevk.c                  |    6 
 configure.ac                   |    2 
 dix/Makefile.am                |    1 
 dix/devices.c                  |  626 ++++++++---------------------------------
 dix/dispatch.c                 |   21 -
 dix/events.c                   |  282 +-----------------
 dix/getevents.c                |   94 ++----
 dix/inpututils.c               |  356 +++++++++++++++++++++++
 hw/dmx/dmxclient.h             |   11 
 hw/dmx/input/atKeynames.h      |    1 
 hw/dmx/input/dmxcommon.c       |    6 
 hw/dmx/input/dmxcommon.h       |    4 
 hw/dmx/input/dmxdummy.c        |    2 
 hw/dmx/input/dmxinputinit.c    |  114 +++----
 hw/dmx/input/dmxinputinit.h    |    2 
 hw/dmx/input/lnx-keyboard.c    |    2 
 hw/dmx/input/usb-keyboard.c    |    4 
 hw/kdrive/ephyr/ephyr.c        |   19 +
 hw/kdrive/linux/keyboard.c     |  280 +++++++-----------
 hw/kdrive/src/kdrive.h         |    7 
 hw/kdrive/src/kinput.c         |  204 -------------
 hw/vfb/InitInput.c             |   16 -
 hw/xfree86/common/xf86Config.c |   19 -
 hw/xfree86/common/xf86DGA.c    |   10 
 hw/xfree86/common/xf86Events.c |   72 +---
 hw/xfree86/common/xf86Module.h |    2 
 hw/xfree86/common/xf86Xinput.c |    5 
 hw/xnest/Keyboard.c            |   98 ++----
 hw/xquartz/quartzKeyboard.c    |   38 +-
 hw/xwin/InitOutput.c           |    8 
 hw/xwin/winconfig.c            |  259 +++++-----------
 hw/xwin/winconfig.h            |   13 
 hw/xwin/winkeybd.c             |   25 -
 hw/xwin/winprocarg.c           |   11 
 hw/xwin/winwndproc.c           |    4 
 include/dix-config.h.in        |    9 
 include/dix.h                  |    2 
 include/dixstruct.h            |    2 
 include/exevents.h             |   22 -
 include/globals.h              |    5 
 include/input.h                |   57 +--
 include/inputstr.h             |   29 -
 include/site.h                 |    4 
 include/xkbfile.h              |    4 
 include/xkbrules.h             |   84 -----
 include/xkbsrv.h               |   86 +----
 include/xkbstr.h               |  175 +++++------
 include/xorg-server.h.in       |    6 
 mi/miinitext.c                 |   20 -
 os/utils.c                     |    9 
 xkb/Makefile.am                |    8 
 xkb/XKBMisc.c                  |    8 
 xkb/ddxInit.c                  |   45 --
 xkb/ddxKeyClick.c              |   45 --
 xkb/ddxList.c                  |    6 
 xkb/ddxLoad.c                  |   38 ++
 xkb/maprules.c                 |  299 -------------------
 xkb/xkb.c                      |   45 --
 xkb/xkbAccessX.c               |    7 
 xkb/xkbActions.c               |   91 -----
 xkb/xkbEvents.c                |  299 ++++++++++++-------
 xkb/xkbInit.c                  |  481 ++++++++-----------------------
 xkb/xkbLEDs.c                  |    6 
 xkb/xkbPrOtherEv.c             |   81 -----
 xkb/xkbUtils.c                 |  435 ++++++++++------------------
 xkb/xkbfmisc.c                 |   57 ---
 xkb/xkbtext.c                  |   14 
 xkb/xkmread.c                  |   94 +++++-
 77 files changed, 1879 insertions(+), 3762 deletions(-)

New commits:
commit b5ece46b76c9182a077141505cc0e788c0fca3ea
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Jan 17 20:07:40 2009 +0200

    Input: Clarify valuator FatalError messages
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 8117ec4..bf9d167 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -753,10 +753,11 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
             int first = xV->first_valuator;
             BOOL change = FALSE;
 
-	    if (xV->num_valuators &&
-                (!v || (xV->num_valuators &&
-                      (first + xV->num_valuators > v->numAxes))))
-		FatalError("Bad valuators reported for device %s\n",
+	    if (xV->num_valuators && !v)
+                FatalError("Valuators reported for non-valuator device '%s'\n",
+                           device->name);
+            if (first + xV->num_valuators > v->numAxes)
+		FatalError("Too many valuators reported for device '%s'\n",
 			   device->name);
 	    if (v && v->axisVal) {
                 /* v->axisVal is always in absolute coordinates. Only the
commit ddb46c1421a98190313b79621c0f5ae43b97d3f6
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Jan 17 20:03:10 2009 +0200

    Input: Use previous state in valuator events
    
    Make valuator event state match other events by using the device state
    from before processing the event, not after.  Also, we already check the
    number of valuators in UpdateDeviceState, so no need to do it again.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 00ced5d..8117ec4 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -952,20 +952,8 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
 
     /* Valuator event handling */
     for (i = 1; i < count; i++) {
-	if ((++xV)->type == DeviceValuator) {
-	    int first = xV->first_valuator;
-	    if (xV->num_valuators
-		&& (!v
-		    || (xV->num_valuators
-			&& (first + xV->num_valuators > v->numAxes))))
-		FatalError("Bad valuators reported for device %s\n",
-			   device->name);
-	    xV->device_state = 0;
-	    if (k)
-		xV->device_state |= XkbStateFieldFromRec(&k->xkbInfo->state);
-	    if (b)
-		xV->device_state |= b->state;
-	}
+	if ((++xV)->type == DeviceValuator)
+	    xV->device_state = state;
     }
 
     if (xE->u.u.type == DeviceKeyPress) {
commit 18e51911f5748f9a27a18cd6bb421c899f5b048f
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Jan 17 13:44:47 2009 +0200

    Input: Add postdown to ButtonClassRec
    
    This mirrors that in KeyClassRec: the state of the buttons as posted to
    GetPointerEvents, rather than the state of the buttons as processed by
    ProcessOtherEvent and friends.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/getevents.c b/dix/getevents.c
index ee08bed..ce086d5 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -1006,10 +1006,14 @@ GetPointerEvents(EventList *events, DeviceIntPtr pDev, int type, int buttons,
         kbp->type = DeviceMotionNotify;
     }
     else {
-        if (type == ButtonPress)
+        if (type == ButtonPress) {
             kbp->type = DeviceButtonPress;
-        else if (type == ButtonRelease)
+            pDev->button->postdown[buttons >> 3] |= (1 << (buttons & 7));
+        }
+        else if (type == ButtonRelease) {
             kbp->type = DeviceButtonRelease;
+            pDev->button->postdown[buttons >> 3] &= ~(1 << (buttons & 7));
+        }
         kbp->detail = buttons;
     }
 
diff --git a/include/inputstr.h b/include/inputstr.h
index daee7ed..2ee4f9b 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -181,6 +181,7 @@ typedef struct _ButtonClassRec {
     unsigned short	state;
     Mask		motionMask;
     CARD8		down[DOWN_LENGTH];
+    CARD8		postdown[DOWN_LENGTH];
     CARD8		map[MAP_LENGTH];
     union _XkbAction    *xkb_acts;
 } ButtonClassRec, *ButtonClassPtr;
commit c05f3bc935bef4d98216d38c0e98bd57ced382df
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Jan 17 19:35:15 2009 +0200

    Input: Don't allow DDX to generate repeat events
    
    We always use soft-repeat at the moment; XKB posts a release/press sequence,
    which admittedly needs cleaning up, but that's for another day.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 011fc7e..00ced5d 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -705,11 +705,9 @@ ChangeMasterDeviceClasses(DeviceIntPtr device,
  * return values are
  *   DEFAULT ... process as normal
  *   DONT_PROCESS ... return immediately from caller
- *   IS_REPEAT .. event is a repeat event.
  */
 #define DEFAULT 0
 #define DONT_PROCESS 1
-#define IS_REPEAT 2
 int
 UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
 {
@@ -813,9 +811,8 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
             return DONT_PROCESS;
 
 	kptr = &k->down[key >> 3];
-	if (*kptr & bit) {	/* allow ddx to generate multiple downs */
-	    return IS_REPEAT;
-	}
+	if (*kptr & bit)	/* don't allow ddx to generate multiple downs */
+	    return DONT_PROCESS;
 	if (device->valuator)
 	    device->valuator->motionHintWindow = NullWindow;
 	*kptr |= bit;
@@ -895,7 +892,6 @@ void
 ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
 {
     int i;
-    CARD16 modifiers;
     GrabPtr grab = device->deviceGrab.grab;
     Bool deactivateDeviceGrab = FALSE;
     int key = 0, rootX, rootY;
@@ -973,17 +969,6 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
     }
 
     if (xE->u.u.type == DeviceKeyPress) {
-        if (ret == IS_REPEAT) {	/* allow ddx to generate multiple downs */
-            modifiers = k->xkbInfo->desc->map->modmap[key];
-	    if (!modifiers) {
-		xE->u.u.type = DeviceKeyRelease;
-		ProcessOtherEvent(xE, device, count);
-		xE->u.u.type = DeviceKeyPress;
-		/* release can have side effects, don't fall through */
-		ProcessOtherEvent(xE, device, count);
-	    }
-	    return;
-	}
 	if (!grab && CheckDeviceGrabs(device, xE, 0, count)) {
 	    device->deviceGrab.activatingKey = key;
 	    return;
commit 6aef4e96affcc26b9415c6bc9c9bebb5af05a1a7
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Jan 17 13:42:46 2009 +0200

    XKB: Fix logic error
    
    Use logical or instead of bitwise or.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index 4a0f561..c7f7439 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -604,7 +604,7 @@ Bool		ignoreKeyEvent = FALSE;
 	ev.keycode= key;
 	ev.slowKeysDelay= ctrls->slow_keys_delay;
 	ev.debounceDelay= ctrls->debounce_delay;
-	if (BitIsOn(keybd->key->down,key) | (xkbi->mouseKey == key)) {
+	if (BitIsOn(keybd->key->down,key) || (xkbi->mouseKey == key)) {
 	    ev.detail= XkbAXN_SKRelease;
 	    beep_type= _BEEP_SLOW_RELEASE;
 	}
commit 0ec9b1069aeeaf66fd104c09f08202f7ebccd170
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Jan 10 14:44:28 2009 +0200

    XKB: Remove unused XkbProcessOtherEvent
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/Makefile.am b/xkb/Makefile.am
index 19d3541..b85ee8a 100644
--- a/xkb/Makefile.am
+++ b/xkb/Makefile.am
@@ -37,11 +37,7 @@ X11_SRCS = \
         XKBGAlloc.c \
         XKBMAlloc.c
 
-# ends up unused...
-# XI_SRCS = xkbPrOtherEv.c
-
-libxkb_la_SOURCES = $(DDX_SRCS) $(DIX_SRCS) $(XI_SRCS) $(XKBFILE_SRCS) \
-                    $(X11_SRCS)
+libxkb_la_SOURCES = $(DDX_SRCS) $(DIX_SRCS) $(XKBFILE_SRCS) $(X11_SRCS)
 libxkbstubs_la_SOURCES = ddxVT.c ddxPrivate.c ddxKillSrv.c
 
 EXTRA_DIST = xkbDflts.h xkbgeom.h xkb.h
diff --git a/xkb/xkbPrOtherEv.c b/xkb/xkbPrOtherEv.c
deleted file mode 100644
index ef8b014..0000000
--- a/xkb/xkbPrOtherEv.c
+++ /dev/null
@@ -1,81 +0,0 @@
-/************************************************************
-Copyright (c) 1995 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, 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 Silicon Graphics not be 
-used in advertising or publicity pertaining to distribution 
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability 
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS 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
-
-#include <stdio.h>
-#include <math.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include "misc.h"
-#include "inputstr.h"
-#include "xkbsrv.h"
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XIproto.h>
-
-extern	void	ProcessOtherEvent(
-    xEvent *		/* xE */,
-    DeviceIntPtr 	/* dev */,
-    int 		/* count */
-);
-
-/***====================================================================***/
-
-void
-XkbProcessOtherEvent(xEvent *xE,DeviceIntPtr dev,int count)
-{
-Bool	xkbCares,isBtn;
-
-    xkbCares= True;
-    isBtn= False;
-    switch ( xE->u.u.type ) {
-      case KeyPress:		xE->u.u.type= DeviceKeyPress; break;
-      case KeyRelease:		xE->u.u.type= DeviceKeyRelease; break;
-      case ButtonPress:		xE->u.u.type= DeviceButtonPress; 
-				isBtn= True; 
-				break;
-      case ButtonRelease:	xE->u.u.type= DeviceButtonRelease;  
-				isBtn= True; 
-				break;
-      default:			xkbCares= False; break;
-    }
-    if (xkbCares) {
-	if ((!isBtn)||((dev->button)&&(dev->button->xkb_acts))) {
-	   DeviceIntPtr	kbd;
-	   if (dev->key)	kbd= dev;
-	   else		kbd= inputInfo.keyboard;
-	   XkbHandleActions(dev,kbd,xE,count);
-	   return;
-	}
-    }
-    ProcessOtherEvent(xE,dev,count);
-    return;
-}
-
commit 7af53799ccefe27b996bdc6073075b7f12353d3a
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Jan 4 16:39:18 2009 +1100

    Input: Remove unused CoreProcess{Keyboard,Pointer}Event
    
    Everything goes through XKB's Process{Keyboard,Pointer}Event on its way
    through to ProcessOtherEvent now, so get rid of the old, useless functions.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/dix/events.c b/dix/events.c
index 0a70296..839c456 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3647,90 +3647,6 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
     }
 }
 
-/**
- * Main keyboard event processing function for core keyboard events.
- * Updates the events fields from the current pointer state and delivers the
- * event.
- *
- * For key events, xE will always be a single event.
- *
- * @param xE Event list
- * @param keybd The device that caused an event.
- * @param count Number of elements in xE.
- */
-void
-CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
-{
-    int             key, bit;
-    BYTE            *kptr;
-    GrabPtr         grab;
-    GrabInfoPtr     grabinfo;
-    Bool            deactivateGrab = FALSE;
-    KeyClassPtr     keyc = keybd->key;
-
-    grabinfo = &keybd->deviceGrab;
-    grab = grabinfo->grab;
-
-    if (!syncEvents.playingEvents)
-    {
-	NoticeTime(xE);
-	if (DeviceEventCallback)
-	{
-	    DeviceEventInfoRec eventinfo;
-	    eventinfo.events = xE;
-	    eventinfo.count = count;
-	    CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
-	}
-    }
-
-    /* ProcessOtherEvent already updated the keyboard's state, so we need to
-     * access prev_state here! */
-    XE_KBPTR.state = XkbStateFieldFromRec(&keybd->key->xkbInfo->prev_state);
-    XE_KBPTR.state |= GetPairedDevice(keybd)->button->state;
-    XE_KBPTR.rootX = keybd->spriteInfo->sprite->hot.x;
-    XE_KBPTR.rootY = keybd->spriteInfo->sprite->hot.y;
-
-    key = xE->u.u.detail;
-    kptr = &keyc->down[key >> 3];
-    bit = 1 << (key & 7);
-
-    switch (xE->u.u.type)
-    {
-	case KeyPress:
-            /* We MUST NOT change the device itself here.  All device state
-             * changes must be performed in ProcessOtherEvents. We're dealing
-             * with the same device struct, so if we change it in POE and
-             * here, we've just screwed up the state by setting it twice.
-             *
-             * Devices may not send core events but always send XI events, so
-             * the state must be changed in POE, not here.
-             */
-	    if (!grab && CheckDeviceGrabs(keybd, xE, 0, count))
-	    {
-		grabinfo->activatingKey = key;
-		return;
-	    }
-	    break;
-	case KeyRelease:
-	    if (!(*kptr & bit)) /* guard against duplicates */
-		return;
-            /* No device state changes, see comment for KeyPress */
-	    if (grabinfo->fromPassiveGrab && (key == grabinfo->activatingKey))
-		deactivateGrab = TRUE;
-	    break;
-	default:
-	    FatalError("Impossible keyboard event");
-    }
-    if (grab)
-	DeliverGrabbedEvent(xE, keybd, deactivateGrab, count);
-    else
-	DeliverFocusedEvent(keybd, xE, keybd->spriteInfo->sprite->win, count);
-    if (deactivateGrab)
-        (*grabinfo->DeactivateGrab)(keybd);
-
-    XaceHook(XACE_KEY_AVAIL, xE, keybd, count);
-}
-
 /* This function is used to set the key pressed or key released state -
    this is only used when the pressing of keys does not cause
    the device's processInputProc to be called, as in for example Mouse Keys.
@@ -3761,94 +3677,6 @@ FixKeyState (xEvent *xE, DeviceIntPtr keybd)
         FatalError("Impossible keyboard event");
 }
 
-/**
- * Main pointer event processing function for core pointer events.
- * For motion events: update the sprite.
- * For all other events: Update the event fields based on the current sprite
- * state.
- *
- * For core pointer events, xE will always be a single event.
- *
- * @param xE Event list
- * @param mouse The device that caused an event.
- * @param count Number of elements in xE.
- */
-void
-CoreProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count)
-{
-    GrabPtr	        grab = mouse->deviceGrab.grab;
-    Bool                deactivateGrab = FALSE;
-    ButtonClassPtr      butc = mouse->button;
-    SpritePtr           pSprite = mouse->spriteInfo->sprite;
-
-    XkbSrvInfoPtr xkbi= GetPairedDevice(mouse)->key->xkbInfo;
-
-    if (!syncEvents.playingEvents)
-	NoticeTime(xE)
-    XE_KBPTR.state = (butc->state | xkbi->state.grab_mods);
-    {
-	NoticeTime(xE);
-	if (DeviceEventCallback)
-	{
-	    DeviceEventInfoRec eventinfo;
-	    /* see comment in EnqueueEvents regarding the next three lines */
-	    if (xE->u.u.type == MotionNotify)
-		XE_KBPTR.root =
-		    WindowTable[pSprite->hotPhys.pScreen->myNum]->drawable.id;
-	    eventinfo.events = xE;
-	    eventinfo.count = count;
-	    CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
-	}
-    }
-    /* We need to call CheckMotion for each event. It doesn't really give us
-       any benefit for relative devices, but absolute devices may not send
-       button events to the right position otherwise. */
-    if (!CheckMotion(xE, mouse) && xE->u.u.type == MotionNotify)
-            return;
-    if (xE->u.u.type != MotionNotify)
-    {
-	int  key;
-
-	XE_KBPTR.rootX = pSprite->hot.x;
-	XE_KBPTR.rootY = pSprite->hot.y;
-
-	key = xE->u.u.detail;
-	switch (xE->u.u.type)
-	{
-	case ButtonPress:
-            /*
-             * We rely on the fact that ButtonMotionMask is the same as
-             * DeviceButtonMotionMask, so setting the motionMask
-             * to this value ensures correctness for both XI and core events.
-             */
-	    if (xE->u.u.detail == 0)
-		return;
-            filters[mouse->id][Motion_Filter(butc)] = MotionNotify;
-	    if (!grab)
-		if (CheckDeviceGrabs(mouse, xE, 0, count))
-		    return;
-	    break;
-	case ButtonRelease:
-	    if (xE->u.u.detail == 0)
-		return;
-            filters[mouse->id][Motion_Filter(butc)] = MotionNotify;
-	    if (!butc->buttonsDown && mouse->deviceGrab.fromPassiveGrab)
-		deactivateGrab = TRUE;
-	    break;
-	default:
-	    FatalError("bogus pointer event from ddx. Type %d\n", xE->u.u.type);
-	}
-    }
-
-    if (grab)
-	DeliverGrabbedEvent(xE, mouse, deactivateGrab, count);
-    else
-	DeliverDeviceEvents(pSprite->win, xE, NullGrab, NullWindow,
-			    mouse, count);
-    if (deactivateGrab)
-        (*mouse->deviceGrab.DeactivateGrab)(mouse);
-}
-
 #define AtMostOneClient \
 	(SubstructureRedirectMask | ResizeRedirectMask | ButtonPressMask)
 #define ManagerMask \
diff --git a/include/input.h b/include/input.h
index 19d1ae7..bf826b0 100644
--- a/include/input.h
+++ b/include/input.h
@@ -400,16 +400,6 @@ extern _X_EXPORT void ProcessKeyboardEvent(
     DeviceIntPtr /*keybd*/,
     int /*count*/);
 
-extern _X_EXPORT void CoreProcessPointerEvent(
-    xEventPtr /*xE*/,
-    DeviceIntPtr /*mouse*/,
-    int /*count*/) _X_DEPRECATED;
-
-extern _X_EXPORT _X_DEPRECATED void CoreProcessKeyboardEvent(
-    xEventPtr /*xE*/,
-    DeviceIntPtr /*keybd*/,
-    int /*count*/) _X_DEPRECATED;
-
 extern _X_EXPORT Bool LegalModifier(
     unsigned int /*key*/, 
     DeviceIntPtr /*pDev*/);
commit 7c4c00649cae855e141ec9a3667bfe399e3156d0
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Jan 1 05:25:52 2009 +1100

    XKB: Remove unused DDX functions
    
    They were complete no-ops anyway.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 7684675..8f6a767 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -771,22 +771,12 @@ extern _X_EXPORT int XkbRemoveResourceClient(
        XID		/* id */
 );
 
-extern _X_EXPORT int XkbDDXInitDevice(
-    DeviceIntPtr        /* dev */
-);
-
 extern _X_EXPORT int XkbDDXAccessXBeep(
     DeviceIntPtr        /* dev */,
     unsigned int	/* what */,
     unsigned int	/* which */
 );
 
-extern _X_EXPORT void XkbDDXKeyClick(
-    DeviceIntPtr	/* dev */,
-    int			/* keycode */,
-    int			/* synthetic */
-);
-
 extern _X_EXPORT int XkbDDXUsesSoftRepeat(
     DeviceIntPtr	/* dev */
 );
diff --git a/xkb/Makefile.am b/xkb/Makefile.am
index 5967f42..19d3541 100644
--- a/xkb/Makefile.am
+++ b/xkb/Makefile.am
@@ -7,8 +7,6 @@ DDX_SRCS = \
         ddxBeep.c \
         ddxCtrls.c \
         ddxFakeMtn.c \
-        ddxInit.c \
-        ddxKeyClick.c \
         ddxLEDs.c \
         ddxLoad.c \
         ddxList.c \
diff --git a/xkb/ddxInit.c b/xkb/ddxInit.c
deleted file mode 100644
index 89ffb78..0000000
--- a/xkb/ddxInit.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, 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 Silicon Graphics not be 
-used in advertising or publicity pertaining to distribution 
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability 
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS 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
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include <xkbsrv.h>
-#include <X11/extensions/XI.h>
-
-int
-XkbDDXInitDevice(DeviceIntPtr dev)
-{
-    return 1;
-}
diff --git a/xkb/ddxKeyClick.c b/xkb/ddxKeyClick.c
deleted file mode 100644
index aabedab..0000000
--- a/xkb/ddxKeyClick.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/************************************************************
-Copyright (c) 1993 by Silicon Graphics Computer Systems, Inc.
-
-Permission to use, copy, modify, and distribute this
-software and its documentation for any purpose and without
-fee is hereby granted, 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 Silicon Graphics not be 
-used in advertising or publicity pertaining to distribution 
-of the software without specific prior written permission.
-Silicon Graphics makes no representation about the suitability 
-of this software for any purpose. It is provided "as is"
-without any express or implied warranty.
-
-SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS 
-SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 
-AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
-GRAPHICS 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
-
-#include <stdio.h>
-#include <X11/X.h>
-#include <X11/Xproto.h>
-#include <X11/keysym.h>
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "windowstr.h"
-#include <xkbsrv.h>
-#include <X11/extensions/XI.h>
-
-void
-XkbDDXKeyClick(DeviceIntPtr pXDev,int keycode,int synthetic)
-{
-    return;
-}
diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index b98b0d8..4a0f561 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -132,9 +132,7 @@ xEvent		xE;
 	DebugF("[xkb] AXKE: Key %d %s\n",keyCode,(xE.u.u.type==KeyPress?"down":"up"));
     }
 
-    if (_XkbIsPressEvent(type))
-	XkbDDXKeyClick(keybd,keyCode,TRUE);
-    else if (isRepeat)
+    if (!_XkbIsPressEvent(type) && isRepeat)
 	XkbLastRepeatEvent=	(pointer)&xE;
     XkbProcessKeyboardEvent(&xE,keybd,1L);
     XkbLastRepeatEvent= NULL;
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index 151d9a5..bc2b41e 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -508,8 +508,6 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
 
     XkbInitIndicatorMap(xkbi);
 
-    XkbDDXInitDevice(dev);
-
     XkbUpdateActions(dev, xkb->min_key_code, XkbNumKeys(xkb), &changes,
                      &check, &cause);
 
commit 4fa3872dc2bcfd6d1fc88d0a94c7071683eea899
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Oct 18 20:26:00 2008 +0100

    Input: Remove core keysyms from KeyClassRec
    
    Instead of always keeping two copies of the keymap, only generate the
    core keymap from the XKB keymap when we really need to, and use the XKB
    keymap as the canonical keymap.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xext/xtest.c b/Xext/xtest.c
index 2383a87..7e95c86 100644
--- a/Xext/xtest.c
+++ b/Xext/xtest.c
@@ -42,6 +42,8 @@
 #include "dixevents.h"
 #include "sleepuntil.h"
 #include "mi.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
 #define _XTEST_SERVER_
 #include <X11/extensions/XTest.h>
 #include <X11/extensions/xteststr.h>
@@ -321,8 +323,8 @@ ProcXTestFakeInput(ClientPtr client)
     {
         case KeyPress:
         case KeyRelease:
-            if (ev->u.u.detail < dev->key->curKeySyms.minKeyCode ||
-                    ev->u.u.detail > dev->key->curKeySyms.maxKeyCode)
+            if (ev->u.u.detail < dev->key->xkbInfo->desc->min_key_code ||
+                ev->u.u.detail > dev->key->xkbInfo->desc->max_key_code)
             {
                 client->errorValue = ev->u.u.detail;
                 return BadValue;
diff --git a/Xi/exevents.c b/Xi/exevents.c
index 76214b9..011fc7e 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -212,8 +212,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
     if (device == master)
         return;
 
-    SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
-
     for (i = 0; i < 8; i++)
         mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
 
@@ -476,7 +474,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
 
     if (from->key)
     {
-        KeySym              *oldMap;
         struct _XkbSrvInfo  *oldXkbInfo;
         if (!to->key)
         {
@@ -492,21 +489,8 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
                 classes->key = NULL;
         }
 
-        oldMap          = to->key->curKeySyms.map;
         oldXkbInfo      = to->key->xkbInfo;
-
-        if (!oldMap) /* newly created key struct */
-        {
-            int bytes = (to->key->curKeySyms.maxKeyCode -
-                         to->key->curKeySyms.minKeyCode + 1) *
-                         to->key->curKeySyms.mapWidth;
-            oldMap = (KeySym *)xcalloc(sizeof(KeySym), bytes);
-            memcpy(oldMap, from->key->curKeySyms.map, bytes);
-        }
-
-        to->key->curKeySyms.map = oldMap;
         to->key->xkbInfo        = oldXkbInfo;
-
         CopyKeyClass(from, to);
     } else if (to->key && !from->key)
     {
@@ -1101,7 +1085,8 @@ FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k,
 	memcpy((char*)ev->buttons, (char*)b->down, 4);
     } else if (k) {
 	ev->classes_reported |= (1 << KeyClass);
-	ev->num_keys = k->curKeySyms.maxKeyCode - k->curKeySyms.minKeyCode;
+	ev->num_keys = k->xkbInfo->desc->max_key_code -
+                       k->xkbInfo->desc->min_key_code;
 	memmove((char *)&ev->keys[0], (char *)k->down, 4);
     }
     if (v) {
@@ -1185,7 +1170,8 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
 		evcount++;
 	}
 	if ((k = dev->key) != NULL) {
-	    nkeys = k->curKeySyms.maxKeyCode - k->curKeySyms.minKeyCode;
+	    nkeys = k->xkbInfo->desc->max_key_code -
+                    k->xkbInfo->desc->min_key_code;
 	    if (nkeys > 32)
 		evcount++;
 	    if (nbuttons > 0) {
@@ -1355,10 +1341,11 @@ GrabKey(ClientPtr client, DeviceIntPtr dev, BYTE this_device_mode,
 	client->errorValue = this_device_mode;
 	return BadValue;
     }
-    if (((key > k->curKeySyms.maxKeyCode) || (key < k->curKeySyms.minKeyCode))
+    if ((key > k->xkbInfo->desc->max_key_code ||
+         key < k->xkbInfo->desc->min_key_code)
 	&& (key != AnyKey)) {
 	client->errorValue = key;
-	return BadValue;
+        return BadValue;
     }
     if ((modifiers != AnyModifier) && (modifiers & ~AllModifiersMask)) {
 	client->errorValue = modifiers;
@@ -1656,8 +1643,8 @@ ChangeKeyMapping(ClientPtr client,
     if (len != (keyCodes * keySymsPerKeyCode))
 	return BadLength;
 
-    if ((firstKeyCode < k->curKeySyms.minKeyCode) ||
-	(firstKeyCode + keyCodes - 1 > k->curKeySyms.maxKeyCode)) {
+    if ((firstKeyCode < k->xkbInfo->desc->min_key_code) ||
+	(firstKeyCode + keyCodes - 1 > k->xkbInfo->desc->max_key_code)) {
 	client->errorValue = firstKeyCode;
 	return BadValue;
     }
diff --git a/Xi/getkmap.c b/Xi/getkmap.c
index 5401846..78449e2 100644
--- a/Xi/getkmap.c
+++ b/Xi/getkmap.c
@@ -59,6 +59,8 @@ SOFTWARE.
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
 #include "swaprep.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
 
 #include "getkmap.h"
 
@@ -90,7 +92,8 @@ ProcXGetDeviceKeyMapping(ClientPtr client)
 {
     xGetDeviceKeyMappingReply rep;
     DeviceIntPtr dev;
-    KeySymsPtr k;
+    XkbDescPtr xkb;
+    KeySymsPtr syms;
     int rc;
 
     REQUEST(xGetDeviceKeyMappingReq);
@@ -101,31 +104,37 @@ ProcXGetDeviceKeyMapping(ClientPtr client)
 	return rc;
     if (dev->key == NULL)
 	return BadMatch;
-    k = &dev->key->curKeySyms;
+    xkb = dev->key->xkbInfo->desc;
 
-    if ((stuff->firstKeyCode < k->minKeyCode) ||
-	(stuff->firstKeyCode > k->maxKeyCode)) {
+    if (stuff->firstKeyCode < xkb->min_key_code ||
+	stuff->firstKeyCode > xkb->max_key_code) {
 	client->errorValue = stuff->firstKeyCode;
 	return BadValue;
     }
 
-    if (stuff->firstKeyCode + stuff->count > k->maxKeyCode + 1) {
+    if (stuff->firstKeyCode + stuff->count > xkb->max_key_code + 1) {
 	client->errorValue = stuff->count;
 	return BadValue;
     }
 
+    syms = XkbGetCoreMap(dev);
+    if (!syms)
+        return BadAlloc;
+
     rep.repType = X_Reply;
     rep.RepType = X_GetDeviceKeyMapping;
     rep.sequenceNumber = client->sequence;
-    rep.keySymsPerKeyCode = k->mapWidth;
-    rep.length = (k->mapWidth * stuff->count);	/* KeySyms are 4 bytes */
+    rep.keySymsPerKeyCode = syms->mapWidth;
+    rep.length = (syms->mapWidth * stuff->count);	/* KeySyms are 4 bytes */
     WriteReplyToClient(client, sizeof(xGetDeviceKeyMappingReply), &rep);
 
     client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
     WriteSwappedDataToClient(client,
-			     k->mapWidth * stuff->count * sizeof(KeySym),
-			     &k->map[(stuff->firstKeyCode - k->minKeyCode) *
-				     k->mapWidth]);
+                             syms->mapWidth * stuff->count * sizeof(KeySym),
+                             &syms->map[syms->mapWidth * (stuff->firstKeyCode -
+                                                          syms->minKeyCode)]);
+    xfree(syms->map);
+    xfree(syms);
 
     return Success;
 }
diff --git a/Xi/listdev.c b/Xi/listdev.c
index 04550e4..9a5a189 100644
--- a/Xi/listdev.c
+++ b/Xi/listdev.c
@@ -64,6 +64,8 @@ SOFTWARE.
 #include "exglobals.h"	/* FIXME */
 #include "exevents.h"
 #include "xace.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
 
 #include "listdev.h"
 
@@ -211,8 +213,8 @@ CopySwapKeyClass(ClientPtr client, KeyClassPtr k, char **buf)
     k2 = (xKeyInfoPtr) * buf;
     k2->class = KeyClass;
     k2->length = sizeof(xKeyInfo);
-    k2->min_keycode = k->curKeySyms.minKeyCode;
-    k2->max_keycode = k->curKeySyms.maxKeyCode;
+    k2->min_keycode = k->xkbInfo->desc->min_key_code;
+    k2->max_keycode = k->xkbInfo->desc->max_key_code;
     k2->num_keys = k2->max_keycode - k2->min_keycode + 1;
     if (client && client->swapped) {
 	swaps(&k2->num_keys, n);
diff --git a/Xi/queryst.c b/Xi/queryst.c
index 6553aa8..2b20837 100644
--- a/Xi/queryst.c
+++ b/Xi/queryst.c
@@ -42,6 +42,8 @@ from The Open Group.
 #include <X11/extensions/XIproto.h>
 #include "exevents.h"
 #include "exglobals.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
 
 #include "queryst.h"
 
@@ -126,7 +128,8 @@ ProcXQueryDeviceState(ClientPtr client)
 	tk = (xKeyState *) buf;
 	tk->class = KeyClass;
 	tk->length = sizeof(xKeyState);
-	tk->num_keys = k->curKeySyms.maxKeyCode - k->curKeySyms.minKeyCode + 1;
+	tk->num_keys = k->xkbInfo->desc->max_key_code -
+                       k->xkbInfo->desc->min_key_code + 1;
 	for (i = 0; i < 32; i++)
 	    tk->keys[i] = k->down[i];
 	buf += sizeof(xKeyState);
diff --git a/Xi/ungrdevk.c b/Xi/ungrdevk.c
index 8d9cdb1..7f5e4aa 100644
--- a/Xi/ungrdevk.c
+++ b/Xi/ungrdevk.c
@@ -60,6 +60,8 @@ SOFTWARE.
 #include <X11/extensions/XIproto.h>
 #include "exglobals.h"
 #include "dixgrabs.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
 
 #include "ungrdevk.h"
 
@@ -124,8 +126,8 @@ ProcXUngrabDeviceKey(ClientPtr client)
     if (rc != Success)
 	return rc;
 
-    if (((stuff->key > dev->key->curKeySyms.maxKeyCode) ||
-	 (stuff->key < dev->key->curKeySyms.minKeyCode))
+    if (((stuff->key > dev->key->xkbInfo->desc->max_key_code) ||
+	 (stuff->key < dev->key->xkbInfo->desc->min_key_code))
 	&& (stuff->key != AnyKey))
 	return BadValue;
 
diff --git a/dix/devices.c b/dix/devices.c
index 884256c..f3c2717 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -514,13 +514,9 @@ CorePointerProc(DeviceIntPtr pDev, int what)
 {
     BYTE map[33];
     int i = 0;
-    ClassesPtr classes;
 
     switch (what) {
     case DEVICE_INIT:
-        if (!(classes = xcalloc(1, sizeof(ClassesRec))))
-            return BadAlloc;
-
         for (i = 1; i <= 32; i++)
             map[i] = i;
         InitPointerDeviceStruct((DevicePtr)pDev, map, 32,
@@ -619,7 +615,6 @@ FreeDeviceClass(int type, pointer *class)
                     XkbFreeInfo((*k)->xkbInfo);
                     (*k)->xkbInfo = NULL;
                 }
-                xfree((*k)->curKeySyms.map);
                 xfree((*k));
                 break;
             }
@@ -1008,8 +1003,8 @@ void
 QueryMinMaxKeyCodes(KeyCode *minCode, KeyCode *maxCode)
 {
     if (inputInfo.keyboard) {
-	*minCode = inputInfo.keyboard->key->curKeySyms.minKeyCode;
-	*maxCode = inputInfo.keyboard->key->curKeySyms.maxKeyCode;
+	*minCode = inputInfo.keyboard->key->xkbInfo->desc->min_key_code;
+	*maxCode = inputInfo.keyboard->key->xkbInfo->desc->max_key_code;
     }
 }
 
@@ -1482,7 +1477,6 @@ ProcChangeKeyboardMapping(ClientPtr client)
     REQUEST(xChangeKeyboardMappingReq);
     unsigned len;
     KeySymsRec keysyms;
-    KeySymsPtr curKeySyms = &PickKeyboard(client)->key->curKeySyms;
     DeviceIntPtr pDev, tmp;
     int rc;
     REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
@@ -1491,14 +1485,17 @@ ProcChangeKeyboardMapping(ClientPtr client)
     if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode))
             return BadLength;
 
-    if ((stuff->firstKeyCode < curKeySyms->minKeyCode) ||
-	(stuff->firstKeyCode > curKeySyms->maxKeyCode)) {
+    pDev = PickKeyboard(client);
+
+    if ((stuff->firstKeyCode < pDev->key->xkbInfo->desc->min_key_code) ||
+	(stuff->firstKeyCode > pDev->key->xkbInfo->desc->max_key_code)) {
 	    client->errorValue = stuff->firstKeyCode;
 	    return BadValue;
 
     }
     if (((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) >
-        curKeySyms->maxKeyCode) || (stuff->keySymsPerKeyCode == 0)) {
+          pDev->key->xkbInfo->desc->max_key_code) ||
+        (stuff->keySymsPerKeyCode == 0)) {
 	    client->errorValue = stuff->keySymsPerKeyCode;
 	    return BadValue;
     }
@@ -1589,7 +1586,8 @@ ProcGetKeyboardMapping(ClientPtr client)
 {
     xGetKeyboardMappingReply rep;
     DeviceIntPtr kbd = PickKeyboard(client);
-    KeySymsPtr curKeySyms = &kbd->key->curKeySyms;
+    XkbDescPtr xkb;
+    KeySymsPtr syms;
     int rc;
     REQUEST(xGetKeyboardMappingReq);
     REQUEST_SIZE_MATCH(xGetKeyboardMappingReq);
@@ -1598,29 +1596,35 @@ ProcGetKeyboardMapping(ClientPtr client)
     if (rc != Success)
 	return rc;
 
-    if ((stuff->firstKeyCode < curKeySyms->minKeyCode) ||
-        (stuff->firstKeyCode > curKeySyms->maxKeyCode)) {
+    xkb = kbd->key->xkbInfo->desc;
+
+    if ((stuff->firstKeyCode < xkb->min_key_code) ||
+        (stuff->firstKeyCode > xkb->max_key_code)) {
 	client->errorValue = stuff->firstKeyCode;
 	return BadValue;
     }
-    if (stuff->firstKeyCode + stuff->count >
-	(unsigned)(curKeySyms->maxKeyCode + 1)) {
+    if (stuff->firstKeyCode + stuff->count > xkb->max_key_code + 1) {
 	client->errorValue = stuff->count;
         return BadValue;
     }
 
+    syms = XkbGetCoreMap(kbd);
+    if (!syms)
+        return BadAlloc;
+
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.keySymsPerKeyCode = curKeySyms->mapWidth;
+    rep.keySymsPerKeyCode = syms->mapWidth;
     /* length is a count of 4 byte quantities and KeySyms are 4 bytes */
-    rep.length = (curKeySyms->mapWidth * stuff->count);
+    rep.length = syms->mapWidth * stuff->count;
     WriteReplyToClient(client, sizeof(xGetKeyboardMappingReply), &rep);
     client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
-    WriteSwappedDataToClient(
-	client,
-	curKeySyms->mapWidth * stuff->count * sizeof(KeySym),
-	&curKeySyms->map[(stuff->firstKeyCode - curKeySyms->minKeyCode) *
-			 curKeySyms->mapWidth]);
+    WriteSwappedDataToClient(client,
+                             syms->mapWidth * stuff->count * sizeof(KeySym),
+                             &syms->map[syms->mapWidth * (stuff->firstKeyCode -
+                                                          syms->minKeyCode)]);
+    xfree(syms->map);
+    xfree(syms);
 
     return client->noClientException;
 }
@@ -1773,8 +1777,8 @@ DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
 	case KBKey:
 	    key = (KeyCode)*vlist;
 	    vlist++;
-	    if ((KeyCode)key < keybd->key->curKeySyms.minKeyCode ||
-		(KeyCode)key > keybd->key->curKeySyms.maxKeyCode) {
+	    if ((KeyCode)key < keybd->key->xkbInfo->desc->min_key_code ||
+		(KeyCode)key > keybd->key->xkbInfo->desc->max_key_code) {
 		client->errorValue = key;
 		return BadValue;
 	    }
diff --git a/dix/events.c b/dix/events.c
index 5e8fc9b..0a70296 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -5018,8 +5018,8 @@ ProcUngrabKey(ClientPtr client)
     if (rc != Success)
 	return rc;
 
-    if (((stuff->key > keybd->key->curKeySyms.maxKeyCode) ||
-	 (stuff->key < keybd->key->curKeySyms.minKeyCode))
+    if (((stuff->key > keybd->key->xkbInfo->desc->max_key_code) ||
+	 (stuff->key < keybd->key->xkbInfo->desc->min_key_code))
 	&& (stuff->key != AnyKey))
     {
 	client->errorValue = stuff->key;
@@ -5080,8 +5080,8 @@ ProcGrabKey(ClientPtr client)
 	client->errorValue = stuff->keyboardMode;
         return BadValue;
     }
-    if (((stuff->key > keybd->key->curKeySyms.maxKeyCode) ||
-	 (stuff->key < keybd->key->curKeySyms.minKeyCode))
+    if (((stuff->key > keybd->key->xkbInfo->desc->max_key_code) ||
+	 (stuff->key < keybd->key->xkbInfo->desc->min_key_code))
 	&& (stuff->key != AnyKey))
     {
 	client->errorValue = stuff->key;
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 4763382..366a897 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -148,7 +148,7 @@ static int
 check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
 {
     int ret, i;
-    KeySymsPtr syms;
+    XkbDescPtr xkb;
 
     ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
     if (ret != Success)
@@ -156,7 +156,7 @@ check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
 
     if (!dev->key)
         return BadMatch;
-    syms = &dev->key->curKeySyms;
+    xkb = dev->key->xkbInfo->desc;
 
     for (i = 0; i < MAP_LENGTH; i++) {
         if (!modmap[i])
@@ -164,7 +164,7 @@ check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
 
         /* Check that all the new modifiers fall within the advertised
          * keycode range. */
-        if (i < syms->minKeyCode || i > syms->maxKeyCode) {
+        if (i < xkb->min_key_code || i > xkb->max_key_code) {
             client->errorValue = i;
             return -1;
         }
@@ -185,8 +185,8 @@ check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
 
     /* None of the old modifiers may be down while we change the map,
      * either. */
-    for (i = syms->minKeyCode; i < syms->maxKeyCode; i++) {
-        if (!dev->key->xkbInfo->desc->map->modmap[i])
+    for (i = xkb->min_key_code; i < xkb->max_key_code; i++) {
+        if (!xkb->map->modmap[i])
             continue;
         if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
             client->errorValue = i;
@@ -201,18 +201,18 @@ static int
 check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
                           DeviceIntPtr slave, CARD8 *modmap)
 {
-    KeySymsPtr master_syms, slave_syms;
+    XkbDescPtr master_xkb, slave_xkb;
     int i, j;
 
     if (!slave->key || !master->key)
         return 0;
 
-    master_syms = &master->key->curKeySyms;
-    slave_syms = &slave->key->curKeySyms;
+    master_xkb = master->key->xkbInfo->desc;
+    slave_xkb = slave->key->xkbInfo->desc;
 
     /* Ignore devices with a clearly different keymap. */
-    if (slave_syms->minKeyCode != master_syms->minKeyCode ||
-        slave_syms->maxKeyCode != master_syms->maxKeyCode)
+    if (slave_xkb->min_key_code != master_xkb->min_key_code ||
+        slave_xkb->max_key_code != master_xkb->max_key_code)
         return 0;
 
     for (i = 0; i < MAP_LENGTH; i++) {
@@ -221,9 +221,11 @@ check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
 
         /* If we have different symbols for any modifier on an
          * extended keyboard, ignore the whole remap request. */
-        for (j = 0; j < slave_syms->mapWidth && j < master_syms->mapWidth; j++)
-            if (slave_syms->map[modmap[i] * slave_syms->mapWidth + j] !=
-                master_syms->map[modmap[i] * master_syms->mapWidth + j])
+        for (j = 0;
+             j < XkbKeyNumSyms(slave_xkb, i) &&
+              j < XkbKeyNumSyms(master_xkb, i);
+             j++)
+            if (XkbKeySymsPtr(slave_xkb, i)[j] != XkbKeySymsPtr(master_xkb, i)[j])
                 return 0;
     }
 
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 9b34a7a..2875920 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -75,12 +75,6 @@ static KdPointerMatrix	kdPointerMatrix = {
 
 void KdResetInputMachine (void);
     
-#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 {
@@ -1756,13 +1750,6 @@ KdReceiveTimeout (KdPointerInfo *pi)
     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)))
-
-CARD32	KdSpecialKeys = 0;
-
 /*
  * kdCheckTermination
  *
@@ -1819,7 +1806,7 @@ KdReleaseAllKeys (void)
     for (ki = kdKeyboards; ki; ki = ki->next) {
         for (key = ki->keySyms.minKeyCode; key < ki->keySyms.maxKeyCode;
              key++) {
-            if (IsKeyDown(ki, key)) {
+            if (key_is_down(ki->dixdev, key, KEY_POSTED | KEY_PROCESSED)) {
                 KdHandleKeyboardEvent(ki, KeyRelease, key);
                 GetEventList(&kdEvents);
                 nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, KeyRelease, key);
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index a1beea0..50a5bf6 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -76,6 +76,9 @@
 #include "mi.h"
 #include "mipointer.h"
 
+#include "xkbsrv.h"
+#include "xkbstr.h"
+
 #ifdef XF86BIGFONT
 #define _XF86BIGFONT_SERVER_
 #include <X11/extensions/xf86bigfont.h>
@@ -402,16 +405,14 @@ xf86PrintBacktrace(void)
 static void
 xf86ReleaseKeys(DeviceIntPtr pDev)
 {
-    KeyClassPtr keyc = NULL;
-    KeySym *map = NULL;
+    KeyClassPtr keyc;
     xEvent ke;
-    int i = 0, j = 0, nevents = 0;
+    int i, j, nevents, sigstate;
 
     if (!pDev || !pDev->key)
         return;
 
     keyc = pDev->key;
-    map = keyc->curKeySyms.map;
 
     /*
      * Hmm... here is the biggest hack of every time !
@@ -424,36 +425,15 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
      * are reenabled.
      */
 
-    for (i = keyc->curKeySyms.minKeyCode, map = keyc->curKeySyms.map;
-         i < keyc->curKeySyms.maxKeyCode;
-         i++, map += keyc->curKeySyms.mapWidth) {
+    for (i = keyc->xkbInfo->desc->min_key_code;
+         i < keyc->xkbInfo->desc->max_key_code;
+         i++) {
         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 {
-		    int sigstate = xf86BlockSIGIO ();
-                    nevents = GetKeyboardEvents(xf86Events, pDev, KeyRelease, i);
-                    for (j = 0; j < nevents; j++)
-                        mieqEnqueue(pDev, (xf86Events + j)->event);
-		    xf86UnblockSIGIO(sigstate);
-                }
-                break;
-            }
+            sigstate = xf86BlockSIGIO ();
+            nevents = GetKeyboardEvents(xf86Events, pDev, KeyRelease, i);
+            for (j = 0; j < nevents; j++)
+                mieqEnqueue(pDev, (xf86Events + j)->event);
+            xf86UnblockSIGIO(sigstate);
         }
     }
 }
@@ -502,18 +482,19 @@ xf86VTSwitch(void)
      * Keep the order: Disable Device > LeaveVT
      *                        EnterVT > EnableDevice
      */
-    pInfo = xf86InputDevs;
-    while (pInfo) {
-      if (pInfo->dev)
+    for (ih = InputHandlers; ih; ih = ih->next)
+      xf86DisableInputHandler(ih);
+    for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next) {
+      if (pInfo->dev) {
+          xf86ReleaseKeys(pInfo->dev);
+          ProcessInputEvents();
           DisableDevice(pInfo->dev);
-      pInfo = pInfo->next;
+      }
     }
     xf86EnterServerState(SETUP);
     for (i = 0; i < xf86NumScreens; i++)
 	xf86Screens[i]->LeaveVT(i, 0);
 
-    for (ih = InputHandlers; ih; ih = ih->next)
-      xf86DisableInputHandler(ih);
     xf86AccessLeave();      /* We need this here, otherwise */
     xf86AccessLeaveState(); /* console won't be restored    */
 
@@ -543,14 +524,10 @@ xf86VTSwitch(void)
 
       pInfo = xf86InputDevs;
       while (pInfo) {
-        if (pInfo->dev) {
-            xf86ReleaseKeys(pInfo->dev);
+        if (pInfo->dev)
             EnableDevice(pInfo->dev);
-        }
 	pInfo = pInfo->next;
       }
-      /* XXX HACK */
-      xf86ReleaseKeys(inputInfo.keyboard);
       for (ih = InputHandlers; ih; ih = ih->next)
         xf86EnableInputHandler(ih);
 
@@ -607,14 +584,10 @@ xf86VTSwitch(void)
 
     pInfo = xf86InputDevs;
     while (pInfo) {
-      if (pInfo->dev) {
-          xf86ReleaseKeys(pInfo->dev);
+      if (pInfo->dev)
           EnableDevice(pInfo->dev);
-      }
       pInfo = pInfo->next;
     }
-    /* XXX HACK */
-    xf86ReleaseKeys(inputInfo.keyboard);
 
     for (ih = InputHandlers; ih; ih = ih->next)
       xf86EnableInputHandler(ih);
diff --git a/include/inputstr.h b/include/inputstr.h
index 76523aa..daee7ed 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -137,7 +137,6 @@ typedef struct _GrabRec {
 typedef struct _KeyClassRec {
     CARD8		down[DOWN_LENGTH];
     CARD8		postdown[DOWN_LENGTH];
-    KeySymsRec		curKeySyms;
     int                 modifierKeyCount[8];
     struct _XkbSrvInfo *xkbInfo;
 } KeyClassRec, *KeyClassPtr;
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index 54010eb..7684675 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -322,11 +322,6 @@ extern	_X_EXPORT int	DeviceEnterNotify,DeviceLeaveNotify;
 #define	_XkbIsPressEvent(t)	(((t)==KeyPress)||((t)==DeviceKeyPress))
 #define	_XkbIsReleaseEvent(t)	(((t)==KeyRelease)||((t)==DeviceKeyRelease))
 
-#define	_XkbCoreKeycodeInRange(c,k)	(((k)>=(c)->curKeySyms.minKeyCode)&&\
-					 ((k)<=(c)->curKeySyms.maxKeyCode))
-#define	_XkbCoreNumKeys(c)	((c)->curKeySyms.maxKeyCode-\
-				 (c)->curKeySyms.minKeyCode+1)
-
 #define	XConvertCase(s,l,u)	XkbConvertCase(s,l,u)
 #undef	IsKeypadKey
 #define	IsKeypadKey(s)		XkbKSIsKeypad(s)
@@ -510,6 +505,7 @@ extern _X_EXPORT XkbAction *XkbResizeKeyActions(
 
 extern _X_EXPORT void XkbUpdateKeyTypesFromCore(
     DeviceIntPtr	/* pXDev */,
+    KeySymsPtr          /* syms */,
     KeyCode 		/* first */,
     CARD8 		/* num */,
     XkbChangesPtr	/* pChanges */
@@ -531,9 +527,8 @@ extern _X_EXPORT void XkbUpdateActions(
     XkbEventCausePtr	/* cause */
 );
 
-extern _X_EXPORT void XkbUpdateCoreDescription(
-    DeviceIntPtr	/* keybd */,
-    Bool		/* resize */
+extern _X_EXPORT KeySymsPtr XkbGetCoreMap(
+    DeviceIntPtr        /* keybd */
 );
 
 extern _X_EXPORT void XkbApplyMappingChange(
diff --git a/xkb/xkb.c b/xkb/xkb.c
index 722141c..d889680 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -2519,7 +2519,6 @@ _XkbSetMap(ClientPtr client, DeviceIntPtr dev, xkbSetMapReq *req, char *values)
     if (!sentNKN)
 	XkbSendNotification(dev,&change,&cause);
 
-    XkbUpdateCoreDescription(dev,False);
     return Success;
 allocFailure:
     return BadAlloc;
@@ -2856,7 +2855,6 @@ _XkbSetCompatMap(ClientPtr client, DeviceIntPtr dev,
 									&cause);
 	if (check)
 	    XkbCheckSecondaryEffects(xkbi,check,&change,&cause);
-	XkbUpdateCoreDescription(dev,False);
 	XkbSendNotification(dev,&change,&cause);
     }
     return Success;
@@ -5838,7 +5836,6 @@ ProcXkbGetKbdByName(ClientPtr client)
                  tmpd->coreEvents)) {
                 if (tmpd != dev)
                     XkbCopyDeviceKeymap(tmpd, dev);
-                XkbUpdateCoreDescription(tmpd, True);
 
                 if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) {
                     old_sli = tmpd->kbdfeed->xkb_sli;
@@ -5854,8 +5851,6 @@ ProcXkbGetKbdByName(ClientPtr client)
             }
         }
 
-        /* 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= new->min_key_code;
 	nkn.maxKeyCode= new->max_key_code;
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index bcee26c..151d9a5 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -510,12 +510,8 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
 
     XkbDDXInitDevice(dev);
 
-    XkbUpdateCoreDescription(dev, True);
-
     XkbUpdateActions(dev, xkb->min_key_code, XkbNumKeys(xkb), &changes,
                      &check, &cause);
-    dev->key->curKeySyms.minKeyCode = xkb->min_key_code;
-    dev->key->curKeySyms.maxKeyCode = xkb->max_key_code;
 
     InitFocusClassDeviceStruct(dev);
 
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 89d3825..3cd3557 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -213,13 +213,13 @@ register unsigned mask;
 
 void
 XkbUpdateKeyTypesFromCore(	DeviceIntPtr	pXDev,
+                                KeySymsPtr      pCore,
 				KeyCode	 	first,
 				CARD8	 	num,
 				XkbChangesPtr	changes)
 {
 XkbDescPtr		xkb;
 unsigned		key,nG,explicit;
-KeySymsPtr		pCore;
 int			types[XkbNumKbdGroups];
 KeySym			tsyms[XkbMaxSymsPerKey],*syms;
 XkbMapChangesPtr	mc;
@@ -232,7 +232,6 @@ XkbMapChangesPtr	mc;
 
     mc= (changes?(&changes->map):NULL);
 
-    pCore= &pXDev->key->curKeySyms;
     syms= &pCore->map[(first-xkb->min_key_code)*pCore->mapWidth];
     for (key=first; key<(first+num); key++,syms+= pCore->mapWidth) {
         explicit= xkb->server->explicit[key]&XkbExplicitKeyTypesMask;
@@ -355,54 +354,24 @@ CARD8 *			repeat;
     return;
 }
 
-void
-XkbUpdateCoreDescription(DeviceIntPtr keybd,Bool resize)
+KeySymsPtr
+XkbGetCoreMap(DeviceIntPtr keybd)
 {
 register int		key,tmp;
 int			maxSymsPerKey,maxKeysPerMod, maxGroup1Width;
-int			first,last,firstCommon,lastCommon;
 XkbDescPtr		xkb;
-KeyClassPtr		keyc;
+KeySymsPtr              syms;
 int			maxNumberOfGroups;
 
     if (!keybd || !keybd->key || !keybd->key->xkbInfo)
-	return;
+	return NULL;
+
     xkb= keybd->key->xkbInfo->desc;
-    keyc= keybd->key;
     maxSymsPerKey= maxGroup1Width= 0;
     maxNumberOfGroups = 0;
-    if ((xkb->min_key_code==keyc->curKeySyms.minKeyCode)&&
-	(xkb->max_key_code==keyc->curKeySyms.maxKeyCode)) {
-	first= firstCommon= xkb->min_key_code;
-	last= lastCommon= xkb->max_key_code;
-    }
-    else if (resize) {
-	keyc->curKeySyms.minKeyCode= xkb->min_key_code;
-	keyc->curKeySyms.maxKeyCode= xkb->max_key_code;
-	first= firstCommon= xkb->min_key_code;
-	last= lastCommon= xkb->max_key_code;
-    }
-    else {
-	if (xkb->min_key_code<keyc->curKeySyms.minKeyCode) {
-	    first= xkb->min_key_code;
-	    firstCommon= keyc->curKeySyms.minKeyCode;
-	}
-	else {
-	    firstCommon= xkb->min_key_code;
-	    first= keyc->curKeySyms.minKeyCode;
-	}
-	if (xkb->max_key_code>keyc->curKeySyms.maxKeyCode) {
-	    lastCommon= keyc->curKeySyms.maxKeyCode;
-	    last= xkb->max_key_code;
-	}
-	else {
-	    lastCommon= xkb->max_key_code;
-	    last= keyc->curKeySyms.maxKeyCode;
-	}
-    }
 
     /* determine sizes */
-    for (key=first;key<=last;key++) {
+    for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
 	if (XkbKeycodeInRange(xkb,key)) {
 	    int	nGroups;
 	    int	w;
@@ -437,53 +406,69 @@ int			maxNumberOfGroups;
 	}
     }
 
-    if (maxSymsPerKey>0) {
-	/* See Section 12.4 of the XKB Protocol spec. Because of the
-	 * single-group distribution for multi-group keyboards, we have to
-	 * have enough symbols for the largest group 1 to replicate across the
-	 * number of groups on the keyboard. e.g. a single-group key with 4
-	 * symbols on a keyboard that has 3 groups -> 12 syms per key */
-	if (maxSymsPerKey < maxNumberOfGroups * maxGroup1Width)
-	    maxSymsPerKey = maxNumberOfGroups * maxGroup1Width;
-
-	tmp= maxSymsPerKey*_XkbCoreNumKeys(keyc);
-	keyc->curKeySyms.map= _XkbTypedRealloc(keyc->curKeySyms.map,tmp,KeySym);
-	if (keyc->curKeySyms.map==NULL)
-	    FatalError("Couldn't allocate symbols map in UpdateCore\n");
-    }
-    else if ((keyc->curKeySyms.mapWidth>0)&&(keyc->curKeySyms.map!=NULL)) {
-	_XkbFree(keyc->curKeySyms.map);
-	keyc->curKeySyms.map= NULL;
-    }
-    keyc->curKeySyms.mapWidth= maxSymsPerKey;
+    if (maxSymsPerKey <= 0)
+        return NULL;
 
-    for (key=firstCommon;key<=lastCommon;key++) {
-	if (keyc->curKeySyms.map!=NULL) {
-	    KeySym *pCore,*pXKB;
-	    unsigned nGroups,groupWidth,n,nOut;
+    syms = xcalloc(1, sizeof(*syms));
+    if (!syms)
+        return NULL;
 
-	    nGroups= XkbKeyNumGroups(xkb,key);
-	    n= (key-keyc->curKeySyms.minKeyCode)*maxSymsPerKey;
-	    pCore= &keyc->curKeySyms.map[n];
-	    bzero(pCore,maxSymsPerKey*sizeof(KeySym));
-	    pXKB= XkbKeySymsPtr(xkb,key);
-	    nOut= 2;
-	    if (nGroups>0) {
-		groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup1Index);
-		if (groupWidth>0)	pCore[0]= pXKB[0];
-		if (groupWidth>1)	pCore[1]= pXKB[1];
-		for (n=2;n<groupWidth;n++) {
-		    pCore[2+n]= pXKB[n];
-		}
-		if (groupWidth>2)
-		    nOut= groupWidth;
-	    }
+    /* See Section 12.4 of the XKB Protocol spec. Because of the
+     * single-group distribution for multi-group keyboards, we have to
+     * have enough symbols for the largest group 1 to replicate across the
+     * number of groups on the keyboard. e.g. a single-group key with 4
+     * symbols on a keyboard that has 3 groups -> 12 syms per key */
+    if (maxSymsPerKey < maxNumberOfGroups * maxGroup1Width)
+        maxSymsPerKey = maxNumberOfGroups * maxGroup1Width;
+
+    syms->mapWidth = maxSymsPerKey;
+
+    tmp = syms->mapWidth * (xkb->max_key_code - xkb->min_key_code);
+    syms->map = xcalloc(tmp, sizeof(*syms->map));
+    if (!syms->map) {
+        xfree(syms);
+        return NULL;
+    }
 
-	    /* See XKB Protocol Sec, Section 12.4.
-	       A 1-group key with ABCDE on a 2 group keyboard must be
-	       duplicated across all groups as ABABCDECDE.
-	     */
-	    if (nGroups == 1)
+    for (key=xkb->min_key_code;key<=xkb->max_key_code;key++) {
+        KeySym *pCore,*pXKB;
+        unsigned nGroups,groupWidth,n,nOut;
+
+        nGroups= XkbKeyNumGroups(xkb,key);
+        n= (key-xkb->min_key_code)*syms->mapWidth;
+        pCore= &syms->map[n];
+        pXKB= XkbKeySymsPtr(xkb,key);
+        nOut= 2;
+        if (nGroups>0) {
+            groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup1Index);
+            if (groupWidth>0)   pCore[0]= pXKB[0];
+            if (groupWidth>1)   pCore[1]= pXKB[1];
+            for (n=2;n<groupWidth;n++)
+                pCore[2+n]= pXKB[n];
+            if (groupWidth>2)
+                nOut= groupWidth;
+        }
+
+	/* See XKB Protocol Sec, Section 12.4.
+           A 1-group key with ABCDE on a 2 group keyboard must be
+	   duplicated across all groups as ABABCDECDE.
+	 */
+	if (nGroups == 1)
+	{
+	    int idx;
+
+	    groupWidth = XkbKeyGroupWidth(xkb, key, XkbGroup1Index);
+
+	    /* AB..CDE... -> ABABCDE... */
+	    if (groupWidth > 0 && syms->mapWidth >= 3)
+	        pCore[2] = pCore[0];
+	    if (groupWidth > 1 && syms->mapWidth >= 4)
+	        pCore[3] = pCore[1];
+
+	    /* ABABCDE... -> ABABCDECDE */
+	    idx = 2 + groupWidth;
+	    while (groupWidth > 2 && idx < syms->mapWidth &&
+		   idx < groupWidth * 2)
 	    {
 		int idx, j;
 
@@ -512,31 +497,38 @@ int			maxNumberOfGroups;
                     for (n = 0; n < groupWidth && idx < maxSymsPerKey; n++)
                         pCore[idx++] = pXKB[n];
 	    }
+	    idx = 2 * groupWidth;
+	    if (idx < 4)
+		idx = 4;
+	    /* 3 or more groups: ABABCDECDEABCDEABCDE */
+	    for (n = 0; n < groupWidth && idx < syms->mapWidth; n++)
+		pCore[idx++] = pXKB[n];
+	}
 
-	    pXKB+= XkbKeyGroupsWidth(xkb,key);
-	    nOut+= 2;
-	    if (nGroups>1) {
-		groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup2Index);
-		if (groupWidth>0)	pCore[2]= pXKB[0];
-		if (groupWidth>1)	pCore[3]= pXKB[1];
-		for (n=2;n<groupWidth;n++) {
-		    pCore[nOut+(n-2)]= pXKB[n];
-		}
-		if (groupWidth>2)
-		    nOut+= (groupWidth-2);
+	pXKB+= XkbKeyGroupsWidth(xkb,key);
+	nOut+= 2;
+	if (nGroups>1) {
+	    groupWidth= XkbKeyGroupWidth(xkb,key,XkbGroup2Index);
+	    if (groupWidth>0)	pCore[2]= pXKB[0];
+	    if (groupWidth>1)	pCore[3]= pXKB[1];
+	    for (n=2;n<groupWidth;n++) {
+		pCore[nOut+(n-2)]= pXKB[n];
 	    }
-	    pXKB+= XkbKeyGroupsWidth(xkb,key);
-	    for (n=XkbGroup3Index;n<nGroups;n++) {
-		register int s;
-		groupWidth= XkbKeyGroupWidth(xkb,key,n);
-		for (s=0;s<groupWidth;s++) {
-		    pCore[nOut++]= pXKB[s];
-		}
-		pXKB+= XkbKeyGroupsWidth(xkb,key);
+	    if (groupWidth>2)
+		nOut+= (groupWidth-2);
+	}
+	pXKB+= XkbKeyGroupsWidth(xkb,key);
+	for (n=XkbGroup3Index;n<nGroups;n++) {
+	    register int s;
+	    groupWidth= XkbKeyGroupWidth(xkb,key,n);
+	    for (s=0;s<groupWidth;s++) {
+		pCore[nOut++]= pXKB[s];
 	    }
+	    pXKB+= XkbKeyGroupsWidth(xkb,key);
 	}
     }
-    return;
+
+    return syms;
 }
 
 void
@@ -580,9 +572,7 @@ XkbApplyMappingChange(DeviceIntPtr kbd, KeySymsPtr map, KeyCode first_key,
         check = 0;
         XkbSetCauseCoreReq(&cause, X_ChangeKeyboardMapping, client);
 
-        if (!SetKeySymsMap(&kbd->key->curKeySyms, map))
-            FatalError("XkbApplyMappingChange: failed to copy core keymap!\n");
-        XkbUpdateKeyTypesFromCore(kbd, first_key, num_keys, &changes);
+        XkbUpdateKeyTypesFromCore(kbd, map, first_key, num_keys, &changes);
         XkbUpdateActions(kbd, first_key, num_keys, &changes, &check, &cause);
 
         if (check)
commit bc909f71367a02297e725bb5769c2bcadab22395
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Aug 12 00:35:56 2008 +0300

    Input: Centralise pointer map changing
    
    Replace both core and Xi functions with one function that validates the
    proposed map, and sends out both kinds of notification.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 623f710..76214b9 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -1639,20 +1639,6 @@ SetButtonMapping(ClientPtr client, DeviceIntPtr dev, int nElts, BYTE * map)
     return Success;
 }
 
-void
-SendDevicePointerMappingNotify(ClientPtr client, DeviceIntPtr dev)
-{
-    xEvent event;
-    deviceMappingNotify *ev = (deviceMappingNotify *) & event;
-
-    ev->type = DeviceMappingNotify;
-    ev->request = MappingPointer;
-    ev->deviceid = dev->id;
-    ev->time = currentTime.milliseconds;
-
-    SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) ev, 1);
-}
-
 int
 ChangeKeyMapping(ClientPtr client,
 		 DeviceIntPtr dev,
diff --git a/Xi/setbmap.c b/Xi/setbmap.c
index 0bcfbb8..b6f62dd 100644
--- a/Xi/setbmap.c
+++ b/Xi/setbmap.c
@@ -107,21 +107,15 @@ ProcXSetDeviceButtonMapping(ClientPtr client)
     rep.sequenceNumber = client->sequence;
     rep.status = MappingSuccess;
 
-    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
-    if (ret != Success)
-	return ret;
-
-    ret = SetButtonMapping(client, dev, stuff->map_length, (BYTE *) & stuff[1]);
-
-    if (ret == BadValue || ret == BadMatch)
-	return ret;
-    else {
-	rep.status = ret;
-	WriteReplyToClient(client, sizeof(xSetDeviceButtonMappingReply), &rep);
-    }
-
-    if (ret != MappingBusy)
-	SendDevicePointerMappingNotify(client, dev);
+    ret = ApplyPointerMapping(dev, (CARD8 *) &stuff[1], stuff->map_length, client);
+    if (ret == -1)
+        return BadValue;
+    else if (ret == MappingBusy)
+        rep.status = ret;
+    else if (ret != Success)
+        return ret;
+
+    WriteReplyToClient(client, sizeof(xSetDeviceButtonMappingReply), &rep);
 
     return Success;
 }
diff --git a/dix/devices.c b/dix/devices.c
index 33f149c..884256c 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1396,28 +1396,6 @@ InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons,
 	   InitPtrFeedbackClassDeviceStruct(dev, controlProc));
 }
 
-_X_EXPORT void
-SendPointerMappingNotify(DeviceIntPtr pDev, ClientPtr client)
-{
-    int i;
-    xEvent event;
-
-    /* 0 is the server client. */
-    for (i = 1; i < currentMaxClients; i++) {
-        /* Don't send irrelevant events to naïve clients. */
-        if (PickPointer(clients[i]) != pDev)
-            continue;
-
-        if (clients[i] && clients[i]->clientState == ClientStateRunning) {
-            event.u.u.type = MappingNotify;
-            event.u.u.sequenceNumber = clients[i]->sequence;
-            event.u.mappingNotify.request = MappingPointer;
-
-            WriteEventsToClient(clients[i], 1, &event);
-        }
-    }
-}
-
 /*
  * Check if the given buffer contains elements between low (inclusive) and
  * high (inclusive) only.
@@ -1553,31 +1531,6 @@ ProcChangeKeyboardMapping(ClientPtr client)
     return client->noClientException;
 }
 
-static int
-DoSetPointerMapping(ClientPtr client, DeviceIntPtr device, BYTE *map, int n)
-{
-    int rc, i = 0;
-
-    if (!device || !device->button)
-        return BadDevice;
-
-    rc = XaceHook(XACE_DEVICE_ACCESS, client, device, DixManageAccess);
-    if (rc != Success)
-        return rc;
-
-    for (i = 0; i < n; i++) {
-        if ((device->button->map[i + 1] != map[i]) &&
-            BitIsOn(device->button->down, i + 1)) {
-            return MappingBusy;
-        }
-    }
-
-    for (i = 0; i < n; i++)
-        device->button->map[i + 1] = map[i];
-
-    return Success;
-}
-
 int
 ProcSetPointerMapping(ClientPtr client)
 {
@@ -1607,31 +1560,26 @@ ProcSetPointerMapping(ClientPtr client)
 	client->errorValue = stuff->nElts;
 	return BadValue;
     }
-    if (BadDeviceMap(&map[0], (int)stuff->nElts, 1, 255, &client->errorValue))
-	return BadValue;
 
-    /* core protocol specs don't allow for duplicate mappings. */
-    for (i = 0; i < stuff->nElts; i++)
-    {
-        for (j = i + 1; j < stuff->nElts; j++)
-        {
-            if (map[i] && map[i] == map[j])
-            {
+    /* Core protocol specs don't allow for duplicate mappings; this check
+     * almost certainly wants disabling through XFixes too. */
+    for (i = 0; i < stuff->nElts; i++) {
+        for (j = i + 1; j < stuff->nElts; j++) {
+            if (map[i] && map[i] == map[j]) {
                 client->errorValue = map[i];
                 return BadValue;
             }
         }
     }
 
-    ret = DoSetPointerMapping(client, ptr, map, stuff->nElts);
-    if (ret != Success) {
+    ret = ApplyPointerMapping(ptr, map, stuff->nElts, client);
+    if (ret == MappingBusy)
         rep.success = ret;
-        WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
-        return Success;
-    }
+    else if (ret == -1)
+        return BadValue;
+    else if (ret != Success)
+        return ret;
 
-    /* FIXME: Send mapping notifies for masters/slaves as well. */
-    SendPointerMappingNotify(ptr, client);
     WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
     return Success;
 }
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 309ef51..4763382 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -28,6 +28,7 @@
 #endif
 
 #include "exevents.h"
+#include "exglobals.h"
 #include "misc.h"
 #include "input.h"
 #include "inputstr.h"
@@ -35,6 +36,110 @@
 #include "xkbsrv.h"
 #include "xkbstr.h"
 
+/* Check if a button map change is okay with the device.
+ * Returns -1 for BadValue, as it collides with MappingBusy. */
+static int
+check_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, CARD32 *errval_out,
+                    ClientPtr client)
+{
+    int i, ret;
+
+    if (!dev || !dev->button)
+        return BadDevice;
+
+    ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
+    if (ret != Success)
+        return ret;
+
+    for (i = 0; i < len; i++) {
+        if (dev->button->map[i + 1] != map[i] && dev->button->down[i + 1])
+            return MappingBusy;
+
+        if (map[i] < 1 || map[i] > 255) {
+            if (errval_out)
+                *errval_out = map[i];
+            return -1;
+        }
+    }
+
+    return Success;
+}
+
+static void
+do_butmap_change(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
+{
+    int i;
+    xEvent core_mn;
+    deviceMappingNotify xi_mn;
+
+    /* The map in ButtonClassRec refers to button numbers, whereas the
+     * protocol is zero-indexed.  Sigh. */
+    memcpy(&(dev->button->map[1]), map, len);
+
+    core_mn.u.u.type = MappingNotify;
+    core_mn.u.mappingNotify.request = MappingPointer;
+
+    /* 0 is the server client. */
+    for (i = 1; i < currentMaxClients; i++) {
+        /* Don't send irrelevant events to naïve clients. */
+        if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+            continue;
+
+        if (!XIShouldNotify(clients[i], dev))
+            continue;
+
+        core_mn.u.u.sequenceNumber = clients[i]->sequence;
+        WriteEventsToClient(clients[i], 1, &core_mn);
+    }
+
+    xi_mn.type = DeviceMappingNotify;
+    xi_mn.request = MappingPointer;
+    xi_mn.deviceid = dev->id;
+    xi_mn.time = GetTimeInMillis();
+
+    SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) &xi_mn, 1);
+}
+
+/*
+ * Does what it says on the box, both for core and Xi.
+ *
+ * Faithfully reports any errors encountered while trying to apply the map
+ * to the requested device, faithfully ignores any errors encountered while
+ * trying to apply the map to its master/slaves.
+ */
+_X_EXPORT int
+ApplyPointerMapping(DeviceIntPtr dev, CARD8 *map, int len, ClientPtr client)
+{
+    int ret;
+    DeviceIntPtr tmp;
+
+    /* If we can't perform the change on the requested device, bail out. */
+    ret = check_butmap_change(dev, map, len, &client->errorValue, client);
+    if (ret != Success)
+        return ret;
+    do_butmap_change(dev, map, len, client);
+
+    /* Change any attached masters/slaves. */
+    if (dev->isMaster) {
+        for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+            if (!tmp->isMaster && tmp->u.master == dev)
+                if (check_butmap_change(tmp, map, len, NULL, client) == Success)
+                    do_butmap_change(tmp, map, len, client);
+        }
+    }
+    else {
+        for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+            if (tmp->isMaster && tmp->u.lastSlave == dev) {
+                /* If this fails, expect the results to be weird. */
+                if (check_butmap_change(tmp, map, len, NULL, client) == Success)
+                    do_butmap_change(tmp, map, len, client);
+            }
+        }
+    }
+
+    return Success;
+}
+
 /* Check if a modifier map change is okay with the device.
  * Returns -1 for BadValue, as it collides with MappingBusy; this particular
  * caveat can be removed with LegalModifier, as we have no other reason to
diff --git a/include/exevents.h b/include/exevents.h
index 46df009..ff29227 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -137,10 +137,6 @@ extern _X_EXPORT int SetButtonMapping (
 	int                    /* nElts */,
 	BYTE *                 /* map */);
 
-extern _X_EXPORT void SendDevicePointerMappingNotify(
-        ClientPtr              /* client, */,
-	DeviceIntPtr           /* dev */);
-
 extern _X_EXPORT int ChangeKeyMapping(
 	ClientPtr              /* client */,
 	DeviceIntPtr           /* dev */,
diff --git a/include/input.h b/include/input.h
index 8a774c9..19d1ae7 100644
--- a/include/input.h
+++ b/include/input.h
@@ -368,8 +368,10 @@ extern _X_EXPORT Bool InitKeyboardDeviceStruct(
     BellProcPtr /*bellProc*/,
     KbdCtrlProcPtr /*controlProc*/);
 
-extern _X_EXPORT void SendPointerMappingNotify(
+extern _X_EXPORT int ApplyPointerMapping(
     DeviceIntPtr /* pDev */,
+    CARD8 *      /* map */,
+    int          /* len */,
     ClientPtr	/* client */);
 
 extern _X_EXPORT Bool BadDeviceMap(
commit f06a9d2e05e13466c115fc706966a90b1fb0518e
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Oct 18 20:59:30 2008 +0100

    Input: Clean up keymap change notifications
    
    Keyboard map notifications are always generated from within XKB code,
    which also takes care of copying the keysyms, etc.  If you need to
    mangle the keymap yourself, generate a new core keymap/modmap, and pass
    it to XkbApplyMappingChange.
    
    SendMappingNotify is renamed to SendPointerMappingNotify (and ditto its
    Device variants), which still only _sends_ the notifications, as opposed
    to also doing the copying a la XkbApplyMappingChange.
    
    Also have the modmap change code traverse the device hierachy, rather
    than just going off the core keyboard.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index da10040..623f710 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -205,41 +205,20 @@ XIGetDevice(xEvent* xE)
 static void
 CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
 {
-    static DeviceIntPtr lastMapNotifyDevice = NULL;
-    KeyClassPtr mk, dk; /* master, device */
+    KeyClassPtr mk = master->key;
+    KeyClassPtr dk = device->key;
     int i;
 
     if (device == master)
         return;
 
-    dk = device->key;
-    mk = master->key;
-
-    mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode;
-    mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
     SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
 
     for (i = 0; i < 8; i++)
         mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
 
-    if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
+    if (!XkbCopyDeviceKeymap(master, device))
         FatalError("Couldn't pivot keymap from device to core!\n");
-
-    /* Copy the state here.  This means we'll only have consistency
-     * between state and active keymap, rather than between state and
-     * keycodes pressed, but there's pretty much no way to win here,
-     * so might as well go for the one that would seem to give the
-     * least nonsensical result. */
-    mk->xkbInfo->state = dk->xkbInfo->state;
-
-    if (lastMapNotifyDevice != master) {
-        SendMappingNotify(master, MappingKeyboard,
-                           mk->curKeySyms.minKeyCode,
-                          (mk->curKeySyms.maxKeyCode -
-                           mk->curKeySyms.minKeyCode),
-                          serverClient);
-        lastMapNotifyDevice = master;
-    }
 }
 
 /**
@@ -1661,23 +1640,15 @@ SetButtonMapping(ClientPtr client, DeviceIntPtr dev, int nElts, BYTE * map)
 }
 
 void
-SendDeviceMappingNotify(ClientPtr client, CARD8 request,
-			KeyCode firstKeyCode, CARD8 count, DeviceIntPtr dev)
+SendDevicePointerMappingNotify(ClientPtr client, DeviceIntPtr dev)
 {
     xEvent event;
     deviceMappingNotify *ev = (deviceMappingNotify *) & event;
 
     ev->type = DeviceMappingNotify;
-    ev->request = request;
+    ev->request = MappingPointer;
     ev->deviceid = dev->id;
     ev->time = currentTime.milliseconds;
-    if (request == MappingKeyboard) {
-	ev->firstKeyCode = firstKeyCode;
-	ev->count = count;
-    }
-
-    if (request == MappingKeyboard || request == MappingModifier)
-        XkbApplyMappingChange(dev, request, firstKeyCode, count, client);
 
     SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) ev, 1);
 }
@@ -1712,9 +1683,10 @@ ChangeKeyMapping(ClientPtr client,
     keysyms.maxKeyCode = firstKeyCode + keyCodes - 1;
     keysyms.mapWidth = keySymsPerKeyCode;
     keysyms.map = map;
-    if (!SetKeySymsMap(&k->curKeySyms, &keysyms))
-	return BadAlloc;
-    SendDeviceMappingNotify(client, MappingKeyboard, firstKeyCode, keyCodes, dev);
+
+    XkbApplyMappingChange(dev, &keysyms, firstKeyCode, keyCodes, NULL,
+                          serverClient);
+
     return client->noClientException;
 }
 
diff --git a/Xi/setbmap.c b/Xi/setbmap.c
index 3c293c0..0bcfbb8 100644
--- a/Xi/setbmap.c
+++ b/Xi/setbmap.c
@@ -121,7 +121,8 @@ ProcXSetDeviceButtonMapping(ClientPtr client)
     }
 
     if (ret != MappingBusy)
-	SendDeviceMappingNotify(client, MappingPointer, 0, 0, dev);
+	SendDevicePointerMappingNotify(client, dev);
+
     return Success;
 }
 
diff --git a/dix/devices.c b/dix/devices.c
index a4ff641..33f149c 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -1013,19 +1013,20 @@ QueryMinMaxKeyCodes(KeyCode *minCode, KeyCode *maxCode)
     }
 }
 
+/* Notably, this function does not expand the destination's keycode range, or
+ * notify clients. */
 Bool
 SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
 {
     int i, j;
+    KeySym *tmp;
     int rowDif = src->minKeyCode - dst->minKeyCode;
 
     /* if keysym map size changes, grow map first */
-    if (src->mapWidth < dst->mapWidth)
-    {
-        for (i = src->minKeyCode; i <= src->maxKeyCode; i++)
-	{
-#define SI(r, c) (((r-src->minKeyCode)*src->mapWidth) + (c))
-#define DI(r, c) (((r - dst->minKeyCode)*dst->mapWidth) + (c))
+    if (src->mapWidth < dst->mapWidth) {
+        for (i = src->minKeyCode; i <= src->maxKeyCode; i++) {
+#define SI(r, c) (((r - src->minKeyCode) * src->mapWidth) + (c))
+#define DI(r, c) (((r - dst->minKeyCode) * dst->mapWidth) + (c))
 	    for (j = 0; j < src->mapWidth; j++)
 		dst->map[DI(i, j)] = src->map[SI(i, j)];
 	    for (j = src->mapWidth; j < dst->mapWidth; j++)
@@ -1035,39 +1036,37 @@ SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
 	}
 	return TRUE;
     }
-    else if (src->mapWidth > dst->mapWidth)
-    {
-        KeySym *map;
-	int bytes = sizeof(KeySym) * src->mapWidth *
-		    (dst->maxKeyCode - dst->minKeyCode + 1);
-        map = (KeySym *)xcalloc(1, bytes);
-	if (!map)
-	    return FALSE;
-        if (dst->map)
-	{
+    else if (src->mapWidth > dst->mapWidth) {
+        i = sizeof(KeySym) * src->mapWidth *
+             (dst->maxKeyCode - dst->minKeyCode + 1);
+        tmp = xcalloc(sizeof(KeySym), i);
+        if (!tmp)
+            return FALSE;
+
+        if (dst->map) {
             for (i = 0; i <= dst->maxKeyCode-dst->minKeyCode; i++)
-		memmove((char *)&map[i*src->mapWidth],
-			(char *)&dst->map[i*dst->mapWidth],
-		      dst->mapWidth * sizeof(KeySym));
-	    xfree(dst->map);
-	}
-	dst->mapWidth = src->mapWidth;
-	dst->map = map;
-    } else if (!dst->map)
-    {
-        KeySym *map;
-	int bytes = sizeof(KeySym) * src->mapWidth *
-		    (dst->maxKeyCode - dst->minKeyCode + 1);
-        map = (KeySym *)xcalloc(1, bytes);
-        if (!map)
+                memmove(&tmp[i * src->mapWidth], &dst->map[i * dst->mapWidth],
+                        dst->mapWidth * sizeof(KeySym));
+            xfree(dst->map);
+        }
+        dst->mapWidth = src->mapWidth;
+        dst->map = tmp;
+    }
+    else if (!dst->map) {
+        i = sizeof(KeySym) * src->mapWidth *
+             (dst->maxKeyCode - dst->minKeyCode + 1);
+        tmp = xcalloc(sizeof(KeySym), i);
+        if (!tmp)
             return FALSE;
-        dst->map = map;
+
+        dst->map = tmp;
         dst->mapWidth = src->mapWidth;
     }
-    memmove((char *)&dst->map[rowDif * dst->mapWidth],
-	    (char *)src->map,
-	  (int)(src->maxKeyCode - src->minKeyCode + 1) *
-	  dst->mapWidth * sizeof(KeySym));
+
+    memmove(&dst->map[rowDif * dst->mapWidth], src->map,
+            (src->maxKeyCode - src->minKeyCode + 1) *
+            dst->mapWidth * sizeof(KeySym));
+
     return TRUE;
 }
 
@@ -1398,34 +1397,24 @@ InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons,
 }
 
 _X_EXPORT void
-SendMappingNotify(DeviceIntPtr pDev, unsigned request, unsigned firstKeyCode,
-        unsigned count, ClientPtr client)
+SendPointerMappingNotify(DeviceIntPtr pDev, ClientPtr client)
 {
     int i;
     xEvent event;
 
-    event.u.u.type = MappingNotify;
-    event.u.mappingNotify.request = request;
-    if (request == MappingKeyboard)
-    {
-        event.u.mappingNotify.firstKeyCode = firstKeyCode;
-        event.u.mappingNotify.count = count;
-    }
-    if (request == MappingKeyboard || request == MappingModifier)
-	XkbApplyMappingChange(pDev,request,firstKeyCode,count, client);
+    /* 0 is the server client. */
+    for (i = 1; i < currentMaxClients; i++) {
+        /* Don't send irrelevant events to naïve clients. */
+        if (PickPointer(clients[i]) != pDev)
+            continue;
 
-   /* 0 is the server client */
-    for (i=1; i<currentMaxClients; i++)
-    {
-	if (clients[i] && clients[i]->clientState == ClientStateRunning)
-	{
-	    if (request == MappingKeyboard &&
-		clients[i]->xkbClientFlags != 0 &&
-		(clients[i]->mapNotifyMask & XkbKeySymsMask))
-		continue;
-	    event.u.u.sequenceNumber = clients[i]->sequence;
-	    WriteEventsToClient(clients[i], 1, &event);
-	}
+        if (clients[i] && clients[i]->clientState == ClientStateRunning) {
+            event.u.u.type = MappingNotify;
+            event.u.u.sequenceNumber = clients[i]->sequence;
+            event.u.mappingNotify.request = MappingPointer;
+
+            WriteEventsToClient(clients[i], 1, &event);
+        }
     }
 }
 
@@ -1516,7 +1505,7 @@ ProcChangeKeyboardMapping(ClientPtr client)
     unsigned len;
     KeySymsRec keysyms;
     KeySymsPtr curKeySyms = &PickKeyboard(client)->key->curKeySyms;
-    DeviceIntPtr pDev = NULL;
+    DeviceIntPtr pDev, tmp;
     int rc;
     REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
 
@@ -1536,28 +1525,30 @@ ProcChangeKeyboardMapping(ClientPtr client)
 	    return BadValue;
     }
 
-    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
-        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key) {
-            rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
-	    if (rc != Success)
-                return rc;
-        }
-    }
-
     keysyms.minKeyCode = stuff->firstKeyCode;
     keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1;
     keysyms.mapWidth = stuff->keySymsPerKeyCode;
-    keysyms.map = (KeySym *)&stuff[1];
-    for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
-        if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key)
-            if (!SetKeySymsMap(&pDev->key->curKeySyms, &keysyms))
-                return BadAlloc;
-
-    for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
-        if (pDev->key && pDev->coreEvents)
-            SendDeviceMappingNotify(client, MappingKeyboard,
-                                    stuff->firstKeyCode, stuff->keyCodes,
-                                    pDev);
+    keysyms.map = (KeySym *) &stuff[1];
+
+    pDev = PickKeyboard(client);
+    rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
+    if (rc != Success)
+        return rc;
+
+    XkbApplyMappingChange(pDev, &keysyms, stuff->firstKeyCode,
+                          stuff->keyCodes, NULL, client);
+
+    for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+        if (tmp->isMaster || tmp->u.master != pDev)
+            continue;
+
+        rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
+        if (rc != Success)
+            continue;
+
+        XkbApplyMappingChange(tmp, &keysyms, stuff->firstKeyCode,
+                              stuff->keyCodes, NULL, client);
+    }
 
     return client->noClientException;
 }
@@ -1639,7 +1630,8 @@ ProcSetPointerMapping(ClientPtr client)
         return Success;
     }
 
-    SendMappingNotify(ptr, MappingPointer, 0, 0, client);
+    /* FIXME: Send mapping notifies for masters/slaves as well. */
+    SendPointerMappingNotify(ptr, client);
     WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
     return Success;
 }
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 1b6458f..309ef51 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -132,8 +132,7 @@ check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
 static void
 do_modmap_change(ClientPtr client, DeviceIntPtr dev, CARD8 *modmap)
 {
-    memcpy(dev->key->xkbInfo->desc->map->modmap, modmap, MAP_LENGTH);
-    SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev);
+    XkbApplyMappingChange(dev, NULL, 0, 0, modmap, serverClient);
 }
 
 /* Rebuild modmap (key -> mod) from map (mod -> key). */
@@ -165,7 +164,7 @@ change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
 {
     int ret;
     CARD8 modmap[MAP_LENGTH];
-    DeviceIntPtr slave;
+    DeviceIntPtr tmp;
 
     ret = build_modmap_from_modkeymap(modmap, modkeymap, max_keys_per_mod);
     if (ret != Success)
@@ -177,12 +176,21 @@ change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
         return ret;
     do_modmap_change(client, dev, modmap);
 
-    /* If we're acting on a master, change the slaves as well. */
+    /* Change any attached masters/slaves. */
     if (dev->isMaster) {
-        for (slave = inputInfo.devices; slave; slave = slave->next) {
-            if (slave != dev && !slave->isMaster && slave->u.master == dev)
-                if (check_modmap_change_slave(client, dev, slave, modmap))
-                    do_modmap_change(client, slave, modmap);
+        for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+            if (!tmp->isMaster && tmp->u.master == dev)
+                if (check_modmap_change_slave(client, dev, tmp, modmap))
+                    do_modmap_change(client, tmp, modmap);
+        }
+    }
+    else {
+        for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
+            if (tmp->isMaster && tmp->u.lastSlave == dev) {
+                /* If this fails, expect the results to be weird. */
+                if (check_modmap_change(client, tmp, modmap))
+                    do_modmap_change(client, tmp, modmap);
+            }
         }
     }
 
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 9e8da8b..020b6a6 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -293,26 +293,15 @@ static void DarwinLoadKeyboardMapping(KeySymsRec *keySyms) {
  * DarwinKeyboardSetDeviceKeyMap
  * Load a keymap into the keyboard device
  */
-static void DarwinKeyboardSetDeviceKeyMap(KeySymsRec *keySyms) {
+static void DarwinKeyboardSetDeviceKeyMap(KeySymsRec *keySyms, CARD8 *modmap) {
     DeviceIntPtr pDev;
 
-    /* From ProcSetModifierMapping */
-    SendMappingNotify(darwinKeyboard, MappingModifier, 0, 0, serverClient);
-    for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
-        if (pDev->key && pDev->coreEvents)
-            SendDeviceMappingNotify(serverClient, MappingModifier, 0, 0, pDev);
-    
-    /* From ProcChangeKeyboardMapping */
     for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
         if ((pDev->coreEvents || pDev == inputInfo.keyboard) && pDev->key)
-            assert(SetKeySymsMap(&pDev->key->curKeySyms, keySyms));
-
-    SendMappingNotify(darwinKeyboard, MappingKeyboard, keySyms->minKeyCode,
-                      keySyms->maxKeyCode - keySyms->minKeyCode + 1, serverClient);
-    for (pDev = inputInfo.devices; pDev; pDev = pDev->next)
-        if (pDev->key && pDev->coreEvents)
-            SendDeviceMappingNotify(serverClient, MappingKeyboard, keySyms->minKeyCode,
-                                    keySyms->maxKeyCode - keySyms->minKeyCode + 1, pDev);    
+            XkbApplyMappingChange(pDev, XkbKeySymsMask | XkbModifierMapMask,
+                                  keysyms, keysyms.minKeyCode,
+                                  keysyms.maxKeyCode - keysyms.minKeyCode + 1,
+                                  modmap, serverClient);
 }
 
 /*
@@ -340,14 +329,11 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) {
     //XkbSetRulesDflts("base", "pc105", "us", NULL, NULL);
     
     pthread_mutex_lock(&keyInfo_mutex);
-    assert(XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, keyInfo.modMap,
-                                       QuartzBell, DarwinChangeKeyboardControl));
-    assert(pDev->key->xkbInfo->desc->map->modmap!=NULL);
-    memcpy(pDev->key->xkbInfo->desc->map->modmap, keyInfo.modMap, sizeof(keyInfo.modMap));
+    assert(XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, QuartzBell,
+                                       DarwinChangeKeyboardControl));
+    assert(keyInfo.modMap!=NULL);
     pthread_mutex_unlock(&keyInfo_mutex);
 
-	QuartzXkbUpdate(pDev);
-#else
     pthread_mutex_lock(&keyInfo_mutex);
     assert( InitKeyboardDeviceStruct( (DevicePtr)pDev, &keySyms,
                                       QuartzBell,
@@ -373,7 +359,7 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) {
         XkbSetRepeatKeys(pDev, -1, AutoRepeatModeOn);
     }
 
-    DarwinKeyboardSetDeviceKeyMap(&keySyms);
+    DarwinKeyboardSetDeviceKeyMap(&keySyms, keyInfo.modMap);
 }
 
 void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr pDev, int nevents) {
diff --git a/include/exevents.h b/include/exevents.h
index abe1a5f..46df009 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -137,11 +137,8 @@ extern _X_EXPORT int SetButtonMapping (
 	int                    /* nElts */,
 	BYTE *                 /* map */);
 
-extern _X_EXPORT void SendDeviceMappingNotify(
+extern _X_EXPORT void SendDevicePointerMappingNotify(
         ClientPtr              /* client, */,
-	CARD8                  /* request, */,
-	KeyCode                /* firstKeyCode */,
-	CARD8                  /* count */,
 	DeviceIntPtr           /* dev */);
 
 extern _X_EXPORT int ChangeKeyMapping(
diff --git a/include/input.h b/include/input.h
index a38dbfa..8a774c9 100644
--- a/include/input.h
+++ b/include/input.h
@@ -368,11 +368,8 @@ extern _X_EXPORT Bool InitKeyboardDeviceStruct(
     BellProcPtr /*bellProc*/,
     KbdCtrlProcPtr /*controlProc*/);
 
-extern _X_EXPORT void SendMappingNotify(
+extern _X_EXPORT void SendPointerMappingNotify(
     DeviceIntPtr /* pDev */,
-    unsigned int /*request*/,
-    unsigned int /*firstKeyCode*/,
-    unsigned int /*count*/,
     ClientPtr	/* client */);
 
 extern _X_EXPORT Bool BadDeviceMap(
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index b2b1736..54010eb 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -538,9 +538,10 @@ extern _X_EXPORT void XkbUpdateCoreDescription(
 
 extern _X_EXPORT void XkbApplyMappingChange(
     DeviceIntPtr	/* pXDev */,
-    CARD8 		/* request */,
-    KeyCode 		/* firstKey */,
-    CARD8 		/* num */,
+    KeySymsPtr          /* map */,
+    KeyCode		/* firstKey */,
+    CARD8		/* num */,
+    CARD8 *             /* modmap */,
     ClientPtr		/* client */
 );
 
@@ -955,8 +956,11 @@ extern _X_EXPORT void XkbSendNewKeyboardNotify(
 
 extern Bool XkbCopyKeymap(
         XkbDescPtr              /* dst */,
-        XkbDescPtr              /* src */,
-        Bool                    /* sendNotifies */);
+        XkbDescPtr              /* src */);
+
+extern Bool XkbCopyDeviceKeymap(
+        DeviceIntPtr            /* dst */,
+        DeviceIntPtr            /* src */);
 
 #include "xkbfile.h"
 #include <X11/extensions/XKMformat.h>
diff --git a/xkb/xkb.c b/xkb/xkb.c
index b99b261..722141c 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5837,8 +5837,7 @@ ProcXkbGetKbdByName(ClientPtr client)
                 (dev->id == inputInfo.keyboard->id && tmpd->key &&
                  tmpd->coreEvents)) {
                 if (tmpd != dev)
-                    XkbCopyKeymap(dev->key->xkbInfo->desc,
-                                  tmpd->key->xkbInfo->desc, True);
+                    XkbCopyDeviceKeymap(tmpd, dev);
                 XkbUpdateCoreDescription(tmpd, True);
 
                 if (tmpd->kbdfeed && tmpd->kbdfeed->xkb_sli) {
diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index ed80b04..6c2d32d 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -35,6 +35,8 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
 #include "inputstr.h"
+#include "exevents.h"
+#include "exglobals.h"
 #include "windowstr.h"
 #include "exevents.h"
 #include <xkbsrv.h>
@@ -42,58 +44,151 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 /***====================================================================***/
 
+/*
+ * This function sends out two kinds of notification:
+ *   - Core mapping notify events sent to clients for whom kbd is the
+ *     current core ('picked') keyboard _and_ have not explicitly
+ *     selected for XKB mapping notify events;
+ *   - Xi mapping events, sent unconditionally to all clients who have
+ *     explicitly selected for them (including those who have explicitly
+ *     selected for XKB mapping notify events!).
+ */
+static void
+XkbSendLegacyMapNotify(DeviceIntPtr kbd, CARD16 xkb_event, CARD16 changed,
+                       int first_key, int num_keys)
+{
+    int i;
+    int keymap_changed = 0;
+    int modmap_changed = 0;
+    xEvent core_mn;
+    deviceMappingNotify xi_mn;
+    CARD32 time = GetTimeInMillis();
+
+    if (xkb_event == XkbNewKeyboardNotify) {
+        if (changed & XkbNKN_KeycodesMask) {
+            keymap_changed = 1;
+            modmap_changed = 1;
+        }
+    }
+    else if (xkb_event == XkbMapNotify) {
+        if (changed & XkbKeySymsMask)
+            keymap_changed = 1;
+        if (changed & XkbModifierMapMask)
+            modmap_changed = 1;
+    }
+    if (!keymap_changed && !modmap_changed)
+        return;
+
+    core_mn.u.u.type = MappingNotify;
+    xi_mn.type = DeviceMappingNotify;
+    xi_mn.deviceid = kbd->id;
+    xi_mn.time = time;
+
+    /* 0 is serverClient. */
+    for (i = 1; i < currentMaxClients; i++) {
+        if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+            continue;
+
+        /* Ignore clients which will have already received this.
+         * Inconsistent with themselves, but consistent with previous
+         * behaviour.*/
+        if (xkb_event == XkbMapNotify && (clients[i]->mapNotifyMask & changed))
+            continue;
+        if (xkb_event == XkbNewKeyboardNotify &&
+            (clients[i]->xkbClientFlags & _XkbClientInitialized))
+            continue;
+
+        /* Don't send core events to clients who don't know about us. */
+        if (!XIShouldNotify(clients[i], kbd))
+            continue;
+
+        core_mn.u.u.sequenceNumber = clients[i]->sequence;
+        if (keymap_changed) {
+            core_mn.u.mappingNotify.request = MappingKeyboard;
+
+            /* Clip the keycode range to what the client knows about, so it
+             * doesn't freak out. */
+            if (first_key >= clients[i]->minKC)
+                core_mn.u.mappingNotify.firstKeyCode = first_key;
+            else
+                core_mn.u.mappingNotify.firstKeyCode = clients[i]->minKC;
+            if (first_key + num_keys - 1 <= clients[i]->maxKC)
+                core_mn.u.mappingNotify.count = num_keys;
+            else
+                core_mn.u.mappingNotify.count = clients[i]->maxKC -
+                                                 clients[i]->minKC + 1;
+
+            WriteEventsToClient(clients[i], 1, &core_mn);
+        }
+        if (modmap_changed) {
+            core_mn.u.mappingNotify.request = MappingModifier;
+            core_mn.u.mappingNotify.firstKeyCode = 0;
+            core_mn.u.mappingNotify.count = 0;
+            WriteEventsToClient(clients[i], 1, &core_mn);
+        }
+    }
+
+    /* Hmm, maybe we can accidentally generate Xi events for core devices
+     * here? Clients might be upset, but that seems better than the
+     * alternative of stale keymaps. -ds */
+    if (keymap_changed) {
+        xi_mn.request = MappingKeyboard;
+        xi_mn.firstKeyCode = first_key;
+        xi_mn.count = num_keys;
+        SendEventToAllWindows(kbd, DeviceMappingNotifyMask, (xEvent *) &xi_mn,
+                              1);
+    }
+    if (modmap_changed) {
+        xi_mn.request = MappingModifier;
+        xi_mn.firstKeyCode = 0;
+        xi_mn.count = 0;
+        SendEventToAllWindows(kbd, DeviceMappingNotifyMask, (xEvent *) &xi_mn,
+                              1);
+    }
+}
+
+/***====================================================================***/
+
 void
 XkbSendNewKeyboardNotify(DeviceIntPtr kbd,xkbNewKeyboardNotify *pNKN)
-{		
-register int	i;
-Time 		time;
-CARD16		changed;
+{
+    int i;
+    Time time = GetTimeInMillis();
+    CARD16 changed = pNKN->changed;
 
     pNKN->type = XkbEventCode + XkbEventBase;
     pNKN->xkbType = XkbNewKeyboardNotify;
-    pNKN->time = time = GetTimeInMillis();
-    changed = pNKN->changed;
 
     for (i=1; i<currentMaxClients; i++) {
-        if ((!clients[i]) || clients[i]->clientGone ||
-				(clients[i]->requestVector==InitialVector)) {
-	    continue;
-	}
+        if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+            continue;
+
+        if (!(clients[i]->newKeyboardNotifyMask & changed))
+            continue;
+
+        if (!XIShouldNotify(clients[i], kbd))
+            continue;
+
+        pNKN->sequenceNumber = clients[i]->sequence;
+        pNKN->time = time;
+        pNKN->changed = changed;
+        if (clients[i]->swapped) {
+            int n;
+            swaps(&pNKN->sequenceNumber,n);
+            swapl(&pNKN->time,n);
+            swaps(&pNKN->changed,n);
+        }
+        WriteToClient(clients[i], sizeof(xEvent), pNKN);
 
-	if (clients[i]->xkbClientFlags&_XkbClientInitialized)  {
-	    if (clients[i]->newKeyboardNotifyMask&changed) {
-		pNKN->sequenceNumber = clients[i]->sequence;
-		pNKN->time = time;
-		pNKN->changed = changed;
-		if ( clients[i]->swapped ) {
-		    register int n;
-		    swaps(&pNKN->sequenceNumber,n);
-		    swapl(&pNKN->time,n);
-		    swaps(&pNKN->changed,n);
-		}
-		WriteToClient(clients[i],sizeof(xEvent),(char *)pNKN);
-		if (changed&XkbNKN_KeycodesMask) {
-		    clients[i]->minKC= pNKN->minKeyCode;
-		    clients[i]->maxKC= pNKN->maxKeyCode;
-		}
-	    }
-	}
-	else if (changed&XkbNKN_KeycodesMask) {
-	    xEvent	event;
-	    event.u.u.type= MappingNotify;
-	    event.u.mappingNotify.request= MappingKeyboard;
-	    event.u.mappingNotify.firstKeyCode= clients[i]->minKC;
-	    event.u.mappingNotify.count= clients[i]->maxKC-clients[i]->minKC+1;
-	    event.u.u.sequenceNumber= clients[i]->sequence;
-	    if (clients[i]->swapped) {
-		int n;
-		swaps(&event.u.u.sequenceNumber,n);
-	    }
-	    WriteToClient(clients[i],SIZEOF(xEvent), (char *)&event);
-	    event.u.mappingNotify.request= MappingModifier;
-	    WriteToClient(clients[i],SIZEOF(xEvent), (char *)&event);
-	}
+        if (changed & XkbNKN_KeycodesMask) {
+            clients[i]->minKC = pNKN->minKeyCode;
+            clients[i]->maxKC = pNKN->maxKeyCode;
+        }
     }
+
+    XkbSendLegacyMapNotify(kbd, XkbNewKeyboardNotify, changed, pNKN->minKeyCode,
+                           pNKN->maxKeyCode - pNKN->minKeyCode + 1);
+
     return;
 }
 
@@ -139,7 +234,8 @@ register CARD16	changed,bState;
 	if ((!interest->client->clientGone) &&
 	    (interest->client->requestVector != InitialVector) &&
 	    (interest->client->xkbClientFlags&_XkbClientInitialized) &&
-	    (interest->stateNotifyMask&changed)) {
+	    (interest->stateNotifyMask&changed) &&
+            XIShouldNotify(interest->client,kbd)) {
 	    pSN->sequenceNumber = interest->client->sequence;
 	    pSN->time = time;
 	    pSN->changed = changed;
@@ -160,49 +256,50 @@ register CARD16	changed,bState;
 
 /***====================================================================***/
 
+/*
+ * This function sends out XKB mapping notify events to clients which
+ * have explicitly selected for them.  Core and Xi events are handled by
+ * XkbSendLegacyMapNotify. */
 void
-XkbSendMapNotify(DeviceIntPtr kbd,xkbMapNotify *pMN)
+XkbSendMapNotify(DeviceIntPtr kbd, xkbMapNotify *pMN)
 {
-int 		i;
-XkbSrvInfoPtr	xkbi;
-unsigned	time = 0,initialized;
-CARD16		changed;
-
-    if (!kbd->key || !kbd->key->xkbInfo)
-        return;
-
-    xkbi = kbd->key->xkbInfo;
-    initialized= 0;
-
-    changed = pMN->changed;
-    pMN->minKeyCode= xkbi->desc->min_key_code;
-    pMN->maxKeyCode= xkbi->desc->max_key_code;
-    for (i=1; i<currentMaxClients; i++) {
-        if (clients[i] && ! clients[i]->clientGone &&
-	    (clients[i]->requestVector != InitialVector) &&
-	    (clients[i]->xkbClientFlags&_XkbClientInitialized) &&
-	    (clients[i]->mapNotifyMask&changed))
-	{
-	    if (!initialized) {
-		pMN->type = XkbEventCode + XkbEventBase;
-		pMN->xkbType = XkbMapNotify;
-		pMN->deviceID = kbd->id;
-		time = GetTimeInMillis();
-		initialized= 1;
-	    }
-	    pMN->time= time;
-	    pMN->sequenceNumber = clients[i]->sequence;
-	    pMN->changed = changed;
-	    if ( clients[i]->swapped ) {
-		register int n;
-		swaps(&pMN->sequenceNumber,n);
-		swapl(&pMN->time,n);
-		swaps(&pMN->changed,n);
-	    }
-	    WriteToClient(clients[i],sizeof(xEvent),(char *)pMN);
-	}
+    int i;
+    CARD32 time = GetTimeInMillis();
+    CARD16 changed = pMN->changed;
+    XkbSrvInfoPtr xkbi = kbd->key->xkbInfo;
+
+    pMN->minKeyCode = xkbi->desc->min_key_code;
+    pMN->maxKeyCode = xkbi->desc->max_key_code;
+    pMN->type = XkbEventCode + XkbEventBase;
+    pMN->xkbType = XkbMapNotify;
+    pMN->deviceID = kbd->id;
+
+    /* 0 is serverClient. */
+    for (i = 1; i < currentMaxClients; i++) {
+        if (!clients[i] || clients[i]->clientState != ClientStateRunning)
+            continue;
+
+        if (!(clients[i]->mapNotifyMask & changed))
+            continue;
+
+        if (!XIShouldNotify(clients[i], kbd))
+            continue;
+
+        pMN->time = time;
+        pMN->sequenceNumber = clients[i]->sequence;
+        pMN->changed = changed;
+
+        if (clients[i]->swapped) {
+            int n;
+            swaps(&pMN->sequenceNumber, n);
+            swapl(&pMN->time, n);
+            swaps(&pMN->changed, n);
+        }
+        WriteToClient(clients[i], sizeof(xEvent), pMN);
     }
-    return;
+
+    XkbSendLegacyMapNotify(kbd, XkbMapNotify, changed, pMN->firstKeySym,
+                           pMN->nKeySyms);
 }
 
 int
@@ -306,7 +403,8 @@ Time 		 	time = 0;
 	if ((!interest->client->clientGone) &&
 	    (interest->client->requestVector != InitialVector) &&
 	    (interest->client->xkbClientFlags&_XkbClientInitialized) &&
-	    (interest->ctrlsNotifyMask&changedControls)) {
+	    (interest->ctrlsNotifyMask&changedControls) &&
+            XIShouldNotify(interest->client, kbd)) {
 	    if (!initialized) {
 		pCN->type = XkbEventCode + XkbEventBase;
 		pCN->xkbType = XkbControlsNotify;
@@ -354,6 +452,7 @@ CARD32		state,changed;
 	if ((!interest->client->clientGone) &&
 	    (interest->client->requestVector != InitialVector) &&
 	    (interest->client->xkbClientFlags&_XkbClientInitialized) &&
+            XIShouldNotify(interest->client, kbd) &&
 	    (((xkbType==XkbIndicatorStateNotify)&&
 				(interest->iStateNotifyMask&changed))||
 	     ((xkbType==XkbIndicatorMapNotify)&&
@@ -437,7 +536,8 @@ XID		winID = 0;
 	if ((!interest->client->clientGone) &&
 	    (interest->client->requestVector != InitialVector) &&
 	    (interest->client->xkbClientFlags&_XkbClientInitialized) &&
-	    (interest->bellNotifyMask)) {
+	    (interest->bellNotifyMask) &&
+            XIShouldNotify(interest->client,kbd)) {
 	    if (!initialized) {
 		time = GetTimeInMillis();
 		bn.type = XkbEventCode + XkbEventBase;
@@ -491,7 +591,8 @@ CARD16		sk_delay,db_delay;
 	if ((!interest->client->clientGone) &&
 	    (interest->client->requestVector != InitialVector) &&
 	    (interest->client->xkbClientFlags&_XkbClientInitialized) &&
-	    (interest->accessXNotifyMask&(1<<pEv->detail))) {
+	    (interest->accessXNotifyMask&(1<<pEv->detail)) &&
+            XIShouldNotify(interest->client, kbd)) {
 	    if (!initialized) {
 		pEv->type = XkbEventCode + XkbEventBase;
 		pEv->xkbType = XkbAccessXNotify;
@@ -538,7 +639,8 @@ CARD32		changedIndicators;
 	if ((!interest->client->clientGone) &&
 	    (interest->client->requestVector != InitialVector) &&
 	    (interest->client->xkbClientFlags&_XkbClientInitialized) &&
-	    (interest->namesNotifyMask&pEv->changed)) {
+	    (interest->namesNotifyMask&pEv->changed) &&
+            XIShouldNotify(interest->client, kbd)) {
 	    if (!initialized) {
 		pEv->type = XkbEventCode + XkbEventBase;
 		pEv->xkbType = XkbNamesNotify;
@@ -583,7 +685,8 @@ CARD16		firstSI = 0, nSI = 0, nTotalSI = 0;
 	if ((!interest->client->clientGone) &&
 	    (interest->client->requestVector != InitialVector) &&
 	    (interest->client->xkbClientFlags&_XkbClientInitialized) &&
-	    (interest->compatNotifyMask)) {
+	    (interest->compatNotifyMask) &&
+            XIShouldNotify(interest->client, kbd)) {
 	    if (!initialized) {
 		pEv->type = XkbEventCode + XkbEventBase;
 		pEv->xkbType = XkbCompatMapNotify;
@@ -635,7 +738,8 @@ Time 		 time = 0;
 	if ((!interest->client->clientGone) &&
 	    (interest->client->requestVector != InitialVector) &&
 	    (interest->client->xkbClientFlags&_XkbClientInitialized) &&
-	    (interest->actionMessageMask)) {
+	    (interest->actionMessageMask) &&
+            XIShouldNotify(interest->client, kbd)) {
 	    if (!initialized) {
 		pEv->type = XkbEventCode + XkbEventBase;
 		pEv->xkbType = XkbActionMessage;
@@ -681,7 +785,8 @@ CARD16		 reason;
 	if ((!interest->client->clientGone) &&
 	    (interest->client->requestVector != InitialVector) &&
 	    (interest->client->xkbClientFlags&_XkbClientInitialized) &&
-	    (interest->extDevNotifyMask&reason)) {
+	    (interest->extDevNotifyMask&reason) &&
+            XIShouldNotify(interest->client, dev)) {
 	    if (!initialized) {
 		pEv->type = XkbEventCode + XkbEventBase;
 		pEv->xkbType = XkbExtensionDeviceNotify;
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index b07dceb..89d3825 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -563,41 +563,52 @@ XkbSetRepeatKeys(DeviceIntPtr pXDev,int key,int onoff)
     return;
 }
 
+/* Applies a change to a single device, does not traverse the device tree. */
 void
-XkbApplyMappingChange(	DeviceIntPtr	kbd,
-			CARD8		 request,
-			KeyCode		 firstKey,
-			CARD8		 num,
-			ClientPtr	 client)
+XkbApplyMappingChange(DeviceIntPtr kbd, KeySymsPtr map, KeyCode first_key,
+                      CARD8 num_keys, CARD8 *modmap, ClientPtr client)
 {
-XkbEventCauseRec	cause;
-XkbChangesRec	 	changes;
-unsigned	 	check;
-
-    bzero(&changes,sizeof(XkbChangesRec));
-    check= 0;
-    if (request==MappingKeyboard) {
-	XkbSetCauseCoreReq(&cause,X_ChangeKeyboardMapping,client);
-	XkbUpdateKeyTypesFromCore(kbd,firstKey,num,&changes);
-	XkbUpdateActions(kbd,firstKey,num,&changes,&check,&cause);
-	if (check)
-	    XkbCheckSecondaryEffects(kbd->key->xkbInfo,check,&changes,&cause);
+    XkbDescPtr xkb = kbd->key->xkbInfo->desc;
+    XkbEventCauseRec cause;
+    XkbChangesRec changes;
+    unsigned int check;
+
+    memset(&changes, 0, sizeof(changes));
+    memset(&cause, 0, sizeof(cause));
+
+    if (map && first_key && num_keys) {
+        check = 0;
+        XkbSetCauseCoreReq(&cause, X_ChangeKeyboardMapping, client);
+
+        if (!SetKeySymsMap(&kbd->key->curKeySyms, map))
+            FatalError("XkbApplyMappingChange: failed to copy core keymap!\n");
+        XkbUpdateKeyTypesFromCore(kbd, first_key, num_keys, &changes);
+        XkbUpdateActions(kbd, first_key, num_keys, &changes, &check, &cause);
+
+        if (check)
+            XkbCheckSecondaryEffects(kbd->key->xkbInfo, 1, &changes, &cause);
     }
-    else if (request==MappingModifier) {
-	XkbDescPtr	xkb= kbd->key->xkbInfo->desc;
-
-	XkbSetCauseCoreReq(&cause,X_SetModifierMapping,client);
-	num = xkb->max_key_code-xkb->min_key_code+1;
-	changes.map.changed|= XkbModifierMapMask;
-	changes.map.first_modmap_key= xkb->min_key_code;
-	changes.map.num_modmap_keys= num;
-	XkbUpdateActions(kbd,xkb->min_key_code,num,&changes,&check,&cause);
-	if (check)
-	    XkbCheckSecondaryEffects(kbd->key->xkbInfo,check,&changes,&cause);
+
+    if (modmap) {
+        /* A keymap change can imply a modmap change, se we prefer the
+         * former. */
+        if (!cause.mjr)
+            XkbSetCauseCoreReq(&cause,X_SetModifierMapping,client);
+
+        check = 0;
+        num_keys = xkb->max_key_code - xkb->min_key_code + 1;
+        changes.map.changed |= XkbModifierMapMask;
+        changes.map.first_modmap_key = xkb->min_key_code;
+        changes.map.num_modmap_keys = num_keys;
+        memcpy(kbd->key->xkbInfo->desc->map->modmap, modmap, MAP_LENGTH);
+        XkbUpdateActions(kbd, xkb->min_key_code, num_keys, &changes, &check,
+                         &cause);
+
+        if (check)
+            XkbCheckSecondaryEffects(kbd->key->xkbInfo, 1, &changes, &cause);
     }
-    /* 3/26/94 (ef) -- XXX! Doesn't deal with input extension requests */
-    XkbSendNotification(kbd,&changes,&cause);
-    return;
+
+    XkbSendNotification(kbd, &changes, &cause);
 }
 
 void
@@ -2062,17 +2073,8 @@ _XkbCopyControls(XkbDescPtr src, XkbDescPtr dst)
  */
 
 Bool
-XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
+XkbCopyKeymap(XkbDescPtr dst, XkbDescPtr src)
 {
-    DeviceIntPtr pDev = NULL, tmpDev = NULL;
-    xkbMapNotify mn;
-    xkbNewKeyboardNotify nkn;
-    XkbEventCauseRec cause;
-    XkbChangesRec changes;
-    unsigned int check = 0;
-
-    memset(&changes, 0, sizeof(changes));
-    memset(&cause, 0, sizeof(cause));
 
     if (!src || !dst) {
         DebugF("XkbCopyKeymap: src (%p) or dst (%p) is NULL\n", src, dst);
@@ -2111,79 +2113,36 @@ XkbCopyKeymap(XkbDescPtr src, XkbDescPtr dst, Bool sendNotifies)
         return FALSE;
     }
 
-    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("[xkb] XkbCopyKeymap: asked for notifies, but can't find device!\n");
-        }
-        else {
-            /* send NewKeyboardNotify if the keycode range changed, else
-             * 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)) {
-                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
-            {
-                mn.deviceID = pDev->id;
-                mn.minKeyCode = src->min_key_code;
-                mn.maxKeyCode = src->max_key_code;
-                mn.firstType = 0;
-                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 = 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);
-            }
-
-            XkbUpdateActions(pDev, dst->min_key_code,
-                             XkbNumKeys(pDev->key->xkbInfo->desc), &changes,
-                             &check, &cause);
-            if (check)
-                XkbCheckSecondaryEffects(pDev->key->xkbInfo, check, &changes,
-                                         &cause);
-            memcpy(pDev->kbdfeed->ctrl.autoRepeats, dst->ctrls->per_key_repeat,
-                   XkbPerKeyBitArraySize);
-        }
-    }
-
     dst->min_key_code = src->min_key_code;
     dst->max_key_code = src->max_key_code;
 
     return TRUE;
 }
+
+Bool
+XkbCopyDeviceKeymap(DeviceIntPtr dst, DeviceIntPtr src)
+{
+    xkbNewKeyboardNotify nkn;
+    Bool ret;
+
+    if (!dst->key || !src->key)
+        return FALSE;
+
+    nkn.oldMinKeyCode = dst->key->xkbInfo->desc->min_key_code;
+    nkn.oldMaxKeyCode = dst->key->xkbInfo->desc->max_key_code;
+    nkn.deviceID = dst->id;
+    nkn.oldDeviceID = dst->id; /* maybe src->id? */
+    nkn.minKeyCode = src->key->xkbInfo->desc->min_key_code;
+    nkn.maxKeyCode = src->key->xkbInfo->desc->max_key_code;
+    nkn.requestMajor = XkbReqCode;
+    nkn.requestMinor = X_kbSetMap; /* Near enough's good enough. */
+    nkn.changed = XkbNKN_KeycodesMask;
+    if (src->key->xkbInfo->desc->geom)
+        nkn.changed |= XkbNKN_GeometryMask;
+
+    ret = XkbCopyKeymap(dst->key->xkbInfo->desc, src->key->xkbInfo->desc);
+    if (ret)
+        XkbSendNewKeyboardNotify(dst, &nkn);
+
+    return ret;
+}
commit 1d1a0f67eee330a286fbdef17e967ce8ea201548
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Oct 28 16:27:37 2008 +1100

    Xi: Introduce XIShouldNotify
    
    XIShouldNotify just lets you know if you should send an event for a
    keymap change (or similar) concerning a given device to a given client;
    at the moment, this is only for devices which are sending events to that
    client.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index f06aed0..da10040 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -95,6 +95,22 @@ static Bool MakeInputMasks(WindowPtr	/* pWin */
 /* Used to sture classes currently not in use by an MD */
 extern DevPrivateKey UnusedClassesPrivateKey;
 
+/*
+ * Only let the given client know of core events which will affect its
+ * interpretation of input events, if the client's ClientPointer (or the
+ * paired keyboard) is the current device.
+ */
+int
+XIShouldNotify(ClientPtr client, DeviceIntPtr dev)
+{
+    DeviceIntPtr current_ptr = PickPointer(client);
+    DeviceIntPtr current_kbd = GetPairedDevice(current_ptr);
+
+    if (dev == current_kbd || dev == current_ptr)
+        return 1;
+
+    return 0;
+}
 
 void
 RegisterOtherDevice(DeviceIntPtr device)
diff --git a/include/exevents.h b/include/exevents.h
index 8ddfbf9..abe1a5f 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -255,4 +255,9 @@ extern _X_EXPORT int XIPropToFloat(
         float **buf_return
 );
 
+/* For an event such as MappingNotify which affects client interpretation
+ * of input events sent by device dev, should we notify the client, or
+ * would it merely be irrelevant and confusing? */
+extern _X_EXPORT int XIShouldNotify(ClientPtr client, DeviceIntPtr dev);
+
 #endif /* EXEVENTS_H */
commit b5242789edb726bb539e4d42fa35bfdaca0025c9
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Aug 9 17:02:02 2008 +0300

    XKB: Simplify keymap writing a bit
    
    We don't need no temporary variable.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/xkb/xkbfmisc.c b/xkb/xkbfmisc.c
index 349c79a..be8accb 100644
--- a/xkb/xkbfmisc.c
+++ b/xkb/xkbfmisc.c
@@ -163,14 +163,13 @@ XkbWriteXKBKeymapForNames(	FILE *			file,
 				unsigned		want,
 				unsigned		need)
 {
-char *		name,*tmp;
+char *		tmp;
 unsigned	complete;
 XkbNamesPtr	old_names;
 int		multi_section;
 unsigned	wantNames,wantConfig,wantDflts;
 
     complete= 0;
-    name= "default";
     if (COMPLETE(names->keycodes))	complete|= XkmKeyNamesMask;
     if (COMPLETE(names->types))		complete|= XkmTypesMask;
     if (COMPLETE(names->compat))	complete|= XkmCompatMapMask;
@@ -292,15 +291,15 @@ unsigned	wantNames,wantConfig,wantDflts;
     multi_section= 1;
     if (((complete&XkmKeymapRequired)==XkmKeymapRequired)&&
 	((complete&(~XkmKeymapLegal))==0)) {
-	fprintf(file,"xkb_keymap \"%s\" {\n",name);
+	fprintf(file,"xkb_keymap \"default\" {\n");
     }
     else if (((complete&XkmSemanticsRequired)==XkmSemanticsRequired)&&
 	((complete&(~XkmSemanticsLegal))==0)) {
-	fprintf(file,"xkb_semantics \"%s\" {\n",name);
+	fprintf(file,"xkb_semantics \"default\" {\n");
     }
     else if (((complete&XkmLayoutRequired)==XkmLayoutRequired)&&
 	((complete&(~XkmLayoutLegal))==0)) {
-	fprintf(file,"xkb_layout \"%s\" {\n",name);
+	fprintf(file,"xkb_layout \"default\" {\n");
     }
     else if (XkmSingleSection(complete&(~XkmVirtualModsMask))) {
 	multi_section= 0;
@@ -310,41 +309,36 @@ unsigned	wantNames,wantConfig,wantDflts;
     }
 
     wantNames= complete&(~(wantConfig|wantDflts));
-    name= names->keycodes;
     if (wantConfig&XkmKeyNamesMask)
-	XkbWriteXKBKeycodes(file,xkb,False,False,_AddIncl,name);
+	XkbWriteXKBKeycodes(file,xkb,False,False,_AddIncl,names->keycodes);
     else if (wantDflts&XkmKeyNamesMask)
 	fprintf(stderr,"Default symbols not implemented yet!\n");
     else if (wantNames&XkmKeyNamesMask)
-	XkbWriteSectionFromName(file,"keycodes",name);
+	XkbWriteSectionFromName(file,"keycodes",names->keycodes);
 
-    name= names->types;
     if (wantConfig&XkmTypesMask)
-	XkbWriteXKBKeyTypes(file,xkb,False,False,_AddIncl,name);
+	XkbWriteXKBKeyTypes(file,xkb,False,False,_AddIncl,names->types);
     else if (wantDflts&XkmTypesMask)
 	fprintf(stderr,"Default types not implemented yet!\n");
     else if (wantNames&XkmTypesMask)
-	XkbWriteSectionFromName(file,"types",name);
+	XkbWriteSectionFromName(file,"types",names->types);
 
-    name= names->compat;
     if (wantConfig&XkmCompatMapMask)
-	XkbWriteXKBCompatMap(file,xkb,False,False,_AddIncl,name);
+	XkbWriteXKBCompatMap(file,xkb,False,False,_AddIncl,names->compat);
     else if (wantDflts&XkmCompatMapMask)
 	fprintf(stderr,"Default interps not implemented yet!\n");
     else if (wantNames&XkmCompatMapMask)
-	XkbWriteSectionFromName(file,"compatibility",name);
+	XkbWriteSectionFromName(file,"compatibility",names->compat);
 
-    name= names->symbols;
     if (wantConfig&XkmSymbolsMask)
-	XkbWriteXKBSymbols(file,xkb,False,False,_AddIncl,name);
+	XkbWriteXKBSymbols(file,xkb,False,False,_AddIncl,names->symbols);
     else if (wantNames&XkmSymbolsMask)
-	XkbWriteSectionFromName(file,"symbols",name);
+	XkbWriteSectionFromName(file,"symbols",names->symbols);
 
-    name= names->geometry;
     if (wantConfig&XkmGeometryMask)
-	XkbWriteXKBGeometry(file,xkb,False,False,_AddIncl,name);
+	XkbWriteXKBGeometry(file,xkb,False,False,_AddIncl,names->geometry);
     else if (wantNames&XkmGeometryMask)
-	XkbWriteSectionFromName(file,"geometry",name);
+	XkbWriteSectionFromName(file,"geometry",names->geometry);
 
     if (multi_section)
 	fprintf(file,"};\n");
commit feb757f384382c7782ceac55f99d54c7caadbd9d
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Apr 25 19:54:29 2008 +0300

    XKB: Sanitise vmods for redirected keys
    
    Turn two unsigned chars into one unsigned int for both vmods and the
    vmod mask.  As a bonus, remove broken unused accessor macro for setting
    the vmods.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbstr.h b/include/xkbstr.h
index 0a49ee1..ec19b30 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -194,23 +194,10 @@ typedef struct	_XkbRedirectKeyAction {
 	unsigned char	new_key;
 	unsigned char	mods_mask;
 	unsigned char	mods;
-        /* FIXME: Make this an int. */
-	unsigned char	vmods_mask0;
-	unsigned char	vmods_mask1;
-	unsigned char	vmods0;
-	unsigned char	vmods1;
+	unsigned int	vmods_mask;
+	unsigned int	vmods;
 } XkbRedirectKeyAction;
 
-#define	XkbSARedirectVMods(a)		((((unsigned int)(a)->vmods1)<<8)|\
-					((unsigned int)(a)->vmods0))
-/* FIXME: This is blatantly not setting vmods.   Yeesh. */
-#define	XkbSARedirectSetVMods(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
-					 ((a)->vmods_mask0=((m)&0xff)))
-#define	XkbSARedirectVModsMask(a)	((((unsigned int)(a)->vmods_mask1)<<8)|\
-					((unsigned int)(a)->vmods_mask0))
-#define	XkbSARedirectSetVModsMask(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
-					 ((a)->vmods_mask0=((m)&0xff)))
-
 typedef struct _XkbDeviceBtnAction {
 	unsigned char	type;
 	unsigned char	flags;
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 4eb6b0b..9a138b0 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -833,8 +833,8 @@ ProcessInputProc backupproc;
 	ev.u.u.type = KeyPress;
 	ev.u.u.detail = pAction->redirect.new_key;
 
-        mask= XkbSARedirectVModsMask(&pAction->redirect);
-        mods= XkbSARedirectVMods(&pAction->redirect);
+        mask= pAction->redirect.vmods_mask;
+        mods= pAction->redirect.vmods;
         if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
         if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
         mask|= pAction->redirect.mods_mask;
@@ -865,8 +865,8 @@ ProcessInputProc backupproc;
 	ev.u.u.type = KeyRelease;
 	ev.u.u.detail = filter->upAction.redirect.new_key;
 
-        mask= XkbSARedirectVModsMask(&filter->upAction.redirect);
-        mods= XkbSARedirectVMods(&filter->upAction.redirect);
+        mask= filter->upAction.redirect.vmods_mask;
+        mods= filter->upAction.redirect.vmods;
         if (mask) XkbVirtualModsToReal(xkbi->desc,mask,&mask);
         if (mods) XkbVirtualModsToReal(xkbi->desc,mods,&mods);
         mask|= filter->upAction.redirect.mods_mask;
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index e91ab2e..b9f16a8 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -1006,8 +1006,8 @@ unsigned		vmods,vmods_mask;
 
     act= &action->redirect;
     kc= act->new_key;
-    vmods= XkbSARedirectVMods(act);
-    vmods_mask= XkbSARedirectVModsMask(act);
+    vmods= act->vmods;
+    vmods_mask= act->vmods_mask;
     if (xkb && xkb->names && xkb->names->keys && (kc<=xkb->max_key_code) &&
 				(xkb->names->keys[kc].name[0]!='\0')) {
 	char *kn;
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index e4d3d4d..a6fdc6f 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -512,10 +512,10 @@ XkbAction               *act;
             act->redirect.new_key = wire.actionData[0];
             act->redirect.mods_mask = wire.actionData[1];
             act->redirect.mods = wire.actionData[2];
-            act->redirect.vmods_mask0 = wire.actionData[3];
-            act->redirect.vmods_mask1 = wire.actionData[4];
-            act->redirect.vmods0 = wire.actionData[4];
-            act->redirect.vmods1 = wire.actionData[5];
+            act->redirect.vmods_mask = (wire.actionData[3] << 8) | \
+                                       wire.actionData[4];
+            act->redirect.vmods = (wire.actionData[5] << 8) | \
+                                  wire.actionData[6];
             break;
         case XkbSA_DeviceValuator:
             act->devval.device = wire.actionData[0];
commit b5f49382fe48f0a762d9a15fb10a7d7e1183fc8d
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Apr 25 19:52:11 2008 +0300

    XKB: Sanitise ctrls action
    
    Turn four unsigned chars into one unsigned long.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbstr.h b/include/xkbstr.h
index 193f276..0a49ee1 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -180,20 +180,8 @@ typedef struct _XkbSwitchScreenAction {
 typedef struct _XkbCtrlsAction {
 	unsigned char	type;
 	unsigned char	flags;
-        /* FIXME: Make this an int. */
-	unsigned char	ctrls3;
-	unsigned char	ctrls2;
-	unsigned char	ctrls1;
-	unsigned char	ctrls0;
+	unsigned long	ctrls;
 } XkbCtrlsAction;
-#define	XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \
-                                 (a)->ctrls2 = ((c) >> 16) & 0xff, \
-                                 (a)->ctrls1 = ((c) >> 8) & 0xff, \
-                                 (a)->ctrls0 = (c) & 0xff)
-#define	XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
-			   (((unsigned int)(a)->ctrls2)<<16)|\
-			   (((unsigned int)(a)->ctrls1)<<8)|\
-                           ((unsigned int) (a)->ctrls0))
 
 typedef struct _XkbMessageAction {
 	unsigned char	type;
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index cd26887..4eb6b0b 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -671,7 +671,7 @@ XkbEventCauseRec	cause;
 	filter->keycode = keycode;
 	filter->active = 1;
 	filter->filterOthers = 0;
-	change= XkbActionCtrls(&pAction->ctrls);
+	change= pAction->ctrls.ctrls;
 	filter->priv = change;
 	filter->filter = _XkbFilterControls;
 	filter->upAction = *pAction;
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index debc2f9..e91ab2e 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -890,7 +890,7 @@ unsigned		tmp;
 char			tbuf[32];
 
     act= &action->ctrls;
-    tmp= XkbActionCtrls(act);
+    tmp= act->ctrls;
     TryCopyStr(buf,"controls=",sz);
     if (tmp==0)
 	TryCopyStr(buf,"none",sz);
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index 9ba14c4..e4d3d4d 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -503,10 +503,10 @@ XkbAction               *act;
         case XkbSA_SetControls:
         case XkbSA_LockControls:
             act->ctrls.flags = wire.actionData[0];
-            act->ctrls.ctrls3 = wire.actionData[1];
-            act->ctrls.ctrls2 = wire.actionData[2];
-            act->ctrls.ctrls1 = wire.actionData[3];
-            act->ctrls.ctrls0 = wire.actionData[4];
+            act->ctrls.ctrls = (wire.actionData[1] << 24) | \
+                               (wire.actionData[2] << 16) | \
+                               (wire.actionData[3] << 8) | \
+                               wire.actionData[4];
             break;
         case XkbSA_RedirectKey:
             act->redirect.new_key = wire.actionData[0];
commit 1bd7fd195d85681e722161f8c636a28f11b40abb
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Apr 25 19:50:12 2008 +0300

    XKB: Sanitise pointer actions
    
    Turn two unsigned chars into one int.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbstr.h b/include/xkbstr.h
index c1752a3..193f276 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -149,16 +149,9 @@ typedef struct _XkbISOAction {
 typedef struct _XkbPtrAction {
 	unsigned char	type;
 	unsigned char	flags;
-        /* FIXME: Make this an int. */
-	unsigned char	high_XXX;
-	unsigned char	low_XXX;
-	unsigned char	high_YYY;
-	unsigned char	low_YYY;
+	int	        x;
+	int	        y;
 } XkbPtrAction;
-#define	XkbPtrActionX(a)      (Xkb2CharsToInt((a)->high_XXX,(a)->low_XXX))
-#define	XkbPtrActionY(a)      (Xkb2CharsToInt((a)->high_YYY,(a)->low_YYY))
-#define	XkbSetPtrActionX(a,x) (XkbIntTo2Chars(x,(a)->high_XXX,(a)->low_XXX))
-#define	XkbSetPtrActionY(a,y) (XkbIntTo2Chars(y,(a)->high_YYY,(a)->low_YYY))
 
 typedef struct _XkbPtrBtnAction {
 	unsigned char	type;
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index c46bd84..cd26887 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -523,15 +523,15 @@ Bool	accel;
 	xkbi->mouseKeysCounter= 0;
 	xkbi->mouseKey= keycode;
 	accel= ((pAction->ptr.flags&XkbSA_NoAcceleration)==0);
-	x= XkbPtrActionX(&pAction->ptr);
-	y= XkbPtrActionY(&pAction->ptr);
+	x= pAction->ptr.x;
+	y= pAction->ptr.y;
 	XkbDDXFakePointerMotion(pAction->ptr.flags,x,y);
 	AccessXCancelRepeatKey(xkbi,keycode);
 	xkbi->mouseKeysAccel= accel&&
 		(xkbi->desc->ctrls->enabled_ctrls&XkbMouseKeysAccelMask);
 	xkbi->mouseKeysFlags= pAction->ptr.flags;
-	xkbi->mouseKeysDX= XkbPtrActionX(&pAction->ptr);
-	xkbi->mouseKeysDY= XkbPtrActionY(&pAction->ptr);
+	xkbi->mouseKeysDX= x;
+	xkbi->mouseKeysDY= y;
 	xkbi->mouseKeyTimer= TimerSet(xkbi->mouseKeyTimer, 0,
 				xkbi->desc->ctrls->mk_delay,
 				_XkbPtrAccelExpire,(pointer)xkbi);
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index 213dbb7..debc2f9 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -731,8 +731,8 @@ int		x,y;
 char		tbuf[32];
 
     act= &action->ptr;
-    x= XkbPtrActionX(act);
-    y= XkbPtrActionY(act);
+    x= act->x;
+    y= act->y;
     if ((act->flags&XkbSA_MoveAbsoluteX)||(x<0))
 	 sprintf(tbuf,"x=%d",x);
     else sprintf(tbuf,"x=+%d",x);
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index ff0537e..9ba14c4 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -467,10 +467,8 @@ XkbAction               *act;
             break;
         case XkbSA_MovePtr:
             act->ptr.flags = wire.actionData[0];
-            act->ptr.high_XXX = wire.actionData[1];
-            act->ptr.low_XXX = wire.actionData[2];
-            act->ptr.high_YYY = wire.actionData[3];
-            act->ptr.low_YYY = wire.actionData[4];
+            act->ptr.x = (wire.actionData[1] << 8) | wire.actionData[2];
+            act->ptr.y = (wire.actionData[3] << 8) | wire.actionData[4];
             break;
         case XkbSA_PtrBtn:
         case XkbSA_LockPtrBtn:
commit 61c508fa78aa08ea2666fde950fbafad95d65056
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Apr 25 19:47:16 2008 +0300

    XKB: Sanitise vmods in actions
    
    Turn vmods from two unsigned chars into one int.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbstr.h b/include/xkbstr.h
index 4afe010..c1752a3 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -123,14 +123,8 @@ typedef struct _XkbModAction {
 	unsigned char	flags;
 	unsigned char	mask;
 	unsigned char	real_mods;
-        /* FIXME: Make this an int. */
-	unsigned char	vmods1;
-	unsigned char	vmods2;
+        unsigned int    vmods;
 } XkbModAction;
-#define	XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2))
-#define	XkbSetModActionVMods(a,v) \
-	((a)->vmods1 = (((v) >> 8) & 0xff), \
-         (a)->vmods2 = (v) & 0xff)
 
 typedef struct _XkbGroupAction {
 	unsigned char	type;
@@ -149,8 +143,7 @@ typedef struct _XkbISOAction {
         /* FIXME: Make this an int. */
 	char		group_XXX;
 	unsigned char	affect;
-	unsigned char	vmods1;
-	unsigned char	vmods2;
+	unsigned int	vmods;
 } XkbISOAction;
 
 typedef struct _XkbPtrAction {
diff --git a/xkb/XKBMisc.c b/xkb/XKBMisc.c
index 078f241..82d37d1 100644
--- a/xkb/XKBMisc.c
+++ b/xkb/XKBMisc.c
@@ -343,7 +343,7 @@ unsigned	tmp;
 	case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
 	    if (act->mods.flags&XkbSA_UseModMapMods)
 		act->mods.real_mods= act->mods.mask= mods;
-	    if ((tmp= XkbModActionVMods(&act->mods))!=0) {
+	    if ((tmp= act->mods.vmods)!=0) {
 		XkbVirtualModsToReal(xkb,tmp,&tmp);
 		act->mods.mask|= tmp;
 	    }
@@ -351,7 +351,7 @@ unsigned	tmp;
 	case XkbSA_ISOLock:
 	    if (act->iso.flags&XkbSA_UseModMapMods)
 		act->iso.real_mods= act->iso.mask= mods;
-	    if ((tmp= XkbModActionVMods(&act->iso))!=0) {
+	    if ((tmp= act->iso.vmods)!=0) {
 		XkbVirtualModsToReal(xkb,tmp,&tmp);
 		act->iso.mask|= tmp;
 	    }
@@ -666,7 +666,7 @@ unsigned int	tmp;
 
     switch (act->type) {
 	case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
-	    if (((tmp= XkbModActionVMods(&act->mods))&changed)!=0) {
+	    if (((tmp= act->mods.vmods)&changed)!=0) {
 		XkbVirtualModsToReal(xkb,tmp,&tmp);
 		act->mods.mask= act->mods.real_mods;
 		act->mods.mask|= tmp;
@@ -674,7 +674,7 @@ unsigned int	tmp;
 	    }
 	    break;
 	case XkbSA_ISOLock:
-	    if ((((tmp= XkbModActionVMods(&act->iso))!=0)&changed)!=0) {
+	    if ((((tmp= act->iso.vmods)!=0)&changed)!=0) {
 		XkbVirtualModsToReal(xkb,tmp,&tmp);
 		act->iso.mask= act->iso.real_mods;
 		act->iso.mask|= tmp;
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index d03195f..b07dceb 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -183,13 +183,13 @@ register unsigned	tmp;
 	case XkbSA_SetMods: case XkbSA_LatchMods: case XkbSA_LockMods:
 	    if (act->mods.flags&XkbSA_UseModMapMods)
 		act->mods.real_mods= act->mods.mask= mods;
-	    if ((tmp= XkbModActionVMods(&act->mods))!=0)
+	    if ((tmp= act->mods.vmods)!=0)
 		act->mods.mask|= XkbMaskForVMask(xkb,tmp);
 	    break;
 	case XkbSA_ISOLock:
 	    if (act->iso.flags&XkbSA_UseModMapMods)
 		act->iso.real_mods= act->iso.mask= mods;
-	    if ((tmp= XkbModActionVMods(&act->iso))!=0)
+	    if ((tmp= act->iso.vmods)!=0)
 		act->iso.mask|= XkbMaskForVMask(xkb,tmp);
 	    break;
     }
diff --git a/xkb/xkbtext.c b/xkb/xkbtext.c
index f9bfae5..213dbb7 100644
--- a/xkb/xkbtext.c
+++ b/xkb/xkbtext.c
@@ -678,7 +678,7 @@ XkbModAction *	act;
 unsigned	tmp;
 
     act= &action->mods;
-    tmp= XkbModActionVMods(act);
+    tmp= act->vmods;
     TryCopyStr(buf,"modifiers=",sz);
     if (act->flags&XkbSA_UseModMapMods)
 	  TryCopyStr(buf,"modMapMods",sz);
@@ -818,7 +818,7 @@ char		tbuf[64];
     }
     else {
 	unsigned tmp;
-	tmp= XkbModActionVMods(act);
+	tmp= act->vmods;
 	TryCopyStr(buf,"modifiers=",sz);
 	if (act->flags&XkbSA_UseModMapMods)
 	     TryCopyStr(buf,"modMapMods",sz);
diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index dc6e0d2..ff0537e 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -457,8 +457,7 @@ XkbAction               *act;
             act->mods.flags = wire.actionData[0];
             act->mods.mask = wire.actionData[1];
             act->mods.real_mods = wire.actionData[2];
-            act->mods.vmods1 = wire.actionData[3];
-            act->mods.vmods2 = wire.actionData[4];
+            act->mods.vmods = (wire.actionData[3] << 8) | wire.actionData[4];
             break;
         case XkbSA_SetGroup:
         case XkbSA_LatchGroup:
@@ -497,8 +496,7 @@ XkbAction               *act;
             act->iso.real_mods = wire.actionData[2];
             act->iso.group_XXX = wire.actionData[3];
             act->iso.affect = wire.actionData[4];
-            act->iso.vmods1 = wire.actionData[5];
-            act->iso.vmods2 = wire.actionData[6];
+            act->iso.vmods = (wire.actionData[5] << 8) | wire.actionData[6];
             break;
         case XkbSA_SwitchScreen:
             act->screen.flags = wire.actionData[0];
commit 4f3078df2acf07364a17f738bc5c32f9a5962723
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Aug 9 16:50:22 2008 +0300

    XKB: Add a hell of a lot more FIXMEs
    
    For some reason, we insist on having daft internal representations that
    make no sense, that always have to be converted to be used.  We should
    really sort this one out.
    
    Also, comment the hojillion members of XkbStateRec.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/include/xkbstr.h b/include/xkbstr.h
index ba7debb..4afe010 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -29,12 +29,13 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 #include <X11/extensions/XKB.h>
 
-#define	XkbCharToInt(v)		((v)&0x80?(int)((v)|(~0xff)):(int)((v)&0x7f))
-#define	XkbIntTo2Chars(i,h,l)	(((h)=((i>>8)&0xff)),((l)=((i)&0xff)))
+#define	XkbCharToInt(v) ((int) ((v) & 0x80 ? ((v) | (~0xff)) : ((v) & 0x7f)))
+#define	XkbIntTo2Chars(i, h, l) ((h) = (i >> 8) & 0xff, (l) = (i) & 0xff)
 
 #if defined(WORD64) && defined(UNSIGNEDBITFIELDS)
-#define	Xkb2CharsToInt(h,l)	((h)&0x80?(int)(((h)<<8)|(l)|(~0xffff)):\
-					  (int)(((h)<<8)|(l)&0x7fff))
+#define	Xkb2CharsToInt(h, l) ((int) ((h) & 0x80 ? \
+                              (((h) << 8) | (l) | (~0xffff)) : \
+                              (((h) << 8) | (l) & 0x7fff))
 #else
 #define	Xkb2CharsToInt(h,l)	((short)(((h)<<8)|(l)))
 #endif
@@ -44,20 +45,30 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 	 */
 
 typedef struct _XkbStateRec {
-	unsigned char	group;
+	unsigned char   group; /* base + latched + locked */
+	/* FIXME: Why are base + latched short and not char?? */
+	unsigned short  base_group; /* physically ... down? */
+	unsigned short  latched_group;
 	unsigned char   locked_group;
-	unsigned short	base_group;
-	unsigned short	latched_group;
-	unsigned char	mods;
-	unsigned char	base_mods;
-	unsigned char	latched_mods;
-	unsigned char	locked_mods;
-	unsigned char	compat_state;
-	unsigned char	grab_mods;
-	unsigned char	compat_grab_mods;
-	unsigned char	lookup_mods;
-	unsigned char	compat_lookup_mods;
-	unsigned short	ptr_buttons;
+
+	unsigned char   mods; /* base + latched + locked */
+	unsigned char   base_mods; /* physically down */
+	unsigned char   latched_mods;
+	unsigned char   locked_mods;
+
+	unsigned char   compat_state; /* mods + group for core state */
+
+	/* grab mods = all depressed and latched mods, _not_ locked mods */
+	unsigned char   grab_mods; /* grab mods minus internal mods */
+	unsigned char   compat_grab_mods; /* grab mods + group for core state,
+	                                     but not locked groups if
+                                             IgnoreGroupLocks set */
+
+	/* effective mods = all mods (depressed, latched, locked) */
+	unsigned char   lookup_mods; /* effective mods minus internal mods */
+	unsigned char   compat_lookup_mods; /* effective mods + group */
+
+	unsigned short  ptr_buttons; /* core pointer buttons */
 } XkbStateRec,*XkbStatePtr;
 #define	XkbStateFieldFromRec(s)	XkbBuildCoreState((s)->lookup_mods,(s)->group)
 #define	XkbGrabStateFromRec(s)	XkbBuildCoreState((s)->grab_mods,(s)->group)
@@ -88,7 +99,8 @@ typedef struct _XkbKeyType {
 #define	XkbOutOfRangeGroupInfo(g)	((g)&0xf0)
 #define	XkbOutOfRangeGroupAction(g)	((g)&0xc0)
 #define	XkbOutOfRangeGroupNumber(g)	(((g)&0x30)>>4)
-#define	XkbSetGroupInfo(g,w,n)	(((w)&0xc0)|(((n)&3)<<4)|((g)&0x0f))
+#define	XkbSetGroupInfo(g, w, n) (((w) & 0xc0) | (((n) & 3) << 4) | \
+                                  ((g) & 0x0f))
 #define	XkbSetNumGroups(g,n)	(((g)&0xf0)|((n)&0x0f))
 
 	/*
@@ -111,17 +123,19 @@ typedef struct _XkbModAction {
 	unsigned char	flags;
 	unsigned char	mask;
 	unsigned char	real_mods;
+        /* FIXME: Make this an int. */
 	unsigned char	vmods1;
 	unsigned char	vmods2;
 } XkbModAction;
-#define	XkbModActionVMods(a)      \
-	((short)(((a)->vmods1<<8)|((a)->vmods2)))
+#define	XkbModActionVMods(a) ((short) (((a)->vmods1 << 8) | (a)->vmods2))
 #define	XkbSetModActionVMods(a,v) \
-	(((a)->vmods1=(((v)>>8)&0xff)),(a)->vmods2=((v)&0xff))
+	((a)->vmods1 = (((v) >> 8) & 0xff), \
+         (a)->vmods2 = (v) & 0xff)
 
 typedef struct _XkbGroupAction {
 	unsigned char	type;
 	unsigned char	flags;
+        /* FIXME: Make this an int. */
 	char		group_XXX;
 } XkbGroupAction;
 #define	XkbSAGroup(a)		(XkbCharToInt((a)->group_XXX))
@@ -132,6 +146,7 @@ typedef struct _XkbISOAction {
 	unsigned char	flags;
 	unsigned char	mask;
 	unsigned char	real_mods;
+        /* FIXME: Make this an int. */
 	char		group_XXX;
 	unsigned char	affect;
 	unsigned char	vmods1;
@@ -141,6 +156,7 @@ typedef struct _XkbISOAction {
 typedef struct _XkbPtrAction {
 	unsigned char	type;
 	unsigned char	flags;
+        /* FIXME: Make this an int. */
 	unsigned char	high_XXX;
 	unsigned char	low_XXX;
 	unsigned char	high_YYY;
@@ -165,7 +181,7 @@ typedef struct _XkbPtrDfltAction {
 	char		valueXXX;
 } XkbPtrDfltAction;
 #define	XkbSAPtrDfltValue(a)		(XkbCharToInt((a)->valueXXX))
-#define	XkbSASetPtrDfltValue(a,c)	((a)->valueXXX= ((c)&0xff))
+#define	XkbSASetPtrDfltValue(a, c) ((a)->valueXXX = (c) & 0xff)
 
 typedef struct _XkbSwitchScreenAction {
 	unsigned char	type;
@@ -173,24 +189,25 @@ typedef struct _XkbSwitchScreenAction {
 	char		screenXXX;
 } XkbSwitchScreenAction;
 #define	XkbSAScreen(a)			(XkbCharToInt((a)->screenXXX))
-#define	XkbSASetScreen(a,s)		((a)->screenXXX= ((s)&0xff))
+#define	XkbSASetScreen(a, s) ((a)->screenXXX = (s) & 0xff)
 
 typedef struct _XkbCtrlsAction {
 	unsigned char	type;
 	unsigned char	flags;
+        /* FIXME: Make this an int. */
 	unsigned char	ctrls3;
 	unsigned char	ctrls2;
 	unsigned char	ctrls1;
 	unsigned char	ctrls0;
 } XkbCtrlsAction;
-#define	XkbActionSetCtrls(a,c)	(((a)->ctrls3=(((c)>>24)&0xff)),\
-					((a)->ctrls2=(((c)>>16)&0xff)),\
-					((a)->ctrls1=(((c)>>8)&0xff)),\
-					((a)->ctrls0=((c)&0xff)))
+#define	XkbActionSetCtrls(a, c) ((a)->ctrls3 = ((c) >> 24) & 0xff, \
+                                 (a)->ctrls2 = ((c) >> 16) & 0xff, \
+                                 (a)->ctrls1 = ((c) >> 8) & 0xff, \
+                                 (a)->ctrls0 = (c) & 0xff)
 #define	XkbActionCtrls(a) ((((unsigned int)(a)->ctrls3)<<24)|\
 			   (((unsigned int)(a)->ctrls2)<<16)|\
 			   (((unsigned int)(a)->ctrls1)<<8)|\
-			   ((unsigned int)((a)->ctrls0)))
+                           ((unsigned int) (a)->ctrls0))
 
 typedef struct _XkbMessageAction {
 	unsigned char	type;
@@ -203,6 +220,7 @@ typedef struct	_XkbRedirectKeyAction {
 	unsigned char	new_key;
 	unsigned char	mods_mask;
 	unsigned char	mods;
+        /* FIXME: Make this an int. */
 	unsigned char	vmods_mask0;
 	unsigned char	vmods_mask1;
 	unsigned char	vmods0;
@@ -211,6 +229,7 @@ typedef struct	_XkbRedirectKeyAction {
 
 #define	XkbSARedirectVMods(a)		((((unsigned int)(a)->vmods1)<<8)|\
 					((unsigned int)(a)->vmods0))
+/* FIXME: This is blatantly not setting vmods.   Yeesh. */
 #define	XkbSARedirectSetVMods(a,m)	(((a)->vmods_mask1=(((m)>>8)&0xff)),\
 					 ((a)->vmods_mask0=((m)&0xff)))
 #define	XkbSARedirectVModsMask(a)	((((unsigned int)(a)->vmods_mask1)<<8)|\
@@ -281,7 +300,8 @@ typedef	struct _XkbControls {
 
 #define	XkbAX_AnyFeedback(c)	((c)->enabled_ctrls&XkbAccessXFeedbackMask)
 #define	XkbAX_NeedOption(c,w)	((c)->ax_options&(w))
-#define	XkbAX_NeedFeedback(c,w)	(XkbAX_AnyFeedback(c)&&XkbAX_NeedOption(c,w))
+#define	XkbAX_NeedFeedback(c, w) (XkbAX_AnyFeedback((c)) && \
+                                  XkbAX_NeedOption((c), (w)))
 
 typedef struct _XkbServerMapRec {
 	unsigned short		 num_acts;
@@ -300,7 +320,7 @@ typedef struct _XkbServerMapRec {
 	unsigned short		*vmodmap;
 } XkbServerMapRec, *XkbServerMapPtr;
 
-#define	XkbSMKeyActionsPtr(m,k) (&(m)->acts[(m)->key_acts[k]])
+#define	XkbSMKeyActionsPtr(m, k) (&(m)->acts[(m)->key_acts[(k)]])
 
 	/*
 	 * Structures and access macros used primarily by clients
@@ -326,15 +346,16 @@ typedef struct _XkbClientMapRec {
 	unsigned char		*modmap;
 } XkbClientMapRec, *XkbClientMapPtr;
 
-#define	XkbCMKeyGroupInfo(m,k)  ((m)->key_sym_map[k].group_info)
-#define	XkbCMKeyNumGroups(m,k)	 (XkbNumGroups((m)->key_sym_map[k].group_info))
-#define	XkbCMKeyGroupWidth(m,k,g) (XkbCMKeyType(m,k,g)->num_levels)
-#define	XkbCMKeyGroupsWidth(m,k) ((m)->key_sym_map[k].width)
-#define	XkbCMKeyTypeIndex(m,k,g) ((m)->key_sym_map[k].kt_index[g&0x3])
-#define	XkbCMKeyType(m,k,g)	 (&(m)->types[XkbCMKeyTypeIndex(m,k,g)])
-#define	XkbCMKeyNumSyms(m,k) (XkbCMKeyGroupsWidth(m,k)*XkbCMKeyNumGroups(m,k))
-#define	XkbCMKeySymsOffset(m,k)	((m)->key_sym_map[k].offset)
-#define	XkbCMKeySymsPtr(m,k)	(&(m)->syms[XkbCMKeySymsOffset(m,k)])
+#define	XkbCMKeyGroupInfo(m, k) ((m)->key_sym_map[(k)].group_info)
+#define	XkbCMKeyNumGroups(m, k) (XkbNumGroups((m)->key_sym_map[(k)].group_info))
+#define	XkbCMKeyGroupWidth(m, k, g) (XkbCMKeyType((m), (k), (g))->num_levels)
+#define	XkbCMKeyGroupsWidth(m, k) ((m)->key_sym_map[(k)].width)
+#define	XkbCMKeyTypeIndex(m, k, g) ((m)->key_sym_map[(k)].kt_index[(g) & 0x3])
+#define	XkbCMKeyType(m, k, g) (&(m)->types[XkbCMKeyTypeIndex((m), (k), (g))])
+#define	XkbCMKeyNumSyms(m, k) (XkbCMKeyGroupsWidth((m), (k)) * \
+                               XkbCMKeyNumGroups((m), (k)))
+#define	XkbCMKeySymsOffset(m, k) ((m)->key_sym_map[(k)].offset)
+#define	XkbCMKeySymsPtr(m, k) (&(m)->syms[XkbCMKeySymsOffset((m), (k))])
 
 	/*
 	 * Compatibility structures and access macros
@@ -358,6 +379,8 @@ typedef struct _XkbCompatMapRec {
 
 typedef struct _XkbIndicatorMapRec {
 	unsigned char	flags;
+        /* FIXME: For some reason, interepretation of groups is wildly
+         *        different between which being base/latched/locked. */
 	unsigned char	which_groups;
 	unsigned char	groups;
 	unsigned char	which_mods;
@@ -365,12 +388,12 @@ typedef struct _XkbIndicatorMapRec {
 	unsigned int	ctrls;
 } XkbIndicatorMapRec, *XkbIndicatorMapPtr;
 
-#define	XkbIM_IsAuto(i)	((((i)->flags&XkbIM_NoAutomatic)==0)&&\
+#define	XkbIM_IsAuto(i)	(!((i)->flags & XkbIM_NoAutomatic) && \
 			    (((i)->which_groups&&(i)->groups)||\
 			     ((i)->which_mods&&(i)->mods.mask)||\
-			     ((i)->ctrls)))
-#define	XkbIM_InUse(i)	(((i)->flags)||((i)->which_groups)||\
-					((i)->which_mods)||((i)->ctrls))
+                          (i)->ctrls))
+#define	XkbIM_InUse(i)	((i)->flags || (i)->which_groups || (i)->which_mods || \
+                         (i)->ctrls)
 	
 
 typedef struct _XkbIndicatorRec {
@@ -428,28 +451,30 @@ typedef	struct _XkbDesc {
 	XkbCompatMapPtr		compat;
 	XkbGeometryPtr		geom;
 } XkbDescRec, *XkbDescPtr;
-#define	XkbKeyKeyTypeIndex(d,k,g)	(XkbCMKeyTypeIndex((d)->map,k,g))
-#define	XkbKeyKeyType(d,k,g)		(XkbCMKeyType((d)->map,k,g))
-#define	XkbKeyGroupWidth(d,k,g)		(XkbCMKeyGroupWidth((d)->map,k,g))
-#define	XkbKeyGroupsWidth(d,k)		(XkbCMKeyGroupsWidth((d)->map,k))
+#define	XkbKeyKeyTypeIndex(d, k, g)	(XkbCMKeyTypeIndex((d)->map, (k), (g)))
+#define	XkbKeyKeyType(d, k, g)		(XkbCMKeyType((d)->map, (k), (g)))
+#define	XkbKeyGroupWidth(d, k, g)	(XkbCMKeyGroupWidth((d)->map, (k), (g)))
+#define	XkbKeyGroupsWidth(d, k)		(XkbCMKeyGroupsWidth((d)->map, (k)))
 #define	XkbKeyGroupInfo(d,k)		(XkbCMKeyGroupInfo((d)->map,(k)))
 #define	XkbKeyNumGroups(d,k)		(XkbCMKeyNumGroups((d)->map,(k)))
 #define	XkbKeyNumSyms(d,k)		(XkbCMKeyNumSyms((d)->map,(k)))
 #define	XkbKeySymsPtr(d,k)		(XkbCMKeySymsPtr((d)->map,(k)))
-#define	XkbKeySym(d,k,n)		(XkbKeySymsPtr(d,k)[n])
+#define	XkbKeySym(d, k, n)		(XkbKeySymsPtr((d), (k))[(n)])
 #define	XkbKeySymEntry(d,k,sl,g) \
-	(XkbKeySym(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))))
+    (XkbKeySym((d), (k), (XkbKeyGroupsWidth((d), (k)) * (g)) + (sl)))
 #define	XkbKeyAction(d,k,n) \
-	(XkbKeyHasActions(d,k)?&XkbKeyActionsPtr(d,k)[n]:NULL)
+    (XkbKeyHasActions((d), (k)) ? & XkbKeyActionsPtr((d), (k))[(n)] : NULL)
 #define	XkbKeyActionEntry(d,k,sl,g) \
-	(XkbKeyHasActions(d,k)?\
-		XkbKeyAction(d,k,((XkbKeyGroupsWidth(d,k)*(g))+(sl))):NULL)
-
-#define	XkbKeyHasActions(d,k)	((d)->server->key_acts[k]!=0)
-#define	XkbKeyNumActions(d,k)	(XkbKeyHasActions(d,k)?XkbKeyNumSyms(d,k):1)
-#define	XkbKeyActionsPtr(d,k)	(XkbSMKeyActionsPtr((d)->server,k))
-#define	XkbKeycodeInRange(d,k)	(((k)>=(d)->min_key_code)&&\
-				 ((k)<=(d)->max_key_code))
+    (XkbKeyHasActions((d), (k)) ? \
+     XkbKeyAction((d), (k), ((XkbKeyGroupsWidth((d), (k)) * (g)) + (sl))) : \
+     NULL)
+
+#define	XkbKeyHasActions(d, k) (!!(d)->server->key_acts[(k)])
+#define	XkbKeyNumActions(d, k) (XkbKeyHasActions((d), (k)) ? \
+                                XkbKeyNumSyms((d), (k)) : 1)
+#define	XkbKeyActionsPtr(d, k) (XkbSMKeyActionsPtr((d)->server, (k)))
+#define	XkbKeycodeInRange(d, k) ((k) >= (d)->min_key_code && \
+				 (k) <= (d)->max_key_code)
 #define	XkbNumKeys(d)		((d)->max_key_code-(d)->min_key_code+1)
 
 
@@ -587,9 +612,9 @@ typedef struct _XkbDeviceInfo {
 	XkbDeviceLedInfoPtr	leds;
 } XkbDeviceInfoRec,*XkbDeviceInfoPtr;
 
-#define	XkbXI_DevHasBtnActs(d)	(((d)->num_btns>0)&&((d)->btn_acts!=NULL))
-#define	XkbXI_LegalDevBtn(d,b)	(XkbXI_DevHasBtnActs(d)&&((b)<(d)->num_btns))
-#define	XkbXI_DevHasLeds(d)	(((d)->num_leds>0)&&((d)->leds!=NULL))
+#define	XkbXI_DevHasBtnActs(d)	((d)->num_btns > 0 && (d)->btn_acts)
+#define	XkbXI_LegalDevBtn(d,b)	(XkbXI_DevHasBtnActs(d) && (b) < (d)->num_btns)
+#define	XkbXI_DevHasLeds(d)	((d)->num_leds > 0 && (d)->leds)
 
 typedef struct _XkbDeviceLedChanges {
 	unsigned short		led_class;
commit edeb033f29ae2d52e86c543ccbf22fb7ae1fdb7f
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Oct 15 18:07:52 2008 +0100

    XKB: Explicitly decode action data
    
    Rather than requiring a one-to-one correspondence between XKM and struct
    formats in action data, explicitly fill the action data, so we can break
    API.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkmread.c b/xkb/xkmread.c
index 1b6149b..dc6e0d2 100644
--- a/xkb/xkmread.c
+++ b/xkb/xkmread.c
@@ -417,6 +417,7 @@ xkmSymInterpretDesc	wire;
 unsigned		tmp;
 int			nRead=0;
 XkbCompatMapPtr		compat;
+XkbAction               *act;
 
     if ((tmp= XkmGetCountedString(file,name,100))<1) {
 	_XkbLibError(_XkbErrBadLength,"ReadXkmCompatMap",0);
@@ -447,13 +448,96 @@ XkbCompatMapPtr		compat;
 	interp->virtual_mod= wire.virtualMod;
 	interp->flags= wire.flags;
 	interp->act.type= wire.actionType;
-	interp->act.data[0]= wire.actionData[0];
-	interp->act.data[1]= wire.actionData[1];
-	interp->act.data[2]= wire.actionData[2];
-	interp->act.data[3]= wire.actionData[3];
-	interp->act.data[4]= wire.actionData[4];
-	interp->act.data[5]= wire.actionData[5];
-	interp->act.data[6]= wire.actionData[6];
+        act = (XkbAction *) &interp->act;
+
+        switch (interp->act.type) {
+        case XkbSA_SetMods:
+        case XkbSA_LatchMods:
+        case XkbSA_LockMods:
+            act->mods.flags = wire.actionData[0];
+            act->mods.mask = wire.actionData[1];
+            act->mods.real_mods = wire.actionData[2];
+            act->mods.vmods1 = wire.actionData[3];
+            act->mods.vmods2 = wire.actionData[4];
+            break;
+        case XkbSA_SetGroup:
+        case XkbSA_LatchGroup:
+        case XkbSA_LockGroup:
+            act->group.flags = wire.actionData[0];
+            act->group.group_XXX = wire.actionData[1];
+            break;
+        case XkbSA_MovePtr:
+            act->ptr.flags = wire.actionData[0];
+            act->ptr.high_XXX = wire.actionData[1];
+            act->ptr.low_XXX = wire.actionData[2];
+            act->ptr.high_YYY = wire.actionData[3];
+            act->ptr.low_YYY = wire.actionData[4];
+            break;
+        case XkbSA_PtrBtn:
+        case XkbSA_LockPtrBtn:
+            act->btn.flags = wire.actionData[0];
+            act->btn.count = wire.actionData[1];
+            act->btn.button = wire.actionData[2];
+            break;
+        case XkbSA_DeviceBtn:
+        case XkbSA_LockDeviceBtn:
+            act->devbtn.flags = wire.actionData[0];
+            act->devbtn.count = wire.actionData[1];
+            act->devbtn.button = wire.actionData[2];
+            act->devbtn.device = wire.actionData[3];
+            break;
+        case XkbSA_SetPtrDflt:
+            act->dflt.flags = wire.actionData[0];
+            act->dflt.affect = wire.actionData[1];
+            act->dflt.valueXXX = wire.actionData[2];
+            break;
+        case XkbSA_ISOLock:
+            act->iso.flags = wire.actionData[0];
+            act->iso.mask = wire.actionData[1];
+            act->iso.real_mods = wire.actionData[2];
+            act->iso.group_XXX = wire.actionData[3];
+            act->iso.affect = wire.actionData[4];
+            act->iso.vmods1 = wire.actionData[5];
+            act->iso.vmods2 = wire.actionData[6];
+            break;
+        case XkbSA_SwitchScreen:
+            act->screen.flags = wire.actionData[0];
+            act->screen.screenXXX = wire.actionData[1];
+            break;
+        case XkbSA_SetControls:
+        case XkbSA_LockControls:
+            act->ctrls.flags = wire.actionData[0];
+            act->ctrls.ctrls3 = wire.actionData[1];
+            act->ctrls.ctrls2 = wire.actionData[2];
+            act->ctrls.ctrls1 = wire.actionData[3];
+            act->ctrls.ctrls0 = wire.actionData[4];
+            break;
+        case XkbSA_RedirectKey:
+            act->redirect.new_key = wire.actionData[0];
+            act->redirect.mods_mask = wire.actionData[1];
+            act->redirect.mods = wire.actionData[2];
+            act->redirect.vmods_mask0 = wire.actionData[3];
+            act->redirect.vmods_mask1 = wire.actionData[4];
+            act->redirect.vmods0 = wire.actionData[4];
+            act->redirect.vmods1 = wire.actionData[5];
+            break;
+        case XkbSA_DeviceValuator:
+            act->devval.device = wire.actionData[0];
+            act->devval.v1_what = wire.actionData[1];
+            act->devval.v1_ndx = wire.actionData[2];
+            act->devval.v1_value = wire.actionData[3];
+            act->devval.v2_what = wire.actionData[4];
+            act->devval.v2_ndx = wire.actionData[5];
+            act->devval.v2_what = wire.actionData[6];
+            break;
+        case XkbSA_XFree86Private:
+        case XkbSA_Terminate:
+            /* no args, kinda (note: untrue for xfree86). */
+            break;
+        case XkbSA_ActionMessage:
+            /* unsupported. */
+            break;
+        }
     }
     if ((num_si>0)&&(changes)) {
 	changes->compat.first_si= 0;
commit 699824a35791735b4b4378adf8648e3aaa599ace
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 18 16:41:29 2008 +0300

    XKB: Remove descriptions from maprules
    
    We don't use them, as they're not up to the task.  We'll get a better
    solution someday, promise.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbrules.h b/include/xkbrules.h
index 0a15de2..0f3f934 100644
--- a/include/xkbrules.h
+++ b/include/xkbrules.h
@@ -44,17 +44,6 @@ typedef struct _XkbRF_VarDefs {
 	char *			options;
 } XkbRF_VarDefsRec,*XkbRF_VarDefsPtr;
 
-typedef struct _XkbRF_VarDesc {
-	char *			name;
-	char *			desc;
-} XkbRF_VarDescRec, *XkbRF_VarDescPtr;
-
-typedef struct _XkbRF_DescribeVars {
-	int			sz_desc;
-	int			num_desc;
-	XkbRF_VarDescPtr	desc;
-} XkbRF_DescribeVarsRec,*XkbRF_DescribeVarsPtr;
-
 typedef struct _XkbRF_Rule {
 	int			number;
         int			layout_num;
@@ -85,11 +74,6 @@ typedef struct _XkbRF_Group {
 #define	XkbRF_Invalid		(1L<<5)
 
 typedef struct _XkbRF_Rules {
-	XkbRF_DescribeVarsRec	models;
-	XkbRF_DescribeVarsRec	layouts;
-	XkbRF_DescribeVarsRec	variants;
-	XkbRF_DescribeVarsRec	options;
-
 	unsigned short		sz_rules;
 	unsigned short		num_rules;
 	XkbRF_RulePtr		rules;
@@ -111,12 +95,6 @@ extern _X_EXPORT Bool	XkbRF_GetComponents(
     struct _XkbComponentNames *	/* names */
 );
 
-extern _X_EXPORT XkbRF_RulePtr	XkbRF_AddRule(
-    XkbRF_RulesPtr	/* rules */
-);
-
-extern _X_EXPORT XkbRF_GroupPtr XkbRF_AddGroup(XkbRF_RulesPtr  rules);
-
 extern _X_EXPORT Bool	XkbRF_LoadRules(
     FILE *		/* file */,
     XkbRF_RulesPtr	/* rules */
@@ -130,43 +108,13 @@ extern _X_EXPORT Bool XkbRF_LoadRulesByName(
 
 /***====================================================================***/
 
-extern _X_EXPORT XkbRF_VarDescPtr	XkbRF_AddVarDesc(
-    XkbRF_DescribeVarsPtr	/* vars */
-);
-
-extern _X_EXPORT XkbRF_VarDescPtr	XkbRF_AddVarDescCopy(
-    XkbRF_DescribeVarsPtr	/* vars */,
-    XkbRF_VarDescPtr		/* copy_from */
-);
-
-extern _X_EXPORT Bool	XkbRF_LoadDescriptions(
-    FILE *		/* file */,
-    XkbRF_RulesPtr	/* rules */
-);
-
-extern _X_EXPORT Bool XkbRF_LoadDescriptionsByName(
-    char *		/* base */,
-    char *		/* locale */,
-    XkbRF_RulesPtr	/* rules */
-);
-
-extern _X_EXPORT XkbRF_RulesPtr XkbRF_Load(
-    char *		/* base */,
-    char *		/* locale */,
-    Bool		/* wantDesc */,
-    Bool		/* wantRules */
-);
-
 extern _X_EXPORT XkbRF_RulesPtr XkbRF_Create(void);
 
-/***====================================================================***/
-
 extern _X_EXPORT void XkbRF_Free(
     XkbRF_RulesPtr	/* rules */,
     Bool		/* freeRules */
 );
 
-
 /***====================================================================***/
 
 #define	_XKB_RF_NAMES_PROP_ATOM		"_XKB_RULES_NAMES"
diff --git a/xkb/maprules.c b/xkb/maprules.c
index 61c7f86..a0141a3 100644
--- a/xkb/maprules.c
+++ b/xkb/maprules.c
@@ -52,6 +52,8 @@
 
 /***====================================================================***/
 
+
+
 #define DFLT_LINE_SIZE	128
 
 typedef struct {
@@ -856,7 +858,7 @@ XkbRF_GetComponents(	XkbRF_RulesPtr		rules,
 		names->compat && names->geometry);
 }
 
-XkbRF_RulePtr
+static XkbRF_RulePtr
 XkbRF_AddRule(XkbRF_RulesPtr	rules)
 {
     if (rules->sz_rules<1) {
@@ -878,7 +880,7 @@ XkbRF_AddRule(XkbRF_RulesPtr	rules)
     return &rules->rules[rules->num_rules++];
 }
 
-XkbRF_GroupPtr
+static XkbRF_GroupPtr
 XkbRF_AddGroup(XkbRF_RulesPtr	rules)
 {
     if (rules->sz_groups<1) {
@@ -967,185 +969,6 @@ Bool		ok;
 
 /***====================================================================***/
 
-#define HEAD_NONE	0
-#define HEAD_MODEL	1
-#define HEAD_LAYOUT	2
-#define HEAD_VARIANT	3
-#define HEAD_OPTION	4
-#define	HEAD_EXTRA	5
-
-XkbRF_VarDescPtr
-XkbRF_AddVarDesc(XkbRF_DescribeVarsPtr	vars)
-{
-    if (vars->sz_desc<1) {
-	vars->sz_desc= 16;
-	vars->num_desc= 0;
-	vars->desc= _XkbTypedCalloc(vars->sz_desc,XkbRF_VarDescRec);
-    }
-    else if (vars->num_desc>=vars->sz_desc) {
-	vars->sz_desc*= 2;
-	vars->desc= _XkbTypedRealloc(vars->desc,vars->sz_desc,XkbRF_VarDescRec);
-    }
-    if (!vars->desc) {
-	vars->sz_desc= vars->num_desc= 0;
-	DebugF("Allocation failure in XkbRF_AddVarDesc\n");
-	return NULL;
-    }
-    vars->desc[vars->num_desc].name= NULL;
-    vars->desc[vars->num_desc].desc= NULL;
-    return &vars->desc[vars->num_desc++];
-}
-
-XkbRF_VarDescPtr
-XkbRF_AddVarDescCopy(XkbRF_DescribeVarsPtr vars,XkbRF_VarDescPtr from)
-{
-XkbRF_VarDescPtr	nd;
-
-    if ((nd=XkbRF_AddVarDesc(vars))!=NULL) {
-	nd->name= _XkbDupString(from->name);
-	nd->desc= _XkbDupString(from->desc);
-    }
-    return nd;
-}
-
-Bool
-XkbRF_LoadDescriptions(FILE *file,XkbRF_RulesPtr rules)
-{
-InputLine		line;
-XkbRF_VarDescRec	tmp;
-char			*tok;
-int			len,headingtype;
-
-    bzero((char *)&tmp, sizeof(XkbRF_VarDescRec));
-    headingtype = HEAD_NONE;
-    InitInputLine(&line);
-    for ( ; GetInputLine(file,&line,False); line.num_line= 0) {
-	if (line.line[0]=='!') {
-	    tok = strtok(&(line.line[1]), " \t");
-	    if (strcasecmp(tok,"model") == 0)
-		headingtype = HEAD_MODEL;
-	    else if (strcasecmp(tok,"layout") == 0)
-		headingtype = HEAD_LAYOUT;
-	    else if (strcasecmp(tok,"variant") == 0)
-		headingtype = HEAD_VARIANT;
-	    else if (strcasecmp(tok,"option") == 0)
-		headingtype = HEAD_OPTION;
-            else {
-                ErrorF("Broken rules file: unknown type for line %s\n",
-                       line.line);
-                ErrorF("Not parsing rules file further\n");
-                XkbRF_Free(rules, False);
-                FreeInputLine(&line);
-                return False;
-            }
-	    continue;
-	}
-
-	if (headingtype == HEAD_NONE) {
-	    DebugF("Must have a heading before first line of data\n");
-	    DebugF("Illegal line of data ignored\n");
-	    continue;
-	}
-
-	len = strlen(line.line);
-	if ((tmp.name= strtok(line.line, " \t")) == NULL) {
-	    DebugF("Huh? No token on line\n");
-	    DebugF("Illegal line of data ignored\n");
-	    continue;
-	}
-	if (strlen(tmp.name) == len) {
-	    DebugF("No description found\n");
-	    DebugF("Illegal line of data ignored\n");
-	    continue;
-	}
-
-	tok = line.line + strlen(tmp.name) + 1;
-	while ((*tok!='\n')&&isspace(*tok))
-		tok++;
-	if (*tok == '\0') {
-	    DebugF("No description found\n");
-	    DebugF("Illegal line of data ignored\n");
-	    continue;
-	}
-	tmp.desc= tok;
-	switch (headingtype) {
-	    case HEAD_MODEL:
-		XkbRF_AddVarDescCopy(&rules->models,&tmp);
-		break;
-	    case HEAD_LAYOUT:
-		XkbRF_AddVarDescCopy(&rules->layouts,&tmp);
-		break;
-	    case HEAD_VARIANT:
-		XkbRF_AddVarDescCopy(&rules->variants,&tmp);
-		break;
-	    case HEAD_OPTION:
-		XkbRF_AddVarDescCopy(&rules->options,&tmp);
-		break;
-	}
-    }
-    FreeInputLine(&line);
-    if ((rules->models.num_desc==0) && (rules->layouts.num_desc==0) &&
-	(rules->variants.num_desc==0) && (rules->options.num_desc==0))
-	return False;
-
-    return True;
-}
-
-Bool
-XkbRF_LoadDescriptionsByName(char *base,char *locale,XkbRF_RulesPtr rules)
-{
-FILE *		file;
-char		buf[PATH_MAX];
-Bool		ok;
-
-    if ((!base)||(!rules))
-	return False;
-    if (locale) {
-	if (strlen(base)+strlen(locale)+6 > PATH_MAX)
-	    return False;
-	sprintf(buf,"%s-%s.lst", base, locale);
-    }
-    else {
-	if (strlen(base)+5 > PATH_MAX)
-	    return False;
-	sprintf(buf,"%s.lst", base);
-    }
-
-    file= fopen(buf, "r");
-    if ((!file)&&(locale)) { /* fallback if locale was specified */
-	sprintf(buf,"%s.lst", base);
-
-	file= fopen(buf, "r");
-    }
-    if (!file)
-	return False;
-    ok= XkbRF_LoadDescriptions(file,rules);
-    fclose(file);
-    return ok;
-}
-
-/***====================================================================***/
-
-XkbRF_RulesPtr
-XkbRF_Load(char *base,char *locale,Bool wantDesc,Bool wantRules)
-{
-XkbRF_RulesPtr	rules;
-
-    if ((!base)||((!wantDesc)&&(!wantRules)))
-	return NULL;
-    if ((rules=_XkbTypedCalloc(1,XkbRF_RulesRec))==NULL)
-	return NULL;
-    if (wantDesc&&(!XkbRF_LoadDescriptionsByName(base,locale,rules))) {
-	XkbRF_Free(rules,True);
-	return NULL;
-    }
-    if (wantRules&&(!XkbRF_LoadRulesByName(base,locale,rules))) {
-	XkbRF_Free(rules,True);
-	return NULL;
-    }
-    return rules;
-}
-
 XkbRF_RulesPtr
 XkbRF_Create(void)
 {
@@ -1154,24 +977,6 @@ XkbRF_Create(void)
 
 /***====================================================================***/
 
-static void
-XkbRF_ClearVarDescriptions(XkbRF_DescribeVarsPtr var)
-{
-register int i;
-    
-    for (i=0;i<var->num_desc;i++) {
-	if (var->desc[i].name)
-	    _XkbFree(var->desc[i].name);
-	if (var->desc[i].desc)
-	    _XkbFree(var->desc[i].desc);
-	var->desc[i].name= var->desc[i].desc= NULL;
-    }
-    if (var->desc)
-	_XkbFree(var->desc);
-    var->desc= NULL;
-    return;
-}
-
 void
 XkbRF_Free(XkbRF_RulesPtr rules,Bool freeRules)
 {
@@ -1181,10 +986,6 @@ XkbRF_GroupPtr	group;
 
     if (!rules)
 	return;
-    XkbRF_ClearVarDescriptions(&rules->models);
-    XkbRF_ClearVarDescriptions(&rules->layouts);
-    XkbRF_ClearVarDescriptions(&rules->variants);
-    XkbRF_ClearVarDescriptions(&rules->options);
     if (rules->rules) {
 	for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) {
 	    if (rule->model)	_XkbFree(rule->model);
commit 1ad80678d88525159e55bb814205fd4eaca060a3
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 18 16:29:35 2008 +0300

    XKB: Remove support for setting combined keymaps
    
    We don't do full keymaps anymore.  Deal.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbfile.h b/include/xkbfile.h
index 346f213..a4b99ee 100644
--- a/include/xkbfile.h
+++ b/include/xkbfile.h
@@ -284,10 +284,6 @@ extern _X_EXPORT Bool	XkbWriteXKBGeometry(
     void *		/* priv */
 );
 
-extern _X_EXPORT void	XkbEnsureSafeMapName(
-    char *		/* name */
-);
-
 extern _X_EXPORT Bool	XkbWriteXKBKeymapForNames(
     FILE *			/* file */,
     XkbComponentNamesPtr	/* names */,
diff --git a/include/xkbrules.h b/include/xkbrules.h
index 0001481..0a15de2 100644
--- a/include/xkbrules.h
+++ b/include/xkbrules.h
@@ -69,7 +69,6 @@ typedef struct _XkbRF_Rule {
 	char *			types;
 	char *			compat;
 	char *			geometry;
-	char *			keymap;
 	unsigned		flags;
 } XkbRF_RuleRec,*XkbRF_RulePtr;
 
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index a28967c..b2b1736 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -962,13 +962,12 @@ extern Bool XkbCopyKeymap(
 #include <X11/extensions/XKMformat.h>
 #include "xkbrules.h"
 
-#define	_XkbListKeymaps		0
-#define	_XkbListKeycodes	1
-#define	_XkbListTypes		2
-#define	_XkbListCompat		3
-#define	_XkbListSymbols		4
-#define	_XkbListGeometry	5
-#define	_XkbListNumComponents	6
+#define	_XkbListKeycodes	0
+#define	_XkbListTypes		1
+#define	_XkbListCompat		2
+#define	_XkbListSymbols		3
+#define	_XkbListGeometry	4
+#define	_XkbListNumComponents	5
 
 typedef struct _XkbSrvListInfo {
 	int		szPool;
diff --git a/include/xkbstr.h b/include/xkbstr.h
index 5eebe41..ba7debb 100644
--- a/include/xkbstr.h
+++ b/include/xkbstr.h
@@ -527,7 +527,6 @@ typedef struct _XkbChanges {
 	 * database.
 	 */
 typedef struct _XkbComponentNames {
-	char *			 keymap;
 	char *			 keycodes;
 	char *			 types;
 	char *			 compat;
diff --git a/xkb/ddxList.c b/xkb/ddxList.c
index da2f9a8..3ff3d81 100644
--- a/xkb/ddxList.c
+++ b/xkb/ddxList.c
@@ -61,7 +61,7 @@ extern int Win32System(const char *cmdline);
 /***====================================================================***/
 
 static char *componentDirs[_XkbListNumComponents] = {
-	"keymap", "keycodes", "types", "compat", "symbols", "geometry"
+	"keycodes", "types", "compat", "symbols", "geometry"
 };
 
 /***====================================================================***/
@@ -280,9 +280,7 @@ XkbDDXList(DeviceIntPtr	dev,XkbSrvListInfoPtr list,ClientPtr client)
 {
 Status	status;
 
-    status= XkbDDXListComponent(dev,_XkbListKeymaps,list,client);
-    if (status==Success)
-	status= XkbDDXListComponent(dev,_XkbListKeycodes,list,client);
+    status= XkbDDXListComponent(dev,_XkbListKeycodes,list,client);
     if (status==Success)
 	status= XkbDDXListComponent(dev,_XkbListTypes,list,client);
     if (status==Success)
diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index 8d7f837..6954dd1 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -177,7 +177,7 @@ OutputDirectory(
     }
 }
 
-static Bool    	
+static Bool
 XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
 				XkbComponentNamesPtr	names,
 				unsigned		want,
@@ -204,7 +204,6 @@ XkbDDXCompileKeymapByNames(	XkbDescPtr		xkb,
 
     snprintf(keymap, sizeof(keymap), "server-%s", display);
 
-    XkbEnsureSafeMapName(keymap);
     OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir));
 
 #ifdef WIN32
diff --git a/xkb/maprules.c b/xkb/maprules.c
index 6dfcc99..61c7f86 100644
--- a/xkb/maprules.c
+++ b/xkb/maprules.c
@@ -193,15 +193,14 @@ Bool	endOfFile,spacePending,slashPending,inComment;
 #define	TYPES		6
 #define	COMPAT		7
 #define	GEOMETRY	8
-#define	KEYMAP		9
-#define	MAX_WORDS	10
+#define	MAX_WORDS	9
 
 #define	PART_MASK	0x000F
 #define	COMPONENT_MASK	0x03F0
 
 static	char *	cname[MAX_WORDS] = {
 	"model", "layout", "variant", "option", 
-	"keycodes", "symbols", "types", "compat", "geometry", "keymap"
+	"keycodes", "symbols", "types", "compat", "geometry"
 };
 
 typedef	struct _RemapSpec {
@@ -336,13 +335,6 @@ Bool		found;
 	remap->num_remap= 0;
 	return;
    }
-   if (((present&COMPONENT_MASK)&(1<<KEYMAP))&&
-				((present&COMPONENT_MASK)!=(1<<KEYMAP))) {
-	DebugF("Keymap cannot appear with other components\n");
-	DebugF("Illegal mapping ignored\n");
-	remap->num_remap= 0;
-	return;
-   }
    remap->number++;
    return;
 }
@@ -459,7 +451,6 @@ Bool 		append = False;
     rule->types= _XkbDupString(tmp.name[TYPES]);
     rule->compat= _XkbDupString(tmp.name[COMPAT]);
     rule->geometry= _XkbDupString(tmp.name[GEOMETRY]);
-    rule->keymap= NULL;
 
     rule->layout_num = rule->variant_num = 0;
     for (i = 0; i < nread; i++) {
@@ -859,12 +850,10 @@ XkbRF_GetComponents(	XkbRF_RulesPtr		rules,
 	names->compat= XkbRF_SubstituteVars(names->compat, &mdefs);
     if (names->geometry)
 	names->geometry= XkbRF_SubstituteVars(names->geometry, &mdefs);
-    if (names->keymap)	
-	names->keymap= XkbRF_SubstituteVars(names->keymap, &mdefs);
 
     FreeMultiDefs(&mdefs);
     return (names->keycodes && names->symbols && names->types &&
-		names->compat && names->geometry ) || names->keymap;
+		names->compat && names->geometry);
 }
 
 XkbRF_RulePtr
@@ -1045,6 +1034,7 @@ int			len,headingtype;
                 ErrorF("Broken rules file: unknown type for line %s\n",
                        line.line);
                 ErrorF("Not parsing rules file further\n");
+                XkbRF_Free(rules, False);
                 FreeInputLine(&line);
                 return False;
             }
diff --git a/xkb/xkb.c b/xkb/xkb.c
index d986b28..b99b261 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5492,7 +5492,6 @@ ProcXkbListComponents(ClientPtr client)
     str= (unsigned char *)&stuff[1];
     bzero(&list,sizeof(XkbSrvListInfoRec));
     list.maxRtrn= stuff->maxNames;
-    list.pattern[_XkbListKeymaps]= GetComponentSpec(&str,False,&status);
     list.pattern[_XkbListKeycodes]= GetComponentSpec(&str,False,&status);
     list.pattern[_XkbListTypes]= GetComponentSpec(&str,False,&status);
     list.pattern[_XkbListCompat]= GetComponentSpec(&str,False,&status);
@@ -5515,7 +5514,7 @@ ProcXkbListComponents(ClientPtr client)
     rep.deviceID = dev->id;
     rep.sequenceNumber = client->sequence;
     rep.length = XkbPaddedSize(list.nPool)/4;
-    rep.nKeymaps = list.nFound[_XkbListKeymaps];
+    rep.nKeymaps = 0;
     rep.nKeycodes = list.nFound[_XkbListKeycodes];
     rep.nTypes = list.nFound[_XkbListTypes];
     rep.nCompatMaps = list.nFound[_XkbListCompat];
@@ -5581,7 +5580,8 @@ ProcXkbGetKbdByName(ClientPtr client)
     xkb = dev->key->xkbInfo->desc;
     status= Success;
     str= (unsigned char *)&stuff[1];
-    names.keymap= GetComponentSpec(&str,True,&status);
+    if (GetComponentSpec(&str,True,&status)) /* keymap, unsupported */
+        return BadMatch;
     names.keycodes= GetComponentSpec(&str,True,&status);
     names.types= GetComponentSpec(&str,True,&status);
     names.compat= GetComponentSpec(&str,True,&status);
@@ -5873,7 +5873,6 @@ ProcXkbGetKbdByName(ClientPtr client)
 	XkbFreeKeyboard(new,XkbAllComponentsMask,True);
 	new= NULL;
     }
-    if (names.keymap)	{ _XkbFree(names.keymap); names.keymap= NULL; }
     if (names.keycodes)	{ _XkbFree(names.keycodes); names.keycodes= NULL; }
     if (names.types)	{ _XkbFree(names.types); names.types= NULL; }
     if (names.compat)	{ _XkbFree(names.compat); names.compat= NULL; }
diff --git a/xkb/xkbfmisc.c b/xkb/xkbfmisc.c
index dd403ea..349c79a 100644
--- a/xkb/xkbfmisc.c
+++ b/xkb/xkbfmisc.c
@@ -170,7 +170,7 @@ int		multi_section;
 unsigned	wantNames,wantConfig,wantDflts;
 
     complete= 0;
-    if ((name=names->keymap)==NULL)	name= "default";
+    name= "default";
     if (COMPLETE(names->keycodes))	complete|= XkmKeyNamesMask;
     if (COMPLETE(names->types))		complete|= XkmTypesMask;
     if (COMPLETE(names->compat))	complete|= XkmCompatMapMask;
@@ -412,29 +412,6 @@ unsigned	rtrn;
     return rtrn;
 }
 
-/* all latin-1 alphanumerics, plus parens, slash, minus, underscore and */
-/* wildcards */
-
-static unsigned char componentSpecLegal[] = {
-	0x00, 0x00, 0x00, 0x00, 0x00, 0xa7, 0xff, 0x83,
-	0xfe, 0xff, 0xff, 0x87, 0xfe, 0xff, 0xff, 0x07,
-	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-	0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0x7f, 0xff
-};
-
-void
-XkbEnsureSafeMapName(char *name)
-{
-   if (name==NULL)
-        return;
-    while (*name!='\0') {
-	if ((componentSpecLegal[(*name)/8]&(1<<((*name)%8)))==0)
-	    *name= '_';
-        name++;
-    }
-    return;
-}
-
 /***====================================================================***/
 
 #define	UNMATCHABLE(c)	(((c)=='(')||((c)==')')||((c)=='/'))
commit 133e0bd6f1cc147a2ddbbe1519d10300e7dbe669
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Jul 18 16:27:57 2008 +0300

    XKB: Remove 'extra' functionality from rules parsing
    
    When we find something weird in the rules, don't stash it as an extra
    freeform component, just state that the rules file is likely broken and
    move on with our lives.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/include/xkbrules.h b/include/xkbrules.h
index e8917f0..0001481 100644
--- a/include/xkbrules.h
+++ b/include/xkbrules.h
@@ -42,10 +42,6 @@ typedef struct _XkbRF_VarDefs {
 	char *			layout;
 	char *			variant;
 	char *			options;
-	unsigned short		sz_extra;
-	unsigned short		num_extra;
-	char *			extra_names;
-	char **			extra_values;
 } XkbRF_VarDefsRec,*XkbRF_VarDefsPtr;
 
 typedef struct _XkbRF_VarDesc {
@@ -94,10 +90,6 @@ typedef struct _XkbRF_Rules {
 	XkbRF_DescribeVarsRec	layouts;
 	XkbRF_DescribeVarsRec	variants;
 	XkbRF_DescribeVarsRec	options;
-	unsigned short		sz_extra;
-	unsigned short		num_extra;
-	char **			extra_names;
-	XkbRF_DescribeVarsPtr	extra;
 
 	unsigned short		sz_rules;
 	unsigned short		num_rules;
@@ -148,11 +140,6 @@ extern _X_EXPORT XkbRF_VarDescPtr	XkbRF_AddVarDescCopy(
     XkbRF_VarDescPtr		/* copy_from */
 );
 
-extern _X_EXPORT XkbRF_DescribeVarsPtr XkbRF_AddVarToDescribe(
-    XkbRF_RulesPtr		/* rules */,
-    char *			/* name */
-);
-
 extern _X_EXPORT Bool	XkbRF_LoadDescriptions(
     FILE *		/* file */,
     XkbRF_RulesPtr	/* rules */
@@ -171,10 +158,7 @@ extern _X_EXPORT XkbRF_RulesPtr XkbRF_Load(
     Bool		/* wantRules */
 );
 
-extern _X_EXPORT XkbRF_RulesPtr XkbRF_Create(
-    int			/* sz_rules */,
-    int			/* sz_extra */
-);
+extern _X_EXPORT XkbRF_RulesPtr XkbRF_Create(void);
 
 /***====================================================================***/
 
diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index c24b2cc..8d7f837 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -404,7 +404,7 @@ XkbRF_RulesPtr	rules;
 	return False;
     }
 
-    rules = XkbRF_Create(0, 0);
+    rules = XkbRF_Create();
     if (!rules) {
         LogMessage(X_ERROR, "XKB: Couldn't create rules struct\n");
 	fclose(file);
diff --git a/xkb/maprules.c b/xkb/maprules.c
index b56055f..6dfcc99 100644
--- a/xkb/maprules.c
+++ b/xkb/maprules.c
@@ -1019,41 +1019,13 @@ XkbRF_VarDescPtr	nd;
     return nd;
 }
 
-XkbRF_DescribeVarsPtr
-XkbRF_AddVarToDescribe(XkbRF_RulesPtr rules,char *name)
-{
-    if (rules->sz_extra<1) {
-	rules->num_extra= 0;
-	rules->sz_extra= 1;
-	rules->extra_names= _XkbTypedCalloc(rules->sz_extra,char *);
-	rules->extra= _XkbTypedCalloc(rules->sz_extra, XkbRF_DescribeVarsRec);
-    }
-    else if (rules->num_extra>=rules->sz_extra) {
-	rules->sz_extra*= 2;
-	rules->extra_names= _XkbTypedRealloc(rules->extra_names,rules->sz_extra,
-								char *);
-	rules->extra=_XkbTypedRealloc(rules->extra, rules->sz_extra,
-							XkbRF_DescribeVarsRec);
-    }
-    if ((!rules->extra_names)||(!rules->extra)) {
-	DebugF("allocation error in extra parts\n");
-	rules->sz_extra= rules->num_extra= 0;
-	rules->extra_names= NULL;
-	rules->extra= NULL;
-	return NULL;
-    }
-    rules->extra_names[rules->num_extra]= _XkbDupString(name);
-    bzero(&rules->extra[rules->num_extra],sizeof(XkbRF_DescribeVarsRec));
-    return &rules->extra[rules->num_extra++];
-}
-
 Bool
 XkbRF_LoadDescriptions(FILE *file,XkbRF_RulesPtr rules)
 {
 InputLine		line;
 XkbRF_VarDescRec	tmp;
 char			*tok;
-int			len,headingtype,extra_ndx = 0;
+int			len,headingtype;
 
     bzero((char *)&tmp, sizeof(XkbRF_VarDescRec));
     headingtype = HEAD_NONE;
@@ -1069,23 +1041,13 @@ int			len,headingtype,extra_ndx = 0;
 		headingtype = HEAD_VARIANT;
 	    else if (strcasecmp(tok,"option") == 0)
 		headingtype = HEAD_OPTION;
-	    else {
-		int i;
-		headingtype = HEAD_EXTRA;
-		extra_ndx= -1;
-		for (i=0;(i<rules->num_extra)&&(extra_ndx<0);i++) {
-		    if (!strcasecmp(tok,rules->extra_names[i]))
-			extra_ndx= i;
-		}
-		if (extra_ndx<0) {
-		    XkbRF_DescribeVarsPtr	var;
-		    DebugF("Extra heading \"%s\" encountered\n",tok);
-		    var= XkbRF_AddVarToDescribe(rules,tok);
-		    if (var)
-			 extra_ndx= var-rules->extra;
-		    else headingtype= HEAD_NONE;
-		}
-	    }
+            else {
+                ErrorF("Broken rules file: unknown type for line %s\n",
+                       line.line);
+                ErrorF("Not parsing rules file further\n");
+                FreeInputLine(&line);
+                return False;
+            }
 	    continue;
 	}
 
@@ -1129,17 +1091,13 @@ int			len,headingtype,extra_ndx = 0;
 	    case HEAD_OPTION:
 		XkbRF_AddVarDescCopy(&rules->options,&tmp);
 		break;
-	    case HEAD_EXTRA:
-		XkbRF_AddVarDescCopy(&rules->extra[extra_ndx],&tmp);
-		break;
 	}
     }
     FreeInputLine(&line);
     if ((rules->models.num_desc==0) && (rules->layouts.num_desc==0) &&
-	(rules->variants.num_desc==0) && (rules->options.num_desc==0) &&
-	(rules->num_extra==0)) {
+	(rules->variants.num_desc==0) && (rules->options.num_desc==0))
 	return False;
-    }
+
     return True;
 }
 
@@ -1199,31 +1157,9 @@ XkbRF_RulesPtr	rules;
 }
 
 XkbRF_RulesPtr
-XkbRF_Create(int szRules,int szExtra) 
+XkbRF_Create(void)
 {
-XkbRF_RulesPtr rules;
-
-    if ((rules=_XkbTypedCalloc(1,XkbRF_RulesRec))==NULL)
-	return NULL;
-    if (szRules>0) {
-	rules->sz_rules= szRules; 
-	rules->rules= _XkbTypedCalloc(rules->sz_rules,XkbRF_RuleRec);
-	if (!rules->rules) {
-	    _XkbFree(rules);
-	    return NULL;
-	}
-    }
-    if (szExtra>0) {
-	rules->sz_extra= szExtra; 
-	rules->extra= _XkbTypedCalloc(rules->sz_extra,XkbRF_DescribeVarsRec);
-	if (!rules->extra) {
-	    if (rules->rules)
-		_XkbFree(rules->rules);
-	    _XkbFree(rules);
-	    return NULL;
-	}
-    }
-    return rules;
+    return _XkbTypedCalloc(1, XkbRF_RulesRec);
 }
 
 /***====================================================================***/
@@ -1259,14 +1195,6 @@ XkbRF_GroupPtr	group;
     XkbRF_ClearVarDescriptions(&rules->layouts);
     XkbRF_ClearVarDescriptions(&rules->variants);
     XkbRF_ClearVarDescriptions(&rules->options);
-    if (rules->extra) {
-	for (i = 0; i < rules->num_extra; i++) {
-	    XkbRF_ClearVarDescriptions(&rules->extra[i]);
-	}
-	_XkbFree(rules->extra);
-	rules->num_extra= rules->sz_extra= 0;
-	rules->extra= NULL;
-    }
     if (rules->rules) {
 	for (i=0,rule=rules->rules;i<rules->num_rules;i++,rule++) {
 	    if (rule->model)	_XkbFree(rule->model);
commit cc5c6d628aa0dc87c2cc9d063972e09ad747a596
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Apr 25 18:45:37 2008 +0300

    XKB: Remove unsupported Xi operation flags
    
    We support every XKB operation on Xi devices, so always report that we
    support everything, and that nothing is ever unsupported.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/xkb/xkb.c b/xkb/xkb.c
index f818a72..d986b28 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5964,10 +5964,8 @@ Bool			classOk;
 	}
     }
     if (nFBs>0) {
-	if (rep->supported&XkbXI_IndicatorsMask) {
-	    rep->nDeviceLedFBs= nFBs;
-	    rep->length+= (length/4);
-	}
+        rep->nDeviceLedFBs= nFBs;
+        rep->length+= (length/4);
 	return Success;
     }
     if (classOk) client->errorValue= _XkbErrCode2(XkbErr_BadId,id);
@@ -6091,7 +6089,7 @@ xkbGetDeviceInfoReply	rep;
 int			status,nDeviceLedFBs;
 unsigned		length,nameLen;
 CARD16			ledClass,ledID;
-unsigned		wanted,supported;
+unsigned		wanted;
 char *			str;
 
     REQUEST(xkbGetDeviceInfoReq);
@@ -6182,7 +6180,6 @@ char *			str;
 	    return status;
     }
     length= rep.length*4;
-    supported= rep.supported;
     nDeviceLedFBs = rep.nDeviceLedFBs;
     if (client->swapped) {
 	register int n;
@@ -6222,19 +6219,6 @@ char *			str;
 	ErrorF("[xkb]                  Wrote %d fewer bytes than expected\n",length);
 	return BadLength;
     }
-    if (stuff->wanted&(~supported)) {
-	xkbExtensionDeviceNotify ed;
-	bzero((char *)&ed,SIZEOF(xkbExtensionDeviceNotify));
-	ed.ledClass=		ledClass;
-	ed.ledID=		ledID;
-	ed.ledsDefined= 	0;
-	ed.ledState=		0;
-	ed.firstBtn= ed.nBtns=	0;
-	ed.reason=		XkbXI_UnsupportedFeatureMask;
-	ed.supported=		supported;
-	ed.unsupported=		stuff->wanted&(~supported);
-	XkbSendExtensionDeviceNotify(dev,client,&ed);
-    }
     return client->noClientException;
 }
 
diff --git a/xkb/xkbEvents.c b/xkb/xkbEvents.c
index 96e527b..ed80b04 100644
--- a/xkb/xkbEvents.c
+++ b/xkb/xkbEvents.c
@@ -667,7 +667,7 @@ int		 initialized;
 XkbInterestPtr	 interest;
 Time 		 time = 0;
 CARD32		 defined, state;
-CARD16		 reason, supported = 0;
+CARD16		 reason;
 
     interest = dev->xkb_interest;
     if (!interest)
@@ -688,7 +688,6 @@ CARD16		 reason, supported = 0;
 		pEv->deviceID = dev->id;
 		pEv->sequenceNumber = interest->client->sequence;
 		pEv->time = time = GetTimeInMillis();
-		supported= pEv->supported;
 		initialized= 1;
 	    }
 	    else {
@@ -697,14 +696,7 @@ CARD16		 reason, supported = 0;
 		pEv->ledsDefined= defined;
 		pEv->ledState= state;
 		pEv->reason= reason;
-		pEv->supported= supported;
-	    }
-	    if (client!=interest->client) {
-		/* only report UnsupportedFeature to the client that */
-		/* issued the failing request */
-		pEv->reason&= ~XkbXI_UnsupportedFeatureMask;
-		if ((interest->extDevNotifyMask&reason)==0)
-		    continue;
+		pEv->supported= XkbXI_AllFeaturesMask;
 	    }
 	    if ( interest->client->swapped ) {
 		register int n;
diff --git a/xkb/xkbLEDs.c b/xkb/xkbLEDs.c
index 68ab5ff..c61296b 100644
--- a/xkb/xkbLEDs.c
+++ b/xkb/xkbLEDs.c
@@ -283,7 +283,7 @@ unsigned			oldState;
     ed->ledID=		sli->id;
     ed->ledsDefined=	sli->namesPresent|sli->mapsPresent;
     ed->ledState=	sli->effectiveState;
-    ed->unsupported|=	XkbXI_IndicatorStateMask;
+    ed->unsupported=	0;
     ed->supported=	XkbXI_AllFeaturesMask;
 
     if (changes!=&my_changes)	changes= NULL;
@@ -875,7 +875,7 @@ xkbExtensionDeviceNotify	my_ed;
     ed->ledID=		sli->id;
     ed->ledsDefined=	sli->namesPresent|sli->mapsPresent;
     ed->ledState=	sli->effectiveState;
-    ed->unsupported|=	XkbXI_IndicatorMapsMask;
+    ed->unsupported=	0;
     ed->supported=	XkbXI_AllFeaturesMask;
 
     XkbUpdateLedAutoState(dev,sli,changed_maps,ed,changes,cause);
@@ -956,7 +956,7 @@ Bool				kb_changed;
 	ed->ledID=		sli->id;
 	ed->ledsDefined=	sli->namesPresent|sli->mapsPresent;
 	ed->ledState=		sli->effectiveState;
-	ed->unsupported|=	XkbXI_IndicatorStateMask;
+	ed->unsupported=	0;
 	ed->supported=		XkbXI_AllFeaturesMask;
     }
 
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index f84e892..d03195f 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -711,8 +711,7 @@ unsigned char	grp;
     if (!state || !ctrls)
         return;
 
-    state->mods= (state->base_mods|state->latched_mods);
-    state->mods|= state->locked_mods;
+    state->mods= (state->base_mods|state->latched_mods|state->locked_mods);
     state->lookup_mods= state->mods&(~ctrls->internal.mask);
     state->grab_mods= state->lookup_mods&(~ctrls->ignore_lock.mask);
     state->grab_mods|= 
commit 32db27a7f867b503c2840ca7b815e96d10be9210
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Thu Apr 17 12:42:01 2008 -0700

    Input: Remove modifierMap from core
    
    We already have modmap (in the exact same format!) in XKB, so just use
    that all the time, instead of duplicating the information.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 824972c..f06aed0 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -199,8 +199,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
     dk = device->key;
     mk = master->key;
 
-    memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH);
-
     mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode;
     mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
     SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
@@ -997,7 +995,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
 
     if (xE->u.u.type == DeviceKeyPress) {
         if (ret == IS_REPEAT) {	/* allow ddx to generate multiple downs */
-            modifiers = k->modifierMap[key];
+            modifiers = k->xkbInfo->desc->map->modmap[key];
 	    if (!modifiers) {
 		xE->u.u.type = DeviceKeyRelease;
 		ProcessOtherEvent(xE, device, count);
diff --git a/dix/getevents.c b/dix/getevents.c
index 81e6608..ee08bed 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -819,7 +819,7 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
          * or we have a modifier, don't generate a repeat event. */
         if (!pDev->kbdfeed->ctrl.autoRepeat ||
             !key_autorepeats(pDev, key_code) ||
-            pDev->key->modifierMap[key_code])
+            pDev->key->xkbInfo->desc->map->modmap[key_code])
             return 0;
     }
 
diff --git a/dix/inpututils.c b/dix/inpututils.c
index 1adaa78..1b6458f 100644
--- a/dix/inpututils.c
+++ b/dix/inpututils.c
@@ -32,6 +32,8 @@
 #include "input.h"
 #include "inputstr.h"
 #include "xace.h"
+#include "xkbsrv.h"
+#include "xkbstr.h"
 
 /* Check if a modifier map change is okay with the device.
  * Returns -1 for BadValue, as it collides with MappingBusy; this particular
@@ -79,7 +81,7 @@ check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
     /* None of the old modifiers may be down while we change the map,
      * either. */
     for (i = syms->minKeyCode; i < syms->maxKeyCode; i++) {
-        if (!dev->key->modifierMap[i])
+        if (!dev->key->xkbInfo->desc->map->modmap[i])
             continue;
         if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
             client->errorValue = i;
@@ -130,7 +132,7 @@ check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
 static void
 do_modmap_change(ClientPtr client, DeviceIntPtr dev, CARD8 *modmap)
 {
-    memcpy(dev->key->modifierMap, modmap, MAP_LENGTH);
+    memcpy(dev->key->xkbInfo->desc->map->modmap, modmap, MAP_LENGTH);
     SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev);
 }
 
@@ -209,7 +211,7 @@ int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
         keys_per_mod[i] = 0;
     for (i = 8; i < MAP_LENGTH; i++) {
         for (j = 0; j < 8; j++) {
-            if (dev->key->modifierMap[i] & (1 << j)) {
+            if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) {
                 if (++keys_per_mod[j] > max_keys_per_mod)
                     max_keys_per_mod = keys_per_mod[j];
             }
@@ -225,7 +227,7 @@ int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
 
     for (i = 8; i < MAP_LENGTH; i++) {
         for (j = 0; j < 8; j++) {
-            if (dev->key->modifierMap[i] & (1 << j)) {
+            if (dev->key->xkbInfo->desc->map->modmap[i] & (1 << j)) {
                 modkeymap[(j * max_keys_per_mod) + keys_per_mod[j]] = i;
                 keys_per_mod[j]++;
             }
diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index bce886f..9a14044 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -427,7 +427,6 @@ static int dmxKeyboardOn(DeviceIntPtr pDevice, DMXLocalInitInfo *info)
     XkbInitKeyboardDeviceStruct(pDevice,
                                 &info->names,
                                 &info->keySyms,
-                                info->modMap,
                                 dmxKeyboardBellProc,
                                 dmxKeyboardKbdCtrlProc);
 
@@ -461,7 +460,6 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
             DevicePtr pDev = (DevicePtr) pDevice;
             InitKeyboardDeviceStruct(pDev,
                                      &info.keySyms,
-                                     info.modMap,
                                      dmxBell, dmxKbdCtrl);
         }
         if (info.buttonClass) {
diff --git a/hw/dmx/input/lnx-keyboard.c b/hw/dmx/input/lnx-keyboard.c
index 55ff9f8..744b6ac 100644
--- a/hw/dmx/input/lnx-keyboard.c
+++ b/hw/dmx/input/lnx-keyboard.c
@@ -697,7 +697,7 @@ static void kbdLinuxConvert(DevicePtr pDev,
 
             /* No auto-repeat? */
             if ((feed && !feed->ctrl.autoRepeat)
-                || priv->pKeyboard->key->modifierMap[keyCode]
+                || priv->pKeyboard->key->xkbInfo->desc->map->modmap[keyCode]
                 || (feed
                     && !(feed->ctrl.autoRepeats[keyCode >> 3]
                          & (1 << (keyCode & 7))))) return; /* Ignore */
diff --git a/hw/dmx/input/usb-keyboard.c b/hw/dmx/input/usb-keyboard.c
index 455513d..12ca8ab 100644
--- a/hw/dmx/input/usb-keyboard.c
+++ b/hw/dmx/input/usb-keyboard.c
@@ -331,7 +331,7 @@ static void kbdUSBConvert(DevicePtr pDev,
 
             /* No auto-repeat? */
             if ((feed && !feed->ctrl.autoRepeat)
-                || priv->pDevice->key->modifierMap[keyCode]
+                || priv->pDevice->key->xkbInfo->desc->map->modmap[keyCode]
                 || (feed
                     && !(feed->ctrl.autoRepeats[keyCode >> 3]
                          & (1 << (keyCode & 7))))) return; /* Ignore */
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index 740f661..fc3d940 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -782,7 +782,7 @@ ephyrUpdateModifierState(unsigned int state)
 	  int count = keyc->modifierKeyCount[i];
 	  
 	  for (key = 0; key < MAP_LENGTH; key++)
-	    if (keyc->modifierMap[key] & mask) 
+	    if (keyc->xkbInfo->desc->map->modmap[key] & mask)
 	      {
 		int bit;
 		BYTE *kptr;
@@ -802,9 +802,9 @@ ephyrUpdateModifierState(unsigned int state)
       /* Modifier shoud be down, but isn't   */
       if (!(keyc->state & mask) && (state & mask))
 	for (key = 0; key < MAP_LENGTH; key++)
-	  if (keyc->modifierMap[key] & mask) 
+	  if (keyc->xkbInfo->desc->map->modmap[key] & mask)
 	    {
-              if (keyc->modifierMap[key] & mask && ephyrKbd &&
+              if (keyc->xkbInfo->desc->map->modmap[key] & mask && ephyrKbd &&
                   ((EphyrKbdPrivate *)ephyrKbd->driverPrivate)->enabled)
 	          KdEnqueueKeyboardEvent(ephyrKbd, key, FALSE); /* press */
 	      break;
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index 7746484..6a9f493 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -309,7 +309,6 @@ struct _KdKeyboardInfo {
     CARD8               keyState[KD_KEY_COUNT/8];
     int                 minScanCode;
     int                 maxScanCode;
-    CARD8               modmap[MAP_LENGTH];
     KeySymsRec          keySyms; 
 
     int                 leds;
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 2e38cf8..9b34a7a 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -660,85 +660,6 @@ KdKbdCtrl (DeviceIntPtr pDevice, KeybdCtrl *ctrl)
 
 extern KeybdCtrl defaultKeyboardControl;
 
-static void
-KdInitAutoRepeats (KdKeyboardInfo *ki)
-{
-    int		    key_code;
-    unsigned char   mask;
-    int		    i;
-    unsigned char   *repeats;
-
-    repeats = defaultKeyboardControl.autoRepeats;
-    memset (repeats, '\0', 32);
-    for (key_code = KD_MIN_KEYCODE; key_code <= KD_MAX_KEYCODE; key_code++)
-    {
-	if (!ki->modmap[key_code])
-	{
-	    i = key_code >> 3;
-	    mask = 1 << (key_code & 7);
-	    repeats[i] |= mask;
-	}
-    }
-}
-
-const KdKeySymModsRec kdKeySymMods[] = {
-  {  XK_Control_L,	ControlMask },
-  {  XK_Control_R, ControlMask },
-  {  XK_Shift_L,	ShiftMask },
-  {  XK_Shift_R,	ShiftMask },
-  {  XK_Caps_Lock,	LockMask },
-  {  XK_Shift_Lock, LockMask },
-  {  XK_Alt_L,	Mod1Mask },
-  {  XK_Alt_R,	Mod1Mask },
-  {  XK_Meta_L,	Mod1Mask },
-  {  XK_Meta_R,	Mod1Mask },
-  {  XK_Num_Lock,	Mod2Mask },
-  {  XK_Super_L,	Mod3Mask },
-  {  XK_Super_R,	Mod3Mask },
-  {  XK_Hyper_L,	Mod3Mask },
-  {  XK_Hyper_R,	Mod3Mask },
-  {  XK_Mode_switch, Mod4Mask },
-  /* PDA specific hacks */
-#ifdef XF86XK_Start
-  {  XF86XK_Start, ControlMask },
-#endif
-  {  XK_Menu, ShiftMask },
-  {  XK_telephone, Mod1Mask },
-#ifdef XF86XK_AudioRecord
-  {  XF86XK_AudioRecord, Mod2Mask },
-#endif
-#ifdef XF86XK_Calendar
-  {  XF86XK_Calendar, Mod3Mask }
-#endif
-};
-
-#define NUM_SYM_MODS (sizeof(kdKeySymMods) / sizeof(kdKeySymMods[0]))
-
-static void
-KdInitModMap (KdKeyboardInfo *ki)
-{
-    int	    key_code;
-    int	    row;
-    int	    width;
-    KeySym  *syms;
-    int	    i;
-
-    width = ki->keySyms.mapWidth;
-    for (key_code = ki->keySyms.minKeyCode; key_code <= ki->keySyms.maxKeyCode; key_code++)
-    {
-	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) 
-		    ki->modmap[key_code] |= kdKeySymMods[i].modbit;
-	    }
-	}
-    }
-}
-
 static int
 KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
 {
@@ -792,9 +713,6 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
             return !Success;
         }
 
-        KdInitModMap(ki);
-        KdInitAutoRepeats(ki);
-
         memset(&rmlvo, 0, sizeof(rmlvo));
         rmlvo.rules = ki->xkbRules;
         rmlvo.model = ki->xkbModel;
diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c
index 35be521..022816d 100644
--- a/hw/xnest/Keyboard.c
+++ b/hw/xnest/Keyboard.c
@@ -119,7 +119,6 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
   int mapWidth;
   int min_keycode, max_keycode;
   KeySymsRec keySyms;
-  CARD8 modmap[MAP_LENGTH];
   int i, j;
   XKeyboardState values;
   XkbComponentNamesRec names;
@@ -130,7 +129,6 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
   switch (onoff)
     {
     case DEVICE_INIT: 
-      modifier_keymap = XGetModifierMapping(xnestDisplay);
       XDisplayKeycodes(xnestDisplay, &min_keycode, &max_keycode);
 #ifdef _XSERVER64
       {
@@ -153,18 +151,6 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
 				   &mapWidth);
 #endif
       
-      for (i = 0; i < MAP_LENGTH; i++)
-	modmap[i] = 0;
-      for (j = 0; j < 8; j++)
-	for(i = 0; i < modifier_keymap->max_keypermod; i++) {
-	  CARD8 keycode;
-	  if ((keycode = 
-	      modifier_keymap->
-	        modifiermap[j * modifier_keymap->max_keypermod + i]))
-	    modmap[keycode] |= 1<<j;
-	}
-      XFreeModifiermap(modifier_keymap);
-      
       keySyms.minKeyCode = min_keycode;
       keySyms.maxKeyCode = max_keycode;
       keySyms.mapWidth = mapWidth;
@@ -189,8 +175,8 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
       options = XKB_DFLT_OPTIONS;
 
       XkbSetRulesDflts(rules, model, layout, variants, options);
-      XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modmap,
-				    xnestBell, xnestChangeKeyboardControl);
+      XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms,
+				  xnestBell, xnestChangeKeyboardControl);
       XkbDDXChangeControls(pDev, xkb->ctrls, xkb->ctrls);
       XkbFreeKeyboard(xkb, 0, False);
       xfree(keymap);
@@ -250,7 +236,7 @@ xnestUpdateModifierState(unsigned int state)
       int count = keyc->modifierKeyCount[i];
 
       for (key = 0; key < MAP_LENGTH; key++)
-	if (keyc->modifierMap[key] & mask) {
+	if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
 	  int bit;
 	  BYTE *kptr;
 
@@ -269,7 +255,7 @@ xnestUpdateModifierState(unsigned int state)
      */
     if (!(keyc->state & mask) && (state & mask))
       for (key = 0; key < MAP_LENGTH; key++)
-	if (keyc->modifierMap[key] & mask) {
+	if (keyc->xkbInfo->desc->map->modmap[key] & mask) {
 	  xnestQueueKeyEvent(KeyPress, key);
 	  break;
 	}
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 21736d1..9e8da8b 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -342,6 +342,16 @@ void DarwinKeyboardInit(DeviceIntPtr pDev) {
     pthread_mutex_lock(&keyInfo_mutex);
     assert(XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, keyInfo.modMap,
                                        QuartzBell, DarwinChangeKeyboardControl));
+    assert(pDev->key->xkbInfo->desc->map->modmap!=NULL);
+    memcpy(pDev->key->xkbInfo->desc->map->modmap, keyInfo.modMap, sizeof(keyInfo.modMap));
+    pthread_mutex_unlock(&keyInfo_mutex);
+
+	QuartzXkbUpdate(pDev);
+#else
+    pthread_mutex_lock(&keyInfo_mutex);
+    assert( InitKeyboardDeviceStruct( (DevicePtr)pDev, &keySyms,
+                                      QuartzBell,
+                                      DarwinChangeKeyboardControl ));
     pthread_mutex_unlock(&keyInfo_mutex);
 
     /* Get our key repeat settings from GlobalPreferences */
diff --git a/hw/xwin/winkeybd.c b/hw/xwin/winkeybd.c
index f270431..41168f3 100644
--- a/hw/xwin/winkeybd.c
+++ b/hw/xwin/winkeybd.c
@@ -217,7 +217,6 @@ int
 winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
 {
   KeySymsRec		keySyms;
-  CARD8 		modMap[MAP_LENGTH];
   DevicePtr		pDevice = (DevicePtr) pDeviceInt;
   XkbComponentNamesRec names;
   XkbSrvInfoPtr       xkbi;
@@ -228,8 +227,6 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
     case DEVICE_INIT:
       winConfigKeyboard (pDeviceInt);
 
-      winGetKeyMappings (&keySyms, modMap);
-
       /* FIXME: Maybe we should use winGetKbdLeds () here? */
       defaultKeyboardControl.leds = g_winInfo.keyboard.leds;
 
@@ -237,7 +234,6 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
 	{
 	  InitKeyboardDeviceStruct (pDevice,
 				    &keySyms,
-				    modMap,
 				    winKeybdBell,
 				    winKeybdCtrl);
 	} 
@@ -263,7 +259,7 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
 			    g_winInfo.xkb.layout, g_winInfo.xkb.variant, 
 			    g_winInfo.xkb.options);
 	  XkbInitKeyboardDeviceStruct (pDeviceInt, &names, &keySyms,
-				       modMap, winKeybdBell, winKeybdCtrl);
+				       winKeybdBell, winKeybdCtrl);
 	}
 
       if (!g_winInfo.xkb.disable)
diff --git a/include/inputstr.h b/include/inputstr.h
index cdd68d5..76523aa 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -138,8 +138,7 @@ typedef struct _KeyClassRec {
     CARD8		down[DOWN_LENGTH];
     CARD8		postdown[DOWN_LENGTH];
     KeySymsRec		curKeySyms;
-    int			modifierKeyCount[8];
-    CARD8		modifierMap[MAP_LENGTH];
+    int                 modifierKeyCount[8];
     struct _XkbSrvInfo *xkbInfo;
 } KeyClassRec, *KeyClassPtr;
 
diff --git a/xkb/xkb.c b/xkb/xkb.c
index 21750c9..f818a72 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -5836,9 +5836,6 @@ ProcXkbGetKbdByName(ClientPtr client)
             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 (tmpd != dev)
                     XkbCopyKeymap(dev->key->xkbInfo->desc,
                                   tmpd->key->xkbInfo->desc, True);
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index d85fbd4..bcee26c 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -506,9 +506,6 @@ InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
 
     XkbInitControls(dev, xkbi);
 
-    /* XXX: Doesn't XUCD make this redundant? */
-    memcpy(dev->key->modifierMap, xkb->map->modmap, xkb->max_key_code + 1);
-
     XkbInitIndicatorMap(xkbi);
 
     XkbDDXInitDevice(dev);
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index 8960bca..f84e892 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -363,17 +363,14 @@ int			maxSymsPerKey,maxKeysPerMod, maxGroup1Width;
 int			first,last,firstCommon,lastCommon;
 XkbDescPtr		xkb;
 KeyClassPtr		keyc;
-CARD8			keysPerMod[XkbNumModifiers];
 int			maxNumberOfGroups;
 
     if (!keybd || !keybd->key || !keybd->key->xkbInfo)
 	return;
     xkb= keybd->key->xkbInfo->desc;
     keyc= keybd->key;
-    maxSymsPerKey= maxKeysPerMod= maxGroup1Width= 0;
+    maxSymsPerKey= maxGroup1Width= 0;
     maxNumberOfGroups = 0;
-    bzero(keysPerMod,sizeof(keysPerMod));
-    memcpy(keyc->modifierMap,xkb->map->modmap,xkb->max_key_code+1);
     if ((xkb->min_key_code==keyc->curKeySyms.minKeyCode)&&
 	(xkb->max_key_code==keyc->curKeySyms.maxKeyCode)) {
 	first= firstCommon= xkb->min_key_code;
@@ -590,10 +587,7 @@ unsigned	 	check;
 	XkbDescPtr	xkb= kbd->key->xkbInfo->desc;
 
 	XkbSetCauseCoreReq(&cause,X_SetModifierMapping,client);
-
 	num = xkb->max_key_code-xkb->min_key_code+1;
-	memcpy(xkb->map->modmap,kbd->key->modifierMap,xkb->max_key_code+1);
-
 	changes.map.changed|= XkbModifierMapMask;
 	changes.map.first_modmap_key= xkb->min_key_code;
 	changes.map.num_modmap_keys= num;
commit f062e90a95f9b7ae5458ef2100615e8ace9b66a7
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Wed Apr 16 19:15:30 2008 +0300

    Input: Remove modifierKeyMap
    
    Since modifierKeyMap is generated from modifierMap, just remove it, and
    only generate it when we need to send the modifier map to the client.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 1b2c463..824972c 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -201,21 +201,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
 
     memcpy(mk->modifierMap, dk->modifierMap, MAP_LENGTH);
 
-    if (dk->maxKeysPerModifier)
-    {
-        mk->modifierKeyMap = xrealloc(mk->modifierKeyMap,
-                                      8 * dk->maxKeysPerModifier);
-        if (!mk->modifierKeyMap)
-            FatalError("[Xi] no memory for class shift.\n");
-        memcpy(mk->modifierKeyMap, dk->modifierKeyMap,
-                (8 * dk->maxKeysPerModifier));
-    } else
-    {
-        xfree(mk->modifierKeyMap);
-        mk->modifierKeyMap = NULL;
-    }
-
-    mk->maxKeysPerModifier = dk->maxKeysPerModifier;
     mk->curKeySyms.minKeyCode = dk->curKeySyms.minKeyCode;
     mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
     SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
@@ -498,7 +483,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
 
     if (from->key)
     {
-        KeyCode             *oldModKeyMap;
         KeySym              *oldMap;
         struct _XkbSrvInfo  *oldXkbInfo;
         if (!to->key)
@@ -515,7 +499,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
                 classes->key = NULL;
         }
 
-        oldModKeyMap    = to->key->modifierKeyMap;
         oldMap          = to->key->curKeySyms.map;
         oldXkbInfo      = to->key->xkbInfo;
 
@@ -528,7 +511,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
             memcpy(oldMap, from->key->curKeySyms.map, bytes);
         }
 
-        to->key->modifierKeyMap = oldModKeyMap;
         to->key->curKeySyms.map = oldMap;
         to->key->xkbInfo        = oldXkbInfo;
 
@@ -1664,86 +1646,6 @@ SetButtonMapping(ClientPtr client, DeviceIntPtr dev, int nElts, BYTE * map)
     return Success;
 }
 
-int
-SetModifierMapping(ClientPtr client, DeviceIntPtr dev, int len, int rlen,
-		   int numKeyPerModifier, KeyCode * inputMap, KeyClassPtr * k)
-{
-    KeyCode *map = NULL;
-    int inputMapLen;
-    int i;
-
-    *k = dev->key;
-    if (*k == NULL)
-	return BadMatch;
-    if (len != ((numKeyPerModifier << 1) + rlen))
-	return BadLength;
-
-    inputMapLen = 8 * numKeyPerModifier;
-
-    /*
-     *  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] < (*k)->curKeySyms.minKeyCode
-		|| inputMap[i] > (*k)->curKeySyms.maxKeyCode)) {
-	    client->errorValue = inputMap[i];
-	    return -1;	/* BadValue collides with MappingFailed */
-	}
-    }
-
-    /*
-     *  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(dev, (*k)->modifierKeyMap,
-			      (int)(*k)->maxKeysPerModifier, inputMap,
-			      (int)numKeyPerModifier)
-	|| !AllModifierKeysAreUp(dev, inputMap, (int)numKeyPerModifier,
-				 (*k)->modifierKeyMap,
-				 (int)(*k)->maxKeysPerModifier)) {
-	return MappingBusy;
-    } else {
-	for (i = 0; i < inputMapLen; i++) {
-	    if (inputMap[i] && !LegalModifier(inputMap[i], dev)) {
-		return MappingFailed;
-	    }
-	}
-    }
-
-    /*
-     *  Now build the keyboard's modifier bitmap from the
-     *  list of keycodes.
-     */
-    if (inputMapLen) {
-	map = (KeyCode *) xalloc(inputMapLen);
-	if (!map)
-	    return BadAlloc;
-    }
-    if ((*k)->modifierKeyMap)
-	xfree((*k)->modifierKeyMap);
-    if (inputMapLen) {
-	(*k)->modifierKeyMap = map;
-	memmove((char *)(*k)->modifierKeyMap, (char *)inputMap, inputMapLen);
-    } else
-	(*k)->modifierKeyMap = NULL;
-
-    (*k)->maxKeysPerModifier = numKeyPerModifier;
-    for (i = 0; i < MAP_LENGTH; i++)
-	(*k)->modifierMap[i] = 0;
-    for (i = 0; i < inputMapLen; i++)
-	if (inputMap[i]) {
-	    (*k)->modifierMap[inputMap[i]]
-		|= (1 << (i / (*k)->maxKeysPerModifier));
-	}
-
-    return (MappingSuccess);
-}
-
 void
 SendDeviceMappingNotify(ClientPtr client, CARD8 request,
 			KeyCode firstKeyCode, CARD8 count, DeviceIntPtr dev)
diff --git a/Xi/getmmap.c b/Xi/getmmap.c
index 0ae2ccc..ddf27a5 100644
--- a/Xi/getmmap.c
+++ b/Xi/getmmap.c
@@ -87,36 +87,34 @@ SProcXGetDeviceModifierMapping(ClientPtr client)
 int
 ProcXGetDeviceModifierMapping(ClientPtr client)
 {
-    CARD8 maxkeys;
     DeviceIntPtr dev;
     xGetDeviceModifierMappingReply rep;
-    KeyClassPtr kp;
-    int rc;
+    KeyCode *modkeymap = NULL;
+    int ret, max_keys_per_mod;
 
     REQUEST(xGetDeviceModifierMappingReq);
     REQUEST_SIZE_MATCH(xGetDeviceModifierMappingReq);
 
-    rc = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
-    if (rc != Success)
-	return rc;
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixGetAttrAccess);
+    if (ret != Success)
+	return ret;
 
-    kp = dev->key;
-    if (kp == NULL)
-	return BadMatch;
-
-    maxkeys = kp->maxKeysPerModifier;
+    ret = generate_modkeymap(client, dev, &modkeymap, &max_keys_per_mod);
+    if (ret != Success)
+        return ret;
 
     rep.repType = X_Reply;
     rep.RepType = X_GetDeviceModifierMapping;
-    rep.numKeyPerModifier = maxkeys;
+    rep.numKeyPerModifier = max_keys_per_mod;
     rep.sequenceNumber = client->sequence;
     /* length counts 4 byte quantities - there are 8 modifiers 1 byte big */
-    rep.length = 2 * maxkeys;
+    rep.length = max_keys_per_mod << 1;
 
     WriteReplyToClient(client, sizeof(xGetDeviceModifierMappingReply), &rep);
+    WriteToClient(client, max_keys_per_mod * 8, (char *) modkeymap);
+
+    xfree(modkeymap);
 
-    /* Reply with the (modified by DDX) map that SetModifierMapping passed in */
-    WriteToClient(client, 8 * maxkeys, (char *)kp->modifierKeyMap);
     return Success;
 }
 
diff --git a/Xi/setmmap.c b/Xi/setmmap.c
index ddfc1bd..8a0ab3e 100644
--- a/Xi/setmmap.c
+++ b/Xi/setmmap.c
@@ -91,33 +91,39 @@ ProcXSetDeviceModifierMapping(ClientPtr client)
     int ret;
     xSetDeviceModifierMappingReply rep;
     DeviceIntPtr dev;
-    KeyClassPtr kp;
 
     REQUEST(xSetDeviceModifierMappingReq);
     REQUEST_AT_LEAST_SIZE(xSetDeviceModifierMappingReq);
 
-    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
-    if (ret != Success)
-	return ret;
+    if (stuff->length != ((sizeof(xSetDeviceModifierMappingReq) >> 2) +
+                          (stuff->numKeyPerModifier << 1)))
+        return BadLength;
 
     rep.repType = X_Reply;
     rep.RepType = X_SetDeviceModifierMapping;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
 
-    ret = SetModifierMapping(client, dev, stuff->length,
-			     (sizeof(xSetDeviceModifierMappingReq) >> 2),
-			     stuff->numKeyPerModifier, (BYTE *) & stuff[1],
-			     &kp);
+    ret = dixLookupDevice(&dev, stuff->deviceid, client, DixManageAccess);
+    if (ret != Success)
+        return ret;
+
+    ret = change_modmap(client, dev, (KeyCode *) &stuff[1],
+                        stuff->numKeyPerModifier);
+    if (ret == Success)
+        ret = MappingSuccess;
 
     if (ret == MappingSuccess || ret == MappingBusy || ret == MappingFailed) {
 	rep.success = ret;
-	if (ret == MappingSuccess)
-	    SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev);
 	WriteReplyToClient(client, sizeof(xSetDeviceModifierMappingReply),
 			   &rep);
-    } else if (ret == -1)
-	return BadValue;
+    }
+    else if (ret == -1) {
+        return BadValue;
+    }
+    else {
+        return ret;
+    }
 
     return Success;
 }
diff --git a/dix/Makefile.am b/dix/Makefile.am
index 4c2395d..34eeb6d 100644
--- a/dix/Makefile.am
+++ b/dix/Makefile.am
@@ -25,6 +25,7 @@ libdix_la_SOURCES = 	\
 	glyphcurs.c	\
 	grabs.c		\
 	initatoms.c	\
+	inpututils.c	\
 	main.c		\
 	pixmap.c	\
 	privates.c	\
diff --git a/dix/devices.c b/dix/devices.c
index 6748e48..a4ff641 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -620,7 +620,6 @@ FreeDeviceClass(int type, pointer *class)
                     (*k)->xkbInfo = NULL;
                 }
                 xfree((*k)->curKeySyms.map);
-                xfree((*k)->modifierKeyMap);
                 xfree((*k));
                 break;
             }
@@ -1453,109 +1452,10 @@ BadDeviceMap(BYTE *buff, int length, unsigned low, unsigned high, XID *errval)
     return FALSE;
 }
 
-Bool
-AllModifierKeysAreUp(DeviceIntPtr dev, CARD8 *map1, int per1,
-                     CARD8 *map2, int per2)
-{
-    int i, j, k;
-    CARD8 *down = dev->key->down;
-
-    for (i = 8; --i >= 0; map2 += per2)
-    {
-	for (j = per1; --j >= 0; map1++)
-	{
-	    if (*map1 && BitIsOn(down, *map1))
-	    {
-		for (k = per2; (--k >= 0) && (*map1 != map2[k]);)
-		  ;
-		if (k < 0)
-		    return FALSE;
-	    }
-	}
-    }
-    return TRUE;
-}
-
-static int
-DoSetModifierMapping(ClientPtr client, KeyCode *inputMap,
-                     int numKeyPerModifier, xSetModifierMappingReply *rep)
-{
-    DeviceIntPtr pDev = NULL;
-    DeviceIntPtr cp = PickKeyboard(client); /* ClientPointer keyboard */
-    int rc, i = 0, inputMapLen = numKeyPerModifier * 8;
-
-    for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
-        if (pDev == cp || (!pDev->isMaster && (pDev->u.master == cp) && 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;
-                }
-            }
-
-	    rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
-	    if (rc != Success)
-		return rc;
-
-            /* 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)) {
-		rep->success = MappingBusy;
-                return Success;
-            }
-        }
-    }
-
-    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;
-                pDev->key->maxKeysPerModifier = 0;
-            }
-        }
-    }
-
-    rep->success = Success;
-    return Success;
-}
-
 int
 ProcSetModifierMapping(ClientPtr client)
 {
     xSetModifierMappingReply rep;
-    DeviceIntPtr dev;
     int rc;
     REQUEST(xSetModifierMappingReq);
     REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq);
@@ -1568,14 +1468,16 @@ ProcSetModifierMapping(ClientPtr client)
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
 
-    rc = DoSetModifierMapping(client, (KeyCode *)&stuff[1],
-			      stuff->numKeyPerModifier, &rep);
-    if (rc != Success)
+    rc = change_modmap(client, PickKeyboard(client), (KeyCode *)&stuff[1],
+                       stuff->numKeyPerModifier);
+    if (rc == MappingFailed || rc == -1)
+        rc = BadValue;
+    if (rc != Success && rc != MappingSuccess && rc != MappingFailed &&
+        rc != MappingBusy)
 	return rc;
 
-    for (dev = inputInfo.devices; dev; dev = dev->next)
-        if (dev->key && dev->coreEvents)
-            SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev);
+    rep.success = rc;
+
     WriteReplyToClient(client, sizeof(xSetModifierMappingReply), &rep);
     return client->noClientException;
 }
@@ -1584,26 +1486,26 @@ int
 ProcGetModifierMapping(ClientPtr client)
 {
     xGetModifierMappingReply rep;
-    DeviceIntPtr dev = PickKeyboard(client);
-    KeyClassPtr keyc = dev->key;
-    int rc;
+    int ret, max_keys_per_mod = 0;
+    KeyCode *modkeymap = NULL;
     REQUEST_SIZE_MATCH(xReq);
 
-    rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
-    if (rc != Success)
-	return rc;
+    ret = generate_modkeymap(client, PickKeyboard(client), &modkeymap,
+                             &max_keys_per_mod);
+    if (ret != Success)
+        return ret;
 
     rep.type = X_Reply;
-    rep.numKeyPerModifier = keyc->maxKeysPerModifier;
+    rep.numKeyPerModifier = max_keys_per_mod;
     rep.sequenceNumber = client->sequence;
     /* length counts 4 byte quantities - there are 8 modifiers 1 byte big */
-    rep.length = keyc->maxKeysPerModifier << 1;
+    rep.length = max_keys_per_mod << 1;
 
     WriteReplyToClient(client, sizeof(xGetModifierMappingReply), &rep);
+    (void)WriteToClient(client, max_keys_per_mod * 8, (char *) modkeymap);
+
+    xfree(modkeymap);
 
-    /* Use the (modified by DDX) map that SetModifierMapping passed in */
-    (void)WriteToClient(client, (int)(keyc->maxKeysPerModifier << 3),
-			(char *)keyc->modifierKeyMap);
     return client->noClientException;
 }
 
diff --git a/dix/getevents.c b/dix/getevents.c
index 112bb10..81e6608 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -84,22 +84,35 @@ GetMotionHistorySize(void)
     return MOTION_HISTORY_SIZE;
 }
 
-static void
-set_key_down(DeviceIntPtr pDev, int key_code)
+void
+set_key_down(DeviceIntPtr pDev, int key_code, int type)
 {
-    pDev->key->postdown[key_code >> 3] |= (1 << (key_code & 7));
+    if (type == KEY_PROCESSED)
+        pDev->key->down[key_code >> 3] |= (1 << (key_code & 7));
+    else
+        pDev->key->postdown[key_code >> 3] |= (1 << (key_code & 7));
 }
 
-static void
-set_key_up(DeviceIntPtr pDev, int key_code)
+void
+set_key_up(DeviceIntPtr pDev, int key_code, int type)
 {
-    pDev->key->postdown[key_code >> 3] &= ~(1 << (key_code & 7));
+    if (type == KEY_PROCESSED)
+        pDev->key->down[key_code >> 3] &= ~(1 << (key_code & 7));
+    else
+        pDev->key->postdown[key_code >> 3] &= ~(1 << (key_code & 7));
 }
 
-static Bool
-key_is_down(DeviceIntPtr pDev, int key_code)
+Bool
+key_is_down(DeviceIntPtr pDev, int key_code, int type)
 {
-    return !!(pDev->key->postdown[key_code >> 3] & (1 << (key_code & 7)));
+    int ret = 0;
+
+    if (type & KEY_PROCESSED)
+        ret |= !!(pDev->key->down[key_code >> 3] & (1 << (key_code & 7)));
+    else if (type & KEY_POSTED)
+        ret |= !!(pDev->key->postdown[key_code >> 3] & (1 << (key_code & 7)));
+
+    return ret;
 }
 
 static Bool
@@ -787,8 +800,6 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
                           int num_valuators, int *valuators) {
     int numEvents = 0;
     CARD32 ms = 0;
-    KeySym *map;
-    KeySym sym;
     deviceKeyButtonPointer *kbp = NULL;
 
     if (!events ||!pDev->key || !pDev->focus || !pDev->kbdfeed ||
@@ -798,16 +809,12 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
 
     numEvents = 1;
 
-    map = pDev->key->curKeySyms.map;
-    sym = map[(key_code - pDev->key->curKeySyms.minKeyCode)
-              * pDev->key->curKeySyms.mapWidth];
-
     events = updateFromMaster(events, pDev, &numEvents);
 
     numEvents += countValuatorEvents(num_valuators);
 
     /* Handle core repeating, via press/release/press/release. */
-    if (type == KeyPress && key_is_down(pDev, key_code)) {
+    if (type == KeyPress && key_is_down(pDev, key_code, KEY_POSTED)) {
         /* If autorepeating is disabled either globally or just for that key,
          * or we have a modifier, don't generate a repeat event. */
         if (!pDev->kbdfeed->ctrl.autoRepeat ||
@@ -824,11 +831,11 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
     kbp->detail = key_code;
     if (type == KeyPress) {
         kbp->type = DeviceKeyPress;
-	set_key_down(pDev, key_code);
+	set_key_down(pDev, key_code, KEY_POSTED);
     }
     else if (type == KeyRelease) {
         kbp->type = DeviceKeyRelease;
-	set_key_up(pDev, key_code);
+	set_key_up(pDev, key_code, KEY_POSTED);
     }
 
     events++;
diff --git a/dix/inpututils.c b/dix/inpututils.c
new file mode 100644
index 0000000..1adaa78
--- /dev/null
+++ b/dix/inpututils.c
@@ -0,0 +1,239 @@
+/*
+ * Copyright © 2008 Daniel Stone
+ *
+ * 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
+ * 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.
+ *
+ * Author: Daniel Stone <daniel at fooishbar.org>
+ */
+
+#ifdef HAVE_DIX_CONFIG_H
+#include "dix-config.h"
+#endif
+
+#include "exevents.h"
+#include "misc.h"
+#include "input.h"
+#include "inputstr.h"
+#include "xace.h"
+
+/* Check if a modifier map change is okay with the device.
+ * Returns -1 for BadValue, as it collides with MappingBusy; this particular
+ * caveat can be removed with LegalModifier, as we have no other reason to
+ * set MappingFailed.  Sigh. */
+static int
+check_modmap_change(ClientPtr client, DeviceIntPtr dev, KeyCode *modmap)
+{
+    int ret, i;
+    KeySymsPtr syms;
+
+    ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
+    if (ret != Success)
+        return ret;
+
+    if (!dev->key)
+        return BadMatch;
+    syms = &dev->key->curKeySyms;
+
+    for (i = 0; i < MAP_LENGTH; i++) {
+        if (!modmap[i])
+            continue;
+
+        /* Check that all the new modifiers fall within the advertised
+         * keycode range. */
+        if (i < syms->minKeyCode || i > syms->maxKeyCode) {
+            client->errorValue = i;
+            return -1;
+        }
+
+        /* Make sure the mapping is okay with the DDX. */
+        if (!LegalModifier(i, dev)) {
+            client->errorValue = i;
+            return MappingFailed;
+        }
+
+        /* None of the new modifiers may be down while we change the
+         * map. */
+        if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
+            client->errorValue = i;
+            return MappingBusy;
+        }
+    }
+
+    /* None of the old modifiers may be down while we change the map,
+     * either. */
+    for (i = syms->minKeyCode; i < syms->maxKeyCode; i++) {
+        if (!dev->key->modifierMap[i])
+            continue;
+        if (key_is_down(dev, i, KEY_POSTED | KEY_PROCESSED)) {
+            client->errorValue = i;
+            return MappingBusy;
+        }
+    }
+
+    return Success;
+}
+
+static int
+check_modmap_change_slave(ClientPtr client, DeviceIntPtr master,
+                          DeviceIntPtr slave, CARD8 *modmap)
+{
+    KeySymsPtr master_syms, slave_syms;
+    int i, j;
+
+    if (!slave->key || !master->key)
+        return 0;
+
+    master_syms = &master->key->curKeySyms;
+    slave_syms = &slave->key->curKeySyms;
+
+    /* Ignore devices with a clearly different keymap. */
+    if (slave_syms->minKeyCode != master_syms->minKeyCode ||
+        slave_syms->maxKeyCode != master_syms->maxKeyCode)
+        return 0;
+
+    for (i = 0; i < MAP_LENGTH; i++) {
+        if (!modmap[i])
+            continue;
+
+        /* If we have different symbols for any modifier on an
+         * extended keyboard, ignore the whole remap request. */
+        for (j = 0; j < slave_syms->mapWidth && j < master_syms->mapWidth; j++)
+            if (slave_syms->map[modmap[i] * slave_syms->mapWidth + j] !=
+                master_syms->map[modmap[i] * master_syms->mapWidth + j])
+                return 0;
+    }
+
+    if (check_modmap_change(client, slave, modmap) != Success)
+        return 0;
+
+    return 1;
+}
+
+/* Actually change the modifier map, and send notifications.  Cannot fail. */
+static void
+do_modmap_change(ClientPtr client, DeviceIntPtr dev, CARD8 *modmap)
+{
+    memcpy(dev->key->modifierMap, modmap, MAP_LENGTH);
+    SendDeviceMappingNotify(client, MappingModifier, 0, 0, dev);
+}
+
+/* Rebuild modmap (key -> mod) from map (mod -> key). */
+static int build_modmap_from_modkeymap(CARD8 *modmap, KeyCode *modkeymap,
+                                       int max_keys_per_mod)
+{
+    int i, mod = 0, len = max_keys_per_mod * 8;
+
+    memset(modmap, 0, MAP_LENGTH);
+
+    for (i = 0; i < len; i++) {
+        if (!modkeymap[i])
+            continue;
+
+        if (modmap[modkeymap[i]])
+            return BadValue;
+
+        if (!(i % max_keys_per_mod))
+            mod++;
+        modmap[modkeymap[i]] = mod;
+    }
+
+    return Success;
+}
+
+int
+change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *modkeymap,
+              int max_keys_per_mod)
+{
+    int ret;
+    CARD8 modmap[MAP_LENGTH];
+    DeviceIntPtr slave;
+
+    ret = build_modmap_from_modkeymap(modmap, modkeymap, max_keys_per_mod);
+    if (ret != Success)
+        return ret;
+
+    /* If we can't perform the change on the requested device, bail out. */
+    ret = check_modmap_change(client, dev, modmap);
+    if (ret != Success)
+        return ret;
+    do_modmap_change(client, dev, modmap);
+
+    /* If we're acting on a master, change the slaves as well. */
+    if (dev->isMaster) {
+        for (slave = inputInfo.devices; slave; slave = slave->next) {
+            if (slave != dev && !slave->isMaster && slave->u.master == dev)
+                if (check_modmap_change_slave(client, dev, slave, modmap))
+                    do_modmap_change(client, slave, modmap);
+        }
+    }
+
+    return Success;
+}
+
+int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
+                       KeyCode **modkeymap_out, int *max_keys_per_mod_out)
+{
+    CARD8 keys_per_mod[8];
+    int max_keys_per_mod;
+    KeyCode *modkeymap;
+    int i, j, ret;
+
+    ret = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixGetAttrAccess);
+    if (ret != Success)
+        return ret;
+
+    if (!dev->key)
+        return BadMatch;
+
+    /* Count the number of keys per modifier to determine how wide we
+     * should make the map. */
+    max_keys_per_mod = 0;
+    for (i = 0; i < 8; i++)
+        keys_per_mod[i] = 0;
+    for (i = 8; i < MAP_LENGTH; i++) {
+        for (j = 0; j < 8; j++) {
+            if (dev->key->modifierMap[i] & (1 << j)) {
+                if (++keys_per_mod[j] > max_keys_per_mod)
+                    max_keys_per_mod = keys_per_mod[j];
+            }
+        }
+    }
+
+    modkeymap = xcalloc(max_keys_per_mod * 8, sizeof(KeyCode));
+    if (!modkeymap)
+        return BadAlloc;
+
+    for (i = 0; i < 8; i++)
+        keys_per_mod[i] = 0;
+
+    for (i = 8; i < MAP_LENGTH; i++) {
+        for (j = 0; j < 8; j++) {
+            if (dev->key->modifierMap[i] & (1 << j)) {
+                modkeymap[(j * max_keys_per_mod) + keys_per_mod[j]] = i;
+                keys_per_mod[j]++;
+            }
+        }
+    }
+
+    *max_keys_per_mod_out = max_keys_per_mod;
+    *modkeymap_out = modkeymap;
+
+    return Success;
+}
diff --git a/hw/xquartz/quartzKeyboard.c b/hw/xquartz/quartzKeyboard.c
index 72f94b4..21736d1 100644
--- a/hw/xquartz/quartzKeyboard.c
+++ b/hw/xquartz/quartzKeyboard.c
@@ -370,6 +370,10 @@ void DarwinKeyboardReloadHandler(int screenNum, xEventPtr xe, DeviceIntPtr pDev,
     KeySymsRec keySyms;
 
     DEBUG_LOG("DarwinKeyboardReloadHandler\n");
+    if (pDev->key) {
+        if (pDev->key->curKeySyms.map) xfree(pDev->key->curKeySyms.map);
+        xfree(pDev->key);
+    }
 
     DarwinLoadKeyboardMapping(&keySyms);
     DarwinKeyboardSetDeviceKeyMap(&keySyms);
diff --git a/include/exevents.h b/include/exevents.h
index 2504baf..8ddfbf9 100644
--- a/include/exevents.h
+++ b/include/exevents.h
@@ -31,6 +31,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 #define EXEVENTS_H
 
 #include <X11/extensions/XIproto.h>
+#include "inputstr.h"
 
 /**
  * Attached to the devPrivates of each client. Specifies the version number as
@@ -136,15 +137,6 @@ extern _X_EXPORT int SetButtonMapping (
 	int                    /* nElts */,
 	BYTE *                 /* map */);
 
-extern _X_EXPORT int SetModifierMapping(
-	ClientPtr              /* client */,
-	DeviceIntPtr           /* dev */,
-	int                    /* len */,
-	int                    /* rlen */,
-	int                    /* numKeyPerModifier */,
-	KeyCode *              /* inputMap */,
-	KeyClassPtr *          /* k */);
-
 extern _X_EXPORT void SendDeviceMappingNotify(
         ClientPtr              /* client, */,
 	CARD8                  /* request, */,
diff --git a/include/input.h b/include/input.h
index db75f6c..a38dbfa 100644
--- a/include/input.h
+++ b/include/input.h
@@ -222,6 +222,15 @@ typedef struct _InputOption {
     struct _InputOption *next;
 } InputOption;
 
+/* Key has been run through all input processing and events sent to clients. */
+#define KEY_PROCESSED 1
+/* Key has not been fully processed, no events have been sent. */
+#define KEY_POSTED 2
+
+extern void set_key_down(DeviceIntPtr pDev, int key_code, int type);
+extern void set_key_up(DeviceIntPtr pDev, int key_code, int type);
+extern int key_is_down(DeviceIntPtr pDev, int key_code, int type);
+
 extern _X_EXPORT void InitCoreDevices(void);
 
 extern _X_EXPORT DeviceIntPtr AddInputDevice(
@@ -373,13 +382,6 @@ extern _X_EXPORT Bool BadDeviceMap(
     unsigned /*high*/,
     XID* /*errval*/);
 
-extern _X_EXPORT Bool AllModifierKeysAreUp(
-    DeviceIntPtr /*device*/,
-    CARD8* /*map1*/,
-    int /*per1*/,
-    CARD8* /*map2*/,
-    int /*per2*/);
-
 extern _X_EXPORT void NoteLedState(
     DeviceIntPtr /*keybd*/,
     int /*led*/,
@@ -498,6 +500,12 @@ extern _X_EXPORT int AllocMasterDevice(ClientPtr client,
 extern _X_EXPORT void DeepCopyDeviceClasses(DeviceIntPtr from,
                                   DeviceIntPtr to);
 
+/* Helper functions. */
+extern int generate_modkeymap(ClientPtr client, DeviceIntPtr dev,
+                              KeyCode **modkeymap, int *max_keys_per_mod);
+extern int change_modmap(ClientPtr client, DeviceIntPtr dev, KeyCode *map,
+                         int max_keys_per_mod);
+
 /* Implemented by the DDX. */
 extern _X_EXPORT int NewInputDeviceRequest(
     InputOption *options,
diff --git a/include/inputstr.h b/include/inputstr.h
index 7ff8dcb..cdd68d5 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -137,11 +137,9 @@ typedef struct _GrabRec {
 typedef struct _KeyClassRec {
     CARD8		down[DOWN_LENGTH];
     CARD8		postdown[DOWN_LENGTH];
-    KeyCode 		*modifierKeyMap;
     KeySymsRec		curKeySyms;
     int			modifierKeyCount[8];
     CARD8		modifierMap[MAP_LENGTH];
-    CARD8		maxKeysPerModifier;
     struct _XkbSrvInfo *xkbInfo;
 } KeyClassRec, *KeyClassPtr;
 
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index c7a6d99..8960bca 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -438,36 +438,7 @@ int			maxNumberOfGroups;
             if (nGroups > maxNumberOfGroups)
 		maxNumberOfGroups = nGroups;
 	}
-	if (_XkbCoreKeycodeInRange(keyc,key)) {
-	    if (keyc->modifierMap[key]!=0) {
-		register unsigned bit,i,mask;
-		mask= keyc->modifierMap[key];
-		for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
-		    if (mask&bit) {
-			keysPerMod[i]++;
-			if (keysPerMod[i]>maxKeysPerMod)
-			    maxKeysPerMod= keysPerMod[i];
-		    }
-		}
-	    }
-	}
-    }
-
-    if (maxKeysPerMod>0) {
-	tmp= maxKeysPerMod*XkbNumModifiers;
-	if (keyc->modifierKeyMap==NULL)
-	    keyc->modifierKeyMap= (KeyCode *)_XkbCalloc(1, tmp);
-	else if (keyc->maxKeysPerModifier<maxKeysPerMod)
-	    keyc->modifierKeyMap= (KeyCode *)_XkbRealloc(keyc->modifierKeyMap,tmp);
-	if (keyc->modifierKeyMap==NULL)
-	    FatalError("Couldn't allocate modifierKeyMap in UpdateCore\n");
-	bzero(keyc->modifierKeyMap,tmp);
     }
-    else if ((keyc->maxKeysPerModifier>0)&&(keyc->modifierKeyMap!=NULL)) {
-	_XkbFree(keyc->modifierKeyMap);
-	keyc->modifierKeyMap= NULL;
-    }
-    keyc->maxKeysPerModifier= maxKeysPerMod;
 
     if (maxSymsPerKey>0) {
 	/* See Section 12.4 of the XKB Protocol spec. Because of the
@@ -489,7 +460,6 @@ int			maxNumberOfGroups;
     }
     keyc->curKeySyms.mapWidth= maxSymsPerKey;
 
-    bzero(keysPerMod,sizeof(keysPerMod));
     for (key=firstCommon;key<=lastCommon;key++) {
 	if (keyc->curKeySyms.map!=NULL) {
 	    KeySym *pCore,*pXKB;
@@ -568,17 +538,6 @@ int			maxNumberOfGroups;
 		pXKB+= XkbKeyGroupsWidth(xkb,key);
 	    }
 	}
-	if (keyc->modifierMap[key]!=0) {
-	    register unsigned bit,i,mask;
-	    mask= keyc->modifierMap[key];
-	    for (i=0,bit=1;i<XkbNumModifiers;i++,bit<<=1) {
-		if (mask&bit) {
-		    tmp= i*maxKeysPerMod+keysPerMod[i];
-		    keyc->modifierKeyMap[tmp]= key;
-		    keysPerMod[i]++;
-		}
-	    }
-	}
     }
     return;
 }
commit cf6a2fc2bd94b392cfea120444d5e032d26f1d37
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sun Mar 30 17:25:39 2008 +0300

    Input: Ignore modifiers in core input processing
    
    Modifiers get cleared by the XKB code when we drop down into core input
    processing, so just delete the dead code path to simplify things a bit.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index fec0dab..1b2c463 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -763,8 +763,6 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
     ValuatorClassPtr v  = NULL;
     deviceValuator *xV  = (deviceValuator *) xE;
     BYTE *kptr          = NULL;
-    CARD16 modifiers    = 0,
-           mask         = 0;
 
     /* This event is always the first we get, before the actual events with
      * the data. However, the way how the DDX is set up, "device" will
@@ -855,7 +853,6 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
         if (!k)
             return DONT_PROCESS;
 
-	modifiers = k->modifierMap[key];
 	kptr = &k->down[key >> 3];
 	if (*kptr & bit) {	/* allow ddx to generate multiple downs */
 	    return IS_REPEAT;
@@ -863,13 +860,6 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
 	if (device->valuator)
 	    device->valuator->motionHintWindow = NullWindow;
 	*kptr |= bit;
-	for (i = 0, mask = 1; modifiers; i++, mask <<= 1) {
-	    if (mask & modifiers) {
-		/* This key affects modifier "i" */
-		k->modifierKeyCount[i]++;
-		modifiers &= ~mask;
-	    }
-	}
     } else if (xE->u.u.type == DeviceKeyRelease) {
         if (!k)
             return DONT_PROCESS;
@@ -877,19 +867,9 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
 	kptr = &k->down[key >> 3];
 	if (!(*kptr & bit))	/* guard against duplicates */
 	    return DONT_PROCESS;
-	modifiers = k->modifierMap[key];
 	if (device->valuator)
 	    device->valuator->motionHintWindow = NullWindow;
 	*kptr &= ~bit;
-	for (i = 0, mask = 1; modifiers; i++, mask <<= 1) {
-	    if (mask & modifiers) {
-		/* This key affects modifier "i" */
-		if (--k->modifierKeyCount[i] <= 0) {
-		    k->modifierKeyCount[i] = 0;
-		}
-		modifiers &= ~mask;
-	    }
-	}
     } else if (xE->u.u.type == DeviceButtonPress) {
         if (!b)
             return DONT_PROCESS;
diff --git a/dix/events.c b/dix/events.c
index 3a40dcb..5e8fc9b 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3663,7 +3663,6 @@ CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
 {
     int             key, bit;
     BYTE            *kptr;
-    CARD8           modifiers;
     GrabPtr         grab;
     GrabInfoPtr     grabinfo;
     Bool            deactivateGrab = FALSE;
@@ -3694,7 +3693,6 @@ CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
     key = xE->u.u.detail;
     kptr = &keyc->down[key >> 3];
     bit = 1 << (key & 7);
-    modifiers = keyc->modifierMap[key];
 
     switch (xE->u.u.type)
     {
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 272a785..c46bd84 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -798,7 +798,6 @@ _XkbFilterRedirectKey(	XkbSrvInfoPtr	xkbi,
 			unsigned	keycode,
 			XkbAction *	pAction)
 {
-unsigned	realMods = 0;
 xEvent 		ev;
 int		x,y;
 XkbStateRec	old;
@@ -852,13 +851,10 @@ ProcessInputProc backupproc;
 	    XkbComputeDerivedState(xkbi);
 	}
 
-	realMods = xkbi->device->key->modifierMap[ev.u.u.detail];
-	xkbi->device->key->modifierMap[ev.u.u.detail] = 0;
 	UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
 	xkbi->device->public.processInputProc(&ev,xkbi->device,1);
 	COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
 				     backupproc,xkbUnwrapProc);
-	xkbi->device->key->modifierMap[ev.u.u.detail] = realMods;
 	
 	if ( mask || mods )
 	    xkbi->state= old;
@@ -887,13 +883,10 @@ ProcessInputProc backupproc;
 	    XkbComputeDerivedState(xkbi);
 	}
 
-	realMods = xkbi->device->key->modifierMap[ev.u.u.detail];
-	xkbi->device->key->modifierMap[ev.u.u.detail] = 0;
 	UNWRAP_PROCESS_INPUT_PROC(xkbi->device,xkbPrivPtr, backupproc);
 	xkbi->device->public.processInputProc(&ev,xkbi->device,1);
 	COND_WRAP_PROCESS_INPUT_PROC(xkbi->device, xkbPrivPtr,
 				     backupproc,xkbUnwrapProc);
-	xkbi->device->key->modifierMap[ev.u.u.detail] = realMods;
 
 	if ( mask || mods )
 	    xkbi->state= old;
@@ -1078,7 +1071,6 @@ void
 XkbHandleActions(DeviceIntPtr dev,DeviceIntPtr kbd,xEvent *xE,int count)
 {
 int		key,bit,i;
-CARD8		realMods = 0;
 XkbSrvInfoPtr	xkbi;
 KeyClassPtr	keyc;
 int		changed,sendEvent;
@@ -1216,19 +1208,15 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
 
     if (sendEvent) {
         DeviceIntPtr tmpdev;
-	if (keyEvent) {
-	    realMods = keyc->modifierMap[key];
-	    keyc->modifierMap[key] = 0;
+	if (keyEvent)
             tmpdev = dev;
-        } else
+        else
             tmpdev = GetPairedDevice(dev);
 
         UNWRAP_PROCESS_INPUT_PROC(tmpdev,xkbPrivPtr, backupproc);
         dev->public.processInputProc(xE,tmpdev,count);
         COND_WRAP_PROCESS_INPUT_PROC(tmpdev, xkbPrivPtr,
                                      backupproc,xkbUnwrapProc);
-        if (keyEvent)
-	    keyc->modifierMap[key] = realMods;
     }
     else if (keyEvent) {
 	FixKeyState(xE,dev);
commit 6727ee94086d238f9f99379280d4e4827f388cce
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Sat Aug 9 16:45:45 2008 +0300

    Input: Remove state from KeyClassRec
    
    We already have state fully stored within XKB, so instead of duplicating it,
    just generate the values to send to clients when required.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 323bc8d..fec0dab 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -220,28 +220,19 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
     mk->curKeySyms.maxKeyCode = dk->curKeySyms.maxKeyCode;
     SetKeySymsMap(&mk->curKeySyms, &dk->curKeySyms);
 
-    /*
-     * Copy state from the extended keyboard to core.  If you omit this,
-     * holding Ctrl on keyboard one, and pressing Q on keyboard two, will
-     * cause your app to quit.  This feels wrong to me, hence the below
-     * code.
-     *
-     * XXX: If you synthesise core modifier events, the state will get
-     *      clobbered here.  You'll have to work out something sensible
-     *      to fix that.  Good luck.
-     */
-
-#define KEYBOARD_MASK (ShiftMask | LockMask | ControlMask | Mod1Mask | \
-        Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask)
-    mk->state &= ~(KEYBOARD_MASK);
-    mk->state |= (dk->state & KEYBOARD_MASK);
-#undef KEYBOARD_MASK
     for (i = 0; i < 8; i++)
         mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
 
     if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
         FatalError("Couldn't pivot keymap from device to core!\n");
 
+    /* Copy the state here.  This means we'll only have consistency
+     * between state and active keymap, rather than between state and
+     * keycodes pressed, but there's pretty much no way to win here,
+     * so might as well go for the one that would seem to give the
+     * least nonsensical result. */
+    mk->xkbInfo->state = dk->xkbInfo->state;
+
     if (lastMapNotifyDevice != master) {
         SendMappingNotify(master, MappingKeyboard,
                            mk->curKeySyms.minKeyCode,
@@ -250,13 +241,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
                           serverClient);
         lastMapNotifyDevice = master;
     }
-
-    /* Copy the state here.  This means we'll only have consistency
-     * between state and active keymap, rather than between state and
-     * keycodes pressed, but there's pretty much no way to win here,
-     * so might as well go for the one that would seem to give the
-     * least nonsensical result. */
-    mk->xkbInfo->state = dk->xkbInfo->state;
 }
 
 /**
@@ -879,12 +863,10 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
 	if (device->valuator)
 	    device->valuator->motionHintWindow = NullWindow;
 	*kptr |= bit;
-	k->prev_state = k->state;
 	for (i = 0, mask = 1; modifiers; i++, mask <<= 1) {
 	    if (mask & modifiers) {
 		/* This key affects modifier "i" */
 		k->modifierKeyCount[i]++;
-		k->state |= mask;
 		modifiers &= ~mask;
 	    }
 	}
@@ -899,13 +881,11 @@ UpdateDeviceState(DeviceIntPtr device, xEvent* xE, int count)
 	if (device->valuator)
 	    device->valuator->motionHintWindow = NullWindow;
 	*kptr &= ~bit;
-	k->prev_state = k->state;
 	for (i = 0, mask = 1; modifiers; i++, mask <<= 1) {
 	    if (mask & modifiers) {
 		/* This key affects modifier "i" */
 		if (--k->modifierKeyCount[i] <= 0) {
 		    k->modifierKeyCount[i] = 0;
-		    k->state &= ~mask;
 		}
 		modifiers &= ~mask;
 	    }
@@ -1003,7 +983,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
     }
 
     /* State needs to be assembled BEFORE the device is updated. */
-    state = (kbd) ? kbd->key->state : 0;
+    state = (kbd) ? XkbStateFieldFromRec(&kbd->key->xkbInfo->state) : 0;
     state |= (mouse) ? (mouse->button->state) : 0;
 
     ret = UpdateDeviceState(device, xE, count);
@@ -1047,7 +1027,7 @@ ProcessOtherEvent(xEventPtr xE, DeviceIntPtr device, int count)
 			   device->name);
 	    xV->device_state = 0;
 	    if (k)
-		xV->device_state |= k->state;
+		xV->device_state |= XkbStateFieldFromRec(&k->xkbInfo->state);
 	    if (b)
 		xV->device_state |= b->state;
 	}
diff --git a/Xi/querydp.c b/Xi/querydp.c
index 8d8be81..ab59e66 100644
--- a/Xi/querydp.c
+++ b/Xi/querydp.c
@@ -42,6 +42,7 @@
 #include "extnsionst.h"
 #include "exevents.h"
 #include "exglobals.h"
+#include "xkbsrv.h"
 
 #ifdef PANORAMIX
 #include "panoramiXsrv.h"
@@ -105,7 +106,9 @@ ProcXQueryDevicePointer(ClientPtr client)
     rep.RepType = X_QueryDevicePointer;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
-    rep.mask = pDev->button->state | (kbd && kbd->key) ? kbd->key->state : 0;
+    rep.mask = pDev->button->state;
+    if (kbd && kbd->key)
+        rep.mask |= XkbStateFieldFromRec(&kbd->key->xkbInfo->state);
     rep.root = (GetCurrentRootWindow(pDev))->drawable.id;
     rep.rootX = pSprite->hot.x;
     rep.rootY = pSprite->hot.y;
diff --git a/dix/events.c b/dix/events.c
index 95bb3e9..3a40dcb 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3683,11 +3683,14 @@ CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
 	    CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo);
 	}
     }
+
     /* ProcessOtherEvent already updated the keyboard's state, so we need to
      * access prev_state here! */
-    XE_KBPTR.state = (keyc->prev_state | GetPairedDevice(keybd)->button->state);
+    XE_KBPTR.state = XkbStateFieldFromRec(&keybd->key->xkbInfo->prev_state);
+    XE_KBPTR.state |= GetPairedDevice(keybd)->button->state;
     XE_KBPTR.rootX = keybd->spriteInfo->sprite->hot.x;
     XE_KBPTR.rootY = keybd->spriteInfo->sprite->hot.y;
+
     key = xE->u.u.detail;
     kptr = &keyc->down[key >> 3];
     bit = 1 << (key & 7);
@@ -4800,7 +4803,8 @@ ProcQueryPointer(ClientPtr client)
 	MaybeStopHint(mouse, client);
     rep.type = X_Reply;
     rep.sequenceNumber = client->sequence;
-    rep.mask = mouse->button->state | kbd->key->state;
+    rep.mask = mouse->button->state;
+    rep.mask |= XkbStateFieldFromRec(&inputInfo.keyboard->key->xkbInfo->state);
     rep.length = 0;
     rep.root = (RootWindow(mouse))->drawable.id;
     rep.rootX = pSprite->hot.x;
diff --git a/hw/dmx/input/atKeynames.h b/hw/dmx/input/atKeynames.h
index 85f13ac..e632ca2 100644
--- a/hw/dmx/input/atKeynames.h
+++ b/hw/dmx/input/atKeynames.h
@@ -67,7 +67,6 @@
 #define ScrollLockMask	Mod5Mask
 
 #define KeyPressed(k) (keyc->postdown[k >> 3] & (1 << (k & 7)))
-#define ModifierDown(k) ((keyc->state & (k)) == (k))
 
 /*
  * NOTE: The AT/MF keyboards can generate (via the 8042) two (MF: three)
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 92f5216..2e38cf8 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -1925,7 +1925,8 @@ KdCheckLock (void)
         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;
+            /* FIXME: Just use XKB indicators! */
+            shouldBeSet = !!(XkbStateFieldFromRec(&keyc->xkbInfo->state) & LockMask);
             if (isSet != shouldBeSet)
                 KdSetLed (tmp, tmp->LockLed, shouldBeSet);
         }
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index b7036cd..2f8c689 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -1043,7 +1043,8 @@ DGAProcessKeyboardEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr keybd)
     de->u.event.dx = 0;
     de->u.event.dy = 0;
     de->u.event.screen = pScreen->myNum;
-    de->u.event.state = keyc->state | pointer->button->state;
+    de->u.event.state = XkbStateFieldFromRec(&keyc->xkbInfo->state);
+    de->u.event.state |= pointer->button->state;
 
     de->u.u.type = (IEventBase - 1) + coreEquiv; /* change to XI event */
     UpdateDeviceState(keybd, (xEvent*)de, 1);
@@ -1090,7 +1091,8 @@ DGAProcessPointerEvent (ScreenPtr pScreen, dgaEvent *de, DeviceIntPtr mouse)
      * Fill in remaining event state
      */
     de->u.event.screen = pScreen->myNum;
-    de->u.event.state = butc->state | GetPairedDevice(mouse)->key->state;
+    de->u.event.state = butc->state;
+    de->u.event.state |= XkbStateFieldFromRec(&GetPairedDevice(mouse)->key->xkbInfo->state);
 
     de->u.u.type = (IEventBase - 1) + coreEquiv; /* change to XI event */
     UpdateDeviceState(mouse, (xEvent*)de, 1);
diff --git a/hw/xfree86/common/xf86Events.c b/hw/xfree86/common/xf86Events.c
index 1babf12..a1beea0 100644
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -398,7 +398,6 @@ xf86PrintBacktrace(void)
 }
 
 #define KeyPressed(k) (keyc->postdown[k >> 3] & (1 << (k & 7)))
-#define ModifierDown(k) ((keyc->state & (k)) == (k))
 
 static void
 xf86ReleaseKeys(DeviceIntPtr pDev)
diff --git a/include/inputstr.h b/include/inputstr.h
index d1a965b..7ff8dcb 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -142,8 +142,6 @@ typedef struct _KeyClassRec {
     int			modifierKeyCount[8];
     CARD8		modifierMap[MAP_LENGTH];
     CARD8		maxKeysPerModifier;
-    unsigned short	state;
-    unsigned short	prev_state;
     struct _XkbSrvInfo *xkbInfo;
 } KeyClassRec, *KeyClassPtr;
 
diff --git a/xkb/xkb.c b/xkb/xkb.c
index ad3529d..21750c9 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -559,7 +559,7 @@ ProcXkbGetState(ClientPtr client)
     rep.sequenceNumber= client->sequence;
     rep.length = 0;
     rep.deviceID = dev->id;
-    rep.mods = dev->key->state&0xff;
+    rep.mods = XkbStateFieldFromRec(xkb) & 0xff;
     rep.baseMods = xkb->base_mods;
     rep.lockedMods = xkb->locked_mods;
     rep.latchedMods = xkb->latched_mods;
@@ -626,7 +626,6 @@ ProcXkbLatchLockState(ClientPtr client)
                 return status;
 
             XkbComputeDerivedState(tmpd->key->xkbInfo);
-            tmpd->key->state = XkbStateFieldFromRec(newState);
 
             changed = XkbStateChangedFlags(&oldState, newState);
             if (changed) {
diff --git a/xkb/xkbAccessX.c b/xkb/xkbAccessX.c
index 85d4096..b98b0d8 100644
--- a/xkb/xkbAccessX.c
+++ b/xkb/xkbAccessX.c
@@ -748,7 +748,6 @@ deviceKeyButtonPointer *kbp = xE;
 		XkbUpdateIndicators(dev,changed_leds,True,NULL,&cause);
 	    }
 	}
-	dev->key->state= XkbStateFieldFromRec(&xkbi->state);
     }
 
     if (((xkbi->flags&_XkbStateNotifyInProgress)==0)&&(changed!=0)) {
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 315ff0d..272a785 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -802,7 +802,7 @@ unsigned	realMods = 0;
 xEvent 		ev;
 int		x,y;
 XkbStateRec	old;
-unsigned	mods,mask,oldCoreState = 0,oldCorePrevState = 0;
+unsigned	mods,mask;
 xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device);
 ProcessInputProc backupproc;
 
@@ -843,8 +843,6 @@ ProcessInputProc backupproc;
 
 	if ( mask || mods ) {
 	    old= xkbi->state;
-	    oldCoreState= xkbi->device->key->state;
-	    oldCorePrevState= xkbi->device->key->prev_state;
 	    xkbi->state.base_mods&= ~mask;
 	    xkbi->state.base_mods|= (mods&mask);
 	    xkbi->state.latched_mods&= ~mask;
@@ -852,8 +850,6 @@ ProcessInputProc backupproc;
 	    xkbi->state.locked_mods&= ~mask;
 	    xkbi->state.locked_mods|= (mods&mask);
 	    XkbComputeDerivedState(xkbi);
-	    xkbi->device->key->state= xkbi->device->key->prev_state= 
-							xkbi->state.mods;
 	}
 
 	realMods = xkbi->device->key->modifierMap[ev.u.u.detail];
@@ -864,11 +860,8 @@ ProcessInputProc backupproc;
 				     backupproc,xkbUnwrapProc);
 	xkbi->device->key->modifierMap[ev.u.u.detail] = realMods;
 	
-	if ( mask || mods ) {
-	    xkbi->device->key->state= oldCoreState;
-	    xkbi->device->key->prev_state= oldCorePrevState;
+	if ( mask || mods )
 	    xkbi->state= old;
-	}
     }
     else if (filter->keycode==keycode) {
 
@@ -885,8 +878,6 @@ ProcessInputProc backupproc;
 
 	if ( mask || mods ) {
 	    old= xkbi->state;
-	    oldCoreState= xkbi->device->key->state;
-	    oldCorePrevState= xkbi->device->key->prev_state;
 	    xkbi->state.base_mods&= ~mask;
 	    xkbi->state.base_mods|= (mods&mask);
 	    xkbi->state.latched_mods&= ~mask;
@@ -894,8 +885,6 @@ ProcessInputProc backupproc;
 	    xkbi->state.locked_mods&= ~mask;
 	    xkbi->state.locked_mods|= (mods&mask);
 	    XkbComputeDerivedState(xkbi);
-	    xkbi->device->key->state= xkbi->device->key->prev_state= 
-							xkbi->state.mods;
 	}
 
 	realMods = xkbi->device->key->modifierMap[ev.u.u.detail];
@@ -906,11 +895,8 @@ ProcessInputProc backupproc;
 				     backupproc,xkbUnwrapProc);
 	xkbi->device->key->modifierMap[ev.u.u.detail] = realMods;
 
-	if ( mask || mods ) {
-	    xkbi->device->key->state= oldCoreState;
-	    xkbi->device->key->prev_state= oldCorePrevState;
+	if ( mask || mods )
 	    xkbi->state= old;
-	}
 
 	filter->keycode= 0;
 	filter->active= 0;
@@ -1250,8 +1236,6 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(dev);
 
     xkbi->prev_state= oldState;
     XkbComputeDerivedState(xkbi);
-    keyc->prev_state= keyc->state;
-    keyc->state= XkbStateFieldFromRec(&xkbi->state);
     changed = XkbStateChangedFlags(&oldState,&xkbi->state);
     if (genStateNotify) {
 	if (changed) {
commit 08363c5830bdea34012dcd954b45ccfdc79a3a7e
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Dec 26 18:38:25 2008 +1100

    Input: Overhaul keyboard initialisation process
    
    XkbInitKeyboardDeviceStruct is now the only valid keyboard
    initialisation: all the details are hidden behind here.  This now makes
    it impossible to supply a core keymap at startup.
    
    If dev->key is valid, dev->key->xkbInfo->desc is also valid.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index 1802b18..323bc8d 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -191,7 +191,6 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
 {
     static DeviceIntPtr lastMapNotifyDevice = NULL;
     KeyClassPtr mk, dk; /* master, device */
-    BOOL sendNotify = FALSE;
     int i;
 
     if (device == master)
@@ -240,14 +239,8 @@ CopyKeyClass(DeviceIntPtr device, DeviceIntPtr master)
     for (i = 0; i < 8; i++)
         mk->modifierKeyCount[i] = dk->modifierKeyCount[i];
 
-    if (dk->xkbInfo && dk->xkbInfo->desc) {
-        if (!mk->xkbInfo || !mk->xkbInfo->desc) {
-            XkbInitDevice(master);
-            XkbFinishDeviceInit(master);
-        }
-        if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
-            FatalError("Couldn't pivot keymap from device to core!\n");
-    }
+    if (!XkbCopyKeymap(dk->xkbInfo->desc, mk->xkbInfo->desc, True))
+        FatalError("Couldn't pivot keymap from device to core!\n");
 
     if (lastMapNotifyDevice != master) {
         SendMappingNotify(master, MappingKeyboard,
diff --git a/dix/devices.c b/dix/devices.c
index 9d6651d..6748e48 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -483,54 +483,24 @@ CoreKeyboardCtl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
 static int
 CoreKeyboardProc(DeviceIntPtr pDev, int what)
 {
-    CARD8 *modMap;
-    KeySymsRec keySyms;
-    XkbComponentNamesRec names;
-    ClassesPtr classes;
+    XkbRMLVOSet rmlvo;
 
     switch (what) {
     case DEVICE_INIT:
-        if (!(classes = xcalloc(1, sizeof(ClassesRec))))
-        {
-            ErrorF("[dix] Could not allocate device classes.\n");
-            return BadAlloc;
-        }
-
-        keySyms.minKeyCode = 8;
-        keySyms.maxKeyCode = 255;
-        keySyms.mapWidth = 4;
-        keySyms.map = (KeySym *)xcalloc(sizeof(KeySym),
-                                        (keySyms.maxKeyCode -
-                                         keySyms.minKeyCode + 1) *
-                                        keySyms.mapWidth);
-        if (!keySyms.map) {
-            ErrorF("[dix] Couldn't allocate core keymap\n");
-            xfree(classes);
-            return BadAlloc;
-        }
-
-        modMap = xcalloc(1, MAP_LENGTH);
-        if (!modMap) {
-            ErrorF("[dix] Couldn't allocate core modifier map\n");
-            xfree(classes);
-            return BadAlloc;
-        }
-
-        bzero(&names, sizeof(names));
-        XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modMap,
-                                    CoreKeyboardBell, CoreKeyboardCtl);
+        XkbGetRulesDflts(&rmlvo);
+        InitKeyboardDeviceStruct(pDev, &rmlvo, CoreKeyboardBell,
+                                 CoreKeyboardCtl);
+        return Success;
 
-        xfree(keySyms.map);
-        xfree(modMap);
-        break;
+    case DEVICE_ON:
+    case DEVICE_OFF:
+        return Success;
 
     case DEVICE_CLOSE:
-        break;
-
-    default:
-        break;
+        return Success;
     }
-    return Success;
+
+    return BadMatch;
 }
 
 /**
@@ -1102,73 +1072,7 @@ SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
     return TRUE;
 }
 
-static Bool
-InitModMap(KeyClassPtr keyc)
-{
-    int i, j;
-    CARD8 keysPerModifier[8];
-    CARD8 mask;
-
-    keyc->maxKeysPerModifier = 0;
-    for (i = 0; i < 8; i++)
-	keysPerModifier[i] = 0;
-    for (i = 8; i < MAP_LENGTH; i++)
-    {
-	for (j = 0, mask = 1; j < 8; j++, mask <<= 1)
-	{
-	    if (mask & keyc->modifierMap[i])
-	    {
-		if (++keysPerModifier[j] > keyc->maxKeysPerModifier)
-		    keyc->maxKeysPerModifier = keysPerModifier[j];
-	    }
-	}
-    }
-    keyc->modifierKeyMap = xcalloc(8, keyc->maxKeysPerModifier);
-    if (!keyc->modifierKeyMap && keyc->maxKeysPerModifier)
-	return (FALSE);
-    for (i = 0; i < 8; i++)
-	keysPerModifier[i] = 0;
-    for (i = 8; i < MAP_LENGTH; i++)
-    {
-	for (j = 0, mask = 1; j < 8; j++, mask <<= 1)
-	{
-	    if (mask & keyc->modifierMap[i])
-	    {
-		keyc->modifierKeyMap[(j*keyc->maxKeysPerModifier) +
-				     keysPerModifier[j]] = i;
-		keysPerModifier[j]++;
-	    }
-	}
-    }
-    return TRUE;
-}
-
-Bool
-InitKeyClassDeviceStruct(DeviceIntPtr dev, KeySymsPtr pKeySyms, CARD8 pModifiers[])
-{
-    KeyClassPtr keyc;
-
-    keyc = xcalloc(1, sizeof(KeyClassRec));
-    if (!keyc)
-	return FALSE;
-    keyc->curKeySyms.minKeyCode = pKeySyms->minKeyCode;
-    keyc->curKeySyms.maxKeyCode = pKeySyms->maxKeyCode;
-    if (pModifiers)
-	memmove((char *)keyc->modifierMap, (char *)pModifiers, MAP_LENGTH);
-    if (!SetKeySymsMap(&keyc->curKeySyms, pKeySyms) || !InitModMap(keyc))
-    {
-	xfree(keyc->curKeySyms.map);
-	xfree(keyc->modifierKeyMap);
-	xfree(keyc);
-	return FALSE;
-    }
-    dev->key = keyc;
-    dev->key->xkbInfo= NULL;
-    XkbInitDevice(dev);
-    return TRUE;
-}
-
-Bool
+_X_EXPORT Bool
 InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons,
                             CARD8 *map)
 {
@@ -1349,30 +1253,7 @@ InitFocusClassDeviceStruct(DeviceIntPtr dev)
     return TRUE;
 }
 
-Bool
-InitKbdFeedbackClassDeviceStruct(DeviceIntPtr dev, BellProcPtr bellProc,
-                                 KbdCtrlProcPtr controlProc)
-{
-    KbdFeedbackPtr feedc;
-
-    feedc = (KbdFeedbackPtr)xalloc(sizeof(KbdFeedbackClassRec));
-    if (!feedc)
-	return FALSE;
-    feedc->BellProc = bellProc;
-    feedc->CtrlProc = controlProc;
-    defaultKeyboardControl.autoRepeat = TRUE;
-    feedc->ctrl = defaultKeyboardControl;
-    feedc->ctrl.id = 0;
-    if ((feedc->next = dev->kbdfeed) != 0)
-	feedc->ctrl.id = dev->kbdfeed->ctrl.id + 1;
-    dev->kbdfeed = feedc;
-    feedc->xkb_sli= NULL;
-    XkbFinishDeviceInit(dev);
-    (*dev->kbdfeed->CtrlProc)(dev,&dev->kbdfeed->ctrl);
-    return TRUE;
-}
-
-Bool
+_X_EXPORT Bool
 InitPtrFeedbackClassDeviceStruct(DeviceIntPtr dev, PtrCtrlProcPtr controlProc)
 {
     PtrFeedbackPtr feedc;
@@ -1517,19 +1398,7 @@ InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons,
 	   InitPtrFeedbackClassDeviceStruct(dev, controlProc));
 }
 
-Bool
-InitKeyboardDeviceStruct(DevicePtr device, KeySymsPtr pKeySyms,
-                         CARD8 pModifiers[], BellProcPtr bellProc,
-                         KbdCtrlProcPtr controlProc)
-{
-    DeviceIntPtr dev = (DeviceIntPtr)device;
-
-    return(InitKeyClassDeviceStruct(dev, pKeySyms, pModifiers) &&
-	   InitFocusClassDeviceStruct(dev) &&
-	   InitKbdFeedbackClassDeviceStruct(dev, bellProc, controlProc));
-}
-
-void
+_X_EXPORT void
 SendMappingNotify(DeviceIntPtr pDev, unsigned request, unsigned firstKeyCode,
         unsigned count, ClientPtr client)
 {
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 670cc37..92f5216 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -746,7 +746,7 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
     DevicePtr   pDev = (DevicePtr)pDevice;
     KdKeyboardInfo *ki;
     Atom xiclass;
-    XkbComponentNamesRec names;
+    XkbRMLVOSet rmlvo;
 
     if (!pDev)
 	return BadImplementation;
@@ -795,16 +795,13 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
         KdInitModMap(ki);
         KdInitAutoRepeats(ki);
 
-        memset(&names, 0, sizeof(XkbComponentNamesRec));
-
-        XkbSetRulesDflts (ki->xkbRules, ki->xkbModel, ki->xkbLayout,
-                          ki->xkbVariant, ki->xkbOptions);
-
-        ret = XkbInitKeyboardDeviceStruct (pDevice,
-                                           &names,
-                                           &ki->keySyms,
-                                           ki->modmap,
-                                           KdBell, KdKbdCtrl);
+        memset(&rmlvo, 0, sizeof(rmlvo));
+        rmlvo.rules = ki->xkbRules;
+        rmlvo.model = ki->xkbModel;
+        rmlvo.layout = ki->xkbLayout;
+        rmlvo.variant = ki->xkbVariant;
+        rmlvo.options = ki->xkbOptions;
+        ret = InitKeyboardDeviceStruct (pDevice, &rmlvo, KdBell, KdKbdCtrl);
 	if (!ret) {
             ErrorF("Couldn't initialise keyboard %s\n", ki->name);
 	    return BadImplementation;
diff --git a/hw/vfb/InitInput.c b/hw/vfb/InitInput.c
index d2abfc2..e53ac4b 100644
--- a/hw/vfb/InitInput.c
+++ b/hw/vfb/InitInput.c
@@ -259,21 +259,19 @@ GetLK201Mappings(KeySymsPtr pKeySyms, CARD8 *pModMap)
 static int
 vfbKeybdProc(DeviceIntPtr pDevice, int onoff)
 {
-    KeySymsRec		keySyms;
-    CARD8 		modMap[MAP_LENGTH];
     DevicePtr pDev = (DevicePtr)pDevice;
+    XkbRMLVOSet rmlvo;
 
     switch (onoff)
     {
-    case DEVICE_INIT: 
-	GetLK201Mappings(&keySyms, modMap);
-	InitKeyboardDeviceStruct(pDev, &keySyms, modMap,
-			(BellProcPtr)NoopDDA, (KbdCtrlProcPtr)NoopDDA);
-	    break;
-    case DEVICE_ON: 
+    case DEVICE_INIT:
+        XkbGetRulesDflts(&rmlvo);
+	InitKeyboardDeviceStruct(pDevice, &rmlvo, NULL, NULL);
+        break;
+    case DEVICE_ON:
 	pDev->on = TRUE;
 	break;
-    case DEVICE_OFF: 
+    case DEVICE_OFF:
 	pDev->on = FALSE;
 	break;
     case DEVICE_CLOSE:
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index e6960c8..cbba3ed 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -83,7 +83,7 @@ typedef enum {
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
 #define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(5, 0)
-#define ABI_XINPUT_VERSION	SET_ABI_VERSION(4, 0)
+#define ABI_XINPUT_VERSION	SET_ABI_VERSION(5, 0)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(2, 0)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
 
diff --git a/include/input.h b/include/input.h
index cf546e0..db75f6c 100644
--- a/include/input.h
+++ b/include/input.h
@@ -53,6 +53,7 @@ SOFTWARE.
 #include <X11/Xmd.h>
 #include <X11/Xproto.h>
 #include "window.h"     /* for WindowPtr */
+#include "xkbrules.h"
 
 #define DEVICE_INIT	0
 #define DEVICE_ON	1
@@ -268,11 +269,6 @@ extern _X_EXPORT Bool SetKeySymsMap(
     KeySymsPtr /*dst*/,
     KeySymsPtr /*src*/);
 
-extern _X_EXPORT Bool InitKeyClassDeviceStruct(
-    DeviceIntPtr /*device*/,
-    KeySymsPtr /*pKeySyms*/,
-    CARD8 /*pModifiers*/[]);
-
 extern _X_EXPORT Bool InitButtonClassDeviceStruct(
     DeviceIntPtr /*device*/,
     int /*numButtons*/,
@@ -304,11 +300,6 @@ typedef void (*KbdCtrlProcPtr)(
     DeviceIntPtr /*device*/,
     KeybdCtrl * /*ctrl*/);
 
-extern _X_EXPORT Bool InitKbdFeedbackClassDeviceStruct(
-    DeviceIntPtr /*device*/,
-    BellProcPtr /*bellProc*/,
-    KbdCtrlProcPtr /*controlProc*/);
-
 typedef void (*PtrCtrlProcPtr)(
     DeviceIntPtr /*device*/,
     PtrCtrl * /*ctrl*/);
@@ -363,9 +354,8 @@ extern _X_EXPORT Bool InitPointerDeviceStruct(
     int /*numAxes*/);
 
 extern _X_EXPORT Bool InitKeyboardDeviceStruct(
-    DevicePtr /*device*/,
-    KeySymsPtr /*pKeySyms*/,
-    CARD8 /*pModifiers*/[],
+    DeviceIntPtr /*device*/,
+    XkbRMLVOSet * /*rmlvo*/,
     BellProcPtr /*bellProc*/,
     KbdCtrlProcPtr /*controlProc*/);
 
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index af87d8f..a28967c 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -54,6 +54,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 #include <X11/extensions/XKBproto.h>
 #include "xkbstr.h"
+#include "xkbrules.h"
 #include "inputstr.h"
 
 typedef struct _XkbInterest {
@@ -870,31 +871,18 @@ extern _X_EXPORT void XkbClearAllLatchesAndLocks(
 	XkbEventCausePtr	/* cause */
 );
 
+extern _X_EXPORT void	XkbGetRulesDflts(
+        XkbRMLVOSet *           /* rmlvo */
+);
+
 extern _X_EXPORT void	XkbSetRulesDflts(
-	char *			/* rulesFile */,
-	char *			/* model */,
-	char *			/* layout */,
-	char *			/* variant */,
-	char *			/* options */
+        XkbRMLVOSet *           /* rmlvo */
 );
 
 extern _X_EXPORT void	XkbDeleteRulesDflts(
 	void
 );
 
-extern _X_EXPORT void	XkbInitDevice(
-	DeviceIntPtr 	/* pXDev */
-);
-
-extern _X_EXPORT Bool	XkbInitKeyboardDeviceStruct(
-	DeviceIntPtr 		/* pXDev */,
-	XkbComponentNamesPtr	/* pNames */,
-	KeySymsPtr		/* pSyms */,
-	CARD8 			/* pMods */[],
-	BellProcPtr		/* bellProc */,
-	KbdCtrlProcPtr		/* ctrlProc */
-);
-
 extern _X_EXPORT int SProcXkbDispatch(
 	ClientPtr		/* client */
 );
@@ -922,10 +910,6 @@ extern _X_EXPORT Status	 XkbChangeKeycodeRange(
 	XkbChangesPtr		/* changes */
 );
 
-extern _X_EXPORT int XkbFinishDeviceInit(
-	DeviceIntPtr		/* pXDev */
-);
-
 extern _X_EXPORT void XkbFreeSrvLedInfo(
 	XkbSrvLedInfoPtr	/* sli */
 );
@@ -1021,6 +1005,11 @@ extern _X_EXPORT Bool XkbDDXNamesFromRules(
 	XkbComponentNamesPtr	/* names */
 );
 
+extern _X_EXPORT XkbDescPtr XkbCompileKeymap(
+        DeviceIntPtr    /* dev */,
+        XkbRMLVOSet *   /* rmlvo */
+);
+
 _XFUNCPROTOEND
 
 #define	XkbAtomGetString(s)	NameForAtom(s)
diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c
index b4ac535..c24b2cc 100644
--- a/xkb/ddxLoad.c
+++ b/xkb/ddxLoad.c
@@ -428,3 +428,36 @@ XkbRF_RulesPtr	rules;
 
     return complete;
 }
+
+XkbDescPtr
+XkbCompileKeymap(DeviceIntPtr dev, XkbRMLVOSet *rmlvo)
+{
+    XkbComponentNamesRec kccgst;
+    XkbRF_VarDefsRec mlvo;
+    XkbDescPtr xkb;
+    char name[PATH_MAX];
+
+    if (!dev || !rmlvo) {
+        LogMessage(X_ERROR, "XKB: No device or RMLVO specified\n");
+        return NULL;
+    }
+
+    mlvo.model = rmlvo->model;
+    mlvo.layout = rmlvo->layout;
+    mlvo.variant = rmlvo->variant;
+    mlvo.options = rmlvo->options;
+
+    /* XDNFR already logs for us. */
+    if (!XkbDDXNamesFromRules(dev, rmlvo->rules, &mlvo, &kccgst))
+        return NULL;
+
+    /* XDLKBN too, but it might return 0 as well as allocating. */
+    if (!XkbDDXLoadKeymapByNames(dev, &kccgst, XkmAllIndicesMask, 0, &xkb, name,
+                                 PATH_MAX)) {
+        if (xkb)
+            XkbFreeKeyboard(xkb, 0, TRUE);
+        return NULL;
+    }
+
+    return xkb;
+}
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index e800482..d85fbd4 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -93,36 +93,35 @@ char	*		XkbBaseDirectory=	XKB_BASE_DIRECTORY;
 char	*		XkbBinDirectory=	XKB_BIN_DIRECTORY;
 static int	 	XkbWantAccessX=		0;	
 
-static Bool		rulesDefined=		False;
-static char *		XkbRulesFile=		NULL;
+static char *		XkbRulesDflt=		NULL;
 static char *		XkbModelDflt=		NULL;
 static char *		XkbLayoutDflt=		NULL;
 static char *		XkbVariantDflt=		NULL;
 static char *		XkbOptionsDflt=		NULL;
 
+static char *           XkbRulesUsed=   NULL;
 static char *		XkbModelUsed=	NULL;
 static char *		XkbLayoutUsed=	NULL;
 static char *		XkbVariantUsed=	NULL;
 static char *		XkbOptionsUsed=	NULL;
 
-static XkbDescPtr       xkb_cached_map = NULL;
-
 static Bool		XkbWantRulesProp=	XKB_DFLT_RULES_PROP;
 
 /***====================================================================***/
 
-static char *
-XkbGetRulesDflts(XkbRF_VarDefsPtr defs)
+void
+XkbGetRulesDflts(XkbRMLVOSet *rmlvo)
 {
-    if (XkbModelDflt)	defs->model= XkbModelDflt;
-    else		defs->model= XKB_DFLT_MODEL;
-    if (XkbLayoutDflt)	defs->layout= XkbLayoutDflt;
-    else		defs->layout= XKB_DFLT_LAYOUT;
-    if (XkbVariantDflt)	defs->variant= XkbVariantDflt;
-    else		defs->variant= XKB_DFLT_VARIANT;
-    if (XkbOptionsDflt)	defs->options= XkbOptionsDflt;
-    else		defs->options= XKB_DFLT_OPTIONS;
-    return (rulesDefined?XkbRulesFile:XKB_DFLT_RULES);
+    if (XkbRulesDflt)   rmlvo->rules = XkbRulesDflt;
+    else                rmlvo->rules = XKB_DFLT_RULES;
+    if (XkbModelDflt)	rmlvo->model= XkbModelDflt;
+    else		rmlvo->model= XKB_DFLT_MODEL;
+    if (XkbLayoutDflt)	rmlvo->layout= XkbLayoutDflt;
+    else		rmlvo->layout= XKB_DFLT_LAYOUT;
+    if (XkbVariantDflt)	rmlvo->variant= XkbVariantDflt;
+    else		rmlvo->variant= XKB_DFLT_VARIANT;
+    if (XkbOptionsDflt)	rmlvo->options= XkbOptionsDflt;
+    else		rmlvo->options= XKB_DFLT_OPTIONS;
 }
 
 static Bool
@@ -132,9 +131,7 @@ int 			len,out;
 Atom			name;
 char *			pval;
 
-    if (rulesDefined && (!XkbRulesFile))
-	return False;
-    len= (XkbRulesFile?strlen(XkbRulesFile):strlen(XKB_DFLT_RULES));
+    len= (XkbRulesUsed?strlen(XkbRulesUsed):0);
     len+= (XkbModelUsed?strlen(XkbModelUsed):0);
     len+= (XkbLayoutUsed?strlen(XkbLayoutUsed):0);
     len+= (XkbVariantUsed?strlen(XkbVariantUsed):0);
@@ -156,12 +153,9 @@ char *			pval;
 	return True;
     }
     out= 0;
-    if (XkbRulesFile) {
-	strcpy(&pval[out],XkbRulesFile);
-	out+= strlen(XkbRulesFile);
-    } else {
-	strcpy(&pval[out],XKB_DFLT_RULES);
-	out+= strlen(XKB_DFLT_RULES);
+    if (XkbRulesUsed) {
+	strcpy(&pval[out],XkbRulesUsed);
+	out+= strlen(XkbRulesUsed);
     }
     pval[out++]= '\0';
     if (XkbModelUsed) {
@@ -195,71 +189,55 @@ char *			pval;
 }
 
 static void
-XkbSetRulesUsed(XkbRF_VarDefsPtr defs)
+XkbSetRulesUsed(XkbRMLVOSet *rmlvo)
 {
+    if (XkbRulesUsed)
+        _XkbFree(XkbRulesUsed);
+    XkbRulesUsed= (rmlvo->rules?_XkbDupString(rmlvo->rules):NULL);
     if (XkbModelUsed)
 	_XkbFree(XkbModelUsed);
-    XkbModelUsed= (defs->model?_XkbDupString(defs->model):NULL);
+    XkbModelUsed= (rmlvo->model?_XkbDupString(rmlvo->model):NULL);
     if (XkbLayoutUsed)
 	_XkbFree(XkbLayoutUsed);
-    XkbLayoutUsed= (defs->layout?_XkbDupString(defs->layout):NULL);
+    XkbLayoutUsed= (rmlvo->layout?_XkbDupString(rmlvo->layout):NULL);
     if (XkbVariantUsed)
 	_XkbFree(XkbVariantUsed);
-    XkbVariantUsed= (defs->variant?_XkbDupString(defs->variant):NULL);
+    XkbVariantUsed= (rmlvo->variant?_XkbDupString(rmlvo->variant):NULL);
     if (XkbOptionsUsed)
 	_XkbFree(XkbOptionsUsed);
-    XkbOptionsUsed= (defs->options?_XkbDupString(defs->options):NULL);
+    XkbOptionsUsed= (rmlvo->options?_XkbDupString(rmlvo->options):NULL);
     if (XkbWantRulesProp)
 	QueueWorkProc(XkbWriteRulesProp,NULL,NULL);
     return;
 }
 
-/**
- * Set the default RMLVO for the next device to be initialised.
- * If a parameter is NULL, the previous setting will be used. Use empty
- * strings if you want to delete a previous setting.
- *
- * If @rulesFile is NULL and no previous @rulesFile has been set, the
- * built-in default is chosen as default.
- */
 void
-XkbSetRulesDflts(char *rulesFile,char *model,char *layout,
-					char *variant,char *options)
+XkbSetRulesDflts(XkbRMLVOSet *rmlvo)
 {
-    if (!rulesFile && !XkbRulesFile)
-    {
-	LogMessage(X_WARNING, "[xkb] No rule given, and no previous rule "
-		              "defined. Defaulting to '%s'.\n",
-                              XKB_DFLT_RULES);
-	rulesFile = XKB_DFLT_RULES;
+    if (rmlvo->rules) {
+        if (XkbRulesDflt)
+	    _XkbFree(XkbRulesDflt);
+        XkbRulesDflt= _XkbDupString(rmlvo->rules);
     }
-
-    if (rulesFile) {
-	if (XkbRulesFile)
-	    _XkbFree(XkbRulesFile);
-	XkbRulesFile= _XkbDupString(rulesFile);
-	rulesDefined= True;
-    }
-
-    if (model) {
+    if (rmlvo->model) {
 	if (XkbModelDflt)
 	    _XkbFree(XkbModelDflt);
-	XkbModelDflt= _XkbDupString(model);
+	XkbModelDflt= _XkbDupString(rmlvo->model);
     }
-    if (layout) {
+    if (rmlvo->layout) {
 	if (XkbLayoutDflt)
 	    _XkbFree(XkbLayoutDflt);
-	XkbLayoutDflt= _XkbDupString(layout);
+	XkbLayoutDflt= _XkbDupString(rmlvo->layout);
     }
-    if (variant) {
+    if (rmlvo->variant) {
 	if (XkbVariantDflt)
 	    _XkbFree(XkbVariantDflt);
-	XkbVariantDflt= _XkbDupString(variant);
+	XkbVariantDflt= _XkbDupString(rmlvo->variant);
     }
-    if (options) {
+    if (rmlvo->options) {
 	if (XkbOptionsDflt)
 	    _XkbFree(XkbOptionsDflt);
-	XkbOptionsDflt= _XkbDupString(options);
+	XkbOptionsDflt= _XkbDupString(rmlvo->options);
     }
     return;
 }
@@ -267,8 +245,8 @@ XkbSetRulesDflts(char *rulesFile,char *model,char *layout,
 void
 XkbDeleteRulesDflts(void)
 {
-    _XkbFree(XkbRulesFile);
-    XkbRulesFile = NULL;
+    _XkbFree(XkbRulesDflt);
+    XkbRulesDflt = NULL;
     _XkbFree(XkbModelDflt);
     XkbModelDflt = NULL;
     _XkbFree(XkbLayoutDflt);
@@ -277,9 +255,6 @@ XkbDeleteRulesDflts(void)
     XkbVariantDflt = NULL;
     _XkbFree(XkbOptionsDflt);
     XkbOptionsDflt = NULL;
-
-    XkbFreeKeyboard(xkb_cached_map, XkbAllComponentsMask, True);
-    xkb_cached_map = NULL;
 }
 
 /***====================================================================***/
@@ -467,292 +442,123 @@ XkbControlsPtr	ctrls;
     return Success;
 }
 
-void
-XkbInitDevice(DeviceIntPtr pXDev)
+_X_EXPORT Bool
+InitKeyboardDeviceStruct(DeviceIntPtr dev, XkbRMLVOSet *rmlvo,
+                         BellProcPtr bell_func, KbdCtrlProcPtr ctrl_func)
 {
-int			i;
-XkbSrvInfoPtr		xkbi;
-XkbChangesRec		changes;
-unsigned		check;
-XkbEventCauseRec	cause;
-
-    bzero(&changes,sizeof(XkbChangesRec));
-    pXDev->key->xkbInfo= xkbi= _XkbTypedCalloc(1,XkbSrvInfoRec);
-    if ( xkbi ) {
-	XkbDescPtr	xkb;
+    int	i;
+    unsigned int check;
+    XkbSrvInfoPtr xkbi;
+    XkbDescPtr xkb;
+    XkbSrvLedInfoPtr sli;
+    XkbChangesRec changes;
+    XkbEventCauseRec cause;
+
+    if (dev->key || dev->kbdfeed || !rmlvo)
+	return False;
 
-        if (xkb_cached_map) {
-            xkbi->desc = xkb_cached_map;
-            xkb_cached_map = NULL;
-        }
-        else {
-            xkbi->desc= XkbAllocKeyboard();
-            if (!xkbi->desc)
-                FatalError("Couldn't allocate keyboard description\n");
-            xkbi->desc->min_key_code = pXDev->key->curKeySyms.minKeyCode;
-            xkbi->desc->max_key_code = pXDev->key->curKeySyms.maxKeyCode;
-        }
-	xkb= xkbi->desc;
-	if (xkb->min_key_code == 0)
-	    xkb->min_key_code = pXDev->key->curKeySyms.minKeyCode;
-	if (xkb->max_key_code == 0)
-	    xkb->max_key_code = pXDev->key->curKeySyms.maxKeyCode;
-	if ((pXDev->key->curKeySyms.minKeyCode!=xkbi->desc->min_key_code)||
-	    (pXDev->key->curKeySyms.maxKeyCode!=xkbi->desc->max_key_code)) {
-	    /* 12/9/95 (ef) -- XXX! Maybe we should try to fix up one or */
-	    /*                 the other here, but for now just complain */
-	    /*                 can't just update the core range without */
-	    /*                 reallocating the KeySymsRec (pain)       */
-	    ErrorF("[xkb] Internal Error!! XKB and core keymap have different range\n");
-	}
-	if (XkbAllocClientMap(xkb,XkbAllClientInfoMask,0)!=Success)
-	    FatalError("Couldn't allocate client map in XkbInitDevice\n");
-	i= XkbNumKeys(xkb)/3+1;
-	if (XkbAllocServerMap(xkb,XkbAllServerInfoMask,i)!=Success)
-	    FatalError("Couldn't allocate server map in XkbInitDevice\n");
-
-	xkbi->dfltPtrDelta=1;
-	xkbi->device = pXDev;
-
-	XkbInitSemantics(xkb);
-	XkbInitNames(xkbi);
-	XkbInitRadioGroups(xkbi);
-
-	/* 12/31/94 (ef) -- XXX! Should check if state loaded from file */
-	bzero(&xkbi->state,sizeof(XkbStateRec));
-
-	XkbInitControls(pXDev,xkbi);
-
-        if (xkb->defined & XkmSymbolsMask)
-            memcpy(pXDev->key->modifierMap, xkb->map->modmap,
-                   xkb->max_key_code + 1);
-        else
-            memcpy(xkb->map->modmap, pXDev->key->modifierMap,
-                   xkb->max_key_code + 1);
-
-	XkbInitIndicatorMap(xkbi);
-
-	XkbDDXInitDevice(pXDev);
-
-        if (xkb->defined & XkmSymbolsMask)
-            XkbUpdateCoreDescription(pXDev, True);
-        else
-            XkbUpdateKeyTypesFromCore(pXDev, xkb->min_key_code,
-                                      XkbNumKeys(xkb), &changes);
-
-	XkbSetCauseUnknown(&cause);
-	XkbUpdateActions(pXDev,xkb->min_key_code, XkbNumKeys(xkb),&changes,
-								&check,&cause);
-        /* For sanity.  The first time the connection
-         * is opened, the client side min and max are set
-         * using QueryMinMaxKeyCodes() which grabs them 
-	 * from pXDev.
-	 */
-	pXDev->key->curKeySyms.minKeyCode = xkb->min_key_code;
-	pXDev->key->curKeySyms.maxKeyCode = xkb->max_key_code;
+    memset(&changes, 0, sizeof(changes));
+    XkbSetCauseUnknown(&cause);
+
+    dev->key = xcalloc(1, sizeof(*dev->key));
+    if (!dev->key) {
+        ErrorF("XKB: Failed to allocate key class\n");
+        return False;
     }
-    return;
-}
 
-#if MAP_LENGTH > XkbMaxKeyCount
-#undef  XkbMaxKeyCount
-#define XkbMaxKeyCount MAP_LENGTH
-#endif
+    dev->kbdfeed = xcalloc(1, sizeof(*dev->kbdfeed));
+    if (!dev->kbdfeed) {
+        ErrorF("XKB: Failed to allocate key feedback class\n");
+        goto unwind_key;
+    }
 
-Bool
-XkbInitKeyboardDeviceStruct(
-    DeviceIntPtr		dev,
-    XkbComponentNamesPtr	names,
-    KeySymsPtr                  pSymsIn,
-    CARD8                       pModsIn[],
-    void                        (*bellProc)(
-        int /*percent*/,
-        DeviceIntPtr /*device*/,
-        pointer /*ctrl*/,
-        int),
-    void                        (*ctrlProc)(
-        DeviceIntPtr /*device*/,
-        KeybdCtrl * /*ctrl*/))
-{
-KeySymsRec		tmpSyms,*pSyms;
-CARD8			tmpMods[XkbMaxLegalKeyCode+1],*pMods;
-char			name[PATH_MAX],*rules;
-Bool			ok=False;
-XkbRF_VarDefsRec	defs;
-XkbDescPtr              xkb;
-
-    if ((dev->key!=NULL)||(dev->kbdfeed!=NULL))
-	return False;
-    pSyms= pSymsIn;
-    pMods= pModsIn;
-    bzero(&defs,sizeof(XkbRF_VarDefsRec));
-    rules= XkbGetRulesDflts(&defs);
-
-    /*
-     * The strings are duplicated because it is not guaranteed that
-     * they are allocated, or that they are allocated for every server
-     * generation. Eventually they will be freed at the end of this
-     * function.
-     */
-    names->keymap = NULL;
-    if (names->keycodes) names->keycodes = _XkbDupString(names->keycodes);
-    if (names->types) names->types = _XkbDupString(names->types);
-    if (names->compat) names->compat = _XkbDupString(names->compat);
-    if (names->geometry) names->geometry = _XkbDupString(names->geometry);
-    if (names->symbols) names->symbols = _XkbDupString(names->symbols);
-
-    if (defs.model && defs.layout && rules) {
-	XkbComponentNamesRec	rNames;
-	bzero(&rNames,sizeof(XkbComponentNamesRec));
-	if (XkbDDXNamesFromRules(dev,rules,&defs,&rNames)) {
-	    if (rNames.keycodes) {
-		if (!names->keycodes)
-		    names->keycodes =  rNames.keycodes;
-		else
-		    _XkbFree(rNames.keycodes);
-	    }
-	    if (rNames.types) {
-		if (!names->types)
-		    names->types = rNames.types;
-		else  _XkbFree(rNames.types);
-	    }
-	    if (rNames.compat) {
-		if (!names->compat) 
-		    names->compat =  rNames.compat;
-		else  _XkbFree(rNames.compat);
-	    }
-	    if (rNames.symbols) {
-		if (!names->symbols)
-		    names->symbols =  rNames.symbols;
-		else _XkbFree(rNames.symbols);
-	    }
-	    if (rNames.geometry) {
-		if (!names->geometry)
-		    names->geometry = rNames.geometry;
-		else _XkbFree(rNames.geometry);
-	    }
-	    XkbSetRulesUsed(&defs);
-	}
+    xkbi = xcalloc(1, sizeof(*xkbi));
+    if (!xkbi) {
+        ErrorF("XKB: Failed to allocate XKB info\n");
+        goto unwind_kbdfeed;
+    }
+    dev->key->xkbInfo = xkbi;
+
+    xkb = XkbCompileKeymap(dev, rmlvo);
+    if (!xkb) {
+        ErrorF("XKB: Failed to compile keymap\n");
+        goto unwind_info;
     }
+    xkbi->desc = xkb;
 
-    ok = (Bool) XkbDDXLoadKeymapByNames(dev,names,XkmAllIndicesMask,0,
-                                        &xkb,name,PATH_MAX);
+    if (xkb->min_key_code == 0)
+        xkb->min_key_code = 8;
+    if (xkb->max_key_code == 0)
+        xkb->max_key_code = 255;
 
-    if (ok && (xkb!=NULL)) {
-	KeyCode		minKC,maxKC;
+    i = XkbNumKeys(xkb) / 3 + 1;
+    if (XkbAllocClientMap(xkb, XkbAllClientInfoMask, 0) != Success)
+        goto unwind_desc;
+    if (XkbAllocServerMap(xkb, XkbAllServerInfoMask, i) != Success)
+        goto unwind_desc;
 
-	minKC= xkb->min_key_code;
-	maxKC= xkb->max_key_code;
-	if (XkbIsLegalKeycode(minKC)&&XkbIsLegalKeycode(maxKC)&&(minKC<=maxKC)&&
-	    ((minKC!=pSyms->minKeyCode)||(maxKC!=pSyms->maxKeyCode))) {
-	    if (xkb->map!=NULL) {
-		KeySym	*inSym,*outSym;
-		int	width= pSymsIn->mapWidth;
+    xkbi->dfltPtrDelta = 1;
+    xkbi->device = dev;
 
-		tmpSyms.minKeyCode= minKC;
-		tmpSyms.maxKeyCode= maxKC;
+    XkbInitSemantics(xkb);
+    XkbInitNames(xkbi);
+    XkbInitRadioGroups(xkbi);
 
-		if (minKC<pSymsIn->minKeyCode)
-		    minKC= pSymsIn->minKeyCode;
-		if (maxKC>pSymsIn->maxKeyCode)
-		    maxKC= pSymsIn->maxKeyCode;
+    XkbInitControls(dev, xkbi);
 
-		tmpSyms.mapWidth= width;
-		tmpSyms.map= _XkbTypedCalloc(width*XkbNumKeys(xkb),KeySym);
-		inSym= &pSymsIn->map[(minKC-pSymsIn->minKeyCode)*width];
-		outSym= &tmpSyms.map[(minKC-tmpSyms.minKeyCode)*width];
-		memcpy(outSym,inSym,((maxKC-minKC+1)*width)*sizeof(KeySym));
-		pSyms= &tmpSyms;
-	    }
-	    if ((xkb->map!=NULL)&&(xkb->map->modmap!=NULL)) {
-		bzero(tmpMods,XkbMaxKeyCount);
-		memcpy(tmpMods,xkb->map->modmap,maxKC+1);
-		pMods= tmpMods;
-	    }
-	}
-        /* Store the map here so we can pick it back up in XkbInitDevice.
-         * Sigh. */
-        xkb_cached_map = xkb;
-    }
-    else {
-	LogMessage(X_WARNING, "Couldn't load XKB keymap, falling back to pre-XKB keymap\n");
-    }
-    ok= InitKeyboardDeviceStruct((DevicePtr)dev,pSyms,pMods,bellProc,ctrlProc);
-    xkb_cached_map = NULL;
-    if ((pSyms==&tmpSyms)&&(pSyms->map!=NULL)) {
-	_XkbFree(pSyms->map);
-	pSyms->map= NULL;
-    }
-
-    if (names->keycodes) _XkbFree(names->keycodes);
-    names->keycodes = NULL;
-    if (names->types) _XkbFree(names->types);
-    names->types = NULL;
-    if (names->compat) _XkbFree(names->compat);
-    names->compat = NULL;
-    if (names->geometry) _XkbFree(names->geometry);
-    names->geometry = NULL;
-    if (names->symbols) _XkbFree(names->symbols);
-    names->symbols = NULL;
-
-    return ok;
-}
+    /* XXX: Doesn't XUCD make this redundant? */
+    memcpy(dev->key->modifierMap, xkb->map->modmap, xkb->max_key_code + 1);
 
-/***====================================================================***/
+    XkbInitIndicatorMap(xkbi);
 
-	/*
-	 * InitKeyClassDeviceStruct initializes the key class before it
-	 * initializes the keyboard feedback class for a device. 
-	 * UpdateActions can't set up the correct autorepeat for keyboard 
-	 * initialization because the keyboard feedback isn't created yet.   
-	 * Instead, UpdateActions notes the "correct" autorepeat in the 
-	 * SrvInfo structure and InitKbdFeedbackClass calls UpdateAutoRepeat 
-	 * to apply the computed autorepeat once the feedback class exists.
-	 *
-	 * DIX will apply the changed autorepeat, so there's no need to
-	 * do so here.   This function returns True if both RepeatKeys and
-	 * the core protocol autorepeat ctrls are set (i.e. should use 
-	 * software autorepeat), false otherwise.
-	 *
-	 * This function also computes the autorepeat accelerators for the
-	 * default indicator feedback.
-	 */
-int
-XkbFinishDeviceInit(DeviceIntPtr pXDev)
-{
-XkbSrvInfoPtr		xkbi;
-XkbDescPtr		xkb;
-int			softRepeat;
-XkbSrvLedInfoPtr	sli;
+    XkbDDXInitDevice(dev);
 
-    xkbi = NULL;
-    if (pXDev && pXDev->key && pXDev->key->xkbInfo && pXDev->kbdfeed) {
-	xkbi= pXDev->key->xkbInfo;
-	xkb= xkbi->desc;
-        /* If we come from DeepCopyDeviceClasses, the CtrlProc was already set
-         * to XkbDDXKeybdCtrlProc, overwriting it leads to happy recursion.
-         */
-	if (pXDev->kbdfeed && pXDev->kbdfeed->CtrlProc != XkbDDXKeybdCtrlProc) {
-	    xkbi->kbdProc= pXDev->kbdfeed->CtrlProc;
-	    pXDev->kbdfeed->CtrlProc= XkbDDXKeybdCtrlProc;
-	}
-	if (pXDev->kbdfeed->ctrl.autoRepeat)
-	    xkb->ctrls->enabled_ctrls|= XkbRepeatKeysMask;
-	softRepeat= (xkb->ctrls->enabled_ctrls&XkbRepeatKeysMask)!=0;
-	if (pXDev->kbdfeed) {
-	    memcpy(pXDev->kbdfeed->ctrl.autoRepeats,
-		   xkb->ctrls->per_key_repeat,XkbPerKeyBitArraySize);
-	    softRepeat= softRepeat&&pXDev->kbdfeed->ctrl.autoRepeat;
-	}
-    }
-    else softRepeat= 0;
-    sli= XkbFindSrvLedInfo(pXDev,XkbDfltXIClass,XkbDfltXIId,0);
-    if (sli && xkbi)
-	XkbCheckIndicatorMaps(xkbi->device,sli,XkbAllIndicatorsMask);
-    else DebugF("[xkb] No indicator feedback in XkbFinishInit (shouldn't happen)!\n");
-    return softRepeat;
+    XkbUpdateCoreDescription(dev, True);
+
+    XkbUpdateActions(dev, xkb->min_key_code, XkbNumKeys(xkb), &changes,
+                     &check, &cause);
+    dev->key->curKeySyms.minKeyCode = xkb->min_key_code;
+    dev->key->curKeySyms.maxKeyCode = xkb->max_key_code;
+
+    InitFocusClassDeviceStruct(dev);
+
+    xkbi->kbdProc = ctrl_func;
+    dev->kbdfeed->CtrlProc = XkbDDXKeybdCtrlProc;
+
+    dev->kbdfeed->ctrl = defaultKeyboardControl;
+    if (dev->kbdfeed->ctrl.autoRepeat)
+        xkb->ctrls->enabled_ctrls |= XkbRepeatKeysMask;
+
+    memcpy(dev->kbdfeed->ctrl.autoRepeats, xkb->ctrls->per_key_repeat,
+           XkbPerKeyBitArraySize);
+
+    sli = XkbFindSrvLedInfo(dev, XkbDfltXIClass, XkbDfltXIId, 0);
+    if (sli)
+	XkbCheckIndicatorMaps(dev, sli, XkbAllIndicatorsMask);
+    else
+        DebugF("XKB: No indicator feedback in XkbFinishInit!\n");
+
+    dev->kbdfeed->CtrlProc(dev,&dev->kbdfeed->ctrl);
+
+    XkbSetRulesDflts(rmlvo);
+    XkbSetRulesUsed(rmlvo);
+
+    return TRUE;
+
+unwind_desc:
+    XkbFreeKeyboard(xkb, 0, TRUE);
+unwind_info:
+    xfree(xkbi);
+unwind_kbdfeed:
+    xfree(dev->kbdfeed);
+unwind_key:
+    xfree(dev->key);
+    return FALSE;
 }
 
+
+/***====================================================================***/
+
 	/*
 	 * Be very careful about what does and doesn't get freed by this 
 	 * function.  To reduce fragmentation, XkbInitDevice allocates a 
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index abfd6fb..c7a6d99 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -382,10 +382,6 @@ int			maxNumberOfGroups;
     else if (resize) {
 	keyc->curKeySyms.minKeyCode= xkb->min_key_code;
 	keyc->curKeySyms.maxKeyCode= xkb->max_key_code;
-	tmp= keyc->curKeySyms.mapWidth*_XkbCoreNumKeys(keyc);
-	keyc->curKeySyms.map= _XkbTypedRealloc(keyc->curKeySyms.map,tmp,KeySym);
-	if (!keyc->curKeySyms.map)
-	   FatalError("Couldn't allocate keysyms\n");
 	first= firstCommon= xkb->min_key_code;
 	last= lastCommon= xkb->max_key_code;
     }
@@ -622,8 +618,6 @@ XkbEventCauseRec	cause;
 XkbChangesRec	 	changes;
 unsigned	 	check;
 
-    if (kbd->key->xkbInfo==NULL)
-	XkbInitDevice(kbd);
     bzero(&changes,sizeof(XkbChangesRec));
     check= 0;
     if (request==MappingKeyboard) {
commit 40877c6680863bd6a8475f2bb0c54df55bcf0b0e
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Tue Mar 18 10:05:57 2008 +0200

    XKB: Make XKB mandatory
    
    No more #ifdef XKB, because you can't disable the build, and no more
    noXkbExtension either.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>
    Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>

diff --git a/Xi/exevents.c b/Xi/exevents.c
index b136e01..1802b18 100644
--- a/Xi/exevents.c
+++ b/Xi/exevents.c
@@ -74,10 +74,8 @@ SOFTWARE.
 #include "listdev.h" /* for CopySwapXXXClass */
 #include "xace.h"
 
-#ifdef XKB
 #include <X11/extensions/XKBproto.h>
 #include "xkbsrv.h"
-#endif
 
 #define WID(w) ((w) ? ((w)->drawable.id) : 0)
 #define AllModifiersMask ( \
@@ -304,11 +302,9 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
             (*k)->BellProc = it->BellProc;
             (*k)->CtrlProc = it->CtrlProc;
             (*k)->ctrl     = it->ctrl;
-#ifdef XKB
             if ((*k)->xkb_sli)
                 XkbFreeSrvLedInfo((*k)->xkb_sli);
             (*k)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, *k, NULL);
-#endif
 
             k = &(*k)->next;
         }
@@ -489,11 +485,9 @@ DeepCopyFeedbackClasses(DeviceIntPtr from, DeviceIntPtr to)
             }
             (*l)->CtrlProc = it->CtrlProc;
             (*l)->ctrl     = it->ctrl;
-#ifdef XKB
             if ((*l)->xkb_sli)
                 XkbFreeSrvLedInfo((*l)->xkb_sli);
             (*l)->xkb_sli = XkbCopySrvLedInfo(from, it->xkb_sli, NULL, *l);
-#endif
 
             l = &(*l)->next;
         }
@@ -529,9 +523,7 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
     {
         KeyCode             *oldModKeyMap;
         KeySym              *oldMap;
-#ifdef XKB
         struct _XkbSrvInfo  *oldXkbInfo;
-#endif
         if (!to->key)
         {
             classes = dixLookupPrivate(&to->devPrivates,
@@ -548,9 +540,7 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
 
         oldModKeyMap    = to->key->modifierKeyMap;
         oldMap          = to->key->curKeySyms.map;
-#ifdef XKB
         oldXkbInfo      = to->key->xkbInfo;
-#endif
 
         if (!oldMap) /* newly created key struct */
         {
@@ -563,9 +553,7 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
 
         to->key->modifierKeyMap = oldModKeyMap;
         to->key->curKeySyms.map = oldMap;
-#ifdef XKB
         to->key->xkbInfo        = oldXkbInfo;
-#endif
 
         CopyKeyClass(from, to);
     } else if (to->key && !from->key)
@@ -624,7 +612,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
                 classes->button = NULL;
         }
 
-#ifdef XKB
         if (from->button->xkb_acts)
         {
             if (!to->button->xkb_acts)
@@ -637,7 +624,6 @@ DeepCopyDeviceClasses(DeviceIntPtr from, DeviceIntPtr to)
                     sizeof(XkbAction));
         } else
             xfree(to->button->xkb_acts);
-#endif
     } else if (to->button && !from->button)
     {
         ClassesPtr classes;
@@ -1821,10 +1807,8 @@ SendDeviceMappingNotify(ClientPtr client, CARD8 request,
 	ev->count = count;
     }
 
-#ifdef XKB
     if (request == MappingKeyboard || request == MappingModifier)
         XkbApplyMappingChange(dev, request, firstKeyCode, count, client);
-#endif
 
     SendEventToAllWindows(dev, DeviceMappingNotifyMask, (xEvent *) ev, 1);
 }
diff --git a/configure.ac b/configure.ac
index a9a67d8..a0a89d9 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1014,8 +1014,6 @@ AM_CONDITIONAL(XF86UTILS, test "x$XF86UTILS" = xyes)
 AC_DEFINE(SHAPE, 1, [Support SHAPE extension])
 
 AC_DEFINE(XKB, 1, [Build XKB])
-AC_DEFINE(XKB_IN_SERVER, 1, [Build XKB server])
-AC_DEFINE(XKB_DFLT_DISABLED, 0, [Disable XKB per default])
 AC_DEFINE_DIR(XKB_BASE_DIRECTORY, XKBPATH, [Path to XKB data])
 AC_DEFINE_DIR(XKB_BIN_DIRECTORY, bindir, [Path to XKB bin dir])
 
diff --git a/dix/devices.c b/dix/devices.c
index f2410fd..9d6651d 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -63,12 +63,7 @@ SOFTWARE.
 #include "dixstruct.h"
 #include "ptrveloc.h"
 #include "site.h"
-#ifndef XKB_IN_SERVER
-#define	XKB_IN_SERVER
-#endif
-#ifdef XKB
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
 #include "privates.h"
 #include "xace.h"
 #include "mi.h"
@@ -490,9 +485,7 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
 {
     CARD8 *modMap;
     KeySymsRec keySyms;
-#ifdef XKB
     XkbComponentNamesRec names;
-#endif
     ClassesPtr classes;
 
     switch (what) {
@@ -523,19 +516,9 @@ CoreKeyboardProc(DeviceIntPtr pDev, int what)
             return BadAlloc;
         }
 
-#ifdef XKB
-        if (!noXkbExtension) {
-            bzero(&names, sizeof(names));
-            XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modMap,
-                                        CoreKeyboardBell, CoreKeyboardCtl);
-        }
-        else
-#endif
-        {
-            /* FIXME Our keymap here isn't exactly useful. */
-            InitKeyboardDeviceStruct((DevicePtr)pDev, &keySyms, modMap,
-                                     CoreKeyboardBell, CoreKeyboardCtl);
-        }
+        bzero(&names, sizeof(names));
+        XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modMap,
+                                    CoreKeyboardBell, CoreKeyboardCtl);
 
         xfree(keySyms.map);
         xfree(modMap);
@@ -661,13 +644,11 @@ FreeDeviceClass(int type, pointer *class)
         case KeyClass:
             {
                 KeyClassPtr* k = (KeyClassPtr*)class;
-#ifdef XKB
                 if ((*k)->xkbInfo)
                 {
                     XkbFreeInfo((*k)->xkbInfo);
                     (*k)->xkbInfo = NULL;
                 }
-#endif
                 xfree((*k)->curKeySyms.map);
                 xfree((*k)->modifierKeyMap);
                 xfree((*k));
@@ -676,10 +657,8 @@ FreeDeviceClass(int type, pointer *class)
         case ButtonClass:
             {
                 ButtonClassPtr *b = (ButtonClassPtr*)class;
-#ifdef XKB
                 if ((*b)->xkb_acts)
                     xfree((*b)->xkb_acts);
-#endif
                 xfree((*b));
                 break;
             }
@@ -724,10 +703,8 @@ FreeFeedbackClass(int type, pointer *class)
                 KbdFeedbackPtr k, knext;
                 for (k = (*kbdfeed); k; k = knext) {
                     knext = k->next;
-#ifdef XKB
                     if (k->xkb_sli)
                         XkbFreeSrvLedInfo(k->xkb_sli);
-#endif
                     xfree(k);
                 }
                 break;
@@ -785,10 +762,8 @@ FreeFeedbackClass(int type, pointer *class)
 
                 for (l = (*leds); l; l = lnext) {
                     lnext = l->next;
-#ifdef XKB
                     if (l->xkb_sli)
                         XkbFreeSrvLedInfo(l->xkb_sli);
-#endif
                     xfree(l);
                 }
                 break;
@@ -859,11 +834,8 @@ CloseDevice(DeviceIntPtr dev)
         FreeAllDeviceClasses(classes);
     }
 
-
-#ifdef XKB
     while (dev->xkb_interest)
 	XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
-#endif
 
     if (DevHasCursor(dev) && dev->spriteInfo->sprite) {
         xfree(dev->spriteInfo->sprite->spriteTrace);
@@ -920,9 +892,7 @@ CloseDownDevices(void)
     inputInfo.off_devices = NULL;
     inputInfo.keyboard = NULL;
     inputInfo.pointer = NULL;
-#ifdef XKB
     XkbDeleteRulesDflts();
-#endif
 }
 
 /**
@@ -1193,10 +1163,8 @@ InitKeyClassDeviceStruct(DeviceIntPtr dev, KeySymsPtr pKeySyms, CARD8 pModifiers
 	return FALSE;
     }
     dev->key = keyc;
-#ifdef XKB
     dev->key->xkbInfo= NULL;
-    if (!noXkbExtension) XkbInitDevice(dev);
-#endif
+    XkbInitDevice(dev);
     return TRUE;
 }
 
@@ -1392,19 +1360,14 @@ InitKbdFeedbackClassDeviceStruct(DeviceIntPtr dev, BellProcPtr bellProc,
 	return FALSE;
     feedc->BellProc = bellProc;
     feedc->CtrlProc = controlProc;
-#ifdef XKB
     defaultKeyboardControl.autoRepeat = TRUE;
-#endif
     feedc->ctrl = defaultKeyboardControl;
     feedc->ctrl.id = 0;
     if ((feedc->next = dev->kbdfeed) != 0)
 	feedc->ctrl.id = dev->kbdfeed->ctrl.id + 1;
     dev->kbdfeed = feedc;
-#ifdef XKB
     feedc->xkb_sli= NULL;
-    if (!noXkbExtension)
-	XkbFinishDeviceInit(dev);
-#endif
+    XkbFinishDeviceInit(dev);
     (*dev->kbdfeed->CtrlProc)(dev,&dev->kbdfeed->ctrl);
     return TRUE;
 }
@@ -1517,9 +1480,7 @@ InitLedFeedbackClassDeviceStruct (DeviceIntPtr dev, LedCtrlProcPtr controlProc)
     feedc->ctrl.id = 0;
     if ( (feedc->next = dev->leds) )
 	feedc->ctrl.id = dev->leds->ctrl.id + 1;
-#ifdef XKB
     feedc->xkb_sli= NULL;
-#endif
     dev->leds = feedc;
     (*controlProc)(dev, &feedc->ctrl);
     return TRUE;
@@ -1582,25 +1543,18 @@ SendMappingNotify(DeviceIntPtr pDev, unsigned request, unsigned firstKeyCode,
         event.u.mappingNotify.firstKeyCode = firstKeyCode;
         event.u.mappingNotify.count = count;
     }
-#ifdef XKB
-    if (!noXkbExtension &&
-	((request == MappingKeyboard) || (request == MappingModifier))) {
+    if (request == MappingKeyboard || request == MappingModifier)
 	XkbApplyMappingChange(pDev,request,firstKeyCode,count, client);
-    }
-#endif
 
    /* 0 is the server client */
     for (i=1; i<currentMaxClients; i++)
     {
 	if (clients[i] && clients[i]->clientState == ClientStateRunning)
 	{
-#ifdef XKB
-	    if (!noXkbExtension &&
-		(request == MappingKeyboard) &&
-		(clients[i]->xkbClientFlags != 0) &&
-		(clients[i]->mapNotifyMask&XkbKeySymsMask))
+	    if (request == MappingKeyboard &&
+		clients[i]->xkbClientFlags != 0 &&
+		(clients[i]->mapNotifyMask & XkbKeySymsMask))
 		continue;
-#endif
 	    event.u.u.sequenceNumber = clients[i]->sequence;
 	    WriteEventsToClient(clients[i], 1, &event);
 	}
@@ -2097,15 +2051,13 @@ DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
 		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))),
-				 			ctrl.leds, &cause);
-                ctrl.leds = keybd->kbdfeed->ctrl.leds;
-            }
-#endif
+
+            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;
+
 	    break;
 	case KBKey:
 	    key = (KeyCode)*vlist;
@@ -2123,10 +2075,8 @@ DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
 	    mask = (1 << (key & 7));
 	    t = (CARD8)*vlist;
 	    vlist++;
-#ifdef XKB
-            if (!noXkbExtension && key != DO_ALL)
+            if (key != DO_ALL)
                 XkbDisableComputedAutoRepeats(keybd,key);
-#endif
 	    if (t == AutoRepeatModeOff) {
 		if (key == DO_ALL)
 		    ctrl.autoRepeat = FALSE;
@@ -2159,14 +2109,9 @@ DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
     }
     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);
-    else
-#endif
-        (*keybd->kbdfeed->CtrlProc)(keybd, &keybd->kbdfeed->ctrl);
+    XkbSetRepeatKeys(keybd, key, keybd->kbdfeed->ctrl.autoRepeat);
 
     return Success;
 
@@ -2275,14 +2220,8 @@ ProcBell(ClientPtr client)
 	    rc = XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixBellAccess);
 	    if (rc != Success)
 		return rc;
-#ifdef XKB
-            if (!noXkbExtension)
-                XkbHandleBell(FALSE, FALSE, keybd, newpercent,
-                              &keybd->kbdfeed->ctrl, 0, None, NULL, client);
-            else
-#endif
-                (*keybd->kbdfeed->BellProc)(newpercent, keybd,
-                                            &keybd->kbdfeed->ctrl, 0);
+            XkbHandleBell(FALSE, FALSE, keybd, newpercent,
+                          &keybd->kbdfeed->ctrl, 0, None, NULL, client);
         }
     }
 
@@ -2633,15 +2572,9 @@ AllocMasterDevice(ClientPtr client, char* name, DeviceIntPtr* ptr, DeviceIntPtr*
     strcpy(pointer->name, name);
     strcat(pointer->name, " pointer");
 
-#ifdef XKB
     pointer->public.processInputProc = ProcessOtherEvent;
     pointer->public.realInputProc = ProcessOtherEvent;
-    if (!noXkbExtension)
-        XkbSetExtension(pointer, ProcessPointerEvent);
-#else
-    pointer->public.processInputProc = ProcessPointerEvent;
-    pointer->public.realInputProc = ProcessPointerEvent;
-#endif
+    XkbSetExtension(pointer, ProcessPointerEvent);
     pointer->deviceGrab.ActivateGrab = ActivatePointerGrab;
     pointer->deviceGrab.DeactivateGrab = DeactivatePointerGrab;
     pointer->coreEvents = TRUE;
@@ -2661,15 +2594,9 @@ AllocMasterDevice(ClientPtr client, char* name, DeviceIntPtr* ptr, DeviceIntPtr*
     strcpy(keyboard->name, name);
     strcat(keyboard->name, " keyboard");
 
-#ifdef XKB
     keyboard->public.processInputProc = ProcessOtherEvent;
     keyboard->public.realInputProc = ProcessOtherEvent;
-    if (!noXkbExtension)
-        XkbSetExtension(keyboard, ProcessKeyboardEvent);
-#else
-    keyboard->public.processInputProc = ProcessKeyboardEvent;
-    keyboard->public.realInputProc = ProcessKeyboardEvent;
-#endif
+    XkbSetExtension(keyboard, ProcessKeyboardEvent);
     keyboard->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
     keyboard->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
     keyboard->coreEvents = TRUE;
diff --git a/dix/dispatch.c b/dix/dispatch.c
index ee105f8..09fd3af 100644
--- a/dix/dispatch.c
+++ b/dix/dispatch.c
@@ -136,13 +136,8 @@ int ProcInitialConnection();
 #endif
 #include "privates.h"
 #include "xace.h"
-#ifdef XKB
-#ifndef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#endif
 #include "inputstr.h"
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
 
 #ifdef XSERVER_DTRACE
 #include "registry.h"
@@ -3478,15 +3473,11 @@ void InitClient(ClientPtr client, int i, pointer ospriv)
     client->priority = 0;
     client->clientState = ClientStateInitial;
     client->devPrivates = NULL;
-#ifdef XKB
-    if (!noXkbExtension) {
-	client->xkbClientFlags = 0;
-	client->mapNotifyMask = 0;
-	client->newKeyboardNotifyMask = 0;
-	client->vMinor = client->vMajor = 0;
-	QueryMinMaxKeyCodes(&client->minKC,&client->maxKC);
-    }
-#endif
+    client->xkbClientFlags = 0;
+    client->mapNotifyMask = 0;
+    client->newKeyboardNotifyMask = 0;
+    client->vMinor = client->vMajor = 0;
+    QueryMinMaxKeyCodes(&client->minKC,&client->maxKC);
     client->replyBytesRemaining = 0;
     client->fontResFunc = NULL;
     client->smart_priority = 0;
diff --git a/dix/events.c b/dix/events.c
index a1aec2f..95bb3e9 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -133,11 +133,10 @@ of the copyright holder.
 #endif
 #include "globals.h"
 
-#ifdef XKB
 #include <X11/extensions/XKBproto.h>
-#include <xkbsrv.h>
+#include "xkbsrv.h"
+/* XKB FIXME: why is this here? */
 extern Bool XkbFilterEvents(ClientPtr, int, xEvent *);
-#endif
 
 #include "xace.h"
 
@@ -1078,12 +1077,10 @@ EnqueueEvent(xEvent *xE, DeviceIntPtr device, int count)
 
     NoticeTime(xE);
 
-#ifdef XKB
     /* Fix for key repeating bug. */
     if (device->key != NULL && device->key->xkbInfo != NULL &&
 	xE->u.u.type == KeyRelease)
 	AccessXCancelRepeatKey(device->key->xkbInfo, xE->u.u.detail);
-#endif
 
     if (DeviceEventCallback)
     {
@@ -2116,11 +2113,8 @@ DeliverEventsToWindow(DeviceIntPtr pDev, WindowPtr pWin, xEvent
 	pDev->valuator->motionHintWindow = pWin;
     else
     {
-	if (((type == DeviceMotionNotify)
-#ifdef XKB
-	     || (type == DeviceButtonPress)
-#endif
-	    ) && deliveries)
+	if ((type == DeviceMotionNotify || type == DeviceButtonPress) &&
+	    deliveries)
 	    CheckDeviceGrabAndHintWindow (pWin, type,
 					  (deviceKeyButtonPointer*) pEvents,
 					  grab, client, deliveryMask);
@@ -3246,7 +3240,6 @@ CheckPassiveGrabsOnWindow(
     tempGrab.next = NULL;
     for (; grab; grab = grab->next)
     {
-#ifdef XKB
 	DeviceIntPtr	gdev;
 	XkbSrvInfoPtr	xkbi = NULL;
 
@@ -3260,40 +3253,16 @@ CheckPassiveGrabsOnWindow(
         }
         if (gdev && gdev->key)
             xkbi= gdev->key->xkbInfo;
-#endif
 	tempGrab.modifierDevice = grab->modifierDevice;
-	if ((device == grab->modifierDevice) &&
-	    ((xE->u.u.type == KeyPress) || (xE->u.u.type == DeviceKeyPress)))
-	    tempGrab.modifiersDetail.exact =
-#ifdef XKB
-                (noXkbExtension) ?
-                        ((gdev) ? gdev->key->prev_state : 0) :
-                        ((xkbi) ?  xkbi->state.grab_mods : 0);
-#else
-                (gdev) ? gdev->key->prev_state : 0;
-#endif
-	else
-	    tempGrab.modifiersDetail.exact =
-#ifdef XKB
-                (noXkbExtension) ?
-                        ((gdev) ? gdev->key->state : 0) :
-                        ((xkbi) ? xkbi->state.grab_mods : 0);
-#else
-                (gdev) ? gdev->key->state : 0;
-#endif
-            /* ignore the device for core events when comparing grabs */
+        tempGrab.modifiersDetail.exact = xkbi ? xkbi->state.grab_mods : 0;
+        /* ignore the device for core events when comparing grabs */
 	if (GrabMatchesSecond(&tempGrab, grab, (xE->u.u.type < LASTEvent)) &&
 	    (!grab->confineTo ||
 	     (grab->confineTo->realized &&
 				BorderSizeNotEmpty(device, grab->confineTo))))
 	{
-#ifdef XKB
-	    if (!noXkbExtension) {
-		XE_KBPTR.state &= 0x1f00;
-		XE_KBPTR.state |=
-				tempGrab.modifiersDetail.exact&(~0x1f00);
-	    }
-#endif
+            XE_KBPTR.state &= 0x1f00;
+            XE_KBPTR.state |= tempGrab.modifiersDetail.exact&(~0x1f00);
             grabinfo = &device->deviceGrab;
             /* A passive grab may have been created for a different device
                than it is assigned to at this point in time.
@@ -3690,11 +3659,7 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
  * @param count Number of elements in xE.
  */
 void
-#ifdef XKB
 CoreProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
-#else
-ProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
-#endif
 {
     int             key, bit;
     BYTE            *kptr;
@@ -3765,7 +3730,6 @@ ProcessKeyboardEvent (xEvent *xE, DeviceIntPtr keybd, int count)
     XaceHook(XACE_KEY_AVAIL, xE, keybd, count);
 }
 
-#ifdef XKB
 /* This function is used to set the key pressed or key released state -
    this is only used when the pressing of keys does not cause
    the device's processInputProc to be called, as in for example Mouse Keys.
@@ -3795,7 +3759,6 @@ FixKeyState (xEvent *xE, DeviceIntPtr keybd)
     else
         FatalError("Impossible keyboard event");
 }
-#endif
 
 /**
  * Main pointer event processing function for core pointer events.
@@ -3810,32 +3773,18 @@ FixKeyState (xEvent *xE, DeviceIntPtr keybd)
  * @param count Number of elements in xE.
  */
 void
-#ifdef XKB
 CoreProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count)
-#else
-ProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count)
-#endif
 {
     GrabPtr	        grab = mouse->deviceGrab.grab;
     Bool                deactivateGrab = FALSE;
     ButtonClassPtr      butc = mouse->button;
     SpritePtr           pSprite = mouse->spriteInfo->sprite;
 
-#ifdef XKB
     XkbSrvInfoPtr xkbi= GetPairedDevice(mouse)->key->xkbInfo;
-#endif
 
     if (!syncEvents.playingEvents)
 	NoticeTime(xE)
-    XE_KBPTR.state = (butc->state | (
-#ifdef XKB
-			(noXkbExtension ?
-				inputInfo.keyboard->key->state :
-				xkbi->state.grab_mods)
-#else
-			inputInfo.keyboard->key->state
-#endif
-				    ));
+    XE_KBPTR.state = (butc->state | xkbi->state.grab_mods);
     {
 	NoticeTime(xE);
 	if (DeviceEventCallback)
@@ -4171,18 +4120,10 @@ CoreEnterLeaveEvent(
     event.u.enterLeave.child = child;
     event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
         ELFlagSameScreen : 0;
-#ifdef XKB
-    if (!noXkbExtension) {
-        event.u.enterLeave.state = mouse->button->state & 0x1f00;
-        if (keybd)
-            event.u.enterLeave.state |=
+    event.u.enterLeave.state = mouse->button->state & 0x1f00;
+    if (keybd)
+        event.u.enterLeave.state |=
                 XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
-    } else
-#endif
-    {
-        event.u.enterLeave.state = (keybd) ? keybd->key->state : 0;
-        event.u.enterLeave.state |= mouse->button->state;
-    }
     event.u.enterLeave.mode = mode;
     focus = (keybd) ? keybd->focus->win : None;
     if ((focus != NoneWin) &&
@@ -4262,18 +4203,9 @@ DeviceEnterLeaveEvent(
     devEnterLeave->mode     = mode;
     devEnterLeave->mode    |= (sameScreen ?  (ELFlagSameScreen << 4) : 0);
 
-#ifdef XKB
-    if (!noXkbExtension) {
-        devEnterLeave->state = mouse->button->state & 0x1f00;
-        if (keybd)
-            devEnterLeave->state |=
-                XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
-    } else
-#endif
-    {
-        devEnterLeave->state = (keybd) ? keybd->key->state : 0;
-        devEnterLeave->state |= mouse->button->state;
-    }
+    devEnterLeave->state = mouse->button->state & 0x1f00;
+    if (keybd)
+        devEnterLeave->state |= XkbGrabStateFromRec(&keybd->key->xkbInfo->state);
 
     mskidx = mouse->id;
     inputMasks = wOtherInputMasks(pWin);
@@ -5540,10 +5472,8 @@ WriteEventsToClient(ClientPtr pClient, int count, xEvent *events)
     int       i,
               eventlength = sizeof(xEvent);
 
-#ifdef XKB
-    if ((!noXkbExtension)&&(!XkbFilterEvents(pClient, count, events)))
+    if (!XkbFilterEvents(pClient, count, events))
 	return;
-#endif
 
 #ifdef PANORAMIX
     if(!noPanoramiXExtension &&
diff --git a/dix/getevents.c b/dix/getevents.c
index 44636d7..112bb10 100644
--- a/dix/getevents.c
+++ b/dix/getevents.c
@@ -42,10 +42,8 @@
 #include "dixevents.h"
 #include "mipointer.h"
 
-#ifdef XKB
 #include <X11/extensions/XKBproto.h>
 #include "xkbsrv.h"
-#endif
 
 #ifdef PANORAMIX
 #include "panoramiX.h"
@@ -454,15 +452,9 @@ updateMotionHistory(DeviceIntPtr pDev, CARD32 ms, int first_valuator,
  */
 int
 GetMaximumEventsNum(void) {
-    /* One base event -- device, plus valuator events.
-     *  Multiply by two if we're doing non-XKB key repeats. */
+    /* One base event -- device, plus valuator events. */
     int ret = 1 + MAX_VALUATOR_EVENTS;
 
-#ifdef XKB
-    if (noXkbExtension)
-#endif
-        ret *= 2;
-
     /* One possible DeviceClassesChangedEvent */
     ret++;
 
@@ -814,25 +806,7 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
 
     numEvents += countValuatorEvents(num_valuators);
 
-#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 && key_is_down(pDev, key_code))
-                    type = KeyRelease;
-        }
-    }
-
-    /* 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. */
+    /* Handle core repeating, via press/release/press/release. */
     if (type == KeyPress && key_is_down(pDev, key_code)) {
         /* If autorepeating is disabled either globally or just for that key,
          * or we have a modifier, don't generate a repeat event. */
@@ -840,17 +814,6 @@ GetKeyboardValuatorEvents(EventList *events, DeviceIntPtr pDev, int type,
             !key_autorepeats(pDev, key_code) ||
             pDev->key->modifierMap[key_code])
             return 0;
-
-#ifdef XKB
-        if (noXkbExtension)
-#endif
-        {
-            numEvents += GetKeyboardValuatorEvents(events, pDev,
-                                                   KeyRelease, key_code,
-                                                   first_valuator, num_valuators,
-                                                   valuators);
-            events += numEvents;
-        }
     }
 
     ms = GetTimeInMillis();
diff --git a/hw/dmx/dmxclient.h b/hw/dmx/dmxclient.h
index f0c3608..147d14e 100644
--- a/hw/dmx/dmxclient.h
+++ b/hw/dmx/dmxclient.h
@@ -91,10 +91,8 @@ typedef XID           KeySym64;
 #undef PictFormatType
 #endif
 
-#ifdef XKB
 #include <X11/extensions/XKB.h>
-#include <X11/extensions/XKBstr.h>
-#endif
+#include "xkbstr.h"
 
 #include <X11/extensions/XI.h>
 
@@ -134,14 +132,9 @@ extern int ChangeDeviceNotify;
 
 /* Some protocol gets included last, after undefines. */
 #include <X11/XKBlib.h>
-#ifdef XKB
 #include <X11/extensions/XKBproto.h>
-#ifndef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#endif
-#include <xkbsrv.h>
+#include "xkbstr.h"
 #undef XPointer
-#endif
 #include <X11/extensions/XIproto.h>
 
 #endif
diff --git a/hw/dmx/input/dmxcommon.c b/hw/dmx/input/dmxcommon.c
index e77bb79..2bffb17 100644
--- a/hw/dmx/input/dmxcommon.c
+++ b/hw/dmx/input/dmxcommon.c
@@ -258,7 +258,6 @@ void dmxCommonKbdGetMap(DevicePtr pDev, KeySymsPtr pKeySyms, CARD8 *pModMap)
  * specified \a pDev. */
 void dmxCommonKbdGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info)
 {
-#ifdef XKB
     GETPRIVFROMPDEV;
     GETDMXINPUTFROMPRIV;
     char *pt;
@@ -284,7 +283,6 @@ void dmxCommonKbdGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info)
         if ((pt = strchr(info->names.keycodes, '+'))) *pt = '\0';
     }
     dmxCommonRestoreState(priv);
-#endif
 }
 
 /** Turn \a pDev on (i.e., take input from \a pDev). */
@@ -577,7 +575,6 @@ void dmxCommonSaveState(pointer private)
     if (dmxInput->console) priv = dmxInput->devs[0]->private;
     if (!priv->display || priv->stateSaved) return;
     DMXDBG0("dmxCommonSaveState\n");
-#ifdef XKB
     if (dmxUseXKB && (priv->xkb = XkbAllocKeyboard())) {
         if (XkbGetIndicatorMap(priv->display, XkbAllIndicatorsMask, priv->xkb)
             || XkbGetNames(priv->display, XkbAllNamesMask, priv->xkb)) {
@@ -596,7 +593,6 @@ void dmxCommonSaveState(pointer private)
             }
         }
     }
-#endif
 
     XGetKeyboardControl(priv->display, &ks);
     priv->savedKctrl.click              = ks.key_click_percent;
@@ -636,14 +632,12 @@ void dmxCommonRestoreState(pointer private)
     priv->stateSaved = 0;
     
     DMXDBG0("dmxCommonRestoreState\n");
-#ifdef XKB
     if (priv->xkb) {
         *priv->xkb->indicators = priv->savedIndicators;
         XkbSetIndicatorMap(priv->display, ~0, priv->xkb);
         XkbFreeKeyboard(priv->xkb, 0, True);
         priv->xkb = 0;
     }
-#endif
 
     for (start = GetTimeInMillis(); GetTimeInMillis() - start < 5000;) {
         CARD32 tmp;
diff --git a/hw/dmx/input/dmxcommon.h b/hw/dmx/input/dmxcommon.h
index a9b260c..68f2b52 100644
--- a/hw/dmx/input/dmxcommon.h
+++ b/hw/dmx/input/dmxcommon.h
@@ -54,14 +54,10 @@
     XModifierKeymap         *savedModMap;   \
     int                     stateSaved
 
-#ifdef XKB
 #define DMX_COMMON_XKB                      \
     DMX_COMMON_OTHER;                       \
     XkbDescPtr              xkb;            \
     XkbIndicatorRec         savedIndicators
-#else
-#define DMX_COMMON_XKB      DMX_COMMON_OTHER
-#endif
 
 #define DMX_COMMON_PRIVATE                  \
     DMX_COMMON_XKB;                         \
diff --git a/hw/dmx/input/dmxdummy.c b/hw/dmx/input/dmxdummy.c
index 2afe258..971892b 100644
--- a/hw/dmx/input/dmxdummy.c
+++ b/hw/dmx/input/dmxdummy.c
@@ -60,9 +60,7 @@ void dmxDummyKbdGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info)
     info->freemap            = 0;
     info->focusClass         = 1;
     info->kbdFeedbackClass   = 1;
-#ifdef XKB
     info->force              = 1;
-#endif
 }
 
 /** Return information about the dummy mouse device specified in \a pDev
diff --git a/hw/dmx/input/dmxinputinit.c b/hw/dmx/input/dmxinputinit.c
index a0eb80f..bce886f 100644
--- a/hw/dmx/input/dmxinputinit.c
+++ b/hw/dmx/input/dmxinputinit.c
@@ -306,15 +306,13 @@ static void _dmxKeyboardKbdCtrlProc(DMXLocalInputInfoPtr dmxLocal,
     dmxLocal->kctrl = *ctrl;
     if (dmxLocal->kCtrl) {
         dmxLocal->kCtrl(&dmxLocal->pDevice->public, ctrl);
-#ifdef XKB
-        if (!noXkbExtension && dmxLocal->pDevice->kbdfeed) {
+        if (dmxLocal->pDevice->kbdfeed) {
             XkbEventCauseRec cause;
             XkbSetCauseUnknown(&cause);
             /* Generate XKB events, as necessary */
             XkbUpdateIndicators(dmxLocal->pDevice, XkbAllIndicatorsMask, False,
                                 NULL, &cause);
         }
-#endif
     }
 }
 
@@ -370,7 +368,6 @@ void dmxKeyboardBellProc(int percent, DeviceIntPtr pDevice,
     }
 }
 
-#ifdef XKB
 static void dmxKeyboardFreeNames(XkbComponentNamesPtr names)
 {
     if (names->keymap)   XFree(names->keymap);
@@ -380,76 +377,61 @@ static void dmxKeyboardFreeNames(XkbComponentNamesPtr names)
     if (names->symbols)  XFree(names->symbols);
     if (names->geometry) XFree(names->geometry);
 }
-#endif
 
 
 static int dmxKeyboardOn(DeviceIntPtr pDevice, DMXLocalInitInfo *info)
 {
-#ifdef XKB
     GETDMXINPUTFROMPDEVICE;
-#else
-    DevicePtr pDev = &pDevice->public;
-#endif
 
-#ifdef XKB
-    if (noXkbExtension) {
-#endif
-        if (!InitKeyboardDeviceStruct(pDev, &info->keySyms, info->modMap,
-                                      dmxKeyboardBellProc,
-                                      dmxKeyboardKbdCtrlProc))
-            return BadImplementation;
-#ifdef XKB
+    XkbSetRulesDflts(dmxConfigGetXkbRules(),
+                     dmxConfigGetXkbModel(),
+                     dmxConfigGetXkbLayout(),
+                     dmxConfigGetXkbVariant(),
+                     dmxConfigGetXkbOptions());
+    if (!info->force && (dmxInput->keycodes
+                         || dmxInput->symbols
+                         || dmxInput->geometry)) {
+        if (info->freenames) dmxKeyboardFreeNames(&info->names);
+        info->freenames      = 0;
+        info->names.keycodes = dmxInput->keycodes;
+        info->names.types    = NULL;
+        info->names.compat   = NULL;
+        info->names.symbols  = dmxInput->symbols;
+        info->names.geometry = dmxInput->geometry;
+
+        dmxLogInput(dmxInput, "XKEYBOARD: From command line: %s",
+                    info->names.keycodes);
+        if (info->names.symbols && *info->names.symbols)
+            dmxLogInputCont(dmxInput, " %s", info->names.symbols);
+        if (info->names.geometry && *info->names.geometry)
+            dmxLogInputCont(dmxInput, " %s", info->names.geometry);
+        dmxLogInputCont(dmxInput, "\n");
+    } else if (info->names.keycodes) {
+        dmxLogInput(dmxInput, "XKEYBOARD: From device: %s",
+                    info->names.keycodes);
+        if (info->names.symbols && *info->names.symbols)
+            dmxLogInputCont(dmxInput, " %s", info->names.symbols);
+        if (info->names.geometry && *info->names.geometry)
+            dmxLogInputCont(dmxInput, " %s", info->names.geometry);
+        dmxLogInputCont(dmxInput, "\n");
     } else {
-        XkbSetRulesDflts(dmxConfigGetXkbRules(),
-                         dmxConfigGetXkbModel(),
-                         dmxConfigGetXkbLayout(),
-                         dmxConfigGetXkbVariant(),
-                         dmxConfigGetXkbOptions());
-        if (!info->force && (dmxInput->keycodes
-                             || dmxInput->symbols
-                             || dmxInput->geometry)) {
-            if (info->freenames) dmxKeyboardFreeNames(&info->names);
-            info->freenames      = 0;
-            info->names.keycodes = dmxInput->keycodes;
-            info->names.types    = NULL;
-            info->names.compat   = NULL;
-            info->names.symbols  = dmxInput->symbols;
-            info->names.geometry = dmxInput->geometry;
-            
-            dmxLogInput(dmxInput, "XKEYBOARD: From command line: %s",
-                        info->names.keycodes);
-            if (info->names.symbols && *info->names.symbols)
-                dmxLogInputCont(dmxInput, " %s", info->names.symbols);
-            if (info->names.geometry && *info->names.geometry)
-                dmxLogInputCont(dmxInput, " %s", info->names.geometry);
-            dmxLogInputCont(dmxInput, "\n");
-        } else if (info->names.keycodes) {
-            dmxLogInput(dmxInput, "XKEYBOARD: From device: %s",
-                        info->names.keycodes);
-            if (info->names.symbols && *info->names.symbols)
-                dmxLogInputCont(dmxInput, " %s", info->names.symbols);
-            if (info->names.geometry && *info->names.geometry)
-                dmxLogInputCont(dmxInput, " %s", info->names.geometry);
-            dmxLogInputCont(dmxInput, "\n");
-        } else {
-            dmxLogInput(dmxInput, "XKEYBOARD: Defaults: %s %s %s %s %s\n",
-                        dmxConfigGetXkbRules(),
-                        dmxConfigGetXkbLayout(),
-                        dmxConfigGetXkbModel(),
-                        dmxConfigGetXkbVariant()
-                        ? dmxConfigGetXkbVariant() : "",
-                        dmxConfigGetXkbOptions()
-                        ? dmxConfigGetXkbOptions() : "");
-        }
-        XkbInitKeyboardDeviceStruct(pDevice,
-                                    &info->names,
-                                    &info->keySyms,
-                                    info->modMap,
-                                    dmxKeyboardBellProc,
-                                    dmxKeyboardKbdCtrlProc);
+        dmxLogInput(dmxInput, "XKEYBOARD: Defaults: %s %s %s %s %s\n",
+                    dmxConfigGetXkbRules(),
+                    dmxConfigGetXkbLayout(),
+                    dmxConfigGetXkbModel(),
+                    dmxConfigGetXkbVariant()
+                    ? dmxConfigGetXkbVariant() : "",
+                    dmxConfigGetXkbOptions()
+                    ? dmxConfigGetXkbOptions() : "");
     }
+    XkbInitKeyboardDeviceStruct(pDevice,
+                                &info->names,
+                                &info->keySyms,
+                                info->modMap,
+                                dmxKeyboardBellProc,
+                                dmxKeyboardKbdCtrlProc);
+
     if (info->freenames) dmxKeyboardFreeNames(&info->names);
-#endif
 
     return Success;
 }
@@ -552,9 +534,7 @@ static int dmxDeviceOnOff(DeviceIntPtr pDevice, int what)
         XFree(info.keySyms.map);
         info.keySyms.map = NULL;
     }
-#ifdef XKB
     if (info.xkb) XkbFreeKeyboard(info.xkb, 0, True);
-#endif
     return Success;
 }
 
diff --git a/hw/dmx/input/dmxinputinit.h b/hw/dmx/input/dmxinputinit.h
index 6f491ed..2e625cf 100644
--- a/hw/dmx/input/dmxinputinit.h
+++ b/hw/dmx/input/dmxinputinit.h
@@ -87,12 +87,10 @@ typedef struct _DMXLocalInitInfo {
     KeySymsRec           keySyms;  /**< Key symbols */
     int                  freemap;  /**< If non-zero, free keySyms.map */
     CARD8                modMap[MAP_LENGTH]; /**< Modifier map */
-#ifdef XKB
     XkbDescPtr           xkb;       /**< XKB description */
     XkbComponentNamesRec names;     /**< XKB component names */
     int                  freenames; /**< Non-zero if names should be free'd */
     int                  force;     /**< Do not allow command line override */
-#endif
 
     int                  buttonClass; /**< Non-zero if buttons are present */
     int                  numButtons;  /**< Number of buttons */
diff --git a/hw/dmx/input/usb-keyboard.c b/hw/dmx/input/usb-keyboard.c
index efec270..455513d 100644
--- a/hw/dmx/input/usb-keyboard.c
+++ b/hw/dmx/input/usb-keyboard.c
@@ -434,8 +434,6 @@ void kbdUSBGetInfo(DevicePtr pDev, DMXLocalInitInfoPtr info)
     kbdUSBGetMap(pDev, &info->keySyms, info->modMap);
     info->focusClass       = 1;
     info->kbdFeedbackClass = 1;
-#ifdef XKB
     info->names.keycodes   = xstrdup("powerpcps2");
     info->force            = 1;
-#endif
 }
diff --git a/hw/kdrive/linux/keyboard.c b/hw/kdrive/linux/keyboard.c
index ae981b7..d36c31d 100644
--- a/hw/kdrive/linux/keyboard.c
+++ b/hw/kdrive/linux/keyboard.c
@@ -112,7 +112,6 @@ static const KeySym linux_to_x[256] = {
 	XK_udiaeresis,	XK_yacute,	XK_thorn,	XK_ydiaeresis
 };
 
-#ifdef XKB
 /*
  * Getting a keycode from scancode
  *
@@ -209,10 +208,6 @@ static unsigned char at2lnx[] =
 #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,
@@ -491,8 +486,6 @@ readKernelMapping(KdKeyboardInfo *ki)
     ki->maxScanCode = maxKeyCode;
 }
 
-#ifdef XKB
-
 /*
  * We need these to handle extended scancodes correctly (I could just use the
  * numbers below, but this makes the code more readable
@@ -555,9 +548,6 @@ readKernelMapping(KdKeyboardInfo *ki)
 #define KEY_F17          /* F17                   0x72  */  114
 #define KEY_KP_DEC       /* KP_DEC                0x73  */  115
 
-#endif /* XKB */
-
-
 static void
 LinuxKeyboardRead (int fd, void *closure)
 {
@@ -568,164 +558,118 @@ LinuxKeyboardRead (int fd, void *closure)
     while ((n = read (fd, buf, sizeof (buf))) > 0) {
 	b = buf;
 	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;
-#ifdef DEBUG
-                        ErrorF("Prefix0");
-#endif
-                        /* 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:
-                        {
-#ifdef DEBUG
-                            ErrorF("Prefix0 scancode: 0x%02x\n", scancode);
-#endif
-                            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:
-#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
-                                      * between them, so don't bother with symbolic names at
-                                      * this level.
-                                      */
-                                    scancode += 0x78;
-                            }
-                            break;
-                        }
-
-                        case KEY_Prefix1:
-                        {
-                            /* we do no handle these */
-#ifdef DEBUG
-                            ErrorF("Prefix1 scancode: 0x%02x\n", scancode);
-#endif
-                            b++;
-                            prefix = 0;
-                            continue;
+            /*
+             * 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;
+                    /* swallow this up */
+                    b++;
+                    continue;
+            }
+            else if (!prefix && ((b[0] & 0x7f) == KEY_Prefix1))
+            {
+                    prefix = KEY_Prefix1;
+                    /* swallow this up */
+                    b++;
+                    continue;
+            }
+            scancode = b[0] & 0x7f;
+
+            switch (prefix) {
+                    /* from xf86Events.c */
+                    case KEY_Prefix0:
+                    {
+                        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:
+                                 /*
+                                  * "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;
+                    }
 
-                        default: /* should not happen*/
-                        case 0: /* do nothing */
-#ifdef DEBUG
-                            ErrorF("Plain scancode: 0x%02x\n", scancode);
-#endif
-                            ;
-                }
+                    case KEY_Prefix1:
+                    {
+                        /* we do no handle these */
+                        b++;
+                        prefix = 0;
+                        continue;
+                    }
 
-                prefix = 0;
+                    default: /* should not happen*/
+                    case 0: /* do nothing */
+                        ;
             }
-            /* without xkb we use mediumraw mode -- enqueue the scancode as is */
-            else
-#endif
-                scancode = b[0] & 0x7f;
-	    /* This is extended medium raw mode interpreter
-	       see linux/drivers/keyboard.c (kbd->kbdmode == VC_MEDIUMRAW) */
-	    switch (mediumraw_state)
-	    {
-	    case DEFAULT:
-		if (scancode == 0)
-		{
-		    mediumraw_state = EXTBYTE1;
-		    mediumraw_up = b[0] & 0x80;
-		}
-		else
-		    KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80);
-		break;
-	    case EXTBYTE1:
-		mediumraw_data = scancode;
-		mediumraw_state = EXTBYTE2;
-		break;
-	    case EXTBYTE2:
-		/* Note: Only codes < 256 will pass correctly through KdEnqueueKeyboardEvent() */
-	      KdEnqueueKeyboardEvent (closure, (int)mediumraw_data << 7 | scancode, mediumraw_up);
-		mediumraw_state = DEFAULT;
-		break;
-	    }
+
+            prefix = 0;
+	    KdEnqueueKeyboardEvent (closure, scancode, b[0] & 0x80);
 	    b++;
 	}
     }
@@ -750,13 +694,7 @@ LinuxKeyboardEnable (KdKeyboardInfo *ki)
 
     ioctl (fd, KDGKBMODE, &LinuxKbdTrans);
     tcgetattr (fd, &LinuxTermios);
-#ifdef XKB
-    if (!noXkbExtension)
-        ioctl(fd, KDSKBMODE, K_RAW);
-    else
-#else
-        ioctl(fd, KDSKBMODE, K_MEDIUMRAW);
-#endif
+    ioctl(fd, KDSKBMODE, K_RAW);
     nTty = LinuxTermios;
     nTty.c_iflag = (IGNPAR | IGNBRK) & (~PARMRK) & (~ISTRIP);
     nTty.c_oflag = 0;
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
index 4b95669..7746484 100644
--- a/hw/kdrive/src/kdrive.h
+++ b/hw/kdrive/src/kdrive.h
@@ -44,9 +44,7 @@
 #include "randrstr.h"
 #include "globals.h"
 
-#ifdef XKB
-#include <X11/extensions/XKBstr.h>
-#endif
+#include "xkbstr.h"
 
 #define KD_DPMS_NORMAL	    0
 #define KD_DPMS_STANDBY	    1
@@ -300,14 +298,12 @@ struct _KdKeyboardInfo {
     char                *name;
     char                *path;
     int                 inputClass;
-#ifdef XKB
     XkbDescPtr          xkb;
     char                *xkbRules;
     char                *xkbModel;
     char                *xkbLayout;
     char                *xkbVariant;
     char                *xkbOptions;
-#endif
     int                 LockLed;
 
     CARD8               keyState[KD_KEY_COUNT/8];
diff --git a/hw/kdrive/src/kinput.c b/hw/kdrive/src/kinput.c
index 816e933..670cc37 100644
--- a/hw/kdrive/src/kinput.c
+++ b/hw/kdrive/src/kinput.c
@@ -38,9 +38,7 @@
 #include <sys/file.h> /* needed for FNONBLOCK & FASYNC */
 #endif
 
-#ifdef XKB
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
 
 #include <X11/extensions/XI.h>
 #include <X11/extensions/XIproto.h>
@@ -748,9 +746,7 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
     DevicePtr   pDev = (DevicePtr)pDevice;
     KdKeyboardInfo *ki;
     Atom xiclass;
-#ifdef XKB
     XkbComponentNamesRec names;
-#endif
 
     if (!pDev)
 	return BadImplementation;
@@ -799,25 +795,16 @@ KdKeyboardProc(DeviceIntPtr pDevice, int onoff)
         KdInitModMap(ki);
         KdInitAutoRepeats(ki);
 
-#ifdef XKB
-        if (!noXkbExtension) {
-            memset(&names, 0, sizeof(XkbComponentNamesRec));
+        memset(&names, 0, sizeof(XkbComponentNamesRec));
 
-            XkbSetRulesDflts (ki->xkbRules, ki->xkbModel, ki->xkbLayout,
-                              ki->xkbVariant, ki->xkbOptions);
+        XkbSetRulesDflts (ki->xkbRules, ki->xkbModel, ki->xkbLayout,
+                          ki->xkbVariant, ki->xkbOptions);
 
-            ret = XkbInitKeyboardDeviceStruct (pDevice,
-                                               &names,
-                                               &ki->keySyms,
-                                               ki->modmap,
-                                               KdBell, KdKbdCtrl);
-        }
-        else
-#endif
-	ret = InitKeyboardDeviceStruct(pDev,
-				       &ki->keySyms,
-				       ki->modmap,
-				       KdBell, KdKbdCtrl);
+        ret = XkbInitKeyboardDeviceStruct (pDevice,
+                                           &names,
+                                           &ki->keySyms,
+                                           ki->modmap,
+                                           KdBell, KdKbdCtrl);
 	if (!ret) {
             ErrorF("Couldn't initialise keyboard %s\n", ki->name);
 	    return BadImplementation;
@@ -974,13 +961,11 @@ KdNewKeyboard (void)
     ki->bellDuration = 200;
     ki->next = NULL;
     ki->options = NULL;
-#ifdef XKB
     ki->xkbRules = KdSaveString("base");
     ki->xkbModel = KdSaveString("pc105");
     ki->xkbLayout = KdSaveString("us");
     ki->xkbVariant = NULL;
     ki->xkbOptions = NULL;
-#endif
 
     return ki;
 }
@@ -1160,7 +1145,6 @@ KdParseKbdOptions (KdKeyboardInfo *ki)
 
     for (option = ki->options; option; option = option->next)
     {
-#ifdef XKB
         if (strcasecmp(option->key, "XkbRules") == 0)
             ki->xkbRules = option->value;
         else if (strcasecmp(option->key, "XkbModel") == 0)
@@ -1174,7 +1158,6 @@ KdParseKbdOptions (KdKeyboardInfo *ki)
         else if (!strcasecmp (option->key, "device"))
             ki->path = KdSaveString(option->value);
         else
-#endif
            ErrorF("Kbd option key (%s) of value (%s) not assigned!\n", 
                     option->key, option->value);
     }
@@ -1196,9 +1179,7 @@ KdParseKeyboard (char *arg)
     ki->path = NULL;
     ki->driver = NULL;
     ki->driverPrivate = NULL;
-#ifdef XKB
     ki->xkb = NULL;
-#endif
     ki->next = NULL;
 
     if (!arg)
@@ -1880,57 +1861,6 @@ CARD32	KdSpecialKeys = 0;
 
 extern int nClients;
 
-static void
-KdCheckSpecialKeys(KdKeyboardInfo *ki, int type, int sym)
-{
-    if (!ki)
-        return;
-
-    /*
-     * Ignore key releases
-     */
-
-    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 ((ki->dixdev->key->state & (ControlMask|Mod1Mask)) !=
-	(ControlMask|Mod1Mask))
-	return;
-
-    /*
-     * Let OS function see keysym first
-     */
-    
-    if (kdOsFuncs->SpecialKey)
-	if ((*kdOsFuncs->SpecialKey) (sym))
-	    return;
-
-    /*
-     * 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:
-    case XK_Delete:
-    case XK_KP_Delete:
-	/*
-	 * Set the dispatch exception flag so the server will terminate the
-	 * next time through the dispatch loop.
-	 */
-	if (kdAllowZap || party_like_its_1989)
-	    dispatchException |= DE_TERMINATE;
-	break;
-    }
-}
-
 /*
  * kdEnqueueKeyboardEvent
  *
@@ -2024,7 +1954,7 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   *ki,
     if (scan_code >= ki->minScanCode && scan_code <= ki->maxScanCode)
     {
 	key_code = scan_code + KD_MIN_KEYCODE - ki->minScanCode;
-	
+
 	/*
 	 * Set up this event -- the type may be modified below
 	 */
@@ -2032,16 +1962,9 @@ KdEnqueueKeyboardEvent(KdKeyboardInfo   *ki,
 	    type = KeyRelease;
 	else
 	    type = KeyPress;
-	
-#ifdef XKB
-        if (noXkbExtension)
-#endif
-        {
-            KdCheckSpecialKeys(ki, type, key_code);
-            KdHandleKeyboardEvent(ki, type, key_code);
-	}
-	
+
         GetEventList(&kdEvents);
+
         nEvents = GetKeyboardEvents(kdEvents, ki->dixdev, type, key_code);
         for (i = 0; i < nEvents; i++)
             KdQueueEvent(ki->dixdev, (kdEvents + i)->event);
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
index bb67898..8df9780 100644
--- a/hw/xfree86/common/xf86Config.c
+++ b/hw/xfree86/common/xf86Config.c
@@ -65,11 +65,7 @@
 #include "xf86Xinput.h"
 extern DeviceAssocRec mouse_assoc;
 
-#ifdef XKB
-#undef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
 
 #ifdef RENDER
 #include "picture.h"
@@ -697,7 +693,6 @@ typedef enum {
     FLAG_ALLOWNONLOCAL,
     FLAG_ALLOWMOUSEOPENFAIL,
     FLAG_VTSYSREQ,
-    FLAG_XKBDISABLE,
     FLAG_SAVER_BLANKTIME,
     FLAG_DPMS_STANDBYTIME,
     FLAG_DPMS_SUSPENDTIME,
@@ -736,8 +731,6 @@ static OptionInfoRec FlagOptions[] = {
 	{0}, FALSE },
   { FLAG_VTSYSREQ,		"VTSysReq",			OPTV_BOOLEAN,
 	{0}, FALSE },
-  { FLAG_XKBDISABLE,		"XkbDisable",			OPTV_BOOLEAN,
-	{0}, FALSE },
   { FLAG_SAVER_BLANKTIME,	"BlankTime"		,	OPTV_INTEGER,
 	{0}, FALSE },
   { FLAG_DPMS_STANDBYTIME,	"StandbyTime",			OPTV_INTEGER,
@@ -887,16 +880,6 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
 #endif
     }
 
-    if (xf86GetOptValBool(FlagOptions, FLAG_XKBDISABLE, &value)) {
-#ifdef XKB
-	noXkbExtension = value;
-	xf86Msg(X_CONFIG, "Xkb %s\n", value ? "disabled" : "enabled");
-#else
-	if (!value)
-	    xf86Msg(X_WARNING, "Xserver doesn't support XKB\n");
-#endif
-    }
-
     xf86Info.pmFlag = TRUE;
     if (xf86GetOptValBool(FlagOptions, FLAG_NOPM, &value)) 
 	xf86Info.pmFlag = !value;
diff --git a/hw/xfree86/common/xf86DGA.c b/hw/xfree86/common/xf86DGA.c
index 9c701c5..b7036cd 100644
--- a/hw/xfree86/common/xf86DGA.c
+++ b/hw/xfree86/common/xf86DGA.c
@@ -42,9 +42,7 @@
 #include "globals.h"
 #include "servermd.h"
 #include "micmap.h"
-#ifdef XKB
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
 #include "xf86Xinput.h"
 #include "exglobals.h"
 #include "exevents.h"
diff --git a/hw/xfree86/common/xf86Xinput.c b/hw/xfree86/common/xf86Xinput.c
index d5d06ad..46b102b 100644
--- a/hw/xfree86/common/xf86Xinput.c
+++ b/hw/xfree86/common/xf86Xinput.c
@@ -379,10 +379,7 @@ xf86ActivateDevice(LocalDevicePtr local)
         }
 
         RegisterOtherDevice(dev);
-#ifdef XKB
-        if (!noXkbExtension)
-            XkbSetExtension(dev, ProcessKeyboardEvent);
-#endif
+        XkbSetExtension(dev, ProcessKeyboardEvent);
 
         if (serverGeneration == 1) 
             xf86Msg(X_INFO, "XINPUT: Adding extended input device \"%s\" (type: %s)\n",
diff --git a/hw/xnest/Keyboard.c b/hw/xnest/Keyboard.c
index cedaa7a..35be521 100644
--- a/hw/xnest/Keyboard.c
+++ b/hw/xnest/Keyboard.c
@@ -33,9 +33,8 @@ is" without express or implied warranty.
 #include "Args.h"
 #include "Events.h"
 
-#ifdef XKB
 #include <X11/extensions/XKB.h>
-#include <xkbsrv.h>
+#include "xkbsrv.h"
 #include <X11/extensions/XKBconfig.h>
 
 extern Bool
@@ -59,7 +58,6 @@ extern	Status	XkbGetControls(
 	unsigned long		/* which */,
 	XkbDescPtr		/* desc */
 );
-#endif
 
 DeviceIntPtr xnestKeyboardDevice = NULL;
 
@@ -124,6 +122,10 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
   CARD8 modmap[MAP_LENGTH];
   int i, j;
   XKeyboardState values;
+  XkbComponentNamesRec names;
+  XkbDescPtr xkb;
+  char *rules, *model, *layout, *variants, *options;
+  int op, event, error, major, minor;
 
   switch (onoff)
     {
@@ -168,50 +170,29 @@ xnestKeyboardProc(DeviceIntPtr pDev, int onoff)
       keySyms.mapWidth = mapWidth;
       keySyms.map = keymap;
 
-#ifdef XKB
-      if (noXkbExtension) {
-XkbError:
-#endif
-      XGetKeyboardControl(xnestDisplay, &values);
-
-      memmove((char *) defaultKeyboardControl.autoRepeats,
-             (char *) values.auto_repeats, sizeof(values.auto_repeats));
-
-      InitKeyboardDeviceStruct(&pDev->public, &keySyms, modmap,
-			       xnestBell, xnestChangeKeyboardControl);
-#ifdef XKB
-      } else {
-	XkbComponentNamesRec names;
-	char *rules, *model, *layout, *variants, *options;
-
-	XkbDescPtr xkb;
-	int op, event, error, major, minor;
-
-	if (XkbQueryExtension(xnestDisplay, &op, &event, &error, &major, &minor) == 0) {
-	  ErrorF("Unable to initialize XKEYBOARD extension.\n");
+      if (XkbQueryExtension(xnestDisplay, &op, &event, &error, &major, &minor) == 0) {
+          ErrorF("Unable to initialize XKEYBOARD extension.\n");
 	  goto XkbError;
-        }
-	xkb = XkbGetKeyboard(xnestDisplay, XkbGBN_AllComponentsMask, XkbUseCoreKbd);
-	if (xkb == NULL || xkb->geom == NULL) {
+      }
+      xkb = XkbGetKeyboard(xnestDisplay, XkbGBN_AllComponentsMask, XkbUseCoreKbd);
+      if (xkb == NULL || xkb->geom == NULL) {
 	  ErrorF("Couldn't get keyboard.\n");
-	  goto XkbError;
-	}
-	XkbGetControls(xnestDisplay, XkbAllControlsMask, xkb);
+          goto XkbError;
+      }
+      XkbGetControls(xnestDisplay, XkbAllControlsMask, xkb);
 
-	memset(&names, 0, sizeof(XkbComponentNamesRec));
-	rules = XKB_DFLT_RULES;
-	model = XKB_DFLT_MODEL;
-	layout = XKB_DFLT_LAYOUT;
-	variants = XKB_DFLT_VARIANT;
-	options = XKB_DFLT_OPTIONS;
+      memset(&names, 0, sizeof(XkbComponentNamesRec));
+      rules = XKB_DFLT_RULES;
+      model = XKB_DFLT_MODEL;
+      layout = XKB_DFLT_LAYOUT;
+      variants = XKB_DFLT_VARIANT;
+      options = XKB_DFLT_OPTIONS;
 
-	XkbSetRulesDflts(rules, model, layout, variants, options);
-	XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modmap,
+      XkbSetRulesDflts(rules, model, layout, variants, options);
+      XkbInitKeyboardDeviceStruct(pDev, &names, &keySyms, modmap,
 				    xnestBell, xnestChangeKeyboardControl);
-	XkbDDXChangeControls(pDev, xkb->ctrls, xkb->ctrls);
-	XkbFreeKeyboard(xkb, 0, False);
-      }
-#endif
+      XkbDDXChangeControls(pDev, xkb->ctrls, xkb->ctrls);
+      XkbFreeKeyboard(xkb, 0, False);
       xfree(keymap);
       break;
     case DEVICE_ON: 
@@ -228,6 +209,17 @@ XkbError:
       break;
     }
   return Success;
+
+XkbError:
+  XGetKeyboardControl(xnestDisplay, &values);
+  memmove((char *)defaultKeyboardControl.autoRepeats,
+          (char *)values.auto_repeats,
+          sizeof(values.auto_repeats));
+
+  InitKeyboardDeviceStruct(&pDev->public, &keySyms,
+                           xnestBell, xnestChangeKeyboardControl);
+  xfree(keymap);
+  return Success;
 }
 
 Bool
diff --git a/hw/xwin/InitOutput.c b/hw/xwin/InitOutput.c
index 291593b..1b37bb7 100644
--- a/hw/xwin/InitOutput.c
+++ b/hw/xwin/InitOutput.c
@@ -42,8 +42,8 @@ from The Open Group.
 #ifdef __CYGWIN__
 #include <mntent.h>
 #endif
-#if defined(XKB) && defined(WIN32)
-#include <xkbsrv.h>
+#if defined(WIN32)
+#include "xkbsrv.h"
 #endif
 #ifdef RELOCATE_PROJECTROOT
 #include <shlobj.h>
@@ -667,7 +667,6 @@ winFixupPaths (void)
             winMsg (X_DEFAULT, "Logfile set to \"%s\"\n", g_pszLogFile);
         }
     }
-#ifdef XKB
     {
         static char xkbbasedir[MAX_PATH];
 
@@ -677,7 +676,6 @@ winFixupPaths (void)
         XkbBaseDirectory = xkbbasedir;
 	XkbBinDirectory = basedir;
     }
-#endif /* XKB */
 #endif /* RELOCATE_PROJECTROOT */
 }
 
@@ -857,7 +855,6 @@ winUseMsg (void)
 	  "\tSpecify a keyboard device from the configuration file.\n");
 #endif
 
-#ifdef XKB
   ErrorF ("-xkbrules XKBRules\n"
 	  "\tEquivalent to XKBRules in XF86Config files.\n");
 
@@ -874,7 +871,6 @@ winUseMsg (void)
 
   ErrorF ("-xkboptions XKBOptions\n"
 	  "\tEquivalent to XKBOptions in XF86Config files.\n");
-#endif
 
   ErrorF ("-logfile filename\n"
 	  "\tWrite logmessages to <filename> instead of /tmp/Xwin.log.\n");
diff --git a/hw/xwin/winconfig.c b/hw/xwin/winconfig.c
index 38966bf..5f5b482 100644
--- a/hw/xwin/winconfig.c
+++ b/hw/xwin/winconfig.c
@@ -36,12 +36,7 @@
 #include "winmsg.h"
 #include "globals.h"
 
-#ifdef XKB
-#ifndef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#endif
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
 
 #ifdef XWIN_XF86CONFIG
 #ifndef CONFIGPATH
@@ -67,15 +62,11 @@ WinCmdlineRec g_cmdline = {
 #ifdef XWIN_XF86CONFIG
   NULL,				/* keyboard */
 #endif
-#ifdef XKB
-  FALSE,			/* noXkbExtension */
-  NULL,				/* xkbMap */
   NULL,             /* xkbRules */
   NULL,             /* xkbModel */
   NULL,             /* xkbLayout */
   NULL,             /* xkbVariant */
   NULL,             /* xkbOptions */
-#endif
   NULL,				/* screenname */
   NULL,				/* mousename */
   FALSE,			/* emulate3Buttons */
@@ -87,7 +78,6 @@ winInfoRec g_winInfo = {
    0,				/* leds */
    500,				/* delay */
    30				/* rate */
-#ifdef XKB
    }
   ,
   {				/* xkb */
@@ -97,14 +87,6 @@ winInfoRec g_winInfo = {
    NULL,			/* layout */
    NULL,			/* variant */
    NULL,			/* options */
-   NULL,			/* initialMap */
-   NULL,			/* keymap */
-   NULL,			/* types */
-   NULL,			/* compat */
-   NULL,			/* keycodes */
-   NULL,			/* symbols */
-   NULL				/* geometry */
-#endif
    }
   ,
   {
@@ -228,11 +210,9 @@ winReadConfigfile ()
 Bool
 winConfigKeyboard (DeviceIntPtr pDevice)
 {
-#ifdef XKB
   char                          layoutName[KL_NAMELENGTH];
   static unsigned int           layoutNum = 0;
   int                           keyboardType;
-#endif
 #ifdef XWIN_XF86CONFIG
   XF86ConfInputPtr		kbd = NULL;
   XF86ConfInputPtr		input_list = NULL;
@@ -242,7 +222,6 @@ winConfigKeyboard (DeviceIntPtr pDevice)
   char				*s = NULL;
 
   /* Setup defaults */
-#ifdef XKB
   g_winInfo.xkb.disable = FALSE;
 # ifdef PC98 /* japanese */	/* not implemented */
   g_winInfo.xkb.rules = "xfree98";
@@ -358,15 +337,6 @@ winConfigKeyboard (DeviceIntPtr pDevice)
       }
   }  
   
-  g_winInfo.xkb.initialMap = NULL;
-  g_winInfo.xkb.keymap = NULL;
-  g_winInfo.xkb.types = NULL;
-  g_winInfo.xkb.compat = NULL;
-  g_winInfo.xkb.keycodes = NULL;
-  g_winInfo.xkb.symbols = NULL;
-  g_winInfo.xkb.geometry = NULL;
-#endif /* XKB */
-
   /* parse the configuration */
 #ifdef XWIN_XF86CONFIG
   if (g_cmdline.keyboard)
@@ -418,168 +388,101 @@ winConfigKeyboard (DeviceIntPtr pDevice)
         }
 #endif
       
-#ifdef XKB
-      from = X_DEFAULT;
-      if (g_cmdline.noXkbExtension)
-	{
-	  from = X_CMDLINE;
-	  g_winInfo.xkb.disable = TRUE;
-	}
-#ifdef XWIN_XF86CONFIG
-      else if (kbd->inp_option_lst)
-	{
-	  int b = winSetBoolOption (kbd->inp_option_lst, "XkbDisable", FALSE);
-	  if (b)
-	    {
-	      from = X_CONFIG;
-	      g_winInfo.xkb.disable = TRUE;
-	    }
-	}
-#endif
-      if (g_winInfo.xkb.disable)
-	{
-	  winMsg (from, "XkbExtension disabled\n");
-	}
-      else
-	{
-          s = NULL;  
-          if (g_cmdline.xkbRules)
-            {
-              s = g_cmdline.xkbRules;
-              from = X_CMDLINE;  
-            }
+        s = NULL;
+        if (g_cmdline.xkbRules)
+          {
+            s = g_cmdline.xkbRules;
+            from = X_CMDLINE;
+          }
 #ifdef XWIN_XF86CONFIG
-          else 
-            {
-              s = winSetStrOption (kbd->inp_option_lst, "XkbRules", NULL);
-              from = X_CONFIG;  
-            }
+        else
+          {
+            s = winSetStrOption (kbd->inp_option_lst, "XkbRules", NULL);
+            from = X_CONFIG;
+          }
 #endif
-          if (s)
-	    {
-	      g_winInfo.xkb.rules = NULL_IF_EMPTY (s);
-	      winMsg (from, "XKB: rules: \"%s\"\n", s);
-	    }
+        if (s)
+          {
+            g_winInfo.xkb.rules = NULL_IF_EMPTY (s);
+            winMsg (from, "XKB: rules: \"%s\"\n", s);
+	  }
           
-          s = NULL;
-          if (g_cmdline.xkbModel)
-            {
-              s = g_cmdline.xkbModel;
-              from = X_CMDLINE;
-            }
+        s = NULL;
+        if (g_cmdline.xkbModel)
+          {
+            s = g_cmdline.xkbModel;
+            from = X_CMDLINE;
+          }
 #ifdef XWIN_XF86CONFIG
-          else
-            {
-              s = winSetStrOption (kbd->inp_option_lst, "XkbModel", NULL);
-              from = X_CONFIG;
-            }  
+        else
+          {
+            s = winSetStrOption (kbd->inp_option_lst, "XkbModel", NULL);
+            from = X_CONFIG;
+          }
 #endif
-	  if (s)
-	    {
-	      g_winInfo.xkb.model = NULL_IF_EMPTY (s);
-	      winMsg (from, "XKB: model: \"%s\"\n", s);
-	    }
+        if (s)
+	  {
+	    g_winInfo.xkb.model = NULL_IF_EMPTY (s);
+	    winMsg (from, "XKB: model: \"%s\"\n", s);
+	  }
 
-          s = NULL;
-          if (g_cmdline.xkbLayout)
-            {
-              s = g_cmdline.xkbLayout;
-              from = X_CMDLINE;
-            }
+        s = NULL;
+        if (g_cmdline.xkbLayout)
+          {
+            s = g_cmdline.xkbLayout;
+            from = X_CMDLINE;
+          }
 #ifdef XWIN_XF86CONFIG
-          else
-            {
-              s = winSetStrOption (kbd->inp_option_lst, "XkbLayout", NULL);
-              from = X_CONFIG;
-            }
+        else
+          {
+            s = winSetStrOption (kbd->inp_option_lst, "XkbLayout", NULL);
+            from = X_CONFIG;
+          }
 #endif
-          if (s)  
-	    {
-	      g_winInfo.xkb.layout = NULL_IF_EMPTY (s);
-	      winMsg (from, "XKB: layout: \"%s\"\n", s);
-	    }
+        if (s)
+          {
+	    g_winInfo.xkb.layout = NULL_IF_EMPTY (s);
+	    winMsg (from, "XKB: layout: \"%s\"\n", s);
+	  }
 
-          s = NULL;
-          if (g_cmdline.xkbVariant)
-            {
-              s = g_cmdline.xkbVariant;
-              from = X_CMDLINE;
-            }
+        s = NULL;
+        if (g_cmdline.xkbVariant)
+          {
+            s = g_cmdline.xkbVariant;
+            from = X_CMDLINE;
+          }
 #ifdef XWIN_XF86CONFIG
-          else
-            { 
-              s = winSetStrOption (kbd->inp_option_lst, "XkbVariant", NULL);
-              from = X_CONFIG;
-            }
+        else
+          {
+            s = winSetStrOption (kbd->inp_option_lst, "XkbVariant", NULL);
+            from = X_CONFIG;
+          }
 #endif
-	  if (s)
-	    {
-	      g_winInfo.xkb.variant = NULL_IF_EMPTY (s);
-	      winMsg (from, "XKB: variant: \"%s\"\n", s);
-	    }
+	if (s)
+	  {
+	    g_winInfo.xkb.variant = NULL_IF_EMPTY (s);
+	    winMsg (from, "XKB: variant: \"%s\"\n", s);
+	  }
 
-          s = NULL;
-          if (g_cmdline.xkbOptions)
-            {
-              s = g_cmdline.xkbOptions;
-              from = X_CMDLINE;
-            }
+        s = NULL;
+        if (g_cmdline.xkbOptions)
+          {
+            s = g_cmdline.xkbOptions;
+            from = X_CMDLINE;
+          }
 #ifdef XWIN_XF86CONFIG
-          else
-            { 
-              s = winSetStrOption (kbd->inp_option_lst, "XkbOptions", NULL);
-              from = X_CONFIG;
-            }
+        else
+          {
+            s = winSetStrOption (kbd->inp_option_lst, "XkbOptions", NULL);
+            from = X_CONFIG;
+          }
 #endif
-          if (s)
-	    {
-	      g_winInfo.xkb.options = NULL_IF_EMPTY (s);
-	      winMsg (from, "XKB: options: \"%s\"\n", s);
-	    }
-
-#ifdef XWIN_XF86CONFIG
-	  from = X_CMDLINE;
-
-	  if ((s = winSetStrOption (kbd->inp_option_lst, "XkbKeymap", NULL)))
-	    {
-	      g_winInfo.xkb.keymap = NULL_IF_EMPTY (s);
-	      winMsg (X_CONFIG, "XKB: keymap: \"%s\" "
-		      " (overrides other XKB settings)\n", s);
-	    }
-
-	  if ((s = winSetStrOption (kbd->inp_option_lst, "XkbCompat", NULL)))
-	    {
-	      g_winInfo.xkb.compat = NULL_IF_EMPTY (s);
-	      winMsg (X_CONFIG, "XKB: compat: \"%s\"\n", s);
-	    }
-
-	  if ((s = winSetStrOption (kbd->inp_option_lst, "XkbTypes", NULL)))
-	    {
-	      g_winInfo.xkb.types = NULL_IF_EMPTY (s);
-	      winMsg (X_CONFIG, "XKB: types: \"%s\"\n", s);
-	    }
-
-	  if ((s =
-	       winSetStrOption (kbd->inp_option_lst, "XkbKeycodes", NULL)))
-	    {
-	      g_winInfo.xkb.keycodes = NULL_IF_EMPTY (s);
-	      winMsg (X_CONFIG, "XKB: keycodes: \"%s\"\n", s);
-	    }
-
-	  if ((s =
-	       winSetStrOption (kbd->inp_option_lst, "XkbGeometry", NULL)))
-	    {
-	      g_winInfo.xkb.geometry = NULL_IF_EMPTY (s);
-	      winMsg (X_CONFIG, "XKB: geometry: \"%s\"\n", s);
-	    }
+        if (s)
+	  {
+	    g_winInfo.xkb.options = NULL_IF_EMPTY (s);
+	    winMsg (from, "XKB: options: \"%s\"\n", s);
+	  }
 
-	  if ((s = winSetStrOption (kbd->inp_option_lst, "XkbSymbols", NULL)))
-	    {
-	      g_winInfo.xkb.symbols = NULL_IF_EMPTY (s);
-	      winMsg (X_CONFIG, "XKB: symbols: \"%s\"\n", s);
-	    }
-#endif
-#endif
 	}
 #ifdef XWIN_XF86CONFIG
     }
diff --git a/hw/xwin/winconfig.h b/hw/xwin/winconfig.h
index 4b56d63..71c4582 100644
--- a/hw/xwin/winconfig.h
+++ b/hw/xwin/winconfig.h
@@ -194,15 +194,11 @@ typedef struct
 #ifdef XWIN_XF86CONFIG
   char *keyboard;
 #endif
-#ifdef XKB
-  Bool noXkbExtension;
-  char *xkbMap;
   char *xkbRules; 
   char *xkbModel;
   char *xkbLayout;
   char *xkbVariant;
   char *xkbOptions;
-#endif
   /* layout */
   char *screenname;
   /* mouse settings */
@@ -309,7 +305,6 @@ typedef struct
     long rate;
   }
   keyboard;
-#ifdef XKB
   struct
   {
     Bool disable;
@@ -318,16 +313,8 @@ typedef struct
     char *layout;
     char *variant;
     char *options;
-    char *initialMap;
-    char *keymap;
-    char *types;
-    char *compat;
-    char *keycodes;
-    char *symbols;
-    char *geometry;
   }
   xkb;
-#endif
   struct
   {
     Bool emulate3Buttons;
diff --git a/hw/xwin/winkeybd.c b/hw/xwin/winkeybd.c
index 24a7b43..f270431 100644
--- a/hw/xwin/winkeybd.c
+++ b/hw/xwin/winkeybd.c
@@ -40,12 +40,7 @@
 #include "winconfig.h"
 #include "winmsg.h"
 
-#ifdef XKB
-#ifndef XKB_IN_SERVER
-#define XKB_IN_SERVER
-#endif
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
 
 static Bool g_winKeyState[NUM_KEYCODES];
 
@@ -224,11 +219,9 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
   KeySymsRec		keySyms;
   CARD8 		modMap[MAP_LENGTH];
   DevicePtr		pDevice = (DevicePtr) pDeviceInt;
-#ifdef XKB
   XkbComponentNamesRec names;
   XkbSrvInfoPtr       xkbi;
   XkbControlsPtr      ctrl;
-#endif
 
   switch (iState)
     {
@@ -237,23 +230,16 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
 
       winGetKeyMappings (&keySyms, modMap);
 
-#ifdef XKB
       /* FIXME: Maybe we should use winGetKbdLeds () here? */
       defaultKeyboardControl.leds = g_winInfo.keyboard.leds;
-#else
-      defaultKeyboardControl.leds = g_winInfo.keyboard.leds;
-#endif
 
-#ifdef XKB
       if (g_winInfo.xkb.disable) 
 	{
-#endif
 	  InitKeyboardDeviceStruct (pDevice,
 				    &keySyms,
 				    modMap,
 				    winKeybdBell,
 				    winKeybdCtrl);
-#ifdef XKB
 	} 
       else 
 	{
@@ -279,9 +265,7 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
 	  XkbInitKeyboardDeviceStruct (pDeviceInt, &names, &keySyms,
 				       modMap, winKeybdBell, winKeybdCtrl);
 	}
-#endif
 
-#ifdef XKB
       if (!g_winInfo.xkb.disable)
         {  
           xkbi = pDeviceInt->key->xkbInfo;
@@ -296,7 +280,6 @@ winKeybdProc (DeviceIntPtr pDeviceInt, int iState)
               winErrorFVerb (1, "winKeybdProc - Error initializing keyboard AutoRepeat (No XKB)\n");
             }
         }
-#endif
 
       g_winInternalModeKeyStatesPtr = &(pDeviceInt->key->state);
       break;
diff --git a/hw/xwin/winprocarg.c b/hw/xwin/winprocarg.c
index f346bed..38ee9a2 100755
--- a/hw/xwin/winprocarg.c
+++ b/hw/xwin/winprocarg.c
@@ -1369,16 +1369,6 @@ ddxProcessArgument (int argc, char *argv[], int i)
     }
 #endif
 
-#ifdef XKB
-  /*
-   * Look for the '-kb' argument
-   */
-  if (IS_OPTION ("-kb"))
-    {
-      g_cmdline.noXkbExtension = TRUE;  
-      return 0; /* Let DIX parse this again */
-    }
-
   if (IS_OPTION ("-xkbrules"))
     {
       CHECK_ARGS (1);
@@ -1409,7 +1399,6 @@ ddxProcessArgument (int argc, char *argv[], int i)
       g_cmdline.xkbOptions = argv[++i];
       return 2;
     }
-#endif
 
   if (IS_OPTION ("-keyhook"))
     {
diff --git a/hw/xwin/winwndproc.c b/hw/xwin/winwndproc.c
index 460efe6..36cde35 100644
--- a/hw/xwin/winwndproc.c
+++ b/hw/xwin/winwndproc.c
@@ -42,9 +42,7 @@
 #include "winmsg.h"
 #include "inputstr.h"
 
-#ifdef XKB
 extern BOOL winCheckKeyPressed(WPARAM wParam, LPARAM lParam);
-#endif
 extern void winFixShiftKeys (int iScanCode);
 
 
@@ -1031,7 +1029,6 @@ winWindowProc (HWND hwnd, UINT message,
       if ((wParam == VK_LWIN || wParam == VK_RWIN) && !g_fKeyboardHookLL)
 	break;
 
-#ifdef XKB
       /* 
        * Discard presses generated from Windows auto-repeat
        * ago: Only discard them if XKB is not disabled 
@@ -1052,7 +1049,6 @@ winWindowProc (HWND hwnd, UINT message,
             return 0;
         }
       } 
-#endif 
       
       /* Discard fake Ctrl_L presses that precede AltGR on non-US keyboards */
       if (winIsFakeCtrl_L (message, wParam, lParam))
diff --git a/include/dix-config.h.in b/include/dix-config.h.in
index e1d226c..1af477d 100644
--- a/include/dix-config.h.in
+++ b/include/dix-config.h.in
@@ -315,15 +315,6 @@
 /* Support Xinerama extension */
 #undef XINERAMA
 
-/* Build XKB */
-#undef XKB
-
-/* Enable XKB per default */
-#undef XKB_DFLT_DISABLED
-
-/* Build XKB server */
-#undef XKB_IN_SERVER
-
 /* Vendor release */
 #undef XORG_RELEASE
 
diff --git a/include/dix.h b/include/dix.h
index 4aa03c2..b210846 100644
--- a/include/dix.h
+++ b/include/dix.h
@@ -408,11 +408,9 @@ extern _X_EXPORT void DeliverGrabbedEvent(
     Bool /* deactivateGrab */,
     int /* count */);
 
-#ifdef XKB
 extern _X_EXPORT void FixKeyState(
     xEvent * /* xE */,
     DeviceIntPtr /* keybd */);
-#endif /* XKB */
 
 extern _X_EXPORT void RecalculateDeliverableEvents(
     WindowPtr /* pWin */);
diff --git a/include/dixstruct.h b/include/dixstruct.h
index 4ca061b..8bafcde 100644
--- a/include/dixstruct.h
+++ b/include/dixstruct.h
@@ -112,13 +112,11 @@ typedef struct _Client {
     int		priority;
     ClientState clientState;
     PrivateRec	*devPrivates;
-#ifdef XKB
     unsigned short	xkbClientFlags;
     unsigned short	mapNotifyMask;
     unsigned short	newKeyboardNotifyMask;
     unsigned short	vMajor,vMinor;
     KeyCode		minKC,maxKC;
-#endif
 
 #ifdef DEBUG
     unsigned char requestLog[MAX_REQUEST_LOG];
diff --git a/include/globals.h b/include/globals.h
index e70e7c6..5ac3905 100644
--- a/include/globals.h
+++ b/include/globals.h
@@ -114,11 +114,6 @@ extern _X_EXPORT Bool noXFree86VidModeExtension;
 extern _X_EXPORT Bool noXFixesExtension;
 #endif
 
-#ifdef XKB
-/* noXkbExtension is defined in xkb/xkbInit.c */
-extern _X_EXPORT Bool noXkbExtension;
-#endif
-
 #ifdef PANORAMIX
 extern _X_EXPORT Bool noPanoramiXExtension;
 #endif
diff --git a/include/input.h b/include/input.h
index 2dd29f8..cf546e0 100644
--- a/include/input.h
+++ b/include/input.h
@@ -409,7 +409,6 @@ extern _X_EXPORT void ProcessKeyboardEvent(
     DeviceIntPtr /*keybd*/,
     int /*count*/);
 
-#ifdef XKB
 extern _X_EXPORT void CoreProcessPointerEvent(
     xEventPtr /*xE*/,
     DeviceIntPtr /*mouse*/,
@@ -419,7 +418,6 @@ extern _X_EXPORT _X_DEPRECATED void CoreProcessKeyboardEvent(
     xEventPtr /*xE*/,
     DeviceIntPtr /*keybd*/,
     int /*count*/) _X_DEPRECATED;
-#endif
 
 extern _X_EXPORT Bool LegalModifier(
     unsigned int /*key*/, 
diff --git a/include/inputstr.h b/include/inputstr.h
index bcfc09e..d1a965b 100644
--- a/include/inputstr.h
+++ b/include/inputstr.h
@@ -144,11 +144,7 @@ typedef struct _KeyClassRec {
     CARD8		maxKeysPerModifier;
     unsigned short	state;
     unsigned short	prev_state;
-#ifdef XKB
     struct _XkbSrvInfo *xkbInfo;
-#else
-    void               *pad0;
-#endif
 } KeyClassRec, *KeyClassPtr;
 
 typedef struct _AxisInfo {
@@ -192,11 +188,7 @@ typedef struct _ButtonClassRec {
     Mask		motionMask;
     CARD8		down[DOWN_LENGTH];
     CARD8		map[MAP_LENGTH];
-#ifdef XKB
     union _XkbAction    *xkb_acts;
-#else
-    void                *pad0;
-#endif
 } ButtonClassRec, *ButtonClassPtr;
 
 typedef struct _FocusClassRec {
@@ -244,11 +236,7 @@ typedef struct _KbdFeedbackClassRec {
     KbdCtrlProcPtr	CtrlProc;
     KeybdCtrl	 	ctrl;
     KbdFeedbackPtr	next;
-#ifdef XKB
     struct _XkbSrvLedInfo *xkb_sli;
-#else
-    void                *pad0;
-#endif
 } KbdFeedbackClassRec;
 
 typedef struct _PtrFeedbackClassRec {
@@ -280,11 +268,7 @@ typedef struct _LedFeedbackClassRec {
     LedCtrlProcPtr	CtrlProc;
     LedCtrl	 	ctrl;
     LedFeedbackPtr	next;
-#ifdef XKB
     struct _XkbSrvLedInfo *xkb_sli;
-#else
-    void                *pad0;
-#endif
 } LedFeedbackClassRec;
 
 
@@ -446,11 +430,7 @@ typedef struct _DeviceIntRec {
     StringFeedbackPtr	stringfeed;
     BellFeedbackPtr	bell;
     LedFeedbackPtr	leds;
-#ifdef XKB
     struct _XkbInterest *xkb_interest;
-#else
-    void                *pad0;
-#endif
     char                *config_info; /* used by the hotplug layer */
     PrivateRec		*devPrivates;
     int			nPrivates;
diff --git a/include/site.h b/include/site.h
index fec8707..c07cbbf 100644
--- a/include/site.h
+++ b/include/site.h
@@ -90,11 +90,7 @@ SOFTWARE.
 #define DEFAULT_BELL		50
 #define DEFAULT_BELL_PITCH	400
 #define DEFAULT_BELL_DURATION	100
-#ifdef XKB
 #define DEFAULT_AUTOREPEAT	TRUE
-#else
-#define DEFAULT_AUTOREPEAT	FALSE
-#endif
 #define DEFAULT_AUTOREPEATS	{\
         0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\
         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\
diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index c6f6e9e..af87d8f 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -295,8 +295,6 @@ extern _X_EXPORT int	XkbKeyboardErrorCode;
 extern _X_EXPORT char *	XkbBaseDirectory;
 extern _X_EXPORT char *	XkbBinDirectory;
 
-extern _X_EXPORT Bool	noXkbExtension;
-
 extern _X_EXPORT pointer	XkbLastRepeatEvent;
 
 extern _X_EXPORT CARD32	xkbDebugFlags;
diff --git a/include/xorg-server.h.in b/include/xorg-server.h.in
index 57b8a82..ca6aec2 100644
--- a/include/xorg-server.h.in
+++ b/include/xorg-server.h.in
@@ -103,15 +103,9 @@
 /* Build XKB */
 #undef XKB
 
-/* Enable XKB per default */
-#undef XKB_DFLT_DISABLED
-
 /* XKB default rules */
 #undef XKB_DFLT_RULES
 
-/* Build XKB support in server */
-#undef XKB_IN_SERVER
-
 /* Support loadable input and output drivers */
 #undef XLOADABLE
 
diff --git a/mi/miinitext.c b/mi/miinitext.c
index 92d6cd2..9520957 100644
--- a/mi/miinitext.c
+++ b/mi/miinitext.c
@@ -134,10 +134,6 @@ extern Bool noXFree86VidModeExtension;
 #ifdef XFIXES
 extern Bool noXFixesExtension;
 #endif
-#ifdef XKB
-/* |noXkbExtension| is defined in xc/programs/Xserver/xkb/xkbInit.c */
-extern Bool noXkbExtension;
-#endif
 #ifdef PANORAMIX
 extern Bool noPanoramiXExtension;
 #endif
@@ -167,9 +163,7 @@ typedef void (*InitExtension)(INITARGS);
 #define _XTEST_SERVER_
 #include <X11/extensions/XTest.h>
 #endif
-#ifdef XKB
 #include <X11/extensions/XKB.h>
-#endif
 #ifdef XCSECURITY
 #include "securitysrv.h"
 #include <X11/extensions/securstr.h>
@@ -213,9 +207,7 @@ extern void XvExtensionInit(INITARGS);
 extern void XvMCExtensionInit(INITARGS);
 #endif
 extern void SyncExtensionInit(INITARGS);
-#ifdef XKB
 extern void XkbExtensionInit(INITARGS);
-#endif
 extern void XCMiscExtensionInit(INITARGS);
 #ifdef XRECORD
 extern void RecordExtensionInit(INITARGS);
@@ -340,9 +332,7 @@ static ExtensionToggle ExtensionToggleList[] =
     { "XINERAMA", &noPanoramiXExtension },
 #endif
     { "XInputExtension", NULL },
-#ifdef XKB
-    { "XKEYBOARD", &noXkbExtension },
-#endif
+    { "XKEYBOARD", NULL },
 #ifdef XSELINUX
     { "SELinux", &noSELinuxExtension },
 #endif
@@ -416,9 +406,7 @@ InitExtensions(int argc, char *argv[])
     }
 #endif
     SyncExtensionInit();
-#if defined(XKB)
-    if (!noXkbExtension) XkbExtensionInit();
-#endif
+    XkbExtensionInit();
     XCMiscExtensionInit();
 #ifdef XRECORD
     if (!noTestExtensions) RecordExtensionInit(); 
@@ -493,9 +481,7 @@ static ExtensionModule staticExtensions[] = {
 #endif
     { BigReqExtensionInit, "BIG-REQUESTS", NULL, NULL, NULL },
     { SyncExtensionInit, "SYNC", NULL, NULL, NULL },
-#ifdef XKB
-    { XkbExtensionInit, XkbName, &noXkbExtension, NULL, NULL },
-#endif
+    { XkbExtensionInit, XkbName, NULL, NULL, NULL },
     { XCMiscExtensionInit, "XC-MISC", NULL, NULL, NULL },
 #ifdef XCSECURITY
     { SecurityExtensionInit, SECURITY_EXTENSION_NAME, &noSecurityExtension, NULL, NULL },
diff --git a/os/utils.c b/os/utils.c
index 55f8a98..0ed89dd 100644
--- a/os/utils.c
+++ b/os/utils.c
@@ -118,9 +118,7 @@ __stdcall unsigned long GetTickCount(void);
 
 #include "dixstruct.h"
 
-#ifdef XKB
-#include <xkbsrv.h>
-#endif
+#include "xkbsrv.h"
 
 #ifdef RENDER
 #include "picture.h"
@@ -180,7 +178,6 @@ Bool noXFree86VidModeExtension = FALSE;
 #ifdef XFIXES
 Bool noXFixesExtension = FALSE;
 #endif
-/* noXkbExtension is defined in xkb/xkbInit.c */
 #ifdef PANORAMIX
 /* Xinerama is disabled by default unless enabled via +xinerama */
 Bool noPanoramiXExtension = TRUE;
@@ -551,9 +548,7 @@ void UseMsg(void)
 #ifdef XDMCP
     XdmcpUseMsg();
 #endif
-#ifdef XKB
     XkbUseMsg();
-#endif
     ddxUseMsg();
 }
 
@@ -722,13 +717,11 @@ ProcessCommandLine(int argc, char *argv[])
 	    UseMsg();
 	    exit(0);
 	}
-#ifdef XKB
         else if ( (skip=XkbProcessArguments(argc,argv,i))!=0 ) {
 	    if (skip>0)
 		 i+= skip-1;
 	    else UseMsg();
 	}
-#endif
 #ifdef RLIMIT_DATA
 	else if ( strcmp( argv[i], "-ld") == 0)
 	{
diff --git a/xkb/xkbInit.c b/xkb/xkbInit.c
index 573e731..e800482 100644
--- a/xkb/xkbInit.c
+++ b/xkb/xkbInit.c
@@ -85,9 +85,6 @@ typedef struct	_SrvXkmInfo {
 
 /***====================================================================***/
 
-#ifndef XKB_DFLT_DISABLED
-#define	XKB_DFLT_DISABLED	True
-#endif
 #ifndef XKB_DFLT_RULES_PROP
 #define	XKB_DFLT_RULES_PROP	True
 #endif
@@ -110,7 +107,6 @@ static char *		XkbOptionsUsed=	NULL;
 
 static XkbDescPtr       xkb_cached_map = NULL;
 
-Bool			noXkbExtension=		XKB_DFLT_DISABLED;
 static Bool		XkbWantRulesProp=	XKB_DFLT_RULES_PROP;
 
 /***====================================================================***/
@@ -817,15 +813,7 @@ extern unsigned char	XkbDfltAccessXOptions;
 int
 XkbProcessArguments(int argc,char *argv[],int i)
 {
-    if (strcmp(argv[i],"-kb")==0) {
-	noXkbExtension= True;
-	return 1;
-    }
-    else if (strcmp(argv[i],"+kb")==0) {
-	noXkbExtension= False;
-	return 1;
-    }
-    else if (strncmp(argv[i], "-xkbdir", 7) == 0) {
+    if (strncmp(argv[i], "-xkbdir", 7) == 0) {
 	if(++i < argc) {
 #if !defined(WIN32) && !defined(__CYGWIN__)
 	    if (getuid() != geteuid()) {
commit f9da417163b6b2d6234d2542c1f375e33db7159a
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Mar 28 19:26:42 2008 +0200

    Xephyr: Disable state inheritance hack
    
    Prepare for the impending removal of the state field by disabling this hack
    for a while: it's hell of nasty and I'm amazed it ever really worked.
    
    Basically, on focus out, it should do as current DDXes do and fake releases
    for all keys (not just mangle the core state) that are currently down;
    buttons too.  When focus comes back in, we already have a KeymapNotify that
    lets us know what's currently down, so we can use this to fake the
    appropriate keypresses, and send it through the event routing layer.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
index ab8459c..740f661 100644
--- a/hw/kdrive/ephyr/ephyr.c
+++ b/hw/kdrive/ephyr/ephyr.c
@@ -753,6 +753,18 @@ ephyrUpdateModifierState(unsigned int state)
   if (!pkeydev)
     return;
   
+/* This is pretty broken.
+ *
+ * What should happen is that focus out should do as a VT switch does in
+ * traditional servers: fake releases for all keys (and buttons too, come
+ * to think of it) currently down.  Then, on focus in, get the state from
+ * the host, and fake keypresses for everything currently down.
+ *
+ * So I'm leaving this broken for a little while.  Sorry, folks.
+ *
+ * -daniels
+ */
+#if 0
   keyc = pkeydev->key;
   
   state = state & 0xff;
@@ -798,6 +810,7 @@ ephyrUpdateModifierState(unsigned int state)
 	      break;
 	    }
     }
+#endif
 }
 
 static void
commit 5c281446d2a8c38511d45baee6f0d25a640f12e1
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Mar 28 11:56:34 2008 +0200

    XKB: Remove lock actions disabling
    
    For some reason, XKB allows clients to set a global (!) flag that simply
    turns lock keys into state no-ops.  Ignore this flag.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/include/xkbsrv.h b/include/xkbsrv.h
index ee04063..c6f6e9e 100644
--- a/include/xkbsrv.h
+++ b/include/xkbsrv.h
@@ -291,12 +291,9 @@ extern _X_EXPORT void xkbUnwrapProc(DeviceIntPtr, DeviceHandleProc, pointer);
 
 extern _X_EXPORT int	XkbReqCode;
 extern _X_EXPORT int	XkbEventBase;
-extern _X_EXPORT int	XkbDisableLockActions;
 extern _X_EXPORT int	XkbKeyboardErrorCode;
 extern _X_EXPORT char *	XkbBaseDirectory;
 extern _X_EXPORT char *	XkbBinDirectory;
-extern _X_EXPORT int	XkbDfltRepeatDelay;
-extern _X_EXPORT int	XkbDfltRepeatInterval;
 
 extern _X_EXPORT Bool	noXkbExtension;
 
diff --git a/xkb/xkb.c b/xkb/xkb.c
index f6dfb08..ad3529d 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -6611,8 +6611,6 @@ int rc;
     xkbDebugFlags = newFlags;
     xkbDebugCtrls = newCtrls;
 
-    XkbDisableLockActions= (xkbDebugCtrls&XkbDF_DisableLocks);
-
     rep.type= X_Reply;
     rep.length = 0;
     rep.sequenceNumber = client->sequence;
diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c
index 424fc63..315ff0d 100644
--- a/xkb/xkbActions.c
+++ b/xkb/xkbActions.c
@@ -85,41 +85,6 @@ static XkbAction	fake;
 	fake.type = XkbSA_NoAction;
 	return fake;
     }
-    if (XkbDisableLockActions) {
-	switch (act->type) {
-	    case XkbSA_LockMods:
-		fake.mods.type  = XkbSA_SetMods;
-		fake.mods.flags = 0;
-		fake.mods.mask  = act->mods.mask;
-		return fake;
-	    case XkbSA_LatchMods:
-		fake.mods.type  = XkbSA_SetMods;
-		fake.mods.flags = 0;
-		fake.mods.mask  = act->mods.mask;
-		return fake;
-	    case XkbSA_ISOLock:
-		if (act->iso.flags&XkbSA_ISODfltIsGroup) {
-		     fake.group.type = XkbSA_SetGroup;
-		     fake.group.flags = act->iso.flags&XkbSA_GroupAbsolute;
-		     XkbSASetGroup(&fake.group,XkbSAGroup(&act->iso));
-		}
-		else {
-		     fake.mods.type  = XkbSA_SetMods;
-		     fake.mods.flags = 0;
-		     fake.mods.mask  = act->iso.mask;
-		}
-		return fake;
-	    case XkbSA_LockGroup:
-	    case XkbSA_LatchGroup:
-		/* We want everything from the latch/lock action except the
-		 * type should be changed to set.
-		 */
-		fake = *act;
-		fake.group.type = XkbSA_SetGroup;
-		return fake;
-	}
-    }
-    else 
     if (xkb->ctrls->enabled_ctrls&XkbStickyKeysMask) {
 	if (act->any.type==XkbSA_SetMods) {
 	    fake.mods.type = XkbSA_LatchMods;
diff --git a/xkb/xkbUtils.c b/xkb/xkbUtils.c
index a12cb79..abfd6fb 100644
--- a/xkb/xkbUtils.c
+++ b/xkb/xkbUtils.c
@@ -68,8 +68,6 @@ DEALINGS IN THE SOFTWARE.
 #include "xkbgeom.h"
 #include "xkb.h"
 
-int	XkbDisableLockActions = 0;
-
 /***====================================================================***/
 
 int
commit 2f7cb7306709d5266688e05a066701d309323035
Author: Daniel Stone <daniel at fooishbar.org>
Date:   Fri Dec 26 18:36:30 2008 +1100

    XKB: Add XkbRMLVOSet
    
    XkbRMLVOSet is just a set of strings for rules, model, layout, variant
    and options; use that in preference to XkbRF_VarDefsRec, which is a
    hideously complicated monster that somehow managed to not include the
    actual rules.
    
    While we're at it, clean up xkbrules.h so it doesn't require xkbstr.h.
    
    Signed-off-by: Daniel Stone <daniel at fooishbar.org>

diff --git a/include/xkbrules.h b/include/xkbrules.h
index ff77ddc..e8917f0 100644
--- a/include/xkbrules.h
+++ b/include/xkbrules.h
@@ -29,6 +29,14 @@
 
 /***====================================================================***/
 
+typedef struct _XkbRMLVOSet {
+        char *                  rules;
+        char *                  model;
+        char *                  layout;
+        char *                  variant;
+        char *                  options;
+} XkbRMLVOSet;
+
 typedef struct _XkbRF_VarDefs {
 	char *			model;
 	char *			layout;
@@ -103,10 +111,13 @@ typedef struct _XkbRF_Rules {
 
 _XFUNCPROTOBEGIN
 
+/* Seems preferable to dragging xkbstr.h in. */
+struct _XkbComponentNames;
+
 extern _X_EXPORT Bool	XkbRF_GetComponents(
     XkbRF_RulesPtr		/* rules */,
     XkbRF_VarDefsPtr		/* var_defs */,
-    XkbComponentNamesPtr	/* names */
+    struct _XkbComponentNames *	/* names */
 );
 
 extern _X_EXPORT XkbRF_RulePtr	XkbRF_AddRule(


More information about the xorg-commit mailing list