# notif-clear-fix — notifications popout "Clear" button did nothing

The fix lives in the `nosignal-shell` fork (package-owned file), so the
canonical fix is a one-handler change in the fork source; this folder also
ships a fallback patch for already-installed boxes.

## Symptom
In the Notifications popout (off the bell), clicking **Clear** does nothing — the
notification cards stay. Per-notification state is untouched; the count stays.

## Root cause
`modules/nsbar/panels/NsNotifications.qml` Clear handler was:

```qml
onClicked: {
    for (const n of Notifs.notClosed)
        n.notification?.dismiss();
}
```

`n` is a `NotifData` wrapper. Clearing a notification is `NotifData.close()`
(`services/NotifData.qml`):

```qml
function close(): void {
    closed = true;                                   // drops it from notClosed → card disappears
    if (locks.size === 0 && Notifs.list.includes(this)) {
        Notifs.list = Notifs.list.filter(n => n !== this);
        notification?.dismiss();                     // dismiss the server obj (if any)
        destroy();
    }
}
```

The button skipped all of that and called only `notification?.dismiss()`:
- it never set `closed` or removed the item from `Notifs.list`, so `notClosed`
  (the popout's model) was unchanged → **cards never disappear**; and
- for notifications restored from disk (`services/Notifs.qml` `storage`/FileView),
  `notification` is null, so `?.dismiss()` is a complete **no-op**.

The service already does it correctly in two places — the `clearNotifs`
`CustomShortcut` and the `notifs` IPC `clear()` both do
`for (const notif of root.list.slice()) notif.close();`. The button just didn't
match.

## Fix
Make the Clear handler mirror the service:

```qml
onClicked: {
    for (const n of Notifs.list.slice())   // slice() copy → safe to mutate mid-loop
        n.close();
}
```

Corrected file: `NsNotifications.qml` (drop-in for
`modules/nsbar/panels/NsNotifications.qml`).

## Integration
- **Builder (canonical):** replace `modules/nsbar/panels/NsNotifications.qml` in
  the **nosignal-shell fork** with the one here; rebuild the package. Set
  `NOSIGNAL_SKIP_SHELL_PATCH` for the build so the fallback patch below is skipped.
- **Already-installed boxes (stopgap):** `install-notif-clear-fix.sh` backs up and
  overwrites the package-owned file. It is reverted by the next `nosignal-shell`
  upgrade — which is fine, because that upgrade carries the fixed file once the
  fork is patched. Migration: `1781470800-notif-clear-fix.sh` (delegates via
  `$NOSIGNAL_SRC`).
  **Shell restart required:** the shell runs as `qs -c caelestia -n -d` and `-n`
  disables the file watcher, so the patched file is NOT hot-reloaded — the user
  must restart the shell (**Ctrl+Super+Alt+R**, i.e.
  `qs -c caelestia kill; sleep .1; caelestia shell -d`) or log out/in for the new
  Clear handler to load. The installer prints this reminder.

## Apply on this box now (needs root; sudo was password-prompted this session)
```sh
sudo sh ~/nosignal-handoff/notif-clear-fix/install-notif-clear-fix.sh
```
Then reload the shell (log out/in, or restart the caelestia shell). Quickshell
usually hot-reloads on file change, so Clear may start working immediately.

## Files
- `NsNotifications.qml`, `install-notif-clear-fix.sh`, `1781470800-notif-clear-fix.sh`.
