@xterm/xterm 5.4.0-beta.7 → 5.4.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@xterm/xterm",
3
3
  "description": "Full xterm terminal, in your browser",
4
- "version": "5.4.0-beta.7",
4
+ "version": "5.4.0-beta.8",
5
5
  "main": "lib/xterm.js",
6
6
  "style": "css/xterm.css",
7
7
  "types": "typings/xterm.d.ts",
@@ -575,7 +575,7 @@ export class Terminal extends CoreTerminal implements ITerminal {
575
575
  }
576
576
 
577
577
  private _createRenderer(): IRenderer {
578
- return this._instantiationService.createInstance(DomRenderer, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier2);
578
+ return this._instantiationService.createInstance(DomRenderer, this, this._document!, this.element!, this.screenElement!, this._viewportElement!, this._helperContainer!, this.linkifier2);
579
579
  }
580
580
 
581
581
  /**
@@ -7,9 +7,10 @@ import { DomRendererRowFactory, RowCss } from 'browser/renderer/dom/DomRendererR
7
7
  import { WidthCache } from 'browser/renderer/dom/WidthCache';
8
8
  import { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';
9
9
  import { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';
10
- import { IRenderDimensions, IRenderer, IRequestRedrawEvent } from 'browser/renderer/shared/Types';
10
+ import { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';
11
+ import { IRenderDimensions, IRenderer, IRequestRedrawEvent, ISelectionRenderModel } from 'browser/renderer/shared/Types';
11
12
  import { ICharSizeService, ICoreBrowserService, IThemeService } from 'browser/services/Services';
12
- import { ILinkifier2, ILinkifierEvent, ReadonlyColorSet } from 'browser/Types';
13
+ import { ILinkifier2, ILinkifierEvent, ITerminal, ReadonlyColorSet } from 'browser/Types';
13
14
  import { color } from 'common/Color';
14
15
  import { EventEmitter } from 'common/EventEmitter';
15
16
  import { Disposable, toDisposable } from 'common/Lifecycle';
@@ -25,7 +26,6 @@ const SELECTION_CLASS = 'xterm-selection';
25
26
 
26
27
  let nextTerminalId = 1;
27
28
 
28
-
29
29
  /**
30
30
  * A fallback renderer for when canvas is slow. This is not meant to be
31
31
  * particularly fast or feature complete, more just stable and usable for when
@@ -41,12 +41,14 @@ export class DomRenderer extends Disposable implements IRenderer {
41
41
  private _rowElements: HTMLElement[] = [];
42
42
  private _selectionContainer: HTMLElement;
43
43
  private _widthCache: WidthCache;
44
+ private _selectionRenderModel: ISelectionRenderModel = createSelectionRenderModel();
44
45
 
45
46
  public dimensions: IRenderDimensions;
46
47
 
47
48
  public readonly onRequestRedraw = this.register(new EventEmitter<IRequestRedrawEvent>()).event;
48
49
 
49
50
  constructor(
51
+ private readonly _terminal: ITerminal,
50
52
  private readonly _document: Document,
51
53
  private readonly _element: HTMLElement,
52
54
  private readonly _screenElement: HTMLElement,
@@ -291,6 +293,7 @@ export class DomRenderer extends Disposable implements IRenderer {
291
293
  public handleResize(cols: number, rows: number): void {
292
294
  this._refreshRowElements(cols, rows);
293
295
  this._updateDimensions();
296
+ this.handleSelectionChanged(this._selectionRenderModel.selectionStart, this._selectionRenderModel.selectionEnd, this._selectionRenderModel.columnSelectMode);
294
297
  }
295
298
 
296
299
  public handleCharSizeChanged(): void {
@@ -320,11 +323,13 @@ export class DomRenderer extends Disposable implements IRenderer {
320
323
  return;
321
324
  }
322
325
 
326
+ this._selectionRenderModel.update(this._terminal, start, end, columnSelectMode);
327
+
323
328
  // Translate from buffer position to viewport position
324
- const viewportStartRow = start[1] - this._bufferService.buffer.ydisp;
325
- const viewportEndRow = end[1] - this._bufferService.buffer.ydisp;
326
- const viewportCappedStartRow = Math.max(viewportStartRow, 0);
327
- const viewportCappedEndRow = Math.min(viewportEndRow, this._bufferService.rows - 1);
329
+ const viewportStartRow = this._selectionRenderModel.viewportStartRow;
330
+ const viewportEndRow = this._selectionRenderModel.viewportEndRow;
331
+ const viewportCappedStartRow = this._selectionRenderModel.viewportCappedStartRow;
332
+ const viewportCappedEndRow = this._selectionRenderModel.viewportCappedEndRow;
328
333
 
329
334
  // No need to draw the selection
330
335
  if (viewportCappedStartRow >= this._bufferService.rows || viewportCappedEndRow < 0) {
@@ -365,10 +370,16 @@ export class DomRenderer extends Disposable implements IRenderer {
365
370
  */
366
371
  private _createSelectionElement(row: number, colStart: number, colEnd: number, rowCount: number = 1): HTMLElement {
367
372
  const element = this._document.createElement('div');
373
+ const left = colStart * this.dimensions.css.cell.width;
374
+ let width = this.dimensions.css.cell.width * (colEnd - colStart);
375
+ if (left + width > this.dimensions.css.canvas.width) {
376
+ width = this.dimensions.css.canvas.width - left;
377
+ }
378
+
368
379
  element.style.height = `${rowCount * this.dimensions.css.cell.height}px`;
369
380
  element.style.top = `${row * this.dimensions.css.cell.height}px`;
370
- element.style.left = `${colStart * this.dimensions.css.cell.width}px`;
371
- element.style.width = `${this.dimensions.css.cell.width * (colEnd - colStart)}px`;
381
+ element.style.left = `${left}px`;
382
+ element.style.width = `${width}px`;
372
383
  return element;
373
384
  }
374
385
 
@@ -3,6 +3,7 @@
3
3
  * @license MIT
4
4
  */
5
5
 
6
+ import { ITerminal } from 'browser/Types';
6
7
  import { ISelectionRenderModel } from 'browser/renderer/shared/Types';
7
8
  import { Terminal } from '@xterm/xterm';
8
9
 
@@ -35,7 +36,7 @@ class SelectionRenderModel implements ISelectionRenderModel {
35
36
  this.selectionEnd = undefined;
36
37
  }
37
38
 
38
- public update(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {
39
+ public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {
39
40
  this.selectionStart = start;
40
41
  this.selectionEnd = end;
41
42
  // Selection does not exist
@@ -45,8 +46,9 @@ class SelectionRenderModel implements ISelectionRenderModel {
45
46
  }
46
47
 
47
48
  // Translate from buffer position to viewport position
48
- const viewportStartRow = start[1] - terminal.buffer.active.viewportY;
49
- const viewportEndRow = end[1] - terminal.buffer.active.viewportY;
49
+ const viewportY = terminal.buffers.active.ydisp;
50
+ const viewportStartRow = start[1] - viewportY;
51
+ const viewportEndRow = end[1] - viewportY;
50
52
  const viewportCappedStartRow = Math.max(viewportStartRow, 0);
51
53
  const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);
52
54
 
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { FontWeight, Terminal } from '@xterm/xterm';
7
- import { IColorSet } from 'browser/Types';
7
+ import { IColorSet, ITerminal } from 'browser/Types';
8
8
  import { IDisposable } from 'common/Types';
9
9
  import { IEvent } from 'common/EventEmitter';
10
10
 
@@ -168,6 +168,6 @@ export interface ISelectionRenderModel {
168
168
  readonly selectionStart: [number, number] | undefined;
169
169
  readonly selectionEnd: [number, number] | undefined;
170
170
  clear(): void;
171
- update(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode?: boolean): void;
171
+ update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode?: boolean): void;
172
172
  isCellSelected(terminal: Terminal, x: number, y: number): boolean;
173
173
  }