diff --git a/apps/desktop/build.gradle.kts b/apps/desktop/build.gradle.kts index 295ce4aad7..250c3e33d1 100644 --- a/apps/desktop/build.gradle.kts +++ b/apps/desktop/build.gradle.kts @@ -74,6 +74,11 @@ compose.desktop { targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb) packageName = "Flipcash" packageVersion = "1.0.0" + // Rendered from the iOS app's Icon Composer file (code-ios-app Flipcash/Supporting Files/AppIcon.icon) + // with ictool, so all three desktop icons match the phone apps. + macOS { iconFile.set(project.file("icons/Flipcash.icns")) } + windows { iconFile.set(project.file("icons/Flipcash.ico")) } + linux { iconFile.set(project.file("icons/Flipcash.png")) } } } } diff --git a/apps/desktop/icons/Flipcash.icns b/apps/desktop/icons/Flipcash.icns new file mode 100644 index 0000000000..5b28f5c2db Binary files /dev/null and b/apps/desktop/icons/Flipcash.icns differ diff --git a/apps/desktop/icons/Flipcash.ico b/apps/desktop/icons/Flipcash.ico new file mode 100644 index 0000000000..e5c554c4cd Binary files /dev/null and b/apps/desktop/icons/Flipcash.ico differ diff --git a/apps/desktop/icons/Flipcash.png b/apps/desktop/icons/Flipcash.png new file mode 100644 index 0000000000..11c60b28b6 Binary files /dev/null and b/apps/desktop/icons/Flipcash.png differ diff --git a/apps/desktop/src/main/kotlin/com/flipcash/desktop/Main.kt b/apps/desktop/src/main/kotlin/com/flipcash/desktop/Main.kt index 8bcda37187..83848a79d7 100644 --- a/apps/desktop/src/main/kotlin/com/flipcash/desktop/Main.kt +++ b/apps/desktop/src/main/kotlin/com/flipcash/desktop/Main.kt @@ -1,12 +1,18 @@ package com.flipcash.desktop import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.painter.BitmapPainter +import androidx.compose.ui.graphics.toAwtImage +import androidx.compose.ui.graphics.toComposeImageBitmap import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Window import androidx.compose.ui.window.application import androidx.compose.ui.window.rememberWindowState import dev.zacsweers.metro.createGraph import kotlinx.coroutines.runBlocking +import org.jetbrains.skia.Image +import java.awt.Taskbar import java.lang.management.ManagementFactory fun main() { @@ -15,10 +21,12 @@ fun main() { graph.startup() graph.restoreSession() } + val appIcon = loadAppIcon() application { Window( onCloseRequest = ::exitApplication, title = "Flipcash", + icon = appIcon, state = rememberWindowState(width = 420.dp, height = 860.dp), ) { DesktopApp(graph, signedIn) @@ -30,3 +38,21 @@ fun main() { } } } + +/** + * Title bar and taskbar icon on Windows and Linux. A packaged Mac app takes its Dock icon from the bundle; + * `gradle run` does not, so the Dock would show the Java icon without the Taskbar call. The Mac image + * keeps the 824/1024 icon grid margin so it sits level with other Dock icons. + */ +private fun loadAppIcon(): BitmapPainter { + if (Taskbar.isTaskbarSupported() && Taskbar.getTaskbar().isSupported(Taskbar.Feature.ICON_IMAGE)) { + Taskbar.getTaskbar().iconImage = loadBitmap("/flipcash-icon-macos.png").toAwtImage() + } + return BitmapPainter(loadBitmap("/flipcash-icon.png")) +} + +private fun loadBitmap(path: String): ImageBitmap { + val bytes = checkNotNull(object {}.javaClass.getResourceAsStream(path)) { "missing resource $path" } + .use { it.readBytes() } + return Image.makeFromEncoded(bytes).toComposeImageBitmap() +} diff --git a/apps/desktop/src/main/resources/flipcash-icon-macos.png b/apps/desktop/src/main/resources/flipcash-icon-macos.png new file mode 100644 index 0000000000..dffd6d0644 Binary files /dev/null and b/apps/desktop/src/main/resources/flipcash-icon-macos.png differ diff --git a/apps/desktop/src/main/resources/flipcash-icon.png b/apps/desktop/src/main/resources/flipcash-icon.png new file mode 100644 index 0000000000..6ef71d95f5 Binary files /dev/null and b/apps/desktop/src/main/resources/flipcash-icon.png differ