src/macosx/classes/sun/lwawt/LWWindowPeer.java
Print this page
*** 79,91 ****
private volatile int windowState = Frame.NORMAL;
// check that the mouse is over the window
private volatile boolean isMouseOver = false;
// 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;
// A peer where the last mouse event came to. Used to generate
// MOUSE_ENTERED/EXITED notifications
private volatile LWComponentPeer lastMouseEventPeer;
--- 79,92 ----
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 LWComponentPeer lastCommonMouseEventPeer = null;
// A peer where the last mouse event came to. Used to generate
// MOUSE_ENTERED/EXITED notifications
private volatile LWComponentPeer lastMouseEventPeer;
*** 708,720 ****
}
// 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;
! }
lastMouseEventPeer = null;
}
} else if(id == MouseEvent.MOUSE_ENTERED) {
isMouseOver = true;
if (targetPeer != null) {
--- 709,719 ----
}
// 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
! cleanLastCommonMouseEventPeer(this);
lastMouseEventPeer = null;
}
} else if(id == MouseEvent.MOUSE_ENTERED) {
isMouseOver = true;
if (targetPeer != null) {
*** 722,732 ****
Point lp = targetPeer.windowToLocal(x, y, this);
Component target = targetPeer.getTarget();
postMouseEnteredEvent(target, when, modifiers, lp,
screenX, screenY, clickCount, popupTrigger, button);
}
! lastCommonMouseEventPeer = targetPeer;
lastMouseEventPeer = targetPeer;
}
} else {
PlatformWindow topmostPlatforWindow =
platformWindow.getTopmostPlatformWindowUnderMouse();
--- 721,731 ----
Point lp = targetPeer.windowToLocal(x, y, this);
Component target = targetPeer.getTarget();
postMouseEnteredEvent(target, when, modifiers, lp,
screenX, screenY, clickCount, popupTrigger, button);
}
! setLastCommonMouseEventPeer(targetPeer);
lastMouseEventPeer = targetPeer;
}
} else {
PlatformWindow topmostPlatforWindow =
platformWindow.getTopmostPlatformWindowUnderMouse();
*** 851,861 ****
Point oldp = lastMouseEventPeer.windowToLocal(x, y, this);
Component target = lastMouseEventPeer.getTarget();
postMouseExitedEvent(target, when, modifiers, oldp, screenX, screenY,
clickCount, popupTrigger, button);
}
! lastCommonMouseEventPeer = targetPeer;
lastMouseEventPeer = targetPeer;
// Generate Mouse Enter for components
if (targetPeer != null && targetPeer.isEnabled()) {
Point newp = targetPeer.windowToLocal(x, y, this);
--- 850,860 ----
Point oldp = lastMouseEventPeer.windowToLocal(x, y, this);
Component target = lastMouseEventPeer.getTarget();
postMouseExitedEvent(target, when, modifiers, oldp, screenX, screenY,
clickCount, popupTrigger, button);
}
! setLastCommonMouseEventPeer(targetPeer);
lastMouseEventPeer = targetPeer;
// Generate Mouse Enter for components
if (targetPeer != null && targetPeer.isEnabled()) {
Point newp = targetPeer.windowToLocal(x, y, this);
*** 1109,1124 ****
--- 1108,1143 ----
}
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.
*/