+/*
+ * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$)
+ * Copyright (C) $$Year-Rel$$ The Jalview Authors
+ *
+ * This file is part of Jalview.
+ *
+ * Jalview is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, either version 3
+ * of the License, or (at your option) any later version.
+ *
+ * Jalview is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty
+ * of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ * PURPOSE. See the GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Jalview. If not, see <http://www.gnu.org/licenses/>.
+ * The Jalview Authors are detailed in the 'AUTHORS' file.
+ */
package jalview.bin;
+import java.util.Locale;
+
import java.awt.HeadlessException;
-import java.awt.Toolkit;
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;
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;
// 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);
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 ("
// 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());
// 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)
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);
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;
}
}