Merge branch 'releases/Release_2_11_3_Branch'
[jalview.git] / src / jalview / bin / Launcher.java
index e1415be..507f501 100644 (file)
@@ -50,8 +50,16 @@ public class Launcher
 {
   private final static String startClass = "jalview.bin.Jalview";
 
+  // not setting this yet due to problem with Jmol
   private final static String headlessProperty = "java.awt.headless";
 
+  // used for headless macOS
+  private final static String macosHeadlessProperty = "apple.awt.UIElement";
+
+  // arguments that assume headless mode
+  private final static String[] assumeHeadlessArgs = { "headless", "output",
+      "image", "structureimage" };
+
   /**
    * main method for jalview.bin.Launcher. This restarts the same JRE's JVM with
    * the same arguments but with memory adjusted based on extracted -jvmmempc
@@ -77,7 +85,9 @@ public class Launcher
     boolean wait = true;
     boolean quiet = false;
     boolean headless = false;
+    boolean assumeheadless = false;
     boolean gui = false;
+    boolean help = false;
     boolean stdout = false;
     // must set --debug before --launcher...
     boolean launcherstop = false;
@@ -85,45 +95,70 @@ public class Launcher
     boolean launcherwait = false;
     ArrayList<String> arguments = new ArrayList<>();
     String previousArg = null;
+    // set debug first
     for (String arg : args)
     {
       if (arg.equals("--debug"))
       {
         debug = true;
       }
+    }
+    for (String arg : args)
+    {
       if (arg.equals("--quiet"))
       {
         quiet = true;
       }
-      if (arg.equals("--headless"))
-      {
-        headless = true;
-      }
-      if (arg.equals("--gui"))
+      else if (arg.equals("--gui"))
       {
         gui = true;
       }
-      if (arg.equals("--output=-")
-              || (arg.equals("-") && "--output".equals(previousArg)))
+      else if (arg.equals("--help"))
       {
-        stdout = true;
+        help = true;
       }
-      if (debug && arg.equals("--launcherprint"))
+      else if (arg.equals("--version"))
       {
-        launcherprint = true;
+        help = true;
       }
-      if (debug && arg.equals("--launcherstop"))
+
+      if (!assumeheadless)
       {
-        launcherstop = true;
+        for (String a : assumeHeadlessArgs)
+        {
+          if (arg.equals("--" + a) || arg.startsWith("--" + a + "="))
+          {
+            assumeheadless = true;
+          }
+        }
       }
-      if (debug && arg.equals("--launcherwait"))
+
+      if (arg.equals("--output=-")
+              || (arg.equals("-") && "--output".equals(previousArg)))
       {
-        launcherwait = true;
+        stdout = true;
       }
-      // this ends the launcher immediately
-      if (debug && arg.equals("--launchernowait"))
+
+      if (debug)
       {
-        wait = false;
+        if (arg.equals("--launcherprint"))
+        {
+          launcherprint = true;
+        }
+        else if (arg.equals("--launcherstop"))
+        {
+          launcherstop = true;
+        }
+        else if (arg.equals("--launcherwait"))
+        {
+          launcherwait = true;
+        }
+        else
+        // this ends the launcher immediately
+        if (arg.equals("--launchernowait"))
+        {
+          wait = false;
+        }
       }
       previousArg = arg;
       // Don't add the --launcher... args to Jalview launch
@@ -166,11 +201,21 @@ public class Launcher
         arguments.add(arg);
       }
     }
-    if (gui)
+    if (help)
+    {
+      // --help takes precedence over --gui
+      headless = true;
+    }
+    else if (gui)
     {
       // --gui takes precedence over --headless
       headless = false;
     }
+    else
+    {
+      // --output arguments assume headless mode
+      headless = assumeheadless;
+    }
 
     final String appName = ChannelProperties.getProperty("app_name");
 
@@ -212,6 +257,7 @@ public class Launcher
     boolean dockIcon = false;
     boolean dockName = false;
     boolean headlessProp = false;
+    boolean macosHeadlessProp = false;
     for (int i = 0; i < command.size(); i++)
     {
       String arg = command.get(i);
@@ -236,6 +282,10 @@ public class Launcher
       {
         headlessProp = true;
       }
+      else if (arg.startsWith("-D" + macosHeadlessProperty + "="))
+      {
+        macosHeadlessProp = true;
+      }
     }
 
     if (!memSet)
@@ -263,9 +313,6 @@ public class Launcher
         // -Xdock:name=... doesn't actually work :(
         // Leaving it in in case it gets fixed
         command.add("-Xdock:name=" + appName);
-        // this launches WITHOUT an icon in the macOS dock. Could be useful for
-        // getdown?
-        // command.add("-Dapple.awt.UIElement=false");
         // This also does not work for the dock
         command.add("-Dcom.apple.mrj.application.apple.menu.about.name="
                 + appName);
@@ -274,7 +321,16 @@ public class Launcher
     if (headless && !headlessProp)
     {
       System.setProperty(headlessProperty, "true");
-      command.add("-D" + headlessProperty + "=true");
+      /* not setting this in java invocation of running jalview due to problem with Jmol */
+      if (help)
+      {
+        command.add("-D" + headlessProperty + "=true");
+      }
+    }
+    if (headless && LaunchUtils.isMac && !macosHeadlessProp)
+    {
+      System.setProperty(macosHeadlessProperty, "true");
+      command.add("-D" + macosHeadlessProperty + "=true");
     }
 
     String scalePropertyArg = HiDPISetting.getScalePropertyArg();