--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWMouseInfoPeer.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWMouseInfoPeer.java Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -51,8 +51,12 @@
return false;
}
- final Object windowPeer = AWTAccessor.getComponentAccessor().getPeer(w);
- return LWWindowPeer.getWindowUnderCursor() == windowPeer;
+ LWWindowPeer windowPeer = AWTAccessor.getComponentAccessor().getPeer(w);
+ if (windowPeer == null) {
+ return false;
+ }
+
+ return LWToolkit.getLWToolkit().getPlatformWindowUnderMouse() == windowPeer.getPlatformWindow();
}
}
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWToolkit.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWToolkit.java Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -396,6 +396,8 @@
return new LWMouseInfoPeer();
}
+ protected abstract PlatformWindow getPlatformWindowUnderMouse();
+
@Override
public final PrintJob getPrintJob(Frame frame, String doctitle,
Properties props) {
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/LWWindowPeer.java Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -749,11 +749,10 @@
lastMouseEventPeer = targetPeer;
}
} else {
- PlatformWindow topmostPlatforWindow =
- platformWindow.getTopmostPlatformWindowUnderMouse();
+ PlatformWindow topmostPlatformWindow = LWToolkit.getLWToolkit().getPlatformWindowUnderMouse();
LWWindowPeer topmostWindowPeer =
- topmostPlatforWindow != null ? topmostPlatforWindow.getPeer() : null;
+ topmostPlatformWindow != null ? topmostPlatformWindow.getPeer() : null;
// topmostWindowPeer == null condition is added for the backward
// compatibility with applets. It can be removed when the
@@ -764,8 +763,7 @@
screenX, screenY, modifiers, clickCount, popupTrigger,
targetPeer);
} else {
- LWComponentPeer<?, ?> topmostTargetPeer =
- topmostWindowPeer != null ? topmostWindowPeer.findPeerAt(r.x + x, r.y + y) : null;
+ LWComponentPeer<?, ?> topmostTargetPeer = topmostWindowPeer.findPeerAt(r.x + x, r.y + y);
topmostWindowPeer.generateMouseEnterExitEventsForComponents(when, button, x, y,
screenX, screenY, modifiers, clickCount, popupTrigger,
topmostTargetPeer);
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/PlatformWindow.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/PlatformWindow.java Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -107,8 +107,6 @@
public void setAlwaysOnTop(boolean value);
- public PlatformWindow getTopmostPlatformWindowUnderMouse();
-
public void updateFocusableWindowState();
public boolean rejectFocusRequest(CausedFocusEvent.Cause cause);
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -129,11 +129,6 @@
@Override
public void setAlwaysOnTop(boolean value) {}
- // This method should be properly implemented for applets.
- // It returns null just as a stub.
- @Override
- public PlatformWindow getTopmostPlatformWindowUnderMouse() { return null; }
-
@Override
public void updateFocusableWindowState() {}
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformLWWindow.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformLWWindow.java Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2015, 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
@@ -162,11 +162,6 @@
}
@Override
- public PlatformWindow getTopmostPlatformWindowUnderMouse(){
- return null;
- }
-
- @Override
public void setOpacity(float opacity) {
}
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Sat May 09 02:08:15 2015 +0300
@@ -61,9 +61,9 @@
private static native void nativeSetEnabled(long nsWindowPtr, boolean isEnabled);
private static native void nativeSynthesizeMouseEnteredExitedEvents();
private static native void nativeDispose(long nsWindowPtr);
- private static native CPlatformWindow nativeGetTopmostPlatformWindowUnderMouse();
private static native void nativeEnterFullScreenMode(long nsWindowPtr);
private static native void nativeExitFullScreenMode(long nsWindowPtr);
+ static native CPlatformWindow nativeGetTopmostPlatformWindowUnderMouse();
// Loger to report issues happened during execution but that do not affect functionality
private static final PlatformLogger logger = PlatformLogger.getLogger("sun.lwawt.macosx.CPlatformWindow");
@@ -750,10 +750,6 @@
setStyleBits(ALWAYS_ON_TOP, isAlwaysOnTop);
}
- public PlatformWindow getTopmostPlatformWindowUnderMouse(){
- return CPlatformWindow.nativeGetTopmostPlatformWindowUnderMouse();
- }
-
@Override
public void setOpacity(float opacity) {
CWrapper.NSWindow.setAlphaValue(getNSWindowPtr(), opacity);
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CRobot.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CRobot.java Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -78,7 +78,7 @@
@Override
public void mousePress(int buttons) {
mouseButtonsState |= buttons;
-
+ checkMousePos();
mouseEvent(fDevice.getCGDisplayID(), mouseLastX, mouseLastY,
buttons, true, false);
}
@@ -92,11 +92,40 @@
@Override
public void mouseRelease(int buttons) {
mouseButtonsState &= ~buttons;
-
+ checkMousePos();
mouseEvent(fDevice.getCGDisplayID(), mouseLastX, mouseLastY,
buttons, false, false);
}
+ /**
+ * Set unknown mouse location, if needed.
+ */
+ private void checkMousePos() {
+ if (mouseLastX == MOUSE_LOCATION_UNKNOWN ||
+ mouseLastY == MOUSE_LOCATION_UNKNOWN) {
+
+ Rectangle deviceBounds = fDevice.getDefaultConfiguration().getBounds();
+ Point mousePos = CCursorManager.getInstance().getCursorPosition();
+
+ if (mousePos.x < deviceBounds.x) {
+ mousePos.x = deviceBounds.x;
+ }
+ else if (mousePos.x > deviceBounds.x + deviceBounds.width) {
+ mousePos.x = deviceBounds.x + deviceBounds.width;
+ }
+
+ if (mousePos.y < deviceBounds.y) {
+ mousePos.y = deviceBounds.y;
+ }
+ else if (mousePos.y > deviceBounds.y + deviceBounds.height) {
+ mousePos.y = deviceBounds.y + deviceBounds.height;
+ }
+
+ mouseLastX = mousePos.x;
+ mouseLastY = mousePos.y;
+ }
+ }
+
@Override
public native void mouseWheel(int wheelAmt);
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CViewPlatformEmbeddedFrame.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CViewPlatformEmbeddedFrame.java Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015, 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
@@ -144,11 +144,6 @@
}
@Override
- public PlatformWindow getTopmostPlatformWindowUnderMouse() {
- return null;
- }
-
- @Override
public void updateFocusableWindowState() {
}
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Sat May 09 02:08:15 2015 +0300
@@ -929,4 +929,9 @@
!path.endsWith("/") &&
!path.endsWith(".");
}
+
+ @Override
+ protected PlatformWindow getPlatformWindowUnderMouse() {
+ return CPlatformWindow.nativeGetTopmostPlatformWindowUnderMouse();
+ }
}
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/AWTWindow.m Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -1131,15 +1131,16 @@
JNICALL Java_sun_lwawt_macosx_CPlatformWindow_nativeGetTopmostPlatformWindowUnderMouse
(JNIEnv *env, jclass clazz)
{
- jobject topmostWindowUnderMouse = nil;
+ __block jobject topmostWindowUnderMouse = nil;
JNF_COCOA_ENTER(env);
- AWT_ASSERT_APPKIT_THREAD;
- AWTWindow *awtWindow = [AWTWindow getTopmostWindowUnderMouse];
- if (awtWindow != nil) {
- topmostWindowUnderMouse = [awtWindow.javaPlatformWindow jObject];
- }
+ [ThreadUtilities performOnMainThreadWaiting:YES block:^{
+ AWTWindow *awtWindow = [AWTWindow getTopmostWindowUnderMouse];
+ if (awtWindow != nil) {
+ topmostWindowUnderMouse = [awtWindow.javaPlatformWindow jObject];
+ }
+ }];
JNF_COCOA_EXIT(env);
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CCursorManager.m Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CCursorManager.m Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -118,13 +118,11 @@
JNF_COCOA_ENTER(env);
- __block NSPoint pt = NSZeroPoint;
-
- [ThreadUtilities performOnMainThreadWaiting:YES block:^(){
- pt = ConvertNSScreenPoint(env, [NSEvent mouseLocation]);
- }];
-
- jpt = NSToJavaPoint(env, pt);
+ CGEventRef event = CGEventCreate(NULL);
+ CGPoint globalPos = CGEventGetLocation(event);
+ CFRelease(event);
+
+ jpt = NSToJavaPoint(env, globalPos);
JNF_COCOA_EXIT(env);
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m Fri May 08 20:43:46 2015 +0300
+++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m Sat May 09 02:08:15 2015 +0300
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2015, 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
@@ -146,47 +146,10 @@
// This is the native method called when Robot mouse events occur.
// The CRobot tracks the mouse position, and which button was
- // pressed. If the mouse position is unknown it is obtained from
- // CGEvents. The peer also tracks the mouse button desired state,
+ // pressed. The peer also tracks the mouse button desired state,
// the appropriate key modifier state, and whether the mouse action
// is simply a mouse move with no mouse button state changes.
- CGError err = kCGErrorSuccess;
-
- CGRect globalDeviceBounds = CGDisplayBounds(displayID);
-
- // Set unknown mouse location, if needed.
- if ((mouseLastX == sun_lwawt_macosx_CRobot_MOUSE_LOCATION_UNKNOWN) ||
- (mouseLastY == sun_lwawt_macosx_CRobot_MOUSE_LOCATION_UNKNOWN))
- {
- CGEventRef event = CGEventCreate(NULL);
- if (event == NULL) {
- return;
- }
-
- CGPoint globalPos = CGEventGetLocation(event);
- CFRelease(event);
-
- // Normalize the coords within this display device, as
- // per Robot rules.
- if (globalPos.x < CGRectGetMinX(globalDeviceBounds)) {
- globalPos.x = CGRectGetMinX(globalDeviceBounds);
- }
- else if (globalPos.x > CGRectGetMaxX(globalDeviceBounds)) {
- globalPos.x = CGRectGetMaxX(globalDeviceBounds);
- }
-
- if (globalPos.y < CGRectGetMinY(globalDeviceBounds)) {
- globalPos.y = CGRectGetMinY(globalDeviceBounds);
- }
- else if (globalPos.y > CGRectGetMaxY(globalDeviceBounds)) {
- globalPos.y = CGRectGetMaxY(globalDeviceBounds);
- }
-
- mouseLastX = (jint)globalPos.x;
- mouseLastY = (jint)globalPos.y;
- }
-
// volatile, otherwise it warns that it might be clobbered by 'longjmp'
volatile CGPoint point;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/MouseInfo/GetPointerInfoTest.java Sat May 09 02:08:15 2015 +0300
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2014, 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
+ @summary unit test for getPointerInfo() from MouseInfo class
+ @author dav@sparc.spb.su: area=
+ @bug 4009555
+ @run main GetPointerInfoTest
+*/
+
+import java.awt.*;
+
+/**
+ * Simply check the result on non-null and results are correct.
+ */
+public class GetPointerInfoTest {
+ private static final String successStage = "Test stage completed.Passed.";
+
+ public static void main(String[] args) throws Exception {
+ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ GraphicsDevice[] gds = ge.getScreenDevices();
+ int gdslen = gds.length;
+ System.out.println("There are " + gdslen + " Graphics Devices");
+ if (gdslen == 0) {
+ System.out.println("Nothing to be done.");
+ return;
+ }
+ Robot robot = new Robot(gds[0]);
+ robot.setAutoDelay(0);
+ robot.setAutoWaitForIdle(true);
+ robot.delay(10);
+ robot.waitForIdle();
+ Point p = new Point(101, 99);
+ robot.mouseMove(p.x, p.y);
+
+ PointerInfo pi = MouseInfo.getPointerInfo();
+ if (pi == null) {
+ throw new RuntimeException("Test failed. getPointerInfo() returned null value.");
+ } else {
+ System.out.println(successStage);
+ }
+ Point piLocation = pi.getLocation();
+
+ if (piLocation.x != p.x || piLocation.y != p.y) {
+ throw new RuntimeException("Test failed.getPointerInfo() returned incorrect result.");
+ } else {
+ System.out.println(successStage);
+ }
+
+ System.out.println("Test PASSED.");
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/awt/MouseInfo/MultiscreenPointerInfo.java Sat May 09 02:08:15 2015 +0300
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2014, 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
+ @summary unit test for getPointerInfo() from MouseInfo class
+ @author prs@sparc.spb.su: area=
+ @bug 4009555
+ @run main MultiscreenPointerInfo
+*/
+
+import java.awt.*;
+
+/**
+ * Simply check the result on non-null and results are correct.
+ */
+public class MultiscreenPointerInfo
+{
+ private static final String successStage = "Test stage completed.Passed.";
+
+ public static void main(String[] args) throws Exception {
+ GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+ GraphicsDevice[] gds = ge.getScreenDevices();
+ int gdslen = gds.length;
+ System.out.println("There are " + gdslen + " Graphics Devices");
+ if (gdslen < 2) {
+ System.out.println("Nothing to be done. PASSED automatically.");
+ return;
+ }
+ Rectangle rx = gds[1].getDefaultConfiguration().getBounds();
+ Robot robot;
+
+ if (rx.x == 0 && rx.y == 0) {
+ // Assuming independent graphics devices
+ robot = new Robot(gds[1]);
+ } else {
+ // Means we have a virtual device
+ robot = new Robot(gds[0]);
+ }
+ robot.setAutoDelay(0);
+ robot.setAutoWaitForIdle(true);
+ robot.delay(10);
+ robot.waitForIdle();
+ Point p = new Point(rx.x + 101, rx.y + 99);
+ robot.mouseMove(p.x, p.y);
+ PointerInfo pi = MouseInfo.getPointerInfo();
+ if (pi == null) {
+ throw new RuntimeException("Test failed. getPointerInfo() returned null value.");
+ } else {
+ System.out.println(successStage);
+ }
+
+ Point piLocation = pi.getLocation();
+
+ if (piLocation.x != p.x || piLocation.y != p.y) {
+ throw new RuntimeException("Test failed.getPointerInfo() returned incorrect location.");
+ } else {
+ System.out.println(successStage);
+ }
+
+ GraphicsDevice dev = pi.getDevice();
+
+ if (dev != gds[1]) {
+ throw new RuntimeException("Test failed.getPointerInfo() returned incorrect device.");
+ } else {
+ System.out.println(successStage);
+ }
+ System.out.println("Test PASSED.");
+ }
+}