提交 58f491ae 编写于 作者: D dcherepanov

7150349: [macosx] Applets attempting to show popup menus activate the applet process

Reviewed-by: ant
上级 da85f117
...@@ -113,6 +113,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -113,6 +113,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
static final int MINIMIZABLE = 1 << 8; static final int MINIMIZABLE = 1 << 8;
static final int RESIZABLE = 1 << 9; // both a style bit and prop bit static final int RESIZABLE = 1 << 9; // both a style bit and prop bit
static final int NONACTIVATING = 1 << 24;
static final int _STYLE_PROP_BITMASK = DECORATED | TEXTURED | UNIFIED | UTILITY | HUD | SHEET | CLOSEABLE | MINIMIZABLE | RESIZABLE; static final int _STYLE_PROP_BITMASK = DECORATED | TEXTURED | UNIFIED | UTILITY | HUD | SHEET | CLOSEABLE | MINIMIZABLE | RESIZABLE;
...@@ -128,9 +129,6 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -128,9 +129,6 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
static final int _METHOD_PROP_BITMASK = RESIZABLE | HAS_SHADOW | ZOOMABLE | ALWAYS_ON_TOP | HIDES_ON_DEACTIVATE | DRAGGABLE_BACKGROUND | DOCUMENT_MODIFIED | FULLSCREENABLE; static final int _METHOD_PROP_BITMASK = RESIZABLE | HAS_SHADOW | ZOOMABLE | ALWAYS_ON_TOP | HIDES_ON_DEACTIVATE | DRAGGABLE_BACKGROUND | DOCUMENT_MODIFIED | FULLSCREENABLE;
// not sure
static final int POPUP = 1 << 14;
// corresponds to callback-based properties // corresponds to callback-based properties
static final int SHOULD_BECOME_KEY = 1 << 12; static final int SHOULD_BECOME_KEY = 1 << 12;
static final int SHOULD_BECOME_MAIN = 1 << 13; static final int SHOULD_BECOME_MAIN = 1 << 13;
...@@ -265,10 +263,6 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -265,10 +263,6 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
// defaults style bits // defaults style bits
int styleBits = DECORATED | HAS_SHADOW | CLOSEABLE | MINIMIZABLE | ZOOMABLE | RESIZABLE; int styleBits = DECORATED | HAS_SHADOW | CLOSEABLE | MINIMIZABLE | ZOOMABLE | RESIZABLE;
if (target.getName() == "###overrideRedirect###") {
styleBits = SET(styleBits, POPUP, true);
}
if (isNativelyFocusableWindow()) { if (isNativelyFocusableWindow()) {
styleBits = SET(styleBits, SHOULD_BECOME_KEY, true); styleBits = SET(styleBits, SHOULD_BECOME_KEY, true);
styleBits = SET(styleBits, SHOULD_BECOME_MAIN, true); styleBits = SET(styleBits, SHOULD_BECOME_MAIN, true);
...@@ -276,6 +270,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -276,6 +270,7 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
final boolean isFrame = (target instanceof Frame); final boolean isFrame = (target instanceof Frame);
final boolean isDialog = (target instanceof Dialog); final boolean isDialog = (target instanceof Dialog);
final boolean isPopup = (target.getType() == Window.Type.POPUP);
if (isDialog) { if (isDialog) {
styleBits = SET(styleBits, MINIMIZABLE, false); styleBits = SET(styleBits, MINIMIZABLE, false);
} }
...@@ -305,8 +300,10 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -305,8 +300,10 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
} }
// If the target is a dialog, popup or tooltip we want it to ignore the brushed metal look. // If the target is a dialog, popup or tooltip we want it to ignore the brushed metal look.
if (!isDialog && IS(styleBits, POPUP)) { if (isPopup) {
styleBits = SET(styleBits, TEXTURED, true); styleBits = SET(styleBits, TEXTURED, true);
// Popups in applets don't activate applet's process
styleBits = SET(styleBits, NONACTIVATING, true);
} }
if (target instanceof javax.swing.RootPaneContainer) { if (target instanceof javax.swing.RootPaneContainer) {
...@@ -499,12 +496,19 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -499,12 +496,19 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
// If it ain't blocked, or is being hidden, go regular way // If it ain't blocked, or is being hidden, go regular way
if (visible) { if (visible) {
CWrapper.NSWindow.makeFirstResponder(nsWindowPtr, contentView.getAWTView()); CWrapper.NSWindow.makeFirstResponder(nsWindowPtr, contentView.getAWTView());
boolean isKeyWindow = CWrapper.NSWindow.isKeyWindow(nsWindowPtr);
if (!isKeyWindow) { boolean isPopup = (target.getType() == Window.Type.POPUP);
CWrapper.NSWindow.makeKeyAndOrderFront(nsWindowPtr); if (isPopup) {
// Popups in applets don't activate applet's process
CWrapper.NSWindow.orderFrontRegardless(nsWindowPtr);
} else { } else {
CWrapper.NSWindow.orderFront(nsWindowPtr); CWrapper.NSWindow.orderFront(nsWindowPtr);
} }
boolean isKeyWindow = CWrapper.NSWindow.isKeyWindow(nsWindowPtr);
if (!isKeyWindow) {
CWrapper.NSWindow.makeKeyWindow(nsWindowPtr);
}
} else { } else {
CWrapper.NSWindow.orderOut(nsWindowPtr); CWrapper.NSWindow.orderOut(nsWindowPtr);
} }
...@@ -765,6 +769,11 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -765,6 +769,11 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
* Callbacks from the AWTWindow and AWTView objc classes. * Callbacks from the AWTWindow and AWTView objc classes.
*************************************************************/ *************************************************************/
private void deliverWindowFocusEvent(boolean gained){ private void deliverWindowFocusEvent(boolean gained){
// Fix for 7150349: ingore "gained" notifications when the app is inactive.
if (gained && !((LWCToolkit)Toolkit.getDefaultToolkit()).isApplicationActive()) {
focusLogger.fine("the app is inactive, so the notification is ignored");
return;
}
peer.notifyActivation(gained); peer.notifyActivation(gained);
} }
......
...@@ -47,6 +47,7 @@ public final class CWrapper { ...@@ -47,6 +47,7 @@ public final class CWrapper {
public static native void setLevel(long window, int level); public static native void setLevel(long window, int level);
public static native void makeKeyAndOrderFront(long window); public static native void makeKeyAndOrderFront(long window);
public static native void makeKeyWindow(long window);
public static native void makeMainWindow(long window); public static native void makeMainWindow(long window);
public static native boolean canBecomeMainWindow(long window); public static native boolean canBecomeMainWindow(long window);
public static native boolean isKeyWindow(long window); public static native boolean isKeyWindow(long window);
......
...@@ -102,11 +102,12 @@ static JNF_CLASS_CACHE(jc_CPlatformWindow, "sun/lwawt/macosx/CPlatformWindow"); ...@@ -102,11 +102,12 @@ static JNF_CLASS_CACHE(jc_CPlatformWindow, "sun/lwawt/macosx/CPlatformWindow");
type |= NSBorderlessWindowMask; type |= NSBorderlessWindowMask;
} }
if (IS(styleBits, TEXTURED)) type |= NSTexturedBackgroundWindowMask; if (IS(styleBits, TEXTURED)) type |= NSTexturedBackgroundWindowMask;
if (IS(styleBits, UNIFIED)) type |= NSUnifiedTitleAndToolbarWindowMask; if (IS(styleBits, UNIFIED)) type |= NSUnifiedTitleAndToolbarWindowMask;
if (IS(styleBits, UTILITY)) type |= NSUtilityWindowMask; if (IS(styleBits, UTILITY)) type |= NSUtilityWindowMask;
if (IS(styleBits, HUD)) type |= NSHUDWindowMask; if (IS(styleBits, HUD)) type |= NSHUDWindowMask;
if (IS(styleBits, SHEET)) type |= NSDocModalWindowMask; if (IS(styleBits, SHEET)) type |= NSDocModalWindowMask;
if (IS(styleBits, NONACTIVATING)) type |= NSNonactivatingPanelMask;
return type; return type;
} }
......
...@@ -74,6 +74,26 @@ JNF_COCOA_ENTER(env); ...@@ -74,6 +74,26 @@ JNF_COCOA_ENTER(env);
JNF_COCOA_EXIT(env); JNF_COCOA_EXIT(env);
} }
/*
* Class: sun_lwawt_macosx_CWrapper$NSWindow
* Method: makeKeyWindow
* Signature: (J)V
*/
JNIEXPORT void JNICALL
Java_sun_lwawt_macosx_CWrapper_00024NSWindow_makeKeyWindow
(JNIEnv *env, jclass cls, jlong windowPtr)
{
JNF_COCOA_ENTER(env);
NSWindow *window = (NSWindow *)jlong_to_ptr(windowPtr);
[JNFRunLoop performOnMainThread:@selector(makeKeyWindow)
on:window
withObject:nil
waitUntilDone:NO];
JNF_COCOA_EXIT(env);
}
/* /*
* Class: sun_lwawt_macosx_CWrapper$NSWindow * Class: sun_lwawt_macosx_CWrapper$NSWindow
* Method: makeMainWindow * Method: makeMainWindow
......
...@@ -401,18 +401,21 @@ JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isCapsLockOn ...@@ -401,18 +401,21 @@ JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isCapsLockOn
JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isApplicationActive JNIEXPORT jboolean JNICALL Java_sun_lwawt_macosx_LWCToolkit_isApplicationActive
(JNIEnv *env, jclass clazz) (JNIEnv *env, jclass clazz)
{ {
__block jboolean active = JNI_FALSE; __block jboolean active = JNI_FALSE;
AWT_ASSERT_NOT_APPKIT_THREAD;
JNF_COCOA_ENTER(env); JNF_COCOA_ENTER(env);
if ([NSThread isMainThread]) {
active = (jboolean)[NSRunningApplication currentApplication].active;
} else {
[JNFRunLoop performOnMainThreadWaiting:YES withBlock:^() { [JNFRunLoop performOnMainThreadWaiting:YES withBlock:^() {
active = (jboolean)[NSRunningApplication currentApplication].active; active = (jboolean)[NSRunningApplication currentApplication].active;
}]; }];
}
JNF_COCOA_EXIT(env); JNF_COCOA_EXIT(env);
return active; return active;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册