M6: desktop app (tray, two-pane layout, shortcuts, inspector, jpackage)

This commit is contained in:
ARIA committed 2026-08-19 20:43:47 +02:00
1 parent 2ecfe1c05c
commit 0cc8b7aafe
12 files changed
+1312 -109

No files matched your search

+54
View File
@@ -18,10 +18,64 @@ val desktopTarget = when {
dependencies {
implementation(project(":shared"))
implementation("org.jetbrains.compose.desktop:desktop-jvm-$desktopTarget:$composeVersion")
// M6: window-state persistence (window.json).
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3")
}
compose.desktop {
application {
mainClass = "iris.desktop.MainKt"
}
}
// ── M6: native packaging (docs/11 §11.4) ─────────────────────────────────
// `./gradlew :desktopApp:jpackage` builds a self-contained app image under
// build/jpackage (JRE bundled). `./gradlew :desktopApp:jpackage
// -PjpackageType=deb` builds a .deb instead (needs dpkg-deb).
val jpackageInputDir = layout.buildDirectory.dir("jpackage-input")
val fatJar = tasks.register<Jar>("fatJar") {
archiveClassifier.set("all")
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
manifest { attributes("Main-Class" to "iris.desktop.MainKt") }
from(sourceSets.main.get().output)
from({
configurations.runtimeClasspath.get()
.filter { it.name.endsWith(".jar") }
.map { zipTree(it) }
}) {
exclude("META-INF/*.SF", "META-INF/*.DSA", "META-INF/*.RSA")
}
}
// Stage the fat jar into the jpackage input dir. A dedicated Sync task keeps
// the Exec task free of task references (configuration-cache compatible) and
// prunes stale jars from the input dir automatically.
tasks.register<Sync>("stageJpackageInput") {
dependsOn(fatJar)
from(fatJar)
into(jpackageInputDir)
}
tasks.register<Exec>("jpackage") {
dependsOn("stageJpackageInput")
val jpackageBin = file("${System.getProperty("java.home")}/bin/jpackage")
val type = (project.findProperty("jpackageType") as? String) ?: "app-image"
val inputDir = jpackageInputDir.get().asFile
val destDir = layout.buildDirectory.dir("jpackage").get().asFile
inputs.dir(inputDir)
outputs.dir(destDir)
commandLine(
if (jpackageBin.exists()) jpackageBin.absolutePath else "jpackage",
"--name", "iris",
"--app-version", "0.1.0",
"--vendor", "Iris",
"--type", type,
"--input", inputDir.absolutePath,
"--main-jar", "desktopApp-all.jar",
"--main-class", "iris.desktop.MainKt",
"--dest", destDir.absolutePath,
"--java-options", "-Xmx1g",
)
}