From 526ec0f55b8c2e0d7ca39a07e9f2687080356870 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:56:08 +1000 Subject: [PATCH 1/3] fix(tui): preserve focused text selection on Windows Avoid clearing renderer selection when the focused renderable already owns it so Shift+Arrow and other input selection flows keep their anchor on Windows. --- packages/opencode/src/cli/cmd/tui/app.tsx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 3e4d0b42707f..0c5ce28818a7 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -299,7 +299,8 @@ function App(props: { onSnapshot?: () => Promise }) { useKeyboard((evt) => { if (!Flag.OPENCODE_EXPERIMENTAL_DISABLE_COPY_ON_SELECT) return - if (!renderer.getSelection()) return + const sel = renderer.getSelection() + if (!sel) return // Windows Terminal-like behavior: // - Ctrl+C copies and dismisses selection @@ -323,6 +324,9 @@ function App(props: { onSnapshot?: () => Promise }) { return } + const focus = renderer.currentFocusedRenderable + if (focus?.hasSelection() && sel.selectedRenderables.includes(focus)) return + renderer.clearSelection() }) From a9be1b1ad055ece4e63ab8ba3b068d520cce7a91 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Tue, 31 Mar 2026 17:03:33 +1000 Subject: [PATCH 2/3] fix(tui): clear stale prompt selections on Windows Defer Windows copy-on-select cleanup until after the focused input handles the key so Shift+Arrow keeps its anchor while unchanged selections are still dismissed. --- packages/opencode/src/cli/cmd/tui/app.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 0c5ce28818a7..037da0c31e9f 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -325,7 +325,22 @@ function App(props: { onSnapshot?: () => Promise }) { } const focus = renderer.currentFocusedRenderable - if (focus?.hasSelection() && sel.selectedRenderables.includes(focus)) return + if (focus?.hasSelection() && sel.selectedRenderables.includes(focus)) { + const item = focus + const anchor = sel.anchor + const end = sel.focus + queueMicrotask(() => { + const next = renderer.getSelection() + if (!next) return + if (renderer.currentFocusedRenderable !== item) return + if (!item.hasSelection()) return + if (!next.selectedRenderables.includes(item)) return + if (next.anchor.x !== anchor.x || next.anchor.y !== anchor.y) return + if (next.focus.x !== end.x || next.focus.y !== end.y) return + renderer.clearSelection() + }) + return + } renderer.clearSelection() }) From 3803ab4d2706c9b88973c3e711adf1cf531655d9 Mon Sep 17 00:00:00 2001 From: LukeParkerDev <10430890+Hona@users.noreply.github.com> Date: Thu, 2 Apr 2026 08:34:27 +1000 Subject: [PATCH 3/3] fix(tui): simplify prompt text selection clear check --- packages/opencode/src/cli/cmd/tui/app.tsx | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/packages/opencode/src/cli/cmd/tui/app.tsx b/packages/opencode/src/cli/cmd/tui/app.tsx index 69036e1d14eb..93d1fc19ae2b 100644 --- a/packages/opencode/src/cli/cmd/tui/app.tsx +++ b/packages/opencode/src/cli/cmd/tui/app.tsx @@ -326,19 +326,6 @@ function App(props: { onSnapshot?: () => Promise }) { const focus = renderer.currentFocusedRenderable if (focus?.hasSelection() && sel.selectedRenderables.includes(focus)) { - const item = focus - const anchor = sel.anchor - const end = sel.focus - queueMicrotask(() => { - const next = renderer.getSelection() - if (!next) return - if (renderer.currentFocusedRenderable !== item) return - if (!item.hasSelection()) return - if (!next.selectedRenderables.includes(item)) return - if (next.anchor.x !== anchor.x || next.anchor.y !== anchor.y) return - if (next.focus.x !== end.x || next.focus.y !== end.y) return - renderer.clearSelection() - }) return }