diff --git a/src/ui/features/terminal/Terminal.tsx b/src/ui/features/terminal/Terminal.tsx index f13dc7d8..e2f12bea 100644 --- a/src/ui/features/terminal/Terminal.tsx +++ b/src/ui/features/terminal/Terminal.tsx @@ -65,6 +65,7 @@ import { getNextTerminalFontSize, getTerminalFontZoomDirection, } from "./terminal-font-zoom.ts"; +import { isTabKeyEvent } from "./terminal-key-event.ts"; import { getUserPreferences, parseCustomKeybindings, @@ -2328,7 +2329,7 @@ const TerminalInner = forwardRef( // the capture phase blocks that traversal while still allowing the event to // reach xterm.js's internal handler (which fires our attachCustomKeyEventHandler). const handleTabCapture = (e: KeyboardEvent) => { - if (e.key === "Tab") { + if (isTabKeyEvent(e)) { e.preventDefault(); } }; @@ -2678,7 +2679,7 @@ const TerminalInner = forwardRef( } if ( - e.key === "Tab" && + isTabKeyEvent(e) && !e.ctrlKey && !e.altKey && !e.metaKey && @@ -2701,7 +2702,7 @@ const TerminalInner = forwardRef( } if ( - e.key === "Tab" && + isTabKeyEvent(e) && e.shiftKey && !e.ctrlKey && !e.altKey && @@ -2718,7 +2719,7 @@ const TerminalInner = forwardRef( } if ( - e.key === "Tab" && + isTabKeyEvent(e) && !e.ctrlKey && !e.altKey && !e.metaKey && diff --git a/src/ui/features/terminal/terminal-key-event.ts b/src/ui/features/terminal/terminal-key-event.ts new file mode 100644 index 00000000..4009ffe9 --- /dev/null +++ b/src/ui/features/terminal/terminal-key-event.ts @@ -0,0 +1,3 @@ +export function isTabKeyEvent(event: KeyboardEvent): boolean { + return event.key === "Tab" || event.code === "Tab" || event.keyCode === 9; +} diff --git a/src/ui/tests/features/terminal/terminal-key-event.test.ts b/src/ui/tests/features/terminal/terminal-key-event.test.ts new file mode 100644 index 00000000..ed3c5195 --- /dev/null +++ b/src/ui/tests/features/terminal/terminal-key-event.test.ts @@ -0,0 +1,21 @@ +import { describe, expect, it } from "vitest"; +import { isTabKeyEvent } from "@/features/terminal/terminal-key-event"; + +describe("isTabKeyEvent", () => { + it.each([ + ["key", new KeyboardEvent("keydown", { key: "Tab" })], + ["code", new KeyboardEvent("keydown", { code: "Tab" })], + [ + "legacy keyCode", + new KeyboardEvent("keydown", { keyCode: 9 } as KeyboardEventInit), + ], + ])("recognizes Tab from %s", (_source, event) => { + expect(isTabKeyEvent(event)).toBe(true); + }); + + it("does not treat another key as Tab", () => { + expect(isTabKeyEvent(new KeyboardEvent("keydown", { key: "Enter" }))).toBe( + false, + ); + }); +});