On Windows, the `Stage.width` and `Stage.height` correspond to the window size 
as returned by `GetWindowRect`.

Up until Windows 10, the size of a window was identical to its visual borders. 
However, since Windows 10 has introduced thin visual window borders, the window 
manager adds an invisible border of a few pixels around the window to make it 
easier to resize the window. Since `GetWindowRect` returns the window size 
_including_ these invisible borders, the location and size of a `Stage` isn't 
exactly what we'd expected.

For example, if we place a `Stage` at `setX(0)` and `setY(0)`, the window 
appears with a small distance from the screen edge, and the window size extends 
a few pixels beyond its visual borders:
<img width="300" alt="window-size-1" 
src="https://github.com/user-attachments/assets/76ea6861-885f-4bea-aeb7-e8e6464b7199";
 />

What we actually want is to have the visual borders line up with the edges of 
the screen, and have the window size correspond to the visual borders:
<img width="295" alt="window-size-2" 
src="https://github.com/user-attachments/assets/ca6bed73-e4e7-4df6-9491-d82792bb0866";
 />

The implementation is quite simple: instead of `GetWindowRect`, we use 
`DwmGetWindowAttribute(DWMA_EXTENDED_FRAME_BOUNDS)`. This gives us the bounds 
of the visual window borders. If this function fails, we fall back to 
`GetWindowRect` (now, I don't know why 
`DwmGetWindowAttribute(DWMA_EXTENDED_FRAME_BOUNDS)` would ever fail... maybe an 
old Windows version in a remote desktop scenario?).

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

Commit messages:
 - Stage size should match extended frame bounds

Changes: https://git.openjdk.org/jfx/pull/1982/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1982&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8372415
  Stats: 88 lines in 2 files changed: 45 ins; 14 del; 29 mod
  Patch: https://git.openjdk.org/jfx/pull/1982.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/1982/head:pull/1982

PR: https://git.openjdk.org/jfx/pull/1982

Reply via email to