From be32590ef0b8b6524aa327348ba342c7827f307c Mon Sep 17 00:00:00 2001 From: meganrogge Date: Wed, 5 May 2021 08:21:26 -0700 Subject: [PATCH 1/4] fix #https://github.com/microsoft/vscode/issues/123000 --- src/browser/services/SelectionService.ts | 6 +++-- src/common/buffer/BufferRange.test.ts | 32 ++++++++++++++++++++++++ src/common/buffer/BufferRange.ts | 16 ++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 src/common/buffer/BufferRange.test.ts create mode 100644 src/common/buffer/BufferRange.ts diff --git a/src/browser/services/SelectionService.ts b/src/browser/services/SelectionService.ts index 4806ef917..8e3b8809a 100644 --- a/src/browser/services/SelectionService.ts +++ b/src/browser/services/SelectionService.ts @@ -10,12 +10,13 @@ import * as Browser from 'common/Platform'; import { SelectionModel } from 'browser/selection/SelectionModel'; import { CellData } from 'common/buffer/CellData'; import { EventEmitter, IEvent } from 'common/EventEmitter'; -import { ICharSizeService, IMouseService, ISelectionService, IRenderService } from 'browser/services/Services'; +import { IMouseService, ISelectionService, IRenderService } from 'browser/services/Services'; import { ILinkifier2 } from 'browser/Types'; import { IBufferService, IOptionsService, ICoreService } from 'common/services/Services'; import { getCoordsRelativeToElement } from 'browser/input/Mouse'; import { moveToCellSequence } from 'browser/input/MoveToCell'; import { Disposable } from 'common/Lifecycle'; +import { getRangeLength } from 'common/buffer/BufferRange'; /** * The number of pixels the mouse needs to be above or below the viewport in @@ -323,7 +324,8 @@ export class SelectionService extends Disposable implements ISelectionService { const range = this._linkifier.currentLink?.link?.range; if (range) { this._model.selectionStart = [range.start.x - 1, range.start.y - 1]; - this._model.selectionEnd = [range.end.x, range.end.y - 1]; + this._model.selectionStartLength = getRangeLength(range, this._bufferService.cols); + this._model.selectionEnd = undefined; return true; } diff --git a/src/common/buffer/BufferRange.test.ts b/src/common/buffer/BufferRange.test.ts new file mode 100644 index 000000000..c48de807c --- /dev/null +++ b/src/common/buffer/BufferRange.test.ts @@ -0,0 +1,32 @@ +/** + * Copyright (c) 2021 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { assert } from 'chai'; +import { getRangeLength } from 'common/buffer/BufferRange'; +import { IBufferRange } from 'xterm'; + +describe.only('BufferRange', () => { + describe('getRangeLength', () => { + it('should get range for single line', () => { + assert.equal(getRangeLength(createRange(1, 1, 4, 1), 0), 3); + }); + it('should throw for invalid range', () => { + assert.throws(() => getRangeLength(createRange(1, 3, 1, 1), 0)); + }); + it('should get range multiple lines', () => { + assert.equal(getRangeLength(createRange(1, 1, 4, 5), 5), 23); + }); + it('should get range for end line right after start line', () => { + assert.equal(getRangeLength(createRange(1, 1, 7, 2), 5), 11); + }); + }); +}); + +function createRange(x1: number, y1: number, x2: number, y2: number): IBufferRange { + return { + start: { x: x1, y: y1 }, + end: { x: x2, y: y2 } + }; +} diff --git a/src/common/buffer/BufferRange.ts b/src/common/buffer/BufferRange.ts new file mode 100644 index 000000000..0b4902b1a --- /dev/null +++ b/src/common/buffer/BufferRange.ts @@ -0,0 +1,16 @@ +/** + * Copyright (c) 2021 The xterm.js authors. All rights reserved. + * @license MIT + */ + +import { IBufferRange } from 'xterm'; + +export function getRangeLength(range: IBufferRange, cols: number): number { + if (range.start.y === range.end.y) { + return range.end.x - range.start.x; + } + if (range.start.y > range.end.y) { + throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`); + } + return cols * (range.end.y - range.start.y - 1) + cols - range.start.x + range.end.x; +} From 9a5f85cc2419a21b5f90df7ab7323781a3a6b5e2 Mon Sep 17 00:00:00 2001 From: meganrogge Date: Wed, 5 May 2021 12:29:55 -0700 Subject: [PATCH 2/4] remove .only --- src/common/buffer/BufferRange.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/buffer/BufferRange.test.ts b/src/common/buffer/BufferRange.test.ts index c48de807c..d5c685c5b 100644 --- a/src/common/buffer/BufferRange.test.ts +++ b/src/common/buffer/BufferRange.test.ts @@ -7,7 +7,7 @@ import { assert } from 'chai'; import { getRangeLength } from 'common/buffer/BufferRange'; import { IBufferRange } from 'xterm'; -describe.only('BufferRange', () => { +describe('BufferRange', () => { describe('getRangeLength', () => { it('should get range for single line', () => { assert.equal(getRangeLength(createRange(1, 1, 4, 1), 0), 3); From 20f320327c40096ac752a571f58f9aff83eea066 Mon Sep 17 00:00:00 2001 From: meganrogge Date: Wed, 5 May 2021 19:45:36 -0700 Subject: [PATCH 3/4] Tweak range --- src/common/buffer/BufferRange.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/buffer/BufferRange.ts b/src/common/buffer/BufferRange.ts index 0b4902b1a..9091c68dc 100644 --- a/src/common/buffer/BufferRange.ts +++ b/src/common/buffer/BufferRange.ts @@ -7,7 +7,7 @@ import { IBufferRange } from 'xterm'; export function getRangeLength(range: IBufferRange, cols: number): number { if (range.start.y === range.end.y) { - return range.end.x - range.start.x; + return range.end.x - range.start.x + 1; } if (range.start.y > range.end.y) { throw new Error(`Buffer range end (${range.end.x}, ${range.end.y}) cannot be before start (${range.start.x}, ${range.start.y})`); From 94034780493035178b2009e903ab96fa5f97b47f Mon Sep 17 00:00:00 2001 From: meganrogge Date: Wed, 5 May 2021 19:49:33 -0700 Subject: [PATCH 4/4] tweak test --- src/common/buffer/BufferRange.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/buffer/BufferRange.test.ts b/src/common/buffer/BufferRange.test.ts index d5c685c5b..d0f287dc7 100644 --- a/src/common/buffer/BufferRange.test.ts +++ b/src/common/buffer/BufferRange.test.ts @@ -10,7 +10,7 @@ import { IBufferRange } from 'xterm'; describe('BufferRange', () => { describe('getRangeLength', () => { it('should get range for single line', () => { - assert.equal(getRangeLength(createRange(1, 1, 4, 1), 0), 3); + assert.equal(getRangeLength(createRange(1, 1, 4, 1), 0), 4); }); it('should throw for invalid range', () => { assert.throws(() => getRangeLength(createRange(1, 3, 1, 1), 0));