feat(displays): display profiles — docked/undocked switching (item 15a)
All checks were successful
Check / eval (push) Successful in 3m4s
All checks were successful
Check / eval (push) Successful in 3m4s
nomarchy.displayProfiles: named layouts for the same outputs, each a list of nomarchy.monitors-style entries. The active profile lives in the in-flake state (settings.displayProfile) on the night-light pattern: nomarchy-display-profile apply <name> fires the baked hyprctl rules instantly and writes the state with --no-switch; the next rebuild bakes the profile's entries over nomarchy.monitors whole-by-name. Monitor-rule composition is extracted to pure monitor-rules.nix (renderer + 3-layer resolve, incl. a disable-guard so a stale menu resolution pick can't resurrect a profile-disabled panel, and junk state degrading to base config instead of an eval error) — because a writeText/toFile state fixture is unreadable at flake-check eval time, the new checks.display-profiles unit-tests the pure function directly. Menu: System › Display gains a self-gated "Profiles ›" row (●/○ active mark, Base layout to clear); commented template example + README row. Verified: V0 (flake check, forcing the new check's asserts); V1 — a scratch downstream through lib.mkFlake builds: the generated tool passes bash -n with correct rules (disable/vrr/float scale), the baked hyprland.conf shows the exact expected overlay, the menu renders, and list/usage smoke-test clean. Remains: V3 live switching on a dock (HARDWARE-QUEUE). Slices b (hotplug auto-switch) + c (workspace binding) stay in item 15. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
43
flake.nix
43
flake.nix
@@ -332,6 +332,49 @@
|
||||
'';
|
||||
};
|
||||
|
||||
# Unit test of the monitor-rule overlay (modules/home/
|
||||
# monitor-rules.nix — pure, imported directly, no HM eval): the
|
||||
# active profile must replace base entries whole by name, leave
|
||||
# unnamed base outputs alone, and the disable-guard must stop a
|
||||
# stale menu resolution pick (settings.monitors) resurrecting a
|
||||
# panel the profile disables. Junk in settings.displayProfile
|
||||
# degrades to base config, never an eval error.
|
||||
display-profiles =
|
||||
let
|
||||
inherit (nixpkgs) lib;
|
||||
monitorLib = import ./modules/home/monitor-rules.nix { inherit lib; };
|
||||
entry = a: monitorLib.defaults // a;
|
||||
fixture = {
|
||||
base = [
|
||||
(entry { name = "eDP-1"; position = "0x0"; })
|
||||
(entry { name = "HDMI-A-1"; position = "auto-right"; })
|
||||
];
|
||||
profiles.docked = [
|
||||
(entry { name = "eDP-1"; resolution = "disable"; })
|
||||
(entry { name = "DP-3"; position = "0x0"; })
|
||||
];
|
||||
resOverrides."eDP-1" = "1920x1080@60"; # stale pick — must stay dead
|
||||
};
|
||||
rulesFor = active: map monitorLib.rule
|
||||
(monitorLib.resolve (fixture // { inherit active; }));
|
||||
docked = rulesFor "docked";
|
||||
junk = rulesFor 42; # hand-edited state (validator only warns)
|
||||
expect = cond: msg: lib.assertMsg cond
|
||||
"display-profiles: ${msg} (rendered: ${builtins.toJSON docked})";
|
||||
ok =
|
||||
expect (lib.elem "eDP-1, disable" docked)
|
||||
"the profile did not disable eDP-1"
|
||||
&& expect (! lib.any (lib.hasInfix "1920x1080") docked)
|
||||
"a stale resolution pick resurrected the disabled panel"
|
||||
&& expect (lib.elem "DP-3, preferred, 0x0, 1" docked)
|
||||
"the profile-only output's rule is missing"
|
||||
&& expect (lib.elem "HDMI-A-1, preferred, auto-right, 1" docked)
|
||||
"an unnamed base output lost its rule"
|
||||
&& expect (lib.elem "eDP-1, 1920x1080@60, 0x0, 1" junk)
|
||||
"junk active profile must degrade to base config (with the pick applied)";
|
||||
in
|
||||
assert ok; pkgs.runCommand "nomarchy-display-profiles" { } "touch $out";
|
||||
|
||||
# The low-battery watcher's crossing logic: one toast per downward
|
||||
# crossing (normal at 25%, critical at 10%), re-armed by charging.
|
||||
# test_power fakes a battery whose capacity/status we script;
|
||||
|
||||
Reference in New Issue
Block a user