<AWT Dev> [8] [PATCH] Review request for 8001633: Wrong alt processing during switching between windows.

Mikhail Cherkasov mikhail.cherkasov at oracle.com
Mon Oct 29 09:18:11 PDT 2012


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.
>>
>

-------------- next part --------------
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);
     }
 
     /**


More information about the awt-dev mailing list