On Fri, 30 Jun 2023 22:29:05 GMT, Harshitha Onkar <hon...@openjdk.org> wrote:
> **Problem:** > > Robot erroneously produces lowercase letter when mouse is moved (manually) in > unison with Robot's keyEvents on MacOS. 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) > > **Solution:** > > - 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 through al... src/java.desktop/macosx/native/libawt_lwawt/awt/CRobot.m line 69: > 67: static int allModifiersMask = kCGEventFlagMaskShift | > kCGEventFlagMaskControl > 68: | kCGEventFlagMaskAlternate | > kCGEventFlagMaskCommand > 69: | kCGEventFlagMaskAlphaShift; You need to add kCGEventFlagMaskSecondaryFn here otherwise the "secondary fn fix" might catch regression. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/14744#discussion_r1248350915