On Mon, 15 Dec 2025 06:18:46 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?).
>
> Michael Strauß has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   handle edge cases

modules/javafx.graphics/src/main/native-glass/win/Utils.cpp line 144:

> 142:                 GetProcAddress(hModule, "SetThreadDpiAwarenessContext"));
> 143: 
> 144:             // Only load GetProcessDpiAwareness if 
> GetThreadDpiAwarenessContext is not available (pre-Win10).

What versions of Windows does JavaFX support? I just spent a half hour 
searching and couldn't find any statement on this for either JavaFX or the JDK.

As of October of this year the original version of Windows 10 left Microsoft's 
Long Term Servicing Channel. As of now the earliest version of Windows 
supported by Microsoft is Win10 2016 (1607), the version where the thread DPI 
awareness calls were first added. Is JavaFX supporting and testing earlier 
versions of Windows? If not you should be able to just make direct calls to the 
thread DPI awareness API's.

This is probably a topic for the mailing list. I'm still surprised I couldn't 
find this information anywhere.

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

PR Review Comment: https://git.openjdk.org/jfx/pull/1982#discussion_r2623902261

Reply via email to