From 9de89ae1512928283c1de7360e0313e1e2975b47 Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Tue, 13 Oct 2026 09:57:22 +0200 Subject: docs: the controls panel, its preferences file and bind The island README gains the panel. AGENTS.md records that a bare SUPER release bind is cancelled by drag and scroll on Hyprland 0.56.2, which was the open risk in the spec, and that FileView creates parent directories while Quickshell.stateDir is per-shell. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 12 +++++++++++- desktop/island/README.md | 25 ++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 2d7c950..82b73e0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,7 +12,8 @@ running one does not require the others. `desktop/` is itself a host for modules. desktop/ the drawer: sound, mail, VMs, appearance - island/ top-centre pills on DP-1: clock, volume, tray, layout, privacy + island/ top-centre pills on DP-1: clock, volume, tray, layout, privacy, + controls panel (SUPER alone) appearance/ wallpaper picker and colour scheme switcher window-switcher/ open windows as live previews in a grid, on ALT+TAB keybinds/ live keybind reminder, on SUPER+k @@ -145,6 +146,15 @@ changing that component. The ones that generalise: - **`hyprctl switchxkblayout current next|prev` targets the main keyboard**, so no device lookup is needed. Hyprland's `activelayout` raw event fires on every switch, so the layout flag is event-driven rather than polled. +- **A bare-modifier release bind works on Hyprland 0.56.2.** `hl.bind("SUPER + + Super_L", ..., { release = true })` fires on SUPER pressed and released + alone, and is cancelled by any key in between and by `SUPER`+drag and + `SUPER`+scroll; all checked by hand. That is how SUPER alone opens the + island's controls panel. +- **`FileView.setText` creates missing parent directories**, so `Prefs.qml` + has no mkdir step. `Quickshell.stateDir` is a per-shell hashed directory + (`by-shell/`), not `~/.local/state/quickshell`, which is why the + preferences path is built from `XDG_STATE_HOME` instead. - **Waybar is gone, both bars.** Its DP-3 functions moved to the island. The mail count is drawer-only: `Accounts.qml` watches the xapian directory itself, and `waybar-mail.sh` was deleted. diff --git a/desktop/island/README.md b/desktop/island/README.md index 2b2c9fe..8f70506 100644 --- a/desktop/island/README.md +++ b/desktop/island/README.md @@ -46,8 +46,9 @@ is open or not. ## Status pill -Left to right: volume icon, tray, layout flag. +Left to right: controls icon, volume icon, tray, layout flag. +- **Controls icon** opens the controls panel, see below. - **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 @@ -58,6 +59,28 @@ Left to right: volume icon, tray, layout flag. `activelayout` event. Scroll switches layout with `hyprctl switchxkblayout current next|prev`. +## Controls panel + +Opened by the status pill's controls icon, or by SUPER pressed and released +alone (`qs -p desktop ipc call island controls`, a Hyprland release bind; +any key or mouse bind pressed in between cancels it). Seven tiles: wifi, +bluetooth, DND, presentation, auto-lock, output, mic. + +- Click toggles. Right-click closes the panel and opens the tile's drawer + page. +- Output and mic fill to their volume, clamped at 100%; muted greys the bar + instead of emptying it. Scroll steps 5%, output capped at 150%. +- A tile whose backing object has not arrived (the first two seconds, no + adapter, no sink) is dimmed and ignores input. +- The pencil enters edit mode: drag a tile to another slot, × hides it, the + strip below lists hidden tiles with a + each. Closing the panel ends it. + +The visible tiles and their order live in +`$XDG_STATE_HOME/quickshell/desktop.json` (`../Prefs.qml`), written only when +they change and keeping keys it does not know. A tile added to the code +later starts hidden. Pure helpers in `Controls.js`, tested with +`node island/test_controls.js`. + ## Privacy `privacy.sh` prints `mic cam loc scr`, each 0 or 1, and `Privacy.qml` polls it -- cgit v1.2.3