X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FHiDPISetting.java;h=497900f28b04670133a8602f357d034bbc0aad85;hb=e32a5ade6bf19aca615f33b4664bbb6bcf4d2529;hp=770fb2757b40dab0eec71415b3b1a47fc1fa5063;hpb=6e743dad6db3d5ed39c3d216c377f6b265aa0dce;p=jalview.git diff --git a/src/jalview/bin/HiDPISetting.java b/src/jalview/bin/HiDPISetting.java index 770fb27..497900f 100644 --- a/src/jalview/bin/HiDPISetting.java +++ b/src/jalview/bin/HiDPISetting.java @@ -1,32 +1,37 @@ package jalview.bin; +import java.awt.HeadlessException; import java.awt.Toolkit; public class HiDPISetting { - private static final int hidpiThreshold = 130; + private static final int hidpiThreshold = 160; - private static final int tallScreenThreshold = 1300; + private static final int hidpiMultiThreshold = 240; - private static final String scalePropertyName = "sun.java2d.uiScale"; + private static final int bigScreenThreshold = 1400; - private static final boolean isAMac; + private static final String scalePropertyName = "sun.java2d.uiScale"; private static final boolean isLinux; - private static final boolean isWindows; + // private static final boolean isAMac; + + // private static final boolean isWindows; - public static final String forceHiDPISettingPropertyName = "forceHiDPISetting"; + public static final String setHiDPIPropertyName = "setHiDPI"; - public static final String forceHiDPISettingScalePropertyName = "forceHiDPISettingScale"; + public static final String setHiDPIScalePropertyName = "setHiDPIScale"; - private static final boolean forceHiDPISetting; + private static boolean setHiDPI = false; - private static final int forceHiDPISettingScale; + private static int setHiDPIScale = 0; public static int dpi = 0; - public static int height = 0; + public static int mindimension = 0; + + public static int width = 0; public static int scale = 0; @@ -36,87 +41,138 @@ public class HiDPISetting static { - 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) + String system = System.getProperty("os.name") == null ? null + : System.getProperty("os.name").toLowerCase(); + if (system != null) { - try - { - tryForceHiDPISettingScale = Integer - .parseInt(forceHiDPISettingScaleProperty); - } catch (NumberFormatException e) - { - System.err.println(forceHiDPISettingScalePropertyName - + " property give (" + forceHiDPISettingScaleProperty - + ") but not parseable as integer"); - } + isLinux = system.indexOf("linux") > -1; + // isAMac = system.indexOf("mac") > -1; + // isWindows = system.indexOf("windows") > -1; + } + else + { + isLinux = false; + // isAMac = isWindows = false; } - forceHiDPISettingScale = tryForceHiDPISettingScale; } - private void init() + private static void init() { if (doneInit) { return; } - // try and get screen resolution - try + // get and use command line property values first + String setHiDPIProperty = System.getProperty(setHiDPIPropertyName); + setHiDPI = setHiDPIProperty != null + && setHiDPIProperty.equalsIgnoreCase("true"); + + String setHiDPIScaleProperty = System + .getProperty(setHiDPIScalePropertyName); + if (setHiDPIScaleProperty != null) { - dpi = Toolkit.getDefaultToolkit().getScreenResolution(); - } catch (Throwable t) + try + { + setHiDPIScale = Integer.parseInt(setHiDPIScaleProperty); + } catch (NumberFormatException e) + { + System.err.println(setHiDPIScalePropertyName + " property give (" + + setHiDPIScaleProperty + ") but not parseable as integer"); + } + } + if (setHiDPI && setHiDPIScale > 0) { - System.err.println("Cannot get screen resolution"); + setHiDPIScale(setHiDPIScale); + return; } - // try and get screen size height + // check to see if the scale property has already been set by something else + // (e.g. the OS) + String existingProperty = System.getProperty(scalePropertyName); + if (existingProperty != null) + { + try + { + int existingPropertyVal = Integer.parseInt(existingProperty); + System.out.println("Existing " + scalePropertyName + " is " + + existingPropertyVal); + if (existingPropertyVal > 1) + { + setHiDPIScale(existingPropertyVal); + return; + } + } catch (NumberFormatException e) + { + System.out.println("Could not convert property " + scalePropertyName + + " vale '" + existingProperty + "' to number"); + } + } + + // Try and auto guess a good scale based on reported DPI (not trustworthy) + // and screen resolution (more trustworthy) + + // get screen dpi try { - height = Toolkit.getDefaultToolkit().getScreenSize().height; - } catch (Throwable t) + dpi = Toolkit.getDefaultToolkit().getScreenResolution(); + } catch (HeadlessException e) { - System.err.println("Cannot get screen size height"); + System.err.println("Cannot get screen resolution: " + e.getMessage()); } - if (forceHiDPISetting && forceHiDPISettingScale > 0) + // try and get screen size height and width + try { - scale = forceHiDPISettingScale; - } - else + int height = Toolkit.getDefaultToolkit().getScreenSize().height; + int width = Toolkit.getDefaultToolkit().getScreenSize().width; + // using mindimension in case of portrait screens + mindimension = Math.min(height, width); + } catch (HeadlessException e) { - // 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; + System.err.println( + "Cannot get screen size height and width:" + e.getMessage()); } - allowScalePropertyArg = (scale > 1 && isLinux) || forceHiDPISetting; + // attempt at a formula for scaling based on screen dpi and mindimension. + // scale will be an integer >=1. This formula is based on some testing and + // guesswork! + + // scale based on reported dpi. if dpi>hidpiThreshold then scale=2+multiples + // of hidpiMultiThreshold (else scale=1) + // (e.g. dpi of 110 scales 1. dpi of 120 scales 2. dpi of 360 scales 3) + int dpiScale = (dpi - hidpiThreshold > 0) + ? 2 + ((dpi - hidpiThreshold) / hidpiMultiThreshold) + : 1; + + int dimensionScale = 1 + (mindimension / bigScreenThreshold); + + // choose larger of dimensionScale or dpiScale (most likely dimensionScale + // as dpiScale often misreported) + int autoScale = Math.max(dpiScale, dimensionScale); - if (allowScalePropertyArg) + // only make an automatic change if scale is changed and other conditions + // (OS is linux) apply, or if setHiDPI has been specified + if ((autoScale > 1 && isLinux) || setHiDPI) { - System.out.println("boolean forceHiDPISetting=" + forceHiDPISetting); - System.out.println("DPI detected as " + dpi - + ". Scaling factor set to " + scale + "."); + setHiDPIScale(autoScale); + return; } + // looks like we're not doing any scaling + doneInit = true; + } + + public static void setHiDPIScale(int s) + { + scale = s; + allowScalePropertyArg = true; doneInit = true; } - public static synchronized String getScalePropertyArg() + public static String getScalePropertyArg() { + init(); // HiDPI setting. Just looking at Linux to start with. Test with Windows. return allowScalePropertyArg ? "-D" + scalePropertyName + "=" + scale : null;