Skip to content

Commit fde201c

Browse files
authored
fix(app): stop terminal autofocus on shortcuts (#18931)
1 parent d3debc1 commit fde201c

3 files changed

Lines changed: 36 additions & 2 deletions

File tree

packages/app/src/pages/session.tsx

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,13 @@ import { useSync } from "@/context/sync"
4141
import { useTerminal } from "@/context/terminal"
4242
import { type FollowupDraft, sendFollowupDraft } from "@/components/prompt-input/submit"
4343
import { createSessionComposerState, SessionComposerRegion } from "@/pages/session/composer"
44-
import { createOpenReviewFile, createSessionTabs, createSizing, focusTerminalById } from "@/pages/session/helpers"
44+
import {
45+
createOpenReviewFile,
46+
createSessionTabs,
47+
createSizing,
48+
focusTerminalById,
49+
shouldFocusTerminalOnKeyDown,
50+
} from "@/pages/session/helpers"
4551
import { MessageTimeline } from "@/pages/session/message-timeline"
4652
import { type DiffStyle, SessionReviewTab, type SessionReviewTabProps } from "@/pages/session/review-tab"
4753
import { useSessionLayout } from "@/pages/session/session-layout"
@@ -850,7 +856,7 @@ export default function Page() {
850856
// Prefer the open terminal over the composer when it can take focus
851857
if (view().terminal.opened()) {
852858
const id = terminal.active()
853-
if (id && focusTerminalById(id)) return
859+
if (id && shouldFocusTerminalOnKeyDown(event) && focusTerminalById(id)) return
854860
}
855861

856862
// Only treat explicit scroll keys as potential "user scroll" gestures.

packages/app/src/pages/session/helpers.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
createSessionTabs,
88
focusTerminalById,
99
getTabReorderIndex,
10+
shouldFocusTerminalOnKeyDown,
1011
} from "./helpers"
1112

1213
describe("createOpenReviewFile", () => {
@@ -86,6 +87,26 @@ describe("focusTerminalById", () => {
8687
})
8788
})
8889

90+
describe("shouldFocusTerminalOnKeyDown", () => {
91+
test("skips pure modifier keys", () => {
92+
expect(shouldFocusTerminalOnKeyDown(new KeyboardEvent("keydown", { key: "Meta", metaKey: true }))).toBe(false)
93+
expect(shouldFocusTerminalOnKeyDown(new KeyboardEvent("keydown", { key: "Control", ctrlKey: true }))).toBe(false)
94+
expect(shouldFocusTerminalOnKeyDown(new KeyboardEvent("keydown", { key: "Alt", altKey: true }))).toBe(false)
95+
expect(shouldFocusTerminalOnKeyDown(new KeyboardEvent("keydown", { key: "Shift", shiftKey: true }))).toBe(false)
96+
})
97+
98+
test("skips shortcut key combos", () => {
99+
expect(shouldFocusTerminalOnKeyDown(new KeyboardEvent("keydown", { key: "c", metaKey: true }))).toBe(false)
100+
expect(shouldFocusTerminalOnKeyDown(new KeyboardEvent("keydown", { key: "c", ctrlKey: true }))).toBe(false)
101+
expect(shouldFocusTerminalOnKeyDown(new KeyboardEvent("keydown", { key: "ArrowLeft", altKey: true }))).toBe(false)
102+
})
103+
104+
test("keeps plain typing focused on terminal", () => {
105+
expect(shouldFocusTerminalOnKeyDown(new KeyboardEvent("keydown", { key: "a" }))).toBe(true)
106+
expect(shouldFocusTerminalOnKeyDown(new KeyboardEvent("keydown", { key: "A", shiftKey: true }))).toBe(true)
107+
})
108+
})
109+
89110
describe("getTabReorderIndex", () => {
90111
test("returns target index for valid drag reorder", () => {
91112
expect(getTabReorderIndex(["a", "b", "c"], "a", "c")).toBe(2)

packages/app/src/pages/session/helpers.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,13 @@ export const focusTerminalById = (id: string) => {
9393
return true
9494
}
9595

96+
const skip = new Set(["Alt", "Control", "Meta", "Shift"])
97+
98+
export const shouldFocusTerminalOnKeyDown = (event: Pick<KeyboardEvent, "key" | "ctrlKey" | "metaKey" | "altKey">) => {
99+
if (skip.has(event.key)) return false
100+
return !(event.ctrlKey || event.metaKey || event.altKey)
101+
}
102+
96103
export const createOpenReviewFile = (input: {
97104
showAllFiles: () => void
98105
tabForPath: (path: string) => string

0 commit comments

Comments
 (0)