diff --git a/src/renderer/src/components/floating-terminal/FloatingTerminalPanel.tsx b/src/renderer/src/components/floating-terminal/FloatingTerminalPanel.tsx index bbc37811e67..ddac1b9149d 100644 --- a/src/renderer/src/components/floating-terminal/FloatingTerminalPanel.tsx +++ b/src/renderer/src/components/floating-terminal/FloatingTerminalPanel.tsx @@ -139,6 +139,8 @@ export function FloatingTerminalPanel({ const pendingEditorCloseQueueRef = useRef([]) const saveDialogFileIdRef = useRef(null) const panelRef = useRef(null) + const shortcutFocusFrameRef = useRef(null) + const shortcutFocusTimeoutRef = useRef(null) const dragRef = useRef<{ pointerId: number startX: number @@ -690,17 +692,35 @@ export function FloatingTerminalPanel({ panelRef.current?.focus({ preventScroll: true }) }, []) + const cancelShortcutFocusFrame = useCallback((): void => { + if (shortcutFocusFrameRef.current !== null) { + cancelAnimationFrame(shortcutFocusFrameRef.current) + shortcutFocusFrameRef.current = null + } + if (shortcutFocusTimeoutRef.current !== null) { + window.clearTimeout(shortcutFocusTimeoutRef.current) + shortcutFocusTimeoutRef.current = null + } + }, []) + + useEffect(() => cancelShortcutFocusFrame, [cancelShortcutFocusFrame]) + const focusPanelForShortcutsAfterClose = useCallback(() => { if (typeof window === 'undefined') { return } - const focusPanel = (): void => focusPanelForShortcuts(false) + cancelShortcutFocusFrame() + const focusPanel = (): void => { + shortcutFocusFrameRef.current = null + shortcutFocusTimeoutRef.current = null + focusPanelForShortcuts(false) + } if (typeof window.requestAnimationFrame === 'function') { - window.requestAnimationFrame(focusPanel) + shortcutFocusFrameRef.current = window.requestAnimationFrame(focusPanel) return } - globalThis.setTimeout(focusPanel, 0) - }, [focusPanelForShortcuts]) + shortcutFocusTimeoutRef.current = window.setTimeout(focusPanel, 0) + }, [cancelShortcutFocusFrame, focusPanelForShortcuts]) const setFloatingTerminalInputFocused = useCallback((target: EventTarget | null): void => { window.api.ui.setFloatingTerminalInputFocused(isFloatingWorkspaceTerminalInputTarget(target))