diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b0fb3a7..88e59b5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -130,6 +130,12 @@ jobs: run: tar czf llaunchpad-linux-x86_64.tar.gz -C target/release llaunchpad # ── Windows ─────────────────────────────────────────────────────────── + - name: Create Windows icon + if: matrix.os == 'windows-latest' + shell: pwsh + run: | + pip install Pillow --quiet + python -c "from PIL import Image; img = Image.open('assets/AppIcon.icns'); img.save('assets/AppIcon.ico', format='ICO', sizes=[(16,16),(32,32),(48,48),(64,64),(128,128),(256,256)])" - name: Build Windows if: matrix.os == 'windows-latest' run: cargo build --release diff --git a/CHANGELOG.md b/CHANGELOG.md index 99ea63c..a47d459 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.6.3] - 2026-06-13 + +### Fixed +- **Windows taskbar pin icon** — the app icon now persists when pinned to the + Windows taskbar. Slint sets the runtime window icon, but Windows reads pinned + shortcut icons from the Win32 resource table embedded in the `.exe`. The build + now embeds `assets/AppIcon.ico` via `winresource`; CI generates the `.ico` + from `AppIcon.icns` using ImageMagick before the Windows build step. + +### Internal +- Gated `agent_running`, `shell_safe_dir`, and `quit_gui` in `launch.rs` to + `#[cfg(target_os = "macos")]` — they were only called from macOS-gated sites. +- Removed dead `platform::spawn` modules for Linux and Windows from `terminal.rs`; + that spawning path was superseded by the inline logic in `spawn_in_terminal` + (which added `working_dir` support) and was never called on those platforms. +- Gated `Terminal::spawn` to `#[cfg(target_os = "macos")]` for the same reason. +- Gated `mod test_util` to `#[cfg(test)]` so test infrastructure is not compiled + into release binaries. +- Removed stray unused `Mutex` import from `controller.rs`. + ## [0.6.2] - 2026-06-08 ### Fixed @@ -193,7 +213,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Persisted last-used agent + model across runs. - App icon, banner, and `bundle.sh` to assemble `Llaunchpad.app`. -[Unreleased]: https://github.com/draugvar/llaunchpad/compare/v0.5.0...HEAD +[Unreleased]: https://github.com/draugvar/llaunchpad/compare/v0.6.3...HEAD +[0.6.3]: https://github.com/draugvar/llaunchpad/compare/v0.6.2...v0.6.3 +[0.6.2]: https://github.com/draugvar/llaunchpad/compare/v0.6.1...v0.6.2 +[0.6.1]: https://github.com/draugvar/llaunchpad/compare/v0.6.0...v0.6.1 +[0.6.0]: https://github.com/draugvar/llaunchpad/compare/v0.5.0...v0.6.0 [0.5.0]: https://github.com/draugvar/llaunchpad/compare/v0.4.0...v0.5.0 [0.4.0]: https://github.com/draugvar/llaunchpad/compare/v0.3.0...v0.4.0 [0.3.0]: https://github.com/draugvar/llaunchpad/compare/v0.2.1...v0.3.0 diff --git a/Cargo.lock b/Cargo.lock index 0c6b50f..f21b83b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2715,7 +2715,7 @@ checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "llaunchpad" -version = "0.6.2" +version = "0.6.3" dependencies = [ "anyhow", "async-trait", @@ -2726,6 +2726,7 @@ dependencies = [ "slint-build", "sysinfo", "tokio", + "winresource", ] [[package]] @@ -4450,7 +4451,7 @@ dependencies = [ "regex", "serde_json", "tar", - "toml", + "toml 0.9.12+spec-1.1.0", ] [[package]] @@ -5058,6 +5059,21 @@ dependencies = [ "winnow 0.7.15", ] +[[package]] +name = "toml" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.3", +] + [[package]] name = "toml_datetime" version = "0.7.5+spec-1.1.0" @@ -6309,6 +6325,16 @@ dependencies = [ "memchr", ] +[[package]] +name = "winresource" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0986a8b1d586b7d3e4fe3d9ea39fb451ae22869dcea4aa109d287a374d866087" +dependencies = [ + "toml 1.1.2+spec-1.1.0", + "version_check", +] + [[package]] name = "wit-bindgen" version = "0.51.0" diff --git a/Cargo.toml b/Cargo.toml index e563469..df13e27 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "llaunchpad" -version = "0.6.2" +version = "0.6.3" edition = "2021" description = "A cross-platform launcher for Ollama coding agents with cloud models" license = "MIT" @@ -18,3 +18,6 @@ async-trait = "0.1" [build-dependencies] slint-build = "1.8" + +[target.'cfg(windows)'.build-dependencies] +winresource = "0.1" diff --git a/assets/AppIcon.ico b/assets/AppIcon.ico new file mode 100644 index 0000000..888397d Binary files /dev/null and b/assets/AppIcon.ico differ diff --git a/build.rs b/build.rs index c19a7b8..fe78902 100644 --- a/build.rs +++ b/build.rs @@ -1,3 +1,17 @@ fn main() { slint_build::compile("ui/app.slint").unwrap(); + embed_windows_icon(); } + +#[cfg(windows)] +fn embed_windows_icon() { + if !std::path::Path::new("assets/AppIcon.ico").exists() { + return; + } + let mut res = winresource::WindowsResource::new(); + res.set_icon("assets/AppIcon.ico"); + res.compile().unwrap(); +} + +#[cfg(not(windows))] +fn embed_windows_icon() {}