aboutsummaryrefslogtreecommitdiffstats
path: root/desktop/island/README.md
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-10-07 19:13:16 +0200
committerDanilo M. <danix@danix.xyz>2026-10-07 19:13:16 +0200
commita55464e179a3f82aa46866564878ad35e11e0ae5 (patch)
tree7e604416cb2c6c1a22f633a8dc6158d4d30d7e1f /desktop/island/README.md
parentfe80b03136a141fb6832474e7dd6dc0ba822e454 (diff)
downloadquickshell-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/README.md')
-rw-r--r--desktop/island/README.md93
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.