fix(packages): add app2unit to the AUR package list

The quickshell launcher and NetworkPopout start apps through app2unit so
each one gets its own transient systemd scope instead of inheriting
quickshell's cgroup. app2unit is an AUR package and was never listed, so
on Arch the binary is absent and Quickshell.execDetached fails silently:
the launcher opens, filters entries and starts nothing, leaving no trace
in the quickshell log. NixOS carries app2unit in the system environment,
which is why the switch went unnoticed there.

Not a PKGBUILD depends — pacman cannot resolve AUR packages
(moonarch-pkgbuilds/DECISIONS.md, 2026-04-21). moonarch-update reports it
as missing and offers to install it from aur.txt.
This commit is contained in:
nevaforget committed 2026-09-11 08:47:47 +02:00
1 parent 924d5c07f4
commit 5768f21645
2 files changed
+3 -1

No files matched your search

+2 -1
View File
@@ -104,7 +104,8 @@ quickshell is the **default bar and notification daemon**, spawned by niri as `q
- **Close on focus loss:** an open popout folds up as soon as the focus leaves it. Three signals, all of them needed: (1) the host surface losing the keyboard — `PopoutHost` reads Qt's `Window.active`, since Quickshell's `PanelWindow` exposes no focus state of its own; this is the only signal that catches a focus grab by another *layer surface*. (2) niri focusing an actual window (`Niri.focusedWindowId >= 0`). The `>= 0` matters: niri sets window focus to **none** while the popout holds the keyboard (`Window focus changed: None` on the event stream), so reacting to every change would make each open close itself. (3) The focused workspace changing (`Niri.focusedWorkspaceId`) — workspace ids are unique across outputs, so this covers a monitor switch as well; a workspace switch does not necessarily take the keyboard off the popout, which is why (1) does not subsume it. `PopoutHost.sawFocus` gates the first `Window.active == false`, which arrives in the gap between mapping the surface and the compositor handing focus over.
- **No exception for auth prompts.** A popout action that raises a pkexec or keyring prompt (camera, cpugov, batsaver, VPN) loses the focus to it and therefore closes the popout; the resulting state shows on the next open. That is a deliberate choice for one rule over a special case — the `OnDemand` keyboard focus in `PopoutHost` still exists so such a prompt can become typeable at all.
- **Launcher:** `Launcher.qml` is the first widget in the left cluster (an apps glyph) and owns `LauncherPopout.qml` — an application launcher over `DesktopEntries.applications` (search field + keyboard-navigable icon+name list; ↑/↓ select, Enter/click launch via `entry.execute()`, Esc close; app icons via `Quickshell.iconPath`). It registers under `launcher` (so it is IPC-addressable) and is bound to `Mod+Space` (`qs -c moonarch ipc call popout toggle launcher`, in `config.kdl`) in addition to icon-click. Scope is app-launch (drun) only; `walker` stays installed and keeps the other modes (run-command, calc, files), but has no keybind of its own left — what still calls it is dmenu duty for the Waybar-reserve scripts (`moonarch-sink-switcher`, `moonarch-cpugov`, `moonarch-vpn`), which is why the package cannot be dropped.
- **Launcher:** `Launcher.qml` is the first widget in the left cluster (an apps glyph) and owns `LauncherPopout.qml` — an application launcher over `DesktopEntries.applications` (search field + keyboard-navigable icon+name list; ↑/↓ select, Enter/click launch, Esc close; app icons via `Quickshell.iconPath`). It registers under `launcher` (so it is IPC-addressable) and is bound to `Mod+Space` (`qs -c moonarch ipc call popout toggle launcher`, in `config.kdl`) in addition to icon-click. Scope is app-launch (drun) only; `walker` stays installed and keeps the other modes (run-command, calc, files), but has no keybind of its own left — what still calls it is dmenu duty for the Waybar-reserve scripts (`moonarch-sink-switcher`, `moonarch-cpugov`, `moonarch-vpn`), which is why the package cannot be dropped.
- **Launching goes through `app2unit`, a hard dependency.** `entry.execute()` spawns the app as a child of quickshell, and a child inherits its parent's cgroup — so every launched app lands inside `quickshell.service` and systemd kills it along with the unit whenever the bar restarts. `app2unit` wraps `systemd-run` and hands each app its own transient `app-*.scope`, the same shape niri gives the windows it spawns itself. It is an **external AUR package** (`app2unit`), not a systemd builtin: `Quickshell.execDetached` fails silently on a missing binary, so without it the launcher looks alive and starts nothing, with no trace in the quickshell log. `NetworkPopout.qml` uses it for `nm-connection-editor` for the same reason. NixOS carries it in the system environment, which is why the switch went unnoticed there.
- **Clipboard history:** `ClipboardPopout.qml` (registered as `clipboard`, bound to `Super+C`) replaces walker's clipboard provider. Backend stays **cliphist** — the popout shells out to it: `list` on every open (cliphist has no change signal, so the open *is* the refresh point), `decode <id> | wl-copy` on Enter/click, and `delete` with the entry's raw list line on stdin for **Ctrl+D**. Every call carries `-db-path $XDG_RUNTIME_DIR/cliphist/db`, because the history lives in the session db that `cliphist-text.service` creates, not in cliphist's `~/.cache` default. All shell arguments are passed positionally (`sh -c '… "$1" "$2"' sh a b`), so no clipboard content ever becomes part of a script.
- **Ctrl+D, not Del:** focus sits in the search field, where `Del` is a character delete. Same binding walker's clipboard provider used. The popout spells its keys out in a footer hint because a destructive shortcut is not guessable.
+1
View File
@@ -36,5 +36,6 @@ mpv-modernz-git
mpv-thumbfast-git
# System & Tools
app2unit
stasis
wayland-pipewire-idle-inhibit