fix(terminal): repaint parked frame after layout

This commit is contained in:
Brennan Benson
2026-08-05 18:01:24 -07:00
parent ee188caa65
commit 086b16edae
2 changed files with 8 additions and 9 deletions
@@ -78,14 +78,14 @@ describe('parked terminal viewport frames', () => {
expect(local.serialize).not.toHaveBeenCalled()
})
it('replays a matching-grid frame and rebuilds WebGL after parsing', async () => {
it('replays a matching-grid frame and repaints after reveal layout settles', async () => {
const matching = makePane(1, 'matching')
const stale = makePane(2, 'stale')
const rebuildPaneWebgl = vi.fn()
const scheduleRevealRepaint = vi.fn()
const manager = {
getPanes: () => [matching.pane, stale.pane],
hasWebglRenderer: () => true,
rebuildPaneWebgl
hasWebglRenderer: () => false,
scheduleRevealRepaint
} as unknown as PaneManager
const replayingPanesRef = { current: new Map<number, number>() }
@@ -113,7 +113,7 @@ describe('parked terminal viewport frames', () => {
)
expect(mocks.replayIntoTerminalAsync.mock.calls[0]?.[3].shouldReleaseRenderPause()).toBe(true)
await Promise.resolve()
expect(rebuildPaneWebgl).toHaveBeenCalledWith(1)
expect(scheduleRevealRepaint).toHaveBeenCalledOnce()
expect(consumeParkedTerminalViewportFrameMarker(matching.pane)).toBe(true)
expect(consumeParkedTerminalViewportFrameMarker(matching.pane)).toBe(false)
})
@@ -84,11 +84,10 @@ export function replayParkedTerminalViewportFrames(args: {
void replay.then(() => {
if (
pane.container.dataset[PARKED_VIEWPORT_FRAME_DATASET_KEY] === 'true' &&
args.isVisible() &&
args.manager.hasWebglRenderer(pane.id)
args.isVisible()
) {
// Why: WebGL attached to the empty remount can retain a blank render model until reactivated after parsing.
args.manager.rebuildPaneWebgl(pane.id)
// Why: the immediate refresh can precede measurable layout; repaint the parsed frame after reveal settles.
args.manager.scheduleRevealRepaint()
}
})
replayed += 1