Skip to content

Commit 96f9683

Browse files
committed
fix(startup): stabilize splash behavior across launch modes
- close parent JVM splash before Linux XIM relaunch to avoid persistent splash during gradle run\n- fix jpackage splash path to match actual app-image layout (APPDIR/../...)\n- disable jpackage splash injection on macOS to avoid codesign failures with --app-content
1 parent 4d82f5d commit 96f9683

2 files changed

Lines changed: 24 additions & 7 deletions

File tree

build.gradle.kts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,11 @@ val jpackageExecutable = packagingJavaHome.map { javaHome ->
177177
val startupSplashImage = file("src/main/resources/images/startup-splash-primer-dark.png")
178178
val startupSplashEnabled = startupSplashImage.exists()
179179
val startupSplashJvmOption = "-splash:${startupSplashImage.absolutePath}"
180-
val startupSplashPackagedJvmOption = "-splash:\$APPDIR/${startupSplashImage.name}"
180+
// jpackage launcher resolves $APPDIR to the jars folder (lib/app on Linux app-image).
181+
// `--app-content` currently lands in lib/, so splash path is one directory above $APPDIR.
182+
val startupSplashPackagedJvmOption = "-splash:\$APPDIR/../${startupSplashImage.name}"
183+
// macOS jpackage can fail codesign when additional app content is injected via --app-content.
184+
val startupSplashJpackageEnabled = startupSplashEnabled && hostOs != "macos"
181185

182186
/*
183187
* Per-platform icon resolution for jpackage.
@@ -403,8 +407,8 @@ tasks.register<Exec>("jpackageCurrentPlatform") {
403407
inputs.property("jpackageAppName", jpackageAppName)
404408
inputs.property("jpackageAppVersion", jpackageAppVersion)
405409
inputs.property("jpackageIconPath", jpackageIcon.absolutePath)
406-
inputs.property("startupSplashEnabled", startupSplashEnabled)
407-
if (startupSplashEnabled) {
410+
inputs.property("startupSplashJpackageEnabled", startupSplashJpackageEnabled)
411+
if (startupSplashJpackageEnabled) {
408412
inputs.file(startupSplashImage)
409413
inputs.property("startupSplashPackagedJvmOption", startupSplashPackagedJvmOption)
410414
}
@@ -433,7 +437,7 @@ tasks.register<Exec>("jpackageCurrentPlatform") {
433437
"--java-options", Meta.nativeAccessOption
434438
)
435439

436-
if (startupSplashEnabled) {
440+
if (startupSplashJpackageEnabled) {
437441
args("--app-content", startupSplashImage.absolutePath)
438442
args("--java-options", startupSplashPackagedJvmOption)
439443
}
@@ -472,8 +476,8 @@ if (hostOs == "windows") {
472476
inputs.property("jpackageAppName", jpackageAppName)
473477
inputs.property("jpackageAppVersion", jpackageAppVersion)
474478
inputs.property("jpackageIconPath", jpackageIcon.absolutePath)
475-
inputs.property("startupSplashEnabled", startupSplashEnabled)
476-
if (startupSplashEnabled) {
479+
inputs.property("startupSplashJpackageEnabled", startupSplashJpackageEnabled)
480+
if (startupSplashJpackageEnabled) {
477481
inputs.file(startupSplashImage)
478482
inputs.property("startupSplashPackagedJvmOption", startupSplashPackagedJvmOption)
479483
}
@@ -502,7 +506,7 @@ if (hostOs == "windows") {
502506
"--java-options", Meta.nativeAccessOption
503507
)
504508

505-
if (startupSplashEnabled) {
509+
if (startupSplashJpackageEnabled) {
506510
args("--app-content", startupSplashImage.absolutePath)
507511
args("--java-options", startupSplashPackagedJvmOption)
508512
}

src/main/java/fr/inria/corese/gui/core/bootstrap/LinuxInputMethodBootstrap.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.inria.corese.gui.core.bootstrap;
22

3+
import java.awt.SplashScreen;
34
import java.io.File;
45
import java.io.IOException;
56
import java.lang.management.ManagementFactory;
@@ -72,6 +73,7 @@ public static void relaunchWithXimIfNeeded(String[] args) {
7273
pb.inheritIO();
7374

7475
try {
76+
closeNativeSplashIfPresent();
7577
Process child = pb.start();
7678
int exitCode = child.waitFor();
7779
System.exit(exitCode);
@@ -136,4 +138,15 @@ private static String extractEntryPointFromSunCommand() {
136138
int spaceIdx = trimmed.indexOf(' ');
137139
return spaceIdx < 0 ? trimmed : trimmed.substring(0, spaceIdx);
138140
}
141+
142+
private static void closeNativeSplashIfPresent() {
143+
try {
144+
SplashScreen splash = SplashScreen.getSplashScreen();
145+
if (splash != null) {
146+
splash.close();
147+
}
148+
} catch (UnsupportedOperationException _) {
149+
// No native splash active.
150+
}
151+
}
139152
}

0 commit comments

Comments
 (0)