JAL-4344 careful application of -Djava.awt.headless=true to avoid Jmol problem. Using...
authorBen Soares <b.soares@dundee.ac.uk>
Thu, 30 Nov 2023 12:51:54 +0000 (12:51 +0000)
committerBen Soares <b.soares@dundee.ac.uk>
Thu, 30 Nov 2023 12:51:54 +0000 (12:51 +0000)
src/jalview/bin/Launcher.java
utils/conda/jalview.sh
utils/getdown/bin/jalview.sh

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();
index 995195f..9ac2807 100755 (executable)
@@ -26,7 +26,6 @@
 ###############################
 
 declare -a ARGS=("${@}")
-ARG1=$1
 
 # this function is because there's no readlink -f in Darwin/macOS
 function readlinkf() {
@@ -72,7 +71,7 @@ for RAWARG in "${@}"; do
     --headless|--output|--image|--structureimage)
       HEADLESS=1
       ;;
-    --help|--help-*|--version)
+    --help|--help-*|--version|-h)
       HELP=1
       ;;
     --gui)
@@ -99,15 +98,23 @@ declare -a JVMARGS=()
 if [ "${ISMACOS}" = 1 ]; then
 # MACOS ONLY
   DIR="$(dirname "$(readlinkf "$0")")"
-  JVMARGS=( "${JVMARGS[@]}" "-Xdock:icon=${DIR}/jalview_logo.png" )
+  if [ -e "${DIR}/jalview_logo.png" ]; then
+    JVMARGS=( "${JVMARGS[@]}" "-Xdock:icon=${DIR}/jalview_logo.png" )
+  fi
 else
 # NOT MACOS
   DIR="$(dirname "$(readlink -f "$0")")"
 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" )
+  # not setting java.awt.headless in java invocation of running jalview due to problem with Jmol
+  if [ "${HELP}" = 1 ]; then
+    JVMARGS=( "${JVMARGS[@]}" "-Djava.awt.headless=true" )
+  fi
+  # this suppresses the Java icon appearing in the macOS Dock
+  if [ "${ISMACOS}" = 1 ]; then
+    JVMARGS=( "${JVMARGS[@]}" "-Dapple.awt.UIElement=true" )
+  fi
 fi
 
 JAVA=java
@@ -171,8 +178,22 @@ elif command -v resize 2>&1 >/dev/null; then
 fi
 JVMARGS=( "${JVMARGS[@]}" "-DCONSOLEWIDTH=${COLUMNS}" )
 
+function quotearray() {
+  QUOTEDVALS=""
+  for VAL in "${@}"; do
+    if [ \! "$QUOTEDVALS" = "" ]; then
+      QUOTEDVALS="${QUOTEDVALS} "
+    fi
+    QUOTEDVALS="${QUOTEDVALS}\"${VAL}\""
+  done
+  echo $QUOTEDVALS
+}
+
+JVMARGSSTR=$(quotearray "${JVMARGS[@]}")
+ARGSSTR=$(quotearray "${ARGS[@]}")
+
 if [ "${DEBUG}" = 1 ]; then
- echo Shell running: "${JAVA}" "${JVMARGS[@]}" -jar \""${JARPATH}"\" "${ARGS[@]}"
+ echo Shell running: \""${JAVA}"\" ${JVMARGSSTR} -jar \""${JARPATH}"\" ${ARGSSTR}
 fi
 
 "${JAVA}" "${JVMARGS[@]}" -jar "${JARPATH}" "${ARGS[@]}"
index 849d71a..90d1558 100755 (executable)
@@ -1,7 +1,6 @@
 #!/usr/bin/env bash
 
 declare -a ARGS=("${@}")
-ARG1=$1
 
 # this whole next part is because there's no readlink -f in Darwin
 function readlinkf() {
@@ -85,8 +84,14 @@ else
 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" )
+  # not setting java.awt.headless in java invocation of running jalview due to problem with Jmol
+  if [ "${HELP}" = 1 ]; then
+    JVMARGS=( "${JVMARGS[@]}" "-Djava.awt.headless=true" )
+  fi
+  # this suppresses the Java icon appearing in the macOS Dock
+  if [ "${ISMACOS}" = 1 ]; then
+    JVMARGS=( "${JVMARGS[@]}" "-Dapple.awt.UIElement=true" )
+  fi
 fi
 
 SYSJAVA=java
@@ -163,8 +168,22 @@ if [ \! -e "${JAVA}" ]; then
   echo "Cannot find bundled java, using system ${JAVA} and hoping for the best!" >&2
 fi
 
+function quotearray() {
+  QUOTEDVALS=""
+  for VAL in "${@}"; do
+    if [ \! "$QUOTEDVALS" = "" ]; then
+      QUOTEDVALS="${QUOTEDVALS} "
+    fi
+    QUOTEDVALS="${QUOTEDVALS}\"${VAL}\""
+  done
+  echo $QUOTEDVALS
+}
+
+JVMARGSSTR=$(quotearray "${JVMARGS[@]}")
+ARGSSTR=$(quotearray "${ARGS[@]}")
+
 if [ "${DEBUG}" = 1 ]; then
- echo Shell running: \""${JAVA}"\" \""${JVMARGS[@]}"\" -cp \""${CLASSPATH}"\" jalview.bin.Launcher "${ARGS[@]}"
+ echo Shell running: \""${JAVA}"\" ${JVMARGSSTR} -cp \""${CLASSPATH}"\" jalview.bin.Launcher ${ARGSSTR}
 fi
 
 "${JAVA}" "${JVMARGS[@]}" -cp "${CLASSPATH}" jalview.bin.Launcher "${ARGS[@]}"