export type RevealSubscription = (listener: () => void) => void;/** * Wire a reveal callback to fire exactly once, on whichever of the provided * event subscribers fires first. Each subscriber is responsible for binding * its own event source. * * Used by the desktop main window's first-paint reveal logic. The standard * Electron pattern is to wait for `ready-to-show` before calling `show()`, * but on Linux/Wayland with `show: false`, `ready-to-show` only fires after * `show()` is called, deadlocking that pattern. Subscribing to both * `ready-to-show` and `did-finish-load` (or any other "renderer is alive" * signal) lets the window surface reliably across platforms. */export function bindFirstRevealTrigger( subscribers: readonly RevealSubscription[], reveal: () => void,): void { let revealed = false; const fire = () => { if (revealed) return; revealed = true; reveal(); }; for (const subscribe of subscribers) { subscribe(fire); }}
export type RevealSubscription = (listener: () => void) => void;
/**
* Wire a reveal callback to fire exactly once, on whichever of the provided
* event subscribers fires first. Each subscriber is responsible for binding
* its own event source.
*
* Used by the desktop main window's first-paint reveal logic. The standard
* Electron pattern is to wait for `ready-to-show` before calling `show()`,
* but on Linux/Wayland with `show: false`, `ready-to-show` only fires after
* `show()` is called, deadlocking that pattern. Subscribing to both
* `ready-to-show` and `did-finish-load` (or any other "renderer is alive"
* signal) lets the window surface reliably across platforms.
*/
export function bindFirstRevealTrigger(
subscribers: readonly RevealSubscription[],
reveal: () => void,
): void {
let revealed = false;
const fire = () => {
if (revealed) return;
revealed = true;
reveal();
};
for (const subscribe of subscribers) {
subscribe(fire);
}
}