From 523d54f4835a0276d5ed049ca299e9439affa0b2 Mon Sep 17 00:00:00 2001 From: ant Date: Mon, 24 Mar 2008 15:51:26 +0300 Subject: [PATCH] 6637607: 1st char. is discarded after a modal dialogue shows up and disappears Summary: Reset consuming next KEY_TYPED on every subsequent KEY_PRESS. Reviewed-by: son --- .../java/awt/DefaultKeyboardFocusManager.java | 3 + .../native/sun/windows/awt_Component.cpp | 4 + .../ConsumeNextKeyTypedOnModalShowTest.java | 110 ++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 test/java/awt/Focus/ConsumeNextKeyTypedOnModalShowTest/ConsumeNextKeyTypedOnModalShowTest.java diff --git a/src/share/classes/java/awt/DefaultKeyboardFocusManager.java b/src/share/classes/java/awt/DefaultKeyboardFocusManager.java index 1874d8bb3..9e2c6e562 100644 --- a/src/share/classes/java/awt/DefaultKeyboardFocusManager.java +++ b/src/share/classes/java/awt/DefaultKeyboardFocusManager.java @@ -1078,6 +1078,9 @@ public class DefaultKeyboardFocusManager extends KeyboardFocusManager { focusNextComponent(focusedComponent); } return; + } else if (e.getID() == KeyEvent.KEY_PRESSED) { + // Fix for 6637607: consumeNextKeyTyped should be reset. + consumeNextKeyTyped = false; } toTest = focusedComponent.getFocusTraversalKeys( diff --git a/src/windows/native/sun/windows/awt_Component.cpp b/src/windows/native/sun/windows/awt_Component.cpp index f58237861..f2f59b859 100644 --- a/src/windows/native/sun/windows/awt_Component.cpp +++ b/src/windows/native/sun/windows/awt_Component.cpp @@ -5740,6 +5740,10 @@ void AwtComponent::_NativeHandleEvent(void *param) env->DeleteGlobalRef(event); delete nhes; return; + + } else if (id == java_awt_event_KeyEvent_KEY_PRESSED) { + // Fix for 6637607: reset consuming + keyDownConsumed = FALSE; } /* Consume a KEY_TYPED event if a KEY_PRESSED had been, to support diff --git a/test/java/awt/Focus/ConsumeNextKeyTypedOnModalShowTest/ConsumeNextKeyTypedOnModalShowTest.java b/test/java/awt/Focus/ConsumeNextKeyTypedOnModalShowTest/ConsumeNextKeyTypedOnModalShowTest.java new file mode 100644 index 000000000..801dc2e6e --- /dev/null +++ b/test/java/awt/Focus/ConsumeNextKeyTypedOnModalShowTest/ConsumeNextKeyTypedOnModalShowTest.java @@ -0,0 +1,110 @@ +/* + * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +/* + @test %W% %E% + @bug 6637607 + @summary Showing a modal dlg on TAB KEY_PRESS shouldn't consume inappropriate KEY_TYPED. + @author Anton Tarasov: area=awt-focus + @library ../../regtesthelpers + @build Util + @run main ConsumeNextKeyTypedOnModalShowTest +*/ + +import java.awt.*; +import java.awt.event.*; +import java.applet.Applet; +import java.util.concurrent.atomic.AtomicBoolean; +import java.lang.reflect.InvocationTargetException; +import test.java.awt.regtesthelpers.Util; + +public class ConsumeNextKeyTypedOnModalShowTest extends Applet { + Robot robot; + Frame frame = new Frame("Frame"); + Dialog dialog = new Dialog(frame, "Dialog", true); + TextField tf0 = new TextField(); + TextField tf1 = new TextField(); + Button button = new Button("Button"); + + public static void main(String[] args) { + ConsumeNextKeyTypedOnModalShowTest app = new ConsumeNextKeyTypedOnModalShowTest(); + app.init(); + app.start(); + } + + public void init() { + robot = Util.createRobot(); + + tf0.setPreferredSize(new Dimension(50, 30)); + tf1.setPreferredSize(new Dimension(50, 30)); + frame.setLayout(new FlowLayout()); + frame.add(tf0); + frame.add(tf1); + frame.pack(); + + dialog.add(button); + dialog.pack(); + + Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { + public void eventDispatched(AWTEvent e) { + if (e.getID() == KeyEvent.KEY_PRESSED && e.getSource() == tf0) { + dialog.setVisible(true); + } + } + }, KeyEvent.KEY_EVENT_MASK); + } + + public void start() { + frame.setVisible(true); + Util.waitTillShown(frame); + + // Show the dialog. + robot.keyPress(KeyEvent.VK_TAB); + robot.delay(50); + robot.keyRelease(KeyEvent.VK_TAB); + + Util.waitForIdle(robot); + + // Dispose the dialog. + Runnable action = new Runnable() { + public void run() { + dialog.dispose(); + } + }; + if (!Util.trackFocusGained(tf1, action, 2000, false)) { + throw new RuntimeException("Test failed: TAB was processed incorrectly!"); + } + + // Check for type-ability. + robot.keyPress(KeyEvent.VK_A); + robot.delay(50); + robot.keyRelease(KeyEvent.VK_A); + + Util.waitForIdle(robot); + + if (tf1.getText().equals("")) { + throw new RuntimeException("Test failed: couldn't type a char!"); + } + System.out.println("Test passed."); + } +} -- GitLab