Index: unix/xserver/hw/vnc/Input.cc =================================================================== --- unix/xserver/hw/vnc/Input.cc (revision 3923) +++ unix/xserver/hw/vnc/Input.cc (revision 3924) @@ -373,6 +373,14 @@ unsigned int i, n; int j, k, action; + /* + * Since we are checking the current state to determine if we need + * to fake modifiers, we must make sure that everything put on the + * input queue is processed before we start. Otherwise, shift may be + * stuck down. + */ + mieqProcessInputEvents(); + if (keysym == XK_Caps_Lock) { vlog.debug("Ignoring caps lock"); return; @@ -506,6 +514,15 @@ action = down ? KeyPress : KeyRelease; n = GetKeyboardEvents(eventq, dev, action, kc); enqueueEvents(dev, n); + + /* + * When faking a modifier we are putting a keycode (which can + * currently activate the desired modifier) on the input + * queue. A future modmap change can change the mapping so + * that this keycode means something else entirely. Guard + * against this by processing the queue now. + */ + mieqProcessInputEvents(); } static KeySym KeyCodetoKeySym(KeySymsPtr keymap, int keycode, int col)