diff --git a/README.md b/README.md index 28fda59..d056327 100644 --- a/README.md +++ b/README.md @@ -454,10 +454,15 @@ close · `SUPER+1..9` workspaces · `Print` region screenshot. default; the installer scaffolds it commented-out on laptops. - ✓ **installer:** writes `power.laptop = true` (battery probe) and `power.thermal.enable` (Intel) into the generated `system.nix`. - - Remaining: **cohere** with `modules/home/idle.nix` (AC-vs-battery idle - timeouts / no auto-suspend on AC) and review logind lid handling, plus a - boot-only→event-driven charge-limit re-apply (udev) if a firmware resets - the threshold on unplug. + - ✓ **idle cohesion:** `modules/home/idle.nix` now suspends only on + battery (and sooner — 15 min vs the old fixed 30), gating the hypridle + suspend listener on a `nomarchy-on-ac` probe so a plugged-in machine + stays up mid-idle; lock/screen-off are unchanged on both sources. + logind's lid handling is left at its defaults (suspend on lid close, + ignore when docked) — an explicit "I'm done" that coheres with the + idle behaviour. + - Remaining: a boot-only→event-driven charge-limit re-apply (udev) if a + firmware resets the threshold on unplug. - **Opt-in services & integrations:** the counterpart to the opt-*out* application suite above — heavier or more personal integrations shipped **off by default**, each a `nomarchy.services..enable` toggle a diff --git a/modules/home/idle.nix b/modules/home/idle.nix index eaec51b..62d7849 100644 --- a/modules/home/idle.nix +++ b/modules/home/idle.nix @@ -2,13 +2,23 @@ # theme-state.json. One concern, one file: hypridle drives WHEN (idle # lock, display off, suspend, lock-before-sleep), hyprlock is the # themed lock screen itself (also behind the power menu's Lock entry). -{ config, lib, ... }: +{ config, lib, pkgs, ... }: let cfg = config.nomarchy; t = cfg.theme; c = t.colors; inherit (config.nomarchy.lib) rgb; + + # Exits 0 when running on AC: a mains adapter reports `online` 1 (battery + # supplies have no `online` node, so they never match). Used as + # `${onAc} || ` so the action is skipped while plugged in. + onAc = pkgs.writeShellScript "nomarchy-on-ac" '' + for f in /sys/class/power_supply/*/online; do + [ -r "$f" ] && [ "$(cat "$f")" = "1" ] && exit 0 + done + exit 1 + ''; in { config = lib.mkIf cfg.idle.enable { @@ -62,13 +72,20 @@ in after_sleep_cmd = "hyprctl dispatch dpms on"; }; listener = [ + # Lock and screen-off are the same on either power source — + # they're about privacy and the panel, not battery. { timeout = 300; on-timeout = "loginctl lock-session"; } { timeout = 600; on-timeout = "hyprctl dispatch dpms off"; on-resume = "hyprctl dispatch dpms on"; } - { timeout = 1800; on-timeout = "systemctl suspend"; } + # Suspend only on battery, and sooner than the old fixed 30 min + # (it now only fires unplugged). Plugged in, the machine stays + # up — long builds, media, presentations aren't killed mid-idle. + # Closing the lid still suspends on AC (logind's default): that's + # an explicit "I'm done", distinct from sitting idle. + { timeout = 900; on-timeout = "${onAc} || systemctl suspend"; } ]; }; };