feat(bar): idle-inhibit (caffeine) toggle — generated bar + summer-day parity (item 13 slice)
All checks were successful
Check / eval (push) Successful in 2m55s

Summer-night's whole-swap bar had an idle_inhibitor the generated bar
lacked (reverse parity gap from the 2026-07-04 sweep). The generated
bar now carries it — 󰾪 click → 󰅶, warm tint while active, tooltips
saying what it holds — blocking hypridle's lock/display-off/suspend
for videos and presentations; state deliberately resets with the bar.
summer-day mirrors summer-night's module + CSS, and the keybinds
cheatsheet mentions the bar click (via keybinds.extra).

V1: rendered config has the module with correct glyphs, CSS rules
present, cheatsheet row renders. Inhibit behaviour needs a session →
V3 queued.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernardo Magri
2026-07-04 21:05:03 +01:00
parent 0fe46221ea
commit b7b51e9354
7 changed files with 59 additions and 8 deletions

View File

@@ -27,11 +27,9 @@ next, in what order*.
## NEXT
### 13. Small niceties batch (one slice per iteration)
Each is a small, self-contained polish item in the existing patterns:
- **Idle-inhibit (caffeine) toggle:** Waybar `idle_inhibitor` module
(blocks hypridle lock/suspend during video/presentations) in the
GENERATED bar — summer-night already has one (reverse parity gap
found 2026-07-04); add to summer-day too + cheatsheet mention.
Each is a small, self-contained polish item in the existing patterns
(idle-inhibit/caffeine slice shipped 2026-07-04 — generated bar +
summer-day parity + cheatsheet row):
- **Low-battery notifications:** the bar colors at 25/10% but nothing
*notifies*; gate on `power.laptop` (poweralertd, or a small upower
watcher consistent with how the bar reads state).

View File

@@ -86,6 +86,10 @@ QA machine), the **T14s** (webcam case).
`sudo nomarchy-snapshots`, restore a single file (`undochange`)
and walk a root-config rollback up to (or through) the
typed-`yes` gate.
- [ ] **Caffeine toggle (item 13 slice)** — click 󰾪 in the bar → turns
󰅶 (warm tint on the generated bar) and hypridle must NOT lock /
blank while it's on (wait past the 5-min lock); click again
releases. Also present on both summer bars now.
- [ ] **Screen recording (item 12)** — Tools Capture: Record region
(slurp) and Record screen produce a playable .mp4 in
~/Videos/Recordings; the red ⏺ REC appears in the bar instantly

View File

@@ -17,6 +17,23 @@ Template:
---
## 2026-07-04 — caffeine/idle-inhibit toggle (iteration #23, item 13 slice)
- **Task:** BACKLOG NEXT#13 first slice — idle_inhibitor in the
generated bar (summer-night had it; reverse parity gap).
- **Did:** waybar.nix: idle_inhibitor module (󰾪/󰅶, tooltips, placed
after the ⏺), CSS membership + `.activated { color: @warn; }`.
summer-day: module + CSS mirrored from summer-night (same glyphs,
no tint — glyph change is the state signal there). keybinds.nix
extra row → cheatsheet mentions the bar click.
- **Verified:** V0; V1 — template-home built; rendered config has the
module second in modules-right with correct glyphs; CSS rules
present; cheatsheet row renders. Inhibit behaviour needs a session
→ V3 queued (hold past the lock timeout).
- **Pending:** V3. Item 13 remaining slices: low-battery
notifications, color picker.
- **Next suggestion:** item 13 next slice (low-battery notifications,
gate on power.laptop) — or #14 lock-bump CI if variety is better.
## 2026-07-04 — screen recording in Capture (iteration #22, item 12)
- **Task:** BACKLOG NEXT#12 — record region/screen from the menu, stop
from the bar.

View File

@@ -76,5 +76,6 @@
{ keys = "SUPER + SHIFT + 1-9"; desc = "Move window to workspace 1-9"; }
{ keys = "SUPER + drag"; desc = "Move (LMB) / resize (RMB) window"; }
{ keys = "Volume / Brightness"; desc = "Hardware keys, shown via the OSD"; }
{ keys = "Bar: 󰾪 click"; desc = "Caffeine hold the screen awake (idle inhibitor)"; }
];
}

View File

@@ -121,7 +121,7 @@ let
modules-left = [ "hyprland/workspaces" "hyprland/window" ];
modules-center = [ "clock" ];
modules-right = [ "custom/recording" "tray" "custom/vpn" "pulseaudio" "cpu" "memory" "custom/powerprofile" "custom/nightlight" ]
modules-right = [ "custom/recording" "idle_inhibitor" "tray" "custom/vpn" "pulseaudio" "cpu" "memory" "custom/powerprofile" "custom/nightlight" ]
++ lib.optional showLanguage "hyprland/language"
++ [ "battery" "custom/updates" "custom/notification" ];
@@ -155,6 +155,19 @@ let
on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
};
# Idle inhibitor (caffeine): click 󰾪 → 󰅶 to hold the screen awake —
# blocks hypridle's lock / display-off / suspend during video or a
# presentation. Waybar holds a Wayland idle-inhibit while activated;
# the state resets with the bar (deliberate — caffeine shouldn't
# survive a relogin). Summer-night's whole-swap bar had this first
# (reverse parity gap, 2026-07-04).
idle_inhibitor = {
format = "{icon}";
format-icons = { activated = "󰅶"; deactivated = "󰾪"; };
tooltip-format-activated = "Screen held awake click to release";
tooltip-format-deactivated = "Keep the screen awake (caffeine)";
};
# No network module: nm-applet lives in the tray (the GUI path), so the
# bar's wifi/ethernet indicator would just duplicate it.
@@ -296,11 +309,14 @@ let
font-weight: bold;
}
#tray, #pulseaudio, #cpu, #memory, #custom-powerprofile, #custom-nightlight, #custom-updates, #custom-vpn, #custom-recording, #language, #battery, #custom-notification {
#tray, #pulseaudio, #cpu, #memory, #custom-powerprofile, #custom-nightlight, #custom-updates, #custom-vpn, #custom-recording, #idle_inhibitor, #language, #battery, #custom-notification {
color: alpha(@text, 0.85);
padding: 0 10px;
}
/* Caffeine engaged warm tone (the screen is being held awake). */
#idle_inhibitor.activated { color: @warn; }
/* Recording in progress the alert red; the is also the stop button. */
#custom-recording.recording { color: @bad; }

View File

@@ -44,6 +44,7 @@ window#waybar {
#custom-launcher,
#custom-recording,
#idle_inhibitor,
#clock,
#clock-date,
#workspaces,
@@ -116,6 +117,12 @@ window#waybar {
padding-right: 23px;
}
#idle_inhibitor {
padding-left: 10px;
padding-right: 10px;
font-size: 20px;
}
/* Recording in progress: alert red; the module is also the stop button. */
#custom-recording.recording {
color: @red;

View File

@@ -11,7 +11,7 @@
"modules-left": ["custom/launcher", "clock", "clock#date"],
"modules-center": ["hyprland/workspaces"],
"modules-right": ["custom/recording", "pulseaudio", "custom/powerprofile", "custom/nightlight", "hyprland/language", "custom/updates", "battery", "tray", "custom/vpn", "custom/notification", "custom/powermenu"],
"modules-right": ["custom/recording", "idle_inhibitor", "pulseaudio", "custom/powerprofile", "custom/nightlight", "hyprland/language", "custom/updates", "battery", "tray", "custom/vpn", "custom/notification", "custom/powermenu"],
"hyprland/workspaces": {
"disable-scroll": true,
@@ -28,6 +28,14 @@
"tooltip-format": "Nomarchy menu"
},
"idle_inhibitor": {
"format": "{icon}",
"format-icons": {
"activated": " 󰅶 ",
"deactivated": " 󰾪 "
}
},
"pulseaudio": {
"format": "{icon} {volume}%",
"format-bluetooth": "{icon}  {volume}%",