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? Thanks, Anton. > On 25 Apr 2016, at 22:35, dmitry markov <[email protected]> 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 >
