Ok, thanks for the explanation. My assumption about putting "main/key” window 
to the floating level was wrong.

Can you please clarify the following as well. Why ordering everything at a 
normal level won’t work? For the example below, B & C will both appear at the 
floating level, though they have owner/child relationship (that is they will be 
ordered at the same level).


> On 28 Apr 2016, at 16:24, 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, 
> (seehttps://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/#//apple_ref/occ/instp/NSWindow/level
>  
> <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

Is it true that reordering B still keeps C above it? If so, then the scheme 
works.

> 
> 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/ 
> <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()

Ok, looks fine to me.

Regards
Anton.

> 
> 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 
>>> <mailto: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/ 
>>> <http://cr.openjdk.java.net/%7Edmarkov/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 
>>>>> <mailto: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 
>>>>>> <https://bugs.openjdk.java.net/browse/JDK-8080729>
>>>>>>    webrev: http://cr.openjdk.java.net/~dmarkov/8080729/webrev.00/ 
>>>>>> <http://cr.openjdk.java.net/%7Edmarkov/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
>>> 
>> 
> 

Reply via email to