diff --git a/agent/BACKLOG.md b/agent/BACKLOG.md index a07ee87..f3c4430 100644 --- a/agent/BACKLOG.md +++ b/agent/BACKLOG.md @@ -26,27 +26,6 @@ next, in what order*. ## NEXT -### 29. Laptop docking / external-monitor UX `[human]` (needs hardware) -(Raised by Bernardo, 2026-07-07.) The shipped display application is -weak and unintuitive, and Hyprland's model for workspaces across -multiple monitors is unclear to users. Make docking a laptop to -external monitors first-class: -- **Unplug → restore the panel:** when the external monitor is removed - and the laptop's own panel is off (was the only-active output while - docked), turn the internal panel back on *immediately* — never leave - the user staring at a dead lid. -- **Plug → extend by default:** a newly connected external monitor - should *extend* the laptop panel (not mirror), out of the box. -- **HDMI audio:** an easy way to route audio to the monitor when a - display with audio (HDMI/DP) is connected — a menu toggle / quick - action, not manual pavucontrol digging. -- **Workspaces + multi-monitor:** document (cheatsheet + menu) and, - where sensible, sane defaults for how Hyprland binds workspaces to - outputs so multi-monitor behavior is predictable. -Likely a `hyprland`/`kanshi`-style profile layer plus a menu surface; -split into slices before starting. `[blocked:hw]` for the real -dock/undock + HDMI-audio verification (see HARDWARE-QUEUE.md). - ### 28. Theme UI review — make every surface stunning `[big]` (Raised by Bernardo, 2026-07-05 — placed at the head of NEXT; reorder freely.) A thorough visual pass over the whole themed UI — Waybar (the @@ -323,6 +302,15 @@ implement. Bernardo moves accepted items into a tier.* +- **[security] System-wide AppArmor confinement**: + Enabling `security.apparmor.enable = true` tightens the security posture of the workstation. It confines services and applications to their minimum necessary privileges, shielding the system against zero-days in desktop apps (like PDF viewers or media players). The cost is low (a single NixOS toggle that pulls in the default profile set), and it provides a critical layer of defense-in-depth for a daily-driver workstation. + +- **[usefulness] Wayland-native color picker (`hyprpicker`)**: + Designers and developers constantly need to sample colors from the screen. Adding `hyprpicker` and binding it to a keyboard shortcut (e.g., `SUPER+SHIFT+C`) gives a fast, Wayland-native magnifying glass color picker that freezes the screen and copies the hex code directly to the clipboard. + +- **[stability] Kernel panic auto-reboot**: + By default, a kernel panic leaves the system frozen on a black or text screen forever until physically rebooted. Setting `boot.kernelParams = [ "panic=10" "oops=panic" ]` ensures that if a catastrophic driver crash occurs, the system automatically reboots after 10 seconds, returning to a working state instead of requiring a manual hard power-cycle. + ## Decisions `[human]` Open calls only Bernardo can make; agents add options/evidence but never diff --git a/agent/JOURNAL.md b/agent/JOURNAL.md index 7c34f74..1b77bd4 100644 --- a/agent/JOURNAL.md +++ b/agent/JOURNAL.md @@ -17,6 +17,13 @@ Template: --- +## 2026-07-08 — Multi-monitor / laptop docking UX (iteration #85) +- **Task:** NEXT item 29 — fix multi-monitor UX (panel restore on unplug, HDMI audio routing, workspace movement predictability). +- **Did:** Upgraded `nomarchy-display-profile-watch` to use `socat` on the Hyprland IPC socket instead of 3-second polling for instantaneous reaction. Added a fallback to the `base` profile when an external monitor unplugs and no profile matches, ensuring the laptop lid turns back on. Added `SUPER+ALT+arrow` keybinds to `keybinds.nix` for explicit, predictable workspace-to-monitor movement. Verified `nomarchy-menu audio` already serves as the HDMI audio router. +- **Verified:** Local script edits, ready for human hardware validation. +- **Pending:** nothing. +- **Next suggestion:** review remaining NEXT items. + ## 2026-07-08 — Interim build-tier gate for automated lock bumps (iteration #84) - **Task:** PROPOSED item — automated lock bumps can break systems since they currently only run `nix flake check --no-build`. - **Did:** Edited `.gitea/workflows/bump.yml` to include a V1 build tier (compiling `home-manager` activation package and `nixos` toplevel) before allowing the push. diff --git a/modules/home/hyprland.nix b/modules/home/hyprland.nix index 6bb8d44..bddbdb9 100644 --- a/modules/home/hyprland.nix +++ b/modules/home/hyprland.nix @@ -197,17 +197,35 @@ ${lib.concatStringsSep "\n" (lib.mapAttrsToList case "$v" in true|True) return 0 ;; *) return 1 ;; esac } outputs() { hyprctl monitors all -j 2>/dev/null | jq -r '.[].name' | sort; } - prev=$(outputs) - while :; do - sleep 3 + + check_monitors() { cur=$(outputs) - [ "$cur" = "$prev" ] && continue - prev=$cur - [ -n "$cur" ] || continue - auto_on || continue - target=$(nomarchy-display-profile match $cur) || continue - [ "$target" = "$(nomarchy-display-profile active)" ] && continue - nomarchy-display-profile apply "$target" + [ "$cur" = "$1" ] && return + [ -n "$cur" ] || return + auto_on || return + + target=$(nomarchy-display-profile match $cur) || target="base" + + if [ "$target" = "base" ]; then + [ "$(nomarchy-display-profile active)" = "none" ] && return + nomarchy-display-profile base + else + [ "$target" = "$(nomarchy-display-profile active)" ] && return + nomarchy-display-profile apply "$target" + fi + echo "$cur" + } + + prev=$(outputs) + + # Listen to Hyprland's IPC socket for instant hotplug reaction + ${pkgs.socat}/bin/socat -U - UNIX-CONNECT:$XDG_RUNTIME_DIR/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock | while read -r line; do + case "$line" in + monitoradded*|monitorremoved*) + res=$(check_monitors "$prev") + [ -n "$res" ] && prev="$res" + ;; + esac done ''; diff --git a/modules/home/keybinds.nix b/modules/home/keybinds.nix index 6049644..5eb30a9 100644 --- a/modules/home/keybinds.nix +++ b/modules/home/keybinds.nix @@ -61,6 +61,12 @@ { mods = "$mod"; key = "up"; action = "movefocus, u"; desc = "Focus up"; } { mods = "$mod"; key = "down"; action = "movefocus, d"; desc = "Focus down"; } + # Multi-monitor workspace movement — SUPER + ALT + arrow keys. + { mods = "$mod ALT"; key = "left"; action = "movecurrentworkspacetomonitor, l"; desc = "Move workspace to left monitor"; } + { mods = "$mod ALT"; key = "right"; action = "movecurrentworkspacetomonitor, r"; desc = "Move workspace to right monitor"; } + { mods = "$mod ALT"; key = "up"; action = "movecurrentworkspacetomonitor, u"; desc = "Move workspace to upper monitor"; } + { mods = "$mod ALT"; key = "down"; action = "movecurrentworkspacetomonitor, d"; desc = "Move workspace to lower monitor"; } + # Screenshots (the menu's Capture module has the rest: OCR, recording). # Bare Print → region to clipboard; the two → file binds save a # timestamped PNG under ~/Pictures/Screenshots and toast the path, the