b5a48277ab
Reviewed-by: prr
287 lines
9.8 KiB
Java
287 lines
9.8 KiB
Java
/*
|
|
* Copyright (c) 2001, 2023, 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 4353201
|
|
@summary Wrong modifiers on InputEvent
|
|
@key headful
|
|
@run main MouseModsTest
|
|
*/
|
|
|
|
import java.awt.AWTEvent;
|
|
import java.awt.AWTException;
|
|
import java.awt.Canvas;
|
|
import java.awt.Color;
|
|
import java.awt.EventQueue;
|
|
import java.awt.Frame;
|
|
import java.awt.MouseInfo;
|
|
import java.awt.Panel;
|
|
import java.awt.Point;
|
|
import java.awt.Robot;
|
|
import java.awt.event.InputEvent;
|
|
import java.awt.event.KeyEvent;
|
|
import java.awt.event.MouseEvent;
|
|
import java.lang.reflect.InvocationTargetException;
|
|
|
|
public class MouseModsTest {
|
|
static volatile int testCtrl = 0;
|
|
static volatile int testBtn = 0;
|
|
static volatile boolean passed = true;
|
|
|
|
static final int BUTTONS = Math.min(3, MouseInfo.getNumberOfButtons());
|
|
static final int KEYS = 2;
|
|
|
|
static Frame frame;
|
|
static Panel panel;
|
|
static Canvas button1;
|
|
static Canvas button2;
|
|
|
|
static volatile Point pt1;
|
|
static volatile Point pt2;
|
|
|
|
public static void main(String args[]) throws AWTException,
|
|
InterruptedException, InvocationTargetException {
|
|
|
|
EventQueue.invokeAndWait(() -> {
|
|
frame = new Frame("MouseModsTest");
|
|
panel = new Panel();
|
|
button1 = new TestCanvas();
|
|
button2 = new TestCanvas();
|
|
frame.setSize(300, 200);
|
|
panel.add(button1);
|
|
panel.add(button2);
|
|
frame.add(panel);
|
|
frame.setLocationRelativeTo(null);
|
|
frame.setVisible(true);
|
|
});
|
|
|
|
try {
|
|
Robot robot;
|
|
robot = new Robot();
|
|
robot.setAutoWaitForIdle(true);
|
|
robot.setAutoDelay(50);
|
|
robot.delay(1000);
|
|
|
|
EventQueue.invokeAndWait(() -> {
|
|
pt1 = button1.getLocationOnScreen();
|
|
pt2 = button2.getLocationOnScreen();
|
|
|
|
pt1.x += button1.getSize().width / 2;
|
|
pt1.y += button1.getSize().height / 2;
|
|
|
|
pt2.x += button2.getSize().width / 2;
|
|
pt2.y += button2.getSize().height / 2;
|
|
});
|
|
|
|
robot.mouseMove(pt2.x, pt2.y);
|
|
|
|
//Keyboard to Mouse Test
|
|
for (int ctrl = 1; ctrl <= KEYS; ++ctrl) {
|
|
testCtrl = ctrl;
|
|
robot.keyPress(getKeycode(ctrl));
|
|
robot.keyPress(KeyEvent.VK_A);
|
|
robot.keyRelease(KeyEvent.VK_A);
|
|
for (int btn = 2; btn <= BUTTONS; ++btn) {
|
|
testBtn = btn;
|
|
robot.mousePress(getMouseModifier(btn));
|
|
robot.mouseMove(pt1.x, pt1.y);
|
|
robot.mouseMove(pt2.x, pt2.y);
|
|
robot.mouseRelease(getMouseModifier(btn));
|
|
}
|
|
robot.keyRelease(getKeycode(ctrl));
|
|
}
|
|
|
|
//Mouse to Mouse Test
|
|
for (int btn1 = 1; btn1 <= BUTTONS; ++btn1) {
|
|
testBtn = btn1;
|
|
robot.mousePress(getMouseModifier(btn1));
|
|
for (int btn = 1; btn <= BUTTONS; ++btn) {
|
|
if (btn == btn1) continue;
|
|
testBtn = btn;
|
|
robot.mousePress(getMouseModifier(btn));
|
|
robot.mouseMove(pt1.x, pt1.y);
|
|
robot.mouseMove(pt2.x, pt2.y);
|
|
robot.mouseRelease(getMouseModifier(btn));
|
|
}
|
|
testBtn = btn1;
|
|
robot.mouseRelease(getMouseModifier(btn1));
|
|
}
|
|
testBtn = 0;
|
|
} finally {
|
|
EventQueue.invokeAndWait(() -> {
|
|
if (frame != null) {
|
|
frame.dispose();
|
|
}
|
|
});
|
|
}
|
|
|
|
if (!passed) {
|
|
throw new RuntimeException("Test Failed");
|
|
}
|
|
}
|
|
|
|
static int getKeycode(int ctrl) {
|
|
switch (ctrl) {
|
|
case 1: return KeyEvent.VK_SHIFT;
|
|
case 2: return KeyEvent.VK_CONTROL;
|
|
case 3: return KeyEvent.VK_ALT;
|
|
default: return 0;
|
|
}
|
|
}
|
|
|
|
static int getKeyModifier(int ctrl) {
|
|
switch (ctrl) {
|
|
case 1: return InputEvent.SHIFT_MASK;
|
|
case 2: return InputEvent.CTRL_MASK;
|
|
case 3: return InputEvent.ALT_MASK;
|
|
default: return 0;
|
|
}
|
|
}
|
|
|
|
static int getMouseModifier(int btn) {
|
|
switch (btn) {
|
|
case 1: return InputEvent.BUTTON1_MASK;
|
|
case 2: return InputEvent.BUTTON2_MASK;
|
|
case 3: return InputEvent.BUTTON3_MASK;
|
|
default: return 0;
|
|
}
|
|
}
|
|
|
|
static final int allKeyMods =
|
|
InputEvent.SHIFT_MASK
|
|
| InputEvent.CTRL_MASK
|
|
| InputEvent.ALT_MASK;
|
|
|
|
static final int allMouseMods =
|
|
InputEvent.BUTTON1_MASK
|
|
| InputEvent.BUTTON2_MASK
|
|
| InputEvent.BUTTON3_MASK;
|
|
|
|
static void printInputEvent(InputEvent e) {
|
|
System.out.println(e);
|
|
if (e.isAltDown()) {
|
|
System.out.println("Alt is Down");
|
|
}
|
|
if (e.isControlDown()) {
|
|
System.out.println("Ctrl is Down");
|
|
}
|
|
if (e.isShiftDown()) {
|
|
System.out.println("Shift is Down");
|
|
}
|
|
if (e.isMetaDown()) {
|
|
System.out.println("Meta is Down");
|
|
}
|
|
}
|
|
|
|
static class TestCanvas extends Canvas {
|
|
public TestCanvas() {
|
|
setSize(100, 100);
|
|
setBackground(Color.blue);
|
|
enableEvents(AWTEvent.MOUSE_EVENT_MASK
|
|
| AWTEvent.MOUSE_MOTION_EVENT_MASK
|
|
| AWTEvent.KEY_EVENT_MASK);
|
|
}
|
|
|
|
protected void processMouseEvent(MouseEvent e) {
|
|
try {
|
|
if (testBtn == 0) {
|
|
return;
|
|
}
|
|
if (e.getID() == MouseEvent.MOUSE_ENTERED
|
|
|| e.getID() == MouseEvent.MOUSE_EXITED)
|
|
{
|
|
if ((e.getModifiers() & getMouseModifier(testBtn)) != 0) {
|
|
System.out.println("Mouse modifiers on MOUSE_ENTERED, MOUSE_EXITED are set");
|
|
} else {
|
|
printInputEvent(e);
|
|
System.out.println("Cur mods = " + (e.getModifiers() & allMouseMods) + " Wanted = " +
|
|
getMouseModifier(testBtn));
|
|
passed = false;
|
|
throw new RuntimeException("Mouse modifiers on MOUSE_ENTERED, MOUSE_EXITED aren't set");
|
|
}
|
|
}
|
|
if (e.getID() == MouseEvent.MOUSE_PRESSED
|
|
|| e.getID() == MouseEvent.MOUSE_RELEASED)
|
|
{
|
|
if ((e.getModifiers() & getMouseModifier(testBtn)) != 0) {
|
|
System.out.println("Right Mouse modifiers on MOUSE_PRESSED, MOUSE_RELEASED");
|
|
} else {
|
|
printInputEvent(e);
|
|
System.out.println("Cur mods = " + (e.getModifiers() & allMouseMods) + " Wanted = " +
|
|
getMouseModifier(testBtn));
|
|
passed = false;
|
|
throw new RuntimeException("Wrong Mouse modifiers on MOUSE_PRESSED, MOUSE_RELEASED");
|
|
}
|
|
}
|
|
} finally {
|
|
synchronized (frame) {
|
|
frame.notify();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void processMouseMotionEvent(MouseEvent e) {
|
|
try {
|
|
if (testBtn == 0) {
|
|
return;
|
|
}
|
|
if (e.getID() == MouseEvent.MOUSE_DRAGGED) {
|
|
if ((e.getModifiers() & getMouseModifier(testBtn)) != 0) {
|
|
System.out.println("Mouse modifiers on MOUSE_DRAGGED are set");
|
|
} else {
|
|
printInputEvent(e);
|
|
System.out.println("Cur mods = " + (e.getModifiers() & allMouseMods) + " Wanted = " +
|
|
getMouseModifier(testBtn));
|
|
passed = false;
|
|
throw new RuntimeException("Mouse modifiers on MOUSE_DRAGGED aren't set");
|
|
}
|
|
}
|
|
} finally {
|
|
synchronized (frame) {
|
|
frame.notify();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void processKeyEvent(KeyEvent e) {
|
|
try {
|
|
if (e.getKeyCode() != KeyEvent.VK_A) {
|
|
return;
|
|
}
|
|
if ((e.getModifiers() & getKeyModifier(testCtrl)) != 0) {
|
|
System.out.println("Right Key modifiers on KeyEvent");
|
|
} else {
|
|
printInputEvent(e);
|
|
passed = false;
|
|
throw new RuntimeException("Wrong Key modifiers on KeyEvent");
|
|
}
|
|
} finally {
|
|
synchronized (frame) {
|
|
frame.notify();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|