--- xf86-input-keyboard-1.2.2.orig/src/kbd.c 2007-08-20 16:38:24.000000000 -0600 +++ xf86-input-keyboard-1.2.2/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