Hi AWT team, I used the next test to reproduce the problem
===== OwnedWindowTest.java ====== public class OwnedWindowTest { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { final JFrame jFrame = new JFrame("Owner frame"); jFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); jFrame.setSize(new Dimension(500,500)); final JDialog jDialog = new JDialog(jFrame, "Owned dialog", false); jDialog.setSize(new Dimension(200,200)); jFrame.setVisible(true); jDialog.setVisible(true); } }); } } ======== End of OwnedWindowTest.java ====== My configuration: Hardware Overview: Model Name: MacBook Pro Model Identifier: MacBookPro10,2 Processor Name: Intel Core i5 Processor Speed: 2,6 GHz Number of Processors: 1 Total Number of Cores: 2 L2 Cache (per Core): 256 KB L3 Cache: 3 MB Memory: 8 GB Boot ROM Version: MBP102.0106.B0A SMC Version (system): 2.6f59 Sudden Motion Sensor: State: Enabled OS El Capitan Version 10.11.4 External Display: Apple Thunderbolt Display 27-inch (2560 x 1440) Intel HD Graphics 4000 1536 MB graphics Thank you, Denis. On Wed, May 4, 2016 at 4:26 PM, Denis Fokin <denis.fo...@gmail.com> wrote: > Hi AWT team, > > thank you for the great effort in resolving the issue. > > I tried the fix (webrev.02) with the latest jdk8u-dev repository. > > I have found the next regressions: > > 1. Run a test case. JFrame + owned JDialog. Move the frame to the > secondary monitor. Move the dialog to the main dialog. Click on the frame > title. Press and hold dialog title. The dialog jumps on the secondary > screen. Release the mouse button. The dialog jumps to the main screen. > > 2. Sometimes, the dialog does not return back to the secondary screen. > > 3. I do not remember exact scenario, but once, the dialog became minified > (folded into title). > > > It looks like the fix require further improvement. > > I personally, do not like all these add/remove machinery. Keeping z-order > model in awt and placing all windows in the NSNormalWindowLevel > level seems the best solution to me. Otherwise, we will get constant > regressions. > > Thank you, > Denis. > > > On Thu, Apr 28, 2016 at 4:24 PM, dmitry markov <dmitry.mar...@oracle.com> > wrote: > >> Anton, >> >> Let me clarify the implementation of orderChilds() function. It is >> responsible for proper windows ordering, (i.e. child windows should be >> always placed/ordered above their parents or owners; a parent/owner window >> should not overlap its children during sizing or moving operations). >> >> Usually all Java windows/frames/dialogs have the normal level. >> >> When a window receives focus, (i.e. becomes 'main/key' window), we will >> look for all its children and move them to the floating level. According to >> Cocoa documentation: floating windows always appear in front of >> normal-level windows, (see >> https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/#//apple_ref/occ/instp/NSWindow/level). >> Also we explicitly order each children above its nearest owner using >> orderWindow() function, see code fragment below: >> >> [window orderWindow:NSWindowAbove relativeTo:[owner.nsWindow windowNumber]]; >> >> When a window loses focus, (i.e. resigns 'main/key' window status), we >> will look for its children and move them back to the normal level. And of >> course we order each child window above its nearest parent using >> orderWindow(). >> >> Please note: orderChilds() function changes window level only for child >> windows of current 'main/key' window, (i.e. focus owner); the window level >> of 'main/key' is not affected. >> >> So for your example: A<-B<-C relationship and A,C,B sequence (assume A >> has just received focus) we will get something following: >> 1. A stays at the normal window level >> 2. C is moved to the floating level and ordered above B >> 3. B is moved to the floating level and ordered above A (actually >> ordering operation does not matter here since A and B are located at >> different levels) >> 4. C and B are displayed in front of A due to different window levels; C >> is appeared above B due to ordering call at step 2 >> >> I agree the comments inside orderChilds() are not clear and may confuse. >> I updated the fix, new version is located at >> http://cr.openjdk.java.net/~dmarkov/8080729/webrev.02/ >> Summary of change: >> - Renamed orderChilds() and iconifyChilds() to orderChildWindows() and >> iconifyChildWindows() accordingly >> - Added some comments to orderChildWindows() >> >> Thanks, >> Dmitry >> >> >> On 28/04/2016 11:40, Anton Tarasov wrote: >> >> Hi Dmitry, >> >> Honestly, I don’t clearly understand how it works now. >> >> With A<-B<-C relationship and A,C,B sequence: >> >> 1. C is ordered above B (we get: A-C-B) >> 2. B is ordered above A (we get: B-A-C) >> >> So, C ordering is lost. Or I'm missing something? >> >> Also, can you please clarify the following. >> >> + if (focus) {+ // Place the child >> above the owner+ [window >> setLevel:NSFloatingWindowLevel];+ } else {+ >> // Place the child to the owner's level+ >> [window setLevel:NSNormalWindowLevel];+ } >> >> Am I right that the reason you place the child to the floating level is >> because the “main/key” window is there? If so, then the comment is somewhat >> confusing. You don’t really put the child above the owner with that call. >> With both the calls you simply put the child to the owner’s level. Is that >> correct? >> >> And also, if you modify the code further, may be you rename “Childs” in >> the new methods to “Children” or to “ChildWindows”? >> >> Thanks, >> Anton. >> >> On 28 Apr 2016, at 10:06, dmitry markov <dmitry.mar...@oracle.com> wrote: >> >> Hi Anton, >> >> Thank you for your feedback. You are right, in some cases B may be >> ordered above C and that is incorrect. I have updated the fix to eliminate >> this. Now we order a window above its nearest parent/owner, (i.e. B is >> ordered above A, C is ordered above B). >> Please find new version here: >> http://cr.openjdk.java.net/~dmarkov/8080729/webrev.01/ >> >> Thanks, >> Dmitry >> On 27/04/2016 13:46, Anton Tarasov wrote: >> >> 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 <dmitry.mar...@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 >> >> >> >> >> >