提交 4591e53c 编写于 作者: A azvegint

8187803: JDK part of JavaFX-Swing dialogs appearing behind main stage

Reviewed-by: ssadetsky, prr
上级 a344bb01
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -34,10 +34,11 @@ import java.awt.dnd.DropTarget; ...@@ -34,10 +34,11 @@ import java.awt.dnd.DropTarget;
import sun.awt.CausedFocusEvent; import sun.awt.CausedFocusEvent;
import sun.awt.LightweightFrame; import sun.awt.LightweightFrame;
import sun.awt.OverrideNativeWindowHandle;
import sun.swing.JLightweightFrame; import sun.swing.JLightweightFrame;
import sun.swing.SwingAccessor; import sun.swing.SwingAccessor;
public class LWLightweightFramePeer extends LWWindowPeer { public class LWLightweightFramePeer extends LWWindowPeer implements OverrideNativeWindowHandle {
public LWLightweightFramePeer(LightweightFrame target, public LWLightweightFramePeer(LightweightFrame target,
PlatformComponent platformComponent, PlatformComponent platformComponent,
...@@ -116,4 +117,16 @@ public class LWLightweightFramePeer extends LWWindowPeer { ...@@ -116,4 +117,16 @@ public class LWLightweightFramePeer extends LWWindowPeer {
public void updateCursorImmediately() { public void updateCursorImmediately() {
SwingAccessor.getJLightweightFrameAccessor().updateCursor((JLightweightFrame)getLwTarget()); SwingAccessor.getJLightweightFrameAccessor().updateCursor((JLightweightFrame)getLwTarget());
} }
// SwingNode
private volatile long overriddenWindowHandle = 0L;
@Override
public void overrideWindowHandle(final long handle) {
this.overriddenWindowHandle = handle;
}
public long getOverriddenWindowHandle() {
return overriddenWindowHandle;
}
} }
...@@ -46,6 +46,7 @@ import sun.awt.AWTAccessor.ComponentAccessor; ...@@ -46,6 +46,7 @@ import sun.awt.AWTAccessor.ComponentAccessor;
import sun.awt.AWTAccessor.WindowAccessor; import sun.awt.AWTAccessor.WindowAccessor;
import sun.java2d.SurfaceData; import sun.java2d.SurfaceData;
import sun.java2d.opengl.CGLSurfaceData; import sun.java2d.opengl.CGLSurfaceData;
import sun.lwawt.LWLightweightFramePeer;
import sun.lwawt.*; import sun.lwawt.*;
import sun.util.logging.PlatformLogger; import sun.util.logging.PlatformLogger;
...@@ -584,6 +585,20 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -584,6 +585,20 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
if (!isKeyWindow) { if (!isKeyWindow) {
CWrapper.NSWindow.makeKeyWindow(ptr); CWrapper.NSWindow.makeKeyWindow(ptr);
} }
if (owner != null
&& owner.getPeer() instanceof LWLightweightFramePeer) {
LWLightweightFramePeer peer =
(LWLightweightFramePeer) owner.getPeer();
long ownerWindowPtr = peer.getOverriddenWindowHandle();
if (ownerWindowPtr != 0) {
//Place window above JavaFX stage
CWrapper.NSWindow.addChildWindow(
ownerWindowPtr, ptr,
CWrapper.NSWindow.NSWindowAbove);
}
}
}); });
} else { } else {
execute(ptr->{ execute(ptr->{
......
/*
* Copyright (c) 2018, 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
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package sun.awt;
/**
* Used for replacing window owner with another non-Swing window.
* It is useful in case of JavaFX-Swing interop:
* it helps to keep Swing dialogs above its owner(JavaFX stage).
*/
public interface OverrideNativeWindowHandle {
/**
* Replaces an owner window with a window with provided handle.
* @param handle native window handle
*/
void overrideWindowHandle(final long handle);
}
/* /*
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -61,8 +61,10 @@ import javax.swing.RepaintManager; ...@@ -61,8 +61,10 @@ import javax.swing.RepaintManager;
import javax.swing.RootPaneContainer; import javax.swing.RootPaneContainer;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import sun.awt.AWTAccessor;
import sun.awt.DisplayChangedListener; import sun.awt.DisplayChangedListener;
import sun.awt.LightweightFrame; import sun.awt.LightweightFrame;
import sun.awt.OverrideNativeWindowHandle;
import sun.security.action.GetPropertyAction; import sun.security.action.GetPropertyAction;
import sun.swing.SwingUtilities2.RepaintListener; import sun.swing.SwingUtilities2.RepaintListener;
...@@ -478,6 +480,17 @@ public final class JLightweightFrame extends LightweightFrame implements RootPan ...@@ -478,6 +480,17 @@ public final class JLightweightFrame extends LightweightFrame implements RootPan
} }
} }
//Called by reflection by SwingNode
public void overrideNativeWindowHandle(long handle, Runnable closeWindow) {
final Object peer = AWTAccessor.getComponentAccessor().getPeer(this);
if (peer instanceof OverrideNativeWindowHandle) {
((OverrideNativeWindowHandle) peer).overrideWindowHandle(handle);
}
if (closeWindow != null) {
closeWindow.run();
}
}
public <T extends DragGestureRecognizer> T createDragGestureRecognizer( public <T extends DragGestureRecognizer> T createDragGestureRecognizer(
Class<T> abstractRecognizerClass, Class<T> abstractRecognizerClass,
DragSource ds, Component c, int srcActions, DragSource ds, Component c, int srcActions,
......
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -29,10 +29,11 @@ import java.awt.Graphics; ...@@ -29,10 +29,11 @@ import java.awt.Graphics;
import java.awt.dnd.DropTarget; import java.awt.dnd.DropTarget;
import sun.awt.LightweightFrame; import sun.awt.LightweightFrame;
import sun.awt.OverrideNativeWindowHandle;
import sun.swing.JLightweightFrame; import sun.swing.JLightweightFrame;
import sun.swing.SwingAccessor; import sun.swing.SwingAccessor;
public class XLightweightFramePeer extends XFramePeer { public class XLightweightFramePeer extends XFramePeer implements OverrideNativeWindowHandle {
XLightweightFramePeer(LightweightFrame target) { XLightweightFramePeer(LightweightFrame target) {
super(target); super(target);
...@@ -80,4 +81,15 @@ public class XLightweightFramePeer extends XFramePeer { ...@@ -80,4 +81,15 @@ public class XLightweightFramePeer extends XFramePeer {
public void removeDropTarget(DropTarget dt) { public void removeDropTarget(DropTarget dt) {
getLwTarget().removeDropTarget(dt); getLwTarget().removeDropTarget(dt);
} }
private volatile long overriddenWindowHandle = 0L;
@Override
public void overrideWindowHandle(final long handle) {
overriddenWindowHandle = handle;
}
public long getOverriddenWindowHandle() {
return overriddenWindowHandle;
}
} }
...@@ -1648,6 +1648,16 @@ class XWindowPeer extends XPanelPeer implements WindowPeer, ...@@ -1648,6 +1648,16 @@ class XWindowPeer extends XPanelPeer implements WindowPeer,
while (!XlibUtil.isToplevelWindow(tpw) && !XlibUtil.isXAWTToplevelWindow(tpw)) { while (!XlibUtil.isToplevelWindow(tpw) && !XlibUtil.isXAWTToplevelWindow(tpw)) {
tpw = XlibUtil.getParentWindow(tpw); tpw = XlibUtil.getParentWindow(tpw);
} }
XBaseWindow parent = transientForWindow;
if (parent instanceof XLightweightFramePeer) {
XLightweightFramePeer peer = (XLightweightFramePeer) parent;
long ownerWindowPtr = peer.getOverriddenWindowHandle();
if (ownerWindowPtr != 0) {
tpw = ownerWindowPtr;
}
}
XlibWrapper.XSetTransientFor(XToolkit.getDisplay(), bpw, tpw); XlibWrapper.XSetTransientFor(XToolkit.getDisplay(), bpw, tpw);
window.curRealTransientFor = transientForWindow; window.curRealTransientFor = transientForWindow;
} }
......
/* /*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -32,10 +32,11 @@ import java.awt.event.ComponentEvent; ...@@ -32,10 +32,11 @@ import java.awt.event.ComponentEvent;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
import sun.awt.LightweightFrame; import sun.awt.LightweightFrame;
import sun.awt.OverrideNativeWindowHandle;
import sun.swing.JLightweightFrame; import sun.swing.JLightweightFrame;
import sun.swing.SwingAccessor; import sun.swing.SwingAccessor;
public class WLightweightFramePeer extends WFramePeer { public class WLightweightFramePeer extends WFramePeer implements OverrideNativeWindowHandle {
public WLightweightFramePeer(LightweightFrame target) { public WLightweightFramePeer(LightweightFrame target) {
super(target); super(target);
...@@ -50,6 +51,13 @@ public class WLightweightFramePeer extends WFramePeer { ...@@ -50,6 +51,13 @@ public class WLightweightFramePeer extends WFramePeer {
return getLwTarget().getGraphics(); return getLwTarget().getGraphics();
} }
private native void overrideNativeHandle(long hwnd);
@Override
public void overrideWindowHandle(final long handle) {
overrideNativeHandle(handle);
}
@Override @Override
public void show() { public void show() {
super.show(); super.show();
......
/* /*
* Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -119,7 +119,8 @@ AwtDialog* AwtDialog::Create(jobject peer, jobject parent) ...@@ -119,7 +119,8 @@ AwtDialog* AwtDialog::Create(jobject peer, jobject parent)
if (parent != NULL) { if (parent != NULL) {
JNI_CHECK_PEER_GOTO(parent, done); JNI_CHECK_PEER_GOTO(parent, done);
awtParent = (AwtWindow *)pData; awtParent = (AwtWindow *)pData;
hwndParent = awtParent->GetHWnd(); HWND oHWnd = awtParent->GetOverriddenHWnd();
hwndParent = oHWnd ? oHWnd : awtParent->GetHWnd();
} else { } else {
// There is no way to prevent a parentless dialog from showing on // There is no way to prevent a parentless dialog from showing on
// the taskbar other than to specify an invisible parent and set // the taskbar other than to specify an invisible parent and set
......
...@@ -169,7 +169,8 @@ AwtFrame* AwtFrame::Create(jobject self, jobject parent) ...@@ -169,7 +169,8 @@ AwtFrame* AwtFrame::Create(jobject self, jobject parent)
JNI_CHECK_PEER_GOTO(parent, done); JNI_CHECK_PEER_GOTO(parent, done);
{ {
AwtFrame* parent = (AwtFrame *)pData; AwtFrame* parent = (AwtFrame *)pData;
hwndParent = parent->GetHWnd(); HWND oHWnd = parent->GetOverriddenHWnd();
hwndParent = oHWnd ? oHWnd : parent->GetHWnd();
} }
} }
......
/* /*
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -148,6 +148,10 @@ struct SetFullScreenExclusiveModeStateStruct { ...@@ -148,6 +148,10 @@ struct SetFullScreenExclusiveModeStateStruct {
jboolean isFSEMState; jboolean isFSEMState;
}; };
struct OverrideHandle {
jobject frame;
HWND handle;
};
/************************************************************************ /************************************************************************
* AwtWindow fields * AwtWindow fields
...@@ -223,6 +227,7 @@ AwtWindow::AwtWindow() { ...@@ -223,6 +227,7 @@ AwtWindow::AwtWindow() {
m_alwaysOnTop = false; m_alwaysOnTop = false;
fullScreenExclusiveModeState = FALSE; fullScreenExclusiveModeState = FALSE;
m_overriddenHwnd = NULL;
} }
AwtWindow::~AwtWindow() AwtWindow::~AwtWindow()
...@@ -2471,6 +2476,24 @@ ret: ...@@ -2471,6 +2476,24 @@ ret:
delete rfs; delete rfs;
} }
void AwtWindow::_OverrideHandle(void *param)
{
JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
OverrideHandle* oh = (OverrideHandle *)param;
jobject self = oh->frame;
AwtWindow *f = NULL;
PDATA pData;
JNI_CHECK_PEER_GOTO(self, ret);
f = (AwtWindow *)pData;
f->OverrideHWnd(oh->handle);
ret:
env->DeleteGlobalRef(self);
delete oh;
}
/* /*
* This is AwtWindow-specific function that is not intended for reusing * This is AwtWindow-specific function that is not intended for reusing
*/ */
...@@ -3108,7 +3131,29 @@ Java_java_awt_Window_initIDs(JNIEnv *env, jclass cls) ...@@ -3108,7 +3131,29 @@ Java_java_awt_Window_initIDs(JNIEnv *env, jclass cls)
CATCH_BAD_ALLOC; CATCH_BAD_ALLOC;
} }
} /* extern "C" */ /*
* Class: sun_awt_windows_WLightweightFramePeer
* Method: overrideNativeHandle
* Signature: (J)V
*/
JNIEXPORT void JNICALL Java_sun_awt_windows_WLightweightFramePeer_overrideNativeHandle
(JNIEnv *env, jobject self, jlong hwnd)
{
TRY;
OverrideHandle *oh = new OverrideHandle;
oh->frame = env->NewGlobalRef(self);
oh->handle = (HWND)hwnd;
AwtToolkit::GetInstance().SyncCall(AwtFrame::_OverrideHandle, oh);
// global ref and oh are deleted in _OverrideHandle()
CATCH_BAD_ALLOC;
}
}/* extern "C" */
/************************************************************************ /************************************************************************
......
/* /*
* Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1996, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -241,6 +241,7 @@ public: ...@@ -241,6 +241,7 @@ public:
static void _UpdateWindow(void* param); static void _UpdateWindow(void* param);
static void _RepositionSecurityWarning(void* param); static void _RepositionSecurityWarning(void* param);
static void _SetFullScreenExclusiveModeState(void* param); static void _SetFullScreenExclusiveModeState(void* param);
static void _OverrideHandle(void *param);
inline static BOOL IsResizing() { inline static BOOL IsResizing() {
return sm_resizing; return sm_resizing;
...@@ -256,6 +257,9 @@ public: ...@@ -256,6 +257,9 @@ public:
static void FocusedWindowChanged(HWND from, HWND to); static void FocusedWindowChanged(HWND from, HWND to);
inline HWND GetOverriddenHWnd() { return m_overriddenHwnd; }
inline void OverrideHWnd(HWND hwnd) { m_overriddenHwnd = hwnd; }
private: private:
static int ms_instanceCounter; static int ms_instanceCounter;
static HHOOK ms_hCBTFilter; static HHOOK ms_hCBTFilter;
...@@ -307,6 +311,9 @@ private: ...@@ -307,6 +311,9 @@ private:
// The tooltip that appears when hovering the icon // The tooltip that appears when hovering the icon
HWND securityTooltipWindow; HWND securityTooltipWindow;
//Allows substitute parent window with JavaFX stage to make it below a dialog
HWND m_overriddenHwnd;
UINT warningWindowWidth; UINT warningWindowWidth;
UINT warningWindowHeight; UINT warningWindowHeight;
void InitSecurityWarningSize(JNIEnv *env); void InitSecurityWarningSize(JNIEnv *env);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册