--- src/kbd.c	2007-08-20 16:38:24.000000000 -0600
+++ src/kbd.c	2007-09-21 10:31:06.000000000 -0600
@@ -676,9 +676,6 @@ sunKeyboards:
 	    keyc->curKeySyms.mapWidth * 
 	    (keycode - keyc->curKeySyms.minKeyCode));
 
-#ifdef XKB
-  if (pKbd->noXkb) {
-#endif
   /*
    * Filter autorepeated caps/num/scroll lock keycodes.
    */
@@ -733,7 +730,7 @@ sunKeyboards:
 
   /*
    * LockKey special handling:
-   * ignore releases, toggle on & off on presses.
+   * ignore releases, toggle on & off on presses, preserve 'down'.
    * Don't deal with the Caps_Lock keysym directly, but check the lock modifier
    */
 
@@ -746,20 +743,19 @@ sunKeyboards:
    if (keysym[1] == XF86XK_ModeLock)
        changeLock = MODEFLAG;
 
-   if (changeLock) {
-      if (!down)
-          return;
-
-      pKbd->keyLeds &= ~changeLock;
-
-      if (KeyPressed(keycode)) {
-	  down = !down;
-      } else {
-          pKbd->keyLeds |= changeLock;
-      }
+   if (changeLock && down) {
+      if (changeLock & pKbd->keyLeds)
+         /* led on. Turn it off */
+         pKbd->keyLeds &= ~changeLock;
+      else
+         /* led off. Turn it on. */
+         pKbd->keyLeds |= changeLock;
       UpdateLeds(pInfo);
-  }
+   }
 
+#ifdef XKB
+  if (pKbd->noXkb) {
+#endif
   if (!pKbd->CustomKeycodes) {
     /*
      * normal, non-keypad keys
