<AWT Dev> [9] Review Request: JDK-8032872: [macosx] Cannot select from JComboBox in a JWindow

dmitry markov dmitry.markov at oracle.com
Wed Mar 5 03:09:12 PST 2014


Anton,

I updated the test. New version is located at 
http://cr.openjdk.java.net/~dmarkov/8032872/jdk9/webrev.03/

Thanks,
Dmitry

On 05/03/2014 13:13, Anton V. Tarasov wrote:
> Hi Dmitry,
>
> Actually, I meant to add a _simple_ case to the test, or otherwise it 
> becomes overly complicated. Sorry, if I didn't make that clear.
>
> So, the simple case is to have a hierarchy: frame -> window-1 -> 
> window-2, where window-1 is grabbed. Then you click in window-2 and 
> check if it doesn't cause ungrab event. Right?
>
> Thanks,
> Anton.
>
> On 05.03.2014 12:55, dmitry markov wrote:
>> Hi Anton,
>>
>> I updated java/awt/Window/Grab/GrabTest.java as you requested. Please 
>> find new webrev here: 
>> http://cr.openjdk.java.net/~dmarkov/8032872/jdk9/webrev.02/
>>
>> Thanks,
>> Dmitry
>>
>> On 04/03/2014 19:49, Anton V. Tarasov wrote:
>>> Hi Dmitry,
>>>
>>> The fix looks fine for me, but I'm still voting for adding this case 
>>> to java/awt/Window/Grab/GrabTest.java
>>>
>>> Thanks,
>>> Anton.
>>>
>>> On 04.03.2014 17:26, dmitry markov wrote:
>>>> Hello,
>>>>
>>>> Could you review the updated fix, please?
>>>> webrev: http://cr.openjdk.java.net/~dmarkov/8032872/jdk9/webrev.01/
>>>> - Fixed problem in changeFocusedWindow()
>>>> - Added description for getOwnerFrameDialog()
>>>>
>>>> Thanks,
>>>> Dmitry
>>>>
>>>> On 03/03/2014 20:19, Sergey Bylokhov wrote:
>>>>> On 3/3/14 6:15 PM, Anton V. Tarasov wrote:
>>>>>> Hi all,
>>>>>>
>>>>>> The fix looks fine for me. The usage of getOwnerFrameDialog() in 
>>>>>> the mentioned cases indeed seems incorrect. I've looked at the 
>>>>>> rest of the code and found yet another incorrect usage, in 
>>>>>> LWWindowPeer.changeFocusedWindow line 1265. Please, fix it the 
>>>>>> same way. All the other use cases of the method should be fine as 
>>>>>> they relate to an activation (a simple window can't be an active 
>>>>>> window).
>>>>> Then it would be good to add appropriate javadoc to 
>>>>> getOwnerFrameDialog to mention that it returns owner which can be 
>>>>> activated(Frame or D
>>>>> ialog and not a WIndow).
>>>>>>
>>>>>> Also, I'd recommend to add a new testcase to 
>>>>>> java/awt/Window/Grab/GrabTest.java
>>>>>>
>>>>>> Thanks,
>>>>>> Anton.
>>>>>>
>>>>>> On 03.03.2014 16:49, Sergey Bylokhov wrote:
>>>>>>> On 3/3/14 2:22 PM, dmitry markov wrote:
>>>>>>>> If I get it right, getOwnerFrameDialog() is designed for 
>>>>>>>> another purpose. Also it is NOT only used in notifyMouseEvent() 
>>>>>>>> and notifyNCMouseDown().
>>>>>>> Probably other places don't work also? I see that these usages 
>>>>>>> are related to the focus staff. Anton do you know why 
>>>>>>> LWWindowPeer.getOwnerFrameDialog() checks Frame and Dialog only?
>>>>>>>> So I think we should stay this method as is to avoid any 
>>>>>>>> problems in future.
>>>>>>>>
>>>>>>>> It is really necessary to add new method isOneOfOwnersOf(). BTW 
>>>>>>>> this approach is already used on Windows platform, see 
>>>>>>>> awt_Window.cpp for details.
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Dmitry
>>>>>>>>
>>>>>>>> On 03/03/2014 13:54, Petr Pchelko wrote:
>>>>>>>>> Hello, Dmitry.
>>>>>>>>>
>>>>>>>>> I've investigated a similar issue a while ago 
>>>>>>>>> (https://bugs.openjdk.java.net/browse/JDK-8029686), could you 
>>>>>>>>> please check if this issue is also resolved by your fix?
>>>>>>>>>
>>>>>>>>>> In other words the current implementation assumes that the 
>>>>>>>>>> grabbingWindow must be an instance of Frame or Dialog and 
>>>>>>>>>> does not handle the case when the grabbingWindow is JWindow.
>>>>>>>>> When I was investigating this I did not understand why that 
>>>>>>>>> was done that way. Do you know the reason?
>>>>>>>>> May be it's better not in introduce a new function but replace 
>>>>>>>>> the getOwnerFrameDialog with your new implementation?
>>>>>>>>>
>>>>>>>>> Thank you.
>>>>>>>>> With best regards. Petr.
>>>>>>>>>
>>>>>>>>> On 03.03.2014, at 13:45, dmitry markov 
>>>>>>>>> <dmitry.markov at oracle.com> wrote:
>>>>>>>>>
>>>>>>>>>> Hi Sergey,
>>>>>>>>>>
>>>>>>>>>> The current implementation of 
>>>>>>>>>> LWWindowPeer.getOwnerFrameDialog() may return an instance of 
>>>>>>>>>> Frame or Dialog. The returned value used to check whether the 
>>>>>>>>>> grabbingWindow is owner of mouse event target or not.
>>>>>>>>>>
>>>>>>>>>> If JComboBox is added to JFrame, the grabbingWindow is JFrame 
>>>>>>>>>> and getOwnerFrameDialog() returns the same JFrame object, 
>>>>>>>>>> (i.e. the check passes).
>>>>>>>>>> If JCombobox is added to JWindow which is owned by JFrame, 
>>>>>>>>>> the grabbingWindow is JWindow but getOwnerFrameDialog() 
>>>>>>>>>> returns the JFrame, (i.e. the check fails).
>>>>>>>>>>
>>>>>>>>>> In other words the current implementation assumes that the 
>>>>>>>>>> grabbingWindow must be an instance of Frame or Dialog and 
>>>>>>>>>> does not handle the case when the grabbingWindow is JWindow.
>>>>>>>>>>
>>>>>>>>>> Thanks,
>>>>>>>>>> Dmitry
>>>>>>>>>>
>>>>>>>>>> On 03/03/2014 13:01, Sergey Bylokhov wrote:
>>>>>>>>>>> Hi, Dmitry.
>>>>>>>>>>> Why the problem is reproduced in JWindow? Why it works in 
>>>>>>>>>>> JFrame?
>>>>>>>>>>>
>>>>>>>>>>> On 3/3/14 10:40 AM, dmitry markov wrote:
>>>>>>>>>>>> Hello,
>>>>>>>>>>>>
>>>>>>>>>>>> Could you review the fix for jdk9, please?
>>>>>>>>>>>>
>>>>>>>>>>>> bug: https://bugs.openjdk.java.net/browse/JDK-8032872
>>>>>>>>>>>> webrev: 
>>>>>>>>>>>> http://cr.openjdk.java.net/~dmarkov/8032872/jdk9/webrev.00/
>>>>>>>>>>>>
>>>>>>>>>>>> Problem description: It is impossible to make a selection 
>>>>>>>>>>>> in JComboBox added to JWindow via the mouse. The problem is 
>>>>>>>>>>>> caused by incorrect mouse events handling in LWWindowPeer 
>>>>>>>>>>>> class. When LWWindowPeer receives a mouse event intended 
>>>>>>>>>>>> for a popup window, it checks whether the current 
>>>>>>>>>>>> grabbingWindow is owner of the popup using 
>>>>>>>>>>>> getOwnerFrameDialog() method. This approach always fails 
>>>>>>>>>>>> for the JComboBox added to JWindow. As a result an 
>>>>>>>>>>>> UngrabEvent is send to the popup window.
>>>>>>>>>>>>
>>>>>>>>>>>> Fix: Introduce new private method 
>>>>>>>>>>>> LWWindowPeer.isOneOfOwnersOf(LWWindowPeer peer). The method 
>>>>>>>>>>>> will be invoked on grabbingWindow object to test whether it 
>>>>>>>>>>>> is owner of current mouse event target or not. The usage of 
>>>>>>>>>>>> getOwnerFrameDialog() should be replaced by 
>>>>>>>>>>>> isOneOfOwnersOf() in LWWindowPeer.notifyMouseEvent() and 
>>>>>>>>>>>> LWWindowPeer.NotifyNCMouseDown().
>>>>>>>>>>>>
>>>>>>>>>>>> Thanks,
>>>>>>>>>>>> Dmitry
>>>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>



More information about the awt-dev mailing list