summaryrefslogtreecommitdiffstats
path: root/shared/Status.qml
AgeCommit message (Collapse)AuthorFilesLines
2026-09-18feat(status): read breaktimer phase, state and countdownDanilo M.1-0/+74
The daemon already publishes these three files under XDG_RUNTIME_DIR and waybar already consumes them, so a second consumer costs three FileViews and invents no interface. Read only, deliberately. The daemon loop rewrites state and phase on every transition, so a second writer would race it, which is why presentation mode has always called a verb rather than writing the file. The countdown does not interpolate between the daemon's five second writes: a local clock would drift against it and keep ticking while the daemon is frozen outside the work window.
2026-09-18feat(status): add a screen lock modeDanilo M.1-8/+50
dnd and presentation were the only modes, and presentation was the sole holder of the Wayland idle inhibitor. That inhibitor is the only thing that stops hypridle's loginctl lock-session at the 600s timeout, so screen locking is on by default and there was no way to turn it off on its own. nolock is stored as "auto-lock disabled" so the file keeps the registry's "missing means off" rule, and the row inverts it so the switch reads as the default: lock on. Presentation now drives nolock the same way it drives dnd, holding the prior value in memory and restoring it on exit, so it needs no second inhibitor and the inhibitor has a single holder. The page sets the disable permanently or for a number of minutes. The deadline and its timer live in the singleton rather than the row because the drawer page is destroyed on close while the effect has to outlive it. The timer is shell-lifetime, the same class of limit as dndBeforePresentation: a restart during a timed disable leaves the lock off until it is toggled, which is safe because the user opted into the disable. The mode governs idle-triggered locking only. The SUPER+l bind and the lock on suspend are separate paths and stay live.
2026-09-15fix(status): address final review findingsDanilo M.1-1/+11
F1: after a click the shared Switch writes checked directly, dropping StatusRow's declarative binding, so an external mode change from waybar or statusctl no longer moved the switch. Resync via onValueChanged. F2: the spec claimed hyprctl clients counts idle inhibitors, which is false for a layer-surface inhibitor; replace with the behavioral hypridle marker check. F3: README said the check covers both watch states; it exercises the activated report and the absent-file down report. F4: give breakProc an onExited check so a failed breaktimer.sh verb is visible instead of silent. F5: drop StatusTile's unused required st property and its injection. F6: comment the startup-order limit on dndBeforePresentation.
2026-09-15feat(desktop): add presentation mode and its effectsDanilo M.1-7/+56
Presentation mode sets DND, asserts a Wayland idle inhibitor and pauses breaktimer. The effects hang off the mode property rather than the setter, so a mode set with statusctl while the drawer is closed asserts them too. DND has two writers once presentation mode exists, so turning presentation off restores the value DND had before rather than clearing it, or an afternoon of hand-set DND would vanish when a talk ends. That prior value lives in the singleton, not in a file: it means nothing once presentation mode is off, and presentation mode does not survive a reboot. breaktimer owns its own state file and is driven only through its verbs. Two writers on that file would race with its daemon loop.
2026-09-15feat(desktop): add the status singleton with the dnd modeDanilo M.1-0/+80
Modes live as files under XDG_RUNTIME_DIR, one per mode, holding 0 or 1, with a missing file meaning off. That directory is tmpfs, so a reboot resets every mode and no cleanup code is needed. FileView covers both directions: atomicWrites for the write, watchChanges for the watch, so an external writer repaints the drawer with no polling. Both are already the documented defaults in 0.3.1 and are set explicitly anyway, because statusctl watches close_write,moved_to precisely because an atomic write lands as a rename. A future release flipping either default would break the watcher with no error, and a declaration is a stronger guarantee than a default. The documented behaviour is that a FileView fires its own fileChanged on setText, so the reparse compares before assigning and a self-write is a no-op rather than a loop. That has not been observed running yet: nothing consumes the singleton until the status module exists, so the guard stays unproven until then. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01A7ThHHh5iTYbVfp3rNAkw2