diff options
| author | Danilo M. <danix@danix.xyz> | 2026-10-07 19:13:16 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-10-07 19:13:16 +0200 |
| commit | a55464e179a3f82aa46866564878ad35e11e0ae5 (patch) | |
| tree | 7e604416cb2c6c1a22f633a8dc6158d4d30d7e1f /desktop/island | |
| parent | fe80b03136a141fb6832474e7dd6dc0ba822e454 (diff) | |
| download | quickshell-a55464e179a3f82aa46866564878ad35e11e0ae5.tar.gz quickshell-a55464e179a3f82aa46866564878ad35e11e0ae5.zip | |
docs: the island, and waybar gone
AGENTS.md describes the hybrid model (desktop/ hosts drawer and island) and
gains the gotchas found while building the island: UseQApplication for tray
menus, WheelHandler vs MouseArea, accent colliding with green, xkb layout
switching, and the tray popup un-hovering the island. The Blur waybar
measurement becomes history. READMEs drop their present-tense waybar
references.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Diffstat (limited to 'desktop/island')
| -rw-r--r-- | desktop/island/README.md | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/desktop/island/README.md b/desktop/island/README.md new file mode 100644 index 0000000..2b2c9fe --- /dev/null +++ b/desktop/island/README.md @@ -0,0 +1,93 @@ +# island + +A thin neutral bar at the top centre of `DP-1`. Point at it and two pills +slide out of it: a clock pill on the left and a status pill on the right. It +replaced waybar, both bars. It is not a separate shell: `desktop/shell.qml` +instantiates it next to the drawer, so it starts with `qs -p ./desktop` and +shares the drawer's IPC and keepalive window. + +## Running it + + qs -p ./desktop + +The pure logic (volume icon thresholds, VM dot colours, flick text) lives in +`Logic.js` and has one check, which needs only node: + + node desktop/island/test_logic.js + +## States + +**Hidden.** Only the sliver shows, in `Theme.overlay`. While anything is +capturing it takes the capture colours instead, split into equal segments, one +per active kind: mic green, camera yellow, location blue, screen red. + +**Revealed.** The pointer enters the sliver and the pills slide down and apart +in one move, driven by a single `reveal` amount, so an interrupted reveal turns +around from wherever it is. They hide 400ms after the pointer leaves both, +unless a panel is open. + +**Panel open.** Clicking the volume icon morphs the status pill into the sound +panel (output and input sliders with mute, and an arrow to the drawer's sound +page). An outside click or Escape closes it. + +**Flick.** On a workspace change or an app opening, and not on a plain focus +change, the clock pill shows `<desktop icon> <app icon> <app name>` for 1.5s. +If the island is hidden, the clock pill alone drops out for the flick and +retracts. Events in the first 1.5s after startup are ignored, because Hyprland +reports its initial state as events. The desktop icons come from +`shared/Workspaces.qml`, the same ones the window switcher uses. + +## Clock pill + +`Wed 07/10 15:07`, then one dot per VM that is running, paused, suspended, +saved or crashed (a plainly shut-off VM gets none). States come from the +drawer's `Virsh` service, whose lifecycle event stream runs whether the drawer +is open or not. + +## Status pill + +Left to right: volume icon, tray, layout flag. + +- **Volume icon** shows the default sink (muted, low, medium, high). Click + opens the sound panel. +- **Tray** shows `SystemTray` items. Left click activates, right click opens + the item's menu. The island is the session's StatusNotifier host. A tray + menu is a separate popup, so the island holds itself shown after `display()` + until the pointer returns. +- **Layout flag** shows the current keyboard layout, driven by Hyprland's + `activelayout` event. Scroll switches layout with + `hyprctl switchxkblayout current next|prev`. + +## Privacy + +`privacy.sh` prints `mic cam loc scr`, each 0 or 1, and `Privacy.qml` polls it +every 2s. It polls because Quickshell's `PwNode` exposes no running state, +which is what tells a capturing source from an idle one, so mic and screen go +through `pw-dump`, and camera and location through `fuser` and `pgrep`. A +failed run prints nothing and the last reading is kept, since no dump is a +broken run and not "nothing is capturing". + +## Theming + +Colours come only from `Theme`, which follows the unified-desktop-theme +palette live. Icons are freedesktop names resolved with +`Quickshell.iconPath(name, true)` through the active icon theme, so switching +icon theme in the appearance panel changes the island. Nerd Font glyphs, in +`Theme.iconFamily`, only where no named icon exists. The island defines no +colour and no icon theme of its own. The idle sliver is never the accent, +because udt can snap the accent to the same colour as a capture kind. + +## Blur + +The window sets namespace `quickshell-island`. For frosting, add to +`~/.config/hypr/sections/decorations.lua`: + + hl.layer_rule({ + name = "blur-island", + match = { namespace = "^(quickshell-island)$" }, + blur = true, + xray = false, + ignore_alpha = 0.1, + }) + +Without it the island renders flat translucent. |
