> **Problem:**
> 
> On macOS, Robot erroneously produces lowercase letter when mouse is moved 
> (manually) in unison with Robot's keyEvents. This issue was originally logged 
> by a developer of an on-screen accessibility keyboard  - TouchBoard. 
> Originally reported at https://github.com/adoptium/adoptium-support/issues/710
> 
> The issue is reproducible on JDK versions 22 to 11, but works fine on JDK-8. 
> (details below) 
> 
> This issue is not restricted to the Shift modifier key and causes problems 
> with other modifier keys as well and in some scenarios without any external 
> mouse movement.
> 
> - This works correctly on JDK-8 up to JDK-9+129 when Accessibility APIs 
> (AXUIElementCreateSystemWide/ AXUIElementPostKeyboardEvent) were used. Later 
> on it was changed to CGEvents. 
> 
> - With the present code, the issue occurs at 
> [CRobot.m#L295](https://github.com/openjdk/jdk/blob/ac6af6a64099c182e982a0a718bc1b780cef616e/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m#L295.)
>   The flags gets reset or cleared when mouse is moved physically in unison 
> with Robot's key events.
> 
> - The physical mouse movement causes the event flags to be reset. 
> 
> **Impact:**
> 
> Modifier keys don't work as expected when using Robot with any simultaneous 
> physical mouse movement and in case of TouchBoard, this behavior breaks the 
> usability of the on-screen a11y keyboard. There is no known workaround for 
> this particular use case except for reverting to JDK-8. More details on this 
> use case 
> [here.](https://github.com/adoptium/adoptium-support/issues/710#issuecomment-1594103280)
> 
> **Proposed Fix:**
> 
> - In order to avoid resetting of the CGEventFlags here 
> [CRobot.m#L295](https://github.com/openjdk/jdk/blob/ac6af6a64099c182e982a0a718bc1b780cef616e/src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m#L295.),
>  the CGEvent flag state is obtained in `initRobot` (stored in initFlags) 
> which is later used within `CRobot_keyEvent`.
> 
> - The incoming keyCode is used to determine whether it is a modifier key and 
> the corresponding modifierFlagMask is either added or cleared from the 
> initFlags based on whether the modifier key was pressed or released.
> 
> - Finally, only the required and known flag bits from initFlag are copied 
> over to local flag which is used in `CGEventSetFlags()`.
> 
> **Testing:**
> 
> The newly added test - RobotModifierMaskTest.java tests for Shift, Caps, 
> Control, Option and Command keys.
> It should be tested for two cases:
> 
> CASE 1 : Run the test as an automated test WITHOUT any mouse movement and let 
> the Robot go throu...

Harshitha Onkar has updated the pull request incrementally with one additional 
commit since the last revision:

  automated and manual mode test changes

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/14744/files
  - new: https://git.openjdk.org/jdk/pull/14744/files/0ab5b74b..962a6176

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=14744&range=03
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=14744&range=02-03

  Stats: 173 lines in 2 files changed: 81 ins; 47 del; 45 mod
  Patch: https://git.openjdk.org/jdk/pull/14744.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/14744/head:pull/14744

PR: https://git.openjdk.org/jdk/pull/14744

Reply via email to