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. */