From d5f06cedfbf64d83b73a1bd57f211535025a9cdd Mon Sep 17 00:00:00 2001 From: Kiet Ho Date: Sun, 12 Apr 2026 16:07:52 -0700 Subject: [PATCH] fix(desktop): forward unregistered ctrl/meta chords to v1 terminal PTY v1's keyboard handler returned false for every ctrl/meta combo, starving TUIs like Claude Code of Ctrl+P/Ctrl+O and shell readline shortcuts like Ctrl+R/W/U. Mirror v2's pattern (terminal-runtime.ts:21): use resolveHotkeyFromEvent to only bubble chords actually registered as app hotkeys, letting everything else reach the PTY. Fixes #3385. --- .../ContentView/TabsContent/Terminal/helpers.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts index ab05215b28e..5abc578d44d 100644 --- a/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts +++ b/apps/desktop/src/renderer/screens/main/components/WorkspaceView/ContentView/TabsContent/Terminal/helpers.ts @@ -8,7 +8,11 @@ import { Unicode11Addon } from "@xterm/addon-unicode11"; import { WebglAddon } from "@xterm/addon-webgl"; import type { ITheme } from "@xterm/xterm"; import { Terminal as XTerm } from "@xterm/xterm"; -import { getBinding, isTerminalReservedEvent } from "renderer/hotkeys"; +import { + getBinding, + isTerminalReservedEvent, + resolveHotkeyFromEvent, +} from "renderer/hotkeys"; import type { DetectedLink } from "renderer/lib/terminal/links"; import { TerminalLinkManager } from "renderer/lib/terminal/terminal-link-manager"; import { electronTrpcClient as trpcClient } from "renderer/lib/trpc-client"; @@ -592,9 +596,9 @@ export function setupKeyboardHandler( return false; } - // Any other ctrl/meta combo → let it bubble to document for react-hotkeys-hook - if (event.type === "keydown" && (event.metaKey || event.ctrlKey)) - return false; + // Only bubble chords registered as app hotkeys; everything else reaches the PTY. + // Mirrors v2 terminal-runtime.ts:21 (VSCode terminalInstance pattern). + if (resolveHotkeyFromEvent(event) !== null) return false; return true; };