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

Reply via email to