Revision: 4855 http://tigervnc.svn.sourceforge.net/tigervnc/?rev=4855&view=rev Author: bphinz Date: 2012-02-14 19:56:17 +0000 (Tue, 14 Feb 2012) Log Message: ----------- Applied fix for issue with Win7 and German metakeys. Patch submitted by Albert Fluegel
Modified Paths: -------------- trunk/java/com/tigervnc/vncviewer/CConn.java Modified: trunk/java/com/tigervnc/vncviewer/CConn.java =================================================================== --- trunk/java/com/tigervnc/vncviewer/CConn.java 2012-02-13 12:34:17 UTC (rev 4854) +++ trunk/java/com/tigervnc/vncviewer/CConn.java 2012-02-14 19:56:17 UTC (rev 4855) @@ -1228,16 +1228,19 @@ if (ev.getID() != KeyEvent.KEY_PRESSED && !ev.isActionKey()) return; - int keysym; + int keysym, keycode, currentModifiers; + currentModifiers = ev.getModifiers(); + keycode = ev.getKeyCode(); + if (!ev.isActionKey()) { vlog.debug("key press "+ev.getKeyChar()); if (ev.getKeyChar() < 32) { // if the ctrl modifier key is down, send the equivalent ASCII since we // will send the ctrl modifier anyway - if ((ev.getModifiers() & KeyEvent.CTRL_MASK) != 0) { - if ((ev.getModifiers() & KeyEvent.SHIFT_MASK) != 0) { + if ((currentModifiers & KeyEvent.CTRL_MASK) != 0) { + if ((currentModifiers & KeyEvent.SHIFT_MASK) != 0) { keysym = ev.getKeyChar() + 64; if (keysym == -1) return; @@ -1246,7 +1249,7 @@ if (keysym == 127) keysym = 95; } } else { - switch (ev.getKeyCode()) { + switch (keycode) { case KeyEvent.VK_BACK_SPACE: keysym = Keysyms.BackSpace; break; case KeyEvent.VK_TAB: keysym = Keysyms.Tab; break; case KeyEvent.VK_ENTER: keysym = Keysyms.Return; break; @@ -1262,12 +1265,26 @@ keysym = UnicodeToKeysym.translate(ev.getKeyChar()); if (keysym == -1) return; + + // Windows 7 or some Java version send key events that require the + // following special treatment with the German Alt-Gr Key. They send + // ALT + CTRL before the normal key event. They should be suppressed + if ((currentModifiers & KeyEvent.CTRL_MASK) != 0 + && (currentModifiers & KeyEvent.ALT_MASK) != 0 + && ((keysym == 0x5c) || (keysym == 0x7c) // backslash bar + || (keysym == 0x5b) || (keysym == 0x5d) // [ ] + || (keysym == 0x7b) || (keysym == 0x7d) // { } + || (keysym == 0x7e) || (keysym == 0x40) // ~ @ + || (keysym == 0x20ac) || (keysym == 0xb5) // Euro Micro + || (keysym == 0xb2) || (keysym == 0xb3)) // ^2 ^3 + ) + currentModifiers &= (~ KeyEvent.CTRL_MASK) & (~ KeyEvent.ALT_MASK); } } else { // KEY_ACTION - vlog.debug("key action "+ev.getKeyCode()); - switch (ev.getKeyCode()) { + vlog.debug("key action " + keycode); + switch (keycode) { case KeyEvent.VK_HOME: keysym = Keysyms.Home; break; case KeyEvent.VK_END: keysym = Keysyms.End; break; case KeyEvent.VK_PAGE_UP: keysym = Keysyms.Page_Up; break; @@ -1295,7 +1312,7 @@ } } - writeModifiers(ev.getModifiers()); + writeModifiers(currentModifiers); writeKeyEvent(keysym, true); writeKeyEvent(keysym, false); writeModifiers(0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. ------------------------------------------------------------------------------ Keep Your Developer Skills Current with LearnDevNow! The most comprehensive online learning library for Microsoft developers is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3, Metro Style Apps, more. Free future releases when you subscribe now! http://p.sf.net/sfu/learndevnow-d2d _______________________________________________ Tigervnc-commits mailing list Tigervnc-commits@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tigervnc-commits