--- old/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java Fri Oct 26 21:01:37 2012 +++ new/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java Fri Oct 26 21:01:37 2012 @@ -31,6 +31,8 @@ import java.awt.KeyEventPostProcessor; import java.awt.Window; import java.awt.Toolkit; + +import sun.awt.AWTAccessor; import sun.awt.SunToolkit; import java.awt.event.ActionEvent; @@ -138,6 +140,13 @@ if (tk instanceof SunToolkit) { skip = ev.getWhen() <= ((SunToolkit)tk).getWindowDeactivationTime(winAncestor); } + // We must insure that original source of key event belongs to the same window object as winAncestor. + if (!skip) { + Component originalSource = AWTAccessor.getKeyEventAccessor() + .getOriginalSource(ev); + skip = !(originalSource == winAncestor || + SwingUtilities.getWindowAncestor(originalSource) == winAncestor); + } if (menu != null && !skip) { MenuElement[] path = new MenuElement[2]; --- old/src/share/classes/java/awt/event/KeyEvent.java Fri Oct 26 21:01:40 2012 +++ new/src/share/classes/java/awt/event/KeyEvent.java Fri Oct 26 21:01:39 2012 @@ -930,6 +930,10 @@ long extendedKeyCode) { ev.extendedKeyCode = extendedKeyCode; } + + public Component getOriginalSource( KeyEvent ev ) { + return ev.originalSource; + } }); } @@ -939,10 +943,19 @@ */ private static native void initIDs(); + /** + * The original event source. + * + * Event source can be changed during processing, but in some cases + * we need to able to obtain original source. + */ + private Component originalSource; + private KeyEvent(Component source, int id, long when, int modifiers, int keyCode, char keyChar, int keyLocation, boolean isProxyActive) { this(source, id, when, modifiers, keyCode, keyChar, keyLocation); this.isProxyActive = isProxyActive; + originalSource = source; } /** @@ -1023,6 +1036,7 @@ } else if ((getModifiers() == 0) && (getModifiersEx() != 0)) { setOldModifiers(); } + originalSource = source; } /** @@ -1069,6 +1083,7 @@ int keyCode, char keyChar) { this(source, id, when, modifiers, keyCode, keyChar, KEY_LOCATION_UNKNOWN); + originalSource = source; } /** @@ -1078,6 +1093,7 @@ public KeyEvent(Component source, int id, long when, int modifiers, int keyCode) { this(source, id, when, modifiers, keyCode, (char)keyCode); + originalSource = source; } /** --- old/src/share/classes/sun/awt/AWTAccessor.java Fri Oct 26 21:01:42 2012 +++ new/src/share/classes/sun/awt/AWTAccessor.java Fri Oct 26 21:01:41 2012 @@ -629,6 +629,11 @@ * Sets extendedKeyCode field for KeyEvent */ void setExtendedKeyCode(KeyEvent ev, long extendedKeyCode); + + /** + * Gets original source for KeyEvent + */ + Component getOriginalSource(KeyEvent ev); } /**