sharkcz / rpms / tigervnc

Forked from rpms/tigervnc 4 years ago
Clone
Blob Blame History Raw
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)