X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=getdown%2Fsrc%2Fgetdown%2Fcore%2Fsrc%2Fmain%2Fjava%2Fjalview%2Fbin%2FHiDPISetting.java;h=770fb2757b40dab0eec71415b3b1a47fc1fa5063;hb=6e743dad6db3d5ed39c3d216c377f6b265aa0dce;hp=5e20d7658cfd6fa952bb069c2791c67be948e309;hpb=1e26a902b2a53081ab6035d43c2bdf13f1a7ee4e;p=jalview.git diff --git a/getdown/src/getdown/core/src/main/java/jalview/bin/HiDPISetting.java b/getdown/src/getdown/core/src/main/java/jalview/bin/HiDPISetting.java index 5e20d76..770fb27 100644 --- a/getdown/src/getdown/core/src/main/java/jalview/bin/HiDPISetting.java +++ b/getdown/src/getdown/core/src/main/java/jalview/bin/HiDPISetting.java @@ -4,45 +4,121 @@ import java.awt.Toolkit; public class HiDPISetting { - public static final int dpi; + private static final int hidpiThreshold = 130; - public static final int scale; + private static final int tallScreenThreshold = 1300; - private static final int hidpi = 110; + private static final String scalePropertyName = "sun.java2d.uiScale"; - private static final String scaleProperty = "sun.java2d.uiScale"; + private static final boolean isAMac; - private static final boolean isAMac = System.getProperty("os.name") - .indexOf("Mac") > -1; + private static final boolean isLinux; - private static final boolean isLinux = System.getProperty("os.name") - .toLowerCase().indexOf("linux") > -1; + private static final boolean isWindows; - private static final boolean isWindows = System.getProperty("os.name") - .toLowerCase().indexOf("windows") > -1; + public static final String forceHiDPISettingPropertyName = "forceHiDPISetting"; + + public static final String forceHiDPISettingScalePropertyName = "forceHiDPISettingScale"; + + private static final boolean forceHiDPISetting; + + private static final int forceHiDPISettingScale; + + public static int dpi = 0; + + public static int height = 0; + + public static int scale = 0; + + private static boolean doneInit = false; + + private static boolean allowScalePropertyArg = false; static { - dpi = Toolkit.getDefaultToolkit().getScreenResolution(); - scale = dpi / hidpi + 1; - if (scale > 1 && isLinux) + isAMac = System.getProperty("os.name").indexOf("Mac") > -1; + isLinux = System.getProperty("os.name").toLowerCase() + .indexOf("linux") > -1; + isWindows = System.getProperty("os.name").toLowerCase() + .indexOf("windows") > -1; + + String forceHiDPISettingProperty = System + .getProperty(forceHiDPISettingPropertyName); + forceHiDPISetting = forceHiDPISettingProperty != null + && forceHiDPISettingProperty.equalsIgnoreCase("true"); + + int tryForceHiDPISettingScale = 0; + String forceHiDPISettingScaleProperty = System + .getProperty(forceHiDPISettingScalePropertyName); + if (forceHiDPISettingScaleProperty != null) { - System.out.println("DPI detected as " + dpi - + ". Scaling factor set to " + scale + "."); + try + { + tryForceHiDPISettingScale = Integer + .parseInt(forceHiDPISettingScaleProperty); + } catch (NumberFormatException e) + { + System.err.println(forceHiDPISettingScalePropertyName + + " property give (" + forceHiDPISettingScaleProperty + + ") but not parseable as integer"); + } } + forceHiDPISettingScale = tryForceHiDPISettingScale; } - public static String getScalePropertyArg() + private void init() { - // HiDPI setting. Just looking at Linux to start with. Test with Windows. - if (!isLinux) + if (doneInit) { - return null; + return; } - if (scale > 1) + + // try and get screen resolution + try { - return "-D" + scaleProperty + "=" + scale; + dpi = Toolkit.getDefaultToolkit().getScreenResolution(); + } catch (Throwable t) + { + System.err.println("Cannot get screen resolution"); } - return null; + + // try and get screen size height + try + { + height = Toolkit.getDefaultToolkit().getScreenSize().height; + } catch (Throwable t) + { + System.err.println("Cannot get screen size height"); + } + + if (forceHiDPISetting && forceHiDPISettingScale > 0) + { + scale = forceHiDPISettingScale; + } + else + { + // attempt at a formula for scaling based on screen dpi and height. scale + // will be an integer >=1 + scale = Math.min(dpi / hidpiThreshold, height / tallScreenThreshold) + + 1; + } + + allowScalePropertyArg = (scale > 1 && isLinux) || forceHiDPISetting; + + if (allowScalePropertyArg) + { + System.out.println("boolean forceHiDPISetting=" + forceHiDPISetting); + System.out.println("DPI detected as " + dpi + + ". Scaling factor set to " + scale + "."); + } + + doneInit = true; + } + + public static synchronized String getScalePropertyArg() + { + // HiDPI setting. Just looking at Linux to start with. Test with Windows. + return allowScalePropertyArg ? "-D" + scalePropertyName + "=" + scale + : null; } }