Release all downKeys when the focus is lost, otherwise the state of the keyboard will be inconsistent when the focus is regained.  Also, the direction of the key release was incorrect in r5147.

git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@5150 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/java/com/tigervnc/vncviewer/CConn.java b/java/com/tigervnc/vncviewer/CConn.java
index e48e93b..b876751 100644
--- a/java/com/tigervnc/vncviewer/CConn.java
+++ b/java/com/tigervnc/vncviewer/CConn.java
@@ -310,7 +310,7 @@
           desktop.requestFocus();
       }
       public void focusLost(FocusEvent e) {
-        releaseModifiers();
+        releaseDownKeys();
       }
     });
     viewer.validate();
@@ -1367,27 +1367,10 @@
 
   }
 
-  synchronized void releaseModifiers() {
-    if (downKeySym.containsValue(Keysyms.Shift_L))
-      writeKeyEvent(Keysyms.Shift_L, true);
-    if (downKeySym.containsValue(Keysyms.Shift_R))
-      writeKeyEvent(Keysyms.Shift_R, true);
-    if (downKeySym.containsValue(Keysyms.Control_L))
-      writeKeyEvent(Keysyms.Control_L, true);
-    if (downKeySym.containsValue(Keysyms.Control_R))
-      writeKeyEvent(Keysyms.Control_R, true);
-    if (downKeySym.containsValue(Keysyms.Alt_L))
-      writeKeyEvent(Keysyms.Alt_L, true);
-    if (downKeySym.containsValue(Keysyms.Alt_R))
-      writeKeyEvent(Keysyms.Alt_R, true);
-    if (downKeySym.containsValue(Keysyms.Meta_L))
-      writeKeyEvent(Keysyms.Meta_L, true);
-    if (downKeySym.containsValue(Keysyms.Meta_R))
-      writeKeyEvent(Keysyms.Meta_R, true);
-    if (downKeySym.containsValue(Keysyms.Super_L))
-      writeKeyEvent(Keysyms.Super_L, true);
-    if (downKeySym.containsValue(Keysyms.Super_R))
-      writeKeyEvent(Keysyms.Super_R, true);
+  synchronized void releaseDownKeys() {
+    for (Map.Entry<Integer, Integer> entry : downKeySym.entrySet())
+      writeKeyEvent(entry.getValue(), false);
+    downKeySym.clear();
   }
 
   // this is a special ActionListener passed in by the
diff --git a/java/com/tigervnc/vncviewer/DesktopWindow.java b/java/com/tigervnc/vncviewer/DesktopWindow.java
index 4749eb2..4175746 100644
--- a/java/com/tigervnc/vncviewer/DesktopWindow.java
+++ b/java/com/tigervnc/vncviewer/DesktopWindow.java
@@ -86,7 +86,7 @@
         checkClipboard();
       }
       public void focusLost(FocusEvent e) {
-        cc.releaseModifiers();
+        cc.releaseDownKeys();
       }
     });
     setFocusTraversalKeysEnabled(false);
diff --git a/java/com/tigervnc/vncviewer/Viewport.java b/java/com/tigervnc/vncviewer/Viewport.java
index 19c51c9..a6ce355 100644
--- a/java/com/tigervnc/vncviewer/Viewport.java
+++ b/java/com/tigervnc/vncviewer/Viewport.java
@@ -58,7 +58,7 @@
           sp.getViewport().getView().requestFocusInWindow();
       }
       public void windowLostFocus(WindowEvent e) {
-        cc.releaseModifiers();
+        cc.releaseDownKeys();
       }
     });
     addWindowListener(new WindowAdapter() {