feat(desktop): match macOS notification overlays on Windows and Linux - #6987
Conversation
Route Windows through the shared notification crate with a custom Win32 overlay instead of toasts, and bring the Linux GTK overlay up to the macOS contract: icons, hover-paused timeout, progress, expand, stacking, and confirm/accept/dismiss/timeout/options/footer callbacks. Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>
✅ Deploy Preview for anarlog canceled.
|
Collapse the windows crate feature list onto one line so the fmt CI check passes. Co-authored-by: John Jeong <ComputelessComputer@users.noreply.github.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 3 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 675f987. Configure here.
| instance.layout.title, | ||
| instance.payload.compact_title(), | ||
| DT_LEFT | DT_SINGLELINE | DT_END_ELLIPSIS, | ||
| ); |
There was a problem hiding this comment.
Wrong expanded notification title
Medium Severity
Expanded Windows overlays always paint compact_title for the header. macOS and Linux use expanded_title (event what when present), so session notifications keep the compact title after expand instead of the event name.
Reviewed by Cursor Bugbot for commit 675f987. Configure here.
| unsafe { | ||
| let _ = DestroyIcon(icon); | ||
| } | ||
| } |
There was a problem hiding this comment.
System icon destroyed unsafely
Medium Severity
When ExtractIconExW fails, load_app_icon falls back to LoadIconW with IDI_APPLICATION, then destroy_icon always calls DestroyIcon. Shared system icons must not be destroyed; doing so can corrupt the process icon cache or crash later icon loads.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 675f987. Configure here.
| .ok() | ||
| .map(|handle| HICON(handle.0)) | ||
| } | ||
| } |
There was a problem hiding this comment.
App icons ignored on Windows
Medium Severity
load_notification_icon only special-cases Path and Hidden; BundleId, Overlay, and SystemSymbol always fall back to the Anarlog icon. Path loads via LoadImageW as IMAGE_ICON, which fails for typical exe/PNG paths from from_app_id. Mic-detected and calendar overlay icons therefore never show on Windows.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit 675f987. Configure here.


Summary
Windows and Linux notifications now use the same custom overlay contract as macOS (collapsed/expanded HUD, not OS toasts).
notification-interface: expand rules, primary action, hover-paused dismiss timer, schedule/stop countdown copy.notification-windowscrate: always-on-top Win32 overlay with the same callbacks, options menu, footer, icons, and stacking.plugins/notificationroutes all platforms throughcrates/notification(Windows toast special-case removed).Closes the Windows gap in ANLG-126.
Testing
cargo test -p notification-interface --libcargo test -p notification --libcargo test -p notification-linux --libcargo test -p notification-windows --lib(layout + callbacks; Win32 overlay iscfg(windows))cargo clippy -p notification-interface -p notification-linux -p notification-windows -p notification --lib -- -D warningspnpm exec dprint checkon the changed files (fixes the fmt CI failure oncrates/notification-windows/Cargo.toml)Skipped locally:
cargo test -p tauri-plugin-notification --lib—javascriptcoregtk-4.1is not installed in this environmentwindows_cicompiles this path viacargo check -p desktop