RFR: 8372415: Stage size should match visual window bounds [v6]

Martin Fox mfox at openjdk.org
Thu Feb 19 18:28:30 UTC 2026


On Wed, 14 Jan 2026 02:15:37 GMT, Michael Strauß <mstrauss at openjdk.org> wrote:

>> 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 expect.
>> 
>> 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 (in the following images, the screenshot size corresponds to the window size; note the invisible padding around the edges):
>> <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?).
>
> Michael Strauß has updated the pull request incrementally with one additional commit since the last revision:
> 
>   fix merge

Sorry it's been so long since my last review. I did a few tests just to confirm that the Windows platform does behave very differently from macOS and Linux. When attempting to place windows side-by-side or aligned with the edges of the screen there's a much bigger gap on Windows than the other platforms.

I feel that the code could be easier to understand and review. For example, when imposing min and max bounds it would be clearer if the code converted from window rect to extended rect, applied the bounds, and then converted back. I am willing to review the code as it stands but would appreciate it if you could take a look and see if the conversions could be more centralized for clarity.

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

PR Comment: https://git.openjdk.org/jfx/pull/1982#issuecomment-3929063501


More information about the openjfx-dev mailing list