No description
Find a file
Breadway 09530e236d
All checks were successful
check / check (push) Successful in 1m29s
Adopt bread-launcher: shared matching/ranking/rows + manifest theming
breadbox's launcher is now a thin host over the `bread-launcher` crate
(bread-ecosystem v0.7.5) — the same core breadbar's embedded capsule
uses — instead of a private implementation:

- `breadbox-shared` becomes a re-export shim over `bread_launcher`
  (`DesktopEntry`, `LaunchHistory`, `config_dir`, `LAUNCHER_APP`); the
  local fuzzy-match / ranking / desktop-file parsing is deleted.
- `run_ui` builds `bread_launcher::gtk::ResultsList` for the results
  list and calls `bread_launcher::do_launch` / `load_sorted_entries`;
  the hand-rolled row/icon/score code is gone.
- Launcher geometry and style come from the active shell-theme manifest
  (`bread_theme::shell`, via the new `src/theme.rs` accessor mirroring
  breadbar's) — width, radius, panel alpha, top margin, icon size,
  footer wording. The Daylight / liquid-motion look is the manifest's
  job now, not hardcoded CSS.
- Keeps `main`'s recent improvements on top of the branch work: the
  overlay window + outside-click come from `bread_utils::gtk_popup`
  (`new_overlay_window` / `bind_window_auto` / `close_on_outside_click`),
  replacing the manual layer-shell + GestureClick boilerplate.
- Embedded-open redirect: when the active theme embeds the launcher
  (spotlight capsule), breadbox emits `bread.box.open_requested` on the
  bus instead of mapping its own window; falls back to its own overlay
  when breadd is unreachable.
- Pins: bread-theme / bread-utils / bread-screenshots / bread-launcher
  → v0.7.5 (bread-launcher and `bread_theme::shell` first ship there).
  `.cargo/` gitignored — the local sibling-checkout source override
  (`fa85fc1`) is no longer needed now that v0.7.5 is tagged.

Reconciles the long-lived `feature/launcher-core` (13 commits, incl.
`feature/launcher-theming`) with `main`'s independent launcher redesign
(`feature/liquid-motion` + `bread_utils::gtk_popup` adoption). Applied
as one squashed reconciliation rather than a 13-commit rebase because
the two lines rewrote the same ~200-line `run_ui`/`build_css` region
in incompatible directions.

cargo build --locked / test --locked / clippy --all-targets --locked
-D warnings all clean.
2026-08-31 15:59:32 +08:00
.forgejo/workflows CI: refuse unsigned bakery index on stable tag releases 2026-08-16 00:50:22 +08:00
.github Pin ecosystem crates and switch to bread-utils::singleton 2026-08-15 21:40:03 +08:00
breadbox Adopt bread-launcher: shared matching/ranking/rows + manifest theming 2026-08-31 15:59:32 +08:00
breadbox-shared Adopt bread-launcher: shared matching/ranking/rows + manifest theming 2026-08-31 15:59:32 +08:00
breadbox-sync Adopt bread-launcher: shared matching/ranking/rows + manifest theming 2026-08-31 15:59:32 +08:00
ci CI: build on bread-ecosystem's shared Arch container 2026-08-05 19:12:32 +08:00
packaging Drop pacman packaging, bakery-only distribution 2026-07-23 10:25:12 +08:00
.gitignore Adopt bread-launcher: shared matching/ranking/rows + manifest theming 2026-08-31 15:59:32 +08:00
AGENTS.md Honor bread.command.box.open via breadbox listen 2026-08-15 23:11:28 +08:00
bakery.toml Drop pacman packaging, bakery-only distribution 2026-07-23 10:25:12 +08:00
Cargo.lock Adopt bread-launcher: shared matching/ranking/rows + manifest theming 2026-08-31 15:59:32 +08:00
Cargo.toml can't be bothered writing a commit message 2026-05-24 18:57:01 +08:00
config.example.toml can't be bothered writing a commit message 2026-05-24 18:57:01 +08:00
CONTRIBUTING.md CONTRIBUTING.md: document single-trunk + RC-tag release model 2026-07-31 11:08:41 +08:00
EVENTS.md Adopt bread-launcher: shared matching/ranking/rows + manifest theming 2026-08-31 15:59:32 +08:00
LICENSE breadbox: fast Rust application launcher for wofi 2026-05-23 11:14:16 +08:00
README.md Pin ecosystem crates and switch to bread-utils::singleton 2026-08-15 21:40:03 +08:00

breadbox

A GTK4 app launcher for Hyprland / Wayland on Arch Linux.

breadbox-shared   shared types (DesktopEntry, IconCache, Config)
breadbox-sync     standalone icon resolution + caching binary
breadbox          GTK4 layer-shell launcher

Features

  • Layer-shell window, centered 600 px wide, keyboard-exclusive
  • Reads the active Hyprland workspace and sorts apps by context priority
  • Fuzzy filtering as you type; Enter launches, Escape closes
  • App icons loaded from the resolved icon cache (see breadbox-sync)
  • pywal accents from ~/.cache/wal/colors.json; background/surface/overlay/foreground stay fixed BOS dark
  • User CSS override at ~/.config/breadbox/style.css
  • Toggle/dismiss: running a second instance kills the first

Build dependencies

gtk4                (pacman -S gtk4)
gtk4-layer-shell    (pacman -S gtk4-layer-shell)
librsvg             (pacman -S librsvg)   # for SVG icon support
rust (stable)       (rustup toolchain install stable)

Build

# debug
cargo build

# release (recommended — put both binaries on $PATH)
cargo build --release
# binaries are at target/release/breadbox and target/release/breadbox-sync

Install to ~/.cargo/bin (or anywhere on your PATH):

cargo install --path breadbox
cargo install --path breadbox-sync

Configuration

Copy and edit the example config:

mkdir -p ~/.config/breadbox
cp config.example.toml ~/.config/breadbox/config.toml

The [[context]] blocks map Hyprland workspace names to app priority lists. Workspace name "default" is the catch-all fallback.

[[context]]
name = "default"
priority = ["firefox", "code", "obsidian", "kitty"]

[[context]]
name = "2"
priority = ["slack", "discord"]

CSS theming

breadbox applies pywal colors automatically when ~/.cache/wal/colors.json is present. To override or extend the theme:

~/.config/breadbox/style.css

This file is loaded at the highest CSS priority level, so any rule here wins.

Icon sync

breadbox-sync resolves icons for all installed apps and writes them to ~/.cache/breadbox/. Run it once before first launch:

breadbox-sync

Icon resolution order:

  1. System icon theme (~/.local/share/icons, /usr/share/icons, /usr/share/pixmaps) — 64 px > 48 px PNG, then SVG
  2. Flathub media server — for reverse-DNS app IDs (e.g. org.gnome.Gedit)
  3. icon.horse — downloaded and cached
  4. application-x-executable fallback from system theme

Systemd service (run on login)

cp packaging/breadbox-sync.service ~/.config/systemd/user/
systemctl --user enable --now breadbox-sync.service

The service runs breadbox-sync once at login (after network is up) and logs to journald. Re-run manually after installing new apps:

systemctl --user start breadbox-sync.service
# or just:
breadbox-sync

Hyprland keybind

Add to ~/.config/hypr/hyprland.conf:

bind = $mainMod, SPACE, exec, breadbox

Pressing the keybind again while the launcher is open dismisses it.

Licence

MIT — see LICENSE.