On Tue, 28 Jan 2025 23:21:26 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 two additional 
> commits since the last revision:
> 
>  - helper function
>  - grab screen data on mouseMove

src/java.desktop/share/classes/java/awt/Robot.java line 229:

> 227: 
> 228:         GraphicsEnvironment ge = 
> GraphicsEnvironment.getLocalGraphicsEnvironment();
> 229:         GraphicsDevice[] gs = ge.getScreenDevices();

Suggestion:

        GraphicsDevice[] gds = ge.getScreenDevices();


I found that `gds` is a more common name in our code and testbase. At least for 
me, I immediately read `gds` as GraphicsDeviceS, array of `GraphicsDevice`.
Same applies for the test.

P.S. It's not a call to action, it's more of an invitation for discussion.

src/java.desktop/share/classes/java/awt/Robot.java line 258:

> 256: 
> 257:         if (leastXDiff > leastYDiff) {
> 258:             peer.mouseMove(finX2, finY2);

Let's say I have the following display configuration on Linux. Since it uses 
Xinerama, it shares the same coordinate system. 

java.awt.Rectangle[x=0,y=0,width=3440,height=1440]
java.awt.Rectangle[x=3440,y=0,width=1440,height=2560]

![image](https://github.com/user-attachments/assets/1953442c-fa18-49a0-99eb-b633152d83f6)

When I try to move the mouse to `x=20000,y=200`, I see that it clamps to 
`x=3439,y=200` (a point between 2 screens), while before it was 
`x=4879,y=200`(a rightmost point).

The old behavior seems more logical to me.

src/java.desktop/share/classes/java/awt/Robot.java line 268:

> 266:     private Point calcClosestPoint(int x, int y, Rectangle screenBounds) 
> {
> 267:         return new Point(Math.min(Math.max(x, screenBounds.x), 
> screenBounds.x + screenBounds.width-1),
> 268:                 Math.min(Math.max(y, screenBounds.y), screenBounds.y + 
> screenBounds.height-1));

Suggestion:

        return new Point(Math.min(Math.max(x, screenBounds.x), screenBounds.x + 
screenBounds.width - 1),
                Math.min(Math.max(y, screenBounds.y), screenBounds.y + 
screenBounds.height - 1));


minor spacing issue

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

PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1939749017
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1939760680
PR Review Comment: https://git.openjdk.org/jdk/pull/22781#discussion_r1939747548

Reply via email to