From 033c4bcbf21ff6d13ba7f5388d4a45ab1217edf8 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 10 Apr 2026 15:11:14 +0700 Subject: [PATCH] fix: let xterm.js handle keyboard input natively for scroll-on-input Only intercept keys when mobile virtual modifier buttons are active. Previously all special keys (Enter, Ctrl+C, arrows) were intercepted and manually re-encoded, bypassing xterm's built-in scrollOnUserInput. --- packages/app/src/utils/terminal-keys.test.ts | 18 +++++++++++++----- packages/app/src/utils/terminal-keys.ts | 7 +------ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/app/src/utils/terminal-keys.test.ts b/packages/app/src/utils/terminal-keys.test.ts index 4ea84d0af..2a627d587 100644 --- a/packages/app/src/utils/terminal-keys.test.ts +++ b/packages/app/src/utils/terminal-keys.test.ts @@ -52,7 +52,7 @@ describe("terminal key helpers", () => { }); }); - it("intercepts special keys and modifier combos", () => { + it("only intercepts when pending modifiers are active", () => { expect( shouldInterceptDomTerminalKey({ key: "Escape", @@ -60,7 +60,7 @@ describe("terminal key helpers", () => { altKey: false, pendingModifiers: { ctrl: false, shift: false, alt: false }, }), - ).toBe(true); + ).toBe(false); expect( shouldInterceptDomTerminalKey({ key: "c", @@ -68,15 +68,23 @@ describe("terminal key helpers", () => { altKey: false, pendingModifiers: { ctrl: false, shift: false, alt: false }, }), - ).toBe(true); + ).toBe(false); expect( shouldInterceptDomTerminalKey({ key: "c", ctrlKey: false, altKey: false, - pendingModifiers: { ctrl: false, shift: false, alt: false }, + pendingModifiers: { ctrl: true, shift: false, alt: false }, }), - ).toBe(false); + ).toBe(true); + expect( + shouldInterceptDomTerminalKey({ + key: "Escape", + ctrlKey: false, + altKey: false, + pendingModifiers: { ctrl: false, shift: false, alt: true }, + }), + ).toBe(true); }); it("detects pending modifier state", () => { diff --git a/packages/app/src/utils/terminal-keys.ts b/packages/app/src/utils/terminal-keys.ts index aad38de42..55c7c523a 100644 --- a/packages/app/src/utils/terminal-keys.ts +++ b/packages/app/src/utils/terminal-keys.ts @@ -88,12 +88,7 @@ export function shouldInterceptDomTerminalKey(args: { altKey: boolean; pendingModifiers: PendingTerminalModifiers; }): boolean { - return ( - args.key.length > 1 || - args.ctrlKey || - args.altKey || - hasPendingTerminalModifiers(args.pendingModifiers) - ); + return hasPendingTerminalModifiers(args.pendingModifiers); } export function mergeTerminalModifiers(args: {