diff --git a/CLAUDE.md b/CLAUDE.md index e7c5d6f..5e0142a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -106,7 +106,7 @@ quickshell is the **default bar and notification daemon**, started by `quickshel - **Popouts by keybind:** registered popouts are addressable by name through the `PopoutRouter` singleton, which exposes an `IpcHandler { target: "popout" }` with `toggle`/`open`/`close`. A niri keybind fires `qs -c moonarch ipc call popout toggle ` (e.g. `Mod+A` → `audio`, in `defaults/xdg/niri/config.kdl`). The router routes to the focused monitor's `PopoutState` via `Niri.activeOutput` (workspace `is_focused` → `output`, matched against `screen.name`); an open popout grabs the keyboard (Escape closes). Names: `audio backlight network bluetooth nightlight cpugov battery notifications media launcher camera calendar clipboard power`. Tray is not keybind-addressable. - **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. + - **No exception for auth prompts.** A popout action that raises a pkexec or keyring prompt (camera, batsaver, VPN) loses the focus to it and therefore closes the popout; the resulting state shows on the next open. cpugov raises none: ppd's polkit policy allows `switch-profile` for the active session, so `powerprofilesctl set` runs without a prompt. 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, 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` is gone.** It and the whole `elephant` provider set were uninstalled on 2026-09-11, and `packages/aur.txt` followed on 2026-09-14. The launcher and `ClipboardPopout` had already taken over its two used modes. What did not follow it out: `defaults/xdg/walker/` (config + 20 theme files, still installed by the PKGBUILD and seeded into homes by `moonarch.install`), `defaults/etc/systemd/user/walker.service`, and the three dmenu scripts `moonarch-sink-switcher`, `moonarch-cpugov`, `moonarch-vpn`, which still shell out to `walker` and therefore do nothing. Waybar's `on-click` for the audio and cpugov modules points at the first two, so **those two Waybar modules are dead** while Waybar is the reserve bar. Porting them to `fuzzel`/`wofi` or dropping them is open. diff --git a/defaults/xdg/quickshell/moonarch/CpuGovPopout.qml b/defaults/xdg/quickshell/moonarch/CpuGovPopout.qml index 64c2227..fad5eb3 100644 --- a/defaults/xdg/quickshell/moonarch/CpuGovPopout.qml +++ b/defaults/xdg/quickshell/moonarch/CpuGovPopout.qml @@ -9,7 +9,7 @@ PopoutPanel { title: qsTr("CPU Governor") panelWidth: 200 - // Reflect an out-of-band switch (walker menu) whenever the popout becomes the shown one. + // Reflect an out-of-band switch (terminal, D-Bus client) whenever the popout becomes the shown one. readonly property bool shown: root.popouts && root.popouts.hasCurrent onShownChanged: if (root.shown) CpuGovService.refresh() diff --git a/defaults/xdg/quickshell/moonarch/CpuGovService.qml b/defaults/xdg/quickshell/moonarch/CpuGovService.qml index eadaf2b..7d40c66 100644 --- a/defaults/xdg/quickshell/moonarch/CpuGovService.qml +++ b/defaults/xdg/quickshell/moonarch/CpuGovService.qml @@ -26,8 +26,8 @@ Singleton { stateProc.running = true; } - // The profile changes via apply() (→ instant refresh), the walker menu, or a program holding a profile - // over D-Bus. powerprofilesctl has no watch subcommand, so poll as a slow fallback for those. + // The profile changes via apply() (→ instant refresh), powerprofilesctl from a terminal, or a program + // holding a profile over D-Bus. powerprofilesctl has no watch subcommand, so poll as a slow fallback for those. Timer { interval: 60000 running: true