src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java
Print this page
@@ -37,10 +37,11 @@
public class CEmbeddedFrame extends EmbeddedFrame {
private CPlatformResponder responder;
private static final Object classLock = new Object();
private static volatile CEmbeddedFrame focusedWindow;
+ private CEmbeddedFrame previousFocusedWindow;
private boolean parentWindowActive = true;
public CEmbeddedFrame() {
show();
}
@@ -143,10 +144,29 @@
// handleWindowFocusEvent is called for all applets, when the browser
// becomes 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;
+ // If several applets are running in different browser's windows, it is necessary to
+ // detect the switching between the parent windows and update focusedWindow accordingly.
+ synchronized (classLock) {
+ if (!parentWindowActive) {
+ this.previousFocusedWindow = focusedWindow;
+ }
+ if (parentWindowActive && focusedWindow != this &&
+ (focusedWindow == null || (focusedWindow != null && !focusedWindow.isParentWindowActive()))) {
+ // It looks like we have switched to another browser window, let's restore focus to
+ // the previously focused applet in this window.
+ if (this.previousFocusedWindow != null) {
+ focusedWindow = this.previousFocusedWindow;
+ } else {
+ // No applets were focused in this window, so set focus to the first
+ // applet in the window
+ focusedWindow = this;
+ }
+ }
+ }
// ignore focus "lost" native request as it may mistakenly
// deactivate active window (see 8001161)
if (focusedWindow == this && parentWindowActive) {
responder.handleWindowFocusEvent(parentWindowActive, null);
}