# cliamp quickshell widget A compact "now playing" card for [Quickshell](https://quickshell.org) (300 x 72), centered along the bottom of every screen and driven by cliamp's MPRIS service (`org.mpris.MediaPlayer2.cliamp`). Two-row layout: title + time on top, artist + transport on the second row, a 10-band Winamp 2-style spectrum below, and a thin click-to-seek line at the bottom. Colors are picked up from the active Omarchy theme (`~/.config/omarchy/current/theme/colors.toml`) and update live when the theme changes. Hides itself when cliamp is not running. Click the card and press Esc or Q to quit the widget. Linux only. Requires Quickshell 0.2+ and cliamp running with its default MPRIS service enabled (it is by default on Linux). ## Quick start Run it directly without installing: ```sh qs -p contrib/quickshell/shell.qml ``` Or install as a named Quickshell config: ```sh mkdir -p ~/.config/quickshell ln -s "$PWD/contrib/quickshell" ~/.config/quickshell/cliamp qs -c cliamp ``` Then start cliamp in another terminal. The card appears on every screen, anchored to the bottom edge. ## Customization Theme colors come from Omarchy's active theme file: ``` ~/.config/omarchy/current/theme/colors.toml ``` Mapping into the widget: | Omarchy key | Widget role | | --- | --- | | `background` | card background | | `foreground` | primary text (title) | | `accent` | progress fill, seek handle, play/pause icon | | `color2` | visualizer bottom LED rows (green slot), play/pause hover | | `color3` | visualizer mid LED rows + peak caps, prev/next hover (yellow slot) | | `color1` | visualizer top LED rows (red slot) | | `selection_background` | card border (falls back to `color8`) | | `color8` | secondary text + prev/next icons, time readout (falls back to a darker `foreground`) | The card border uses `selection_background` (a muted dark gray in most Omarchy themes), falling back to `color8` if that key is missing. Switching theme rewrites `colors.toml` in place; the widget watches it and re-applies colors live (no reload needed). To reposition the card, edit `shell.qml`. The defaults anchor a transparent full-width strip to the bottom of every screen and center a 300 x 72 card inside it with a 16 px gap from the edge: ```qml PanelWindow { anchors { bottom: true; left: true; right: true } margins { bottom: 16 } implicitHeight: 72 color: "transparent" NowPlaying { width: 300 height: parent.height anchors.horizontalCenter: parent.horizontalCenter } } ``` Swap `bottom` for `top` to flip to the top edge, or replace the `horizontalCenter` anchor with `anchors.left` / `anchors.right` to push it into a corner. ## Files | File | Purpose | | --- | --- | | `shell.qml` | Entry point. Wires up a `PanelWindow` per screen and finds cliamp on the MPRIS bus. | | `NowPlaying.qml` | The bar widget itself. | | `TransportButton.qml` | Reusable prev/play/next button (hover + enabled state). | | `MediaIcon.qml` | Resolution-independent transport icons drawn with Canvas2D (prev / play / pause / next / stop). | | `Visualizer.qml` | Canvas-based ClassicPeak spectrum (bars + falling peak markers). | | `BandStream.qml` | Wraps `cliamp visstream` and exposes the live 10-band frames as reactive properties. | ## Notes - The widget polls `MprisPlayer.position` on a 250 ms timer while playing, since Quickshell's MPRIS service does not emit reactive updates for position drift. - Player detection uses `dbusName === "cliamp"` (cliamp registers the well-known name `org.mpris.MediaPlayer2.cliamp` in `mediactl/service_linux.go`). - Clicking the progress bar issues an MPRIS `SetPosition`, which cliamp handles via `playback.SetPositionMsg`. - Theme colors come from the active Omarchy theme via a `FileView` watching `~/.config/omarchy/current/theme/colors.toml`. The TOML is parsed in QML with a small regex (no external script). Theme swaps update the card without reloading Quickshell. - Spectrum bands stream over the cliamp IPC socket via `cliamp visstream`. One long-lived subprocess per widget. - The widget renders a Winamp 2-style spectrum analyzer: each band is a stack of LED segments with a tiny gap between them, with a falling peak cap. Three-tone gradient across the height — `color2` (green) for the bottom rows, `color3` (yellow) for the middle, `color1` (red) for the top, mirroring the classic Winamp gradient (and the cliamp TUI). The bar block spans the full card width, edge to edge. - All UI elements use sharp 90-degree corners (no `radius`) to match a terminal aesthetic.