<AWT Dev> [11] Review request for 8199748: Touch keyboard is not shown, if text component gets focus from other text component
Anton Litvinov
anton.litvinov at oracle.com
Wed Apr 18 18:47:15 UTC 2018
Hello Sergey,
Thank you for review of this fix. No, this topic was not earlier
discussed in review process of fixes for other bugs on the touch
keyboard subject. We deliberately do not show the touch keyboard on
"FocusEvent.FOCUS_GAINED" event, because of the following reasons:
1. This is the behavior observable in other native applications like MS
Edge browser, "notepad.exe", "explorer.exe" (File Explorer), Firefox
browser. In this applications the touch keyboard is not shown when the
text component just gets focus, the touch keyboard is shown after an
explicit touch action.
2. Such behavior is implemented by some classes from .NET Framework and
is described on the following web page from Microsoft documentation.
Web page URL:
https://docs.microsoft.com/en-us/windows/uwp/design/input/keyboard-interactions#appendix
This passage from this web page describes such behavior:
"If your app sets focus programmatically to a text input control, the
touch keyboard is not invoked. This eliminates unexpected behaviors not
instigated directly by the user. However, the keyboard does
automatically hide when focus is moved programmatically to a non-text
input control."
3. Showing the touch keyboard on "FocusEvent.FOCUS_GAINED" event may
lead us to the error in the following scenario:
Step 1 - A user touches a text component.
Step 2 - The text component receives focus.
Step 3 - The touch keyboard is shown.
Step 4 - The user manually closes the touch keyboard.
Step 5 - The user touches the text component again.
Step 6 - The touch keyboard is not shown, because the focus did
not leave the text component and no FOCUS_GAINED was received.
Thank you for the suggestion to make "WTookit.compOnxxx" variables as
weak references, what should resolve the possible memory leak. I created
the new version of the fix for this bug, which includes the changes
listed below. Could you please look at the second version of the fix for
this bug.
Webrev (the 2nd version):
http://cr.openjdk.java.net/~alitvinov/8199748/jdk11/webrev.01
The 2nd version of the fix resolves the bug in absolutely different way
in comparison with the 1st version of the fix and has the following changes:
1) The variables "WToolkit.compOnTouchDownEvent",
"WToolkit.compOnMousePressedEvent" were made instances of
"WeakReference<Component>".
2) The variable "NULL_COMPONENT_WR" was introduced to address issue
with thread safety with "compOnTouchDownEvent",
"compOnMousePressedEvent" variables.
3) The big "if" expression, which verifies if the component is valid
for showing the touch keyboard, was moved into a dedicated method
"boolean isComponentValidForTouchKeyboard(Component)".
4) Checks on equality to "null" were removed from the following "if"
expression, because further "instanceof" expressions for both "comp" and
"e" variables will also return "false", if these variables equal "null".
"1103 if ((comp == null) || (e == null)"
5) The bug itself is resolved by just not hiding the touch keyboard on
"FOCUS_LOST", if it is known that the component which gets focus is a
text component. This change of the fix addresses the issue described by
Alexey Ivanov in a parallel e-mail in the review of this fix, where with
the 1st version of the fix the touch keyboard would be hidden, if the
focus was shifted to the second text component by pressing "TAB" on the
touch keyboard.
Thank you,
Anton
On 17/04/2018 00:48, Sergey Bylokhov wrote:
> Hi, Anton.
> Maybe this was discussed before, but can you please clarify why we did
> not show the keyborad on focus_gain?
>
> BTW looks like the WTookit.compOnxxx should be a weak references.
>
> On 16/04/2018 05:03, Anton Litvinov wrote:
>> Hello,
>>
>> Could you please review the following fix for the bug.
>>
>> Bug: https://bugs.openjdk.java.net/browse/JDK-8199748
>> Webrev: http://cr.openjdk.java.net/~alitvinov/8199748/jdk11/webrev.00
>>
>> In the fix for JDK-8166772 it was deliberately implemented that the
>> touch keyboard is shown only on "MouseEvent.MOUSE_RELEASED" event and
>> is hidden on "FocusEvent.FOCUS_LOST" event.
>>
>> The reason of the bug is the fact that, when the touch keyboard is
>> already shown for one text component and a user touches another text
>> component, then the following 2 events occur in the presented order:
>> 1. "MouseEvent.MOUSE_RELEASED" event arrives. The touch keyboard is
>> shown for the new text component.
>> 2. "FocusEvent.FOCUS_LOST" event arrives for the previous text
>> component. The touch keyboard shown for the new text component
>> becomes hidden.
>>
>> The fix allows not to hide the touch keyboard during processing of
>> "FocusEvent.FOCUS_LOST" event, if the touch keyboard has just been
>> shown, as a result of processing of "MouseEvent.MOUSE_RELEASED"
>> event, for the component which gets focus
>> "FocusEvent.getOppositeComponent()".
>>
>> Thank you,
>> Anton
>
>
More information about the awt-dev
mailing list