From fb80f919216cede9c174583f71dccbf95c5a88e7 Mon Sep 17 00:00:00 2001 From: Brennan Benson <79079362+brennanb2025@users.noreply.github.com> Date: Mon, 10 Aug 2026 15:52:25 -0700 Subject: [PATCH] Clear stale terminal selection during pane recovery (#13677) * fix(terminal): forward copy to TUI selections * fix(terminal): narrow recovery selection cleanup --- .../src/lib/pane-manager/pane-lifecycle.test.ts | 15 +++++++++++++++ .../src/lib/pane-manager/pane-lifecycle.ts | 6 ++++++ 2 files changed, 21 insertions(+) diff --git a/src/renderer/src/lib/pane-manager/pane-lifecycle.test.ts b/src/renderer/src/lib/pane-manager/pane-lifecycle.test.ts index 701482d16bb..26b19453f64 100644 --- a/src/renderer/src/lib/pane-manager/pane-lifecycle.test.ts +++ b/src/renderer/src/lib/pane-manager/pane-lifecycle.test.ts @@ -527,6 +527,12 @@ describe('openTerminal — addon and provider wiring', () => { deregisterCharacterJoiner: vi.fn((joinerId: number) => { events.push(`deregisterCharacterJoiner:${joinerId}`) }), + clearSelection: vi.fn(() => { + events.push('clearSelection') + }), + dispose: vi.fn(() => { + events.push('dispose') + }), unicode: unicodeProxy, buffer: { active: { cursorX: 0, cursorY: 0 } } } as unknown as ManagedPaneInternal['terminal'] @@ -607,6 +613,15 @@ describe('openTerminal — addon and provider wiring', () => { expect(pane.arabicShapingJoinerCleanup).toBeNull() }) + it('clears selection before disposing a remounted pane', () => { + const { pane, events } = createOpenTerminalHarness() + openTerminal(pane) + + disposePane(pane, new Map([[pane.id, pane]])) + + expect(events.indexOf('clearSelection')).toBeLessThan(events.indexOf('dispose')) + }) + // Why: a link streamed under a stationary pointer must re-linkify on the next // move; openTerminal wires the hover-cache reset and disposePane must detach it. it('installs the streamed-output linkifier hover reset and disposes it', () => { diff --git a/src/renderer/src/lib/pane-manager/pane-lifecycle.ts b/src/renderer/src/lib/pane-manager/pane-lifecycle.ts index e5695207a57..131a947312e 100644 --- a/src/renderer/src/lib/pane-manager/pane-lifecycle.ts +++ b/src/renderer/src/lib/pane-manager/pane-lifecycle.ts @@ -254,6 +254,12 @@ export function disposePane( } catch { /* ignore */ } + try { + // Drop renderer selection state before a recovery remount replaces the surface. + pane.terminal.clearSelection() + } catch { + /* ignore */ + } try { pane.terminal.dispose() } catch {