--- a/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Mon Mar 19 21:22:18 2012 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/LWToolkit.java Wed Mar 21 14:31:29 2012 +0400
@@ -522,11 +522,6 @@
postEvent(targetToAppContext(event.getSource()), event);
}
- /*
- * Returns true if the application (one of its windows) owns keyboard focus.
- */
- public abstract boolean isApplicationActive();
-
// use peer's back buffer to implement non-opaque windows.
@Override
public boolean needUpdateWindow() {
--- a/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Mon Mar 19 21:22:18 2012 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/LWWindowPeer.java Wed Mar 21 14:31:29 2012 +0400
@@ -1067,11 +1067,7 @@
return false;
}
- // Cross-app activation requests are not allowed.
- if (cause != CausedFocusEvent.Cause.MOUSE_EVENT &&
- !((LWToolkit)Toolkit.getDefaultToolkit()).isApplicationActive())
- {
- focusLog.fine("the app is inactive, so the request is rejected");
+ if (platformWindow.rejectFocusRequest(cause)) {
return false;
}
--- a/jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Mon Mar 19 21:22:18 2012 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/PlatformWindow.java Wed Mar 21 14:31:29 2012 +0400
@@ -27,6 +27,7 @@
import java.awt.*;
+import sun.awt.CausedFocusEvent;
import sun.java2d.SurfaceData;
// TODO Is it worth to generify this interface, like that:
@@ -117,6 +118,8 @@
public void updateFocusableWindowState();
+ public boolean rejectFocusRequest(CausedFocusEvent.Cause cause);
+
public boolean requestWindowFocus();
/*
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java Mon Mar 19 21:22:18 2012 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java Wed Mar 21 14:31:29 2012 +0400
@@ -38,6 +38,8 @@
public class CEmbeddedFrame extends EmbeddedFrame {
private CPlatformResponder responder;
+ private boolean focused = true;
+ private boolean parentWindowActive = true;
public CEmbeddedFrame() {
show();
@@ -94,4 +96,31 @@
public void handleInputEvent(String text) {
new RuntimeException("Not implemented");
}
+
+ public void handleFocusEvent(boolean focused) {
+ this.focused = focused;
+ updateOverlayWindowActiveState();
+ }
+
+ public void handleWindowFocusEvent(boolean parentWindowActive) {
+ this.parentWindowActive = parentWindowActive;
+ updateOverlayWindowActiveState();
+ }
+
+ public boolean isParentWindowActive() {
+ return parentWindowActive;
+ }
+
+ /*
+ * May change appearance of contents of window, and generate a
+ * WINDOW_ACTIVATED event.
+ */
+ private void updateOverlayWindowActiveState() {
+ final boolean showAsFocused = parentWindowActive && focused;
+ dispatchEvent(
+ new FocusEvent(this, showAsFocused ?
+ FocusEvent.FOCUS_GAINED :
+ FocusEvent.FOCUS_LOST));
+ }
+
}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Mon Mar 19 21:22:18 2012 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformEmbeddedFrame.java Wed Mar 21 14:31:29 2012 +0400
@@ -33,17 +33,23 @@
import sun.awt.CGraphicsConfig;
import sun.awt.CGraphicsDevice;
+import sun.awt.CausedFocusEvent;
import java.awt.*;
import java.awt.BufferCapabilities.FlipContents;
+import sun.util.logging.PlatformLogger;
+
/*
* Provides a lightweight implementation of the EmbeddedFrame.
*/
public class CPlatformEmbeddedFrame implements PlatformWindow {
+ private static final PlatformLogger focusLogger = PlatformLogger.getLogger("sun.lwawt.macosx.focus.CPlatformEmbeddedFrame");
+
private CGLLayer windowLayer;
private LWWindowPeer peer;
+ private CEmbeddedFrame target;
private volatile int screenX = 0;
private volatile int screenY = 0;
@@ -52,6 +58,7 @@
public void initialize(Window target, final LWWindowPeer peer, PlatformWindow owner) {
this.peer = peer;
this.windowLayer = new CGLLayer(peer);
+ this.target = (CEmbeddedFrame)target;
}
@Override
@@ -149,6 +156,18 @@
public void updateFocusableWindowState() {}
@Override
+ public boolean rejectFocusRequest(CausedFocusEvent.Cause cause) {
+ // Cross-app activation requests are not allowed.
+ if (cause != CausedFocusEvent.Cause.MOUSE_EVENT &&
+ !target.isParentWindowActive())
+ {
+ focusLogger.fine("the embedder is inactive, so the request is rejected");
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public boolean requestWindowFocus() {
return true;
}
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Mon Mar 19 21:22:18 2012 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Wed Mar 21 14:31:29 2012 +0400
@@ -65,6 +65,7 @@
// Loger to report issues happened during execution but that do not affect functionality
private static final PlatformLogger logger = PlatformLogger.getLogger("sun.lwawt.macosx.CPlatformWindow");
+ private static final PlatformLogger focusLogger = PlatformLogger.getLogger("sun.lwawt.macosx.focus.CPlatformWindow");
// for client properties
public static final String WINDOW_BRUSH_METAL_LOOK = "apple.awt.brushMetalLook";
@@ -600,7 +601,20 @@
}
@Override
+ public boolean rejectFocusRequest(CausedFocusEvent.Cause cause) {
+ // Cross-app activation requests are not allowed.
+ if (cause != CausedFocusEvent.Cause.MOUSE_EVENT &&
+ !((LWCToolkit)Toolkit.getDefaultToolkit()).isApplicationActive())
+ {
+ focusLogger.fine("the app is inactive, so the request is rejected");
+ return true;
+ }
+ return false;
+ }
+
+ @Override
public boolean requestWindowFocus() {
+
long ptr = getNSWindowPtr();
if (CWrapper.NSWindow.canBecomeMainWindow(ptr)) {
CWrapper.NSWindow.makeMainWindow(ptr);
--- a/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Mon Mar 19 21:22:18 2012 +0400
+++ b/jdk/src/macosx/classes/sun/lwawt/macosx/LWCToolkit.java Wed Mar 21 14:31:29 2012 +0400
@@ -686,7 +686,10 @@
return sunAwtDisableCALayers.booleanValue();
}
- @Override
+
+ /*
+ * Returns true if the application (one of its windows) owns keyboard focus.
+ */
public native boolean isApplicationActive();
/************************