JAL-3631 New Installer icons. Getdown check that the application appdir is different...
authorBen Soares <b.soares@dundee.ac.uk>
Thu, 13 Jun 2024 20:20:06 +0000 (21:20 +0100)
committerBen Soares <b.soares@dundee.ac.uk>
Thu, 13 Jun 2024 20:20:06 +0000 (21:20 +0100)
33 files changed:
build.gradle
getdown/lib/getdown-core.jar
getdown/lib/getdown-launcher-local.jar
getdown/lib/getdown-launcher.jar
getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/Application.java
getdown/src/getdown/core/src/main/java/com/threerings/getdown/data/EnvConfig.java
gradle.properties
j11lib/getdown-core.jar
j8lib/getdown-core.jar
resources/lang/Messages.properties
resources/lang/Messages_es.properties
utils/channels/default/channel_gradle.properties
utils/channels/default/images/jalview_installer.icns [new file with mode: 0644]
utils/channels/default/images/jalview_installer.ico [new file with mode: 0644]
utils/channels/default/images/jalview_installer.png [new file with mode: 0644]
utils/channels/develop-SUFFIX/channel_gradle.properties
utils/channels/develop-SUFFIX/images/jalview_develop_installer.icns [new file with mode: 0644]
utils/channels/develop-SUFFIX/images/jalview_develop_installer.ico [new file with mode: 0644]
utils/channels/develop-SUFFIX/images/jalview_develop_installer.png [new file with mode: 0644]
utils/channels/develop/channel_gradle.properties
utils/channels/develop/images/jalview_develop_installer.icns [new file with mode: 0644]
utils/channels/develop/images/jalview_develop_installer.ico [new file with mode: 0644]
utils/channels/develop/images/jalview_develop_installer.png [new file with mode: 0644]
utils/channels/develop/images/jalview_develop_logo.icns
utils/channels/release/channel_gradle.properties
utils/channels/release/images/jalview_installer.icns [new file with mode: 0644]
utils/channels/release/images/jalview_installer.ico [new file with mode: 0644]
utils/channels/release/images/jalview_installer.png [new file with mode: 0644]
utils/channels/test-release/channel_gradle.properties
utils/channels/test-release/images/jalview_installer.icns [new file with mode: 0644]
utils/channels/test-release/images/jalview_installer.ico [new file with mode: 0644]
utils/channels/test-release/images/jalview_installer.png [new file with mode: 0644]
utils/install4j/install4j10_template.install4j

index 7a14a67..52ab39f 100644 (file)
@@ -3004,6 +3004,9 @@ task installerFiles(type: com.install4j.gradle.Install4jTask) {
     'MACOSARCHIVE_X64_DMG_FILENAME': install4jmacOSArchiveX64DMGFilename,
     'MACOSARCHIVE_AARCH64_DMG_FILENAME': install4jmacOSArchiveAarch64DMGFilename,
     'MACOSARCHIVE_VOLUMEICON': install4jDMGVolumeIcon,
+    'INSTALLER_ICON': "${install4j_images_dir}/${install4j_installer_icon}",
+    'INSTALLER_MAC_ICON': "${install4j_images_dir}/${install4j_installer_mac_icon}",
+    'INSTALLER_WINDOWS_ICON': "${install4j_images_dir}/${install4j_installer_windows_icon}",
   ]
 
   def varNameMap = [
index 6c20166..9b85916 100644 (file)
Binary files a/getdown/lib/getdown-core.jar and b/getdown/lib/getdown-core.jar differ
index 02d1a13..de59d8c 100644 (file)
Binary files a/getdown/lib/getdown-launcher-local.jar and b/getdown/lib/getdown-launcher-local.jar differ
index 7862c28..8edc9c5 100644 (file)
Binary files a/getdown/lib/getdown-launcher.jar and b/getdown/lib/getdown-launcher.jar differ
index 52876f0..7819ea6 100644 (file)
@@ -1086,8 +1086,10 @@ public class Application
            log.info("Not setting proxy");
        }
 
-        // add the getdowninstanceappbase property.  getdownappdir is added by getdown.txt
+        // add the getdowninstanceappbase property.
         args.add("-Dgetdowninstanceappbase=" + getAppbase().toString());
+        args.add("-Dinstaller.appdir=" + System.getProperty("installer.appdir"));
+        args.add("-Dgetdownappdir=" + getAppDir());
 
         // add the marker indicating the app is running in getdown
         args.add("-D" + Properties.GETDOWN + "=true");
@@ -2074,6 +2076,16 @@ public class Application
       }
       File applicationAppDir = new File(applicationAppDirName);
       File userAppDir = new File(userAppDirName);
+      try {
+        if (applicationAppDir.getCanonicalPath().equals(userAppDir.getCanonicalPath())) {
+          // the application appdir is the user appdir, better not touch it, it should just work!
+          log.info("Application appdir is same as user appdir, not doing anything", applicationAppDir);
+          return true;
+        }
+      } catch (IOException e) {
+        log.warning("Problem determining canonical paths of application and user appdirs", applicationAppDir, userAppDir);
+        return false;
+      }
       if (!userAppDir.exists()) {
         userAppDir.mkdirs();
       }
@@ -2117,8 +2129,9 @@ public class Application
         log.warning("Problem opening application digest files", new File(applicationAppDir, Digest.digestFile(Digest.VERSION)));
         return false;
       }
-      // copy getdown.txt, digest.txt and digest2.txt
-      for (File from: new File[] {configFile, digest2.getFile(), digest.getFile()}) {
+      // copy getdown.txt, digest.txt and digest2.txt, getdown-launcher.jar
+      File getdownLauncher = new File(applicationAppDir, "getdown-launcher.jar");
+      for (File from: new File[] {configFile, digest2.getFile(), digest.getFile(), getdownLauncher}) {
         try {
           File to = new File(userAppDir, from.getName());
           Files.copy(from.toPath(), to.toPath());
index 6f99851..07d29ec 100644 (file)
@@ -60,9 +60,12 @@ public final class EnvConfig {
     public static EnvConfig create (String[] argv, List<Note> notes) {
         System.out.println("##### out Starting EnvConfig.create()");
         System.err.println("##### err Starting EnvConfig.create()");
-        String appDir = null, appDirProv = null;
-        String appId = null, appIdProv = null;
-        String appBase = null, appBaseProv = null;
+        String appDir = null;
+        String appDirProv = null;
+        String appId = null;
+        String appIdProv = null;
+        String appBase = null;
+        String appBaseProv = null;
         applicationFolder = System.getProperty("installer.application_folder");
         installerAppdir = System.getProperty("installer.appdir");
         appName = System.getProperty("channel.app_name");
@@ -303,7 +306,7 @@ public final class EnvConfig {
     
     private static final String USE_DEFAULT_APPDIR_PROPERTY = "usedefaultappdir";
     
-    private static final String APPLICATION_APPDIR_PROPERTY = "applicationappdir";
+    private static final String APPLICATION_APPDIR_PROPERTY = "installer.appdir";
     
     private static final String POPULATE_DEFAULT_APPDIR_PROPERTY= "populatedefaultappdir";
 }
index 8891190..448cbdd 100644 (file)
@@ -156,6 +156,9 @@ install4j_dmg_background_filename = background.png
 install4j_dmg_ds_store = jalview_dmg_DS_Store
 install4j_dmg_ds_store_json = jalview_dmg_DS_Store.json
 install4j_dmg_volume_icon = jalview-VolumeIcon.icns
+install4j_installer_icon = jalview_installer.png
+install4j_installer_mac_icon = jalview_installer.icns
+install4j_installer_windows_icon = jalview_installer.ico
 jalview_customise_ds_store = utils/macos_dmg/jalview_customise_dsstore.py
 
 
index 6c20166..9b85916 100644 (file)
Binary files a/j11lib/getdown-core.jar and b/j11lib/getdown-core.jar differ
index 6c20166..9b85916 100644 (file)
Binary files a/j8lib/getdown-core.jar and b/j8lib/getdown-core.jar differ
index 293f612..7af6c7f 100644 (file)
@@ -1484,3 +1484,5 @@ warning.using_old_command_line_arguments = It looks like you are using old comma
 warning.using_mixed_command_line_arguments = Jalview cannot use both old (-arg) and new (--arg) command line arguments.  Please check your command line arguments.\ne.g. {0} and {1}
 warning.the_following_errors = The following errors and warnings occurred whilst processing files:
 action.show_hetatm = Show Ligands (HETATM)
+warning.running_from_installer_volume_title = Running from Installer
+warning.running_from_installer_volume_message = You appear to be launching {0} from the Installer volume.\nPlease drag and drop the "{0}" icon into the Applications folder or your user Applications folder, and launch from there.
index 4936d33..a8ac583 100644 (file)
@@ -1448,3 +1448,5 @@ label.command_line_arguments = Argumentos de l
 warning.using_old_command_line_arguments = Parece que estás utilizando argumentos antiguos de línea de comando. Estos ahora están en desuso y se eliminarán en una versión futura de Jalview.\nObtenga más información sobre los nuevos argumentos de la línea de comando en\n
 warning.using_mixed_command_line_arguments = Jalview no puede utilizar argumentos de línea de comando antiguos (-arg) y nuevos (--arg). Verifique los argumentos de su línea de comando.\ne.g. {0} y {1}
 warning.the_following_errors = Se produjeron los siguientes errores y advertencias al procesar archivos:
+warning.running_from_installer_volume_title = Ejecutando desde el instalador
+warning.running_from_installer_volume_message = Parece que está iniciando {0} desde el Volumen del instalador.\nArrastre y suelte el ícono "{0}" en la carpeta Aplicaciones o en la carpeta Aplicaciones de su usuario e inícielo desde allí.
index 2b698ba..cfb5ab0 100644 (file)
@@ -20,6 +20,9 @@ install4j_background = jalview_logo_background_fade-640x480.png
 install4j_dmg_background = jalview_default_dmg_background-72dpi.png
 install4j_dmg_ds_store = jalview_default_dmg_DS_Store
 install4j_dmg_ds_store_json = jalview_default_dmg_DS_Store.json
+install4j_installer_icon = jalview_installer.png
+install4j_installer_mac_icon = jalview_installer.icns
+install4j_installer_windows_icon = jalview_installer.ico
 
 getdown_background_image_text_font = utils/fonts/Roboto.ttf
 getdown_background_image_text_colour = #b4b4b4
diff --git a/utils/channels/default/images/jalview_installer.icns b/utils/channels/default/images/jalview_installer.icns
new file mode 100644 (file)
index 0000000..f1588b4
Binary files /dev/null and b/utils/channels/default/images/jalview_installer.icns differ
diff --git a/utils/channels/default/images/jalview_installer.ico b/utils/channels/default/images/jalview_installer.ico
new file mode 100644 (file)
index 0000000..69687f2
Binary files /dev/null and b/utils/channels/default/images/jalview_installer.ico differ
diff --git a/utils/channels/default/images/jalview_installer.png b/utils/channels/default/images/jalview_installer.png
new file mode 100644 (file)
index 0000000..231137e
Binary files /dev/null and b/utils/channels/default/images/jalview_installer.png differ
index 84e84bf..b39dc99 100644 (file)
@@ -32,6 +32,9 @@ install4j_dmg_background = jalview_develop_dmg_background-72dpi.png
 install4j_dmg_ds_store = jalview_develop_dmg_DS_Store
 install4j_dmg_ds_store_json = jalview_develop_dmg_DS_Store.json
 install4j_dmg_volume_icon = jalview_develop-VolumeIcon.icns
+install4j_installer_icon = jalview_develop_installer.png
+install4j_installer_mac_icon = jalview_develop_installer.icns
+install4j_installer_windows_icon = jalview_develop_installer.ico
 
 getdown_background_image_text_font = utils/fonts/Roboto.ttf
 getdown_background_image_text_colour = #b4b4b4
diff --git a/utils/channels/develop-SUFFIX/images/jalview_develop_installer.icns b/utils/channels/develop-SUFFIX/images/jalview_develop_installer.icns
new file mode 100644 (file)
index 0000000..4e61d8a
Binary files /dev/null and b/utils/channels/develop-SUFFIX/images/jalview_develop_installer.icns differ
diff --git a/utils/channels/develop-SUFFIX/images/jalview_develop_installer.ico b/utils/channels/develop-SUFFIX/images/jalview_develop_installer.ico
new file mode 100644 (file)
index 0000000..cbdee6f
Binary files /dev/null and b/utils/channels/develop-SUFFIX/images/jalview_develop_installer.ico differ
diff --git a/utils/channels/develop-SUFFIX/images/jalview_develop_installer.png b/utils/channels/develop-SUFFIX/images/jalview_develop_installer.png
new file mode 100644 (file)
index 0000000..99b15da
Binary files /dev/null and b/utils/channels/develop-SUFFIX/images/jalview_develop_installer.png differ
index 80e64d1..2c152d0 100644 (file)
@@ -32,6 +32,9 @@ install4j_dmg_background = jalview_develop_dmg_background-72dpi.png
 install4j_dmg_ds_store = jalview_develop_dmg_DS_Store
 install4j_dmg_ds_store_json = jalview_develop_dmg_DS_Store.json
 install4j_dmg_volume_icon = jalview_develop-VolumeIcon.icns
+install4j_installer_icon = jalview_develop_installer.png
+install4j_installer_mac_icon = jalview_develop_installer.icns
+install4j_installer_windows_icon = jalview_develop_installer.ico
 
 getdown_background_image_text_font = utils/fonts/Roboto.ttf
 getdown_background_image_text_colour = #b4b4b4
diff --git a/utils/channels/develop/images/jalview_develop_installer.icns b/utils/channels/develop/images/jalview_develop_installer.icns
new file mode 100644 (file)
index 0000000..4e61d8a
Binary files /dev/null and b/utils/channels/develop/images/jalview_develop_installer.icns differ
diff --git a/utils/channels/develop/images/jalview_develop_installer.ico b/utils/channels/develop/images/jalview_develop_installer.ico
new file mode 100644 (file)
index 0000000..cbdee6f
Binary files /dev/null and b/utils/channels/develop/images/jalview_develop_installer.ico differ
diff --git a/utils/channels/develop/images/jalview_develop_installer.png b/utils/channels/develop/images/jalview_develop_installer.png
new file mode 100644 (file)
index 0000000..99b15da
Binary files /dev/null and b/utils/channels/develop/images/jalview_develop_installer.png differ
index ceab689..42e8429 100644 (file)
Binary files a/utils/channels/develop/images/jalview_develop_logo.icns and b/utils/channels/develop/images/jalview_develop_logo.icns differ
index d5baac1..27fc1a4 100644 (file)
@@ -21,6 +21,9 @@ install4j_dmg_background = jalview_dmg_background-72dpi.png
 install4j_dmg_ds_store = jalview_dmg_DS_Store
 install4j_dmg_ds_store_json = jalview_dmg_DS_Store.json
 install4j_dmg_volume_icon = jalview-VolumeIcon.icns
+install4j_installer_icon = jalview_installer.png
+install4j_installer_mac_icon = jalview_installer.icns
+install4j_installer_windows_icon = jalview_installer.ico
 
 getdown_background_image_text_font = utils/fonts/Roboto.ttf
 getdown_background_image_text_colour = #b4b4b4
diff --git a/utils/channels/release/images/jalview_installer.icns b/utils/channels/release/images/jalview_installer.icns
new file mode 100644 (file)
index 0000000..f1588b4
Binary files /dev/null and b/utils/channels/release/images/jalview_installer.icns differ
diff --git a/utils/channels/release/images/jalview_installer.ico b/utils/channels/release/images/jalview_installer.ico
new file mode 100644 (file)
index 0000000..69687f2
Binary files /dev/null and b/utils/channels/release/images/jalview_installer.ico differ
diff --git a/utils/channels/release/images/jalview_installer.png b/utils/channels/release/images/jalview_installer.png
new file mode 100644 (file)
index 0000000..231137e
Binary files /dev/null and b/utils/channels/release/images/jalview_installer.png differ
index a7d18cb..f0c8e2a 100644 (file)
@@ -21,6 +21,9 @@ install4j_dmg_background = jalview_test-release_dmg_background-72dpi.png
 install4j_dmg_ds_store = jalview_test-release_dmg_DS_Store
 install4j_dmg_ds_store_json = jalview_test-release_dmg_DS_Store.json
 install4j_dmg_volume_icon = jalview_test-release-VolumeIcon.icns
+install4j_installer_icon = jalview_installer.png
+install4j_installer_mac_icon = jalview_installer.icns
+install4j_installer_windows_icon = jalview_installer.ico
 
 getdown_background_image_text_font = utils/fonts/Roboto.ttf
 getdown_background_image_text_colour = #b4b4b4
diff --git a/utils/channels/test-release/images/jalview_installer.icns b/utils/channels/test-release/images/jalview_installer.icns
new file mode 100644 (file)
index 0000000..f1588b4
Binary files /dev/null and b/utils/channels/test-release/images/jalview_installer.icns differ
diff --git a/utils/channels/test-release/images/jalview_installer.ico b/utils/channels/test-release/images/jalview_installer.ico
new file mode 100644 (file)
index 0000000..69687f2
Binary files /dev/null and b/utils/channels/test-release/images/jalview_installer.ico differ
diff --git a/utils/channels/test-release/images/jalview_installer.png b/utils/channels/test-release/images/jalview_installer.png
new file mode 100644 (file)
index 0000000..231137e
Binary files /dev/null and b/utils/channels/test-release/images/jalview_installer.png differ
index 3a33039..08d9b1c 100644 (file)
@@ -72,6 +72,9 @@
       <variable name="WIZARD_HEIGHT" value="480" description="Default/initial width of installer wizard window.  Linux media types adapt this.&#xA;NOT USED" />
       <variable name="MACOSARCHIVE_X64_DMG_FILENAME" value="${compiler:APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-${compiler:sys.platform}-x64-java_${compiler:JAVA_INTEGER_VERSION}" />
       <variable name="MACOSARCHIVE_AARCH64_DMG_FILENAME" value="${compiler:APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-${compiler:sys.platform}-aarch64-java_${compiler:JAVA_INTEGER_VERSION}" />
+      <variable name="INSTALLER_ICON" value="jalview_installer.png" />
+      <variable name="INSTALLER_MAC_ICON" value="jalview_installer.icns" />
+      <variable name="INSTALLER_WINDOWS_ICON" value="jalview_installer.ico" />
     </variables>
     <codeSigning macEnabled="true" macPkcs12File="${compiler:OSX_KEYSTORE}" macNotarize="true" appleId="${compiler:OSX_APPLEID}">
       <macAdditionalBinaries>
           <versionLine x="85" y="109" text="version ${compiler:sys.version}" />
         </text>
       </splashScreen>
-      <java mainClass="com.threerings.getdown.launcher.GetdownApp" vmParameters="-Dinstaller_template_version=${compiler:INSTALLER_TEMPLATE_VERSION} -Dchannel.app_name=&quot;${compiler:JALVIEW_APPLICATION_NAME}&quot; -Dinstaller_appdir=&quot;${launcher:sys.launcherDirectory}&quot; -Dinstaller.application_folder=&quot;${compiler:APPLICATION_FOLDER}&quot;" arguments="&quot;${launcher:sys.launcherDirectory}&quot; jalview">
+      <java mainClass="com.threerings.getdown.launcher.GetdownApp" vmParameters="-Dinstaller.template_version=${compiler:INSTALLER_TEMPLATE_VERSION} -Dchannel.app_name=&quot;${compiler:JALVIEW_APPLICATION_NAME}&quot; -Dinstaller.appdir=&quot;${launcher:sys.launcherDirectory}&quot; -Dinstaller.application_folder=&quot;${compiler:APPLICATION_FOLDER}&quot;" arguments="&quot;${launcher:sys.launcherDirectory}&quot; jalview">
         <classPath>
           <archive location="getdown-launcher.jar" />
           <archive location="${compiler:GETDOWN_INSTALL_DIR}/getdown-launcher.jar" failOnError="false" />
         <urlHandler scheme="${compiler:EXTRA_SCHEME}" />
       </macStaticAssociations>
     </launcher>
-    <launcher name="Jalview User Launcher" id="2823" menuName="${compiler:JALVIEW_APPLICATION_NAME}" icnsFile="${compiler:JALVIEW_DIR}/${compiler:MAC_ICONS_FILE}" customMacBundleIdentifier="true" macBundleIdentifier="${compiler:BUNDLE_ID}" fileset="734" useCustomMacosExecutableName="true" customMacosExecutableName="${compiler:JALVIEW_APPLICATION_NAME}">
-      <executable name="${compiler:USER_EXECUTABLE_NAME}" iconSet="true" iconFile="${compiler:JALVIEW_DIR}/${compiler:WINDOWS_ICONS_FILE}" redirectStdout="true" executableMode="gui" changeWorkingDirectory="false" singleInstance="true" checkConsoleParameter="true">
+    <launcher name="Jalview User Launcher" id="2823" menuName="${compiler:JALVIEW_APPLICATION_NAME}" icnsFile="${compiler:JALVIEW_DIR}/${compiler:MAC_ICONS_FILE}" customMacBundleIdentifier="true" macBundleIdentifier="${compiler:BUNDLE_ID}" fileset="734" addMacApplicationCategory="true" macApplicationCategory="public.app-category.education" useCustomMacosExecutableName="true" customMacosExecutableName="${compiler:JALVIEW_APPLICATION_NAME}">
+      <executable name="${compiler:USER_EXECUTABLE_NAME}" iconSet="true" iconFile="${compiler:JALVIEW_DIR}/${compiler:WINDOWS_ICONS_FILE}" redirectStdout="true" executableMode="gui" changeWorkingDirectory="false" singleInstance="true" executionLevel="highestAvailable" checkConsoleParameter="true">
         <versionInfo include="true" fileDescription="${compiler:sys.fullName}" legalCopyright="${compiler:COPYRIGHT_MESSAGE}" internalName="${compiler:INTERNAL_ID}" productName="${compiler:sys.fullName}" />
       </executable>
       <splashScreen width="640" height="480" bitmapFile="${compiler:JALVIEW_DIR}/${compiler:BACKGROUND}" textOverlay="true">
           <versionLine x="85" y="109" text="version ${compiler:sys.version}" />
         </text>
       </splashScreen>
-      <java mainClass="com.threerings.getdown.launcher.GetdownApp" vmParameters="-Dusedefaultappdir=true -Dpopulatedefaultappdir=true -Dapplicationappdir=&quot;${launcher:sys.launcherDirectory}&quot; -Dappid=jalview -Dinstaller_template_version=${compiler:INSTALLER_TEMPLATE_VERSION} -Dchannel.app_name=&quot;${compiler:JALVIEW_APPLICATION_NAME}&quot; -Dinstaller_appdir=&quot;${launcher:sys.launcherDirectory}&quot; -Dinstaller.application_folder=&quot;${compiler:APPLICATION_FOLDER}&quot;">
+      <java mainClass="com.threerings.getdown.launcher.GetdownApp" vmParameters="-Dusedefaultappdir=true -Dpopulatedefaultappdir=true -Dappid=jalview -Dinstaller.template_version=${compiler:INSTALLER_TEMPLATE_VERSION} -Dinstaller.appdir=&quot;${launcher:sys.launcherDirectory}&quot; -Dinstaller.application_folder=&quot;${compiler:APPLICATION_FOLDER}&quot; -Dchannel.app_name=&quot;${compiler:JALVIEW_APPLICATION_NAME}&quot;">
         <classPath>
           <archive location="getdown-launcher.jar" failOnError="false" />
           <archive location="${compiler:GETDOWN_INSTALL_DIR}/getdown-launcher.jar" failOnError="false" />
   </launchers>
   <installerGui autoUpdateDescriptorUrl="https://www.jalview.org/install4j/updates.xml">
     <applications>
-      <application id="installer" beanClass="com.install4j.runtime.beans.applications.InstallerApplication" styleId="35" customIcnsFile="${compiler:JALVIEW_DIR}/${compiler:MAC_ICONS_FILE}" customIcoFile="${compiler:JALVIEW_DIR}/${compiler:WINDOWS_ICONS_FILE}">
+      <application id="installer" beanClass="com.install4j.runtime.beans.applications.InstallerApplication" styleId="35" customIcnsFile="${compiler:JALVIEW_DIR}/${compiler:INSTALLER_MAC_ICON}" customIcoFile="${compiler:JALVIEW_DIR}/${compiler:INSTALLER_WINDOWS_ICON}">
         <serializedBean>
-          <property name="frameHeight" type="int" value="480" />
-          <property name="frameWidth" type="int" value="640" />
+          <property name="frameHeight" type="int" value="600" />
+          <property name="frameWidth" type="int" value="800" />
           <property name="useCustomIcon" type="boolean" value="true" />
+          <property name="windowsConsoleExecutable" type="boolean" value="true" />
         </serializedBean>
         <styleOverrides>
           <styleOverride name="Customize banner image" enabled="true">
               </externalParametrizationPropertyNames>
             </formComponent>
           </styleOverride>
+          <styleOverride name="Customize title bar" enabled="true">
+            <group id="2831" beanClass="com.install4j.runtime.beans.groups.VerticalFormComponentGroup" useExternalParametrization="true" externalParametrizationName="Customize title bar" externalParametrizationMode="include">
+              <serializedBean>
+                <property name="backgroundColor">
+                  <object class="com.install4j.runtime.beans.LightOrDarkColor">
+                    <object class="java.awt.Color">
+                      <int>255</int>
+                      <int>255</int>
+                      <int>255</int>
+                      <int>255</int>
+                    </object>
+                    <object class="java.awt.Color">
+                      <int>49</int>
+                      <int>52</int>
+                      <int>53</int>
+                      <int>255</int>
+                    </object>
+                  </object>
+                </property>
+                <property name="borderSides">
+                  <object class="com.install4j.runtime.beans.formcomponents.BorderSides">
+                    <property name="bottom" type="boolean" value="true" />
+                  </object>
+                </property>
+                <property name="imageAnchor" type="enum" class="com.install4j.api.beans.Anchor" value="NORTHEAST" />
+                <property name="imageEdgeBorderWidth" type="int" value="2" />
+                <property name="imageFile">
+                  <object class="com.install4j.api.beans.ExternalFile">
+                    <string>icon:${installer:sys.installerApplicationMode}_header.png</string>
+                  </object>
+                </property>
+                <property name="imageInsets">
+                  <object class="java.awt.Insets">
+                    <int>0</int>
+                    <int>5</int>
+                    <int>1</int>
+                    <int>1</int>
+                  </object>
+                </property>
+                <property name="insets">
+                  <object class="java.awt.Insets">
+                    <int>0</int>
+                    <int>20</int>
+                    <int>0</int>
+                    <int>10</int>
+                  </object>
+                </property>
+              </serializedBean>
+              <externalParametrizationPropertyNames>
+                <propertyName>backgroundColor</propertyName>
+                <propertyName>foregroundColor</propertyName>
+                <propertyName>imageAnchor</propertyName>
+                <propertyName>imageFile</propertyName>
+                <propertyName>imageOverlap</propertyName>
+              </externalParametrizationPropertyNames>
+            </group>
+          </styleOverride>
         </styleOverrides>
+        <infoPlist>${compiler:file("${compiler:INFO_PLIST_FILE_ASSOCIATIONS_FILE}")}</infoPlist>
         <startup>
           <screen id="1" beanClass="com.install4j.runtime.beans.screens.StartupScreen" rollbackBarrierExitCode="0">
             <actions>
               <action id="22" beanClass="com.install4j.runtime.beans.actions.misc.RequestPrivilegesAction" actionElevationType="none" rollbackBarrierExitCode="0">
                 <serializedBean>
+                  <property name="failIfNotObtainedMac" type="boolean" value="false" />
+                  <property name="failIfNotObtainedWin" type="boolean" value="false" />
+                  <property name="linuxPrivilegeRequirement" type="enum" class="com.install4j.runtime.beans.actions.misc.PrivilegeRequirement" value="OBTAIN" />
                   <property name="obtainIfAdminWin" type="boolean" value="false" />
                 </serializedBean>
               </action>
@@ -742,7 +807,7 @@ return console.askOkCancel(message, true);
                 </serializedBean>
                 <condition>context.getBooleanVariable("addToDockAction")</condition>
               </action>
-              <action name="Linux/Unix symlink" id="2733" beanClass="com.install4j.runtime.beans.actions.files.CreateSymlinkAction" rollbackBarrierExitCode="0" errorMessage="Could not make symlink to wrapper script">
+              <action name="Linux/Unix user symlink" id="2733" beanClass="com.install4j.runtime.beans.actions.files.CreateSymlinkAction" rollbackBarrierExitCode="0" errorMessage="Could not make symlink to wrapper script">
                 <serializedBean>
                   <property name="file">
                     <object class="java.io.File">
@@ -765,7 +830,7 @@ return console.askOkCancel(message, true);
                 </serializedBean>
                 <condition>context.getBooleanVariable("appendToPathAction")</condition>
               </action>
-              <action name="Create Linux/Unix symbolic link to jalview.sh in user's local bin" id="2739" beanClass="com.install4j.runtime.beans.actions.files.CreateSymlinkAction" rollbackBarrierExitCode="0" errorMessage="Could not make a ${compiler:WRAPPER_LINK} symbolic link in ~/${installer:unixUserBinDir}">
+              <action name="Create Linux/Unix user symbolic link to jalview.sh in user's local bin" id="2739" beanClass="com.install4j.runtime.beans.actions.files.CreateSymlinkAction" rollbackBarrierExitCode="0" errorMessage="Could not make a ${compiler:WRAPPER_LINK} symbolic link in ~/${installer:unixUserBinDir}">
                 <serializedBean>
                   <property name="file">
                     <object class="java.io.File">
@@ -778,7 +843,7 @@ return console.askOkCancel(message, true);
                     </object>
                   </property>
                 </serializedBean>
-                <condition>context.getBooleanVariable("makeSymbolicLinkAction") &amp;&amp; ( Util.isLinux() || Util.isUnixInstaller() ) &amp;&amp; ( context.getVariable("unixUserBinDir") != null )</condition>
+                <condition>context.getBooleanVariable("makeUserSymbolicLinkAction") &amp;&amp; ( Util.isLinux() || Util.isUnixInstaller() ) &amp;&amp; ( context.getVariable("unixUserBinDir") != null )</condition>
               </action>
               <action name="Create macOS symbolic link to jalview in user's local bin" id="2743" beanClass="com.install4j.runtime.beans.actions.files.CreateSymlinkAction" rollbackBarrierExitCode="0" errorMessage="Could not make a ${compiler:WRAPPER_LINK} symbolic link in ~/${installer:unixUserBinDir}">
                 <serializedBean>
@@ -793,7 +858,7 @@ return console.askOkCancel(message, true);
                     </object>
                   </property>
                 </serializedBean>
-                <condition>context.getBooleanVariable("makeSymbolicLinkAction") &amp;&amp; Util.isMacOS() &amp;&amp; ( context.getVariable("unixUserBinDir") != null ) &amp;&amp; ( context.getVariable("macWrapperLinkLocation") != null )</condition>
+                <condition>context.getBooleanVariable("makeUserSymbolicLinkAction") &amp;&amp; Util.isMacOS() &amp;&amp; ( context.getVariable("unixUserBinDir") != null ) &amp;&amp; ( context.getVariable("macWrapperLinkLocation") != null )</condition>
               </action>
               <action name="Windows copy BAT file" id="2817" beanClass="com.install4j.runtime.beans.actions.files.CopyFileAction" rollbackBarrierExitCode="0">
                 <serializedBean>
@@ -864,7 +929,7 @@ return console.askOkCancel(message, true);
                 <serializedBean>
                   <property name="checkboxText" type="string">Make a ${compiler:WRAPPER_LINK} symbolic link in ${installer:unixUserBinDir}</property>
                   <property name="initiallySelected" type="boolean" value="true" />
-                  <property name="variableName" type="string">makeSymbolicLinkAction</property>
+                  <property name="variableName" type="string">makeUserSymbolicLinkAction</property>
                 </serializedBean>
                 <visibilityScript>( Util.isLinux() || Util.isUnixInstaller() || ( Util.isMacOS() &amp;&amp; ( context.getVariable("macWrapperLinkLocation") != null ) ) ) &amp;&amp; ( context.getVariable("unixUserBinDir") != null )</visibilityScript>
               </formComponent>
@@ -1255,9 +1320,17 @@ return console.askYesNo(message, true);
                 <serializedBean>
                   <property name="checkboxText" type="string">Make a ${compiler:WRAPPER_LINK} symbolic link in ${installer:unixUserBinDir}</property>
                   <property name="initiallySelected" type="boolean" value="true" />
-                  <property name="variableName" type="string">makeSymbolicLinkAction</property>
+                  <property name="variableName" type="string">makeUserSymbolicLinkAction</property>
                 </serializedBean>
-                <visibilityScript>( Util.isLinux() || Util.isUnixInstaller() || ( Util.isMacOS() &amp;&amp; ( context.getVariable("macWrapperLinkLocation") != null ) ) ) &amp;&amp; ( context.getVariable("unixUserBinDir") != null )</visibilityScript>
+                <visibilityScript>
+
+( Util.isLinux()
+  || Util.isUnixInstaller()
+  || ( Util.isMacOS()
+       &amp;&amp; context.getVariable("macWrapperLinkLocation") != null
+     )
+ )
+ &amp;&amp; context.getVariable("unixUserBinDir") != null</visibilityScript>
               </formComponent>
               <formComponent id="2780" beanClass="com.install4j.runtime.beans.formcomponents.MultilineLabelComponent">
                 <serializedBean>
@@ -1524,7 +1597,7 @@ ${compiler:JALVIEW_APPLICATION_NAME} will now launch.</property>
     </styles>
   </installerGui>
   <mediaSets>
-    <windows name="Windows x64 EXE Installer" id="743" customizedId="WINDOWS-X64-EXE" mediaFileName="${compiler:APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-${compiler:sys.platform}-java_${compiler:JAVA_INTEGER_VERSION}" installDir="${compiler:APPLICATION_FOLDER}" runPostProcessor="true" postProcessor="${compiler:JSIGN_SH} $EXECUTABLE" customInstallBaseDir="~/AppData/Local" architecture="64">
+    <windows name="Windows x64 EXE Installer" id="743" customizedId="WINDOWS-X64-EXE" mediaFileName="${compiler:APPLICATION_FOLDER}-${compiler:JALVIEW_VERSION}-${compiler:sys.platform}-java_${compiler:JAVA_INTEGER_VERSION}" installDir="${compiler:APPLICATION_FOLDER}" runPostProcessor="true" postProcessor="${compiler:JSIGN_SH} $EXECUTABLE" architecture="64">
       <excludedLaunchers>
         <launcher id="737" />
       </excludedLaunchers>
@@ -1539,6 +1612,9 @@ ${compiler:JALVIEW_APPLICATION_NAME} will now launch.</property>
       <jreBundle jreBundleSource="preCreated" includedJre="${compiler:WINDOWS_X64_JAVA_VM_TGZ}" manualJreEntry="true" />
     </windows>
     <macosArchive name="macOS (Intel) Disk Image" id="878" customizedId="MACOS-X64-DMG" mediaFileName="${compiler:MACOSARCHIVE_X64_DMG_FILENAME}" volumeName="${compiler:MACOSARCHIVE_X64_NAME}" launcherId="2823" setupAppId="2746">
+      <excludedBeans>
+        <bean refId="2746" />
+      </excludedBeans>
       <exclude>
         <entry defaultFileset="true" />
         <entry filesetId="2803" />
@@ -1557,6 +1633,9 @@ ${compiler:JALVIEW_APPLICATION_NAME} will now launch.</property>
       </topLevelFiles>
     </macosArchive>
     <macosArchive name="macOS (Apple Silicon) Disk Image" id="2796" customizedId="MACOS-AARCH64-DMG" mediaFileName="${compiler:MACOSARCHIVE_AARCH64_DMG_FILENAME}" volumeName="${compiler:MACOSARCHIVE_AARCH64_NAME}" architecture="aarch64" launcherId="2823" setupAppId="2746">
+      <excludedBeans>
+        <bean refId="2746" />
+      </excludedBeans>
       <exclude>
         <entry defaultFileset="true" />
         <entry filesetId="2801" />