aboutsummaryrefslogtreecommitdiff
path: root/docs/specs/2026-07-02-desktop-settings-panel-spec.org
diff options
context:
space:
mode:
Diffstat (limited to 'docs/specs/2026-07-02-desktop-settings-panel-spec.org')
-rw-r--r--docs/specs/2026-07-02-desktop-settings-panel-spec.org161
1 files changed, 161 insertions, 0 deletions
diff --git a/docs/specs/2026-07-02-desktop-settings-panel-spec.org b/docs/specs/2026-07-02-desktop-settings-panel-spec.org
new file mode 100644
index 0000000..50853f3
--- /dev/null
+++ b/docs/specs/2026-07-02-desktop-settings-panel-spec.org
@@ -0,0 +1,161 @@
+#+TITLE: Desktop-Settings Dropdown Panel
+#+AUTHOR: Craig Jennings
+#+DATE: 2026-07-02
+#+TODO: TODO | DONE
+#+TODO: DRAFT READY DOING | IMPLEMENTED SUPERSEDED CANCELLED
+
+* DRAFT Desktop-Settings Dropdown Panel
+:PROPERTIES:
+:ID: d6bb1e73-ec90-4327-85ee-bfa762da5bce
+:END:
+- 2026-07-04 Sat @ 12:36:56 -0500 — retrofitted by spec-sort; status set to DRAFT (evidence-based, human-confirmed)
+
+* DRAFT Status
+:PROPERTIES:
+:ID: fb7eec22-a214-4568-82c4-903612f4832f
+:END:
+- [2026-07-04 Sat] DRAFT — all four decisions resolved by Craig (dim + airplane collapse into the panel, touchpad + caffeine stay on the bar; Super+Shift+G keybind; code in dotfiles settings/ beside net/; 5% brightness floor). The four collapse/keybind/location/floor decisions are closed; one open scoping question remains ("few other things" — see Decisions) before a spec-review can flip it READY.
+- [2026-07-03 Fri] DRAFT update — from the waybar/panel-family design
+ discussion: adopt the instrument-console faceplate aesthetic net + bt
+ shipped (lamps, engraved sections, console keys, machined plate), not just
+ the raw palette; add the audio panel as a sibling in the panel family;
+ cross-reference the shared faceplate CSS. Toggle-consolidation scope (the
+ "few other things") still open — see the Decisions section.
+- [2026-07-02 Thu] DRAFT — initial spec from the todo.org task "Desktop-settings
+ dropdown panel" (2026-06-24 review), updated for the Blueprint/GTK4 pipeline
+ the net panel stood up 2026-07-01.
+
+* Metadata
+
+| Field | Value |
+|--------+----------------------------------------------|
+| Status | draft |
+|--------+----------------------------------------------|
+| Owner | Craig Jennings |
+|--------+----------------------------------------------|
+| Repo | dotfiles |
+|--------+----------------------------------------------|
+| Kin | net panel (architecture donor), theme studio |
+| | audio panel (sibling), bt panel (aesthetic) |
+|--------+----------------------------------------------|
+
+* Problem
+
+Desktop toggles are scattered: dim, caffeine/idle, touchpad/mouse, airplane
+mode each own a bar module and a keybind; brightness and keyboard-backlight
+have keybinds but no visible control or level readout. The bar is running out
+of glanceable width (hence the collapse arrows), and sliders can't live in
+waybar at all. One settings dropdown — a gear glyph opening a small panel —
+gathers them.
+
+* Goals
+
+1. One panel with every desktop toggle + slider: auto-dim, idle/caffeine,
+ touchpad, mouse, airplane (laptop-only), screen brightness, keyboard
+ backlight.
+2. Conditional rows appear only when the hardware/context applies (mouse
+ present, trackpad present, battery present) — reuse the detection the
+ airplane/touchpad indicators already do.
+3. Every control reflects live state and verifies its action took (the net
+ panel's verify-everything contract).
+4. Bar stays the quick layer: which standalone indicators survive is a
+ decision below.
+
+* Design sketch
+
+** Architecture — clone the net panel's proven stack
+
+- GTK4 + gtk4-layer-shell, Blueprint .blp sources compiled to committed .ui
+ (=make ui=; dev-only build dependency, fresh clones run without the
+ compiler).
+- Humble-object split: a GTK-free PanelModel presenter (unit-tested to 100%
+ like the net PanelModel) + thin composite-widget pages. Backing actions in
+ a GTK-free settings.py that shells out to brightnessctl / hyprctl / the
+ existing toggle scripts, TDD'd with fake binaries like every dotfiles
+ suite.
+- One gated AT-SPI smoke (the run-panel-smoke.sh pattern), no bespoke
+ headless widget suite.
+- Instrument-console faceplate aesthetic, consistent with net + bt + audio:
+ the machined gradient plate, glowing status lamps, engraved section labels,
+ physical console keys for the toggles, and (where a level applies) needle
+ gauges. Load the shared instrument-console palette/faceplate CSS asset all
+ the family panels use — factor it once, don't duplicate (feeds the
+ theme-studio task later).
+
+** Controls and their backings
+
+| Control | Backing |
+|--------------------+----------------------------------------------|
+| Auto-dim toggle | hyprctl decoration:dim_inactive (dim-toggle) |
+|--------------------+----------------------------------------------|
+| Idle / caffeine | hypridle start/stop (caffeine-toggle) |
+|--------------------+----------------------------------------------|
+| Touchpad toggle | toggle-touchpad + touchpad-state file |
+|--------------------+----------------------------------------------|
+| Mouse toggle | same mechanism, mouse-state file |
+|--------------------+----------------------------------------------|
+| Airplane mode | airplane-mode script (laptop-only row) |
+|--------------------+----------------------------------------------|
+| Screen brightness | brightnessctl (backlight class), slider + % |
+|--------------------+----------------------------------------------|
+| Keyboard backlight | brightnessctl (kbd_backlight class), slider |
+|--------------------+----------------------------------------------|
+
+Slider changes apply live (throttled) and read back the actual level after
+apply — verify-everything. Toggles re-read their source of truth after
+firing, same as the bar indicators do, and the bar modules get their refresh
+signals so both surfaces agree.
+
+** Open/close behavior
+
+Gear glyph module on the bar right cluster; click toggles the panel
+(layer-shell anchored under the bar, right-aligned). Focus-out auto-hide +
+Close button, matching the net panel. Keybind: Super+Shift+G (decision B).
+
+* Decisions (Craig)
+
+** DONE Which standalone bar indicators collapse into the panel?
+CLOSED: [2026-07-04 Sat]
+Resolved (Craig, 2026-07-04): touchpad and caffeine stay on the bar (glanceable state); auto-dim and airplane move into the panel (panel-only, freeing bar width). The airplane Super+Shift+A toggle keybind stays as the quick lane — only its bar indicator collapses in.
+
+** DONE Keybind for the panel?
+CLOSED: [2026-07-04 Sat]
+Resolved (Craig, 2026-07-04): Super+Shift+G (gear), for parity with the other panels' fast path.
+
+** DONE Where does the code live?
+CLOSED: [2026-07-04 Sat]
+Resolved (Craig, 2026-07-04): dotfiles =settings/= sibling to =net/= (same src-layout, tests in tests/settings/), sharing the palette css. The net panel is the architecture donor; the old in-tree pocketbook-style note is out.
+
+** DONE Slider granularity and floor
+CLOSED: [2026-07-04 Sat]
+Resolved (Craig, 2026-07-04): 5% floor on the brightness slider, so a dark-room drag can't black the screen out and lock you out. brightnessctl's 0-100% range clamps to a 5% minimum.
+
+** TODO What are the "few other things" beyond the toggles?
+The 2026-07-03 discussion named consolidating the toggle buttons "and a few
+other things" into this panel, but the extras weren't enumerated. Current
+control list (above): auto-dim, idle/caffeine, touchpad, mouse, airplane,
+screen brightness, keyboard backlight. Candidates raised or adjacent —
+confirm which belong here vs the audio panel vs the bar: night-light / color
+temperature, a theme/dupre-vs-hudson switch (theme-studio kin), volume or a
+master-mute mirror (or leave all audio to the audio panel), a
+notifications/do-not-disturb toggle (dunst), lock/suspend actions. Craig to
+name the set.
+
+*** 2026-07-04 Sat — Craig's input (roam capture): the set includes a wallpaper manager
+Confirmed the panel gathers the mouse/trackpad toggle, a no-sleep (idle-inhibit) toggle, and the auto-dim toggle, and adds a *wallpaper manager* (this is where the displaced waypaper functionality lands — see the media/keybind change that freed Super+Shift+P). The wallpaper manager needs its own depth:
+- take a number of directories to look in;
+- switch the wallpaper with the change persisting across sessions;
+- switch between two pictures at sunup / sundown (a day/night pair).
+That last one implies a sun-time source (a lat/long or a sunrise/sunset lookup). The wallpaper manager is sizable enough it may want its own sub-spec rather than a single panel row; decide during the spec-review whether it's a row that opens a sub-view or a separate panel. Remaining "few other things" candidates above (night-light, theme switch, DND, lock/suspend) still await Craig's yes/no.
+
+* Implementation phases
+
+1. settings.py backings (brightness get/set, kbd backlight, toggle
+ state readers) — pure engine, TDD with fake brightnessctl/hyprctl.
+2. PanelModel presenter (rows, conditional visibility, verify-after-apply
+ semantics) — unit-tested, no GTK.
+3. Blueprint UI + gear bar module + open/close wiring; palette css factored
+ to a shared asset; AT-SPI smoke.
+4. Bar-module consolidation per decision A: drop the dim and airplane bar
+ modules (now panel-only), keep touchpad and caffeine on the bar, wire the
+ refresh signals so bar and panel agree, and bind Super+Shift+G.