diff options
Diffstat (limited to 'AGENTS.md')
| -rw-r--r-- | AGENTS.md | 63 |
1 files changed, 63 insertions, 0 deletions
@@ -181,6 +181,69 @@ changing that component. The ones that generalise: only a runtime `TypeError` in the log and a clean smoke check (the drawer was closed, so nothing was instantiated). Inject an id under a different name: `net`, `bt`, `kc`. +- **Neither scan property self-terminates, and closing the drawer does not stop + them.** `BluetoothAdapter.discovering` is plain BlueZ discovery and + `WifiDevice.scannerEnabled` is a repeating scanner; only `discoverable` and + `pairable` have timeout properties, and the scan ones have none. The scan + button was the sole writer of each, and a drawer close destroys the page + without touching them, so a scan started and forgotten kept the radio busy + for the rest of the session. Both pages now carry a `Timer` bound to the scan + property rather than started by the button, so a manual stop cancels the + clock and reopening the page re-arms a fresh 60s. +- **This machine does run a logind.** `elogind` is running, `pam_elogind.so` is + in the PAM stack for `login`, `sddm`, `xdm` and `kde`, and `loginctl + list-sessions` reports a tracked session on seat0. "Slackware has no logind" + is the obvious assumption and it is wrong; it reached a committed spec once. + The real caveat is narrower: `man 8 pam_elogind` says the module does nothing + if the system was not booted with elogind as its init, which here it is not, + so its documented removal of `$XDG_RUNTIME_DIR` at last logout is not + guaranteed for this configuration. A reboot clears it regardless, because + `/run/user/1000` is tmpfs. +- **hypridle honours the Wayland idle-inhibit protocol here.** The compositor + advertises `zwp_idle_inhibit_manager_v1` (version 1), confirmed with + `wayland-info`, and waybar's built-in `idle_inhibitor` already drives it. So + an idle inhibitor is asserted over Wayland, not D-Bus, and needs no extra + service. `hypridle` has `ignore_dbus_inhibit` and `ignore_systemd_inhibit` + knobs; neither is set in the live config. +- **waybar's built-in `idle_inhibitor` cannot indicate state it does not own.** + It holds its own inhibitor object, and its `activated`/`deactivated` classes + are that object's state, with no input path. It cannot be demoted to an + indicator for a mode owned elsewhere, and left running alongside another + inhibitor it asserts a second, independent one, so idle resumes only when + both release. Replace it with a `custom/` module reading the owning + component's state. +- **A `FileView` that writes the file it watches sees its own write.** + `watchChanges` fires `fileChanged` on `setText()` as well as on an external + change, so a handler that writes in response to a change loops. The status + registry compares the reparsed value against the current one and assigns + only on a difference, which makes the self-write a no-op. +- **`IdleInhibitor` needs a non-null `window`.** It has no window of its own + and does nothing without one. A singleton therefore cannot assert an + inhibitor unaided: `shell.qml` hands it the keepalive `PanelWindow`, which + is the one window that exists for the whole session. +- **A layer-surface idle inhibitor is not observable via `hyprctl clients` or + `hyprctl layers`.** `hyprctl clients | grep -ci inhibit` counts the + per-toplevel `inhibitingIdle` field only, and an inhibitor asserted on a + `PanelWindow` layer surface appears in neither listing, so the count does not + move even when the inhibitor is asserted. Check it behaviorally: run a + throwaway `hypridle -c` with a short timeout whose `on-timeout` writes a + marker, confirm the marker does not appear while presentation is on, and + that it appears within a few seconds of turning presentation off. +- **The notification daemon is a separate process that owns the D-Bus name.** + The quickshell side only reads its published files under + `$XDG_RUNTIME_DIR/notifyd/`; the files are the interface, and `notifyctl` is + the one path back. `notifications/` is inert without it: balloons still + draw, but close and actions do nothing. +- **Suppression is in the balloon shell, not the daemon.** `status.dnd` + withholds low and normal balloons and `notifyd/snooze` withholds all, but + the drawer's reserved space lists everything, because a list the user opened + is not an interruption. +- **A notification appears as a balloon or in the drawer's reserved space, + never both.** The drawer writes `notifyd/drawer` and the balloon shell reads + it; `desktop/NotificationList.qml` is the space. +- **The dead `waybar/modules/custom/notification.jsonc` and + `waybar/scripts/notifications.py` still shell out to `dunstctl`.** They are + not in the live waybar config; do not resurrect them. ## Theme |
