RFR: 8269374: Menu inoperable after setting stage to second monitor
Kevin Rushforth
kcr at openjdk.java.net
Wed Jul 14 12:16:14 UTC 2021
On Mon, 12 Jul 2021 12:46:10 GMT, Jose Pereda <jpereda at openjdk.org> wrote:
> On Windows, with two monitors with different DPI settings, if a JavaFX application changes screens (either by dragging or programmatically) there is a resize event to adjust the view to its new platform scale.
>
> Note that there is already a [call](https://github.com/openjdk/jfx/blob/master/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinWindow.java#L206) to `View::updateLocation` in WinWindow, right after `notifyMoveToAnotherScreen` and `notifyScaleChanged `. But this is done too soon, before the resize event. There are other MOVE events processed too (in a long complex chain of recursive calls to `WinWindow::setBounds`).
>
> As a consequence, as commented in the issue [JDK-8269374](https://bugs.openjdk.java.net/browse/JDK-8269374), the view x/y coordinates are wrongly set using the _old_ X,Y values (from the previous screen) with the _new_ platform scale (from the new screen).
>
> This PR adds an extra call to View::updateLocation` in WinWindow, forcing the view relocation on Windows after every resize event to fix the issue. With the correct location of the scene, the Menus are now perfectly aligned, and the mouse events are correctly processed. It doesn't have any side effect on other platforms.
>
> There's a very small penalty, as this new relocation will be called whenever there is a resize event on Windows, but it simplifies the overhead of detecting when the change of screens is effectively done (including the chain of move/resize) events.
>
> No tests are provided, since these would require a setup of two monitors with different DPI settings. However, the test case in the JBS issue can be used to validate the fix.
Looks good.
-------------
Marked as reviewed by kcr (Lead).
PR: https://git.openjdk.java.net/jfx/pull/572
More information about the openjfx-dev
mailing list