From 9513c231c970c33f17b79f8b30a890e1687b19ad Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Fri, 11 Sep 2020 00:42:18 -0500 Subject: [PATCH] fix: rerender hidden terminal when visible --- src/browser/services/RenderService.ts | 10 +++++++++- test/api/Terminal.api.ts | 8 ++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index 5c91ebaf..6cd18738 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -24,6 +24,7 @@ export class RenderService extends Disposable implements IRenderService { private _renderDebouncer: RenderDebouncer; private _screenDprMonitor: ScreenDprMonitor; + private _charSizeService: ICharSizeService; private _isPaused: boolean = false; private _needsFullRefresh: boolean = false; @@ -67,7 +68,9 @@ export class RenderService extends Disposable implements IRenderService { this.register(bufferService.onResize(e => this._fullRefresh())); this.register(optionsService.onOptionChange(() => this._renderer.onOptionsChanged())); - this.register(charSizeService.onCharSizeChange(() => this.onCharSizeChanged())); + + this._charSizeService = charSizeService; + this.register(this._charSizeService.onCharSizeChange(() => this.onCharSizeChanged())); // No need to register this as renderer is explicitly disposed in RenderService.dispose this._renderer.onRequestRedraw(e => this.refreshRows(e.start, e.end, true)); @@ -91,6 +94,11 @@ export class RenderService extends Disposable implements IRenderService { this.refreshRows(0, this._rowCount - 1); this._needsFullRefresh = false; } + + // Terminal was hidden on open + if (!this._isPaused && !this._charSizeService.hasValidSize) { + this._charSizeService.measure(); + } } public refreshRows(start: number, end: number, isRedrawOnly: boolean = false): void { diff --git a/test/api/Terminal.api.ts b/test/api/Terminal.api.ts index 99cb9b2a..c5ce8f92 100644 --- a/test/api/Terminal.api.ts +++ b/test/api/Terminal.api.ts @@ -572,6 +572,14 @@ describe('API Integration Tests', function(): void { assert.equal(await page.evaluate(`window.term._core._isDisposed`), true); }); + it('render when visible after hidden', async () => { + await page.evaluate(`document.querySelector('#terminal-container').style.display='none'`); + await page.evaluate(`window.term = new Terminal()`); + await page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`); + await page.evaluate(`document.querySelector('#terminal-container').style.display=''`); + await pollFor(page, `window.term._core._renderService.dimensions.actualCellWidth > 0`, true); + }); + describe('registerLinkProvider', () => { it('should fire provideLinks when hovering cells', async () => { await openTerminal(page, { rendererType: 'dom' });