On Mon, 24 Nov 2025 14:28:47 GMT, Michael Strauß <[email protected]> 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?).

I haven't uncovered any problems so far but it took me a while to get my 
bearings. You're working with two coordinate systems, the one used by JavaFX 
which doesn't include the invisible border and the one used by Windows which 
does. The naming convention is confusing since the "extended" rectangle is 
actually the smaller of the two. It would also be good to see some comments 
clarifying that `m_insets`, `m_maxSize`, and `m_minSize` are all specified in 
the JavaFX system.

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

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

Reply via email to