src/macosx/classes/sun/lwawt/LWWindowPeer.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 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. Oracle designates this
@@ -682,11 +682,11 @@
// MouseDown in non-client area
@Override
public void notifyNCMouseDown() {
// Ungrab except for a click on a Dialog with the grabbing owner
if (grabbingWindow != null &&
- grabbingWindow != getOwnerFrameDialog(this))
+ !grabbingWindow.isOneOfOwnersOf(this))
{
grabbingWindow.ungrab();
}
}
@@ -777,11 +777,11 @@
// for MOUSE_DRAGGED/RELEASED events
if (id == MouseEvent.MOUSE_PRESSED) {
// Ungrab only if this window is not an owned window of the grabbing one.
if (!isGrabbing() && grabbingWindow != null &&
- grabbingWindow != getOwnerFrameDialog(this))
+ !grabbingWindow.isOneOfOwnersOf(this))
{
grabbingWindow.ungrab();
}
if (otherButtonsPressed == 0) {
mouseClickButtons = eventButtonMask;
@@ -1230,10 +1230,21 @@
@Override
public void emulateActivation(boolean activate) {
changeFocusedWindow(activate, null);
}
+ private boolean isOneOfOwnersOf(LWWindowPeer peer) {
+ Window owner = (peer != null ? peer.getTarget().getOwner() : null);
+ while (owner != null) {
+ if ((LWWindowPeer)owner.getPeer() == this) {
+ return true;
+ }
+ owner = owner.getOwner();
+ }
+ return false;
+ }
+
/*
* Changes focused window on java level.
*/
protected void changeFocusedWindow(boolean becomesFocused, Window opposite) {
if (focusLog.isLoggable(PlatformLogger.Level.FINE)) {
@@ -1261,11 +1272,11 @@
// Note, the method is not called:
// - when the opposite (gaining focus) window is an owned/owner window.
// - for a simple window in any case.
if (!becomesFocused &&
- (isGrabbing() || getOwnerFrameDialog(grabbingWindow) == this))
+ (isGrabbing() || this.isOneOfOwnersOf(grabbingWindow)))
{
if (focusLog.isLoggable(PlatformLogger.Level.FINE)) {
focusLog.fine("ungrabbing on " + grabbingWindow);
}
// ungrab a simple window if its owner looses activation.
@@ -1280,10 +1291,15 @@
// TODO: wrap in SequencedEvent
postEvent(windowEvent);
}
+ /*
+ * Retrieves the owner of the peer.
+ * Note: this method returns the owner which can be activated, (i.e. the instance
+ * of Frame or Dialog may be returned).
+ */
static LWWindowPeer getOwnerFrameDialog(LWWindowPeer peer) {
Window owner = (peer != null ? peer.getTarget().getOwner() : null);
while (owner != null && !(owner instanceof Frame || owner instanceof Dialog)) {
owner = owner.getOwner();
}