diff --git a/packages/ui/src/components/terminal/TerminalViewport.tsx b/packages/ui/src/components/terminal/TerminalViewport.tsx index 5fa95f98..9928f4ed 100644 --- a/packages/ui/src/components/terminal/TerminalViewport.tsx +++ b/packages/ui/src/components/terminal/TerminalViewport.tsx @@ -65,6 +65,14 @@ type FitAddonWithObserveResize = FitAddon & { observeResize?: () => void; }; +type RendererWithScrollbar = { + renderScrollbar?: (...args: unknown[]) => void; +}; + +type TerminalWithRenderer = { + renderer?: RendererWithScrollbar; +}; + interface TerminalViewportProps { sessionKey: string; chunks: TerminalChunk[]; @@ -787,7 +795,9 @@ const TerminalViewport = React.forwardRef { stopKinetic(); @@ -801,6 +811,7 @@ const TerminalViewport = React.forwardRef { stopKinetic(); @@ -956,6 +969,7 @@ const TerminalViewport = React.forwardRef void }> = []; let restorePatchedScrollToBottom: (() => void) | null = null; + let restorePatchedScrollbar: (() => void) | null = null; let restoreContainerFocus: (() => void) | null = null; const container = containerRef.current; @@ -1064,6 +1079,18 @@ const TerminalViewport = React.forwardRef {}; + restorePatchedScrollbar = () => { + renderer.renderScrollbar = originalRenderScrollbar; + }; + } else if (process.env.NODE_ENV === 'development') { + console.warn('[TerminalViewport] Ghostty renderer scrollbar hook is unavailable; touch scrollbar suppression may need an update.'); + } + } bumpTerminalReady(); cursorBlinkStateRef.current = false; @@ -1158,6 +1185,8 @@ const TerminalViewport = React.forwardRef disposable.dispose()); restorePatchedScrollToBottom?.(); restorePatchedScrollToBottom = null; + restorePatchedScrollbar?.(); + restorePatchedScrollbar = null; if (localTerminalTextarea) { localTerminalTextarea.removeEventListener('focus', handleTerminalTextareaFocus); localTerminalTextarea.removeEventListener('blur', handleTerminalTextareaBlur);