Skip to content

UI stops redrawing after Ctrl+Click on an OSC 8 hyperlink; clicks are still processed and new windows never appear #20900

Open

Description

@astral303

Windows Terminal version

1.27.2861.0 (Canary, x64)

Windows build number

10.0.26300.9711

Other Software

  • Claude Code 2.1.319, which prints OSC 8 hyperlinks
  • Device: Intel Core i7-1185G7, 32 GB RAM, Intel Iris Xe Graphics (driver 32.0.101.7085), one 60 Hz display
  • Canary settings that affect rendering: theme: system, useAcrylic: false, useAcrylicInTabRow: false, rendering.disablePartialInvalidation: true, opacity not set (100%)

Steps to reproduce

  1. In a tab running Claude Code, hover an https OSC 8 hyperlink it printed. The "Ctrl+Click link to open" tooltip appears.
  2. Ctrl+Click the link.

This is the first occurrence, and I have not reproduced it. At the time, the Canary process had been running for 10 days with about 20 tabs and 1.1 GB of private bytes.

Expected Behavior

The tooltip closes and the UI keeps responding.

Actual Behavior

  • The link opened in the browser.
  • The tooltip stayed on screen. Tabs, the tab row, and window switching stopped responding.
  • Typing into the focused tab still worked, and its text kept rendering.
  • Minimizing and restoring the window removed the tooltip. The rest of the UI stayed frozen.
  • Launching Canary again did not open a window. Typing in the existing window then stopped working too.
  • Ctrl+Alt+Del, lock/unlock, and a graphics driver reset (Win+Ctrl+Shift+B) did not recover it. Ending the process did.

Trace findings

A WPR trace (GeneralProfile + CPU) covers about 20 s of clicking tabs, typing, and launching a new Canary window. The XAML layer processes input but never renders a frame:

Observation Evidence
The UI thread is not blocked Idle in GetMessageW between inputs; GetGUIThreadInfo reports no capture, menu mode, or move/size loop
Clicks reach Terminal TabViewItem::OnPointerReleased → Selector::RaiseSelectionChanged → TerminalApp.dll handler
The new-window request arrives The second process exits after 68 ms; the UI thread handles WM_COPYDATA and constructs a DesktopWindowXamlSource. The window stays invisible.
No XAML render ticks in Canary 0 stacks with CXcpDispatcher::Tick / CCoreServices::NWDrawTree out of 3,512 XAML stacks
Other XAML processes render normally explorer.exe 161, StartMenuExperienceHost 123, SearchHost 38, stable Windows Terminal 1.24 44 tick stacks in the same ranges
No frame scheduling in Canary No Canary thread ran UIThreadScheduler::RequestAdditionalFrame, QueueTick, CompositorScheduler::RenderThreadMain, or WaitForVBlank

Memory dump findings

The dump was taken while the UI was frozen.

  • Every thread is idle. The UI thread is in GetMessageW, and XAML's render thread waits in CompositorScheduler::RenderThreadFrame → CWindowsServices::WaitForObjects.
  • The dump doesn't contain any stowed exceptions.
  • A windows.storage!MessagePumpThreadProc thread and a combase!CDllHost::STAWorkerLoop thread are idle in the process, consistent with the earlier ShellExecuteExW call.

Related code (main at 188822f)

  • TerminalPage.cpp#L3317-L3327: Ctrl+Click on an https link calls ShellExecuteExW synchronously on the UI thread, from a dispatcher callback (TermControl.cpp#L3212). The comment there notes that ShellExecute pumps the UI thread's messages (GH#7994).
  • AppHost.cpp#L1275-L1282: a new window calls ShowWindow only after a Low-priority resume_foreground. If XAML stops running dispatcher work, the window stays hidden, matching the invisible windows observed.

One hypothesis, unconfirmed: the nested message loop inside ShellExecuteExW re-entered XAML while it was processing the tooltip or pointer input, and left XAML's frame scheduling in a state where it never requests another tick.

Attached:

  • canary-freeze-summary.txt: tick counts per process, Canary samples per thread, top UI-thread frames
  • canary-freeze-ui-thread-tree.txt: UI-thread call tree (1,366 samples)

Frames in Terminal's own modules are module-relative addresses. PDB identities:

Module PDB GUID (age 1)
WindowsTerminal.exe af8a6265-134a-4602-bf54-590ac8c2501e
TerminalApp.dll e22e6bf0-77f1-4deb-81b1-5affc487cdeb
Microsoft.Terminal.Control.dll 6c07b4ad-601b-47b6-a930-69bc21893bb0

A full memory dump and the ETL are available privately on request.

canary-freeze-summary.txt
canary-freeze-ui-thread-tree.txt

Activity

  1. added
    Issue-BugIt either shouldn't be doing this or needs an investigation.
    Needs-TriageIt's a new issue that the core contributor team needs to triage at the next triage meeting
    on Nov 6, 2026
  2. Prantik-1811 commented on Nov 7, 2026

    @Prantik-1811

    Hello everyone,
    I'll look into this issue

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Issue-BugIt either shouldn't be doing this or needs an investigation.Needs-TriageIt's a new issue that the core contributor team needs to triage at the next triage meeting

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions