<AWT Dev> [9] Review request for 8080729: [macosx] java 7 and 8 JDialogs on multiscreen jump to parent frame on focus

Anton Tarasov anton.tarasov at jetbrains.com
Wed Apr 27 10:46:16 UTC 2016

Hi Dmitry,

The fix looks fine to me, still I have some concern...

Say, we have windows with the following relationship: A<-B<-C (owner<-child). Then the ordering is executed for A:

- We’ve got a sequence: A, B, C.
- A is skipped, B is ordered above A, C is ordered above A

Am I right that C will be ordered above B (as it should be) eventually?

Is that possible that we get a sequence: A, C, B? And then B will be ordered above C which is incorrect?


> On 25 Apr 2016, at 22:35, dmitry markov <dmitry.markov at oracle.com> wrote:
> Any volunteers to review the fix?
> Thanks in advance,
> Dmitry
> On 21/04/2016 10:21, dmitry markov wrote:
>> Hello,
>> Could you review the fix for jdk9, please?
>>    bug: https://bugs.openjdk.java.net/browse/JDK-8080729
>>    webrev: http://cr.openjdk.java.net/~dmarkov/8080729/webrev.00/
>> Problem description:
>> On OS X platform in dual monitor setup a child window jumps to another monitor where a parent/owner is displayed.
>> In CPlatformWindow and CWarningWindow classes we use CWrapper.NSWindow.addChildWindow() and CWrapper.NSWindow.removeChildWindow() during parent-child relationship processing (see setVisible() and orderAboveSiblings() for details). The methods addChildWindow() and removeChildWindow() invoke corresponding Cocoa API (see NSWindow in Cocoa framework). According to Cocoa documentation:
>> "After a window is added as a child of parent window, it is maintained in relative position indicated by ordering mode for subsequent ordering operations involving either window. While this attachment is active, moving child window will not cause parent window to move, but moving the parent window will cause child window to move."
>> So negative visual effects such as jumping to another monitor in multi-monitor case, etc. are caused by usage of addChildWindow() and removeChildWindow().
>> Fix:
>> Replace CWrapper.NSWindow.addChildWindow() and CWrapper.NSWindow.removeChildWindow() calls with CWrapper.NSWindow.orderWindow() in CPlatformWindow and CWarningWindow classes.
>> Add several new methods to AWTWindow.m:
>> - iconifyChilds() is responsible for hiding or showing child windows when parent/owner window is miniaturized or de-miniaturized.
>> - orderChilds() is responsible for child windows ordering. Order operation is based on the current focus state of owner window, (e.g. if owner window is focused, all its child should be ordered above it).
>> - isJavaPlatformWindowVisible() checks visibility of native window from Java layer perspective.
>> Thanks,
>> Dmitry

More information about the awt-dev mailing list