Please review the second version: http://cr.openjdk.java.net/~alexp/8001633/webrev.01/ <http://cr.openjdk.java.net/%7Ealexp/8001633/webrev.01/>
All remarks was corrected.

On 10/29/2012 4:32 PM, Anton V. Tarasov wrote:
Hi Mikhail,

* KeyEvent.java

- No need to initialize 'originalSource' in constructors which call to this(...) where you already initialized it.

-950      * we need to able to obtain original source.

"be" is omitted ("we need to be able")

* WindowsRootPaneUI.java

I think there's no need to put another 'skip' setting into a separate if-block (skip will be equal 'false' in majority of cases).
Why don't you write it simply as follows?

Component originalSource = AWTAccessor.getKeyEventAccessor().getOriginalSource(ev);

skip = (ev.getWhen()<= ((SunToolkit)tk).getWindowDeactivationTime(winAncestor)) ||
       SwingUtilities.getWindowAncestor(originalSource) != winAncestor);


Thanks,
Anton.

On 29.10.2012 14:23, Mikhail Cherkasov wrote:
Hi all,

Could you please review a fix for 8001633 <http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8001633>: Wrong alt processing during switching between windows. Bug:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8001633 <http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8001633>
Webrev:
http://cr.openjdk.java.net/~bagiras/8/7082294.1/

To prevent wrong focus traversing to menu was added additional check to AltProcessor. It checks that original source of 'alt' event belongs to AltProcessor.winAncestor
or its component.

Patch is attached.

Thanks,
Mikhail.



diff --git 
a/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java 
b/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java
--- a/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java
+++ b/src/share/classes/com/sun/java/swing/plaf/windows/WindowsRootPaneUI.java
@@ -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;
@@ -133,10 +135,15 @@
                 // window. If this time appears to be greater than the 
altRelease
                 // event time the event is skipped to avoid unexpected menu
                 // activation. See 7121442.
+                // Also we must ensure that original source of key event 
belongs
+                // to the same window object as winAncestor. See 8001633.
                 boolean skip = false;
                 Toolkit tk = Toolkit.getDefaultToolkit();
                 if (tk instanceof SunToolkit) {
-                    skip = ev.getWhen() <= 
((SunToolkit)tk).getWindowDeactivationTime(winAncestor);
+                    Component originalSource = 
AWTAccessor.getKeyEventAccessor()
+                            .getOriginalSource(ev);
+                    skip = ev.getWhen() <= ((SunToolkit) 
tk).getWindowDeactivationTime(winAncestor)
+                            || SunToolkit.getContainingWindow(originalSource) 
!= winAncestor;
                 }
 
                 if (menu != null && !skip) {
diff --git a/src/share/classes/java/awt/event/KeyEvent.java 
b/src/share/classes/java/awt/event/KeyEvent.java
--- a/src/share/classes/java/awt/event/KeyEvent.java
+++ b/src/share/classes/java/awt/event/KeyEvent.java
@@ -930,6 +930,10 @@
                                                long extendedKeyCode) {
                     ev.extendedKeyCode = extendedKeyCode;
                 }
+
+                public Component getOriginalSource( KeyEvent ev ) {
+                    return ev.originalSource;
+                }
             });
     }
 
@@ -939,6 +943,14 @@
      */
     private static native void initIDs();
 
+    /**
+     * The original event source.
+     *
+     * Event source can be changed during processing, but in some cases
+     * we need to be 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);
@@ -1023,6 +1035,7 @@
         } else if ((getModifiers() == 0) && (getModifiersEx() != 0)) {
             setOldModifiers();
         }
+        originalSource = source;
     }
 
     /**
diff --git a/src/share/classes/sun/awt/AWTAccessor.java 
b/src/share/classes/sun/awt/AWTAccessor.java
--- a/src/share/classes/sun/awt/AWTAccessor.java
+++ b/src/share/classes/sun/awt/AWTAccessor.java
@@ -629,6 +629,11 @@
          * Sets extendedKeyCode field for KeyEvent
          */
         void setExtendedKeyCode(KeyEvent ev, long extendedKeyCode);
+
+        /**
+         * Gets original source for KeyEvent
+         */
+        Component getOriginalSource(KeyEvent ev);
     }
 
     /**

Reply via email to