On Fri, 24 Jan 2025 00:25:14 GMT, Alisen Chung <[email protected]> wrote:
>> Currently on macOS when mouseMove is given an offscreen coordinate to move
>> the mouse to, mouseMove will physically clamp to the edge of the screen, but
>> if you try to grab the mouse location immediately after by using
>> MouseInfo.getPointerInfo().getLocation() you will get the value of the
>> offscreen point.
>>
>> Windows and linux do this clamping and coordinate handling for us, but new
>> distributions may not necessarily handle clamping the same way, so Robot
>> should be checking for clamping rather than delegating it to native.
>>
>> This fix updates shared code to cache the screen bounds and adds a check to
>> not exceed the bounds in mouseMove. The caching is done in the Robot
>> constructor, so if the screen bounds changes the constructor must be called
>> again to update to the new bounds.
>
> Alisen Chung has updated the pull request incrementally with one additional
> commit since the last revision:
>
> init finX, finY
Changes requested by aivanov (Reviewer).
src/java.desktop/share/classes/java/awt/Robot.java line 1:
> 1: /*
Revert all the unrelated formatting changes.
src/java.desktop/share/classes/java/awt/Robot.java line 109:
> 107: *
> 108: * @author Robi Khan
> 109: * @since 1.3
Do we have to modify these lines?
src/java.desktop/share/classes/java/awt/Robot.java line 133:
> 131: init(GraphicsEnvironment.getLocalGraphicsEnvironment()
> 132: .getDefaultScreenDevice());
> 133: }
Nothing's changed here… These look as unrelated to the problem that's being
addressed.
src/java.desktop/share/classes/java/awt/Robot.java line 157:
> 155: * GraphicsDevice.
> 156: * @see java.awt.GraphicsEnvironment#isHeadless
> 157: * @see GraphicsDevice
It's exactly the same here: the formatting is changed, yet nothing's touched in
this method.
You should avoid changing or reformatting lines of code which you don't touch…
unless the purpose of a PR is to update formatting and perform some clean-ups.
src/java.desktop/share/classes/java/awt/Robot.java line 175:
> 173: for (int i = 0; i < gs.length; i++) {
> 174: allScreenBounds[i] =
> gs[i].getDefaultConfiguration().getBounds();
> 175: }
This doesn't look right to me… `init` is an instance method, yet it initialises
`allScreenBounds` which is shared among all instances.
In a way it makes sense to share the graphics environment / configuration. On
the other hand how much would it affect the operation of robot if the bounds
are fetched from `GraphicsEnvironment` only when needed?
What happens if the graphics configuration changes? Does the user need to
create a new instance of the `Robot` class?
src/java.desktop/share/classes/java/awt/Robot.java line 234:
> 232: for (Rectangle screenBounds : allScreenBounds) {
> 233: int closestX = Math.min(Math.max(x, screenBounds.x),
> screenBounds.x + screenBounds.width);
> 234: int closestY = Math.min(Math.max(y, screenBounds.y),
> screenBounds.y + screenBounds.height);
Shouldn't the width and height have `- 1`? I mean if the screen resolution is
1920×1080, the highest valid coordinates are 1919 and 1079 for <var>x</var> and
<var>y</var> correspondingly.
src/java.desktop/share/classes/java/awt/Robot.java line 253:
> 251: leastXDiff = currXDiff;
> 252: leastYDiff = currYDiff;
> 253: }
Both branches must be executed at the same time — you have adjust both
<var>x</var> and <var>y</var> if the diff isn't 0.
Probably, min/max would work better here too.
test/jdk/java/awt/Robot/MouseMoveOffScreen.java line 2:
> 1: /*
> 2: * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
Suggestion:
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
It hasn't been integrated in 2024, so the year needs bumping up to 2025.
test/jdk/java/awt/Robot/MouseMoveOffScreen.java line 44:
> 42: robot.mouseMove(STARTING_LOC.x, STARTING_LOC.y);
> 43: robot.delay(500);
> 44: robot.mouseMove(OFF_SCREEN_LOC.x, OFF_SCREEN_LOC.y);
You should validate to ensure your `OFF_SCREEN_LOC` is actually off screen.
test/jdk/java/awt/Robot/MouseMoveOffScreen.java line 50:
> 48: throw new RuntimeException("Test Failed, getLocation returned
> null.");
> 49: }
> 50: Point currLoc = MouseInfo.getPointerInfo().getLocation();
Suggestion:
Point currLoc = MouseInfo.getPointerInfo().getLocation();
if (currLoc == null) {
throw new RuntimeException("Test Failed, getLocation returned
null.");
}
You could save the the mouse location right away.
-------------
PR Review: https://git.openjdk.org/jdk/pull/22781#pullrequestreview-2573308137
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929109081
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929070058
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929071748
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929073747
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929100875
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929103712
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929107458
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929110307
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929111847
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1929113298