From afb800dd70a94e67136aea54a13f70d71e6d47ad Mon Sep 17 00:00:00 2001 From: Ethan Collins Date: Sat, 13 Jun 2026 19:59:49 -0600 Subject: [PATCH 1/5] Fix Windows taskbar pin icon and eliminate compiler warnings --- .github/workflows/release.yml | 4 ++ Cargo.lock | 28 +++++++++- Cargo.toml | 3 ++ assets/AppIcon.ico | Bin 0 -> 53832 bytes build.rs | 14 +++++ src/controller.rs | 2 +- src/main.rs | 1 + src/ollama/launch.rs | 3 ++ src/terminal.rs | 96 ++-------------------------------- 9 files changed, 57 insertions(+), 94 deletions(-) create mode 100644 assets/AppIcon.ico diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b0fb3a7..0354383 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -130,6 +130,10 @@ 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: magick assets/AppIcon.icns -define icon:auto-resize assets/AppIcon.ico - name: Build Windows if: matrix.os == 'windows-latest' run: cargo build --release diff --git a/Cargo.lock b/Cargo.lock index 0c6b50f..fc7cce5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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..e270e14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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 0000000000000000000000000000000000000000..888397d92803b4fcef7ff77fb729b2faaed8f773 GIT binary patch literal 53832 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 literal 0 HcmV?d00001 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() {} diff --git a/src/controller.rs b/src/controller.rs index f43b16e..c6cde0b 100644 --- a/src/controller.rs +++ b/src/controller.rs @@ -8,7 +8,7 @@ use crate::model::{AppModel, StateSnapshot, Status}; use crate::view::{Controller, ViewSink, ViewState}; -use std::sync::{Arc, Mutex}; +use std::sync::Arc; use std::time::Duration; const POLL_INTERVAL: Duration = Duration::from_secs(5); diff --git a/src/main.rs b/src/main.rs index 57c2606..542ad81 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,6 +20,7 @@ mod ollama; mod repository; mod slint_generated; mod terminal; +#[cfg(test)] mod test_util; mod view; diff --git a/src/ollama/launch.rs b/src/ollama/launch.rs index 802b6f8..08f5275 100644 --- a/src/ollama/launch.rs +++ b/src/ollama/launch.rs @@ -59,6 +59,7 @@ pub fn running_states(agents: &[Agent]) -> Vec { agents.iter().map(|_| false).collect() } +#[cfg(target_os = "macos")] pub fn agent_running(agent: &Agent) -> bool { running_states(std::slice::from_ref(agent)) .first() @@ -200,6 +201,7 @@ fn shell_safe_url(url: &str) -> String { /// Escape characters that are special inside a double-quoted shell string. /// This preserves valid Unicode paths while keeping the generated /// `cd "" && ...` command safe. +#[cfg(target_os = "macos")] fn shell_safe_dir(dir: &str) -> String { let mut out = String::with_capacity(dir.len()); for c in dir.chars() { @@ -410,6 +412,7 @@ fn spawn_in_terminal( // ───────────────────────── GUI helpers ───────────────────────── /// Quit a running GUI app (best effort, per platform). +#[cfg(target_os = "macos")] fn quit_gui(app_name: &str) { #[cfg(target_os = "macos")] { diff --git a/src/terminal.rs b/src/terminal.rs index 94b50da..8317c8c 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -13,7 +13,9 @@ //! `Default` option is always present and falls back to the OS-builtin //! behavior described above. -use anyhow::{Context, Result}; +#[cfg(target_os = "macos")] +use anyhow::Result; +#[cfg(unix)] use std::process::Command; use std::sync::OnceLock; @@ -148,6 +150,7 @@ impl Terminal { } /// Spawn `cmd` in a new window hosted by this terminal. + #[cfg(target_os = "macos")] pub fn spawn(&self, cmd: &str) -> Result<()> { platform::spawn(self, cmd) } @@ -343,97 +346,6 @@ mod platform { } } -#[cfg(target_os = "linux")] -mod platform { - use super::{Command, Context, Result, Terminal}; - - /// Try a list of `(binary, args)` candidates in order and return - /// the first that spawns successfully. Used by `Default`. - fn try_candidates(cmd: &str) -> Result<()> { - let hold = format!("{cmd}; exec ${{SHELL:-/bin/bash}}"); - let candidates: &[(&str, &[&str])] = &[ - ("x-terminal-emulator", &["-e", "bash", "-lc"]), - ("gnome-terminal", &["--", "bash", "-lc"]), - ("konsole", &["-e", "bash", "-lc"]), - ("xfce4-terminal", &["-e", "bash", "-lc"]), - ("xterm", &["-e", "bash", "-lc"]), - ]; - for (bin, args) in candidates { - let mut c = Command::new(bin); - c.args(*args).arg(&hold); - if c.spawn().is_ok() { - return Ok(()); - } - } - anyhow::bail!("no terminal emulator found (tried gnome-terminal, konsole, xterm…)") - } - - fn spawn_bash(bin: &str, args: &[&str], cmd: &str) -> Result<()> { - let hold = format!("{cmd}; exec ${{SHELL:-/bin/bash}}"); - let mut c = Command::new(bin); - c.args(args).arg(&hold); - c.spawn().with_context(|| format!("failed to open {bin}"))?; - Ok(()) - } - - pub(super) fn spawn(t: &Terminal, cmd: &str) -> Result<()> { - match t { - Terminal::Default => try_candidates(cmd)?, - Terminal::GnomeTerminal => { - spawn_bash("gnome-terminal", &["--", "bash", "-lc"], cmd)? - } - Terminal::Konsole => spawn_bash("konsole", &["-e", "bash", "-lc"], cmd)?, - Terminal::Xfce4Terminal => { - spawn_bash("xfce4-terminal", &["-e", "bash", "-lc"], cmd)? - } - Terminal::Xterm => spawn_bash("xterm", &["-e", "bash", "-lc"], cmd)?, - Terminal::Alacritty => spawn_bash("alacritty", &["-e", "bash", "-lc"], cmd)?, - Terminal::Kitty => spawn_bash("kitty", &["bash", "-lc"], cmd)?, - // wezterm has its own spawn interface - Terminal::WezTerm => { - Command::new("wezterm") - .args(["cli", "spawn", "--", cmd]) - .spawn() - .context("failed to open wezterm")?; - } - other => anyhow::bail!("{other:?} is not available on Linux"), - } - Ok(()) - } -} - -#[cfg(target_os = "windows")] -mod platform { - use super::{Command, Context, Result, Terminal}; - - pub(super) fn spawn(t: &Terminal, cmd: &str) -> Result<()> { - match t { - // "Default" on Windows keeps the historical - // `cmd /C start cmd /K` behaviour so the window stays open - // after the agent exits. - Terminal::Default | Terminal::Cmd => { - Command::new("cmd") - .args(["/C", "start", "cmd", "/K", cmd]) - .spawn() - .context("failed to open Command Prompt")?; - } - Terminal::WindowsTerminal => { - Command::new("wt.exe") - .args(["new-tab", "cmd", "/K", cmd]) - .spawn() - .context("failed to open Windows Terminal")?; - } - Terminal::PowerShell => { - Command::new("cmd") - .args(["/C", "start", "powershell", "-NoExit", "-Command", cmd]) - .spawn() - .context("failed to open PowerShell")?; - } - other => anyhow::bail!("{other:?} is not available on Windows"), - } - Ok(()) - } -} /// Filtered list of terminals available on the current platform. Used /// to populate the dropdown — `Default` is always first, then the From dac7d9c0ebceacf4eda38d18f603f5623120bd23 Mon Sep 17 00:00:00 2001 From: Ethan Collins Date: Sat, 13 Jun 2026 20:07:39 -0600 Subject: [PATCH 2/5] version bump --- CHANGELOG.md | 26 +++++++++++++++++++++++++- Cargo.lock | 2 +- Cargo.toml | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) 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 fc7cce5..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", diff --git a/Cargo.toml b/Cargo.toml index e270e14..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" From 537e8ff6f93640e4fce8644fc87f7da307082fd9 Mon Sep 17 00:00:00 2001 From: Ethan Collins Date: Sat, 13 Jun 2026 20:13:02 -0600 Subject: [PATCH 3/5] Fix missing Context import in macOS terminal platform module The platform::spawn module on macOS pulls Context via use super::{Context, Result, Terminal}. Narrowing the parent import to only Result broke the macOS build. Co-Authored-By: Claude Sonnet 4.6 --- src/terminal.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/terminal.rs b/src/terminal.rs index 8317c8c..92982f8 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -14,7 +14,7 @@ //! behavior described above. #[cfg(target_os = "macos")] -use anyhow::Result; +use anyhow::{Context, Result}; #[cfg(unix)] use std::process::Command; use std::sync::OnceLock; From 212557f0ce2a684f5a1cc017f8f560f8ef36d5e8 Mon Sep 17 00:00:00 2001 From: Ethan Collins Date: Sat, 13 Jun 2026 20:16:19 -0600 Subject: [PATCH 4/5] Revert compiler warning cleanup Co-Authored-By: Claude Sonnet 4.6 --- src/controller.rs | 2 +- src/main.rs | 1 - src/ollama/launch.rs | 3 -- src/terminal.rs | 94 ++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 92 insertions(+), 8 deletions(-) diff --git a/src/controller.rs b/src/controller.rs index c6cde0b..f43b16e 100644 --- a/src/controller.rs +++ b/src/controller.rs @@ -8,7 +8,7 @@ use crate::model::{AppModel, StateSnapshot, Status}; use crate::view::{Controller, ViewSink, ViewState}; -use std::sync::Arc; +use std::sync::{Arc, Mutex}; use std::time::Duration; const POLL_INTERVAL: Duration = Duration::from_secs(5); diff --git a/src/main.rs b/src/main.rs index 542ad81..57c2606 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,7 +20,6 @@ mod ollama; mod repository; mod slint_generated; mod terminal; -#[cfg(test)] mod test_util; mod view; diff --git a/src/ollama/launch.rs b/src/ollama/launch.rs index 08f5275..802b6f8 100644 --- a/src/ollama/launch.rs +++ b/src/ollama/launch.rs @@ -59,7 +59,6 @@ pub fn running_states(agents: &[Agent]) -> Vec { agents.iter().map(|_| false).collect() } -#[cfg(target_os = "macos")] pub fn agent_running(agent: &Agent) -> bool { running_states(std::slice::from_ref(agent)) .first() @@ -201,7 +200,6 @@ fn shell_safe_url(url: &str) -> String { /// Escape characters that are special inside a double-quoted shell string. /// This preserves valid Unicode paths while keeping the generated /// `cd "" && ...` command safe. -#[cfg(target_os = "macos")] fn shell_safe_dir(dir: &str) -> String { let mut out = String::with_capacity(dir.len()); for c in dir.chars() { @@ -412,7 +410,6 @@ fn spawn_in_terminal( // ───────────────────────── GUI helpers ───────────────────────── /// Quit a running GUI app (best effort, per platform). -#[cfg(target_os = "macos")] fn quit_gui(app_name: &str) { #[cfg(target_os = "macos")] { diff --git a/src/terminal.rs b/src/terminal.rs index 92982f8..94b50da 100644 --- a/src/terminal.rs +++ b/src/terminal.rs @@ -13,9 +13,7 @@ //! `Default` option is always present and falls back to the OS-builtin //! behavior described above. -#[cfg(target_os = "macos")] use anyhow::{Context, Result}; -#[cfg(unix)] use std::process::Command; use std::sync::OnceLock; @@ -150,7 +148,6 @@ impl Terminal { } /// Spawn `cmd` in a new window hosted by this terminal. - #[cfg(target_os = "macos")] pub fn spawn(&self, cmd: &str) -> Result<()> { platform::spawn(self, cmd) } @@ -346,6 +343,97 @@ mod platform { } } +#[cfg(target_os = "linux")] +mod platform { + use super::{Command, Context, Result, Terminal}; + + /// Try a list of `(binary, args)` candidates in order and return + /// the first that spawns successfully. Used by `Default`. + fn try_candidates(cmd: &str) -> Result<()> { + let hold = format!("{cmd}; exec ${{SHELL:-/bin/bash}}"); + let candidates: &[(&str, &[&str])] = &[ + ("x-terminal-emulator", &["-e", "bash", "-lc"]), + ("gnome-terminal", &["--", "bash", "-lc"]), + ("konsole", &["-e", "bash", "-lc"]), + ("xfce4-terminal", &["-e", "bash", "-lc"]), + ("xterm", &["-e", "bash", "-lc"]), + ]; + for (bin, args) in candidates { + let mut c = Command::new(bin); + c.args(*args).arg(&hold); + if c.spawn().is_ok() { + return Ok(()); + } + } + anyhow::bail!("no terminal emulator found (tried gnome-terminal, konsole, xterm…)") + } + + fn spawn_bash(bin: &str, args: &[&str], cmd: &str) -> Result<()> { + let hold = format!("{cmd}; exec ${{SHELL:-/bin/bash}}"); + let mut c = Command::new(bin); + c.args(args).arg(&hold); + c.spawn().with_context(|| format!("failed to open {bin}"))?; + Ok(()) + } + + pub(super) fn spawn(t: &Terminal, cmd: &str) -> Result<()> { + match t { + Terminal::Default => try_candidates(cmd)?, + Terminal::GnomeTerminal => { + spawn_bash("gnome-terminal", &["--", "bash", "-lc"], cmd)? + } + Terminal::Konsole => spawn_bash("konsole", &["-e", "bash", "-lc"], cmd)?, + Terminal::Xfce4Terminal => { + spawn_bash("xfce4-terminal", &["-e", "bash", "-lc"], cmd)? + } + Terminal::Xterm => spawn_bash("xterm", &["-e", "bash", "-lc"], cmd)?, + Terminal::Alacritty => spawn_bash("alacritty", &["-e", "bash", "-lc"], cmd)?, + Terminal::Kitty => spawn_bash("kitty", &["bash", "-lc"], cmd)?, + // wezterm has its own spawn interface + Terminal::WezTerm => { + Command::new("wezterm") + .args(["cli", "spawn", "--", cmd]) + .spawn() + .context("failed to open wezterm")?; + } + other => anyhow::bail!("{other:?} is not available on Linux"), + } + Ok(()) + } +} + +#[cfg(target_os = "windows")] +mod platform { + use super::{Command, Context, Result, Terminal}; + + pub(super) fn spawn(t: &Terminal, cmd: &str) -> Result<()> { + match t { + // "Default" on Windows keeps the historical + // `cmd /C start cmd /K` behaviour so the window stays open + // after the agent exits. + Terminal::Default | Terminal::Cmd => { + Command::new("cmd") + .args(["/C", "start", "cmd", "/K", cmd]) + .spawn() + .context("failed to open Command Prompt")?; + } + Terminal::WindowsTerminal => { + Command::new("wt.exe") + .args(["new-tab", "cmd", "/K", cmd]) + .spawn() + .context("failed to open Windows Terminal")?; + } + Terminal::PowerShell => { + Command::new("cmd") + .args(["/C", "start", "powershell", "-NoExit", "-Command", cmd]) + .spawn() + .context("failed to open PowerShell")?; + } + other => anyhow::bail!("{other:?} is not available on Windows"), + } + Ok(()) + } +} /// Filtered list of terminals available on the current platform. Used /// to populate the dropdown — `Default` is always first, then the From 1eb1bf113a5a1534e15200d70a0db657c1bf3e3b Mon Sep 17 00:00:00 2001 From: Ethan Collins Date: Sat, 13 Jun 2026 20:22:39 -0600 Subject: [PATCH 5/5] Use Pillow to generate AppIcon.ico on Windows CI ImageMagick on windows-latest lacks the ICNS decoder module. Python and pip are pre-installed on GitHub runners; Pillow reads ICNS natively on all platforms. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/release.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0354383..88e59b5 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -133,7 +133,9 @@ jobs: - name: Create Windows icon if: matrix.os == 'windows-latest' shell: pwsh - run: magick assets/AppIcon.icns -define icon:auto-resize assets/AppIcon.ico + 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