On Fri, 24 Jan 2025 00:25:14 GMT, Alisen Chung <ach...@openjdk.org> 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

Reply via email to