Skip to content

feat(desktop): match macOS notification overlays on Windows and Linux - #6987

Merged
ComputelessComputer merged 2 commits into
mainfrom
cursor/windows-linux-notifications-3bf6
Aug 21, 2026
Merged

feat(desktop): match macOS notification overlays on Windows and Linux#6987
ComputelessComputer merged 2 commits into
mainfrom
cursor/windows-linux-notifications-3bf6

Conversation

@ComputelessComputer

@ComputelessComputer ComputelessComputer commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Summary

Windows and Linux notifications now use the same custom overlay contract as macOS (collapsed/expanded HUD, not OS toasts).

  • Shared presentation helpers in notification-interface: expand rules, primary action, hover-paused dismiss timer, schedule/stop countdown copy.
  • Linux GTK overlay: icons, hover-pause timeout, progress bar, expand/collapse, stacking, and the full callback set.
  • New notification-windows crate: always-on-top Win32 overlay with the same callbacks, options menu, footer, icons, and stacking.
  • plugins/notification routes all platforms through crates/notification (Windows toast special-case removed).

Closes the Windows gap in ANLG-126.

Testing

  • cargo test -p notification-interface --lib
  • cargo test -p notification --lib
  • cargo test -p notification-linux --lib
  • cargo test -p notification-windows --lib (layout + callbacks; Win32 overlay is cfg(windows))
  • cargo clippy -p notification-interface -p notification-linux -p notification-windows -p notification --lib -- -D warnings
  • pnpm exec dprint check on the changed files (fixes the fmt CI failure on crates/notification-windows/Cargo.toml)

Skipped locally:

  • cargo test -p tauri-plugin-notification --libjavascriptcoregtk-4.1 is not installed in this environment
  • Visual overlay check on Windows — no Windows toolchain/display here; windows_ci compiles this path via cargo check -p desktop
Open in Web Open in Cursor 

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>
@netlify

netlify Bot commented Aug 21, 2026

Copy link
Copy Markdown

Deploy Preview for anarlog canceled.

Name Link
🔨 Latest commit 675f987
🔍 Latest deploy log https://app.netlify.com/projects/anarlog/deploys/6a87ceb3c0dabf0008675d59

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>
@ComputelessComputer
ComputelessComputer marked this pull request as ready for review August 21, 2026 04:09

@cursor cursor Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using default effort and found 3 potential issues.

Fix All in Cursor

❌ 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,
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 675f987. Configure here.

unsafe {
let _ = DestroyIcon(icon);
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 675f987. Configure here.

.ok()
.map(|handle| HICON(handle.0))
}
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 675f987. Configure here.

@ComputelessComputer
ComputelessComputer merged commit 34461df into main Aug 21, 2026
22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants