Skip to content

Commit 1bb465d

Browse files
authored
Merge pull request #3860 from Tyriar/3855
Fix column selection issues
2 parents fe99422 + efb939d commit 1bb465d

File tree

4 files changed

+19
-6
lines changed

4 files changed

+19
-6
lines changed

addons/xterm-addon-webgl/src/WebglRenderer.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -455,8 +455,12 @@ export class WebglRenderer extends Disposable implements IRenderer {
455455
}
456456
y -= this._terminal.buffer.active.viewportY;
457457
if (this._model.selection.columnSelectMode) {
458-
return x >= this._model.selection.startCol && y >= this._model.selection.viewportCappedStartRow &&
459-
x < this._model.selection.endCol && y < this._model.selection.viewportCappedEndRow;
458+
if (this._model.selection.startCol <= this._model.selection.endCol) {
459+
return x >= this._model.selection.startCol && y >= this._model.selection.viewportCappedStartRow &&
460+
x < this._model.selection.endCol && y <= this._model.selection.viewportCappedEndRow;
461+
}
462+
return x < this._model.selection.startCol && y >= this._model.selection.viewportCappedStartRow &&
463+
x >= this._model.selection.endCol && y <= this._model.selection.viewportCappedEndRow;
460464
}
461465
return (y > this._model.selection.viewportStartRow && y < this._model.selection.viewportEndRow) ||
462466
(this._model.selection.viewportStartRow === this._model.selection.viewportEndRow && y === this._model.selection.viewportStartRow && x >= this._model.selection.startCol && x < this._model.selection.endCol) ||

src/browser/renderer/dom/DomRenderer.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,9 @@ export class DomRenderer extends Disposable implements IRenderer {
304304
const documentFragment = document.createDocumentFragment();
305305

306306
if (columnSelectMode) {
307+
const isXFlipped = start[0] > end[0];
307308
documentFragment.appendChild(
308-
this._createSelectionElement(viewportCappedStartRow, start[0], end[0], viewportCappedEndRow - viewportCappedStartRow + 1)
309+
this._createSelectionElement(viewportCappedStartRow, isXFlipped ? end[0] : start[0], isXFlipped ? start[0] : end[0], viewportCappedEndRow - viewportCappedStartRow + 1)
309310
);
310311
} else {
311312
// Draw first row

src/browser/renderer/dom/DomRendererRowFactory.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,12 @@ export class DomRendererRowFactory {
322322
return false;
323323
}
324324
if (this._columnSelectMode) {
325-
return x >= start[0] && y >= start[1] &&
326-
x < end[0] && y < end[1];
325+
if (start[0] <= end[0]) {
326+
return x >= start[0] && y >= start[1] &&
327+
x < end[0] && y <= end[1];
328+
}
329+
return x < start[0] && y >= start[1] &&
330+
x >= end[0] && y <= end[1];
327331
}
328332
return (y > start[1] && y < end[1]) ||
329333
(start[1] === end[1] && y === start[1] && x >= start[0] && x < end[0]) ||

src/browser/services/SelectionService.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,8 +207,12 @@ export class SelectionService extends Disposable implements ISelectionService {
207207
return '';
208208
}
209209

210+
// For column selection it's not enough to rely on final selection's swapping of reversed
211+
// values, it also needs the x coordinates to swap independently of the y coordinate is needed
212+
const startCol = start[0] < end[0] ? start[0] : end[0];
213+
const endCol = start[0] < end[0] ? end[0] : start[0];
210214
for (let i = start[1]; i <= end[1]; i++) {
211-
const lineText = buffer.translateBufferLineToString(i, true, start[0], end[0]);
215+
const lineText = buffer.translateBufferLineToString(i, true, startCol, endCol);
212216
result.push(lineText);
213217
}
214218
} else {

0 commit comments

Comments
 (0)