RFR: 8278938: [Win] Robot can target wrong key for punctuation and symbols [v2]

Jose Pereda jpereda at openjdk.org
Thu Apr 6 11:51:22 UTC 2023


On Wed, 12 Jan 2022 20:45:02 GMT, Martin Fox <duke at openjdk.org> wrote:

>> When processing a `WM_CHAR` event on an OEM key (punctuation, symbol, dead key) the glass code will dynamically query the key's unshifted character to determine the Java code to assign to it. This is necessary since the relationship between OEM key codes and the characters they generate varies from layout to layout.
>> 
>> The Robot implementation was consulting a table which assumed a fixed relationship between Java codes and Windows key codes even for the OEM keys. The table was also missing entries for any Java code not on a US QWERTY layout, like PLUS.
>> 
>> In this PR if we don't find the Java code in the table or if it maps to an OEM key (which may be wrong) we sweep through all the OEM keys looking for the matching Java code.
>
> Martin Fox has updated the pull request incrementally with one additional commit since the last revision:
> 
>   A Robot now correctly handles KeyCodes that aren't in the current layout

PR looks good and works fine on Windows 11. 

I've tested the test attached to the JBS issue with a Spanish keyboard. It fails without the patch for `+`, `'`, `¡`, and passes with it.

There is a NPE if you press AltGr (with or without the patch):

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException: keyCode must not be null
        at java.base/java.util.Objects.requireNonNull(Objects.java:233)
        at javafx.graphics at 21-internal/javafx.scene.robot.Robot.keyPress(Robot.java:92)
        at RobotKeySanityTest.lambda$userReleasedEvent$0(RobotKeySanityTest.java:121)
 ```

I wonder if RobotKeySanityTest could be part of the PR as a manual test? Same as in #694

modules/javafx.graphics/src/main/native-glass/win/KeyTable.cpp line 188:

> 186: }
> 187: 
> 188: static UINT const oemKeys[] = {

update license header copyright

modules/javafx.graphics/src/main/native-glass/win/KeyTable.h line 32:

> 30: void JavaKeyToWindowsKey(jint jkey, UINT &vkey, UINT &modifiers);
> 31: BOOL IsExtendedKey(UINT vkey);
> 32: jint OEMCharToJavaKey(UINT ch, bool deadKey);

update license header copyright

modules/javafx.graphics/src/main/native-glass/win/ViewContainer.cpp line 409:

> 407:             if (unicodeConverted < 0) {
> 408:                 // Dead key
> 409:                 switch (wChar[0]) {

update license header copyright

-------------

PR Review: https://git.openjdk.org/jfx/pull/702#pullrequestreview-1374678712
PR Review Comment: https://git.openjdk.org/jfx/pull/702#discussion_r1159677954
PR Review Comment: https://git.openjdk.org/jfx/pull/702#discussion_r1159678087
PR Review Comment: https://git.openjdk.org/jfx/pull/702#discussion_r1159678139


More information about the openjfx-dev mailing list