<AWT Dev> [11] RFR 8130655: OS X: keyboard input in textfield is not possible if the window contained textfield is owned by EmbeddedFrame

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Sun Aug 5 00:13:50 UTC 2018


Looks fine.

On 30/06/2018 08:12, Dmitry Markov wrote:
> Hi Sergey,
> 
>> On 27 Jun 2018, at 01:15, Sergey Bylokhov <Sergey.Bylokhov at oracle.com 
>> <mailto:Sergey.Bylokhov at oracle.com>> wrote:
>>
>> Hi, Dmitry.
>> Can you please provide some more details why this bug is reproducible 
>> only on mac and not on the other platforms(I meant the bug related to 
>> the popup menu not SHOULD_BECOME_KEY and SHOULD_BECOME_MAIN bits)
>>
> 
> The implementation of EmbeddedFrame on Mac OSX is lightweight and it is 
> heavyweight on Window/Linux. In other words on Windows/Linux an embedded 
> frame is able to receive events from the platform by itself and transfer 
> them to its child windows if any. However it does not work for Mac OSX: 
> CEmbeddedFrame receives events only from the embedder, (e.g. browser) 
> which is not aware of any windows owned by the embedded frame. So on Mac 
> OSX if the embedded frame owns a simple window (which is unfocusable by 
> default) there is no way to provide the simple window with keyboard 
> input. At the same time on other platforms the simple window receives 
> key events in the same scenario.
> 
> The test applet attached to the bug demonstrates the problem, (i.e. 
> simple window owned by embedded frame is unable to receive keyboard 
> input) on Mac and its absence on other platform. Currently I have only 
> this test which works on all platforms without any modifications.
> 
>> I have checked our current behavior on win/lin/mac in all cases the 
>> simple "Window" cannot get a focus, without any difference which 
>> parent is used(null/frame/window).
>>
>> So for example if the window1 is owned by another window2, then both 
>> of them are "unfocusable", but after the current fix, both will be 
>> "focusable" if the window2 will be owned by the embedded frame.
> 
> I agree it was not good idea to make simple window focusable even if it 
> was owned by embedded frame. I think it will be better to allow simple 
> window receive keyboard input if it is owned by embedded frame. In other 
> words simple window will stay unfocusable, (i.e. SHOUL_BECOME_MAIN and 
> SHOULD_BECOME_KEY bits are unset) but it will be able to receive key 
> events when necessary. Please find the implementation of this approach 
> here: http://cr.openjdk.java.net/~dmarkov/8130655/webrev.01/ 
> <http://cr.openjdk.java.net/%7Edmarkov/8130655/webrev.01/>
> 
> Changes:
>   - Added methods CPlatformWindow and AWTWindow to check whether the 
> window is simple and owned by embedded frame
>   - Modified canBecomeKeyWindow() in AWTWindow to take into account 
> window type and owner
> 
> Could you review the new version, please?
> 
> Thanks,
> Dmitry
>>
>> On 25/06/2018 03:35, Dmitry Markov wrote:
>>> Hello,
>>> Could you review a fix for jdk11, please?
>>>  bug: https://bugs.openjdk.java.net/browse/JDK-8130655
>>>  webrev: http://cr.openjdk.java.net/~dmarkov/8130655/webrev.00/ 
>>> <http://cr.openjdk.java.net/%7Edmarkov/8130655/webrev.00/>
>>> Problem description:
>>> On OS X platform a window does not receive keyboard input if it is 
>>> owned by embedded frame. According to the current implementation 
>>> “simple window” (not frame or dialog) is NOT natively focusable, 
>>> (i.e. SHOULD_BECOME_KEY and SHOULD_BECOME_MAIN bits are not set for 
>>> its native peer); embedded frame receives events from the embedder, 
>>> (e.g. browser, etc.) but does not translate them to the its own child 
>>> windows. So if “simple window” is owned by embedded frame it is 
>>> impossible for the window to receive any key events.
>>> Fix:
>>> Set SHOULD_BECOME_KEY and SHOULD_BECOME_MAIN bits for simple window 
>>> which is owned by embedded frame.
>>> Thanks,
>>> Dmitry
>>
>>
>> -- 
>> Best regards, Sergey.
> 


-- 
Best regards, Sergey.


More information about the awt-dev mailing list