[ 
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. A 
laptop and one external monitor was used for these tests. 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 (laptop 200%/external 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 (of Windows--this makes a difference!)
* change 150% to 100% while running app
* restart app
* main display external monitor at sign-in (laptop 200%/external 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 (laptop 200%/external 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 (laptop 200%/external 100%), then 
disconnect external while running app
* 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 (laptop 200%/external 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 (laptop 200%/external 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 (laptop 150%, external 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. 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. A 
laptop and one external monitor was used for these tests. 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 (laptop 200%/external 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 (laptop 200%/external 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 (laptop 200%/external 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 (laptop 200%/external 100%), then 
disconnect external while running app
* 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 (laptop 200%/external 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 (laptop 200%/external 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 (laptop 150%, external 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, pull-request-available
>         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
>
>          Time Spent: 2h
>  Remaining Estimate: 0h
>
> 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. 
> A laptop and one external monitor was used for these tests. 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 (laptop 200%/external 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 (of Windows--this makes a difference!)
> * change 150% to 100% while running app
> * restart app
> * main display external monitor at sign-in (laptop 200%/external 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 (laptop 200%/external 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 (laptop 200%/external 100%), then 
> disconnect external while running app
> * 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 (laptop 200%/external 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 (laptop 200%/external 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 (laptop 150%, external 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

Reply via email to