diff --git a/src/browser/services/RenderService.ts b/src/browser/services/RenderService.ts index 7db0e5cd..880a0667 100644 --- a/src/browser/services/RenderService.ts +++ b/src/browser/services/RenderService.ts @@ -12,6 +12,7 @@ import { addDisposableDomListener } from 'browser/Lifecycle'; import { IColorSet, IRenderDebouncerWithCallback } from 'browser/Types'; import { IOptionsService, IBufferService, IDecorationService } from 'common/services/Services'; import { ICharSizeService, ICoreBrowserService, IRenderService } from 'browser/services/Services'; +import { IdleTaskQueue } from 'common/IdleTaskQueue'; interface ISelectionState { start: [number, number] | undefined; @@ -105,6 +106,7 @@ export class RenderService extends Disposable implements IRenderService { } if (!this._isPaused && this._needsFullRefresh) { + this._pausedResizeQueue.flush(); this.refreshRows(0, this._rowCount - 1); this._needsFullRefresh = false; } @@ -203,8 +205,14 @@ export class RenderService extends Disposable implements IRenderService { this.refreshRows(0, this._rowCount - 1); } + private _pausedResizeQueue = new IdleTaskQueue(); public onResize(cols: number, rows: number): void { - this._renderer.onResize(cols, rows); + if (this._isPaused) { + this._pausedResizeQueue.clear(); + this._pausedResizeQueue.enqueue(() => this._renderer.onResize(cols, rows)); + } else { + this._renderer.onResize(cols, rows); + } this._fullRefresh(); } diff --git a/src/common/IdleTaskQueue.ts b/src/common/IdleTaskQueue.ts index 240a26ff..167e79e9 100644 --- a/src/common/IdleTaskQueue.ts +++ b/src/common/IdleTaskQueue.ts @@ -29,6 +29,28 @@ export class IdleTaskQueue { this._start(); } + /** + * Flushes the queue, running all remaining tasks synchronously. + */ + public flush(): void { + while (this._i < this._tasks.length) { + this._tasks[this._i++](); + } + this.clear(); + } + + /** + * Clears any remaining tasks from the queue, these will not be run. + */ + public clear(): void { + if (this._idleCallback) { + cancelIdleCallback(this._idleCallback); + this._idleCallback = undefined; + } + this._i = 0; + this._tasks.length = 0; + } + private _start(): void { if (!this._idleCallback) { this._idleCallback = requestIdleCallback(() => this._process()); @@ -45,8 +67,6 @@ export class IdleTaskQueue { return; } } - // Clear the queue - this._i = 0; - this._tasks.length = 0; + this.clear(); } }