From bd7f76190c703ae70c399d7f7840bae9fd68554c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Breitbart?= Date: Sat, 22 Jul 2023 15:12:37 +0200 Subject: [PATCH] fix superfluous selection.refresh calls --- src/browser/renderer/dom/DomRenderer.ts | 5 +---- src/browser/services/SelectionService.ts | 8 ++++++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/browser/renderer/dom/DomRenderer.ts b/src/browser/renderer/dom/DomRenderer.ts index cb7bcad7..c50c6483 100644 --- a/src/browser/renderer/dom/DomRenderer.ts +++ b/src/browser/renderer/dom/DomRenderer.ts @@ -296,10 +296,7 @@ export class DomRenderer extends Disposable implements IRenderer { public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void { // Remove all selections - while (this._selectionContainer.children.length) { - this._selectionContainer.removeChild(this._selectionContainer.children[0]); - } - + this._selectionContainer.replaceChildren(); this._rowFactory.handleSelectionChanged(start, end, columnSelectMode); this.renderRows(0, this._bufferService.rows - 1); diff --git a/src/browser/services/SelectionService.ts b/src/browser/services/SelectionService.ts index 486c1941..48775997 100644 --- a/src/browser/services/SelectionService.ts +++ b/src/browser/services/SelectionService.ts @@ -105,6 +105,8 @@ export class SelectionService extends Disposable implements ISelectionService { private _mouseUpListener: EventListener; private _trimListener: IDisposable; private _workCell: CellData = new CellData(); + // whether last refresh contained active selection + private _prevSelection = false; private _mouseDownTimeStamp: number = 0; private _oldHasSelection: boolean = false; @@ -269,6 +271,12 @@ export class SelectionService extends Disposable implements ISelectionService { * selection on Linux. */ public refresh(isLinuxMouseSelection?: boolean): void { + // exit early if we have no prev & no active selection + if (!this.hasSelection && !this._prevSelection) { + return; + } + this._prevSelection = this.hasSelection; + // Queue the refresh for the renderer if (!this._refreshAnimationFrame) { this._refreshAnimationFrame = this._coreBrowserService.window.requestAnimationFrame(() => this._refresh());