[ https://issues.apache.org/jira/browse/NETBEANS-3592?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Eirik Bakke updated NETBEANS-3592: ---------------------------------- Description: Provide workarounds to various bugs that caused the Windows LAF to be unusable on many HiDPI configurations, typically when an external monitor (or projector) is involved, or is disconnected or connected. 1) In certain configurations, the GUI font size would be either way too large or way too small. (I can't remember exactly which configurations caused this, but going through the manual test case list below _will_ trigger it several times.) 2) In multi-monitor configurations that involve one HiDPI screen and one regular screen, the size of controls drawn by the OS, such as checkboxes and outline expansion handles, will be incorrect unless the HiDPI screen was the main display at login. I earlier reported this as a JDK bug at https://bugs.openjdk.java.net/browse/JDK-8211715 . (Note that there are a few icons which cannot be fixed using the UIDefaults approach taken here, e.g. checkmarks in JCheckBoxMenuItem.) In some cases, the LAF would previously end up scaling the control images received from the OS using a poor image scaling interpolation; the supplied patch improves the scaling quality in these cases. 3) On non-integral scaling levels, e.g. 150%, borders around text components will be of uneven thickness due to rounding error. This patch fixes that. This also happens to JComboBox, but in that case cannot be fixed with a simple patch, since that one does not take its border from UIDefaults. I will provide a PR with workarounds. Below is a manual test plan that I used to test these patches, on Windows 10. After each line in the test plan, the patch is confirmed to work. In _most_ of these cases there is some kind of improvement in behavior from the patch--either a corrected control/font size or at least an improvement in control icon scaling interpolation quality. * main display laptop at sign-in (external at 200% HiDPI scaling/main at 100%) * change main display to external monitor while running app * restart app * change 100% to 150% while running app * restart app * log out and in again * change 150% to 100% while running app * restart app * main display external monitor at sign-in (external 200%/main 100%) * change main display to laptop while running app * restart app * change 100% to 150% while running app * restart app * log out and in again * change 150% to 100% while running app * restart app * change 200% to 150% while running app * restart app * main display laptop at sign-in (external 200%/main 100%), then disconnect external before running app * reconnect external while running app * restart app * log out, disconnect external, log in * reconnect external while running app * restart app * disconnect external while running app * main display external monitor at sign-in (200%/100%), then disconnect external while running app (forgot an initial step here; initial data pasted in from step 9) * reconnect external while running app * restart app * log out, disconnect external, log in * reconnect external while running app * restart app * main display laptop at sign-in (200%/150%), then disconnect external before running * reconnect external while running app * log out, disconnect external, log in * reconnect external while running app * restart app * main display external monitor at sign-in (200%/150%), then disconnect external before running * reconnect external while running app * restart app * log out, disconnect external, log in * reconnect external while running app * restart app * main display external at sign-in (external 150%, main 100%) * change 100% to 150% while running app * restart app * change main display to laptop (200%), set external display to 100%, log out, disconnect external, log in, run app * reconnect external while running app (will be 100%) * close laptop lid (will switch to external display) was: Provide workarounds to various bugs that caused the Windows LAF to be unusable on many HiDPI configurations, typically when an external monitor (or projector) is involved, or is disconnected or connected. 1) In certain configurations, the GUI font size would be either way too large or way too small. (I can't remember exactly which configurations caused this, but going through the manual test case list below _will_ trigger it several times.) 2) In multi-monitor configurations that involve one HiDPI screen and one regular screen, the size of controls drawn by the OS, such as checkboxes and outline expansion handles, will be incorrect unless the HiDPI screen was the main display at login. (Note that there are a few icons which cannot be fixed using the UIDefaults approach taken here, e.g. checkmarks in JCheckBoxMenuItem.) In some cases, the LAF would previously end up scaling the control images received from the OS using a poor image scaling interpolation; the supplied patch improves the scaling quality in these cases. 3) On non-integral scaling levels, e.g. 150%, borders around text components will be of uneven thickness due to rounding error. This patch fixes that. This also happens to JComboBox, but in that case cannot be fixed with a simple patch, since that one does not take its border from UIDefaults. I will provide a PR with workarounds. Below is a manual test plan that I used to test these patches, on Windows 10. After each line in the test plan, the patch is confirmed to work. In _most_ of these cases there is some kind of improvement in behavior from the patch--either a corrected control/font size or at least an improvement in control icon scaling interpolation quality. * main display laptop at sign-in (external at 200% HiDPI scaling/main at 100%) * change main display to external monitor while running app * restart app * change 100% to 150% while running app * restart app * log out and in again * change 150% to 100% while running app * restart app * main display external monitor at sign-in (external 200%/main 100%) * change main display to laptop while running app * restart app * change 100% to 150% while running app * restart app * log out and in again * change 150% to 100% while running app * restart app * change 200% to 150% while running app * restart app * main display laptop at sign-in (external 200%/main 100%), then disconnect external before running app * reconnect external while running app * restart app * log out, disconnect external, log in * reconnect external while running app * restart app * disconnect external while running app * main display external monitor at sign-in (200%/100%), then disconnect external while running app (forgot an initial step here; initial data pasted in from step 9) * reconnect external while running app * restart app * log out, disconnect external, log in * reconnect external while running app * restart app * main display laptop at sign-in (200%/150%), then disconnect external before running * reconnect external while running app * log out, disconnect external, log in * reconnect external while running app * restart app * main display external monitor at sign-in (200%/150%), then disconnect external before running * reconnect external while running app * restart app * log out, disconnect external, log in * reconnect external while running app * restart app * main display external at sign-in (external 150%, main 100%) * change 100% to 150% while running app * restart app * change main display to laptop (200%), set external display to 100%, log out, disconnect external, log in, run app * reconnect external while running app (will be 100%) * close laptop lid (will switch to external display) > Fix various Windows LAF bugs on HiDPI screens > --------------------------------------------- > > Key: NETBEANS-3592 > URL: https://issues.apache.org/jira/browse/NETBEANS-3592 > Project: NetBeans > Issue Type: Improvement > Components: platform - Other > Affects Versions: 11.1 > Environment: Windows with HiDPI screens > Reporter: Eirik Bakke > Priority: Major > Labels: HiDPI > Attachments: Problem 1, incorrect font size.png, Problem 2, OS > controls wrong size (after patch).png, Problem 2, OS controls wrong size > (before patch).png, Problem 3, uneven text component borders.png, > WindowsSwingMultiMonitorTest.png > > > Provide workarounds to various bugs that caused the Windows LAF to be > unusable on many HiDPI configurations, typically when an external monitor (or > projector) is involved, or is disconnected or connected. > 1) In certain configurations, the GUI font size would be either way too large > or way too small. (I can't remember exactly which configurations caused this, > but going through the manual test case list below _will_ trigger it several > times.) > 2) In multi-monitor configurations that involve one HiDPI screen and one > regular screen, the size of controls drawn by the OS, such as checkboxes and > outline expansion handles, will be incorrect unless the HiDPI screen was the > main display at login. I earlier reported this as a JDK bug at > https://bugs.openjdk.java.net/browse/JDK-8211715 . (Note that there are a few > icons which cannot be fixed using the UIDefaults approach taken here, e.g. > checkmarks in JCheckBoxMenuItem.) In some cases, the LAF would previously end > up scaling the control images received from the OS using a poor image scaling > interpolation; the supplied patch improves the scaling quality in these cases. > 3) On non-integral scaling levels, e.g. 150%, borders around text components > will be of uneven thickness due to rounding error. This patch fixes that. > This also happens to JComboBox, but in that case cannot be fixed with a > simple patch, since that one does not take its border from UIDefaults. > I will provide a PR with workarounds. > Below is a manual test plan that I used to test these patches, on Windows 10. > After each line in the test plan, the patch is confirmed to work. In _most_ > of these cases there is some kind of improvement in behavior from the > patch--either a corrected control/font size or at least an improvement in > control icon scaling interpolation quality. > * main display laptop at sign-in (external at 200% HiDPI scaling/main at 100%) > * change main display to external monitor while running app > * restart app > * change 100% to 150% while running app > * restart app > * log out and in again > * change 150% to 100% while running app > * restart app > * main display external monitor at sign-in (external 200%/main 100%) > * change main display to laptop while running app > * restart app > * change 100% to 150% while running app > * restart app > * log out and in again > * change 150% to 100% while running app > * restart app > * change 200% to 150% while running app > * restart app > * main display laptop at sign-in (external 200%/main 100%), then disconnect > external before running app > * reconnect external while running app > * restart app > * log out, disconnect external, log in > * reconnect external while running app > * restart app > * disconnect external while running app > * main display external monitor at sign-in (200%/100%), then disconnect > external while running app (forgot an initial step here; initial data pasted > in from step 9) > * reconnect external while running app > * restart app > * log out, disconnect external, log in > * reconnect external while running app > * restart app > * main display laptop at sign-in (200%/150%), then disconnect external before > running > * reconnect external while running app > * log out, disconnect external, log in > * reconnect external while running app > * restart app > * main display external monitor at sign-in (200%/150%), then disconnect > external before running > * reconnect external while running app > * restart app > * log out, disconnect external, log in > * reconnect external while running app > * restart app > * main display external at sign-in (external 150%, main 100%) > * change 100% to 150% while running app > * restart app > * change main display to laptop (200%), set external display to 100%, log > out, disconnect external, log in, run app > * reconnect external while running app (will be 100%) > * close laptop lid (will switch to external display) -- This message was sent by Atlassian Jira (v8.3.4#803005) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists