<AWT Dev> [15] Review Request: 8231564 and 8176359
Alexey Ivanov
alexey.ivanov at oracle.com
Wed Jan 29 17:27:52 UTC 2020
Hi Sergey,
The fix looks good to me.
The trick with WM_WINDOWPOSCHANGING should work to avoid covering the
Taskbar on the secondary monitor too.
Regards,
Alexey
On 26/01/2020 22:43, Sergey Bylokhov wrote:
> Hello.
> Please review the fix for JDK 15.
>
> Bugs: 8231564: setMaximizedBounds is broken with large display scale
> and multiple monitors
> https://bugs.openjdk.java.net/browse/JDK-8231564
> 8176359: Frame#setMaximizedbounds not working properly in multi
> screen environments
> https://bugs.openjdk.java.net/browse/JDK-8176359
> Fix: http://cr.openjdk.java.net/~serb/8176359/webrev.01
>
> Short description:
> =================
> The fix changes the way on how we limit the size and position of the
> maximized window.
>
> Long description:
> =================
> On Windows supports of maximized is done by the WM_GETMINMAXINFO[1]
> message. This
> message provides MINMAXINFO[2] which has two related fields: ptMaxSize
> and ptMaxPosition.
> ptMaxPosition: The position of the left side of the maximized window
> (x member) and
> the position of the top of the maximized window (y
> member). For top-level
> windows, this value is based on the position of the
> primary monitor.
> ptMaxSize: The maximized width (x member) and the maximized height
> (y member) of the
> window. For top-level windows, this value is based on the
> width of the primary
> monitor.
> "For systems with multiple monitors, the ptMaxSize and ptMaxPosition
> members describe the
> maximized size and position of the window on the primary monitor, even
> if the window
> ultimately maximizes onto a secondary monitor. In that case, the
> window manager adjusts
> these values to compensate for differences between the primary monitor
> and the monitor that
> displays the window. Thus, if the user leaves ptMaxSize untouched, a
> window on a monitor
> larger than the primary monitor maximizes to the size of the larger
> monitor."
>
> My observation:
> =================
> 1. Description of "ptMaxPosition" in the documentation is wrong,
> this value is based on the
> actual window's monitor not a primary monitor. I have read about
> it here[3] and confirmed
> by the tests using three monitors setup.
> 2. ptMaxSize will be used as-is if the size is smaller than the
> !!main!! monitor. If the size
> is larger than the main monitor then the window manager adjusts
> the size, like this:
> // result = requested.w + (current.w - main.w); =>> This results
> in the correct size if we
> want to fully maximize the window on the current monitor, but if
> we want to set a smaller
> size then we will get the wrong result.
> We can try to compensate for this adjustment like this:
> // requested = requested.w - (current.w - main.w);
> but this can result to the size smaller than the main screen, so
> no adjustment will be
> done by the window manager =>> wrong size again.
> Note that the result does not depend on the monitor on which we
> maximize the window.
> 3. For example for the three monitors setup: W1=600, W2=1600,
> W3=1080. It is not possible
> to maximize the window on W3 if the current window is on W2
> monitor, because if we
> request size=1080 which is bigger than 600 and it will be
> adjusted by the window
> manager: resulted size = 1080+(1600-600) = 2080. If we will try
> to compensate this value:
> size = 1080 - (1600-600) = 80, which is smaller than main monitor
> and will be used as-is.
>
> Fix description:
> 1. To fix JDK-8231564 we should convert all coordinates from the
> user's virtual space to
> the device space.
> 2. To fix JDK-8176359 we need to translate the bounds.x/y from the
> global virtual coordinate
> system related to the main monitor to the coordinate system of
> the window's actual monitor.
> 3. The current code already tried to compensate adjustment, but it
> missed the fact that the
> width and height should be adjusted separately, but even if that
> be fixed, in some situations
> this logic will be broken(see observation point 3). So instead of
> fixing that I have passed
> these values to the native as-is, and cut the adjustment in the
> WM_WINDOWPOSCHANGING event,
> just before the window is resized.
>
>
> Known issue:
> - The current approach, as well as most of the API which uses user's
> space coordinates, does
> not work well if different scales are used for each screen and the
> coordinates "overlaps".
> - It looks like the user in the JDK-8231564 tried to avoid covers the
> taskbar by the maximized
> undecorated window, this is a know issue JDK-8022302.
>
>
> [1]
> https://docs.microsoft.com/en-us/windows/win32/winmsg/wm-getminmaxinfo
> [2]
> https://docs.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-minmaxinfo?redirectedfrom=MSDN
> [3] https://devblogs.microsoft.com/oldnewthing/20150501-00/?p=44964
>
More information about the awt-dev
mailing list