Merge branch 'improvement/JAL-3830_remove_dock_icon_in_headless_mode' into develop
authorJames Procter <j.procter@dundee.ac.uk>
Mon, 10 Jul 2023 09:12:48 +0000 (10:12 +0100)
committerJames Procter <j.procter@dundee.ac.uk>
Mon, 10 Jul 2023 09:12:48 +0000 (10:12 +0100)
src/jalview/bin/Launcher.java
utils/getdown/bin/jalview.sh

index a87d322..c333e2e 100644 (file)
@@ -50,6 +50,8 @@ public class Launcher
 {
   private final static String startClass = "jalview.bin.Jalview";
 
+  private final static String headlessProperty = "java.awt.headless";
+
   private static boolean checkJVMSymlink(String testBin)
   {
     File testBinFile = new File(testBin);
@@ -94,13 +96,14 @@ public class Launcher
     final String javaBinDir = System.getProperty("java.home")
             + File.separator + "bin" + File.separator;
     String javaBin = null;
-    if (javaBin == null && checkJVMSymlink(javaBinDir + appName))
-    {
-      javaBin = javaBinDir + appName;
-    }
-    if (javaBin == null && checkJVMSymlink(javaBinDir + "Jalview"))
+    for (String name : new String[] { appName, "Jalview", "java",
+        "java.exe" })
     {
-      javaBin = javaBinDir + "Jalview";
+      if (checkJVMSymlink(javaBinDir + name))
+      {
+        javaBin = javaBinDir + name;
+        break;
+      }
     }
     if (javaBin == null)
     {
@@ -127,6 +130,8 @@ public class Launcher
     boolean debug = false;
     boolean wait = true;
     boolean quiet = false;
+    boolean headless = false;
+    boolean gui = false;
     // must set --debug before --launcher...
     boolean launcherstop = false;
     boolean launcherprint = false;
@@ -142,6 +147,14 @@ public class Launcher
       {
         quiet = true;
       }
+      if (arg.equals("--headless"))
+      {
+        headless = true;
+      }
+      if (arg.equals("--gui"))
+      {
+        gui = true;
+      }
       if (debug && arg.equals("--launcherprint"))
       {
         launcherprint = true;
@@ -199,6 +212,11 @@ public class Launcher
         arguments.add(arg);
       }
     }
+    if (gui)
+    {
+      // --gui takes precedence over --headless
+      headless = false;
+    }
 
     // use saved preferences if no cmdline args
     boolean useCustomisedSettings = LaunchUtils
@@ -221,6 +239,7 @@ public class Launcher
     boolean memSet = false;
     boolean dockIcon = false;
     boolean dockName = false;
+    boolean headlessProp = false;
     for (int i = 0; i < command.size(); i++)
     {
       String arg = command.get(i);
@@ -241,6 +260,10 @@ public class Launcher
       {
         dockName = true;
       }
+      else if (arg.startsWith("-D" + headlessProperty + "="))
+      {
+        headlessProp = true;
+      }
     }
 
     if (!memSet)
@@ -276,6 +299,11 @@ public class Launcher
                 + appName);
       }
     }
+    if (headless && !headlessProp)
+    {
+      System.setProperty(headlessProperty, "true");
+      command.add("-D" + headlessProperty + "=true");
+    }
 
     String scalePropertyArg = HiDPISetting.getScalePropertyArg();
     if (scalePropertyArg != null)
index 9e3a8c7..07fd6ed 100755 (executable)
@@ -36,6 +36,18 @@ if [ "$( uname -s )" = "Darwin" ]; then
   ISMACOS=1
 fi
 
+# check for headless mode
+HEADLESS=0
+for ARG in "${@}"; do
+  if [ "${ARG}" = "--headless" ]; then
+    HEADLESS=1
+  elif [ "${ARG}" = "--gui" ]; then
+    # --gui takes precedence over --headless
+    HEADLESS=0
+    break
+  fi
+done
+
 declare -a JVMARGS=()
 
 # set vars for being inside the macos App Bundle
@@ -57,6 +69,11 @@ else
   JAVA="${APPDIR}/jre/bin/java"
 fi
 
+if [ "${HEADLESS}" = 1 ]; then
+  # this suppresses the Java icon appearing in the macOS Dock and maybe other things in other OSes
+  JVMARGS=( "${JVMARGS[@]}" "-Djava.awt.headless=true" )
+fi
+
 SYSJAVA=java
 GETDOWNTXT="${APPDIR}/getdown.txt"