Menu ▾ ▴

#56 Windows: recent-conversations jump list (Dock-menu parity)

closed
nobody
2026-08-28
2026-07-03
Anonymous
No

Originally created by: kristofferR

The recent-conversations menu (Ref [#19]) is macOS Dock/tray only. Windows native equivalent is a taskbar jump list. Linux tray menu already gets the list.

Reference

Keep implementation research for when this is picked up.

Related

Tickets: #184
Tickets: #187
Tickets: #19
Tickets: #233
Tickets: #59

Discussion

  • Anonymous

    Anonymous - 2026-07-22

    Originally posted by: kristofferR

    Design notes for implementing this, building on the shared action dispatch from [#170]/#176 and their Windows counterpart (#184, CLI flags + carrier:// protocol):

    • New src-tauri/src/jumplist.rs (cfg(target_os = "windows"); not named windows to avoid shadowing the windows crate): pure jump_list_model(threads) -> Vec<JumpEntry {title, args}> mapping each sanitized recent thread to --thread <id> (unit-testable anywhere via the same cfg trick menu.rs uses), plus update_jump_list(app) doing the COM work: ICustomDestinationList → BeginList → AppendCategory("Conversations", IShellLink items) — each link targets current_exe() with SetArguments("--thread <id>"), icon from the exe, title via IPropertyStore/PKEY_Title (mandatory: jump-list links have no filename) → AddUserTasks ("New Conversation" → --new-conversation, "Settings" → --settings) → CommitList. All failures logged and swallowed — the jump list is best-effort chrome.
    • Crate: direct dep on the windows crate (proper COM support; windows-sys would mean hand-rolled vtables). It's already in the lockfile transitively, and the Windows toast work (#180) wants it too — coordinate on one version/feature set (Win32_System_Com, Win32_UI_Shell + _Common + _PropertiesSystem, Win32_Storage_EnhancedStorage for PKEY_Title, Win32_Foundation; confirm exact set at implementation).
    • Single integration point, no new listeners: the non-macOS branch of rebuild_recent_menus gains a #[cfg(windows)] update_jump_list(app) call. That one site covers both triggers for free: the carrier:recent-threads listener (already dedups unchanged lists — natural debounce) and every settings save via apply_settings. A module-local last-committed cache skips redundant COM work. Runs on the main thread (already marshalled there; a handful of COM calls, no I/O).
    • Privacy: recent_threads_for_menu already returns empty when Hide Names & Avatars is on, so the jump list inherits the filtering — and because every CommitList replaces the on-disk .customDestinations-ms file, committing the empty list scrubs the persisted entries from disk, which matters since jump lists persist across sessions. Names are already sanitized/truncated upstream (cap 9, 60 chars); the --thread argument is digits-only by construction.
    • Dispatch: entries launch through single-instance → action_from_argv → run_app_action (warm), or the cold argv path (app not running). This issue adds no dispatch code — it depends on [#184] landing first.
    • Edge cases: verify AUMID alignment between the process and the NSIS shortcut (mismatch → entries silently missing for pinned icons — explicit manual check); respect the removed-items list BeginList returns (skip re-adding user-removed ids this session).
    • Manual verification (Win10 + Win11): entries appear on taskbar right-click once the chat list loads; clicking opens the right thread warm and cold; both tasks work; toggling Hide Names & Avatars empties the category immediately and the on-disk CustomDestinations entry no longer contains names; pinned-icon jump list works; portable build works.
     

    Related

    Tickets: #170
    Tickets: #184

  • Anonymous

    Anonymous - 2026-08-28

    Originally posted by: kristofferR

    Completed in PR [#233] and manually verified on Windows 11 during the final QA and fixes in PR [#247]. Recent conversations appear in the taskbar jump list, and warm and cold dispatch open the correct thread. Closing as complete.

     

    Related

    Tickets: #233
    Tickets: #247

  • Anonymous

    Anonymous - 2026-08-28

    Ticket changed by: kristofferR

    • status: open --> closed
     

Log in to post a comment.