From a6715746d2537e715a08d4ca2a098e94d8d47f5c Mon Sep 17 00:00:00 2001 From: Ben Soares Date: Thu, 30 Nov 2023 12:51:54 +0000 Subject: [PATCH] JAL-4344 careful application of -Djava.awt.headless=true to avoid Jmol problem. Using -Dapple.awt.headless=true instead for macOS. Fixed in install and conda shell scripts and also in jalview.bin.Launcher. --- src/jalview/bin/Launcher.java | 100 ++++++++++++++++++++++++++++++++--------- utils/conda/jalview.sh | 33 +++++++++++--- utils/getdown/bin/jalview.sh | 27 +++++++++-- 3 files changed, 128 insertions(+), 32 deletions(-) diff --git a/src/jalview/bin/Launcher.java b/src/jalview/bin/Launcher.java index e1415be..507f501 100644 --- a/src/jalview/bin/Launcher.java +++ b/src/jalview/bin/Launcher.java @@ -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 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(); diff --git a/utils/conda/jalview.sh b/utils/conda/jalview.sh index 995195f..9ac2807 100755 --- a/utils/conda/jalview.sh +++ b/utils/conda/jalview.sh @@ -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[@]}" diff --git a/utils/getdown/bin/jalview.sh b/utils/getdown/bin/jalview.sh index 849d71a..90d1558 100755 --- a/utils/getdown/bin/jalview.sh +++ b/utils/getdown/bin/jalview.sh @@ -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[@]}" -- 1.7.10.2