From 9513c231c970c33f17b79f8b30a890e1687b19ad Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Fri, 11 Sep 2020 00:42:18 -0500 Subject: [PATCH 1/3] 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' }); From 49d5608fa68f58b0607ed705480cedcde6a52733 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Fri, 11 Sep 2020 05:29:24 -0700 Subject: [PATCH 2/3] Define member bar in ctor --- src/browser/services/RenderService.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index 6cd18738..a362aa22 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -24,7 +24,6 @@ export class RenderService extends Disposable implements IRenderService { private _renderDebouncer: RenderDebouncer; private _screenDprMonitor: ScreenDprMonitor; - private _charSizeService: ICharSizeService; private _isPaused: boolean = false; private _needsFullRefresh: boolean = false; @@ -52,7 +51,7 @@ export class RenderService extends Disposable implements IRenderService { private _rowCount: number, screenElement: HTMLElement, @IOptionsService optionsService: IOptionsService, - @ICharSizeService charSizeService: ICharSizeService, + @ICharSizeService private readonly _charSizeService: ICharSizeService, @IBufferService bufferService: IBufferService ) { super(); @@ -68,8 +67,6 @@ export class RenderService extends Disposable implements IRenderService { this.register(bufferService.onResize(e => this._fullRefresh())); this.register(optionsService.onOptionChange(() => this._renderer.onOptionsChanged())); - - this._charSizeService = charSizeService; this.register(this._charSizeService.onCharSizeChange(() => this.onCharSizeChanged())); // No need to register this as renderer is explicitly disposed in RenderService.dispose From 3d9a33bb69d7d90ef7d157dde9b77369c6aacf70 Mon Sep 17 00:00:00 2001 From: Tony Brix Date: Sun, 25 Oct 2020 10:59:30 -0500 Subject: [PATCH 3/3] move measure before refreshRows --- src/browser/services/RenderService.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index a362aa22..174a1272 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -87,15 +87,16 @@ export class RenderService extends Disposable implements IRenderService { private _onIntersectionChange(entry: IntersectionObserverEntry): void { this._isPaused = entry.isIntersecting === undefined ? (entry.intersectionRatio === 0) : !entry.isIntersecting; - if (!this._isPaused && this._needsFullRefresh) { - this.refreshRows(0, this._rowCount - 1); - this._needsFullRefresh = false; - } // Terminal was hidden on open if (!this._isPaused && !this._charSizeService.hasValidSize) { this._charSizeService.measure(); } + + if (!this._isPaused && this._needsFullRefresh) { + this.refreshRows(0, this._rowCount - 1); + this._needsFullRefresh = false; + } } public refreshRows(start: number, end: number, isRedrawOnly: boolean = false): void {