init claude-code
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
// Terminal focus state signal — non-React access to DECSET 1004 focus events.
|
||||
// 'unknown' is the default for terminals that don't support focus reporting;
|
||||
// consumers treat 'unknown' identically to 'focused' (no throttling).
|
||||
// Subscribers are notified synchronously when focus changes, used by
|
||||
// TerminalFocusProvider to avoid polling.
|
||||
export type TerminalFocusState = 'focused' | 'blurred' | 'unknown'
|
||||
|
||||
let focusState: TerminalFocusState = 'unknown'
|
||||
const resolvers: Set<() => void> = new Set()
|
||||
const subscribers: Set<() => void> = new Set()
|
||||
|
||||
export function setTerminalFocused(v: boolean): void {
|
||||
focusState = v ? 'focused' : 'blurred'
|
||||
// Notify useSyncExternalStore subscribers
|
||||
for (const cb of subscribers) {
|
||||
cb()
|
||||
}
|
||||
if (!v) {
|
||||
for (const resolve of resolvers) {
|
||||
resolve()
|
||||
}
|
||||
resolvers.clear()
|
||||
}
|
||||
}
|
||||
|
||||
export function getTerminalFocused(): boolean {
|
||||
return focusState !== 'blurred'
|
||||
}
|
||||
|
||||
export function getTerminalFocusState(): TerminalFocusState {
|
||||
return focusState
|
||||
}
|
||||
|
||||
// For useSyncExternalStore
|
||||
export function subscribeTerminalFocus(cb: () => void): () => void {
|
||||
subscribers.add(cb)
|
||||
return () => {
|
||||
subscribers.delete(cb)
|
||||
}
|
||||
}
|
||||
|
||||
export function resetTerminalFocusState(): void {
|
||||
focusState = 'unknown'
|
||||
for (const cb of subscribers) {
|
||||
cb()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user