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