X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fbin%2FHiDPISetting.java;h=6219179ef6c06f3676bcf42a362cd9ebaf01fd1b;hb=1c721468246c2aafd86fc52d954512374f576b11;hp=497900f28b04670133a8602f357d034bbc0aad85;hpb=678a85b1a46c29056536b6e8bc3c7a3ea1e3d1df;p=jalview.git diff --git a/src/jalview/bin/HiDPISetting.java b/src/jalview/bin/HiDPISetting.java index 497900f..6219179 100644 --- a/src/jalview/bin/HiDPISetting.java +++ b/src/jalview/bin/HiDPISetting.java @@ -1,7 +1,8 @@ package jalview.bin; +import java.util.Locale; + import java.awt.HeadlessException; -import java.awt.Toolkit; public class HiDPISetting { @@ -11,7 +12,7 @@ public class HiDPISetting private static final int bigScreenThreshold = 1400; - private static final String scalePropertyName = "sun.java2d.uiScale"; + public static final String scalePropertyName = "sun.java2d.uiScale"; private static final boolean isLinux; @@ -35,14 +36,18 @@ public class HiDPISetting public static int scale = 0; + public final static int MAX_SCALE = 8; + private static boolean doneInit = false; private static boolean allowScalePropertyArg = false; + private static ScreenInfo screenInfo = new ScreenInfo(); + static { String system = System.getProperty("os.name") == null ? null - : System.getProperty("os.name").toLowerCase(); + : System.getProperty("os.name").toLowerCase(Locale.ROOT); if (system != null) { isLinux = system.indexOf("linux") > -1; @@ -65,8 +70,17 @@ public class HiDPISetting // get and use command line property values first String setHiDPIProperty = System.getProperty(setHiDPIPropertyName); - setHiDPI = setHiDPIProperty != null - && setHiDPIProperty.equalsIgnoreCase("true"); + boolean setHiDPIPropertyBool = Boolean.parseBoolean(setHiDPIProperty); + + // allow -DsetHiDPI=false to turn off HiDPI scaling + if (setHiDPIProperty != null && !setHiDPIPropertyBool) + { + clear(); + doneInit = true; + return; + } + + setHiDPI = setHiDPIProperty != null && setHiDPIPropertyBool; String setHiDPIScaleProperty = System .getProperty(setHiDPIScalePropertyName); @@ -75,6 +89,12 @@ public class HiDPISetting try { setHiDPIScale = Integer.parseInt(setHiDPIScaleProperty); + // if setHiDPIScale property is validly set and setHiDPI property wasn't + // attempted to be set we assume setHiDPIScale to be true + if (setHiDPIProperty == null) + { + setHiDPI = true; + } } catch (NumberFormatException e) { System.err.println(setHiDPIScalePropertyName + " property give (" @@ -113,9 +133,10 @@ public class HiDPISetting // and screen resolution (more trustworthy) // get screen dpi + screenInfo = getScreenInfo(); try { - dpi = Toolkit.getDefaultToolkit().getScreenResolution(); + dpi = screenInfo.getScreenResolution(); } catch (HeadlessException e) { System.err.println("Cannot get screen resolution: " + e.getMessage()); @@ -124,8 +145,8 @@ public class HiDPISetting // try and get screen size height and width try { - int height = Toolkit.getDefaultToolkit().getScreenSize().height; - int width = Toolkit.getDefaultToolkit().getScreenSize().width; + int height = screenInfo.getScreenHeight(); + int width = screenInfo.getScreenWidth(); // using mindimension in case of portrait screens mindimension = Math.min(height, width); } catch (HeadlessException e) @@ -147,6 +168,14 @@ public class HiDPISetting int dimensionScale = 1 + (mindimension / bigScreenThreshold); + // reject outrageous values -- dpiScale in particular could be mistaken + if (dpiScale > MAX_SCALE) { + dpiScale = 1; + } + if (dimensionScale > MAX_SCALE) { + dimensionScale = 1; + } + // choose larger of dimensionScale or dpiScale (most likely dimensionScale // as dpiScale often misreported) int autoScale = Math.max(dpiScale, dimensionScale); @@ -170,11 +199,41 @@ public class HiDPISetting doneInit = true; } + public static String getScalePropertyArg(int s) + { + return "-D" + scalePropertyName + "=" + String.valueOf(s); + } + public static String getScalePropertyArg() { init(); // HiDPI setting. Just looking at Linux to start with. Test with Windows. - return allowScalePropertyArg ? "-D" + scalePropertyName + "=" + scale - : null; + return allowScalePropertyArg ? getScalePropertyArg(scale) : null; + } + + public static void clear() + { + setHiDPI = false; + setHiDPIScale = 0; + dpi = 0; + mindimension = 0; + width = 0; + scale = 0; + doneInit = false; + allowScalePropertyArg = false; + } + + public static void setScreenInfo(ScreenInfo si) + { + screenInfo = si; + } + + public static ScreenInfo getScreenInfo() + { + if (screenInfo == null) + { + screenInfo = new ScreenInfo(); + } + return screenInfo; } }