From 3ecdf18d0556d484808feb20d66e12e870cdc767 Mon Sep 17 00:00:00 2001 From: alexsch Date: Tue, 30 Apr 2013 13:55:48 +0400 Subject: [PATCH] 8012330: [macosx] Sometimes the applet showing the modal dialog itself loses the ability to gain focus Reviewed-by: serb, ant --- .../sun/lwawt/macosx/CEmbeddedFrame.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java b/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java index 9e0377cdc..a73dbd178 100644 --- a/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java +++ b/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java @@ -38,7 +38,8 @@ import java.awt.event.*; public class CEmbeddedFrame extends EmbeddedFrame { private CPlatformResponder responder; - private boolean focused = true; + private static final Object classLock = new Object(); + private static volatile CEmbeddedFrame focusedWindow; private boolean parentWindowActive = true; public CEmbeddedFrame() { @@ -104,9 +105,16 @@ public class CEmbeddedFrame extends EmbeddedFrame { responder.handleInputEvent(text); } + // handleFocusEvent is called when the applet becames focused/unfocused. + // This method can be called from different threads. public void handleFocusEvent(boolean focused) { - this.focused = focused; - if (focused) { + synchronized (classLock) { + // In some cases an applet may not receive the focus lost event + // from the parent window (see 8012330) + focusedWindow = (focused) ? this + : ((focusedWindow == this) ? null : focusedWindow); + } + if (focusedWindow == this) { // see bug 8010925 // we can't put this to handleWindowFocusEvent because // it won't be invoced if focuse is moved to a html element @@ -119,11 +127,14 @@ public class CEmbeddedFrame extends EmbeddedFrame { } } + // handleWindowFocusEvent is called for all applets, when the browser + // becames active/inactive. This event should be filtered out for + // non-focused applet. This method can be called from different threads. public void handleWindowFocusEvent(boolean parentWindowActive) { this.parentWindowActive = parentWindowActive; // ignore focus "lost" native request as it may mistakenly // deactivate active window (see 8001161) - if (focused && parentWindowActive) { + if (focusedWindow == this && parentWindowActive) { responder.handleWindowFocusEvent(parentWindowActive, null); } } -- GitLab