<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