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