Review request for 7124554: [macosx] JWindow does ignore setAlwaysOnTop property
steve.x.northover at oracle.com
steve.x.northover at oracle.com
Thu Jan 12 14:13:51 PST 2012
We fought this one in SWT and ended up going with the puppy route.
Steve
On 12/01/2012 2:57 PM, Anthony Petrov wrote:
> Hi Mike,
>
> I recall we've discussed this issue with you back in 2010.
> Unfortunately, I wasn't able to implement anything like this that
> would work reliably back then (and I tried hard, really), that's why
> we ended up with -addChildWindow:. Note that JCK is very happy with
> this implementation, and so are we, I presume. As long as child
> windows receive their respective MOVE events, it seems that everything
> is all right. Besides, such behavior is very Mac-friendly, making Java
> apps behave like native apps.
>
> I realize that for some developers this behavior may be inconvenient.
> But then again, why not listen to MOVE events on the parent frame and
> compensate for its movement repositioning all its children? ( :) yeah,
> yeah, I know, sounds weird, but... as Steve says, you gotta do what
> you gotta do... I mean, there's a workaround at least!)
>
> So, if you or anyone else wish to contribute an alternative
> implementation for owned windows, that would be greatly appreciated.
> Otherwise I'm afraid we have to stick with using -addChildWindow: for
> now since we simply don't have a better solution.
>
> --
> best regards,
> Anthony
>
> On 1/12/2012 11:17 PM, Mike Swingler wrote:
>> Also, you should not use -addChildWindow:, because you also get added
>> to the movement group of the parent (moving the parent moves all it's
>> children). This is *highly* undesirable behavior for Java's general
>> use (and you can see it in Eclipse when the find window follows
>> around the IDE window like a puppy).
>>
>> In the Java SE 6 AWT we manually restack every Java window in native
>> with -orderFront: every time a Java window changes it's level to
>> correctly handle it's children and the relationships between them.
>> This actually works out ok, since all the changes happen at once, and
>> when the next turn of the event loop happens, the new stacking order
>> only has one new window moving to the background and one new window
>> becoming key/main.
>>
>> Regards,
>> Mike Swingler
>> Apple Inc.
>> On Jan 12, 2012, at 6:34 AM, Leonid Romanov wrote:
>>
>>> Bah, I was wrong. The value of NS*WindowLevel is really funky, it
>>> was a wrong suggestion to rely on it. Sorry for wasting your time.
>>>
>>>
>>> On 12.01.2012, at 17:52, Anthony Petrov wrote:
>>>
>>>> The values of the NS*WindowLevel macros are not a part of the
>>>> contract for Cocoa API. Therefore, we shouldn't rely on their
>>>> current numerical values. The names, however, and their relative
>>>> z-order are clearly specified in the documentation, and as such we
>>>> may use them.
>>>>
>>>> --
>>>> best regards,
>>>> Anthony
>>>>
>>>> On 01/12/12 17:44, Leonid Romanov wrote:
>>>>> I see… It looks like the higher window level is, the higher is the
>>>>> value of corresponding NS*WindowLevel macro.
>>>>> Wouldn't it be better to implement compareWindowLevels() by simply
>>>>> subtracting one value from another?
>>>>>
>>>>> On 12.01.2012, at 17:06, Anthony Petrov wrote:
>>>>>
>>>>>> Hi Leonid,
>>>>>>
>>>>>> Thanks for taking a look at the fix.
>>>>>>
>>>>>> The if check is needed for the following case. If the parent
>>>>>> window is an always-on-top window, its level is
>>>>>> NSFloatingWindowLevel. Suppose a child window being added to it
>>>>>> hasn't been assigned any level explicitly, so its default level
>>>>>> is NSNormalWindowLevel.
>>>>>>
>>>>>> Now, when we call -addChildWindow:, we really want to update the
>>>>>> level of the child window so that both the parent and the child
>>>>>> share the same window level. The if check ensures that we don't
>>>>>> reset the level of the child window back to normal in this case.
>>>>>>
>>>>>> --
>>>>>> best regards,
>>>>>> Anthony
>>>>>>
>>>>>> On 01/11/12 21:48, Leonid Romanov wrote:
>>>>>>> Just wondering: what would happen if you simply set
>>>>>>> oldChildlevel without that "if" check?
>>>>>>>
>>>>>>> On 11.01.2012, at 19:22, Anthony Petrov wrote:
>>>>>>>
>>>>>>>> Hello,
>>>>>>>>
>>>>>>>> Please review a fix for
>>>>>>>> http://bugs.sun.com/view_bug.do?bug_id=7124554 at:
>>>>>>>>
>>>>>>>> http://cr.openjdk.java.net/~anthony/x-6-alwaysOnTop.0/
>>>>>>>>
>>>>>>>> Lubomir Nerad (CC'ed) should be credited for the fix itself.
>>>>>>>> I'm just going to integrate it into the repository.
>>>>>>>>
>>>>>>>> A JWindow object is always a child window with either an
>>>>>>>> explicit parent, or a shared invisible owner frame. Therefore,
>>>>>>>> we always call NSWindow -addChildWindow: when showing a JWindow
>>>>>>>> object. The root cause of the issue is that the
>>>>>>>> -addChildWindow: resets the level of the child window to match
>>>>>>>> that of the parent window. With this fix we restore the level
>>>>>>>> back to its original value after the -addChildWindow: call, and
>>>>>>>> as such preserve the always-on-top state of the child window.
>>>>>>>>
>>>>>>>> I've verified the fix with a test app attached to the original
>>>>>>>> issue at http://java.net/jira/browse/MACOSX_PORT-158 , and it
>>>>>>>> works fine.
>>>>>>>>
>>>>>>>> --
>>>>>>>> best regards,
>>>>>>>> Anthony
>>
More information about the macosx-port-dev
mailing list