]> source.dussan.org Git - tigervnc.git/commitdiff
Avoid modifiers such as shift sticking.
authorPeter Åstrand <astrand@cendio.se>
Wed, 9 Dec 2009 12:28:19 +0000 (12:28 +0000)
committerPeter Åstrand <astrand@cendio.se>
Wed, 9 Dec 2009 12:28:19 +0000 (12:28 +0000)
git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@3924 3789f03b-4d11-0410-bbf8-ca57d06f2519

unix/xserver/hw/vnc/Input.cc

index 478240c4e1bd3cdbf6471aa54f73c2477a28046a..4ad1564d5c9a0bb05d6c66ccc14b399dfb61993b 100644 (file)
@@ -373,6 +373,14 @@ void KeyboardDevice::keyEvent(rdr::U32 keysym, bool down)
        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 @@ ModeSwitchFound:
        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)