src/macosx/classes/sun/lwawt/LWWindowPeer.java
Print this page
@@ -79,13 +79,14 @@
private volatile int windowState = Frame.NORMAL;
// check that the mouse is over the window
private volatile boolean isMouseOver = false;
+ private static final Object lastCommonMouseEventPeerLock = new Object();
// A peer where the last mouse event came to. Used by cursor manager to
// find the component under cursor
- private static volatile LWComponentPeer lastCommonMouseEventPeer = null;
+ private static LWComponentPeer lastCommonMouseEventPeer = null;
// A peer where the last mouse event came to. Used to generate
// MOUSE_ENTERED/EXITED notifications
private volatile LWComponentPeer lastMouseEventPeer;
@@ -708,13 +709,11 @@
}
// Sometimes we may get MOUSE_EXITED after lastCommonMouseEventPeer is switched
// to a peer from another window. So we must first check if this peer is
// the same as lastWindowPeer
- if (lastCommonMouseEventPeer != null && lastCommonMouseEventPeer.getWindowPeerOrSelf() == this) {
- lastCommonMouseEventPeer = null;
- }
+ cleanLastCommonMouseEventPeer(this);
lastMouseEventPeer = null;
}
} else if(id == MouseEvent.MOUSE_ENTERED) {
isMouseOver = true;
if (targetPeer != null) {
@@ -722,11 +721,11 @@
Point lp = targetPeer.windowToLocal(x, y, this);
Component target = targetPeer.getTarget();
postMouseEnteredEvent(target, when, modifiers, lp,
screenX, screenY, clickCount, popupTrigger, button);
}
- lastCommonMouseEventPeer = targetPeer;
+ setLastCommonMouseEventPeer(targetPeer);
lastMouseEventPeer = targetPeer;
}
} else {
PlatformWindow topmostPlatforWindow =
platformWindow.getTopmostPlatformWindowUnderMouse();
@@ -851,11 +850,11 @@
Point oldp = lastMouseEventPeer.windowToLocal(x, y, this);
Component target = lastMouseEventPeer.getTarget();
postMouseExitedEvent(target, when, modifiers, oldp, screenX, screenY,
clickCount, popupTrigger, button);
}
- lastCommonMouseEventPeer = targetPeer;
+ setLastCommonMouseEventPeer(targetPeer);
lastMouseEventPeer = targetPeer;
// Generate Mouse Enter for components
if (targetPeer != null && targetPeer.isEnabled()) {
Point newp = targetPeer.windowToLocal(x, y, this);
@@ -1109,16 +1108,36 @@
}
return true;
}
public static LWWindowPeer getWindowUnderCursor() {
+ synchronized (lastCommonMouseEventPeerLock) {
return lastCommonMouseEventPeer != null ? lastCommonMouseEventPeer.getWindowPeerOrSelf() : null;
}
+ }
public static LWComponentPeer<?, ?> getPeerUnderCursor() {
+ synchronized (lastCommonMouseEventPeerLock) {
return lastCommonMouseEventPeer;
}
+ }
+
+ static boolean cleanLastCommonMouseEventPeer(LWWindowPeer previous) {
+ synchronized (lastCommonMouseEventPeerLock) {
+ if (lastCommonMouseEventPeer != null && lastCommonMouseEventPeer.getWindowPeerOrSelf() == previous) {
+ lastCommonMouseEventPeer = null;
+ return true;
+ }
+ return false;
+ }
+ }
+
+ static void setLastCommonMouseEventPeer(LWComponentPeer<?, ?> newValue) {
+ synchronized (lastCommonMouseEventPeerLock) {
+ lastCommonMouseEventPeer = newValue;
+ }
+ }
/*
* Requests platform to set native focus on a frame/dialog.
* In case of a simple window, triggers appropriate java focus change.
*/