/* * Copyright (c) 2017, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test * @bug 8177414 * @summary KEY_PRESSED and KEY_TYPED events are not generated if a key's held * @library ../../regtesthelpers * @build Util * @run main/manual InputMethodKeyEventsTest */ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.concurrent.atomic.AtomicBoolean; import test.java.awt.regtesthelpers.Util; public class InputMethodKeyEventsTest { private static final AtomicBoolean testCompleted = new AtomicBoolean(false); private static volatile boolean testResult = false; private static Dialog controlDialog; private static Frame testFrame; private static final String instructions = "Verify that KEY_PRESSED and KEY_TYPED events are generated after a key's " + "\npressed and held.\n" + "\nThis test is for OS X only. For other platforms please simply press \"Pass\".\n" + "\n1. Go to \"System Preferences -> Keyboard -> Input Sources\" and add \"British\" IM." + "\n2. Set current IM to \"British\"." + "\n3. Set focus to the frame located at north-west corner." + "\n4. Pres and hold the \"i\" key for 3 seconds." + "\n5. Press and release the \"i\" key again. Use log area to ensure that " + "\n KEY_TYPED and KEY_PRESSED events are still generated." + "\nIf KEY_PRESSED, KEY_TYPED and KEY_RELEASED are generated for every key press then " + "\npress \"Pass\", otherwise press \"Fail\"."; public static void main(String[] args) { try { Robot robot = Util.createRobot(); createAndShowGUI(); Util.waitForIdle(robot); Util.waitForCondition(testCompleted); if (!testResult) { throw new RuntimeException("Test FAILED!"); } } finally { if (controlDialog != null) { controlDialog.dispose(); } if (testFrame != null) { testFrame.dispose(); } } } private static void createAndShowGUI() { controlDialog = new Dialog((Frame)null, "InputMethodKeyEventsTest"); TextArea messageArea = new TextArea(instructions, 15, 80, TextArea.SCROLLBARS_BOTH); controlDialog.add("North", messageArea); TextArea logArea = new TextArea("Test's logs are displayed here\n", 15, 80, TextArea.SCROLLBARS_BOTH); controlDialog.add("Center", logArea); Button passedButton = new Button("Pass"); passedButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { testResult = true; completeTest(); } }); Button failedButton = new Button("Fail"); failedButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { testResult = false; completeTest(); } }); Panel buttonPanel = new Panel(); buttonPanel.add("West",passedButton); buttonPanel.add("East", failedButton); controlDialog.add("South", buttonPanel); controlDialog.setBounds(250, 0, 500, 500); controlDialog.setVisible(true); testFrame = new Frame("InputMethodKeyEventsTest"); testFrame.setSize(200, 200); testFrame.addKeyListener(new KeyListener() { @Override public void keyTyped(KeyEvent e) { logArea.append("KEY_TYPED keyCode = " + e.getKeyCode() + "\n"); } @Override public void keyPressed(KeyEvent e) { logArea.append("KEY_PRESSED keyCode = " + e.getKeyCode() + "\n"); } @Override public void keyReleased(KeyEvent e) { logArea.append("KEY_RELEASED keyCode = " + e.getKeyCode() + "\n"); } }); testFrame.setVisible(true); } private static void completeTest() { testCompleted.set(true); synchronized (testCompleted) { testCompleted.notifyAll(); } } }