diff --git a/src/renderer/SelectionRenderLayer.ts b/src/renderer/SelectionRenderLayer.ts index a9542cd7..1759e112 100644 --- a/src/renderer/SelectionRenderLayer.ts +++ b/src/renderer/SelectionRenderLayer.ts @@ -8,13 +8,14 @@ import { IColorSet, IRenderDimensions } from './Types'; import { BaseRenderLayer } from './BaseRenderLayer'; export class SelectionRenderLayer extends BaseRenderLayer { - private _state: {start: [number, number], end: [number, number]}; + private _state: { start: [number, number], end: [number, number], columnSelectMode: boolean }; constructor(container: HTMLElement, zIndex: number, colors: IColorSet) { super(container, 'selection', zIndex, true, colors); this._state = { start: null, - end: null + end: null, + columnSelectMode: null }; } @@ -23,7 +24,8 @@ export class SelectionRenderLayer extends BaseRenderLayer { // Resizing the canvas discards the contents of the canvas so clear state this._state = { start: null, - end: null + end: null, + columnSelectMode: null }; } @@ -31,7 +33,8 @@ export class SelectionRenderLayer extends BaseRenderLayer { if (this._state.start && this._state.end) { this._state = { start: null, - end: null + end: null, + columnSelectMode: null }; this.clearAll(); } @@ -39,7 +42,7 @@ export class SelectionRenderLayer extends BaseRenderLayer { public onSelectionChanged(terminal: ITerminal, start: [number, number], end: [number, number], columnSelectMode: boolean): void { // Selection has not changed - if (this._state.start === start || this._state.end === end) { + if (!this._didStateChange(start, end, columnSelectMode)) { return; } @@ -69,7 +72,6 @@ export class SelectionRenderLayer extends BaseRenderLayer { const width = end[0] - startCol; const height = viewportCappedEndRow - viewportCappedStartRow + 1; this.fillCells(startCol, viewportCappedStartRow, width, height); - } else { // Draw first row const startCol = viewportStartRow === viewportCappedStartRow ? start[0] : 0; @@ -91,5 +93,20 @@ export class SelectionRenderLayer extends BaseRenderLayer { // Save state for next render this._state.start = [start[0], start[1]]; this._state.end = [end[0], end[1]]; + this._state.columnSelectMode = columnSelectMode; + } + + private _didStateChange(start: [number, number], end: [number, number], columnSelectMode: boolean): boolean { + return !this._areCoordinatesEqual(start, this._state.start) || + !this._areCoordinatesEqual(end, this._state.end) || + columnSelectMode !== this._state.columnSelectMode; + } + + private _areCoordinatesEqual(coord1: [number, number], coord2: [number, number]): boolean { + if (!coord1 || !coord2) { + return false; + } + + return coord1[0] === coord2[0] && coord1[1] === coord2[1]; } }