32 lines
1020 B
TypeScript
32 lines
1020 B
TypeScript
import { useContext, useEffect } from 'react'
|
|
import stripAnsi from 'strip-ansi'
|
|
import { OSC, osc } from '../termio/osc.js'
|
|
import { TerminalWriteContext } from '../useTerminalNotification.js'
|
|
|
|
/**
|
|
* Declaratively set the terminal tab/window title.
|
|
*
|
|
* Pass a string to set the title. ANSI escape sequences are stripped
|
|
* automatically so callers don't need to know about terminal encoding.
|
|
* Pass `null` to opt out — the hook becomes a no-op and leaves the
|
|
* terminal title untouched.
|
|
*
|
|
* On Windows, uses `process.title` (classic conhost doesn't support OSC).
|
|
* Elsewhere, writes OSC 0 (set title+icon) via Ink's stdout.
|
|
*/
|
|
export function useTerminalTitle(title: string | null): void {
|
|
const writeRaw = useContext(TerminalWriteContext)
|
|
|
|
useEffect(() => {
|
|
if (title === null || !writeRaw) return
|
|
|
|
const clean = stripAnsi(title)
|
|
|
|
if (process.platform === 'win32') {
|
|
process.title = clean
|
|
} else {
|
|
writeRaw(osc(OSC.SET_TITLE_AND_ICON, clean))
|
|
}
|
|
}, [title, writeRaw])
|
|
}
|